• 締切済み

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

kaisendonの回答

  • 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)の行番号に相当するので、それを抽出する。 以上です。 お疲れ様でした(^_^;)

関連する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  ・・・ できなければ各担当者の合計件数だけでも出したいのです。 ご教示ください。よろしくお願いいたします。