答案1
根据我对您查询的理解,我建议使用辅助列来解决问题。此外,您使用的是 Excel 2016,而我使用的是 Excel 2016 或更高版本中提供的名为 TEXTJOIN 的函数。
样本数据位于单元格 F3:F10 中。相邻的是辅助列,下一个单元格 H3 是最终输出。
G3 中的公式是
=IF(F3="-",IF(COUNTIF(F3:$F$10,"-")=COUNTA(F3:$F$10),"",IF(ISBLANK(F3),"",F3)),IF(ISBLANK(F3),"",F3))
沿着目标行将其向下拖动。
最终输出 H3 中的公式是
=TEXTJOIN(,TRUE,G3:G10)
请参阅下文了解其工作原理。
没有辅助列的解决方案
请参阅下面的屏幕截图。
F3 中的公式是
=TEXTJOIN(,TRUE,E3:INDEX(E3:E10,MAX(IF(E3:E10="-",0,ROW(E3:E10)))-ROW(E2)))
按CTRL++创建数组公式。公式将自动括在花括号中,以表明它是数组公式SHIFT。ENTER
如果您盯着第 1 行,则-ROW(E2)
不需要最后一部分。
答案2
我认为这可以通过一个简单的函数来实现,比如=LEFT(CONCATENATE(range,x)
x 是最后一个“-”,但我不知道如何正确获取 x。
因此,如果您对 VBA 满意,则可以使用“用户定义函数”。否则,您可能必须使用辅助列。
至于 UDF,你可以使用类似这样的方法:
Function TrimText(value_range As Range, trim_this As String) As String
Dim text As String, x As Long, i As Long, c As Variant
text = ""
i = 1
For Each c In value_range
text = text & c.Value
If Not c.Value = trim_this Then x = i
i = i + 1
Next c
TrimText = Left(text, x)
End Function
这只是一个简单的循环,计算最后一个字母的位置
并在输出中输入:=TrimText(your range,"-")
忽略我的语言对函数使用“;”而不是“,”
答案3
如果您有 Excel 2016+,则可以使用该CONCAT
函数。无需辅助列:
=CONCAT($A$4:INDEX($A:$A, LOOKUP(2,1/($A$4:$A$11<>"-"),ROW(A4:A11))))
算法
- 用于
LOOKUP
确定范围内不包含的最后一行-
A4
是第一个包含数据的单元格(行)- 使用该
INDEX
函数创建没有连字符的最后一个地址
如果要使用整列引用,或者可能包含最后一个连字符后的空格(要排除)的引用,则稍微修改一下以排除空格:
=CONCAT($A$4:INDEX($A:$A,LOOKUP(2,1/(($A:$A<>"-")*($A:$A<>"")),ROW($A:$A))))