Компилировать - синтаксическая ошибка: при переключении выберите фильтр с помощью оператора If - PullRequest
1 голос
/ 21 мая 2019

это снова я - я в конечном итоге лучше узнаю этот язык.

В основном - у меня есть большая таблица данных, для которой включен автофильтр - диапазон "$ B $ 5: $ Z $ 1697"

Однако в столбце R есть дополнительный фильтр, который я хочу включить или выключить.

Поэтому мне нужно утверждение If, которое говорит, что когда дополнительный фильтр включен, удалите, тогда как, если фильтр не включен в момент нажатия кнопки - примените его.

Я поиграл с этим и посмотрел больше видео, которые хочу признаться. Однако должно быть что-то, что я пропускаю или не понимаю.

Код работает до строки Else, которая возвращает:

«Ошибка компиляции, синтаксическая ошибка».

Может кто-нибудь объяснить, что происходит?

If Sheets(4).Range("$B$5:$Z$1697").AutoFilter(Field:=17, Criteria1:="=") = True Then
    'If there specific filter on column R is on then

    Sheets(4).Range("$B$5:$Z$1697").AutoFilter Field:=17
    'Turn off that filter.

Else: Sheets(4).Range("$B$5:$Z$1697").AutoFilter(Field:=17, Criteria1:="=")
'Else, if the filter is off, turn it on.

End If

End Sub

РЕДАКТИРОВАТЬ: я исправил код, исправляя эту строку ELSE к этому

Else: Sheets(4).Range("$B$5:$Z$1697").AutoFilter(Field:=17, Criteria1:="=") = True

Однако, когда я запускаю это сейчас, это означает, что он включает и снова выключает фильтр одним нажатием кнопки. Как мне сделать так, чтобы он только вносил изменения одновременно.

т.е. если фильтр включен при нажатии кнопки, он ТОЛЬКО выключает его.

и наоборот

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Самый простой способ включить / выключить фильтр - это использовать ActiveX Toggle button. Когда кнопка переключения нажата (включена), ваш фильтр будет применен, при повторном нажатии (отключен) ваш фильтр будет удален. Измените имя toggle button и Criteria1 в соответствии с вашими потребностями.

Private Sub ToggleButton1_Click()
    'when selected(enabled) the filter for Col "Q" will be enabled 
    If ToggleButton1.Value = True Then
        Sheets(4).Range("$B$5:$Z$1697").AutoFilter Field:=17, Criteria1:="2"
    Else
    'when selected again(disabled) the filter for Col "Q" will be Disabled 
        Sheets(4).Range("$B$5:$Z$1697").AutoFilter Field:=17
    End If
End Sub
0 голосов
/ 21 мая 2019

Это НЕ полный ответ, но я не могу вписать все это в комментарий ...

Я обнаружил, что постоянное использование составных ссылок для ссылки на различные объекты в Excel может вызвать головную боль. Использование промежуточных объектов вообще не налагает значительного ущерба производительности, поэтому я имею привычку разбивать составную ссылку на серию промежуточных объектов. Это дает мне по крайней мере два преимущества: 1) я могу исследовать промежуточные объекты, чтобы убедиться в наличии данных, которые, как мне кажется, должны быть, и 2) я получаю гораздо меньше синтаксических ошибок, потому что каждый шаг проверяется.

Итак, хотя я не могу проверить, правильно ли это, поскольку я не могу получить доступ к вашим данным, ваша логика может выглядеть следующим образом

Sub Example()
    Dim fourthWS As Worksheet
    Dim filteredData As Range
    Set fourthWS = ThisWorkbook.Sheets(4)
    Set filteredData = fourthWS.Range("$B$5:$Z$1697")

    Dim dataIsFiltered As Variant
    dataIsFiltered = filteredData.AutoFilter(Field:=17, Criteria1:="=")

    If dataIsFiltered Then
        '--- turn off the filter
        filteredData.AutoFilter Field:=17
    Else
        '--- turn on the filter
        filteredData.AutoFilter Field:=17, Criteria1:="="
    End If
End Sub
...