「名前と電話番号が一つのセルに混在している」「@マークの前後でメールアドレスを分割したい」——こうした実務の悩みを解決するのがFIND関数・SEARCH関数です。
どちらも文字列の中から指定した文字が何文字目にあるかの「位置番号」を返す関数です。この位置番号をMID・LEFT・RIGHT関数に渡すことで、固定長ではなく可変長の文字列抽出が実現します。セルごとに区切り位置が異なる住所や氏名の分割、コードの一部抽出など、データ整形業務で欠かせない組み合わせです。
本記事では、FIND・SEARCHの基本構文・両者の違い・実務シナリオ別の活用パターン・よくあるエラーの対処法・MOS Excel試験の出題ポイントを体系的に解説します。
FIND関数の基本構文
FINDの構文は次の通りです。
=FIND(検索文字列, 対象, [開始位置])
| 引数 | 説明 | 省略 |
|---|---|---|
| 検索文字列 | 検索したい文字または文字列(例: “@”・”都”・”-“) | 必須 |
| 対象 | 検索対象となる文字列またはセル参照 | 必須 |
| 開始位置 | 何文字目から検索を始めるか(省略すると1文字目から) | 省略可 |
基本例:A1に「田中 太郎」が入っている場合、スペースが何文字目にあるかを求めます。
=FIND(" ", A1) →「3」(3文字目にスペース)が返る
返ってくる数値は文字の左端を1とした位置番号です。全角文字も半角文字も「1文字=1」としてカウントします(バイト数ではなく文字数)。
SEARCH関数の基本構文
SEARCHの構文はFINDとまったく同じです。
=SEARCH(検索文字列, 対象, [開始位置])
基本例:A1に「Excel入門ガイド」が入っている場合、「入門」が何文字目から始まるかを求めます。
=SEARCH("入門", A1) →「6」(6文字目から始まる)が返る
FINDとSEARCHの違い:2つの使い分け基準
見た目はほぼ同じFINDとSEARCHですが、2つの重要な違いがあります。
| 違い | FIND | SEARCH |
|---|---|---|
| 大文字・小文字の区別 | 区別する(”Excel”と”excel”は別扱い) | 区別しない(”Excel”と”excel”は同じ扱い) |
| ワイルドカード | 使えない(?や*は文字として検索する) | 使える(?は任意の1文字、*は任意の文字列) |
| 全角・半角 | 区別する(”A”と”A”は別扱い) | 区別しない(”A”と”A”は同じ扱い) |
使い分けの基本方針:メールアドレスの”@”や電話番号の”-“のような固定記号を探す場合はどちらでも同じ結果になります。英字の大文字・小文字を厳密に区別したいときはFIND、ワイルドカードを使った柔軟な検索がしたいときはSEARCHを選びます。実務では大文字・小文字を区別しないSEARCHを使うほうが安全なケースが多いです。
実務シナリオ別の活用パターン
FIND・SEARCHは単体で使うよりも、MID・LEFT・RIGHT・LEN関数と組み合わせることで真価を発揮します。
シナリオ1:スペースを境に姓と名を分割する
A1に「田中 太郎」(氏名の間にスペース)が入っている場合、姓(田中)と名(太郎)をそれぞれ別セルに取り出します。
' 姓の取り出し(スペースより左)
=LEFT(A1, FIND(" ", A1) - 1)
' 名の取り出し(スペースより右)
=MID(A1, FIND(" ", A1) + 1, LEN(A1))
FINDがスペースの位置を返すので、LEFT関数で「スペースの1つ手前まで」を取り出し、MID関数で「スペースの次の文字から末尾まで」を取り出します。LEN(A1)を文字数に指定すると「残り全部」という意味になります。
シナリオ2:メールアドレスからドメイン部分を抽出する
A1に「taro@example.com」が入っている場合、”@”より後ろのドメイン部分(example.com)を取り出します。
=MID(A1, FIND("@", A1) + 1, LEN(A1)) ' → example.com
“@”の位置をFINDで取得し、その次の文字(+1)から末尾まで抽出します。ユーザー名部分(”@”より左)を取り出す場合は次の式になります。
=LEFT(A1, FIND("@", A1) - 1) ' → taro
シナリオ3:都道府県名を住所から切り出す
A1に「東京都新宿区西新宿1-1-1」が入っている場合、都道府県部分を取り出します。「都」「道」「府」「県」のどれかが含まれているかをSEARCHで調べ、その位置を使ってLEFTで切り出します。
' 「都」「道」「府」「県」をIFERRORで順番に試す
=IFERROR(LEFT(A1, SEARCH("都", A1)),
IFERROR(LEFT(A1, SEARCH("道", A1)),
IFERROR(LEFT(A1, SEARCH("府", A1)),
LEFT(A1, SEARCH("県", A1)))))
ネストしたIFERRORで「都」「道」「府」「県」を順番に試し、最初に見つかった位置で切り出します。データ量が多い場合はPower QueryやフラッシュフィルのほうEが効率的ですが、関数だけで処理したいときの実務パターンです。
シナリオ4:「種別-年号-番号」コードの中間部分を抽出する
A1に「ABC-2024-001」のような「種別-年号-番号」形式のコードが入っている場合、最初のハイフンと2番目のハイフンの位置を使って「年号」部分(2024)を取り出します。
' 1つ目の"-"の位置 → 4
=FIND("-", A1)
' 2つ目の"-"の位置(1つ目の次から検索) → 9
=FIND("-", A1, FIND("-", A1) + 1)
' 年号部分(2024)を抽出
=MID(A1, FIND("-", A1) + 1, FIND("-", A1, FIND("-", A1) + 1) - FIND("-", A1) - 1)
第3引数(開始位置)に「1つ目の”-“の位置+1」を渡すことで、2番目の”-“の位置を取得できます。複数の区切り文字がある場合は、このようにFINDをネストして開始位置を前のFINDの結果に基づかせます。
シナリオ5:ワイルドカードでパターン検出する(SEARCH)
A1の文字列の中に「20XX年」という4桁+「年」のパターンがあるかどうかをSEARCHのワイルドカードで確認します。
' "????"は任意の4文字を表す
=IFERROR(SEARCH("????年", A1), 0)
結果が0より大きければパターンが存在します。FINDではワイルドカードが使えないため、このケースはSEARCHを選びます。IFERROR(SEARCH(…),0)をIF文の条件に使うことで「パターン含む行だけ処理する」絞り込みが実現します。
よくあるエラーと原因・対処法
| エラー | 主な原因 | 対処法 |
|---|---|---|
| #VALUE!(検索失敗) | 検索文字列が対象の中に見つからない(FINDもSEARCHも検索失敗時は#VALUE!を返す) | IFERROR関数で囲み、見つからない場合の既定値(0や””)を返す |
| #VALUE!(開始位置超過) | 開始位置が文字列の長さを超えている(例: 5文字の文字列に開始位置=10を指定) | LEN(対象)で文字数を確認し、開始位置が範囲内になるよう調整する |
| 大文字小文字が一致しない | FINDは大文字・小文字を区別するため”excel”と検索しても”Excel”が見つからない | SEARCHに変更するか、LOWER/UPPER関数で両方を同じケースに統一してからFINDを使う |
| 期待と異なる位置が返る | 全角スペースと半角スペースの混在、コピペ時に不可視文字が混入している | TRIM・CLEAN・ASC/JIS関数で対象文字列を整形してから検索する |
| ワイルドカードが機能しない | FINDでは”?”や”*”はワイルドカードではなく文字として検索される | SEARCHに変更する(FINDで”*”を文字として検索したい場合はFINDで正しい動作) |
ISNUMBERでエラーを回避する:IFERROR以外にも、ISNUMBER(FIND(…))というパターンが使いやすいです。FINDが成功すると数値(位置番号)を返すためISNUMBERがTRUEになり、失敗すると#VALUE!が返るためFALSEになります。
' 文字列に"@"が含まれるか判定(TRUE/FALSEで返す)
=ISNUMBER(FIND("@", A1))
' IF条件に組み込む
=IF(ISNUMBER(FIND("VIP", A1)), "重要顧客", "通常顧客")
FINDBとSEARCHB:バイト数で位置を返すバリアント
FIND・SEARCHには末尾にBがついたFINDB・SEARCHBという関数もあります。違いは文字数ではなくバイト数で位置を返す点です。
| 関数 | 計算単位 | 全角文字 | 半角文字 |
|---|---|---|---|
| FIND・SEARCH | 文字数 | 1文字=1カウント | 1文字=1カウント |
| FINDB・SEARCHB | バイト数 | 1文字=2バイト | 1文字=1バイト |
現在の実務環境でFINDB・SEARCHBが必要になるケースは少ないです。MOS試験でも基本的にFIND・SEARCHの文字数ベースが出題対象です。古いDBシステムとの連携でバイト数を意識する必要がある場合に限り使用します。
FIND・SEARCHをIF条件として使う
「特定の文字が含まれていれば〇〇、そうでなければ〇〇」という条件分岐に組み込む方法を整理します。
' ISNUMBERを使う(推奨・式が短い)
=IF(ISNUMBER(FIND("VIP", A1)), "重要顧客", "通常顧客")
' IFERRORで0/1に変換する(別パターン)
=IF(IFERROR(FIND("VIP", A1), 0) > 0, "重要顧客", "通常顧客")
大文字・小文字を区別しない場合:FINDの代わりにSEARCHを使えば同じ構造で大文字・小文字不問の判定ができます。”VIP”・”Vip”・”vip”のいずれも一致とみなしたいならSEARCHが適切です。
' 大文字小文字問わず"VIP"を含む場合を判定
=IF(ISNUMBER(SEARCH("VIP", A1)), "重要顧客", "通常顧客")
MOS Excel試験でのFIND・SEARCH出題ポイント
MOS Excel 365&2019では、FIND・SEARCHは「数式と関数の使用」スキル項目で、文字列操作関数のひとつとして出題されます。
- 引数の順序:検索文字列→対象→開始位置の順番を正確に入力できる
- FINDとSEARCHの使い分け:大文字・小文字を区別するかどうかの違いを理解し、問題文の指示通りに使い分ける
- MID・LEFT・RIGHTとの組み合わせ:FIND・SEARCHで取得した位置番号をMID・LEFT・RIGHTの文字数引数に渡す複合式が頻出
- LENとの組み合わせ:「区切り文字より右側を全部取り出す」=MID(A1, FIND(” “,A1)+1, LEN(A1))のパターン
- IFERRORとの組み合わせ:検索失敗時のエラー処理を含む式の作成
- ISNUMBERとIF条件への組み込み:特定文字の有無で条件分岐する複合式の作成
MOS試験 FIND・SEARCH関連チェックリスト
| 確認ポイント | 操作内容 | 難易度 |
|---|---|---|
| FIND基本構文の入力 | =FIND(“検索文字”, セル参照)を正しく入力できる | ★☆☆ |
| FIND・SEARCHの使い分け | 大文字・小文字の区別が必要かどうかで関数を選択できる | ★★☆ |
| MIDとの組み合わせ | =MID(A1, FIND(” “,A1)+1, LEN(A1))などの複合式を作成できる | ★★☆ |
| LEFTとの組み合わせ | =LEFT(A1, FIND(“-“,A1)-1)などの複合式を作成できる | ★★☆ |
| IFERRORとの組み合わせ | 検索失敗時に既定値を返す式を作成できる | ★★★ |
| ISNUMBERとIF条件への組み込み | =IF(ISNUMBER(FIND(“文字”,A1)), “あり”, “なし”)の構造を作成できる | ★★★ |
まとめ:FIND・SEARCHは文字列分割の「座標軸」
本記事のポイントをまとめます。
- FINDとSEARCHの役割:文字列の中で指定した文字が何文字目にあるかを返す。この位置番号をMID・LEFT・RIGHTに渡すことで可変長の抽出が実現する
- FINDとSEARCHの違い:FINDは大文字・小文字を区別しワイルドカード非対応。SEARCHは大文字・小文字を区別せずワイルドカード対応
- エラー処理は必須:検索対象が見つからない場合は#VALUE!が返る。IFERRORで囲むかISNUMBERで判定することが実務の基本
- MID+LEN+FINDの組み合わせ:「区切り文字より右側を全部取り出す」典型パターン。氏名・メールアドレス・コード分割で頻用する
- 開始位置引数で2つ目以降を検索:1つ目の区切り文字の位置+1を開始位置に渡すことで2番目の区切り文字を探せる
- ワイルドカードはSEARCHだけ:? や * を使いたい場合は必ずSEARCH(FINDでは文字として扱われる)
- MOS試験では複合式が頻出:FIND/SEARCHだけでなくMID・LEFT・LEN・IFERRORと組み合わせた式の作成が問われる
FIND・SEARCHを習得すると、整形されていないテキストデータから必要な情報を自動抽出できるようになります。氏名分割・住所パース・コード解析など、手作業では時間のかかる処理が関数だけで実現できます。MOS試験対策としては、LEFT・MID・LEN・IFERRORとの組み合わせパターンを繰り返し練習することで、複合式の作成に慣れておきましょう。
