【问题标题】:Generating permutations in VBA在 VBA 中生成排列
【发布时间】:2014-08-01 15:00:51
【问题描述】:

This question has been asked before,但我找不到可以轻松适用于 Excel VBA 的答案。

基本上我想完全按照这张海报的要求做,但在 VBA 中。我想创建一个数组,n x 2^n,其中每一行代表 n 个变量的不同排列,可以是 0 或 1。

我已经玩了很长时间了,对于带有大量循环的集合 n 很容易做到,但对于变量 n,我找不到任何有效的方法。

我们将不胜感激任何代码或只是有关方法的建议!

【问题讨论】:

  • 这完全等价于从 0 到 2^(n-1) 的 n 位整数的位模式。
  • 由于这在 Python 中要容易得多并且已经实现,您可能需要检查 ExcelPython 加载项。基本上它使用 COM 技术包装 Python 函数,您可以从 VBA 调用它们。我还没有在生产环境中使用它,但它可能值得一试。
  • @beaker 这一切都很好,但关键是我不知道如何生成它们......

标签: algorithm vba excel


【解决方案1】:

这将列出 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

【讨论】:

  • 谢谢,这很有用。我不知道那个公式。但是,我想将值保留在数组中以进一步操作,而不是填充工作表。我可以将结果拆分为单独的数组元素吗?
  • 其实我可能不需要那个。感谢您的回答!
【解决方案2】:

如果您不在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多