IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

Gestion Filtre TCD


Sujet :

VBA

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Stagiaire contrôle de gestion
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Stagiaire contrôle de gestion

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Gestion Filtre TCD
    Bonjour,

    Je me permet de revenir encore une fois vers vous pour vous demander de l'aide. Et pourtant je suis aller voir sur de nombreux forum avant de faire ce post!

    Voilà, je voudrais que ma macro actualise mes TCD en fonction des items retenu dans une plage de cellule. Cette plage de cellule est renseigné par mon formulaire "Paramètre. L'idée était qu'il m'actualise le TCD en fonction de ses items.

    Seulement en fonction des option retenu soit il m'affiche qu'un seule items soit il m'affiche rien. !
    D'avance Merci.

    Liens vers mon fichier: http://cjoint.com/?3DlkadZyKqv

    La première macro: (J'ai un problème au If! Je n'ai pas très bien compris la sélection dans un tableau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Sub Macro3()
    ' Mise a Jour TCD
    Dim wsd As Worksheet, _
        wss As Worksheet, _
        strPT As String, strPF As String, _
        pi As PivotItem
    Dim item As String
     
        Application.ScreenUpdating = False
     
        Set wsd = Worksheets("04 - Synthèse Agence Echu")
        Set wss = Worksheets("01 - Menu")
        strPT = "Tableau croisé dynamique2"
        strPF = "Libellé Pdv"
     
        With wsd.PivotTables(strPT).PivotFields(strPF)
            .ClearAllFilters
            .AutoSort xlAscending, strPF
        End With
     
        With wss          
     
              For Each pi In wsd.PivotTables(strPT).PivotFields(strPF).PivotItems
                If .Range("tblAgences[Agences]").Find(what:=pi, _
                    LookIn:=xlValues, lookat:=xlWhole).Row = pi.Name Then 'si il trouve ma valeur qui est égale au champ du TCD,
    'il regarde dans la table et trouve la valeur qui doit être strictement égale. Si elle est égale elle sera visible!
                 pi.Visible = True
            Else
                    pi.Visible = False 'sinon elle est masqué!
               End If
            Next pi
     
            wsd.PivotTables(strPT).RefreshTable
     
        End With
     
        wsd.Activate
        [B1].Select
     
        Set wsd = Nothing: Set wss = Nothing
     
    End Sub

    La seconde macro: (La seconde me fait le filtre sur qu'une seule valeur.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Sub Macro3()
    ' Mise a Jour TCD
    Dim wsd As Worksheet, _
        wss As Worksheet, _
        strPT As String, strPF As String, _
        pi As PivotItem
    Dim item As String
    Dim i As Single
     
        Application.ScreenUpdating = False
     
        Set wsd = Worksheets("04 - Synthèse Agence Echu")
        Set wss = Worksheets("01 - Menu")
        strPT = "Tableau croisé dynamique2"
        strPF = "Libellé Pdv"
     
        With wsd.PivotTables(strPT).PivotFields(strPF)
            .ClearAllFilters
            .AutoSort xlAscending, strPF
        End With
     
        With wss
     
       For i = 4 To 10
        item = Cells(i + 1, 14)
          For Each pi In wsd.PivotTables(strPT).PivotFields(strPF).PivotItems
                On Error Resume Next
                If pi.Name = item Then
                    pi.Visible = True
                Else
                    pi.Visible = False
                End If
            Next pi
        Next i            
     
            wsd.PivotTables(strPT).RefreshTable
     
        End With
     
        wsd.Activate
        [B1].Select
     
        Set wsd = Nothing: Set wss = Nothing
     
    End Sub

  2. #2
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonjour,
    J'ai récemment développé des macros pour des TCD et c'est un peu galère, je l'admets.
    Pour ton deuxième cas, as-tu pensé à activé/désactivé le enablemultiitem ? Enfin, la sélection multiple des filtres dans un champs du TCD (je n'ai plus le nom exact en tête) car cela m'avait posé problème.
    Ensuite, je pense que ta boucle for pour mettre en visible ou invisible n'est pas exactement correcte puisque tu boucles dans le même PivotField à chaque fois et que si tu trouves le nom de ton item, tu le mets en visible. Dans le cas contraire, il le met en invisible.

    Donc, il mettra en invisible les premiers qu'il estime faux puis en visible celui qu'il trouve et enfin les derniers qui ne sont pas bons. Et ce, à chaque item. En gros, seul le dernier pourra être visible.

    Pour ma part, j'avais fait en sorte d'exporter les données filtres dans des cellules à part, puis je les récupère tranquillement via une autre macro.

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Stagiaire contrôle de gestion
    Inscrit en
    Avril 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Stagiaire contrôle de gestion

    Informations forums :
    Inscription : Avril 2014
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Pour le enablemultiitem, il me semble que oui. Il s'agit de l'option dans le TCD "autoriser plusieurs filtre par champs". Si oui alors c'est ce que j'ai fait. Si non alors il me semble l'avoir fait avec le code VBA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With wsd.PivotTables(strPT).PivotFields(strPF)
            .ClearAllFilters
            .AutoSort xlAscending, strPF
        End With
    Pour la boucle For, je me suis bien rendu compte de ce bug par contre je suis un peu perdu et je ne sais par où commencer. !

    D'avance merci.

  4. #4
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    L'algorithme (en mode grossier) que j'avais utilisé est le suivant :

    Partie exportation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Pour chaque pivotfield dans le pivottable_actif.pivotfields
           cellule(i,j) = pivotfield.name
           cellule(i,j+1) = pivotfield.orientation (pour savoir si c'est une colonne, ligne, filtre, valeur)
           pour chaque pivotitem dans le pivotfield.pivotitems
                  cellule(i+1,j) = pivotitem.name
                  cellule(i+1,j+1) = pivotitem.visible
                  i = i +1 
           pivotitem suivant
           j = j + 2
    pivotfield suivant
    Partie importation, c'est le même principe sauf que tu parcours d'abord tous tes pivotfields.
    Dans chaque PivotField, tu tentes de trouver si tu as le nom qui correspond dans les données que tu as exporté juste avant.
    Dans le cas où tu le trouves, tu mets tout en visible = true or false selon ton choix et tu recherches chacun des items qui correspond en prenant en compte la gestion des erreurs (nom du pivotitem = "Valeurs", (blank)", etc)
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

Discussions similaires

  1. [XL-2010] Recuperation de la valeur d'un filtre TCD en VBA
    Par lcolombain dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/02/2012, 09h07
  2. [XL-2007] VBA - Prb Filtre TCD entre 2 dates par TextBox
    Par Naru31 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/09/2011, 00h08
  3. [XL-2007] vba filtre TCD selectionner tout
    Par ridokou dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/05/2011, 15h05
  4. Liaisons "bilatérales" entre filtres TCD
    Par Morane666 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/06/2010, 13h48
  5. Modification filtre TCD sur Visual Studio
    Par binoune dans le forum Visual Studio
    Réponses: 0
    Dernier message: 26/01/2010, 12h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo