Filtrer TCD depuis IHM

Résolu
debutanteVBA -  
Zoul67 Messages postés 2001 Statut Membre -
Bonjour,

Bonjour,
je dispose de TCD sur 2 feuilles differentes filtrés par date et par scenario type
j'ai créee un user form avec un textbox "date et un combox scenario type
je souhaite changer les filtre des 2 TCD depuis l'IHM
vu que je débute en VBA j'ai enregistré une macro pour avoir le code que je n'arrive pas a adapter pour l'automatiser
Sub change_filter()
'
' change_filter Macro
'
Dim prodWorksheet As Worksheet, testWorksheet As Worksheet
Dim IHMdate As String
Dim ScenType As String
Set prodWorksheet = ThisWorkbook.Worksheets("ProdDATA")
Set testWorksheet = ThisWorkbook.Worksheets("TestDATA")
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''' variable a insérer pour automatiser les changement de filtres via ihm
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
IHMdate = UserForm1.TB_Date.Value
ScenType = UserForm1.CB_scenariotype.Value
'
prodWorksheet.Select
prodWorksheet.PivotTables("PROD").PivotFields( _
"[As Of Date].[As Of Date].[As Of Date]").ClearAllFilters
prodWorksheet.PivotTables("PROD").PivotFields( _
"[As Of Date].[As Of Date].[As Of Date]").CurrentPageName = _
"[As Of Date].[As Of Date].&[20131007]"
ActiveSheet.PivotTables("PROD").PivotFields( _
"[Scenario].[Scenario Type].[Scenario Type]").ClearAllFilters
prodWorksheet.PivotTables("PROD").PivotFields( _
"[Scenario].[Scenario Type].[Scenario Type]").CurrentPageName = _
"[Scenario].[Scenario Type].&[DELTABASISINTERCUR]"
testWorksheet.Select
testWorksheet.PivotTables("TEST").PivotFields( _
"[As Of Date].[As Of Date].[As Of Date]").ClearAllFilters
testWorksheet.PivotTables("TEST").PivotFields( _
"[As Of Date].[As Of Date].[As Of Date]").CurrentPageName = _
"[As Of Date].[As Of Date].&[20131007]"
testWorksheet.PivotTables("TEST").PivotFields( _
"[Scenario].[Scenario Type].[Scenario Type]").ClearAllFilters
testWorksheet.PivotTables("TEST").PivotFields( _
"[Scenario].[Scenario Type].[Scenario Type]").CurrentPageName = _
"[Scenario].[Scenario Type].&[DELTABASISINTERCUR]"

après plusieurs syntaxes essayées , dans le code généré par excel je n'ai pas trouvée la bonne syntaxe pour mettre mes 2 variables décalarés afin d'automatiser le changement de date et de scenario type
merci pour votre préciseuse aide

1 réponse

  1. Zoul67 Messages postés 2001 Statut Membre 149
     
    Bonjour,

    Le code généré automatiquement est un peu bizarre.
    Essaie ça :
        For Each sel In ActiveSheet.PivotTables("PROD").PivotFields("Date").PivotItems
    ActiveSheet.PivotTables("PROD").PivotFields("Date").PivotItems(sel.Name).Visible = True
    Next sel
    For Each sel In ActiveSheet.PivotTables("PROD").PivotFields("Date").PivotItems
    If sel.Name <> IHMdate Then
    ActiveSheet.PivotTables("PROD").PivotFields("Date").PivotItems(sel.Name).Visible = False
    End If
    Next sel

    NB : avec les TCD à aucun moment il n'est possible d'avoir toutes les valeurs décochées, d'où l'idée de cocher tout puis de décocher celles qui ne correspondent pas à ta valeur saisie das le UserForm.

    A+
    0
    1. debutante
       
      merci pour l'aide j'ai essayée d'adapter votre code

      au fait le sel vous le éclarez de quel type ? string , variant...?

      voici mon code réadapter mais en erreur


      Sub changer_fi()

      '
      ' changer_filter_zoom Macro

      Dim prodWorksheet As Worksheet, testWorksheet As Worksheet
      Dim IHMdate As String
      Dim ScenType As String
      Dim ScenID As String
      Dim TradeTyp As String
      Dim Book As String
      Dim sel As Variant

      Set prodWorksheet = ThisWorkbook.Worksheets("ProdDATA")
      Set testWorksheet = ThisWorkbook.Worksheets("TestDATA")


      IHMdate = UserForm1.TB_Date.Value
      ScenType = UserForm1.CB_scenariotype.Value

      For Each sel In prodWorksheet.PivotTables("Tableau croisé dynamique3").PivotFields("AS of Date").PivotItems
      prodWorksheet.PivotTables("Tableau croisé dynamique3").PivotFields("AS of Date").PivotItems(sel.Name).Visible = True
      Next sel

      For Each sel In prodWorksheet.PivotTables("Tableau croisé dynamique3").PivotFields("AS of Date").PivotItems
      If sel.Name <> IHMdate Then
      prodWorksheet.PivotTables("Tableau croisé dynamique3").PivotFields("AS of Date").PivotItems(sel.Name).Visible = False
      End If
      Next sel

      End Sub


      encore merci pour l'aide :)
      0
    2. Zoul67 Messages postés 2001 Statut Membre 149
       
      Re,

      Il faut faire un boulot d'analyse (je parierais sur la date qui n'est pas reconnue ce qui amène à décocher toutes les valeurs)... :
      - à quel niveau le code bloque-t-il ?
      - la première boucle For s'exécute-t-elle correctement ?
      - ...

      Peux-tu mettre ton fichier à disposition sur https://www.cjoint.com/ ?

      Je n'avais pas typé "sel", mais si on m'avait mis le couteau sous la gorge, j'aurais aussi choisi Variant.
      Par curiosité : pourquoi utiliser un UserForm pour filtrer ?

      A+
      0
    3. debutante
       
      au fait le message d'erreur se fait au niveau de la 1ere boucle
      ici :

      For Each sel In prodWorksheet.PivotTables("Tableau croisé dynamique3").PivotFields("AS of Date").PivotItems

      et le msg dis " impossible de lire la propriété PivotFields de la classe pivotItable


      cette erreur apparait en 2eme apres un msg me demandant de déclarer la variable sel

      je suis au bureau je n'arrive pas a mettre mon fichier en ligne :s et ca me bloque


      si vous avez une idée je suis prenante
      0
    4. Zoul67 Messages postés 2001 Statut Membre 149
       
      Pourquoi le TCD ne s'appelle-t-il plus prod ? Est-ce que tu en génères un par Macro ?
      Je ne peux pas t'aider plus à l'aveuglette
      0
    5. debutante
       
      au fait le tcd ne s'appelle plus PROD parce que je tester ton code sur une version antecedante

      mais cela ne change rien car j'ai adapté le code

      sinon non je n'arrive pas a generer un TCD par macro( meme si c'était mon 1er souhait ) car j'ai un CUBE OLAP derrier et non une base de donnée que je peux intérroger ou une plage de données dans une feuille

      du coup c'est vraiment juste un ensemble de champs sur un USERFORM qui correspondent aux filtres établis dans une feuille


      le but et de modifier ces filtres via IHM pour éviter de modifier a la main a chaque fois ( car a la base j'ai 2 TCD a gérer )


      merci de la patience et de l'aide je sais que ce n'est pas évident sans fichier
      0