【问题标题】:ListRow.Delete method doesn't work on filtered tableListRow.Delete 方法不适用于过滤表
【发布时间】:2018-11-09 06:46:26
【问题描述】:

我试图弄清楚为什么 VBA ListRow.Delete 方法在我的表被过滤和不被过滤时似乎工作方式不同。

我有一个包含电子邮件地址的表格,并有一个名为 AutoCheck 的列,其中包含一个用于检查地址是否满足我的有效性标准的公式。我还有一个宏(与一些按钮相关联),它删除表中所有在False 处具有AutoCheck 值的行:

Sub FixErrors()

    Dim tbl As ListObject
    Dim x As Long
    Set tbl = ActiveSheet.ListObjects("Kontakty")

    For x = tbl.ListRows.Count To 1 Step -1
        If tbl.ListRows(x).Range.Columns(tbl.ListColumns("AutoCheck").Index) = False Then
            tbl.ListRows(x).Delete
        End If
    Next x


End Sub

当我显示整个表格时,这就像一个魅力,但是当我应用过滤器并只显示一些条目时(不管有问题的行是否被过滤掉),宏突然停止工作!我已经尝试了一些调试并且仍然完全困惑。我在tbl.ListRows(x).Delete 的行设置了一个断点,它正确识别了违规行(tbl.ListRows(x).Range.Columns(tbl.ListColumns("Email").Index) 的手表显示了我需要删除的正确电子邮件),但tbl.ListRows(x).Delete 只是没有做任何事情,我一步通过它,什么都没有改变!

我确定我在这里遗漏了一些东西,如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 这是一个错误。之前已经举报了,现在还没有回复。
  • 感谢您的信息(以及非常迅速的答复)!好吧,这很糟糕,但至少现在我不必担心错过了一些明显的东西:)

标签: vba excel listobject


【解决方案1】:

看看这是否有效:

Sub FixErrors()

   Dim tbl As ListObject
   Dim x As Long
   Set tbl = ActiveSheet.ListObjects("Kontakty")

   Application.DisplayAlerts = False

   For x = tbl.ListRows.Count To 1 Step -1
       If tbl.ListRows(x).Range.Columns(tbl.ListColumns("AutoCheck").Index) = False Then
          tbl.ListRows(x).Range.Delete
       End If
   Next x

   Application.DisplayAlerts = True

End Sub

【讨论】:

  • 感谢您的回答!您的解决方案比另一个解决方案有一点优势,因为当表格未过滤时,它不会删除整行。马克的回答虽然更清楚,所以我接受他的。如果其他人好奇,使用此解决方案,当您省略 Application.DisplayAlerts = False 并且表格被过滤时,它会询问您是否要删除整行。所以实际上,当过滤表时,它与其他答案相同,否则只删除表中的列。
【解决方案2】:

表格中的这种行为似乎是设计使然。我不确定为什么会这样,或者允许删除过滤表行的后果可能是什么。如果您右键单击过滤后的表格单元格然后转到删除,您的选项是表格列或整个工作表行。

运行您的代码会在 tbl.ListRows(x).Range.Delete 行引发运行时 1004:

但是,鉴于上述右键单击删除选项,应该可以删除EntireRow:

Sub FixErrors()
Dim tbl As ListObject
Dim x As Long

    Set tbl = ActiveSheet.ListObjects("Kontakty")

    For x = tbl.ListRows.Count To 1 Step -1
        If tbl.ListRows(x).Range.Columns(tbl.ListColumns("AutoCheck").Index) = False Then
            tbl.ListRows(x).Range.EntireRow.Delete
        End If
    Next x

End Sub

在 Excel 365 中测试并且可以正常工作!

【讨论】:

  • 感谢您的澄清!奇怪的是,尽管您在我的代码中遇到了该错误,但对我来说却没有(Office Professional Plus 2016,不知道版本,某些设置或其他内容是否存在差异)。无论如何,您的解决方案对我有用!我的表格旁边没有任何东西,所以删除一整行是可以的,即使不让宏影响表格本身之外的任何区域会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 2011-12-17
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多