ListRow.Delete 方法不适用于过滤 table
ListRow.Delete method doesn't work on filtered table
我想弄清楚为什么 VBA ListRow.Delete
方法在我的 table 被过滤时和未被过滤时的工作方式似乎有所不同。
我有一个包含电子邮件地址的 table,还有一个名为 AutoCheck
的列,其中包含一个检查地址是否满足我的有效性标准的公式。我还有一个宏(绑定到某些按钮),它删除 table 中具有 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
当我显示整个 table 时,这就像一个魅力,但是当我应用过滤器并仅显示一些条目时(无论是否过滤掉违规行),宏突然停止工作!我尝试了一些调试,但仍然完全困惑。我在 tbl.ListRows(x).Delete
行设置了一个断点,它正确地识别了有问题的行(tbl.ListRows(x).Range.Columns(tbl.ListColumns("Email").Index)
的监视显示了我需要删除的正确电子邮件),但是 tbl.ListRows(x).Delete
只是没有什么都不做,我逐步完成,没有任何改变!
我确定我在这里遗漏了一些东西,我将不胜感激任何帮助。
看看这是否有效:
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
Table 中的这种行为似乎是设计使然。我不确定为什么会这样,或者允许过滤 table 行删除的后果是什么。如果您右键单击过滤后的 table 单元格,然后转到删除,您的选项是 Table 列或整个 Sheet 行。
运行 您的代码在 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 中测试并且有效!
我想弄清楚为什么 VBA ListRow.Delete
方法在我的 table 被过滤时和未被过滤时的工作方式似乎有所不同。
我有一个包含电子邮件地址的 table,还有一个名为 AutoCheck
的列,其中包含一个检查地址是否满足我的有效性标准的公式。我还有一个宏(绑定到某些按钮),它删除 table 中具有 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
当我显示整个 table 时,这就像一个魅力,但是当我应用过滤器并仅显示一些条目时(无论是否过滤掉违规行),宏突然停止工作!我尝试了一些调试,但仍然完全困惑。我在 tbl.ListRows(x).Delete
行设置了一个断点,它正确地识别了有问题的行(tbl.ListRows(x).Range.Columns(tbl.ListColumns("Email").Index)
的监视显示了我需要删除的正确电子邮件),但是 tbl.ListRows(x).Delete
只是没有什么都不做,我逐步完成,没有任何改变!
我确定我在这里遗漏了一些东西,我将不胜感激任何帮助。
看看这是否有效:
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
Table 中的这种行为似乎是设计使然。我不确定为什么会这样,或者允许过滤 table 行删除的后果是什么。如果您右键单击过滤后的 table 单元格,然后转到删除,您的选项是 Table 列或整个 Sheet 行。
运行 您的代码在 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 中测试并且有效!