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是非常强大的 。