【入門編】【上級者向け】Word表の変更履歴を追跡し、変更があったセルを特定してログを出力する監査システム – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの世界へようこそ。
マクロの記録ボタンを押して「動いた!」と感動したのもついで、いざ自分でコードを書こうとすると「あれ、セルを指定できない…」「変更履歴ってどうやって拾うの?」と途方に暮れていませんか?

大丈夫。今回は、業務自動化の現場でそのまま使える「Word表の変更履歴監査システム」を一緒に作っていきます。

「変更履歴」というと難しく聞こえるかもしれませんが、本質さえ掴めば怖くありません。ここをクリアすれば、あなたのWord VBAスキルは間違いなく中級者から「上級者」へとステップアップします。さあ、知的でスマートな自動化の世界へ飛び込みましょう!

—

なぜWordの表はVBA泣かせなのか?

Excelであれば `Cells(row, col)` で一発ですが、Wordの表(Table)はHTMLのテーブル構造に似ており、行(Row)と列(Column)の概念が少し複雑です。さらに、結合セル(Merge)が存在すると、インデックス番号がズレてエラーの温床になります。

今回のテーマである「変更履歴の監査」では、以下の壁を乗り越える必要があります。
1. 変更履歴(Revisions)の正体をつかむ
2. どのセル(Cell)で変更が起きたのかを正確に特定する
3. それを外部(Excelなど)に出力してログに残す

これらを一つずつ、優しく解きほぐしていきましょう。

—

全体像:変更履歴監査システムの設計図

今回作成するマクロの動きはこうです。

1. アクティブなWord文書を開く。
2. 文書内のすべての「表(Tables)」を巡回する。
3. 各セルの中に「変更履歴(Revision)」が存在するかチェックする。
4. 変更があれば、その「行番号」「列番号」「変更内容(追加・削除)」をイミディエイトウィンドウ(またはExcel)に出力する。

まずは、基本のキである「表のセルを巡回するロジック」から押さえましょう。ここがすべての土台になります。

—

実装コード:表の変更履歴を暴く監査マクロ

以下のコードを、WordのVBAエディタ(Alt + F11)の標準モジュールに貼り付けてください。

Option Explicit

‘ =====================================================================
‘ 処理名: Word表の変更履歴監査システム
‘ 概要: 文書内のすべての表を走査し、変更履歴があるセルを特定してログ出力する
‘ =====================================================================
Sub AuditTableRevisions()
Dim doc As Document
Set doc = ActiveDocument

Dim tbl As Table
Dim row As Row
Dim cell As Cell
ycin ‘ 処理カウンター
Dim revCount As Long
revCount = 0

‘ 変更履歴の記録が有効かチェック
If Not doc.TrackRevisions Then
MsgBox “注意: この文書では「変更履歴の記録」がオンになっていません。”, vbExclamation, “監査システム”
Exit Sub
End If

‘ 文書内の表をすべてループ
Dim tIdx As Long
For tIdx = 1 To doc.Tables.Count
Set tbl = doc.Tables(tIdx)

Dim rIdx As Long, cIdx As Long
For rIdx = 1 To tbl.Rows.Count
For cIdx = 1 To tbl.Columns.Count

‘ 結合セルでエラーが出るのを防ぐための安全策
On Error Resume Next
Set cell = tbl.Cell(rIdx, cIdx)
If Err.Number = 0 Then

‘ セル内に変更履歴(Revision)が存在するかチェック
If cell.Range.Revisions.Count > 0 Then
revCount = revCount + 1

‘ ログ出力(表番号、行、列、変更の種類)
Call OutputAuditLog(tIdx, rIdx, cIdx, cell.Range.Revisions)
End If

End If
On Error GoTo 0

Next cIdx
Next rIdx
Next tIdx

‘ 完了メッセージ
If revCount > 0 > 0 Then
MsgBox “監査完了: ” & revCount & ” 箇所の変更が検出されました。” & vbCrLf & _
“詳細はイミディエイトウィンドウを確認してください。”, vbInformation, “監査システム”
Else
MsgBox “監査完了: 変更履歴は見つかりませんでした。”, vbInformation, “監査システム”
End If

End Sub

‘ =====================================================================
‘ 補助プロシージャ: ログの出力フォーマット整形
‘ =====================================================================
Private Sub OutputAuditLog(tblIdx As Long, rowIdx As Long, colIdx As Long, revs As Revisions)
Dim rev As Revision
Dim logMessage As String

For Each rev In revs
‘ 変更の種類(追加 / 削除 / 書式変更など)を判定
Dim revTypeStr As String
Select Case rev.Type
Case wdRevisionInsert: revTypeStr = “追加”
Case wdRevisionDelete: revTypeStr = “削除”
Case Else: revTypeStr = “その他/書式変更”
End Select

‘ ログメッセージの組み立て
logMessage = “[表 ” & tblIdx & “] ” & _
“行: ” & rowIdx & ” / ” & _
“列: ” & colIdx & ” | ” & _
“種類: ” & revTypeStr & ” | ” & _
“内容: ” & Replace(rev.Range.Text, vbCr, “”) & ” | ” & _
“担当者: ” & rev.Author & ” | ” & _
“日時: ” & rev.Date

‘ VBAのイミディエイトウィンドウに出力(Ctrl + G で確認可能)
Debug.Print logMessage
Next rev
End Sub

—

コードの核心:ここがプロの技

このコードには、実務で絶対に知っておくべき「Word VBAならではの知見」が詰まっています。

1. `On Error Resume Next` による結合セル対策

Wordの表で最も厄介なのが「セル結合(Merge)」です。例えば、1行目のセルと2行目のセルが縦に結合されている場合、`tbl.Cell(2, 1)` を指定しようとすると、Wordは容赦なくランタイムエラー(結合されたセルの一部を指定したエラー)を吐き出してマクロを止めます。
これを華麗にスルーするために、エラートラップ(`On Error Resume Next`)を挟み、安全に存在するものだけを処理する設計にしています。

2. `cell.Range.Revisions` の威力

Wordのオブジェクトモデルの美しいところは、「セル(Cell)の範囲(Range)の中に含まれる変更履歴をダイレクトにコレクションとして取得できる」点です。
文書全体を総なめにしてから位置を計算し直す必要はなく、セル単位で `cell.Range.Revisions.Count` を叩くだけで、そのセルが改変されたかどうかを1ミリの狂いもなく判定できます。

3. イミディエイトウィンドウの活用

今回はExcel連携の第一歩として、VBA標準の `Debug.Print` を使ってイミディエイトウィンドウにログを吐き出しています。
(※ マクロを実行した後、VBAエディタで `Ctrl + G` を押してみてください。美しい監査ログがずらりと並んでいますよ!)
ここを改造すれば、CSVファイルへの書き出しや、Excelのシートへ直接データを転記する仕組みへと簡単に拡張できます。

—

陥りやすい罠とエラー回避のコツ

  • 罠1:「変更履歴の記録」がオフになっている

どれだけ素晴らしいコードを書いても、Word側で履歴が記録されていなければ `Revisions.Count` は常に `0` です。コードの冒頭で `doc.TrackRevisions` をチェックしているのはそのためです。

  • 罠2:改行コードの暴走

Wordのセル内のテキストには、末尾に必ず段落記号(`vbCr`)が含まれます。ログに出力する際、これが原因でレイアウトが崩れることがあるため、コード内では `Replace(rev.Range.Text, vbCr, “”)` で綺麗に掃除しています。こうした細かい配慮が、実用的なツールのクオリティを決めます。

—

おわりに

お疲れ様でした!
「Wordの表」×「変更履歴」という、一見すると難解な組み合わせを、VBAのオブジェクト階層を正しく理解することで鮮やかに攻略できましたね。

ここをクリアできれば、契約書や仕様書のバージョン管理、ドキュメントの変更監査など、あらゆる事務局業務を自動化する強力な武器を手に入れたことになります。

「もっとExcelのシートに綺麗に出力したい」「特定のユーザーの変更だけを抽出したい」といった応用も、ここからのひと工夫で自由自在です。
あなたの自動化ライフが、より一層素晴らしいものになりますように。それでは、次のステージでお会いしましょう!

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