Excel VBAで特定の値を検索するには、Find
メソッドを使うのが一般的ですが、複数の一致するセルを順番に検索したい場合は、FindNext
メソッドが便利です。
この記事では、FindNext
の基本構文から実践的なサンプルコード、よくあるミスとその対策まで、初心者にもわかりやすく解説します。
目次
FindNextとは?
FindNext
は、Range.Find
で見つかった最初のセル以外の一致セルを順番に検索するために使うメソッドです。ループと組み合わせて使うことで、目的の値が複数存在する場合に、すべてを効率的に処理できます。
FindNextの基本構文
Sub FindAllMatchingCells()
Dim rng As Range
Dim firstAddress As String
Set rng = Cells.Find("検索したい文字列")
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
' 該当セルに対しての処理をここに記述(例:セルの色を変更など)
Debug.Print rng.Address ' デバッグ出力の例
Set rng = Cells.FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End Sub
この構文では、最初の一致セルのアドレスを記録しておき、再度そのセルに戻ったらループを終了します。
これにより、無限ループを防止できます。
FindNextの使用例
Sub HighlightTokyo()
Dim rng As Range
Dim firstAddress As String
Set rng = Cells.Find(What:="東京")
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
rng.Interior.Color = RGB(255, 255, 0) ' 黄色でハイライト
Set rng = Cells.FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
End Sub

この使用例コードでは、「東京」という文字列を全て検索し、該当セルを黄色にハイライトしています。これにより、目視での確認作業が格段にしやすくなります。
応用例:一致するすべてのセルの隣の値を合計する
Sub SumAdjacentValues()
Dim rng As Range
Dim firstAddress As String
Dim total As Long
Set rng = Cells.Find(What:="商品A", LookAt:=xlWhole)
If Not rng Is Nothing Then
firstAddress = rng.Address
Do
total = total + rng.Offset(0, 1).Value
Set rng = Cells.FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstAddress
End If
MsgBox "商品Aの合計売上:" & total & "千円"
End Sub

この例では、「商品A」と記載されたセルの右隣にある数値(売上)を合計しています。実務では、商品の集計や部署ごとの計算など、様々な場面で活用できます。
よくあるミスと注意点
よくあるミス | 解説 |
---|---|
firstAddress を保存していない | 無限ループの原因になります。最初の一致セルに戻ったかを確認しないと、永遠にループが回り続けます。 |
Find とFindNext の範囲が異なる | 別の範囲を指定すると正しくループできません。必ず同じ範囲を使うようにしましょう。 |
LookIn やLookAt の設定を忘れている | 一致条件が厳しすぎたり曖昧すぎたりして、検索結果が得られない可能性があります。 |
FindNext
は、最初に使用したFind
メソッドの検索条件を引き継いで動作します。そのため、LookIn
(値・数式)やLookAt
(完全一致・部分一致)を意識して設定しましょう。
まとめ
FindNext
は、Find
と併用して複数の一致セルを順に処理するために使います。firstAddress
の保存、同一範囲の使用、検索条件の設定が重要なポイントです。- ハイライト処理、合計処理など、業務効率化に直結する便利な機能なので、ぜひ使いこなしましょう。