• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロ 複数キーと一致する行を条件選択、フラグ入れ)

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

このQ&Aのポイント
  • マクロを使用して、複数のキーと一致する行を条件選択し、フラグを入れたいです。
  • 具体的には、Sheet1の1行に、Sheet2の列の中で1つ以上が部分一致する場合に、フラグを1として記入したいです。
  • FindとLoopを使用して作成しましたが、Sheet1の先頭行しか検索してくれませんでした。どのように改善すればよいでしょうか。

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

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

こんなカンジですかね。 sub macro1()  dim h as range  dim c as range  dim s as string  worksheets("Sheet1").range("E:G").clearcontents ’シート1の中に…  with worksheets("Sheet1").range("A:D") ’条件を一つずつ調査する  for each h in worksheets("Sheet2").range("A2:C5")   if h <> "" then    set c = .find(what:=h, lookin:=xlvalues, lookat:=xlpart)    if not c is nothing then     s = c.address     do     ’あればフラグを立てる      worksheets("Sheet1").cells(c.row, 4 + h.column) = 1      set c = .findnext(c)     loop until c.address = s    end if   end if  next  end with end sub #ちなみに E2に =IF(OR((Sheet2!A$1:A$5<>"")*ISNUMBER(FIND(Sheet2!A$1:A$5&"",$A2:$D2))),1,"") と記入してコントロールキーとシフトキーを押しながらEnterで入力し,右にコピー,下にコピー。

iceblue88
質問者

お礼

>worksheets("Sheet1").cells(c.row, 4 + h.column) = 1 の発想がなかったので出来なかったとわかりました。また、処理コメントも書いていただいてよくわかりました。すぐのお返事ありがとうございます。大変助かりました。

その他の回答 (3)

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

>Sheet1の先頭行しか検索してくれませんでした Findメソッドだけでなく、FINDNEXT[が必要なだけでは。 Googleで「エクセル VBA 検索」で照会してコードをさがして、真似したら。 初心者にはFind、Findねxtは使うのが難しいと思う。 しかし、まあそれは本件で使っているのですね。 ーー 質問にロジックの説明が無く、ありふれたケースではないので、判るのに時間がかかる。 実例だけでなく、しっかり文章でも説明のこと。 ーー ロジックは、検索対象としては行単位で考えるらしい。本件ではその範囲はSheet1の各行1-3列 検索語としては第1回目が、条件1がSheet2の犬。次いで猫の検索をまわさないとならないようだが、質問のコードではそれが見えないが。 犬と猫の検索をVBAで1度でやる方法は無いと思う。IF分ならORを使って、やれそうだがSheet2のA列のように多いとそれも使えない。 だからこれらのループをFor Nextの総なめ法でテスト的にコードを作り、結果が正しくなったら、それからFind法に置き換えたら。 Sheet1の「ある1行」の列の判別ループ Sheet2の条件の各列の各行のループ 条件が条件1、条件2・・と複数あるループ。 を見据える。 ーー ).vakue=1 はValue でしょう。

iceblue88
質問者

お礼

ロジックを私の代わりにご説明していただきありがとうございます。(詳しく書くよう心がけます。)一時的なテキストを生成して検索している他の方のやり方を理解するのに役立ちました。感謝いたします。誤記(vakueではなくvalueです)も訂正いたします。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

こんな方法も…… Sub sample() Dim i, j, k Dim sTraget As String Dim sTraget2 As String Dim sWord As String With Worksheets("Sheet1")   For i = 2 To .Range("A2").End(xlDown).Row     sTarget = .Cells(i, 1) & .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 4) 'A~D列の文字列を結合     For j = 1 To 3 '条件       sTarget2 = sTarget       For k = 1 To 3         sWord = Worksheets("Sheet2").Cells(k + 1, j).Text         '条件と一致する文字列を削除         sTarget2 = Replace(sTarget2, sWord, "")       Next k       'もとの結合文字列より短ければ一致あり       If Len(sTarget) > Len(sTarget2) Then .Cells(i, j + 4) = 1     Next j   Next i End With End Sub

iceblue88
質問者

お礼

>sTarget = .Cells(i, 1) & .Cells(i, 2) & .Cells(i, 3) & .Cells(i, 4) 'A~D列の文字列を結合         >'条件と一致する文字列を削除 >sTarget2 = Replace(sTarget2, sWord, "") と私の中では新境地のコードです。今後のコード学習につながるので助かります。コードもきちんと動きました。ありがとうございます。

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

もう検索での回答が出ていますので配列に入れて比較する方法の一例です。 Sub test01()   Dim myW, myX, myY   Dim i As Long, j As Long, l As Long, n As Long   Dim ws(1 To 2) As Worksheet   Set ws(1) = Sheets("Sheet1")   Set ws(2) = Sheets("Sheet2")   With ws(1)    myW = .Range(.Range("A2:D2"), .Range("A2:D2").End(xlDown)).Value   End With   With ws(2)    myX = .Range(.Range("A2:C2"), .Range("A2:C2").End(xlDown)).Value   End With   ReDim myY(1 To UBound(myW, 1), 1 To 3)   For i = 1 To 4     For j = 1 To UBound(myW, 1)       For l = 1 To 3         For n = 1 To UBound(myX, 1)           If InStr(myW(j, i), myX(n, l)) > 0 Then             myY(j, l) = 1             Exit For           End If         Next n       Next l     Next j   Next i   ws(1).Range("E2").Resize(UBound(myW, 1), 3).Value = myY End Sub

iceblue88
質問者

お礼

>ReDim myY(1 To UBound(myW, 1), 1 To 3) >If InStr(myW(j, i), myX(n, l)) > 0 Then という私には初めてのやり方なので勉強になります。コードもすぐ動いて助かりました。学習素材に最適なご回答ありがとうございます。