• 締切済み

Excel2000 VLOOKUPで検査値は一緒で、列内容が違うものの全てをひっぱりたい

初心者です。 似たような質問はいくつか見つかるのですが、理解力不足で自分に当てはめることが出来ません。 どうか、宜しくお願い致します。 sheet1 A     B    D  (←列番号) No.1    田中  資格あ   No.1    田中  資格い No.1    田中  資格う No.2    佐藤  資格あ No.2    佐藤  資格い No.3    鈴木  資格あ No.3    鈴木  資格い No.3    鈴木  資格う No.3    鈴木  資格え No.3    鈴木  資格お No.5    西野  資格あ sheet1に上記のデータがあるとして、 sheet2に検査値(No.)を入力し、その値と同じ人の資格名(C列)をひっぱりたいのです。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ sheet2 A     B    D  (←列番号) No.3(検査値) 資格あ 資格い 資格う 資格え 資格お ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A1:=vlookup(A1,sheet1!A2:D6,3,)とすると、 1行目の「資格あ」だけは出てきます。 A2:資格い A3:資格う・・・・と表示させたいのですが、 A2以降はどのような式を入れればよいのでしょうか。 どなたか教えて下さい。 1つ条件として、作業列は作れないということです。 どうか、宜しくお願い致します。

みんなの回答

  • kaisendon
  • ベストアンサー率44% (114/257)
回答No.6

tasyさんありがとうございます。 作業列を使用できない理由を答えて頂き、感謝しています。 すっきりしました。 No1さんのお礼に所に『式の解説を…』と書いてあったので、 作業列を使えない理由を教えて頂いたお礼の意味を含めて、 私の式でよければ私の式の意味を解説してみたいと思います。 =IF(COUNTIF(Sheet1!$A$1:$A$15,$A$1)<ROW()-1,"",INDEX(Sheet1!$C$1:$C$15,SMALL(IF(Sheet1!$A$1:$A$15=$A$1,ROW(A$1:A$15)),ROW()-1))) ポイントとしては、配列の範囲の行数を揃えるという事。 私の式では15行分の配列を式に入れています。 No.4さんの式では、A2~A100とA1~A99で99行分の配列です。 No4さんの式の場合、 Sheet1 A2   ROW(A1)       :     : 同   A100   ROW(A99) 各配列同士で、それぞれの行はこのように対応しています。 もう一つのポイントは、 この式はROW関数が3箇所に使われています。 このROW関数で作られる連番の数字をどう使っているのかを理解することが、この式を応用する為の早道だと思います。 質問の表で、列番号 D が C だとして、 式を分解してみます。 COUNTIF(Sheet1!$A$1:$A$15,$A$1) (Sheet2の)A1セルに入力された『検索値』が Sheet1のA1~A15にいくつあるか数えます。 この数がSheet2でデータを表示させるのに必要な行数です。 IF(COUNTIF(Sheet1!$A$1:$A$15,$A$1)<ROW()-1,"", 先に数えた数を、表示される列の行番号を比較します。 この式は(Sheet2の)A2セルに入れたので、 A2セル = 表示させたいセルの一行目 = ROW()-1 = 1 A3セル = 表示させたいセルの二行目 = ROW()-1 = 2 と、変化していきます。 (後で出てくるSMALL関数の第二引数[順位]も、同じように) 質問文にあるデータでNo.5だと A2セルでは IF(1<{1} → {FALSE} → [偽の場合]のINDEX関数へ A3セルでは IF(1<{2} → {TRUE} → [真の場合]で ""に。 ここまでは、「エラー処理」と「表示されるのに必要な行を確保」をしているだけです。 INDEX(Sheet1!$C$1:$C$15,SMALL(IF(Sheet1!$A$1:$A$15=$A$1,ROW(A$1:A$15)),ROW()-1))) INDEX(Sheet1!$C$1:$C$15 抽出したいSheet1のC1~C15のデータ範囲を配列として指定しています。 IF(Sheet1!$A$1:$A$15=$A$1,ROW(A$1:A$15) 私が作業シートのA列に入れた式 =IF(Sheet1!A1=Sheet2!$A$1,ROW(),"") と同じです。 便宜上、『存在しない架空の作業列』とでも言えばいいでしょうか。 (Sheet2の)A1セルに入力された値と等しいものがSheet1のA1~A15にあった場合、ROW(A$1:A$15)で、その行に対応する行番号を『架空の作業列』に求め出しています。 (このIF関数の[偽の場合]は、不要なので省略しています) 元データが2行目からなら、 INDEX(Sheet1!$C$2:$C$16,SMALL(IF(Sheet1!$A$2:$A$16=$A$1,ROW(A$1:A$15)) 3行目からなら、 INDEX(Sheet1!$C$3:$C$17,SMALL(IF(Sheet1!$A$3:$A$17=$A$1,ROW(A$1:A$15)) とかにすればよいでしょう。 ここのROW関数の配列は、元データの一行目を 1 としたいので、 数式を修正させる場合でも変化させません。 この場合、それぞれの15行分の配列が、 先に書いた『No4さんの式の場合』のように、対応する配列になっています。 SMALL(……,ROW()-1) 作業シートのB列 =SMALL(A:A,ROW()) と同じです。 先ほど『架空の作業列』として求めた行の番号を小さい順上から詰めて並べるものです。 作業シートのB列の結果がどのようになっていたのかを見ると判りやすいかと思います。 結果を表示するセル(Sheet2のA2)が2行目なので、 SMALL関数の第二引数[順位]を、ROW()-1 として、 一行目は SMALL(……,1) 二行目は SMALL(……,2) になるように調整しています。 (結果を表示するセルが3行目からならば、SMALL(……,ROW()-2)にするとか) これで、数式を下にコピーする事により『架空の作業列』の値も、作業シートのB列のように並び変わります。 あとは、INDEX(Sheet1!$C$1:$C$15,行番号 これで、必用なデータを抽出して終わりです。 作業シートB列の値を見ながら、Sheet2のA2以下のセルで、 INDEX(Sheet1!$C$1:$C$15,作業シート!B1) これを使い抽出していたのと同じです。 まあまあ、長々となってしまいましたが、 ざっくりと言えば、 =IF(COUNTIF(Sheet1!$A$1:$A$15,$A$1)<ROW()-1,"",INDEX(Sheet1!$C$1:$C$15,SMALL(IF(Sheet1!$A$1:$A$15=$A$1,ROW(A$1:A$15)),ROW()-1))) (Sheet2の)A1と同じものが、Sheet1のA1~A15にいくつあるか数えて、 表示させるのに不必要な分は非表示に、 (Sheet2の)A1に入力された値と同じ値がSheet1のA1~A15にあれば、 それが、配列の何行目なのか、行番号を求めて、 その数字(行番号)を小さい順に(フィルコピーで)上から詰めるように並べる。 小さい順に並べられた数字が、INDEX関数で指定した配列(C1~C15)の行番号に相当するので、それを抽出する。 以上です。 お疲れ様でした(^_^;)

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.4です! たびたびごめんなさい。 投稿した後他の方の回答を読ませていただいたところ No.1さんとダブっていました。 前回の回答は無視してください。 どうも失礼しました。m(__)m

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんばんは! 今回は氏名は関係なく、検査値Noだけで資格を表示すれば良いのですね? 作業列を使わないのが希望のようなので・・・ 配列数式になってしまいますが、 ↓の画像で説明させていただくと Sheet2のA2セルに =IF($A$1="","",IF(COUNTIF(Sheet1!$A$2:$A$100,$A$1)>=ROW(A1),INDEX(Sheet1!$C$2:$C$100,SMALL(IF(Sheet1!$A$2:$A$100=Sheet2!$A$1,ROW($A$1:$A$99)),ROW(A1))),"")) という数式を入れて Shift+Ctrl+Enterキーを押します。 すると数式の前後に{ } マークが入り配列数式になります。 それをオートフィルで下へコピーすれば 画像のような感じになります。 尚、この画面から数式をコピー&ペーストする場合は 貼り付けただけではエラーになると思いますので F2キーを押すか、数式バー内で一度クリックし、編集可能にした後に Shift+Ctrl+Enterキーを押します。 尚、数式は100行目まで対応できる数式にしていますが、 データ量によって範囲指定はアレンジしてみてください。 以上、参考になれば幸いですが、 他に良い方法があれば読み流してくださいね。m(__)m

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

作業セルならいいのかな? もちろん、使わなくても良いのですが同じ計算を何回もするので作業セルを使ってみました。 Sheet1のNo.は添付図のように数値とします また、No.で昇順(降順)で並んでいるとします。 H1セルは =COUNTIF(A:A,F1) J1セルは =MATCH(F1,A:A,0) F2セルは =IF($H$1>=ROW()-1,INDEX(D:D,$J$1+ROW()-2),"") 下へオートフィル ちなみに、No.は数値でなくても良いのですが、No.を使ってまとめる作業に昇順(降順)が都合が良いので、数値としています No.でまとまっていない場合は、オートフィルタやフィルタオプションも検討してみてください。

全文を見る
すると、全ての回答が全文表示されます。
  • kaisendon
  • ベストアンサー率44% (114/257)
回答No.2

tasyさんすみません、後学の為に教えてください。 なぜ、作業列は作れないのですか? tasyさんが仰っている通り、似たような質問はいくつか見かけます。 そして、こういった物を作業列を使わずに行おうとすると、 No1さんのような感じになるのがお決まりのパターンです。 私が考えたのも同じような式です。 =IF(COUNTIF(Sheet1!$A$1:$A$15,$A$1)<ROW()-1,"",INDEX(Sheet1!$C$1:$C$15,SMALL(IF(Sheet1!$A$1:$A$15=$A$1,ROW(A$1:A$15)),ROW()-1))) (Ctrl + Shift Enter で配列数式として確定 → 下にコピー) この式って難しいですよね? 作業列を使わないで、一発で求める事ができる式が 必ずしも「いい式」だとは思えません。 この式は、作業列を使いたくないが為に、 無理やりまとめて肥大化した式のような気がしてならないのです。 求めたい通りの結果が返ってくればそれでOK、ならば、 それはそれでいいのですが、 後々のメンテナンス性とか、別の方に引き継ぐ時とかの事を考えると、 好ましい式とは言えないと思います。 誰かがSheet2のA列をうっかり触ってしまって編集状態になり、 慌ててEnterで確定したら、式の{  }が外れてしまって、 配列数式の意味を成さなくなってしまう、とか往々にしてありそうで怖いです。 レイアウトの関係とか、見た目とかの問題で作業列を使いたくないのであれば、『作業シート』を作ってそれを利用するのも一つの手だと思います。 例えば、作業シートのA1に =IF(Sheet1!A1=Sheet2!$A$1,ROW(),"") 同じくB1に =SMALL(A:A,ROW()) それぞれ、下に必用なだけコピー Sheet2のA2に =IF(COUNT(作業シート!A:A)<ROW()-1,"",INDEX(Sheet1!$C$1:$C$15,作業シート!B1)) このようにしておけば、作業シートのA列、B列の式が、 どのような処理を行っているのか明確になります。 ROW関数の返り値だけ気をつけていけば、 さほど難しい処理をしているわけではありません。 このように、式の可読性を高めて、自分が、あるいは他の人が見た時に、 少しでもわかりやすい処理にしておいた方が、後々何かと楽なのではないかと個人的には思っています。 まあ、こういったQ&Aの場合、 質問者は、一発で求めたい結果が返る式であれば、 数式が多少長くても、配列数式でも、なんでもいい、という傾向があるのは否めないですし、 回答者は、一発でドーンと答えの出る配列数式の方が回答しやすいという感じもあります。 まあ、私もその回答者の一人なんですけど(^_^;) (実際、作業列の式がどうだこうだ書くより、先に書いた配列数式だけ書いて終わり、の方がよっぽど楽ですしw) ただ、 > 1つ条件として、作業列は作れないということです。 これがどうにも引っかかって仕方がないのです。 もちろん社内で使うのであれば、何かしらの制限やら、ご事情やらがある事でしょうから、表の構成の自由度が低くなるのは仕方のない事なのでしょうけれども、 冒頭に書いたように、 『何故作業列が使えないのか?』 これがどうしてもわからないのです。 後学の為に、作業列が作れない訳を教えて頂けませんでしょうか?

tasy
質問者

お礼

kaisendonさん、ありがとうございます。 そうですね。作業列や作業シートを使用できればもっと明確なのかもしれません。 今回、それが出来ないのは、 データをMSQueryでMSAccessからひっぱってきており、 指定したsheet1にデータを出力させ、フォーマットとしてあるsheet2に式で反映させているのですが、 そのフォーマットを作成し、印刷後、次の分を作成する為にsheet1の全データを削除するようになっているからです。 これは仕様の為、修正できません。 シートを勝手に増やすことも出来ない決まりなのです。 フォーマットのsheet2の中に作業列を作るのも、禁止となっています。 これがどんなおかしな理由であっても、 どんなに正当性があっても動かせない決まりなので、 今回はどうすることも出来ないのです。 ですが、kaisendonさんの教えてくださった作業シート版は大変参考になります。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

VLOOKUP関数では1つしか抽出できません。 一例です。 sheet2のA2に以下の数式を設定、必要分下方向にコピーして下さい。 尚、配列数式の為、入力完了時にshift+ctrl+enterキーを同時押下して下さい。 =IF(COUNTIF(Sheet1!A:A,$A$1)>=ROW(A1),INDEX(Sheet1!C:C,SMALL(IF(Sheet1!$A$1:$A$1000=$A$1,ROW(Sheet1!$A$1:$A$11),99999),ROW(A1))),"")

tasy
質問者

補足

mu2011さんありがとうございます。 上記の簡単なデータで当てはめると出来るのですが、 本データでやってみるとエラーになってしまいます。 式の解説をお願いできませんでしょうか? どうかお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルで2つの条件を元に

    エクセル2007で名簿を作っています。 1ヶ月ごとにメンバーの順が変わります。 シート1(番号順に名簿を作りました)   A  B   C  1 1     山田 2 2     木村 3 3 副長 佐藤 4 4     鈴木 5 5 班長 田中 6 6     長田  シート2(こちらがメンバーに配る名簿です)   A   B  C   D 1 班長    1    3 2 田中    山田  鈴木 3 4 副長    2    4 5 佐藤    木村  長田 A2に田中,A5に佐藤を選んでくるのはvlookupで成功しました。 質問したいのは C列D列に上記の番号のようにシート1の名前を入れていきたいのですが,田中,佐藤の分を抜いた上で番号の若い順に選んできたいのです。 どのような関数をどのように使えば成功するでしょうか。  

  • excel2003 2列のデータを1列に

    エクセル2003にて 下記のように2列のデータを1列に表示させたいと思っております。 A列  B列              C列 田中 佐藤              田中 鈴木 池田 このように>      鈴木 後藤 内藤              後藤                     佐藤                     池田                     内藤 C列に入れる数式をお教えください。 よろしくお願いします。

  • Excel関数のifとvlookupの組合せについて

    10月というシートと11月というシートがあります。10月にあるIDが11月にもあるようなら、11月のシートに○をないようなら×を入れるような関数を作ろうと思っています。ifとvlookupを組み合わせたらどうにかなりそうだと思ったのですが、どうも思った結果が出ません。どなたか教えて下さい。 <10月シート>   A  B 1 555 田中  2 666 鈴木 3 777 山本 <11月シート>   A  B  C 1 999 本田 × 2 888 鈴木 × 3 666 鈴木 ○

  • VLOOKUPでお願いします

    VLOOKUPは初めてです。 (シートA)     A       B     C  1  コードNO.   名前   電話番号 2  0011112    佐藤   1111-3333 3  0022222    鈴木   1234-5544 4  1155444    山田   5566-1133 5  0333777    山下   8877-4477 (シートB)     A       B     C  1  コードNO.   名前   電話番号 2  0022222     3  0333777    シートAが元データです。 シートBのA列に他からコピーしたコードNO.を貼り付けると自動的に シートAからに該当する名前と電話番号をシートBのB列C列に表示させる。 どうか宜しくお願いいたします。

  • 【Excel】VLOOKUP関数について

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

  • vlookup関数で検索値を含む文字列を検索する方法

    vlookup関数で例えば E1のセルに=vlookup(D1,A:C,3,false)とした場合、D1が佐藤であれば、A列に「佐藤」がある場合には当然、「佐藤」がある行の3列目の値が返されますが、「佐藤」はなく「佐藤A」や「A佐藤」がある場合にもこれらがある行の値を返して欲しいのですが、いい方法はありませんでしょうか。*を使ってできると思ったのですがうまくいきません。上記例で、=vlookup("*佐藤*",A:C,3,false)とすればできますが、*佐藤*の部分はD1の引用を利用したいのです。  よろしくお願いします。

  • どなたか取り出し方を教えてください

    はじめまして、どなたか教えてください。たとえば Xというテーブルがあって。AとB2つのフィールドがあります A列 B列 鈴木 100 鈴木 125 鈴木 156 佐藤 354 佐藤 552 佐藤 132 田中 151 田中 99 田中 845 というテーブルから a列の中のものはdistinct 的な取り出し方をしつつ B列で最も大きな数字のa行を取り出したいのです 取り出したい結果 A列 B列 鈴木 156 佐藤 552 田中 845 とするにはどうすればよいのかさっぱりわかりません どなたか教えてくださいませ

  • エクセル関数

    シート1という名前のシートと シート2という名前のシート2つのシートがあります。 シート1は ・A列には従業員の氏名が入っています ↓このように  A 空欄 鈴木 伊藤 佐藤 ・資格名は見出しとしてB2~Q2まで入ってます(見出しとして) ↓シート1の全体はこのような感じ  A   B    C    D 空欄 資格1 資格2 資格3 鈴木 伊藤 佐藤 次にシート2は ・A列に個人コードが入ってます ・B列に名前が入ってます ・C列に資格名称が入ってます ・D列に資格取得日が入ってます ↓シートの全体はこのような感じ A  B   C    D 1  鈴木  資格1   6月 1  鈴木  資格2   7月 2  伊藤  資格3   8月 2  伊藤  資格1   9月  2  伊藤  資格2   10月 3  佐藤  資格3   11月 上記のようなシートがあります。 ここでシート1にシート2の値を返していきたいのですが 見ての通り書式はバラバラです 例えばシート2を見て鈴木は資格1、資格2、資格3を持っています 資格1だったら○をシート1の鈴木と資格1がぶつかってるセルに 資格2だったら○をシート1の鈴木と資格2がぶつかってるセルに 返していきたいのです 何か有効な関数などはありませんでしょうか? むしろ関数でできるのでしょうか? 説明が訳分からなくてすみません。 

  • VLOOKUP関数 列番号の設定の仕方教えて下さい

    VLOOKUP関数の列番号を 1、2、とかではなく、 計算して列番号を設定することはできますか? シート2 に入っているデータを参照して シート1 に関数をいれて、表示させたいと思っています。 シート2 データは 3行目に、項目(品名、(1)材料名、(2)数量、(2)材料名、(2)数量、...、(10)材料名、(10)数量) A列、 B列、 C列、 D列、 E列、...、 M列、 N列 クッキー、小麦粉、100、卵、1、...、砂糖、20 クラッカー、小麦粉、100、米粉、10、...、りんご、0.2 が入っていて、4行目から100行目くらいまでデータがはいっています。 シート1 の セルA5に品名を入力すると、 シート2の(1)材料名がセルA6に、 (1)数量がセルB6に、 (2)材料名がセルA7に、 (2)数量がセルB7に、 ... (10)材料名がセルA15に、 (10)数量がセルB15に、 入るように作りたいのですが、VLOOKUPの列番号を COLUMNやINDEXなど試してみましたが、エラーばかりで うまくできません...VLOOKUPでは無理なのでしょうか? どなたか詳しい方教えてください。よろしくお願いします・

  • Excel2003 関数を教えてください

    Excel2003にて作業しております。 ワークシートが県毎に分かれており、以下のような入力をしております。 北海道(シート1) A   B  C   D   E   F ―――――――――――――― No. 件数 ・・・ 担当  日付  ・・・ 1   60  ・・・ 佐藤   6/2  ・・・ 2   40  ・・・ 鈴木   6/6  ・・・ 3   70  ・・・ 佐藤   6/5  ・・・ 4   50  ・・・ 田中   6/6  ・・・ 青森県(シート2) A   B  C   D   E   F ―――――――――――――― No. 件数 ・・・ 担当  日付  ・・・ 1   30  ・・・ 加藤   6/3  ・・・ 2   20  ・・・ 田中   6/4  ・・・ 3   50  ・・・ 佐藤   6/3  ・・・ 4   10  ・・・ 田中   6/4  ・・・ 各担当者の合計件数・日付などを知りたいのですが、何かよい関数はないでしょうか? 以下のように担当者毎に別シートへ反映できれば理想的です。 A   B  C   D   E   F ―――――――――――――― No. 件数 ・・・ 担当  日付  ・・・ 1   60  ・・・ 佐藤   6/2  ・・・ 3   70  ・・・ 佐藤   6/5  ・・・ 3   50  ・・・ 佐藤   6/3  ・・・ できなければ各担当者の合計件数だけでも出したいのです。 ご教示ください。よろしくお願いいたします。

専門家に質問してみよう