Private Sub CommandButton2_Click()
.
.
Set ws1 = Sheet1
ws1.Activate 'I'd like to see the sheet that's why I activate it. It's not a bad practice.
ws1.Columns.Hidden = False
ws1.Rows.Hidden = False
ws1.AutoFilter.ShowAllData
.
.
我在另一张表中有这个CommandButton2,每当我点击它时,它首先清除Sheet1中的所有过滤器,然后取消隐藏任何列或行(如果存在)。
我尝试了很多不同的变体来解决这个问题。我对2-3或4列进行了一些过滤,然后同时隐藏了一些行和列。但不幸的是,我无法找到原因。
- 有时我的代码完美无缺。
我的意思是,它取消隐藏每个隐藏的行和列,然后清除列中的所有过滤器。
- 有趣的是,有时代码部分有效。
有时我的代码有效,但不会取消隐藏的行/列,也不会清除过滤器。因此,它似乎在技术上有效,但功能却没有。
- 有时会出现Runtime 91错误。
有时它完全不起作用并提供Runtime 91 Object variable or With Block variable not set
- 有时它在尝试运行代码2-3-4次后开始工作。
如果我在第一次出错后一直点击我的CommandButton2,并在此期间更改工作表并返回到CommandButton2的工作表并再次单击该按钮,有时可以解决问题。
我实际上有一个解决方案。代替ws1.AutoFilter.ShowAllData
以下代码,问题正在消失。但我想知道第一个我会错过什么?在ws1.AutoFilter.ShowAllData
上出现错误的原因是什么?因为我在其他地方使用它没有任何问题。
ws1.Select
If (ws1.AutoFilterMode And ws1.FilterMode) Or ws1.FilterMode Then
ws1.ShowAllData
End If
答案 0 :(得分:1)
如果过滤器设置在表(或多个表中,但您需要修改代码),正如您在评论中指出的那样try this answer:
ws1.ListObjects(1).AutoFilter.ShowAllData
ws1.ListObjects(1).ShowAutoFilter = False
ws1.ListObjects(1).ShowAutoFilter = True
请注意,如果工作表中有多个ListObject
,则必须手动指定您想要的那个 - 通过索引,如上所示,按名称或通过迭代。
按名称:
ws1.ListObjects("Table1")
通过迭代:
For Each tbl In ws1.ListObjects
tbl.AutoFilter.ShowAllData
Next tbl
最后,如果您要多次引用ListObject
,就像您想更广泛地使用该表一样,我强烈建议为其设置一个变量,如下所示:
Dim tbl As ListObject
Set tbl = ws1.ListObjects(1)
tbl.AutoFilter.ShowAllData
以这种方式使用ListObject
是very powerful。