求めている仕様に合ったコードを探すことは出来ましたが、重すぎて処理が終わりません。
(5分放置して40行ほどしか出力されません)
おそらくFor文ではなくFindや配列を組めばいいと思うのですが、締め切りが近いので自分でも考えながらこちらでも質問させてください。
1シート目に検索値、2シート目にデータ、3シート目に検索結果を置いています。
検索値シートのA列がデータシートのA列と一致した場合に、一致したデータシートの行を検索結果シートに出力するイメージです。
検索値、データシートのA列は重複してます。
(ともに変動するため、AAAという値がどちらのシートにも複数ある可能性があります)
検索値だけでも重複を削除するマクロを噛ませた方が良いのかもしれません。
以下検索したコードです。
VBA
1 2Sub search() 3 4 '対象とするシートの宣言 5 6 '検索値があるシート 7 Dim targetSheet As Worksheet 8 '対象データがあるシート 9 Dim seathSheet As Worksheet 10 '検索結果を出力するシート 11 Dim outputSheet As Worksheet 12 13 Set targetSheet = Worksheets("検索値") 14 Set seathSheet = Worksheets("データ") 15 Set outputSheet = Worksheets("検索結果") 16 17 '比較値の最終行取得 18 Dim row As Long 19 row = targetSheet.Cells(targetSheet.Rows.Count, 1).End(xlUp).row 20 '出力行数 21 Dim cnt As Long: cnt = 2 22 23 For i = 2 To row 24 '検索結果のセル 25 Dim foundCell As Range 26 '検索値のセル 27 Dim searthCell As Range 28 29 Set searthCell = targetSheet.Cells(i, 1) 30 '検索値が空白ならスキップ 31 If Not searthCell = "" Then 32 '検索結果取得 33 Set foundCell = seathSheet.Cells.Find(searthCell, LookAt:=xlWhole, SearchOrDer:=xlByColumns) 34 35 '検索結果が得られなかった場合スキップ 36 If Not foundCell Is Nothing Then 37 Set FirstCell = foundCell 38 39 Do 40 '比較値に一致した一覧の行をコピー 41 seathSheet.Rows(foundCell.row).Copy 42 '結果シートに張り付け 43 outputSheet.Rows(cnt).PasteSpecial (xlPasteValues) 44 '結果シートへ張り付ける行を変更するためプラス1 45 cnt = cnt + 1 46 '次を検索 47 Set foundCell = seathSheet.Cells.FindNext(foundCell) 48 49 '次の検索が最初と同じor存在しなかった場合次の検索値へ 50 If foundCell.Address = FirstCell.Address Then 51 Exit Do 52 ElseIf foundCell Is Nothing Then 53 Exit Do 54 End If 55 Loop 56 57 End If 58 End If 59 Next 60 61End Sub 62