Excel formula 按公式指定的文本单元格连接

Excel formula 按公式指定的文本单元格连接,excel-formula,concatenation,libreoffice-calc,Excel Formula,Concatenation,Libreoffice Calc,我很难生成一个以我想要的方式组合文本单元格的串联公式。我想将五个字段按顺序连接起来:Title、Forename、RegnalNumber、姓氏和别名。我不是正则表达式专家,请原谅我的格式设置不好,但这是一种表达我想要实现的目标的粗略方式: (title)? (forename) (regnalnumber)? (surname)?, (alias). 唯一不能为null的字段是forename字段,尽管它可能有值“?”,在这种情况下,它不应该在串联中输出任何内容,即它应该被视为空白。希望以下

我很难生成一个以我想要的方式组合文本单元格的
串联
公式。我想将五个字段按顺序连接起来:Title、Forename、RegnalNumber、姓氏和别名。我不是正则表达式专家,请原谅我的格式设置不好,但这是一种表达我想要实现的目标的粗略方式:

(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))
=串联(IF(Title“”、Title&“”、“”)、IF(AND(Forename“”、Forename“”、Forename“”)、IF(RN“”、&RN“”)、IF(OR(AND(Forename“”、Forename“”、姓氏“”)、“”、“”)、IF(姓氏“”、姓氏“”、IF(和(别名“”)或(别名“”、和(名字“”、Forename“”)、姓氏“”)、“”、“”、“”、别名)
有一种情况不起作用:如果姓氏和RN为空,但名字和别名为非空。例如,如果名字是
Garth
,别名是Oldtown的
,则串联输出:
Garth,Oldtown的
。如果标题为非空,则相同。逗号前不应该有空格


你能帮我修正这个公式,让它按预期工作吗?如果你能找到一种方法来简化它,那就更好了!我知道我可能把这件事复杂化了很多。我使用的是LibreOffice Calc 4.3.1.2,而不是Excel。

解决此类问题的最佳方法是将问题划分为多个简单列,而不是一个庞大复杂的公式。请记住,您始终可以隐藏不希望看到的列

因此,为标题创建一列,上面写着
=if(a2=“”,“”,a2&“)

可扩展到所有其他列,但以下列除外:

  • 对于名字,您希望包括“?”如下:
    =if(b2=“?”,“”,b2&“”)
  • 对于别名,您希望在其中包含前导“,”:
    =if(e2=“”,“,”,“&e2)
最后,只需将每个工作列连接为:
=f2&g2&h2&i2&j2


这将问题分解为非常简单的组件,并使其易于调试。如果您想在以后的阶段添加额外的功能,可以很容易地将其中一个公式替换为其他公式。

我知道这只是一点乐趣,但我可以建议一种更具算法性的方法吗

算法是:-

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中的公式:-

=如果(或(A2=“”,A2=“?”),F2,如果(F2=“”,A2,F2&=“”&A2)

(需要在F栏中加上单撇号以使其生效)

将其复制时,如下所示:-


顺便问一下,您测试单元格是否为空而不是不为空,或者这是个人偏好吗?太好了,我使用了您的方法并成功地提出了一个适合所有测试用例的concat。谢谢您的帮助。@LeoKing reasons I“test the cell is null”-个人偏好:1)输入更少,2)使“?”的测试看起来非常相似,3)猜测只是多年来用各种语言编写的代码。@LeoKing关于使用不同的列-我不能强调这在现实世界中有多大帮助。不需要使用长公式,而且这更容易测试、调试、改进等。这看起来确实是一个好方法,我给了你一个+1,但我已经实现了我需要用concat做的事情,Richard的方法对我来说很好。很好,Leo,谢谢。