Excel VBA 当行的一部分是 table 时无法删除整行
Excel VBA Can't delete entire row when part of row is a table
我正在尝试遍历我的数据和 Union
稍后我需要删除的某些行号。下面的代码存储了正确的行,但我无法删除它们。我相信这是因为我的数据排列在 table 中,因为如果数据不在 table 中,我可以删除所需的行。我在 Urng.delete
.
行收到错误消息 'run time error 1004 - delete method of range class failed'
Sub DeleteRows()
Dim ws4 As Worksheet: Set ws4 = Worksheets("Sheet1")
Dim LastRow As Long
Dim CurrentRow As Long
Dim GroupValue
Dim GroupTotal As Long
Dim x As Long
Dim Urng As Range
Application.ScreenUpdating = False
ws4.Activate
GroupValue = ws4.Range("B6").Value
CurrentRow = 6 LastRow = ws4.Cells(Rows.Count, "B").End(xlUp).Row
Set Urng = Rows(LastRow + 1)
For x = 1 To LastRow
GroupTotal = Application.WorksheetFunction.CountIf(Range("B6:B" & LastRow), GroupValue)
If GroupTotal = 1 Then
Set Urng = Union(Urng, Rows(CurrentRow))
End If
CurrentRow = CurrentRow + GroupTotal
GroupValue = Range("B" & CurrentRow).Value
If GroupValue = "" Then '
Exit For
End If
Next x
Urng.Delete
Application.ScreenUpdating = True
End Sub
我尝试过使用 .EntireRow.Delete
,但没有成功。
table 之外没有数据,因此仅删除 table 行可能是一种解决方案,但是,我不知道如何构建 Unions
行号,如果我不能使用 Union(Urng, Rows(CurrentRow))
中的行号。
是否有 VBA 解决方案来删除多个整行,其中部分行是 table?
这是从名为 TableName
:
的 table 中删除第 5 行的方法
Sub TestMe()
Range("TableName[#All]").ListObject.ListRows(5).Delete
End Sub
关于您的具体问题,情况是在 Urng
中您有行,这些行在 table 之内和之外。因此,它们不能用 .Delete
删除。写在Urng.Delete
之前看看自己:
Urng.Select
Stop
Unrg.Delete
在示例中,您可能会看到 6
行在 table 中,而 18
行在 table 之外:
关于删除在table中彼此不相邻的两行,我想唯一的办法就是循环。它确实有点慢,但它有效:
Sub TestMe()
Dim cnt As Long
Dim arrRows As Variant: arrRows = Array(10, 12)
Dim table As ListObject: Set table = ActiveSheet.ListObjects("SomeTable")
For cnt = UBound(arrRows) To LBound(arrRows) Step -1
table.ListRows(arrRows(cnt)).Delete
Next cnt
'This works only when the rows are after each other, e.g. 2,3,4
table.Range.Rows("2:4").Select
Stop
table.Range.Rows("2:4").Delete
End Sub
我正在尝试遍历我的数据和 Union
稍后我需要删除的某些行号。下面的代码存储了正确的行,但我无法删除它们。我相信这是因为我的数据排列在 table 中,因为如果数据不在 table 中,我可以删除所需的行。我在 Urng.delete
.
'run time error 1004 - delete method of range class failed'
Sub DeleteRows()
Dim ws4 As Worksheet: Set ws4 = Worksheets("Sheet1")
Dim LastRow As Long
Dim CurrentRow As Long
Dim GroupValue
Dim GroupTotal As Long
Dim x As Long
Dim Urng As Range
Application.ScreenUpdating = False
ws4.Activate
GroupValue = ws4.Range("B6").Value
CurrentRow = 6 LastRow = ws4.Cells(Rows.Count, "B").End(xlUp).Row
Set Urng = Rows(LastRow + 1)
For x = 1 To LastRow
GroupTotal = Application.WorksheetFunction.CountIf(Range("B6:B" & LastRow), GroupValue)
If GroupTotal = 1 Then
Set Urng = Union(Urng, Rows(CurrentRow))
End If
CurrentRow = CurrentRow + GroupTotal
GroupValue = Range("B" & CurrentRow).Value
If GroupValue = "" Then '
Exit For
End If
Next x
Urng.Delete
Application.ScreenUpdating = True
End Sub
我尝试过使用 .EntireRow.Delete
,但没有成功。
table 之外没有数据,因此仅删除 table 行可能是一种解决方案,但是,我不知道如何构建 Unions
行号,如果我不能使用 Union(Urng, Rows(CurrentRow))
中的行号。
是否有 VBA 解决方案来删除多个整行,其中部分行是 table?
这是从名为 TableName
:
Sub TestMe()
Range("TableName[#All]").ListObject.ListRows(5).Delete
End Sub
关于您的具体问题,情况是在 Urng
中您有行,这些行在 table 之内和之外。因此,它们不能用 .Delete
删除。写在Urng.Delete
之前看看自己:
Urng.Select
Stop
Unrg.Delete
在示例中,您可能会看到 6
行在 table 中,而 18
行在 table 之外:
关于删除在table中彼此不相邻的两行,我想唯一的办法就是循环。它确实有点慢,但它有效:
Sub TestMe()
Dim cnt As Long
Dim arrRows As Variant: arrRows = Array(10, 12)
Dim table As ListObject: Set table = ActiveSheet.ListObjects("SomeTable")
For cnt = UBound(arrRows) To LBound(arrRows) Step -1
table.ListRows(arrRows(cnt)).Delete
Next cnt
'This works only when the rows are after each other, e.g. 2,3,4
table.Range.Rows("2:4").Select
Stop
table.Range.Rows("2:4").Delete
End Sub