重複組合せの全パターンを生成するエクセルマクロ

Excel VBAを使用した「反復使用(重複取出し)あり」の組み合わせの生成

Excelはデータ分析や計算に非常に便利なツールです。組み合わせの生成の簡易な方法は実装されていません。この記事では、Excel VBAを使用してこの問題を解決する方法を紹介します。

このマクロの意義

「反復使用あり」の組み合わせは、1つの要素を複数回選択することが許される組み合わせです。これは、例えば、同じアイテムを複数回選択できるくじ・抽選や、再使用可能な部品を持つ製品の設計など、多くの実世界のシナリオで役立ちます。

ExcelのCOMBINA関数を使用すると、反復使用を許してn個のアイテムからr個選ぶ組み合わせの総数を計算できますが、実際の組み合わせのリストは提供されません。このVBAマクロは、そのリストを生成することができます。

利用想定シーン

  • 在庫管理: 同じ商品の複数の組み合わせを考慮する必要がある場合。
  • 製品設計: 同じ部品を複数使用する製品の設計プロセス。
  • ゲームの戦略計画: 同じ動きや技を複数回使用するゲームの戦略を検討する際。
  • くじや抽選: 同じアイテムを複数回選択可能なシナリオ。

マクロのコード

以下は、指定された範囲から、反復使用を許してr個の要素を選ぶすべての組み合わせを生成するVBAマクロのコードです:

Option Explicit

Sub CombinationsWithRepetition()
    Dim rng As Range
    Dim outCell As Range
    Dim arr() As Variant
    Dim r As Long
    Dim n 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 CombinationsWithRepetitionArray(arr, r)
        outCell.Resize(, r).Value = cmb
        Set outCell = outCell.Offset(1, 0)
    Next cmb
End Sub

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

Sub CombinationsWithRepetitionRecur(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
            CombinationsWithRepetitionRecur cmb, arr, IIf(prefix <> "", prefix & " ", "") & arr(i, 1), r - 1, i
        End If
    Next i
End Sub

使い方

  1. 上記のVBAマクロをExcelのVBAエディタにコピー&ペーストします。{Alt}キー+{F11}でエディタを表示し、「挿入→標準モジュール」を開いてペーストしたあとエディタは閉じてください。
  2. Excelシート上で、「CombinationsWithRepetition」マクロを実行します。{Alt}+{F8}でマクロリストが表示されます。
  3. ポップアップが表示されるので、アイテムの範囲を選択します。下図のサンプルはH列にアイテムリストを入力しています。すべて使うのではなく6アイテムを指定しています。

  4. 次に、取り出す数を指定します。6アイテムから4つを取り出します。ただしこれは同じ値を複数回採用できるマクロです。

  5. 最後に、組み合わせの出力先のセルを選択します。A列にはわかりやすくするため連続番号を入れてありますが、これらの準備は不要です。サンプルではB1以下にリストを作成させています。

  6. しばらくすると、指定したセルから組み合わせが出力されます。なお6アイテムから重複ありで4つ取り出すと126パターンになります。これは「=COMBINA(6,4)」の計算式で確認できます。

このマクロを使用することで、複雑な組み合わせの計算やリスト作成を簡単に行うことができます。是非、日常の業務や研究に活用してみてください。

まとめ

Excel VBAは、特定の計算やデータ処理タスクを自動化するための強力なツールです。今回紹介した「反復使用あり」の組み合わせのマクロは、日常の業務や研究での様々なシナリオでの利用が期待されます。是非ともこの機能を活用して、Excelの可能性を最大限に引き出してください。

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

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

重複組合せの全パターンを生成するツール
重複組合せの全パターンを生成するウェブツール n個の異なる要素からr個を選ぶ際の、全組み合わせパターンを生成します。選んだ要素の順番は考慮しません。このツールでは同じ値を複数回採用することが許可されます。重複組合せ(combination ...

 

コメント