Excel在没有VBA的情况下连接未知数量的单元格值

时间:2014-07-27 19:54:48

标签: excel

我需要向第三方发送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)

有没有办法包含用户可能添加的行?

2 个答案:

答案 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 ,并且相邻单元格中显示了公式:

enter image description here

另一方面,可以设计一个简单的用户定义函数,将所有数据从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列将显示串联或空白,您可以忽略它们。