Excel的INDEX函数可以返回数组吗?

Ima*_*889 6 arrays indexing excel excel-formula

如果范围内的数据A1:A4如下:

Apple
Banana
Orange
Strawberry
Run Code Online (Sandbox Code Playgroud)

然后INDEX可以用于单独返回该列表中的任何值,例如

= INDEX(A1:A4,3)
Run Code Online (Sandbox Code Playgroud)

会回来Orange.

是否有类似的Excel函数或函数组合,可以有效地允许您执行以下操作:

= INDEX(A1:A4,{2;3})
Run Code Online (Sandbox Code Playgroud)

哪个会返回一个数组{Banana;Orange}

这是可能的(最好没有VBA),如果是这样,怎么样?即使使用辅助细胞,我也很难弄清楚如何实现这一目标.

如果数据是数字(使用MMULT),我可以找出一个有点复杂的解决方案,但数据是文本这一事实让我感到沮丧,因为MMULT它不适用于文本.

jef*_*eir 14

OFFSET可能是你想要的功能.

=OFFSET(A1:A4,1,,2)
Run Code Online (Sandbox Code Playgroud)

但是要回答你的问题,INDEX确实可以用来返回一个数组.或者更确切地说,两个INDEX函数之间有一个冒号:

=INDEX(A1:A4,2):INDEX(A1:A4,3)
Run Code Online (Sandbox Code Playgroud)

这是因为INDEX实际上返回一个单元格引用或一个数字,Excel根据您要求的上下文确定您想要哪些.如果你在两个INDEX函数的中间放置一个冒号,Excel会说"Hey a colon ...通常在其中一个上面有一个单元格引用",所以将INDEX解释为就是这样.您可以在http://blog.excelhero.com/2011/03/21/the_imposing_index/上阅读更多相关内容.

我实际上更喜欢INDEX到OFFSET,因为OFFSET是易失性的,这意味着它会在一滴帽子时不断重新计算,然后强制它下游的任何公式都做同样的事情.有关这方面的更多信息,请阅读我的帖子https://chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/

实际上你只能使用一个 INDEX并返回一个数组,但它很复杂,并且需要一些称为解除引用的东西.这是我正在写的一本书中的一些内容:

此屏幕截图中的工作表有一个名为Data的命名范围,该范围分配给顶部的A2:E2范围.该范围包含数字10,20,30,40和50.并且它还有一个名为Elements的命名范围,分配给范围A5:B5.元素范围告诉A8中的公式:B8显示数据范围中的五个数字中的哪一个.

在此输入图像描述

如果你看一下A8:B8中的公式,你会发现它是一个数组输入的INDEX函数:{= INDEX(Data,Elements)}.这个公式说:"转到数据范围并根据用户在元素范围中选择的任何元素从中获取元素."在这种特殊情况下,用户已经从中请求了第五项和第二项.当然,这就是INDEX进入单元格A8:B8:相应的值50和20.

但是看看如果你采用那个完美的INDEX函数并尝试在它周围放置一个SUM会发生什么,如A11所示.你得到一个不正确的结果:50 + 20不等于50. 20,Excel发生了什么?

出于某种原因,虽然=INDEX(Data,Elements)很乐意从某个地方获取不同的元素,然后将这些数字分别返回到一个范围,但是如果你要求它将这些数字交给另一个函数,那么它是不愿意遵守的.事实上,它是如此不情愿,它只将第一个元素传递给函数.

因此,如果你想用它做其他事情,你似乎被迫首先将= INDEX(数据,元素)函数的结果返回到网格.乏味.但几乎每个Excel专业人员都会告诉你没有解决方法......就是这样,你别无选择.

Buuuuuuuut,他们错了.在http://excelxor.com/2014/09/05/index-returning-an-array-of-values/上,神秘公式超级英雄XOR概述了两种相当简单的"去参考"INDEX的方法,以便你可以然后直接在其他公式中使用其结果; 其中一种方法见上文A18.事实证明,如果你通过添加一个额外的位来稍微修改INDEX函数来封装Elements参数,那么INDEX会起球.你需要做的就是将Elements参数包括在内,如下所示:

N(IF({1},元素))

考虑到这一点,你原来行为不端的公式:

=SUM(INDEX(Data,Elements))
Run Code Online (Sandbox Code Playgroud)

...成为这个复杂但彬彬有礼的亲爱的:

=SUM(INDEX(Data, N(IF({1},Elements))))
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这很酷,我自己学会了。`=TEXTJOIN(",",TRUE,INDEX(B:B,N(IF(1,(ROW(1:15)-1)*2+2))))` 刚刚加入 B 列中的每隔一行,开始在第 2 行。 (2认同)
  • 这个数组公式 `= INDEX(<Data>,N(IF({1},<Elements>)))` 非常神奇。再次感谢@jeffreyweir (2认同)
  • 确保在 1 两边加上大括号:`N(if({1}`,否则必须对 `Elements` 进行硬编码。 (2认同)