• ベストアンサー

エクセルで組合せのパターンを表示したい

12人から9人を選ぶ組合せのパターンをすべて表示させる 方法はないでしょうか?パターン数はCONBIN関数で220通り と求められました。この220通りを実際に表示させたいの です。エクセル上級者ではないので、簡単なマクロだと 助かりますが、いいアイデアがあれば教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

最も素直に解釈するとこうです r = 1 For i01 = 1 To 4 For i02 = i01 + 1 To 5 For i03 = i02 + 1 To 6 For i04 = i03 + 1 To 7 For i05 = i04 + 1 To 8 For i06 = i05 + 1 To 9 For i07 = i06 + 1 To 10 For i08 = i07 + 1 To 11 For i09 = i08 + 1 To 12 Cells(r, 1).Value = i01 Cells(r, 2).Value = i02 Cells(r, 3).Value = i03 Cells(r, 4).Value = i04 Cells(r, 5).Value = i05 Cells(r, 6).Value = i06 Cells(r, 7).Value = i07 Cells(r, 8).Value = i08 Cells(r, 9).Value = i09 r = r + 1 Next Next Next Next Next Next Next Next Next

chifumi
質問者

お礼

早速の回答どうもありがとうございます。 参考にさせてもらいます。

その他の回答 (2)

回答No.3

VBAは初心者ですけど、勉強と思い、半日がかりで書いてみました。どうでしょうか?9人を選ぶのではなく、3人を選ばない・・・という考えです。 12人の名前を、A~Lとします。シートのA列にその組み合わせが表示されます。例えば「DEFGHIJKL」のように。ちゃんと220通りとなりました。自信ありませんので、経験者の方のご意見など頂ければありがたいのですが・・・。便乗して済みません! Sub CONBIN() Dim a As String Dim I, j, k, l As Integer a = "ABCDEFGHIJKL" l = 0 For I = 1 To 10 For j = I + 1 To 11 For k = j + 1 To 12 l = l + 1 Range("a" & l) = a Range("a" & l).Replace WHAT:=Chr(64 + I), REPLACEMENT:="" Range("a" & l).Replace WHAT:=Chr(64 + j), REPLACEMENT:="" Range("a" & l).Replace WHAT:=Chr(64 + k), REPLACEMENT:="" Next Next Next End Sub

chifumi
質問者

お礼

半日がかりとは・・本当にありがとうございます! 私もVBAはこれからと言ったところなのですが、 いい課題になったと思っています。いろんな方法で 求められるようなので、回答いただいたすべてを 自分で試してみます。

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.2

再帰つかってみました Dim a() '要素を格納する配列 Dim na As Integer 'a()の要素数 Dim nb As Integer '取り出す要素数 Dim i As Integer Dim j As Integer Sub foo() Dim isUse() As Boolean na = 12 nb = 9 ReDim Preserve a(na) ReDim Preserve isUse(na) a(1) = 1 a(2) = 2 a(3) = 3 a(4) = 4 a(5) = 5 a(6) = 6 a(7) = 7 a(8) = 8 a(9) = 9 a(10) = 10 a(11) = 11 a(12) = 12 Call bar(1, isUse(), 0) End Sub Sub bar(lv As Integer, isUse() As Boolean, us As Integer) If (na - lv + 1 + us < nb) Then Exit Sub If (us = nb) Then For i = lv To na isUse(i) = False Next j = 0 For i = 1 To na If isUse(i) Then ActiveCell.Offset(0, j).Value = a(i) j = j + 1 End If Next ActiveCell.Offset(1, 0).Activate Exit Sub End If isUse(lv) = True Call bar(lv + 1, isUse(), us + 1) isUse(lv) = False Call bar(lv + 1, isUse(), us) End Sub

chifumi
質問者

お礼

VBAは少ししかわからないので、すぐに理解できま せんが、これから勉強して活用させていただきます。 ありがとうございました!