今回は VBA で 指定した文字列を検索して別の文字列に置き換える方法を解説します。それには Replace関数 を使うのですけど、この関数は使い方に気をつけないと大変なことになってしまいます。
【VBA】Replace関数
VBA の Replace 関数は次のような形で引数を指定することになっています。
=Replace(文字列,検索文字列, 置換文字列 [,開始位置 [,置換数 [,比較モード]]])
[] の中は省略できる引数ですが、これを全部省略すると指定した [文字列] の中にある [検索文字列] を全て [置換文字列] に変えます。例を見てみましょう。
'[VBA] Replace関数でAをBに置き換えるマクロ Sub Change_AB() Dim mystr1 As String Dim mystr2 As String mystr1 = "AAAAA" mystr2 = Replace(mystr1, "A", "B") Debug.Print mystr2 End Sub
Change_AB() を実行すると「AAAAA」という文字列が全て「BBBBB」に変わります。少し細かいことを言うと、文字列の先頭から A という文字を検索して、順に B という文字列に置き換えているのです。今度は開始位置も指定するマクロを書いてみます。
'[VBA] 3文字目からXをYに置き換えるマクロ Sub Change_XY_1() Dim mystr1 As String Dim mystr2 As String mystr1 = "XXXXX" mystr2 = Replace(mystr1, "X", "Y", 3) Debug.Print mystr2 End Sub
コードを見ると、なんとなく「XXXXX」を「XXYYY」に変えるような気がするでしょ? 常識的に考えるとそうですよね。でも違うのです。Change_XY_1 を実行すると先頭の 2 文字は消えてしまって「YYY」という文字列が表示されます。こばとも最初にこの関数を使ったときは勘違いしちゃって、「ひゃああ! 勝手に文字を消さないでくださいな!」と大騒ぎしましたよ。だからこの Replace 関数の機能を正確に表現すると「指定した文字列を指定の位置から検索して別の文字列に置き換えて、指定位置以降の文字列を取り出す」関数です。ややこしい表現だから無理に覚えることないけどね。次は4つめの引数である [置換数] も指定してみましょう。
'[VBA] 3文字目から2文字のXをYに置き換えるマクロ Sub Change_XY_2() Dim mystr1 As String Dim mystr2 As String mystr1 = "XXXXX" mystr2 = Replace(mystr1, "X", "Y", 2, 3) Debug.Print mystr2 End Sub
Change_XY_2() を実行すると、やっぱり先頭の文字は消えてしまって「YYYX」と表示されます。あと、5つめの引数の [比較モード] はややこしくて滅多に使わないし、別の記事で解説するので、あまり気にしないでくださいな。
➡【VBA】Split関数で文字列を分解します
Replace 関数を使って文字列内の全てのスペースを消すことができます。” ” を “” に置き換えればいいのです。
'[VBA] スペースを消すプロシージャ Sub Delete_String_Space() Dim mystr1 As String Dim mystr2 As String mystr1 = "A BC D E" mystr2 = Replace(mystr1, " ", "") Debug.Print mystr2 End Sub
Delete_String_Space を実行すると「A BC D E」という文字列の中にあるスペースを全部消して「ABCDE」と表示します。
【VBA討論】Replace関数と正規表現
執筆:ChatGPT
タイトル:文字列の置換における王者はReplaceか? VBAのReplace関数に関する討論!
場面:IT部門の会議室。数人のIT社員が集まって討論を行っている。
登場人物:
ジェイソン(主張:Replace関数が最強)
リサ(主張:正規表現の方が便利)
ダニエル(主張:Replace関数は簡単で使いやすい)
エミリー(中立的な立場)
ジェイソン:Replace関数は文字列の置換において王者だと思うんだ。簡単に使えて、特定のテキストを一括で置換できるし、パターンマッチングの必要がないから安心だよ。
リサ:でも、正規表現を使えばより柔軟な置換ができると思うんだ。パターンに一致する複数のテキストを置換できるし、より高度なパターンマッチングが可能だよ。
ダニエル:ジェイソンもリサもそれぞれの意見は理解できるけど、Replace関数は初心者にも使いやすいんだ。正規表現はパターンの書き方に慣れる必要があるし、複雑なパターンの場合はエスケープ文字なども考慮しなければならない。
エミリー:みんなの主張はそれぞれの立場に基づいていて興味深いね。Replace関数は簡単で使いやすい反面、正規表現はより柔軟なパターンマッチングが可能だというメリットもある。どちらが最適な方法かは、具体的な要件やタスクによって異なるかもしれないね。
ジェイソン:確かに、Replace関数はシンプルで理解しやすい。一括で特定のテキストを置換できるので、多くの場面で十分に機能すると思う。
リサ:でも、正規表現はより複雑な置換操作が可能だから、高度なパターンマッチングが必要な場合には非常に役立つと思うんだ。柔軟性が求められる場面では、正規表現の方が優れているかもしれないね。
エミリー:私たちが追求すべきは、置換操作の目的や要件に適した方法を見つけることだと思います。Replace関数のシンプルさや正規表現の柔軟性、どちらの特徴を重視するかは、具体的なタスクの要件やプロジェクトの制約によって異なるでしょう。
コメント
Replace関数の開始位置、僕もハマりました…
開始位置と言えば、ただ「検索を開始する位置」と思いますよねぇ(汗)
まさか開始位置以前が削除されるなんて夢にも思いませんでした(笑)
VBAのReplaceは本当にややこしい関数ですよね。
でも、こういう失敗も後から思い返すと笑い話になります。
これからも、お互い楽しみながらプログラミングのスキルを上達させましょう(^-^)/。