excel 陷入REDUCE/VSTACK解决方案

ssgvzors  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(200)
=LET(
    data, jp!A2:C8&"",
    uniqueLetters, UNIQUE(INDEX(data,,1)),
    result, REDUCE("", uniqueLetters, LAMBDA(r,letter,
        VSTACK(r, "", FILTER(TAKE(data,,2), (INDEX(data,,3)="a")*(INDEX(data,,1)=letter)))
    )),
    result1, DROP(result,2),
    result2, MAP(result1, DROP(result,1), LAMBDA(a,b,
        IF(AND(ISNUMBER(a), ISNUMBER(b)), IF(a=b, "", a), a)
    )),
    IFERROR(DROP(result2,-1),"")
)

你好,这个公式是从jp复制粘贴数据! A2:基于jp的值的C8! C1:C8。在这种情况下,jp! Cl:C8是“a”。公式不是我想要的那样。我有两个请求
一,当jp! C1:C8包含“a”以外的值,公式将不起作用。现实地,嗯! C1:C8有“a”,“b”,“c”供我的其他工作表复制。有办法解决吗?
二、当jp中有重名时! A2:A8,则公式将重复项更改为“”。(我最初是为了工作而做的,但后来不知怎么搞砸了,不知道如何修复。
基本上我希望它的工作就像它的图片中所示。

我希望这一切都有意义。谢谢你!

ykejflvf

ykejflvf1#

已经有两个完美的解决方案了。我想分享另一种方法,因为它可能更容易阅读:

=LET(data,      A2:C8,
     condition, "a",
     f,         FILTER(data,TAKE(data,,-1)=condition),
     a,         INDEX(f,,1),
     b,         INDEX(f,,2),
DROP(   REDUCE( 0, UNIQUE(a),
        LAMBDA( x, y,
           LET( z, FILTER(b,a=y),
                VSTACK( x,
                        {"",""},
                        IFERROR(HSTACK(y,z),""""))))),
     2))

它首先筛选满足条件的行的范围。
然后reduce迭代(已过滤数组f)第一列的唯一值。
对于每个唯一值,它堆叠前一个结果,一个2个单元格的空白行,以及唯一值的水平堆叠和该唯一值的b值的过滤器。
由于过滤器可能返回多行,而被堆叠的唯一值仅为一个值,因此如果过滤范围超过1行,则HSTACK结果将包含低于唯一值的错误值。IFERROR将其转换为"
然后我们得到了两个前导行的结果:前两行由REDUCE中的第一个唯一值a(或y)触发。它们触发将开始值x0)和包含空白的行({"",""})与第一个过滤结果进行堆叠。
如果我们去掉前面的两行,我们就得到了最终结果。

2ul0zpep

2ul0zpep2#

过滤数据

=LET(data,A2:C17,sheet,"a",rep,"""",
    a,TAKE(data,,1),l,TAKE(data,,-1),
    au,UNIQUE(TOCOL(a,3)),
DROP(DROP(REDUCE("",au,LAMBDA(rr,r,LET(
    f,FILTER(data,(a=r)*(l=sheet),""),
    fr,ROWS(f),
    ff,IF(fr=1,f,HSTACK(VSTACK(r,INDEX(rep,SEQUENCE(fr-1,,1,0))),DROP(f,,1))),
IF(COLUMNS(ff)>1,IFERROR(VSTACK(rr,ff,""),""),rr)))),1),-1,-1))
ujv3wf0j

ujv3wf0j3#

这里,使用REDUCE/VSTACK模式的另一替代方案(1):

=LET(in,A1:C7,C,TAKE(in,,-1),lk,"a",f,FILTER(DROP(in,,-1),C=lk),fa,TAKE(f,,1),
 DROP(REDUCE("", UNIQUE(fa), LAMBDA(ac,u, LET(ff, FILTER(f, fa=u),
  ffx,DROP(ff,1), first,INDEX(ff,1,),
  out, IF(ISERR(ffx),first,VSTACK(first,
   HSTACK(IF(TAKE(ffx,,1)=u,""""),TAKE(ffx,,-1)))),
  VSTACK(ac, IF(ROWS(ac)=1, out, VSTACK({"",""},out)))))),1))

以下是ab的输出:改变b情况下的lk值:

对于b的情况,要在Dog行中返回空字符串而不是零,请检查我对以下问题的回答:我怎样才能返回空白单元格,因为它是不是打印为零,而使用过滤功能。
该公式仅依赖于两个输入范围值inlk,因此易于在其他工作表中维护和使用。名称f过滤输入in的前两列,其中查找值(lk)与输入的第三列(C)匹配。然后我们使用REDUCE/VSTACK模式(1)来迭代过滤值(fa)的第一列的唯一值。名称ff过滤名称f,其中第一列等于每次迭代的唯一值u
从那里它使用LET来定义其他名称:firstff的第一行,ffx其余行。请记住,ff中可能只有一行,在这种情况下,ffx等于#CALC!。我们通过ISERR调用来考虑这种情况。如果ISERRTRUE,它只返回第一行(first),否则first加上以下行,将第一列替换为"",这就是我们的做法:

HSTACK(IF(TAKE(ffx,,1)=u,""""),TAKE(ffx,,-1)))

它使用条件TAKE(ffx,,1)=u(在每次迭代中 alwaysTRUE)来生成一个具有""值的常量数组。
现在名称out在每次迭代中都有所需的输出。唯一需要的额外步骤是在每次迭代的开始添加一个空行({"",""}),* 除了 * 第一次。如果在每次迭代的末尾添加空行,则不需要此条件,但它会在最后一次迭代中生成不必要的空行,因此我倾向于避免这种情况。识别第一次迭代的条件是ROWS(ac)=1
(1):如何将Excel中的表格从垂直转换为水平,但长度不同

相关问题