【问题标题】:Concatenate cells within Excel row based off variable start and end columns根据可变的开始列和结束列连接 Excel 行中的单元格
【发布时间】:2021-08-16 08:58:57
【问题描述】:

我有一个如下所示的数据集:

A B C D E
1 4 5
2 3 6
1 3

我需要创建一个列,它将每行中的单元格从第一个具有值的单元格连接到具有值的最后一个单元格,即使中间有空格也是如此。这些需要用分号隔开。所以第一行的输出是1; ;4;5。第二行是2;3; ;6。第三行是1; ; ; ;3

就目前而言,我设法添加了几个公式,用于识别每一行范围内的开始和结束列引用(即第一行从第 1 列开始,在第 4 列结束)。

在行中查找第一个非空白单元格引用的公式:

={MATCH(FALSE(ISBLANK(H6:AB6),0)}

查找行中最后一个非空白单元格引用的公式:

=AGGREGATE(14,6,(COLUMN(H6:AB6)-COLUMN(H6+1)/(H6:AB6<>""),1)

我正在努力解决如何让公式使用该行的起始列号并使用 ; 拉回后续单元格值分隔符,直到它到达并包含最后一列参考号。

【问题讨论】:

  • {=MID((A1 &amp; ";" &amp;B1 &amp; ";" &amp; C1 &amp; ";" &amp;D1 &amp; ";" &amp; E1),MATCH(0,--ISBLANK(A1:E1),0),LEN(A1 &amp; ";" &amp;B1 &amp; ";" &amp; C1 &amp; ";" &amp;D1 &amp; ";" &amp; E1)-MATCH(0,--ISBLANK(A1:E1),0)+1)}

标签: excel vba excel-formula


【解决方案1】:

FILTERXML() 替代方案:

G1中的公式:

=TEXTJOIN(";",0,IFERROR(FILTERXML("<t><s>"&TEXTJOIN("</s><s>",0,A1:E1)&"</s></t>","//s[.!='' or (following::*!='' and preceding::*!='')]"),""))

【讨论】:

  • 非常感谢您,非常感谢。请问这个公式是否可以在空白单元格所在的位置返回“0”?所以不是 10;;5 而是 10;0;5?我会阅读这些对我来说很新并且很有帮助的公式。
  • @ScotCal,是的,将 IFERROR() 之后的值从双引号 "" 更改为 "0" 。顺便说一句,FILTERXML() 在很多场合对我来说都是救命稻草。如果您愿意,您可以在我制作的另一个 SO-thread here 上阅读更多相关信息
  • 如果你想要空白单元格为零,也许你可以只使用文本连接 =TEXTJOIN(";",1,IF(A1:E1="",0,A1:E1))跨度>
  • @TomSharpe,我想这可能是IFERROR() =) 的替代品。我个人仍然会使用后者来避免误报(想象一个空行)。
  • 是的,我的建议无论如何都会给第一行 1;0;4;5;0 ,而你的建议是 1;0;4;5 这可能是 OP 想要的。
【解决方案2】:

在 J1 或任何您需要的单元格中使用

=IF(AND(A1="",B1="",C1="",D1="",E1=""),"",CONCATENATE(A1,IF(AND(B1="",C1="",D1="",E1=""),".",IF(A1="",""," ;")),B1,IF(AND(C1="",D1="",E1=""),IF(AND(B1="",C1="",D1="",E1=""),"","."),IF(AND(A1="",B1=""),""," ;")),C1,IF(AND(D1="",E1=""),IF(AND(C1="",D1="",E1=""),"","."),IF(AND(A1="",B1="",C1=""),""," ;")),D1,IF(E1="",IF(AND(D1="",E1=""),"","."),IF(AND(A1="",B1="",C1="",D1=""),""," ;")),E1,IF(E1="","",IF(E1="","","."))))

希望这就是你真正想要的。

【讨论】:

    【解决方案3】:

    只是为了回答您的部分问题,即如何使用第一个和最后一个非空白单元格的列号来获得没有前导和尾随分号的结果,您的公式如下所示:

    =TEXTJOIN(";",0,INDEX(1:1,MATCH(FALSE,ISBLANK(A1:E1),0)):INDEX(1:1,AGGREGATE(14,6,(COLUMN(A1:E1)-COLUMN(A1)+1)/(A1:E1<>""),1)))
    

    或更短:

    =TEXTJOIN(";",0,INDEX(1:1,MATCH(FALSE,ISBLANK(A1:E1),0)):INDEX(1:1,LOOKUP(2,1/(A1:E1<>""),COLUMN(A1:E1))))
    

    使用聚合的唯一优点是您不需要在早期版本的 Excel 中输入数组,但您也不需要数组输入查找公式,所以我倾向于使用它(并且无论如何,在这种情况下,您可能需要在 Excel-365 之前对整个公式进行数组输入)。

    这还不错,但不幸的是,如果您想将空白变为零​​,则必须重复大部分公式,除非您有 Excel 365 并且可以使用 Let:

    =TEXTJOIN(";",0,IF(INDEX(1:1,MATCH(FALSE,ISBLANK(A1:E1),0)):INDEX(1:1,LOOKUP(2,1/(A1:E1<>""),COLUMN(A1:E1)))="",0,
    INDEX(1:1,MATCH(FALSE,ISBLANK(A1:E1),0)):INDEX(1:1,LOOKUP(2,1/(A1:E1<>""),COLUMN(A1:E1))) ))
    

    如果您有 Excel 365,则可以使用 Xmatch 从数组末尾搜索:

    =TEXTJOIN(";",0,INDEX(1:1,XMATCH(TRUE,A1:E1<>"")):INDEX(1:1,XMATCH(TRUE,A1:E1<>"",0,-1)))
    

    【讨论】:

    • 不错的答案汤姆!
    • 谢谢@JvdV。你的投票值得。
    • 谢谢两位,非常有帮助,让我看到了一些全新的方法来学习哪些很棒。
    猜你喜欢
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2022-08-18
    • 2021-06-14
    • 2019-02-13
    • 1970-01-01
    • 2021-09-22
    • 2018-05-22
    相关资源
    最近更新 更多