エクセルVBAでは、セル内のデータを検索するためにFindメソッドを使用します。
この記事では、Findメソッドの基本的な使い方から応用例、エラー対策まで詳しく解説します。
実際のコードと画像を交えてできるだけわかりやすく説明するので、初心者の方もぜひ参考にしてください。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
エクセル使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
Findメソッドとは?
Findメソッドは、指定した範囲から特定の値を検索するためのVBAメソッドです。
メソッドとは、特定のオブジェクト(セルやシートなど)に対して実行できる機能で、
「オブジェクト名.メソッド名()」というコードで記述します。
「Cells.Find()」と記述することで、FindメソッドをCells(セル)に対して実行したということになります。
例えば、ワークシート内で「Utatane」という文字が入ったセルを検索し、そのセルを取得することができます。
では、Findメソッドの使い方を見ていきましょう。
【Findメソッドのメリット】
- 部分一致・完全一致を指定可能
- 検索後にセルの書式変更や値の取得ができる
- ワークシート全体を高速に検索できる
Findメソッドの使い方
まずは簡単な使い方から紹介いたします。
簡単な使い方
下記のVBAコードを見てください。
Sub 簡単なFind()
Dim rng As Range
Set rng = ActiveSheet.Cells.Find(What:="Utatane")
If Not rng Is Nothing Then
MsgBox "見つかりました!セル: " & rng.Address
Else
MsgBox "見つかりませんでした。"
End If
End Sub
少し長いですが、1つ1つ解説いたします。
▼実行結果

プロシージャの作成
Sub 簡単なFind()
End Sub
プロシージャなど、マクロの基礎は下記記事でわかりやすく解説しております。
コードだけではなく、開発タブの表示からマクロの保存まで知りたい方はご参考ください。
変数の宣言
Dim rng As Range
上記コードにて、以降使用する変数の宣言を行っております。
変数や宣言についての詳しい解説は、下記記事をご参考ください。
検索
Set rng = ActiveSheet.Cells.Find(What:="Utatane")
上記コードにて、指定した範囲から特定の値を検索しています。
「Set rng」にて、オブジェクト(今回はセル)を格納する変数を用意しています。
変数はさきほど宣言した「rng」です。
「ActiveSheet.Cells」は、検索する範囲を指定しています。
今回はアクティブシート(現在選択されているシート)全体を範囲として指定しています。
「.Find()」メソッドで検索を行っております。
()内に検索する値(今回は「Utatane」)を指定します。
これで、アクティブシート全体から「Utatane」という値を検索することができます。
【 Set 変数名 = 検索範囲.Find(What:=”検索する値“) 】
条件分岐処理
If Not rng Is Nothing Then
MsgBox "見つかりました!セル: " & rng.Address
Else
MsgBox "見つかりませんでした。"
End If
上記コードにて、条件分岐処理を行っております。
検索する値が「見つかった場合」と「見つからなかった場合」の条件分岐です。
この処理を書かないと、検索結果がわからないままになってしまいます。
たとえ検索する値が見つかったとしても、既読スルーされてしまうようなものです。
今回は条件分岐にIfを使って、検索結果をメッセージボックスで表示しています。
- 変数がカラではない場合(値が格納されていれば)、セル名を表示
- 変数がカラの場合(値が格納されていなければ)、見つかりませんでしたと表示
Ifやメッセージボックスの表示方法は、下記記事で詳しく解説しております。ご参考ください。
しかしながらデフォルトでは、大文字小文字を区別しない設定になっています。
「Utatane」「utatane」「UTATANE」…どれもHITします。
大文字小文字を区別する方法は次項で紹介いたします。
高度な使い方
Findメソッドにはさまざまなオプションがあります。
- LookAt:=xlWhole:部分一致検索
- LookAt:=xlPart:完全一致検索(デフォルト/省略した場合)
- MatchCase:=True:大文字小文字を区別する
- MatchCase:=False:大文字小文字を区別しない(デフォルト/省略した場合)
- SearchOrder:=xlByColumns:列ごとに検索「A1→A2…→B1→B2…」
- SearchOrder:=xlByRows:行ごとに検索「A1→B1…→A2→B2…」(デフォルト/省略した場合)
- After:=Range(“A1”):指定したセルの次から検索開始
オプションはFine()メソッドの()内に指定します。
【 Fine(What:=”Utatane”, LookAt:=xlWhole, MatchCase:=True)など 】
今回は、少しわかりにくい「行ごと」「列ごと」のみ解説いたします。
まずは下図の元データを見てください。

「B2セル」と「A3セル」にそれぞれ「Utatane」という値が書き込みされています。
では下記のVBAコードを実行してみましょう。
Sub 簡単なFind()
Dim rng As Range
Set rng = ActiveSheet.Cells.Find(What:="Utatane")
If Not rng Is Nothing Then
MsgBox "見つかりました!セル: " & rng.Address
Else
MsgBox "見つかりませんでした。"
End If
End Sub
前項と全く同じコードです。
「行ごと」「列ごと」を指定していないデフォルトなので、
検索は行ごと(A1→B1…→A2→B2…の順)に行われます。
実行結果を見てみましょう。

一番最初に見つけたセルが表示されるため、「B2セル」と表示されました。
次に、下記のVBAコードを見てください。
Sub 高度なFind()
Dim rng As Range
Set rng = ActiveSheet.Cells.Find(What:="Utatane", SearchOrder:=xlByColumns)
If Not rng Is Nothing Then
MsgBox "見つかりました!セル: " & rng.Address
Else
MsgBox "見つかりませんでした。"
End If
End Sub
「SearchOrder:=xlByColumns」を指定したため、列ごと(A1→A2…→B1→B2…の順)に検索が行われます。
では実行結果を見てみましょう。

先ほどとは違う「A3セル」という回答が表示されました。
検索される順番が違っていることがわかります。
「B2」「A3」両方の結果を表示させたい場合は、少し難しくなります。
下記記事にて解説しておりますので、気になる方はご覧ください。
応用例
特定の列や行だけを検索することも可能です。
3行目の検索パートのみお見せします。
その他は前項のコードと同じでOKです。
Set rng = ActiveSheet.Range("A:A").Find(What:="Utatane")
Set rng = ActiveSheet.Range("2:2").Find(What:="Utatane")
上記のように指定することで、「A列のみ」や「2行目のみ」を検索範囲にすることができます。
(“A:C”)のように指定すると「A~C列」を、(“1:3”)のように指定することで「1~3行目」が検索範囲となります。
うまく動作しないときの対処法
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAのFindメソッドについて解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!