GoogleスプレッドシートやEXCELで、他の表とキーが一致する行の値を取得するときにはVLOOKUP関数を使うのが定石です。
VLOOKUPはとっても便利な関数なんですが、不便なところもあります。
- 検索できるのは指定した範囲の先頭列のみ
- 取得する列は列番号で指定する
一番の問題は、VLOOKUP関数で検索できるのは先頭列のみで、取得する値がある列は検索する列よりも右側になければなりません。
もちろん表の列を移動させれば解決できますが、Google Sheetsで IMORTRANGE関数 で他のスプレッドシートを読み込んでいる場合などは致命的です。
また取得する値を列番号で指定するのも、AD列なら30と指定しなければならないので、列数が多くなるとわからなくなってしまいます。
ということで、VLOOKUP の代わりとなる方法(関数)の紹介です。
サンプルで使用するデータ
サンプルの表は「国番号一覧」と「国コード一覧」2つのシートです。
国番号一覧に2桁の国コードを取得するために、「国番号一覧」シートの「国名(日本語)」で「国コード一覧」シートの「日本語名」を検索して国名が一致する「2文字」から2桁の国コードを取得します。
下記の2表をコピペしてシートに貼り付けてください。
国番号(電話) | エリア | 国名(日本語) | 国名(英語) | 国コード |
---|---|---|---|---|
60 | アジア | マレーシア | Malaysia | |
61 | 太平洋諸国 | オーストラリア | Australia | |
62 | アジア | インドネシア共和国 | Indonesia | |
63 | アジア | フィリピン共和国 | Philippines | |
64 | 太平洋諸国 | ニュージーランド | New Zealand | |
65 | アジア | シンガポール共和国 | Singapore | |
66 | アジア | タイ王国 | Thailand | |
81 | アジア | 日本国 | Japan | |
82 | アジア | 大韓民国 | Republic of Korea | |
84 | アジア | ベトナム社会主義共和国 | Viet Nam | |
86 | アジア | 中華人民共和国 | Chaina | |
90 | アジア | トルコ共和国 | Turkey | |
91 | アジア | インド | India | |
92 | アジア | パキスタン・イスラム共和国 | Pkistan | |
93 | アジア | アフガニスタン・イスラム共和国 | Afghanistan | |
94 | アジア | スリランカ民主社会主義共和国 | Srilanka | |
95 | アジア | ミャンマー連邦 | Myanmar | |
98 | アジア | イラン・イスラム共和国 | Iran |
2文字 | 3文字 | 英語名 | 日本語名 |
---|---|---|---|
AF | AFG | Afghanistan | アフガニスタン・イスラム共和国 |
AU | AUS | Australia | オーストラリア |
CN | CHN | China | 中華人民共和国 |
IN | IND | India | インド |
ID | IDN | Indonesia | インドネシア共和国 |
IR | IRN | Iran | イラン・イスラム共和国 |
JP | JPN | Japan | 日本国 |
KR | KOR | Republic of Korea | 大韓民国 |
MY | MYS | Malaysia | マレーシア |
MM | MMR | Myanmar | ミャンマー連邦 |
NZ | NZL | New Zealand | ニュージーランド |
PK | PAK | Pakistan | パキスタン・イスラム共和国 |
PH | PHL | Philippines | フィリピン共和国 |
SG | SGP | Singapore | シンガポール共和国 |
LK | LKA | Sri Lanka | スリランカ民主社会主義共和国 |
TH | THA | Thailand | タイ王国 |
TR | TUR | Turkey | トルコ共和国 |
VN | VNM | Viet Nam | ベトナム社会主義共和国 |
EXCELならXLOOKUPを使う
Microsoft365(EXCEL)であれば VLOOKUP の上位互換である XLOOKUP があります。XLOOKUP関数を使えば、VLOOKUP の不便さが解消できます。
XLOOKUP 関数 に詳細の説明がありますが、今回のケースであれば、とってもシンプルに記載できます。
上図の国番号一覧シートの ”E2” に下記のように記載します。
上式で国番号一覧シートのC2(国名=マレーシア)で、国コード一覧のD列(日本語名)を検索して、国名が一致する国コード一覧のA列の値が取得できます。
検索する値(C2)、検索する列(国コード一覧!D:D)、取得する値の列(国コード一覧!A:A)と、理解しやすい表記ができます。
国コード一覧シートは下記のようになっています。
優れもののXLOOKUPですが、残念ながらMicrosoft365(旧Office365)でしか使えません。
Excel2019/2016では、後述するGoogleスプレッドシートで説明する方法を使ってください。
Google Sheets なら関数を組み合わせる
GoogleスプレッドシートにはXLOOKUP関数に対応する関数はありません。
しかし、関数を組み合わせることによってVOOKUPより便利にキーが一致する別表の値を取得することができます。
INDEX関数+MATCH関数
INDEX関数とMATCH関数の組み合わせる方法については、INDEX - ドキュメント エディタ ヘルプ にも記載されています。
VLOOKUPではできなかった検索する列が参照範囲の左端(1列目)になくても検索が可能になります。しかし、キーが一致する行の値を取得する列については列番号(数字)で指定する必要があります。
上図の国番号一覧シートの ”E2” に下記のように記載します。
先ずは、INDEX関数 の説明です。
上の式を分解すると、
参照範囲 | '国コード一覧'!A:D |
---|---|
行番号 | MATCH(C2,'国コード一覧'!D:D,0) |
列番号 | 1 |
となります。
行番号で指定しているMATC関数については後述しますが、'国コード一覧'!A:Dの中から1列目つのデータ(A列「2文字」の国コード)の値を取得するということを意味します。
続いて MATCH関数 の部分です。
構文は、
です。検索キーで検索範囲の中で一致するものを探します。
MATCH(C2, '国コード一覧'!D:D,0)を分解すると、
検索キー | C2 | マレーシア |
---|---|---|
検索範囲 | 国コード一覧'!D:D | 国コード一覧のD列 |
検索種類 | 0 | 完全一致 |
国コードシートのD列から「マレーシア」と完全一致するものを探してきます。戻り値は、一致するものが何番目に見つかったです。
とすると、D1から10個目で「マレーシア」と一致するので戻り値は10となります。
検索範囲は、'国コード一覧'!D:Dの部分を、D1:D19 としても戻り値は ”10” で表の行番号と一致します。
しかし、データが入っているのがD2からだといって
とすると、D2からマレーシアは9番目となるので戻り値が “9” となってしまいます。これだと行番号と一致しなくなってしまうので、INDEX関数で違う場所を参照してしまいます。
行番号は指定せずに D:D のように検索範囲を列だけにすれば必ず行番号と一致します。
検索種類は、完全一致である 0 を必ず指定してください。省略してしまうと正しい答えが求められません。詳細は INDEXのヘルプ を参照してください。
INDIRECT関数+MATCH関数
INDEX+MATCH関数では、値を取得する列を列番号で指定しなければなりませんが、INDIRECT関数を使うと文字列として列を指定することができます。
百聞は一見に如かずです。
これで、A10セルの値を取得できます。
INDIRECT関数を使って、国番号一覧シートの ”E2” に下記のように記載します。
列番号は、上で説明したMATCH関数で取得します。
このように書くと、国コード一覧シートのD列の中でC2と完全一致する行の A列の値を取得することができます。
INDIRECTを分解すると下記のようになります。
行名 | "'国コード一覧'!A" | 文字列として指定 |
---|---|---|
結合記号 | & | |
列番行 | MATCH(C2,'国コード一覧'!D:D,0) | 戻り値は列番号 |
国コード一覧のA列という指定は文字列なので、国コード一覧シートで列が変更されると式も変更しなければなりません。
それは、INDEX+MATCH関数の列番号でも同じなので、INDIRECTを使った方が、視覚的に理解しやすい式となります。
VLOOKを使わずにINDIRECT関数とMATCH関数を使ってみてはいかがでしょうか。