VBA:不需要的覆盖行

时间:2016-01-07 11:51:23

标签: excel vba excel-vba

已经有好几天了,我正在网上搜索我的应用程序的正确代码/帮助。 情况:如果某个客户的某个产品完成,第9列给出“就绪”。当发生这种情况时,整行必须以“历史”列表的形式移动到表2,并从“最新”列表中消失。

我的代码是下一个:

Sub MoveDelete()

Dim i As Integer
Dim y As Integer
Application.ScreenUpdating = False

i = ActiveSheet.UsedRange.Rows.Count
For y = i To 1 Step -1
    If Cells(y, 9).Value = "Mag weg" Then
        Cells(y, 9).EntireRow.Cut Worksheets(2).Cells(i, 1)
        Cells(y, 1).EntireRow.Delete
        i = i + 1
    End If
Next

End Sub

此代码正在运行,但会产生其他问题。假设今天我的范围是40和3行应该移动到第二个工作表,它们被放置在第40,39和38行(而不是1,2,3,这将更好)。但是,例如,明天我在最新列表中添加了5行,并且可以再次删除4行旧行,它将覆盖以前的行(但我希望它们在4,5,6和7上)。

我的目标是拥有一个可以每天更新的列表,以便生产线清晰地查看工作负载,并在第二页上列出包含上个月完成的所有产品/客户信息的列表。

我希望有人可以帮助我。如果有更多问题,请随时提出!非常感谢!

1 个答案:

答案 0 :(得分:2)

您可以将新移动的行追加到sheet2中已存在的行的末尾。

Sub MoveDelete()
    Dim i As Integer, y As Integer, j as Integer
    Application.ScreenUpdating = False

    'Find first free row in sheet2
    j = Worksheets(2).cells(Rows.Count, 9).End(xlUp).Row + 1
    i = ActiveSheet.cells(Rows.Count, 9).End(xlUp).Row

    For y = i To 1 Step -1
        If Cells(y, 9).Value = "Mag weg" Then
            Rows(y).Copy Worksheets(2).Rows(j)
            Rows(y).EntireRow.Delete
            j = j + 1
        End If
    Next
    Application.ScreenUpdating = True
End Sub