ロンは、COMBIN関数を使用して、桁数から作成できる組み合わせの数を決定できることを知っています。しかし、彼はすべての組み合わせ自体をリストアップする方法があるかどうか疑問に思っています。

Excelで組み合わせを一覧表示する組み込みの方法はありません。ただし、リストを作成するためのマクロを作成することはできます。 1から始まる連番のセットで一意の組み合わせを見つけたい場合は、次のマクロのセットでうまくいきます。 TestCNR関数を実行するだけで、1から10の範囲の値の連続セット内の4桁の組み合わせの数を表すセルの「行列」ができあがります。

Sub TestCNR()

Cnr 10, 4 End Sub
Sub Cnr(n, r)

i = 1     For j = 1 To r         Cells(i, j).Value = j     Next

Do Until Finished(n, r, i)

j = FindFirstSmall(n, r, i)

For k = 1 To j — 1             Cells(i + 1, k).Value = Cells(i, k).Value         Next         Cells(i + 1, j).Value = Cells(i, j).Value + 1         For k = j + 1 To r             Cells(i + 1, k).Value = Cells(i + 1, k - 1).Value + 1         Next         i = i + 1     Loop End Sub
Function Finished(n, r, i)

Temp = True

For j = r To 1 Step -1         If Cells(i, j).Value <> j + (n - r) Then             Temp = False         End If     Next     Finished = Temp End Function

Function FindFirstSmall(n, r, i)

j = r     Do Until Cells(i, j).Value <> j + (n - r)

j = j - 1     Loop     FindFirstSmall = j End Function

マクロはワークシートにあるものをすべて上書きするため、空白のワークシートを表示してテストを実行してください。セットのサイズまたはサブセット内の要素の数を変更する場合は、TestCNRルーチンで渡される値を変更するだけです。

文字列(アルファベットの文字など)から一意の組み合わせを取得する場合は、別のマクロのセットを使用する必要があります。以下は正常に機能します。 「ユニバース」として使用する文字がセルA1にあり、それぞれの一意の組み合わせに必要な数がセルA2にあることを前提としています。

Sub FindSets()

Dim iA() As Integer     Dim sUniv As String     Dim iWanted As Integer     Dim j As Integer     Dim k As Integer

sUniv = Cells(1, 1).Value     iWanted = Cells(2, 1).Value

ReDim iA(iWanted)

For j = 1 To iWanted         iA(j) = j     Next j

iRow = PutRow(iA, sUniv, 1)



Do Until DoneYet(iA, Len(sUniv))

j = WorkHere(iA, Len(sUniv))

iA(j) = iA(j) + 1         For k = j + 1 To iWanted             iA(k) = iA(k - 1) + 1         Next k         iRow = PutRow(iA, sUniv, iRow)

Loop End Sub
Function DoneYet(iB, n) As Boolean     iMax = UBound(iB)

Temp = True     For j = iMax To 1 Step -1         If iB(j) <> j + (n - iMax) Then             Temp = False         End If     Next     DoneYet = Temp End Function
Function WorkHere(iB, n) As Integer     iMax = UBound(iB)

j = iMax     Do Until iB(j) <> j + (n - iMax)

j = j - 1     Loop     WorkHere = j End Function
Function PutRow(iB, sUniv, i)

iMax = UBound(iB)

sTemp = ""

For j = 1 To iMax         sTemp = sTemp & Mid(sUniv, iB(j), 1)

Next j     Cells(i, 2).Value = sTemp     PutRow = i + 1 End Function

FindSetsマクロを実行すると、必要なさまざまな組み合わせが列2に表示されます。ただし、マクロを実行するときは注意してください。組み合わせの数は非常にすぐに大きくなる可能性があります。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(11891)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice 365のExcelに適用されます。Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります。