「vba findnext 範囲指定」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスがあることに気づきました。
RangeオブジェクトのFindNextメソッドで、
検索する範囲を指定するには、どのようなコードを書けばいいのかを探している方による検索キーワードです。
範囲指定を行って検索を行うサンプルマクロ
以下のマクロを実行すると、アクティブなワークシートのA列から「北海道」と入力されているセルが順番に検索され、見つかったセルのセル番地がメッセージボックスに表示されます。
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
ポイントは、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ステートメントを使ってまとめておくほうが、保守性の面から良さそうです。
オブジェクト変数を使うのなら、以下のようなマクロです。
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
検索範囲を指定するオブジェクト変数・tgtにセル範囲をセットしておいて、
Set tgt = Range("A:A")
検索を行う部分では、
Set rng = tgt.Find(What:="北海道")
Set rng = tgt.FindNext(After:=rng)
と、オブジェクト変数・tgtを使ったオブジェクト式にしています。
Withを使って範囲指定を行うサンプルマクロ
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 SubWithステートメント内の「.Find」「.FindNext」が、
Set rng = .Find(What:="北海道")
Set rng = .FindNext(After:=rng)
いずれも「.」から始まっているところがポイントです。
最終更新日時:2019-05-30 06:50
- Newer:表・Tableの有無を判定するPowerPointマクロ
- Older:書籍では学べないポイントが
Home » Excel VBA Rangeオブジェクト » セル検索 » FindNextで範囲指定をして検索するには?