• ベストアンサー

エクセルの関数で

エクセルの関数で質問なのですが、VLOOKUPで検索値を2つ選択する事はできるのですか? 実際に行いたい事は、値Aを別シート内より検索して、そのシート内にある2つの値BとC双方に合致する値を返したいのですが・・・。 上記のVLOOKUPで可能かわかりませんが、他に良い方法があれば御指導頂ければと思います。 また、表現が分かりにくく内容が良く分からない場合は、ご質問頂ければ追加補足いたします。 何卒、宜しくお願い致します。

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

  • ベストアンサー
  • Aiz-Kis
  • ベストアンサー率80% (4/5)
回答No.4

No2です。 書き方が分かりづらかったですね、すみません。 1,シート1に入力した検索条件の組み合わせが重複している場合   1行目のA~C列に「ムンク、秋、雲」があり、3行目にも「ムンク、秋、雲」がある場合、   1行目にも3行目にも「55」の検索値が表示されます。   もちろん、組み合わせが異なれば重複とはなりません。     2,シート2のデータで、検索条件の組み合わせに該当するデータが重複している場合、   No3でお話した通りとなります。   シート2のデータで、その検索条件の組み合わせに該当する、行数の最も高い値が表示されます。   (5行目のA~C列に「ムンク、秋、雲、55」があり、    10行目にも「ムンク、秋、雲、70」の場合は「70」が表示されます。)    それから、今頃気づいて申し訳ないのですが・・・・、 わたしがお話していた式の内容は、 「複数の検索条件で検索し、その組み合わせに該当する重複データの最も高い行の検索値を表示させる方法」でした。 お望みのものと大きくずれていたかもしれません。 もしもシート2のデータの中に、検索条件の組み合わせに該当するデータが重複していないのであれば、 検索条件を結合してmatch関数とindex関数で簡単に検索できます。 《シート2》 検索するための作業列(E列)を作り、以下の式を入力して下方向へコピーします。 =A3&B3&C3 《シート1》 シート1のE列にも検索するための作業列を作り、同様に下方向へコピーします。 =A1&B1&C1 検索値を表示したい列に以下の式を入力(範囲は適宜修正してください) =IF(ISNA(MATCH(E3,Sheet2!E3:$E$16,0)),"",INDEX(Sheet2!$A$3:$E$16,MATCH(E3,Sheet2!$E$3:$E$16,0),4)) こちらの場合、上記の式ほど重くならないと思いますし、タイトル行や空欄の行の縛りはなくなります。 仮にシート2に検索条件の組み合わせに該当するデータが重複していたとしても、最初に検索されたデータが表示されます。 データを下の行に追加していく場合で、複数の検索条件に該当し、かつ最初に入力されたデータがほしい場合に向いていると思います。 No2の式は、データを下の行に追加して行く場合で、複数の条件に該当し、かつ直近の入力のデータがほしい場合ですね。 もしも、No2の式をお使いになるようでしたら、式の訂正をさせて頂きます。 シート1のA~Cに入力した検索条件に一致するデータがない場合、 その式が入力された行と同じ行の値(シート1の5行目の式では、シート2の5行目の検索値)が表示されてしまうことがわかりました。 理由は分かりませんが、index関数で行又は列が「0」の場合に起こるようです。 そのため、検索条件の組み合わせに該当するものがなかった場合に空欄を表示させるために、 式を以下のように訂正しました。 =IF(MAX(INDEX((Sheet2!$A$3:$A$16=$A1)*(Sheet2!$E$3:$E$16)*(Sheet2!$B$3:$B$16=$B1)*(Sheet2!$C$3:$C$16=$C1),0,0))>0,INDEX(Sheet2!$A$1:$D$16,MAX(INDEX((Sheet2!$A$3:$A$16=$A1)*(Sheet2!$E$3:$E$16)*(Sheet2!$B$3:$B$16=$B1)*(Sheet2!$C$3:$C$16=$C1),0,0)),4),"") これだと、そうとう処理が重たくなるとは思いますが・・・。 至急マークでのご質問に対し、何度も訂正や補足で申し訳ありません。

noname#115616
質問者

お礼

何度もお手数をお掛けして申し訳ありません。 なにぶんデーター量が膨大なので何とも言えませんが、恐らく、データーの重複は無いと思いますので、match関数+index関数で行けると思いますので、そちらでやってみます。 本当に助かります。有難う御座いました。

その他の回答 (3)

  • Aiz-Kis
  • ベストアンサー率80% (4/5)
回答No.3

No2です。 すみません、追加補足です。 先ほどの式は3行目から16行目までの表で作成してますので、適宜範囲は修正してください。 また、A~Cの検索条件の組合せが重複していないことも条件になります。 もしも検索条件の組合せが重複していた場合、すべてのセルでひとつの値しか表示されません。シート2のデータで、行数の最も高い値がすべて表示されます。 (仮にシート1の1行目から3行目のA~Cに同じ検索条件を入力し、その同じ検索条件がシート2の10行目と20行目と50行目に重複してあった場合、シート1の1行目から3行目にはすべてシート2の50行目の値が表示されます。) まぁ、シート1のE列に先ほどの式をコピーし、MAXをMINに変えれば、E列では行数の最も低い値(10行目)が表示されますが……。 データ数が多く、D列とE列にこの式を入れた場合、かなり処理が重たくなると思います。

noname#115616
質問者

お礼

追加補足有難うございます。 処理が相当遅くなるのは覚悟の上です(笑) 一つ質問なのですが、検索条件の組み合わせの重複ですが、これは完全一致の場合、重複となるのですか?組み合わせの内、一つでも違っていれば重複とはみなさないのですか?後者だと助かるのですが。。。

  • Aiz-Kis
  • ベストアンサー率80% (4/5)
回答No.2

こんにちは。 ・タイトルや空白行を入れたり、入れなかったりと条件つき。 ・配列を用いるため、データ量が多い場合は不向き。 といった不完全な式ですが、ご参考になればと思い書きこみます。 どのような表なのかわからなかったので、作成してみました。 シート1に表示したいセルがあるとして、 データはシート2にあるものとします。 《シート2》 A~Dの列にデータが入力され、検索したい値はD列とします。 なお、「1行目の列はすべて空欄」とし、2行目には「タイトルを入力」します。    A        B     C     D     E 1                                2 絵画         四季  空間  検索値 3 ターナ-       春   空    22   =Row() 4 ミケランジェロ    夏   海    87 5 ムンク          秋   雲   55 E3のセルに=Row() を入力し、データ分だけ下方向へコピー。 《シート1》 「タイトルを付けずに」、検索条件を1行目からA~C列に入力します。   A     B      C     D 1ムンク    秋     雲      D1のセルに以下の式を入力し、必要な分だけ下方向へコピーします。 =INDEX(Sheet2!$A$1:$D$16,MAX(INDEX((Sheet2!$A$3:$A$16=$A1)*(Sheet2!$E$3:$E$16)*(Sheet2!$B$3:$B$16=$B1)*(Sheet2!$C$3:$C$16=$C1),0,0)),4) これでシート1に入力したA~C列の条件に合致したシート2の検索値が表示され、 合致しなければ「0(ゼロ)」が表示されます。 《不完全な理由について》 上記の式ではすべての条件に合致しない場合の計算結果が「0」になり、 INDEX関数は行又は列が「0」の場合は、行又は列そのものの指定になるため、 どうしてもシート2にはタイトル及び空欄の行が必要になります。 (空欄の行がないと、タイトルが表示されますし、 空欄もタイトルもないと一番上の検索値(22)が表示されます) なお、シート1に空欄の行やタイトルを入れると、 表示されるデータが追加した行数分ずれてしまいます。 このあたりの理由がよく分からず・・・・・・ 少しでも参考になるといいんですけど。

noname#115616
質問者

お礼

ご回答ありがとうございます。 行いたい内容に一番近い内容かと思います。計算式まで作成していただき、非常に参考になります。 早速試してみます。 ただ、実際にはデータ量が非常に多く、cpuも古いpcなので計算に相当時間が係り、重たいものになってしまうと思いますが。。。 本当にありがとうございます。

  • jeee
  • ベストアンサー率52% (119/227)
回答No.1

2つの値を結合したセルを作成し、その値を使用する。 値が数値の場合は、その値を文字列に変換して結合する。 例 =TEXT(A3,"0000000")&B3

noname#115616
質問者

お礼

御回答有難う御座います。早速、試してみます。

関連するQ&A