重複順列の全パターンを生成するエクセルマクロ

エクセルVBAでの同じものを選べる順列パターン生成

エクセルは日常業務の数式計算だけでなく、VBAを用いることで更なる高度な操作を行えます。今回は、エクセルVBAを使用して「n個の異なる要素からr個を選んで並べ、同じものを選べる順列の一覧」を自動生成する方法をご紹介します。

このマクロの意義

先述した通常の順列とは異なり、今回の順列では同じ要素を再度選択することが許可されています。これは、例えば同じ商品を複数選べるディスプレイ配置の最適化や、繰り返しのあるタスク順序の検討など、特定のシチュエーションで非常に役立ちます。要素の数が多い場合や、選択数が多い場合、すべての組み合わせを手動でリストアップするのは大変です。このマクロを利用すれば、短時間で正確な結果を得ることができます。

利用想定シーン

  • 商品のディスプレイ配置の最適化
  • 繰り返しタスクの実施順序の検討
  • リソースの再利用計画
  • 組み合わせの研究やシミュレーション

PERMUTATIONA関数を使用して順列の数を事前に確認する

通常の順列とは異なり、同じ要素を再度選ぶ順列の数を確認するには「PERMUTATIONA関数」を使用します。
PERMUTATIONA関数は、指定した総数(n)から指定した要素数(r)を選ぶときの、同じ要素を再度選ぶことが許された順列の数を計算します。関数の書式は以下の通りです。

=PERMUTATIONA(n, r)

例えば、6つの要素から3つを選ぶ場合の順列の数を知りたい場合、以下のように関数を使用します。

=PERMUTATIONA(6, 3)

この関数を利用することで、事前にどれだけの組み合わせが出力されるのかを知ることができ、出力結果の妥当性の確認や、処理時間の予測などの目的で使用することができます(上記の式は216を返す)。

マクロのコード

順列の数が想定内であることを確認したら、実際に組み合わせリストを作成してみましょう。
以下にマクロのコードを示します。VBEを{Alt}+{F11}などで起動し、「挿入」→「標準モジュール」へ貼り付けてください。設定後はVBEを閉じ、{Alt}+{F8}などでマクロ「GeneratePermutationsWithRepetition」を実行してください。

Option Explicit

Sub GeneratePermutationsWithRepetition()
    Dim rng As Range
    Dim outCell As Range
    Dim arr() As Variant
    Dim r As Long
    Dim perm As Variant
    
    ' アイテム範囲を指定
    Set rng = Application.InputBox("アイテム範囲を選択してください", Type:=8)
    arr = rng.Value
    
    ' 取り出す数を指定
    r = Application.InputBox("取り出す数を入力してください", Type:=1)
    
    ' 出力先の開始セルを指定
    Set outCell = Application.InputBox("出力先の開始セルを指定してください", Type:=8)
    
    ' 順列を計算し、出力
    For Each perm In PermutationsArrayWithRepetition(arr, r)
        outCell.Resize(, r).Value = perm
        Set outCell = outCell.Offset(1, 0)
    Next perm
End Sub

Function PermutationsArrayWithRepetition(arr() As Variant, r As Long) As Collection
    Dim perms As New Collection
    PermutationsRecurWithRepetition perms, arr, "", r
    Set PermutationsArrayWithRepetition = perms
End Function

Sub PermutationsRecurWithRepetition(perms As Collection, arr() As Variant, prefix As String, r As Long)
    Dim i As Long
    
    If r = 0 Then
        perms.Add Split(prefix)
        Exit Sub
    End If
    
    For i = LBound(arr) To UBound(arr)
        PermutationsRecurWithRepetition perms, arr, prefix & arr(i, 1) & " ", r - 1
    Next i
End Sub

使い方

  1. まず、VBAエディタ(VBE)を開き、新しいモジュールに上記のコードをコピー&ペーストします。({Alt}+{F11}などでVBEを起動し、「挿入」→「標準モジュール」へ貼り付ける、エディタを閉じる)
  2. エクセルのシートに順列を生成したい要素のリストを作成します。下の例ではセルH1:H12にリストを作成しています。ただし使用するのはH1:H6の6種類だけのつもりです。

  3. {Alt}+{F8}などでマクロ「GeneratePermutationsWithRepetition」を実行すると、最初にアイテム・要素の範囲が求められます。入力済み範囲を指定します。

  4. 次に取り出す数を求められます。

  5. 最後に結果を出力するセルの位置を指定するよう求められます。

  6. 指定に従って情報を入力すると、自動的に順列の一覧が出力されます。サンプルの設定では216パターンが出力されます。

まとめ

今回紹介したエクセルVBAのマクロを使用することで、同じ要素を再度選べる順列を効率的に生成することができます。通常の順列とは異なる特定のシチュエーションで、このマクロを活用して、さらに高度な分析や検討を行ってみてください。

コメント