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つ目だけ直したら、次は2件分がまとめて1冊に綴じられて出てきました。2つはセットで直すと考えておくと、遠回りしません。
なぜ2件目から外れるのか
差し込み印刷を実行すると、Wordは宛先1件ごとに「次のページから開始」の区切りを入れて、1つの長い文書にします。
区切りが変わるたびに、Wordは用紙やホチキスなどの設定をプリンターに渡し直します。このとき、印刷画面でその場だけ選んだ設定が引き継がれず、既定値に戻ることがあります。1件目だけ留まるのはそのためです。
出方はプリンターのドライバーによって違います。ここでいうのは、1件を1通の書類にする「レター」形式の差し込み印刷の話です。
手順1:ホチキスの既定値を設定
既定値にホチキスを入れておけば、区切りが変わっても外れにくくなります。既定値の置き場所は2つあるので、自分のパソコンだけの設定から試します。
| 置き場所 | 効く範囲 | 変えられる人 |
|---|---|---|
| [印刷設定] | 自分のパソコンだけ | 自分 |
| [プロパティ]→[標準の設定] | そのプリンターを使う全員 | 管理者のことが多い |
まず自分の[印刷設定]で試す(Windows 11)
- [設定]→[Bluetoothとデバイス]→[プリンターとスキャナー]を開く
- 使うプリンターを選び、[印刷設定]を開く
- 仕上げ(フィニッシャー)の項目でホチキスをオンにして保存する
- 宛先2件だけで差し込み印刷を試し、2件目にもホチキスが付くか見る
効かないときは[標準の設定]
- 同じ画面で[プリンターのプロパティ]を開く
- [詳細設定]タブ →[標準の設定]でホチキスをオンにする
僕の職場では、こちらに入れて効きました。ただし、会社の共有プリンターでここを変えると、部署全員の印刷がホチキス留めになることがあります。共有プリンターなら、社内でプリンターを管理している人に「ドライバーの既定値でホチキスを入れたい」と相談してください。
両面印刷も同じように戻ることがあります。 両面で出したいときは、ホチキスと一緒に両面も既定値に入れておきます。画面の名前や場所は、メーカーやドライバーによって少しずつ違います。
手順2:宛先ごとに印刷
僕の環境では、手順1のあと、今度は全員分が1冊に綴じられました。
Wordの通常の差し込み印刷は、全件をまとめて1つの印刷ジョブで送ります。プリンターから見ると「とても長い1つの書類」なので、全部を1束に綴じてしまいます。宛先ごとに綴じるには、1件ずつ別の印刷ジョブで送る必要があります。手でやると大変なので、マクロに任せます。

始める前に確認すること
- Windows版のWord専用です。 Windowsの仕組みでプリンターを切り替えるので、Macでは動きません。
- 社内のルールで、マクロを使ってよいかを先に確認してください。
- 差し込みフィールドを入れた元のWord文書で作業します。差し込み印刷の基本設定がまだなら、先に請求書を一括作成する記事の手順を済ませてください。
- Word側で宛先を並べ替えたり、絞り込んだり、チェックを外したりしないでください。マクロは「Excelの見出し行を除いた上からの順番」で宛先を指定するので、番号がずれます。
- Excelの一覧の下に、書式だけ残った空白行があると、白紙の宛先として数えられます。余分な行は削除しておきます。
- 1ページに複数件を並べる書類(宛名ラベルや名簿形式)は、このマクロの対象外です。
マクロを入れる
- 元のWord文書で Alt+F11 を押し、VBAの画面を開く
- 左の一覧で文書名を右クリック →[挿入]→[標準モジュール]
- 下のコードを貼り付ける
- Wordに戻り、Alt+F8 →「ListPrinters」を実行して、使うプリンターの正確な名前を控える
- もう一度 Alt+F11 で戻り、コードの上の方の
"ここにプリンター名"を、控えた名前に書き換える - 文書を 「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回目 | 1 | 1 | 正しい宛先が出て、ホチキスが付くか |
| 2回目 | 1-2 | 1 | 2件が別々に綴じられるか |
| 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部が上限以下なら留まりやすい |

上限の枚数は機種や設定で変わります。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件→全件の順で試し刷りする
差し込み印刷の関連記事
基本の設定や、表示の崩れで困ったときは、こちらも参考にしてください。
- 差し込み印刷の設定を最初から確認したい → Wordの差し込み印刷で請求書を一括作成する方法
- 日付や金額の表示が崩れる → 差し込み印刷で日付が数字になる・金額のカンマが消えるときの直し方
- Excelだけで1件ずつ連続印刷したい → Excelマクロ入門|宛名リストから請求書を連続印刷する
毎月の書類づくりから発送までを丸ごと仕組みにしたい場合は、こちらからご相談ください。
※本記事のイラストは、仕組みがわかるように作成した説明用のイメージです。プリンターの設定画面の名前や場所は、メーカー・機種・ドライバーによって異なります。