I can’t use rng.EntireRow.Delete
when the range is non-contiguous, and the range is built by Union.
- I know that I can delete multiple rows based on criteria by using sort and autofilter. I want to learn something new. I am not interested in backwards deleting or using loops, it’s too time consuming.
- The code fails when the range “usun” is non-contiguous.
- While debugging: range “usun.Address” seems to be building correctly e.g. “$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
I am trying to delete some rows e.g. second, third and sixth or others at once using EntireRow.Delete on “Unioned” range.
You are trying to delete table rows like this:
Excel won’t let you delete non-contiguous entire sheet rows when a table /listobject is involved – either programmatically or through the UI (well, at least from the context menu – works from the Home Ribbon tab for some reason).
What you want to do is this:
You can’t delete sheet rows, but now Excel understands what we’re trying to achieve. The trick is to get this selection programmatically.
Iterate the ListObject
‘s ListRows
instead, and Union
the ListRow.Range
; the unioned resulting range’s Delete
method will then work (don’t use .EntireRow
).
This worked for my dummy table, from the immediate pane:
union(sheet1.ListObjects(1).ListRows(2).Range,sheet1.ListObjects(1).ListRows(4).Range).Delete
So with your code, I’d iterate tbl.ListRows
and Union
the ListRow.Range
items – not tested, but this should work:
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
Tags: excelexcel