=SEARCH("apple",A2)は、A2でappleが始まる位置を1から数えて返し、大文字と小文字を区別しません。=FIND("apple",A2)も同じですが、大文字と小文字が完全に一致するものだけを探します。文字列が見つからないと、どちらも#VALUE!を返します。
| A | B | C | |
|---|---|---|---|
| 1 | Text | FIND("apple") | SEARCH("apple") |
| 2 | Apple pie | #VALUE! | 1 |
| 3 | Green apple | 7 | 7 |
| 4 | Banana bread | #VALUE! | #VALUE! |
#VALUE! 引数の種類が違います。たとえば数値の場所に文字列があります。Apple pieは大文字のAで始まるので、FINDは一致せず#VALUE!を返し、SEARCHは1を返します。Green appleではどちらも7を返します。スペースも1文字として数えるからです。Banana breadにはappleがまったく含まれていません。
構文
=FIND(find_text, within_text, [start_num])
=SEARCH(find_text, within_text, [start_num])
find_text(検索文字列):探すもの。1文字でも単語でも構いません。within_text(対象):探す対象のセル。start_num(開始位置):探し始める位置で、省略すると1です。結果はそれでもセルの最初の文字から数えた位置になります。
セルに特定の文字が含まれるか
位置そのものが欲しいことはあまりありません。たいていは「このセルにその単語が含まれるか」を知りたいはずです。位置は数値で、見つからないとエラーになるので、ISNUMBERで結果をTRUEかFALSEに変えます:
| A | B | C | |
|---|---|---|---|
| 1 | Note | Contains "late" | Status |
| 2 | Arrived late | TRUE | Check |
| 3 | On time | FALSE | OK |
| 4 | LATE by 2 days | TRUE | Check |
| 5 | Delivered | FALSE | OK |
SEARCHは大文字と小文字を区別しないので、A4のLATEにも一致します。ただしlatestやchocolateにも一致する点に注意してください。SEARCHが探すのは単語ではなく文字の並びです。先頭にスペースを付けて" late"を探すと、少し絞り込めます。単語を含むセルの数を数えるなら=COUNTIF(A2:A5,"*late*")のほうが短く書けます。文字列が入ったセルを数えるを参照してください。
| A | B | |
|---|---|---|
| 1 | Subject | Urgent? |
| 2 | URGENT: server down | |
| 3 | Monthly report | |
| 4 | Refund request, urgent |
やってみよう: B2で、A2の件名にurgentという単語が大文字・小文字を問わず含まれていればTRUE、なければFALSEを返してください。数式はB4まで下にコピーされます。
2番目の位置を探す
start_numを使うと、最初に見つかった位置より後から探し始められます。FINDの中にFINDを入れます。内側のFINDが最初のハイフンを見つけ、外側はその1文字後から探します。
| A | B | C | |
|---|---|---|---|
| 1 | Code | First dash | Second dash |
| 2 | NYC-2041-B | 4 | 9 |
| 3 | BOSTON-15-AA | 7 | 10 |
2つの位置がわかれば、MIDでハイフンの間を取り出せます。=MID(A2,B2+1,C2-B2-1)は2041を返します。
| A | B | |
|---|---|---|
| 1 | Position | |
| 2 | ana@coddy.tech |
やってみよう: B2で、メールアドレスの中の@の位置を返してください。
FINDとSEARCHが#VALUE!を返す
ここでの#VALUE!は「見つからない」という意味でしかありません。役に立つ値に置き換えます:
| A | B | |
|---|---|---|
| 1 | Position of @ | |
| 2 | ana@coddy.tech | 4 |
| 3 | not an email | 0 |
=FIND("@",A2)>0のように、結果をそのまま数値と比べないでください。見つからないとエラーになるので、比較はFALSEではなく#VALUE!を返します。上の節のようにISNUMBERで判定します。
ワイルドカード: SEARCHだけ
SEARCHはワイルドカード?(任意の1文字)と*(任意の文字列)を受け付けます。FINDはそれらを文字そのものとして扱います。Excelでは:
=SEARCH("b?d","a bad day") returns 3
=SEARCH("2*B","NYC-2041-B") returns 5
=SEARCH("~?","Why?") returns 4, the tilde means a real question mark
=FIND("?","Why?") returns 4, FIND has no wildcards
Excelの関数での*、?、~についてはワイルドカードのページで詳しく説明しています。
FIND、SEARCH、Ctrl+Fの違い
| FIND | SEARCH | Ctrl+F | |
|---|---|---|---|
| 大文字と小文字 | 一致が必要 | 区別しない | 「大文字と小文字を区別する」にチェックしない限り区別しない |
| ワイルドカード | なし | ?、*、~ | ?、*、~ |
| 見つからないとき | #VALUE! | #VALUE! | メッセージ |
| 結果 | 位置、再計算される | 位置、再計算される | セルを選択する |
値を一度探すだけなら、ホーム > 検索と選択 > 検索(Ctrl+F、MacではCmd+F)のほうが数式より手早く済みます。すべての行で印を付けたり取り出したりして、結果を更新し続けたいならFINDかSEARCHを使います。大文字と小文字に意味があるとき(abとABのような商品コード)はFINDを、人が入力するものにはSEARCHを選びます。
よくある質問
ExcelのFINDとSEARCHの違いは何ですか?
FINDは大文字と小文字を区別し、ワイルドカードを受け付けません。SEARCHは大文字と小文字を区別せず、?と*を受け付けます。=FIND("a","Apple")は#VALUE!ですが、=SEARCH("a","Apple")は1です。
Excelで2つのハイフンの間の文字列を取り出すには?
両方のハイフンを探し、その間をMIDで取り出します:=MID(A2,FIND("-",A2)+1,FIND("-",A2,FIND("-",A2)+1)-FIND("-",A2)-1)はNYC-2041-Bから2041を返します。Microsoft 365なら=TEXTBEFORE(TEXTAFTER(A2,"-"),"-")のほうが短く書けます。
FINDが#VALUE!を返すのはなぜですか?
セルにその文字列がないか、大文字と小文字が違うからです(FINDは区別します)。別の値を返すように囲みます:=IFERROR(FIND("-",A2),0)。
ある文字の2番目の位置を探すには?
最初に見つかった位置の1文字後から探し始めます:=FIND("-",A2,FIND("-",A2)+1)。3つ目の引数は探し始める位置です。