VBA代码有时工作,但有时不会在表格式化的工作表中的AutoFilter行
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中的所有filter,然后Unhidden任何列或行(如果存在)。
我尝试了很多不同的变化来解决这个问题。 我做2-3或4列过滤,然后同时隐藏一些行和列。 但不幸的是我找不到原因。
- 有时我的代码完美地工作。
我的意思是,它隐藏了每一个隐藏的行和列,然后清除列中的所有filter。
- 有趣的是,有时代码部分工作。
有时我的代码工作,但不隐藏隐藏的行/列,并没有清除filter。 所以它看起来在技术上是可行的,但不是function性的。
- 有时它会产生Runtime 91错误。
有时它完全不起作用并给出Runtime 91 Object variable or With Block variable not set
- 有时它会在尝试运行2-3-4次的代码后开始工作。
如果我在第一次错误后一直点击我的CommandButton2,并在此期间更改表单并返回到CommandButton2的表单并再次单击button,有时可以解决问题。
我其实有一个解决scheme。 用下面的代码代替ws1.AutoFilter.ShowAllData
问题正在消失。 但是我想知道第一个错过了什么? ws1.AutoFilter.ShowAllData
出现错误的原因是什么? 因为我在别的地方使用它没有任何问题。
ws1.Select If (ws1.AutoFilterMode And ws1.FilterMode) Or ws1.FilterMode Then ws1.ShowAllData End If
如果filter设置在一个表格 (或几个表格,但你需要修改代码),如你在评论中指出的, 试试这个答案:
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
,比如你想更广泛的使用表,我强烈build议为它设置一个variables,如下所示:
Dim tbl As ListObject Set tbl = ws1.ListObjects(1) tbl.AutoFilter.ShowAllData
以这种方式使用ListObject
是非常强大的 。