VLOOKUP関数で複数の表からデータを取る INDIRECT関数とセルに名前をつけることで文字列を関数に組み込みましょう

職場やご自身のHPなどで、料金表から値段を表示する場合に便利なのがVLOOKUP関数です。一つの表でおさまる場合はいいのですが、複数の表から該当する料金を表示する場合は、表の種類を特定する作業が必要になります。その際に便利なのがINDIRECT関数です。

スポンサーリンク

INDIRECT関数は文字で指定した範囲を、データに変換してくれる関数

VLOOKUP関数の使い方をおさらいしておきましょう。次のようなデータを入力して完成させる関数でした。

VLOOKUP関数
①は検索値。②で指定する範囲の一番左の列を上から順番に調べて、①で入力したデータ(=検索値)と一致するものを探します。

 

②は範囲。①の検索値を調べ、データを抽出する対象となる範囲を指定します。通常はセルで指定($B$9:$F$14など)しますが、今回はここを文字で指定するところがポイントになります。
この違いを、ぜひ覚えておいて下さい。

 

③は列番号。検索値と一致するデータが見つかったとき、②で指定した範囲の一番左の列から何番目の列のデータを抽出するかを指定します。

 

④は検索の型。”0”は検索値と完全に一致した場合にだけ結果を表示せよ、と言う意味です。もし完全に一致するデータがない場合はエラーが表示されます。

 

VLOOKUP関数に必要となるデータは以上のものでした。
たとえば次のような料金表から料金を表示することを考えてみます。

Price sheet

この料金表から、該当する料金を表示するために組んだのが次のVLOOKUP関数の式です。

VLOOKUP関数1
①の検索値はセルC3です。このセルにはチーム名(レアナマドリー、バルセロナなど)がドロップダウンで選べるようになっているので、このセルで選択されたチーム名を検索します。

Dropdown
(ドロップダウンの作り方は別の記事でご説明します)

 

②の範囲は「UFFAチャンピオンズリーグ」の料金表にあたる$B$9:$F$14を指定。

 

③の列番号はMATCH関数を使って指定しています。
MATCH($C$4,$B$9:$F$9,0)
C4ではドロップダウンで席種(プレミアム、メインスタンド、など)が選べるようになっています。席種が選択されると、料金表にある席種が並んだ行(9行目)のBからFの間で一致するものの列番号が指定できるように設定。

 

④検索の型は0として完全に一致するデータ以外はエラーになるようにします。
そうすると、C3でチーム、C4で席種を選べば「値段」のセル(C5)で該当する料金が表示されるようになりました。

Price sheet1

ここまでは基本的なVLOOKUP関数の入力です。次に、料金表が2つに別れた場合にどのような方法があるかを見ていきます。

 

 

INDIRECT関数で文字列を関数に組み込む 分かりやすい表示でユーザーに使いやすい表にする

次のような料金表がある場合の料金表示を考えます。

Price sheet2

先ほどはUFFAチャンピオンズリーグだけでしたが、今度はリーグ戦の料金表も加えて料金表示することにします。

 

1つの料金表なら先述の方法で正しく表示できたので、ポイントは2つのうち、どちらかの料金表に特定すること。この1点に絞られます。
考え方の方向性をまず確認しましょう。まず、ドロップダウンリストで大会名を指定。指定された大会名(UFFAチャンピオンズリーグ、リーグ戦)と関連させて、VLOOKUP関数の範囲指定ができるようにしていきます。

 

先ほどの「UFFAチャンピオンズリーグ」の料金表のVLOOKUP関数で範囲指定は$B$9:$F$14となっていました。
(なお全体ではVLOOKUP(C3,$B$9:$F$14,MATCH(C4,$B$9:$F$9,0),0))
それを「UFFAチャンピオンズリーグ」が選択されたときは$B$9:$F$14、「リーグ戦」が選択されたときは$B$17:$F$22(リーグ戦の料金表の範囲)になるようにすればいいのです。

 

次に2つの料金表の範囲を切り替える方法ですが、「セル範囲に名前をつける」ことで可能になります。
今回の山場の一つですので是非おぼえておいてください。

 

セル範囲に名前をつける

考え方としては難しくありません。名前の通りセル範囲に名前をつけるのです。今までは、範囲は始点と終点にセルを入力することで指定していました。
たとえば、先述の$B$9:$F$14なら、「始点($B$9):終点($F$14)」と入力することでその間にある全てのセルを指定できるというものです。

 

それに対して「セル範囲に名前をつける」方法は、$B$9:$F$14に”UFFAチャンピオンズリーグ”と名前をつけることで、”UFFAチャンピオンズリーグ”と入力すれば$B$9:$F$14の範囲を指定できるというものです。
中学生のころ方程式でY=X+4、Y=2X+1のような問題を、代入によって解いた経験がおありだと思います。この時、YがX+4の式を置き換えたように、「セル範囲に名前をつける」ではセル範囲を自分がつけた名前で置き換えることができるのです。

 

「セル範囲に名前をつける」 具体的な方法

セル範囲に名前をつける方法は色々ありますが、最も簡単な方法をご紹介します。

 

①名前をつけたいセル範囲を指定します

Directed range

 

②名前ボックスに名前を入力します

Name box

 

以上です。なお「名前ボックス」は、画面左上の「クリップボード」の下、列を表す”A”の上にあります。ここにカーソルを合わせてクリックすると入力できるようになるので、範囲名を入力してみて下さい。今回は$B$9:$F$14を「UFFAチャンピオンズリーグ」、$B$17:$F$22を「リーグ戦」と名付けることにしました。

 

VLOOKUP関数に名前で指定した範囲を組み込む

範囲に名前をつけましたので、VLOOKUP関数の②にあたる範囲を名前で(「UFFAチャンピオンズリーグ」と「リーグ戦」です)指定してみます。
VLOOKUP関数にそのまま「UFFAチャンピオンズリーグ」「リーグ戦」と入力すると切替ができなので、C2セルにドロップダウンを作って大会名を選べるようにして、C2をVLOOKUP関数の範囲に指定することで、「UFFAチャンピオンズリーグ」または「リーグ戦」が入力されるのと同じ状態にします。その結果が次の画像です。

VLOOKUP関数2
まず、赤枠で示したVLOOKUP関数の結果を見ていただきたいのですが「#N/A」のエラーが出てきました。次に、青枠の箇所でVLOOKUP関数の範囲がC2になっていることもご確認下さい。C2は「UFFAチャンピオンズリーグ」と名前をつけたセル範囲($B$9:$F$14)に間違いありませんがそれでもエラーになってしまいました。

 

これは、「セル範囲に名前をつける」方法やVLOOKUP関数の式に問題があるのではありません。データの形式に問題があるのです。関数で利用できるデータは数値とセル番地(A3、C15などセルの場所を示すデータ)のデータです。ところが、「セル範囲に名前をつける」方法で指定された範囲のデータは文字列なのです。
関数の中で使えるはずのないデータを使ってしまった。その結果が「#N/A」としてエラーになった、と言うのが今回のエラーの原因でした。

 

INDIRECT関数で文字列を番地(セル)のデータへ変換

エラーの原因が分かりましたので修正していきましょう。文字列のままでは関数では使えない、ならば関数で使えるデータに文字列を変換すれば良いのです。データを変換する関数がINDIRECT関数です。

 

この関数はセル範囲につけた名前を文字列から番地データへと変換する関数と考えていただければ結構です。使い方も簡単で、INDIRECT($C$2)のようにセル範囲に名付けた名前が入ったセルを指定するだけです。

 

先ほどのVLOOKUP関数の式を書き換えてみます。

=VLOOKUP($C$3,$C$2,MATCH($C$4,$B$9:$F$9,0),0)

VLOOKUP($C$3,INDIRECT($C$2),MATCH($C$4,$B$9:$F$9,0),0)

 

その結果が次の画像です。

VLOOKUP関数3

まず、VLOOKUP関数の範囲をINDIRECT関数で指定していることを確認して下さい(赤枠で囲んだ箇所です)。C2で「リーグ戦」を指定すると(青枠で囲んだ箇所です)、リーグ戦のチェンジー&バックスタンドの料金(緑枠で囲んだ箇所、44,800です)が表示されていることが分かります。

 

同様にC2でUFFAチャンピオンズリーグを選んだ結果が次の画像です。

VLOOKUP関数4

VLOOKUP関数の範囲は先ほどと同様にINDIRECT関数を使ってC2を指定していることを確認して下さい。何も変えていません。C2で「UFFAチャンピオンズリーグ」を選ぶとUFFAチャンピオンズリーグの表にあるチェンジー&バックスタンドの料金(緑枠で囲んだ箇所、56,000です)が表示されました。ちなみに、INDIRECT($C$2)でなくてもINDIRECT(”UFFAチャンピオンズリーグ”)のように直接文字列を入力しても正しい結果が出てきます。

 

「セルに名前をつける」こととINDIRECT関数をVLOOKUP関数に組み込むことによって複数の表からも正しくデータを抽出できることが分かりました。

 

 

まとめ

関数では文字列は使えませんのでINDIRECT関数を使って,VLOOKUP関数でも使えるようにしました。それぞれの関数を組み合わせるとバリエーションが増えてExcelでできることの幅が増えていきます。今回のINDIRECT関数も便利な関数ですので知識として知っておきましょう。
<おまけ>
法人契約によるネットバンクを試してみたのですが、管理が面倒でやめることにしました。毎月固定の手数料もかかるので事業規模の大きい会社でないとあまりメリットがありません。しばらくは個人契約のネットバンキングを使う予定です。

タイトルとURLをコピーしました