|
▼ichinose さん:
>こんばんは。
>一週間たってしまいましたね・・・。
>私も作ったので、よかったら検証してみてください。
>まず、標準モジュール(Module1)に
>'========================================================
>Sub test()
> Dim 組合せ
> Dim 組み分け数 As Long
> 組み分け数 = 3
> in_array = Array("A", "B", "C", "D", "E", "F", "G", "H")
> Call mk_pat_init(UBound(in_array) - LBound(in_array) + 1, 組み分け数)
> st = 1
> jdx = 1
'↑これ、要りません
> Do While mk_pat(pat) = 0
> 組合せ = dist_array(in_array, "", 組み分け数, pat)
> Range(Cells(st, 1), Cells(st + UBound(組合せ, 1), 組み分け数)).Value = _
> 組合せ
> st = st + UBound(組合せ, 1) + 1
> Loop
>End Sub
>
>'=======================================================================
>Function dist_array(ByVal in_array, ByVal delimter As String, ByVal 組み分け数 As Long, ByVal patturn, _
> Optional ByVal pdx As Long = 0, Optional ByVal nest As Long = 0, Optional ByVal dupmd As Long = 0)
>'指定された配列を指定された組み分け数でグループ化する
>'グループ化の詳細は、配列Patturnの値による
>'input : in_array ----組み分け数配列(1次元配列)
>' delimiter---同一グループ内を区切る文字
>' 組み分け数---グループ化する数
>' patturnグループメンバ数等の情報(2次元配列)
>'
>'
>'output : dist_array 2次元配列 1次元目がメンバ数
>' 2次元目がグループ化されたメンバの組合せ
>'pdx nest dupmdは、指定不可 内部処理データ
> Static dup() As Class1
> Static ans()
> Static adx As Long
> Static c_array()
> If nest = 0 Then
> menum = 1
> d_cnt = UBound(in_array) - LBound(in_array) + 1
> With WorksheetFunction
> For ll = LBound(patturn) To UBound(patturn)
> For jj = 1 To patturn(ll, 1)
> menum = menum * .Combin(d_cnt, patturn(ll, 0))
> d_cnt = d_cnt - patturn(ll, 0)
> Next jj
> menum = menum / .Fact(patturn(ll, 1))
> Next ll
> End With
> ReDim ans(menum - 1, 組み分け数 - 1)
> ReDim c_array(組み分け数 - 1)
> ReDim dup(UBound(in_array))
> adx = 0
> pdx = 0
> If patturn(pdx, 1) > 1 Then
> dupmd = 1
> Else
> dupmd = 0
> End If
> End If
> If patturn(pdx, 1) = 0 Then
> If pdx + 1 <= UBound(patturn, 1) Then
> pdx = pdx + 1
> If patturn(pdx, 1) > 1 Then
> dupmd = 1
> Else
> dupmd = 0
> End If
> Else
> Exit Function
> End If
> End If
> If dupmd >= 1 Then
> Set dup(nest) = New Class1
> dup(nest).duparray_init UBound(in_array)
> End If
> patturn(pdx, 1) = patturn(pdx, 1) - 1
> myarray1 = combin_list(in_array, patturn(pdx, 0))
> For idx = LBound(myarray1, 1) To UBound(myarray1, 1)
> ReDim tmp(UBound(myarray1, 2))
> For jdx = LBound(myarray1, 2) To UBound(myarray1, 2)
> tmp(jdx) = myarray1(idx, jdx)
> Next jdx
> retcode = 0
> If dupmd > 1 Then
> For dpx = nest - dupmd + 1 To nest - 1
> retcode = dup(dpx).duparray_chk(tmp())
> If retcode <> 0 Then Exit For
> Next dpx
> End If
> If retcode = 0 Then
> If dupmd >= 1 Then
> dup(nest).duparray_put myarray1(idx, 0)
> End If
> c_array(nest) = Join(tmp(), delimter)
> If nest = 組み分け数 - 1 Then
> For kdx = LBound(c_array()) To UBound(c_array())
> ans(adx, kdx) = c_array(kdx)
> Next kdx
> adx = adx + 1
> End If
> myarray2 = except_array(in_array, tmp())
> Erase tmp()
> Call dist_array(myarray2, delimter, 組み分け数, patturn, pdx, nest + 1, dupmd + 1)
> End If
>
> Next idx
> If nest = 0 Then
> dist_array = ans()
> Erase ans()
> Erase c_array()
> On Error Resume Next
> For idx = UBound(dup()) To LBound(dup())
> If Not dup(idx) Is Nothing Then
> dup(idx).duparray_term
> End If
> Set dup(idx) = Nothing
> Next
> Erase dup()
> On Error GoTo 0
> End If
>End Function
patturnという2次元配列の説明です。
一回で投稿できませんでした。
' patturnグループメンバ数等の情報(2次元配列)
'
' 例1 Array("a", "b", "c", "d", "e", "f", "g", "h")を
' 1,3,4の3グループに分ける場合、
' dim pat(2,1)
' メンバ数 メンバ数の重複回数
' pat(0,0)=1 pat(0,1)=1
' pat(1,0)=3 pat(1,1)=1
' pat(2,0)=4 pat(2,1)=1
' 組み分け数 = 3
' 組合せ = _
dist_array(Array("a", "b", "c", "d", "e", "f", "g", "h"),"**", 組み分け数, pat())
'
'
' 例2 Array("a", "b", "c", "d", "e", "f", "g", "h")を
' 3,3,2の3グループに分ける場合、
' dim pat(1,1)
' メンバ数 メンバ数の重複回数
' pat(0,0)=3 pat(0,1)=2
' pat(1,0)=2 pat(1,1)=1
' 組み分け数 = 3
' 組合せ = _
dist_array(Array("a", "b", "c", "d", "e", "f", "g", "h"),"**", 組み分け数, pat())
'
' 例3 Array("a", "b", "c", "d", "e", "f", "g", "h")を
' 2,2,2,2の4グループに分ける場合、
' dim pat(0,1)
' メンバ数 メンバ数の重複回数
' pat(0,0)=2 pat(0,1)=4
' 組み分け数 = 4
' 組合せ = _
dist_array(Array("a", "b", "c", "d", "e", "f", "g", "h"), "**",組み分け数, pat())
|
|