|
▼りん さん:
ヒロさん、こんばんは。
>>abcdef のすべての組み合わせをエクセルのシートに出力
>>するようなプログラムがわかる方教えてください。
↑という内容だったので・・・・
>このツリーが参考になりませんか?
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=5435;id=excel
↑参考にして頂ければいいかな?と思ったのですが、
>例 abcの時
>出力結果
> abc
> acb
> bca
> bac
> dac
> dca
これって、組み合わせじゃなくて、順列ですよね?
前回、組み合わせを作ったんで、「これで順列作っとけば何かのときに使えるかな」と
思っていたんでキッカケができてよかったです。
例題は、セルA1、B1、C1に"a","b","c"と入っていたとき、
A列の3行目からリストを出力するコードです。
'==========================================================
Sub test()
Dim ans()
Dim 抜き取り As Long
抜き取り = 3
permt = permut_sp(ans(), Range("a1:c1"), 抜き取り)
Range(Cells(3, 1), Cells(permt + 2, 抜き取り)).Value = ans()
MsgBox "以上" & permt & "通りのリストです"
End Sub
'===============================================================
Function permut_sp(ans(), Optional rng As Range = Nothing, Optional seln As Long = 0, Optional ByVal myx As Long = 0, Optional ByVal ctx As Long = 0) As Long
'input rng : 順列メンバーセル範囲
' seln: 抜き取り数
'out ans(): 順列リスト
' permut_sp:順列数
' mxy ctx は 内部パラメータ指定不可
Dim crng As Range
Static svn As Long
Static myarray()
Static idx As Long
Static gyou As Long
Static mylim As Long
Dim cnt As Long
If seln > 0 Then
svn = seln
Erase myarray
i = 1
For Each crng In rng
ReDim Preserve myarray(1 To i)
myarray(i) = crng.Value
i = i + 1
Next
mylim = rng.Count
myx = 1
gyou = WorksheetFunction.Permut(rng.Count, seln)
permut_sp = gyou
ReDim ans(1 To gyou, 1 To svn)
ctx = 1
idx = 1
End If
cnt = 0
Do While myx <= mylim And idx <= gyou
If cnt > 0 And idx > 1 Then
For i = 1 To ctx - 1
ans(idx, i) = ans(idx - 1, i)
Next
End If
Do While myx <= mylim
retcode = 0
For i = 1 To ctx - 1
If ans(idx, i) = myarray(myx) Then
retcode = 1
End If
Next
If retcode = 0 Then Exit Do
myx = myx + 1
Loop
If myx > mylim Then Exit Do
ans(idx, ctx) = myarray(myx)
If ctx + 1 <= svn Then
Call permut_sp(ans(), , , 1, ctx + 1)
End If
myx = myx + 1
idx = idx + 1
cnt = cnt + 1
Loop
idx = idx - 1
End Function
以上ですが、もしかしたら、一つのセルに"abc"と入れたかったですか?
|
|