スプレッドシートで全角半角混在のデータを整形していると、「特定の記号が先頭から何バイト目にあるか知りたい」という場面、ありませんか。固定長データで区切り文字の位置を特定して、そこから前後にフィールドを分解したい、なんてケースもよくありますよね。
FIND関数だと「文字数」でしか位置を返してくれないので、全角が混ざるとMIDBに渡すバイト位置としては使えないんですよね。そんなときにピッタリ使えるのが、スプレッドシートのFINDB関数です。全角2バイト・半角1バイトでカウントしながら、指定した文字が何バイト目に出現するかをサクッと返してくれますよ。
この記事では、スプレッドシートのFINDB関数の構文から、FIND関数やSEARCHB関数との違い、MIDBと組み合わせて固定長データを動的に切り出す実務パターンまで紹介します。区切り文字ベースのフィールド分解テンプレートも置いておきますね。
スプレッドシートのFINDB関数とは?
スプレッドシートのFINDB関数は、文字列の中で指定した検索文字列が何バイト目から始まるかを返す関数です。読み方は「ファインド・ビー」で、FIND(検索)と Byte(バイト)を組み合わせた名前ですよ。
全角文字は2バイト、半角文字は1バイトとしてカウントします。大文字と小文字を区別するのがポイントで、”A” と “a” は別物として扱われますよ。
関数の基本構文と引数
基本構文はシンプルで、引数は3つです。
=FINDB(検索文字列, 対象文字列, [開始位置])
引数の意味を整理しておきましょう。
| 引数 | 意味 | 省略時の挙動 |
|---|---|---|
| 検索文字列 | 探したい文字や記号 | 省略不可 |
| 対象文字列 | 検索される側の文字列 | 省略不可 |
| 開始位置 | 検索を開始するバイト位置 | 省略時は1(先頭から) |
開始位置に小数を指定した場合は、整数部分に切り捨てられます。0以下を指定したり、見つからない文字列を指定したりすると #VALUE! エラーになるので、気をつけてくださいね。
FIND関数との違い(文字数 vs バイト数)
FIND関数とFINDB関数は、返ってくる位置の単位が違います。ここを押さえておくと、使い分けで迷いません。
- FIND: 検索文字列が先頭から「何文字目」にあるかを返す。全角・半角を区別しない
- FINDB: 検索文字列が先頭から「何バイト目」にあるかを返す。全角=2バイト、半角=1バイトで計算
たとえば「商品A-100」という文字列で、”-“(ハイフン)の位置を調べた場合はこうなります。
| 数式 | 結果 | 解説 |
|---|---|---|
=FIND("-", "商品A-100") | 4 | 先頭から4文字目(商・品・A・-) |
=FINDB("-", "商品A-100") | 6 | 先頭から6バイト目(商2+品2+A1+-=6バイト目スタート) |
MIDB関数やLEFTB関数と組み合わせるなら、必ずFINDB関数側を使ってくださいね。FINDの結果をバイト系関数に渡すとズレてしまいます。
FINDBとSEARCHBの違い(大小区別の有無)
似たような関数にSEARCHB関数があります。こちらもバイト単位で位置を返してくれる関数ですが、大小区別とワイルドカードの扱いが違います。
| 関数 | 大文字小文字 | ワイルドカード |
|---|---|---|
| FINDB | 区別する | 使えない(リテラル検索のみ) |
| SEARCHB | 区別しない | * や ? が使える |
商品コードのように「A と a は別物として扱いたい」「ワイルドカードじゃなくきっちり文字列一致で探したい」場合はFINDB、あいまい検索でいい場合はSEARCHBを選ぶ、という整理ですよ。
FINDB関数の基本的な使い方
それでは実際に使ってみましょう。バイト位置のカウント方法を意識すると、結果がイメージしやすくなります。
全角・半角が混在する文字列での挙動
代表的なパターンをいくつか並べてみますね。
| 数式 | 結果 | バイトの内訳 |
|---|---|---|
=FINDB("う", "あいうえお") | 5 | 「う」は先頭から5バイト目(あ2+い2+う=5バイト目スタート) |
=FINDB("C", "ABCDE") | 3 | 半角3文字目=3バイト目 |
=FINDB("関", "Excel関数") | 6 | 半角5バイト+「関」で6バイト目スタート |
=FINDB("a", "ABCabc") | 4 | 小文字「a」は4バイト目(大文字とは区別) |
4行目に注目してください。FINDBは大文字小文字を区別するので、”A” で検索すると1、”a” で検索すると4が返ってきます。ここが曖昧検索のSEARCHBとは違うところですよ。
引数「開始位置」の使い方
開始位置を指定すると、その位置から右側だけを検索対象にできます。同じ文字が複数回出てくる文字列で「2番目の位置」を調べたいときに便利ですよ。
=FINDB("-", "A-100-XYZ") → 2 (1番目のハイフン)
=FINDB("-", "A-100-XYZ", 3) → 6 (3バイト目以降で探した1番目)
1番目のハイフン位置をFINDBで求めて、その次のバイトから2番目を探す、という入れ子にすると、動的に区切り位置を追えます。
=FINDB("-", A2, FINDB("-", A2) + 1)
A2にデータを入れておけば、「2番目のハイフンは何バイト目か」が求められますよ。
実務で使えるFINDB関数の活用パターン
FINDB関数が本領を発揮するのは、固定長ファイルの動的解析や区切り文字ベースのフィールド分解です。よく出てくる3パターンを紹介しますね。
区切り文字で動的にフィールドを切り出す
全角半角が混ざった「氏名@メールアドレス」形式のデータから、@の前後を切り分けたいときに使えます。
氏名部分: =LEFTB(A2, FINDB("@", A2) - 1)
メール部分: =MIDB(A2, FINDB("@", A2) + 1, LENB(A2))
FINDBで@の位置をバイトで特定して、LEFTBで前半、MIDBで後半を切り出す流れです。全角の氏名が混ざっていても、バイト基準で揃うので崩れませんよ。
固定長ファイルの可変長フィールドを処理する
古い基幹システムの出力で、「固定長だけど末尾にタブや特殊記号で区切られた可変長フィールドがある」ケースもあります。FINDBで区切り記号のバイト位置を調べて、そこまでをLEFTBで取り出すとラクですよ。
=LEFTB(A2, FINDB(CHAR(9), A2) - 1)
CHAR(9) はタブ文字です。タブ区切りまでのバイト数を取り出して、先頭からその位置までを抽出しています。区切り位置が行ごとに違っても、式は1本で対応できますよ。
特定キーワードの出現位置でデータ仕分け
商品説明文の中で特定のキーワード(例: 「限定」「特価」など)が出現するかどうか、出現位置が何バイト目か、で仕分けをしたい場合にも使えます。
=IF(IFERROR(FINDB("限定", A2), 0) > 0, "限定商品", "通常商品")
IFERROR でラップして、見つからない場合の #VALUE! を 0 に置き換えています。これで「限定」を含む行だけフラグを立てる処理が、1列の数式で完結しますよ。
FINDBとMIDBを組み合わせたフィールド分解
区切り文字で動的に可変長フィールドを切り出すときは、FINDBとMIDBの組み合わせが定番です。コピペで使えるテンプレートをまとめておきますね。
区切り文字ベースのフィールド分解テンプレート
A列に「コード-名前-備考」形式のデータが入っている想定です。ハイフンでフィールドを3つに分けましょう。
1番目のハイフン位置: =FINDB("-", A2)
2番目のハイフン位置: =FINDB("-", A2, FINDB("-", A2) + 1)
コード: =LEFTB(A2, FINDB("-", A2) - 1)
名前: =MIDB(A2, FINDB("-", A2) + 1, FINDB("-", A2, FINDB("-", A2)+1) - FINDB("-", A2) - 1)
備考: =MIDB(A2, FINDB("-", A2, FINDB("-", A2)+1) + 1, LENB(A2))
長く見えますが、考え方はシンプルです。「区切り位置をFINDBで求めて、その前後をMIDBで切る」というパターンの積み重ねなので、1行ずつ追うと読み解けますよ。
2段階検索で安全に位置を取る
区切り文字が必ず含まれるとは限らないデータでは、IFERRORで守りを入れておきましょう。
=IFERROR(FINDB("-", A2), LENB(A2) + 1)
ハイフンが見つからない場合は「文字列の末尾+1バイト目」を返すようにしておくと、MIDBに渡しても空文字が返るだけで、エラー連鎖を防げますよ。
FIND系・SEARCH系関数との使い分け
スプレッドシートには検索系の関数がいくつもあります。ここで全体像を整理しておきましょう。
FIND・FINDB・SEARCH・SEARCHBの比較
| 関数 | 単位 | 大小区別 | ワイルドカード | 典型用途 |
|---|---|---|---|---|
| FIND | 文字数 | あり | 使えない | 商品コード内の区切り位置(半角のみ) |
| FINDB | バイト数 | あり | 使えない | 全角混在データの固定長解析 |
| SEARCH | 文字数 | なし | 使える | 曖昧検索での文字位置特定 |
| SEARCHB | バイト数 | なし | 使える | 曖昧検索でバイト位置を取りたい |
ExcelのFINDB関数との挙動比較をしたいときは、ExcelのFINDB関数の使い方も参考になりますよ。
バイト系・大小区別の判断ポイント
FINDBを選ぶ基準は、次の3点で判断できます。
- 出力先やデータ形式がバイト単位で扱われている(固定長ファイル、基幹システム連携)
- 大文字と小文字を厳密に区別したい(商品コード、パスワード文字列など)
- ワイルドカードは不要で、完全一致の検索で十分
逆に、社内の集計シートで「大文字小文字は気にしない、位置さえわかればOK」という場面は、SEARCHやSEARCHBのほうが扱いやすいですよ。
よくあるエラーと対処法
FINDB関数でハマりやすいポイントを3つまとめました。エラーの原因と対策をセットで覚えておくと、現場で詰まりにくくなりますよ。
“#VALUE!” エラー(検索文字列が見つからない)
一番よく遭遇するのが、検索文字列が対象文字列に含まれていないパターンです。たとえば =FINDB("-", "ABCDE") のようなケースですね。
IFERRORでラップして、見つからない場合の代替値を決めておくのがおすすめです。
=IFERROR(FINDB("-", A2), 0)
これで、ハイフンが見つからない行は 0 として扱われ、後続の計算で判定しやすくなりますよ。
“#VALUE!” エラー(開始位置が不正)
開始位置に 0 以下や、文字列の長さを超える値を指定すると同じく #VALUE! が返ります。FINDB のネスト(1つ目の結果に +1 して2つ目を探す、など)で1つ目が見つからないと、2つ目の開始位置が #VALUE! になり連鎖するパターンですね。
=IFERROR(FINDB("-", A2, IFERROR(FINDB("-", A2), 0) + 1), 0)
入れ子のFINDBもIFERRORで守っておくと、見つからない行でもエラーが表示されなくなりますよ。
期待した位置と違う値が返る
大小区別で “A” を探したつもりが “a” ばかりのデータだった、という場合は結果が #VALUE! になります。逆に大小区別が不要なら、SEARCHBを使えば解決しますよ。
=SEARCHB("a", A2) → 大文字でも小文字でもヒットする
また、FINDとFINDBを取り違えて「バイト位置が欲しいのに文字位置が返ってきた」というケースもよくあります。MIDBやLEFTBに渡す前提なら、必ずFINDBで統一してくださいね。
まとめ
スプレッドシートのFINDB関数は、文字列の中で指定文字が何バイト目にあるかを返す、固定長データ解析や区切り文字ベースのフィールド分解にピッタリの関数です。最後に要点を整理しておきましょう。
- 構文は
=FINDB(検索文字列, 対象文字列, [開始位置])の3引数。開始位置省略時は先頭から - 全角=2バイト、半角=1バイトとしてカウントする
- 大文字と小文字を区別する(”A” と “a” は別物)
- FINDは文字数、FINDBはバイト数。MIDBやLEFTBに渡すならFINDB一択
- SEARCHBとの違いは、大小区別の有無とワイルドカード可否
- 見つからないと #VALUE! になるので、IFERROR でラップして守る
まずは手元の区切り文字付きデータに、=FINDB("-", A2) のような形で当ててみてください。MIDBと組み合わせてフィールド分解すれば、固定長データ整形の作業がぐっと短縮できますよ。
