web-dev-qa-db-ja.com

複数のvlookupの合計を返す

さて、私は1つの式ですべてを解決しようとしている問題があります。

私はテーブルのセットアップを持っています:

my table

リンゴにはNFPI(果物の数x強度のパーセント)がいくつありますか?

表3の列Gを表1の列Bに対してスキャンして、どの行に種類のAppleが含まれているかを確認する必要があります。

次に、Appleが出現するたびに果物の総数を見つける必要があります。

(Number of trees * Tree fruit) + ground fruit

そして、適切なパーセント強度で表2の果物の総数を見つけ、すべての発生を合計します

したがって、次のようになります。

(1 * 3) + 2 = 5 Red Apples. NFPI of 5 fruits at 97% intensity = 1.67  
(2 * 2) + 0 = 4 Green Apples. NFPI of 4 fruits at 98% intensity = 2  
(1 * 2) + 1 = 3 Yellow Apples. NFPI of 3 fruits at 97% intensity = 1  
**total NFPI = (1.67 + 2 + 1) = 4.67**

私はこれをすべて1つの式で実行しようとしています。私が使用しようとした数式は、vlookupを配列数式に組み込んでいますが、間違った答えを返し続けます。これが私が試した式です:

{=SUM(IF(ISERROR(MATCH(G12:G16,B3:B5,0))=FALSE,VLOOKUP(H12:H16,F4:K8,(I12:I16*J12:J16)+K12:K16+1),0))}

なぜそれが機能しないのか、それを機能させる方法がわかりません。 SUMPRODUCTの数式が役立つかもしれないと思いましたが、それも理解できませんでした。各AppleエントリのNFPIを見つけて、それをGround Fruit列の隣の別の列に入力し、その下部にSUM式を配置するだけでよいことはわかっています。すべてを合計しますが、可能であればそれを行わずに合計を見つけようとしています。

どんな助けでもいただければ幸いです!

2
Sean

EDIT:@ ScottCranerからの最近の回答では、「参照解除された」INDEX()式が使用され、彼の回答により、別の式を採用することにしました。この問題にひびが入ります。私が(失敗して)以前に試したのと同じアプローチが、2回目は完全に機能しました。以下に解決策を説明します。

逆参照されたINDEX()式の背景:

ショーン、あなたはあなたがする必要があることをするために配列数式を使うという立派な試みをしました。あなたが抱えている問題は、Excelが配列を処理する方法に関連しています。配列を引数として使用できる数式もあれば、使用できない数式もあります。

私はこれを掘り下げて、ExcelのINDEX()式で配列を使用することについて、これまで知らなかった非常に奇妙で不可解なことを学びました。この式がどのように機能するかを理解するために、最後から始めましょう。

数式が実行する最後のことは、表2である2D配列からの3つの(不連続な)値を合計することです。

INDEX(array,row_num,col_num)は、2D配列から単一の値を返すことができ、列または行全体を返すこともできます。値のリストを返すことができるようにすべきのようです。それでは、テストしてみましょう。

この式は(完璧な世界では)表2から探している合計を返します。

=SUM(INDEX(G4:K8,{3,2,3},{5,4,3}))

これで、行3、列5と行2、列4と行3、列3の要素が追加されます。ただし、ではなく、参照される最初の要素である1.67を返します。

オンラインで検索すると、INDEX()が配列を返すという参照(1つを含む ここではStackOverflow )が生成されますが、これはde-reference式(これは「奇妙な」部分です)。 「難解な」部分はそれを行う方法です。これは「参照解除された」式です。

=SUM(INDEX(G4:K8,N(IF(1,{3,2,3})),N(IF(1,{5,4,3}))))

この式は正しい答えを与えます:4.67。

数式では、IF()は1をTrueとして扱うため、数値の配列を返し、N()は数値の場合は数値の配列を返します。彼らはそれです。数式を正しく機能させるためにIF()とN()が必要な理由は、誰もが推測できます。 スコットの数式 では、配列も乗算する必要がありました(範囲参照でした)1。

しかし、今では正しい答えを与える式があります。そしてうまくいけば、私たちがしなければならないのは、配列定数を他のデータを使用して計算された配列に置き換えることだけです。

新しい情報はここから始まります。

_{3,2,3}_の上の式のrow_numの場合、選択した果物の品種に関連付けられたF4:F8のパーセント強度の位置が必要です。まず、表3の_G12:G16_にあるリンゴの位置の配列を取得します。

=MATCH(B3:B5,G12:G16,0)

これは配列数式であり、次のように入力する必要があります CTRLShiftEnter、だけでなく Enter

この式は、表3の列Gで表1からApple品種のリストを探し、それらの位置の配列を返します。

数式バーで数式を選択してF9キーを押すと、数式のが配列_{1,3,4}_、列内のリンゴの位置であることがわかります。表3のG。

次に、これらのポジションに関連付けられたPIが必要です。このINDEX()式は列Hを調べ、上記の配列をrow_numとして使用します。ここで、row_numは「参照解除」する必要があります。

=INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0))))

この式は、AppleのPIである配列_{0.97,0.98,0.97}_を返します。ここまでは順調ですね。次に、その配列を、表2のPIインデックスであるF4:F8を検索するMATCH()式のルックアップ値として使用します。

=MATCH(INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0)))),F4:F8,0)

この数式は配列_{3,2,3}_を返し、これらは最終的な数式に必要なrow_numです。

次に、col_numの_{5,4,3}_が必要です。これは、各Apple品種の果物の総数です。これは表3から取得しますが、最初に計算する必要があります。すべての果物品種の果物の総数。この(計算された)配列は、それらの合計のリストです。

_(I12:I16*J12:J16)+K12:K16_

Apple品種の果物の総数を取得するには、その配列をINDEX()で使用し、以前と同じ(参照解除された)row_numを使用します。

=INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(B3:B5,G12:G16,0))))

この数式は配列_{5,4,3}_を返し、これらは最終的な数式に必要なcol_numです。

これをすべてまとめると、NFPIのリストは次のとおりです。

=INDEX(G4:K8,MATCH(INDEX(H12:H16,N(IF(1,MATCH(B3:B5,G12:G16,0)))),F4:F8,0),INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(B3:B5,G12:G16,0))))

この数式は、配列_{1.67;2;1}_を返します。これらはApple用のNFPIであり、今はそれらを合計する必要があります。

しかし、まだ完全ではありませんが、最初に対処する必要のある小さな問題があります。 3つすべてのApple品種は表3にありますが、これはオレンジには当てはまりません。上記の式は、_#N/A_を含む配列を返します。値を合計するときまで、これは問題を引き起こしません。

したがって、合計をとる前に、IFERROR()式を使用して_#N/A's_を0に変換します。最終的な式は次のとおりです。

=SUM(IFERROR(INDEX(G4:K8,MATCH(INDEX(H12:H16,N(IF(1,MATCH(C3:C5,G12:G16,0)))),F4:F8,0),INDEX((I12:I16*J12:J16)+K12:K16,N(IF(1,MATCH(C3:C5,G12:G16,0))))),0))

この数式は、リンゴの場合は4.67、オレンジの場合は5.75を返します。

ショーン、これがまだ役立つことを願っています。長い遅れでごめんなさい。

1
Bandersnatch

[〜#〜] edit [〜#〜]このページの他の回答を参照してください。 INDEX() CANは、配列から(不連続な)値のリストを返すことができます。

数式は非常に長いことがわかりますが、これはあなたがやろうとしていることを達成するための別の方法です。

次の式は、表2の3つのNFPIのそれぞれを検索し、それらを合計します。

=INDEX(G$4:K$8,MATCH(INDEX(H$12:H$16,MATCH(B3,G$12:G$16,0)),F$4:F$8,0),MATCH(INDEX(L$12:L$16,MATCH(B3,G$12:G$16,0)),G$3:K$3,0))+INDEX(G$4:K$8,MATCH(INDEX(H$12:H$16,MATCH(B4,G$12:G$16,0)),F$4:F$8,0),MATCH(INDEX(L$12:L$16,MATCH(B4,G$12:G$16,0)),G$3:K$3,0))+INDEX(G$4:K$8,MATCH(INDEX(H$12:H$16,MATCH(B5,G$12:G$16,0)),F$4:F$8,0),MATCH(INDEX(L$12:L$16,MATCH(B5,G$12:G$16,0)),G$3:K$3,0))

仕組み:合計の各項はINDEX()関数であり、row_numとcolumn_numを指定して表2の要素を返します。最初の項では、row_numは最初にINDEX()を使用して検出され、表3でB3(Red Apple)を検索し、関連する%Intensityを返します。

INDEX(H$12:H$16,MATCH(B3,G$12:G$16,0))

次に、このPIをMATCH()で使用して、表2の正しい行を返します。

MATCH(INDEX(H$12:H$16,MATCH(B3,G$12:G$16,0)),F$4:F$8,0)

Column_numは、最初に正しい数の果物を見つけることによって見つけられます。表3に、L12:L16の果物の総数を計算する列を追加しました。それが不可能な場合は、L$12:L$16(I$12:I$16)*(J$12:J$16)+(K$12:K$16)に置き換えることで、「オンザフライ」で果物の数を計算できます。

INDEX(L$12:L$16,MATCH(B3,G$12:G$16,0))

Row_numに関しては、これはMATCH()で使用され、表2の正しい行を返します。

MATCH(INDEX(L$12:L$16,MATCH(B3,G$12:G$16,0)),G$3:K$3,0)

Red Appleの行と列がわかったので、合計の最初の項は次のようになります。

=INDEX(G$4:K$8,MATCH(INDEX(H$12:H$16,MATCH(B3,G$12:G$16,0)),F$4:F$8,0),MATCH(INDEX(L$12:L$16,MATCH(B3,G$12:G$16,0)),G$3:K$3,0))

緑Appleと黄色Appleの残りの2つの項は同じ式ですが、B4B5B3に置き換わっています。

これがお役に立てば幸いです。

1
Bandersnatch