Excel VBAでは、文字列の一部を別の文字へ置き換えたい場面がよくあります。
例えば、
- 商品名の旧名称を新名称へ変更する
- ファイルパスのフォルダー名を変更する
- 半角スペースを削除する
- CSVから読み込んだデータを整形する
このような処理を一文字ずつ判定して作成すると、コードが複雑になり、保守もしづらくなります。
VBAには文字列をまとめて置き換えられるReplace関数が用意されており、少ないコードで読みやすく保守しやすい処理を実現できます。
この記事では、Replace関数の基本的な使い方から、セルや変数への適用方法まで、実務を意識した書き方で解説します。
✅ Replace関数とは
Replace関数は、文字列の中に含まれる指定した文字や単語を、別の文字列へ置き換えるための関数です。
例えば、
- 「株式会社ABC」を「ABC株式会社」へ変更する
- 「-」を「/」へ変更する
- 半角スペースを削除する
など、文字列の一括変換に利用できます。
Replace関数は元の文字列を書き換えるのではなく、置換後の新しい文字列を返す関数です。
そのため、結果を変数やセルへ代入して利用する点を理解しておきましょう。
Replace関数は、一つの文字列や変数の内容を加工するときに適しています。一方、複数のセルをまとめて置換したい場合は、Range.Replaceメソッドを使う方法が効率的です。
✅ Replace関数の構文
Replace関数の構文は次のとおりです。
Replace(Expression, Find, Replace [, Start] [, Count] [, Compare])
主に使用する引数は次のとおりです。
| 引数 | 内容 |
|---|---|
| Expression | 置換対象となる文字列 |
| Find | 検索する文字列 |
| Replace | 置き換える文字列 |
| Start | 検索開始位置(省略可) |
| Count | 置換回数(省略可) |
| Compare | 大文字・小文字の比較方法(省略可) |
実務では、
Replace(文字列, 検索文字列, 置換文字列)
の3つだけ使用するケースがほとんどです。
Start・Count・Compareは必要になったときだけ指定すれば十分です。
✅ まずは基本形を理解しよう
Replace関数は非常にシンプルですが、実務では処理を後から変更しやすいように、一度変数へ格納してから置換する書き方がおすすめです。
一行で記述することもできますが、変数を経由することで途中経過を確認しやすくなり、置換対象や置換後の文字列を変更する場合も修正箇所を把握しやすくなります。
また、後から置換条件を増やす場合にも処理を拡張しやすいため、保守性の高いコードになります。
・文字列を置換する基本コード
次のコードは、変数へ格納した文字列の「東京」を「大阪」へ置き換える例です。
Sub ReplaceBasic()
'置換前の文字列を保持する
Dim originalText As String
'置換後の文字列を保持する
Dim replacedText As String
originalText = "東京支店"
'指定した文字列を置換する
replacedText = Replace(originalText, "東京", "大阪")
MsgBox replacedText
End Sub
実行結果
大阪支店
・この書き方をおすすめする理由
Replace関数は次のように一行でも記述できます。
MsgBox Replace("東京支店", "東京", "大阪")
しかし、実務では文字列がセルやCSVファイル、ユーザー入力などから取得されることがほとんどです。
そのため、
- 元データ
- 置換処理
- 結果
を分けて記述した方が、コードの流れが分かりやすくなります。
特にデバッグ時には、置換前と置換後の値をそれぞれ確認できるため、不具合の原因を見つけやすくなります。
✅ セルの文字列をReplace関数で置換する方法
Replace関数は、変数だけでなくExcelのセルに入力された文字列にも利用できます。
実務では、住所や商品名、部署名などをまとめて変更するケースが多く、セルの値を取得して置換し、その結果をセルへ戻す流れが基本になります。
セルへ直接Replace関数を記述することもできますが、値を一度変数へ格納することで処理内容が明確になり、あとから置換条件を追加する場合にも対応しやすくなります。
・セルの値を書き換える基本コード
次のコードは、A1セルの「株式会社」を「(株)」へ置き換える例です。
Sub ReplaceCellText()
'対象セルの文字列を保持する
Dim companyName As String
companyName = Range("A1").Value
'会社名の表記を変更する
companyName = Replace(companyName, "株式会社", "(株)")
'置換後の文字列をセルへ戻す
Range("A1").Value = companyName
End Sub
実行結果
| 置換前 | 置換後 |
|---|---|
| 株式会社サンプル | (株)サンプル |
・セルを直接書き換えない構成にするメリット
次のようなコードでも処理は実行できます。
Range("A1").Value = Replace(Range("A1").Value, "株式会社", "(株)")
しかし、この書き方では処理は短いものの、あとから置換条件を追加したり、途中結果を確認したりすることが難しくなります。
一度変数へ格納してから処理する構成にすると、
- 置換前の値をログへ出力する
- 複数回のReplace処理を追加する
- 条件によって置換内容を変更する
といった仕様変更にも対応しやすくなります。
そのため、実務では多少コードが長くなっても、処理の流れが分かる構成を採用することをおすすめします。
✅ 複数の文字列を順番に置換する方法
実務では、一つの文字列だけでなく、複数の表記をまとめて統一したい場面があります。
例えば、住所データに含まれる全角スペースと半角スペースを削除したり、複数の旧名称を新名称へ変更したりするケースです。
Replace関数は一度に一つの置換条件しか指定できないため、複数の置換を行う場合は、置換後の文字列へ次のReplace関数を順番に適用します。
・置換処理を分けて読みやすくする
次のコードでは、A2セルに含まれる全角スペースと半角スペースを削除します。
Sub NormalizeCustomerName()
Dim targetWorksheet As Worksheet
Dim customerName As String
Set targetWorksheet = ThisWorkbook.Worksheets("顧客一覧")
'元の文字列を取得する
customerName = CStr(targetWorksheet.Range("A2").Value)
'全角スペースと半角スペースを順番に削除する
customerName = Replace(customerName, " ", "")
customerName = Replace(customerName, " ", "")
'整形後の文字列をセルへ戻す
targetWorksheet.Range("A2").Value = customerName
End Sub
例えば、A2セルに「株式会社 サンプル 東京支店」と入力されている場合、実行後は「株式会社サンプル東京支店」となります。
・一行へ詰め込まない方が変更しやすい
複数のReplace関数は、次のように入れ子にすることもできます。
customerName = Replace(Replace(customerName, " ", ""), " ", "")
処理自体は短くなりますが、置換条件が増えるほど括弧が多くなり、どの文字を何へ置き換えているのか確認しづらくなります。
置換処理を一行ずつ分けておけば、
- 新しい置換条件を追加する
- 特定の置換だけを一時的に外す
- 処理の途中結果を確認する
- 置換順序を変更する
といった仕様変更へ対応しやすくなります。
複数の表記ゆれを整える処理では、コードの短さよりも、置換ルールを一覧として読める構成を優先すると保守しやすくなります。
複数の不要な記号や文字をまとめて削除したい場合は、置換条件の管理方法も重要です。複数文字を順番に削除する実務的なコードは、【VBA】複数の特定文字を削除する方法|Replace関数で一括置換する実務テクニックで詳しく解説しています。
✅ 複数セルの文字列を一括置換する方法
表全体の文字列を置換する場合は、対象範囲のセルを順番に処理します。
ただし、シート全体を無条件にループすると処理時間が長くなるため、実際にデータが入力されている範囲だけを対象にすることが重要です。
次のコードでは、顧客一覧シートのA列に入力された「旧営業部」を「営業本部」へ一括置換します。
・最終行までを対象にして無駄な処理を減らす
Sub ReplaceDepartmentNames()
Dim targetWorksheet As Worksheet
Dim lastDataRow As Long
Dim currentRow As Long
Dim departmentName As String
Set targetWorksheet = ThisWorkbook.Worksheets("顧客一覧")
'A列の最終データ行を取得する
lastDataRow = targetWorksheet.Cells( _
targetWorksheet.Rows.Count, "A").End(xlUp).Row
'見出しを除き、2行目から最終行まで処理する
For currentRow = 2 To lastDataRow
departmentName = CStr( _
targetWorksheet.Cells(currentRow, "A").Value)
'対象文字列が含まれている場合だけ置換する
If InStr(departmentName, "旧営業部") > 0 Then
departmentName = Replace( _
departmentName, "旧営業部", "営業本部")
targetWorksheet.Cells(currentRow, "A").Value = _
departmentName
End If
Next currentRow
End Sub
・対象を限定している理由
Replace関数は、検索文字列が含まれていない場合でもエラーにはなりません。そのため、すべてのセルに対してReplace関数を実行することもできます。
ただし、実務では対象件数が増える可能性があります。
先にInStr関数で対象文字列の有無を確認しておくと、置換が必要なセルだけを書き換えられます。これにより、不要なセル更新を減らし、処理の意図も分かりやすくなります。
また、Range("A:A")のように列全体を処理するのではなく、最終行を取得して処理範囲を絞ることで、データ件数が増えても無駄なループを避けられます。
なお、数万件以上のデータを処理する場合は、セルを一つずつ読み書きするより、配列へ取り込んでから一括で戻す方法の方が高速です。処理件数に応じて設計を切り替えましょう。
列全体や指定したセル範囲からスペースを削除したい場合は、処理範囲の決め方や最終行の取得方法も重要です。範囲を限定して一括処理する方法は、【VBA】列・セル範囲のスペースを削除する方法|Replace関数で一括処理する実務テクニックで詳しく解説しています。
✅ 大文字と小文字を区別して置換する方法
Replace関数では、Compare引数を指定することで、大文字と小文字を区別するかどうかを変更できます。
英字の商品コードやファイル名などを扱う場合は、比較方法によって結果が変わるため注意が必要です。
・完全に一致する英字だけを置換する
Sub ReplaceCaseSensitiveText()
Dim originalText As String
Dim replacedText As String
originalText = "Excel excel EXCEL"
'大文字と小文字を区別して置換する
replacedText = Replace( _
originalText, _
"Excel", _
"VBA", _
1, _
-1, _
vbBinaryCompare)
MsgBox replacedText
End Sub
実行結果は次のとおりです。
VBA excel EXCEL
vbBinaryCompareを指定すると、大文字と小文字が一致する文字列だけが置換されます。
一方、次のようにvbTextCompareを指定すると、大文字と小文字を区別せずに置換できます。
replacedText = Replace( _
originalText, _
"Excel", _
"VBA", _
1, _
-1, _
vbTextCompare)
この場合、実行結果は次のようになります。
VBA VBA VBA
・比較方法を曖昧にしない
Compare引数を省略した場合、比較方法はモジュール先頭のOption Compareの設定に影響されます。
別のモジュールへコードを移したときに結果が変わる可能性があるため、英字の大小が重要な処理では、vbBinaryCompareまたはvbTextCompareを明示する方が安全です。
特に商品コードや識別子では、大文字と小文字を区別すべきかを業務ルールとして確認してから設定しましょう。
Replace関数のCompare引数を省略した場合は、モジュールのOption Compare設定が比較結果に影響します。BinaryとTextの違いや設定方法は、【VBA】Option Compareステートメントの使い方|Binary・Textの違いと設定方法で詳しく解説しています。
✅ 置換する回数を制限する方法
通常のReplace関数は、対象となる文字列をすべて置換します。
先頭にある文字列だけを変更したい場合は、Count引数で置換回数を指定できます。
・最初に見つかった文字列だけを置換する
Sub ReplaceFirstMatch()
Dim fileName As String
fileName = "旧_売上_旧_2026.xlsx"
'最初に見つかった「旧」だけを置換する
fileName = Replace( _
fileName, _
"旧", _
"新", _
1, _
1, _
vbBinaryCompare)
MsgBox fileName
End Sub
実行結果は次のとおりです。
新_売上_旧_2026.xlsx
Count引数へ1を指定しているため、最初の「旧」だけが置換されます。
すべて置換する場合は、Count引数を省略するか、-1を指定します。
置換回数を制限するときは、「最初の一件だけでよい理由」が業務ルールとして明確か確認しましょう。データの並び方が変わると、意図しない箇所が最初に見つかる可能性があるためです。
✅ Replace関数とRange.Replaceメソッドの違い
VBAには、Replace関数のほかに、セル範囲を検索して置換するRange.Replaceメソッドがあります。
どちらも文字列を置き換えられますが、用途が異なります。
| 比較項目 | Replace関数 | Range.Replaceメソッド |
|---|---|---|
| 主な対象 | 文字列・変数・セルの値 | セル範囲 |
| 戻り値 | 置換後の文字列 | 置換できたかどうか |
| 対象範囲 | 一つの文字列 | 複数セルをまとめて処理可能 |
| 細かな加工 | しやすい | 範囲内の一括置換向け |
| 途中処理 | 変数で確認しやすい | 検索・置換を直接実行する |
文字列を取得して条件分岐や整形を行う場合は、Replace関数が適しています。
一方、広いセル範囲に含まれる同じ文字列を一括で置き換えるだけであれば、Range.Replaceメソッドの方が簡潔で高速になる場合があります。
重要なのは、コードを短くすることではなく、置換前後にどのような処理が必要かを基準に使い分けることです。
Range.Replaceメソッドでは、ワイルドカードを利用して部分的なパターンに一致するセルを置換できます。固定文字列だけでは対応できない一括置換については、【VBA】Replaceメソッドでワイルドカードを使う方法|正規表現で柔軟な一括置換を実現で詳しく解説しています。
✅ Replace関数を実務で使うときの注意点
Replace関数は便利ですが、部分一致で置換するため、想定していない文字まで変更することがあります。
例えば、「東京」を「大阪」へ置換した場合、「東京都」も「大阪都」へ変更されます。
置換前には、対象文字列が単独で使われているのか、別の単語の一部にも含まれているのかを確認しましょう。
また、Replace関数は置換後の文字列を返すだけで、元の変数やセルを自動的に変更するわけではありません。
次のコードではReplace関数を実行していますが、結果を代入していないため、originalTextの内容は変わりません。
Replace(originalText, "旧", "新")
正しくは、次のように結果を代入します。
originalText = Replace(originalText, "旧", "新")
さらに、セル内に数式が含まれている場合、.Valueを使うと計算結果を取得します。数式そのものを置換したい場合は、.Formulaや.FormulaR1C1を対象にする必要があります。
文字列・値・数式のどれを置換したいのかを、処理前に明確にしておきましょう。
Replace関数は決まった文字列の置換には向いていますが、桁数や文字パターンが変化するデータには対応しにくい場合があります。複雑な条件で文字列を置換したい場合は、正規表現を使う方法も確認してみてください。
✅ まとめ:Replace関数は置換対象を明確にして使おう
Replace関数を使うと、VBAで文字列の一部を簡単に置き換えられます。
今回のポイントは次のとおりです。
- Replace関数は置換後の新しい文字列を返す
- 結果は変数やセルへ代入する必要がある
- 複数の置換条件は一行ずつ分けると管理しやすい
- 複数セルを処理するときは対象範囲を限定する
- Compare引数で大文字と小文字の扱いを指定できる
- Count引数で置換回数を制限できる
- 単純な範囲置換ではRange.Replaceメソッドも選択肢になる
- 部分一致による意図しない置換に注意する
Replace関数は短く書ける関数ですが、実務では置換対象・比較方法・置換順序を明確にすることが重要です。
変数名やコメントで処理の意図を示し、後から置換ルールを追加・変更しやすい構成にしておくことで、データ整形や表記統一へ安全に活用できます。