我难以制作一个CONCATENATE
公式,它以我想要的方式组合文本单元格。我想连接五个字段:Title,Forename,RegnalNumber,Surname和Alias,按顺序排列。我不是正则表达式专家,所以原谅可怜的格式化,但这是表达我想要实现的目标的粗略方式:
(title)? (forename) (regnalnumber)? (surname)?, (alias).
唯一不能为null的字段是forename字段,尽管它可能具有值“?”,在这种情况下它不应该在串联中输出任何内容,即它应该被视为空白。希望以下测试用例能够展示我想要实现的输出:右边的输出应该是它的样子:
| Title | Forename | RN | Surname | Alias | CONCATENATE |
+--------+----------+----+-----------+--------------+---------------------------------------+
| Ser | Jaime | | Lannister | Kingslayer | Ser Jaime Lannister, Kingslayer |
| | Pate | | | | Pate |
| Lord | ? | | Vance | | Lord Vance |
| King | Aerys | II | Targaryen | The Mad King | King Aerys II Targaryen, The Mad King |
| Lord | Jon | | Arryn | | Lord Jon Arryn |
| | Garth | | | Of Oldtown | Garth, Of Oldtown |
我已经尝试了多年,试图使这个连接工作,但一直没能做到正确。这是当前的公式,单元格引用被字段名称替换为可理解性:
=CONCATENATE(IF(Title<>"",Title&" ",""),IF(AND(Forename<>"",Forename<>"?"),Forename,""),IF(RN<>""," "&RN,""), IF(OR(AND(Forename<>"", Forename<>"?"), Surname<>"", RN<>""), " ",""), IF(Surname<>"",Surname,""),IF(AND(Alias<>"",OR(Alias<>"",AND(Forename<>"", Forename<>"?"),Surname<>"")),", "&Alias, Alias))
有一种情况不起作用:如果Surname和RN为null但Forename和Alias为非null。例如,如果Forename为Garth
,而别名为Of Oldtown
,则连接输出:Garth , Of Oldtown
。如果标题非空,则相同。它不应该在逗号之前有空格。
你能帮我修一下这个公式,以便按预期工作吗?如果你能找到一种简化它的方法,那就更好了!我知道我可能过于复杂了。我使用的是LibreOffice Calc 4.3.1.2,而不是Excel。
答案 0 :(得分:1)
解决这种情况的最佳方法是将问题分成多个简单的列,而不是一个庞大的复杂公式。请记住,您始终可以隐藏您不希望看到的列。
因此,为标题创建一个列=if(a2="","",a2&" ")
。
可以扩展所有其他列,除了:
=if(b2="?","",b2&" ")
=if(e2="","",", "&e2)
最后,只需将每个工作列与以下内容连接起来:=f2&g2&h2&i2&j2
。
这将问题分解为非常简单的组件,并使其易于调试。如果您想在以后添加额外的功能,可以轻松地将其中一个公式换成其他内容。
答案 1 :(得分:1)
我知道这只是一点乐趣,但我可以建议一种更算法的方法吗?
算法是: -
If a field is empty or ?, do nothing
Else
If concatenation so far is empty, add field to concatenation
Else
Add a space followed by the field to concatenation
导致G2中的这个公式: -
= IF(OR(A2 =“”,A2 =“?”),F2,IF(F2 =“”,A2,F2&amp;“”&amp; A2)
(需要在F列中放置单个撇号才能使其正常工作)
复制时的如下所示: -