Excel: 如何按照模式连接单元格? (单元格不在同一行!)
Excel: How to concatenate cells following a pattern? (cells are not in the same row!)
我有以下 excel:
预期结果:
我试过幂查询,excel 函数,但我无法得到我需要的结果。
你认为没有 vba 有可能实现吗?
谢谢!
编辑 2:根据您评论中的文件,我重构了公式以使用空格
基于此单元格布局:
使用这个公式:
=TEXTJOIN("-",TRUE,
IFERROR(INDEX(M:M3,MAX((M:M3<>"")*(ROW(M:M3)))-ROW(M)+1),""),
IFERROR(IF(MAX((N:N3<>"")*(ROW(N:N3)))-ROW(N)+1<MAX((M:M3<>"")*(ROW(M:M3)))-ROW(M)+1,"",INDEX(N:N3,MAX((N:N3<>"")*(ROW(N:N3)))-ROW(N)+1)),""),
IFERROR(IF(OR(MAX((O:O3<>"")*(ROW(O:O3)))-ROW(O)+1<MAX((M:M3<>"")*(ROW(M:M3)))-ROW(M)+1,MAX((O:O3<>"")*(ROW(O:O3)))-ROW(O)+1<MAX((N:N3<>"")*(ROW(N:N3)))-ROW(N)+1),"",INDEX(O:O3,MAX((O:O3<>"")*(ROW(O:O3)))-ROW(O)+1)),""),
IF(P3<>"",IFNA(INDEX(P:P3,MAX((P:P3<>"")*(ROW(P:P3)))-ROW(P)+1),""),""))
编辑 3:如果可用,可以使用 LET
函数来简化它
=LET(
a,MAX((M:M3<>"")*(ROW(M:M3)))-ROW(M)+1,
b,MAX((N:N3<>"")*(ROW(N:N3)))-ROW(N)+1,
c,MAX((O:O3<>"")*(ROW(O:O3)))-ROW(O)+1,
d,MAX((P:P3<>"")*(ROW(P:P3)))-ROW(P)+1,
TEXTJOIN("-",TRUE,
IFERROR(INDEX(M:M3,a),""),
IFERROR(IF(b<a,"",INDEX(N:N3,b)),""),
IFERROR(IF(OR(c<a,c<b),"",INDEX(O:O3,c)),""),
IF(P3<>"",IFNA(INDEX(P:P3,d),""),"")))
让我知道它是否适合你!
另一个解决方案
算法是
If first column is not empty, then take value in first column
Else
Truncate existing final code to the length corresponding to the previous column
Append value from the current column.
公式为
=IF(M3<>"",M3,
LEFT(S2,FIND("|",SUBSTITUTE(S2&"-","-","|",MATCH("*",M3:Q3,0)-1))-1)
&"-"&INDEX(M3:Q3,MATCH("*",M3:Q3,0))
)
这是针对未占用的单元格包含空字符串而不是空白的情况的修改公式:
=IF(M3<>"",M3,
LEFT(S2&"-",FIND("|",SUBSTITUTE(S2&"-","-","|",INDEX(MATCH(TRUE,M3:Q3<>"",0),1)-1)))
&INDEX(M3:Q3,INDEX(MATCH(TRUE,M3:Q3<>"",0),1))
)
可以省略围绕 Match 函数的索引包装器,但是公式必须使用 CtrlShift 进行数组输入输入
如果您可以更改代码列,使 lvl2、lvl3、lvl4 和 lvl5 成为句点,只要 lvl1 具有值(类似于图像),那么这在 powerquery 中是微不足道的
用于执行此操作的 N3 中公式的新版本类似于:
=IF(M3="",IF(ISBLANK(B3),"",_xlfn.XLOOKUP(B:B,lvl2_code[item description],lvl2_code[final code])),".")
使用来自 table/range...
的数据将数据加载到 powerquery
点击select所有lvl列,右击,填充...向下...
添加列...自定义列...使用公式连接所有:
=[lvl1]&"-"&[lvl2]&"-"&[lvl3]&"-"&[lvl4]&"-"&[lvl5]
右键单击新列,替换值,并将 -. 替换为 null
文件 .. 关闭并加载 ... 完成
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Filled Down" = Table.FillDown(Source,{"lvl1", "lvl2", "lvl3", "lvl4", "lvl5"}),
#"Added Custom" = Table.AddColumn(#"Filled Down", "final_code", each [lvl1]&"-"&[lvl2]&"-"&[lvl3]&"-"&[lvl4]&"-"&[lvl5]),
#"Replaced Value" = Table.ReplaceValue(#"Added Custom","-.","",Replacer.ReplaceText,{"final_code"})
in #"Replaced Value"
我有以下 excel:
预期结果:
我试过幂查询,excel 函数,但我无法得到我需要的结果。
你认为没有 vba 有可能实现吗?
谢谢!
编辑 2:根据您评论中的文件,我重构了公式以使用空格
基于此单元格布局:
使用这个公式:
=TEXTJOIN("-",TRUE,
IFERROR(INDEX(M:M3,MAX((M:M3<>"")*(ROW(M:M3)))-ROW(M)+1),""),
IFERROR(IF(MAX((N:N3<>"")*(ROW(N:N3)))-ROW(N)+1<MAX((M:M3<>"")*(ROW(M:M3)))-ROW(M)+1,"",INDEX(N:N3,MAX((N:N3<>"")*(ROW(N:N3)))-ROW(N)+1)),""),
IFERROR(IF(OR(MAX((O:O3<>"")*(ROW(O:O3)))-ROW(O)+1<MAX((M:M3<>"")*(ROW(M:M3)))-ROW(M)+1,MAX((O:O3<>"")*(ROW(O:O3)))-ROW(O)+1<MAX((N:N3<>"")*(ROW(N:N3)))-ROW(N)+1),"",INDEX(O:O3,MAX((O:O3<>"")*(ROW(O:O3)))-ROW(O)+1)),""),
IF(P3<>"",IFNA(INDEX(P:P3,MAX((P:P3<>"")*(ROW(P:P3)))-ROW(P)+1),""),""))
编辑 3:如果可用,可以使用 LET
函数来简化它
=LET(
a,MAX((M:M3<>"")*(ROW(M:M3)))-ROW(M)+1,
b,MAX((N:N3<>"")*(ROW(N:N3)))-ROW(N)+1,
c,MAX((O:O3<>"")*(ROW(O:O3)))-ROW(O)+1,
d,MAX((P:P3<>"")*(ROW(P:P3)))-ROW(P)+1,
TEXTJOIN("-",TRUE,
IFERROR(INDEX(M:M3,a),""),
IFERROR(IF(b<a,"",INDEX(N:N3,b)),""),
IFERROR(IF(OR(c<a,c<b),"",INDEX(O:O3,c)),""),
IF(P3<>"",IFNA(INDEX(P:P3,d),""),"")))
让我知道它是否适合你!
另一个解决方案
算法是
If first column is not empty, then take value in first column
Else
Truncate existing final code to the length corresponding to the previous column
Append value from the current column.
公式为
=IF(M3<>"",M3,
LEFT(S2,FIND("|",SUBSTITUTE(S2&"-","-","|",MATCH("*",M3:Q3,0)-1))-1)
&"-"&INDEX(M3:Q3,MATCH("*",M3:Q3,0))
)
这是针对未占用的单元格包含空字符串而不是空白的情况的修改公式:
=IF(M3<>"",M3,
LEFT(S2&"-",FIND("|",SUBSTITUTE(S2&"-","-","|",INDEX(MATCH(TRUE,M3:Q3<>"",0),1)-1)))
&INDEX(M3:Q3,INDEX(MATCH(TRUE,M3:Q3<>"",0),1))
)
可以省略围绕 Match 函数的索引包装器,但是公式必须使用 CtrlShift 进行数组输入输入
如果您可以更改代码列,使 lvl2、lvl3、lvl4 和 lvl5 成为句点,只要 lvl1 具有值(类似于图像),那么这在 powerquery 中是微不足道的
用于执行此操作的 N3 中公式的新版本类似于:
=IF(M3="",IF(ISBLANK(B3),"",_xlfn.XLOOKUP(B:B,lvl2_code[item description],lvl2_code[final code])),".")
使用来自 table/range...
的数据将数据加载到 powerquery点击select所有lvl列,右击,填充...向下...
添加列...自定义列...使用公式连接所有:
=[lvl1]&"-"&[lvl2]&"-"&[lvl3]&"-"&[lvl4]&"-"&[lvl5]
右键单击新列,替换值,并将 -. 替换为 null
文件 .. 关闭并加载 ... 完成
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Filled Down" = Table.FillDown(Source,{"lvl1", "lvl2", "lvl3", "lvl4", "lvl5"}),
#"Added Custom" = Table.AddColumn(#"Filled Down", "final_code", each [lvl1]&"-"&[lvl2]&"-"&[lvl3]&"-"&[lvl4]&"-"&[lvl5]),
#"Replaced Value" = Table.ReplaceValue(#"Added Custom","-.","",Replacer.ReplaceText,{"final_code"})
in #"Replaced Value"