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

Posted

技术标签:

【中文标题】Excel的INDEX函数可以返回数组吗?【英文标题】:Can Excel's INDEX function return array? 【发布时间】:2018-04-21 14:55:09 【问题描述】:

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

Apple
Banana
Orange
Strawberry

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

= INDEX(A1:A4,3)

将返回Orange

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

= INDEX(A1:A4,2;3)

哪个会返回数组Banana;Orange

这是否可能(最好没有 VBA),如果可以,如何实现?即使使用辅助单元格,我也很难弄清楚如何做到这一点。

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

【问题讨论】:

简答,不。 @ScottCraner 长答案是“是的,使用 VBA”吗? 这很可能是正确的,但如果您详细说明您从什么开始以及您想在哪里结束,我们可能会找到替代方案。 那是因为我误解了你想要的。我想您希望能够选择列表的索引并将它们返回到可以在公式中使用的数组。如果我知道你想要连续的细胞,那么我会给出那个公式。但据我了解,您想要选择的能力,即“=INDEX(A:A,1,3) and return "Apple","Orange"),这是不可能的。是的,您可以使用 INDEX 设置范围的开始和结束,我经常在回答问题时使用它。但又一次这不是你问的。以及为什么我试图从你那里获得更多信息。 @ScottCraner:可以使用 INDEX 返回非连续单元格,如果您像我在答案的第二部分中所做的那样取消引用它。并不是说我可能会在 OFFSET 上使用它.... 【参考方案1】:

OFFSET 可能是您想要的功能。

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

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

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

这是因为 INDEX 实际上返回一个单元格引用或一个数字,而 Excel 会根据您询问的上下文来确定您想要哪一个。如果您在两个 INDEX 函数的中间放置一个冒号,Excel 会说“嘿一个冒号......通常在其中一个的每一侧都有一个单元格引用”,因此将 INDEX 解释为就是这样。您可以在http://blog.excelhero.com/2011/03/21/the_imposing_index/ 阅读更多相关信息

我实际上更喜欢 INDEX 而不是 OFFSET,因为 OF​​FSET 是易变的,这意味着它会不断地重新计算,然后强制其下游的任何公式执行相同的操作。有关这方面的更多信息,请阅读我的帖子 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。Excel 中的 20 发生了什么?

出于某种原因,虽然=INDEX(Data,Elements) 会很高兴地从某个地方获取不同的元素,然后将这些数字分别返回到一个范围,但如果您要求它而不是将这些数字提供给另一个函数,它就不太愿意遵守。事实上,它非常不情愿,只将第一个元素传递给函数。

因此,如果你想用它做其他事情,你似乎不得不首先将 =INDEX(Data,Elements) 函数的结果返回到网格中。乏味。但几乎每个 Excel 专业人士都会简单地告诉您没有解决方法……就是这样,您别无选择。

Buuuuuuuut,他们错了。在http://excelxor.com/2014/09/05/index-returning-an-array-of-values/ 的帖子中,神秘的公式超级英雄 XOR 概述了两种相当简单的方法来“取消引用”INDEX,这样您就可以直接在其他公式中使用它的结果;其中一种方法显示在上面的 A18 中。事实证明,如果您通过添加一个额外的位来稍微修改 INDEX 函数来封装 Elements 参数,则 INDEX 会发挥作用。您需要做的就是将 Elements 参数封装起来,如下所示:

N(IF(1,Elements))

考虑到这一点,您最初的行为不端公式:

=SUM(INDEX(Data,Elements))

...变成了这个复杂但彬彬有礼的宠儿:

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

【讨论】:

哇,从来不知道INDEX 可以以多种方式使用。您的公式=INDEX(A1:A4,2):INDEX(A1:A4,3) 运行良好。 好吧,这很酷,我学会了自己 somtin'。 =TEXTJOIN(",",TRUE,INDEX(B:B,N(IF(1,(ROW(1:15)-1)*2+2)))) 刚刚从第 2 行开始加入 B 列中的每隔一行。 这个数组公式= INDEX(<Data>,N(IF(1,<Elements>))) 非常棒。再次感谢@jeffreyweir 确保在 1 周围加上大括号:N(if(1,否则必须对 Elements 进行硬编码。【参考方案2】:

您可以在没有数组公式的情况下获得这种类型的行为。在说D1

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

然后抄下来。注意 2,3 隐藏在 CHOOSE() 函数中。

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

【讨论】:

【参考方案3】:

正确

更新 3

你应该使用数组公式:

对于= INDEX(A1:A4,2;3)= INDEX(A1:A4,ROW($A$2:$A$3))

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

更新

说明:

您可以使用数组公式控制INDEXrow_numcolumn_num 部分,以返回更多特别想要的结果。

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

(一)

    选择要显示返回结果的范围。 按 F2 输入您的数组形式公式。 然后按 Ctrl + Shift + Enter

示例:

=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)))

(二)

    在您希望返回的第一个单元格中输入数组形式公式 结果(然后按Ctrl + Shift + Enter),然后扩展公式。

示例:

=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_numcolumn_num。为此,请使用合适的数组公式:IFSMALLCHOOSE。注意MATCH不是数组形式的公式。

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

【讨论】:

这不起作用...INDEX 的第二个参数必须是数字。由于$A$2:$A$3 的计算结果为Banana;Orange,因此您的公式在此处返回错误,特别是#VALUE!。无论您是否将其作为数组公式输入都没有区别。 我已经更新了答案并用更好的细节进行了更正。请查看我的回答并判断它的价值和接受度。 我建议使用数组公式,它在某些情况下更强大。 反对票将保留。您回答的第一部分完全错过了我的问题的重点。最重要的是,这个公式甚至不起作用。如果您的公式= INDEX(A1:A4,ROW($A$2:$A$3)) 作为数组公式输入,则仅返回A2 中的值,问题的重点是使用独立索引,而不是简单地采用单元格范围的ROW。您的公式是多余的,因为= INDEX(A1:A4,ROW($A$2:$A$3)) 基本上是编写公式= $A$2:$A$3 的复杂方法。此外,您的 SMALL 函数缺少参数。 @ImaginaryHuman072889,我给你插入一个示例文件。和图片。你是对的人。我羞愧地向你道歉。我的公式(包含SMALL 函数)涉及错误。在将示例文件和图片发送给您之前,我对其进行了更正和测试。希望我的回答能达到您的满意和接受。并投票。并解决您的问题。请询问任何遗体问题。请原谅我最初的回答错误。【参考方案4】:

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

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

示例 1:

仅在 $A:$A 列中查找文本值

=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))

示例 2:

仅在 $A:$A 列中查找数值

=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))

示例 3:

$A:$A 列中查找任何类型的值(数字/文本)

=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(标量 1 可以解决问题(或 True 等)),但向量形式似乎对于这个VLOOKUP() 解决方案。

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

确实,与任何 CSE 数组公式一样,预期结果应该分别为 A,B,C1,2,3...

【讨论】:

仅供参考,如果您的 Office 版本支持名为“动态数组公式”的新功能,则不再需要制作 CSE 公式,Excel 现在会自动检测数组输入。所以,公式=SUM(VLOOKUP($A$1:$A$3,$A$1:$B$3;2;0))输入正常返回6,而=SUM(VLOOKUP($A$1:$A$3,$A$1:$B$3;2;0))错误返回1。 嗨,您提到了 INDEX(MATCH()) 解决方案,但只显示 VLOOKUP - 我无法使用 INDEX(MATCH())。你有一个可行的例子吗? 是的,这是一个:=SUM((INDEX($D$1:$D$2;N(IF(1;MATCH($A$1:$A$5;$C$1:$C$2;0))))*($A$1:$A$5=F1)))。正如我在之前的评论中所说,现在您甚至不需要将公式验证为数组公式,它也可以作为普通公式使用i.stack.imgur.com/B02WC.png 假设您在A列中有某些数据,数据的每个元素都有一个对应的值,在蓝色表中给出。您可以立即将匹配某个条件的所有元素的对应值相加,这里是第 1 行中的“A”元素,然后是第 2 行中的“B”元素:

以上是关于Excel的INDEX函数可以返回数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

高手来,excel在一组数组中查找值,并返回对应的某一列的值,怎么实现

EXCEL中INDEX怎么使用

excel返回地址函数的使用教程

数组的filter返回新数组所以不影响原数组吗?

excel内存数组

Excel中,如何随机返回一个值,从已有的数组里,如从(value1,value2,value3,value4,value5,value6....)中取一