INDIRECT
2021年04月09日
【Googleスプレッドシート】INDIRECTとADDRESSとMATCHを使って値を取得する
タイトルが仰々しい感じではありますが、買い物をした時の商品の値段や購入場所、日付などをgoogleスプレッドシートに追加していき、最安値とその価格を良い感じに抜き出したかったのが発端です。
いろいろと調べてみるとVLOOKUPで抜き出す方法が最初に目につきますが、それでは使い勝手が少し悪く、INDEXとMATCHを使った方が良いよとの記事もありましたがなかなか上手くできなかったのでタイトルの関数たちで実現することになりました。
ちなみに検索していたら、相互リンクしている「ソースに絡まるエスカルゴ」さまのページにたどり着いたので記事を参考に同じように解説していこうと思います。
表データの準備
まずは取得したい表データを準備します。表データはGoogleスプレッドシートにて作成しています。
作成した表は下記のとおりです。買い物(や価格調査)をするたびに行数を増やしていくことになります。
日付 | 場所 | ツナ缶 | 鯖缶 | おでん缶 |
---|---|---|---|---|
1977/04/08 | 村上商店 | 288 | 358 | 379 |
1977/05/13 | 松井商店 | 250 | 381 | |
1977/06/21 | スーパー北斗 | 360 | 360 |
実際に作成した表は下記のような感じです。購入していない(価格を調べていない)ところは空白になっています。
各商品の最安値とそれを購入した場所を調べる
やり方は下記のとおりです。
まずはおでん缶の最安値を探します。単純にMIN 関数で良いでしょう。
=MIN(E2:E)
これを例えばセルG2に入れておきます。
次に最安値をキーとして最安値の場所を良い感じに調べます。
=INDIRECT(ADDRESS(MATCH(G2,E:E,0),2,1,TRUE))
やっていることはMATCH 関数でE列の中から最安値と一致する行番号を探し、ADDRESS 関数で行番号と列番号(2はB列のこと)からアドレス値"$B$2"文字列を作成し、INDIRECT 関数にてアドレス値の文字列からセル参照を取得します。
結果として下記の画像のように良い感じに値の取得ができます。
各関数の詳しい説明については下記を参照してください。
VLOOKUP について
VLOOKUP - ドキュメント エディタ ヘルプの使い方を見ると下記のようになっています。
VLOOKUP(検索キー, 範囲, 番号, [並べ替え済み])
この関数では問題が2つあります。
- VLOOKUP では検索キーに指定したキーを範囲内から探し、"範囲内の"番号で指定した列の値しか取れないこと
今回の表で言えばツナ缶の最安値である「250」から場所の「松井商店」を探すためには検索キーに「250」を入れ、範囲は「B1:C4」とする必要があります(今後も増える可能性を考えれば「B:C」とかにする)。
今回のようなキーが数字で調べたい対象が文字列の場合にはすべて範囲に含めても良いですが、どちらも数字だったり文字で重複が考えられる場合は範囲に含められません。 - 範囲に飛び値を指定できない
こちらは調査不足の可能性がありますが、VLOOKUP の範囲指定を場所と鯖缶だけのような指定にする方法がわかりませんでした。いちおう飛び値の指定方法として「(B:B,D:D)」のような方法がありますが、うまく動作してくれませんでした。
また、Google スプレッドシートで配列を使用する - ドキュメント エディタ ヘルプ を参考に「{B:B,D:D}」のように新たに配列を作って検索がうまくできませんでした。
INDEX とMATCH について
これでできることについては【Googleスプレッドシート】INDEXとMATCHを使って値を取得する - ソースに絡まるエスカルゴ に詳しく書かれていますのでそちらを参考にしてください。
このやり方では問題が1つあります。
- INDEX 関数では範囲内からでしか値を取得できない
VLOOKUP と同様ですね。
このやり方ではINDEX の範囲を配列を使って作成することで飛び値も良い感じに検索できるので、1に挙げた問題が気にならなければこの方法で良いと思います。
続きを読む