VBAを勉強しました。~データを条件に従って分割~

仕事でどうしてもVBAから逃げられなくなってきたので、勉強した。
以下のようなマクロを作りました。

こういうデータがあったとき、

市町村名 子ども 登録日 項番
千代田区 100 200 10 2023/7/1 001
横浜市 100 200 10 2023/7/1 001
さいたま市 100 200 10 2023/7/1 001

こういうマスタを参照して、

県名 市町村名
東京都 千代田区
神奈川県 横浜市
埼玉県 さいたま市

それぞれ「千代田区」のデータなら「東京都のシートに、 「横浜市」のデータなら「神奈川県」のシートに、 「さいたま市」のデータなら「埼玉県」のシートに分割て出力します。

これまでマクロってちゃんと勉強せずにググりながら雰囲気で書いてたけど、やっぱりちゃんと勉強するほうが早いね。

できたマクロはこちら。

Sub データ分割()
    Application.ScreenUpdating = False
    
    'まずは生成したいシートが存在するかを確認しておく。存在する場合は確認
    Dim rc As Long
    If シート存在確認("東京都") Then
       rc = MsgBox("シート「東京都」は存在します。内容をすべて削除して更新してよろしいですか?", vbYesNo + vbQuestion)
       If rc = 7 Then
            MsgBox "処理を中止します"
            End
        End If
    End If
    
    If シート存在確認("埼玉県") Then
        rc = MsgBox("シート「埼玉県」は存在します。内容をすべて削除して更新してよろしいですか?", vbYesNo + vbQuestion)
        If rc = 7 Then
            MsgBox "処理を中止します"
            End
        End If
    End If
    
    If シート存在確認("神奈川県") Then
       rc = MsgBox("シート「神奈川県」は存在します。内容をすべて削除して更新してよろしいですか?", vbYesNo + vbQuestion)
       If rc = 7 Then
            MsgBox "処理を中止します"
            End
        End If
    End If
   
    'ここから処理開始
    Dim rownum As String
    rownum = Worksheets("データ").Range("A1").Row
    
    'データの最終行を取得しておく
    Dim dataLastRow As Integer
    dataLastRow = Worksheets("データ").Cells(Rows.Count, 1).End(xlUp).Row

    'マスタの最終行も取得
    Dim mstLastRow As Integer
    mstLastRow = Worksheets("マスタ").Cells(Rows.Count, 1).End(xlUp).Row
    
    '配列を定義
    ReDim tokyoArray(dataLastRow, 5) As String
    ReDim saitamaArray(dataLastRow, 5) As String
    ReDim kanagawaArray(dataLastRow, 5) As String
       
    '街名
    Dim targetTownName As String
    '県名
    Dim prefectureName As String
       
    'それぞれの配列の現在位置を定義
    Dim tokyoCellNum As Integer
    Dim saitamaCellNum As Integer
    Dim kanagawaCellNum As Integer
    '現在位置を初期化
    tokyoCellNum = 0
    saitamaCellNum = 0
    kanagawaCellNum = 0
    
'「データ」シートから1行ずつ処理していく。
    Dim i As Integer
    For i = 0 To dataLastRow - 2
        rownum = rownum + 1
        '街名を取得
        targetTownName = Worksheets("データ").Range("A" & rownum).Value
        '街名を使用して、マスタから県名を探して取得
        prefectureName = WorksheetFunction.Index(Worksheets("マスタ").Range("B2:B" & mstLastRow), _
                                            WorksheetFunction.Match(targetTownName, Worksheets("マスタ").Range("A2:A" & mstLastRow), 0))
        
        'データを県名ごとの配列に格納
        If prefectureName = "東京都" Then
            Dim j As Integer
            For j = 0 To 5
                tokyoArray(tokyoCellNum, j) = Worksheets("データ").Cells(rownum, j + 1).Value
            Next
            tokyoCellNum = tokyoCellNum + 1
        ElseIf prefectureName = "埼玉県" Then
            Dim k As Integer
            For k = 0 To 5
                saitamaArray(saitamaCellNum, k) = Worksheets("データ").Cells(rownum, k + 1).Value
            Next
            saitamaCellNum = saitamaCellNum + 1
        ElseIf prefectureName = "神奈川県" Then
            Dim l As Integer
            For l = 0 To 5
                kanagawaArray(kanagawaCellNum, l) = Worksheets("データ").Cells(rownum, l + 1).Value
            Next
            kanagawaCellNum = kanagawaCellNum + 1
        End If
    Next
  
    '結果出力
    '東京都
    If Not シート存在確認("東京都") Then
        Worksheets("データ").Copy After:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = "東京都"
    End If
    ActiveSheet.Range("A2 : E" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
    
    Worksheets("東京都").Range("A2:E" & dataLastRow).Value = tokyoArray
    
    '埼玉県
    If Not シート存在確認("埼玉県") Then
        Worksheets("データ").Copy After:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = "埼玉県"
    End If
    ActiveSheet.Range("B2 : D" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
    
    Worksheets("埼玉県").Range("A2:E" & dataLastRow).Value = saitamaArray
    
    '神奈川県
    If Not シート存在確認("神奈川県") Then
        Worksheets("データ").Copy After:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = "神奈川県"
    End If
    ActiveSheet.Range("A2 : E" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
    
    Worksheets("神奈川県").Range("A2:E" & dataLastRow).Value = kanagawaArray
    
    '最後にデータ側の整形をする。集計に使う列は、表示形式を標準、データ型を数値にしておく
    Dim objSheet As Worksheet
    ' ブックの全シートを 1 つずつループして処理する
    For Each objSheet In ThisWorkbook.Worksheets
        If objSheet.Name <> "データ" And objSheet.Name <> "マスタ" _
                And objSheet.Name <> "操作パネル" Then
            '表示形式の変更
            objSheet.Columns(2).NumberFormatLocal = "G/標準"
            'データ型の変更
            objSheet.Columns(2).TextToColumns Comma:=True
            objSheet.Columns(3).NumberFormatLocal = "G/標準"
            objSheet.Columns(3).TextToColumns Comma:=True
            objSheet.Columns(4).NumberFormatLocal = "G/標準"
            objSheet.Columns(4).TextToColumns Comma:=True
        End If
    Next
    
    MsgBox "データ分割が完了しました"

End Sub

'シート存在確認の関数
Function シート存在確認(sheetName As String)

Dim ws As Worksheet
 
On Error Resume Next
Set ws = ThisWorkbook.Worksheets(sheetName)
On Error GoTo 0
 
シート存在確認 = Not ws Is Nothing
 
End Function