我有一个桥牌表和一行标签,如下所示
如何返回每个标签(A、B和C)的行号。预期输出如下所示。
谢谢你的帮忙
np8igboo1#
假设您需要的是行号而不是数组中的索引位置。此解决方案会一次性溢出整个结果。您可以在D1单元格中使用以下公式:
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中将表格从垂直转换为水平,但长度不同,了解更多详细信息。如果你想知道为什么我不在REDUCE的LAMBDA函数中调用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:
DROP/REDUCE/HSTACK
REDUCE
LAMBDA
ROW
ROW(B)
#VALUE!
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:
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获取更多信息。上述方法的维护成本较低,因为您只需要在一个位置更新范围。
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())
ippsafx73#
您可以尝试使用Textsplit和Textjoin函数=--文本分割(文本连接(“,",,如果(D$1=$B1:$B9,序列(行(D1:D9)),"”),,",”)
或者尝试使用Filter func,但公式似乎很长。=过滤器(如果(D$1=$B1:$B9,序列(行(D1:D9)),"#”),如果(D$1=$B1:$B9,序列(行(D1:D9)),"#”)〈〉"#”)
3条答案
按热度按时间np8igboo1#
假设您需要的是行号而不是数组中的索引位置。此解决方案会一次性溢出整个结果。您可以在
D1
单元格中使用以下公式:我们使用
DROP/REDUCE/HSTACK
模式在REDUCE
的每次迭代中连接每一列。如何在Excel中将表格从垂直转换为水平,但长度不同,了解更多详细信息。如果你想知道为什么我不在
REDUCE
的LAMBDA
函数中调用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
:或者,更优雅的解决方案是创建一个
LAMBDA
函数(B
),该函数引用范围B2:B9
:检查我对问题的回答:MAXIFS doesn't work as expected invoked inside MAP using names from LET获取更多信息。上述方法的维护成本较低,因为您只需要在一个位置更新范围。
jmo0nnb32#
您可以使用数组公式(使用Ctrl + Shift + Enter输入)。较新版本的Excel partic.365支持比下面使用SMALL和IF时更简洁的公式。实际上,创建一个1|0个匹配类别,使用IF筛选出0,并使用公式所在的行返回下一个最小匹配项。
设置
然后横向向下拖动D2中的公式。按Ctrl+Shift+Enter以确保公式为数组公式:
您可以将相同的想法用于MATCH
ippsafx73#
您可以尝试使用Textsplit和Textjoin函数
=--文本分割(文本连接(“,",,如果(D$1=$B1:$B9,序列(行(D1:D9)),"”),,",”)
或者尝试使用Filter func,但公式似乎很长。
=过滤器(如果(D$1=$B1:$B9,序列(行(D1:D9)),"#”),如果(D$1=$B1:$B9,序列(行(D1:D9)),"#”)〈〉"#”)