我正在编写一个宏,目的是导入数据并生成清理后的表。
导入后,我形成一个表格并尝试过滤并删除不相关的行。并自然地过滤回我想要的唯一一项 -
"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 工作表的其余部分是空白的。
您能帮忙指出我缺少什么吗?
谢谢:)
这应该有效:
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
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