WordのVBAを使用し、差し込み印刷でレコード毎にPDFを保存する方法の備忘録。Wordの差し込み印刷機能は、文章の一部を個別の名前等に変換して大量の文書を作成するのにとても便利です。それぞれのレコード単位で、PDFを作成、フィールドの名前で保存するVBAサンプルを作成してみました。
使用のWordは「Microsoft®Word® for Microsoft 365 MSO」(バージョン2311)です。
VBAサンプルの前提
- このマクロを使用する前に、Word側で差し込み印刷の設定までは完了しておきます。複数の宛名が1枚に入る「ラベル」のような差し込み印刷には対応していません。
参考サイト
基本の考え方は次の情報を参考にさせていただき「PDF保存」などアレンジしました。
VBAサンプル
VBAコードのサンプルは次のとおり。
Option Explicit Dim 差込印刷の文書 As Document Dim フィールド一覧() As Variant Dim ファイル名のフィールド As String Dim レコード番号 As Long Dim 終了レコード番号 As Long Dim ファイル名 As String Sub Wordの差し込み印刷でレコード毎にpdfで保存() Set 差込印刷の文書 = ActiveDocument '差込印刷の状況確認' If 差込印刷の文書.MailMerge.DataSource.Name = "" Then MsgBox "差込印刷の設定が完了していないため、マクロを終了します。" Exit Sub End If '保存ファイル名を設定' Call 差込印刷のフィールド名取得 Call 保存時のファイル名にするフィールド取得 With 差込印刷の文書.MailMerge '差込印刷の終了レコード番号取得' '一旦アクティブにしないと番号取得ができなかった' .DataSource.ActiveRecord = wdLastRecord 終了レコード番号 = .DataSource.ActiveRecord '差込印刷の開始レコード番号をアクティブにする' .DataSource.ActiveRecord = wdFirstRecord レコード番号 = .DataSource.ActiveRecord 'Wordの差し込み印刷側で、結果のプレビュー状態に設定' .ViewMailMergeFieldCodes = False Do 'ファイル保存を終了レコードまでループ' ファイル名 = .DataSource.DataFields(ファイル名のフィールド).Value If Not ファイル名 = "" Then 差込印刷の文書.ExportAsFixedFormat _ OutputFileName:=差込印刷の文書.Path & "\" & ファイル名 & ".pdf", _ ExportFormat:=wdExportFormatPDF End If If レコード番号 = 終了レコード番号 Then Exit Do Else .DataSource.ActiveRecord = wdNextRecord レコード番号 = .DataSource.ActiveRecord End If Loop End With '終了処理' Set 差込印刷の文書 = Nothing MsgBox "完了しました。出力されたPDFが適切に変換できているかチェックしてください。" End Sub Function 差込印刷のフィールド名取得() Dim フィールド情報 As Object Dim i As Long ReDim Preserve フィールド一覧(差込印刷の文書.MailMerge.DataSource.DataFields.Count - 1) 'インデックスが0から開始なので1を引く 'フィールド一覧の作成' For Each フィールド情報 In 差込印刷の文書.MailMerge.DataSource.FieldNames フィールド一覧(i) = フィールド情報.Name i = i + 1 Next End Function Function 保存時のファイル名にするフィールド取得() ファイル名のフィールド = InputBox("ファイル名に使用するフィールド名を入力してください。" & vbCrLf & Join(フィールド一覧, " | "), "ファイル名の設定") '入力内容のチェック' Dim フィールドの有無確認用 As Variant フィールドの有無確認用 = Filter(フィールド一覧, ファイル名のフィールド) If UBound(フィールドの有無確認用) = -1 Then MsgBox "ファイル名に使用するフィールド名が存在しませんでした。半角全角等も含め確認してください。" End End If End Function
補足説明・注意
- Wordの動作が不安定な時がありました。原因が把握できていませんが、いずれにしもて、出力されたPDFが適切に保存されているかを必ずチェックが必要です。
- このサンプルは、Wordの差し込み印刷で、「結果のプレビュー」をONにして、レコードを順番にプレビュー表示してPDFエクスポートを繰り返した事例です。
- WdMailMergeActiveRecord 列挙は次のとおりです。
- 詳細確認できていないが、終了レコード番号について、DataSource.LastRecord で"-16"が返るだけで、DataSource.ActiveRecordのようにレコード番号が取得されなかった。そのため、DataSource.ActiveRecord = wdLastRecord で最終レコードをアクティブにしてDataSource.ActiveRecord でレコード番号を取得しています。
以上、WordのVBAを使用し、差し込み印刷でレコード毎にPDF保存する方法の備忘録でした。