我试图弄清楚为什么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;什么都不做,我一步一步,没有任何改变!
我确定我在这里遗漏了一些东西,我很感激任何帮助。
答案 0 :(得分: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中测试,它可以工作!
答案 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