livedoor blog でコードハイライト【VSCode】mdwiki をスムーズに閲覧する方法

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

実際に作成した表は下記のような感じです。購入していない(価格を調べていない)ところは空白になっています。

20210408_1

各商品の最安値とそれを購入した場所を調べる

やり方は下記のとおりです。

まずはおでん缶の最安値を探します。単純にMIN 関数で良いでしょう。

=MIN(E2:E)

これを例えばセルG2に入れておきます。

次に最安値をキーとして最安値の場所を良い感じに調べます。

=INDIRECT(ADDRESS(MATCH(G2,E:E,0),2,1,TRUE))

やっていることはMATCH 関数でE列の中から最安値と一致する行番号を探し、ADDRESS 関数で行番号と列番号(2はB列のこと)からアドレス値"$B$2"文字列を作成し、INDIRECT 関数にてアドレス値の文字列からセル参照を取得します。
結果として下記の画像のように良い感じに値の取得ができます。


20210408_2



各関数の詳しい説明については下記を参照してください。

MATCH - ドキュメント エディタ ヘルプ

ADDRESS - ドキュメント エディタ ヘルプ

INDIRECT - ドキュメント エディタ ヘルプ

VLOOKUP について

VLOOKUP - ドキュメント エディタ ヘルプの使い方を見ると下記のようになっています。

VLOOKUP(検索キー, 範囲, 番号, [並べ替え済み])

この関数では問題が2つあります。

  1. VLOOKUP では検索キーに指定したキーを範囲内から探し、"範囲内の"番号で指定した列の値しか取れないこと
    今回の表で言えばツナ缶の最安値である「250」から場所の「松井商店」を探すためには検索キーに「250」を入れ、範囲は「B1:C4」とする必要があります(今後も増える可能性を考えれば「B:C」とかにする)。
    今回のようなキーが数字で調べたい対象が文字列の場合にはすべて範囲に含めても良いですが、どちらも数字だったり文字で重複が考えられる場合は範囲に含められません。
  2. 範囲に飛び値を指定できない
    こちらは調査不足の可能性がありますが、VLOOKUP の範囲指定を場所と鯖缶だけのような指定にする方法がわかりませんでした。いちおう飛び値の指定方法として「(B:B,D:D)」のような方法がありますが、うまく動作してくれませんでした。
    また、Google スプレッドシートで配列を使用する - ドキュメント エディタ ヘルプ を参考に「{B:B,D:D}」のように新たに配列を作って検索がうまくできませんでした。
INDEX とMATCH について

これでできることについては【Googleスプレッドシート】INDEXとMATCHを使って値を取得する - ソースに絡まるエスカルゴ に詳しく書かれていますのでそちらを参考にしてください。

このやり方では問題が1つあります。

  1. INDEX 関数では範囲内からでしか値を取得できない
    VLOOKUP と同様ですね。

このやり方ではINDEX の範囲を配列を使って作成することで飛び値も良い感じに検索できるので、1に挙げた問題が気にならなければこの方法で良いと思います。



愚痴

今回のやりたいことを調べている途中で、VLOOKUP で調べる際に範囲外のセルを参照しないといけないような表を作ることを批判されている記事を見つけましたが、ユーザーが記入するのであればそういう表は十分あり得ることです。今回のような表の行末に新しく商品が追加される場合には日付と場所は左に書いておく必要がありますし、スプレッドシートにてグラフを作成することを考えれば分かりやすさの点でこの方法で良いと思います。
もし、ユーザーが直接触れない場所でのデータ管理(データベースでの情報管理)であれば言い分は分かりますしそうすべきですが、直接触れるのであればユーザーフレンドリーに作るべきでしょう。



rabbitcats at 10:00│Comments(0) ソフトウェア 

コメントする

名前
 
  絵文字
 
 
livedoor blog でコードハイライト【VSCode】mdwiki をスムーズに閲覧する方法