`AGGREGATE` 和 `INDEX` 函数中的数组
Arrays in `AGGREGATE` and `INDEX` functions
场景:
所以,今天上班时我的电脑 运行 更新了 MS Office。然后,大约 30 分钟后,有人来找我,提出了一个看似简单的要求:与其使用 VLOOKUP
到 return,只是 第一个 匹配,他们想要一个 all 匹配项的分隔列表。 (例如 "which offices has this user visited this week"?)看起来很简单。
因此,在处理一些垃圾数据(见下文)时,我迅速编写了以下快速演示行:
=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B:B, AGGREGATE(15, 6, ROW(A:A)/--(A:A=E1), ROW(A:A))),""))
点击 Enter,然后... 6
。与我预期的不太一样 (6, 35, 19, 56, 47
),所以我说 "sorry about that",返回单元格,然后按 Ctrl+Shift+输入:
6
,又是
所以,运行 "Evaluate Formula",结果是 k 位置(最后一个参数)的 ROW(A:A)
AGGREGATE
returning 1
而不是 {1,2,3,4,5,6,7,8,9,10,11}
,无论您使用的是普通公式还是数组公式。
所以,我手动输入数组:
=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B:B, AGGREGATE(15, 6, ROW(A:A)/--(A:A=E1), {1,2,3,4,5,6,7,8,9,10,11})),""))
最终结果:6
。我再次计算公式,AGGREGATE
丢弃了数组中除第一个值之外的所有内容。如果我在 AGGREGATE
结果上删除 INDEX
,并且只删除 运行 TEXTJOIN
,它就可以正常工作。同样,=SUM(ROW(B1:B11))
工作正常,但 =SUM(INDEX(B1:B11, ROW(B1:B11), 1))
不工作。
问题:
现在,我 95% 确定 我曾经能够让这个 INDEX(.., AGGREGATE(..))
和 SUM(INDEX(..))
正常工作,而不仅仅是 return输入第一个值 - 这是否改变了某些函数链如何与数组一起工作,或者我只是记错了?
(有兴趣的朋友,最后我们改用数组公式=TEXTJOIN(", ", TRUE, IF(A:A=E1, B:B, ""))
)
测试中使用的垃圾数据:
A | 6
A | 35
A | 19
B | 33
B | 46
B | 72
A | 56
C | 41
C | 20
B | 52
A | 47
尽管您发现添加 IF 而不是长 INDEX/AGGREGATE 是可行的。
它不起作用的原因是INDEX通常没有设置为以数组作为行号。
但我们可以强制使用 N(IF({1},...))
=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B:B, AGGREGATE(15, 6, ROW(A:A)/--(A:A=E1), N(IF({1},ROW(A:A))))),""))
这是一个数组公式,需要在退出编辑模式时用Ctrl-Shift-Enter而不是Enter确认。
但是当一个简单的 IF()
就可以满足需要时,这又是一个漫长的过程。
场景:
所以,今天上班时我的电脑 运行 更新了 MS Office。然后,大约 30 分钟后,有人来找我,提出了一个看似简单的要求:与其使用 VLOOKUP
到 return,只是 第一个 匹配,他们想要一个 all 匹配项的分隔列表。 (例如 "which offices has this user visited this week"?)看起来很简单。
因此,在处理一些垃圾数据(见下文)时,我迅速编写了以下快速演示行:
=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B:B, AGGREGATE(15, 6, ROW(A:A)/--(A:A=E1), ROW(A:A))),""))
点击 Enter,然后... 6
。与我预期的不太一样 (6, 35, 19, 56, 47
),所以我说 "sorry about that",返回单元格,然后按 Ctrl+Shift+输入:
6
,又是
所以,运行 "Evaluate Formula",结果是 k 位置(最后一个参数)的 ROW(A:A)
AGGREGATE
returning 1
而不是 {1,2,3,4,5,6,7,8,9,10,11}
,无论您使用的是普通公式还是数组公式。
所以,我手动输入数组:
=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B:B, AGGREGATE(15, 6, ROW(A:A)/--(A:A=E1), {1,2,3,4,5,6,7,8,9,10,11})),""))
最终结果:6
。我再次计算公式,AGGREGATE
丢弃了数组中除第一个值之外的所有内容。如果我在 AGGREGATE
结果上删除 INDEX
,并且只删除 运行 TEXTJOIN
,它就可以正常工作。同样,=SUM(ROW(B1:B11))
工作正常,但 =SUM(INDEX(B1:B11, ROW(B1:B11), 1))
不工作。
问题:
现在,我 95% 确定 我曾经能够让这个 INDEX(.., AGGREGATE(..))
和 SUM(INDEX(..))
正常工作,而不仅仅是 return输入第一个值 - 这是否改变了某些函数链如何与数组一起工作,或者我只是记错了?
(有兴趣的朋友,最后我们改用数组公式=TEXTJOIN(", ", TRUE, IF(A:A=E1, B:B, ""))
)
测试中使用的垃圾数据:
A | 6
A | 35
A | 19
B | 33
B | 46
B | 72
A | 56
C | 41
C | 20
B | 52
A | 47
尽管您发现添加 IF 而不是长 INDEX/AGGREGATE 是可行的。
它不起作用的原因是INDEX通常没有设置为以数组作为行号。
但我们可以强制使用 N(IF({1},...))
=TEXTJOIN(", ", TRUE, IFERROR(INDEX(B:B, AGGREGATE(15, 6, ROW(A:A)/--(A:A=E1), N(IF({1},ROW(A:A))))),""))
这是一个数组公式,需要在退出编辑模式时用Ctrl-Shift-Enter而不是Enter确认。
但是当一个简单的 IF()
就可以满足需要时,这又是一个漫长的过程。