Je n'ai pas réussi à obtenir votre solution de travail ListObject.ShowAutoFilter
pour travailler pour moi, en particulier parce que je devais non seulement désactiver le filtre automatique, mais ensuite restaurer par programme le filtre une fois mon code a été fait. J'ai fait un peu de déconner avec l'enregistrement de macro sur le Mac et a constaté que même si Range.AutoFilter
jette une erreur Selection.AutoFilter
ne fait pas. J'ai donc pu sélectionner la plage que je voulais filtrer puis appliquer mon filtre à la sélection.
ws.Range(currentFiltRange).Select
Selection.AutoFilter
Si vous devez conserver la sélection de l'utilisateur, vous pouvez facilement restaurer cela aussi bien, voici ma routine complète de sous pour enregistrer l'état autofilter, exécutez votre propre code, puis restaurer l'état autofilter et il fonctionne aussi bien sur PC et Mac.
Private Sub saveAndRestoreAutoFilterPCandMAC()
Application.ScreenUpdating = False
'START SAVING AUTOFILTER STATE
Dim ws As Worksheet
Dim filterArray()
Dim currentFiltRange As String
Dim col As Integer
Dim usingAutoFilter As Boolean
Dim userSelection As String
usingAutoFilter = False
Set ws = ActiveSheet
'Capture AutoFilter settings
If ws.AutoFilterMode = True Then
With ws.AutoFilter
currentFiltRange = .Range.Address
If ws.FilterMode = True Then
usingAutoFilter = True
With .Filters
ReDim filterArray(1 To .count, 1 To 3)
For col = 1 To .count
With .Item(col)
If .On Then
filterArray(col, 1) = .Criteria1
If .Operator Then
filterArray(col, 2) = .Operator
If .Operator = xlAnd Or .Operator = xlOr Then
filterArray(col, 3) = .Criteria2
End If
End If
End If
End With
Next col
End With
End If
End With
End If
'END SAVING AUTOFILTER STATE
'Remove AutoFilter
ws.AutoFilterMode = False
'Start Your code here
'End of your code
'START RESTORE FILTER SETTINGS
If Not currentFiltRange = "" Then
userSelection = Selection.Address
ws.Range(currentFiltRange).Select
Selection.AutoFilter
If usingAutoFilter Then
For col = 1 To UBound(filterArray(), 1)
If Not IsEmpty(filterArray(col, 1)) Then
If filterArray(col, 2) Then
'check if Criteria2 exists and needs to be populated
If filterArray(col, 2) = xlAnd Or filterArray(col, 2) = xlOr Then
ws.Range(currentFiltRange).Select
Selection.AutoFilter Field:=col, _
Criteria1:=filterArray(col, 1), _
Operator:=filterArray(col, 2), _
Criteria2:=filterArray(col, 3)
Else
ws.Range(currentFiltRange).Select
Selection.AutoFilter Field:=col, _
Criteria1:=filterArray(col, 1), _
Operator:=filterArray(col, 2)
End If
Else
ws.Range(currentFiltRange).Select
Selection.AutoFilter Field:=col, _
Criteria1:=filterArray(col, 1)
End If
End If
Next col
End If
End If
ws.Range(userSelection).select
'END RESTORE FILTER SETTINGS
Application.ScreenUpdating = True
End Sub