Excel VBA:生成一系列值的所有组合

时间:2017-04-28 15:44:51

标签: arrays excel vba excel-vba

我开始在数学堆栈交换中首先确认一些数字(稍后会看到),现在我在这里尝试获得一些关于如何在VBA中完成(希望简单)任务的指导

长话短说:我有一个范围A1:A30,数字1,2,3,4 ...... 30。我的程序当前将这些值放入一个数组中,对数组进行混洗,然后将[0]与[1]“匹配”[a]与[3],[4]与[5]进行“匹配”,所以在线上,直到每个值配对为止。这显然导致总共15场比赛。

我附上了一个屏幕截图,显示了21个程序运行的单独表格上的结果。这里的诀窍是我的代码还确保在最左边的列中,所有ID在它们各自的行中只有唯一的匹配。没有重复项。如果您按照第5行,您会看到每个值只出现一次。你还会看到我用特定的程序运行(每列)用红色圈出红色。

问题是,我的shuffle工作得很好,但是30个数字意味着有30个Factorial不同的可能结果。但是,在每个数字与其他所有数字匹配之前,它只需要我运行29次程序。

总共有435种可能的结果30选择2.我想制作一张类似于我的截图的表格,概述所有可能的435结果。换句话说,我想要任意数量的n选择2的所有可能结果。

我的问题:是否有一种优雅/简洁的方法来设置某种循环来生成所有435个选项。

我发现问题可能不是100%明确,所以如果您需要澄清,请告诉我。

Screenshot of the worksheet!

1 个答案:

答案 0 :(得分:0)

假设您在A1:A30范围内有数字1-30,此代码会生成所有组合的字符串并将其打印到即时窗口。如果您需要使用数字进行数学运算而不是连接成字符串,则只需要将循环中的逻辑从添加到字符串更改为执行操作。

Sub test()
Dim x As Variant
Dim i As Integer, j As Integer
Dim str As String

x = ThisWorkbook.Sheets("Sheet1").Range("a1:a30")

For i = LBound(x, 1) To UBound(x, 1)
    For j = i + 1 To UBound(x, 1)
        If str <> "" Then
            str = str & "," & x(i, LBound(x, 2)) & x(j, LBound(x, 2))
        Else
            str = x(i, LBound(x, 2)) & x(j, LBound(x, 2))
        End If
    Next j
Next i

Debug.Print str
End Sub