指定した範囲内に特定の文字列のセルがあるかどうか調べる(Findメソッド)
指定した範囲内に特定の文字列のセルがあるかどうかを調べる方法について説明します。
Findメソッドを使用してRange型の変数を用意して、指定した範囲内を検索します。
下のコードでは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セルにあります。』のメッセージボックスが表示されました。
▽マクロ実行結果
セルの文字を「ミニトマト」に変更して、もう一度完全一致で検索してみます。
完全一致のため『「トマト」は見つかりませんでした。』のメッセージボックスが表示されました。
指定した範囲内に特定の文字列のセルが何個あるかを調べる(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つのセルが見つかりました。
イミディエイトウィンドウには1つ目~3つ目までのセル位置が表示されています。
次に完全一致(LookAt:=xlWhole)で実行した結果です。
「トマト」と表示されている2個のセルが見つかりました。
イミディエイトウィンドウには「トマト」のセルの位置が表示されています。
※注意点※
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 | 省略可能 | 検索の書式を指定 |
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。