【Excel VBA】既存のWord文書の末尾にデータを追記する方法

月次レポートや業務日誌など、既存のWord文書に新しい情報をどんどん付け加えていきたい、というケースはよくあります。VBAを使えば、既存文書を開いて、現在の内容を保持したまま末尾に新しいテキストや表を追加する、といった処理を自動化できます。

この記事では、既存のWord文書を開き、その一番最後にカーソルを移動して、Excelでフィルターしたデータを次々と追記していく、実用的なテクニックを解説します。


目次

【重要】実行前の参照設定と準備

今回のコードでは、Wordの機能や定数をスムーズに扱うため**「参照設定」**が必要です。また、追記対象となるWordファイルが事前に必要です。

  1. 参照設定: VBEの ツール > 参照設定 から**「Microsoft Word XX.0 Object Library」**にチェックを入れてください。
  2. ファイルの準備: この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文書にデータを追記する処理の基本は、

  1. **.Documents.Open**で対象ファイルを開く。
  2. **.Content.End**で末尾の位置を特定する。
  3. **Selection.SetRange**でカーソルを末尾に移動させる。
  4. あとは通常通り.TypeText.PasteExcelTableでデータを書き込んでいく。

この流れをマスターすれば、日々のレポート更新やデータの蓄積といった作業を大幅に効率化することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次