Excel VBA Can';当行的一部分是表时,不能删除整行
我正在尝试循环浏览我的数据和Excel VBA Can';当行的一部分是表时,不能删除整行,excel,vba,for-loop,delete-row,set-union,Excel,Vba,For Loop,Delete Row,Set Union,我正在尝试循环浏览我的数据和联合我以后需要删除的某些行号。下面的代码存储了正确的行,但我无法删除它们。我相信这是因为我的数据被安排在一个表中,因为如果数据不在表中,我可以删除所需的行。我在Urng.delete一行上收到错误消息“运行时错误1004-范围类的删除方法失败” Sub DeleteRows() Dim ws4 As Worksheet: Set ws4 = Worksheets("Sheet1") Dim LastRow As Long Dim CurrentRow As Lon
联合
我以后需要删除的某些行号。下面的代码存储了正确的行,但我无法删除它们。我相信这是因为我的数据被安排在一个表中,因为如果数据不在表中,我可以删除所需的行。我在Urng.delete一行上收到错误消息“运行时错误1004-范围类的删除方法失败”
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
,但运气不佳
表外没有数据,因此仅删除表行可能是一个解决方案,但是,如果我不能在Union(Urng,rows(CurrentRow))
中使用行号,我不知道如何构建循环,使联合
中的行号
是否有VBA解决方案可以删除多个整行,其中一部分行是表?这是如何从名为TableName
的表中删除第5行:
Sub TestMe()
Range("TableName[#All]").ListObject.ListRows(5).Delete
End Sub
关于您的具体问题,情况是在Urng
中有行,这些行位于表内和表外。因此,不能使用.Delete
删除它们。在Urng之前写下此内容。删除查看您自己:
Urng.Select
Stop
Unrg.Delete
在示例中,您可以看到行6
在表中,行18
在表外:
关于删除表中彼此不接近的两行,我想唯一的方法是循环。它确实有点慢,但它可以工作:
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
可以这样一次删除多行吗?@DirtyDeffy-可以,但它们应该都在表内或表外。混合使用表内和表外的行是很困难的,您必须循环。我明白了-我有一行在表外的原因是因为行Set Urng=rows(LastRow+1)
。我之所以有这行代码,是因为我必须在使用Union
之前设置Urng
,才能使代码正常工作。我需要删除的所有行都在同一个表中。那么像这样的东西能起作用吗Range(“TableName[#All]”).ListObject.ListRows(5,8,9,11).删除
@DirtyDeffy-我想你应该循环5,8,9,11。当然,使用步骤-1
。看我更新的答案。我明白了-但是一次性删除行的整个想法是避免通过循环删除行。时间太长了。然而,使用临时辅助列实际上非常快。我可以使用.RemoveDuplicates
在一秒钟内删除1500行。我感谢你花时间帮助我,维蒂亚塔:)