VBAにおける順列を生成する
質問
この質問はに尋ねられましたが、Excelに簡単に適用できる答えが見つかりませんVBA。
基本的に私はこのポスターが尋ねたもの、しかしVBAで正確にやりたいです。各行は、0または1のいずれかであり得るN変数の異なる置換を表す配列N x 2 ^ nを作成したい。
これは年齢のために遊んでいます、そして、ループの負荷をかけてセットNのために十分なのは簡単ですが、変数n私は機能するものは何も見つかりません。
任意のコードやこれについて行く方法の提案は大いに感謝されるでしょう!
解決
これは a
の値をリストします。Sub EasyAsCounting()
Dim N As Long, M As Long, K As Long
N = Application.InputBox(Prompt:="Enter N", Type:=1)
M = 2 ^ N - 1
For K = 0 To M
Cells(K + 1, 1) = "'" & Application.WorksheetFunction.Dec2Bin(K, N)
Next K
End Sub
.
編集#1
これは vba のみに配列を格納します:
Sub EasyAsCounting()
Dim N As Long, M As Long, K As Long, ary, s As String
Dim J As Long
N = Application.InputBox(Prompt:="Enter N", Type:=1)
M = 2 ^ N - 1
ReDim ary(1 To M + 1, 1 To N)
For K = 0 To M
s = Application.WorksheetFunction.Dec2Bin(K, N)
For J = 1 To N
ary(K + 1, J) = Mid(s, J, 1)
Next J
Next K
'
'display the array
'
msg = ""
For K = 1 To M + 1
For J = 1 To N
msg = msg & " " & ary(K, J)
Next J
msg = msg & vbCrLf
Next K
MsgBox msg
End Sub
. 他のヒント
これはあなたがExcelにない場合はその機能にアクセスできないのではありません。または511より大きい番号がある場合は
Sub MakePerms()
Dim i As Long, j As Long
Dim n As Long
Dim aPerms() As Byte
Dim lCnt As Long
Dim sOutput As String
Const lVar As Long = 4
ReDim aPerms(1 To 2 ^ lVar, 1 To lVar)
For i = 0 To UBound(aPerms, 1) - 1
n = i
lCnt = lVar
aPerms(i + 1, lCnt) = CByte(n Mod 2)
n = n \ 2
Do While n > 0
lCnt = lCnt - 1
aPerms(i + 1, lCnt) = CByte(n Mod 2)
n = n \ 2
Loop
Next i
For i = LBound(aPerms, 1) To UBound(aPerms, 1)
sOutput = vbNullString
For j = LBound(aPerms, 2) To UBound(aPerms, 2)
sOutput = sOutput & Space(1) & aPerms(i, j)
Next j
Debug.Print sOutput
Next i
End Sub
. 所属していません StackOverflow