【入門編】【中級者向け】「置換の実行履歴」をテキストファイルにログ出力し、あとから置換箇所を確認する – Word VBA解析バイブル

スポンサーリンク

Word VBAの「置換」を制御せよ:置換履歴をログ出力して「誤爆」を撲滅する技術

こんにちは。自動化の現場で血の滲むようなデバッグを重ねてきたエンジニアの端くれです。

Word VBAにおいて、`Find`オブジェクトを使った置換は強力です。しかし、強力であるがゆえに「どこを直したのか分からない」「意図しない場所まで置換してしまった」という置換の誤爆は、実務における最大の悪夢です。

今回は、単なる「置換」を超えて、「何を・どこで・どう変えたか」をすべてログとして残す、プロフェッショナルな置換自動化の極意を伝授します。

—

なぜ「ログ」が必要なのか?

マクロの記録で生成されるコードは「全部一気に置換する」という命令ですが、これには監査の概念が欠けています。
特に、契約書やマニュアルの修正において、「いつ、どの箇所が置換されたか」を後からトレースできないのは、業務上のリスクです。

今回紹介するコードは、「FSO(FileSystemObject)」という、OSレベルでファイルを操作する強力な相棒を使って、置換するたびにテキストファイルへその記録を書き出す仕組みです。

—

置換ログ出力の実装コード

まずは、以下のコードを標準モジュールに貼り付けてみてください。

Option Explicit

‘ 必要な参照設定: Microsoft Scripting Runtime (FSOを使用するため)
Sub SafeReplaceWithLogging()
Dim doc As Document
Dim rng As Range
Dim fso As Object
Dim logFile As Object
Dim logPath As String
Dim findText As String, replaceText As String

‘ 設定値
findText = “旧製品名”
replaceText = “新製品名”
logPath = ThisDocument.Path & “\replace_log.txt”

Set doc = ActiveDocument
Set rng = doc.Content
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ログファイルを開く(追記モード:8)
Set logFile = fso.OpenTextFile(logPath, 8, True)

‘ 置換処理の核となるFindオブジェクトの設定
With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = findText
.Replacement.Text = replaceText
.Forward = True
.Wrap = wdFindStop
.Format = False

‘ 一つずつ検索して置換するループ
Do While .Execute
‘ 置換した箇所の情報をログに残す
logFile.WriteLine Now & ” | 置換箇所: ” & rng.Start & ” – ” & rng.End & ” | 文字列: ” & rng.Text

‘ 置換を実行し、検索範囲を次に進める
rng.Collapse Direction:=wdCollapseEnd
Loop
End With

logFile.Close
MsgBox “置換が完了し、ログを出力しました。”
End Sub

—

コードのここが「プロの視点」

初心者の方がつまづきやすいポイントを、エンジニアの視点で解説します。

1. `rng.Collapse` の重要性

`Find`メソッドで置換を行った後、`rng`(Rangeオブジェクト)は置換された文字列を含んだままの状態になります。そのままループを続けると無限ループに陥ることがあります。
`rng.Collapse Direction:=wdCollapseEnd` を入れることで、「置換した箇所の直後」にカーソルを移動させて、次の検索を開始させる。これがループ処理の生命線です。

2. FSO(FileSystemObject)の「追記モード」

`fso.OpenTextFile(logPath, 8, True)` の「8」は追記モードを指します。
もしここを「2(上書きモード)」にすると、毎回ログが消えてしまいます。業務で使う際は、必ず「8」を使って履歴を積み上げてください。

3. `wdFindStop` で範囲を制御する

`Wrap = wdFindStop` を指定することで、文書の最後まで行ったら検索を停止します。これがないと、文書の末尾に達した瞬間に先頭へ戻ってしまい、永遠に置換し続ける「恐怖のループ」が完成してしまうので注意が必要です。

—

さらに高みを目指すなら:正規表現(Regex)の活用

上記のコードは単純な文字列置換ですが、もし「特定のパターン(例:日付の形式や、特定のID番号)だけを置換したい」という場合は、`VBScript.RegExp` オブジェクトを組み合わせるのが正解です。

正規表現を使えば、`Find`オブジェクトでは不可能な「動的な置換(置換後の文字列に、見つけた文字列の一部を再利用する)」が可能になります。これは、Word VBAを中級者から上級者へ押し上げる大きな壁となるでしょう。

—

最後に:自動化は「安心」のためにある

コードを書くとき、「効率化」だけを目的にしないでください。
「自動化した結果、何が起きたのかが追えること」。これこそが、信頼されるエンジニアのコードです。

今回紹介したログ出力の仕組みをベースに、自分なりの「監査用マクロ」を育ててみてください。Word VBAの奥深さは、こうした「制御」と「可視化」の先にあります。

もしエラーが出る、あるいはもっと高度な制御をしたいという場合は、いつでも相談してください。あなたの自動化の旅を、これからも応援しています。

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