VBAで「特定の文字列を含むセルがシート内に複数ある」場合、それらを1つずつ探し出して処理したいことがあります。
そのようなときに活躍するのが、Find
関数と FindNext
関数の組み合わせです。
本記事では、「森」という文字列を含むセルをすべて検索し、件数を表示する例を用いて、実用的なコードとその仕組みを解説いたします。
目次
コード例:文字列「森」をすべて検索して件数を数える
Dim targetCell As Range
Dim firstHit As Range
Dim allMatches As Range
Set targetCell = Cells.Find(What:="森")
If targetCell Is Nothing Then
MsgBox "「森」が見つかりませんでした。"
Exit Sub
Else
Set firstHit = targetCell
Set allMatches = targetCell
End If
Do
Set targetCell = Cells.FindNext(targetCell)
If targetCell.Address = firstHit.Address Then
Exit Do
Else
Set allMatches = Union(allMatches, targetCell)
End If
Loop
MsgBox "「森」が " & allMatches.Count & " 件見つかりました。"
コードの解説
1. Find
で最初の一致セルを検索
Set targetCell = Cells.Find(What:="森")
- ワークシート全体から「森」を含む最初のセルを検索します。
- 見つからなかった場合は
Nothing
が返されるため、事前チェックを行います。
2. 検索ループの準備
firstHit
:最初に見つかったセル(ループの終了条件に使用)allMatches
:見つかったセルをまとめるための集合(Union
で追加)
3. FindNext
によるループ処理
Set targetCell = Cells.FindNext(targetCell)
Find
で見つかった位置から順に次の一致セルを探します。- 最初に見つかったセル(
firstHit
)に戻ったらループ終了。
4. 一致セルの集合化と件数表示
Set allMatches = Union(allMatches, targetCell)
- 各一致セルを
Union
で結合し、まとめて操作可能にします。 .Count
を使って見つかったセル数をカウントします。
応用:検索対象に書式を適用する
見つかったセルすべてに太字や背景色を適用したい場合、次のように書けます。
allMatches.Font.Bold = True
allMatches.Interior.Color = RGB(255, 255, 200)
よくある注意点
内容 | 解説 |
---|---|
Find の結果が Nothing のとき | エラー回避のため必ずチェックする |
Union の使用 | 最初のセルを基準に範囲を拡張する |
FindNext の終了条件 | 最初に見つかったセル(firstHit )と同じアドレスで終了すること |
まとめ
処理内容 | 使用構文 | 解説 |
---|---|---|
最初の一致セルを検索 | Cells.Find(What:="森") | 見つからない場合に備えたエラーハンドリングが必要 |
次の一致セルを取得 | FindNext | 最初のセルと比較してループ終了を判定 |
複数セルをまとめる | Union | 一括処理を可能にする |
件数をカウント | .Count | 一致セル数を取得 |
このように Find
と FindNext
を正しく使いこなすことで、複数の一致セルを自動で検出・一括処理するマクロを簡潔に実装できます。
データ分析、検索レポート作成、検査・強調処理など、あらゆる業務に応用可能です。