• ベストアンサー

全組合せの洗い出しプログラム作成に悩んでいます(ExcelVBA/AccessVBA)

0-5までの数字を使用して 3~10個の数字の組合せを作成したいと思っています。 組合せを書きだしてみたり、 数学やプログラムのページをネットで探してみたのですが 理解力不足でロジックが思いつきませんでした…。 桁数、使用数字の最大値を指定して、 最終的に配列等に持たせる事が目標です…。 3桁,使用数字の最大値2(0-2)の場合 {0,0,0} {0,0,1} {0,1,1} {0,1,2} {1,1,1} {0,0,2} {0,2,2} {2,2,2} といった具合です。(漏れていたらすいません…) ヒントだけでもいただけたらとても助かります。 宜しくお願いいたします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

生成するデータに抜けがありますね 000 001 002 011 012 022 111 112 ... 1) 122 ... 2) 222 といった具合になるはずです この場合3重ループで実現可能です for i = 0 to 2   for j = i to 2     for k = j to 2       cells(nRow,1) = i & " " & j & " " & k     next   next next といった具合です これだと桁数と使用数字が固定されてしまいます 再帰処理で記述してやれば 桁数、使用数字を可変にできると思いますよ sub myCalc( lv as integer, m as integer, nMax as Integer, nRow as Integer, ss as string)   if lv = 0 then     ' 再帰の脱出条件     Cells( nRow, 1 )= ss     nRow = nRow + 1     ss = left$(ss, Len(ss)-2)   else     dim i as integer     for i = m to nMax       ss = ss & i & " "       ' 1つ下のレベルを呼び出す       myCalc lv-1, i,nMax, nRow, ss     next     if len(ss) < 2 then Exit Sub     ss = left$(ss, len( ss ) -2 )   end if End Sub といった具合にしておいて 呼び出す側で myCalc 3, 0, 5, 1, "" といった具合にします 上記の場合 3桁 0-5を使用 1行目から 初期文字列は"" で呼び出しています

mini0524
質問者

お礼

ありがとうございます! 固定のプログラムも、変数呼び出しの再起ロジックも とても勉強になりました。 教えていただいた考え方を生かして 自分のスキルも上げていきたいと思います。 本当ありがとうございました。 パターン漏れすぎですね…。すいません、、恥ずかしすぎる…。

その他の回答 (1)

回答No.2

処理的には「進数変換」と同じですね。 コードのロジックについては「進数変換」で検索してみてください。 Hogeの引数にマイナスや大きな数字を指定したときの対処は組み込んでいません。 Option Explicit Private Sub CommandButton1_Click() Call Hoge(5, 5) End Sub ' Digit .... 桁数 ' MaxNum ... 最大値 Public Sub Hoge(Digit As Integer, MaxNum As Integer) Dim i As Long, l As Long Dim strPattern() As String Dim lngVal As Long Dim lngUseNum As Long ' 数字の種類数 (0-5)なら6 Dim lngUBound As Long ' 配列の上限 ' 使用する数字の種類は最大値+1 lngUseNum = MaxNum + 1 ' 配列の上限 ' (使用する数字の種類 ^ 桁数) - 1 lngUBound = (lngUseNum ^ Digit) - 1 ReDim strPattern(lngUBound) ' 進数変換ループ For i = 0 To lngUBound lngVal = i ' 各桁の数値を算出 For l = 0 To (Digit - 1) strPattern(i) = CStr(lngVal Mod lngUseNum) & " " & strPattern(i) lngVal = lngVal \ lngUseNum Next ' 結果を見るためにListBoxへ出力 Call ListBox1.AddItem(strPattern(i)) Next End Sub

mini0524
質問者

お礼

なるほど!!!ありがとうございます! 進数変換、自分では絶対にたどり着かなかったと思います。 本当にありがとうございます。 ロジック使わせていただきます! 本当に勉強になりました!

関連するQ&A

専門家に質問してみよう