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