みなさんは、VBAでReplace関数を使ったことがありますか?
- VBAで任意の文字列を他の文字列に置き換えたい
- Replace関数の使いどころがわからない
- Replace関数の利用の仕方を実例付きで知りたい!
そこで今回は、任意の文字列を他の文字列に置き換えるReplace関数の使い方と実務での応用方法をサンプルコード付きで紹介します。
VBAでのReplace関数の使い方
Replace関数は、文字列から任意の文字列を検索して指定した文字列に置き換える関数です。- 基本構文
Replace(対象文字列, 検索文字列, 置換文字列 [, 開始位置][, 置換回数][, 比較形式])
- [, 開始位置][, 置換回数][, 比較形式]は省略可能(省略した場合、それぞれ「1」「すべて置換」「バイナリモード(大文字・小文字を区別する)」となる)
- コード例
Replace("ABCDE", "E", "EF")
まず、対象文字列「ABCDE」から検索文字列「E」を検索します。続いて、見つかった「E」を置換文字列「EF」に置き換えて「ABCDEF」を返します。Replace関数の引数について
Replace関数に指定できる引数一覧
- 基本構文
Replace(対象文字列, 検索文字列, 置換文字列 [, 開始位置][, 置換回数][, 比較形式])
引数 | 省略 | 詳細 |
---|---|---|
対象文字列 | 省略不可 | 置換処理が実行される文字列 |
検索文字列 | 省略不可 | 対象文字列内で検索される文字列 |
置換文字列 | 省略不可 | 検索文字列と置き換えされる文字列 |
開始位置(Start) | 省略可 | 検索を開始する位置(省略時は「1」) |
置換回数(Count) | 省略可 | 置換を行う回数(省略時は全て置換) |
比較形式(Compare) | 省略可 | 「vbBinaryCompare(0)」(大文字小文字を区別)もしくは 「vbTextCompare(1)」(大文字小文字を区別しない)を指定 (省略時は「vbBinaryCompare(0)」) |
その他の省略可能引数を指定した場合の実例
第四引数「開始位置」を指定した場合
- コード例
Replace("ABCDE", "E", "A", 3)
まず、第四引数「開始位置」に「3」が指定されているので対象文字列は「CDE」となります。その中から検索文字列「E」を検索して置換文字列「A」に置き換え、返り値は文字列「CDA」となります。第五引数「置換回数」を指定した場合
- コード例
Replace("ABCABCABC", "A", "", , 2)
第四引数「開始位置」を省略しているので、対象文字列「ABCABCABC」から検索文字列「A」を検索します。対象文字列に「A」が3つありますが、第五引数「置換回数」に「2」が指定されているので「2」回だけ置換を実行します。先頭から見つかった順に「2」回、検索文字列「A」を置換文字列「””」(空文字列)に置き換えるので、返り値は「BCBCABC」となります。
第六引数「比較形式」を指定した場合
第六引数の指定は下記の定数で行います。- 「vbBinaryCompare(0)」:大文字と小文字を区別
- 「vbTextCompare(1)」:大文字と小文字を区別しない
- 第六引数に「vbBinaryCompare(0)」を指定
Replace("ABCDE", "a", "", , , 0)
対象文字列「ABCDE」から検索文字列「a」を検索して、置換文字列「””」(空文字列)に置き換えを行います。この時、第六引数の比較形式に「0」を指定しているため、大文字と小文字が区別されて検索されます。よってこの場合、置換は実行されず返り値は「ABCDE」となります。- 第六引数に「vbTextCompare(1)」を指定
Replace("ABCDE", "a", "", , , 1)
対象文字列「ABCDE」から検索文字列「a」を検索して、置換文字列「””」(空文字列)に置き換えを行います。この時、第六引数の比較形式に「1」を指定しているため、大文字と小文字は区別されずに検索されます。よってこの場合、置換が実行され、返り値は「BCDE」となります。Replace関数の実務での利用方法
スペースを半角に統一する
'対象となるシートを定義
Dim trgtSh As Worksheet
Set trgtSh = ThisWorkbook.Worksheets("サンプル")
'ForNextを使って対象範囲全てに置き換えを適用
Dim i As Long
Dim trgtRng As Range
Dim trgtStr As String
For i = 1 To 10
'対象となるセルを定義
Set trgtRng = trgtSh.Cells(i, 1)
'対象セルの値を変数に定義
trgtStr = trgtRng.Value
'文字列中の全角スペースを半角スペースに変換
trgtStr = Replace(trgtStr, " ", " ")
'半角スペースに変更した値を対象セルに書き込み
trgtRng.Value = trgtStr
Next i
はじめに、次の部分で対象となるワークシート「サンプル」を変数「trgtSh」に定義しています。'対象となるシートを定義
Dim trgtSh As Worksheet
Set trgtSh = ThisWorkbook.Worksheets("サンプル")
続いてメイン処理である「ForNext」を実行します。'ForNextを使って対象範囲全てに置き換えを適用
Dim i As Long
Dim trgtRng As Range
Dim trgtStr As String
For i = 1 To 10
'対象となるセルを定義
Set trgtRng = trgtSh.Cells(i, 1)
~~~
Next i
「ForNext」は、カウンターに設定した変数(「i」)がループごとに変化する処理です。ここでは「i」が「1 To 10」となっているので「1」から「10」まで変化します。範囲内の次のセルを順番に「trgtRng」に定義していく処理となります。
- trgtSh.Cells(1, 1)
- trgtSh.Cells(2, 1)
- trgtSh.Cells(3, 1)
- trgtSh.Cells(4, 1)
- trgtSh.Cells(5, 1)
- trgtSh.Cells(6, 1)
- trgtSh.Cells(7, 1)
- trgtSh.Cells(8, 1)
- trgtSh.Cells(9, 1)
- trgtSh.Cells(10, 1)
'対象セルの値を変数に定義
trgtStr = trgtRng.Value
'文字列中の全角スペースを半角スペースに変換
trgtStr = Replace(trgtStr, " ", " ")
'半角スペースに変更した値を対象セルに書き込み
trgtRng.Value = trgtStr
まず、セルの値を変数「trgtStr」に定義します。次にReplace関数を使って「trgtStr」内の「” ”」(全角スペース)を「” “」(半角スペース)に置き換えます。最後に元のセル「trgtRng」の値に全角スペースを半角スぺ—スに置き換えた「trgtStr」を設定します。「ForNext」ループが終了すれば、文字列内のスペースを半角に統一することができます。
任意の語句を削除して部門部課から課だけを取り出す
'対象となる部門部課を定義
Dim trgtStr As String
trgtStr = "営業部営業第一課"
'削除対象の文字列(部)を定義
Dim delStr As String
delStr = "営業部"
'部門部課から部を削除して課を取り出す
Dim sectionStr As String
sectionStr = Replace(trgtStr, delStr, "")
まず、前半の次の部分で「部門部課」全体の文字列(「trgtStr」)と、削除したい「部」全体の文字列(「delStr」)を定義しています。'対象となる部門部課を定義
Dim trgtStr As String
trgtStr = "営業部営業第一課"
'削除対象の文字列(部)を定義
Dim delStr As String
delStr = "営業部"
最後に、Replace関数を使って、「部門部課」全体の文字列(「trgtStr」)から、削除したい「部」全体の文字列(「delStr」)を「””」(空文字)に置き換えることで、「課」全体の文字列(「sectionStr」)を取り出すことができます。'部門部課から部を削除して課を取り出す
Dim sectionStr As String
sectionStr = Replace(trgtStr, delStr, "")
「かっこ」内の文字を取り出す
'対象の文字列を定義
Dim trgtStr As String
trgtStr = "(ABCDE)"
'対象文字列から、「"("」 と 「")"」を削除する
trgtStr = Replace(Replace(trgtStr, "(", ""), ")", "")
まず、Replace関数を使って「trgtStr」に定義した(ABCDE)」内の「”(””」を「””」(空文字列)に置き換えます。さらに、再度Replace関数を使って、置換後の文字列「ABCDE)」内の「”)”」を「””」(空文字列) に置き換えます。
以上の処理で「trgtStr」に定義した「(ABCDE)」から「”(”」「”)”」を削除し、かっこ内の文字列「ABCDE」を取り出すことができました。
このように連続していない複数の文字列に置換を行いたい場合は、Replace関数を重ねて使用することで目的の文字列を取り出すことができます。
フルパスをディレクトリとファイル名に分ける
'フルパスを定義
Dim trgtPath As String
trgtPath = "C:\サンプル\SampleFile.xlsx"
'ディレクトリを取得
Dim dirStr As String
dirStr = Left(trgtPath, InStrRev(trgtPath, ""))
'ファイルネームを取得
Dim fileName As String
fileName = Replace(trgtPath, dirStr, "")
まず次の部分で、ディレクトリとファイル名に分けたいフルパス「trgtPath」から、ディレクトリ「dirStr」を取り出します。'フルパスを定義
Dim trgtPath As String
trgtPath = "C:\サンプル\SampleFile.xlsx"
'ディレクトリを取得
Dim dirStr As String
dirStr = Left(trgtPath, InStrRev(trgtPath, ""))
画像のように「InStrRev(trgtPath, “\”)」の部分で末尾の「\」の位置、つまりファイル名が始まる直前の位置を取得しLeft関数でそれよりも前の文字列であるディレクトリを取得しています。- Left(文字列, 数値)
- 対象「文字列」を「数値」で指定した文字数だけ左から取り出す
- ex)Left(“ABCDE”, 3) → “ABC”
- InStrRev(文字列1, 文字列2)
- 対象「文字列1」の内、末尾から「文字列2」を検索し、その開始位置を返す
- ex)InStrRev(“ABCABC”, “B”) → 5
'ファイルネームを取得
Dim fileName As String
fileName = Replace(trgtPath, dirStr, "")
画像のように「Replace関数」を使って、フルパス「trgtPath」からディレクトリ名「dirStr」を「空の文字列」に置き換えることでファイル名「fileName」を取得しています。以上で、フルパスをディレクトリとファイル名に分けることができました。
また、ファイル名の取得は、Dir関数でも行うことができますので、あわせてご覧ください。
Left関数については、下記でも詳しく解説しているので、読んでみてください。
VBAでのReplace関数まとめ
今回はVBAでのReplace関数の使い方と実務での使用方法を紹介いたしました。VBAReplace関数の実務での利用方法
引数「比較形式」に「0」を指定すると大文字・小文字を区別、「1」を指定すると大文字・小文字を区別しないことや、引数「開始位置」や「置換回数」の指定の仕方についても覚えておきましょう。まずは実例通り使ってみると、理解が深まり応用が効くのでおすすめです。- スペースを半角に統一する
- 任意の語句を削除して部門部課から課だけを取り出す
- 「かっこ」内の文字を取り出す
- フルパスをディレクトリとファイル名に分ける
ぜひ使ってみてください。