vlookupに、IndirectとMatch関数を組み合わせる

このQ&Aのポイント
  • vlookup関数で、検索値に指定した名前と一致するSheet1(Book2)の列番号から、導き出す方法を探っています。
  • Matchで指定した範囲がIndirect内の関数として認識されないため、結果が得られません。
  • VLOOKUPの列番号をMatch関数の代わりに固定すると結果は正常に表示されますが、Book1の列順が変わる可能性があるため、Match関数を使用して最適な結果を導き出したいです。
回答を見る
  • ベストアンサー

vlookupに、Indirect と Match 関数を組み合わせる

vlookup関数で、検索値にSheet1(Book1)から、範囲は、Sheet2(Book1)のセルにある名前のついているSheet1(Book2), そして、列番号は、指定した名前とマッチするSheet1(Book2)の列番号から、導き出そうとしています。 ところが、Matchで指定した範囲は、Indirect内の関数として認識されないようで、結果が得られません。 たとえば、 Book1のA1~E1にタイトルが入っています。(Index, Title, Book, Author, Frequency) Book2には、 シート1: InputName シート2: Output シート2に以下の関数を入れてみましたが、うまくいきません。 ちなみに、VLOOKUPの列番号を Match関数の代わりに、5 とすると、結果オーライですが、Book1 の列順が変わっていることがあるので、Matchを使ってエラーを避けたいのですが、以下の関数のどこを直すべきでしょうか? =IF(ISNA(VLOOKUP(C2,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$1400"),MATCH("Frequency",$A$2:$E$2,0),FALSE)),0,VLOOKUP(C2,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$1400"),MATCH("Frequency",$A$2:$E$2,0),FALSE)) よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> Book2には、シート List のみ。 > A1~E1には、Index, Title, Category, Author, Frequency とあります。 じゃぁ、indirect("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$1:$E$1")でしょう。

その他の回答 (2)

noname#204879
noname#204879
回答No.2

唐突に“寿限無”式を提示して「どこを直すべきでしょうか?」と尋ねるより、 1.Book1 に当該「タイトル」が入っている Sheet名 2.そのタイトルの下のレコードサンプル 3.Book2 のシート InputName、Output 上の関連するデータ例 等々を示して、何をしたいのかを簡潔に説明したら如何でしょうか? 回答者に提示式を解読しろというのは横着だと思います。

pochi-inu
質問者

補足

ごめんなさい。例を付け加えます。 Book1には、シート InputName と Outputがあります。 InputNameには、A2に、Book2.xls; B2に、List と入力されています。 Outputには、Index, Frequency, Categoryが、A1~C1にそれぞれ入力されています。そして、vlookup関数をB2以降に入れて、Book2のFrequencyに配置されている数値を出力させます。 Book2には、シート List のみ。 A1~E1には、Index, Title, Category, Author, Frequency とあります。 流れは、Book1のInputNameに入力されているファイル名とシート名を呼んで、それに対応するBook2を参照します。 対応するファイルによっては、Index, Category, Frequency, Title, Author, Remarks のように、列順が変わっていることがあります。 そこで、match関数との組み合わせに試行錯誤しています。 どうでしょうか?

回答No.1

> =vlookup(C2,indirect("'["&InputName!$A$2&"]"& InputName!$B $2&"'!"&"$A$2:$E$1400"),match("Frequency",$A$2:$E$2,0),FALSE) match関数の第2引数が「$A$2:$E$2」ということは、同じブックの同 じシートを参照しているはず。これがとても変です。 Book2にはImputNameというシートとOutputというシートがあって、 vlookup関数はBook2のOutputシートに書いてあるはずですね。そし てBook2のImputNameシートには、A2に検索対象のブック名、B2検索 対象のシート名が書いてあるんですね。そこまではわかりました。 そうすると、検索対象となる範囲のしょっぱなに書いてある項目名 をチェックするためにmatch関数が参照すべきはindirect ("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$2") じゃないでしょうか。

pochi-inu
質問者

補足

自分の中でも混乱が深まってきましたので、シンプルにしてみました。 目的は、vlookの列番号をmatch関数で出力される値で置き換える。 Book1には、2つのシートがあります。 InputName => このシートのA2 に、参照するブック名; B2 に参照するブックに付帯するシート名(下記の例では、List)を入力します。 Output => vlookup 関数を使って、データを出力します。記載してある項目は、Index, Frequency, Categoryの3つ。Book2のFrequencyの数値の出力。 Book2 には、カタログデータが入っています。(Index, Title, Category, Author, Frequency)が、A1~E1に入っています。シート名は、"List". Book1;sheet(Output)は、A1~C3にそれぞれ Index, Frequency, Category とあります。 そこで、Book1;sheet(Output) のB2以降に、Cに合致させるFrequencyをBook2から見つけ出す関数が入っています。 match を使わないのであれば、以下の関数で、数値8が得られました。 =IF(ISNA(VLOOKUP(C2,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$C:$E"),3,FALSE)),0,VLOOKUP(C2,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$C:$E"),3,FALSE)) ただし、Book2のカテゴリーリスト項目の位置が変更されていることがあるので、上記の関数にある列番号 3 に、match関数に置き換えたい訳です。 そこで、以下の関数にすると、"Frequency"にマッチする対象を Book1のA1~E1を参照してしまい、Book2を参照してくれません。ここで得られてしまうのは、Book1のFrequencyの位置、つまり、列2です。Book2の列5をMatchで出力したいのですが、、、。 =IF(ISNA(VLOOKUP(C3,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$C:$E"),MATCH("Frequency",$A$1:$E$1,0),FALSE)),0,VLOOKUP(C3,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$C:$E"),MATCH("Frequency",$A$1:$E$1,0),FALSE)) そこで、$A$1:$E$1 に、頂いたアドバイスのように再度 indirect を使って下記のように置き換えてみました。すると、0が出力されてしまいます。 =IF(ISNA(VLOOKUP(C3,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$C:$E"),MATCH("Frequency",INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$2"),0),FALSE)),0,VLOOKUP(C3,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$C:$E"),MATCH("Frequency",INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$2"),0),FALSE)) よろしくお願いします。

関連するQ&A

  • VLOOKUP関数の範囲をセルで指定したいと思っています。

    VLOOKUP関数の範囲をセルで指定したいと思っています。 B1:参照シート名(VLOOKUP関数で使用する範囲があるシート) C2:範囲の開始位置 E2:範囲の終了位置 B3:G3:列番号(B3の値は、B6:B8の範囲で使用する列番号、 D3の値は、D6:D8の範囲で使用する列番号) これらのセルに入力された情報をもとにB6:G8の範囲にVLOOKUP関数を 反映させたいと思っています。 例えば、 B1に参照シート名「2ケタ」 C2にVLOOKUP関数の範囲の開始位置「A5」 E2にVLOOKUP関数の範囲の終了位置「G7」 B3に範囲の列番号「2」がある場合 B6に「=VLOOKUP(A6,'2ケタ'!A5:G7,2,0)の関数を入力。 B2に参照シート名「3ケタ」 C5にVLOOKUP関数の範囲の開始位置「B5」 E2にVLOOKUP関数の範囲の終了位置「H7」 C3に範囲の列番号「3」がある場合 C6に「=VLOOKUP(A6,'3ケタ'!B5:H7,3,0)の関数を入力。 といった感じです。 現在、B6に「=VLOOKUP($A6,INDIRECT($B$1&"!a5:g7"),INDIRECT("$b$3"),0)」と 関数を入力して、VLOOKUP関数の「範囲の参照シート名」と「列番号」の情報は セルから持ってくることができました。 しかし、「a5:g7」という範囲だけは、INDIRECT関数をうまく入れることができません。 どのように関数を入力したら、上手くいくのか、教えていただけないでしょうか。

  • Vlookup関数で検索結果がエラーになってしまう

    お世話になります。 Vlookup関数の質問となります。 =VLOOKUP(C2,Sheet2!$A$2:$E$685,1,FALSE) 検索値  →リストを使用(元データはSheet2の指定したセル範囲の表の2列目のデータ) 範囲 →Sheet2の特定のセル範囲 列番号 →1(ここは100-01、100-02などの番号が入力されています) 検索方法 →false(完全一致) この式で「#N/Aエラー」が発生してしまいます。 単純に「氏名」から「社員番号」を引っ張りたいだけなのですが、 なんでエラーになるのでしょうか? 範囲に指定した表には空白行はありますが、書式設定などは特に問題はないです。 恥ずかしい質問なのは十分に理解していますが、 教えて頂きたく思います。 よろしくお願い致します。

  • VLOOKUPとMATCH関数

    こんにちは、お世話になります。 =VLOOKUP($B3,$I:$N,MATCH(C$2,$I$2:$N$2)2,0),0) この数式に関して何ですが、 第一引数第二引数第三引数と続くわけですが、 VLOOKUPの中にMATCH関数が入ったりとだんだん細かくなってきてしまって、難しいのですが この関数の数式の処理を詳しく解りやすく教えて頂けないでしょうか? ご教示お願いします。

  • ExcelでのVLOOKUP関数について

    キー1を1000倍したうえで完全一致のVLOOKUP関数を使うと#N/Aエラーが発生します。 表示上は同じように見えますが内部的に異なる値となっているのでしょうか? 試しにエラー行に対して、キーとターゲットとなる当該セルを「=」でつないで確認しても「TRUE」となります。 添付画像は、 検索先としてA列に基準キーを130.168~130.192(step 0.001)で各行へ入力し、B列はA列を1000倍、C列はB列をROUND関数で整数値に丸めたものをキーとしました。 D列にVLOOKUPで参照する値を入力し、E列以降で以下の異なるパターンで値を参照しています。 (1)【E・F列】 ・E列に整数値をキーとして130168~130192(step 1)で入力。 ・E列をキーとしてB~D列のVLOOKUP関数としています。   『=VLOOKUP(E3,B:D,3,FALSE)』 (2)【G・H列】 ・G列にE列/100をキーとして計算。 ・G列をキーとしてA~D列のVLOOKUP関数としています。   『=VLOOKUP(G3,A:D,4,FALSE)』 (3)【I列】 ・E列をキーとしてC~D列のVLOOKUP関数としています。   『=VLOOKUP(E3,C:D,2,FALSE)』 シートを複製し、キーの入力範囲を0.001~0.025(E列は1~25)にした場合はエラーがでませんでした。 その他の確認としてはTEXT、JIS、ASCなどを組み合わせて文字列としたキー同士のVLOOKUPではエラーにならず値を参照できています。

  • VLOOKUP関数 正しい値が返されない

    sheet1にデータリストを入力、sheet2のA1にコード番号を入力し以下の表にSheet1の対象データを参照するというところ(VLOOKUP関数のみ)まではよかったのですが、元データに空欄の時は「データなし」と表示過去の質問を参照して下のような式に変更しました。 =IF(ISERROR(VLOOKUP($A$1,範囲,列番号,"")),”データなし”,(VLOOKUP($A$1,範囲,列番号,FALSE))) はじめは正しく表示はされたのですが、A1に違う値を入力し直しても値が変化しません。 エラー表示はでませんが、数式がどこか間違っているのでしょうか。 どなたかお知恵をお貸しください。

  • VLOOKUP 関数に関連して・・・・

    VLOOKUP 関数に関連して・・・・ Excel のBOOK名 「JAPAN」 があり 中に2Sheetあります。 Sheet 名 は「東京」 と 「日本」です。 Excel のVLOOKUP を使うために、 Sheet 「東京」の カラムBの範囲に 名前を「商品」とつけました。 2Sheet目 の「日本」 の カラム EとFに検索対象があり、範囲に名前「台帳」とつけました。 それで、 VLOOKUP 関数を 2Sheet目 の カラムGに  =Vlookup('東京'!商品,台帳,1,0) と入力すると、 Sheet名がBook名に勝手に置き換えられて しまい、  =Vlookup('JAPAN'!商品,台帳,1,0) となってしまいまい、 #Value! が出てしまいます。 1.この置き換えは問題無いのでしょうか? 2. 問題があるとすれば、どうやればとめられるのでしょうか? 3. 検索値は 数字13桁のJANコードなんですが、 数値あるいは文字列で統一が    必要でしょうか? 環境は   Windows  XP   Office  2003  です。 よろしくお願いいたします。

  • Excel関数「VLOOKUP」でエラーが出る理由

    質問させて頂きます。 ここに、ふたつの似通ったBookファイル(Book1、Book2)があると仮定します。 内容はふたつとも、2桁~5桁の数字が、A列に5000行くらいまで打ち込まれている物です。 (※正確に言うと、Book1には4500行、Book2には5000行、数字が打ち込まれています) 例) 22 278 599 8819 33119 70994・・・等(こういった内容が5000行くらいまで続きます) Book1とBook2の数字を突き合せ、重複がないかどうか調べたいのですが、 関数『VLOOKUP』で両ファイルを突き合わせようとすると、 なぜか、エラー値『#N/A』が出てきてしまいます。 ご存知の通り、エラー値『#N/A』は「値がない」という意味なので、 ある意味、「この数字は重複していない」という意味でも取れると思うのですが、 明らかに重複している数字に対しても、エラー値が出てきてしまうので、困っています。 おそらく、私の『VLOOKUP』での突き合わせ方法に原因があると思うのですが、 どこに原因があるのかがわかりません。 【私の突き合わせ方法】 (1).Book2のB列に「×」と書いたセルを挿入します。 (2).Book1のB列にVLOOKUPを使用し、下記のように設定します。   検索値:A1    範囲:[Book2]Sheet1!$A$1:$B$5000   列番号:2  検索の型:FALSE こうする事で、「重複していたら"×"を出す」という形にしようと思っていました。 しかしなぜか、すべて『#N/A』となってしまいます。 何度も言うようで大変恐縮ですが、「明らかに重複している数字」に対しても、 「×」ではなく、『#N/A』が出てきます。両数字は、セルの表示形式からなにからすべて一緒です。 エクセルの検索機能を使うと、ちゃんと検索結果に出てきます。にも関わらず『#N/A』が出るのです。 これにはどういった原因があるのでしょうか? ご回答、宜しくお願い致します。

  • vlookup関数

    vlookup関数 book1に犬シートと猫シート、結果シートがあるとします。 犬シートのA1セルに"イヌ"というデータがあり、 猫シートのC1~C9セルに"ネコ"、C10セルに"イヌ"というデータがあります。 で、結果シートのA1セルに、 =VLOOKUP(犬!A1,猫!C1:C10,1,FALSE) という関数を入力すれば結果として"イヌ"が表示されると 期待したんですが、#N/Aとなってしまいます。 どうすればいいんでしょうか。

  • vlookup関数について

    vlookup関数について教えてください。    A       B         C      D      E        1  あじ    りんご     2  さば    みかん            3  さんま   ばなな        という内容で、D1セルに入力した内容に応じてE1セルに内容を転記させていました。 E1=VLOOKUP(D1$A$1$B3,2,FALSE) 上記で運用していたときはうまくいったのですが、 Cの列にも文字をいれ、E1セルにはCの内容を検索して、B列の内容を転記したいと 思って作りかえるとうまくいきません。 今回の新しいやり方では、 ・A列からの検索はいらない(でも他ファイルから参照されているので、削除、移動はできない) ・E1=VLOOKUP(D1$A$1$C2,2,FALSE)では #N/A となる ・A列からの検索がいらないから、E1=VLOOKUP(D1$B1$C2,1,FALSE) でも #N/A 調べてみたのですがわからなくて・・・ どこがおかしいのか、教えてください。宜しくお願いします。

  • VLOOKUP関数の列番号をフィルに対応させる方法を教えてください(COLUMN関数以外)

    VLOOKUP関数を横のセルにフィルして使いたいのですが、 検索範囲がA列~ではないので、列番号にCOLUMN関数を使えません。 シートのフォーマットを変えず、範囲内における列番号(範囲内で左端から何番目か、など) を返すためにはどうすれば良いか、ご存知の方教えてください。 VLOOKUP関数を横のセルにフィルしていった場合、列番号は変わらないため、 列番号にCOLUMN関数を入れて列番号を返すようにするとうまくいきますよね。 ただ、COLUMN関数は単純に列番号を返すだけなので、この方法は VLOOKUP関数の検索範囲がA列から始まっている場合のみにしか使えません。 シートのフォーマットを変えず、VLOOKUPにおける範囲がB列以降になる場合、 範囲内における列番号(範囲内で左端から何番目か、など)を返すための関数 もしくは他に何か良い方法をご存知でしたら、お教えいただけませんでしょうか。 売上12ヶ月分+利益12ヶ月分が横に広がっている定型フォーマットがあるのですが、 24ヶ所の列番号を手入力で直すのって非効率的なので・・・。 どうぞ宜しくお願い致します。

専門家に質問してみよう