VBA Replace関数|文字列を効率よく置換する方法を解説

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

「VBAで文字列の置換をするにはどうしたらいいんだろう?」
こんな疑問をお持ちではありませんか?


特定の文字列を別の文字列に変換したい

・セル内の複数のキーワードを一括で置換したい

その場合は、VBAの「Replace関数」を
使用すると解決します!


VBAのReplace関数 を使用すると、次のような動作を簡単に実現することができます。

  • VBAで文字列を検索し置換
  • 配列を使った高度な検索・置換
  • Replace関数を活用して業務効率を大幅に向上

この記事では、初心者でも分かりやすいように、Replace関数について具体例を交えながら解説していきます。
最後までお読みいただくことで、Replace関数をマスターし、業務で即活用できるスキルが身につきます!


【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

目次

この記事で「できるようになる」こと

スポンサーリンク

VBAのReplace関数はどんなことができるのか?

そもそもReplace関数ってどんなことができるの?

Replace関数は、指定した文字列の中で特定の文字や部分を別の文字に置き換えるためのVBA関数です。

文字列操作を効率化し、Excel VBAでのデータ処理をより簡単にしてくれます。

Replace関数の主な特徴

特徴
  • 文字列の一部を検索して置換
    • 例: 'apple''orange' に置換する処理が簡単にできます。
  • 開始位置の指定が可能
    • 任意の箇所から置換を開始することで、部分的な操作にも対応します。
  • 大文字・小文字の区別を選択可能
    • 検索時に大文字と小文字を区別するかどうかを柔軟に選べます。

Replace関数の用途

Replace関数は、次のような場面で特に活躍します。

特徴
  • Excelシートのデータ一括編集
    • 商品リスト内の特定ワードを一括置換することができます。
      例: 「商品名に含まれる全角スペースを半角スペースに変換」
  • ログデータの加工
    • 不要な記号やスペースを一括削除して、クリーンなデータに変換できます。
      例: 「ログ内のタイムスタンプに不要な括弧を除去」
  • 配列データの処理
    • 複数の検索ワードを一括置換し、複雑なデータ操作も効率化。

次のセクションでは、Replace関数の基本的な使い方を具体例を交えて解説しますので、ぜひご覧ください!

VBA Replace関数の基礎と初心者向け簡単な使用例を徹底解説

ここでは、VBAで文字列を置換する際に便利なReplace関数について、基礎から簡単な使用例までを丁寧に解説します。

初心者でも実際に試しながら学べる構成ですので、ぜひ最後までご覧ください!

構文と引数の基本

Replace(expression, find, replace, [ start, [ count, [ compare ]]])
スクロールできます
引数必須/任意説明初期値
expression必須処理対象となる文字列
find必須検索する文字列
replace必須置換後の文字列
start任意検索を開始する位置(デフォルトは1)1
count任意置換する回数(省略時はすべて置換)全て置換
compare任意バイナリ比較またはテキスト比較を指定
vbBinaryCompare または vbTextCompare
vbBinaryCompare

さらに詳細な仕様については、Microsoft公式のReplace 関数を参照してください。

文字列比較モード(compare引数)の詳細解説

Replace関数のcompare引数を使うことで、検索時の文字列の比較方法を指定できます。
ここでは、初心者がよく使う2つの設定を中心に解説します。

■ よく使う2つの値
スクロールできます
設定名説明
vbBinaryCompare
(デフォルト)
文字コードそのものを比較します。
ひらがな・カタカナ、全角・半角、大文字・小文字をすべて区別します
vbTextCompareテキストとして比較します。
ひらがな・カタカナ、全角・半角、大文字・小文字を区別しません
特殊なケースで使う値つの値
スクロールできます
設定名説明
vbUseCompareOptionファイルの上部で設定する「Option Compare」の設定を使用します
(通常はBinary)。
vbDatabaseCompareMicrosoft Access専用です。
Accessのデータベース設定に基づいて文字列を比較します。Excel VBAでは使えません。

Replace関数の基本的な使用例をご紹介

以下に、初心者でも簡単に使える基本的なコード例を紹介します。

使用例1:文字列を別の文字列に単純置換する

以下のコードでは、「りんご」を「オレンジ」に置換します。

Sub ReplaceBasicExample()
    Dim text As String
    Dim result As String
    
    '// 変換前のテキスト
    text = "私はりんごが好きです。りんごは私のお気に入りの果物です。"
    
    '//Replace関数で置換
    result = Replace(text, "りんご", "オレンジ")
    
    '// 結果出力
    MsgBox "変換前: " & text & vbCrLf & "" & vbCrLf & "変換後: " & result
End Sub
■ 結果
使用例1:文字列の単純置換の結果

使用例2:ひらがな・カタカナの違いを考慮した置換

Replace関数では、「ひらがな」と「カタカナ」を区別するかどうかを引数compareで指定できます。

Sub ReplaceHiraganaKatakana()
    Dim text As String
    Dim resultSensitive As String
    Dim resultInsensitive As String
    
    '// 変換前のテキスト
    text = "りんごとリンゴは同じではありません。"
    
    '// ひらがな・カタカナを区別する置換
    resultSensitive = Replace(text, "りんご", "オレンジ", , , vbBinaryCompare)
    
    '// ひらがな・カタカナを区別しない置換
    resultInsensitive = Replace(text, "りんご", "オレンジ", , , vbTextCompare)
    
    MsgBox "元の文字列: " & text & vbCrLf & vbCrLf & _
           "区別あり: " & resultSensitive & vbCrLf & vbCrLf & _
           "区別なし: " & resultInsensitive
End Sub
■ 結果
使用例2:ひらがなとカタカナの区別を使った検索・置換の結果
スポンサーリンク

Replace関数を使う際の注意点とトラブル回避のコツ

Replace関数を利用する際には、意図しない動作や制限に注意する必要があります。

ここでは、特に初心者がつまずきやすい注意点をわかりやすく解説します。

注意1: 空白削除で意図しないトラブルが発生するかも

Replace関数を使って空白を削除する際には、すべての空白が削除されることで、可読性やフォーマットが損なわれる場合があります。

このように、空白削除による弊害を防ぐためには、削除対象を明確に指定し、適切な関数を選択することが重要です。

問題のコード例

以下のコードは、文章内のすべての空白を削除してしまう例です。

Sub ReplaceAllSpaces()
    Dim text As String
    Dim result As String

    '// 元の文字列
    text = "Hello World! Welcome to VBA."

    '// 空白を削除
    result = Replace(text, " ", "")

    '// 結果を表示
    MsgBox "変換前: " & text & vbCrLf & vbCrLf & _
        "変換後: " & result
End Sub
■ 処理結果

単語間の空白も削除されてしまい、文章が読みにくくなります。

解決策1: Trim関数を使用して不要な空白のみ削除する

文章全体の空白を削除するのではなく、前後の余計な空白を削除したい場合は、Trim関数を使用するのが効果的です。

Sub TrimSpaces()
    Dim text As String
    Dim result As String

    '// 元の文字列
    text = "   Hello World! Welcome to VBA.   "

    '// 前後の空白のみ削除
    result = Trim(text)

    '// 結果を表示
    MsgBox "変換前: " & text & vbCrLf & "変換後: " & result
End Sub
■ 処理結果
解決策1: Trim関数を使用して不要な空白のみ削除するの結果
ポイント

Trim関数は先頭と末尾の空白だけを削除します。

注意2. ワイルドカードは使用できない

Replace関数では、*?などのワイルドカードを使った柔軟な検索・置換はできません。
これにより、パターンマッチングが必要な場合には限界があります。

コード例:Replace関数でワイルドカードを使おうとすると…

Sub ReplaceWildcardIssue()
    Dim text As String
    Dim result As String
    
    '// 元の文字列
    text = "abc123abc456"
    
    '// ワイルドカード的な置換(実際には動作しない)
    result = Replace(text, "abc*", "")
    
    '// 結果を表示
    MsgBox "変換後: " & result
End Sub
■ 処理結果

このコードでは、ワイルドカードを使用してabc*(abcに続く任意の文字列)を削除しようとしています。
しかし、Replace関数はワイルドカードを解釈しないため、意図した置換は行われません。

解決策: 正規表現を使う

ワイルドカードや複雑なパターンを扱いたい場合は、正規表現「VBScript.RegExpオブジェクト」を利用しましょう。

Sub ReplaceWithRegex()
    Dim regex As Object
    Dim text As String
    Dim result As String
    
    '// 正規表現オブジェクトの作成
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "abc\d+" '// abcに続く1つ以上の数字を検索
    regex.Global = True
    
    '// 元の文字列
    text = "abc123abc456"
    
    '// 正規表現で置換
    result = regex.Replace(text, "")
    
    '// 結果を表示
    MsgBox "変換後: " & result
End Sub
■ 処理結果

正規表現のPatternを具体的に指定することでワイルドカードと同様な処理が可能となります。

解決策: 正規表現を使った結果
ポイント

正規表現を使うことで、パターンマッチングに基づいた柔軟な置換が可能になります。

スポンサーリンク

実践でよく使用されるReplace関数の使用例をご紹介

ここからは、VBAのReplace関数の具体的な使用例を紹介します。

以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

使用例1: 配列内の商品名を一括置換し、変更後のリストを出力する

このコードでは、商品リスト(配列)内の特定の商品名(例: “りんご”)を別の名称(例: “アップル”)に置き換え、変更前後のリストを確認します。

コード例 | 配列内の商品名を一括置換して出力

Sub ReplaceProductNames()
    Dim productList As Variant
    Dim i As Long

    '// 商品リスト
    productList = Array("りんご", "バナナ", "みかん", "りんご", "ぶどう")
    
    '// 置換前を出力
    Debug.Print "置換前の商品リスト: " & Join(productList, ", ")

    '// 配列内の商品名を一括置換
    For i = LBound(productList) To UBound(productList)
        productList(i) = Replace(productList(i), "りんご", "アップル")
    Next i

    '// 置換後を出力
    Debug.Print "置換後の商品リスト: " & Join(productList, ", ")
End Sub

処理結果

コードの動作概要

STEP
配列の商品リストを設定

配列productListに商品名を格納します。
この配列には5つの商品名が含まれています。

STEP
変更前のリストを出力

Debug.Printを使用して、置換前の商品リストをデバッグウィンドウに表示します。

STEP
配列内の商品名を一括置換

Forループを使い、配列内のすべての要素に対してReplace関数を適用します。
「りんご」を「アップル」に置き換えます。

STEP
変更後のリストを出力

置換処理が終わった後、Debug.Printを使って変更後のリストをデバッグウィンドウに出力します。

このコードで使用している機能

スクロールできます
機能名説明
Array配列を作成して複数の商品名を格納します。
Replace配列内の各要素を指定した文字列に置換します。
For配列内の全要素を順に処理するループ処理を行います。
Debug.Printデバッグウィンドウにデータを出力します。
Join配列の要素を1つの文字列に結合します(カンマ区切り)。
LBound / UBound配列の最小/最大インデックスを取得し、ループの範囲を決定します。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ReplaceProductNames()
    • サブルーチン「ReplaceProductNames」を定義します。
      このサブルーチンでは商品リストを一括置換し、変更前後を出力します。
  2. Dim productList As Variant
    • 「productList」: 商品名を格納する配列。
  3. Dim i As Long
    • 「i」: ループ用のインデックス変数。
  4. productList = Array(“りんご”, “バナナ”, “みかん”, “りんご”, “ぶどう”)
    • 商品名を配列「productList」に格納します。
      この例では5つの商品名が含まれています。
  5. Debug.Print “置換前の商品リスト: ” & Join(productList, “, “)
    • 置換前の商品リストをデバッグウィンドウに出力します。
      Join関数を使用して配列をカンマ区切りの文字列に変換しています。
  6. For i = LBound(productList) To UBound(productList)
    • 配列内のすべての要素を処理するため、最小インデックス「LBound」から最大インデックス「UBound」までの範囲でループを開始します。
  7. productList(i) = Replace(productList(i), “りんご”, “アップル”)
    • 現在の配列要素(productList(i))内で、文字列”りんご”を”アップル”に置換します。
  8. Next i
    • 次の要素を処理するためにループを進めます。
  9. Debug.Print “置換後の商品リスト: ” & Join(productList, “, “)
    • 置換後の商品リストをデバッグウィンドウに出力します。
  10. End Sub
    • サブルーチンを終了します。

総括・ポイント

このコードは、配列内の商品名を一括置換する基本的な使用例です。

変更前後をデバッグウィンドウに出力することで、処理内容を可視化しています。

ポイントまとめ
  • Replace関数の応用
    • 配列内の各要素を効率的に置換する方法を学べます。
  • デバッグで変更内容を確認
    • Debug.Printを使って変更前後を比較することで、処理結果を容易に確認できます。
  • 実務での応用
    • 商品リストの表記変更やデータのフォーマット調整に役立つ実用的なコードです。

使用例2: 商品コードリストの特定部分を置換する

このコードでは、商品コードリスト内の特定の文字列(例: “A”)を別の文字列(例: “X”)に置き換え、変更前後をデバッグウィンドウで確認します。

コード例 | 商品コードの一括置換

Sub ReplaceProductCodes()
    Dim productCodes As Variant
    Dim i As Long

    '// 商品コードリスト
    productCodes = Array("A123", "B234", "A456", "C789", "A999")
    
    '// 置換前を出力
    Debug.Print "置換前の商品コードリスト: " & Join(productCodes, ", ")

    '// 配列内の商品コードを一括置換
    For i = LBound(productCodes) To UBound(productCodes)
        productCodes(i) = Replace(productCodes(i), "A", "X")
    Next i

    '// 置換後を出力
    Debug.Print "置換後の商品コードリスト: " & Join(productCodes, ", ")
End Sub

処理結果

コードの動作概要

STEP
商品コードリストの設定

商品コードを配列productCodesに格納します。
この配列には5つの商品コードが含まれています。

STEP
変更前のリストを出力

Debug.Printを使用して、置換前の商品コードリストをデバッグウィンドウに表示します。

STEP
商品コードの一括置換

Forループを使い、配列内のすべての要素に対してReplace関数を適用します。
「A」を「X」に置き換えます。

STEP
変更後のリストを出力

置換処理が終わった後、Debug.Printを使って変更後のリストをデバッグウィンドウに出力します。

このコードで使用している機能

スクロールできます
機能名説明
Array配列を作成して複数の商品コードを格納します。
Replace配列内の各要素を指定した文字列に置換します。
For配列内の全要素を順に処理するループ処理を行います。
Debug.Printデバッグウィンドウにデータを出力します。
Join配列の要素を1つの文字列に結合します(カンマ区切り)。
LBound/UBound配列の最小/最大インデックスを取得し、ループの範囲を決定します。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ReplaceProductCodes()
    • サブルーチン「ReplaceProductCodes」を定義します。
      このサブルーチンでは商品コードリストの特定部分を一括置換します。
  2. Dim productCodes As Variant
    • 「productCodes」: 商品コードを格納する配列。
  3. Dim i As Long
    • 「i」: ループ用のインデックス変数。
  4. productCodes = Array(“A123”, “B234”, “A456”, “C789”, “A999”)
    • 商品コードを配列「productCodes」に格納します。
      この例では5つの商品コードが含まれています。
  5. Debug.Print “置換前の商品コードリスト: ” & Join(productCodes, “, “)
    • 置換前の商品コードリストをデバッグウィンドウに出力します。
      Join関数を使用して配列をカンマ区切りの文字列に変換しています。
  6. For i = LBound(productCodes) To UBound(productCodes)
    • 配列内のすべての要素を処理するため、最小インデックス「LBound」から最大インデックス「UBound」までの範囲でループを開始します。
  7. productCodes(i) = Replace(productCodes(i), “A”, “X”)
    • 現在の配列要素(productCodes(i))内で、文字列”A”を”X”に置換します。
  8. Next i
    • 次の要素を処理するためにループを進めます。
  9. Debug.Print “置換後の商品コードリスト: ” & Join(productCodes, “, “)
    • 置換後の商品コードリストをデバッグウィンドウに出力します。
  10. End Sub
    • サブルーチンを終了します。

総括・ポイント

このコードは、Replace関数を使用して配列内の特定部分を一括置換する実用的な例です。

変更前後のデータを比較することで、処理結果を簡単に確認できます。

ポイントまとめ
  • Replace関数の実用例
    • 商品コードや識別子の一括変更に最適な手法です。
  • デバッグで確認
    • Debug.Printを活用することで、変更前後のデータを比較しやすくなります。
  • 応用可能性
    • 商品コードのフォーマット変更や特定パターンの修正に応用できます。

使用例3: セル内の部門コードを変更して、変更前後を比較

このコードでは、ワークシートのセル範囲内にある部門コード(例: “HR”)を新しい部門コード(例: “Human Resources”)に変更します。
変更前後の結果をデバッグウィンドウで確認します。

コード例 | セル範囲内の部門コードを変更

Sub ReplaceDepartmentCodes()
    Dim ws As Worksheet
    Dim rng As Range
    Dim cell As Range
    Dim originalText As String
    Dim replacedText As String

    '// シートと範囲を設定
    Set ws = ThisWorkbook.Sheets(1)
    Set rng = ws.Range("A2:A6") '// A列の範囲内を処理対象に設定

    '// セル範囲内をループ処理
    For Each cell In rng
        If Not IsEmpty(cell.Value) Then '// セルが空白でない場合
            originalText = cell.Value
            replacedText = Replace(originalText, "HR", "Human Resources")
            
            '// 変更前後をデバッグウィンドウに出力
            Debug.Print "変更前: " & originalText & " | 変更後: " & replacedText

            '// セルの値を置換後の値に変更
            cell.Value = replacedText
        End If
    Next cell

    '// 処理完了メッセージ
    MsgBox "部門コードの置換が完了しました。", vbInformation
End Sub

処理結果

使用例3: セル内の部門コードを変更して、変更前後を比較の結果

コードの動作概要

STEP
シートとセル範囲の設定

Set wsで処理対象のワークシートを設定し、Set rngでセル範囲(B2:B11)を指定します。

STEP
セル範囲のループ処理

For Eachループを使い、範囲内のすべてのセルを順番に処理します。
空のセルはスキップされます。

STEP
部門コードの変更

Replace関数で「HR」を「Human Resources」に置換します。
これにより、コードの意味が分かりやすく統一されます。

STEP
変更前後の出力

デバッグウィンドウに変更前後の値を出力します。

STEP
セル値の更新

置換後の値をセルに書き戻します。

STEP
処理完了メッセージ

全セルの処理が終了した後、メッセージボックスで通知します。

このコードで使用している機能

機能名説明
Setワークシートやセル範囲を設定します。
Rangeセル範囲を指定します(ここではB2:B11)。
For Eachセル範囲内の各セルを順に処理します。
IsEmptyセルが空であるかを判定します。
Replaceセルの値の特定部分を別の文字列に置換します。
Debug.Printデバッグウィンドウに変更前後のデータを出力します。
MsgBox処理完了時にメッセージを表示します。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ReplaceDepartmentCodes()
    • サブルーチン「ReplaceDepartmentCodes」を定義します。
      このサブルーチンでは、部門コードを新しい形式に変更します。
  2. Dim ws As Worksheet
    • 「ws」: 処理対象のワークシートを格納します。
  3. Dim rng As Range
    • 「rng」: 処理対象のセル範囲を格納します。
  4. Dim cell As Range
    • 「cell」: 範囲内の各セルを順に処理するための変数です。
  5. Dim originalText As String
    • 「originalText」: 変更前のセル値を格納します。
  6. Dim replacedText As String
    • 「replacedText」: 置換後のセル値を格納します。
  7. Set ws = ThisWorkbook.Sheets(1)
    • 「ws」:1番目のワークシートを設定します。
  8. Set rng = ws.Range(“B2:B11”)
    • 「rng」:「B2:B11」のセル範囲を指定します。
  9. For Each cell In rng
    • セル範囲内の各セルを順に処理するため、For Eachループを開始します。
  10. If Not IsEmpty(cell.Value) Then
    • セルが空でない場合のみ、以下の処理を実行します。
  11. originalText = cell.Value
    • 変数「originalText」にセルの値を格納します。
  12. replacedText = Replace(originalText, “HR”, “Human Resources”)
    • Replace関数を使用して、変数「originalText」の「HR」を「Human Resources」に置換し、結果を変数「replacedText」に格納します。
  13. Debug.Print “変更前: ” & originalText & ” | 変更後: ” & replacedText
    • 変更前後の値をデバッグウィンドウに出力します。
  14. cell.Value = replacedText
    • 置換後の値をセルに書き戻します。
  15. End If
    • If分を終了します。
  16. Next cell
    • 次のセルを処理するためにループを進めます。
  17. MsgBox “部門コードの置換が完了しました。”, vbInformation
    • 処理が完了したことを通知するメッセージボックスを表示します。
  18. End Sub
    • サブルーチンを終了します。

総括・ポイント

このコードは、セル範囲内の部門コードを一括変更する実践的な例です。

変更前後をデバッグウィンドウで確認できるため、データがどのように変化したかが一目で分かります。

ポイントまとめ
  • Replace関数の業務応用例
    • 部門コードやフォーマット変更など、実務で頻繁に必要な処理に活用できます。
  • デバッグウィンドウの活用
    • 処理の内容を可視化することで、正確な動作を確認できます。
  • 範囲指定で効率化
    • 必要な範囲だけに処理を適用することで効率的なデータ整形が可能です。
スポンサーリンク

この記事のまとめ

この記事では、VBAのReplace関数について、基礎から応用までを幅広く解説しました。

文字列操作の基本的な仕組みから、配列やセルデータを扱った実践的な例までを紹介し、業務効率化に役立つポイントを紹介できたと思います。

ポイントのおさらい

今回の学びを活用するために

Replace関数は、VBAでの文字列操作において非常に重要なツールです。
今回の解説をもとに、以下の場面で効果的に活用できます。

  • データ整形の効率化
    • 不要な文字列の削除や特定の単語の置換などにより、データ加工の時間を大幅に短縮。
  • コードの簡潔化
    • 繰り返し処理をループで効率的に行うことで、コードの可読性を向上。
  • データ分析や自動化の精度向上
    • Replace関数を活用することで、データ処理の精度が向上し、業務自動化の基盤を強化。

この記事を参考に、Replace関数のスキルを日々の業務で積極的に活用してみてください。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「JavaScr...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次