如果A1:A4
范围内的数据如下:
Apple
Banana
Orange
Strawberry
然后INDEX
可用于单独返回该列表中的任何值,例如
= INDEX(A1:A4,3)
将返回Orange
。
是否有类似的Excel函数或函数组合可以有效地允许您执行以下操作:
= INDEX(A1:A4,{2;3})
哪会返回数组{Banana;Orange}
?
这是否可行(最好没有VBA),若然,怎么样?即使使用辅助细胞,我也很难搞清楚如何实现这一目标。
如果数据是数字(使用MMULT
),我可以找出一个有点复杂的解决方案,但数据是文本这一事实让我感到沮丧,因为MMULT
不适用于文本。< / p>
答案 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显示数据范围中的五个数字中的哪一个。
如果你看一下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()
函数内。
您可以将 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)
示例:强>
INDEX
(II)
示例:强>
=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)))
公式以数组形式工作。
您需要在数组中输入INDEX
或row_num
。为此,请使用合适的数组公式:column_num
,IF
,SMALL
。请注意,CHOOSE
不是数组形式公式。
临时样本文件(30天):book.xlsx
答案 3 :(得分:0)
由于超级英雄XOR发现并基于@jeffreyweir上文提到的基于“去引用”的晦涩技术,我设法使VLOOKUP()
也可以在CSE数组公式中使用(有人可以说{{1 }}或INDEX(MATCH())
应该可以解决问题,是的...)。
在下面的3个示例中,目标始终是对LOOKUP()
函数检索和返回的列$B:$B
(2)中的值求和。
示例1:
仅在列VLOOKUP()
中查找文本值
$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))
中查找数值
$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))
列中查找任何类型的值(数字/文本)
$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的字符串/数值数组的函数。这可能与这种奇怪的行为有关:
实际上,与任何CSE数组公式一样,预期结果应分别为T()
和{A,B,C}
...