Contents
この記事でできること
- VBAでExcelのセル値をWordテンプレートのブックマーク位置に自動転記できる
- 一覧データから複数のWord報告書を一括生成できる(実務版)
- 生成した報告書をPDFで自動保存できる
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
必要: Word(デスクトップ版)インストール済み
完成イメージ(Before / After)
Before(手動コピペ):
- Excelの一覧データを確認する
- Wordテンプレートを開く
- 会社名・日付・担当者など20項目を1つずつコピペする
- 別名で保存する
- 次の報告書のためにテンプレートを再度開いて繰り返す
- 5件分で100回のコピペ。15分かかる
After(VBAで自動転記):
- マクロを実行(またはボタンをクリック)
- ExcelのデータがWordテンプレートのブックマーク位置に自動転記される
- 報告書が別名で保存される(PDF保存にも対応)
- 5件分が10秒で完了。転記ミスゼロ
毎月、品質報告書をExcelからWordに手動コピペしていた。20項目×5件で100回。1件あたり3分かかって、5件で15分。しかも転記ミスで月1回は差し戻しが発生していた。VBAで自動転記にしたら100回のコピペが1クリックに。15分かかっていた報告書作成が10秒で終わるようになった。転記ミスもゼロになった。同じ手作業で消耗している人にWord連携を体験してほしい。ExcelとWordは別アプリだからVBAで連携できないと思っている人が多いが、CreateObjectを使えば簡単にできる。
ExcelからWordへの転記を自動化するコツは「Wordテンプレートにブックマークを設定し、VBAからブックマーク位置に値を書き込む」こと。Replace(文字列置換)方式より正確で、位置ズレが起きない。
なお、Excel内のテンプレートに差し込んで印刷する場合は 一覧表からExcelテンプレートに差し込み印刷する方法 を参照。この記事では「ExcelのデータをWord文書に転記する」に特化する。同じExcel内でのセル間転記は セルの転記を自動化する方法 を参照。
実行前の準備
Wordテンプレートにブックマークを設定する
VBAからWordの正確な位置にデータを転記するには、テンプレートにブックマークを設定しておく必要がある。
ブックマークの設定手順:
- Wordテンプレート(.docx)を開く
- データを転記したい位置にカーソルを置く
- 「挿入」タブ →「ブックマーク」をクリック
- ブックマーク名を入力する(例: CompanyName, ReportDate, Manager)
- 「追加」をクリック
- すべての転記先にブックマークを設定したら、テンプレートを保存する
ブックマーク名のルール:
- アルファベット・数字・アンダースコアのみ使用可能(日本語は不可)
- 大文字小文字は区別されない
- 例: `CompanyName`, `Report_Date`, `Item01`
バックアップを取る
テンプレートファイルと元データのExcelファイルは、作業前にコピーしてバックアップを取ること。
Excelをマクロ有効ブック(.xlsm)で保存する
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで `Alt + F11` を押す
- VBE(Visual Basic Editor)が開く
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
- 白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
- コード内のパス・ブックマーク名を自分の環境に書き換える
- `Alt + F8` → マクロ名を選んで「実行」
- Wordに報告書が生成されることを確認する
ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。
コード(最小版)– Excelの値をWordブックマークに転記
まずはこれだけで動く。Excelシートのセル値をWordテンプレートのブックマーク位置に転記し、別名保存する。
'============================================================
' ■ Excelの値をWordブックマークに転記(最小版)
' → テンプレートを開いてブックマーク位置にデータを書き込み
' → SaveAs で別名保存(テンプレートは上書きしない)
'============================================================
Sub ExcelToWordMinimal()
'--- ★書き換えポイント ---
Dim templatePath As String
templatePath = "C:\Template\報告書テンプレート.docx" '← Wordテンプレートのパス
Dim savePath As String
savePath = "C:\Output\報告書_完成.docx" '← 保存先のパス
Dim sheetName As String
sheetName = "Sheet1" '← データがあるシート名
'--- ★ここまで ---
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(sheetName)
'--- Word を起動(参照設定不要)
Dim wdApp As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True ' Wordを表示(確認用)
'--- テンプレートを開く
Dim wdDoc As Object
Set wdDoc = wdApp.Documents.Open(templatePath)
'--- ★書き換えポイント ---
' ブックマーク名とセルの対応を書き換える
' 形式: ブックマーク名, セル位置
'--- ★ここまで ---
'--- ブックマークにExcelの値を転記
If wdDoc.Bookmarks.Exists("CompanyName") Then
wdDoc.Bookmarks("CompanyName").Range.Text = ws.Range("B2").Value
End If
If wdDoc.Bookmarks.Exists("ReportDate") Then
wdDoc.Bookmarks("ReportDate").Range.Text = ws.Range("B3").Value
End If
If wdDoc.Bookmarks.Exists("Manager") Then
wdDoc.Bookmarks("Manager").Range.Text = ws.Range("B4").Value
End If
If wdDoc.Bookmarks.Exists("Summary") Then
wdDoc.Bookmarks("Summary").Range.Text = ws.Range("B5").Value
End If
'--- 別名で保存(テンプレートを上書きしない)
wdDoc.SaveAs2 savePath
wdDoc.Close False
'--- Word を終了
wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing
MsgBox "報告書を作成しました。" & vbCrLf & savePath, vbInformation
End Sub
書き換えポイント
| 変数 / 箇所 | 説明 | 初期値 |
|---|---|---|
| `templatePath` | Wordテンプレートのフルパス | `”C:\Template\報告書テンプレート.docx”` |
| `savePath` | 生成した報告書の保存先パス | `”C:\Output\報告書_完成.docx”` |
| `sheetName` | データがあるシート名 | `”Sheet1″` |
| `Bookmarks(“CompanyName”)` → `ws.Range(“B2”)` | ブックマーク名とセルの対応 | 4組(B2〜B5) |
コードの流れ
- `CreateObject(“Word.Application”)` でWordを起動する(参照設定不要)
- テンプレート(.docx)を開く
- `Bookmarks.Exists` でブックマークの存在を確認する
- `Bookmarks(“名前”).Range.Text` にExcelのセル値を代入する
- `SaveAs2` で別名保存する(テンプレートを上書きしない)
- `wdApp.Quit` でWordを終了する
Bookmarks.Exists で事前チェックする理由: ブックマーク名が間違っていると実行時エラーになる。Existsで確認してからTextを代入すれば、名前違いでもエラーにならずスキップされる。
コード(実務版)– テンプレートから一括差し込み+PDF保存
実務では一覧データから複数の報告書を量産する場面がある。各行のデータをWordテンプレートに差し込み、Word文書+PDFで保存する版。エラーハンドリング付き。
一覧シート(「報告一覧」シート)のレイアウト:
| A列 | B列 | C列 | D列 | E列 | F列 |
|---|---|---|---|---|---|
| 会社名 | 報告日 | 担当者 | 概要 | ファイル名 | ステータス |
| 株式会社サンプル | 2026/03/01 | 田中太郎 | 品質検査合格 | サンプル_202603 | |
| ABC商事 | 2026/03/01 | 佐藤花子 | 一部要改善 | ABC商事_202603 |
'============================================================
' ■ 一覧データからWord報告書を一括生成+PDF保存(実務版)
' → テンプレートから行ごとにWord文書を生成
' → Word保存 + PDF保存
' → ステータス列にログ記録
' → エラーハンドリング + wdApp.Quit 確実実行
'============================================================
Sub ExcelToWordBatch()
'--- ★書き換えポイント ---
Dim templatePath As String
templatePath = "C:\Template\報告書テンプレート.docx" '← Wordテンプレートのパス
Dim outputFolder As String
outputFolder = "C:\Output\" '← 出力先フォルダ(末尾 \ 必須)
Dim listSheet As String
listSheet = "報告一覧" '← 一覧データのシート名
'--- ★ここまで ---
'--- 出力先フォルダの存在チェック
If Dir(outputFolder, vbDirectory) = "" Then
MsgBox "出力先フォルダが存在しません。" & vbCrLf & _
outputFolder, vbExclamation
Exit Sub
End If
'--- テンプレートの存在チェック
If Dir(templatePath) = "" Then
MsgBox "テンプレートファイルが見つかりません。" & vbCrLf & _
templatePath, vbExclamation
Exit Sub
End If
Dim wsList As Worksheet
Set wsList = ThisWorkbook.Worksheets(listSheet)
Dim lastRow As Long
lastRow = wsList.Cells(wsList.Rows.Count, 1).End(xlUp).Row
If lastRow < 2 Then
MsgBox "一覧データがありません。" & vbCrLf & _
"A2セル以降にデータを入力してください。", vbExclamation
Exit Sub
End If
'--- Word を起動
Dim wdApp As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = False ' バックグラウンドで処理
Dim genCount As Long
Dim errCount As Long
genCount = 0
errCount = 0
Dim i As Long
For i = 2 To lastRow
'--- 会社名が空欄ならスキップ
If Trim(wsList.Cells(i, 1).Value) = "" Then
wsList.Cells(i, 6).Value = "スキップ(会社名なし)"
GoTo NextRow
End If
On Error GoTo ErrHandler
'--- テンプレートを開く(毎回新しいコピーとして開く)
Dim wdDoc As Object
Set wdDoc = wdApp.Documents.Open(templatePath)
'--- ★書き換えポイント ---
' ブックマーク名と列の対応を書き換える
'--- ★ここまで ---
'--- ブックマークにデータを転記
If wdDoc.Bookmarks.Exists("CompanyName") Then
wdDoc.Bookmarks("CompanyName").Range.Text = _
wsList.Cells(i, 1).Value ' A列:会社名
End If
If wdDoc.Bookmarks.Exists("ReportDate") Then
wdDoc.Bookmarks("ReportDate").Range.Text = _
Format(wsList.Cells(i, 2).Value, "yyyy/mm/dd") ' B列:報告日
End If
If wdDoc.Bookmarks.Exists("Manager") Then
wdDoc.Bookmarks("Manager").Range.Text = _
wsList.Cells(i, 3).Value ' C列:担当者
End If
If wdDoc.Bookmarks.Exists("Summary") Then
wdDoc.Bookmarks("Summary").Range.Text = _
wsList.Cells(i, 4).Value ' D列:概要
End If
'--- ファイル名を取得(E列)
Dim fileName As String
fileName = Trim(wsList.Cells(i, 5).Value)
If fileName = "" Then
fileName = "報告書_" & i
End If
'--- Word文書として保存
Dim wordSavePath As String
wordSavePath = outputFolder & fileName & ".docx"
wdDoc.SaveAs2 wordSavePath
'--- PDFとして保存
Dim pdfSavePath As String
pdfSavePath = outputFolder & fileName & ".pdf"
wdDoc.ExportAsFixedFormat _
OutputFileName:=pdfSavePath, _
ExportFormat:=17 ' 17 = wdExportFormatPDF
wdDoc.Close False
Set wdDoc = Nothing
'--- ステータスを記録
wsList.Cells(i, 6).Value = "生成済み"
genCount = genCount + 1
On Error GoTo 0
NextRow:
Next i
'--- Word を終了(必ず実行)
wdApp.Quit
Set wdApp = Nothing
MsgBox genCount & " 件の報告書を生成しました。" & vbCrLf & _
"エラー:" & errCount & " 件" & vbCrLf & _
"F列にステータスを記録しました。" & vbCrLf & vbCrLf & _
"出力先:" & outputFolder, vbInformation, "完了"
Exit Sub
ErrHandler:
wsList.Cells(i, 6).Value = "エラー:" & Err.Description
errCount = errCount + 1
'--- エラー時にドキュメントが開いていれば閉じる
On Error Resume Next
If Not wdDoc Is Nothing Then
wdDoc.Close False
Set wdDoc = Nothing
End If
On Error GoTo 0
Resume NextRow
End Sub
書き換えポイント
| 変数 / 箇所 | 説明 | 初期値 |
|---|---|---|
| `templatePath` | Wordテンプレートのフルパス | `”C:\Template\報告書テンプレート.docx”` |
| `outputFolder` | 出力先フォルダ(末尾 `\` 必須) | `”C:\Output\”` |
| `listSheet` | 一覧データのシート名 | `”報告一覧”` |
| `Bookmarks(“CompanyName”)` → `Cells(i, 1)` | ブックマーク名と列の対応 | 4組(A〜D列) |
一覧シートの列構成
| 列 | 内容 | 必須 |
|---|---|---|
| A列 | 会社名 | 必須 |
| B列 | 報告日 | 必須 |
| C列 | 担当者 | 必須 |
| D列 | 概要 | 必須 |
| E列 | ファイル名(拡張子なし) | 任意(空欄時は「報告書_行番号」) |
| F列 | ステータス(自動記録) | 自動 |
コードの流れ
- **事前チェック**: 出力先フォルダとテンプレートの存在を確認
- **Wordを起動**: `CreateObject(“Word.Application”)` でバックグラウンド起動
- **一覧をループ**: 2行目から最終行まで、行ごとにテンプレートを開く
- **ブックマーク転記**: `Bookmarks.Exists` で確認してからセル値を書き込む
- **Word保存**: `SaveAs2` で別名保存(テンプレートを上書きしない)
- **PDF保存**: `ExportAsFixedFormat` でPDF出力
- **ステータス記録**: F列に「生成済み」「スキップ」「エラー」を記録
- **Wordを終了**: `wdApp.Quit` を必ず実行
**テンプレートを上書きしない設計**: 毎回 `Documents.Open` でテンプレートを開き、`SaveAs2` で別名保存する。テンプレート自体は変更されないので、繰り返し実行しても安全。ブックマークが消える心配もない。
PDF変換の詳細は ExcelファイルをPDFに一括変換 も参考になる。エラーハンドリングの仕組みは エラー処理で止まらないマクロを作る方法 を参照。
ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。
よくある落とし穴5選
1. Quit忘れでWINWORD.EXEが残留する
自分もこれで失敗した。エラーが起きてマクロが途中で止まり、wdApp.Quit が実行されなかった。タスクマネージャーを開いたらWINWORD.EXEが大量に残っていた。PCが重くなった原因がこれだった。
対策: エラー発生時も必ず wdApp.Quit が実行されるよう、On Error でクリーンアップ処理を入れる。実務版コードでは ErrHandler 内でドキュメントを閉じ、ループ終了後に wdApp.Quit を実行する設計にしている。
2. テンプレート上書きでブックマークが消失する
自分もテンプレートファイルを直接開いて上書き保存してしまった。ブックマークにテキストを挿入すると、ブックマークの範囲が消える。次にマクロを実行したらブックマークが見つからずエラーになった。
対策: テンプレートは常に SaveAs2 で別名保存する。テンプレート自体を上書き保存しない。この記事のコードはすべて別名保存の設計にしている。
3. ブックマーク名間違いでエラーが出る
原因: VBAコード内のブックマーク名と、Word文書に設定したブックマーク名が一致しない。スペルミスや大文字小文字の違いが原因。
対策: Bookmarks.Exists で事前チェックする。名前が一致しない場合はスキップされるだけで、エラーにならない。ブックマーク名はWordの「挿入」→「ブックマーク」で一覧を確認できる。
4. ActiveXコンポーネントエラー429(Wordデスクトップ版未インストール)
原因: CreateObject("Word.Application") はWordのデスクトップ版が必要。Web版のWordやストア版では動作しない場合がある。
対策: Wordのデスクトップアプリがインストールされていることを確認する。Microsoft 365の場合、「アプリのインストール」からデスクトップ版をインストールする。
5. 書式がテンプレートと違う
原因: Bookmarks("名前").Range.Text に文字列を代入すると、テンプレート側で設定した書式(フォント・サイズ・色)が維持されない場合がある。
対策: テンプレート側でブックマーク位置のフォントや段落書式を設定しておく。転記後も書式が異なる場合は、VBAで Range.Font.Name や Range.Font.Size を明示的に指定する。
FAQ
Q1: ブックマークではなくReplace(文字列置換)で転記したい
wdDoc.Content.Find.Execute FindText:="<<会社名>>", ReplaceWith:="株式会社サンプル" で置換できる。ただし同じ文字列が文書内に複数ある場合は全置換されるリスクがある。正確性を重視するならブックマーク方式を推奨する。
Q2: Wordテンプレートに画像も挿入したい
wdDoc.Bookmarks("PhotoArea").Range.InlineShapes.AddPicture "C:\画像パス\photo.jpg" で挿入できる。ブックマーク位置に画像を差し込む形になる。
Q3: 生成した報告書をそのままメールで送りたい
Word文書やPDFを保存した後、Outlook連携で添付ファイルとして送信できる。Excelからメール自動作成(Outlook連携) を参照。表をメール本文に直接貼り付けたい場合は Excelの表をOutlookメール本文に貼り付けて送る方法 を参照。
Q4: テンプレートにWord表(テーブル)があり、セルに直接転記したい
wdDoc.Tables(1).Cell(行, 列).Range.Text = 値 でWord文書内のテーブルのセルに直接転記できる。ブックマークを使わずにテーブルの行列番号で指定する方法もある。
Q5: 一括生成した報告書のファイル名を自動で変えたい
実務版コードで対応済み。E列にファイル名(拡張子なし)を入力すれば、その名前でWord文書とPDFが保存される。E列が空欄の場合は「報告書_行番号」が自動設定される。
まとめ
- Excelのセル値を `Bookmarks(“名前”).Range.Text` でWordのブックマーク位置に転記できる(最小版)
- `CreateObject(“Word.Application”)` で参照設定不要。コピペで動く
- 一覧データをループして複数の報告書を一括生成+PDF保存できる(実務版)
- **テンプレートは必ず `SaveAs2` で別名保存。上書きしない**
関連記事
- [Excelからメール自動作成(Outlook連携)](/007) — 生成した報告書をメール送信する場合
- [Excelの表をOutlookメール本文に貼り付けて送る方法](/025) — 表をメール本文に直接貼り付けたい場合
- [ExcelファイルをPDFに一括変換](/009) — ExcelファイルのPDF変換
次にやりたくなること
- **[ExcelファイルをPDFに一括変換](/009)**: Word経由のPDF保存と合わせて、ExcelファイルもPDF化したい場合
- **[一覧表からExcelテンプレートに差し込み印刷する方法](/018)**: Word文書ではなくExcelテンプレートに差し込みたい場合
100回のコピペが1クリックになると、報告書作成が「作業」から「確認だけ」に変わる。まずは最小版で「ExcelのデータがWordに自動転記される」感覚を体験してみてほしい。


コメント