web-dev-qa-db-ja.com

ExcelのINDEX関数は配列を返すことができますか?

A1:A4の範囲のデータが次の場合:

Apple
Banana
Orange
Strawberry

次に、INDEXを使用して、そのリストから任意の値を個別に返すことができます。

= INDEX(A1:A4,3)

Orangeを返します。

次のようなことを効果的に行える類似のExcel関数または関数の組み合わせはありますか?

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

どちらが配列{Banana;Orange}を返しますか?

これは可能ですか(できればVBAなし)。ヘルパーセルを使用しても、これを達成する方法を見つけるのに苦労しています。

データが数値の場合(MMULTを使用)、やや複雑な解決策を見つけることができますが、MMULTはテキストでは機能しないため、データがテキストであるという事実につまずきます。

OFFSETはおそらくあなたが望む関数です。

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

しかし、あなたの質問に答えるために、INDEXを実際に使用して配列を返すことができます。むしろ、コロンが間にある2つのINDEX関数:

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

これは、INDEXが実際にセル参照OR数値を返すため、Excelは要求するコンテキストに応じてこれらのどれを使用するかを決定するためです。2つの中央にコロンを配置する場合INDEX関数は、Excelが「ちょっと、コロン...通常、これらのいずれかの両側にセル参照があります」と言っているので、INDEXをそれだけと解釈します。詳細については http:// blog.excelhero.com/2011/03/21/the_imposing_index/

OFFSETは揮発性であるため、実際にはINDEXをOFFSETよりも優先します。つまり、ハットが発生すると絶えず再計算し、その下流の数式に同じことを強制します。詳細については、私の投稿をお読みください https://chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/

実際にはちょうどoneINDEXを使用して配列を返すことができますが、それは複雑で、逆参照と呼ばれるものが必要です。これについて私が書いている本の内容をいくつか紹介します。

このスクリーンショットのワークシートには、Dataという名前の範囲が上部のA2:E2の範囲に割り当てられています。その範囲には、10、20、30、40、および50の数字が含まれています。また、A5:B5の範囲に割り当てられたElementsという名前の範囲もあります。そのElements範囲は、A8:B8の式に、データ範囲の5つの数字のうちどれを表示するかを伝えます。

enter image description here

A8:B8の数式を見ると、配列に入力されたINDEX関数であることがわかります:{= INDEX(Data、Elements)}。この式は、「ユーザーが要素範囲で選択した要素に基づいて、データ範囲に移動し、そこから要素をフェッチします。」この特定の場合、ユーザーはそこから5番目と2番目のアイテムを要求しました。確かに、それがINDEXがセルA8:B8にフェッチするものです:50と20の対応する値。

ただし、A11に示すように、その完全に優れたINDEX関数を使用して、その周囲にSUMを配置しようとするとどうなるかを見てください。誤った結果が表示されます。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を「逆参照」する2つの非常に簡単な方法の概要を説明し、その結果を他の数式で直接使用できるようにします;これらのメソッドの1つは上記のA18に示されています。 Elementsの引数を入れるビットで、INDEXがボールをプレーします。そして、あとでやったように、Elementsの引数を入れるだけです。

N(IF({1},Elements))

これを念頭に置いて、元の誤動作式:

_=SUM(INDEX(Data,Elements))
_

...この複雑になりますが、礼儀正しいダーリン:

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

このタイプの動作は、配列式なしで取得できます。たとえばD1

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

コピーします。 2,3CHOOSE()関数内に埋め込まれていることに注意してください。

enter image description here

2,3を任意のインデックスセットに置き換えることができます。

3
Gary's Student

正しい

アップデート3

配列数式を使用する必要があります。

= INDEX(A1:A4,{2;3})の場合= INDEX(A1:A4,ROW($A$2:$A$3))と書く

配列数式を使用する場合、(1)select結果を返すセルの範囲を垂直に(たとえばB1:B2)、次に(2)を押します F2 および上記の式を入力し、次に(3)press Ctrl + Shift + Enter

更新

説明:

INDEXrow_numおよびcolumn_num部分を配列式で制御して、より特別に必要な結果を返すことができます。

配列数式の結果を返すには、2つのアプローチがあります。

  • (私)

    1. 返された結果を表示する範囲を選択します。
    2. 押す F2
    3. 配列形式の数式を入力します。
    4. 次に 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)))
  • (II)

    1. 返された結果を表示する最初のセルに配列形式の数式を入力します(その後、 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_numまたはcolumn_numを入力する必要があります。これには、IFSMALLCHOOSEなどの適切な配列式を使用します。 MATCHは配列形式の式ではないことに注意してください。

一時的なサンプルファイル(30日間): book.xlsx

Sheet

0
mgae2m