プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (3件)

最も素直に解釈するとこうです



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
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/12 09:24

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/12 09:31

再帰つかってみました



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
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/12 09:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!