- ベストアンサー
全組合せの洗い出しプログラム作成に悩んでいます(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} といった具合です。(漏れていたらすいません…) ヒントだけでもいただけたらとても助かります。 宜しくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
生成するデータに抜けがありますね 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行目から 初期文字列は"" で呼び出しています
その他の回答 (1)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
処理的には「進数変換」と同じですね。 コードのロジックについては「進数変換」で検索してみてください。 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
お礼
なるほど!!!ありがとうございます! 進数変換、自分では絶対にたどり着かなかったと思います。 本当にありがとうございます。 ロジック使わせていただきます! 本当に勉強になりました!
お礼
ありがとうございます! 固定のプログラムも、変数呼び出しの再起ロジックも とても勉強になりました。 教えていただいた考え方を生かして 自分のスキルも上げていきたいと思います。 本当ありがとうございました。 パターン漏れすぎですね…。すいません、、恥ずかしすぎる…。