编译-语法错误:使用If语句切换选择过滤器时

时间:2019-05-21 13:28:13

标签: excel vba syntax-error

又是我-最终我将更好地了解这种语言。

基本上-我有一个很大的数据表,其中包含自动过滤功能-范围“ $ B $ 5:$ Z $ 1697”

但是,我想在R列上添加或关闭其他过滤器。

因此,我需要一个If语句,该语句指示在打开其他过滤器时,将其删除,但是,如果在您按下按钮时未打开过滤器,请应用它。

我已经试过了,看了更多我想承认的视频。但是,一定有一些我忽略或不了解的东西。

代码会一直处理到其他行,然后返回:

  

“编译错误,语法错误”。

任何人都可以解释发生了什么事吗?

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 个答案:

答案 0 :(得分:1)

打开/关闭过滤器的最简单方法是使用ActiveX Toggle button。单击(启用)切换按钮时,将应用过滤器,再次单击(禁用)时,将删除过滤器。更改toggle buttonCriteria1的名称以满足您的需求。

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

答案 1 :(得分:0)

这不是一个完整的答案,但我无法将所有这些都放入评论中……

我发现不断使用复合引用来引用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