- ベストアンサー
EXCEL関数にお詳しい方助けてください
VLOOKUP関数で検索値は通常品番などで別のリストから品名などを検索して自動的に入力でき大変便利ですが、逆に品名(文字列)を検索値として品番を検索する必要があり、やってみたのですが品番とは全然別の品番を検索してきます。検索値の品名とリスト側の品名が一致してない場合もあるかもと思い検索値の品名をリスト側にコピーして全くおなじにしても別の品番を検索してきます。どうしてこうなるのか?対策を教えていただけませんか。よろしくおねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
VLOOKUP関数の検索値はリストの左側にある必要があることはご存じだと思いますので、期待しない結果が得られるのは、VLOOKUP関数の第4引数を省略した形で数式を作成しているためではないでしょうか? VLOOKUP関数の第4引数を省略(あるいは「1」または「TRUE」に)した場合は、二分検索というロジックで、データの中央の値を調べて、その値よりも大きいか小さいかで、大きい場合はその下(小さい場合は上)のデータの中央の値を順次調べていくような効率的な検索方法をとっています。 このような条件で検索するため、検索値のデータは昇順に並べ替えられている必要があることになります。 この検索方法で、該当するデータがない場合は、検索値を超えない範囲で最大の値を見つけます。 http://officetanaka.net/excel/function/function/vlookup.htm しかし、検索値が昇順に並べ替えられていないと上記の二分検索がうまく適用できないため、意味不明の返り値が返ってくることになるわけです。 このようなケースでは、検索値を昇順に並べておく(検索値があるならこれで正確な値が返ります)、あるいは、下記のようにVLOOKUP関数の第4引数を「0」または「FALSE」に指定する必要があります。 =VLOOKUP(検索値,リスト範囲,列番号,0) ちなみに、文字列を検索値にする場合は、リストの並べ替えで昇順にする際に「オプション」ボタンをクリックし「ふりがなを使わない」にチェックを入れる必要があります。
その他の回答 (3)
- bunjii
- ベストアンサー率43% (3589/8249)
>検索値の品名をリスト側にコピーして全くおなじにしても別の品番を検索してきます。 一般的に品番は品名と他の要素(規格等)を複合して1つの文字列(または数値)で表します。 従って、品番には重複を許さないと言う約束になっているはずです。 しかし、品名は複数でも良いので品名から品番を検索すると最初または最後にヒットした品番を返すことになると思います。 また、回答No.1で指摘されているようにVLOOKUP関数で抽出するときはデータの配置についても注意が必要です。 他の関数で検索する場合はデータの配置に拘らなくても検出できますが、検索値を複数にして1件のみヒットするようにしてください。 貼付画像のような模擬データで検証しました。 =INDEX(A1:A18,SUMPRODUCT((B1:B100=E3)*(C1:C100=F3)*ROW(A1:A100)),1)
お礼
多くの皆様にお世話になりご指導いただきましたおかげで何とかできるようになりましたがyonesanに教えていただいたFALSEを最後に入れるのをわすれていました。これでまず一つ目は解決できましたが尚おかしい結果の検索結果もありました。しかしMackyNo1さんの検索値を昇順に並べないといけないことを教えていただきましたのでその通り並べ替えましたらバッチリうまくいきました。 tom04さんやbunjiiもデータの配置の点をご指摘いただきましたし詳細に実際に作っていただいた表まで示していただきなんとお礼をもうしあげたらよいかただ感謝!申し上げることしかできません。本当に私のようなものに親切にご指導いただきありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! VLOOKUP関数は 範囲指定内で、一番左側の列を検索値とし、その行の何列目のデータを返すか? という関数になります。 質問内容を見るとおそらく右側の列を検索値として一致する行の左側の列を返したい!というコトだと思います。 その場合はINDEX関数とMATCH関数の併用で対応できます。 具体的なレイアウトが判らないので 仮にC列データを検索値として一致する行のA列データを返したい場合は =INDEX(A:A,MATCH("検索値",C:C,0)) のような感じになります。m(_ _)m
お礼
多くの皆様にお世話になりご指導いただきましたおかげで何とかできるようになりましたがyonesanに教えていただいたFALSEを最後に入れるのをわすれていました。これでまず一つ目は解決できましたが尚おかしい結果の検索結果もありました。しかしMackyNo1さんの検索値を昇順に並べないといけないことを教えていただきましたのでその通り並べ替えましたらバッチリうまくいきました。 tom04さんやbunjiiもデータの配置の点をご指摘いただきましたし詳細に実際に作っていただいた表まで示していただきなんとお礼をもうしあげたらよいかただ感謝!申し上げることしかできません。本当に私のようなものに親切にご指導いただきありがとうございました。
- yonesan
- ベストアンサー率25% (347/1368)
品名の入った列は検索範囲の一番左になっていますか? 品番の入った列は品名より右になっていますか? 関数の最後にFALSEをいれていますか? VLOOKUPでは検索値より左の列は探せません。 原則として品番から品名を探す表と品名から品番を探す表は別に用意する必要があります。 表を作るときに左から品番、品名、品番、その他のデータ という順にすれば、検索範囲を変えることでどちらでも使えるようになります。 またFALSEを入れないと近似値を拾います。 正確さを求めるならFALSEをつけましょう。
お礼
多くの皆様にお世話になりご指導いただきましたおかげで何とかできるようになりましたがyonesanに教えていただいたFALSEを最後に入れるのをわすれていました。これでまず一つ目は解決できましたが尚おかしい結果の検索結果もありました。しかしMackyNo1さんの検索値を昇順に並べないといけないことを教えていただきましたのでその通り並べ替えましたらバッチリうまくいきました。 tom04さんやbunjiiもデータの配置の点をご指摘いただきましたし詳細に実際に作っていただいた表まで示していただきなんとお礼をもうしあげたらよいかただ感謝!申し上げることしかできません。本当に私のようなものに親切にご指導いただきありがとうございました。
お礼
多くの皆様にお世話になりご指導いただきましたおかげで何とかできるようになりましたがyonesanに教えていただいたFALSEを最後に入れるのをわすれていました。これでまず一つ目は解決できましたが尚おかしい結果の検索結果もありました。しかしMackyNo1さんの検索値を昇順に並べないといけないことを教えていただきましたのでその通り並べ替えましたらバッチリうまくいきました。 tom04さんやbunjiiもデータの配置の点をご指摘いただきましたし詳細に実際に作っていただいた表まで示していただきなんとお礼をもうしあげたらよいかただ感謝!申し上げることしかできません。本当に私のようなものに親切にご指導いただきありがとうございました。