Vba 所有唯一排列

Vba 所有唯一排列,vba,excel,permutation,Vba,Excel,Permutation,我发现了很多算法来获得一组数字中的每一个数字排列。我找不到的是给出这种排列的唯一列表 例如,数字123将产生: 123 132 213 231 312 321 但数字113只应产生(跳过重复项): 如果有用的话,我将在数组中使用8位数字 谢谢从单元格a2向下输入数据并运行宏 Sub UniqueNumber() Dim vDB, vR(), a Dim i As Integer, j As Integer, n As Long, z As Integer Dim k A

我发现了很多算法来获得一组数字中的每一个数字排列。我找不到的是给出这种排列的唯一列表

例如,数字123将产生:

123
132
213
231
312
321
但数字113只应产生(跳过重复项):

如果有用的话,我将在数组中使用8位数字


谢谢

从单元格a2向下输入数据并运行宏

Sub UniqueNumber()
    Dim vDB, vR(), a
    Dim i As Integer, j As Integer, n As Long, z As Integer
    Dim k As Integer, p As Integer
    Dim dic As Object
    Dim s As String

    Set dic = CreateObject("Scripting.Dictionary")
    vDB = Range("a2", Range("a" & Rows.Count).End(3))
    z = UBound(vDB, 1)
    ReDim Preserve vR(1 To 3)
    For i = 1 To z: For j = 1 To z: For k = 1 To z

        If i <> j And i <> k And j <> k Then
            vR(1) = vDB(i, 1)
            vR(2) = vDB(j, 1)
            vR(3) = vDB(k, 1)
            s = Join(vR, "")
            If dic.Exists(s) Then
            Else
                n = n + 1
                dic.Add s, s
            End If
        End If
    Next k: Next j: Next i
    a = dic.Keys
    Range("d2").CurrentRegion.Offset(1).Clear
    Range("d2").Resize(n) = WorksheetFunction.Transpose(a)
End Sub
Sub-UniqueNumber()
尺寸vDB,vR(),a
尺寸i为整数,j为整数,n为长,z为整数
将k作为整数,p作为整数
作为对象的dic
像线一样变暗
设置dic=CreateObject(“Scripting.Dictionary”)
vDB=范围(“a2”,范围(“a”和行数)。结束(3))
z=UBound(vDB,1)
ReDim保留虚拟现实(1到3)
对于i=1到z:j=1到z:k=1到z
如果i j和i k和j k那么
vR(1)=vDB(i,1)
vR(2)=vDB(j,1)
vR(3)=vDB(k,1)
s=连接(vR,“”)
如果存在dic,则
其他的
n=n+1
dic.添加s,s
如果结束
如果结束
下一个k:下一个j:下一个i
a=dic.钥匙
范围(“d2”)。当前区域。偏移量(1)。清除
范围(“d2”).Resize(n)=工作表函数.Transpose(a)
端接头

请修复您的标签-您使用的是VBA还是VB6?或者。我可以很容易地在两者之间进行转换。但是利用Excel的“删除重复项”功能的VBA解决方案无法在VB6中轻松实现,因此“我可以很容易地在两者之间进行转换”至少取决于删除[Excel VBA]标记。好的,很公平。效果很好。我以前从未使用过字典/键,我将仔细研究它的功能。谢谢。好的,如果你在处理较大的字符串,这不是获得排列的最佳方法,但是我可以将字典方法应用到另一个排列算法中,以获得我想要的。
Sub UniqueNumber()
    Dim vDB, vR(), a
    Dim i As Integer, j As Integer, n As Long, z As Integer
    Dim k As Integer, p As Integer
    Dim dic As Object
    Dim s As String

    Set dic = CreateObject("Scripting.Dictionary")
    vDB = Range("a2", Range("a" & Rows.Count).End(3))
    z = UBound(vDB, 1)
    ReDim Preserve vR(1 To 3)
    For i = 1 To z: For j = 1 To z: For k = 1 To z

        If i <> j And i <> k And j <> k Then
            vR(1) = vDB(i, 1)
            vR(2) = vDB(j, 1)
            vR(3) = vDB(k, 1)
            s = Join(vR, "")
            If dic.Exists(s) Then
            Else
                n = n + 1
                dic.Add s, s
            End If
        End If
    Next k: Next j: Next i
    a = dic.Keys
    Range("d2").CurrentRegion.Offset(1).Clear
    Range("d2").Resize(n) = WorksheetFunction.Transpose(a)
End Sub