|
▼カカ さん、awuさん、こんばんは。
>はじめて投稿させていただきます。
>第一グループとしてセルA1〜A6まで数字が6個あります。
>第二グループとしてセルB1〜B6まで数字が6個あります。
>第三グループとしてセルC1〜C6まで数字が6個あります。
>これとは別に対応表があって、上記の1〜3のグループでできる組み合わせを対応表から抜き出す。
対応表のレイアウトや1〜3のグループでできる組み合わせが
対応表とどのように関わっているのか明確にしましょう!!
以下のいコードはa1:c6にサンプルデータを作成し、
そのグループでできる組み合わせリストをE列に表示するコードです。
標準モジュールに
'==============================================================
Sub main()
Dim ans()
' ↑組み合わせメンバーを取得する配列
Dim rng As Range
' ↑組み合わせセル範囲
With Range("a1:c6")
.Formula = "=int(rand()*500)+1"
.Value = .Value
End With
'サンプルデータ作成
Set rng = Range("a1:c6")
ReDim ans(1 To rng.Columns.Count)
combcnt = init_allcomb(rng) '総当り数取得
Do While get_allcomb(ans()) = 0
Cells(idx + 1, 5).Value = Join(ans(), "-")
idx = idx + 1
Loop
MsgBox "以上" & combcnt & "通り表示しました"
End Sub
別の標準モジュールに
'===================================================================
Private c_myarray()
Private c_idx() As Long
'===================================================================
Function init_allcomb(rng As Range) As Double
'総当り組み合わせデータをセットする
'input : rng 組み合わせセル範囲
'output: allcomb_init 組み合わせ総数
c_svn = seln
Erase c_myarray
Erase c_idx
With rng
c_myarray() = .Value
init_allcomb = .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_allcomb(ans()) As Long
'総当り組み合わせメンバーを配列に出力する
'output: ans() メンバの配列
' get_allcomb:0 -- 正常に配列取得
' 1 -- メンバの終わり
get_allcomb = 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_allcomb = 0
Exit For
Else
c_idx(i) = 1
End If
Next
If get_allcomb = 0 Then
For i = LBound(c_idx()) To UBound(c_idx())
ans(i) = c_myarray(c_idx(i), i)
Next
End If
End Function
このリストが作成できれば、後は対応表との関わりだけですよね?
このような解釈で正しいですか?
|
|