Macro filtre choix multiple TCD

Bonjour à tous,

Je souhaiterais pourvoir filtrer un champ de mon TCD à partir d'une plage de cellule, le tout via une macro qui fera cela automatiquement.

Dit autrement cela donne un fichier en 3 onglets/feuilles :

_feuille 1 - La base de donnée

_feuille 2 - Le TCD issu de la base de donnée

_feuille 3 - La liste des communes souhaitées

Grosso modo, l'utilisateur entre une liste de communes souhaitée dans la feuille 3, le TCD va s'auto-filtrer à partir de cette liste.

voici un bout de code qui me permet de faire cela, mais qu'à partir d'une cellule unique (filtre à partir d'une valeur contenue dans une cellule unique), il me faudrait le meme type de code mais qui irait piocher mes valeurs a afficher dans une plage de cellule, par exemple B2 à B15 :

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Selection_Commune As String
Selection_Commune = ActiveSheet.Range("B2").Value
If Not Application.Intersect(Target, Range("B2")) Is Nothing Then
    Sheets("feuille 2").PivotTables("TCD").PivotFields( _
        "Commune").CurrentPage = Selection_Commune
End If
End Sub

Bonjour

Merci de joindre ton fichier afin de nous éviter d'avoir à le reproduire (et peut-être faux)

Amicalement

Nad

oui désolé,

voici un fichier exemple

J'espère que mon fichier et ma demande sont assez clair, sinon hésitez pas a me le préciser ! La solution à cette problématique me fera gagner un temps précieux d'extraction de données pour les collectivités d'Ile de France !

Bonjour,

Je suis intervenu sur un fil pour Geocatalina pour le même genre de demande. sujet qui n'est pas évident du tout --> Macro/TCD

Bon je n'ai pas excel 2010 ici mais essaie avec ce fichier dans lequel j'ai adapté le code proposé à Geocatalina.

Si ok, merci de cloturer le fil en cliquant sur le V vert à coté du bouton EDITER

Amicalement

Edit : Veille à trier la liste des numéros en feuille3 si cela ne fonctionne pas.

1'721exemple-patar91.xlsm (113.42 Ko)

Bonjour,

Merci beaucoup pour cette solution DAN, la macro fonctionne à merveille. Je passe ce topic en résolu !

Bonjour à tous,

Je relance ce topic, car bien que la macro développée ci-dessus réponde parfaitement à mes attentes, j'ai pu constater quelques petits "bugs" à l'usage depuis quelques mois.

Il me faut parfois relancer une deuxième fois la macro afin que la sélection des communes (via codes INSEE) se fasse correctement, sinon de manière aléatoire la macro me laissait quelques communes sélectionné issus d'une précédente requête.

Par exemple paris 1er arrondissement issu d'une précédente requête restait sélectionné dans le TCD alors que ma nouvelle requête n'intégrait que 2 communes de Seine et Marne. Pour corriger cela, je relance donc une 2eme fois la macro.

Afin de palier à ce problème j'ai donc doublé mon code au sein de la macro :

Sub Macro1()
Application.ScreenUpdating = False
'Macro Dan pour Patar91
Dim pi As PivotItem
Dim pt As String
Dim feuille As Worksheet

Set feuille = Worksheets("feuille 2")

pt = "TCD" 'nom du TCD en A2
With feuille.PivotTables(pt).PivotFields("Codes Communes")
    .EnableMultiplePageItems = True
    .CurrentPage = "(All)" 'ou TOUS
    .AutoSort xlAscending, "Codes Communes"
End With

With Worksheets("feuille 3")
        For Each pi In feuille.PivotTables(pt).PivotFields("Codes Communes").PivotItems
            On Error Resume Next
            If .Range("B2:B" & .Range("B" & Rows.Count).End(xlUp).Row).Find(pi, LookIn:=xlValues, LookAt:=xlWhole).Row > 0 Then

                If Err = 0 Then
                    pi.Visible = True
                Else: pi.Visible = False
                End If
            End If
        Next pi

        For Each pi In feuille.PivotTables(pt).PivotFields("Codes Communes").PivotItems
            On Error Resume Next
            If .Range("B2:B" & .Range("B" & Rows.Count).End(xlUp).Row).Find(pi, LookIn:=xlValues, LookAt:=xlWhole).Row > 0 Then

                If Err = 0 Then
                    pi.Visible = True
                Else: pi.Visible = False
                End If
            End If
        Next pi
End With

End Sub

Cependant j'imagine que ce format ne doit pas être très optimisé, c'est pourquoi je fais appel à vos expertises pour m'aider à simplifier le code, voir idéalement à accélérer son execution qui par conséquence se retrouve doublé en raison du doublement de la requête.

En pièce jointe un extrait excel.

Merci par avance pour vos réponses

308filtre-auto-tcd.xlsm (118.54 Ko)

Bonjour,

Tu aurais du réouvrir le fil car là il est cloturé. Pour réouvrir un fil, clique sur le V devenu Rouge (par la cloture précédente). Je l'ai réouvert.

Concernant ton souci, il n'y aucune raison de doubler le code (!).

Fais plutôt ceci :

  • clique droite dans le TCD`
  • choisis "option du TCD"
  • Va dans l'onglet "Données"
  • Dans la rubrique "conserver les éléments supprimés..", choisis "Aucun"

Bon cette option n'est peut être pas liée à ce que tu expliques mais si par exemple tu supprimes des éléménts de ta base de données cela pourrait avoir une influence sur le résultat final.

Sinon, il serait bon de savoir si le fichier posté est celui que tu utilises réellement

A te relire

Bonjour Dan,

J'ai essayé ta solution mais celà ne résout rien.

Afin de te rendre compte du problème tu peux effectuer la manipulation suivante avec le fichier de cette pièce jointe :

1_rentre les codes 77251 et 77384 dans la feuille 3, puis appuie sur le bouton et vérifie leur sélection dans le TCD de la feuille 2

2_supprime les valeurs en feuille 3 et remplace les par les codes insee de paris 1er à paris 20 eme (75101 à 75120), puis appui sur le bouton et vérifie leur sélection dans le TCD

3_supprime les code insee des arrondissement parisien et remet les codes 77251 et 77384 puis appui sur le bouton. En regardant le TCD tu devrais voir une valeur résiduelle de la requête sur les arrondissement de Paris. Par contre si tu re-clique sur le lancement de la macro, alors le problème va disparaitre

C'est comme-ci la macro "oubliai" ou "sautait" certaines valeurs, et qu'il faille la relancer pour s'assurer de la prise en compte de tous les éléments.

C'est la raison pour laquelle j'ai du doubler le code pour éviter le coté "aléatoire" de la bonne exécution de la macro.

Re

Assez curieux effectivement et incompréhensible !

Bon dans le début du code remplace :

With feuille.PivotTables(pt).PivotFields("Codes Communes")
    .EnableMultiplePageItems = True
    .CurrentPage = "(All)" 'ou TOUS
    .AutoSort xlAscending, "Codes Communes"
End With

Par ceci :

With feuille.PivotTables(pt).PivotFields("Codes Communes")
    .ClearAllFilters
    .EnableMultiplePageItems = True
    .AutoSort xlAscending, "Codes Communes"
End With

Fais un test puis dis moi

Amicalement

Bonjour Dan,

Merci beaucoup pour ce nouveau code, ça fonctionne à présent parfaitement. Je vais tout de même essayer sur un fichier plus volumineux, mais j'ai confiance.

Par contre j'ai du mal à comprendre l'impact du changement entre ces 2 lignes de code :

.CurrentPage = "(All)" 'ou TOUS

.ClearAllFilters

N'ont-elles pas la même action au final (même manuellement quand on clic sur Tous dans un filtre, cela coche tout ou efface tout) ?

Si tu pouvais éclairer ma lanterne.

Re,

N'ont-elles pas la même action au final (même manuellement quand on clic sur Tous dans un filtre, cela coche tout ou efface tout) ?

Pas nécessairement car le Currentpage agit au niveau du champ de page tandis que le Clearallfilters agit sur tous les champs du TCD. Raison pour laquelle je l'ai supprimé du code.

Attention que le "clearallfilters" ne fonctionne que sur excel 2010 (et aussi sur MAC 2011). A vérifier sur excel 2007 mais sur 2003 (MAC 2004), cela ne fonctionnera pas.

Amicalement

En tout cas merci encore pour ta solution, je passe ce topic en validé

Bonjour,

Je déterre ce topic initialement résolu pour une nouvelle requête :

Le code actuel marche à merveille et répond en partie à mes attentes, je dit en partie car il se trouve que j'applique ce code pour interroger un TCD connecté à une base de donnée assez volumineuse.

Il faut donc environ 45 minutes pour que le code s’exécute du début à la fin, soit environ 1300 communes à balayer l'une après l'autre pour cocher la bonne case ou non dans le filtre d'étiquette du TCD.

Je me posais la question si le code pouvait être adapté pour effectuer la chose suivante :

_Le VBA irait directement cocher la case correspondante au code INSEE, sans balayer tous les codes INSEE avant de tomber sur le bon, ce qui éviterait de refaire 1300 fois la même procédure comme le fait le code actuel.

Vous pouvez reprendre les fichiers anciennement mis en ligne, car leur base de fonctionnement n'a pas bougée depuis.

Merci par avance.

Re,

Je comprends ton souci mais pas sur d'arriver à cela. J'y avais déjà pensé lorsque je t'avais le code au début de ta demande

On va voir si possible car rechercher dans un champ de TCD comme le champ de page ne me parait pas évident

Amicalement

Bonjour Dan,

Après avoir trituré un peu excel avec les TCD, je découvre enfin les fameux Slicer, qui permettent de sélectionner plusieurs valeurs à la volée, et ce pour plusieurs TCD associés si besoin est.

J'ai l'impression que le problème que je soulève plus haut pourrait peut-être être résolu par une macro qui sélectionnerai automatiquement les codes communes dans le slicer directement. Cela est-il envisageable ?

Rechercher des sujets similaires à "macro filtre choix multiple tcd"