Replaceって使っていますか?Replaceはある文字列を検索して、別の文字列に置き換えます。
一口にReplaceと言っても、文字列の中から指定の文字列を置き換えるReplace関数と、セル範囲の中から指定の文字列を置き換えるReplaceメソッドがあります。ちょっと混乱しそうですね。
この記事では、Replaceについて
Replace関数について
- 正規表現による文字列の置換
- 複数条件の置換
Replaceメソッドについて
- ワイルドカードの使い方
- 複数条件の置換
など基本的な内容から、応用的な内容についても解説していきます。
今回はReplaceについて、使い方をわかりやすく解説します!
Replace関数とReplaceメソッド
冒頭でもご紹介しましたが、Replaceはある文字列を検索して、別の文字列に置き換えます。
VBAには文字列の中から指定の文字列を置き換えるReplace関数と、セル範囲の中から指定の文字列を置き換えるReplaceメソッドがあります。
指定の文字列をただ検索する場合であれば、ある文字列の中から検索するInStr関数とセル範囲の中から検索するFindメソッドと名前が違うのですが、置き換えの場合はどちらもReplaceと同じで混乱しそうですね。
それぞれで呼び出し方、引数の指定が違いますので目的にあわせて使い分けるようにしましょう。
Replace関数とReplaceメソッドに分けて解説していきます!
Replace関数の使い方
Replace関数はある文字列の中から指定した文字列を検索し、別の文字列に置き換えるために使います。
Replace関数は以下のように記述します。
Replace(expression, find, replace[, start[, count[, compare]]])
引数の中で「[ ]」で囲まれた部分は省略することができます。
引数の指定について表にまとめました。
引数 | 定数(値) | 説明 |
---|---|---|
expression | ー | 置換する文字列を含む文字列 |
find | ー | 検索する文字列 |
replace | ー | 置換する文字列 |
start | ー | 検索開始位置を指定 |
count | ー | 置換する文字列数を指定 省略の場合、すべて置換 |
compare | vbBinaryCompare(0) | バイナリモードで比較 大文字と小文字を区別する |
vbTextCompare(1) | テキストモードで比較 大文字と小文字を区別せず |
引数のstartとcountは一緒に使用します。
戻り値は引数の指定によって変わってくるので、これも表にまとめます。
条件 | 戻り値 |
---|---|
expressionが長さ0の文字列(””) | 長さ0の文字列("") |
expressionがNullの場合 | エラー |
findが長さ0の文字列("") | expressionのコピー |
replaceが長さ0の文字列("") | indがすべて削除されたexpressionのコピー |
startの値がexpressionの文字数より大きい | 長さ0の文字列("") |
countが0 | expressionのコピー |
引数replaceを長さ0の文字列(“”)で指定すると、findで指定した文字列をすべて削除した文字列を返します。
サンプルコードで確認しましょう。
Sub macro1() Dim exp As String, fnd As String, rpl As String exp = "東京都 千代田区 丸の内 1丁目" fnd = " " '半角スペース rpl = "" '空文字 MsgBox Replace(exp, fnd, rpl) End Sub
実行結果:
このサンプルコードではString型変数exp内の半角スペースを空文字に置き換えることで半角文字を削除しています。
改行コードの置換
改行コード「vbCrLf」を検索して置換することもできます。
サンプルコードで確認しましょう。
Sub macro2() Dim exp As String, fnd As String, rpl As String exp = "東京都" & vbCrLf & "千代田区" & vbCrLf & "丸の内" & vbCrLf & "1丁目" fnd = vbCrLf '改行コード rpl = "" '空文字 MsgBox exp & vbCrLf & Replace(exp, fnd, rpl) End Sub
実行結果:
このサンプルコードでは、改行コード「vbCrLf」を空文字(“”)に置き換え削除しています。
大文字と小文字の区別について
Replace関数は引数を設定しなければ、大文字と小文字を区別して置換します。
大文字と小文字の区別をなしにしたい場合は、引数のcompareをvbTextCompareに指定します。
Sub macro3() Dim exp As String, fnd As String, rpl As String Dim msg As String exp = "Hello VBA!" fnd = "vba" rpl = "vba" 'バイナリで比較 msg = msg & Replace(exp, fnd, rpl) & vbCrLf 'テキストで比較 msg = msg & Replace(exp, fnd, rpl, compare:=vbTextCompare) MsgBox msg End Sub
実行結果:
このサンプルコードでは、Replace関数の引数findを検索する際にバイナリーモードで大文字と小文字を区別する場合とテキストモードで大文字と小文字を区別しない場合で置換をしています。
引数compareを指定せず、デフォルト設定のバイナリーモードの場合、大文字と小文字で違うので検索で見つからずに文字列の置換が行われていません。
これに対して引数compareをvbTextCompareで指定しテキストモードの場合は、文字列の置換が行われています。
正規表現による文字列の置換
Replace関数は正規表現を使って置換することはできません。
正規表現を別の文字列に置換するにはRegExpオブジェクトのReplace関数を使います。
サンプルコードで確認していきましょう。
Sub macro4() 'RegExpオブジェクトの作成 Dim reg As Object Set reg = CreateObject("VBScript.RegExp") '正規表現の指定 With reg .Pattern = "[a-z]" 'パターンを指定 .IgnoreCase = False '大文字と小文字を区別するか(False)、しないか(True) .Global = True '文字列全体を検索するか(True)、しないか(False) End With Dim str1 As String, str2 As String str1 = "東京都a千代田区b丸の内c1丁目" str2 = reg.Replace(str1, "") '指定した正規表現を第2引数の区切り文字に変換 MsgBox str2 End Sub
実行結果:
このサンプルコードでは、まずaからzのアルファベット(小文字)を正規表現として指定しています。
RegExpオブジェクトのPatternプロパティを使って正規表現を指定します。
そのあとでRegExpオブジェクトのReplace関数を使って正規表現を空文字(””)に変換しています。
複数条件の置換について
Replace関数は検索する文字列を複数指定することはできません。
検索する文字列を複数指定したい場合は、Replace関数を繰り返し使いましょう。
Sub macro5() Dim str As String, arr() As Variant str = "東京都a千代田区b丸の内c1丁目" arr = Array("a", "b", "c") For Each elm In arr str = Replace(str, elm, "") Next elm MsgBox str End Sub
実行結果:
このサンプルコードでは、Replace関数の引数findに指定する複数の文字列を動的配列arrに格納しています。
動的配列arrの要素をFor Eachステートメントを使って、Replace関数の引数findに繰り返し指定することで複数の文字列で検索して空文字(“”)に置換しています。
Replaceメソッドの使い方
Replaceメソッドは、指定したセル範囲内から検索した文字列を他の文字列に置換する場合に使用します。
Rangeオブジェクトから呼び出します。
Object.Replace(What, Replacement, LookAt, SearchOrder, MatchCase, MatchByte, SearchFormat, ReplaceFormat)
Objectにはセル範囲のRangeオブジェクトを指定します。
戻り値はBoolean型です。検索するデータがみつかった場合は、Trueを返します。
検索するデータを含むセルが存在しない場合は、Falseを返します。Replaceメソッドは引数で検索条件を指定します。
引数が多いのでそれぞれの引数の説明を表にまとめました。
引数 | 定数 | 説明 |
---|---|---|
What | ー | 検索するデータを指定 |
Replacement | ー | 置換するデータを指定 |
LookAt | xlPart | 一部が一致するセルを検索 |
xlWhole | 全部が一致するセルを検索 | |
SearchOrde | xlByRows | 検索方向を列で指定 |
xlByColumns | 検索方向を行で指定 | |
MatchCase | True | 大文字と小文字を区別 |
False | 区別しない(デフォルトの設定) | |
MatchByte | True | 半角と全角を区別する |
False | 区別しない(デフォルトの設定) | |
SearchFormat | ー | 検索書式を指定 |
ReplaceFormat | ー | 置換書式を指定 |
引数のWhatとReplacementは必ず指定する必要があります。
その他の指定は省略することができます。
完全一致の場合
全部が一致するセルを置換する場合は、Replaceメソッドの引数LookAtをxlWholeで指定します。
サンプルコードでみていきましょう。
Sub macro6() Dim myRange As Range Dim keyWord1 As String, keyWord2 As String Dim bool As Boolean Set myRange = Range("B2:B5") keyWord1 = "エンジニア" keyWord2 = "engineer" bool = myRange.Replace(keyWord1, keyWord2, LookAt:=xlWhole) End Sub
実行結果:
このサンプルコードでは、Replaceメソッドを使って文字列「エンジニア」を「engineer」に置換しています。
Replaceメソッドの引数LookAtをxlWholeで指定して、全部が一致するセルを検索し置換するように設定しています。
部分一致の場合
一部が一致するセルを置換する場合は、Replaceメソッドの引数LookAtをxlPartで指定します。
Sub macro7() Dim myRange As Range Dim keyWord1 As String, keyWord2 As String Dim bool As Boolean Set myRange = Range("B2:B5") keyWord1 = "エンジニア" keyWord2 = "engineer" bool = myRange.Replace(keyWord1, keyWord2, LookAt:=xlPart) End Sub
実行結果:
このサンプルコードでは、Replaceメソッドを使って文字列「エンジニア」を「engineer」に置換しています。
Replaceメソッドの引数LookAtをxlPartで指定して、一部が一致するセルを検索し置換するように設定しています。
ワイルドカードの使い方
Replaceメソッドの引数Whatにはワイルドカードを使って指定することができます。
サンプルコードで確認しましょう。
Sub macro8() Dim myRange As Range Dim keyWord1 As String, keyWord2 As String Dim bool As Boolean Set myRange = Range("B2:B5") keyWord1 = "侍*" 'ワイルドカードを使用 keyWord2 = "Samurai" bool = myRange.Replace(keyWord1, keyWord2, LookAt:=xlWhole) End Sub
実行結果:
このサンプルコードでは、Replaceメソッドの引数Whatに「*」(アスタリスク)を使ってワイルドカードで指定しています。
「侍*」で指定していますので、セル内の文字列の先頭が「侍」であれば「Samurai」に置換さています。
複数条件の置換について
これまでは1つのデータで検索し、置換する場合についてみてきました。
複数のデータで検索し、置換する場合についてみていきましょう。ただし、Replaceメソッドは複数の条件を指定することができませんので、Replaceメソッドを繰り返しで使用する必要があります。
サンプルコードで確認しましょう。
Sub macro9() 'Dictionaryオブジェクトの宣言 Dim myDic As Object Set myDic = CreateObject("Scripting.Dictionary") 'Dictionaryオブジェクトの初期化、要素の追加 myDic.Add "侍", "Samurai" myDic.Add "エンジニア", "Engineer" 'Dictionaryオブジェクトを使った複数条件の置換 Dim bool As Boolean, myRange As Range Set myRange = Range("B2:B5") For Each Var In myDic bool = myRange.Replace(Var, myDic(Var), LookAt:=xlPart) Next Var End Sub
実行結果:
このサンプルコードでは、Replaceメソッドを使って文字列「侍」を「Samurai」に、「エンジニア」を「Engineer」に置換しています。
Replaceメソッドの引数LookAtをxlPartで指定して、一部が一致するセルを検索し置換するように設定しています。Replaceメソッドの引数WhatとReplacementに指定する複数の文字列をDictionaryオブジェクトmyDicに格納しています。
変換元の検索する文字列をDictionaryオブジェクトのキーに、変換後の置換する文字列を値に指定しています。
myDicの要素をFor Eachステートメントを使って、Replaceメソッドの引数WhatとReplacementに繰り返し指定することで複数の文字列で検索してそれぞれの条件で置換しています。
まとめ
ここでは、Replaceの使い方について説明しました。
文字列の中から指定の文字列を置き換えるReplace関数と、セル範囲の中から指定の文字列を置き換えるReplaceメソッドがあります。それぞれで呼び出し方、引数の指定が違いますので混同せずに使い分けるようにしましょう。
使いこなすことができるように、この記事を何度も参考にして下さいね!