Excel子例程,可从数据集中创建所有可能的组合,但不包括重复项

时间:2018-10-08 15:10:37

标签: excel vba excel-vba subroutine

有人知道如何将由7列组成的数据集转换为所有可能组合的例程吗?

这样的组合由7个数字组成-> 1 | 3 | 8 | 10 | 35 | 40 | 50

例程需要查看第一个表,并列出所有可能的组合的列表,但第二个表中的组合中不包括重复编号。请看图片。

左侧表格包含需要重新组合的组合,右侧表格包含所有可能的组合。

enter image description here

1 个答案:

答案 0 :(得分:0)

我会做类似的事情:

选项的数量为6 ^ 7,因此会有很多情况:279936 要获得所有这些,您应该遍历它们。 首先,我们应该找到所有选项。 为了生成包括重复项在内的所有可能的组合,问题与在底数为6的情况下获得所有可能的7位数长数字相同(因为每列中有6个数字)

在较新的excel中,您可以使用BASE函数,但是如果无法访问它,则可以使用以下函数: 如果您可以稍微修改一下代码,则可以调用原始表的值而不是0-5数字。

然后只删除重复项。

Sub generateAllBase6()
Dim i As Double 'number tries
Dim n As String ' the number of item from the column 1-7

For i = 0 To 279936 - 1
n = ConvertBase10(i, "012345")
    For k = 1 To 7
        If Len(n) < k Then
            Cells(i + 2, k) = 0
        Else
            Cells(i + 2, k) = Right(Left(n, k), 1)
        End If
    Next k
Next i
End Sub


Public Function ConvertBase10(ByVal d As Double, ByVal sNewBaseDigits As String) As String
    Dim S As String, tmp As Double, i As Integer, lastI As Integer
    Dim BaseSize As Integer
    BaseSize = Len(sNewBaseDigits)
    Do While Val(d) <> 0
        tmp = d
        i = 0
        Do While tmp >= BaseSize
            i = i + 1
            tmp = tmp / BaseSize
        Loop
        If i <> lastI - 1 And lastI <> 0 Then S = S & String(lastI - i - 1, Left(sNewBaseDigits, 1)) 'get the zero digits inside the number
        tmp = Int(tmp) 'truncate decimals
        S = S + Mid(sNewBaseDigits, tmp + 1, 1)
        d = d - tmp * (BaseSize ^ i)
        lastI = i
    Loop
    S = S & String(i, Left(sNewBaseDigits, 1)) 'get the zero digits at the end of the number
    ConvertBase10 = S
End Function

我在这里找到了功能:http://www.freevbcode.com/ShowCode.asp?ID=6604