Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Delete方法不使用';不要在过滤表上工作_Vba_Excel_Listobject - Fatal编程技术网

Vba Delete方法不使用';不要在过滤表上工作

Vba Delete方法不使用';不要在过滤表上工作,vba,excel,listobject,Vba,Excel,Listobject,我正在试图弄清楚为什么VBAListRow.Delete方法在筛选我的表和未筛选表时的工作方式似乎有所不同 我有一个包含电子邮件地址的表,还有一个名为AutoCheck的列,其中包含一个检查地址是否符合我的有效性标准的公式。我还有一个宏(绑定到一些按钮),用于删除表中所有在False处具有AutoCheck值的行: Sub FixErrors() Dim tbl As ListObject Dim x As Long Set tbl = ActiveSheet.List

我正在试图弄清楚为什么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
什么都不做,我一步一步走过,什么都没有改变

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

看看这是否有效:

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

表中的这种行为似乎是故意的。我不知道为什么会这样,也不知道允许删除筛选表行会有什么后果。如果在筛选的表格单元格上单击鼠标右键,然后转到“删除”,则选项为表格列或整个图纸行

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

但是,如果使用上述右键单击删除选项,则应该可以删除整个流程

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,不知道版本、某些设置或其他方面是否存在差异)。不管怎样,你的解决方案对我有效!我在表格旁边没有任何内容,因此删除整行是可以的,即使宏不影响表格之外的任何区域会更好。谢谢您的回答!与其他解决方案相比,您的解决方案有一点优势,即在未筛选表时不会删除整行。马克的回答更加清晰,所以我接受他的回答。如果其他人好奇,使用此解决方案,当您忽略
Application.DisplayAlerts=False
并对该表进行筛选时,它会询问您是否要删除整行。因此,实际上,当筛选表时,它与另一个答案相同,否则只删除表中的列。