【連載】差し込み印刷のレコードごとにドキュメントを作成するマクロの解説(第2回)

第2回 差し込み印刷用文書と差し込みデータの準備

前回

akashi-keirin.hatenablog.com

の続きです。

差し込み印刷用文書と、文書に差し込むデータを準備し、差し込み印刷の設定を行います。

目次

差し込み印刷用文書の準備

「Word マクロ有効文書(*.docm)」形式の文書を作成する

まずは、差し込み印刷用文書を準備します。

あとでVBAのコードを仕込むことになるので、当然保存形式は「Word マクロ有効文書(*.docm)」です。

「Word マクロ有効文書(*.docm)」で保存

画像では、sample\差し込み印刷というフォルダの中にsample.docmという文書を作成しています。

1ページ目にコマンドボタンを配置する

まずは、文書の1ページ目にマクロ起動用のコマンドボタンを配置します。

前提として「開発」タブが表示されていなくてはいけません。

「開発」タブが非表示になっている人は、「ファイル」タブの「オプション」で表示させておきましょう。

「開発」タブの表示のさせ方をご存じない方は、「Word 開発タブ」あたりのキーワードでググってやればたちどころに解決すると思います。

では、コマンドボタンを追加していきましょう。

コマンド ボタンの追加

以前のバージョンのツール

「開発」タブ、「コントロール」グループの「以前のバージョンのツール」アイコンをクリックします。

コマンド ボタン(Active X コントロール)

「コマンド ボタン(Active X コントロール)」アイコンをクリックします。

デザイン モード

文書のカーソル位置(insertion point)にコマンド ボタン(このような要素を「コントロール(controle)」と呼びます。)が追加されました。

ここで、「コントロール」グループのところで「デザイン モード」のところがオンになっていることに注意してください。

コマンド ボタンのテキスト編集

オブジェクト→編集

コマンド ボタンを右クリックし、「オブジェクト」→「編集」の順にクリックします。

これで、コマンド ボタンに表示されるテキストを編集することができます。

ちなみに、右クリックが効くのは「デザイン モード」がオンのときだけです。

テキスト入力

このコマンドボタンにマクロを登録する、という設定は後ほど行います。

Excelだと非常に簡単な操作ですが、Wordの場合は少し事情が異なります。

ページ区切り挿入

1ページ目には、コマンド ボタンだけ置いておけば良いので、Ctrl + Enterでページ区切りを入れておきましょう。

2ページ目に差し込み文書の本体を作成する

では、差し込み文書の本体を入力しましょう。

2ページ目

……といっても、画像のように入力しているだけです。

今回は、「」の中にデータを差し込む仕様なので、ひとまず「」だけ入力しておきます。

この後、差し込み用データを作成し、差し込み用文書(=現在作成中のsample.docm)と差し込み用データファイルを接続してから、「」の中に〝差し込みフィールド〟(=データを闘魂注入するための場所)を設定することになります。

これで、一旦Word側の準備は一段落です。

差し込みデータの準備

差し込みデータ用Excelファイルの作成

こんどは、Word文書に差し込むためのデータを用意します。

差し込みデータファイルはどこに保存しても良いのですが、今回は差し込み文書(sample.docm)と同じフォルダに置くこととします。

Excelファイル新規作成

ファイル名は、別に何でも良いのですが、画像では、data-source.xlsxとしています。

データ入力

差し込み用データ作成

今回は、3件だけデータ(笑)を入力しています。

シート名はデフォルトの「Sheet1」のままでも良いのですが、画像では「src-data」としています。

単に差し込み印刷用文書(sanple.docm)の「」に闘魂注入するだけなら1列だけで良いのですが、出来上がった差し込み後の文書のファイル名を連番にするために「ID」という列を作成しています。

これで、差し込みデータもできました。上書き保存してdata-source.xlsxを閉じておきましょう。

次は、差し込み印刷用文書(sample.docx)と差し込みデータ(data-source.xlsxsrc-dataシートに作成した表)とを接続し、差し込みデータを闘魂注入するための〝差し込みフィールド〟を差し込み印刷用文書(sample.docm)に設定します。

差し込み印刷の設定

再度、差し込み印刷用文書(sample.docm)に戻ります。

差し込み印刷用文書と差し込みデータの接続

まず、差し込み印刷用文書(sample.docm)と差し込みデータ(data-source.xlsxsrc-dataシートに作成した表)を接続します。

既存のリスト

「差し込み文書」タブ、「差し込み印刷の開始」グループにある「宛先の選択」アイコン→「既存のリストを使用」の順にクリックします。

今回のプロジェクトの場合、差し込み用データ(のリスト)、すなわちdata-source.xlsxsrc-dataシートに作成した表はに作成して在しているので、「既存のリスト」を選択するわけです。

「宛先」ということばが出てくるのは、そもそもこの機能が葉書や封書の宛先部分の差し込みのための機能だからなのでしょう。

さて、「既存のリスト」をクリックすると、

謎のフォルダ

このように、いきなりわけのわからないフォルダからファイルを選択するよう促されます。

よく見ると、My Data Sourcesというフォルダ名なので、Officeの中の人的には「データソースはここに保存してね!」ということなのでしょう。

ただ、今回のプロジェクトでは、差し込み印刷用文書(sample.docm)と同じフォルダに差し込みデータ用Excelファイル(data-source.xlsx)を保存しているのですから、

フォルダ選択

慌てず騒がず...\sample\差し込み印刷フォルダに移動して、data-source.xlsxを選択し、「開く」をクリックしましょう。

すると、裏で差し込み印刷用文書(sample.docm)と差し込みデータ用Excelファイル(data-source.xlsx)が接続され、

テーブル選択

こんどは、差し込みデータ用Excelファイルのどこにデータがあるのか、指定するよう促されます。

ダイアログボックスのタイトルが「テーブルの選択」となっています。

テーブルとは〝表〟のことです。

差し込みデータ用Excelファイル(data-source.xlsx)では、「src-data」シートに表=テーブルの形式でデータ(笑)を作成している(参考)ので、「src-data$」を選択し、「OK」をクリックします。

先に作成した表では、先頭行を項目ラベルにしていたので、「先頭行をタイトル行として使用する」にチェックを入れてあります。(デフォルトでチェックが入っています。)

これで、差し込み印刷用文書と差し込みデータの接続は完了です。

文章入力とフィールドの挿入

さきほどまでグレーアウトされていた「文章入力とフィールドの挿入」グループのアイコンの多くがアクティブ化されています。

文書とデータソースとの接続が確立したため、これらの機能が使用可能になった、ということです。

差し込みフィールドの挿入

では、文書内にデータ(笑)を差し込む場所、すなわち差し込みフィールドを挿入します。

差し込みフィールドの挿入

データ(笑)を差し込みたい箇所にカーソルを置いて、「差し込み文書」タブの「差し込みフィールドの挿入」をクリックします。

「Phrase」を選択

すると、差し込みデータ用テーブル(表)の列(カラム column)のリストが展開するので、差し込みたいデータ(笑)の列名を選択します。

今回のプロジェクトでは、「Phrase」列のデータ(笑)を「」の中に差し込みたいので、「Phrase」を選択します。

差し込みフィールド

このように、差し込みフィールドが「」の中に挿入されました。

ちなみに、「文章入力とフィールドの挿入」グループの「結果のプレビュー」をクリックしてオンにすると、

結果のプレビュー

このように、データ(笑)を差し込んだ結果をプレビューすることができます。

画像は1つ目のレコードを表示しています。

差し込み結果のプレビュー

このように、他のレコードを差し込んだときの結果をプレビューすることができます。

実務で差し込み印刷機能を使う場合、差し込むデータの文字数によっては、レイアウトが崩れることがあるので、この機能を使って事前に確認しておくと良いでしょう。

これで差し込み印刷の設定は完了です。上書き保存をしておきましょう。

保存用フォルダの準備

最後に、データ(笑)を差し込んで新たに生まれた文書を保存するためのフォルダを作っておきます。

保存用フォルダの作成

フォルダ名は何でも良いのですが、画像では「★作成した文書」としています。

おわりに

これで準備は完了です。時は来た

次回はいよいよマクロの解説です。

関連記事

akashi-keirin.hatenablog.com

 

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

補足1 マクロのソースコード

いちおう、マクロのソースコードを先に載っけておきます。

本記事と同じように設定していれば、sample.docmに標準モジュールを挿入し、次のコードをコピペしてやれば実行は可能です。

ただし、コマンド ボタンとの紐付けはまだなので、コマンド ボタンをクリックしても何も起こりません。動作確認の際は、直接マクロを実行してください。

リスト1
Option Explicit

Const FOLDER_NAME As String = "★作成した文書"    'フォルダ名を変えたらここを変えること。'

Public Sub ExportMailMergeDocuments()
    If Dir(ThisDocument.Path & "\" & FOLDER_NAME, vbDirectory) = "" Then
        Call MkDir(ThisDocument.Path & "\" & FOLDER_NAME)
        Call MsgBox( _
            Prompt:="作成済みファイルを保存するフォルダ「" & FOLDER_NAME & _
                    "」を、このファイルのあるディレクトリに作成しました。", _
            Buttons:=vbInformation, _
            Title:="お知らせ" _
        )
    End If
    Dim folderPath As String
    folderPath = ThisDocument.Path & "\" & FOLDER_NAME & "\"
    Dim srcDoc As Document
    Dim newDoc As Document
    Set srcDoc = ThisDocument
  
    On Error GoTo HandleError

    With srcDoc.MailMerge
        Dim maxRec As Long
        maxRec = .DataSource.RecordCount
        .Destination = wdSendToNewDocument
        .SuppressBlankLines = True
        Dim i As Long
        For i = 1 To maxRec
            With .DataSource
                .ActiveRecord = i
                .FirstRecord = i
                .LastRecord = i
            End With
            Call .Execute(Pause:=True)
            DoEvents
            Set newDoc = ActiveDocument
            Dim tgtFileName As String
            tgtFileName = "諸葛亮曰く_" & Format(.DataSource.DataFields("ID").Value, "00")
            If tgtFileName <> "" Then
                With newDoc
                    ' 文書末尾の余分なセクション区切りを削除
                    Dim lastSection As Section
                    Set lastSection = .Sections(.Sections.Count)
                    If lastSection.Range.Start = .Content.End - 1 Then
                        Call lastSection.Range.Previous(Unit:=wdCharacter, Count:=1).Delete
                    End If
                    ' 1ページ目を削除
                    Call newDoc.Range(0, 0).Select
                    Call newDoc.Bookmarks("\Page").Range.Delete
                    Call newDoc.SaveAs( _
                                    FileName:=folderPath & tgtFileName & ".docx", _
                                    fileformat:=wdFormatXMLDocument, _
                                    addtorecentfiles:=False)
                    Call newDoc.Close(SaveChanges:=False)
                End With
            End If
            DoEvents
        Next
    End With
    Set srcDoc = Nothing
    Set newDoc = Nothing
Exit Sub

HandleError:
    Call MsgBox( _
        Prompt:="エラーが発生しました。差込設定を見直すなど、設定を再確認してください。", _
        Buttons:=vbExclamation, _
        Title:="エラー!" _
    )
End Sub

補足2 差し込み印刷用文書オープン時のアラートについて

差し込み印刷の設定を施したあと、文書(今回の場合sample.docm)を再度開こうとすると、

文書オープン時のアラート

このようなアラートが表示されます。

曰く、

この文書を開くと、次のSQLコマンドが実行されます。

SELECT * FROM `'src-data$'`

データベースからのデータが、文書に挿入されます。続行しますか?

これは、次のようなことを言っています。

この文書を開くと、次のSQLコマンドが実行されます。

SQL」とは、Structured Query Languageの略で、データベースに命令を出すための言語のことです。

今回のプロジェクトでは、既にWordの文書(sample.docm)にデータベース(もどき)であるExcelファイル(source-data.xlsx)を接続しているので、Wordが

この文書に接続されているデータベース(もどき)に命令を出していいっすかね?

と確認している、というわけです。

SELECT * FROM `'src-data$'`

SELECT * FROM `'src-data$'`

これが、SQLの命令文です。

'src-data$'という名前の表(テーブル)から、全部の列(*)のデータを取り出しなさい。

と言っています。

データベースからのデータが、文書に挿入されます。続行しますか?

これは、

文書オープン時に、接続されているデータベース(もどき)であるExcelファイル(data-source.xlsx)にSQLの命令を出し、テーブル(「src-data」シートの表)からデータを取り出して文書に挿入するよ。いいかい?

と言っています。

ここで「はい」をクリックすると、Excelから取り出したデータが闘魂注入された状態で文書が開かれるので、差し込み印刷機能が使える、というわけです。