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