EXCEL関数/別シートのセル番地をセルの値で指定

このQ&Aのポイント
  • Sheet2に抽出されたデータの一部をSheet1からVLOOKUP関数を使用して参照する際に、参照元のセル番地を計算して手入力するのは大変なため、自動的に計算する方法が知りたい。
  • Sheet2からSheet1のデータをVLOOKUP関数で参照する際に、参照元のセル番地を自動的に計算する方法を教えてください。
  • EXCEL関数を使用して、Sheet2からVLOOKUP関数で参照する際のセル番地を自動的に計算する方法を教えてください。
回答を見る
  • ベストアンサー

EXCEL関数/別シートのセル番地をセルの値で指定

お世話になります。 どうしてもわかりません… エクセル名人の皆様、どうかお知恵をお貸しくださいませ。 Sheet1に下記のようなデータが約5000件あります。   A  B  C   D … BP  … 1 No. ID. 品目 月日…状況 … 2 1 a33  A  3/4   0    3 2 a87  B  5/11  1   このうち、BP列が1のもの約900件のみがSheet2に抽出されています。 (このためのマクロについて前回質問させていただきました) Sheet2:   A  B  C   D   E  F  G  … 1 No. ID 品目 月日             2 2  a87  B  5/11              3 7  b3  K  2/5 4 18 c44  F  12/1 5 11 r93 J 7/28 ちなみにA列のNo.は1,2,3,…と続く通し番号で、だぶりはありません。 Sheet1のデータの項目数は大変多いのですが、Sheet2にはその項目すべては必要でないため、 Sheet2には上記のとおりAからD列までの必須情報のみ抽出し、 E列以降の情報については、必要な列の情報のみ、 A列の通しNo.で紐づけしてVLOOKUP関数で取得したいと考えています。 しかし、Sheet1の表には空欄があり、これを空欄のまま表示させるために IF関数を使いたいのですが、 Sheet1の参照元のセルの番地をどう書けばいいでしょうか? とてもわかりにくくて申し訳ありません… たとえば、Sheet2のA列が18であれば(上記Sheet2のA4)、 元データはSheet1の19行目にあることになります。  A列の数値+1、が行番号ということです。 そのK列を参照する場合、 =IF(Sheet1!K19="","",VLOOKUP(A4,Sheet1!A:K,COLUMN(K4),FALSE) となるかと思うのですが、 このSheet1!K19 というセル番地を、自分で計算して手入力するというのはとても大変なので、 関数などで表現する方法はないでしょうか。 たとえば、Sheet1!K(A4+1) とか書いてみましたが、もちろんこれでよいわけもなく… 不勉強で恐縮ですが、どうしてもわかりません。 どうかご教授ください。 よろしくおねがいいたします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

基本のご質問: シート1のK列の18+1=19行目は =INDEX(Sheet1!K:K,A4+1) で直接参照します。わざわざVLOOKUPする必要「も」ありません。 次のご質問: >これを空欄のまま表示させるために K列の内容が「文字列」だった場合は =INDEX(Sheet1!K:K,A4+1)&"" としておきます。 K列の内容が「数値」で、これを「数値として」計算結果を出しとかなきゃならない場合は =IF(INDEX(Sheet1!K:K,A4+1)="","",INDEX(Sheet1!K:K,A4+1)) としておきます。 K列の内容が数値でも、結果は「文字列として表示するだけでOK」な場合は、先の&""の方式を利用できます。

arsk2150
質問者

お礼

前回に引き続きご回答いただきありがとうございます! しかも、とてもスマートな関数に変身させてくださって、 大変勉強になりました。 心からの感謝をこめて、重ね重ね御礼申し上げます。

その他の回答 (6)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

No.6です! たびたびごめんなさい。 投稿後に思ったのですが・・・ Sheet1の1行目は項目が入っているのですよね? そうであればSheet2の1行目は列番号でなく 表示したい「項目名」を入力した方が良いと思います。 その場合の数式は E2セルを =IF(OR(E$1="",$A2=""),"",INDEX(OFFSET(Sheet1!$A:$A,,MATCH(E$1,Sheet1!$1:$1,0)-1,,1),MATCH($A2,Sheet1!$A:$A,0))) として、列・行方向にオートフィルでコピーしてみてください。 (前回の数式は列方向のオートフィルは考慮していませんでした) ※ 空白の「0」の表示の件についてはNo.1さんが回答してくださっているので その方法を利用させてもらう手もあると思います。 何度も失礼しました。m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

こんにちは! Sheet2のE1セルは単に表示したい列番号を入力するだけとします。 今回の質問の場合は K と入力 E2セルに =IF(OR(A2="",E$1=""),"",INDEX(INDIRECT("Sheet1!"&E$1&":"&E$1),MATCH(A2,Sheet1!A:A,0))) という数式を入れオートフィルで下へコピー! ※ Sheet1の表示したいセルが空白の場合は「0」が表示されてしまいますので、 Excelのオプション → 詳細設定 → 「次のシートで作業するときの・・・」 → 「ゼロ値」のチェックを外しておきます。 尚、Sheet2で他の項目でどうしても「0」を表示しなければならない場合は IF関数で上記数式が空白の場合の条件を追加してやります。m(_ _)m

arsk2150
質問者

お礼

前回に引き続き、貴重なお時間を割いてご回答くださったこと、 心から感謝いたします。また、わざわざオートフィルのことまで ご考慮いただき追加のご回答をいただきましたことも、 重ねて御礼申し上げます。 こちらで質問させていただくごとに自分の不勉強が身に沁みます。 またお世話になることがあるかもしれませんが、どうぞよろしくお願いいたします。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.5

次のような式にすることで問題は無いように思いますね。 =IF(VLOOKUP(A4,Sheet1!A:K,COLUMN(K4),FALSE)="","",VLOOKUP(A4,Sheet1!A:K,COLUMN(K4),FALSE))

arsk2150
質問者

お礼

貴重なお時間を割いてご回答いただきありがとうございます! 大変勉強になりました。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.4

#2です。すみません、誤記がありました。 INDIRECTのすぐ後の( が抜けてました。追加してください。 すみません。

  • moon00
  • ベストアンサー率44% (315/712)
回答No.3

INDIRECT関数を使えば可能な気がします。 Sheet1!K19と書くべきところを、以下のようにします。 INDIRECT("R"&A4+1&"C11",FALSE) "R"&A4+1&"C11"で、A4セルの値を使い、R1C1形式でK19を表します。

arsk2150
質問者

お礼

貴重なお時間を割いてご回答いただきありがとうございます! 大変勉強になりました。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.2

他にも方法はあると思いますが、例えば、 =IF(INDIRECT"Sheet1!K"&(A4+1))="","",VLOOKUP(A4,Sheet1!A:K,COLUMN(K4),FALSE) でどうでしょうか。もしくは、 >たとえば、Sheet2のA列が18であれば(上記Sheet2のA4)、 >元データはSheet1の19行目にあることになります。  >A列の数値+1、が行番号ということです。 なのですから、VLOOKUPで廻さなくても =IF(INDIRECT"Sheet1!K"&(A4+1))="","",INDIRECT"Sheet1!K"&(A4+1))) とか。 この他にもOFFSET関数を使ってもできそうです。

arsk2150
質問者

お礼

ご親切にご回答いただきありがとうございました! 大変勉強になりました。 心から感謝申し上げます。

関連するQ&A

  • EXCEL LOOKUP関数で別シートをセルから参照したい

    シート:集計表・4月・5月・6月・・・・3月 (4月~3月までは売上表が入っていて、表の形式はまったく同じです。) 集計表のシートにおいて、 A1にシート名を入力することによって、そのシートを使った範囲を取得したいと思ってます。 B2に =vlookup(B1,'A1'!A:B,2,0) この場合、'A1'! は有効しませんが、何かの関数を使ってこれと同じ結果を得たいと考えています。 いろいろ検索しましたが、(検索の仕方も悪いかもしれません。) VLOOKUP関数を使って複数列を範囲としたいので、よく出てくるINDIRECT関数はセル番地を指定する以上、無理だと判断しました・・・。 よろしくお願いします。

  • 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関数をうまく入れることができません。 どのように関数を入力したら、上手くいくのか、教えていただけないでしょうか。

  • 別シートの指定位置へ値を入れる関数

    OS:WindowsXP エクセル2003です シートAに A列     B列    C列 結果記号 点検記号 判定用 A              1_2011 A              3_2011 A      11_2011 A      12_2011        B 15_2011        X 18_2011        D 20_2011 A 1_2012 A 4_2012        D 9_2012 .... 結果記号、点検記号、そしてシート移植用の判定用があります。 判定用というのはID_年を数字にしたものです。 1_2011の場合、ID1の2011年を指し、1_2012だとID2の2012年を指します シートBには     A列  B~H列  I列  J列  1行目 ID  名称とか 2011 2012  ←ここはタイトル列です 2行目 1  りんご 3行目 2  ばなな 4行目 3  ぶどう ... 21行目 20  なし という形の表があります。 シートAの判定用列の値と一致する場所に、結果記号か点検記号を入れたいです。 例えば:シートAの判定用「1_2011」の場合 シートBのIDが1、年度が2011年のセル(I2)に結果記号のAを入れ シートAの判定用「9_2012」の場合 シートBのIDが9、年度が2012のセル(J9)に点検記号のDを入れたいです。 この場合の関数はどのような感じになるのでしょうか? シートBのI2に =IF(COUNTIF(シートA!$C:$C,$A2&"_"&I$1) と、シートAの判定用と、シートBのIDと年に一致するような関数を考えてみましたが、その後点検記号や結果記号を入れるにはどのような関数を足せばいいのでしょうか?

  • Eecelで指定されたセル番地に入力される方法を教えてください

      A  B  C  D  E 1    A1  1 2    A2  2 3    A3  3 4    A4  4 上記のようなシートがあったとします。 B列にセル番地が入力されており、C列には数値が入力されています。 A1にC1の値=1 A2にC2の値=2 という具合に、 B列に入力されているセル番地に隣のC列の値が入力されるようにしたいのですが、どうもうまくいきません。 いい方法があったら教えてください。よろしくお願いします。 ※できれば関数で何とかしたいと思っています。 OS:Windows XP Excel2003です。

  • EXCELの関数で別のシートからデータを取り出す方法について

    こんばんは。 excelの関数で次のようなことができますか? sheet1 A     B   C 123 125 122 sheet2 A    B    C     D 122            りんご 123           みかん 125            バナナ 上記のようなデータがsheet1とsheet2にあります。 sheet1のC列にA列のセルの番号と対応した商品を sheet2のA列とD列に対応データから引用できますか? (となりに並んでいないデータです。) 関数的にはvlookup,index,matchとかを使うとよさそうですが うまくいきません。 解決方法を教えてください。 よろしくお願いします。

  • Excel関数 別シート参照現シートに合計値を表示

    お世話になっております。 Excel関数について質問させてください。 まず私の環境にExcelが入っておらず、OpenOfficeの3.3を代用しております。 カテ違いでしたらごめんなさい・・・。 【質問】 Sheet1のリスト(A列とする)に存在する文字列を Sheet2の複数列(D列、F列、H列)に一致する文字列毎の数値(E列、G列、I列)の合計を Sheet1の列(B列とする)に表示したい 【データ例】 ○Sheet1  A列 B列  A   3  B   10  C   6  D   0 ○Sheet2  D列 E列 F列 G列 H列 I列  A   1   G  0   A  1  C   2   H  2   B  2  B   3   A  1   C  4  E   4   B  5   E   5 【試した事】 まず一辺には無理だと思い、 Sheet1のB列に以下の関数を入れてみました =IF('Sheet2'.D1=A1;"a";"b") これで一見判定が出来てる風だったのですが、 Sheet1のB1列に"a"と出て、他全て"b"と出ました。 恐らく、順不同で比較項目が並んでいる所為だと思いますが、 この並び順を変更するわけにはいかず・・・。 そもそも、文字型と数値型が一つの関数に指定出来るのかも不明で・・・。 どなたかわかる方、ご教授お願いいたします。 わかりにくい例ですみません。 【補足】 私の個人的見解として、関数で出来る気がしないのですが、どうなんでしょう・・・? もし、関数で無理ならVBかJavaでゴリゴリ組みます。

  • 別シートの同じセル番地を参照したい

    質問させていただきます。 同じブック内で、別シートの同じセル番地の値を参照する表を作りたいと思っているます。 イメージとしては、A1にターゲットのシート名が記入されいるとして、 =INDIRECT(ADDRESS(COLUMN(),ROW(),4,TRUE,$A$1)) の様な関数で出来ればと思っているのですが、うまくいきません。 =INDIRECT($A$1&"!B2")等も試してみましたが、コピー&ペーストB2の部分が相対的に変化してくれないので、困っています。 良い方法があれば教えていただきたいので、よろしくお願いいたします。

  • Vlookupの値のセル番地の表示

    エクセルのVlookup関数で、値を返したのですが、右隣の列にその値がどのセル番地にあったか表示させる方法はあるでしょうか? よろしくお願いいたします。

  • 【Excel】VLOOKUP関数について

    Excel2003を使用しています。 B列にコードNo.、D列に会社名が入力されている表(1)があります。 表(1)とは別のシートで、B列にコードNo.を入力すると、D列に会社名が表示されるように、VLOOKUP関数で検索範囲を表(1)としてD列に数式を入力しています。 これを逆に、D列に会社名を入力したら、B列にコードNo.が表示されるようにしたいのですが、B列に数式を入力する際、表(1)はこのまま利用できるのでしょうか?

  • Excel関数/複数列を対象にデータ参照するには

    - Sheet 1 -   A   B  C  D 1 09:00 G  H  J 2 10:00 K  L  M 3 11:00 N  P  Q 4 12:00 R  S  T - Sheet 2 -   A   B 1 G 2 H 3 J 4 K 5 L 6 M 7 N 8 P (以下略) となっているブックがあるとお考え下さい。 シート1のA列は時刻、B~D列は仕事内容を意味する文字列データが入っています。 シート2では仕事内容がA列に並んでいます(順番はJISコード順ではありません)。 シート2のB列に、仕事内容に対応する時刻データ(シート1のA列)を転記したいと考えています(たとえばB4には"10:00"、B8には"11:00"が入る)。シート1が書き換わるのに応じてシート2のB列に変更内容を反映させるには、どのような数式を設定すればよいでしょうか。 なお、シート1のB~D列は空欄もあり得ます。 VLOOKUP関数でできるか、と思ったのですが、複数の参照列がある場合は適当でないようです。INDEXとMATCHを組み合わせてあれこれ思案していますが、どうもいい方法が思い浮かびません。 VBAの方が簡単なのかもしれませんが、関数でのスマートな実現方法があれば御教示いただければ幸いです。よろしくお願いします。

専門家に質問してみよう