- ベストアンサー
エクセルで複合検索
エクセルなのですがvlookup関数で複合検索をしたいのですができません。 A表 A B C 1 a1 b1 c1 2 a2 b2 c2 3 a3 b3 c3 という表があり B表 a b c 1 11 12 13 2 21 22 23 3 31 32 33 というところから引っ張りたいのですが sql で書くと select B.c from A,B where A.a=B.a and A.b=B.b になります。 エクセルでできないものでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
エクセルの検索をSQL文で説明するのは無理があります。 エクセルの関数は (A)1つの値を返すものであること (B)VLOOKUPは2つ目以後の該当を返さないこと 検索や抜き出し型の問題には弱いです。 一方SQLは条件該当分をテーブル(ファイル)として返してレコードとしては返さない からです。 それでこう言う場合は、文章で説明していただいたほうが 良く判ると思います。 「B表のB、C列の組みのデータを1つ取上げて、A表のB,C列を検索して、一致した行のA表のA列番号を示せ」 でA列を求める時、検索に使う列より、左にあると駄目なんです。偶々行数と同じなのですが。 それとVLOOKUPは2列を指定できません。 B,C列を結合した列を作らないといけませんが、B、c列の 桁数がはっきり判らないと、単純に結合すると危険です。 VBAではFindを使えばLOOPは(形上で)しません。 なんか隠された条件が後から出てきて、(まだ見えない条件などありそうなのと、自分の流儀に拘った質問の出し方などが感じられて)答え難い質問です。
その他の回答 (3)
- mshr1962
- ベストアンサー率39% (7417/18945)
#1の補足を見ると(B表のb1は11でなく12ですよね) B表のb,c列の値でA表を検索して一致したA表のa列の値を表示ですか? A表がA1:C9 B表がA10:C12 として =INDEX($A$1:$A$9,SUMPRODUCT(($B$1:$B$9=B10)*($C$1:$C$9=C10)*ROW($A$1:$A$9)),1) A表の開始行が1行目でない場合は =INDEX($A$1:$A$9,SUMPRODUCT(($B$1:$B$9=B10)*($C$1:$C$9=C10)*(ROW($A$1:$A$9)-(行数-1))),1) としてください。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
VBからだったらそのままSQLで実行した方が良いのかも知れません。 A表は、実際にはセルの中身なのでしょうか?
補足
select A.a from A,B where A.b=B.b and A.c=B.c; でした。(何度も間違えてごめんなさい。) 全部エクセルのセルの中身です。今はシート別になってます。 VBといよりは”エクセルマクロ”の自動記録を元に作っているのですが、この表自体が1000*10と1000*20くらいのボリュームがあるので 1行*1000を1000回ループさせるのもどうかと思いまして。。。 VBは全くの素人です。 何かいい方法があれば教えていただきたいと思いまして。。。
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 いまいちわかりにくいのですが、 ご質問の表をテーブルとして、ご記載のSQLを実行するとすると、データが取れないと思いますが・・・? (^^ゞ
補足
すみません、自分でも意味不明でした。 A表 a b c 1 11 12 2 11 22 3 11 33 4 21 12 5 21 22 6 21 33 7 31 12 8 31 22 9 31 33 という表があり B表 a b c 1 11 11 2 21 22 3 31 33 select A.a from A,B where A.b=B.b and B.c=C.c; で、 1 5 9 とほしいのです。
補足
普段SQLしかさわらないもので思考回路が偏っており、わかりにくくて申し訳ありません。 急にエクセルをDBにしてくれと言われ、急遽”CSV吐きスクリプト”作成をしています。 (なぜエクセルで作るか?w 色情報をかなり含んだシートなので、perl では無理なんです 残念っ) 結局、B,C を concatenate を使って結合して vlookup しました。 結果をざっと見る限り、正しく出てるかなぁという感想です。 B and C な検索しかないので大丈夫かと思ってますけどね。