Мне не удалось заставить ваш ListObject.ShowAutoFilter
обходной путь работать на меня, особенно потому, что мне нужно было не только отключить автофильтр, но и программно восстановить фильтр, как только мой код будет готов.
Я немного возился с записью макросов на Mac и обнаружил, что, хотя Range.AutoFilter
выдает ошибку, Selection.AutoFilter
этого не делает. Таким образом, я смог просто выбрать диапазон, который я хотел отфильтровать, а затем применить свой фильтр к выбору.
ws.Range(currentFiltRange).Select
Selection.AutoFilter
Если вам нужно сохранить выбор пользователя, вы также можете легко восстановить его, вот моя полная подпрограмма для сохранения состояния автофильтра, запуска собственного кода, а затем восстановления состояния автофильтра, и оно работает как на ПК, так и на 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