在Excel中使用VBA或公式,如何在单个单元格中生成基于复杂条件的逗号分隔列表?

yh2wf1be  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(145)

我正在寻找一个Excel公式或VBA解决方案,它可以根据Table1中的数据和Table2N中的输入生成Table2Party中的结果。Table2的列N中的输入是与Table1中的数据行的顺序相对应的数字。Table2中的Party应该从Table返回ShortName,但如果ShortName为空,则Table2中的Party应该返回Name。谢谢你的帮助。
表1
| 姓名|短名称|
| - -----|- -----|
| 乔恩·多伊|多伊|
| 罗伯特·史密斯||
| 苏珊·米勒|SM|
| 唐老鸭||
| 米老鼠|老鼠|
| Kog Enterprises,Inc.|科格|
| 机械公司||
表2
| N|派对|
| - -----|- -----|
| 一二三|Doe,Robert Smith,SM|
| 4|唐老鸭|
| 三五六|SM,老鼠,Kog|
| 二三五六七|Robert Smith,SM,The Mouse,Kog,Mechanical,Inc.|
下面的公式有效,但仅适用于ShortName;它不检查ShortName,如果为空,则默认为Name

=TEXTJOIN(",",TRUE,
INDEX(FILTER(Table1[ShortName],Table1[ShortName]<>""),
MATCH(NUMBERVALUE(TEXTSPLIT([@N2],,",",TRUE,1)),
ROW(Table1[ShortName])-ROW(Table1[[#Headers],[ShortName]]),
0)))

下面的公式可以在NameShortName之间正确切换,但不能处理Table2N中的多个逗号分隔值:

IF(INDEX(FILTER(CHOOSE(IF(LOWER(LEFT([@N2],1))="-",1,2),Table3[[Name]:[ShortName]],Table1[[Name]:[ShortName]]),CHOOSE(IF(LOWER(LEFT([@N2],1))="-",1,2),Table3[Name],Table1[Name])<>""),SUBSTITUTE(LOWER([@N2]),"-",""),3)=0,INDEX(FILTER(CHOOSE(IF(LOWER(LEFT([@N2],1))="-",1,2),Table3[[Name]:[ShortName]],Table1[[Name]:[ShortName]]),CHOOSE(IF(LOWER(LEFT([@N2],1))="-",1,2),Table3[Name],Table1[Name])<>""),SUBSTITUTE(LOWER([@N2]),"-",""),1),INDEX(FILTER(CHOOSE(IF(LOWER(LEFT([@N2],1))="-",1,2),Table3[[Name]:[ShortName]],Table1[[Name]:[ShortName]]),CHOOSE(IF(LOWER(LEFT([@N2],1))="-",1,2),Table3[Name],Table1[Name])<>""),SUBSTITUTE(LOWER([@N2]),"-",""),3))

上面的公式还有其他没有在这里讨论的特性,以帮助保持这篇文章尽可能简单。

u7up0aaq

u7up0aaq1#

使用ARRAYTOTEXT()XLOOKUP()的另一种替代方案

·单元格E2中使用的公式

=LET(
    α, Table1[ShortName],
    σ, Table1[Name],
    ARRAYTOTEXT(
        XLOOKUP(
            TEXTSPLIT(
                [@N],
                ,
                ","
            ) * 1,
            ROW(α) - 1,
            IF(α = "", σ, α)
        )
    )
)

**注意:**由于您在帖子中提到您有Table1Table2,因此溢出数组公式不适用于Structured References,因此需要填写上述公式,否则它会因Table Structured行为而自动填写。

to94eoyn

to94eoyn2#

假设您的标签没有版本限制,下面的代码似乎会产生您所描述的内容:

F2: =TEXTJOIN(
    ", ",
    TRUE,
    LET(
        r, --TEXTSPLIT(E2, ","),
        f, CHOOSEROWS(Table18, r),
        IF(TAKE(f, , -1) = "", TAKE(f, , 1), TAKE(f, , -1))
    )
)

填写
或仅在F2中输入单个公式:

=BYROW(
    E2:E5,
    LAMBDA(arr,
        TEXTJOIN(
            ", ",
            TRUE,
            LET(
                r, --TEXTSPLIT(arr, ","),
                f, CHOOSEROWS(Table18, r),
                IF(TAKE(f, , -1) = "", TAKE(f, , 1), TAKE(f, , -1))
            )
        )
    )
)

您也可以通过在Table中设置输出来避免填充。通过在Party列的第一行输入公式,公式将自动填充。

ibrsph3r

ibrsph3r3#

按索引匹配数据

  • Party 列第1行的公式:
=IFERROR(TEXTJOIN(", ",,INDEX(IF(
    LEN(Table2[ShortName])>0,Table2[ShortName],Table2[Name]),
        TEXTSPLIT([@N],","))),"")
  • Excel(结构化)表不支持溢出公式。在输入公式之前清除 Party 列的内容,整个列将被填充。

相关问题