スプレッドシートのFIND関数の使い方|文字位置の求め方と切り出し

スポンサーリンク

スプレッドシートで名簿を整理していて、「メールアドレスの@より前だけ取り出したい」と思ったことはありませんか?商品コードの真ん中だけ欲しい、特定の文字を含む行に印を付けたい、という場面もよくありますよね。

困るのは、データごとに文字数がバラバラなことです。LEFT関数で「先頭から6文字」と決め打ちすると、名前の長さが違う行で結果がずれてしまいます。

そこで役立つのがFIND関数。区切り文字が何文字目にあるかを求めれば、長さが違うデータでも同じ数式で切り出せます。この記事では、基本の書き方から切り出し・含む判定・#VALUE!の対処まで、コピペで試せる例で解説します。

FIND関数とは?スプレッドシートでの構文・引数とSEARCHとの違い

FIND関数は、文字列の中で特定の文字が何文字目にあるかを数値で返す関数です。読み方は「ファインド」で、英語の find(見つける)が由来になっています。

たとえば「tanaka@example.com」の「@」は7文字目なので、FIND関数は「7」を返します。位置がわかれば、その前後を別の関数で切り出せるわけです。

基本構文と引数(戻り値は1始まり)

=FIND(検索文字列, 検索対象のテキスト, [開始位置])
引数必須/省略可内容
検索文字列必須探したい文字・文字列
検索対象のテキスト必須探す対象となる文字列やセル
開始位置省略可何文字目から探すか(省略すると1)

戻り値は最初に見つかった位置で、先頭の文字を「1」と数えます。複数文字を探したときは、その先頭文字の位置が返ります。

もう1つ大事なのが引数の順番。FINDは「探す文字 → 探す場所」の順で、SPLITやSUBSTITUTEとは並びが逆です。逆に書くと #VALUE! になることがあるので、「何を、どこから」と覚えておくと迷いません。

第3引数(開始位置)の使いどころ

開始位置を指定すると、途中の文字から検索を始められます。同じ文字が何度も出てくるとき、2番目以降を探すのに役立ちますよ。

数式結果理由
=FIND("客", "隣の客はよく柿食う客だ")3先頭から探し、最初の「客」が3文字目
=FIND("客", "隣の客はよく柿食う客だ", 7)107文字目の「柿」から探し、次の「客」が10文字目

開始位置に「1番目の位置+1」を入れれば、位置のわからない2番目の文字も探せます。この入れ子の書き方は、実務例1で使いますね。

FINDとSEARCHの比較表

文字の位置を調べる関数には、よく似たSEARCHもあります。構文と引数の並びは同じで、違いは次の2点です。

項目FINDSEARCH
大文字・小文字区別する区別しない
ワイルドカード(* ? ~)使えない使える
向いている用途英字の大小まで正確に探す表記ゆれを気にせず探す

「@」「-」「/」のような記号には大文字・小文字がないため、どちらでも結果は同じです。「CSV」と「csv」を分けたいならFIND、まとめて拾いたいならSEARCHを選びましょう。

ワイルドカードの使い方など詳しい比較は、スプレッドシートのSEARCH関数の使い方で解説しています。

基本の使い方:文字の位置を求める

ここからは、A2セルに「tanaka@example.com」が入っている前提で試します。数式は空いているセルに入力してください。

記号・文字列の位置を求める

数式結果理由
=FIND("@", A2)7@は7文字目
=FIND("example", A2)8「example」の先頭のeが8文字目
=FIND("a", A2)2最初に見つかったaの位置
=FIND("com", A2)16「com」のcが16文字目

「a」は文字列の中に4つありますが、返るのは最初の2文字目だけです。2番目以降が欲しいときは、先ほどの第3引数を使いましょう。

大文字小文字を区別する例

FINDは英字の大文字・小文字を別の文字として扱います。A2の先頭は小文字の「t」なので、大文字の「T」を探すと見つからず #VALUE! になります。

数式結果
=FIND("T", A2)#VALUE!
=FIND("t", A2)1
=FIND("a", "ABC-abc")5
=SEARCH("a", "ABC-abc")1

FINDは小文字の「a」だけを探すので、5文字目を返します。一方のSEARCHは大文字の「A」も同じとみなすため、1文字目が答えです。

英字コードの大小を区別して「まったく同じか」を比べたいだけなら、EXACT関数のほうが手軽ですよ。

日本語も1文字ずつ数える

FINDは漢字やひらがなも1文字として数えます。たとえば =FIND("-", "東京-渋谷-A101") の結果は3です。「東」「京」の次、3文字目にハイフンがあるからですね。

全角を2として数えるバイト位置が必要ならFINDB関数を使いますが、通常の切り出しならFINDで十分でしょう。

実務例1:LEFT・MID・RIGHTで文字列を切り出す

FIND関数の本領は、切り出し用の関数と組み合わせたときに発揮されます。FINDで求めた位置を、LEFT・MID・RIGHTに渡すのが定番です。

関数役割
LEFT(文字列, 文字数)先頭から指定した文字数を取り出す
MID(文字列, 開始位置, 文字数)途中の位置から指定した文字数を取り出す
RIGHT(文字列, 文字数)末尾から指定した文字数を取り出す
LEN(文字列)文字列全体の文字数を返す

MIDとRIGHTの詳しい使い方は、MID関数の記事とRIGHT関数の記事も参考にしてください。

メールアドレスの@前後を分ける

A2の「tanaka@example.com」を、@の前(ユーザー名)と後ろ(ドメイン)に分けてみましょう。

=LEFT(A2, FIND("@", A2)-1)
=RIGHT(A2, LEN(A2)-FIND("@", A2))

1つ目は、@の位置7から1を引いた6文字を先頭から取り出すので「tanaka」。2つ目は全体の18文字から7を引いた11文字を末尾から取り、「example.com」を返します。

A列(元データ)@より前@より後ろ
tanaka@example.comtanakaexample.com
sato@gmail.comsatogmail.com
k.suzuki@sample.co.jpk.suzukisample.co.jp

名前の長さが行ごとに違っても、同じ数式をコピーするだけで正しく分けられます。

2番目の区切り文字の位置を求めて真ん中を取る

今度はA2に「東京-渋谷-A101」が入っているとします。真ん中の「渋谷」を取るには、2番目のハイフンの位置が必要です。ここで活躍するのが第3引数。

=FIND("-", A2, FIND("-", A2)+1)

内側の FIND("-", A2) が、1番目のハイフンの位置3を返します。+1した4文字目から探し直すので、2番目のハイフンの位置6が見つかる仕組みです。

取り出す部分数式結果
先頭=LEFT(A2, FIND("-", A2)-1)東京
真ん中=MID(A2, FIND("-", A2)+1, FIND("-", A2, FIND("-", A2)+1)-FIND("-", A2)-1)渋谷
末尾=RIGHT(A2, LEN(A2)-FIND("-", A2, FIND("-", A2)+1))A101

真ん中の数式は長く見えますが、1番目の次の位置から「2番目の位置 − 1番目の位置 − 1」文字を取っているだけです。今回なら4文字目から2文字なので、結果は「渋谷」になるわけですね。

同じ数式を下の行にコピーすると、地名の長さが違っても正しく分かれます。

A列(元データ)先頭真ん中末尾
東京-渋谷-A101東京渋谷A101
神奈川-横浜-C7神奈川横浜C7
大阪-梅田-B12大阪梅田B12

区切りが3つ、4つと増えると入れ子が長くなるので、後半で紹介するSPLITで一気に分けるほうが楽ですよ。

ファイル名から拡張子を取り出す

ファイル名のピリオドより後ろを取れば、拡張子だけを抜き出せます。

=RIGHT(A2, LEN(A2)-FIND(".", A2))
A列(元データ)LENFIND(“.”)結果
report.pdf107pdf
sales.xlsx106xlsx
見積書.docx84docx

拡張子が3文字でも4文字でも、同じ数式で取り出せます。

注意したいのは、ピリオドが複数あるファイル名。FINDは最初のピリオドを見つけるため、「data.2024.csv」では「2024.csv」が返ってしまいます。最後のピリオドより後ろだけ欲しいなら、REGEXEXTRACTで「csv」だけを取り出しましょう。

=REGEXEXTRACT(A2, "[^.]+$")

実務例2:セルに特定の文字を含むか判定する

FINDは見つかれば数値、見つからなければ #VALUE! を返します。この性質を利用すると、「この文字を含むかどうか」をTRUE/FALSEで判定できるのです。

ISNUMBER(FIND())でTRUE/FALSE判定

ISNUMBER関数は、値が数値ならTRUE、それ以外ならFALSEを返す関数です。FINDの結果を包むと、エラーの代わりにFALSEが表示されます。

=ISNUMBER(FIND("@example.com", A2))
A列(元データ)結果
tanaka@example.comTRUE
sato@gmail.comFALSE
suzuki@example.comTRUE
yamada@Example.comFALSE

4行目に注目してください。ドメインの「E」が大文字なので、FINDでは別の文字列とみなされてFALSEになります。

メールアドレスのように大小の表記ゆれが混ざるデータなら、=ISNUMBER(SEARCH("@example.com", A2)) に替えれば4行目もTRUEになりますよ。

IFと組み合わせた分類

TRUE/FALSEのままでは見づらいので、IF関数で表示を変えるのが実務の定番です。

=IF(ISNUMBER(FIND("@example.com", A2)), "社内", "社外")

上の表に当てはめると、tanakaとsuzukiが「社内」、satoとyamadaが「社外」になります。

条件を増やしたいときは、IFを入れ子にしましょう。商品コードに含まれる色の記号で分類する例です。

=IF(ISNUMBER(FIND("RED", A2)), "赤", IF(ISNUMBER(FIND("BLU", A2)), "青", "その他"))
A列(商品コード)結果
ABC-001-RED赤
ABC-002-BLU青
XYZ-010-GRNその他
ABC-003-redその他

4行目は小文字の「red」なので、「RED」と一致せず「その他」になります。大小の違いで分類から漏れる点に注意しましょう。

条件が3つ、4つと増えるなら、後述のREGEXMATCHでまとめて書くほうが読みやすくなります。

ARRAYFORMULAで列を一括処理

行が増えるたびに数式をコピーするのが面倒なら、スプレッドシートならではのARRAYFORMULAが便利です。B2に次の数式を1つ入れるだけで、@より前が下の行まで広がります。

=ARRAYFORMULA(IFERROR(LEFT(A2:A, FIND("@", A2:A)-1), ""))
A列(元データ)B列(結果)
tanaka@example.comtanaka
sato@gmail.comsato
(空白)(空白)
suzuki-example.com(空白)

ポイントは、全体をIFERRORで包んでいること。空白行や@のない行があっても、エラー表示を出さずに空欄にできます。

社内・社外の判定も同じように一括処理できます。IF(A2:A="", "", …) で空白行を除外すれば、データのない行は空欄のままです。

=ARRAYFORMULA(IF(A2:A="", "", IF(ISNUMBER(FIND("@example.com", A2:A)), "社内", "社外")))

なお、結果を広げる先のセルに値が残っていると、展開できずにエラーになります。B3以下は先に空けておきましょう。

#VALUE!の原因と対処、FINDで足りないときの代替

FINDでいちばんよく見るエラーが #VALUE! です。原因を切り分けてから、IFERRORで処理するか、別の関数に乗り換えるかを決めましょう。

#VALUE!が出る主な原因

原因例対処
検索文字列が含まれていない=FIND("@", "tanaka")IFERRORで処理する/データを確認する
大文字・小文字が違う=FIND("T", "tanaka")大小を区別しないならSEARCHに替える
引数の順序が逆=FIND(A2, "@")「検索文字列, 対象」の順に直す
入れ子の1つ目が見つからない「東京渋谷A101」で2番目のハイフンを探すIFERRORで区切りなしの行を分ける

見落としやすいのは4つ目です。2番目の区切りを探す数式は、1番目のFINDの結果を開始位置に使っています。区切りが1つもない「東京渋谷A101」や、1つしかない「東京-渋谷」では式全体が #VALUE! になります。

IFERRORで安全に処理する

見つからない行があり得るデータでは、IFERROR関数で包んでおくのが基本です。

=IFERROR(FIND("@", A2), 0)
=IFERROR(LEFT(A2, FIND("@", A2)-1), "要確認")

1つ目は、@が見つからなければ0を返します。2つ目は@のないデータに「要確認」と表示するので、入力ミスの洗い出しにも役立ちますよ。

ただし、IFERRORは数式の書き間違いによるエラーまで隠してしまいます。まずはIFERRORなしで結果を確かめ、問題がないとわかってから最後に包むのがおすすめです。

REGEXMATCH・REGEXEXTRACT・SPLITに乗り換える基準

FINDは「1つの文字列の位置を探す」のが得意な関数です。「候補が複数ある」「区切りが3つ以上ある」「パターンで探したい」に当てはまったら、乗り換えを考えてみてください。

やりたいこと向いている関数例(A2=東京-渋谷-A101)結果
複数の候補のどれかを含むか判定REGEXMATCH下のコードを参照TRUE
パターンに合う部分を抜き出すREGEXEXTRACT=REGEXEXTRACT(A2, "[0-9]+")101
区切り文字で全部分けるSPLIT=SPLIT(A2, "-")東京/渋谷/A101(3列)
n番目の区切りの位置を探すSUBSTITUTE+FIND=FIND("#", SUBSTITUTE(A2, "-", "#", 2))6

REGEXMATCHは、縦棒(|)で区切った候補のどれかを含むかを一度に判定できます。

=REGEXMATCH(A2, "東京|大阪")

A2は「東京」を含むのでTRUE。ISNUMBER(FIND())をいくつも並べるより、ずっと短く書けます。詳しくはREGEXMATCH関数とREGEXEXTRACT関数の記事で解説しています。

区切りが多いデータなら、SPLIT関数が一番の近道です。右隣のセルに結果が広がるので、右側は空けておきましょう。

表の4行目は、SUBSTITUTE関数で2番目のハイフンだけを「#」に置き換えてから探す方法です。3番目なら第4引数を3にするだけで済みます。ただし、データに「#」が含まれないことが前提になる点には注意しましょう。

FINDで求めた位置を使って、文字を置き換えることもできます。たとえば@より後ろを伏せ字にするなら、REPLACE関数と組み合わせます。

=REPLACE(A2, FIND("@", A2)+1, LEN(A2)-FIND("@", A2), "***")

A2が「tanaka@example.com」なら、結果は「tanaka@***」です。

まとめ・よくある質問

スプレッドシートのFIND関数の要点を整理します。

ポイント内容
構文=FIND(検索文字列, 検索対象のテキスト, [開始位置])
戻り値最初に見つかった位置(1始まり)
大文字・小文字区別する(区別しないならSEARCH)
2番目の位置第3引数に「1番目の位置+1」を入れる
切り出し求めた位置をLEFT・MID・RIGHTに渡す
含む判定ISNUMBER(FIND()) でTRUE/FALSE
見つからないとき#VALUE!になる(IFERRORで処理)

FINDは単体だと「位置を返すだけ」の地味な関数です。それでも切り出しや判定と組み合わせれば、名簿やコード表の整理がぐっと楽になりますよ。まずはメールアドレスの@より前を取り出す数式から試してみてください。

よくある質問

Q. FINDとSEARCHはどちらを使えばいいですか?

「@」や「-」のような記号を探すだけなら、どちらでも同じ結果です。英字の大小を区別したいならFIND、表記ゆれを気にせず探したいならSEARCHを選びましょう。

Q. 「含む」かどうかだけを知りたいときは?

=ISNUMBER(FIND("探す文字", A2)) でTRUE/FALSEが返ります。候補が複数あるなら、REGEXMATCHのほうが短く書けて便利です。

Q. ExcelのFIND関数と同じですか?

構文は同じ形なので、LEFT・MID・RIGHTと組み合わせる考え方はそのまま使えます。ただしARRAYFORMULAはスプレッドシートの関数です。Excelでの使い方はExcelのFIND関数の使い方を参考にしてください。

タイトルとURLをコピーしました