Home » Excel VBA Rangeオブジェクト » セル検索 » FindNextで範囲指定をして検索するには?

FindNextで範囲指定をして検索するには?

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

「vba findnext 範囲指定」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスがあることに気づきました。

RangeオブジェクトのFindNextメソッドで、

FindNextメソッドで検索の範囲指定を行うには?

検索する範囲を指定するには、どのようなコードを書けばいいのかを探している方による検索キーワードです。

[スポンサードリンク]

範囲指定を行って検索を行うサンプルマクロ

以下のマクロを実行すると、アクティブなワークシートのA列から「北海道」と入力されているセルが順番に検索され、見つかったセルのセル番地がメッセージボックスに表示されます。

Sub 北海道という文字列を検索する_範囲指定()

 Dim rng As Range ' 見つかったRange
 Dim adr As String ' 最初に見つかったRangeのAddress

 Set rng = Range("A:A").Find(What:="北海道")
 If rng Is Nothing Then
  MsgBox "見つかりませんでした。"
  Exit Sub
 Else
  adr = rng.Address
  MsgBox rng.Address(False, False)
 End If

 Do
  Set rng = Range("A:A").FindNext(After:=rng)
  If rng.Address = adr Then
   Exit Do
  Else
   MsgBox rng.Address(False, False)
  End If
 Loop

End Sub

ポイントは、Range.Findメソッドを使っている、
  Set rng = Range("A:A").Find(What:="北海道")
と、この記事のテーマであるRange.FindNextメソッドを使った、
  Set rng = Range("A:A").FindNext(After:=rng)
です。

Range.Findメソッドで検索する範囲を指定するには、「.Find」の前のRangeオブジェクトを取得するオブジェクト式で指定するということを既にご紹介しています。

Range.FindNextメソッドも同じです。
「.FindNext」の前のオブジェクト式で範囲指定を行います。

上記のマクロのような、
  Set rng = Range("A:A").FindNext(After:=rng)
といったオブジェクト式で検索範囲をA列に限定できます。

例えば、
  Set rng = Range("A1:G7").FindNext(After:=rng)
或いは、
  Set rng = Range("A1", "G7").FindNext(After:=rng)
というオブジェクト式にすれば、セル範囲A1:G7で検索が行われます。

また、どこかのセル範囲に「都道府県名」という名前が定義されていれば、
  Set rng = Range("都道府県名").FindNext(After:=rng)
というオブジェクト式で、セル範囲・都道府県名の中で検索が行われます。

オブジェクト変数を使って範囲指定を行うサンプルマクロ

上記のマクロでは、「.Find」「.FindNext」の前のオブジェクト式で検索範囲を指定することを理解していただくために、RangeオブジェクトのFindメソッドを使った、
  Set rng = Range("A:A").Find(What:="北海道")
の部分と、FindNextメソッドを使っている、
  Set rng = Range("A:A").FindNext(After:=rng)
の部分の2か所に、「Range("A:A")」というまったく同じオブジェクト式を書いています。

実際に利用するコードでは、オブジェクト変数かWithステートメントを使ってまとめておくほうが、保守性の面から良さそうです。

オブジェクト変数を使うのなら、以下のようなマクロです。

Sub 北海道という文字列を検索する_オブジェクト変数()

 Dim tgt As Range ' 検索するセル範囲
 Dim rng As Range ' 見つかったRange
 Dim adr As String ' 最初に見つかったRangeのAddress

 Set tgt = Range("A:A")

 Set rng = tgt.Find(What:="北海道")
 If rng Is Nothing Then
  MsgBox "見つかりませんでした。"
  Exit Sub
 Else
  adr = rng.Address
  MsgBox rng.Address(False, False)
 End If

 Do
  Set rng = tgt.FindNext(After:=rng)
  If rng.Address = adr Then
   Exit Do
  Else
   MsgBox rng.Address(False, False)
  End If
 Loop

End Sub

検索範囲を指定するオブジェクト変数・tgtにセル範囲をセットしておいて、
  Set tgt = Range("A:A")
検索を行う部分では、
  Set rng = tgt.Find(What:="北海道")
  Set rng = tgt.FindNext(After:=rng)
と、オブジェクト変数・tgtを使ったオブジェクト式にしています。

Withを使って範囲指定を行うサンプルマクロ

Withステートメントを使うのなら、以下のようなマクロです。

Sub 北海道という文字列を検索する_With()

 Dim rng As Range ' 見つかったRange
 Dim adr As String ' 最初に見つかったRangeのAddress

 With Range("A:A")

  Set rng = .Find(What:="北海道")
  If rng Is Nothing Then
   MsgBox "見つかりませんでした。"
   Exit Sub
  Else
   adr = rng.Address
   MsgBox rng.Address(False, False)
  End If

  Do
   Set rng = .FindNext(After:=rng)
   If rng.Address = adr Then
    Exit Do
   Else
    MsgBox rng.Address(False, False)
   End If
  Loop

 End With

End Sub

Withステートメント内の「.Find」「.FindNext」が、
   Set rng = .Find(What:="北海道")
   Set rng = .FindNext(After:=rng)
いずれも「.」から始まっているところがポイントです。

最終更新日時:2019-05-30 06:50

[スポンサードリンク]

Home » Excel VBA Rangeオブジェクト » セル検索 » FindNextで範囲指定をして検索するには?

「セル検索」の記事一覧

検索


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

.