エクセルマクロで複数条件と部分一致検索の方法

このQ&Aのポイント
  • エクセルのマクロを使用して、複数の条件と部分一致検索を行う方法について教えてください。
  • 具体的な処理の流れは次のとおりです。まず、Sheet2の検索値A1に部分一致する値をSheet1のA列から選びます。次に、選ばれた値とSheet2のB1が完全一致する値をSheet1のB列から選びます。最後に、選ばれた値の行のC列の値を転記します。
  • 部分一致の後の完全一致の複合的なコードの組み方がわからないため、繰り返し処理(ForやLoop)の理解が必要です。Windows XPとOffice 2003を使用しています。
回答を見る
  • ベストアンサー

エクセル マクロ 複数条件と部分一致

1対多数の検索 と 複数条件(部分一致と全部一致)のためコードがよくわかりません。 例えば、xlpart、Match、Index、Offset を使い下記の処理ができる方法はありますでしょうか。 下記A~C列のリストがあります。(10000行程度) (Sheet1)   A       B      C    1 0075926  VU    SerialA  2 0623450  VU     SerialA ・ 3 0002356  WM    SerialA  4 0157592  WM    SerialB ・ 5 0023456  WM    SerialB (・・・以下10000行程度続く) (1) Sheet2の検索値A1に部分一致するものを、Sheet1のA列から選ぶ。 (2) 複数の検索結果値がでてしまうので、さらにSheet2のB1と「全部一致」する ものをSheet1のB列から選ぶ。 (3) 上記(1)、(2)の条件を満たすものをSheet1のA列から1つ選ぶ。さらにその行の C列を転記する。(複数該当する場合は上位記載のものでかまいません。) ※数値はエクセルの書式設定で文字列にしてあります。 (検索前のSheet2)   A       B        C 1 7592    WM 2 2345    VU (以下10000行程度続く) (検索後のSheet2)   A      B         C     D 1 7592    WM    0157592  SerialB      ※7592は、Sheet1のA4に該当する。 2 2345    VU    0623450   SerialA     ※2345は、Sheet1のA2に該当する。 (以下10000行程度続く) 部分一致の後の全部一致の複合的なコードの組み方がわかりません。 繰り返し処理(ForやLoop)をよく理解していないからだと思います。どなたかご教示くださいますでしょうか。大変困っておりよろしくお願いいたします。(WindowsXp、Office2003)

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

>例えば、xlpart、Match、Index、Offset を使い… そういったやり口ではない,簡単な方法で。 #ただし簡単のため「複数ヒットの場合の採用基準」を変更しています #簡単のため,シート1,2ともに「1行目にタイトル行」「2行目から実データ」というレイアウトを仮定します。常識的な作表と判断しています。 サンプル: Sub macro1()  Dim h As Range  Application.ScreenUpdating = False   ’シート2のデータを巡回  For Each h In Worksheets("Sheet2").Range("A2:A" & Worksheets("Sheet2").Range("A65536").End(xlUp).Row)  ’該当データの抽出   Worksheets("Sheet1").Range("A:B").AutoFilter field:=1, Criteria1:="*" & h & "*"   Worksheets("Sheet1").Range("A:B").AutoFilter field:=2, Criteria1:=h.Offset(0, 1)  ’転記   h.Offset(0, 2) = Worksheets("Sheet1").Range("A65536").End(xlUp)   h.Offset(0, 3) = Worksheets("Sheet1").Range("C65536").End(xlUp)  Next  Worksheets("Sheet1").AutoFilterMode = False  Application.ScreenUpdating = True End Sub

iceblue88
質問者

お礼

keithin様はどれくらいのご経験なのでしょうか。どうやったら、このように書けるか勉強方法を教えていただきたいくらいです。こちらは1ヶ月の経験です。すぐ動かすことができました。1行1行理解していきたいと思います。ありがとうございます。

その他の回答 (3)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

順列組み合わせ方式、オートフィルタ方式と出ているようですので、検索方式の一例を書きます。 Sub test01()   Dim i As Long   Dim ws(1 To 2) As Worksheet   Dim fnd As Range   Dim fa As String '以上変数宣言   Set ws(1) = Sheets("Sheet1")   Set ws(2) = Sheets("Sheet2")   Application.ScreenUpdating = False '画面更新停止   For i = 1 To ws(2).Cells(Rows.Count, "A").End(xlUp).Row 'Sheet2検査値の数取得     Set fnd = ws(1).Columns("A:A").Find(What:=ws(2).Cells(i, 1).Value, LookAt:=xlPart) '部分一致検索     If Not fnd Is Nothing Then 'あれば       fa = fnd.Address 'アドレスを控える       Do '繰り返す         Set fnd = ws(1).Columns("A:A").FindNext(fnd)         If fnd.Offset(, 1).Value = ws(2).Cells(i, 2).Value Then '条件が一致すれば           With ws(2).Cells(i, 3) '転記             .Value = fnd.Text             .Offset(, 1) = fnd.Offset(, 2).Text           End With         End If       Loop While Not fnd Is Nothing And fa <> fnd.Address     End If   Next i   Application.ScreenUpdating = True '画面更新停止解除 End Sub

iceblue88
質問者

お礼

merlionXX様へ 前の方のおっしゃるFindを使ってご教示いただきありがとうございます。すぐ動きました。 相当なハイレベルなので、勉強の題材にし、1行1行理解しようと思います。どのようにしたらスラスラかけるようになるのでしょうか~。やはり頭の作りの違いでしょうか(笑) ご教示ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

検索というのはエクセルのSheet1のデータの全行を対象にしないとならないと思います。 便利なような関数なども、裏では全データを対象にしているはず。対象が既にメモリ上データ(関数など)とシート上のデータに違いはあるが。 ですから最終行までのA列全セル繰り返しで良いでしょう。 Sub test01() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") d = sh1.Range("A65536").End(xlUp).Row y = sh2.Range("A1") z = sh2.Range("B1") '-- For i = 2 To d x = sh1.Cells(i, "A") p1 = InStr(x, y) 'yが含まれるか If p1 <> 0 Then p2 = InStr(x, z) 'zが含まれるか If p2 <> 0 Then sh1.Cells(1, "C") = sh1.Cells(i, "A") Exit For '1つ見つかったら打ち切り End If End If Next i End Sub 質問はしっかり書けていると思うが、全般の構想力が弱いため、質問文の表現が長くなりすぎとおもう。 もっと簡単なことでは。 もっと色々上達し、上記に飽き足らなくなったら、Findなどを使えないか考えたら良い。 Findは初心者には難しいと思っている。 B1に全部一致を求めるならB1と等しいと聞く(判別する)か、長さが一致するかを聞けばよいだろう。

iceblue88
質問者

お礼

すぐ教えていただきありがとうございます。試していますが、焦っているのかまだ動きません。もう少し解読してみたいと思います。自分のやり方が悪いのかもしれません。 >p1 = InStr(x, y) 'yが含まれるか のInStrについてわからないので後日調べてみます。 また、鋭いご指摘にも感謝いたします。imogasi様はどれくらいのご経験なのでしょう。ベストアンサーにしたいのですが、ベストアンサーが1つなので困りました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! こんな感じですかね? 複数該当する場合は上位を表示ということですので・・・ Sub test() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") For j = ws2.Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 For i = ws1.Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 If ws1.Cells(i, 1) Like "*" & ws2.Cells(j, 1) & "*" And ws1.Cells(i, 2) = ws2.Cells(j, 2) Then With ws2.Cells(j, 3) .Value = ws1.Cells(i, 1) .Offset(, 1) = ws1.Cells(i, 3) End With End If Next i Next j End Sub For~Next を使っていますので時間がかかるかもしれません。 他によい方法があればごめんなさいね。m(__)m

iceblue88
質問者

お礼

すぐ教えていただきありがとうございます。試していますが、焦っているのかまだ動きません。もう少し解読してみたいと思います。自分のやり方が悪いのかもしれません。勉強して別の立場で、このように教えれるレベルになりたいと思います。tom04様はどれくらいのご経験なのでしょう。ベストアンサーにしたいのですが、ベストアンサーが1つなので困りました。

関連するQ&A

  • エクセル 複数の条件に一致

    複数の条件に一致したセルの内容によって、別のセルに別の文字を自動で表示したいのですが可能でしょうか? 詳細はこのような形で、 【シート1】       A     B       C 1      0001     3/1    有 2      0002     3/1    無 3      0001     3/2    不明 【シート2】       A     B       C 1             3/1      3/2 2      0001       ○      △ 3      0002       ×     "空欄" ・シート2のB2からC3を自動で表示できるようにしたい。 ・シート1のA列とシート2のA列が一致、更にシート1のB列とシート2の1行が一致。 ・シート1のC列が「有」の場合「○」、「無」の場合「×」、「不明」の場合、「△」、「空欄」の場合、「"空欄"」と表示。 知りうる限りの関数を合わせてみましたが、できませんでした。 どなたかいい方法を教えて頂ければと思います。 環境はXPpro、エクセル2000です。 宜しくお願いします。

  • エクセルでセルの条件が一致したら、値を挿入したい

    エクセルで2つのシートの2つのセルの条件が一致したら、シート2の該当の部分をシート1に挿入したいのです。 例 Sheet1 A    B    C 1 社員A 100 2 社員B 200   3  社員A 500 Sheet2 A    B    C 1 社員B 100  休み 2 社員B 700  勤務 3  社員A 100  夜勤   というような2つなシートがあり(実際には、セルの行数は3000行くらいあります) Sheet1,Sheet2の比較をしてA列、B列の値が一緒である場合、シート1にシート2の該当部分を C列に挿入したいのです。 たとえば、シート1のC列に数式をいれることになるかと思うのですが、 シート1とシート2を比較すると、   シート1のA1・B1の【社員A 100】とシート2のA3・B3の【社員A 100】が一致しているので、シート2のC3の【夜勤】をシート1のC列のC1(該当する同じ行に挿入)に挿入したいのです。 どういった式をいれたらいいかわからないので、どなたかおしえていただけたら助かります。 よろしくお願い致します。 知恵をお貸し下さい。 非常にこまっております

  • Excel マクロで同じワークシート内で複数の条件が一致するものを

    Excel マクロで同じワークシート内で複数の条件が一致するものを 抽出する方法がありますか。具体的にはワークシート構成は|31日| 30日|29日|・・・|2日|1日|7月集計|品目別集計|となっています。 例として11日シートのC29にバナナ(品目)、E29に国産(規格)、F29 に20(数量)とあった場合に搬入品目別集計シートの同じ行にあるB 列(品目)、E列(規格)の一致するものを検索して該当する行より下 の最初のA列の空白に平成22年7月11日(搬入日)、同じく最初のB列 の空白(搬入日と同じ行になる)には20(数量)を出力する。12日シー トにC29バナナ、E29国産、F29に16とあれば搬入品目別集計シート に出力(平成22年7月11日の下にくるように)するという具合にする ことは可能でしょうか。品目もバナナ・メロンなど複数あり、規格 も国産・台湾産などと複数あるので11日シート(12日シートも同じ) のC29~C58、E29~E58の中で同じ行にあるものを品目別集計シー トのB列(品目)F列(規格)の同じ行にあるものを検索して出力させる。 うまく表現できませんが11日シートなどに日毎に搬入したものを入 力したときに、搬入品目別シート(先に必要な分の品目・規格を入力 した表を先に作成してある)のなかを検索して一致するものを品目毎 ・搬入日順に搬入数量を出力させる作業を手作業ではなく自動的に行 いたいのですが可能でしょうか。長文になりましたが初心者なので 具体的に教えていただきたいのですがどなたか宜しくお願い致します。

  • EXCELで2つ条件で1つが部分一致のとき

    Excelの2003バージョンです。 現在使用しているファイル名「会社」シート名「支社」のセルE12に 同じシート上のD12(同じ行ですね)と ファイル名「埼玉」シート名「データ」のA列の中の値と一致(完全一致)して なおかつ、シート名「支社」のF3の値(例・後1、後2)とシート名「データ」の C列の値(例・後1 第23号)と部分一致をした時に 使用中シート「支社」のE12に●、していない時は空白にしたいのです。 ファイル「会社」シート名「支社」 行数 --A列----B列----C列-----D列----E列----F列---- 1                             11223344  (ここに関数)  後1 ファイル「埼玉」シート名「データ」 行数 --A列----B列----C列-----D列----E列----F列---- 10   11223344         後1 第23号  11   11223344         一般会社 第44号  のような場合はE1に●になるようにしたいのです。 それ以外は空白で。 あまり詳しくないので、よろしくお願いします。

  • excel マクロで複数シート検索し行をコピー

    excel2010 マクロで下記のようなことをしたいのですが どのようにしたら良いか教えていただけないでしょうか? (1)sheet1のA1を検索用の欄とする (2)sheet2・sheet3・sheet4にはそれぞれデータを入力しておく (A列~H列 まで使用し、行数は多くても500程度) (3)sheet1のA1に検索したい単語を入力することで、sheet2・sheet3・sheet4全てのA列を検索する (4)一致(部分一致)したら、その行をsheet1の10行目以降にコピーする なお複数ヒットすると思われるため、複数ヒットした場合には行を追加しながらコピーしたいです。 マクロでは無理なのでしょうか? どのように書いたらよいか、参考になるHPでも助かりますので、教えていただきたく よろしくお願いします。

  • エクセル複数条件一致の数式

    質問失礼します。 下記のエクセルデータから、E列のセルに、条件にあわせて5か6、もしくは空白を表示させる数式を作りたいと考えています。 条件として セルE2に5を表示さる場合 D2がa4の時、A列から、同じa4を検索し、この場合は、行10と行11が該当します。 その該当する行から、 セルD2の文字列a4がある行のA列のセル、この場合は、セルA2のa1 と文字列が一致するセルB11の11行目が選択され、その行にあるC列の数字を、E2セルに表示させたいです。 E列に入れる数式は作ることが可能でしょうか? 色々試してみましたが、どうしてもうまくできませんでした。 よろしくお願いします。   A  B  C   D    E 1        2 a1  a2   5    a4   5 3 a1  a3       a3   6 4 a1  a1       5 a2  a3   5    a1   5 6 a2  a1       7 a3  a1   6    a2   5 8 a3  a1       a4   6 9 a3  a4   5    a2   5 10 a4  a3   6    a3   5 11 a4  a1   5    a2

  • エクセル マクロ:部分一致検索

    教えてください。 sheet1のA列に時間データがあります。A列は書式設定でhh:mm:ss.00にしています。 sheet2のA1に時間を表示しており書式設定でhh:mm:ssにしています。 sheet2のA1と部分一致する時間を、sheet1のA列から検索するマクロを作成しています。 (複数ある場合は初めに該当するセルの行を表示) sheet2に下記のコードを入力しており、実行すると「オブジェクト変数またはwithブロック変数がされていません」と表示され困っています。 ご教授のほどよろしくお願い致します。 Sub 検索() Dim Jikan As Date Dim Row1 As Integer Jikan = Sheets("sheet2").Cells(1, 1).Value Row1 = Sheets("sheet1").Range("A:A"). _ Find(What:=Jikan, LookAt:=xlPart).Row MsgBox Row1 End Sub

  • 一致するデータを複数シートから別のシートへ移動

    Sheet1~Sheet3を用いて、 Sheet1とSheet2でそれぞれのC列の項目が一致するデータを抽出し、 該当するデータの Sheet1B列⇒Sheet3D1 Sheet2A列⇒Sheet3A1 Sheet2B列⇒Sheet3B1 Sheet2C列⇒Sheet3C1 に移動するためのマクロを組みたいと思っています。 Sheet2からSheet1に検索をかけて、 Sheet2C列≠Sheet1C列であればSheet2のA1行を削除していき Sheet2C列=Sheet1C列であれば Sheet2A~C列をSheet3A~C列へ移動するところまでは出来ました。 ※なお、Sheet3のA1行に文字列があればセルを1行追加する設定にしています。 しかし、それはA1行の文字列をそのままコピペしているだけなので Sheet1B列の一致データをSheet3D1へ移動するやり方が思い浮かびません…。 Sheet2と同じくA1行を削除していこうとしてもうまくいきませんでした。 どんどんマクロも指示文ばかりが増えてわけが分からなくなってきてしまい、挫折しています。 シンプルにするにはどうすればいいでしょうか? また、マクロの内容を載せたいのですが 会社の業務端末で組んでいるため転記できません; 申し訳ありませんが、どうかご指導ください。

  • マクロ 複数キーと一致する行を条件選択、フラグ入れ

    ご質問です。 複数キー中1つ以上のキーが部分一致する行(複数列で構成)を選択し、フラグを入れたいです。 下記の例で言いますと、Sheet1の1行に、Sheet2の列中の1つ以上が部分一致する場合、1と記入したいと思います。 (Sheet1)  A     B      C      D       E           B          C 1)                     (条件1チェック) (条件2チェック)(条件3チェック) 2) 犬あ  猿い   う鳥   え魚       1         1 3) 豚い  熊え   ね兎   蛇ら                            1 4) 猫た  龍さ   魚み   羊り       1                     1 ・・・・500件続くアンケートです。 (Sheet2)  A       B       C   1) (条件1)  (条件2) (条件3) 2) 犬     猿     豚 3) 猫     馬     羊 4) 狐     牛     熊 FindとLoopで作ってみましたが、上記で言うところのSheet1の先頭行しか検索してくれませんでした。どなたか、FindとLoop(またはFor)で教えてくださいますでしょうか。 ↓できなかった私の作成物 With WS(2).Range("a2:c5") Set c = .Find(What:=myKey, LookIn:=xlValues, LookAt:=xlPart, _ SearchOrder:=xlByColumns, MatchByte:=False) If Not c Is Nothing Then fAddress = c.Address Do WS(2).Cells(m,1).vakue=1 Set c = .FindNext(c) If c.Address = fAddress Then Exit Do Loop 3日悩んで、大変困っております。よろしくお願いします。(OS:WindosXP、Office2003)

  • エクセルのマクロで指定条件一致行をグループ化したい

    エクセル2007を使用しています。 次の様なシートで、特定列で条件(ブランク)に一致する行を一括して グループ化するコードを教えてください。      A       B      C       D 1    コード  科目      実績   予算 2   5000  販売収入    100    90 3   5001  受取手数料    4   5002  その他収入 5      【売上高】 100    90 この様な会計の管理帳票で、1シート約800行あり、シートが部門毎に 全部で約100シートが一つのブックに収めてあります。 全部のシートに対して、例えばC列がブランクの行を一括してグループ化 させる様なマクロのコードを教えていただきたいと思います。 (この場合だと3~4行目) 他の部門では使わない補助科目が多く、折りたたまないと使い物に ならないため、現在は手作業で行っております。 どうぞよろしくお願い致します。 

専門家に質問してみよう