|
▼もも缶 さん:
こんにちは。
>それでも5万件近く組合せがあると思いますが?(多分)
そうですね、6^6とおりですね!!
一応、列A〜Gのように列数が増えてもいいようにしました。
標準モジュール(Module1)に
'=========================================================
Sub main()
Dim ans()
' ↑組み合わせメンバーを取得する配列
Dim rng As Range
' ↑組み合わせセル範囲(こういうの組み合わせって言うんだっけ?)
Set rng = Selection
期待値 = 9.283 '積がこの数値と一致するデータを取得する
ReDim ans(1 To rng.Columns.Count)
combcnt = comb_init(rng) '総当り数取得
Do While get_comb(ans()) = 0
If 期待値 = Application.Evaluate("=round(" & Join(ans(), "*") & ",3)") Then '積と期待値が一致したらメッセージ(四捨五入だから大丈夫かな?)
MsgBox Join(ans(), "*") & "=" & 期待値
End If
Loop
MsgBox "以上" & combcnt & "通り調査しました"
End Sub
標準モジュール(module2)に
'===================================================================
Private c_myarray()
Private c_idx() As Long
'===================================================================
Function comb_init(rng As Range) As Double
'組み合わせデータをセットする
'input : rng 組み合わせセル範囲
'output: comb_init 組み合わせ総数
c_svn = seln
Erase c_myarray
Erase c_idx
With rng
c_myarray() = .Value
comb_init = .Rows.Count ^ .Columns.Count
ReDim c_idx(1 To .Columns.Count)
For idx = LBound(c_idx()) To UBound(c_idx())
c_idx(idx) = 1
Next
c_idx(UBound(c_idx())) = 0
End With
End Function
'======================================================================
Function get_comb(ans()) As Long
'組み合わせメンバーを配列に出力する
'output: ans() メンバの配列
' get_comb:0 -- 正常に配列取得
' 1 -- メンバの終わり
get_comb = 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_comb = 0
Exit For
Else
c_idx(i) = 1
End If
Next
If get_comb = 0 Then
For i = LBound(c_idx()) To UBound(c_idx())
ans(i) = c_myarray(c_idx(i), i)
Next
End If
End Function
調査するセル範囲(A1:F6のように)を選択後、mainを実行して下さい。
私も簡単なテストしかしていませんので
最初は、A1:C3ぐらいサンプルデータを作成して
テストしてみてください。
|
|