「エクセルvba findnextでヒットした個数をカウントする」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
Excel VBA(Visual Basic for Applications)の、Range.FindNextメソッドで検索を行って、該当するセルがいくつあったのかを取得するには、どのようなコードを書けばいいのかを探している方による検索です。
Findメソッド・FindNextメソッドはいくつヒットしたのかは教えてくれない
そもそも、RangeオブジェクトのFindメソッドやFindNextメソッドは、Excelの[検索と置換]ダイアログの[次を検索]ボタンと、
同じようなメソッドです。
検索をして1個のRangeオブジェクトを返すだけで、結局いくつのセルが見つかったのかは教えてくれません。
検索にヒットしたセルの個数を調べたい場合、地道に数えましょう。
検索を実行してヒットした個数をカウントするサンプルマクロ
具体的には、以下のようなマクロで、アクティブなシートから「北海道」と入力されているセルを検索して、見つかった個数をメッセージボックスに表示することができます。
Dim rng As Range
Dim adr As String ' 最初に見つかったセルのAddress
Dim n As Long ' 見つかったセルの個数
n = 0
Set rng = Cells.Find("北海道")
If rng Is Nothing Then
MsgBox "見つかりませんでした。"
Exit Sub
Else
n = 1
adr = rng.Address
End If
Do
Set rng = Cells.FindNext(After:=rng)
If rng.Address = adr Then
Exit Do
Else
n = n + 1
End If
Loop
End Sub
サンプルマクロの解説
地道に数えるしかないので、
Dim n As Long
n = 0
とカウントをするための変数を用意しておきます。
つづく、
Set rng = Cells.Find("北海道")
If rng Is Nothing Then
MsgBox "見つかりませんでした。"
Exit Sub
Else
の部分は、RangeオブジェクトのFindメソッドを使って、何も見つからなかったときの定番の書き方です。
見つかったときは、変数・nに「1」を代入しておいて、
Else
n = 1
この後出てくるDo~Loop文を抜けるのに使うために、セル番地を変数・adrに代入しておきます。
adr = rng.Address
このあとようやく、RangeオブジェクトのFindNextメソッドが登場します。
Do~Loop文の中で、Range.FindNextメソッドの引数・Afterに、オブジェクト変数・rngを指定することで、既に見つけたセルより後ろで検索を継続します。
Do
Set rng = Cells.FindNext(After:=rng)
また、Range.FindeNextの戻りを、オブジェクト変数・rngにセットするようにしています。
Range.FindNextは、最後まで検索して見つからなければ、また頭から検索をするのが仕様です。つまり、最初に見つかったセルと同じセル番地のRangeが返されたときは、全部検索し終わったということになります。
ですから、Range.FindNextで返されたRangeのAddressが、最初に見つかったセルと同じセル番地だったときに、Do~Loop文を抜けるように仕込んでおきます。
If rng.Address = adr Then
Exit Do
最初に見つかったセルとは違うセル番地だったときは、見つかったセルのカウントに使っている変数・nをインクリメントして、ループを続けます。
Else
n = n + 1
End If
Loop
ループを抜けたら、つまり、Do~Loop文内の、
If rng.Address = adr Then
という条件に合致したら、メッセージボックスを表示して、
MsgBox n & "個見つかりました。"
終了です。
Home » Excel VBA Rangeオブジェクト » セル検索 » Find・FindNextで検索してヒットした個数をカウントするには?