VBAで宛名印刷を自動化するには、データシートの住所を1行ずつ印刷用シートに転記しながら印刷する処理をループで繰り返します。必要なのは「データシート」と「印刷用シート」の2枚だけです。一度マクロを作ればボタンひとつで全件印刷できるようになります。
この記事では、次の内容を順番に解説します。
- 宛名印刷の自動化に必要な準備
- 基本のコードと流れ
- PDFで保存する応用
- よくあるトラブルの対処法
宛名印刷の自動化に必要な準備は?
次の2つのシートを用意します。
- データシート:氏名・郵便番号・住所などを一覧で管理するシート。
- 印刷用シート:1件分の宛名を表示して印刷するためのシート。テンプレートとして使います。
データシートは次のような表形式で入力しておきます。
| A列 | B列 | C列 | D列 |
|---|---|---|---|
| No | 氏名 | 郵便番号 | 住所 |
| 1 | 山田太郎 | 123-4567 | 東京都新宿区〇〇 |
| 2 | 佐藤花子 | 987-6543 | 神奈川県横浜市△△ |
1行目がタイトル行、2行目以降にデータを入力します。
宛名印刷を自動化するコードは?
Sub Address_print()
Dim i As Long
Dim lastRow As Long
Dim wsData As Worksheet
Dim wsTemplate As Worksheet
Set wsData = Worksheets("データ")
Set wsTemplate = Worksheets("印刷用シート")
' データシートの最終行を取得する
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For i = 2 To lastRow
' 印刷用シートに1件分のデータを転記する
wsTemplate.Range("A2").Value = wsData.Cells(i, 2).Value ' 氏名
wsTemplate.Range("A3").Value = wsData.Cells(i, 3).Value ' 郵便番号
wsTemplate.Range("A4").Value = wsData.Cells(i, 4).Value ' 住所
' 1件印刷する
wsTemplate.PrintOut
Next i
Application.ScreenUpdating = True
MsgBox "印刷が完了しました。"
End Sub
コードの流れ
- データシートと印刷用シートをそれぞれ変数に入れます。
- データシートの最終行を取得して、2行目から最終行まで繰り返します。
- 1件分のデータを印刷用シートの指定セルに転記します。
PrintOutで1件ずつ印刷します。- 全件終わったら完了のメッセージを表示します。
印刷用シートのA2・A3・A4のセル位置は、自分のテンプレートに合わせて変更してください。
PDFで保存するには?
印刷ではなくPDFファイルとして1件ずつ保存したい場合は、PrintOut の部分を次のように変えます。
wsTemplate.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:¥出力¥" & wsData.Cells(i, 2).Value & ".pdf"
氏名をファイル名にして保存されます(例:山田太郎.pdf)。保存先のフォルダはあらかじめ作っておく必要があります。
よくあるトラブルと対処法
- 印刷されない:シート名やセルの位置が間違っていないか確認しましょう。シート名は「データ」「印刷用シート」と完全に一致している必要があります。
- PDFが上書きされる:同じ氏名の人がいるとファイルが上書きされます。ファイル名に連番(
i)や日付を組み合わせると防げます。 - 印刷が遅い:
Application.PrintCommunication = Falseをコードの最初に追加すると改善することがあります。処理後はTrueに戻してください。
まとめ
VBAで宛名印刷を自動化すると、大量の宛名も一気に処理できます。
- 必要なもの:データシート(一覧)と印刷用シート(テンプレート)の2枚。
- 基本の流れ:データを1行ずつ印刷用シートに転記 → PrintOutで印刷、をループで繰り返す。
- PDF保存:PrintOutの代わりにExportAsFixedFormatを使う。
- ボタンに登録:マクロをシートのボタンに割り当てると、ワンクリックで実行できる。
よくある質問
特定の人だけ印刷したい場合は?
データシートにフラグ列(例:E列に「印刷する」「しない」)を追加して、ループの中で If wsData.Cells(i, 5).Value = "印刷する" Then のように条件を追加します。フラグが立っている行だけを印刷対象にできます。
印刷枚数を2枚にするには?
PrintOut の後に Copies:=2 を追加します。例:wsTemplate.PrintOut Copies:=2 で1件につき2枚ずつ印刷されます。
プリンターを指定したい場合は?
PrintOut の前に ActivePrinter = "プリンター名" を追加します。プリンター名はコントロールパネルの「デバイスとプリンター」で確認できます。
印刷前に確認画面を出したい場合は?
PrintOut の代わりに PrintPreview を使うと印刷プレビューが表示されます。ただしループの中で使うと1件ごとにプレビューが出て手動で閉じる必要があるため、確認したい場合は最初の1件だけプレビューするなど工夫が必要です。
宛名印刷用のシートが別のファイルにある場合は?
Worksheets("印刷用シート") の代わりに Workbooks("ファイル名.xlsx").Worksheets("印刷用シート") のようにファイル名も指定します。ただし対象のファイルがあらかじめ開いている必要があります。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



