月次レポートや業務日誌など、既存のWord文書に新しい情報をどんどん付け加えていきたい、というケースはよくあります。VBAを使えば、既存文書を開いて、現在の内容を保持したまま末尾に新しいテキストや表を追加する、といった処理を自動化できます。
この記事では、既存のWord文書を開き、その一番最後にカーソルを移動して、Excelでフィルターしたデータを次々と追記していく、実用的なテクニックを解説します。
【重要】実行前の参照設定と準備
今回のコードでは、Wordの機能や定数をスムーズに扱うため**「参照設定」**が必要です。また、追記対象となるWordファイルが事前に必要です。
- 参照設定: VBEの
ツール
>参照設定
から**「Microsoft Word XX.0 Object Library」**にチェックを入れてください。 - ファイルの準備: このVBAが記述されたExcelファイルと同じフォルダに、追記のベースとなるWord文書(例として
ReportTemplate.docx
)を保存しておいてください。
完成したVBAコード
以下が、既存のWord文書の末尾に、Excelで抽出したデータを追記していくVBAコードです。
'参照設定: Microsoft Word XX.0 Object Library
Sub AppendDataToEndOfWordDoc()
' 変数を宣言します
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
Dim sourceData As Range
Dim filterCriterion As Variant
Dim docEndPos As Long
' Wordアプリケーションを起動
Set wordApp = New Word.Application
wordApp.Visible = True
' Excelのデータ範囲を設定
Set sourceData = ThisWorkbook.Worksheets("Sheet1").Range("A1").CurrentRegion
' --- 1. 既存のWord文書を開く ---
Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\ReportTemplate.docx")
' --- 2. 文書の末尾にカーソルを移動 ---
' Content.Endで最終位置を取得し、カーソル(Selection)をそこに設定
docEndPos = wordDoc.Content.End - 1
wordApp.Selection.SetRange docEndPos, docEndPos
' --- 3. フィルター条件でループし、データを追記 ---
For Each filterCriterion In Array("商品A", "商品B", "商品C")
' Excelのデータをフィルター
sourceData.AutoFilter Field:=2, Criteria1:=filterCriterion
' Wordのカーソル位置にテキストと表を追記
With wordApp.Selection
.TypeParagraph '前のブロックとの間に一行スペースを空ける
.TypeText Text:="■ カテゴリ: " & filterCriterion
.TypeParagraph
'フィルター結果の可視セルをコピー
sourceData.SpecialCells(xlCellTypeVisible).Copy
.PasteExcelTable False, False, False
End With
Next filterCriterion
' フィルターを解除
sourceData.AutoFilter
' --- 4. 追加した表のスタイルをまとめて設定 ---
Dim tbl As Word.Table
For Each tbl In wordDoc.Tables
' ここでは文書内のすべての表に同じスタイルを適用
tbl.Style = "表 (格子) 1- 明るい"
Next tbl
' --- 5. 保存して終了 ---
wordDoc.Save
wordDoc.Close
wordApp.Quit
' オブジェクトを解放
Set wordDoc = Nothing
Set wordApp = Nothing
MsgBox "Word文書へのデータ追記が完了しました。"
End Sub
コードのポイント解説
① 既存Word文書を開く
Set wordDoc = wordApp.Documents.Open("ファイルパス")
新規作成の.Documents.Add
とは異なり、.Documents.Open
メソッドを使い、引数にファイルのフルパスを指定することで、既存のWord文書を開いて操作対象にできます。
② 文書の末尾を取得し、カーソルを移動する
docEndPos = wordDoc.Content.End - 1
wordApp.Selection.SetRange docEndPos, docEndPos
これが、文書の末尾に追記するための最も重要な部分です。
wordDoc.Content.End - 1
: これで、文書全体のコンテンツの一番最後の文字位置を取得できます。(-1
は末尾の段落記号の分を調整するためのおまじないです。)wordApp.Selection.SetRange ...
: Wordのカーソル(Selection
)を、取得した末尾の位置にジャンプさせます。これにより、次の操作がすべて文書の最後から行われるようになります。
③ Excelデータをフィルターしてループ処理
For Each filterCriterion In Array("商品A", "商品B", "商品C")
sourceData.AutoFilter Field:=2, Criteria1:=filterCriterion
' ...
Next filterCriterion
Array
関数で指定した条件(”商品A”など)でFor Each
ループを回し、その条件を使ってExcelの.AutoFilter
でデータを絞り込んでいます。これにより、特定のカテゴリごとにデータを抽出し、Wordに転記する、といった処理が可能になります。
④ フィルター結果をWordに追記
.TypeText Text:="■ カテゴリ: " & filterCriterion
sourceData.SpecialCells(xlCellTypeVisible).Copy
.PasteExcelTable False, False, False
ループの中で、まず.TypeText
で見出しを書き込み、次に.Copy
と.PasteExcelTable
でフィルターされたデータ(SpecialCells(xlCellTypeVisible)
で可視セルのみを対象)を表として貼り付けます。 この一連の処理が終わると、カーソルは貼り付けた表のすぐ後ろに自動で移動しているため、次のループ処理もその続きから正しく追記されます。
⑤ すべての表にスタイルを適用
For Each tbl In wordDoc.Tables
tbl.Style = "表 (格子) 1- 明るい"
Next tbl
すべての追記処理が終わった後、wordDoc.Tables
コレクションをFor Each
でループさせることで、文書内に存在するすべての表に対して一括で同じスタイルを適用しています。
まとめ
既存のWord文書にデータを追記する処理の基本は、
- **
.Documents.Open
**で対象ファイルを開く。 - **
.Content.End
**で末尾の位置を特定する。 - **
Selection.SetRange
**でカーソルを末尾に移動させる。 - あとは通常通り
.TypeText
や.PasteExcelTable
でデータを書き込んでいく。
この流れをマスターすれば、日々のレポート更新やデータの蓄積といった作業を大幅に効率化することができます。