Bonjour,
Après recherche sur ce forum et sur d'autres, je n'ai pas trouvé de solution à mon problème. J'ouvre donc une nouvelle discussion.
Je cherche à sauvegarder un filtre, avec une macro VBA, pour pouvoir le réappliquer ensuite.
Concrètement: un onglet excel est filtré (sur une ou plusieurs colonnes)
1/ Je sauvegarde les filtres existants (fonction sauve_filtre())
2/ je supprime ces filtres pour faire quoi que ce soit sur l'onglet (appliquer d'autres macros par exemple)
3/ je réapplique les filtres sauvegardés (fonction restaure_filtre())
J'avais créé une macro, qui fonctionnait très bien sur Excel 2003. Mais mon entreprise est passée à Excel 2007 et ça ne marche plus à chaque fois: les critères des filtres sont beaucoup plus complexes (on peut faire des sélections multiples).
Ci dessous, voici mon code (à l'époque, je m'étais basé sur un code trouvé sur F1: "Autofilter"). Pourriez-vous m'indiquer comment je pourrais l'améliorer pour qu'il fonctionne à tous les coups (quels que soient les critères sélectionnés dans les filtres) ?
Merci d'avance,
Thibault.
-----------------------------------------------------------
Dim w As Worksheet
Dim filterArray()
Dim currentFiltRange As String
Dim Monfiltre As Variant
Dim Monfiltre2 As Variant
Sub sauve_filtre()
Set w = ActiveWorkbook.ActiveSheet
With w.AutoFilter
currentFiltRange = .Range.Address
With .Filters
ReDim filterArray(1 To .Count, 1 To 3)
For f = 1 To .Count
With .Item(f)
If .On Then
filterArray(f, 1) = .Criteria1
If .Operator = 1 Or .Operator = 2 Then
filterArray(f, 2) = .Operator
filterArray(f, 3) = .Criteria2
End If
End If
End With
Next
End With
End With
w.AutoFilterMode = False
End Sub
Sub restaure_filtre()
Set w = ActiveSheet
w.AutoFilterMode = False
For col = 1 To UBound(filterArray(), 1)
If Not IsEmpty(filterArray(col, 1)) Then
Monfiltre = filterArray(col, 1)
If filterArray(col, 2) Then
Monfiltre2 = filterArray(col, 3)
w.Range(currentFiltRange).AutoFilter field:=col, Criteria1:=Monfiltre, Operator:=filterArray(col, 2), Criteria2:=Monfiltre2
Else
w.Range(currentFiltRange).AutoFilter field:=col, Criteria1:=Monfiltre
End If
End If
Next
End Sub
Après recherche sur ce forum et sur d'autres, je n'ai pas trouvé de solution à mon problème. J'ouvre donc une nouvelle discussion.
Je cherche à sauvegarder un filtre, avec une macro VBA, pour pouvoir le réappliquer ensuite.
Concrètement: un onglet excel est filtré (sur une ou plusieurs colonnes)
1/ Je sauvegarde les filtres existants (fonction sauve_filtre())
2/ je supprime ces filtres pour faire quoi que ce soit sur l'onglet (appliquer d'autres macros par exemple)
3/ je réapplique les filtres sauvegardés (fonction restaure_filtre())
J'avais créé une macro, qui fonctionnait très bien sur Excel 2003. Mais mon entreprise est passée à Excel 2007 et ça ne marche plus à chaque fois: les critères des filtres sont beaucoup plus complexes (on peut faire des sélections multiples).
Ci dessous, voici mon code (à l'époque, je m'étais basé sur un code trouvé sur F1: "Autofilter"). Pourriez-vous m'indiquer comment je pourrais l'améliorer pour qu'il fonctionne à tous les coups (quels que soient les critères sélectionnés dans les filtres) ?
Merci d'avance,
Thibault.
-----------------------------------------------------------
Dim w As Worksheet
Dim filterArray()
Dim currentFiltRange As String
Dim Monfiltre As Variant
Dim Monfiltre2 As Variant
Sub sauve_filtre()
Set w = ActiveWorkbook.ActiveSheet
With w.AutoFilter
currentFiltRange = .Range.Address
With .Filters
ReDim filterArray(1 To .Count, 1 To 3)
For f = 1 To .Count
With .Item(f)
If .On Then
filterArray(f, 1) = .Criteria1
If .Operator = 1 Or .Operator = 2 Then
filterArray(f, 2) = .Operator
filterArray(f, 3) = .Criteria2
End If
End If
End With
Next
End With
End With
w.AutoFilterMode = False
End Sub
Sub restaure_filtre()
Set w = ActiveSheet
w.AutoFilterMode = False
For col = 1 To UBound(filterArray(), 1)
If Not IsEmpty(filterArray(col, 1)) Then
Monfiltre = filterArray(col, 1)
If filterArray(col, 2) Then
Monfiltre2 = filterArray(col, 3)
w.Range(currentFiltRange).AutoFilter field:=col, Criteria1:=Monfiltre, Operator:=filterArray(col, 2), Criteria2:=Monfiltre2
Else
w.Range(currentFiltRange).AutoFilter field:=col, Criteria1:=Monfiltre
End If
End If
Next
End Sub