- ベストアンサー
Excel VBAで検索する方法と解決法
- Excel VBAを使用してSheet1に貼り付けたテキスト内から指定のキーワードを検索し、Sheet3に一致する行を貼り付ける処理がうまくいかない問題について解決法を紹介します。
- 問題の原因は、ソースコードの一部に誤りがあるためです。mojiとwordの定義とInStr関数の使用方法に修正が必要です。
- mojiとwordの定義は、Worksheets関数の引数に間違ったセルの位置を指定しているため、正しい位置を指定する必要があります。InStr関数の使用方法も間違っており、キーワードが見つかった場合に正しく処理されないため、修正が必要です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
例えば、j=10 のときキーが含まれていた場合 (1)Exit For なし 必要ないのに、残りの行(J=11~21)まで繰り返してしまう (2)Exit For あり 残りの行(j=11~12)をジャンプしFor~Nextを抜ける 要するにチェックの必要ない行をジャンプさせてるわけです。 今回のようにデータ数が少ない場合はExit FOrはなくてもいいのですが、、 For j=1 to 30000 のように30000セルまでチェックするとした場合 J=10 でキーが含まれていたら、そこでFor Nextを抜けないと 残り11~30000行までの29990回無駄な繰り返すことになりますよね。 これで説明になってますか? 以上ここまで。
その他の回答 (1)
- myRange
- ベストアンサー率71% (339/472)
普通このような検索がらみのコードでは、質問者のコードのようにはしませんが 折角ここまで作成してあるので今回は質問者のコードを修正することにします。 提示のコードから推測すると Sheet1:データは、A3~A103 Sheet2:キーは、B2~B21 Sheet3:A1から転記 となってますが宜しいですね。 '------------------------------------ Sub Test() Dim moji As String Dim word As String Dim result As Integer Dim i As Integer Dim j As Integer Dim k As Integer For i = 3 To 103 moji = Worksheets("Sheet1").Cells(i, 1).Value For j = 2 To 21 word = Worksheets("Sheet2").Cells(j, 2).Value result = InStr(moji, word) If result <> 0 Then k = k + 1 Worksheets("Sheet3").Cells(k, 1).Value = moji Exit For End If Next j Next i End Sub '------------------------------------------- 普通はFindメソッドなど高速に検索できるものを使用します。 以上ここまで。
お礼
望んだ通りの結果になりました。ありがとうございます。 ただ、少し自分の理解が足りないので、 1つ質問させていただきたいのですが、 mojiの中にwordが含まれていた場合のExit Forの後の処理の流れがよく分からないので、詳しく教えてください。