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

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

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

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

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