我有一个类似的表:
102938 bob
038128 Marc
398401 Tom
298421 Jim
102938 Alex
102938 Junior
209381 Rex
398401 Oby
我想做一些=sumif(A:A, 102938,B:B)
应该返回“bobAlexJunior”作为结果的东西。但这不起作用,因为sum
适用于数字而不是字符串。如果我进行查找,它适用于字符串,但只找到第一行,而不是所有行。
你知道如何解决这个问题吗?
我有一个类似的表:
102938 bob
038128 Marc
398401 Tom
298421 Jim
102938 Alex
102938 Junior
209381 Rex
398401 Oby
我想做一些=sumif(A:A, 102938,B:B)
应该返回“bobAlexJunior”作为结果的东西。但这不起作用,因为sum
适用于数字而不是字符串。如果我进行查找,它适用于字符串,但只找到第一行,而不是所有行。
你知道如何解决这个问题吗?
这不一定特别优雅,但它可能是一个很好的起点。如果我正确理解您的要求,则可以归结为以下目标:
确定特定行是否应包含在连接字符串中(例如,如果左列 = 102938)
将第 2 列中的文本连接在一起(但仅适用于与条件匹配的那些行)
似乎 Excel 的 CONCATENATE 函数不接受范围(每个参数只有一个单独的单元格引用)。对于大量行,必须手动输入每个单元格显然会很烦人,因此我会考虑添加另一列以增量方式起作用。
例如,使用 A 列中的数字和 B 列中的名称创建第三列,该列将是累积连接字符串。
单元格 C1:
=IF(A1=102938,B1,"")
单元格 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
然后只需选择最后一行作为您的结果。
有两个简单的解决方案:
1)在第三列写一个简单的VLOOKUP公式并拖动它。然后您可以选择全部然后您可以使用第 4 列并通过使用对当前元素的第 3 列的引用来连接所有元素,并与第 4 列的前一个元素连接。
2) 使用 VBA,在第一列上使用 Range.Find() 并将其右侧的单元格添加到临时变量并返回它。
如果可能的话,使用单一公式会更加困难。我已经使用数组公式快速尝试了它并且无法成功(尽管我没有说这是不可能的)。
这是另一种方法,考虑到您对我的另一个答案的评论(您在其中描述有两张纸,一张包含带有代码的名称列表,一张包含唯一代码列表,每张都有一个串联的名称列表) .
您可以创建一个自定义函数,该函数接受范围和代码并返回连接的名称字符串。
将以下 VBA 粘贴到模块中(如果您不熟悉创建自定义函数,请参阅此链接):
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