我需要向第三方发送Excel文件以捕获数据,我不能使用VBA。
用户必须捕获至少一个字符串,默认情况下,最多可捕获10个字符串,例如D23:D32。 第33行是空行。 从第34行开始,必须捕获其他数据。我可以为D33或D34定义一个名称。
如果用户需要捕获10个以上的字符串,他可以插入其他行。
现在我需要连接用户捕获的字符串,用分号分隔它们。 澄清我的意思。如果用户无法插入行,则此公式将执行此操作:
=D23 & IF(D24="","",";"&D24) & IF(D25="","",";"&D25) & IF(D26="","",";"&D26)&IF(D27="","",";"&D27)&IF(D28="","",";"&D28)&IF(D29="","",";"&D29)&IF(D30="","",";"&D30)&IF(D31="","",";"&D31)&IF(D32="","",";"&D32)
有没有办法包含用户可能添加的行?
答案 0 :(得分:0)
简单的VBA用户定义函数将提供更简单,更强大的解决方案。
如果您可以确保您的用户只在列表的底部处插入行,则可以使用表格和隐藏列。
D22: Data
E22: Concatenation
E23: =D23
E24: =CONCATENATE(E23,";",D24)
将E24放到桌子底部。
显示结果的公式(在下面的屏幕截图中的D19中):
=LOOKUP(2,1/(RIGHT(Table1[concatenation],1)<>";"),Table1[concatenation])
因为这是一个表格,所以当插入行并添加其他条目时,公式将会扩展。但是,该方法需要用户方面的约束,因为结构很容易搞砸。
以下是它的外观,隐藏了列E NOT ,并且相邻单元格中显示了公式:
另一方面,可以设计一个简单的用户定义函数,将所有数据从D23返回到第一个空行,连接;或者如果 范围内的空白,可以用其他方式选择范围。
在范围内的空白,我的意思是D23:D32范围内的条目可能是空白的,有效数据低于该范围。例如。 D23,D24和D30中的有效数据,D25中没有任何内容:D29
以下是UDF的样子:
Function ConcatLines(rg As Range, Optional Delimiter As String = " ") As String
Dim C As Range
For Each C In rg
ConcatLines = ConcatLines & Delimiter & C
Next C
ConcatLines = Mid(ConcatLines, 2)
End Function
显示结果的公式,从D23到它下面的第一个空行,将是数组输入:
=ConcatLines(OFFSET($D$23,0,0,MATCH(TRUE,ISBLANK($D$23:$D$100),0)-1),";")
要数组输入公式,请在按输入时按住 ctrl-shift 。如果您正确执行此操作,Excel将在公式周围放置大括号 {...} 。
答案 1 :(得分:0)
建议的方法
=LOOKUP(2,1/(RIGHT(Table1[concatenation],1)<>";"),Table1[concatenation])
是非常好的。有another method suggested by Alan Wyatt表示不带Visual Basic / VBA的单元格值数量未知。他的方法适用于需要一组或多组要连接的单元格的情况,这很方便。
让列A包含一个对单元格进行分组的唯一标识符。
让B列包含要串联的项目。
A B
--------|----------
Alice The quick
Alice brown
Alice fox
Alice
Bruce Fourscore
Bruce and seven
Bruce years ago
Bruce
Bruce
Carol Yankee
Carol doodle
Carol dandy
C列用作 helper列。在C列中,放置:
C1: = B1
C2: = IF(A2=A1,C1 & ", " & B2, B2)
将此复制到所需的位置。
列D是结果列。在D列中,放置:
D1: =IF(LEN(C2)>LEN(C1),"",C1)
将此复制到所需的位置。
D列将显示串联或空白,您可以忽略它们。