无论VBA中的元素数量如何,都可以从数组生成所有可能组合的数组

时间:2018-08-03 15:37:11

标签: vba excel-vba recursion

我需要输入多个变量的最大值和最小值,并生成包含每个可能组合的数组。

示例:输入数组

[A min, A max        
 B min, B max]

应该返回

[A min, B min      
 A min, B max                                               
 A max, B min                                   
 A max, B max]

我能够做到这一点,但是只能使用3个以下的变量,但是无法方便地扩展它。我不知道如何使它适用于任何数量的变量,例如是否有一个C也具有最大值和最小值。

有人有建议吗?

编辑: 如果这对任何人都有用,则此功能的目的是找到基于变量的表达式的极限。第一个数组是根据表达式中包含的变量生成的,然后将这些变量替换为第二个数组中的值。因此,从本质上讲,每一项都经过计算以找到可能的最高结果和可能的最低结果。

因此创建第一个数组的输入可能类似于:'A + B' 然后,对于第二个数组中的每一行,将用指令值替换“ A”和“ B”。

1 个答案:

答案 0 :(得分:0)

这是一个VBA函数,可用于解决您的问题的一种解释:

Function Products(A As Variant) As Variant
    'A is assumed to be a 2-column 1-based array
    'The function returns another 2-column 1-based array
    'Where each successive 4 rows gives the Cartesian product
    'of two of the rows of A, with the earlier row
    'providing the first element and the latter row the second

    Dim i As Long, j As Long, k As Long, n As Long
    Dim P As Variant

    n = UBound(A, 1)
    ReDim P(1 To 2 * n * (n - 1), 1 To 2)

    k = 1
    For i = 1 To n - 1
        For j = i + 1 To n
            P(k, 1) = A(i, 1)
            P(k, 2) = A(j, 1)
            P(k + 1, 1) = A(i, 1)
            P(k + 1, 2) = A(j, 2)
            P(k + 2, 1) = A(i, 2)
            P(k + 2, 2) = A(j, 1)
            P(k + 3, 1) = A(i, 2)
            P(k + 3, 2) = A(j, 2)
            k = k + 4
        Next j
    Next i
    Products = P
End Function

使用方式:Range("C1:D12").Value = Products(Range("A1:B3").Value)