记录移动到另一个Excel工作表上的错误行

时间:2018-01-10 16:41:52

标签: excel vba excel-vba

我有一个宏,当我在某个字段中单词“已完成”时,会将行从一个工作表移动到另一个工作表。 问题是它将行移到了错误的位置。我在另一张工作表上有212行,下一行应该在另一张纸上移动#213行,但它会一直移动到第#654行。 请帮助我解决问题,因此每一行都将移动到另一个工作表上的下一个可用行。

这是我的VBA代码:

Sub Autoupdating()
'Move shipments once completed
    Dim xRg As Range
    Dim xCell As Range
    Dim I As Long
    Dim J As Long
    Dim K As Long
    I = Worksheets("Scheduled Shipments").UsedRange.Rows.Count
    J = Worksheets("Completed Shipments").UsedRange.Rows.Count
    If J = 1 Then
       If Application.WorksheetFunction.CountA(Worksheets("Completed Shipments").UsedRange) = 0 Then J = 0
    End If
    Set xRg = Worksheets("Scheduled Shipments").Range("G1:G" & I)
    On Error Resume Next
    Application.ScreenUpdating = False
    For K = 1 To xRg.Count
        If CStr(xRg(K).Value) = "Completed" Then
            xRg(K).EntireRow.Copy Destination:=Worksheets("Completed Shipments").Range("A" & J + 1)
            xRg(K).EntireRow.Delete
            If CStr(xRg(K).Value) = "Completed" Then
                K = K - 1
            End If
            J = J + 1
        End If
    Next
    Application.ScreenUpdating = True
End Sub

2 个答案:

答案 0 :(得分:0)

当您从一个工作表移动到下一个工作表时,问题看起来不是重置J。因此,如果您的第一张纸具有652行,则它将最后一行放在第653行(J + 1 = 653)。但是,当您开始在第二张纸上移动行时,它将开始将它们放置在654(653 + 1 = 654)。

答案 1 :(得分:0)

尝试将以下部分添加到您的代码中,删除注释行,如下所示:

    'Your previous code ---^
    For K = 1 To xRg.Count
        If CStr(xRg(K).Value) = "Completed" Then
            xRg(K).EntireRow.Copy Destination:=Worksheets("Completed Shipments").Range("A" & J + 1)
            'xRg(K).EntireRow.Delete 
            'If CStr(xRg(K).Value) = "Completed" Then
            '    K = K - 1
            'End If
            J = J + 1
        End If
    Next
    'this is the new code ---v
    For K = xRg.Count To 1 Step -1
        If CStr(xRg(K).Value) = "Completed" Then
            xRg(K).EntireRow.Delete
        End If
    Next K
    'end of the new code ---^
    Application.ScreenUpdating = True

End Sub

每当您感觉您所编写的代码没有按照预期执行的操作时,最好简化一下。

在这种情况下,您可以将任务拆分为两个子任务:

  • 使用"已完成"复制行。到特定的工作表
  • 使用"已完成"
  • 删除行

请注意,为了从工作表中正确删除行,最好从底部循环而不是从顶部循环,因此循环反转。