excel sum if string

时间:2012-11-18 22:38:28

标签: excel

我有一张类似的表:

102938 bob
038128 Marc
398401 Tom
298421 Jim
102938 Alex
102938 Junior
209381 Rex
398401 Oby

我想制作像=sumif(A:A, 102938,B:B)这样的东西,它应该返回“bobAlexJunior”作为结果。但这不起作用,因为sum使用数字而非字符串。如果我使用查找,它可以使用字符串,但只查找第一行,而不是所有行。

您对如何解决此问题有所了解吗?

3 个答案:

答案 0 :(得分:0)

有两个简单的解决方案:

1)在第三列中写一个简单的VLOOKUP公式并拖动它。然后你可以选择all然后你可以使用第4列并通过使用对第3列的当前元素的引用来连接所有元素,并与第4列的前一个元素连接。

2)使用VBA,在第一列上使用Range.Find(),并将右侧的单元格添加到临时变量并返回。

如果可能,使用单一公式会更难。我已经使用数组公式快速尝试并且无法成功(尽管我不说这是不可能的)。

答案 1 :(得分:0)

这不一定特别优雅,但它可能是一个很好的起点。如果我正确理解您的要求,可归结为以下目标:

  1. 确定连接字符串中是否应包含特定行(例如,如果左列= 102938)

  2. 将第二列中的文本连接在一起(但仅限于那些符合条件的行)

  3. 似乎Excel的CONCATENATE函数不接受范围(每个参数只有一个单独的单元格引用)。对于大量的行,显然必须手动输入每个单元格,因此我会考虑添加另一个逐渐执行的列。

    例如,使用A列中的数字和B列中的名称创建第三列,它将是累积连接字符串。

    Cell C1:

    =IF(A1=102938,B1,"")
    

    Cell C2:

    =IF(A2=102938,CONCATENATE(C1, B2),C1)
    

    细胞C3,C4等向下重复C2的公式。

    所以表格看起来像这样:

    102938      bob     bob
    38128       Marc    bob
    398401      Tom     bob
    298421      Jim     bob
    102938      Alex    bobAlex
    102938      Junior  bobAlexJunior
    209381      Rex     bobAlexJunior
    398401      Oby     bobAlexJunior
    

    然后,这只是选择最后一行作为你的副本。

答案 2 :(得分:0)

这是另一种方法,考虑到你对我的另一个答案的评论(你描述了有两个表,一个包含带代码的名称列表,另一个包含唯一代码列表,每个代码都有一个连续列表名字)。

您可以创建一个接受范围和代码的自定义函数,并返回连接的名称字符串。

将以下VBA粘贴到模块中(如果您不熟悉创建自定义函数,请参阅this link):

Function NamesWithCode(PeopleCodes As Range, CodeToMatch As String)
    Dim Result As String
    For Each Row In PeopleCodes.Rows
        If Row = CodeToMatch Then
            Result = Result & Row.Offset(0, 1)
        End If
    Next
    NamesWithCode = Result
End Function

假设您的第一个工作表名为“名称”,并且有两个列,如您指定的那样:

102938  bob
38128   Marc
398401  Tom
298421  Jim
102938  Alex
102938  Junior
209381  Rex
398401  Oby

在第二个工作表(比如“代码”)中,您可以使用新的NamesWithCode函数来查找每个代码的名称列表,方法是从第一个工作表中传入完整的表格以及查找每一行的代码:

=NamesWithCode(Names!$A$1:$A$8, A2)

所以输出将是:

Code    Names With Code
102938  bobAlexJunior
38128   Marc
398401  TomOby
298421  Jim