当范围不连续且范围由 Union 构建时,我无法使用 rng.EntireRow.Delete
。
- 我知道我可以使用排序和自动过滤器根据条件删除多行。我想学习新东西。我对向后删除或使用循环不感兴趣,这太耗时了。
- 当范围“usun”不连续时,代码会失败。
- 调试时:范围“usun.Address”似乎构建正确,例如“$E$10:$E15,$E$20,$E$30:$E$32”
Sub delSomeRows()
Set tbl = ThisWorkbook.Sheets("test").ListObjects(1)
' formulas into values
tbl.DataBodyRange.Value = tbl.DataBodyRange.Value
' Get the column reference to analysis
Dim komorka ' cell to be analysed
Dim usun As Range ' multiple ranges to delete
Dim filter As Range ' column in the table
Set filter = tbl.ListColumns("Filtr").DataBodyRange
' Get Union range to delete
For Each komorka In filter
If Len(komorka.Value) <> 0 Then
If usun Is Nothing Then
Set usun = komorka
Else
Set usun = Application.Union(usun, komorka)
End If
End If
Next komorka
' delete all rows at once
usun.EntireRow.Delete ' ERROR 1004 HERE
End Sub
我正在尝试删除一些行,例如使用 EntireRow.Delete 在“Unioned”范围上同时使用第二个、第三个和第六个或其他。
最佳答案
您正尝试像这样删除表行:
当涉及表/列表对象时,Excel 不会让您删除不连续的整个工作表行 - 无论是通过编程方式还是通过 UI(好吧,至少从上下文菜单中 - 由于某种原因可在“主页”功能区选项卡中使用) .
你想做的是这样的:
您无法删除工作表行,但现在 Excel 可以理解我们想要实现的目标。诀窍是以编程方式获得此选择。
改为迭代ListObject
的ListRows
,并Union
ListRow.Range
;然后,联合结果范围的 Delete
方法将起作用(不要使用 .EntireRow
)。
这适用于我的虚拟表,从直接 Pane :
union(sheet1.ListObjects(1).ListRows(2).Range,sheet1.ListObjects(1).ListRows(4).Range).Delete
因此,使用您的代码,我将迭代 tbl.ListRows
和 Union
ListRow.Range
项 - 未经测试,但这应该工作:
Dim filterColumn As Long
filterColumn = tbl.ListColumns("Filtr").Index
Dim currentRow As ListRow
For Each currentRow In tbl.ListRows
If Len(currentRow.Range.Cells(ColumnIndex:=filterColumn).Value) <> 0 Then
If usun Is Nothing Then
Set usun = currentRow.Range
Else
Set usun = Application.Union(usun, currentRow.Range)
End If
End If
Next
If Not usun Is Nothing Then usun.Delete
关于excel - 删除 "unioned"非连续范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57529933/