我有一张类似的表:
102938 bob
038128 Marc
398401 Tom
298421 Jim
102938 Alex
102938 Junior
209381 Rex
398401 Oby
我想制作像=sumif(A:A, 102938,B:B)
这样的东西,它应该返回“bobAlexJunior”作为结果。但这不起作用,因为sum
使用数字而非字符串。如果我使用查找,它可以使用字符串,但只查找第一行,而不是所有行。
您对如何解决此问题有所了解吗?
答案 0 :(得分:0)
有两个简单的解决方案:
1)在第三列中写一个简单的VLOOKUP公式并拖动它。然后你可以选择all然后你可以使用第4列并通过使用对第3列的当前元素的引用来连接所有元素,并与第4列的前一个元素连接。
2)使用VBA,在第一列上使用Range.Find(),并将右侧的单元格添加到临时变量并返回。
如果可能,使用单一公式会更难。我已经使用数组公式快速尝试并且无法成功(尽管我不说这是不可能的)。
答案 1 :(得分:0)
这不一定特别优雅,但它可能是一个很好的起点。如果我正确理解您的要求,可归结为以下目标:
确定连接字符串中是否应包含特定行(例如,如果左列= 102938)
将第二列中的文本连接在一起(但仅限于那些符合条件的行)
似乎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