← 記事一覧へ戻る

Wordの差し込み印刷を1件ずつ印刷してホチキス留めする方法|2件目から外れるときの対処

Wordの差し込み印刷で、2件目からホチキスが外れる・全員分が1冊に綴じられるときの対処法。プリンターの既定値の設定と、宛先ごとに1件ずつ印刷するWindows版Word用マクロを紹介します。複数部を1部ずつ綴じる方法と、試し刷りの順番も説明します。

差し込み印刷で、相手ごとの書類一式を作った。印刷画面で「ホチキス」を選んで、まとめて印刷した。出てきた紙を見たら、1件目だけ留まっていて、2件目からはバラバラ。設定を直してもう一度出したら、今度は全員分が1冊にまとめて綴じられた。

結局、何十件ぶんの紙を手で数え直して、ホチキスで留めていく。印刷は一瞬なのに、そこから先の手作業が長い。 僕も職場でこの状態になりました。

「自分の操作が悪いのかな」と思うかもしれませんが、たいていは違います。Wordの差し込み印刷の仕組みと、プリンターの設定の組み合わせで起きることが多く、印刷画面を触るだけでは直りにくい問題です。この記事では、僕の職場で実際に直った手順を2段階でまとめます。

この記事でわかること

  • 2件目からホチキスが外れる理由と、プリンター側の直し方
  • 全員分が1冊に綴じられる理由と、1件ずつ印刷するコピペ用マクロ
  • 1件につき複数部ほしいときに、1部ずつ綴じる方法

結論:設定変更+1件ずつ印刷

症状は2つあり、原因も直し方も別々です。

症状よくある原因直し方
2件目からホチキスが外れる差し込み印刷は1件ごとに区切り(セクション)が入り、区切りのたびに印刷画面の設定が既定値に戻ることがあるホチキスをプリンターの既定値に入れる
全員分が1冊に綴じられる全件が1つの印刷ジョブで送られ、プリンターには宛先の区切りが分からない1件ずつ別の印刷ジョブで送る(マクロ)

1件目だけホチキスが留まって残りがバラバラになる状態と、宛先ごとにきれいに留まった状態の比較

僕の環境では、1つ目だけ直したら、次は2件分がまとめて1冊に綴じられて出てきました。2つはセットで直すと考えておくと、遠回りしません。

なぜ2件目から外れるのか

差し込み印刷を実行すると、Wordは宛先1件ごとに「次のページから開始」の区切りを入れて、1つの長い文書にします。

区切りが変わるたびに、Wordは用紙やホチキスなどの設定をプリンターに渡し直します。このとき、印刷画面でその場だけ選んだ設定が引き継がれず、既定値に戻ることがあります。1件目だけ留まるのはそのためです。

出方はプリンターのドライバーによって違います。ここでいうのは、1件を1通の書類にする「レター」形式の差し込み印刷の話です。

手順1:ホチキスの既定値を設定

既定値にホチキスを入れておけば、区切りが変わっても外れにくくなります。既定値の置き場所は2つあるので、自分のパソコンだけの設定から試します。

置き場所効く範囲変えられる人
[印刷設定]自分のパソコンだけ自分
[プロパティ]→[標準の設定]そのプリンターを使う全員管理者のことが多い

まず自分の[印刷設定]で試す(Windows 11)

  1. [設定]→[Bluetoothとデバイス]→[プリンターとスキャナー]を開く
  2. 使うプリンターを選び、[印刷設定]を開く
  3. 仕上げ(フィニッシャー)の項目でホチキスをオンにして保存する
  4. 宛先2件だけで差し込み印刷を試し、2件目にもホチキスが付くか見る

効かないときは[標準の設定]

  1. 同じ画面で[プリンターのプロパティ]を開く
  2. [詳細設定]タブ →[標準の設定]でホチキスをオンにする

僕の職場では、こちらに入れて効きました。ただし、会社の共有プリンターでここを変えると、部署全員の印刷がホチキス留めになることがあります。共有プリンターなら、社内でプリンターを管理している人に「ドライバーの既定値でホチキスを入れたい」と相談してください。

両面印刷も同じように戻ることがあります。 両面で出したいときは、ホチキスと一緒に両面も既定値に入れておきます。画面の名前や場所は、メーカーやドライバーによって少しずつ違います。

手順2:宛先ごとに印刷

僕の環境では、手順1のあと、今度は全員分が1冊に綴じられました。

Wordの通常の差し込み印刷は、全件をまとめて1つの印刷ジョブで送ります。プリンターから見ると「とても長い1つの書類」なので、全部を1束に綴じてしまいます。宛先ごとに綴じるには、1件ずつ別の印刷ジョブで送る必要があります。手でやると大変なので、マクロに任せます。

全件を1つのジョブで送ると1冊に綴じられ、1件ずつ別のジョブで送ると宛先ごとに綴じられる図

始める前に確認すること

  • Windows版のWord専用です。 Windowsの仕組みでプリンターを切り替えるので、Macでは動きません。
  • 社内のルールで、マクロを使ってよいかを先に確認してください。
  • 差し込みフィールドを入れた元のWord文書で作業します。差し込み印刷の基本設定がまだなら、先に請求書を一括作成する記事の手順を済ませてください。
  • Word側で宛先を並べ替えたり、絞り込んだり、チェックを外したりしないでください。マクロは「Excelの見出し行を除いた上からの順番」で宛先を指定するので、番号がずれます。
  • Excelの一覧の下に、書式だけ残った空白行があると、白紙の宛先として数えられます。余分な行は削除しておきます。
  • 1ページに複数件を並べる書類(宛名ラベルや名簿形式)は、このマクロの対象外です。

マクロを入れる

  1. 元のWord文書で Alt+F11 を押し、VBAの画面を開く
  2. 左の一覧で文書名を右クリック →[挿入]→[標準モジュール]
  3. 下のコードを貼り付ける
  4. Wordに戻り、Alt+F8 →「ListPrinters」を実行して、使うプリンターの正確な名前を控える
  5. もう一度 Alt+F11 で戻り、コードの上の方の "ここにプリンター名" を、控えた名前に書き換える
  6. 文書を 「Word マクロ有効文書(*.docm)」 で保存する

このマクロは、僕が職場で実際に使って、宛先ごとにホチキス留めして出せたものです。職場向けの言葉だけ、一般的な表現に置き換えています。

コードを開く(約250行・全部コピーして貼り付け)
Option Explicit

'==========================================
' 差し込み印刷 1件ずつ出力ツール
'
' 【管理者向け】プリンターを変更する場合は
'   下の PRINTER_NAME の "" の中を書き換えてください。
'   正確な名前は ListPrinters を実行すると確認できます。
'==========================================
Private Const PRINTER_NAME  As String = "ここにプリンター名"   'ListPrinters で確認して書き換える
Private Const WAIT_SECONDS  As Long = 3
Private Const DEFAULT_COPIES As Long = 1   '1件あたりの部数の初期値


'==========================================
' ★ボタンから呼ばれるのはこれ
'==========================================
Sub 差込印刷_ホチキス()
    Dim doc As Document
    Dim n As Long, firstRec As Long, lastRec As Long
    Dim i As Long, cnt As Long, c As Long, nCopies As Long
    Dim ans As String
    Dim savedDefault As String, switched As Boolean

    Set doc = ActiveDocument

    '--- 差込文書かどうか確認
    If doc.MailMerge.MainDocumentType = wdNotAMergeDocument Then
        MsgBox "この文書は差込文書ではありません。" & vbCrLf & _
               "差込設定を済ませた文書を開いてから実行してください。", _
               vbExclamation, "差込印刷"
        Exit Sub
    End If

    '--- 件数取得
    On Error Resume Next
    n = doc.MailMerge.DataSource.RecordCount
    On Error GoTo 0

    If n < 1 Then
        MsgBox "宛先データを読み取れませんでした。" & vbCrLf & _
               "[差し込み文書]タブで宛先ファイルが選ばれているか確認してください。", _
               vbExclamation, "差込印刷"
        Exit Sub
    End If

    '--- 印刷範囲の選択
    ans = InputBox( _
        "宛先は全部で " & n & " 件あります。" & vbCrLf & vbCrLf & _
        "どれを印刷しますか? 下の欄に入力してください。" & vbCrLf & vbCrLf & _
        "  すべて印刷      →  全部" & vbCrLf & _
        "  3件目だけ        →  3" & vbCrLf & _
        "  5件目から12件目 →  5-12" & vbCrLf & _
        "  1と4と7件目     →  1,4,7" & vbCrLf & vbCrLf & _
        "※件数はExcelの見出し行を除いた上からの順番です。", _
        "印刷する宛先の指定", "全部")

    If StrPtr(ans) = 0 Then Exit Sub          'キャンセル
    ans = Trim$(Replace(Replace(ans, " ", ""), " ", ""))
    If ans = "" Then Exit Sub

    Dim recList() As Long
    If Not ParseRange(ans, n, recList, cnt) Then
        MsgBox "入力内容を読み取れませんでした。" & vbCrLf & vbCrLf & _
               "「全部」「3」「5-12」「1,4,7」のいずれかの形で" & vbCrLf & _
               "1〜" & n & " の範囲で入力してください。", _
               vbExclamation, "入力エラー"
        Exit Sub
    End If

    '--- 部数の指定(1件を何部ずつ綴じるか)
    ans = InputBox( _
        "1件あたり何部ずつ印刷しますか?" & vbCrLf & vbCrLf & _
        "複数部ほしいときは、その数を入力してください。" & vbCrLf & _
        "試し刷りのときは 1 にしてください。" & vbCrLf & vbCrLf & _
        "※1部ずつ別々にホチキス留めされます。", _
        "部数の指定", CStr(DEFAULT_COPIES))

    If StrPtr(ans) = 0 Then Exit Sub          'キャンセル
    ans = Trim$(Replace(Replace(ans, " ", ""), " ", ""))
    nCopies = 0
    If IsNumeric(ans) Then nCopies = CLng(Val(ans))
    If nCopies < 1 Or nCopies > 20 Then
        MsgBox "部数は 1〜20 の数字で入力してください。", vbExclamation, "入力エラー"
        Exit Sub
    End If

    '--- 最終確認
    If MsgBox(cnt & " 件 × " & nCopies & " 部 = 合計 " & (cnt * nCopies) & " 束を印刷します。" & vbCrLf & vbCrLf & _
              "プリンター: " & PRINTER_NAME & vbCrLf & vbCrLf & _
              "1件目を" & nCopies & "部つづけて出し、次に2件目を" & nCopies & "部…という順で出力します。" & vbCrLf & _
              "1部ごとに分けてホチキス留めされます。" & vbCrLf & vbCrLf & _
              "用紙とホチキス針の残量を確認してください。", _
              vbOKCancel + vbQuestion, "印刷の確認") <> vbOK Then Exit Sub

    '--- プリンター切替
    savedDefault = GetDefaultPrinter()
    If LCase$(savedDefault) <> LCase$(PRINTER_NAME) Then
        If SetDefaultPrinter(PRINTER_NAME) Then
            switched = True
        Else
            If MsgBox("プリンター「" & PRINTER_NAME & "」が見つかりませんでした。" & vbCrLf & vbCrLf & _
                      "現在の既定プリンター(" & savedDefault & ")で印刷しますか?" & vbCrLf & _
                      "※ホチキス留めされない可能性があります。", _
                      vbOKCancel + vbExclamation, "確認") <> vbOK Then Exit Sub
        End If
    End If

    '--- 印刷
    On Error GoTo Cleanup
    With doc.MailMerge
        .Destination = wdSendToPrinter
        For i = 1 To cnt
            .DataSource.FirstRecord = recList(i)
            .DataSource.LastRecord = recList(i)
            '1件を続けて必要部数ぶん出す。1部=1ジョブなので1部ごとに綴じられる
            For c = 1 To nCopies
                .Execute Pause:=False
                Application.StatusBar = "印刷中... " & i & " / " & cnt & " 件(" & c & " / " & nCopies & " 部)"
                WaitSeconds WAIT_SECONDS
            Next c
        Next i
    End With

    Application.StatusBar = ""
    If switched Then SetDefaultPrinter savedDefault
    MsgBox cnt & " 件 × " & nCopies & " 部(合計 " & (cnt * nCopies) & " 束)をプリンターに送信しました。" & vbCrLf & _
           "出力が終わるまで少し時間がかかる場合があります。", _
           vbInformation, "完了"
    Exit Sub

Cleanup:
    Application.StatusBar = ""
    If switched Then SetDefaultPrinter savedDefault
    MsgBox "印刷中にエラーが発生しました。" & vbCrLf & vbCrLf & _
           "内容: " & Err.Description & vbCrLf & vbCrLf & _
           "途中まで印刷されている可能性があります。" & vbCrLf & _
           "プリンターの出力を確認してください。", vbCritical, "エラー"
End Sub


'==========================================
' 指定した秒数だけ待つ
'
' Word には Excel のような Application.Wait が無いため自前で用意する。
' DoEvents を挟んでいるので、待っている間に Word が
' 印刷ジョブをプリンターへ送り出せる(ここが重要)。
'==========================================
Private Sub WaitSeconds(ByVal secs As Long)
    Dim endT As Single
    endT = Timer + secs
    Do
        DoEvents
        If Timer >= endT Then Exit Do
        If Timer < secs Then Exit Do        '日付をまたいだときの保険
    Loop
End Sub


'==========================================
' 管理者用:プリンター名の確認
'==========================================
Sub ListPrinters()
    Dim wmi As Object, col As Object, p As Object, s As String
    Set wmi = GetObject("winmgmts:\\.\root\cimv2")
    Set col = wmi.ExecQuery("SELECT Name, Default FROM Win32_Printer")
    For Each p In col
        s = s & IIf(p.Default, "[既定] ", "        ") & p.Name & vbCrLf
    Next
    MsgBox "インストール済みプリンター:" & vbCrLf & vbCrLf & s & vbCrLf & _
           "現在の設定: " & PRINTER_NAME, vbInformation, "プリンター一覧"
End Sub


'==========================================
' 内部処理
'==========================================
Private Function ParseRange(ByVal s As String, ByVal maxRec As Long, _
                            ByRef outList() As Long, ByRef outCnt As Long) As Boolean
    Dim parts() As String, i As Long, j As Long
    Dim a As Long, b As Long, pos As Long
    Dim tmp() As Long

    ReDim tmp(1 To 10000)
    outCnt = 0

    If s = "全部" Or s = "すべて" Or s = "全て" Or LCase$(s) = "all" Then
        For i = 1 To maxRec
            outCnt = outCnt + 1
            tmp(outCnt) = i
        Next
        GoTo Done
    End If

    parts = Split(Replace(s, ",", ","), ",")
    For i = 0 To UBound(parts)
        If parts(i) = "" Then GoTo NextPart
        pos = InStr(Replace(parts(i), "−", "-"), "-")
        If pos > 0 Then
            a = SafeNum(Left$(parts(i), pos - 1))
            b = SafeNum(Mid$(parts(i), pos + 1))
            If a < 1 Or b < 1 Or a > maxRec Or b > maxRec Or a > b Then Exit Function
            For j = a To b
                outCnt = outCnt + 1
                tmp(outCnt) = j
            Next
        Else
            a = SafeNum(parts(i))
            If a < 1 Or a > maxRec Then Exit Function
            outCnt = outCnt + 1
            tmp(outCnt) = a
        End If
NextPart:
    Next

Done:
    If outCnt = 0 Then Exit Function
    ReDim outList(1 To outCnt)
    For i = 1 To outCnt
        outList(i) = tmp(i)
    Next
    ParseRange = True
End Function

Private Function SafeNum(ByVal s As String) As Long
    s = Trim$(s)
    If s = "" Then Exit Function
    If Not IsNumeric(s) Then Exit Function
    SafeNum = CLng(Val(s))
End Function

Private Function GetDefaultPrinter() As String
    Dim wmi As Object, col As Object, p As Object
    On Error Resume Next
    Set wmi = GetObject("winmgmts:\\.\root\cimv2")
    Set col = wmi.ExecQuery("SELECT Name FROM Win32_Printer WHERE Default = True")
    For Each p In col
        GetDefaultPrinter = p.Name
        Exit For
    Next
End Function

Private Function SetDefaultPrinter(ByVal pName As String) As Boolean
    On Error GoTo Failed
    CreateObject("WScript.Network").SetDefaultPrinter pName
    On Error Resume Next
    Application.ActivePrinter = pName
    SetDefaultPrinter = True
    Exit Function
Failed:
    Err.Clear
End Function

試し刷りしてから全件を印刷する

Alt+F8 →「差込印刷_ホチキス」を実行すると、「どれを印刷するか」と「1件あたり何部か」を順番に聞いてきます。宛先は「全部」「3」「5-12」「1,4,7」の形で入力できます。

いきなり全件を出さずに、この順番で確かめます。

回宛先部数確かめること
1回目11正しい宛先が出て、ホチキスが付くか
2回目1-212件が別々に綴じられるか
3回目全部必要な部数本番
  • 1部送るごとに3秒待つので、件数が多いと時間がかかります。終わるまで、Wordや印刷の設定は触らないでください。
  • 印刷が終わると、パソコンの「通常使うプリンター」を元に戻します。
  • ボタン1つで実行できるように、クイックアクセスツールバーにマクロを登録しておくと、次の担当者も迷いません。

うまく綴じられないとき

  • 2件がくっついて1束になる:まず、宛先の指定が1件ずつになっているかを確認します。それでも起きるなら、コードの WAIT_SECONDS を 5〜8 に増やして様子を見てください。
  • ホチキスされずに出てくる:1部の枚数が、ホチキスで留められる上限を超えていないか確認します(次の章)。
  • 「プリンターが見つかりません」と出る:ListPrintersで表示された名前を、末尾の空白まで正確にコピーし直します。

複数部ほしいときの注意

「宛先ごとに分けて綴じる」ことと、「同じ宛先の書類を複数部出す」ことは別の話です。1件につき3部ほしいときに、印刷の部数を「3」にして1回で送ると、3部ぶんが1束になることがあります。

ホチキスで留められる枚数には上限があります。僕の職場の複合機は50枚ほどでした。3部まとめると1束の枚数が3倍になるので、上限を超えやすくなります。上限を超えると、機種によってはホチキスされずにそのまま出てきます。

上のマクロは、部数を指定すると1部ずつ別のジョブで送ります。僕の環境では、1部の枚数が上限以下なら、部数を増やしても1部ずつ留まりました。しかも「1件目を3部 → 2件目を3部」の順で出てくるので、封筒に入れるときに同じ相手の書類を探し回らずに済みます。

送り方1束の枚数結果
部数「3」で1回送る1部の枚数 × 3上限を超えやすい
1部ずつ3回送る(マクロ)1部の枚数1部が上限以下なら留まりやすい

3部まとめて送ると厚すぎて留まらず、1部ずつ送ると1部ずつ留まる図

上限の枚数は機種や設定で変わります。1回で送っても1部ずつ綴じる機能を持つプリンターもあるので、説明書も確認してみてください。

Before / After

時間は測ったわけではなく、僕の体感です。

作業手作業仕組み化した後
印刷して、相手ごとに分けてホチキスで留める60分ほど印刷の10分ほどだけ

時間だけでなく、仕上がりも手でホチキスを留めるよりきれいです。留める位置がそろうので、そのまま相手に渡せます。

よくある質問

Q. 差し込み印刷の「レコード」とは?

差し込む1件分のデータのことです。Excelの一覧でいえば、見出しの下の1行が1レコードです。「2件目からホチキスが外れる」は、「2つ目のレコードから外れる」という意味になります。

Q. ホチキスを宛先ごとに別々に(個別に)留めるには?

2つの設定が要ります。①ホチキスをプリンターの既定値に入れる(手順1)、②1件ずつ別の印刷ジョブで送る(手順2のマクロ)。①だけだと、全員分が1冊に綴じられることがあります。

Q. 特定の宛先(レコード)だけを印刷するには?

マクロを使う場合は、最初に聞かれる「どれを印刷しますか」に番号を入れます。「3」なら3件目だけ、「1,4,7」なら1・4・7件目だけです。マクロを使わない場合は、[差し込み文書]タブ →[完了と差し込み]→[文書の印刷]で、「最初のレコード」と「最後のレコード」の番号を指定できます。

Q. レコードごとにPDFで保存するには?

この記事は紙に印刷する方法です。宛先ごとに別々のPDFファイルにしたいときは、請求書を一括作成する記事の「宛先ごとに別々のPDFファイルに分けたいときは」を参考にしてください。

まとめ

  • 2件目からホチキスが外れるのは、区切りのたびに設定が既定値に戻ることがあるから。**まず自分の[印刷設定]、効かなければ管理担当に相談して[標準の設定]**に入れる
  • 全員分が1冊になるのは、全件が1つのジョブで送られるから。宛先ごとに綴じるには1件ずつ印刷する
  • 複数部ほしいときは1部ずつ別のジョブで送り、1束がホチキスの上限を超えないようにする
  • いきなり全件を出さず、1件→2件→全件の順で試し刷りする

差し込み印刷の関連記事

基本の設定や、表示の崩れで困ったときは、こちらも参考にしてください。

毎月の書類づくりから発送までを丸ごと仕組みにしたい場合は、こちらからご相談ください。


※本記事のイラストは、仕組みがわかるように作成した説明用のイメージです。プリンターの設定画面の名前や場所は、メーカー・機種・ドライバーによって異なります。