ばくがの業務効率化チャンネル

このブログは個人的なエクセルの備忘録です

シート振り分け

Sub ProcessData()

    Dim myDic As Object, myKey ' 辞書オブジェクトとキーを宣言
    Dim c, myVal ' 変数cとmyValを宣言
    Dim i As Long ' カウンタ変数iを宣言
    Dim mySh As Worksheet ' ワークシートオブジェクトmyShを宣言
    Dim myFlg As Boolean ' フラグ変数myFlgを宣言
    Dim lastRow As Long, myRow As Long ' 最終行番号を格納する変数を宣言
    Dim myK As String ' 文字列変数myKを宣言

   'Scripting.Dictionaryオブジェクトを作成し、myDicに代入
    Set myDic = CreateObject("Scripting.Dictionary")
   
   '"Sheet5"ワークシートのA列の最終行番号をlastRowに格納
    lastRow = Worksheets("Sheet5").Range("A" & Rows.Count).End(xlUp).Row

    ' "Sheet5"ワークシートのA2セルから最終行までの値をmyValに格納
    myVal = Worksheets("Sheet5").Range("A2", "A" & lastRow).Value

    ' myVal内の各要素を処理するループ
    For Each c In myVal
        ' セルが空ではない場合
        If Not c = Empty Then
            ' 辞書オブジェクトにまだ追加されていない場合は追加
            If Not myDic.Exists(c) Then
                myDic.Add c, ""
            End If
        End If
    Next

    ' 辞書オブジェクトのキーをmyKeyに格納
    myKey = myDic.Keys

    ' myDicの要素数分ループ
    For i = 0 To myDic.Count - 1
        ' 各ワークシートを処理するループ
        For Each mySh In Worksheets
            myFlg = False ' フラグを初期化
            ' 現在処理中のワークシートの名前がmyKey(i)と一致する場合
            If mySh.Name = myKey(i) Then
                myFlg = True ' フラグをTrueに設定
                mySh.Cells.Delete ' ワークシートの内容を削除
                Exit For ' ループを抜ける
            End If
        Next mySh

        ' フラグがFalseの場合(該当ワークシートが見つからない場合)
        If myFlg = False Then
            ' 新しいワークシートを追加して、名前をmyKey(i)に設定
            ActiveWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = myKey(i)
        End If

        ' "Sheet5"ワークシートのA1:O1範囲を新しいワークシートにコピー
        Worksheets("Sheet5").Range("A1:O1").Copy Worksheets(myKey(i)).Range("A1")
    Next i

    ' 2行目から最終行までを処理するループ
    For i = 2 To lastRow
        
        ' "Sheet5"ワークシートのB列の値をmyKに格納
        myK = Worksheets("Sheet5").Range("A" & i).Value
        ' myKが空でない場合
        If myK <> "" Then
            ' myKのワークシートのA列の最終行番号をmyRowに格納
            
            myRow = Worksheets(myK).Range("A" & Rows.Count).End(xlUp).Row + 1
            ' "Sheet5"ワークシートのAからO列の値をmyKのワークシートの次の空行にコピー
            
            Worksheets("Sheet5").Range("A" & i & ":O" & i).Copy _
            Worksheets(myK).Range("A" & myRow & ":O" & myRow)
        
        End If
    
    Next i

    Set myDic = Nothing ' 辞書オブジェクトを解放

End Sub