ExcelのMATCH関数の検査範囲の指定について

このQ&Aのポイント
  • ExcelのMATCH関数を使用して、指定した値の場所(行番号)を取得する方法について学びます。
  • MATCH関数の検査範囲の指定方法について具体的な例を挙げながら説明します。
  • シート名を動的に指定する方法や、別のファイルを参照する方法についても解説します。
回答を見る
  • ベストアンサー

ExcelのMATCH関数の検査範囲の指定について

Excelで、指定した値の場所(行番号)を返すというのをMATCH関数を用いてやっているのですが、検査範囲の指定が上手く処理することができないので教えて下さい。 条件---------------------------------------------------------------------------------------------------------------- 2つのExcelファイル、DATA.xlsx と TEST.xlsx を用いる。 DATA.xlsx内に「B19」というシートが存在し、このシート内のB列にある"7777"という値が存在する行番号をTEST.xlsx内のセルに表示させる。 ----------------------------------------------------------------------------------------------------------------------- まず、 =MATCH(7777,[DATA.xlsx]B19!$B:$B,0) で正しい値が返ってくることは理解しています。 この式の中の、B19というシート名について、 この式が存在するシートと同じシートの適当なセル(ここではA33を使うことにします)にB19 という値が存在するとします。このA33のセルにある値を見て値を返す、何がしたいかといいますと、将来参照するシートがB19ではなく例えばB15であったり、B6とした場合、A33のセルの値を変更すればよいというものにしたいのです。 それで、 =MATCH(7777,"[TEST.xlsx]"&$A33&"!$B:$B",0) としてみたのですが、#VALUE!が返ってきます。 何処が間違っているのか?教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.3

いくつかあります。 1つ目は「"」で囲ったものは文字列にしかならないということです。 A1に「10」と入力して B1に「=SUM("A1")」としても参照してくれな いのと同じです。文字列をセルの参照に変換する処理が抜けています。 次にシート名について。数字を含むシート名などによっては参照する 際「'」で囲む必要があります。「='B19'!A1」のように。 なので今の情報だけで考えるなら =MATCH(7777,INDIRECT("’[TEST.xlsx]"&$A33&"’!$B:$B"),0) こうなります。 ただし INDIRECT関数は参照元のファイルを開いておかないと使え ない関数です。使い方を考えた場合に本当にこれで上手く利用でき るのかどうかについては疑問を感じます。 また INDIRECTは揮発性関数です。重い処理の関数と組み合わせる のは避けた方がいいと思います。表全体の運用に影響します。 INDIRECTを使わず それぞれのシートに対して全て検索したものを どこかに表示させて その中から該当するシートのデータを参照した 方がまだましくらいです。

Hukkin_Devil
質問者

お礼

回答有難うございます。お礼が遅くなり申し訳ございませんでした。何度も御礼コメントを送ろうとしたのですが、エラーで送れませんでした。 詳しい解説に加えアドバイスも下さりありがとうございます。勉強になりました。 ありがとうございました。

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 INDIRECT関数でシート名を指定する際において、例えば Sheet1 (2) の様なコピーシートや 2015年8月 等の様な「数字から始まっているシート名」を持つシート、及び B19 等の様な「数字で終わっているいるシート名」を持つシートを指定するためには、 INDIRECT("'[DATA.xlsx]Sheet1 (2)'!$B:$B") や INDIRECT("'[DATA.xlsx]B19'!$B:$B") の様に「'」で囲んだ形で指定しなければなりません。  一方、例えば Sheet1 の様な「コピーシートでも、『数字から始まっているシート名』を持つシートでも、『数字で終わっているいるシート名』でも無いシート」の場合は、 INDIRECT("[DATA.xlsx]Sheet1!$B:$B") の様に「'」で囲んでいない形でも、 INDIRECT("'[DATA.xlsx]Sheet1'!$B:$B") の様に「'」で囲んだ形でも、どちらの形式で指定しても構いません。  ですから、A33セルに、コピーシートのシート名や「数字から始まっているシート名」及び「数字で終わっているいるシート名」が入力されている場合にも対応するためには、次の様にする必要があります。 =MATCH(7777,INDIRECT("'[DATA.xlsx]"&A33&"'!B:B"),0)  但し、これだけでは「A33セルに誤ったシート名が入力されている場合」や「指定されたシートのB列に7777という値が入力されているセルが存在しなかった場合」にはエラーとなってしまいますので、次の様にされた方が良いと思います。 =IF(A33="","",IFERROR(MATCH(7777,INDIRECT("'[DATA.xlsx]"&A33&"'!B:B"),0),IF(ISREF(INDIRECT("'[DATA.xlsx]"&A33&"'!B:B")),"(該当データ無し)","(該当シート無し)")))

Hukkin_Devil
質問者

お礼

回答有難うございます。お礼が遅くなり申し訳ございませんでした。何度も御礼コメントを送ろうとしたのですが、エラーで送れませんでした。 詳しい解説ありがとうございます。今回のことだけではなく、今後にも役立ちます。 ありがとうございました。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.1

INDIRECT関数を使って範囲を指定しないとエラーになります。 =MATCH(7777,INDIRECT("[TEST.xlsx]"&$A33&"!$B:$B"),0) 検証していませんので、駄目なときはエラーの種類を補足してください。

Hukkin_Devil
質問者

お礼

回答有難うございます。お礼が遅くなり申し訳ございませんでした。何度も御礼コメントを送ろうとしたのですが、エラーで送れませんでした。 教えて頂いたとおりにしましたら、上手くいきました。 ありがとうございました。

関連するQ&A

  • エクセル 関数でセルの位置を&で指定したい

    セルの位置を&を使って指定したいのですが出来ません。 何か方法はないですか? (例) 同じフォルダに入っているファイル名「商品番号01」~ファイル名「商品番号99」のA1のセルを表示したい。 商品番号を1つ1つ入力は手間なのでA列にある商品番号を & を使って結びつける。 これでは正しく表示されない。    A列  B列 1行 01  ="'[商品"&A1&".xlsx]sheet'!$A$1" 2行 05  ="'[商品"&A2&".xlsx]sheet'!$A$1" 3行 09  ="'[商品"&A3&".xlsx]sheet'!$A$1"  ・  ・  ・  ・  ・  ・

  • Excel検索等関数

    Excelのデータで同じ列の中に番号が重複している値を探し出しなおかつ任意の行数に出す関数はありますか? Sheet1   |Sheet2   A  B |   A  B        1 あ 10 | 1 あ  10 2 あ 11 | 2 あ  11 3 い 21 | 3 い  21 4 う 22 | 4      ←A4:b4は、「い」が2行ないので空白        | 5 う  22        | 6      ←A6:b6も、「う」2行ないので空白 このように、縦の重複したセルを検索して、指定行数内の場合は、空白となる関数式があればお教えください。

  • エクセルVBA MATCHをユーザー定義関数で使う

    ユーザー定義関数の質問です。 ある値をB列で探し、見つけたセルの行番号を取得したいのですが分かりません。 条件が一つあってそれはAの値が10以下のものは検索から除外するということです。 例 A  B 6  50 5  45 7  2 12 45 11 9 例えばBが45かつAの値が10以上であるセルの行番号はこの例だと4になります。 ワークシート関数を使うと{=MATCH(45,(A1:A5>=10)*(B1:B5),0)}でできました。しかしユーザー定義関数で.Match(45, Worksheets("Sheet1").Range("A1:A5>=10") * Worksheets("Sheet1").Range("B1:B5"), 0)とやっても#VALUE!となってしまいました。何がおかしいのでしょうか。

  • エクセル MATCH関数でファイル名等の値をセルから持ってくる方法を教えてください

    エクセル初心者です。 MATCH関数で、別ファイルの値を取得しようとしていますが うまくいかないのでどなたか教えていただけませんでしょうか? 下記のように直接ファイル名やシート名を記述するとうまく いくのですが、 [式]  =MATCH(C7,[test.xls]テストシート!C1:C100,0) ファイル名とシート名を変えることがあるので、  セルB5 → test.xls  セルC5 → テストシート として、B5とC5を用いて記述しようと、&や""を使っていろいろと 式に入れてみたのですが、うまくいきません。 途中まではうまくいきそうになっても、C1:C100 の範囲指定で tesx.xlsではなくて自分自身の C1:C100 を参照したりと、 思った結果になりません。 どなたか、教えていただけると助かります。 宜しくお願いいたします。

  • エクセル Vlookup 範囲指定について

    よろしくお願いします Vlookupの範囲指定を, パスや,ファイル名,シート名により作成した文字列で指定したいと思っています。 これにより,年度末の処理が, シート内のセルを一部変更するだけで毎年対応可能になると思っています。 例えば, 平成24年の4月のツヨさんのB2セルの数字を参照したいときに, セルC3 c:\test\  (ディレクトリ1) セルC4 H24      (ディレクトリ2)←年度で変わります セルC5 \kaikei\   (ディレクトリ3) セルC6 04月.xlsx  (ファイル名)←月で変わります セルC7 ツヨ      (シート名)←人で変わります セルC8 !$A$1:$B$5 (検索範囲) という前提の元, セルC9 ="'" & C3 & C4 & C5 &"["&C6&"]'" & C7& C8 (表示は 'c:\test\H24\kaikei\[04月.xlsx]'ツヨ!$A$1:$B$5) とします。 ここで次の2式を記述します。 セルC20 =VLOOKUP(2,'C:\test\H24\kaikei\[04月.xlsx]ツヨ'!$A$1:$B$5,2,FALSE) セルC21 =VLOOKUP(2,C9,2,FALSE) セルC20は,正しく参照されます。 セルC21は,#N/Aエラーです。 なんとか セルC21のように指定したいと思っているのですが, 良い方法が無いでしょうか? ご教授, よろしくお願いします

  • excel関数 matchの使い方について

    早速質問します。 行 A B C 1 2 2 2 4 3 5 4 3 5 8 6 2 C1セルにMATCH(B1,A1:A6,0)を式を入れるとA1セルに「2」という値があるので、C1には戻り値として「1」が返ると思うのですが、続けてC2セルに続きの検索を行いたい(A6セルに「2」というデータが入っているのでC2セルには「5(=6-1)」という結果を期待してます)のですが、うまくいく方法が思いつきません。 知恵をお貸しいただけないでしょうか? MATCH(B2,A1:A6,0)と第1セクションに手動で「B2」といわれと、目的の結果が得られますが、汎用性を持たせるため自動で結果が入れれるようにしたいのでお願いします。

  • 式だけのセルを範囲指定から除外したい

    Excel365 windows10 使用の超初心者です。 (1) マクロ記載用A.xlsm データ用のB.xlsx C.xlsxでマクロ作成中です。 (2) データ用ブックのB.xlsx には、DシートとEシート(他に40枚)があります。 (3) Dシートには表には、B4からB33まで(4月21日から5月20日までの30個)のデータがあります。 (4)このデータを、行列を入れ替えてEシートの表に持っていきたいです。 (5)上のデータを貼りつけると時間かかる(=自分はそう思っている。)ので Eシートの表には最初から31個のセルに、=VLOOKUP(A58,計算データ,2,FALSE)関数が入れてあります。 (6)なのでDシートのデータが変わると、すぐにEシートの表も同時に変更されます。 (7)いまEシートを見ると、4月は30日しかないので、5月20日までは表示されていますが、次行のセルには関数式だけで、何も表示されていません。 (8)やりたいことは、この日付が4月21日~5月20日の行までを選択したいです。 (9)CurrentRegionでは、式だけの空欄の所も範囲指定されてしまいます。 何時間も試行錯誤しましたがお手上げです。よろしくお願いします。

  • エクセル関数の範囲指定を、座標数値で指定したい

    address関数とindirect関数で、行・列を数値で指定して、セルの値が求められますが、同じように行・列の数値を4つ使って範囲の指定をしたいのですが、どのような関数を使えばよいでしょうか? 具体的には、=MATCH(A1,範囲,1)の範囲を、2組の座標の数値で指定したいのです。

  • エクセル関数で可能でしょうか?

    エクセル関数で下記のような自動計算が可能か教えて下さい。 発注伝票のチェックのためにシート1のA列に連番で発注番号があり B列に日付・C列に金額・・・というふうなデータがあります。 このファイルのシート2の特定セルに発注番号を入力したら指定したセルにその発注番号の金額を表示したいのです。 現在INDEX(Sheet1!A:AA,(MATCH(Sheet2!D1,Sheet1!A:A,0)),3) の計算式を作ったのですが、同じ発注番号が複数ある場合は最初の物しか金額を引張って来ないため行き詰っています。 発注番号が複数あった場合、その該当番号すべての金額合計を求める関数式は可能でしょうか? よろしくお願いします。

  • MATCH関数+INDEX関数検索データがずれる

    前回、次のような質問をしました。 商品コードから検索したMAX値から隣接セルの値 https://okwave.jp/qa/q10113897.html 在庫らくだの入出庫帳で出力した27,000行程度あるデータのエクセルファイルで、1つの商品毎の複数の入庫時のMAX値のみを抽出する式を教えて頂きました。 また、MAX値の2行右にある販売店の文字列を抽出する方法も教えてもらいました。 (前回、FORSPORKENさんから教えてもらった関数組み合わせ式)-------------------------------------- 1️⃣次の式を使って、最大値を取得する行番号を計算します(この例では、行番号計算という名前で定義します)。 =MATCH(MAX(INDEX('***oneDrive_URL***/[入出庫帳(20230316).xlsx]qryExport'!$J$2:$J$28000*('***oneDrive_URL***/[入出庫帳(20230316).xlsx]qryExport'!$D$2:$D$28000=B6),)), '***oneDrive_URL***/[入出庫帳(20230316).xlsx]qryExport'!$J$2:$J$28000, 0) 2️⃣次に、行番号計算を使って、該当行の販売店名を取得する式を作成します。 =INDEX('***oneDrive_URL***/[入出庫帳(20230316).xlsx]qryExport'!$M$2:$M$28000, 行番号計算) ※行番号計算は、上記で定義した最大値の行番号を計算する式です。実際には、セル参照に置き換えてください。 -------------------------------------- 確かにこれならば、正常にデータを抽出できるのですが、ところどころ正常に抽出できない箇所があることを確認しました。 必ず間違うB列の商品コードで "06d1100" という文字列があり、 D8381~D8400、 D27010~D27035 これらの行にこの商品コードはあるのですが、 上記の計算式で"06d1100"を検索させると、なぜかD3371セルの”06case7140”ところの販売店を抽出してしまいます。 このような場合の対処方法を教えて頂きますよう、よろしくお願い致します。

専門家に質問してみよう