如果列包含数据,VBA (Excel) 将一行数据从一张纸复制到另一张纸

问题描述 投票:0回答:1

第一次海报(我认为)。我发现一些代码几乎可以实现我想要的功能,但我对其进行了轻微的调整,并且在没有帮助的情况下无法克服一个小问题。

代码是如果 O 列中有数据,则将整行复制到另一个工作表。它工作得很好。然后它从活动工作表中删除该行 - 这工作正常。但它在 Next Cell 处倒塌了。当它发现数据需要删除时,它会删除它,然后“下一个单元格”命令将其移动到下一行,但它实际上会跳转一行。

因此,如果它在第 15 行中找到数据,它会复制它,删除第 15 行,但在下一个循环中,我需要代码再次查看第 15 行,因为它现在是该行中的新数据 - 但它会跳转到第 16 行因此,不检查现在位于第 15 行的数据。因此,如果有两行在一起需要执行操作,则第二行就会被错过。

因此,当删除一行时,我需要代码阻止移动到下一行,因为删除已经有效地将我移动到*下一个*行,但我不知道如何做到这一点。

我希望我已经解释清楚了!如果有人可以提供帮助,我们将不胜感激。

Sub Test()

Dim Cell As Range

With Sheets(1)
    ' loop column O until last cell with value (not entire column)
    For Each Cell In .Range("O2:O" & .Cells(.Rows.Count, "O").End(xlUp).Row)
        If Cell.Value <> "" Then
          .Rows(Cell.Row).Copy Worksheets("Customer Support").Range("A" & Rows.Count).End(3)(2)      
          Rows(Cell.Row).EntireRow.Delete
            
        End If
   
    Next Cell
        
End With


End Sub

请参阅上一个框(对不起,这个网站的新手)

excel vba iteration
1个回答
1
投票

一种方法是将要删除的行存储在变量中,但在循环完所有行之前不要实际删除它们。这样它们就不会四处移动,您也不会跳过任何一个。

Sub Test()

Dim Cell As Range
Dim rngDelete As Range

With Sheets(1)
    ' loop column O until last cell with value (not entire column)
    For Each Cell In .Range("O2:O" & .Cells(.Rows.Count, "O").End(xlUp).Row)
        If Cell.Value <> "" Then
          .Rows(Cell.Row).Copy Worksheets("Customer Support").Range("A" & Rows.Count).End(3)(2)
          
        'add row to be deleted
        If rngDelete Is Nothing Then Set rngDelete = Cell
        Set rngDelete = Union(rngDelete, Cell)
            
        End If
   
    Next Cell
    
    'Delete unwanted rows
    If Not rngDelete Is Nothing Then rngDelete.EntireRow.Delete
        
End With


End Sub

另一种方法是使用

For i = LastRow to 1 Step -1
计数器,它从最后一行开始向后计数。这样,当您删除一行时,您不必担心跳过它下面的行。

© www.soinside.com 2019 - 2024. All rights reserved.