[英]Can Excel's INDEX function return array?
如果A1:A4
范圍內的數據如下:
Apple
Banana
Orange
Strawberry
然后INDEX
可用於從該列表中單獨返回任何值,例如
= INDEX(A1:A4,3)
會返回Orange
。
是否有類似的 Excel 函數或函數組合可以有效地讓您執行以下操作:
= INDEX(A1:A4,{2;3})
哪個會返回一個數組{Banana;Orange}
?
這是否可能(最好沒有 VBA),如果是,如何? 即使使用輔助細胞,我也很難弄清楚如何實現這一點。
如果數據是數字(使用MMULT
),我可以找出一個有點復雜的解決方案,但數據是文本這一事實讓我感到MMULT
,因為MMULT
不適用於文本。
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,因為 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(Data,Elements) 函數的結果返回到網格。 乏味。 但是幾乎每個 Excel 專業人士都會簡單地告訴您沒有解決方法……事情就是這樣,您別無選擇。
Buuuuuuuut,他們錯了。 在http://excelxor.com/2014/09/05/index-returning-an-array-of-values/帖子中,神秘公式超級英雄 XOR 概述了兩種相當簡單的“取消引用”INDEX 的方法,以便您可以然后在其他公式中直接使用它的結果; 其中一種方法顯示在上面的 A18 中。 事實證明,如果您通過添加一個額外的位來封裝 Elements 參數,稍微修改 INDEX 函數,INDEX 就會發揮作用。 您需要做的就是將 Elements 參數封裝起來,就像我在下面所做的那樣:
N(IF({1},元素))
考慮到這一點,您最初的行為不端公式:
=SUM(INDEX(Data,Elements))
...成為這個復雜但彬彬有禮的寵兒:
=SUM(INDEX(Data, N(IF({1},Elements))))
正確
更新 3
您應該使用數組公式:
對於= INDEX(A1:A4,{2;3})
寫= INDEX(A1:A4,ROW($A$2:$A$3))
對於使用數組公式,(1)選擇您想要返回結果的單元格范圍,垂直(例如 B1:B2)然后按 (2) F2並輸入上面的公式,然后 (3)按Ctrl + Shift + Enter 。
您可以使用數組公式控制INDEX
row_num
和column_num
部分,以返回更特別想要的結果。
返回數組公式結果有兩種方法:
(一)
示例:
=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
。 請注意, MATCH
不是數組形式的公式。
臨時示例文件(30 天): book.xlsx
多虧了超級英雄 XOR 發現並由 @jeffreyweir 在上面提到的基於“取消引用”的晦澀技術,我設法使VLOOKUP()
也適用於 CSE 數組公式(可以說是INDEX(MATCH())
或LOOKUP()
應該可以解決問題,是的......)。
在下面的 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,C}
和{1,2,3}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.