VBAで特定のセルを一発検索!Find関数の使い方と活用ポイント

ようこそ♪ささぽんのExcel教室へ。
今回は VBAにおける「Find関数の使い方と活用ポイント」 をお届けします!
マクロで「特定の値を含むセルを見つけ出して処理したい」という場面、ありませんか?
そんなときに活躍するのが、Find関数です。
この記事では、Find関数の基本的な使い方から、実務での活用シーン、注意点までを解説していきます!

この記事は以下のような方におすすめです!
・Find関数の使い方を知りたい方
・For〜Nextでの検索処理が遅いと感じている方
・Find関数の注意点を学びたい方
このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。
読み終わるころにはきっと、
「Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。
一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!
目次
1.Find関数とは?特徴や使いどころについて
◼︎「セルから特定の値を探す」ときに使う関数
Find関数は、「範囲の中から特定の値を含むセルを見つけたいとき」に使うVBA関数です。
検索対象のセルをすばやく特定し、そのセルの位置(行や列)をもとに処理を進めることができます。
Excelの操作で例えると、Ctrl+Fを押して出てくる検索窓で検索をかけるようなイメージです。

値がどこにあるかを一発で探せるので、大量のデータでも高速に処理できるのが特徴です!
◼︎Find関数の活躍シーン
Find関数は、「該当する値が1つだけ存在する」という場面で特に力を発揮します。
例えば、社員ID「A12345」に一致する行を見つけてその人の部署名を取得する場合など、一意な値(他に被りがない値)を扱う際に便利です。
ループ処理で1つずつ値チェックをして探すこともできますが、Find関数の方が処理が速くコードもシンプルになるので、値が1つしかヒットしない場合にはFindを使って書くようにしましょう。
2.実務で使える!Findの基本の使い方
◼︎Find関数の基本構文
まずは、Find関数の基本的な使い方を見ていきましょう:
Dim rng As Range
Set rng = Cells.Find(What:="検索したい値")
MsgBox "見つかったセルのアドレスは " & rng.Address
このコードは、ワークシート全体(Cells)から「検索したい値」に一致するセルを探して、見つかればそのセルのアドレス(例:$A$5)をメッセージボックスに表示するというものです。
実際に”検索したい値”の部分に好きな文字を入れて、手元のExcelで実行してみてください。
どこのセルにその文字を入れていても、すぐにメッセージボックスで結果を表示してくれることを確認しましょう!
◼︎見つからない場合に備えた条件分岐
Find関数で検索を行ったとき、値が見つかればそのセルの情報が返ってきますが、見つからなければ「Nothing」が返されます。
この結果をそのまま使うとエラーになることがあるため、見つかったかどうかで条件分岐を入れるようにしましょう。
Dim rng As Range
Set rng = Cells.Find(What:="検索したい値")
If Not rng Is Nothing Then
MsgBox "見つかったセルのアドレスは " & rng.Address
Else
MsgBox "値が見つかりませんでした。"
End If
このように、“If Not 値 Is Nothing Then”で「値がNothingじゃない場合」という条件を指定して処理することをおすすめします。
3.強みを知ろう!Findの活用シーンとメリット
◼︎活用シーン:一意な値を検索して処理する
Find関数が最も活躍するのは、検索対象が「1件だけ存在する」とわかっている場合です。
例えば、社員IDや商品コード、注文番号など、範囲の中で1件しかないような値を検索する場面では非常に効果的です。
例として、以下のような一覧表に対する処理を想定してみましょう:

ここで商品コード「A002」に対応する価格を取得するには、以下のようなコードを使います:
Dim rng As Range
Set rng = Range("A:A").Find(What:="A002")
If Not rng Is Nothing Then
MsgBox "価格は " & rng.Offset(0, 2).Value & " 円です"
Else
MsgBox "該当する商品が見つかりませんでした。"
End If
Findの処理でrngという変数に見つかったセルを代入し、そこからOffsetで右に2つ移動したセルを取得するようになっています。
このように、検索対象が1件だけであることが前提であれば、Find関数は一発で目的の情報にたどり着けるので最適です。
◼︎メリット:処理スピードと読みやすさ
Find関数の大きな強みは、処理の速さとコードの読みやすさです。
たとえば、先ほどFindで書いたA列から「A002」という商品コードを探す処理を、Forループで書くとこうなります:
Dim i As Long
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(i, 1).Value = "A002" Then
MsgBox "価格は " & Cells(i, 3).Value & " 円です"
Exit For
End If
Next i
MsgBox "該当する商品が見つかりませんでした。"
先ほどのコードと見比べてみると行数も多く読みにくいですよね。
また、値が見つかるまで1行ずつ検索していくので行数が多いときほど処理に時間がかかります。
このように、Find関数は可読性・処理速度が向上し特にデータ量が多い処理に重宝します。
使いこなしていただくため、次のセクションでFind関数が向いている処理を見ていきましょう!
◼︎Find関数が向いている処理/向いていない処理
Find関数はとても便利ですが、どの場面でも使えるわけではありません。
使いどころを見極めることで、より効果的に活用できます。
向いているケース
- 該当するセルが1つだけと分かっている場合
- データ量が多く、処理を高速化したい場合
- 検索条件がシンプルで分かりやすい場合
向いていないケース
- 同じ値が複数存在していて、全てについて処理したい場合
- 部分一致・大文字小文字など細かい条件での検索をしたい場合
- 複雑な条件で絞り込みしたい場合
Find関数は、「この値をピンポイントで見つけたい」という場面でとても使いやすい関数です。
ただし、該当データが複数あるときには注意が必要なので、使い分けが大事ですね。
次の章では、Find関数を使う際の注意点をご紹介します!
4.Find関数で間違えやすいポイントと対策
Find関数はとても便利ですが、ちょっとした設定の違いや思い込みで上手く検索結果が見つからない事態になりやすいのも事実です。
ここでは、実際によくあるミスや注意点を3つ紹介します。
◼︎①部分一致になっている(LookAt)
Find関数は、デフォルトでは「部分一致」で検索されるようになっています。
たとえば、What:=”123″ で検索すると、「123」「12345」「A123B」など、123を含むセルがヒット対象になります。
部分一致ではなく、「完全に一致するセルだけを探したい」というときは、以下のように書いてみてください:
Set rng = Cells.Find(What:="123", LookAt:=xlWhole)
このコードで使われている「LookAt」は、検索対象セルの一致条件を指定する引数です。
以下の表で整理しておきましょう。
設定値 | 意味 |
xlPart(デフォルト) | 部分一致:指定した値を含んでいればヒット |
xlWhole | 完全一致:完全に一致している場合のみヒット |
このように、一致条件の設定によっては、想定と違うセルがヒットしてしまうこともあります。
とくに「完全一致で検索したつもりが、部分一致になっていた」というケースは非常に多いので注意しましょう。
◼︎②検索対象の設定が違っている(LookIn)
Find関数はLookIn という引数で検索対象を設定することができます。
一致条件設定と同じく省略ができますが、省略されたまま実行されると、前回使った条件がそのまま引き継がれるため注意が必要です。
以下の表が、LookInの設定値と意味です。
設定値 | 意味 |
xlValues | セルに表示されている値を対象に検索 |
xlFormulas | セルに入力された数式(=A2+B2など)を対象に検索 |
LookInの条件を確認するため、実際の例で確認してみましょう。
セルA1に =A2+B2 という数式を入力し、A2とB2には 100 を入れてください。

このとき、A1には「200」と表示されますが、編集モードで見ると =A2+B2 の数式が入力されているという状態になります。
この状態で検索をしてみると:
- LookIn:=xlValues で What:=”200″ を検索
→ヒットする(画面表示が「200」のセルを検索しているため) - LookIn:=xlFormulas で What:=”=A2+B2″ を検索
→ヒットする(数式が「=A2+B2」のセルを検索しているため) - LookIn:=xlFormulas で What:=”200″ を検索
→ヒットしない(数式が「200」のセルを検索しているため)
このように、表示されている値を検索したいのか、数式そのものを検索したいのかによって、指定すべき LookIn の値は変わります。
◼︎③大文字小文字が区別されている(MatchCase)
Find関数では、検索時に「大文字と小文字を区別するかどうか」も指定することができます。
それをコントロールするのが MatchCase 引数です。
設定値 | 意味 |
MatchCase:=False(デフォルト) | 大文字・小文字を区別しない(A=a) |
MatchCase:=True | 大文字・小文字を区別する(A ≠ a) |
今度はセルA1に“ABC”という文字列を入れて以下の検索を実行してみましょう:
- MatchCase:=False で What:=”abc” を検索
→ヒットする(大文字小文字を区別しないため) - MatchCase:=True で What:=”abc” を検索
→ ヒットしない(大文字小文字を区別するため)
ただし特別な理由がない限り、MatchCaseは False(区別しない)で使うのが一般的です。
万が一想定通りにヒットしない場合には、念のためこの設定も確認するようにしましょう。
この章では、Find関数を使うときに間違いやすいポイントと対策についてみてきました。
Find関数では値の種類や用途に応じて、LookAtなどの検索オプションをしっかり見直すことが大切です。
意図しない検索結果になってしまった際には、オプションをひとつひとつ確認するようにしてみてください!
5. まとめ:Find関数の使いどころと設定項目を整理しよう
◼︎Find関数とForループを上手に使い分けよう!
Find関数とForループは、どちらも「セルを探す処理」に使われますが、それぞれに得意・不得意な場面があります。
3章で紹介した内容を、改めて表で整理してみましょう!
比較項目 | Find関数 | Forループ |
向いている処理 | 一件だけ見つけて処理したいとき | 複数ヒットをすべて処理したいとき |
コードの長さ | シンプルに書ける | 条件が多いほど長くなる |
処理速度 | 高速(特に大量データで効果大) | 行数が多いと処理が遅くなる |
条件の柔軟性 | 限定的 | 複雑な条件でも対応可能 |
習得のしやすさ | 初心者にも使いやすい | 構文に慣れが必要 |
どちらを使うべきか悩んだ時には、一致するセルが1件のみの場合には「Find関数」、複数ある場合には「Forループ」で判断しましょう!
Forループは値の検索以外にも様々な場面で活躍するので、詳しくは以下の記事をご覧ください♪
◼︎検索条件の設定をマスターしよう!
Find関数は、指定の値を探すだけでなく、さまざまな検索条件を細かく設定できるのが特徴です。
4章で紹介した引数を表でまとめてみました:
引数 | 設定例 | 意味 |
What | “A002” | 検索したい値を指定 |
LookIn | xlValues / xlFormulas | 検索対象(値 or 数式) |
LookAt | xlPart / xlWhole | 部分一致 or 完全一致 |
MatchCase | True / False | 大文字と小文字を区別するか |
Find関数自体は設定を省略しても動きますが、前回の検索条件を引き継いでの検索となるため、想定外の結果になることがあります。
確実に処理したい時には必ず引数を明示して、検索条件をコントロールしましょう。
Find関数は、多くの値から特定の値のセルを見つける際に非常に便利な関数です。
最初は設定に戸惑うこともあるかもしれませんが、基本をしっかり押さえれば非常に使いやすいです。
まずはシンプルな検索から試してみて、慣れてきたら条件の指定にも挑戦してみましょう!
\ Excelマクロ制作も承っています /
各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!