我想要实现的结果是“C”列:
为了使此电子表格更容易复制/粘贴到您自己的电子表格中,以下是可复制粘贴的数据:
ID
1
2
3
4
5
6
7
8
9
Number
1000
300
800
300
200
ID
1
1
1
2
2
5
5
6
9
9
9
9
Number
100
300
700
200
100
600
300
300
900
100
100
300
我想让它能够检查每组唯一 ID 中的任何数字组合的总和是否等于列“A”中的唯一 ID 数字。例如,对于 ID 1,这是正确的,因为列“E”的 ID 1 中的“700”和“300”是一组可能的数字,它们的总和等于列 B 的 ID 1 中的 1000。但例如对于 ID 5,没有办法将给定的数字“600”和“300”相加得到“800”。
我知道我可以使用该COUNT
函数来计算“D”列中每个 ID 的数量,但由于这个数字可以是任何自然数(包括 0),所以我无法找到一种方法来创建一个IF
/SUM
循环,当计数达到编程中的最小值或最大值时,该COUNT
循环就会结束。我是否必须以某种方式创建一个包含各个 ID 及其各自编号的子矩阵,然后以某种方式启动循环?
我不确定我是否清楚地解释了我的想法。如有任何需要澄清的地方,请提出。谢谢。
答案1
因为你可能有最多 10 个 ID 号,而且总数可能由以下数字组成任何E 列中相应值(包括不连续的值),Dan 是对的:您需要一个 VBA 解决方案。
此用户定义函数 (UDF) 很大程度上归功于此来自@Gary's Student 的回答:
Function CheckSums(ID, TargetSum)
Dim NumBits As Long, NumSums As Long, RngStart As Integer
Dim Mask As String, i As Integer, j As Integer
Dim MaskArray() As Integer
Dim SumArray() As Integer
Dim TestSum As Long
NumBits = Application.WorksheetFunction.CountIf(Range("D:D"), ID)
NumSums = 2 ^ NumBits - 1
RngStart = Application.WorksheetFunction.Match(ID, Range("D:D"), 0)
ReDim MaskArray(NumSums - 1)
ReDim SumArray(NumSums - 1)
For i = 1 To NumSums
Mask = Application.WorksheetFunction.Dec2Bin(i, NumBits)
For j = 0 To NumBits - 1
MaskArray(j) = Mid(Mask, j + 1, 1)
If MaskArray(j) = 0 Then
SumArray(j) = 0
Else
SumArray(j) = Range("E" & RngStart + j)
End If
Next j
TestSum = Application.WorksheetFunction.Sum(SumArray())
If TestSum = TargetSum Then
CheckSums = True
Exit Function
End If
Next i
CheckSums = False
End Function
要使用此函数,请将其粘贴到新的 VBA 模块中,如下所示描述在这里。
然后这个公式从 C2 向下填充:
=IF(B2<>"",IF(CheckSums(A2,B2),"Yes",""),"")
给出如下图所示的结果。
答案2
編輯:
可能可以使用累计总和来解决这个问题。所以我尝试了SUMIF()
如下所示的方法。另外,请注意,我使用的数据与 OP 问题中的数据不同。
C2 中的这个公式给出了所示的结果。
=IF(B2<>"",IF(SUMIF($E$2:E2,E2,$B$2:B2)=B2,"Yes",""),"")
但请注意,的参数SUMIF()
指定为SUMIF(range,criteria,sum_range)
。
如您所见,上述公式对 B 列中的值进行求和,而不是对问题中指定的 E 列中的值进行求和。此公式查找并“求和” B 列中的目标值,并将其显示为计算出合法答案。
显然,如果您想获得问题的有效且明智的答案,您需要去别处寻找。