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

Arrays Excel VBA:生成一系列值的所有组合,arrays,vba,excel,Arrays,Vba,Excel,我从数学堆栈交换开始,首先确认一些数字(稍后将看到),现在我在这里尝试获得一些关于如何在VBA中完成(希望是简单的)任务的指导 长话短说:我有一个A1:A30的范围,数字是1,2,3,4…30。我的程序当前将这些值放入一个数组,对数组进行洗牌,然后将[0]与[1]进行“匹配”,将[2]与[3]进行“匹配”,将[4]与[5]进行“匹配”,依此类推,直到每个值配对为止。显然,这导致了总共15场比赛 我附上了一个屏幕截图,在一个单独的页面上显示了21次程序运行的结果。这里的技巧是,我的代码还确保在最左

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

长话短说:我有一个A1:A30的范围,数字是1,2,3,4…30。我的程序当前将这些值放入一个数组,对数组进行洗牌,然后将[0]与[1]进行“匹配”,将[2]与[3]进行“匹配”,将[4]与[5]进行“匹配”,依此类推,直到每个值配对为止。显然,这导致了总共15场比赛

我附上了一个屏幕截图,在一个单独的页面上显示了21次程序运行的结果。这里的技巧是,我的代码还确保在最左边的列中,所有ID在各自的行中只有唯一的匹配。不存在重复项。如果遵循第5行,您将看到每个值只显示一次。您还将看到我用红色圈出了特定程序运行的匹配项(每列)

问题是,我的洗牌效果很好,但30个数字意味着洗牌有30个阶乘不同的可能结果。然而,在每个号码与其他号码匹配之前,它只需要我运行29次程序

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

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

我意识到这个问题可能不是100%清楚,所以如果你需要澄清,请让我知道


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

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
子测试()
Dim x作为变体
尺寸i为整数,j为整数
作为字符串的Dim str
x=此工作簿。工作表(“表1”)。范围(“a1:a30”)
对于i=LBound(x,1)到UBound(x,1)
对于j=i+1到UBound(x,1)
如果str“”那么
str=str&“,”&x(i,LBound(x,2))&x(j,LBound(x,2))
其他的
str=x(i,LBound(x,2))&x(j,LBound(x,2))
如果结束
下一个j
接下来我
调试。打印str
端接头

感谢您的编辑建议!我只想逐行理解这句话:“很明显,这会导致总共15场比赛。”不幸的是,对我来说并不明显。什么与什么匹配?也就是说我们需要一些代码。这比任何解释(如果您的代码是按照某些标准编写的)都要好得多。双循环可以轻松创建所有可能的对,但我无法理解这与您的屏幕截图有什么关系。它只有435行(或列)的数据,每个行(或列)有两个数据项。“y”是什么?对不起,
y
是我想采用的另一种不同方法的数组。另外一种方法是,在第一次运行时不会出现错误的逗号。另外,我也不确定为什么会出现错误。这在我的机器上运行得很好。
mycompanions
是什么数据类型?其他的就没那么复杂了。我试着用一个简单的例子向OP展示如何生成这些组合。OP可以做一些工作来调整他们的需求。