使用反向循环删除行 - VB

Jen*_*rpe 1 excel vba

我有一个数据集,其中包含大量有关客户的信息。我希望在Yes输入到 row 中的单元格时将此信息移动到另一个工作表中K,并且包含要从第一个工作表中删除的信息的原始行

我通过按下按钮来完成此操作。工作正常,并且行被删除,但是当然,当它删除该行时,行号会向上移动一位,因此会跳过下一行(第 15 行被删除,然后第 16 行变为第 15 行等),所以我认为反向循环是可行的方法,但我一生都无法弄清楚这一点 - 我认为这很简单!这是我正在使用的代码:

Private Sub UpdateSheet2_Click()

Dim c As Range
Dim Source As Worksheet
Dim Target As Worksheet

    'Change worksheet designation as needed
    Set Source = ActiveWorkbook.Worksheets("Sheet1")
    Set Target = ActiveWorkbook.Worksheets("Sheet2")

    For Each c In Source.Range("K:K") 'Covers all rows          
        If c = "yes" Then
            Source.Range("A" & c.Row & ":B" & c.Row).Copy Target.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
            Source.Range("D" & c.Row & ":F" & c.Row).Copy Target.Range("C" & Rows.Count).End(xlUp).Offset(1, 0)
            Source.Range("H" & c.Row & ":J" & c.Row).Copy Target.Range("F" & Rows.Count).End(xlUp).Offset(1, 0)    
        End If

'        If c = "yes" Then
'            Source.Rows(c.Row).EntireRow.Delete
'        End If
    Next c

    For i = 500 To 1 Step -1
        If Source.Range("K" & i) = "yes" Then
            Source.Rows(i.Row).EntireRow.Delete
        End If  
    Next i 

End Sub
Run Code Online (Sandbox Code Playgroud)

我现在只是将行号设置在 1 到 500 之间,当基本功能正常工作时我会更改它。你可以看到我在For Each循环中注释掉了原来的删除方法。我目前收到错误“需要对象” Source.Rows(i.Row).EntireRow.Delete

小智 5

一次删除所有行通常会更有效。

Set c = Nothing 'reset your range
For i = 1 To 500 'or 500 To 1 Step -1 - doesn't make a difference
    If Source.Range("K" & i) = "yes" Then
        If c Is Nothing Then
            Set c = .Cells(i, 1).EntireRow 'if the range is empty then set it to the required row
        Else
            Set c = Union(c, .Cells(i, 1)).EntireRow 'otherwise add this row
        End If
    End If
Next
If Not c Is Nothing Then c.Delete xlUp 'if the range is not empty then delete all the rows
Run Code Online (Sandbox Code Playgroud)

(我应该补充一点,我的使用Cells(x,y).EntireRow纯粹是个人喜好。我总是使用该格式,因为我发现它更容易调试。)