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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
Option Explicit
Public Function TS_Filtres_Existe(TS As Range) As Boolean
' Indique si un Tableau Structuré est filtré ou non
' TS : La plage du Tableau Structuré.
Dim f As Integer
' Boucle sur les filtres du tableau pour savoir s'ils sont actifs ou non:
With TS.ListObject.AutoFilter.Filters
For f = 1 To .Count
If .Item(f).On Then
TS_Filtres_Existe = True
Exit For
End If
Next f
End With
End Function
Public Function TS_Filtres_Memoriser(TS As Range, Memoire As Variant) As Boolean
' Mémorise les filtres d'un Tableau Structuré puis les supprime.
' TS : la plage du Tableau Structuré.
' Mémoire : la mémoire à utiliser.
Dim f As Integer
Dim MultiSelect As String
Dim iItem As Long
Const delim As String = "</:\>"
' Boucle sur les filtres du tableau:
With TS.ListObject.AutoFilter.Filters
ReDim Memoire(1 To .Count, 1 To 4)
For f = 1 To .Count
With .Item(f)
Memoire(f, 1) = .On
If .On Then
Memoire(f, 2) = .Operator
If .Operator = 7 Then
MultiSelect = ""
For iItem = LBound(.Criteria1) To UBound(.Criteria1)
MultiSelect = MultiSelect & IIf(MultiSelect = "", "", delim) & .Criteria1(iItem)
Next iItem
Memoire(f, 3) = MultiSelect
Else
Memoire(f, 3) = .Criteria1
If .Operator = 1 Or .Operator = 2 Then
Memoire(f, 4) = .Criteria2
End If
End If
End If
End With
Next f
End With
' je supprime les filtres
TS.ListObject.AutoFilter.ShowAllData
End Function
Public Function TS_Filtres_Restaurer(TS As Range, Memoire As Variant) As Boolean
' Restaure les filtres d'un Tableau Structuré préalablement mémorisés avec TS_Filtres_Mémoriser.
' TS : la plage du Tableau Structuré.
' Mémoire : la mémoire à utiliser.
Dim f As Integer
Dim Monfiltre As Variant
Dim Monfiltre2 As Variant
Const delim As String = "</:\>"
For f = 1 To UBound(Memoire, 1)
If Memoire(f, 1) = True Then
'Il y a un filtre. Est-ce un multi-selection?
If Memoire(f, 2) = 7 Then
Monfiltre = Split(Memoire(f, 3), delim)
TS.ListObject.Range.AutoFilter Field:=f, Criteria1:=Monfiltre, Operator:=xlFilterValues
Else
'le filtre est "classique"
Monfiltre = Memoire(f, 3)
If Memoire(f, 2) = 1 Or Memoire(f, 2) = 2 Then
Monfiltre2 = Memoire(f, 4)
TS.ListObject.Range.AutoFilter Field:=f, Criteria1:=Monfiltre, Operator:=Memoire(f, 2), Criteria2:=Monfiltre2
Else
TS.ListObject.Range.AutoFilter Field:=f, Criteria1:=Monfiltre
End If
End If
End If
Next f
End Function |
Partager