凯西(Kathy)有一个工作表,其中包含仓库中所有零件的信息。在此表中,零件号在A列中以格式12345 XXX显示,其中XXX表示位置代码。这意味着她可以在工作表上有多个相同零件号的条目,但是每个条目代表该零件的不同位置。凯西(Kathy)需要一个公式,求和与每个零件号关联的值,而不管其位置代码如何。因此,她需要一种求和与零件12345 ABC,12345 DEF,123456 GHI等有关的数量列的方法。

她需要一种方法来做到这一点,而又不会将位置代码拆分到其他列中。

获得所需答案的方法不只一种。对于本技巧中的示例,假设部件号在A列中(如Kathy所指示),并且每个部件的数量均在B列中。仅基于一个列A中每个单元格的一部分。此外,您可以在单元格D2中放入所需的部件号(减去位置代码)。

第一种可能的解决方案是以这种方式使用SUMPRODUCT函数:

=SUMPRODUCT(--(VALUE(LEFT(A2:A49,FIND(" ",A2:A49)))=D2),B2:B49)

此公式检查范围A2:A49中的值。您应该确保该范围反映了您实际数据的范围。如果您对公式进行一般化以使其查看A和B的所有列(如在A:A和B:B中一样),则会收到#VALUE错误,因为它试图将公式应用于列中的空单元格。

您可以通过使用如下数组公式来获得类似的结果:

=SUM(B:B*(LEFT(A2:A49,5)=TEXT(D2,"@")))

再次记住,这是一个数组公式,因此您需要通过按Shift + Ctrl + Enter进行输入。还要注意,此公式将D2中的值转换为文本以进行比较。在上一个公式中未执行此操作,因为在那里使用VALUE函数将从A列中选取的子字符串转换为数字值。

您还可以使用DSUM函数构造一个工作公式。假设部件号(A列)在单元格A1中具有列标题。

将此列标题(如“ Part Num”)复制到工作表中的另一个单元格中,如单元格D1。在单元格D2中,输入零件编号(不带其位置代码),然后输入星号。例如,您可以在单元格D2中输入“ 12345 *”(不带引号)。建立该规范后,您可以使用以下公式:

=DSUM($A$1:$B$49,$B$1,D1:D2)

此公式使用单元格D2中的规范(字符12345后跟任何字符)作为键,应将B列中的值相加。

最后,如果在单元格D2中具有与DSUM方法相同的规范,则可以通过以下方式使用非常简单的SUMIF函数:

=SUMIF(A:A,D2,B:B)

请注意,这种方法允许您在公式中使用完整的列范围(A:A和B:B)。

如果零件编号(在A列中)的格式不一致,那么最好创建一个用户定义的函数来查找数量。例如,如果零件编号的长度不总是相同,或者零件编号可以同时包含数字和字母或破折号,那么UDF是可行的方法。以下示例效果很好;它要求值中至少存在一个空格。 (Kathy表示空格将零件号与位置代码分隔开。)

Function AddPrtQty(ByVal Parts As Range, PartsQty As Range, _   FindPart As Variant) As Long     Dim Pos As Integer     Dim Pos2 As Integer     Dim i As Long     Dim tmp As String     Dim tmpSum As Long     Dim PC As Long

PC = Parts.Count     If PartsQty.Count <> PC Then         MsgBox "Parts and PartsQty must be the same length", vbCritical         Exit Function     End If

For i = 1 To PC         Pos = InStr(1, Parts(i), " ")

Pos2 = InStr(Pos + 1, Parts(i), " ")



If Pos2 > Pos And Len(Parts(i)) > Pos + 1 Then             tmp = CStr(Trim(Left(Parts(i), Pos2 - 1)))

ElseIf Pos > 0 And Len(Parts(i)) > 0 Then             tmp = CStr(Trim(Left(Parts(i), Pos - 1)))

End If

If CStr(Trim(tmp)) = CStr(Trim(FindPart)) Then             tmpSum = tmpSum + PartStock(i)

End If     Next i

AddPrtQty = tmpSum End Function

要使用该功能,请在工作表中使用两个范围和所需的部件号进行调用:

=AddPrtQty(A2:A49,B2:B49,"GB7-QWY2")

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(11468)适用于Microsoft Excel 97、2000、2002和2003。您可以在以下位置找到用于Excel功能区界面(Excel 2007及更高版本)的本技巧的版本:

链接:/ excelribbon-Summing_Based_on_Part_of_the_Information_in_a_Cell [基于单元中部分信息的求和]。