Word VBAを掌握せよ:ブックマークを操る「動的帳票」の極意
こんにちは。現場で泥臭い自動化を積み重ね、数多のシステムを救ってきたエンジニアです。
Word VBAを触り始めると、誰もが一度は「マクロの記録」に頼り、生成された `Selection` だらけの汚いコードに絶望します。しかし、Word VBAの本質は、`Selection`(カーソル)を動かすことではなく、`Range`(領域)を直接支配することにあります。
今回は、実務の登竜門である「ブックマークへのデータ流し込み」を題材に、Wordを意のままに操るための「極限の基本」を伝授します。
—
1. なぜ「Selection」を使ってはいけないのか?
マクロの記録が吐き出す `Selection.TypeText` などは、画面をチラつかせる上に処理が遅く、何より「今のカーソル位置」に依存するため非常に不安定です。
我々が目指すのは、「文書内の特定の場所(ブックマーク)を特定し、そこをメモリ上で書き換える」というスマートな手法です。これには `Range` オブジェクトが不可欠です。
—
2. 実践:ブックマークへのデータ流し込み
まずは、Wordテンプレート内に「ClientName」「ReportDate」という名前のブックマークを設置してください。これだけで準備完了です。
以下のコードは、単に文字を置き換えるだけでなく、「置き換えた後もブックマークが消滅しない」という、実務で必須のテクニックを盛り込んでいます。
Sub FillBookmark(ByVal BookmarkName As String, ByVal FillText As String)
‘ 1. ドキュメント内のブックマークを特定
If ActiveDocument.Bookmarks.Exists(BookmarkName) Then
Dim rng As Range
Set rng = ActiveDocument.Bookmarks(BookmarkName).Range
‘ 2. テキストを書き換え
rng.Text = FillText
‘ 3. 重要:書き換えるとブックマーク自体が消えるため、再定義する
ActiveDocument.Bookmarks.Add Name:=BookmarkName, Range:=rng
Else
Debug.Print “警告: ブックマーク ‘” & BookmarkName & “‘ が見つかりません。”
End If
End Sub
コードの解説
- `Range` オブジェクトの活用: 文書内の「場所」をオブジェクトとして扱います。画面描写を伴わないため、処理速度が段違いです。
- ブックマークの再定義: Wordの仕様上、ブックマーク範囲に文字を流し込むと、そのブックマークは消滅します。`Add` メソッドで同じ場所に名前を付け直すのが、実務における鉄則です。
—
3. 現場で直面する「罠」と対策
ここをクリアすれば、あなたはもう初学者ではありません。
罠1:ブックマーク名がない、または重複している
`Bookmarks.Exists` で確認するのは基本中の基本です。しかし、さらに防衛的にコードを書くなら、エラーハンドリング(`On Error Resume Next`)を適切に組み合わせるのがプロの流儀です。
罠2:表の中のブックマーク
表のセル内にブックマークがある場合、`Range` をそのまま置き換えると、セルの書式や末尾の段落記号まで壊すことがあります。
- 対策: `rng.Text` を直接代入するのではなく、`rng.Select` して `Selection.TypeText` を使うなど、状況に応じて「置換対象」を厳密に定義してください。
—
4. さあ、次のステップへ
ここまでの知識があれば、Excelをデータベースに見立てて、「請求書生成」や「契約書の一括作成」といった業務を完全に自動化できます。
次に意識すべきは「疎結合」です。
Wordの中にロジックを詰め込まず、Excel側からWordを操作する設計(参照設定:Microsoft Word 16.0 Object Library)に移行してみてください。それが、VBAマスターへの次なる道です。
「マクロの記録」を卒業し、自分の手でオブジェクトを操作する感覚。それが掴めれば、Wordはもはや単なるワープロソフトではなく、強力な帳票生成エンジンに生まれ変わります。
ここをクリアすれば、Word VBAはもうあなたの相棒です。また現場でお会いしましょう!
