Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA Can';当行的一部分是表时,不能删除整行_Excel_Vba_For Loop_Delete Row_Set Union - Fatal编程技术网

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行。我感谢你花时间帮助我,维蒂亚塔:)