概要:なぜマトリックス表は「悪」なのか
Excel業務において、最も頻繁に遭遇する「データ構造の敵」といえば、横方向に項目が並ぶマトリックス表(クロス集計表)です。人間にとっては視認性が高く、会議資料としては優秀ですが、データ分析やシステム連携においては「最悪の形」と言わざるを得ません。
列方向に「1月、2月、3月…」と続く表は、データベース(DB)の正規化の観点から見れば、情報を複数の列に分散させてしまっています。これをPower BIやピボットテーブルで自在に扱うためには、リスト形式(DB形式)への変換が不可欠です。本稿では、生成AI「Gemini」を設計パートナーとし、100本ノックの第25本目として、この「マトリックスからDB形式への変換」を、堅牢かつ高速なVBAで実装する手法を徹底解説します。
詳細解説:アンピボット処理の論理構造
マトリックス表をDB形式に変換する作業は、専門用語で「アンピボット(Unpivot)」と呼ばれます。この処理の核心は、行と列の交差地点にある値を、一列に並べ替えて「属性(月)」と「値(売上など)」という対の形に落とし込むことにあります。
手作業で行うと、コピー&ペーストの繰り返しでヒューマンエラーを誘発します。VBAで実装する場合、以下のステップを踏むのが最も効率的です。
1. 元データとなる範囲をメモリ(配列)に読み込む
2. 出力用の動的配列を用意する
3. 入れ子構造のループ(行方向と列方向)を回す
4. 属性(ヘッダー)と値をペアにして出力用配列に格納する
5. 最後に一括でシートへ書き出す
この「配列処理」こそが、数万行のデータを一瞬で処理するための秘訣です。セルへの直接アクセスは極力避け、メモリ内で完結させることで、Excelの動作を劇的に軽量化します。
サンプルコード:高速アンピボットエンジン
以下のコードは、行見出しがA列、列見出しが1行目にある一般的なマトリックス表を、3列のDB形式(項目名、属性、値)へ変換する汎用的なプロシージャです。
Sub ConvertMatrixToDB()
Dim wsSource As Worksheet, wsDest As Worksheet
Dim vData As Variant, vResult As Variant
Dim i As Long, j As Long, k As Long
Dim rowCount As Long, colCount As Long
' 対象シートの設定
Set wsSource = ThisWorkbook.Sheets("Sheet1")
Set wsDest = Worksheets.Add
wsDest.Name = "DB形式_" & Format(Now, "hhmmss")
' 元データの取得
vData = wsSource.Range("A1").CurrentRegion.Value
rowCount = UBound(vData, 1)
colCount = UBound(vData, 2)
' 結果格納用配列の準備(行数×列数 の最大サイズ)
ReDim vResult(1 To (rowCount - 1) * (colCount - 1), 1 To 3)
' アンピボット処理
k = 1
For i = 2 To rowCount ' 2行目から開始
For j = 2 To colCount ' 2列目から開始
If Not IsEmpty(vData(i, j)) Then
vResult(k, 1) = vData(i, 1) ' 行項目
vResult(k, 2) = vData(1, j) ' 列項目(属性)
vResult(k, 3) = vData(i, j) ' 値
k = k + 1
End If
Next j
Next i
' 結果の書き出し
wsDest.Range("A1").Value = "項目"
wsDest.Range("B1").Value = "属性"
wsDest.Range("C1").Value = "値"
wsDest.Range("A2").Resize(k - 1, 3).Value = vResult
MsgBox "変換完了: " & k - 1 & " 行を生成しました。", vbInformation
End Sub
実務アドバイス:Geminiを活用したメンテナンス戦略
生成AI「Gemini」にこのコードを渡すと、さらに高度な要求に応えてくれます。「このマトリックス表に、複数の属性列が含まれる場合はどうすればいいか?」「空セルを無視するだけでなく、0として補完したい」といった要望を投げかけることで、コードは瞬時に最適化されます。
実務で意識すべきは「例外処理」です。
・ヘッダーが2行にまたがっている場合
・数値以外が混じっている場合
・特定の列はアンピボット対象から除外したい場合
これらを自分でゼロから実装しようとすると時間がかかります。Geminiに具体的な表のレイアウト(列名など)を伝え、「この構造に合わせて、〇〇列を固定、△△列から右をアンピボット対象とするコードを書いて」と指示を出してください。AIは「あなたの業務仕様を理解する優秀なジュニアプログラマー」として振る舞います。
また、大規模データを取り扱う際は、配列のサイズを最初から固定せず、`ReDim Preserve` を用いるか、あるいは今回のように最大サイズで確保してから後でトリミングする手法が、速度と可読性のバランスが良いでしょう。
まとめ:データ形式の統一がDXの第一歩
マトリックス表をDB形式に変換するスキルは、単なるExcel操作のテクニックではありません。これは「データをどのように保持すれば再利用可能か」というデータモデリングの基礎思考です。
VBAでこの変換を自動化すれば、月次レポートの作成時間は数時間から数秒へと短縮されます。空いた時間は、データの中に隠されたインサイトの分析や、経営判断に直結する考察に充てるべきです。
今回紹介したコードをベースに、ご自身の業務で頻出する表のレイアウトに合わせてカスタマイズしてみてください。100本ノックの25本目を終えた今、あなたはすでにVBAで「データの形を自在に操る力」を手にしています。次は、このDB形式データをPower QueryやPythonと連携させ、さらなる自動化のステージへと進んでいきましょう。Excelの限界は、あなたの工夫一つでいくらでも拡張可能です。
