英文:
In Excel using VBA or formula, how to generate in single cell a comma-separated list based on complex criteria?
问题
以下是已翻译的内容:
我正在寻找一个Excel公式或VBA解决方案,根据Table1中的数据和Table2中列N的输入,在Table2的Party列生成结果。Table2列N中的输入是与Table1数据行的顺序相对应的数字。Table2中的Party应该返回Table1中的ShortName,但如果ShortName为空,则Party应返回Name。谢谢你的帮助。
英文:
I am looking for an Excel formula or VBA solution that generates the result in Table2
column Party
based on the data in Table1
and the inputs in Table2
column N
. The inputs in column N
of Table2
are numbers corresponding to the order of the rows of data in Table1
. Party
in Table2
should return ShortName
from Table
, but if ShortName
is blank, then Party
in Table2
should return Name
.
Thank you for your help.
Table1
Name | ShortName |
---|---|
Jon Doe | Doe |
Robert Smith | |
Susan Miller | SM |
Donald Duck | |
Micky Mouse | The Mouse |
Kog Enterprises, Inc. | Kog |
Mechanical, Inc. |
Table2
N | Party |
---|---|
1,2,3 | Doe,Robert Smith,SM |
4 | Donald Duck |
3,5,6 | SM,The Mouse,Kog |
2,3,5,6,7 | Robert Smith,SM,The Mouse,Kog,Mechanical, Inc. |
The formula below works, but only for ShortName
; it does not check ShortName
and, if blank, default to Name
:
=TEXTJOIN(",",TRUE,
INDEX(FILTER(Table1[ShortName],Table1[ShortName]<>""),
MATCH(NUMBERVALUE(TEXTSPLIT([@N2],,",",TRUE,1)),
ROW(Table1[ShortName])-ROW(Table1[[#Headers],[ShortName]]),
0)))
The formula below correctly switches between Name
and ShortName
, but cannot handle multiple comma-separated values in Table2
column N
:
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))
The formula above also has other features not discussed here to help keep this post as simple as possible.
答案1
得分: 2
匹配数据按索引
- Party 列的第1行中的公式:
=IFERROR(TEXTJOIN(", ",,INDEX(IF(
LEN(Table2[ShortName])>0,Table2[ShortName],Table2[Name]),
TEXTSPLIT([@N],","))),"")
-
Excel(结构化)表不支持自动填充公式。在输入公式之前,请清除 Party 列的内容,整个列将被填充。
英文:
Match Data by Indexes
- The formula in the 1st row of the Party column:
=IFERROR(TEXTJOIN(", ",,INDEX(IF(
LEN(Table2[ShortName])>0,Table2[ShortName],Table2[Name]),
TEXTSPLIT([@N],","))),"")
- Excel (structured) tables do not support spilling formulas. Clear the contents of the Party column before entering the formula and the whole column will be populated.
答案2
得分: 2
以下是翻译好的内容:
另一种选择是使用ARRAYTOTEXT()
和XLOOKUP()
。
• 在单元格E2
中使用的公式
=LET(
α, Table1[ShortName],
σ, Table1[Name],
ARRAYTOTEXT(
XLOOKUP(
TEXTSPLIT(
[@N],
",",
"""
) * 1,
ROW(α) - 1,
IF(α = """, σ, α)
)
)
)
注意: 由于您在帖子中提到了Table1
和Table2
,因此溢出数组公式不适用于结构引用
,因此上述公式需要向下填充,或者由于表结构
的行为,它将自动向下填充。
英文:
Another alternative using ARRAYTOTEXT()
& XLOOKUP()
• Formula used in cell E2
=LET(
α, Table1[ShortName],
σ, Table1[Name],
ARRAYTOTEXT(
XLOOKUP(
TEXTSPLIT(
[@N],
,
","
) * 1,
ROW(α) - 1,
IF(α = "", σ, α)
)
)
)
Note: Since you have mentioned in your post that you have Table1
& Table2
hence spill array formulas won't work with Structured References
, therefore the above formula needs to be filled down or it will automatically fill down because of Table Structured
behaviors.
答案3
得分: 1
以下是翻译好的部分:
假设没有根据您的标签进行版本约束,以下似乎可以生成您所描述的内容:
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))
)
)
)
)
您还可以通过将输出设置为“表格”来避免填充。通过在“Party”列的第一行输入公式,公式将自动向下填充。
英文:
Assuming no version constraints as per your tags, the following seems to produce what you describe:
F2: =TEXTJOIN(
", ",
TRUE,
LET(
r, --TEXTSPLIT(E2, ","),
f, CHOOSEROWS(Table18, r),
IF(TAKE(f, , -1) = "", TAKE(f, , 1), TAKE(f, , -1))
)
)
and fill down
Or as a single formula entered only in 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))
)
)
)
)
You can also avoid filling down by setting your output in a Table
. By entering the formula in the first row of the Party
column, the formula will fill down automagically.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论