文字列の位置を調べるSEARCH関数とFIND関数
2017.05.23文字列操作関数
ある文字列がセル内の何文字目か調べるSEARCH関数と、同じような動作をするFIND関数について解説します。
実際に操作できるダウンロードファイルはこちらです。ぜひ操作してみましょう。
SEARCH関数の使い方
まず、SEARCH関数で探す文字が何文字か調べる方法を解説します。
使い方は次の通りです。
=SEARCH(探す文字列,探すセル)
「文字の位置」シートをご覧下さい。

セルB2に文が入力されています。
セルB5より下のセルに探す文字列があり、これからセルC5から下の空欄にそれぞれの文字列の位置を求めます。
では、セルC5に、セルB2の文の中で、セルB5の「ざ」の文字が何文字目から始まっているか以下の計算式を入力し求めてみましょう。
=SEARCH(B5,$B$2)
セルB2は後でコピーすることを考え、絶対参照にします。
「ざ」は6文字目ということがわかりました。

ではセルC5に式をC6からC9の範囲にコピーしましょう。

関数の結果ですが、
「よろしく」の文字列は14文字目から始まります。
「昨日」の文字列は文の中にないので「#VALUE」エラーになります。
「。」は2つ入力されていますが、初めの方の「。」の位置の10が求められます。
音読みの「願」として入力された文字でも訓読みで入力された「願」の文字の位置を求めます。
SEARCH関数の組み合わせ
SEARCH関数はMID関数などの文字列関数と組み合わせると便利です。
MID関数、LEFT関数、RIGHT関数の文字列を抜き出す関数については、こちらを参照してください。
ここで、「データの分割」シートをご覧下さい。

A列には縦、横、高さのサイズがW、D、Hの文字で区切られています。
B列からD列の空欄にそれぞれの数値を求めましょう。
セルB2はセルA1の値の中のWからDの文字の間の数値です。
計算式は、"W"の文字の次から、("D"の文字の次の文字の位置-"W"の文字の位置)文字分を取り出すことになります。
後からコピーすることを考え、計算の元になるセルに、複合参照を指定します。
=MID($A2,SEARCH(B$1,$A2)+1,SEARCH(C$1,$A2)-SEARCH(B$1,$A2)-1)

この計算式で使用しているセルの位置関係は、セルB2からセルC12までの範囲で変わりません。このため、まず、セルB2をセルC2へコピーし、セルB2とセルC2を範囲選択したまま、12列までコピーします。

セルD2は、"H"の文字の位置以降を取り出すことになります。文字数は多めに10文字分と設定しました。
=MID($A2,SEARCH(D$1,$A2)+1,10)

この計算式をD3からD12までの範囲にコピーし完成です。

この求めた値は、左に揃うことでもわかりますが、文字列になっています。
Excelは数値の計算としては文字列のままでも計算しますが、MID関数の外側をVALUE関数で囲むなど、数値に変換しておくとよりよいです。
半角文字でカウントする
SEARCH関数は、あくまで文字数をカウントします。
コンピュータの内部では、半角英数と全角文字では、1文字のサイズが違います。半角英数は1バイト文字、全角文字は2バイト文字と呼ばれており、このバイト単位でカウントする場合は、関数名にBが付く、SEARCHB関数を利用します。
=SEARCH("1","あいう1")
は、4文字目ですが、
=SEARCHB("1","あいう1")
は、7バイト目になります。
文字列があるかどうかをチェックする
SEARCH関数は、文字列があれば数字を表示し、数字がなければエラー「#VALUE」エラーとなります。
この仕組みを使って、セルA1に「りんご」の文字が含まれているかチェックすることができます。
=IF(ISERROR(SEARCH("りんご",A1)), "含まれない","含まれる")
もし、セルA1に「りんご」の文字列が含まれる場合は、エラーではない値となり、ISERROR関数の結果が「ではない(FALSE)」になるため、「含まれる」と表示されます。
FIND関数
SEARCH関数とよく似た関数にFIND関数があります。
特別なことがなければ、どちらも同じ同じ動作をします。
違いは、FIND関数は、検索文字列にワイルドカードが使えません。
ワイルドカード文字として"*"や"?"を使って検索する場合、FIND関数を使うとワイルドカード文字は検索する文字となります。
「(有料)」「(無料)」のどちらも検索対象としたい場合は、SEARCH関数で次のような式になります。
=SEARCH("(?料)",A1)
つまり、ワイルドカードで使う文字"*"や"?"を自体を検索する場合は、FIND関数を使うとよいでしょう。
=FIND("*","500*100*30")