• ベストアンサー

エクセルVBAで複数の条件を満たす検索方法

エクセルのVBAを使ってデータ検索を行うプログラムを作っています "Sheet2"は下記のように、A列に生年月日、B列に住所、C列に電話番号、D列にメールアドレスが入力されています        【Sheet2】   生年月日  住所    電話番号  メールアドレス     A      B       C        D 1 1999/9/10 東京都○○ 11-111-1111 aa@goo.co.jp 2 2003/2/26 大阪府○○ 22-222-2222 bb@goo.co.jp 3 1985/6/22 福岡県○○ 33-333-3333 cc@goo.co.jp 4 1995/4/11 愛知県○○ 44-444-4444 dd@goo.co.jp "Sheet1"のA1に生年月日、A2に住所、A3に電話番号を入力し、"Sheet2"のデータと照合して、3つの値が合致した行のD列のメールアドレスを"Sheet1"のB1に返したいと思います 上記の表だと、"Sheet1"のA1に1985/6/22、A2に福岡県○○、A3に33-333-3333と入力されている場合、B1にcc@goo.co.jpの値を返すようにしたいのです。 findを使って生年月日、住所、電話番号を検索し、行番号を取得して、3つの行番号が同じならその行番号のD列の値を返すというような方法で考えていたのですが、エラーが回避できずに困っています。 生年月日が同じ人がいたり、夫婦や親子などは住所と電話番号が同じといった場合があり、上手く検索できません。  エラー回避の方法、もしくは他のやり方でも構いませんので どなたかご教授願えないでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

ANo.2です。 すみません。ミスがありました。 Sub test() Dim sh1 As Object, sh2 As Object Dim d1 As String, d2 As String, r As Long Set sh1 = Sheets("Sheet1") Set sh2 = Sheets("Sheet2") r = 1 d1 = sh1.Cells(1, 1) & sh1.Cells(2, 1) & sh1.Cells(3, 1) d2 = sh2.Cells(r, 1) & sh2.Cells(r, 2) & sh2.Cells(r, 3) Do While d2 <> "" If d1 = d2 Then sh1.Cells(1, 2) = sh2.Cells(r, 4) Exit Do End If r = r + 1 d2 = sh2.Cells(r, 1) & sh2.Cells(r, 2) & sh2.Cells(r, 3) Loop End Sub

pattern706
質問者

お礼

お礼が遅れて申し訳ありませんでした。 無事にプログラム作成できました 本当に助かりました ありがとうございました

その他の回答 (5)

回答No.6

なんどもすみません。 d1 = Sheets("Sheet1").Cells(1, 1).value d2 = Sheets("Sheet1").Cells(2, 1).value d3 = Sheets("Sheet1").Cells(3, 1).value 上のところが間違いですので、差し替えて

pattern706
質問者

お礼

お礼が遅れて申し訳ありませんでした。 他の回答者の方の方法でプログラムを作成しましたが こちらの方法も試してみます ありがとうございました

回答No.5

#4の回答者です。 下記のロジックのが早く検索できます。 Dim a As Range Dim b As Range Dim c As Range Dim ar As Long Dim br As Long Dim cr As Long Dim d1 As string Dim d2 As string Dim d3 As string l = 1 d1 = Sheets("Sheet1").Cells(1, 1).value d2 = Sheets("Sheet1").Cells(1, 1).value d3 = Sheets("Sheet1").Cells(1, 1).value l = 1 Do Set a = Sheets("Sheet2").Range("A" & l & ":A1000").Find(d1, , , xlWhole) Set b = Sheets("Sheet2").Range("B" & l & ":A1000").Find(d2, , , xlWhole) Set c = Sheets("Sheet2").Range("C" & l & ":A1000").Find(d3, , , xlWhole) If a Is Nothing = True And b Is Nothing = True And c Is Nothing Then Exit Do (みつからない) If a Is Nothing = False Then ar = a.Row Else ar = 1000 If b Is Nothing = False Then br = b.Row Else br = 1000 If c Is Nothing = False Then cr = c.Row Else cr = 1000 If ar = br And ar = cr Then Exit Do <======= 3列の行同じ(ここでみつかっている) If l < ar Then l = ar     ここを変えた。 If l < br Then l = br If l < cr Then l = cr Loop

回答No.4

Sheets("Sheet1").Cells(,) では、スピードがめちゃ遅いので、多いデータだと 全くつかいものになりません。 やはり、FINDでするべきです。 Dim a As Range Dim b As Range Dim c As Range Dim ar As Long Dim br As Long Dim cr As Long Dim d1 As string Dim d2 As string Dim d3 As string l = 1 d1 = Sheets("Sheet1").Cells(1, 1).value d2 = Sheets("Sheet1").Cells(1, 1).value d3 = Sheets("Sheet1").Cells(1, 1).value l = 1 Do Set a = Sheets("Sheet2").Range("A" & l & ":A1000").Find(d1, , , xlWhole) Set b = Sheets("Sheet2").Range("B" & l & ":A1000").Find(d2, , , xlWhole) Set c = Sheets("Sheet2").Range("C" & l & ":A1000").Find(d3, , , xlWhole) l = 65000 If a Is Nothing = True And b Is Nothing = True And c Is Nothing Then Exit Do (みつからない) If a Is Nothing = False Then ar = a.Row Else ar = l If b Is Nothing = False Then br = b.Row Else br = l If c Is Nothing = False Then cr = c.Row Else cr = l If ar = br And ar = cr Then Exit Do <======= 3列の行同じ(ここでみつかっている) If l > ar Then e = ar If l > br Then e = br If l > cr Then e = cr Loop 上のでほぼいくのでは?。デバッグはしていないが。そちらでデバッグして下さい。 注意点は下記の通りです。 1行目は空けて、2行目からデータが入っているとのこと。 また。 l = 1 は開始の行ですが、ここは1でよい。 Set a = Sheets("Sheet2").Range("A" & l & ":A1000").Find(d1, , , xlWhole)   Range("A" & l & ":A1000") で指定する最終行は、最終行の値+1になっています。  すなわち、上のソースでは、2行目から999行目までデータがあるとのことになります。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

Sub test() Dim sh1 As Object, sh2 As Object Dim d1 As String, d2 As String, r As Long Set sh1 = Sheets("Sheet1") Set sh2 = Sheets("Sheet2") d1 = sh1.Cells(1, 1) & sh1.Cells(2, 1) & sh1.Cells(3, 1) r = 1 Do While d1 <> "" d2 = sh2.Cells(r, 1) & sh2.Cells(r, 2) & sh2.Cells(r, 3) If d1 = d2 Then sh1.Cells(1, 2) = sh2.Cells(r, 4) Exit Do End If r = r + 1 Loop End Sub

  • keirika
  • ベストアンサー率42% (279/658)
回答No.1

Sub Sample() Dim Data As Range Dim i As Long Set Data = Sheets("Sheet2").Range("a1").CurrentRegion With Sheets("Sheet1") For i = 1 To Data.Rows.Count If .Range("a1") = Data.Cells(i, 1) And _ .Range("a2") = Data.Cells(i, 2) And _ .Range("a3") = Data.Cells(i, 3) Then .Range("b1") = Data.Cells(i, 4) Exit For End If Next i End With End Sub でどうでしょう。

pattern706
質問者

お礼

お礼が遅れて申し訳ありませんでした。 大変参考になりました ありがとうございました

関連するQ&A

  • エクセルで複数シートから、検索して抽出

    はじめまして、右も左も分からない初心者です。 説明出来ないんですが、よろしくお願いします。 【ご質問内容】 エクセルは、XPを使用しています。 エクセルのVBAで、指定したキーワードを 含むデータを抽出したいと思っています。 【例】 Sheet1 A B C D E 1 番号 氏名  郵便番号  住所  メールアドレス 2 1   ○   △    大阪府   ○○ 3 2   △   ○    茨城県   ○○ Sheet2  A  B    C     D      E 1 氏名 番号 郵便番号  住所  メールアドレス 2 ○  1   △    福岡県   ○○ 3 △  3   ○    茨城県   ○○ と各シートに、列がそれぞれバラバラになっています。 茨城県を検索すると、新しいシートに、 Sheet3  A  B    C     D      E 1 氏名 番号 郵便番号  住所  メールアドレス 2 2   △   ○    茨城県   ○○ 3  A  B    C     D      E 4 氏名 番号 郵便番号  住所  メールアドレス 5 △  3   ○    茨城県   ○○ という風に、抽出したいと思っています。 どうしたらいいでしょうか?? よろしくお願いします。

  • EXCEL VBAで複数のシートの中から該当値を検索する方法について

    すいません、EXCEL VBAで複数のシートの中から該当する値を検索する方法について教えていただきたいことがあります。      Sheet1              A列   B列  C列   1行  11  りんご  31  2行  12  バナナ  32  3行  13  みかん  33  4行  14  ぶどう  34   ・   ・   ・     ・        Sheet2              A列   B列  C列   1行  31  すいか  11  2行  32  レモン  12  3行  33  パイン  13  4行  34  ざくろ  14   ・   ・   ・     ・ というデータが入っているブックについて 「全部のシートを検索し、A列に11の値が入っているセルの行数及びその行のB列の値」 をSheet1のD1セルとE1セルにそれぞれ返す方法はどうしたらよろしいんでしょうか。 For Each を使うのではないかと思って色々やってみたのですが、どうも上手く作動してくれません。 よろしくお願いいたします。

  • VBA 条件検索について

    VBAの検索について質問です。 以下のようなものを作ろうと思います。 sheet1とsheet2がありsheet1のA、Bの数値をsheet2の同じA,Bの数値の値の行を検索して, その同じ値の行のsheet1のCの数値の値からsheet2のCの数値を引いた値をsheet3のC列に返すプログラムを作ろうと思います。空白などで同じ値がない場合はsheet3に空欄を返そうと思います。 以下に例をプログラムの実行例を示します。 sheet1 ■ A 列 B 列 C列 1: 7 | 1 | 3 2: 5 | 8 | 2 3: 2 | 3 | 1 4: 9 | 6 | 4 sheet2 ■ A 列 B列 C列 1: 2 | 3 | 4 2: 9 | 6 | 2 3: 7 | 1 | 5 4: 5|   | 3 sheet3 ■ A列 B列 C列 1: 7| 1 | -2 2: 3: 2| 3 | -3 4: 9 | 6 | 2 自分で以下のプログラムを作成してみたのですが空欄が検索できなかったりしてなかなかできません。 どなたか、教えてください。お願いします。 Sub test() Dim sh1 As Object, sh2 As Object, sh3 As Object Dim d1 As String, d2 As String, a As Long Set sh1 =Sheets(“Sheet1”) Set sh2 =Sheets(“Sheet2”) Set sh3 =Sheets(“Sheet3”) For a = 1 To 3000 Step 1 d1 = sh1.Cells(a,1) & sh1.Cells(a,2) d2 = sh2.Cells(a,1) & sh2.Cells(a,2) Do while d2 <>”” If d1 = d2 Then Sh3.Cells(a,1) = sh1.Cells(a,1) Sh3.Cells(a,2) = sh1.Cells(a,2) Sh3.Cells(a,3) = sh1.Cells(a,3) Exit Do End If a= a+1 d2 = sh2.Cells(a,1) & sh2.Cells(a,2) Loop Next End Sub

  • Excelの検索について

    シート1に、 A列 B列 C列 …G列 氏名 番号 年月日1 …年月日2 が入力されています。 B列[番号]が"3"のときのみ、それと同じ行のA列[氏名]、C列[年月日1]、G列[年月日2]をシート2に、上から詰めて返す方法を教えてください。 難しく考えずに、VLOOKでいけるのでしょうか。

  • Excel vba 条件検索?について

    できるのかどうかわからないのですが Sheet1 にIPアドレスの一覧があり Sheet2 にA列に192.10.2.* B列にhonsya と書いた一覧があるとして (例に挙げてるIPは適当です・・・。) Sheet1のIPアドレスの第3オクテッド目までの値とSheet2のA列の第3オクテッド目までの値を比べてSheet2の値に該当したものB列の値を出力するその際に 出力データの前後に文字を足して出力。 Sheet1にあるデータ分を行い データは出力したデータの下に 出力していく といった形をとりたいのですが 本当にできるのでしょうか?

  • エクセルVBA 検索機能を利用したデータ抽出方法

    ■主な目的 顧客の住所データベースのうち 市町村の合併等により変更されたものを 抽出します。 自分で考えたのですが行き詰りました。 誰か助けてください。 ■エクセルファイルのシート構成と処理方法 シートは3枚あります。 (1)sheet1 旧住所一覧 A列に旧住所の一覧が約60行にわたって記載されいてます。 西白河郡表郷村 大野郡和泉村 神崎郡神崎町 ・ ・ (2)sheet2 顧客データベース A列に顧客コード、B列に顧客名、C列に郵便番号、D列に顧客住所が約7000行にわたって記載されています。 (3)sheet3 抽出用シート sheet1のA1の値をsheet2のD列を対象として検索をかけ、該当した行(A~D列)をそのままsheet3にコピーし、あとはそれを繰り返します。 私のやり方は cells(行、列)、ForNext、seach関数等を組み合わせてやろうとしましたが、serch関数のセル位置取得がRange("行列")形式になり、それをどうやったらsheet3に行をA~Dまで丸ごとコピーできるのかわからず降参しました。 よろしくおねがいします。

  • Excel VBAを使って会員検索

    Sheet1のA列に会員番号、B列に氏名、C列にフリガナ、D列に住所といったデータがあります。 Sheet2のA列に会員番号のみがあります。 この2つのデータを照合して、一致した場合のみ、Sheet1の該当会員データの横のセルに“一致”もしくは“1”などの値(上の例だとSheet1のE列に)を入力できるようなVBAを組みたいのですが、教えていただけますでしょうか?

  • excelで複数条件での検索方法

    列1  列2  列3  列4  列5  列6  列7  列8   列9   列10  列11   列12 1    0    1    0    1   1   1  名前   住所   電話  名前2  名前3 1    1    0    1    1   0   1  名前   住所   電話  名前2  名前3 1    1    1    1    0   1   0  名前   住所   電話  名前2  名前3 のような表があります。(名前2、名前3は全てに入っているわけではありません) 列1が”1”で、列2が”1”で列3が”0”の条件の時、別のシートに、 1行目の名前、住所、電話 1行目の名前2、住所、電話 1行目の名前3、住所、電話というように表示したいのです。(名前2、名前3が無い時は次の条件にあったデータを表示したい。 1行目の名前、住所、電話 1行目の名前2、住所、電話 2行目の名前、住所、電話 3行目の名前、住所、電話 3行目の名前2、住所、電話といった感じです。 マクロのCASE文で振り分けて、・・・・といろいろ試しましたがうまくいきません。 よろしくご教授願います。

  • Excel VBAにおける複数条件での検索方法

    以下のように、Excelシートがあって このExcelシートで以下の条件で検索、その結果を返すVBAを作りたいのですが、悩んでいます。   検索条件 果物:りんご        産地:青森         複数ある時は、購入日が一番古いものを選ぶ。        更に複数ある時は、値段の安いものを選ぶ。    ⇒行番号を返す   これで、1つの行が選択できたら、そのF列に「在庫なし」を挿入する。    A列    B列  C列  D列  E列  F列 1行 購入日   果物  産地  数量 値段  在庫 2行 2017/4/10 りんご  青森  2   110 3行 2017/4/10 みかん  愛媛  3   350 4行 2017/4/10 りんご  青森  1   100 5行 2017/4/10 りんご  長野  2   120 6行 2017/4/12 みかん  静岡  3   350 7行 2017/4/13 みかん  愛媛  2   240 8行 2017/4/14 りんご  長野  2   120 9行 2017/4/15 りんご  青森  1   100 結果としては、上から4行目のリンゴのF列に「在庫なし」が 入るようにしたいです。 すみません、いろろと調べてはいるのですが、ちょっとわからず、こちらに投稿しました。どなたか、わかる方教えていただければ幸いです。 よろしくお願いします。

  • エクセル 別れたシートでの条件検索

    別れたシートでの検索で一致したものを探す関数について。 VLOOKUP関数だと列に対してだと思うのですが、行に対して検索したいです。うまく伝えられないので、例えば 【シート1】    A   B   C   1  555 2  666 3  777 4  222 【シート2】    A   B   C   D 1  777    555    222 2 3 上のようなシートがあり、 シート1のA列の番号がシート2の1の行に有ったら、 シート1のB列にOKと表示、無かったらNGと表示、 の様な関数ってありますか? どなたか解る方お願いします。

専門家に質問してみよう