检查某一列中任意数量的单元格的总和是否与另一列中的单元格匹配

检查某一列中任意数量的单元格的总和是否与另一列中的单元格匹配

我想要实现的结果是“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 列中的目标值,并将其显示为计算出合法答案。

显然,如果您想获得问题的有效且明智的答案,您需要去别处寻找。

相关内容