こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押すだけの自動化から一歩進み、自分の手でコードを書きこなせるようになると、業務効率化の世界が劇的に広がります。
今回は、実務の現場で必ず直面する「置換処理の監査ログ(実行履歴)の外部出力」をテーマに解説します。
「大量のWord文書の文字列を置換したけれど、本当に意図通りに変更されただろうか?」
「どの単語が、何箇所置き換わったのか後から証明できるようにしたい」
そんな現場の切実な悩みを、Word VBAとFSO(FileSystemObject)を使ってスマートに解決する方法を伝授します。ここをクリアすれば、あなたのVBAスキルは間違いなく中級者の領域に到達します。一緒にマスターしていきましょう!
—
なぜ「置換の実行履歴」をログに残す必要があるのか?
Wordの「置換」機能は非常に強力ですが、GUI(画面)で一括置換(すべて置換)を行うと、「結局、何がどこで何回変わったのか」がブラックボックスになってしまいます。
後から「あ、余計なところまで置換しちゃったかも…」と気づいても、時すでに遅し。元の状態に戻すのは困難です。
そこで、プロの現場では、「置換を実行しながら、その結果をCSVファイルに記録(ログ出力)する」というアプローチを取ります。これにより、以下のようなメリットが生まれます。
- 変更箇所の可視化: どのキーワードが何回ヒットしたかが一目瞭然になる。
- 監査証跡(トレーサビリティ)の確保: 「いつ、どのワードが置換されたか」を証明できるため、金融・医療・公的文書など厳格さが求められる現場で重宝する。
- 二度手間の防止: 処理のたびに目視で確認するストレスから解放される。
—
全体像:今回作成するプログラムの仕組み
今回作成するマクロは、以下のステップで動作します。
1. 置換リストの準備: 探す文字列と、置換後の文字列のペアを定義する。
2. ログファイルの準備: FSO(FileSystemObject)を使って、デスクトップ等にCSVファイルを作成(追記モード)する。
3. 安全な置換実行: Wordの `Find` オブジェクトを使い、文書全体を走査して置換を行う。この時、何回置換が成功したかを正確にカウントする。
4. ログの書き出し: 置換した単語と回数をCSVの1行としてログファイルに書き込む。
言葉だけだと難しそうに見えますが、一つひとつ紐解いていけば怖くありません。
—
実装コード:実務でそのまま使えるVBAスクリプト
以下のコードを、WordのVBAエディタ(`Alt + F11` で起動)の標準モジュールに貼り付けてください。
Option Explicit
‘ ==============================================================================
‘ 担当:先輩エンジニア
‘ 概要:文書内の複数キーワードを置換し、その実行履歴をCSVログとして出力する
‘ 前提:Microsoft Scripting Runtime への参照設定、または遅延バインディングを使用
‘ ==============================================================================
Sub ExecuteReplacementWithLog()
Dim docTarget As Document
Set docTarget = ActiveDocument ‘ 操作対象は現在アクティブな文書
‘ 1. 置換データの定義(例:旧用語を新用語へ置換)
‘ 2次元配列を使用し、(1列目: 検索ワード, 2列目: 置換ワード) を格納
Dim vRules(1 To 3, 1 To 2) As String
vRules(1, 1) = “旧システム”: vRules(1, 2) = “新システム”
vRules(2, 1) = “β版”: vRules(2, 2) = “正式版”
vRules(3, 1) = “平成”: vRules(3, 2) = “令和”
‘ 2. FSO (FileSystemObject) の準備
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ログファイルの保存先パス(デスクトップに “ReplaceLog.csv” を作成)
Dim logPath As String
logPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\ReplaceLog.csv”
‘ TextStreamオブジェクトでCSVを開く(ForWriting = 2, True = ファイルがない場合は新規作成)
Dim tsLog As Object
Set tsLog = fso.OpenTextFile(logPath, 2, True)
‘ CSVのヘッダー行を書き込み
tsLog.WriteLine “Timestamp,SearchWord,ReplaceWord,ReplaceCount”
‘ 3. 置換処理のループ
Dim i As Long
Dim lngCount As Long
For i = LBound(vRules, 1) To UBound(vRules, 1)
Dim searchWord As String
Dim replaceWord As String
searchWord = vRules(i, 1)
replaceWord = vRules(i, 2)
‘ Findオブジェクトの初期化と設定
With docTarget.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = searchWord
.Replacement.Text = replaceWord
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = Fails
.MatchAllWordForms = False
‘ 「すべて置換(wdReplaceAll)」を実行すると、置換された総数が返り値として取得できる
‘ ※Word VBAの仕様で、Executeの戻り値はBooleanだが、置換回数を直接は取れないため
‘ ループを回してカウントするか、あるいは置換前後の差分を見るアプローチが必要。
‘ 今回は確実なカウントを取るためにループ処理で実装します。
End With
‘ — 確実な置換とカウントを行うためのロジック —
lngCount = 0
Do While docTarget.Content.Find.Execute(Replace:=wdReplaceNone)
If docTarget.Content.Find.Found = True Then
‘ 見つかった部分を置換
docTarget.Content.Find.Replacement.Execute Replace:=wdReplaceOne
lngCount = lngCount + 1
Else
Exit Do
End If
Loop
‘ 4. ログファイルに実行結果を書き出し (形式: タイムスタンプ, 検索, 置換, 回数)
tsLog.WriteLine Format(Now, “yyyy-mm-dd hh:nn:ss”) & “,” & _
“””” & searchWord & “””,” & _
“””” & replaceWord & “””,” & _
lngCount
Next i
‘ 5. 後始末
tsLog.Close
Set tsLog = Nothing
Set fso = Nothing
‘ 完了メッセージ
MsgBox “置換処理が完了しました!” & vbCrLf & “ログ出力先: ” & logPath, vbInformation, “処理成功”
End Sub
—
コードの注目ポイント(ここを押さえればバッチリ!)
① FSO(FileSystemObject)によるスマートなファイル操作
VBAで外部ファイル(テキストやCSV)を扱うとき、古い `Open` ステートメントを使うよりも、`Scripting.FileSystemObject` を使う方が圧倒的にモダンでエラーに強いです。
今回のコードでは `OpenTextFile` メソッドを使い、ファイルが存在しない場合は自動で新規作成しつつ、テキストを書き込んでいます。
② なぜ「すべて置換」を使わず `Do While` で回しているのか?
Wordの `Find.Execute(Replace:=wdReplaceAll)` は一瞬で終わるので便利ですが、「何回置換が行われたか」を正確にコード側で捕捉するのが少し厄介です。
そのため、このコードではあえて `wdReplaceNone`(置換せずに検索だけする)と `wdReplaceOne`(1つずつ置換する)を組み合わせ、ループを回すことで「正確な置換回数(`lngCount`)」をカウントしてログに渡しています。この一手間が、信頼性の高いログを生み出します。
③ CSVの罠を防ぐダブルクォーテーション
ログファイル(CSV)を出力するとき、検索ワードや置換ワードの中にカンマ(`,`)が含まれていると、Excelで開いたときに列がズレてしまいます。
それを防ぐため、コード内では `”””” & searchWord & “””` と記述して、文字データをダブルクォーテーションで囲んでいます。実務でCSVを扱う際の必須テクニックです。
—
陥りやすいエラーと対策
1. 「ファイルへのアクセスが拒否されました」エラーが出る
- 原因: 出力先の `ReplaceLog.csv` を、Excelなどで開いたままマクロを実行していませんか? Windowsの仕様上、他のアプリが開いているファイルにはVBAから書き込みができません。
- 対策: ログファイルは閉じた状態でマクロを実行してください。
2. 置換が無限ループする
- 原因: 検索ワードの中に、置換ワードが含まれている場合(例:「AI」を「Microsoft AI」に置き換えるなど)、無限にヒットし続けることがあります。
- 対策: 本番の文書で試す前に、必ずコピーを作成してからテスト実行する習慣をつけましょう。
—
まとめ
今回は、Word VBAを使った置換処理と、FSOによる監査ログの外部出力について解説しました。
- 単に文字を置き換えるだけでなく、「いつ、何を、何回変えたか」を記録に残すこと。
- これができるだけで、あなたの自動化スクリプトの「信頼性」はプロレベルに跳ね上がります。
マクロの記録を卒業したあなたなら、このコードの意味がしっかりと理解できたはずです。ぜひ日々の業務に取り入れて、まわりをアッと言わせる自動化ツールを作ってみてくださいね。応援しています!
