📑
生データから名簿を作成するVBAマクロ
はじめに
生データから区切り文字「(」で区切って配列を作り、文字列の置換関数を使って、乃木坂46のメンバーを名前と期別でエクセルデータにするVBAマクロを開発しました。
開発の経緯
文字列を区切り文字で区切って配列にして、データを「名前」と「期別」の2つの列に分け、エクセルシートに格納するという処理を使って名簿を作るという実用的な処理が必要になったためです。
ソースコード
ソースコードは以下の通りです。
Option Explicit
'名簿作成マクロ
'新規作成 2024/6/13
Sub make_meibo()
'正規表現用インスタンスを呼び出す
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
'ワークブックオブジェクトの作成
Dim wb As Workbook
Set wb = Workbooks(ThisWorkbook.Name)
'ワークシートオブジェクトの作成(入力側)
Dim ws1 As Worksheet
Set ws1 = wb.Worksheets("データ")
'ワークシートオブジェクトの作成(出力側)
Dim ws2 As Worksheet
Set ws2 = wb.Worksheets("名簿")
'生データ変数
Dim test1 As Variant
'配列
Dim test_array As Variant
'開始行
Dim start_num As Integer
start_num = 3
'最終行を取得
Dim end_num As Integer
end_num = ws1.Cells(Rows.Count, 2).End(xlUp).row
Dim i As Integer
'データを1行ずつ読み込み、名前と期を配列に格納して、列を分けて名簿シートに出力する。
For i = start_num To end_num
Dim start_count As Integer
Dim end_count As Integer
test1 = ws1.Cells(i, 2).Value
test_array = Split(test1, "(")
'配列の要素の最初の番号
start_count = LBound(test_array)
'配列の要素の最後の番号
end_count = UBound(test_array)
'要素数変数
Dim array_count As Integer
'要素数関数を呼び出す。
array_count = elem_count(end_count, start_count)
Dim j As Integer
'出力変数
Dim str2 As Variant
For j = start_count To end_count
'文字列の検索
re.Pattern = "\)"
re.IgnoreCase = False
re.Global = True
str2 = test_array(j)
Dim k As Integer
If re.Test(str2) = True Then
'文字列を置換する。)を取り除く
str2 = Replace(str2, ")", "")
k = 3
Else
k = 2
End If
Call output_data(i, k, str2)
Next j
Next i
End Sub
'配列の要素数を計算する関数
Function elem_count(ByVal max_elem As Integer, min_elem As Integer)
Dim elem_sum As Integer
elem_sum = max_elem - min_elem + 1
elem_count = elem_sum
End Function
'名簿シートに出力する内部で使用するマクロ
Private Sub output_data(ByVal row As Integer, column As Integer, data As Variant)
Dim wb As Workbook
Set wb = Workbooks(ThisWorkbook.Name)
Dim ws As Worksheet
Set ws = Worksheets("名簿")
ws.Cells(row, column).Value = data
End Sub
実行前
実行前の名簿シートです。
実行後
実行後の名簿シートです
最後に
文字列の分割を使うと処理が綺麗になりますね。
Discussion