将多维数组转换为溢出范围

问题描述 投票:0回答:2

我最近发布了很多数组/溢出范围答案,试图生成非 vba/App 脚本解决方案。然而,我遇到过这样的情况:数组中的数组没有像我预期的那样溢出。 这个具体问题导致我发布这个问题。

我正在解决的问题概要:

  • A:E
    中5列数据的起始值。
  • OP 想要前四列的唯一列表 (
    A:D
    )
  • Column E
    值向右转置。

起始数据示例:

A 栏 B C D E
阿尔法 太棒了 查理 德尔塔 1
阿尔法 太棒了 查理 德尔塔 2
阿尔法 太棒了 查理 德尔塔 3
德尔塔 回声 狐步舞 海湾 4
德尔塔 回声 狐步舞 海湾 5
德尔塔 回声 狐步舞 海湾 6
X射线 洋基队 祖鲁语 德尔塔 9
X射线 洋基队 祖鲁语 德尔塔 4
X射线 洋基队 祖鲁语 德尔塔 2
X射线 洋基队 祖鲁语 德尔塔 1
X射线 洋基队 祖鲁语 德尔塔 3
阿尔法 太棒了 查理 德尔塔 4

期望的结果:

J K L M N O P
阿尔法 太棒了 查理 德尔塔 1 2 3 4
德尔塔 回声 狐步舞 海湾 4 5 6
X射线 洋基队 祖鲁语 德尔塔 9 4 2 1 3

我的解决方案电子表格发布在此处或查看谷歌表格版本,您可以在重复的选项卡中进行编辑

我可以在单元格中使用以下公式轻松获取前四列

i1

=UNIQUE(FILTER(A:D,NOT(ISBLANK((A:A)))))

然后我可以使用下面的函数创建转置值以在

M1
中向右溢出(如上所示)。

=TRANSPOSE(FILTER(E:E,(NOT(ISBLANK(E:E))*(A:A&B:B&C:C&D:D=I1&J1&K1&L1))))

我的挑战是让上面的公式向下溢出以匹配前四列。显然,我可以将公式向下拖动(这是我的建议),但是我怎样才能使这个公式动态地向下溢出,类似于前四列?下面的公式在我看来应该有效,但它抛出了一个错误: =FILTER(TRANSPOSE(FILTER($E:$E,(NOT(ISBLANK($E:$E))*($A:$A&$B:$B&$C:$C&$D:$D=I1:I999&J1:J999&K1:K999&L1:L999)))),NOT(ISBLANK(L1:L999)))

奖励/类似问题:我在
这个答案

中遇到了类似的问题。如果您能弄清楚如何在这个电子表格中使

column E
成为动态溢出范围,我会投票赞成答案。

excel multidimensional-array excel-formula spill-range
2个回答
1
投票
这会产生所需的溢出结果,但 E 列的数据连接到一个单元格中,而不是溢出到右侧。我希望这是可以接受的。使用上面的函数,结果将如下所示:

PS 部分归功于 Mark Fitzgerald 发布此

答案


0
投票
MakeArray

解决了这个问题。 不幸的是,因为谷歌表格和Excel使用两个函数名称来做同样的事情,所以我无法获得两者的动态公式(表格使用

split

,而Excel使用

textsplit
每个公式都希望让全范围的参数按一列过滤,一个字符表示转置前切割数据的最后一列号

谷歌表格

示例文件在这里

=LET(alldata,FILTER(A:E,A:A<>""), zSplitter,"?", zColumnCount,4, allNames,HSTACK(CHOOSECOLS(alldata,SEQUENCE(1,zColumnCount))), zNames,UNIQUE(allNames), keysFiltered, BYROW(zNames,LAMBDA(eRow,TEXTJOIN(zSplitter,TRUE,eRow))), keysFull,BYROW(allNames,LAMBDA(eRow,TEXTJOIN(zSplitter,TRUE,eRow))), splitNums,BYROW(keysFiltered,LAMBDA(eRow,TEXTJOIN(zSplitter,TRUE,FILTER(CHOOSECOLS(alldata,zColumnCount+1),keysFull=eRow)))), zElementCount,BYROW(splitNums,LAMBDA(eRow, LEN(eRow)-LEN(SUBSTITUTE(eRow,zSplitter,""))+1)), zMaxCol,MAX(zElementCount), zSideArray,MAKEARRAY(ROWS(zNames),zMaxCol,LAMBDA(r,c,LET(tempRng,INDEX(splitNums,r,1),tempSplitRng,SPLIT(tempRng,zSplitter),IF(c>CHOOSEROWS(zElementCount,r),"",CHOOSECOLS(tempSplitRng,c))))), HSTACK(zNames,zSideArray))

Excel

=LET(alldata,FILTER(A:E,A:A<>""),zSplitter,"?", zColumnCount,4, allNames,HSTACK(CHOOSECOLS(alldata,SEQUENCE(1,zColumnCount))), zNames,UNIQUE(allNames), keysFiltered, BYROW(zNames,LAMBDA(eRow,TEXTJOIN(zSplitter,TRUE,eRow))), keysFull,BYROW(allNames,LAMBDA(eRow,TEXTJOIN(zSplitter,TRUE,eRow))), splitNums,BYROW(keysFiltered,LAMBDA(eRow,TEXTJOIN(zSplitter,TRUE,FILTER(CHOOSECOLS(alldata,zColumnCount+1),keysFull=eRow)))), zElementCount,BYROW(splitNums,LAMBDA(eRow, LEN(eRow)-LEN(SUBSTITUTE(eRow,zSplitter,""))+1)), zMaxCol,MAX(zElementCount), zSideArray,MAKEARRAY(ROWS(zNames),zMaxCol,LAMBDA(r,c,LET(tempRng,INDEX(splitNums,r,1),tempSplitRng,TEXTSPLIT(tempRng,zSplitter),IF(c>CHOOSEROWS(zElementCount,r),"",CHOOSECOLS(tempSplitRng,c))))), HSTACK(zNames,zSideArray))

© www.soinside.com 2019 - 2024. All rights reserved.