VBA代码有时可以工作,但有时不会在表格格式的工作表

时间:2017-06-28 06:07:58

标签: excel vba excel-vba error-handling runtime-error

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

1 个答案:

答案 0 :(得分:1)

如果过滤器设置在表(或多个表中,但您需要修改代码),正如您在评论中指出的那样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