Excel VBAで二次元配列のクロス結合テーブルを手軽に生成!
データ管理や分析を行う際、異なる要素群の全ての組み合わせを一覧にしたいシチュエーションは多々あります。今回は、Excel VBAマクロを利用して、二次元配列のクロス結合・交差結合・直積結合テーブルを効率よく生成する方法をご紹介します。
マクロ「CreateCrossJoinTable2D」の概要
「CreateCrossJoinTable2D」は、ユーザー指定の複数の二次元配列(リスト)をクロス結合し、全ての要素の組み合わせを新しいワークシートに一覧出力するExcel VBAマクロです。二次元配列をクロス結合することで、複数の要素群の全組み合わせを柔軟かつ迅速に生成できます。
マクロコードとその登録方法
以下のコードをVBAエディタに挿入し、マクロをExcelに登録します。コードの詳細や登録手順については、続くセクションでご説明します。
Sub CreateCrossJoinTable2D()
Dim inputRanges As Collection
Dim ws As Worksheet, newWs As Worksheet
Dim currentRow As Long
Dim allCombinations As Collection
Dim rng As Range
Dim combination As Variant
Dim i As Long
' Initialize
Set inputRanges = New Collection
Set allCombinations = New Collection
Set ws = ActiveSheet
' Input multiple ranges
Do
Set rng = Nothing
On Error Resume Next
Set rng = Application.InputBox("Select a range or cancel:", Type:=8)
On Error GoTo 0
' Check if Cancel was pressed or no range was selected
If rng Is Nothing Then
If inputRanges.Count = 0 Then Exit Sub ' Exit if no ranges have been added
Exit Do ' Exit loop if at least one range has been added
End If
inputRanges.Add rng
Loop
' Add the first range's items as the first combinations
For i = 1 To inputRanges(1).Rows.Count
allCombinations.Add inputRanges(1).Rows(i).Value
Next i
' For each additional input range, cross join with existing combinations
For i = 2 To inputRanges.Count
Set allCombinations = CrossJoin2D(allCombinations, inputRanges(i))
Next i
' Output results to a new worksheet
Set newWs = Sheets.Add(After:=Sheets(Sheets.Count))
newWs.Activate
currentRow = 1
For Each combination In allCombinations
newWs.Cells(currentRow, 1).Resize(, UBound(combination, 2)).Value = combination
currentRow = currentRow + 1
Next combination
End Sub
' Function to cross join two sets of combinations
Function CrossJoin2D(existingCombinations As Collection, rng As Range) As Collection
Dim newCombinations As New Collection
Dim combination As Variant
Dim newCombination() As Variant
Dim r As Long
Dim i As Long, j As Long, k As Long
For Each combination In existingCombinations
For r = 1 To rng.Rows.Count
ReDim newCombination(1 To 1, 1 To UBound(combination, 2) + rng.Columns.Count)
' Existing fields
For j = 1 To UBound(combination, 2)
newCombination(1, j) = combination(1, j)
Next j
' New fields
For k = 1 To rng.Columns.Count
newCombination(1, j + k - 1) = rng.Cells(r, k).Value
Next k
newCombinations.Add newCombination
Next r
Next combination
Set CrossJoin2D = newCombinations
End Functionマクロコードの登録手順は次のとおりです。
- Excelを開き、「開発」タブをクリックします(表示されていない場合は、オプションから設定を変更してください)。
- 「Visual Basic」をクリックします。Alt+F11キーでも開きます。
- エディタ内で、「挿入」→「標準モジュール」を選択し、新しいモジュールを追加します。
- 上記のコードをコピーし、新しいモジュールに貼り付けます。
- エディタを閉じ、Excelに戻ります。
マクロの実行と操作手順
マクロの実行手順と、実行時の操作手順をご紹介します。
- Excelの「開発」タブから「マクロ」をクリックし、「CreateCrossJoinTable2D」を選択、そして「実行」をクリックします。もしくはAlt+F8キーでマクロリストを開いてから「CreateCrossJoinTable2D」を実行します。

- ポップアップするインプットボックスにて、クロス結合したい二次元配列の範囲を指定します。

- 次の配列範囲を指定します。次々と登録します。


- 全ての配列を指定し終わったら、「キャンセル」をクリックします。

結果の確認方法
マクロを実行すると、新しいワークシートが生成され、選択した二次元配列の全ての組み合わせが出力されます。各配列の要素が横方向に結合され、全ての可能な組み合わせが縦にリストアップされます。※C列の小数値は表示形式を「時刻」に設定して確認してください。

使用上の注意点
マクロをスムーズに利用するためのいくつかの注意点を挙げておきます。
- 結合セルがあると処理はできあません。
- 同じ列には同じ種類のタイプの値を入れる必要があります。たとえばB列は日付、C列は曜日…などです。
- 大量のデータを扱う場合、処理に時間がかかる可能性があります。適度なデータサイズでの利用を心掛けてください。
- キャンセルボタンは、配列の入力を終了し、テーブルの生成を開始します。誤ってキャンセルを押してしまった場合は、再度マクロを実行してください。
以上で、二次元配列のクロス結合を容易に実現するVBAマクロの説明を終わります。このテクニックを活用して、日々のデータ管理や分析作業を効率化しましょう!


コメント