【ExcelVBA・マクロ】特定の文字列を検索して一括置換する方法|Find・Replaceメソッドの実践【初心者向け】

特定の文字列を検索して一括置換する方法 ExcelVBA

Excelで作業していると、こんな場面に遭遇しませんか?

  • シート全体の「株式会社〇〇」を「〇〇株式会社」に変更したい
  • 複数シートにまたがる商品名を一括で変更したい
  • 特定の文字列が含まれるセルだけ処理したい
  • 置換後に「何件変更したか」をログで残したい

手作業でCtrl+Hから置換するのも良いですが、毎回同じ置換をする作業はVBAで自動化できます。

今回紹介するコードを使えば、複数の置換ルールをボタン1つで実行できます。


スポンサーリンク
スポンサーリンク

こんな人におすすめ

  • 定期的に同じ文字列の置換作業をしている人
  • 複数シートに対して一括置換したい人
  • 置換件数を記録・確認したい人
  • Find・Replaceメソッドの使い方を学びたい初心者

このコードを覚えれば、置換作業の時間が圧倒的に短縮されます。


コードの動作イメージ

  1. 特定のシート、または全シートから文字列を検索
  2. 見つかったセルを自動で置換
  3. 置換した件数を画面に表示
  4. 複数の置換ルールを連続で実行

これらの作業をボタン1つで完了します。


基本:シート内の文字列を一括置換するVBAコード

Sub ReplaceTextBasic()
    Dim ws As Worksheet
    Dim searchText As String
    Dim replaceText As String
    Dim resultCount As Long
    
    ' 1. 対象シートを指定
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    ' 2. 置換する文字列を設定
    searchText = "株式会社ABC"
    replaceText = "ABC株式会社"
    
    ' 3. 一括置換を実行
    With ws.Cells
        resultCount = .Replace(What:=searchText, _
                               Replacement:=replaceText, _
                               LookAt:=xlPart, _
                               MatchCase:=False)
    End With
    
    ' 4. 結果を表示
    MsgBox resultCount & "件を置換しました。" & vbCrLf & _
           "【" & searchText & "】→【" & replaceText & "】", vbInformation
End Sub

コードのポイント解説

① Replace メソッドで一括置換

resultCount = .Replace(What:=searchText, _
                       Replacement:=replaceText, _
                       LookAt:=xlPart, _
                       MatchCase:=False)
  • What:検索する文字列
  • Replacement:置換後の文字列
  • LookAtxlPart(部分一致)または xlWhole(完全一致)
  • MatchCaseFalseで大文字小文字を区別しない

戻り値として置換した件数が返ってきます。


② LookAt の使い分け

LookAt:=xlPart    ' 部分一致(セル内に含まれていればOK)
LookAt:=xlWhole   ' 完全一致(セル全体が一致する場合のみ)

例:

  • xlPart の場合:「ABC商事株式会社」→「ABC商事株式会社」にも適用される
  • xlWhole の場合:セルの値が完全に「株式会社ABC」の場合のみ置換

応用編①:複数の置換ルールを連続実行

実務では、複数の文字列を一度に置換したいケースがよくあります。

Sub ReplaceMultipleText()
    Dim ws As Worksheet
    Dim replaceList As Variant
    Dim i As Long
    Dim totalCount As Long
    Dim resultMsg As String
    
    ' 1. 対象シートを指定
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    ' 2. 置換リストを配列で定義(検索語, 置換語)
    replaceList = Array( _
        Array("株式会社ABC", "ABC株式会社"), _
        Array("(株)", "株式会社"), _
        Array("TEL:", "電話番号:"), _
        Array("Mail:", "メール:") _
    )
    
    ' 3. 置換ルールを順に実行
    totalCount = 0
    resultMsg = "【置換結果】" & vbCrLf & vbCrLf
    
    For i = 0 To UBound(replaceList)
        Dim count As Long
        count = ws.Cells.Replace(What:=replaceList(i)(0), _
                                 Replacement:=replaceList(i)(1), _
                                 LookAt:=xlPart, _
                                 MatchCase:=False)
        
        resultMsg = resultMsg & "【" & replaceList(i)(0) & "】→【" & replaceList(i)(1) & "】:" & count & "件" & vbCrLf
        totalCount = totalCount + count
    Next i
    
    ' 4. 結果を表示
    resultMsg = resultMsg & vbCrLf & "合計:" & totalCount & "件を置換しました。"
    MsgBox resultMsg, vbInformation
End Sub

このコードを使えば、複数の置換ルールを一発で実行できます。


応用編②:全シートに対して一括置換

ブック内の全シートに対して置換を実行する場合は、次のコードが使えます。

Sub ReplaceAllSheets()
    Dim ws As Worksheet
    Dim searchText As String
    Dim replaceText As String
    Dim totalCount As Long
    Dim sheetMsg As String
    
    ' 1. 置換する文字列を設定
    searchText = "旧社名"
    replaceText = "新社名"
    
    ' 2. 全シートをループ
    totalCount = 0
    sheetMsg = "【シート別置換結果】" & vbCrLf & vbCrLf
    
    For Each ws In ThisWorkbook.Worksheets
        Dim count As Long
        count = ws.Cells.Replace(What:=searchText, _
                                 Replacement:=replaceText, _
                                 LookAt:=xlPart, _
                                 MatchCase:=False)
        
        If count > 0 Then
            sheetMsg = sheetMsg & ws.Name & ":" & count & "件" & vbCrLf
            totalCount = totalCount + count
        End If
    Next ws
    
    ' 3. 結果を表示
    If totalCount > 0 Then
        sheetMsg = sheetMsg & vbCrLf & "合計:" & totalCount & "件を置換しました。"
        MsgBox sheetMsg, vbInformation
    Else
        MsgBox "該当する文字列が見つかりませんでした。", vbInformation
    End If
End Sub

応用編③:特定の列だけを対象に置換

「A列だけ」「見出し行を除く範囲だけ」など、範囲を限定したい場合のコードです。

Sub ReplaceInSpecificRange()
    Dim ws As Worksheet
    Dim targetRange As Range
    Dim searchText As String
    Dim replaceText As String
    Dim count As Long
    
    ' 1. 対象シートと範囲を指定
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    ' A列の2行目以降を対象にする(見出し行を除く)
    Set targetRange = ws.Range("A2:A" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row)
    
    ' 2. 置換する文字列を設定
    searchText = "仮"
    replaceText = "確定"
    
    ' 3. 指定範囲内で置換実行
    count = targetRange.Replace(What:=searchText, _
                                Replacement:=replaceText, _
                                LookAt:=xlPart, _
                                MatchCase:=False)
    
    ' 4. 結果を表示
    MsgBox "A列の2行目以降で" & count & "件を置換しました。", vbInformation
End Sub

Find メソッドで1件ずつ処理する方法

Replace は一括置換ですが、Find を使えば見つかったセルに対して個別の処理ができます。

Sub FindAndProcessEachCell()
    Dim ws As Worksheet
    Dim searchText As String
    Dim foundCell As Range
    Dim firstAddress As String
    Dim count As Long
    
    ' 1. 対象シートと検索文字列を設定
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    searchText = "重要"
    
    ' 2. 最初のセルを検索
    Set foundCell = ws.Cells.Find(What:=searchText, _
                                   LookIn:=xlValues, _
                                   LookAt:=xlPart, _
                                   MatchCase:=False)
    
    ' 3. 見つかった場合の処理
    If Not foundCell Is Nothing Then
        firstAddress = foundCell.Address
        count = 0
        
        Do
            ' 見つかったセルに対して処理(例:背景色を黄色に)
            foundCell.Interior.Color = RGB(255, 255, 0)
            foundCell.Font.Bold = True
            count = count + 1
            
            ' 次のセルを検索
            Set foundCell = ws.Cells.FindNext(foundCell)
            
        Loop While Not foundCell Is Nothing And foundCell.Address <> firstAddress
        
        MsgBox "【" & searchText & "】が含まれるセル " & count & "件に色を付けました。", vbInformation
    Else
        MsgBox "該当する文字列が見つかりませんでした。", vbInformation
    End If
End Sub

このコードは、検索でヒットしたセルすべてに書式を設定するときに便利です。


よくあるエラーと対処法

エラー①:置換件数が思ったより少ない

原因: セルの書式や非表示文字が原因で一致しないことがあります。

対処法:

' LookIn パラメータを追加
.Replace What:=searchText, _
         Replacement:=replaceText, _
         LookIn:=xlValues  ' xlFormulas(数式)または xlValues(値)

エラー②:数式内の文字列まで置換されてしまう

原因: デフォルトでは数式内も置換対象になります。

対処法:

LookIn:=xlValues  ' 値のみを対象にする

エラー③:大文字・小文字を区別したい

対処法:

MatchCase:=True  ' 大文字小文字を区別する

実務での活用例

✅ 定期的な社名変更・部署名変更の一括処理
✅ システムから出力したデータの表記統一
✅ テンプレートの「○○株式会社」を実際の取引先名に一括変換
✅ 郵便番号の表記統一(「123-4567」→「〒123-4567」)
✅ 特定キーワードを含むセルに自動で色を付ける


まとめ:置換作業はVBAで自動化しよう

  • Replace メソッドで一括置換が簡単にできる
  • LookAt パラメータで部分一致・完全一致を使い分け
  • 複数の置換ルールを配列で管理すれば連続実行も可能
  • Find メソッドを使えば見つかったセルごとに個別処理ができる
  • 全シート・特定範囲など、対象を柔軟に指定できる

毎回手作業で置換している作業があれば、ぜひVBAで自動化してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました