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 Object variable or With Block variable not set


如果在出现第一个错误后始终单击CommandButton2,并同时更改工作表并返回CommandButton2的工作表,然后再次单击该按钮,则有时可以解决问题。

我实际上有一个解决方案。问题不再存在,而不是带有以下代码的ws1.AutoFilter.ShowAllData。但是我想知道我第一个会错过什么?是什么原因导致ws1.AutoFilter.ShowAllData发生错误?因为我在其他地方使用它没有任何问题。
ws1.Select
If (ws1.AutoFilterMode And ws1.FilterMode) Or ws1.FilterMode Then
ws1.ShowAllData
End If

最佳答案

如果过滤器是在表(或几个表,但您需要修改代码)中设置的,如注释中所示,try this answer:

ws1.ListObjects(1).AutoFilter.ShowAllData

or this one:
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

以这种方式使用ListObjectvery powerful

关于vba - VBA代码有时可以工作,但有时不能在表格格式的WorkSheet中的自动筛选行上使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44794801/

10-13 08:38