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

时间:2017-11-08 19:15:25

标签: arrays excel indexing excel-formula

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

Apple
Banana
Orange
Strawberry

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

= INDEX(A1:A4,3)

将返回Orange

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

= INDEX(A1:A4,{2;3})

哪会返回数组{Banana;Orange}

这是否可行(最好没有VBA),若然,怎么样?即使使用辅助细胞,我也很难搞清楚如何实现这一目标。

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

4 个答案:

答案 0 :(得分:13)

OFFSET可能就是你想要的功能。

=OFFSET(A1:A4,1,,2)

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

=INDEX(A1:A4,2):INDEX(A1:A4,3)

这是因为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显示数据范围中的五个数字中的哪一个。

enter image description here

如果你看一下A8:B8中的公式,你会发现它是一个数组输入的INDEX函数:{= INDEX(Data,Elements)}。这个公式说:“转到数据范围并根据用户在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))

......成为这个复杂但有礼貌的宠儿:

=SUM(INDEX(Data, N(IF({1},Elements))))

答案 1 :(得分:3)

您可以在没有数组公式的情况下获得此类行为。比方说 D1

=IFERROR(INDEX($A$1:$A$4,CHOOSE(ROWS($1:1),2,3)),"")

并复制下来。请注意 2,3 隐藏在CHOOSE()函数内。

enter image description here

您可以将 2,3 替换为任何索引集。

答案 2 :(得分:0)

更正

更新3

你应该使用数组公式:

= INDEX(A1:A4,{2;3})= INDEX(A1:A4,ROW($A$2:$A$3))

对于使用数组公式,(1)选择要垂直返回结果的单元格范围(例如B1:B2),然后按(2) F2 输入以上公式,然后(3) 按Ctrl + Shift + 输入

更新

说明:

您可以使用数组公式控制row_num的{​​{1}}和column_num个部分,以便返回更多特别需要的结果。

返回数组公式结果有两种方法:

  • (I)

    1. 选择要显示返回结果的范围。
    2. F2
    3. 输入数组表单公式。
    4. 然后按 Ctrl + Shift + 输入

示例:

INDEX
  • (II)

    1. 在要返回的第一个单元格中输入数组表单公式 结果(然后按 Ctrl + Shift + 输入),然后扩展公式。

示例:

=INDEX($A$1:$A$4,SMALL(IF($B$2=$A$1:$A$4,ROW($A$1:$A$4)-ROW($A$1)+1),ROW($A:$A)))

结论

=INDEX($A$1:$A$4,SMALL(IF($B$2=$A$1:$A$4,ROW($A$1:$A$4)-ROW($A$1)+1),ROW(A1))) 公式以数组形式工作。

您需要在数组中输入INDEXrow_num。为此,请使用合适的数组公式:column_numIFSMALL。请注意,CHOOSE不是数组形式公式。

临时样本文件(30天):book.xlsx

Sheet

答案 3 :(得分:0)

由于超级英雄XOR发现并基于@jeffreyweir上文提到的基于“去引用”的晦涩技术,我设法使VLOOKUP()也可以在CSE数组公式中使用(有人可以说{{1 }}或INDEX(MATCH())应该可以解决问题,是的...)。

在下面的3个示例中,目标始终是对LOOKUP()函数检索和返回的列$B:$B(2)中的值求和。

示例1:

仅在列VLOOKUP()中查找文本值

enter image description here

$A:$A

示例2:

仅在列=SOMME(RECHERCHEV(T(SI({1};$A$1:$A$3));$A$1:$B$3;2;0)) =SUM(VLOOKUP(T(IF({1},$A$1:$A$3)),$A$1:$B$3;2;0)) 中查找数值

enter image description here

$A:$A

示例3:

=SOMME(RECHERCHEV(N(SI({1};$A$1:$A$3));$A$1:$B$3;2;0)) =SUM(VLOOKUP(N(IF({1},$A$1:$A$3)),$A$1:$B$3,2;0)) 列中查找任何类型的值(数字/文本)

enter image description here

$A:$A

注1:尽管=SOMME(CNUM(RECHERCHEV(T(SI({1};TEXTE($A$1:$A$3;"@")));TEXTE($A$1:$B$3;"@");2;0))) =SUM(VALUE(VLOOKUP(T(IF({1},TEXT($A$1:$A$3,"@"))),TEXT($A$1:$B$3,"@"),2,0))) 解决方案不需要数组常量{1}(标量INDEX(MATCH())可以解决问题(或1等)),此True解决方案似乎必须使用向量形式。

注2:据我所知,VLOOKUP()N()是仅有的两个似乎允许“取消引用”范围并将其转换为类似于VBA的字符串/数值数组的函数。这可能与这种奇怪的行为有关:

enter image description here enter image description here

实际上,与任何CSE数组公式一样,预期结果应分别为T(){A,B,C} ...