【问题标题】:Excel: How to concatenate cells following a pattern? (cells are not in the same row!)Excel:如何按照模式连接单元格? (单元格不在同一行!)
【发布时间】:2021-01-07 02:21:33
【问题描述】:

我有以下excel:

预期结果:

我尝试过power query,excel函数,但我无法得到我需要的结果。

您认为没有 vba 是否有可能实现这一目标?

谢谢!

【问题讨论】:

  • 你有什么 Excel 版本?
  • 你如何定义lvl3是否与下面的数字连接?
  • 嗨,Ricardo,我正在使用 Office 365 (16.0.12527.21378) 32 位。
  • 它将与下一级的元素连接:
  • 从预期结果中排除WSP 的逻辑是什么?

标签: excel vba function powerquery offset


【解决方案1】:

编辑 2:根据您评论中的文件,我重构了公式以使用空格

基于此单元格布局:

使用这个公式:

=TEXTJOIN("-",TRUE,
    IFERROR(INDEX(M$3:M3,MAX((M$3:M3<>"")*(ROW(M$3:M3)))-ROW(M$3)+1),""),
    IFERROR(IF(MAX((N$3:N3<>"")*(ROW(N$3:N3)))-ROW(N$3)+1<MAX((M$3:M3<>"")*(ROW(M$3:M3)))-ROW(M$3)+1,"",INDEX(N$3:N3,MAX((N$3:N3<>"")*(ROW(N$3:N3)))-ROW(N$3)+1)),""),
    IFERROR(IF(OR(MAX((O$3:O3<>"")*(ROW(O$3:O3)))-ROW(O$3)+1<MAX((M$3:M3<>"")*(ROW(M$3:M3)))-ROW(M$3)+1,MAX((O$3:O3<>"")*(ROW(O$3:O3)))-ROW(O$3)+1<MAX((N$3:N3<>"")*(ROW(N$3:N3)))-ROW(N$3)+1),"",INDEX(O$3:O3,MAX((O$3:O3<>"")*(ROW(O$3:O3)))-ROW(O$3)+1)),""),
    IF(P3<>"",IFNA(INDEX(P$3:P3,MAX((P$3:P3<>"")*(ROW(P$3:P3)))-ROW(P$3)+1),""),""))

编辑 3:如果你有它,你可以使用 LET 函数来简化它

=LET(
    a,MAX((M$3:M3<>"")*(ROW(M$3:M3)))-ROW(M$3)+1,
    b,MAX((N$3:N3<>"")*(ROW(N$3:N3)))-ROW(N$3)+1,
    c,MAX((O$3:O3<>"")*(ROW(O$3:O3)))-ROW(O$3)+1,
    d,MAX((P$3:P3<>"")*(ROW(P$3:P3)))-ROW(P$3)+1,

    TEXTJOIN("-",TRUE,
    IFERROR(INDEX(M$3:M3,a),""),
    IFERROR(IF(b<a,"",INDEX(N$3:N3,b)),""),
    IFERROR(IF(OR(c<a,c<b),"",INDEX(O$3:O3,c)),""),
    IF(P3<>"",IFNA(INDEX(P$3:P3,d),""),"")))

让我知道它是否适合你!

【讨论】:

【解决方案2】:

如果您可以更改代码列,以便 lvl2、lvl3、lvl4 和 lvl5 在 lvl1 具有值时成为句点(类似于图像),那么这在 powerquery 中是微不足道的

在 N3 中执行此操作的新版本公式类似于:

=IF(M3="",IF(ISBLANK(B3),"",_xlfn.XLOOKUP(B:B,lvl2_code[item description],lvl2_code[final code])),".")

将数据加载到powerquery中,数据...来自表/范围...

点击选择所有的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"

【讨论】:

    【解决方案3】:

    另一种解决方案

    算法是

    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 函数周围的索引包装可以省略,但必须使用 CtrlShiftEnter 将公式输入数组

    【讨论】:

    • 嗨汤姆,你的公式看起来很简单,我喜欢它。但是,我正在尝试在我的 Excel 工作簿中使用但不起作用:ttps://gyazo.com/58390f02288ee1c5889915bbe16e8207。知道为什么会这样吗?
    • 我在@Ricardo Diaz 的 cmets 中注意到,您的单元格中似乎有空字符串而不是空白单元格 - 我可以发布一个在这种情况下应该可以工作的替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多