
セル内の文字「平成」を「令和」に変えたい…。
マクロで変更できたりしない?

なるほど…。
「Replace」関数を使えば簡単に実現できます!
では今回は、「VBAのReplace関数の使い方」を
できるだけわかりやすく解説いたします。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
Replace関数の書き方・使い方
まずは簡単な使い方を見ていきましょう。
簡単な使い方
「Replace」の基本構文は以下のとおりです。
【 Replace( 対象文字列, 検索文字列, 置換後の文字列 ) 】
具体例として、下記のVBAコードを見てください。
Sub 文字列置換()
Debug.Print Replace("平成15年度卒業生", "平成15", "令和6")
End Sub
1つ1つ解説していきます。
プロシージャの作成
Sub 文字列置換()
End Sub
プロシージャなど、マクロの基礎は下記記事でわかりやすく解説しております。
コードだけではなく、開発タブの表示からマクロの保存まで知りたい方はご参考ください。
文字列の置換
Debug.Print Replace("平成15年度卒業生", "平成15", "令和6")
上記コードにて、置換した文字列を「Debug.Print」で表示させています。
「Debug.Print」での表示方法は下記記事をご参考ください。
対象文字列(平成15年度卒業生)の中から検索文字列(平成15)を置換後文字列(令和6)に変換します。

Replace("平成15年度卒業生", "平成15", "令和6")
【 Replace( 対象文字列, 検索文字列, 置換後の文字列 ) 】
それぞれの値(文字列)は「”(ダブルクォーテーション)」で囲ってください。
囲わないと、うまく動きません。
これが「Replace」の基本構文です。
しかしながら、下記のような疑問が思い浮かんだ方もいるかと思います。
- 対象文字列の中に検索文字列が無かった場合はどうなる?
- 文字列を削除することもできるの?
- 対象文字列が空白だったらどうなるの?
次項で解説いたします。
よくある疑問
対象文字列の中に検索文字列が無かった場合はどうなる?
Sub 文字列置換()
Debug.Print Replace("平成15年度卒業生", "平成16", "令和6")
End Sub
検索文字列を間違って「平成16」にしてしまった例です。
対象文字列に平成16は入っていません。
どのような結果になるのでしょうか。実行してみます。

エラーは出ませんでした。
イミディエイトウィンドウには、対象文字列である「平成15年度卒業生」がそのまま表示されています。
置換失敗です。
エラーが出ないため、失敗に気づかないことが多いかと思いますのでご注意ください。
文字列を削除することもできるの?
下記のVBAコードを見てください。
Sub 文字列置換()
Debug.Print Replace("平成15年度卒業生", "平成15年度", "")
End Sub
置換後文字列を「””(空白)」にしてみました。
これで「平成15年度」が削除されて「卒業生」だけが残るのか…。実行してみます。

「卒業生」だけが残りました。成功です。
対象文字列全部を削除できるかもやってみます。
Sub 文字列置換()
Debug.Print Replace("平成15年度卒業生", "平成15年度卒業生", "")
End Sub

イミディエイトウィンドウに空欄が出力されました。対象文字列すべてが削除されています。
対象文字列が空白だったらどうなるの?
下記VBAコードを見てください。
Sub 文字列置換()
Debug.Print Replace("", "", "令和6年度")
End Sub
対象文字列と検索文字列が空白になっており、置換後文字列に「令和6年度」が指定されています。
空白から「令和6年度」が作り出せるのかという疑問です。
実行してみましょう。

ダメでした。失敗です。
対象文字列が空白の時点で「Replace」は機能しないようです。
エラーも出ないため、気付かないこともあるかもしれません。ご注意ください。
少し高度な使い方
Replaceにはいくつかのオプション機能があります。
これまではすべて省略しましたが、下記のように指定することができます。
【 Replace( 対象文字列, 検索文字列, 置換後文字列, 検索開始位置, 置換回数, 比較方法) 】
- 第1引数:対象文字列(解説済)
- 第2引数:検索文字列(解説済)
- 第3引数:置換後文字列(解説済)
- 第4引数:検索開始位置 省略した場合(デフォルト)は1文字目から
- 第5引数:置換回数 省略した場合(デフォルト)はすべて置換
- 第6引数:比較方法 省略した場合(デフォルト)は大文字小文字を区別する
1つ1つ解説していきます。
【引数とは?】
引数は「引き渡す数(引き渡す値)」のことで、Replace関数に渡す値を指します。
デフォルトでは、「対象文字列・検索文字列・置換後文字列」を渡すと、置換された文字列を私たちが受け取ります。
この受け取る値を「返り値(戻り値)」といいます。
例えば、魚屋さんにアジの3枚おろしを作ってもらいたい場合は、アジを渡して3枚おろしを受け取ります。
アジが引数、3枚おろしが返り値といったところでしょうか。
置換を開始する位置を指定
【第4引数:検索開始位置】
Sub 文字列置換()
Debug.Print Replace("国語算数理科社会", "理科", "体育", 3) ' 3文字目から置換開始
End Sub
上記VBAコードは、
「国語算数理科社会」の「理科」を「体育」に置換した例ですが、
第4引数である「置換開始位置」に3を指定しています。
実行してみましょう。

理科が体育に変わっているだけでなく、「国語」が無くなっています。
「置換開始位置」以前(今回なら2文字目以前)は削除されてしまいますので注意しましょう。
文字列の前方に不要な文字がある場合は、開始位置を決めることで削除できます。
置換する回数を指定
【第5引数:置換回数】
まずはデフォルト(省略した場合)の結果です。
Sub 文字列置換()
Debug.Print Replace("abcabcabc", "abc", "def")
End Sub

すべての「abc」が「def」に置換されました。
では、第5引数である「置換回数」を指定してみましょう
Sub 文字列置換()
Debug.Print Replace("abcabcabc", "abc", "def", 1, 2) ' 置換回数に2を指定
End Sub

最初の2回だけ「abc」が「def」に置換されましたが、3回目はそのままになっているのがわかります。
第5引数の「置換回数」を指定する場合は、第4引数の「検索開始位置」に1を指定するか、空白にしてください。
Debug.Print Replace("abcabcabc", "abc", "def", , 2)
下記のようにした場合、第4引数の「検索開始位置」が2と勘違いされて、予期せぬ結果になってしまいます。
▼失敗例
Debug.Print Replace("abcabcabc", "abc", "def", 2) ' 検索開始位置が2と認識されてしまう
大文字小文字を区別しない
大文字小文字を区別しないで置換したい場合は、第6引数に「vbTextCompare」を指定します。
- vbTextCompare:大文字小文字を区別しない
- vbBinaryCompare:大文字小文字を区別する(省略した場合/デフォルト)
Sub 文字列置換()
Debug.Print Replace("abcabcabc", "ABC", "DEF", , , vbTextCompare) ' 大文字小文字を区別しない
End Sub

実践的な活用例
ここからは、より実践的な活用例を見ていきましょう。
下記VBAコードは、範囲選択したセル内の文字を置換するマクロの例です。
Sub 範囲内の置換()
Dim c As Range
For Each c In Selection
If c.HasFormula = False Then
c.Value = Replace(c.Value, "令和6年度", "令和7年度")
End If
Next c
End Sub
▼関連記事
「HasFormula = False(数式ではなく値)」の時のみ置換を実行しています。
(数式に「Replace」を適用すると数式が解除される場合があるため)
下記のようにすることで、ワークシート全体に適用できます。
Sub シート全体の置換()
Dim c As Range
For Each c In ActiveSheet.UsedRange
If c.HasFormula = False Then
c.Value = Replace(c.Value, "令和6年度", "令和7年度")
End If
Next c
End Sub
Replace関数を使う際の注意点
数式に注意
数式が入ったセルに「Replace」を適用してしまうと、数式が解除されてしまい予期せぬ結果になる場合があります。
数式セルには影響を与えないようにHasFormulaで制御するようにしてください。
Sub 文字列置換()
If Range("A1").HasFormula = False Then
Range("A1") = Replace(Range("A1").Value, "abc", "def")
End If
End Sub
大文字小文字の区別に注意
デフォルトでは、「大文字小文字を区別する」という仕様になっています。
大文字小文字を区別したくない場合は、第6引数に「vbTextCompare」を指定してください。
空白に注意
セルが空白の場合、エラーにはなりませんが、置換もされません。
予期せぬ結果に注意しましょう。
全角半角の違いに注意
大文字小文字と同様に、全角半角も区別されます。
しかしながら、全角半角は区別しないようにする方法がありません。
カナは全角、英数字は半角などと作成者と取り決めをしましょう。
数値や日付に注意
数値や日付はうまく置換されない場合があります。
必要に応じて「CStr」などで文字列に変換してください。
うまく動作しないときの対処法
置換されない
下記のような原因が考えられます。
- セルの値(元の文字列)がカラか存在しない
- セルの値が数式になっている
- セルの値が日付や数値になっている
- 検索文字列が存在しない(大文字小文字、全角半角に注意)
前項で解説しておりますので、ご参考ください。
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAのReplaceについて解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!