【问题标题】:Merge / stack excel columns range definition without VBA合并/堆叠没有VBA的excel列范围定义
【发布时间】:2022-07-20 14:08:32
【问题描述】:

我想组合/堆叠 2 个不同列的值并获得唯一值。 如果范围相邻,则可以正常工作。例如:

=UNIQUE(FILTERXML("<a><b>"&SUBSTITUTE(TEXTJOIN(",",TRUE,TRANSPOSE(SRC!$A$1:$C$22)),",","</b><b>")&"</b></a>","//b"))

但是,我不知道如何对不相邻的列(例如 A 列和 C 列)执行此操作。 像这样 A:A,C:C 定义转置区域是行不通的。 所以基本上,我有两个问题:

  • 如何堆叠/合并不相邻的列(我假设有多种方法)?
  • 如何在 (A1:A12,C2:C22) 等公式中定义不规则范围?

我需要使用公式,而不是 VBA 或 Excel GUI。 谢谢!

【问题讨论】:

    标签: excel excel-formula


    【解决方案1】:

    由于很短(目前在 ms365 的 BETA 通道中),因此可以选择将 VSTACK() 不同的范围合并到单个列中。参数可以是不连续的不规则(但垂直)数组:

    E1中的公式:

    =UNIQUE(VSTACK(A2:A5,C3:C7))
    

    请注意,即使您有不规则的非连续范围,TEXTJOIN() 也可以轻松保存多个这些范围,而不仅仅是一个范围。将该逻辑应用于上面的示例数据:

    =UNIQUE(FILTERXML("<t><s>"&TEXTJOIN("</s><s>",,A2:A5,C3:C7)&"</s></t>","//s"))
    

    旁注;但相关问题可以在herehere 找到更多灵感。

    【讨论】:

    • 先生,刚刚也应用了这两个,效果很好,出于好奇,我也尝试了这两个,=UNIQUE(TOCOL($A$2:$C$7,3,1)) & =UNIQUE(TOCOL(HSTACK(A2:A5,C3:C7),3,1))
    • @MayukhBhattacharya, TOCOL() 在这种情况下并不是那么方便,因为我认为 OP 在他宁愿跳过的列中有数据。
    • 啊,好的,明白先生,是的,你是对的。但是我们不能在TOCOL() 中忽略相同的可能吗
    • 不幸的是,我的机器上还没有 Vstack,但是 Textjoin 可以很好地处理多个范围/文本。谢谢!你知道一种方法,我可以将 n 个范围组合成一个(虚拟)范围,我可以在公式中使用,因为有很多公式只接受 1 个范围参数?
    • @Chris,不客气。对于您评论的第二部分;这可以通过 ms365 最新功能实现,如图所示。如果还不能访问VSTACK(),你最终会遇到越来越困难的功能网络(也仅适用于 ms365)。
    【解决方案2】:

    如果您无权访问VSTACK(),并且您有一个或多个列的宽度可变高度和位置,这是另一种可能的解决方案。这允许多达 10 个单独的范围。 如果您在名称管理器中将 LAMBDA 函数命名为“Array_Stacker”。

    =Array_Stacker(False,False,A1:B20,D12:E18,G5:H10)
    
    =LAMBDA(unique_TRUE_or_FALSE, filter_blanks_TRUE_or_FALSE, range1, range2, [range3], [range4], [range5], [range6], [range7], [range8], [range9], [range10],
            LET(
                unique, IF(ISOMITTED(unique_TRUE_or_FALSE), FALSE, unique_TRUE_or_FALSE),
                blanks, IF(ISOMITTED(filter_blanks_TRUE_or_FALSE), FALSE, filter_blanks_TRUE_or_FALSE),
                numcols, COLUMNS(range1),
                height01, ROWS(range1),
                height02, ROWS(range2),
                height03, IF(ISOMITTED(range3), 0, ROWS(range3)),
                height04, IF(ISOMITTED(range4), 0, ROWS(range4)),
                height05, IF(ISOMITTED(range5), 0, ROWS(range5)),
                height06, IF(ISOMITTED(range6), 0, ROWS(range6)),
                height07, IF(ISOMITTED(range7), 0, ROWS(range7)),
                height08, IF(ISOMITTED(range8), 0, ROWS(range8)),
                height09, IF(ISOMITTED(range9), 0, ROWS(range9)),
                height10, IF(ISOMITTED(range10), 0, ROWS(range10)),
                heightAll, SUM(
                    height01,
                    height02,
                    height03,
                    height04,
                    height05,
                    height06,
                    height07,
                    height08,
                    height09,
                    height10
                ),
                x, IFS(
                    ISOMITTED(range3),
                    1,
                    ISOMITTED(range4),
                    2,
                    ISOMITTED(range5),
                    3,
                    ISOMITTED(range6),
                    4,
                    ISOMITTED(range7),
                    5,
                    ISOMITTED(range8),
                    6,
                    ISOMITTED(range9),
                    7,
                    ISOMITTED(range10),
                    8,
                    NOT(ISOMITTED(range10)),
                    9
                ),
                ranges, CHOOSE(
                    x,
                    (range1 , range2),
                    (range1 , range2 , range3),
                    (range1 , range2 , range3 , range4),
                    (range1 , range2 , range3 , range4 , range5),
                    (range1 , range2 , range3 , range4 , range5 , range6),
                    (range1 , range2 , range3 , range4 , range5 , range6 , range7),
                    (range1 , range2 , range3 , range4 , range5 , range6 , range7 , range8),
                    (range1 , range2 , range3 , range4 , range5 , range6 , range7 , range8 , range9),
                    (range1 , range2 , range3 , range4 , range5 , range6 , range7 , range8 , range9 ,
                        range10)
                ),
                formula01, SEQUENCE(heightAll),
                formula02, SEQUENCE(heightAll, numcols),
                formula03, IFS(
                    formula01 <= height01,
                    formula01,
                    formula01 <= height01 + height02,
                    formula01 - height01,
                    formula01 <= height01 + height02 + height03,
                    formula01 - height01 - height02,
                    formula01 <= height01 + height02 + height03 + height04,
                    formula01 - height01 - height02 - height03,
                    formula01 <= height01 + height02 + height03 + height04 + height05,
                    formula01 - height01 - height02 - height03 - height04,
                    formula01 <= height01 + height02 + height03 + height04 + height05 + height06,
                    formula01 - height01 - height02 - height03 - height04 - height05,
                    formula01 <= height01 + height02 + height03 + height04 + height05 + height06 + height07,
                    formula01 - height01 - height02 - height03 - height04 - height05 - height06,
                    formula01 <=
                        height01 + height02 + height03 + height04 + height05 + height06 + height07 +
                            height08,
                    formula01 - height01 - height02 - height03 - height04 - height05 - height06 - height07,
                    formula01 <=
                        height01 + height02 + height03 + height04 + height05 + height06 + height07 +
                            height08 + height09,
                    formula01 - height01 - height02 - height03 - height04 - height05 - height06 - height07 -
                        height08,
                    formula01 <=
                        height03 + height02 + height03 + height04 + height05 + height06 + height07 +
                            height08 + height09 + height10,
                    formula01 - height01 - height02 - height03 - height04 - height05 - height06 - height07 -
                        height08 - height09
                ),
                formula04, IFS(
                    formula02 <= (height01) * numcols,
                    1,
                    formula02 <= (height01 + height02) * numcols,
                    2,
                    formula02 <= (height01 + height02 + height03) * numcols,
                    3,
                    formula02 <= (height01 + height02 + height03 + height04) * numcols,
                    4,
                    formula02 <= (height01 + height02 + height03 + height04 + height05) * numcols,
                    5,
                    formula02 <= (height01 + height02 + height03 + height04 + height05 + height06) * numcols,
                    6,
                    formula02 <=
                        (height01 + height02 + height03 + height04 + height05 + height06 + height07) *
                            numcols,
                    7,
                    formula02 <=
                        (height01 + height02 + height03 + height04 + height05 + height06 + height07 +
                            height08) * numcols,
                    8,
                    formula02 <=
                        (height01 + height02 + height03 + height04 + height05 + height06 + height07 +
                            height08 + height09) * numcols,
                    9,
                    formula02 <=
                        (height01 + height02 + height03 + height04 + height05 + height06 + height07 +
                            height08 + height09 + height10) * numcols,
                    10
                ),
                indx, INDEX((ranges), formula03, SEQUENCE(1,numcols), formula04),
                stacker, IF(blanks = TRUE, FILTER(indx, indx <> ""), indx),
                IF(AND(blanks=TRUE,numcols>1),"#Can not filter empty cells when range has more than one column!",IFS(unique = TRUE, UNIQUE(stacker), unique = FALSE, stacker))
            )
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多