par , 05/11/2020 à 11h48 (635 Affichages)
Bonjour,
En consultant mon dossier utilitaire à la rubrique Tableaux Structurés, j'ai observé ce développement
(Je n'en suis pas l'auteur, et, contrairement à mes habitudes, je n'ai pas reporté la source. Nul, Marcel!)
A partir d'un tableau structuré nommé monbotablo
![Nom : Billet_tblostruc_filtre_20201105.JPG
Affichages : 867
Taille : 18,6 Ko](https://www.developpez.net/forums/attachment.php?attachmentid=583082&d=1604571743)
Si l'on souhaite appliquer un filtre sur le pays
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Option Explicit
Sub FiltreTableau()
Dim cellRésult As Range
With ThisWorkbook.Worksheets("Feuil1")
If .FilterMode = True Then
.ListObjects("monbotablo").Range.AutoFilter
End If
.ListObjects("monbotablo").Range.AutoFilter _
Field:=1, Criteria1:="=be*"
'Renvoie la plage de cellules visibles après l'application du filtre.
Set cellRésult = .ListObjects("monbotablo").Range.Cells.SpecialCells(xlCellTypeVisible).Cells
End With
End Sub |
Or, je suis adepte d'une bonne visibilité dans tout code, et
me gêne quelque peu.
Je proposerais de paramétrer le numéro de champ (Column) par sa proprété Index
Soit, avec une procédure argumentée
Appel
1 2 3 4 5
| Option Explicit
Public Sub filter_tablostruc()
Call FiltreTableau(lechamp:="pays", lecritère:="It*")
End Sub |
Procédure
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
| Public Sub FiltreTableau(lechamp As String, lecritère As String)
Dim numchamp As Integer
Dim cellRésult As Range
'Filtre la colonne du tableau correspondant au paramètre "lechamp",
'avec pour crtitère le paramètre "lecritère"
'sensible à la casse.
With Worksheets("Feuil1")
'Efface le filtre éventuel
If .FilterMode = True Then _
.ListObjects("monbotablo").Range.AutoFilter
'Recherche la colonne où se trouve le champ souhaité
numchamp = .ListObjects("monbotablo").ListColumns(lechamp).Index
'Filtre
.ListObjects("monbotablo").Range.AutoFilter _
Field:=numchamp, Criteria1:=lecritère
'Renvoie la plage de cellules visibles après l'application du filtre
'1 -avec la ligne de titre
Set cellRésult = .ListObjects("monbotablo").Range.Cells.SpecialCells(xlCellTypeVisible).Cells
Debug.Print "1ère cellule des titres: " & cellRésult.Cells(1, 1).Value
'2 -sans la ligne de titre
Set cellRésult = .ListObjects("monbotablo").DataBodyRange.Cells.SpecialCells(xlCellTypeVisible).Cells
Debug.Print "1ère cellule des enregistrements: " & cellRésult.Cells(1, 1).Value
End With
End Sub |
Dans un premier temps, j'avais opté pour la recherche du nom de champ dans la plage des titres du tableau structuré
numchamp = Application.WorksheetFunction.Match(lechamp, .ListObjects("monbotablo").HeaderRowRange, 0)
Bien entendu, la propriété Index est plus appropriée (Inutile d'inventer la roue
)
J'ai cru utile d'ajouter une définition de la plage cellRésult.
En effet, les objets Range et DataBodyRange n'ont pas la même portée.