vba Range.Autofilter не работает в Excel 2011 (Mac) - PullRequest
1 голос
/ 28 июля 2011

У меня есть общедоступная подпрограмма в моем коде, как показано ниже:

Public Sub ResetFilters(ByRef tbl As ListObject)
    With tbl

        '// If Filter Arrows are OFF - turns them on
        '// If Filter Arrows are ON - turns them off and resets filter
        .Range.AutoFilter

        '// Always turns filter arrows to on and sorts table by first field
        .Range.AutoFilter Field:=1
    End With
End Sub

Как вы можете видеть, я использую таблицы Excel (ListObjects на языке vba), поэтому я передаю ссылку вsub, и предполагается сбросить таблицу в нефильтрованное состояние.Он отлично работает на ПК с Excel 2007, но не работает в Excel 2011 на Mac с:

Метод «Автофильтр» объекта «Диапазон» не выполнен

Следующая ссылкадля Справочник по VBA в Excel 2011 показывает метод AutoFilter объекта Range, и он соответствует тому, что я вижу в справочниках по ссылкам VBA для Excel 2007.

Так что любой может понять, почемуэто терпит неудачу?

Ответы [ 2 ]

3 голосов
/ 16 декабря 2012

Мне не удалось заставить ваш 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
0 голосов
/ 11 августа 2011

Похоже, что многие задались этим вопросом ... Во всяком случае, если кому-то еще интересно, я думаю, что нашел обходной путь, используя свойство ListObject.ShowAutoFilter.Это логическое свойство для чтения / записи, и когда оно отключено, оно сбрасывает фильтры в ListObject.Он имеет дополнительный бонус работы над Excel 2011 для Mac и Excel 2007 (и 2010 в этом отношении) на ПК.

...