我有一个宏,当我在某个字段中单词“已完成”时,会将行从一个工作表移动到另一个工作表。 问题是它将行移到了错误的位置。我在另一张工作表上有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
答案 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
每当您感觉您所编写的代码没有按照预期执行的操作时,最好简化一下。
在这种情况下,您可以将任务拆分为两个子任务:
请注意,为了从工作表中正确删除行,最好从底部循环而不是从顶部循环,因此循环反转。