組み合わせのパターン一覧を自動生成するエクセルマクロ

Excel VBAマクロで組み合わせを自動生成する方法

この記事では、ExcelのVBAマクロを使用して異なる要素の組み合わせを自動生成する方法を詳しく説明します。このマクロは、特定の要素群から指定した数だけ要素を選んで全ての組み合わせをリスト化するためのものです。例えば、製品の異なる特性の組み合わせを全てリストアップしたい場合や、チームメンバーの異なる役割の組み合わせを全て出力したい場合などに役立ちます。

なお、Excelではなくブラウザから組み合わせを生成する場合には下部の参考ページをご覧ください。

COMBIN関数を使用して組み合わせの数を事前に確認する

Excelには、ある範囲のアイテムから特定の数のアイテムを選ぶ組み合わせの総数を事前に計算するための関数があります。それが「COMBIN」関数です。この関数は2つの引数を受け取ります:組み合わせを取る対象の全体の数(n)と、一度に選択するアイテムの数(r)です。

COMBIN関数の使用方法は以下のとおりです。

  1. まず、空のセルを選択します。これが結果の出力先になります。
  2. 次に、そのセルに「=COMBIN(n, r)」と入力します。ここで、nは全体の数で、rは一度に選択するアイテムの数です。
  3. 最後に、Enterキーを押して結果を確認します。

例えば、

=COMBIN(7, 4)

と入力すると、7個のアイテムから4つを選ぶ全ての組み合わせの数が計算されます。これにより、生成される組み合わせの数が大量になりすぎるかどうかを事前に確認できます(35個)。

これは特に、大きな範囲から多くのアイテムを選ぶ組み合わせを生成する場合に役立ちます。COMBIN関数を使用すれば、組み合わせの数が想定外に多くなることによるパフォーマンスの問題を避けられます。

マクロのコードとその説明

組み合わせの数が想定外に多くないことを確認したら、実際に組み合わせリストを作成してみましょう。

以下にマクロのコードを示します。{Alt}+{F11}などでVBEを起動し、「挿入」→「標準モジュール」へ貼り付けてください。設定後はVBEは閉じ、{Alt}+{F8}などでマクロ「Combinations」を実行してください。

Option Explicit

Sub Combinations()
    Dim rng As Range
    Dim outCell As Range
    Dim arr() As Variant
    Dim r As Long
    Dim n As Long
    Dim i As Long
    Dim cmb As Variant
    
    ' アイテム範囲を指定
    Set rng = Application.InputBox("アイテム範囲を選択してください", Type:=8)
    arr = rng.Value
    n = rng.Cells.Count
    
    ' 取り出す数を指定
    r = Application.InputBox("取り出す数を入力してください", Type:=1)
    
    ' 出力先の開始セルを指定
    Set outCell = Application.InputBox("出力先の開始セルを指定してください", Type:=8)
    
    ' 組み合わせを計算し、出力
    For Each cmb In CombinationsArray(arr, r)
        outCell.Resize(, r).Value = cmb
        Set outCell = outCell.Offset(1, 0)
    Next cmb
End Sub

Function CombinationsArray(arr() As Variant, r As Long) As Collection
    Dim cmb As New Collection
    CombinationsArrayRecur cmb, arr, "", r, LBound(arr)
    Set CombinationsArray = cmb
End Function

Sub CombinationsArrayRecur(cmb As Collection, arr() As Variant, prefix As String, r As Long, start As Long)
    Dim i As Long
    For i = start To UBound(arr)
        If r = 1 Then
            cmb.Add Split(IIf(prefix <> "", prefix & " ", "") & arr(i, 1))
        Else
            CombinationsArrayRecur cmb, arr, IIf(prefix <> "", prefix & " ", "") & arr(i, 1), r - 1, i + 1
        End If
    Next i
End Sub

このマクロは次の手順で機能します。事前にどこかへアイテムリストを作成しておきましょう。下の例ではセルI2:I11にリストを作成しています。ただし使用するのはI2:I8の7種類だけのつもりです。

  1. まず、ユーザーにアイテムの範囲を選択させます。

  2. 次に、取り出すアイテムの数を指定させます。

  3. その後、結果を出力するセルの位置を選択させます。

  4. 選択した範囲から指定した数だけのアイテムを取り出す全ての組み合わせをCPUが計算し、指定したセルに出力してくれます。

まとめ

以上がExcelのVBAマクロを使用して組み合わせを自動生成する方法です。マクロは、ユーザーがアイテムの範囲、取り出すアイテムの数、結果を出力するセルの位置を簡単に指定できるようになっています。このマクロは、異なる要素の組み合わせを全てリスト化したい場合や、ある範囲から特定の数の要素を選んで全ての可能な組み合わせを見つけ出したい場合に非常に便利です。

参考:同等の処理をブラウザから行うツール

以下のページでは組み合わせリストの生成をブラウザから実行可能です。

組合せ(重複取出しなし)の全パターンを生成するツール
組み合わせ(重複取り出しなし)の全パターンを生成するツール n個の異なる要素からr個を選ぶ際の、全組み合わせパターンを生成します。選んだ要素の順番は考慮しません。 サンプルのように、テキストエリアへ要素を1行ごとに入力してください。 組合せ...

 

コメント