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

スポンサーリンク

Word VBA「置換」の背信を許すな:監査可能なログ出力で誤置換を根絶する

Wordの`Find`オブジェクトを用いた置換処理は、強力だが恐ろしい。一度`Execute Replace:=wdReplaceAll`を叩けば、数千の文字列が一瞬で書き換わる。しかし、その「一瞬」の間に何が起きたのか? 誤置換が発生したとき、後からそれを追跡できないコードは、実務の現場では「欠陥品」に他ならない。

今日は、Word VBAにおける「置換の履歴」をFSO(FileSystemObject)で完全記録し、監査可能な堅牢な自動化アーキテクチャを構築する方法を伝授する。

—

1. なぜ「Find.Execute」のループ処理が危険なのか

多くの初心者は、全置換(`wdReplaceAll`)で一気に処理しようとする。しかし、これでは「何が」「どこで」「何に」変わったのかという履歴が残らない。

置換の自動化において重要なのは、「一括置換を諦め、一件ずつマッチさせ、その状況をログに吐き出しながら置換を実行する」という設計思想だ。

パフォーマンスを懸念する声もあるだろうが、数万ページを超えるようなドキュメントでない限り、VBAのループ処理のオーバーヘッドなど無視できる。それよりも「誤置換を即座に特定できる可視性」を優先すべきだ。

—

2. 堅牢なログ出力アーキテクチャ

設計の鍵は以下の3点だ。

1. SelectionではなくRangeオブジェクトを使う: `Selection`は画面描画を伴い、処理が遅い上に事故の元だ。必ず`Document.Range`を操作せよ。
2. FSOのストリーム書き込み: ログファイルを開きっぱなしにするのはメモリリークの元。書き込むたびに開閉するか、バッファリング戦略を明確にすること。
3. 例外処理の徹底: ファイルアクセス権限エラーやWordのオブジェクト消失に備え、`On Error GoTo`による安全なクローズ処理を実装する。

—

3. 実装コード:監査可能な置換エンジンの雛形

以下のコードは、文書内の特定の文字列を検索し、置換ログをテキストファイルに書き出すプロダクションコードのテンプレートだ。

Option Explicit

‘ 必要な参照設定: Microsoft Scripting Runtime (FSO)
Public Sub SecureReplaceWithLog()
Dim doc As Document: Set doc = ActiveDocument
Dim rng As Range: Set rng = doc.Content
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim logPath As String: logPath = ThisDocument.Path & “\replace_log.txt”
Dim ts As Object

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

Dim findText As String: findText = “旧文字列”
Dim replaceText As String: replaceText = “新文字列”

‘ 検索の設定
With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = findText
.Replacement.Text = replaceText
.Forward = True
.Wrap = wdFindStop
.Format = False

‘ 一件ずつループしてログを記録
Do While .Execute
‘ 検索箇所をマーク(ログに位置情報を含めるのがコツ)
ts.WriteLine Now & ” | 置換: [” & findText & “] -> [” & replaceText & “] | 位置: ” & rng.Start

‘ 置換を実行
rng.Text = replaceText

‘ 検索範囲を置換後の後ろにずらして継続
rng.Collapse wdCollapseEnd
Loop
End With

ts.Close
MsgBox “置換完了。ログを確認してください。”, vbInformation
End Sub

—

4. 開発現場で勝つための「高度な注意点」

ログファイルの競合対策

チームで共有するマクロの場合、同時に複数のユーザーが実行するとログファイルがロックされる。ファイル名に`Environ(“Username”)`や`Format(Now, “yyyymmdd_hhnnss”)`を付与し、ユニークなログファイル名にするのがプロの定石だ。

正規表現の活用

Word標準の`Find`は正規表現に弱い。高度なパターンマッチング(例:連番のみを置換対象にする等)が必要な場合は、VBAから`VBScript.RegExp`オブジェクトを呼び出すハイブリッド構成をとるべきだ。

監査ログのデータベース連携

もしこのログを本格的な「監査証跡」として使いたいなら、テキストファイルではなく、AccessやSQL Serverのテーブルに直接INSERTする設計を推奨する。CSV経由でのインポートよりも、直接DBを叩く方が整合性を保ちやすい。

—

5. 最後に:エンジニアとしての矜持

「とりあえず動けばいい」コードは、半年後の自分を苦しめる。今回紹介した「ログ出力」という一手間は、一見非効率に見えるかもしれない。しかし、「何が起きたか不明な自動化」ほど怖いものはない。

システムは必ず壊れるし、置換ロジックは必ず意図しない場所でマッチする。その時、あなたのコードが「何をしたか」を雄弁に語ってくれるなら、あなたは真の自動化エンジニアと言えるだろう。

さあ、あなたのWord VBAを、信頼性の高い「監査可能」なコードへとアップグレードさせよう。

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