PR

【ExcelVBA】範囲内に特定の文字のセルがあるか探す方法(セル位置・個数を取得)Findメソッド、FindNextメソッド

ExcelVBAシート内に特定の文字があるセルを探す-アイキャッチ その他
スポンサーリンク

指定した範囲内に特定の文字列のセルがあるかどうか調べる(Findメソッド)

指定した範囲内に特定の文字列のセルがあるかどうかを調べる方法について説明します。

Findメソッドを使用してRange型の変数を用意して、指定した範囲内を検索します。

Findメソッドの構文
Range.Find(“検索文字列”)

下のコードではA1~D10のセル範囲を対象として、「トマト」の文字があるセルを検索します。
Findメソッドの引数で完全一致か部分一致かを指定できます。

今回は完全一致で検索したいので引数に「LookAt:=xlWhole」を追加しています。
部分一致の場合は「LookAt:=xlPart」とします。

セルが見つかった場合はセル位置をメッセージに表示します。

サンプルマクロで実行している内容
・検索する文字列を変数にセット
・指定した範囲内を検索して見つかったセル位置を変数にセット
・見つからなかった場合(変数が空の場合)は終了する
・見つかった場合はセル位置をメッセージボックスに表示する
 (複数ある場合は1個目に見つかったセル位置を表示します。)

Sub sample1()

Dim FindRng As Range     '見つかったセル位置を格納
Dim TargetStr As String  '検索する文字列を格納

'検索する文字列を変数にセット
TargetStr = "トマト"

'指定した範囲内を検索して見つかったセル位置を変数にセット(完全一致)
Set FindRng = ActiveSheet.Range("A1:D10").Find(TargetStr, LookAt:=xlWhole)

'カウント用変数に0をセット
n = 0

'見つからなかった場合
If FindRng Is Nothing Then

    '「見つかりませんでした」のメッセージを表示
     MsgBox "「" & TargetStr & "」は見つかりませんでした。"
     
  '見つかった場合
  Else

    '見つかったセル位置をメッセージで表示
    MsgBox "「" & TargetStr & "」は「" & FindRng.Address & "セルにあります。"

End If

End Sub

▽マクロ実行結果
「トマト」で完全一致で検索した結果です。
『「トマトは」$B$5セルにあります。』のメッセージボックスが表示されました。

ExcelVBAシート内に特定の文字があるセルを探す_1つ見つかった場合

▽マクロ実行結果
セルの文字を「ミニトマト」に変更して、もう一度完全一致で検索してみます。
完全一致のため『「トマト」は見つかりませんでした。』のメッセージボックスが表示されました。

ExcelVBAシート内に特定の文字があるセルを探す_見つからなかった場合
スポンサーリンク

指定した範囲内に特定の文字列のセルが何個あるかを調べる(FindNextメソッド)

次は指定した範囲内に特定の文字列のセルが何個あるかを調べる方法について説明します。

1つ目で説明したFindメソッドの方法では範囲内に特定の文字列のセルがあるかどうか、を調べる方法だったので1個あっても2個あっても結果は同じでした。

次に説明する方法では何個あるのか、とそれぞれのセル位置も取得しています。

サンプルマクロで実行している内容
・検索する文字列を変数にセット
・指定した範囲内を検索して見つかったセル位置を変数にセット
 (まずはあるかどうかを調べる)
・見つからなかった場合は終了する
・見つかった場合は何個あるのかを調べる
 (Do~Loop繰り返しを使用してFindNextメソッドで調べる)
・見つかったセル位置をdebug.printでイミディエイトウィンドウへ出力する
・見つかったセルの個数をメッセージボックスに表示する

Sub sample2()

Dim FindRng As Range     '見つかったセル位置を格納
Dim n As Long            '見つかったセルの個数を格納
Dim TargetStr As String  '検索する文字列を格納
Dim FirstAdr As String   '最初に見つかったセル位置を格納

'検索する文字列を変数にセット
TargetStr = "トマト"

'指定した範囲内を検索して見つかったセル位置を変数にセット(部分一致)
Set FindRng = ActiveSheet.Range("A1:D10").Find(TargetStr, LookAt:=xlPart)

'カウント用変数に0をセット
n = 0

'見つからなかった場合
If FindRng Is Nothing Then

     MsgBox "「" & TargetStr & "」は見つかりませんでした。"
     Exit Sub
     
  '見つかった場合
  Else
   'カウント用変数に1をセットする
     n = 1

    '最初のアドレスを変数に格納しておく
     FirstAdr = FindRng.Address

     Do
        '次を検索
         Set FindRng = ActiveSheet.Range("A1:D10").FindNext(After:=FindRng)
        
        '見つかったセルをdebug.printする
         Debug.Print FindRng.Address
        
        '最初のアドレスになったらループを抜ける
        If FindRng.Address = FirstAdr Then
           Exit Do
         Else
           'カウント用変数をアップさせる
           n = n + 1
        End If
        
     Loop

End If

'見つかったセルの個数をメッセージに表示
MsgBox n & "個セルが見つかりました。"

End Sub

部分一致(LookAt:=xlPart)で実行した結果です。
1つミニトマトのセルがありますが、部分一致なので3つのセルが見つかりました。

ExcelVBAシート内に特定の文字があるセルを探す_部分一致_複数検索

イミディエイトウィンドウには1つ目~3つ目までのセル位置が表示されています。

ExcelVBAシート内に特定の文字があるセルを探す_部分一致_複数検索_セル位置デバッグ表示

次に完全一致(LookAt:=xlWhole)で実行した結果です。
「トマト」と表示されている2個のセルが見つかりました。

ExcelVBAシート内に特定の文字があるセルを探す_完全一致_複数検索

イミディエイトウィンドウには「トマト」のセルの位置が表示されています。

ExcelVBAシート内に特定の文字があるセルを探す_完全一致_複数検索_セル位置デバッグ表示

※注意点※
Do~LoopでFindNextメソッドを使用して検索する方法では、最後に見つかったセルのあと、次のループでまた1つ目のセルを見つけます。
1つ目に見つかったセルを別の変数に保存しておいて、Loopで1つ目のセルが返ってきたらループを抜ける(Exit Sub)処理を作っておかないと無限ループに入ってしまうので永遠に終わらないコードになってしまいます。

スポンサーリンク

Findメソッドの引数いろいろ

Findメソッドの引数はいろいろあるので下の表を参照してください。

名前必須 / 省略可能説明
What必須検索するデータを指定
After省略可能指定したセルの後から検索を開始。指定しない場合は範囲の左上から検索。
LookIn省略可能xlFormulas(数式)
xlValues(値)
xlComments(コメント) 
LookAt省略可能xlWhole(完全一致)
xlPart(部分一致)
SearchOrder省略可能xlByRows(行で検索)
xlByColumns(列で検索)
SearchDirection省略可能xlNext(一致する次の値)
xlPrevious(一致する前の値)
MatchCase省略可能大文字と小文字を区別するには、True を指定します。 既定値は False です。
MatchByte省略可能True(半角と全角を区別する)
False(半角と全角を区別しない)
SearchFormat省略可能検索の書式を指定
スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

タイトルとURLをコピーしました