SEARCH関数は、ある文字列が別の文字列の何文字目から始まるかを返します。構文は SEARCH(検索文字列,対象文字列,[開始位置]) です。大文字と小文字を区別せず、?と*のワイルドカードを使えます。見つからない場合は#VALUE!です。最初に =SEARCH(“東京”,A2) のような最小式で位置を確認し、「含むか」だけが目的なら =ISNUMBER(SEARCH(“東京”,A2)) と組み合わせます。
SEARCHの基本と3つの引数
第1引数find_textは探す文字、第2引数within_textは検索対象、第3引数start_numは検索を始める位置です。先頭は1です。開始位置を省略すると1になります。たとえばA2が「東京都新宿区」なら、=SEARCH(“新宿”,A2) は4を返します。結果は見つかった文字の番号であり、文字そのものではありません。
=SEARCH("新宿","東京都新宿区") → 4
=SEARCH("a","Database") → 2
=SEARCH("a","Database",3) → 4
SEARCHは大文字・小文字を区別しないため、2番目の例では大文字Aでも小文字aでも一致します。開始位置を3にすると、3文字目以降で次のaを探しますが、返す番号は文字列全体の先頭から数えた位置です。開始位置が0以下、または対象文字数を超える場合も#VALUE!になります。
FINDとの使い分け
FINDも文字位置を返しますが、大文字と小文字を区別し、ワイルドカードを使いません。製品コード「Ab-100」と「AB-100」を別物として扱うならFIND、メールドメインや一般語を大小文字に関係なく探すならSEARCHが適します。日本語の多くは大小文字差がないため同じ結果になりやすいものの、英数字が混在するデータでは明示して選びます。
=SEARCH("excel","Microsoft Excel") → 11
=FIND("excel","Microsoft Excel") → #VALUE!
=FIND("Excel","Microsoft Excel") → 11
全角・半角、ひらがな・カタカナ、濁点の表現などは大小文字の違いとは別です。見た目が似ていても一致しない場合は、LENで文字数を確認し、データ取り込み時の正規化規則を決めます。SUBSTITUTEで無条件に置換する前に、どの表記を正式値とするか所有者へ確認します。
ワイルドカードを使う
SEARCHの検索文字列では、?が任意の1文字、*が0文字以上の任意の文字列に一致します。実際の?や*を探すときは直前に~を付けます。ワイルドカードを含む条件は便利ですが、意図しない広い一致を起こしやすいため、代表データと反例を並べてテストします。
=SEARCH("AB?12",A2) 任意の1文字を含むコード
=SEARCH("*東京*",A2) 東京を含む文字列
=SEARCH("~*",A2) 実際のアスタリスク
「含む」を調べるだけなら、SEARCH自体に前後の*を付ける必要はありません。=SEARCH(“東京”,A2)で途中一致します。*は「東京」と「支店」の間に任意文字があるといったパターンに使います。?は絵文字や結合文字を含むデータで見た目の1文字と数え方が異なる場合があるため、実データで位置を確認します。
含まれるかをTRUE/FALSEで判定する
SEARCHは見つかると数値、見つからないと#VALUE!なので、ISNUMBERで包むとTRUE/FALSEになります。IFと組み合わせれば分類できます。IFERRORで直接「あり」を返す式より、検索結果を数値として検査する意図が読みやすくなります。
=ISNUMBER(SEARCH("至急",A2))
=IF(ISNUMBER(SEARCH("至急",A2)),"優先","通常")

複数語のいずれかを含む判定はORを、すべて含む判定はANDを使えます。ただし語数が増えると保守しにくいため、Microsoft 365の配列機能または別表のキーワード一覧を使う設計を検討します。誤検知を避けるには「無料」が「送料無料」にも一致するなど、部分一致の影響を確認します。
=OR(ISNUMBER(SEARCH("障害",A2)),ISNUMBER(SEARCH("停止",A2)))
=AND(ISNUMBER(SEARCH("東京",A2)),ISNUMBER(SEARCH("営業部",A2)))
区切り位置を見つけて文字を抽出する
SEARCHが返す位置をLEFT、MID、RIGHTと組み合わせると、区切り文字の前後を抽出できます。A2が「ABC-2026-001」のとき、最初のハイフンより前はLEFT、後ろはMIDで取得できます。開始位置と文字数が1ずれるエラーを避けるため、まず区切り位置だけを別セルで確認します。
最初のハイフンより前: =LEFT(A2,SEARCH("-",A2)-1)
最初のハイフンより後: =MID(A2,SEARCH("-",A2)+1,LEN(A2))
区切りがない行ではSEARCHが#VALUE!になります。区切りが任意なら、先にISNUMBERで判定するか、Microsoft 365のTEXTBEFORE、TEXTAFTERが使える環境ではそれらを検討します。末尾までの長さとしてLEN(A2)を指定しても、MIDは存在する末尾までだけ返すため問題ありません。
2個目以降の一致を探す
第3引数へ「最初の一致位置+1」を渡すと2個目を探せます。A2が「姓 名 ミドル」のように空白を複数含む場合、最初と2個目の空白位置を別セルで求めると検算しやすくなります。区切りの連続や全角空白を含むデータでは結果が変わるため、TRIMだけで済むか確認します。
1個目: =SEARCH("-",A2)
2個目: =SEARCH("-",A2,SEARCH("-",A2)+1)
同じ式内でSEARCHを何度も繰り返すと読みにくく計算量も増えます。Microsoft 365でLETが使えるなら位置を一度だけ定義できます。古い版との互換性が必要なら補助列へ位置を出します。関数対応版を確認せず新関数へ置き換えると、別PCで_xlfn.や#NAME?になることがあります。
#VALUE!を順に直す
- 検索文字が対象に本当に含まれるか、余分な空白や表記差を確認する
- 開始位置が1以上かつ対象文字列の長さ以下か確認する
- 大小文字を区別する必要があるならFINDへ切り替える
- 実際の?や*を探す場合は~でエスケープする
- 空白・エラー・数値セルが混在する場合はデータ型を確認する
見つからないことが正常なら、IFERROR(SEARCH(…),0)で0を返す方法もありますが、開始位置の誤りや元セルの別エラーも0に隠れます。含有判定ならISNUMBER、抽出なら区切りの存在確認を先に行う方が原因を追いやすいです。元データの#N/Aなどを区別したい場合は、エラーを一括で空白へ変えません。

実務例:メールドメインを抽出する
A2にメールアドレスがある場合、@の位置を探して右側を取り出せます。ただし@がない、複数ある、前後に空白があるデータをテストします。SEARCHは大文字を区別しないためドメイン判定に向きますが、入力の正当性を完全に検証する関数ではありません。
=IF(ISNUMBER(SEARCH("@",A2)),MID(A2,SEARCH("@",A2)+1,LEN(A2)),"形式確認")
抽出後は件数、空白数、想定外ドメインをピボットテーブルなどで確認します。置換や分類を原列へ値貼り付けせず、補助列で検算してから利用します。個人情報を含むメール一覧は共有範囲を限定し、サンプル資料へ実アドレスを残しません。
検証用データを用意する
検索語が先頭・途中・末尾にある値、存在しない値、空白、大小文字違い、?や*を含む値、全角空白、2個以上の一致を用意します。各行に期待位置または期待判定を書き、式の結果と比較します。位置が必要なのか、含有判定なのか、抽出なのかを列名に明示すると、後から式を読む人が目的を誤りません。
SEARCHは単体では文字位置を返すだけですが、ISNUMBERで分類、MIDで抽出、REPLACEで置換へつなげられます。広い一致や#VALUE!を無理に隠さず、データの表記規則と境界例を確認することが、安定した情報探索の要点です。

コメント