【VBAリファレンス】エクセル練習問題カンマ区切りデータの行展開

スポンサーリンク

エクセル練習問題:カンマ区切りデータの行展開をVBAで完全自動化する手法

業務でCSVデータや、セル内にカンマで区切られた複数の値が含まれるデータ(例:「A,B,C」)を扱うことは非常に多いです。これを「1つのセルに1つの値」という形にバラし、行単位で展開したいというニーズは、データ分析やシステム連携の前処理として避けては通れない課題です。

手動で行うには限界があるこの作業を、Excel VBAを用いて高速かつ正確に処理するための技術的アプローチを解説します。

なぜカンマ区切りデータの行展開が必要なのか

データベースの正規化の観点から見ると、1つのセルに複数の値が入っている状態は「非正規形」であり、集計や検索が困難です。例えば、「商品A,商品B,商品C」と入っている行を、3つの行に分割することで、「商品A」の売上数や、「商品B」の注文頻度といった個別のデータ分析が可能になります。

また、Power Queryなどのツールでも対応可能ですが、VBAを用いることで、複雑な条件分岐(特定の文字を含む場合のみ展開するなど)や、大規模なデータセットに対する柔軟なカスタマイズが可能になります。エンジニアとして、この「データの正規化」を自動化するスキルは、業務効率化の大きな武器となります。

詳細解説:ロジックの組み立て方

行展開のロジックは、基本的に以下のステップで構成されます。

1. 元データの最終行を取得する。
2. 下から上に向かってループ処理を行う(行を挿入するとインデックスがずれるため、下から処理するのが鉄則です)。
3. 指定した列の文字列をSplit関数で配列に格納する。
4. 配列の要素数に基づいて、必要な行数を挿入する。
5. 分割した値をセルに書き戻す。

この際、Split関数の活用が鍵となります。Split関数は、指定した区切り文字で文字列を分割し、0ベースの配列を返します。この配列の個数(UBound関数で取得)を判定し、行をコピー・挿入する処理を繰り返します。

サンプルコード:汎用的な行展開プロシージャ

以下に、指定列のカンマ区切りデータを展開し、他の列の内容を維持したまま行を増やす実務的なコードを提示します。


Sub ExpandCommaSeparatedData()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long, j As Long
    Dim targetCol As Integer
    Dim splitData() As String
    Dim dataRange As Range
    
    ' 対象シートの設定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    targetCol = 1 ' A列を対象とする
    
    ' 画面更新を停止して高速化
    Application.ScreenUpdating = False
    
    ' 最終行から上に向かってループ処理
    lastRow = ws.Cells(ws.Rows.Count, targetCol).End(xlUp).Row
    
    For i = lastRow To 2 Step -1
        ' カンマで分割
        splitData = Split(ws.Cells(i, targetCol).Value, ",")
        
        ' 複数の値がある場合のみ処理
        If UBound(splitData) > 0 Then
            ' 必要な行数を挿入
            ws.Rows(i + 1 & ":" & i + UBound(splitData)).Insert Shift:=xlDown
            
            ' 値を書き戻す
            For j = 0 To UBound(splitData)
                ws.Cells(i + j, targetCol).Value = Trim(splitData(j))
                ' 他の列のデータもコピーする場合の処理(例:B列をコピー)
                If j > 0 Then
                    ws.Cells(i + j, 2).Value = ws.Cells(i, 2).Value
                End If
            Next j
        End If
    Next i
    
    Application.ScreenUpdating = True
    MsgBox "データの行展開が完了しました。", vbInformation
End Sub

実務アドバイス:エンジニアが意識すべき注意点

この処理を実務で運用する際、以下の3点に注意してください。

1. トランザクションとバックアップ
VBAによる行挿入は「元に戻す(Ctrl+Z)」が効きません。実行前に必ずファイルのバックアップを取るか、別シートに結果を出力する設計にすることを推奨します。

2. データ量の限界
数万行を超えるデータをループ処理すると、Excelがフリーズする可能性があります。処理対象が多い場合は、配列にデータを読み込んでメモリ上で処理し、最後に一括でシートへ書き出す「配列処理(Array)」の手法を採用してください。今回のコードは可読性を重視していますが、データ量が膨大な場合は配列への転送が必須です。

3. Trim関数の重要性
CSVデータには「A, B, C」のようにスペースが含まれることが多々あります。Split関数で分割した後のデータに対し、必ずTrim関数を使用して余計な空白を除去してください。これを行わないと、後続のVLOOKUPやピボットテーブルで「A」と「 A」が別物として扱われ、集計ミスを招きます。

応用:柔軟なデータ加工へ

今回のコードは「カンマ区切り」に特化していますが、区切り文字を引数として受け取るように関数化すれば、セミコロン(;)やタブ区切りなど、あらゆる形式に対応可能です。また、展開後に特定の条件(例:特定のキーワードを含むものだけ抽出する)を加えることで、フィルタリングと展開を同時に行うこともできます。

エンジニアとして、単に「動くコード」を書くのではなく、「保守性が高く、かつデータの整合性を保てるコード」を目指してください。特に、行挿入を伴う処理は、ループの方向(下から上へ)を間違えると致命的なバグに繋がります。この基本原則を忘れないようにしましょう。

まとめ

エクセルの行展開は、手作業で行えば数時間を要する作業であっても、VBAを用いれば一瞬で終わらせることが可能です。今回解説したSplit関数と行挿入のロジックは、データ前処理の自動化において最も強力なスキルのひとつです。

今日学んだサンプルコードをベースに、ご自身の業務環境に合わせてカスタマイズしてみてください。データの正規化を自動化し、手作業のミスをゼロにすることこそが、プロフェッショナルなExcelエンジニアの第一歩です。日々の業務における「繰り返し作業」を、コードで解決する楽しさをぜひ体感してください。

タイトルとURLをコピーしました