1 つのワークブック内の 2 つのワークシート間で行を移動する

1 つのワークブック内の 2 つのワークシート間で行を移動する

1 つのワークブック (単一の Excel ファイル) に 2 つのワークシート (worksheet1 と worksheet2 という名前を付けます) があります。worksheet1 には、説明と列 (2 つの選択肢: 完了と進行中) の 2 つの列が含まれています。

説明そして状態完了/進行中

要件: ステータス = 進行中 (ドロップダウン リストから) を選択した場合、この行全体を 2 番目のワークシート、つまり worksheet2 に移動する必要があります。これにより、ワークシートにはステータス = 完了の行だけが残ります。つまり、worksheet1 にはステータス = 完了の行だけが含まれ、2 番目のワークシート、つまり worksheet2 にはステータス = 進行中の行だけが含まれます。

ステータスから任意のオプションを選択すると、そのオプションはそれぞれのワークシートに移動されます。

ティア

答え1

データを分割する理由がよくわかりませんが、Worksheet_Change()VBA のイベントを使用して目的を達成できます。

これは完成したワークシートコード:

Private Sub Worksheet_Change(ByVal Target As Range)
    'This goes into your "Completed" worksheet's module

    Dim RngB As Range
    Set RngB = Intersect(Target, Range("B:B"))

    If RngB Is Nothing Then Exit Sub
    Application.EnableEvents = False

    Dim cel As Range, wsInProgress As Worksheet, retVal As Variant

    '!!! Change the worksheet name to whatever it is that moves from your completed
    'worksheet to the in-progress worksheet...
    Dim wsInProgress As Worksheet
    Set wsInProgress = ThisWorkbook.Worksheets("In-Progress")

    For Each cel In RngB.Cells
        Debug.Print cel.Address
        If cel.Value = "In-Progress" Then
            wsInProgress.Rows(nextrow(wsInProgress)) = cel.EntireRow.Value
            cel.EntireRow.Delete
        End If
    Next
    Application.EnableEvents = True
End Sub

これは進行中のワークシートコード:

Private Sub Worksheet_Change(ByVal Target As Range)
    'This goes into your "In-Progress" worksheet's module

    Dim RngB As Range
    Set RngB = Intersect(Target, Range("B:B"))

    If RngB Is Nothing Then Exit Sub
    Application.EnableEvents = False

    Dim cel As Range, wsInProgress As Worksheet, retVal As Variant

    '!!! Change the worksheet name to whatever it is that moves from your completed
    'worksheet to the in-progress worksheet...
    Dim wsCompleted As Worksheet
    Set wsCompleted = ThisWorkbook.Worksheets("Completed")

    For Each cel In RngB.Cells
        Debug.Print cel.Address
        If cel.Value = "Completed" Then
            wsInProgress.Rows(nextrow(wsCompleted)) = cel.EntireRow.Value
            cel.EntireRow.Delete
        End If
    Next
    Application.EnableEvents = True
End Sub

これは標準モジュール:

Public Function nextRow(ByVal ws As Worksheet, Optional ByVal col As Variant = 1) As Long
    nextRow = ws.Cells(ws.Rows.Count, col).End(xlUp).Row + 1
End Function

関連情報