如何在excel中返回桥表中所有行的行号

dauxcl2d  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(138)

我有一个桥牌表和一行标签,如下所示

如何返回每个标签(A、B和C)的行号。预期输出如下所示。

谢谢你的帮忙

np8igboo

np8igboo1#

假设您需要的是行号而不是数组中的索引位置。此解决方案会一次性溢出整个结果。您可以在D1单元格中使用以下公式:

=LET(B, B2:B9, ux, UNIQUE(B), rows, DROP(REDUCE("", ux, LAMBDA(ac,u, 
 HSTACK(ac, FILTER(ROW(B2:B9), B=u)))),,1), VSTACK(TOROW(ux), rows))

我们使用DROP/REDUCE/HSTACK模式在REDUCE的每次迭代中连接每一列。如何在Excel中将表格从垂直转换为水平,但长度不同,了解更多详细信息。
如果你想知道为什么我不在REDUCELAMBDA函数中调用ROW,原因是ROW(B)会产生#VALUE!,可能与这个问题中记录的相同的bug有关:Using name variable from LET produces #VALUE! inside MAP using SUM with the range defined as INDEX : INDEX,请检查@JosWoolley的答案。例如,下面的代码可以工作,但不值得引入额外的LET

=LET(B, B2:B9, ux, UNIQUE(B), rows, DROP(REDUCE("", ux, LAMBDA(ac,u, LET(
  colB, B2:B9, HSTACK(ac, FILTER(ROW(colB), B=u))))),,1), VSTACK(TOROW(ux), rows)

或者,更优雅的解决方案是创建一个LAMBDA函数(B),该函数引用范围B2:B9

=LET(B, LAMBDA(B2:B9), ux, UNIQUE(B()), rows, DROP(REDUCE("", ux, LAMBDA(ac,u,
 HSTACK(ac, FILTER(ROW(B()), B()=u)))),,1), VSTACK(TOROW(ux), rows))

检查我对问题的回答:MAXIFS doesn't work as expected invoked inside MAP using names from LET获取更多信息。上述方法的维护成本较低,因为您只需要在一个位置更新范围。

jmo0nnb3

jmo0nnb32#

您可以使用数组公式(使用Ctrl + Shift + Enter输入)。较新版本的Excel partic.365支持比下面使用SMALL和IF时更简洁的公式。实际上,创建一个1|0个匹配类别,使用IF筛选出0,并使用公式所在的行返回下一个最小匹配项。
设置

然后横向向下拖动D2中的公式。按Ctrl+Shift+Enter以确保公式为数组公式:

=IFERROR(SMALL(IF(ROW($B$2:$B$9)*--($B$2:$B$9=D$1)>0,ROW($B$2:$B$9)*--($B$2:$B$9=D$1)),ROWS($C$2:$C2)), NA())

您可以将相同的想法用于MATCH

=IFERROR(SMALL(IF(ISNUMBER(MATCH($B$2:$B$9,D$1,0)),ROW($B$2:$B$9)*--($B$2:$B$9=D$1)),ROWS($C$2:$C2)), NA())
ippsafx7

ippsafx73#

您可以尝试使用Textsplit和Textjoin函数
=--文本分割(文本连接(“,",,如果(D$1=$B1:$B9,序列(行(D1:D9)),"”),,",”)

或者尝试使用Filter func,但公式似乎很长。
=过滤器(如果(D$1=$B1:$B9,序列(行(D1:D9)),"#”),如果(D$1=$B1:$B9,序列(行(D1:D9)),"#”)〈〉"#”)

相关问题