Excel 2次元の表からの値の取得について


以下のような、縦軸が店名、横軸が品名の値段の表があり、店名(C7セル)・品名(C8セル)を入力すると、表からその値段を取得し、C9セルに表示させるようにしたい…とします。

この時、VBAのループ処理で、シート上の該当する店名・品名の位置を検索して…というやり方もありますが、以下のINDEX関数とMATCH関数を組み合わせた数式1つでも実現することができます。
=INDEX($C$3:$E$5,MATCH(C7,$B$3:$B$5,0),MATCH(C8,$C$2:$E$2,0))

数式の中の関数について説明します。

まずMATCH関数について、引数と戻り値は以下となります。

                                                        • -

引数 :MATCH(検査値,検査範囲,照合の種類)
戻り値:セルの検査範囲内で指定された検索値を検索し、その項目の相対的な位置を返します。

                                                        • -

数式の中の最初のMATCHについて、
検査値  :C7セルの「B店」
検査範囲 :B3〜B5セル
照合の種類:0(完全一致)
→B3〜B5セルの中で、2番目の位置に「B店」があるので、2を返します。…(1)

次のMATCHについて、
検査値  :C8セルの「ニンジン」
検査範囲 :C2〜E2セル
照合の種類:0(完全一致)
→C2〜E2セルの中で、2番目の位置に「ニンジン」があるので、2を返します。…(2)

最後にINDEX関数について、引数と戻り値は以下となります。

                                                        • -

引数 :INDEX(参照範囲,行番号,列番号)
戻り値:行番号と列番号で指定された参照範囲の要素の値を返します。

                                                        • -

この数式では、
参照範囲:C3〜E5セル
行番号 :(1)より、2
列番号 :(2)より、2
となり、参照範囲であるC3〜E5セルの、2行目・2列目の値、すなわち「145」が取得できます。

Excelの数式を使用しているため、VBAよりも処理時間が短縮されることが期待できます。

店名や品名に、表に無い値が入ると、C9セルに「#NAME?」が表示されてしまうので、以下のようにIFERROR関数で括るとさらによいと思います。
=IFERROR(INDEX($C$3:$E$5,MATCH(C7,$B$3:$B$5,0),MATCH(C8,$C$2:$E$2,0)),"見つかりません")

【株式会社 エム・システム】
本      社  :〒124-0023 東京都葛飾東新小岩8-5-5 5F
           TEL : 03-5671-2360 / FAX : 03-5671-2361
盛岡事業所  :〒020-0022 岩手県盛岡市大通3-2-8 3F
           TEL : 019-656-1530 / FAX : 019-656-1531
E-mail    : info@msystm.co.jp 
URL     : http://msystm.co.jp/
ブログ       : http://d.hatena.ne.jp/msystem/ 
Facebook   : http://www.facebook.com/msysteminc