Home » ExcelVBA Rangeオブジェクト » セル検索 » Find・FindNextで検索してヒットした個数をカウントするには?

Find・FindNextで検索してヒットした個数をカウントするには?

対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016

「エクセルvba findnextでヒットした個数をカウントする」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。

Excel VBA(Visual Basic for Applications)の、Range.FindNextメソッドで検索を行って、該当するセルがいくつあったのかを取得するには、どのようなコードを書けばいいのかを探している方による検索です。

Findメソッド・FindNextメソッドはいくつヒットしたのかは教えてくれない

そもそも、RangeオブジェクトのFindメソッドやFindNextメソッドは、Excelの[検索と置換]ダイアログの[次を検索]ボタンと、

Find・FindNextで検索してヒットした個数をカウントするには?

同じようなメソッドです。

検索をして1個のRangeオブジェクトを返すだけで、結局いくつのセルが見つかったのかは教えてくれません。

検索にヒットしたセルの個数を調べたい場合、地道に数えましょう。

[スポンサードリンク]

検索を実行してヒットした個数をカウントするサンプルマクロ

具体的には、以下のようなマクロで、アクティブなシートから「北海道」と入力されているセルを検索して、見つかった個数をメッセージボックスに表示することができます。

Sub 北海道という文字列を検索して個数をカウントする()
 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

 MsgBox n & "個見つかりました。"
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 » ExcelVBA Rangeオブジェクト » セル検索 » Find・FindNextで検索してヒットした個数をカウントするには?

「セル検索」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.