尝试操作/删除 vba 宏中的筛选行时出现 VBA“需要对象”错误 (424)

问题描述 投票:0回答:2

我正在编写一个宏,目的是导入数据并生成清理后的表。

导入后,我形成一个表格并尝试过滤并删除不相关的行。并自然地过滤回我想要的唯一一项 -

"Logged"
这里。

过滤器工作到以下行:

ActiveSheet.ListObjects("Table4").Range.AutoFilter Field:=10, Operator:=xlFilterValues, _
        Criteria1:=Array("Cancelled", "Done", "On Hold", "PreReg")

这可以正确过滤我想要的内容。当我以逐步格式运行它时,我可以查看它并且它有效。当我尝试删除时,事情变得有趣但不起作用。

我尝试使用

.SpecialCells(xlCellTypeVisible).Delete
.SpecialCells(xlCellTypeVisible).EntireRow.Delete
Select
,然后使用
with selection
执行相同的功能。几乎所有的都返回运行时错误 424:需要对象。

我查找了以下解决方案: 1- 来自 StackOverFlow 多个帖子使用相同的解决方案 - 特殊单元 - 正如你所看到的,它不起作用。 2- 在与 1 相同的链接中,回复提供了以下内容:

ActiveSheet.AutoFilter.Range.Offset(1,0).Rows.SpecialCells(xlCellTypeVisible).Delete(xlShiftUp)

虽然此解决方案有效,但我尝试使用表作为对象,然后进行过滤。正如 This 文档所示,这两种情况的输出都应该是一个变体,并且似乎按以下方式应用

.rows
也会产生相同的错误 424:

ActiveSheet.ListObjects("Table4").Range.AutoFilter Field:=10, Operator:=xlFilterValues, _
        Criteria1:=Array("Cancelled", "Done", "On Hold", "PreReg").Rows

3-我怀疑我是否使用了错误的对象名称。所以我开始学习基础知识并录制了一个宏,为我制作了以下几行:

    Table4.Range.AutoFilter Field:=10, _
     Criteria1:=Array("Cancelled", "Done", "On Hold", "PreReg"), Operator _
     :=xlFilterValues
    Range("Table4").Select
    Selection.EntireRow.Delete ' **** This line does not seem right!!!
    Table4.Range.AutoFilter Field:=10

这次的挑战是可重复性和隐藏行。经过多轮运行后,我遇到了两个问题: 问题 1:一行或多行卡住并隐藏。因此,以一种非常不寻常的方式,即使我按住代码

Stop
和 F8,它也不允许我过滤回来,甚至不允许显示
"Logged"
- 我想保留的那个! 问题 2:有时它会完全删除数据,使表为空!我将数据粘贴到第 2 行及下方,以将顶部的 1 行保留为空白,这个问题实际上使我只剩下第 2 行中的标题,隐藏了第 3 行,并且 Excel 工作表的其余部分是空白的。

您能帮忙指出我缺少什么吗?

谢谢:)

excel vba autofilter
2个回答
0
投票

这应该有效:

Sub main()
    Dim r As Range
    Set r = ActiveSheet.ListObjects("Table4").Range
    Application.DisplayAlerts = False
    r.AutoFilter Field:=10, Operator:=xlFilterValues, Criteria1:=Array("Cancelled", "Done", "On Hold", "PreReg")
    If ActiveSheet.AutoFilter.Range.Columns(10).SpecialCells(xlCellTypeVisible).Count - 1 > 0 Then _
        r.Offset(1, 0).Resize(r.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows.Delete
    Application.DisplayAlerts = True
    ActiveSheet.ShowAllData
End Sub
  1. 您设置一个范围,这将是您的表的数据。
  2. 关闭 DisplayAlerts - 如果没有,您会收到“您确定要删除...吗?”弹出窗口。你确定。
  3. 根据您的原始帖子对范围应用过滤器
  4. 如果可见行数高于 0,则使用偏移量 - 向下 1 行(标题)、0 列到最后一个可见行和列来扩展范围。
  5. 通过在 Offset 设置的范围内调用 Rows.Delete 来删除行
  6. 重新打开显示警报
  7. 取下过滤器

0
投票
With ActiveSheet.ListObjects("Table4")
    .Range.AutoFilter Field:=10, Operator:=xlFilterValues, _
        Criteria1:=Array("Cancelled", "Done", "On Hold", "PreReg")
    Dim visRng As Range
    Set visRng = .DataBodyRange.SpecialCells(xlCellTypeVisible)
    If Not visRng Is Nothing Then
        .AutoFilter.ShowAllData
        visRng.Delete
    End If
End With
© www.soinside.com 2019 - 2024. All rights reserved.