目次
このチュートリアルでは、VLOOKUP関数を使用して、別のワークシートやワークブックからデータをコピーしたり、複数のシートでVlookupしたり、異なるシートから異なるセルに値を返すために動的にルックアップする方法について説明します。
Excelで情報を調べるとき、すべてのデータが同じシートにあることはまれです。 複数のシート、あるいは異なるワークブックにまたがって検索しなければならないことがよくあります。 Microsoft Excelには、これを行う方法が1つ以上あります。しかし、どの方法も標準のVLOOKUP式より少し複雑です。 少し我慢すれば、私たちは次のようにできます。が解決してくれるでしょう :)
2つのシート間でVLOOKUPする方法
まず、最も単純なケースとして、VLOOKUPを使って別のワークシートからデータをコピーする方法を検討します。 これは、同じワークシートを検索する通常のVLOOKUP式と非常に似ています。 違いは、シート名を table_array 引数を使用して、どのワークシートにルックアップ範囲があるかを数式で指定します。
別のシートからVLOOKUPするための一般的な計算式は以下の通りです。
VLOOKUP(lookup_value, シート!レンジ , col_index_num, [range_lookup])例として、売上高を引っ張ってきてみましょう ヤン もうしでる 概要 そのために、以下の引数を定義する。
- ルックアップ値 はA列で 概要 シートで、最初のデータセルである A2 を参照します。
- 表_配列 はJanシートのA2:B6の範囲です。 これを参照するには、範囲参照の前にシート名を付け、感嘆符を付けます: Jan!$A$2:$B$6.
他のセルに数式をコピーしても変更されないように、絶対セル参照で範囲をロックしていることに注意してください。
Col_index_num が2であるのは、テーブル配列の2列目であるB列から値をコピーしたいからです。
- 範囲指定 をFALSEに設定すると、完全一致で検索されます。
議論をまとめると、こんな式になる。
=VLOOKUP(A2, Jan!$A$2:$B$6, 2, FALSE)
数式を列の下にドラッグすると、このような結果になります。
のデータを同様にVlookupすることができます。 2月 と マー シートを使用します。
=VLOOKUP(A2, Feb!$A$2:$B$6, 2, FALSE)
=VLOOKUP(A2, Mar!$A$2:$B$6, 2, FALSE)
ヒントと注意点
- シート名に 空間 または ひえいもじ のように、シングルクォーテーションで囲む必要があります。 '1月の売上'!$A$2:$B$6 詳しくは、「Excelで他のシートを参照する方法」をご覧ください。
- シート名を直接数式に入力する代わりに、ルックアップワークシートに切り替えてそこで範囲を選択すれば、Excelが自動的に正しい構文の参照を挿入してくれるので、名前を確認してトラブルシューティングする手間が省けます。
別のワークブックからのVlookup
2つのワークブック間でVLOOKUPするには、ファイル名を角括弧で囲み、その後にシート名と感嘆符を付けます。
例えば、A2:B6の範囲にあるA2値を検索する場合 ヤン のシートがあります。 売上報告書.xlsx ワークブックで、この数式を使用します。
=VLOOKUP(A2, [Sales_reports.xlsx]Jan!$A$2:$B$6,2,FALSE)。
詳しくは、「Excelで他のワークブックからVLOOKUPする」をご覧ください。
IFERRORで複数シートにまたがってVlookupする
2枚以上のシート間の検索が必要な場合、VLOOKUPとIFERRORを組み合わせて使うのが最も簡単な解決策です。 最初のVLOOKUPが最初のシートで一致しない場合、次のシートで検索するというように、複数のIFERROR関数をネストして複数のワークシートを1枚ずつチェックするのがアイデアです。
iferror(vlookup(...), iferror(vlookup(...), ...), " 不明 "))この方法が実際のデータでどのように機能するかを見るために、次の例を考えてみよう。 下記は、「1. 概要 テーブルで注文番号を調べて、商品名と金額を入力します。 ウエスト と イースト シートを使用します。
まず、商品を引き出します。 そのために、VLOOKUP式にA2の注文番号を検索するように指示します。 イースト シートのB列(2列目)の値を返す。 table_array A2:C6)で検索し、完全に一致するものがない場合、次のように検索します。 ウエスト シート、両方のVlookupに失敗した場合は、"Not found "を返します。
=IFERROR(VLOOKUP(A2, East!$A$2:$C$6, 2, FALSE), IFERROR(VLOOKUP(A2, West!$A$2:$C$6, 2, FALSE)), "Not found"))
金額を返すには、列のインデックス番号を 3 に変更するだけです。
=IFERROR(VLOOKUP(A2, East!$A$2:$C$6, 3, FALSE), IFERROR(VLOOKUP(A2, West!$A$2:$C$6, 3, FALSE)), "Not found"))
ヒント:必要に応じて、VLOOKUP関数ごとに異なるテーブル配列を指定することができます。 この例では、両方のルックアップシートの行数が同じ(A2:C6)ですが、ワークシートのサイズが異なる場合があります。
複数のワークブックでVlookupを行う
複数のワークブック間でVlookupするには、ワークブック名を角括弧で囲み、シート名の前に置きます。 例えば、次のようにVlookupします。 ふたつのファイル ( 書籍1 と 書籍2 )を一つの数式で表すことができます。
=IFERROR(VLOOKUP(A2, [Book1.xlsx]East!$A$2:$C$6, 2, FALSE), IFERROR(VLOOKUP(A2, [Book2.xlsx]West!$A$2:$C$6, 2, FALSE)), "Not found"))
複数の列をVlookupするために列のインデックス番号を動的にする
複数のカラムからデータを返す必要がある場合は col_index_num ダイナミックであれば、時間を節約できるかもしれません。 いくつか調整が必要です。
- については col_index_num 引数で指定した配列の列数を返すCOLUMNS関数を使用します: COLUMNS($A$1:B$1) (行座標はあまり関係なく、任意の行で構いません)。
- での ルックアップバリュー 引数を使用する場合は、列参照を $ 記号 ($A2) でロックして、数式を他の列にコピーするときに固定されるようにします。
その結果、数式がコピーされた列に応じて、異なる列から一致する値を抽出する、一種の動的な数式を得ることができます。
=IFERROR(VLOOKUP($A2, East!$A$2:$C$6, COLUMNS($A$1:B$1), FALSE), IFERROR(VLOOKUP($A2, West!$A$2:$C$6, COLUMNS($A$1:B$1), FALSE)), "Not found"))
B列に入力すると、COLUMNS($A$1:B$1)は2と評価され、VLOOKUPはテーブル配列の2列目から値を返すように指示します。
C列にコピーすると(つまり、数式をB2からC2にドラッグすると)、列の参照が相対的なので、B$1がC$1に変わります。 その結果、COLUMNS($A$1:C$1)は3に評価され、VLOOKUPは3列目の値を返さなければならなくなります。
この式は、ルックアップシートが2〜3枚の場合に有効です。 それ以上の枚数になると、IFERRORの繰り返しが面倒になります。 次の例は、もう少し複雑ですが、よりエレガントな方法を示しています。
INDIRECTによる複数シートのVlookup
VLOOKUP関数とINDIRECT関数を組み合わせて、複数のシート間でVlookupする方法もあります。 この方法は少し準備が必要ですが、最終的には、複数のスプレッドシートでVlookupするための、よりコンパクトな数式を手に入れることができます。
シートをまたいでVlookupする一般的な計算式は以下の通りです。
どこで
- ルックアップ_シート - ルックアップシート名で構成される名前付き範囲。
- ルックアップ値 - 検索する値。
- ルックアップレンジ - ルックアップ値を検索するルックアップ・シートの列の範囲を指定します。
- 表_配列 - ルックアップ・シートのデータ範囲
- Col_index_num - 値を返すテーブル配列のカラムの番号。
計算式を正しく動作させるために、以下の注意点にご留意ください。
- CtrlキーとShiftキーとEnterキーを同時に押すことで完成する配列式です。
- すべてのシートには 同列 .
- すべてのルックアップシートに1つのテーブル配列を使用するため、以下のように指定します。 最大範囲 シートの行数が異なる場合。
シートをまたいでVlookupする計算式の使い方
複数のシートを同時にVlookupする場合は、以下の手順で行います。
- ワークブックのどこかにすべてのルックアップ・シート名を書き出し、その範囲に名前( ルックアップ_シート の場合)。
- A2値検索( ルックアップバリュー )
- を、A2:A6 の範囲 ( ルックアップレンジ )を4枚のワークシート( イースト , ノース , 南 と ウエスト )、および
- は、B列から一致する値を引き出し、それは2列目( col_index_num )を、データ範囲A2:C6( table_array ).
以上の引数で、式はこのような形になる。
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets&"'!$A$2:$A$6"), $A2)>0), 0) &"'!$A$2:$C$6"), 2, FALSE)
両方の範囲($A$2:$A$6と$A$2:$C$6)を絶対セル参照でロックしていることに注意してください。
その結果、4つのシートから注文番号を探し、該当する項目を取得する式ができました。 特定の注文番号が見つからない場合は、14行目のように#N/Aエラーが表示されます。
量を返すには、単に2を3に置き換えるだけです。 col_index_num の引数は、テーブル配列の 3 列目にある金額と同じです。
=VLOOKUP($A2, INDIRECT("" &INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 3, FALSE)
標準の#N/Aエラー表記を独自のテキストに置き換えたい場合は、数式をIFNA関数にラップしてください。
=IFNA(VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0) & "'!$A$2:$C$6"), 3, FALSE), "見つかっていません")
ワークブック間の複数シートのVlookup
この一般的な数式(またはその任意のバリエーション)を使用して、複数のシートをVlookupすることもできます。 べんきょうきゅうしゅう そのためには、以下の計算式のように、INDIRECTの中にワークブック名を連結してください。
=IFNA(VLOOKUP($A2, INDIRECT("'[Book1.xlsx]" & INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'[Book1.xlsx]" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 2, FALSE), "Not found").
シート間のVlookupと複数列の戻り値
複数のカラムからデータを取り出したい場合は マルチセルアレイ式 このような数式を作るには,配列の定数を col_index_num の議論になります。
この例では、テーブル配列の2列目と3列目にある項目名(B列)と金額(C列)をそれぞれ返したいので、必要な配列は {2,3} となります。
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("" & Lookup_sheets &"'!$A$2:$C$6"), $A2)>0), 0) &"'!$A$2:$C$6""), {2,3}, FALSE)
複数のセルに正しく数式を入力するためには、このようにします。
- 最初の行で、入力するすべてのセルを選択します(この例ではB2:C2)。
- 数式を入力し、Ctrl + Shift + Enter を押します。 これにより、選択したセルに同じ数式が入力され、各列で異なる値が返されます。
- 数式を残りの行にドラッグダウンします。
この式の仕組み
ロジックをよりよく理解するために、この基本式を個々の関数に分解してみよう。
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets&"'!$A$2:$A$6"), $A2)>0), 0) &"'!$A$2:$C$6"), 2, FALSE)
内側から外側への働きかけは、以下の通りです。
COUNTIFとINDIRECT
簡単に言うと、INDIRECTはすべてのルックアップシートの参照を構築し、COUNTIFは各シートにおけるルックアップ値(A2)の出現回数をカウントします。
--(COUNTIF( INDIRECT("'"&Lookup_sheets&"'!$A$2:$A$6"), $A2)>0)
詳しくはこちら
まず、範囲名(Lookup_sheets)と範囲参照($A$2:$A$6)を連結し、外部参照のために適所にアポストロフィと感嘆符を追加し、得られたテキストストリングをINDIRECT関数に送り、動的にルックアップシートを参照させるのです。
INDIRECT({"'East'!$A$2:$A$6"; "'South'!$A$2:$A$6"; "'North'!$A$2:$A$6"; "'West'!$A$2:$A$6" })
COUNTIFは、各検索シートの範囲A2:A6の各セルをメインシートのA2の値と照合し、各シートの一致回数を返す。 このデータセットでは、A2の注文番号(101)は、以下のように見つかる。 ウエスト シートは,指定された範囲の4番目なので,COUNTIFはこの配列を返します。
{0;0;0;1}
次に、上記の配列の各要素を0と比較します。
--({0; 0; 0; 1}>0)
TRUE(0より大きい)とFALSE(0に等しい)の値の配列が得られるので、それをダブルユナリー(--)で1と0に強制し、結果として以下の配列が得られます。
{0; 0; 0; 1}
この操作は、ルックアップシートがルックアップ値を複数回含んでいる場合に、COUNTIFが1より大きいカウントを返すので、最終的な配列には1と0しかないようにしたい(すぐにその理由がわかるでしょう)、という状況に対処するための特別な予防措置です。
これらの変換を終えると、次のような式になります。
VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, {0;0;0;1} , 0) &"'!$A$2:$C$6"), 2, FALSE)
INDEXとMATCH
このとき、INDEX MATCHの典型的な組み合わせが登場する。
INDEX(Lookup_sheets, MATCH(1, {0;0;0;1}, 0))
完全一致(最後の引数が0)のMATCH関数は、配列{0;0;0;1}から値1を探し、その位置(4)を返すように設定されています。
INDEX(Lookup_sheets、4)
INDEX関数は、MATCHで返された数値を行番号の引数(row_num)として、指定された範囲の4番目の値を返します。 ルックアップ_シート である。 ウエスト .
そこで、この式はさらに次のように還元される。
VLOOKUP($A2, INDIRECT("'"&" West "&"'!$A$2:$C$6"), 2, FALSE)
VLOOKUPとINDIRECT
INDIRECT関数は、その中のテキスト文字列を処理します。
INDIRECT("'"& "West"&"'!$A$2:$C$6")
そして、それを参照に変換し、その参照先を table_array VLOOKUPの引数です。
VLOOKUP($A2, '西'!$A$2:$C$6 、2、FALSE)
最後に、この非常に標準的なVLOOKUP式は、A2:C6の範囲の最初の列で、A2の値を検索します。 ウエスト シートで、2列目から一致するものを返す。 以上です。
複数のシートのデータを異なるセルに戻すダイナミックVLOOKUP
まず、ここでいう「ダイナミック」とは具体的に何を指すのか、そしてこの数式がこれまでのものとどう違うのかを定義しておきましょう。
同じフォーマットの大きなデータの塊が複数のスプレッドシートにまたがっている場合、異なるシートから異なるセルに情報を抽出したい場合があります。 下の画像は、その概念を示しています。
一意の識別子に基づいて特定のシートから値を取得するこれまでの数式とは異なり、今回は複数のシートから一度に値を抽出することを想定しています。
この作業には2種類の方法があります。 どちらも、少し準備をして、各ルックアップシートのデータセルに名前付きの範囲を作成する必要があります。 この例では、以下の範囲を定義しています。
- イースト_セールス - 東側シートのA2:B6
- ノース_セールス - 北側シートのA2:B6
- サウスセールス - 南側のシートのA2:B6
- ウエスト_販売 - 西側シートのA2:B6
VLOOKUPとネストされたIF
調べたいシートがそれなりにある場合は、IF関数を入れ子にして、あらかじめ定義されたセル(今回の場合はセルB1〜D1)のキーワードをもとにシートを選択することも可能です。
A2のルックアップ値で計算すると、以下のようになります。
=VLOOKUP($A2, IF(B$1="east", East_Sales, IF(B$1="north", North_Sales, IF(B$1="south", South_Sales, IF(B$1="west", West_Sales)))), 2, FALSE)
英語に訳すと、IFの部分はこうなります。
もしB1が イースト という名前の範囲に注目してください。 イースト_セールス もしB1が ノース という名前の範囲に注目してください。 ノース_セールス もしB1が 南 という名前の範囲に注目してください。 サウスセールス であり、B1が ウエスト という名前の範囲に注目してください。 ウエスト_販売 .
IFが返す範囲は、次のようになります。 table_array のVLOOKUPで、対応するシートの2列目から一致する値を引き出します。
ルックアップ値($A2 - 絶対列と相対行)とIFの論理テスト(B$1 - 相対列と絶対行)に混合参照を巧みに使うことで、数式を変更せずに他のセルにコピーすることができます - Excelが行と列の相対位置に基づいて自動的に参照を調整します。
そこで、B2に数式を入力し、右から下に必要なだけの列と行にコピーすると、次のような結果になる。
間接的Vlookup
多くのシートを扱う場合、複数のネストレベルを使用すると、数式が長くなりすぎて読みづらくなる可能性があります。 より良い方法は ダイナミックVlookupレンジ INDIRECTの助けを借りて
=VLOOKUP($A2, INDIRECT(B$1&"_Sales")), 2, FALSE)
ここでは、範囲名の固有部分(B1)と共通部分(_Sales)を含むセルへの参照を連結して、「East_Sales」といった文字列を生成し、INDIRECTによってExcelが理解できる範囲名に変換しています。
その結果、何枚でも美しく使えるコンパクトな処方を実現しました。
以上、エクセルでシートとファイルの間をVlookupする方法でした。 読んでいただきありがとうございました!また来週のブログでお会いしましょう。
練習用ワークブック(ダウンロード
Vlookupの複数シートの例(.xlsxファイル)