| 
    
     |  | 皆さん、こんにちは。 
 ichinoseさんのご回答の中で2つ質問があるので、教えてください。
 
 1.例では、3つのセルとも1〜20の値とさせていただきましたが、
 これが、A1は1〜5、B1は11〜20、C1は51〜75、
 のように、バラバラの場合は、どのように記述すればよいのですか?
 
 2.例えば、1〜200のような場合でも、
 (1, 2, 3, 4, 5, 6、...中略...197, 198, 199, 200)と記述することになるのですか?
 
 以上2点、よろしくお願いいたします。
 
 
 >うさちゃん さん,ちくたくさん、こんばんは。
 >つまり、総当たりリストが作成できればよいと言うことですね?
 >
 >>ちょっと図にしてみました。
 >>
 >>下のように、A1、B1、C1のセルに、
 >>例えば、1〜20まで順次入力していって、
 >>E1、F1のセルに答えが返るとします。
 >>これを手作業でやっていくと、
 >>A1、B1、C1を変えるだけで8000回かかります。
 >>この入力をVBAに任せて、出てきた答えを例えばHとIの列に、
 >>上から列記されたように表示させたいのです。
 >>実際にマクロを実行したら、HとIの列に8000行のデータが現れて、
 >>終了するようになると思います。
 >>
 >>
 >>A1 B1 C1 → E1 F1
 >> 1 1 1 → 2 3
 >> 1 1 2 → 5 7
 >> 1 1 3 → 8 7
 >> . . .   . .
 >> . . .   . .
 >> . . .   . .
 >>20 20 18 → 5 0
 >>20 20 19 → 9 1
 >>20 20 20 → 6 4
 >
 >この例を引用すると
 >
 >標準モジュールに
 >
 >'=====================================================
 >Sub main()
 >  Dim idx As Long
 >  Dim ans(1 To 3)
 >'  ↑総当たりメンバーを取得する配列
 >  Dim ss As Variant
 >  ss = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
 >  Call init_totalhit(ss, 3)
 >  idx = 1
 >  Do While get_totalhit(ans()) = 0
 >    Range("a1:c1").Value = ans()
 >    Range(Cells(idx, "h"), Cells(idx, "i")).Value = Range("e1:f1").Value
 >    idx = idx + 1
 >    Loop
 >
 >  Call term_totalhit
 >
 >End Sub
 >
 >
 >別の標準モジュールに
 >'=============================================================
 >  Private c_myarray()
 >  Private c_idx() As Long
 >
 >'===================================================================
 >Function init_totalhit(標本 As Variant, 抜取り数 As Long) As Double
 >'総当たりデータをセットする
 >'input : 標本 総当たりリストを作成する標本配列
 >'   : 抜取り数
 >'Output: init_totalhit 総あたり数
 >  Dim g0 As Long
 >  Erase c_myarray
 >  Erase c_idx
 >  ReDim c_myarray(1 To UBound(標本) - LBound(標本) + 1)
 >  For g0 = LBound(標本) To UBound(標本)
 >   c_myarray(IIf(LBound(標本) = 0, g0 + 1, g0)) = 標本(g0)
 >   Next g0
 >  init_totalhit = (UBound(標本) - LBound(標本) + 1) ^ 抜取り数
 >  ReDim c_idx(1 To 抜取り数)
 >  For idx = LBound(c_idx()) To UBound(c_idx())
 >    c_idx(idx) = 1
 >    Next
 >  c_idx(UBound(c_idx())) = 0
 >
 >End Function
 >'======================================================================
 >Sub term_totalhit()
 >'総当たり処理の終了処理
 >  Erase c_myarray()
 >  Erase c_idx()
 >End Sub
 >'======================================================================
 >Function get_totalhit(ans()) As Long
 >'総当たりメンバーを配列に出力する
 >'output: ans() メンバの配列 添え字は必ず1から始まる配列を用意する
 >'    get_totalhit:0 -- 正常に配列取得
 >'            1 -- メンバの終わり
 >  get_totalhit = 1
 >  For i = UBound(c_idx()) To LBound(c_idx()) Step -1
 >    If c_idx(i) + 1 <= UBound(c_myarray(), 1) Then
 >     c_idx(i) = c_idx(i) + 1
 >     get_totalhit = 0
 >     Exit For
 >    Else
 >     c_idx(i) = 1
 >     End If
 >    Next
 >  If get_totalhit = 0 Then
 >    For i = LBound(c_idx()) To UBound(c_idx())
 >     ans(i) = c_myarray(c_idx(i))
 >     Next
 >    End If
 >End Function
 >
 >として、当該シートをアクティブにして
 >実行してみて下さい。
 >
 >総当たりのリストによるセルE1、F1の結果が
 >H列、i列に順次移行されます。
 >
 >総当たりリストは、例ではA1,B1,C1の抜取り3つですが、
 >4つになっても簡単に移行出来るようにしておきました。
 >試してみて下さい
 
 |  |