スプレッドシートで全角半角が混ざったデータを扱っていて、「特定のバイト位置から数バイトだけをまとめて別の文字列に差し替えたい」という場面、ありませんか。固定長ファイルや基幹システム連携のデータでは、「何バイト目から何バイト分」という単位でフィールドが決まっていることが多いんですよね。
REPLACE関数でも置換はできますが、こちらは文字数ベースなので、全角半角混在のデータでは位置がずれてしまうことがあります。そんなときに使えるのが、スプレッドシートのREPLACEB関数ですよ。全角2バイト・半角1バイトでカウントしながら、指定した位置から指定バイト数分をバッサリ置き換えてくれます。
この記事では、スプレッドシートのREPLACEB関数の構文から、REPLACE関数との違い、SEARCHBやFINDBと組み合わせた動的な置換パターン、全角文字の途中で切れたときの挙動、よくあるエラー対処まで紹介します。コピペで使えるテンプレートも置いておきますね。
スプレッドシートのREPLACEB関数とは?
スプレッドシートのREPLACEB関数は、文字列の指定したバイト位置から指定バイト数分を、別の文字列に置き換える関数です。読み方は「リプレース・ビー」で、REPLACE(置換)と Byte(バイト)を組み合わせた名前ですよ。
全角文字は2バイト、半角文字は1バイトとしてカウントします。特徴は、置換する範囲をバイト数で指定することと、置換後の文字列の長さは元の範囲と違ってもOKなところです。「3バイト分を消して空文字にする」「2バイト分を5バイトに膨らませる」みたいな操作も自由自在ですよ。
関数の基本構文と引数
基本構文はこちらです。引数は4つで、全て省略不可です。
=REPLACEB(対象文字列, 開始位置, バイト数, 置換文字列)
引数の意味を整理しておきましょう。
| 引数 | 意味 | 備考 |
|---|---|---|
| 対象文字列 | 置換される側の文字列 | 省略不可 |
| 開始位置 | 置換を開始するバイト位置(1始まり) | 1以上の整数 |
| バイト数 | 置換する範囲のバイト数 | 0以上の整数 |
| 置換文字列 | 置き換えたい新しい文字列 | 空文字 "" もOK |
バイト数に 0 を指定すると、その位置に「挿入」する動きになります。削除したい場合は置換文字列を "" にすればOKです。開始位置や バイト数が小数の場合は整数部分に切り捨てられますよ。
REPLACE関数との違い(文字数 vs バイト数)
REPLACE関数とREPLACEB関数の違いは、位置とサイズの単位です。ここを押さえておくと、使い分けで迷いません。
- REPLACE: 「何文字目から何文字分」を置換する。全角半角を区別しない
- REPLACEB: 「何バイト目から何バイト分」を置換する。全角=2バイト、半角=1バイトで計算
たとえば「商品A-100」という文字列で、先頭から3文字目から2文字分を置き換えた場合と、3バイト目から2バイト分を置き換えた場合で結果がこう変わります。
| 数式 | 結果 | 解説 |
|---|---|---|
=REPLACE("商品A-100", 3, 2, "XX") | 商品XX100 | 3文字目「A」と4文字目「-」を”XX”に置換 |
=REPLACEB("商品A-100", 3, 2, "XX") | 商XX-100 | 3バイト目「品」(2バイト)を”XX”に置換 |
単位が違うだけで置換される範囲も大きく変わりますよね。バイト単位のデータ(固定長CSV・基幹システム連携など)を扱うときはREPLACEB、文字数ベースで考えたいときはREPLACEを選びましょう。
REPLACEBとSUBSTITUTEの違い
似たような置換系関数にSUBSTITUTE関数があります。こちらも文字列の置換ですが、役割は真逆と言ってもいいくらい違います。
| 関数 | 指定方法 | 典型用途 |
|---|---|---|
| REPLACEB | バイト位置+バイト数で範囲指定 | 固定長データの特定フィールドを書き換え |
| SUBSTITUTE | 「この文字列を」「この文字列に」と内容指定 | 全角スペースを半角に一括変換、表記ゆれ統一 |
「位置がわかっているならREPLACEB、内容がわかっているならSUBSTITUTE」と覚えておくと迷いません。位置も内容も動的に決まる場合は、SEARCHBで位置を取ってからREPLACEBに渡す組み合わせが効きますよ。
REPLACEB関数の基本的な使い方
それでは実際に使ってみましょう。バイト位置のカウント方法と、置換前後でサイズが変わる挙動を意識すると、結果がイメージしやすくなります。
全角・半角が混在する文字列での挙動
代表的なパターンをいくつか並べてみますね。
| 数式 | 結果 | バイトの内訳 |
|---|---|---|
=REPLACEB("あいうえお", 3, 2, "ン") | あンえお | 3バイト目から2バイト(「い」)を「ン」に置換 |
=REPLACEB("ABCDE", 2, 3, "xyz") | AxyzE | 2バイト目から3バイト分(BCD)を”xyz”に置換 |
=REPLACEB("Excel関数", 6, 2, "表") | Excel表数 | 6バイト目から2バイト分(「関」)を「表」に置換 |
=REPLACEB("ABC", 2, 1, "XX") | AXXC | 2バイト目から1バイト分(B)を”XX”に置換(長さが変わってもOK) |
4行目がポイントですよ。置換前が1バイトで置換後が2バイトでも、問題なく動きます。置換後の文字列の長さは自由なので、「詰める」「膨らませる」操作もこの関数1本でできるんですね。
文字列の挿入と削除
置換文字列を空文字 "" にすると、指定範囲を削除できます。バイト数に 0 を指定すると、その位置に置換文字列を挿入する動きになりますよ。
削除: =REPLACEB("商品A-100", 5, 2, "") → 商品-100
(5バイト目から2バイト「A-」削除 → あれ?「A-」は3バイト目からなので要注意)
挿入と削除の例をもう一度、位置を明確にしながら整理します。
| 数式 | 結果 | 解説 |
|---|---|---|
=REPLACEB("ABCDE", 3, 2, "") | ABE | 3バイト目から2バイト(CD)を削除 |
=REPLACEB("ABCDE", 3, 0, "XYZ") | ABXYZCDE | 3バイト目に”XYZ”を挿入(何も削除しない) |
=REPLACEB("ABCDE", 6, 0, "!") | ABCDE! | 末尾の次のバイト位置に追記 |
末尾に追記するときは、開始位置を「対象文字列のバイト長+1」にしてバイト数を 0 にするのが定番ですよ。LENB(A2)+1 と組み合わせると動的に追記できます。
全角文字の途中で切れた場合の挙動
REPLACEBで一番ハマるポイントがここです。全角文字は2バイト分を占有していますが、REPLACEBは「1バイト目だけ置換する」という指定もできてしまいます。
=REPLACEB("あいうえお", 2, 1, "X") → ?Xいうえお(環境によっては文字化け)
=REPLACEB("あいうえお", 1, 1, "X") → X?いうえお(同上)
全角文字の片バイトだけを置換すると、残された半分が不正な文字コードになってしまいます。スプレッドシート上では ? や空白、あるいは文字化けした記号として表示されることが多いですよ。
全角文字を扱うときは、開始位置とバイト数の両方を偶数側に合わせて、境界を跨がないように設計するのが安全です。LENB と文字の構成が把握できるデータなら問題ありませんが、可変の入力を相手にする場合はSEARCHBで位置を取ってから渡すのがおすすめですよ。
実務で使えるREPLACEB関数の活用パターン
REPLACEB関数が活躍するのは、固定長フォーマットや、バイト単位でフィールドが決まっているデータの処理です。よく出てくる3パターンを紹介しますね。
固定長データの特定フィールドを書き換える
基幹システムから出力される固定長データで、「先頭10バイトがコード、次の20バイトが名称、次の5バイトが区分」みたいな構造のとき、特定フィールドだけを書き換えたい場面があります。
区分を書き換え: =REPLACEB(A2, 31, 5, "B0001")
31バイト目から5バイト分(区分フィールド)を「B0001」に差し替えます。位置とサイズがデータ仕様で確定しているので、REPLACEBはこの用途にぴったりですよ。
SEARCHBで位置を取って動的に置換する
区切り記号の位置が行ごとに変わるデータでは、SEARCHBで区切り位置を動的に取得して、REPLACEBに渡します。「コード-名前」形式のデータで、コード部分だけを別の値に書き換えるイメージですね。
=REPLACEB(A2, 1, SEARCHB("-", A2) - 1, "NEW")
SEARCHBで最初のハイフン位置を取り、その1バイト前までを「NEW」に置換します。コード部分の長さが行ごとに違っても、同じ式でまとめて処理できますよ。
関連: スプレッドシートのSEARCHB関数の使い方 でSEARCHBの詳しい挙動を押さえておくと、このパターンの理解がぐっと早くなります。
マスク処理(個人情報の一部伏字化)
個人情報の一部を伏字にして共有したいとき、バイト位置指定のマスク処理に使えます。たとえば電話番号の中央4バイトを **** に置き換える、というパターンですね。
=REPLACEB("090-1234-5678", 5, 4, "****")
結果は 090-****-5678 になります。ハイフン位置が固定のデータなら、位置とバイト数を決め打ちで使うのが一番シンプルですよ。
入力が揺れるデータ(ハイフンありなし混在など)では、SEARCHBで位置を取ってからREPLACEBに渡す安全パターンに切り替えましょう。
SEARCHB・FINDBと組み合わせた動的置換テンプレート
区切り文字ベースで可変長フィールドを書き換えるときは、SEARCHBやFINDBで位置を取得してからREPLACEBに渡す組み合わせが便利です。コピペで使えるテンプレートをまとめておきますね。
区切り文字で分けた最初のフィールドを置換
A列に「コード-名前」形式のデータが入っている想定です。コード部分を丸ごと別の値に書き換えましょう。
=REPLACEB(A2, 1, SEARCHB("-", A2) - 1, "NEWCODE")
SEARCHBで1番目のハイフン位置を取り、先頭からその1バイト前までを「NEWCODE」に置換します。コード部分の長さが行ごとに違っても対応できますよ。
2番目のフィールドだけを置換
「コード-名前-備考」形式で、真ん中の名前フィールドだけを置換するパターンです。1番目と2番目のハイフン位置を両方取ります。
=LET(
p1, SEARCHB("-", A2),
p2, SEARCHB("-", A2, p1 + 1),
REPLACEB(A2, p1 + 1, p2 - p1 - 1, "NEWNAME")
)
LET関数で中間変数に名前を付けると、式がぐっと読みやすくなります。LETが使えない環境では、ネストして書くことになりますが、動作は同じですよ。
末尾のフィールドだけを置換
末尾のフィールドを置換するときは、最後の区切り位置から末尾までを対象にします。末尾位置は LENB(A2) で取れるので、バイト数は LENB(A2) - p2 で求められますね。
=LET(
p1, SEARCHB("-", A2),
p2, SEARCHB("-", A2, p1 + 1),
REPLACEB(A2, p2 + 1, LENB(A2) - p2, "NEW_REMARK")
)
この3パターンを覚えておけば、区切り文字付きデータの任意フィールドを柔軟に書き換えられますよ。
厳密一致で置換したいときはFINDB
区切り文字の大文字小文字を厳密に区別したい場合は、SEARCHBをFINDBに置き換えるだけでOKです。商品コード内の英字で「A」と「a」を別物として扱いたい場面ですね。
=REPLACEB(A2, 1, FINDB("-", A2) - 1, "NEWCODE")
曖昧検索ならSEARCHB、厳密検索ならFINDB、というシンプルな使い分けで済みますよ。
REPLACE系・SUBSTITUTE系関数との使い分け
スプレッドシートには置換系の関数がいくつかあります。ここで全体像を整理しておきましょう。
REPLACE・REPLACEB・SUBSTITUTEの比較
| 関数 | 指定方法 | 単位 | 典型用途 |
|---|---|---|---|
| REPLACE | 位置+サイズ | 文字数 | 文字数ベースでの範囲置換 |
| REPLACEB | 位置+サイズ | バイト数 | 固定長フォーマットのフィールド書き換え |
| SUBSTITUTE | 検索文字列→置換文字列 | — | 内容ベースの一括置換・表記ゆれ統一 |
「位置がわかっているか、内容がわかっているか」で第1段階の選択をして、位置指定ならバイト単位か文字単位かで第2段階を決める、という流れが一番迷いませんよ。
REPLACEBを選ぶべき場面
REPLACEBを選ぶ基準は、次の3点で判断できます。
- データ仕様がバイト単位で定義されている(固定長ファイル・基幹システム連携)
- 全角半角混在のデータで、バイト位置を基準に処理する必要がある
- SEARCHBやFINDBで取得した位置情報をそのまま渡したい
逆に、「◯◯という文字列を△△に置き換える」という内容ベースの処理ではSUBSTITUTEのほうが直感的です。REPLACEBは「何バイト目から何バイト分」という機械的な指定が決まっている場面に向いていますよ。
よくあるエラーと対処法
REPLACEB関数でハマりやすいポイントを3つまとめました。エラーの原因と対策をセットで覚えておくと、現場で詰まりにくくなりますよ。
“#VALUE!” エラー(開始位置が0以下)
開始位置に 0 や負の数、または数値に変換できない値を指定すると #VALUE! が返ります。SEARCHBのネストで1つ目が見つからずに #VALUE! になり、その結果を開始位置に渡すパターンで連鎖することが多いですね。
=IFERROR(REPLACEB(A2, IFERROR(SEARCHB("-", A2), 1), 3, "XXX"), A2)
見つからない行ではSEARCHB側を 1 にフォールバックし、それでもエラーが出たら元の文字列をそのまま返す、という二段構えで守れますよ。
全角文字の途中で切れて文字化けする
先ほど触れた通り、全角文字の片バイトだけを置換すると残りのバイトが不正な文字コードになります。? や空白、または文字化け記号として表示されることが多いです。
対策としては、開始位置とバイト数の組み合わせが全角文字の境界を跨がないように設計することですね。データが全角だけ、あるいは半角だけで構成されている場合は心配不要ですが、混在データを扱うときは LENB と LEN の差からどこに全角があるかを事前に把握しておくと安全ですよ。
置換後の文字列が想定より長く/短くなる
REPLACEBは置換後の長さが元の範囲と違ってもエラーにはなりません。ただ、固定長データを扱っている場合は「フィールドサイズを維持したい」という要件があるはずですよね。
=REPLACEB(A2, 31, 5, LEFT("B1" & REPT(" ", 5), 5))
置換文字列側で LEFT や REPT を使って、指定バイト数にきっちり合わせるのが定番です。5バイト分の右パディングが必要なら “B1” に半角スペースを足して LEFT で先頭5文字を取る、といった具合ですよ。
全角半角混在の固定長なら LEFTB でバイト単位のパディングに切り替えてくださいね。
まとめ
スプレッドシートのREPLACEB関数は、文字列の指定バイト位置から指定バイト数分を別の文字列に置き換える、バイト単位の範囲置換に便利な関数です。最後に要点を整理しておきましょう。
- 構文は
=REPLACEB(対象文字列, 開始位置, バイト数, 置換文字列)の4引数。全て省略不可 - 全角=2バイト、半角=1バイトとしてカウントする
- バイト数 0 で挿入、置換文字列
""で削除 - 置換後の文字列の長さは元の範囲と違ってもOK
- REPLACEは文字数、REPLACEBはバイト数。固定長データにはREPLACEB一択
- 内容ベースの置換ならSUBSTITUTE、位置ベースならREPLACEBで使い分け
- 全角の途中で切ると文字化けするので、境界を跨がない設計が安全
- SEARCHBやFINDBと組み合わせると、可変長データでも動的に置換できる
まずは手元の固定長データに、=REPLACEB(A2, 31, 5, "NEWVAL") のような形で当ててみてください。SEARCHBとセットで使えるようになると、可変長の区切り文字データでもフィールド単位の書き換えが気持ちよく回せますよ。
