【VBA入門】Replace関数とReplaceメソッドで文字列の置換

Replaceって使っていますか?Replaceはある文字列を検索して、別の文字列に置き換えます。

一口に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置換する文字列数を指定
省略の場合、すべて置換
comparevbBinaryCompare(0)バイナリモードで比較
大文字と小文字を区別する
vbTextCompare(1)テキストモードで比較
大文字と小文字を区別せず

引数のstartとcountは一緒に使用します。

戻り値は引数の指定によって変わってくるので、これも表にまとめます。

条件戻り値
expressionが長さ0の文字列(””)長さ0の文字列("")
expressionがNullの場合エラー
findが長さ0の文字列("")expressionのコピー
replaceが長さ0の文字列("")indがすべて削除されたexpressionのコピー
startの値がexpressionの文字数より大きい長さ0の文字列("")
countが0expressionのコピー

引数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

実行結果:
Replace01

このサンプルコードでは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

実行結果:
Replace02

このサンプルコードでは、改行コード「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

実行結果:
Replace03

このサンプルコードでは、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

実行結果:
Replace01

このサンプルコードでは、まず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

実行結果:
Replace01

このサンプルコードでは、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置換するデータを指定
LookAtxlPart一部が一致するセルを検索
xlWhole全部が一致するセルを検索
SearchOrdexlByRows検索方向を列で指定
xlByColumns検索方向を行で指定
MatchCaseTrue大文字と小文字を区別
False区別しない(デフォルトの設定)
MatchByteTrue半角と全角を区別する
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

実行結果:
Replace04

このサンプルコードでは、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

実行結果:
Replace05

このサンプルコードでは、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

実行結果:
Replace07

このサンプルコードでは、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

実行結果:
Replace06

このサンプルコードでは、Replaceメソッドを使って文字列「侍」を「Samurai」に、「エンジニア」を「Engineer」に置換しています。

Replaceメソッドの引数LookAtをxlPartで指定して、一部が一致するセルを検索し置換するように設定しています。Replaceメソッドの引数WhatとReplacementに指定する複数の文字列をDictionaryオブジェクトmyDicに格納しています。

変換元の検索する文字列をDictionaryオブジェクトのキーに、変換後の置換する文字列を値に指定しています。

myDicの要素をFor Eachステートメントを使って、Replaceメソッドの引数WhatとReplacementに繰り返し指定することで複数の文字列で検索してそれぞれの条件で置換しています。

まとめ

ここでは、Replaceの使い方について説明しました。

文字列の中から指定の文字列を置き換えるReplace関数と、セル範囲の中から指定の文字列を置き換えるReplaceメソッドがあります。それぞれで呼び出し方、引数の指定が違いますので混同せずに使い分けるようにしましょう。

使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説