📑

生データから名簿を作成するVBAマクロ

2024/06/13に公開

はじめに

生データから区切り文字「(」で区切って配列を作り、文字列の置換関数を使って、乃木坂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