仕事でどうしても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