在Excel中,如何有条件地剪切一行数据并将其永久移动到另一个工作表?

In Excel, how can I conditionally cut a row of data and move it to another worksheet permanantly?

我有一个工作表,其中列出了我所有的项目。当我从 D 列的下拉列表中将一行(项目)标记为 "Finaled" 时,我希望将整行移动到我的 "Finaled" 工作表并永久保留在该工作表上。

我有基本的编程知识,想出了这个宏...

    Sub Finaled()
    Dim i, LastRow

    Sheets("FINALED").Range("A2:Z500").ClearContents
    For i = 19 To LastRow
    If Sheets("ACTIVE").Cells(i, "D").Value = "Finaled" Then
    Sheets("ACTIVE").Cells(i, "D").EntireRow.Copy Destination:=Sheets("FINALED").Range("A" & Rows.Count).End(xlUp).Offset(1)
    End If
    Next i
    End Sub

...但这并不完全像我想要的那样工作。第一个问题是它只复制信息行,当我从主工作表中手动删除该行时,下次我 运行 宏时,我丢失了最终工作表上最初复制的数据行。我希望它完全剪切数据行并将其移动到我的 "Finaled" 工作表,并永久保留在那里。

其次,一旦我从 D 列的下拉列表中将该行标记为 "finaled",此移动是否会自动发生?还是我每次都必须手动 运行 宏?

在 VBA 编辑器中,双击您名为 ACTIVE 的作品sheet,这将调出该作品sheet 的代码模块(并不是说它是不同于标准模块):

然后在 sheet 模块中,粘贴以下代码:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim wsData As Worksheet
    Dim wsDest As Worksheet
    Dim rngCheck As Range
    Dim rngChanged As Range
    Dim ChangedCell As Range
    Dim rngMove As Range

    Set wsData = Me
    Set wsDest = Me.Parent.Sheets("FINALED")
    Set rngCheck = wsData.Range("D19", wsData.Cells(wsData.Rows.Count, "D").End(xlUp))
    If rngCheck.Row < 19 Then Exit Sub  'No data

    Application.EnableEvents = False
    On Error GoTo ReEnableEvents

    Set rngChanged = Intersect(rngCheck, Target)

    If Not rngChanged Is Nothing Then
        For Each ChangedCell In rngChanged.Cells
            If LCase(Trim(ChangedCell.Value)) = "finaled" Then
                Select Case (rngMove Is Nothing)
                    Case True:  Set rngMove = ChangedCell
                    Case Else:  Set rngMove = Union(rngMove, ChangedCell)
                End Select
            End If
        Next ChangedCell

        If Not rngMove Is Nothing Then
            With rngMove.EntireRow
                .Copy
                wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial xlPasteValues
                .Delete xlShiftUp
            End With
        End If
    End If

ReEnableEvents:
    Application.EnableEvents = True
End Sub

现在,当您将 D 列中的单元格更改为 "finaled" 时,它将自动移至 FINALED 工作sheet。

此外,您丢失 FINALED 作品 sheet 数据的原因是因为这一行:Sheets("FINALED").Range("A2:Z500").ClearContents 我没有包括在内,因为我不认为你真的想要那个。