「あぁ…また1件ずつ探してコピペか。これ、あと何回やれば終わるんだろう…」
事務仕事中に一度は経験したことはありあませんか?
Excelの標準機能の「検索」はとても便利ですが、VBAで「見つかったもの全てに対して処理をしたい」となった途端、急に難易度が上がったように感じてしまいます。
しかし、FindNextの使い方さえマスターすれば、どれほど膨大なデータでも、条件に一致するセルを「芋づる式」にすべて抽出することができるようになります。
なぜFindだけでは不十分なのか?
Findメソッドは、例えるなら「教室のドアを開けて、最初に目に付いたメガネの人を見つける」作業です。
でも、教室には他にもメガネの人がいるかもしれませんよね。
そこで、「じゃあ、次のメガネの人はどこ?」と順番に探してくれるのがFindNextの役割になります。
コピペで使える!全検索のテンプレート
以下のコードは、シートの中から「特定の文字」を探し出し、該当するすべてのセルの色を黄色にする処理のサンプルコードです。
Sub FindAllCells()
Dim targetRange As Range ' 検索対象の範囲
Dim foundCell As Range ' 見つかったセル
Dim firstAddress As String ' 最初にみつけたセルの住所を覚える変数
Dim searchWord As String ' 探したい言葉
searchWord = "至急" ' ここに探したい文字を入れます
' 1. まずは「最初の1つ」を探す
With ActiveSheet.UsedRange
Set foundCell = .Find(What:=searchWord, LookIn:=xlValues, LookAt:=xlPart)
' もし1つも見つからなければ、ここで終了
If Not foundCell Is Nothing Then
' 2. 最初にみつけた場所をメモしておく
firstAddress = foundCell.Address
Do
' --- ここに見つかったセルに対する処理を書く ---
foundCell.Interior.Color = vbYellow ' セルを黄色にする
' --------------------------------------------
' 3. 「次」のセルを探す
Set foundCell = .FindNext(foundCell)
' 4. 検索結果が空になるか、最初の場所に戻ってくるまで繰り返す
Loop While Not foundCell Is Nothing And foundCell.Address <> firstAddress
Else
MsgBox "見つかりませんでした!"
End If
End With
MsgBox "すべての検索と処理が完了しました!"
End Sub
覚えておきたい「無限ループ」の防ぎ方
このプログラムで一番大事なのは、firstAddress = foundCell.Addressの部分です。
Excelの検索は、シートの最後まで行くと、再び「最初に見つかった位置」に戻る性質があります。Ctrl+Fの検索も同じですよね。
そのため、最初にみつけた場所を覚えておかないと、プログラムは永遠に同じ場所をぐるぐる探し続けて、Excelがフリーズする原因になってしまいます。
「最初の場所に戻ってきたら検索終了!」というルールをセットで組み込むことが、安全なループ処理を行うコツになります。
まとめ
FindNextを使いこなせれば、事務作業のスピードは劇的に上がります。
「プログラミングって難しそう…」と感じるかもしれませんが、まずはこのテンプレートをコピーして、自分の業務に合わせて「処理(色を塗る、など)」の部分を書き換えるだけで効果を実感できると思います。
小さな効率化の積み重ねが、やがて私たちの自由な時間を生み出します。ぜひ活用してください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント