組み合わせの一覧表示(Microsoft Excel)
ロンは、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に表示されます。ただし、マクロを実行するときは注意してください。組み合わせの数は非常にすぐに大きくなる可能性があります。たとえば、セルA1に26文字(AからZ)を入力し、セルA2に値5を入力すると、マクロがクラッシュします。どうして? 65,780の可能な5文字の組み合わせがあり、それらを配置するのは65,536行しかないためです。
注:
このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(6766)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。
linkListingCombinations。