【入門編】Word VBAで『目次』の自動更新とリンク切れチェックを自動化する – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」と途方に暮れていませんか?

大丈夫です。今回は、多くのビジネスパーソンやドキュメント作成者が頭を悩ませる「目次(TOC)の自動更新」と「リンク切れのチェック」をテーマに、Word VBAの核心に迫ります。

ここをクリアすれば、単なる「操作の自動化」を超えて、ドキュメントの品質を担保する「エンジニアリング」の領域に踏み込むことができます。優しく、そして本質的に解説していきますので、一緒にマスターしていきましょう!

1. Word VBAの心臓部:オブジェクトモデルを理解する

まず、Word VBAの全体像をイメージしてください。WordのVBAは、以下のような「マトリョーシカ構造(階層構造)」でドキュメントを管理しています。

  • Application(Wordアプリ全体)
  • Document(開いているファイル)
  • Range(文章の「範囲」:文字、段落、目次など)

Excel VBAが「セル(Cell)」というマス目を基準にするのに対し、Word VBAは「文章の流れ(Range/Story)」を相手にします。ここを勘違いすると、「文字が消えた!」「変な場所に入った!」というエラーの沼にハマります。

目次(TOC = Table of Contents)を操作するということは、この階層の中から「目次フィールド」という特殊なオブジェクトを見つけ出し、命令を与える作業に他なりません。

2. 目次を自動更新する(基本のキ)

まずは、ドキュメント内にある目次をプログラムから一瞬で最新の状態に更新するコードを見てみましょう。

実装コード:目次一括更新マクロ

Sub UpdateTableOfContents()
Dim doc As Document
Dim toc As TableOfContents

‘ 現在アクティブなドキュメントをオブジェクトに格納
Set doc = ActiveDocument

‘ ドキュメント内に目次が存在するかチェック
If doc.TablesOfContents.Count = 0 Then
MsgBox “このドキュメントには目次が見つかりません。”, vbExclamation, “確認”
Exit Sub
End If

‘ ドキュメント内のすべての目次をループして更新する
For Each toc In doc.TablesOfContents
‘ Update方法:
‘ UpdatePageNumbers = ページ番号だけ更新
‘ Update = 項目名や新規追加も含めて完全に更新
toc.Update
Next toc

MsgBox “目次の更新が完了しました!”, vbInformation, “成功”
End Sub

コードの急所解説

  • `ActiveDocument`: 今まさに画面で開いているWordファイルを指します。
  • `TablesOfContents.Count`: ドキュメント内に目次がいくつあるかを数えます。「目次がないのに更新しようとしてエラー落ちする」という初心者がやりがちなミスを、このIF文でスマートに回避しています。
  • `toc.Update`: これが魔法の呪文です。これ一行で、Wordを手動で右クリックして「フィールドの更新」をする動きを完全に再現できます。

3. 一歩進んだ品質管理:リンク切れ(不正なジャンプ先)のチェック

さて、ここからがチーフアーキテクトの腕の見せ所です。
目次を更新したはいいものの、「元の見出しが削除されていて、クリックしてもジャンプしない(リンク切れ)」という事故はビジネス文書で本当によく起こります。

Wordの目次は内部で「ハイパーリンク(Hyperlink)」を持っています。目次の項目が指し示す「ブックマーク(あるいは見出しの場所)」が実際に存在するかを検証する品質管理マクロを作りましょう。

実装コード:目次リンクの健全性チェック

Sub CheckTOCLinks()
Dim doc As Document
Dim hyp As Hyperlink
Dim brokenCount As Long
Dim msg As String

Set doc = ActiveDocument
brokenCount = 0
msg = “以下のリンクに異常が見つかりました:” & vbCrLf

‘ ドキュメント内の全ハイパーリンクを走査
For Each hyp In doc.Hyperlinks
‘ 目次(TOC)エリアにあるハイパーリンクか判定
If hyp.Range.TablesOfContents.Count > 0 Then

‘ リンク先のAddressまたはSubAddress(ジャンプ先ブックマーク)が存在するか?
‘ ※Wordの目次は通常SubAddress(見出し名)を持っています
If hyp.SubAddress <> “” Then
‘ 簡易的な存在確認:該当するブックマークが文書内にあるか
On Error Resume Next
Dim targetRange As Range
Set targetRange = doc.Bookmarks(hyp.SubAddress).Range

If Err.Number <> 0 Then
‘ エラーが発生=ジャンプ先のブックマークが存在しない(リンク切れ!)
brokenCount = brokenCount + 1
msg = msg & “- ” & hyp.TextToDisplay & ” (リンク先: ” & hyp.SubAddress & “)” & vbCrLf
End If
On Error GoTo 0 ‘ エラー監視を解除
End If

End If
Next hyp

‘ 結果のレポート
If brokenCount > 0 Then
MsgBox msg, vbCritical, “警告:リンク切れを検出しました”
Else
MsgBox “目次のリンク構造はすべて正常です!”, vbInformation, “チェック完了”
End If
End Sub

ここがプロの知見:`On Error Resume Next` の正しい使い方

VBAで存在しないブックマークにアクセスすると、容赦なく実行時エラー(Run-time error)でプログラムが強制終了します。
それを防ぐために `On Error Resume Next` を使い、エラーが発生した事実(`Err.Number <> 0`)を捕捉して「あ、このリンクは飛ぶ先がないな」と判定しています。エラー処理が終わったら即座に `On Error GoTo 0` で通常の監視に戻すのが、バグを生みにくいクリーンなコードの鉄則です。

4. 実務で使うためのワンポイント・アドバイス

この2つのマクロ(目次更新 + リンクチェック)を組み合わせることで、「更新した後に、自動でリンクの整合性をテストする」という最強のドキュメント品質管理ツールが完成します。

実務で組み込む際は、ひとつの標準モジュールに上記コードを貼り付け、リボンやクイックアクセスツールバーに登録しておくと便利です。「Ctrl + S」で保存するような感覚で、書類提出前のルーティンに組み込んでみてください。

まとめ

  • 目次の操作は `TablesOfContents` コレクションを狙え!
  • 実行前には必ず `Count > 0` で存在確認をしろ!
  • リンク切れチェックにはエラーハンドリング(`On Error`)を賢く使え!

ここをクリアできれば、あなたのWord VBAのスキルは、単なる「自動化の初心者」から「ドキュメント・エンジニア」へと確実にステップアップしています。

それでは、快適なVBAライフを!次回の解説もお楽しみに。

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