FIND・SEARCH関数の使い方|文字の位置を検索
FIND関数とSEARCH関数は、文字列の中から特定の文字や文字列が何文字目にあるかを返す関数です。MID関数やLEFT関数と組み合わせることで、文字列の分割や部分抽出に活用できます。この記事では、2つの関数の違いと実務での使い方を解説します。
各関数の基本構文
FIND関数
=FIND(検索文字列, 対象, [開始位置])
SEARCH関数
=SEARCH(検索文字列, 対象, [開始位置])
引数の説明
| 引数 | 説明 | 必須/任意 |
|---|---|---|
| 検索文字列 | 検索する文字や文字列 | 必須 |
| 対象 | 検索対象の文字列やセル参照 | 必須 |
| 開始位置 | 検索を開始する位置(省略時は1) | 任意 |
両関数とも、検索文字列が見つからない場合は#VALUE!エラーを返します。
FIND関数とSEARCH関数の違い
| 項目 | FIND関数 | SEARCH関数 |
|---|---|---|
| 大文字・小文字の区別 | 区別する | 区別しない |
| ワイルドカード | 使用不可 | 使用可能(*、?) |
| 全角・半角の区別 | 区別する | 区別する |
| 対応バイト版 | FINDB | SEARCHB |
大文字・小文字の違いを確認
A2に「Excel Function」が入力されている場合の例です。
| 数式 | 結果 | 説明 |
|---|---|---|
| =FIND(“e”, A2) | 4 | 小文字のeは4文字目(Excelのe) |
| =FIND(“E”, A2) | 1 | 大文字のEは1文字目 |
| =SEARCH(“e”, A2) | 1 | 大文字小文字を区別しないのでEが1文字目 |
| =SEARCH(“E”, A2) | 1 | 同上 |
ワイルドカードの使用
SEARCH関数ではワイルドカードが使えます。
| ワイルドカード | 意味 | 例 |
|---|---|---|
| * | 任意の文字列(0文字以上) | “東京*区” |
| ? | 任意の1文字 | ”A?C” |
=SEARCH("東京*区", A2)
この数式は「東京」で始まり「区」で終わるパターンを検索します。「東京都渋谷区」のような文字列に対して、「東京」の位置(1)を返します。
実践例1:メールアドレスの分割
ユーザー名とドメインを分離
メールアドレスを@マークの前後で分割します。
| A列(メールアドレス) | B列(ユーザー名) | C列(ドメイン) | |
|---|---|---|---|
| 2 | [email protected] | tanaka | example.com |
| 3 | [email protected] | suzuki | company.co.jp |
| 4 | [email protected] | sato | mail.example.org |
B列(ユーザー名)の数式です。@マークより前の部分をLEFT関数で抽出します。
=LEFT(A2, FIND("@", A2)-1)
C列(ドメイン)の数式です。@マークより後の部分をMID関数で抽出します。
=MID(A2, FIND("@", A2)+1, LEN(A2))
MID関数の第3引数に大きな数を指定しても、文字列の末尾までしか返されないため、LEN関数の結果をそのまま指定して問題ありません。
@マークが含まれない場合のエラー処理
@マークが含まれないデータがあるとFIND関数が#VALUE!エラーを返します。IFERROR関数で対処します。
=IFERROR(LEFT(A2, FIND("@", A2)-1), "形式エラー")
実践例2:氏名の姓と名を分割
スペース区切りの氏名を分割
姓と名がスペースで区切られた氏名を分割します。
| A列(氏名) | B列(姓) | C列(名) | |
|---|---|---|---|
| 2 | 田中 太郎 | 田中 | 太郎 |
| 3 | 鈴木 花子 | 鈴木 | 花子 |
| 4 | 佐藤 次郎 | 佐藤 | 次郎 |
B列(姓)の数式です。
=LEFT(A2, FIND(" ", A2)-1)
C列(名)の数式です。
=MID(A2, FIND(" ", A2)+1, LEN(A2))
全角スペースにも対応する方法
全角スペースと半角スペースのどちらで区切られているかわからない場合は、SUBSTITUTE関数で統一してから検索します。
=LEFT(SUBSTITUTE(A2," "," "), FIND(" ", SUBSTITUTE(A2," "," "))-1)
まずSUBSTITUTE関数で全角スペースを半角スペースに変換し、その結果に対してFIND関数で検索します。
実践例3:ファイルパスから情報を抽出
ファイル名の抽出
ファイルパスから最後の「\」以降のファイル名を抽出します。
A2に「C:\Users\tanaka\Documents\報告書.xlsx」が入力されている場合、最後の「\」の位置を特定する必要があります。
FIND関数は最初に見つかった位置を返すため、最後の「\」を直接検索できません。SUBSTITUTE関数で「\」をCHAR(1)(出現しにくい文字)に置換して処理します。
=MID(A2, FIND(CHAR(1), SUBSTITUTE(A2, "\", CHAR(1), LEN(A2)-LEN(SUBSTITUTE(A2,"\",""))))+1, LEN(A2))
この数式の仕組みは以下の通りです。
- SUBSTITUTE関数で最後の「\」だけをCHAR(1)に置換する
- FIND関数でCHAR(1)の位置を検索する
- MID関数でその位置以降の文字列を抽出する
拡張子の抽出
ファイル名から拡張子を抽出します。
=MID(A2, FIND(CHAR(1), SUBSTITUTE(A2, ".", CHAR(1), LEN(A2)-LEN(SUBSTITUTE(A2,".",""))))+1, LEN(A2))
最後の「.」の位置を特定し、それ以降の文字列を抽出しています。
実践例4:N番目の区切り文字の位置を検索
2番目のハイフンの位置を検索
「ABC-123-XYZ」のような文字列で、2番目のハイフンの位置を検索します。開始位置引数を活用します。
=FIND("-", A2, FIND("-", A2)+1)
最初のFIND関数で1番目のハイフンの位置を取得し、その次の位置から再度検索することで2番目のハイフンの位置が得られます。
3番目の区切り文字の位置
同様に3番目のハイフンの位置を検索する場合です。
=FIND("-", A2, FIND("-", A2, FIND("-", A2)+1)+1)
FIND関数を入れ子にすることで、N番目の区切り文字を検索できます。
商品コードの各パートを抽出
「DEPT-CATEGORY-SERIAL」形式の商品コードを分割します。A2に「EL-TV-00123」が入力されている場合です。
部門コードの抽出(1番目のハイフンより前)は次の通りです。
=LEFT(A2, FIND("-", A2)-1)
カテゴリコードの抽出(1番目と2番目のハイフンの間)は次の通りです。
=MID(A2, FIND("-",A2)+1, FIND("-",A2,FIND("-",A2)+1)-FIND("-",A2)-1)
シリアル番号の抽出(2番目のハイフンより後)は次の通りです。
=MID(A2, FIND("-",A2,FIND("-",A2)+1)+1, LEN(A2))
特定の文字が含まれるかを判定
文字列の含有チェック
FIND関数やSEARCH関数を使って、特定の文字列が含まれているかどうかを判定できます。
=IF(ISNUMBER(FIND("東京", A2)), "含む", "含まない")
FIND関数は文字列が見つかると数値を返し、見つからないと#VALUE!エラーを返します。ISNUMBER関数でエラーかどうかを判定しています。
大文字小文字を区別しない検索
大文字小文字を区別せずに判定する場合はSEARCH関数を使います。
=IF(ISNUMBER(SEARCH("excel", A2)), "含む", "含まない")
FINDB・SEARCHB関数と互換性
FINDB関数とSEARCHB関数は、バイト単位で位置を返す関数です。半角文字を1バイト、全角文字を2バイトとしてカウントします。通常の業務ではFIND関数とSEARCH関数で十分ですが、バイト数ベースの処理が必要な場合に使用します。
=FINDB("渋谷", "東京都渋谷区")
この場合、「渋谷」は7バイト目から始まるため、結果は7です。FIND関数であれば4を返します。
Google スプレッドシートでの互換性
FIND関数とSEARCH関数はGoogle スプレッドシートでも同じ構文で利用可能です。ただし、FINDB関数とSEARCHB関数はGoogle スプレッドシートではサポートされていません。
まとめ
FIND関数とSEARCH関数は、文字列の位置を検索する基本的な関数です。
- FIND関数は大文字・小文字を区別し、SEARCH関数は区別しない
- SEARCH関数はワイルドカード(*、?)が使用できる
- MID関数やLEFT関数と組み合わせて文字列の分割に活用できる
- 開始位置引数を使ってN番目の区切り文字を検索できる
- ISNUMBER関数と組み合わせて文字列の含有判定ができる
- 検索文字列が見つからない場合は#VALUE!エラーになるため、IFERROR関数でエラー処理を行う
文字列の抽出や分割の処理において、位置検索は不可欠な操作です。LEFT関数、MID関数、LEN関数と合わせて使いこなしてください。