Filtre élaboré
Résolu
ti_mouton
Messages postés
153
Statut
Membre
-
ti_mouton Messages postés 153 Statut Membre -
ti_mouton Messages postés 153 Statut Membre -
Bonjour,
J'ai besoin de renseigner un code VBA qui me permette de filtré les données contenu dans un TCD.
Le TCD se trouve dans la feuille nommée "Base", le critère du filtre se trouve dans la plage B1:C3 de la feuille "BLOCS", je veux que le filtre soit copié en cellule D6 de cette même feuille "BLOCS".
Voici ce que j'ai fait jusqu'à présent (et qui ne fonctionne pas...)
Mon pb est que le TCD contient déjà plusieurs dizaines de milliers de lignes, et il est amené à évoluer, je ne peux donc pas renseigner une plage de cellule précise du style Range("A1:Y100").AdvancedFilter. Auriez vous des idées pour m'aider ?
Merci d'avance
J'ai besoin de renseigner un code VBA qui me permette de filtré les données contenu dans un TCD.
Le TCD se trouve dans la feuille nommée "Base", le critère du filtre se trouve dans la plage B1:C3 de la feuille "BLOCS", je veux que le filtre soit copié en cellule D6 de cette même feuille "BLOCS".
Voici ce que j'ai fait jusqu'à présent (et qui ne fonctionne pas...)
Sub FiltreAvance()
Sheets("Base").Range("Tableau croisé dynamique1").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("BLOCS").[B1:C3], CopyToRange:=Sheets("BLOCS").[D6], Unique:=True
End Sub
Mon pb est que le TCD contient déjà plusieurs dizaines de milliers de lignes, et il est amené à évoluer, je ne peux donc pas renseigner une plage de cellule précise du style Range("A1:Y100").AdvancedFilter. Auriez vous des idées pour m'aider ?
Merci d'avance
1 réponse
Résumé de la discussion
Filtrer un TCD via AdvancedFilter en VBA nécessite des critères dans B1:C3 de BLOCS et leur copie en D6 sur BLOCS, tout en gérant un TCD évolutif sur Base. Des solutions dynamiques ont été proposées, notamment calculer la dernière ligne et adapter une plage de départ (15,1) jusqu'à DL pour appliquer le filtre avancé. Plusieurs variantes ont évolué en utilisant le dernier rang d'une colonne et des plages dynamiques pour les résultats, avec CopyToRange tels que D6 puis D12. En fin de compte, le code utilisant une plage dynamique et CopyToRange BLOCS.B12 a été présenté comme opérationnel, après plusieurs ajustements et essais, ouvert à de futures optimisations selon l'évolution du TCD.
-
Bonjour,
Pourquoi ne pas utiliser une variable?
Sub FiltreAvance() Dim DL As Integer 'Définit la variable DL pour dernière ligne DL = Cells(Application.Rows.Count, 1).End(xlUp).Row 'Le 1 est à adapter, il faut mettre le numéro de ta colonne qui est remplie jusqu'à la fin du tableau Sheets("Base").Range(Cells(1, 1), Cells(i, "Nombre total de colonnes")).AdvanceFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("BLOCS").[B1:C3], CopyToRange:=Sheets("BLOCS").[D6], Unique:=True End Sub
Je verrais ça comme ça...-
Bonjour Kuartz,
Merci pour ta réponse ! J'ai très peu de connaissances en VBA, c'est pourquoi je n'avais pas pensé cette histoire de variable. Je vais essayer d'utiliser ton code, par contre, mon TCD ne commence qu'à partir de la ligne 15 de la feuille "Base", comment cela modifie t il le code ?
Merci -
Ca ne pose pas de problème mais je suis en train d'essayer le code et quelque chose cloche, je ne connais pas bien le code "AdvancedFilter" et on dirait qu'il ne s'utilise pas comme ça.
Si ton tableau commence à la ligne 15, tu dois changer la première "Cells" de la Range :
Sub FiltreAvance() Dim DL As Integer 'Définit la variable DL pour dernière ligne DL = Cells(Application.Rows.Count, 1).End(xlUp).Row 'Le 1 est à adapter, il faut mettre le numéro de ta colonne qui est remplie jusqu'à la fin du tableau Sheets("Base").Range(Cells(15, 1), Cells(DL, "Nombre total de colonnes")).Select selection.AdvanceFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("BLOCS").[B1:C3], CopyToRange:=Sheets("BLOCS").[D6], Unique:=True End Sub -
-
Le code final (j'ai fait plein d'erreurs désolé, je suis pas reveillé...)
Sub FiltreAvance() Dim DL As Integer 'Définit la variable DL pour dernière ligne DL = Cells(Application.Rows.Count, 1).End(xlUp).Row 'Le 1 est à adapter, il faut mettre le numéro de ta colonne qui est remplie jusqu'à la fin du tableau Sheets(1).Range(Cells(15, 1), Cells(DL, 3)).Select Selection.AdvanceFilter Action:=xlFilterCopy, CriteriaRange:=Sheets(1).[B1:C3], CopyToRange:=Sheets(1).[D6], Unique:=True End Sub
Vois si il convient et reviens moi ;) -
-