【问题标题】:Compile - Syntax Error: When toggling select filter with If Statement编译 - 语法错误:使用 If 语句切换选择过滤器时
【发布时间】:2019-10-07 21:53:51
【问题描述】:

又是我——我最终会更好地了解这门语言。

基本上 - 我有一个大数据表,其中有自动过滤器 - 范围“$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

但是,当我现在运行它时,这意味着它会打开过滤器,然后只需按一下按钮即可再次关闭。我怎么做才能让它一次只改变。

即如果按下按钮时过滤器打开,它只会将其关闭。

反之亦然

【问题讨论】:

  • 你好! :) 干杯,我刚试了一下,它返回一个编译错误:预期:表达式?
  • 不要忘记为每个范围对象引用一个 wb 和 ws。这包括Sheets() 对象。
  • 为什么要使用 ':' 而不是将 else 语句的代码放在新行中?
  • 真的很抱歉,我不确定您指的是什么位?您是指 Else 语句中的空白条件吗?

标签: excel vba syntax-error


【解决方案1】:

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

我发现在 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

【讨论】:

  • @MimiBeard 看看 Peter 是如何构建他的 If..Else 语句的?它可以提供更好的概览
  • @TimStack 哦,我现在明白了!对不起,我没有马上看到,估计需要清晰的眼睛!
  • 谢谢彼得,我现在正在试用它,它说 Set dataIsFiltered = 行需要一个我会继续播放的对象
  • 这是我的错误。 AutoFilter 行返回用作布尔值的 Variant 类型。我已经修复了上面示例中的代码。
【解决方案2】:

打开/关闭过滤器的最简单方法是使用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

【讨论】:

  • @MimiBeard 很高兴能帮上忙
猜你喜欢
  • 1970-01-01
  • 2015-01-21
  • 2017-07-26
  • 2015-10-24
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多