ListRow.Delete方法不适用于过滤表

时间:2018-05-30 12:03:47

标签: excel vba excel-vba listobject

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

我有一个包含电子邮件地址的表,并且有一个名为AutoCheck的列,其中包含一个检查地址是否符合我的有效性标准的公式。我还有一个宏(绑定到某些按钮),删除AutoCheck值为False的表的所有行:

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只是没有&# 39;什么都不做,我一步一步,没有任何改变!

我确定我在这里遗漏了一些东西,我很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

表中的这种行为似乎是设计上的。我不确定为什么会这样或者允许过滤表行删除的后果是什么。如果右键单击已过滤的表格单元格,则转到“删除”,您的选项为“表格列”或“整页图纸行”。

运行代码会在tbl.ListRows(x).Range.Delete行抛出运行时1004:

Can't move cells

但是,如果右键单击上述删除选项,则应该可以删除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中测试,它可以工作!

答案 1 :(得分: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