FIND関数は、ある文字列の中で指定した文字列が最初に現れる位置を返します。基本形は=FIND(検索文字列,対象文字列,[開始位置])で、位置は1から数えます。=FIND("@",A2)なら、A2の@が先頭から何文字目かを返します。FINDは英字の大文字・小文字を区別し、ワイルドカードを使えません。大文字・小文字を区別せず検索したい場合やワイルドカードが必要な場合はSEARCHを使います。見つからない、開始位置が0以下、文字列長を超える場合は#VALUE!になるため、区切り文字の抽出式では入力形式を検査してからMIDやLEFTと組み合わせます。
FINDの三つの引数と戻り値
=FIND("東","東京都")は1を返します。find_textが探す文字列、within_textが検索対象、start_numが検索を始める位置です。start_numは省略でき、省略時は1です。返るのは見つかった文字列の先頭位置で、検索対象全体の先頭から数えた番号です。
FINDは文字列そのものやセル参照を返しません。位置を使ってLEFT、MID、RIGHT、REPLACEなどへ切り出し位置を渡します。単にセル内に含むか判定するなら、=ISNUMBER(FIND("ABC",A2))のようにTRUE・FALSEへ変換できますが、#VALUE!の意味を理解して使います。
大文字と小文字を区別する
FINDはcase-sensitiveです。=FIND("A","apple")は、英字Aとaが異なるため#VALUE!になります。製品コードの大文字・小文字が意味を持つ場合に向きます。単に人名や一般文章を探し、大小を区別しないならSEARCHを選びます。
Microsoftの公式エラー例でも、”gloves”と”Gloves”はFINDでは一致せず、SEARCHでは一致すると説明されています。入力をUPPERやLOWERへ変換してFINDする方法もありますが、元の大小を失ってよいかを確認します。大文字小文字の要件を式の説明へ記録します。
FINDはワイルドカードを使わない
FINDのfind_textに*や?を書いても、任意文字列や一文字を表すワイルドカードとしては扱いません。実際の*や?を探したい場合には、この仕様が便利です。部分パターンをワイルドカードで探すなら、大文字小文字を区別しないSEARCHなどを使います。
「ABCで始まり末尾が数字」のような複雑な形式確認をFINDだけで表すと式が読みにくくなります。補助列、TEXT関数群、Power Query、利用可能なら正規表現関数などを検討します。新関数は配布先のExcel版を確認し、入力検証を一つの巨大な式へ押し込みません。
開始位置は1以上で指定する
第三引数start_numを3にすると、検索対象の3文字目から後ろだけを探します。ただし返る位置は検索開始位置からの相対値ではなく、文字列全体の先頭から数えた位置です。最初の区切りを飛ばして二つ目を探すときに使えます。
start_numが0以下、またはwithin_textの文字数より大きい場合は#VALUE!です。LENで文字数を確認し、セル参照の開始位置が空白やエラーになっていないか調べます。開始位置を計算する式では+1や区切り文字長の加算を忘れないよう、途中値を補助セルで確認します。

二つ目以降の区切り位置を求める
最初のハイフン位置がFIND("-",A2)なら、二つ目は=FIND("-",A2,FIND("-",A2)+1)で探せます。区切りが複数文字の場合は、次の開始位置へLEN(区切り文字)を加えます。同じ区切りが連続する、末尾にある、存在しない入力もテストします。
入れ子が深くなると同じFINDを何度も計算して読みにくくなります。補助列やLETで最初と二番目の位置へ名前を付けると検証しやすくなります。位置が存在しないときにどのエラーを返すかを決め、IFERRORで無条件に空白へ隠しません。
区切り前の文字列を取り出す
A2の「商品名 #123」から#より前を取り出すなら、=LEFT(A2,FIND(" #",A2)-1)のように、区切り位置から1を引いて文字数を作ります。区切りに直前の空白を含めるかを決めます。MicrosoftのFIND資料でもMIDと組み合わせて区切り前を抽出する例が示されています。
区切りがない行ではFINDが#VALUE!になり、式全体もエラーになります。区切りなしを元の文字列として扱うのか、入力異常として表示するのかを決めます。全角の#と半角#、異なるハイフン、ノーブレークスペースが混在すると一致しないため、取り込み元の文字コードと入力ルールを確認します。
区切り後の文字列をMIDで抽出する
メールアドレスの@より後ろは、=MID(A2,FIND("@",A2)+1,LEN(A2)-FIND("@",A2))のように抽出できます。FINDで@の位置を求め、開始位置を一文字後ろへ進め、残り文字数をLENから計算します。ただし@が複数ある、先頭・末尾にある、不正な形式を正しいメールアドレスとみなしてはいけません。
文字列抽出は表示上の整理であり、メールアドレスやURLの安全性・有効性を保証する検証ではありません。外部リンクや認証情報を自動生成する場合、FINDの結果だけを信用せず、許可ドメイン、形式、長さを別に検査します。秘密のトークンや資格情報をワークシートへ展開しません。

含有判定と#VALUE!の扱い
=ISNUMBER(FIND("要確認",A2))は含まれていればTRUE、見つからなければFALSEになります。IFと組み合わせて分類できます。大文字小文字を区別しない判定ならSEARCHを使います。文字列が空の場合、FINDのfind_textに空文字を渡すと開始位置に一致する仕様があるため、検索条件セルが空白のときは予期せずTRUEになる可能性があります。
条件セルが空なら検索しないよう、先にB2=""を確認するなど入力を検証します。IFERRORでFINDのすべてのエラーをFALSEへ変えると、開始位置不正や参照エラーも「含まない」に見えます。想定する未検出と数式エラーを分けて管理します。
文字の種類とUnicodeの注意
現在のFINDは、既定言語にかかわらず単一バイト・二重バイト文字を各1文字として数えるとMicrosoft公式資料にあります。FINDBは非推奨です。互換性バージョン2のブックではサロゲートペアの数え方が改善されますが、絵文字の異体字セレクターは別文字として数えられる場合があります。
人が見て一文字に見える絵文字、結合文字、異体字が、数式上の位置や文字数と一致しないことがあります。氏名や多言語データを固定位置で切り出す前に、実データでLENとFINDの結果を確認します。古いブックの互換性設定を変更する場合は、既存数式の結果差を検証します。
新しいテキスト関数との使い分け
区切り前後の抽出だけなら、新しいExcelのTEXTBEFORE、TEXTAFTER、TEXTSPLITの方が式を読みやすくできる場合があります。複数の区切り、見つからない場合、出現番号を引数で扱えます。一方、利用可能なExcel版が限定され、古い版では#NAME?になります。

社外配布や長期保存では、利用者のExcel版を確認してFIND・MID方式を残すか判断します。関数を置き換える際は、空白、連続区切り、末尾区切り、全角記号、複数出現で新旧結果を比較します。目的が位置番号の取得なら、FINDを使い続ける方が直接的です。
確認チェックリスト
- FINDが1始まりの位置番号を返すと理解する
- 大文字小文字を区別する必要がなければSEARCHを検討する
- FINDではワイルドカードを使えないことを確認する
- start_numは1以上かつ文字列長以内か確認する
- 区切りなし・複数・連続・全角記号の入力をテストする
- #VALUE!を未検出と数式不正に分けて扱う

コメント