在Excel中查找多个和的组合

在Excel中查找多个和的组合,excel,vba,Excel,Vba,我一直在尝试在Excel中制作一些东西,以找到多个和的组合 我有一个需要加在一起的数字列表,其范围在500-510或450-460之间 列表中只有两个数字可以用来求和。这些数字不能使用多次。给出多个结果的组合会很好。如果没有使用一个数字,它就可以了 我尝试了解算器插件和从这个网站上找到的一些其他技巧,但找不到可以给出多个答案的东西 有人知道这是否可能吗 可以根据您的需要进行修改并尝试 Sub test() Dim X, Y, TRw, GotNum, First, Second As Long

我一直在尝试在Excel中制作一些东西,以找到多个和的组合

我有一个需要加在一起的数字列表,其范围在500-510或450-460之间

列表中只有两个数字可以用来求和。这些数字不能使用多次。给出多个结果的组合会很好。如果没有使用一个数字,它就可以了

我尝试了解算器插件和从这个网站上找到的一些其他技巧,但找不到可以给出多个答案的东西


有人知道这是否可能吗

可以根据您的需要进行修改并尝试

Sub test()
Dim X, Y, TRw, GotNum, First, Second As Long
TRw = 1
With ThisWorkbook.ActiveSheet
For X = 1 To 100                   ' assumed col A1 to A100 is the list
GotNum = .Cells(X, 1).Value
    If (GotNum >= 450 And GotNum <= 460) Or (GotNum >= 500 And GotNum <= 510) Then
    .Cells(X, 1).Font.Color = RGB(255, 0, 0)
    First = GotNum
        For Y = X + 1 To 100
        GotNum = .Cells(Y, 1).Value
            If (GotNum >= 450 And GotNum <= 460) Or (GotNum >= 500 And GotNum <= 510) Then
            Second = GotNum
            TRw = TRw + 1
            .Cells(TRw, 3).Value = First     ' write 1st Number in Col C
            .Cells(TRw, 4).Value = Second    ' write 2nd Number in Col D
            .Cells(TRw, 5).Value = First + Second   ' write Sum of 1st & 2nd in Col C
            End If
        Next Y
    End If
Next X
End With
End Sub
子测试()
尺寸X,Y,TRw,GotNum,第一个,第二个
TRw=1
使用ThisWorkbook.ActiveSheet
对于X=1至100’,假设列A1至A100为列表
GotNum=.Cells(X,1).Value

如果(GotNum>=450,GotNum=500,GotNum=450,GotNum=500,GotNum我将其分为两个任务。第一个任务是简单地生成要在输入数组中测试的所有索引对。这对于递归过程来说相对简单。这个过程使用私有
类型
来存储索引对,但它可以适应使用其他一些me存储配对的方法:

Private Type Tuple
    ValueOne As Long
    ValueTwo As Long
End Type

Private Sub FindCombinations(elements As Long, ByRef results() As Tuple, _
                             Optional ByVal iteration As Long = 0)
    If iteration = 0 Then ReDim results(0)
    Dim idx As Long
    For idx = iteration To elements - 1
        Dim combo As Tuple
        With combo
            .ValueOne = iteration
            .ValueTwo = idx
        End With
        results(UBound(results)) = combo
        If iteration <> elements And idx <> elements Then
            ReDim Preserve results(UBound(results) + 1)
        End If
    Next

    If iteration < elements Then FindCombinations elements, results, iteration + 1
End Sub

我认为你的问题需要更清楚一点,你的预期输出是什么(你想要一个组合列表,还是仅仅为了看到结果?),但我的解决方案是这样的

我在Y列中列出了20个数字,并在X列中给它们分配了一个字母(a到t)

然后,我构建了a到t的组合矩阵,并输入了以下公式(下面是单元格C3,但可以复制并粘贴到矩阵的所有部分)

=IF(C$2=$B3,“x”,VLOOKUP(C$2,$x:$Y,2,FALSE)+VLOOKUP($B3,$x:$Y,2,FALSE))

然后,我使用条件格式设置单元格的颜色,如果它们满足求和的条件,您可以通过突出显示所有求和(单元格C3:V22)并转到

主/条件格式/新规则

拾取规则类型仅格式化包含

然后在下拉菜单中,在
/您的上限范围之间选择单元格值/

然后选择一种格式(通常填充背景色)

对“高”和“低”和各做一次。根据你想看的内容,你可以使颜色相同或不同

我还引用了第1行和a列中的数字作为参考。第1行的公式是(例如C1,但可以跨行复制)

=VLOOKUP(C2,$X:$Y,2,FALSE)

列A的公式是(例如A3)
=VLOOKUP(B3,$X:$Y,2,FALSE)


这种方法的优点是全部都在excel中(不需要代码),但缺点是很难获得结果列表。您可以使用不同的公式只返回总和(例如,返回文本“205+298”)当它满足其中一个条件时,将其从矩阵格式转换为单个列表仍然是一件痛苦的事情。使用VBA要容易得多

如果只能使用两个数字,那么“暴力”嵌套循环应该可以正常工作。列表中有多少个数字?它会随着时间的推移而变化,但最多有14个数字
Private Sub FindMatchingSets(testSet() As Long)
    Dim indices() As Tuple
    FindCombinations UBound(testSet) + 1, indices

    Dim idx As Long, results() As Tuple

    For idx = LBound(indices) To UBound(indices)
        Dim tupleSum As Long
        tupleSum = testSet(indices(idx).ValueOne) + testSet(indices(idx).ValueTwo)
        If indices(idx).ValueOne <> indices(idx).ValueTwo And _
           ((tupleSum >= 500 And tupleSum <= 510) Or _
           (tupleSum >= 450 And tupleSum <= 460)) Then
            Debug.Print testSet(indices(idx).ValueOne) & " + " & _
                testSet(indices(idx).ValueTwo) & " = " & tupleSum
        End If
    Next
End Sub
Private Sub Example()
    Dim test(4) As Long
    test(0) = 100
    test(1) = 200
    test(2) = 250
    test(3) = 260
    test(4) = 400

    FindMatchingSets test
End Sub