Excelで作業していて、ふと気づくことがあります。
「あれ?これ、昨日も…いや一昨日もやってない?」
毎日のように同じ帳票を開いて、印刷範囲を調整して、PDFにして保存して、メールに添付して…。
そう、もはや“印刷ボット”状態です。(しかも残業つき)
そんなある日、「もっと楽する方法ないのかな…」とVBAに出会いました。
最初はちょっと難しそうに見えたけれど、触ってみるとExcelの中で一番やさしい味方かも?と思えるようになりました。
この記事では、そんな経験をベースに「VBAで印刷やPDF保存を自動化する方法」をまとめています。 やることは毎日同じでも、やり方は変えられる!
「印刷のたびに心をすり減らしてるかも…」と感じている方に届きますように!
はじめに|VBAで印刷やPDF化するメリットとは?
Excel作業をしていて「今日もまたこの帳票をPDF化して、保存して、メール添付して…」 気づけば印刷オペレーター兼PDF職人になっていた——
そんな瞬間ってありませんか?
私自身、毎日まるでルーティンゲームのように同じ操作を繰り返しているうちに、ふと思いました。
「これ、もしかして全部…VBAにお願いできるのでは?」
そして、ちょっとずつVBAに仕事を渡し始めた結果、
- 印刷範囲がズレる問題ともおさらば!
- PDF保存ミスや名前の付け間違いもゼロに!
- 印刷完了後に「送信済みです」と自分で言いたくなるような達成感!
VBAは、ただのコードではなく、私にとっては心の平穏を守ってくれる業務の味方です。
印刷やPDF処理って、こんなに“あるある”が多い!
たとえば──
悩みあるある | VBAでの解決法 |
---|---|
印刷したら用紙が切れてる… | PageSetup で印刷範囲&用紙サイズ調整 |
毎回手動でPDFに保存… | ExportAsFixedFormat で自動PDF出力 |
保存先の指定を毎回やり直す | パス&ファイル名をコードで一括指定 |
送信するまでが面倒くさい | 保存→メール添付→送信 まで自動化可能! |
なぜ「VBAで印刷制御」を覚えるとラクになるの?
- 印刷設定をコードにしておけば、毎回同じ結果が出せる(再現性◎)
- “作業のゆらぎ”や“ヒューマンエラー”をなくせる
- 紙・PDF・保存・送信…すべてが“ひとつのボタン”で完了することも!
つまり、VBAで印刷やPDF保存を自動化することは、作業ストレスの根っこを絶つことにもつながるんです✨
この記事では、そんな「印刷まわりのルーティン業務」をVBAでやさしく・確実に効率化する方法をまとめました!
第2章からは、いよいよ実際のコードと一緒に、
- 印刷の基本
- 範囲の指定
- PDF化&保存処理
といった内容をステップごとに解説していきます!
まずは印刷の基本をおさえよう!|PrintOutの書き方
VBAで印刷を制御する際に使う最も基本的なメソッドは、ズバリ PrintOut。
たった1行で印刷ができちゃう、とてもパワフルなコマンドです。
① 基本の書き方はこれ!
Sheet1.PrintOut
はい、これだけです(笑)
このコードは、Sheet1 をデフォルトプリンターで1部印刷してくれます。
シンプルだけど注意点:
- 対象のシートを間違えると、意図しない内容を印刷する恐れがある
- 複数部印刷やページ指定が必要なら、オプション設定も検討しましょう!
② より細かく制御したいときの構文は?
PrintOut にはいくつもの引数(オプション)が用意されており、自分好みにカスタマイズできます。
Sheet1.PrintOut _
From:=1, To:=2, _
Copies:=3, _
Collate:=True, _
IgnorePrintAreas:=False
引数名 | 意味 | よく使う? |
---|---|---|
From / To | 印刷する開始ページ・終了ページ | ◎ |
Copies | 印刷部数(例:3部) | ◎ |
Collate | 印刷時にページ順をまとめる(丁合) | ◯ |
IgnorePrintAreas | 印刷範囲の指定を無視するかどうか | △ |
ポイント:「印刷範囲を指定済みなら IgnorePrintAreas:=False にするとそのまま使える」など、紙の節約にもなる設定です!
③ どのシートを印刷するのか?指定ミスに注意!
- ActiveSheet.PrintOut → アクティブなシートを印刷
- Worksheets(“請求書”).PrintOut → 名前を指定して印刷
- Sheets(Array(“Sheet1”, “Sheet2”)).PrintOut → 複数シートをまとめて印刷
おすすめは、シート名などで明示的に指定すること!
「気づいたら違うシートを印刷してた…」を防げます。
おまけ:印刷プレビューを表示するには?
印刷前に「ちゃんと印刷されそうか確認したい…」という方に。
Sheet1.PrintPreview
この1行で印刷プレビューが表示されます!安心して「本当にこの状態で出して大丈夫?」をチェックできます。
印刷そのものはできるようになったけど、 「表が途中で切れてる!」「余白が広すぎる!」「横向きで印刷したかったのに!」などの“印刷あるある”はまだまだ解決すべき課題です。
次章では、PageSetupを活用して印刷範囲やページ設定を思い通りにカスタマイズする方法を紹介していきます。
ここが重要!印刷範囲・レイアウトの指定方法
印刷してみたら、
「列が切れて2ページ目に続いてる…」
「印刷範囲が広すぎて真っ白の紙が出てきた…」
そんな“VBAあるある印刷事故”に心当たりはありませんか?
実は、きれいに印刷するには「レイアウト設定」が超重要ポイントなんです!
この章では、PageSetup プロパティを使って、印刷範囲・用紙サイズ・レイアウト調整などを自動化する方法をご紹介します。
① 印刷範囲の指定:見せたいとこだけをしっかり印刷!
印刷範囲を事前にシートに設定しておくのもアリですが、VBAで動的に指定することで、対象データが変わっても安心です。
With Worksheets("売上表").PageSetup
.PrintArea = "A1:G30"
End With
このコードで「A1~G30」が印刷範囲になります。
可変データに対応したいときは、変数で範囲を組み立てるのもおすすめ!
② ページ余白・向き・サイズを整えて読みやすさUP!
With Worksheets("売上表").PageSetup
.Orientation = xlLandscape ' 横向き
.PaperSize = xlPaperA4 ' A4用紙
.LeftMargin = Application.InchesToPoints(0.5)
.RightMargin = Application.InchesToPoints(0.5)
.TopMargin = Application.InchesToPoints(0.7)
.BottomMargin = Application.InchesToPoints(0.7)
End With
- .Orientation → xlPortrait(縦) / xlLandscape(横)
- .PaperSize → xlPaperA4 / xlPaperLetter など
InchesToPoints関数を使えば、「0.5インチの余白」など物理サイズで直感的に指定できます!
③ ページの拡大縮小で「1ページに収める」
表がほんの少しだけ2ページ目にはみ出す…。
そんなときは「縮小印刷で1ページに収める」のが便利!
With Worksheets("売上表").PageSetup
.Zoom = False ' 拡大率は使わず、FitToPage優先
.FitToPagesWide = 1 ' 横1ページに収める
.FitToPagesTall = False ' 縦は自動
End With
Zoom = False にすることで、「1ページに収めたい」優先になります。
実務でありがちな「ちょっとだけはみ出す!」もこれで解決。
④ ヘッダー・フッターで情報を加える
印刷物に日付やシート名・ページ番号を自動挿入したいときはこちら
With Worksheets("売上表").PageSetup
.CenterHeader = "&D" ' 日付(Date)
.RightFooter = "Page &P of &N" ' ページ番号
.LeftFooter = "&A" ' シート名
End With
- &D → 日付
- &P → 現在のページ
- &N → 総ページ数
- &A → シート名
ヘッダー・フッターに設定すると、帳票や提出資料の“きちんと感”がアップします!
まとめ:レイアウト制御こそ「見た目の安心」をつくる!
ただ印刷できるだけじゃなく、「見てわかりやすい」「読みやすい」印刷結果をつくることで、
- 印刷後の修正が減る
- 上司やお客さんに出すときも安心
- なにより自分が誇れる仕上がりに!
ここまで設定できたら、そのきれいなレイアウトのままPDF化して保存したくなりませんか?
次章では、印刷設定と組み合わせて使える ExportAsFixedFormat の基本と応用をわかりやすく解説していきます!
PDFに変換して保存する方法|ExportAsFixedFormat
印刷設定が整ったら、
「このレイアウトのままPDFにして保存したい!」
「でも…わざわざPDFプリンタを手動で選ぶのは正直めんどくさい…」 そんな気持ちになること、ありませんか?
実は、VBAでは ExportAsFixedFormat メソッドを使えば、“シートの状態をそのままPDF化”して保存する処理がたった1行で実現できるんです!
① ExportAsFixedFormatの基本構文
Worksheets("売上表").ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\保存先\売上表.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False
引数 | 意味 |
---|---|
Type | xlTypePDF または xlTypeXPS(PDFがほとんど) |
Filename | 出力ファイルのフルパス |
Quality | 標準 or 最小ファイルサイズ |
IncludeDocProperties | プロパティ情報を含めるか(タイトルや作成者など) |
IgnorePrintAreas | 印刷範囲を無視して全体出力するか(通常はFalse推奨) |
② 保存フォルダ・ファイル名を変数で管理する例
Dim folderPath As String
Dim fileName As String
folderPath = "C:\PDF出力\"
fileName = "請求書_" & Format(Date, "yyyymmdd") & ".pdf"
If Dir(folderPath, vbDirectory) = "" Then MkDir folderPath
Worksheets("請求書").ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=folderPath & fileName
このようにすれば、保存先がなければ作成→今日の日付入りファイル名でPDF保存という一連の流れが完成します。
③ 複数シートのPDF化や、全ブック一括出力も可能!
Worksheets(Array("表紙", "明細")).Select
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\PDF出力\レポート一式.pdf"
複数シートを選択してから実行すれば、1つのPDFにまとめて出力もできます!
④ よくある落とし穴とその対策
現象 | 原因 & 対策 |
---|---|
保存できずにエラーになる | 保存先フォルダが存在しない → MkDirで事前作成 |
ファイルが上書きされてしまう | 同名ファイルが存在 → 上書き確認のMsgBoxを追加 |
印刷範囲が反映されない | IgnorePrintAreasがTrueになっている可能性あり |
ファイル名に使えない文字がある | / \ : * ? " < > は使えない → 変換・除去する |
実務向けサンプルの流れをまとめると…
- 保存先フォルダの存在チェック&作成
- ファイル名の自動生成(例:日付入り)
- ExportAsFixedFormatでPDF出力
- 保存完了メッセージ or メール添付につなげる(次章)
この一連の流れを覚えれば、「毎日同じ帳票をPDFにする」仕事が魔法のようにラクになりますよ。
PDFにできたら、次は“送信まで自動でやってくれたら最高!”という気持ちが芽生えませんか?
次章では、PDF保存のあとにOutlookで添付→メール送信する手順や、ログ出力なども含めて、保存処理の“あとひと押し”を自動化する方法を紹介していきます!
保存後にメール添付やログ記録もできる!(応用編)
PDFへの変換ができたら、次のステップは自然とこうなります:
「…で、そのファイル、誰に送るんだっけ?」
「あれ?この処理、やったの昨日?一昨日?」
印刷や保存が終わっても、報告や記録まで手動でやるのって、ちょっともったいない。
ここでは、保存後フローをまるごと自動化できる“仕上げのひと手間”をご紹介します!
① Outlookと連携してPDFをメール添付で送信!
Sub SendMailWithAttachment()
Dim outlookApp As Object
Dim mailItem As Object
Dim pdfPath As String
pdfPath = "C:\PDF出力\請求書_20250701.pdf"
Set outlookApp = CreateObject("Outlook.Application")
Set mailItem = outlookApp.CreateItem(0)
With mailItem
.To = "client@example.com" ' ← 宛先は必要に応じて可変に
.Subject = "請求書のご送付(自動送信)"
.Body = "お世話になっております。請求書をPDFにて送付いたします。"
.Attachments.Add pdfPath
.Send
End With
Set mailItem = Nothing
Set outlookApp = Nothing
End Sub
メール送信も自動化すれば、「PDFにして保存→送信まで1クリック」が実現します!
Outlookが開かれていないと実行できない点にだけ注意してくださいね。
② 保存処理のログをワークシートに記録!
Sub WriteLogToSheet()
Dim logSheet As Worksheet
Dim lastRow As Long
Set logSheet = ThisWorkbook.Sheets("ログ") ' ←「ログ」シートを作っておく!
lastRow = logSheet.Cells(logSheet.Rows.Count, 1).End(xlUp).Row + 1
logSheet.Cells(lastRow, 1).Value = Now
logSheet.Cells(lastRow, 2).Value = "請求書を送信しました"
logSheet.Cells(lastRow, 3).Value = Environ("Username")
End Sub
ユーザー名(ログイン中のアカウント)や日時を記録しておけば、「誰が・いつ・何を処理したか」の履歴が見える化できます。
③ 保存も送信も終わったら、ひとことメッセージで安心を
MsgBox "PDF保存とメール送信が完了しました!おつかれさまでした。", vbInformation, "処理完了"
小さな対話感のあるメッセージを加えるだけで、ユーザーの安心感がグッとアップします。
応用のヒント:宛先やメール内容を動的に切り替える
宛先アドレスを「シートから読み込む」
件名や本文に請求日や担当者名を組み込む など、実務に合わせて柔軟に展開できるのがVBAの強み!
たとえば:
.Subject = "請求書(" & Format(Date, "yyyy年m月d日") & ")"
ここまで来ると、「自動でやってくれてすごくラク!」となる一方、
「でも…送信時にエラーが出たらどうするの?」 という不安も出てくるかもしれません。
次章では、印刷・PDF保存・メール送信でありがちなエラー例と、その回避法・対策方法を実務目線でご紹介します!
よくあるエラーとその解決法
せっかくマクロが完成して「印刷も保存も送信もできたぞ!」と思ったその瞬間──
なぜかうまくいかない… いきなりエラーが出て止まってしまった…
そんな“悲しいVBAあるある”を防ぐために、この章では「よくあるエラー」と「安心の対策方法」をわかりやすくご紹介します。
エラー①:保存先フォルダが存在しない(エラー76)
メッセージ例:
実行時エラー ’76’: パスが見つかりません
原因:
- 指定した保存先のフォルダが存在していない場合に発生。
対策:
If Dir(folderPath, vbDirectory) = "" Then MkDir folderPath
保存前にフォルダの存在確認&必要なら作成する処理を必ず入れておきましょう!
エラー②:ファイル名に使えない文字が含まれている(エラー5, 1004)
NG例:
fileName = "請求書:山田.pdf" '← コロン「:」でエラー
対策:記号を置き換える or 除去!
fileName = Replace(fileName, ":", "-") ' ← 全角ハイフンなどに置き換え
Windowsのファイル名で使えない文字: / \ : * ? ” < > |
エラー③:PDF出力で指定したパスが不正(エラー1004)
原因パターン:
- フォルダの末尾に\がない
- ファイル名と拡張子が結合できていない
対策:
' OK例
Filename:=folderPath & "\" & fileName
ヒント: PathSeparator を使うとOSに依存せず処理できます
Filename:=folderPath & Application.PathSeparator & fileName
エラー④:Outlook送信時に「オブジェクトが設定されていません」
メッセージ例:
実行時エラー ’91’: オブジェクト変数または With ブロック変数が設定されていません
原因:
- Outlookが起動していない、または変数が正しく設定されていない。
対策:
Set outlookApp = CreateObject("Outlook.Application")
If outlookApp Is Nothing Then
MsgBox "Outlookが起動していません", vbExclamation
Exit Sub
End If
Outlookが起動済みかを確認する処理を入れておくと安心!
補足:エラー発生時のユーザーへの伝え方も大事!
On Error GoTo エラー処理
' (処理内容)
Exit Sub
エラー処理:
MsgBox "処理中にエラーが発生しました:" & Err.Description, vbCritical
エラーが起きたときも、丁寧なメッセージがあるだけで“落ち着いて対処できる”ようになります。
ここまでのステップで、印刷 → PDF化 → メール送信までの“自動化マクロ”がかなり実践的なレベルに育ちました!
まとめ
ここまで長い記事を読んでいただき、本当にありがとうございました!
毎日のようにExcelで帳票を出力し、印刷設定に悩み、保存ミスに泣き、送信の手間に追われていた“過去の私”に向けて書いたこのVBAマクロの記事──
あなたにとっての「なんとかしたい日常」に少しでも寄り添えていたら、とても嬉しいです。
記事のおさらい
この1本で、VBAによる印刷・保存・送信まわりをまとめて扱いました。
- PrintOut の基礎と印刷制御のはじめの一歩
- ページ設定・印刷範囲のコツで「見栄えよく印刷できた!」を実現
- PDF出力を自動化して、毎日の保存作業とサヨナラ
- メール送信&ログ記録まで組み込めば、業務の“仕上げ”も完了!
- よくあるつまずきを防ぐ、やさしいエラー対策まとめ
VBAでここまでできるんだ!と思ってもらえたら、大成功です
この記事が、あなたの「手間を減らして気持ちに余裕を持ちたい」という願いをそっと後押しできていたなら嬉しいです。

最初はたぶん、「印刷?PDF化?なんかややこしそう…」 「こんな自動化、自分には難しいかも」そんな風に感じた方もいらっしゃるかもしれません。 でも、やってみたら意外とシンプル。大事なのは「決まりきった手間に自分の時間を取られないようにする工夫」だと思っています。
そしてなにより、ちょっとずつ「これ自動化できた!」という小さな達成が積み上がると、 “あ、自分でもこういうの作れるんだ”という自信につながっていきます!
コメント