|
皆さん、こんにちは。
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つになっても簡単に移行出来るようにしておきました。
>試してみて下さい
|
|