【入門編】【上級者向け】「変更履歴」を維持したまま置換を行い、差分を自動生成する監査用ツール – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんとなく動くコードができたけれど、中身を改造しようとすると途端にエラーが出る……」そんな壁にぶつかっていませんか?

大丈夫、その壁を越えるための極意を、今日は優しく、そして徹底的に深掘りしてお伝えします。

今回挑むテーマは、「変更履歴を維持したまま置換を行い、差分を自動生成する監査用ツール」です。
ビジネスや法律文書の現場では、「どこをどう書き換えたか」の足跡(監査証跡)を残すことが絶対のルール。これを人間の手でやっていたら目がチカチカしてしまいますよね。Word VBAの本質を掴めば、一瞬で、しかも完璧に自動化できるようになります。

ここをクリアすれば、あなたのWord VBAスキルは間違いなく「中級者」から「真のプロフェッショナル」へと飛躍しますよ。さあ、一緒に扉を開けましょう!

—

1. なぜ「通常の置換」では監査に使えないのか?

まず、Wordの標準機能や、よくあるVBAの `.Execute Replace:=wdReplaceAll` というコードを思い出してください。あれは非常に強力ですが、「一瞬で文字を書き換えてしまう」ため、文書のどこが変わったのかという「歴史」が消え去ってしまいます。

監査やコンプライアンスの現場で求められるのは、以下のようなプロセスです。
1. 「変更履歴(Track Changes)」の機能をプログラム側で強制的にONにする。
2. 検索と置換を実行する(この時、Wordが「削除された文字」と「追加された文字」を自動で履歴として記録する)。
3. 誰が、いつ、どんな目的で置換したかのメタデータを残す。

これを実現するためには、Wordの「検索(Find)」と「変更履歴(TrackRevisions)」という2つの強力なエンジンのライフサイクルを、VBAから正確にコントロールしてあげる必要があります。

—

2. 【図解】Word VBAにおける「Findオブジェクト」の構造

コードを書く前に、Wordの頭の中を覗いてみましょう。
Wordの検索機能は、単なる「Ctrl + F」の置き換えではありません。`Range` または `Selection` に紐づく `Find` オブジェクト という独立したマシンが稼働しています。

[ Document (文書全体) ]
↓
[ Range (操作対象の範囲) ]
↓
[ Find オブジェクト (検索エンジン) ]
├── .Text = “検索する言葉”
├── .Replacement.Text = “置換後の言葉”
└── .Execute (実行ボタン) ──> 変更履歴がONなら「差分」として記録される!

ここで多くの人が陥る罠があります。それは、「検索条件を設定したのに、肝心の `.Execute` メソッドで置換の指示を出し忘れる、あるいはループ処理の構造を間違える」というエラーです。

—

3. 実装:変更履歴を完全維持する監査用置換エンジン

それでは、開発の現場でそのままコピペして使える、実用的なコードを公開します。
このコードは、あらかじめ「変更履歴の記録」を強制的に有効化し、文書全体の置換を行いつつ、その足跡を美しく残すプロ仕様の設計になっています。

Sub AuditReplaceEngine()
Dim rngTarget As Range
Dim findText As String
Dim replText As String

‘ — 1. 検索・置換ワードの定義 —
‘ ※実際の業務に合わせて書き換えてください
findText = “旧システム”
replText = “新クラウドシステム”

‘ — 2. 文書の先頭から範囲を指定 —
Set rngTarget = ActiveDocument.Content

‘ — 3. 【最重要】変更履歴の記録を強制的に有効化 —
‘ これにより、VBAによる置換であってもすべて「差分(赤字や取り消し線)」として残ります
ActiveDocument.TrackRevisions = True

‘ 誰が変更したか(監査用コメントや履歴の著者名)を明確にする場合
Application.UserName = “監査自動化システム”

‘ — 4. Findオブジェクトの設定と一括置換実行 —
With rngTarget.Find
.ClearFormatting
.Replacement.ClearFormatting

.Text = findText
.Replacement.Text = replText

‘ 前後関係の一致、大文字小文字の区別などの詳細設定
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False

‘ 【核心】一括置換(wdReplaceAll)を実行
‘ Wordの内部エンジンが変更履歴を自動生成します
.Execute Replace:=wdReplaceAll
End With

‘ — 5. 終了処理と通知 —
MsgBox “置換作業が完了し、変更履歴(監査証跡)が正常に生成されました。”, vbInformation, “監査ツール”

‘ オブジェクトの解放(メモリリークを防ぐプロの作法)
Set rngTarget = Nothing
End Sub

—

4. プロがつまずく「陥りやすいエラー」と回避策

上記のコードは非常に洗練されていますが、Word VBA特有の「お作法」を知らないと、思わぬバグに遭遇します。ここでしっかり押さえておきましょう。

エラー①:変更履歴が残らない、またはすべて消える

  • 原因: マクロを実行する前に、Wordのウィンドウ側で「変更履歴の記録」がオフになっており、かつコード内で `ActiveDocument.TrackRevisions = True` を書き忘れている場合。
  • 対策: VBAから明示的に `TrackRevisions = True` を宣言するのが鉄則です。環境に依存させないコードを書くのがプロのエンジニアです。

エラー②:置換がループして無限地獄に落ちる(あるいは途中で止まる)

  • 原因: `Do While .Execute` のようなループ構造を自作した際、置換後の文字列の中にさらに検索ワードが含まれている場合(例:「A」を「AA」に置換するなど)、無限ループが発生します。
  • 対策: 今回のコードのように、一括置換を行う `wdReplaceAll` を適切に用いるか、ループを抜ける条件(`.Execute` の戻り値の判定)を厳密に制御しましょう。

—

5. さらに高みを目指すあなたへ

お疲れ様でした!このコードを理解し、実際に動かすことができれば、単なる「マクロの記録者」から、文書のライフサイクルをコントロールする「業務自動化エンジニア」へと確実にステップアップしています。

実務では、このベースコードに「置換前後のログを別シート(Excel)やテキストに吐き出す処理」や、「特定のスタイルが適用されている部分だけを対象にするフィルタリング」を組み合わせることで、完全無欠の監査システムへと進化させることができます。

「ここをクリアすれば、Word VBAの基本はバッチリですよ!」
自信を持って、次の自動化の扉を叩いてください。あなたのVBAライフが、より知的でクリエイティブなものになることを応援しています!

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