こんにちは、SkillStack Lab運営者のスタックです。
※本記事には広告・アフィリエイトリンクが含まれています。
Excelで請求書や報告書を印刷するたびに、印刷範囲やプリンター設定を確認し、同じ操作を繰り返していませんか。
結論から言うと、フォームコントロールまたは図形へVBAマクロを登録すれば、印刷プレビュー、印刷範囲の更新、PDF保存などをボタン1つで実行できます。
ただし、最初からプリンターへ直接出力するコードを使うのはおすすめしません。
印刷範囲や用紙設定を間違えても確認できるよう、まずは印刷プレビューを表示するボタンから作りましょう。
この記事では、印刷ボタンの作り方、ボタン自体を紙やPDFへ出さない設定、反応しない場合の確認項目、印刷範囲の自動調整、PDF保存まで、実務で使いやすい形に整理して解説します。

掲載コードはサンプルです。必ず元ファイルを残し、コピーしたファイルでテストしてください。会社の端末でマクロが制限されている場合は、セキュリティ設定を独断で変更せず、情報システム担当者へ確認しましょう。
- フォームコントロールや図形で印刷ボタンを作る手順
- 安全に印刷プレビューを表示するVBAコード
- 印刷範囲をデータ件数に合わせて変更する方法
- 請求書や報告書をPDF保存するVBAコード
- 印刷ボタン自体を紙やPDFへ出さない設定
- 印刷ボタンが反応しないときの確認項目
エクセルマクロで印刷ボタンを作る最短手順
最初は、指定した「請求書」シートの印刷プレビューを表示するだけのシンプルなボタンを作ります。
次のコードをVBAの標準モジュールへ貼り付けてください。
Option Explicit
Public Sub ShowPrintPreview()
Dim ws As Worksheet
On Error GoTo ErrorHandler
Set ws = ThisWorkbook.Worksheets("請求書")
ws.PrintOut _
Copies:=1, _
Preview:=True, _
Collate:=True
Exit Sub
ErrorHandler:
MsgBox "印刷プレビューを表示できませんでした。" & vbCrLf & _
"シート名や印刷設定を確認してください。" & vbCrLf & _
Err.Description, vbExclamation
End Sub
自分のブックでシート名が異なる場合は、コード内の「請求書」を実際のシート名へ変更します。
Preview:=Trueにしているため、マクロを実行してもすぐプリンターへ送信されず、先に印刷プレビューが表示されます。
まずはこの状態で、印刷範囲、用紙サイズ、縦横の向き、余白、改ページが正しいか確認しましょう。
- Excelファイルを.xlsmで保存する
VBAを保持できるExcelマクロ有効ブック形式を選びます。 - 開発タブを表示する
マクロやフォームコントロールを操作できる状態にします。 - 標準モジュールへコードを貼る
VBEを開き、「挿入」から「標準モジュール」を追加します。 - シートへボタンを置く
フォームコントロールまたは図形を配置します。 - ShowPrintPreviewを登録する
ボタンを右クリックし「マクロの登録」から選択します。 - 印刷プレビューで確認する
問題がなければ実際の印刷やPDF保存へ進みます。
Excel for the webではVBAマクロを作成・編集・実行できません。今回のVBA印刷ボタンは、対応するデスクトップ版Excelで使用してください。
開発タブを表示してマクロを準備する
Excelの初期状態では、マクロやフォームコントロールを扱う「開発」タブが表示されていない場合があります。
Windows版Excelでは、次の手順で表示できます。
- 「ファイル」をクリックする
- 「オプション」を開く
- 「リボンのユーザー設定」を選ぶ
- 右側の「メインタブ」にある「開発」へチェックを入れる
- 「OK」を押す

Mac版では「Excel」から「環境設定」または「設定」を開き、リボンとツールバーの設定から「開発」を表示します。
VBAコードを保存するファイル形式は、通常のExcelブック(.xlsx)ではなく、Excelマクロ有効ブック(.xlsm)を選んでください。
印刷ボタンはフォームコントロールと図形のどちらを使うか
印刷マクロを実行するだけなら、基本的にはフォームコントロールまたは図形のどちらかを選べば十分です。
| 種類 | 特徴 | 向いている用途 |
|---|---|---|
| フォームコントロール | マクロの登録が簡単 | 初心者・社内帳票 |
| 図形 | 色・形・文字を自由に変更しやすい | 操作が分かりやすい画面を作る |

新しく印刷ボタンを作るためにActiveXを選ぶ必要はありません。
Microsoft 365とOffice 2024ではActiveXコントロールが既定で無効になっており、MacやWeb版Excelにも対応していません。単純な印刷ボタンならフォームコントロールまたは図形を優先しましょう。
フォームコントロールで印刷ボタンを作る
初めて印刷ボタンを作るなら、フォームコントロールが分かりやすい方法です。
- 「開発」タブを開く
- 「挿入」をクリックする
- フォームコントロールの「ボタン」を選ぶ
- シート上をドラッグして配置する
- 「マクロの登録」で
ShowPrintPreviewを選ぶ - ボタン名を「印刷プレビュー」などへ変更する
ボタンを配置した直後に「マクロの登録」が表示されなかった場合は、ボタンを右クリックして「マクロの登録」を選びます。
図形を印刷ボタンとして使う
利用者が操作を間違えにくい画面を作りたい場合は、四角形などの図形をボタンとして使う方法もあります。
- 「挿入」タブから「図形」を選ぶ
- 角丸四角形などをシートへ配置する
- 図形へ「印刷プレビュー」などの文字を入力する
- 図形を右クリックする
- 「マクロの登録」を選ぶ
ShowPrintPreviewを指定する
「印刷プレビュー」「PDF保存」のように処理ごとにボタン名を分けると、利用者も何が起こるか判断しやすくなります。
Microsoft公式でも、フォームコントロールのボタンへマクロを割り当てる方法が案内されています。
Microsoftサポート「フォームまたはコントロールボタンへマクロを割り当てる」
印刷ボタン自体を紙やPDFへ印刷しない設定
シート上に配置したボタンは、設定によっては請求書や報告書と一緒に印刷されます。
印刷物へ「印刷プレビュー」や「PDF保存」という操作ボタンを出したくない場合は、ボタンの印刷設定を解除しておきましょう。
- フォームコントロールまたは図形を右クリックする
- 「コントロールの書式設定」または「図形の書式設定」を開く
- 「プロパティ」などの項目を確認する
- 「オブジェクトを印刷する」の設定を解除する
- 印刷プレビューを表示する
- ボタンが印刷範囲へ出ていないことを確認する

Excelのバージョンやオブジェクトの種類によって設定画面の名称や位置が異なる場合があります。設定後は、必ず印刷プレビューまたはテストPDFでボタンが出力されないことを確認してください。
印刷ボタンが反応しないときの確認項目
ボタンを押しても何も起きない場合は、コードを何度も書き換える前に、保存形式やマクロの登録状態を確認しましょう。
| 確認項目 | 対処 |
|---|---|
| 再度開いたらマクロが残っていない | .xlsm形式で保存されているか確認する |
| マクロが登録されていない | ボタンを右クリックして「マクロの登録」を確認する |
| マクロが一覧へ出ない | 引数のないPublic Subを標準モジュールへ置く |
| シート名が違う | コード内のシート名と実際の名前を一致させる |
| Excel for the webを使っている | 対応するデスクトップ版Excelで開く |
| マクロがブロックされている | 出所と会社のセキュリティポリシーを確認する |
| 印刷設定でエラーになる | プリンター、用紙、印刷範囲を確認する |
フォームコントロールや図形へ登録しやすいマクロは、次のような形式です。
Public Sub ShowPrintPreview()
' 印刷処理
End Sub
標準モジュールへ置いた、引数のないPublic Subであれば、ボタンへ登録するマクロとして扱いやすくなります。
コードをコピーするだけでなく、変数やエラー処理まで基礎から学びたい方は、UdemyのVBAおすすめ講座を比較した記事も参考にしてください。
マクロがブロックされたときは安易に解除しない
インターネットやメールなどから入手したOfficeファイルでは、VBAマクロがブロックされる場合があります。
これは、マクロを利用したマルウェアなどから利用者を守るためのセキュリティ対策です。
警告が表示されたからといって、すぐにマクロを有効化してはいけません。
- 誰が作成したファイルか確認できる
- 入手経路が分かっている
- コードの処理内容を確認できる
- 会社のマクロ利用ルールに反していない
- 本番ファイルではなくコピーで試せる
会社管理のパソコンでマクロが無効化されている場合は、利用者自身がセキュリティ設定を弱めるのではなく、情報システム担当者へ確認してください。
共有フォルダー全体やダウンロードフォルダーなどを、安易に「信頼できる場所」へ登録するのは避けましょう。信頼できる場所ではセキュリティ確認の一部が省略されるため、組織では管理者による設定や配布ルールを優先してください。
Microsoft Learn「インターネットからのマクロが既定でブロックされる仕組み」

印刷プレビューを表示するVBAコード
印刷マクロで最初に作りたいのが、冒頭でも紹介した印刷プレビューです。
次のコードでは、選択中のシートではなく「請求書」シートを指定してプレビューします。
Option Explicit
Public Sub ShowPrintPreview()
Dim ws As Worksheet
On Error GoTo ErrorHandler
Set ws = ThisWorkbook.Worksheets("請求書")
ws.PrintOut _
Copies:=1, _
Preview:=True, _
Collate:=True
Exit Sub
ErrorHandler:
MsgBox "印刷プレビューを表示できませんでした。" & vbCrLf & _
Err.Description, vbExclamation
End Sub

十分にテストし、利用者自身が直接印刷する必要がある場合はPreview:=Falseへ変更できます。
ただし、直接印刷ではプレビューによる確認工程がなくなります。
請求書、見積書、契約関係の帳票など、誤出力の影響が大きい書類では、プレビューを残す運用も検討してください。
データ件数に合わせて印刷範囲を自動調整する
請求明細や報告書の行数が毎回変わる場合、固定した印刷範囲ではデータが途中で切れたり、不要な空白ページが増えたりすることがあります。
次のコードでは、A列を基準に最終行を取得し、A1からF列の最終行までを印刷範囲として設定してからプレビューします。

Option Explicit
Public Sub SetPrintAreaAndPreview()
Dim ws As Worksheet
Dim lastRow As Long
On Error GoTo ErrorHandler
Set ws = ThisWorkbook.Worksheets("請求書")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
If lastRow < 2 Then
MsgBox "印刷する明細データがありません。", vbExclamation
Exit Sub
End If
ws.PageSetup.PrintArea = _
ws.Range("A1:F" & lastRow).Address
ws.PrintOut Preview:=True
Exit Sub
ErrorHandler:
MsgBox "印刷範囲を設定できませんでした。" & vbCrLf & _
Err.Description, vbExclamation
End Sub
このコードを自分の帳票へ合わせるときは、次の項目を確認してください。
- 最終行を判定する列がA列でよいか
- 印刷対象の最終列がF列でよいか
- 1行目が帳票の開始位置でよいか
- 必ず値が入る列で最終行を判定しているか
- 数式で空文字を返すセルが判定へ影響しないか
- 印刷タイトルや改ページが正しく設定されているか
A列に空白が入る可能性がある場合は、伝票番号や商品コードなど、明細が存在するときに必ず値が入る列へ変更してください。
帳票をPDF保存するVBAコード
印刷だけでなく、請求書や報告書を毎回PDFとして保存している場合もVBAで自動化できます。
次のサンプルでは、Excelファイルと同じ場所に「PDF」フォルダーを作成し、A1の顧客名と保存日時を使ってPDFを保存します。
Option Explicit
Public Sub ExportInvoiceToPDF()
Dim ws As Worksheet
Dim outputFolder As String
Dim outputFile As String
Dim customerName As String
On Error GoTo ErrorHandler
Set ws = ThisWorkbook.Worksheets("請求書")
If Len(ThisWorkbook.Path) = 0 Then
MsgBox "先にExcelファイルを保存してください。", vbExclamation
Exit Sub
End If
If InStr(1, ThisWorkbook.Path, "://", vbTextCompare) > 0 Then
MsgBox "このサンプルはローカルまたは同期済みフォルダーへの保存を前提としています。" & vbCrLf & _
"保存先を自社環境に合わせて変更してください。", vbExclamation
Exit Sub
End If
customerName = Trim$(CStr(ws.Range("A1").Value))
If Len(customerName) = 0 Then
MsgBox "A1に顧客名を入力してください。", vbExclamation
Exit Sub
End If
outputFolder = _
ThisWorkbook.Path & _
Application.PathSeparator & _
"PDF"
If Dir(outputFolder, vbDirectory) = vbNullString Then
MkDir outputFolder
End If
outputFile = _
outputFolder & _
Application.PathSeparator & _
CreateSafeFileName(customerName) & _
"_請求書_" & _
Format(Now, "yyyymmdd_hhnnss") & _
".pdf"
ws.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=outputFile, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
MsgBox "PDFを保存しました。" & vbCrLf & _
outputFile, vbInformation
Exit Sub
ErrorHandler:
MsgBox "PDFを保存できませんでした。" & vbCrLf & _
Err.Description, vbExclamation
End Sub
Private Function CreateSafeFileName(ByVal sourceName As String) As String
Dim invalidCharacters As Variant
Dim targetCharacter As Variant
invalidCharacters = _
Array("\", "/", ":", "*", "?", """", "<", ">", "|")
For Each targetCharacter In invalidCharacters
sourceName = _
Replace(sourceName, CStr(targetCharacter), "_")
Next targetCharacter
sourceName = Trim$(sourceName)
Do While Len(sourceName) > 0 _
And (Right$(sourceName, 1) = "." _
Or Right$(sourceName, 1) = " ")
sourceName = _
Left$(sourceName, Len(sourceName) - 1)
Loop
If Len(sourceName) = 0 Then
sourceName = "請求書"
End If
CreateSafeFileName = sourceName
End Function
実際に使用する場合は、A1が顧客名のセルなのか、自社の帳票に合わせて変更してください。
また、PDF保存前には次の項目も確認しましょう。
- 宛名や請求金額が正しい
- 印刷範囲が正しい
- 複数ページに意図せず分割されていない
- 保存先フォルダーの権限が適切
- 同名ファイルの扱いが運用ルールと合っている
- 個人情報を含むPDFの共有方法が決まっている
このサンプルはローカルまたは同期済みフォルダーを前提にしています。
SharePointやOneDriveをWeb上のURLとして直接扱う環境では、保存先の指定方法を自社環境に合わせて設計してください。
複数シートを一括印刷したい場合は別記事で確認する
ここまでのコードは、請求書や報告書など1つの帳票をボタンから印刷・PDF保存する用途を想定しています。
一方、ブック内にある複数シートから印刷対象を選び、まとめて出力したい場合は、処理の考え方が変わります。
- 印刷対象となるシートを選択する
- 存在しないシート名を検出する
- 空白シートを除外する
- 印刷前に対象件数を確認する
- 途中でエラーが出ても後続処理を止めない
複数シートをまとめて印刷する場合は、Excelの一括印刷をマクロボタンで自動化する方法で、印刷対象を選ぶ仕組みから確認してください。
印刷マクロを使い続けるか別の方法へ移行するか
Excel内の帳票を印刷したりPDF保存したりする程度なら、VBAは現在も選択肢になります。
一方、印刷ボタンへ機能を追加し続け、請求書の発行、承認、メール送信、入金管理まで1つのExcelで管理し始めると、保守範囲は大きくなります。
| 業務の状態 | 候補 | 判断 |
|---|---|---|
| 自分や少人数が帳票を印刷する | VBA | 今回の印刷ボタンで対応しやすい |
| 決まった帳票をPDF保存する | VBA | 保存先とファイル名を標準化しやすい |
| 複数シートをまとめて印刷する | VBA | 一括印刷用の処理を別途設計する |
| CSVの取得・整形が中心 | Power Query | 印刷処理よりデータ処理を優先する |
| メールや複数アプリまで操作する | Power Automateなど | Excel外まで処理範囲を広げられる |
| 複数人で請求・承認・履歴を管理する | SaaS | 権限や履歴を標準化しやすい |
スタック印刷ボタンを作る目的は、クリック数を減らすことだけではありません。誰が操作しても同じ印刷範囲・同じ確認手順になる状態を作ることが、管理部門では重要だと考えています。
作成者しかコードを直せず、マクロが止まると請求や顧客対応まで止まる状態になったら、さらにVBAを追加する前に保守方法を見直しましょう。
VBAを残す業務と別の手段へ移行する業務の判断は、VBAはやめとけと言われる理由と代替手段で整理しています。
エクセルのマクロ印刷ボタンに関するよくある質問
まとめ|印刷ボタンはプレビューと確認手順まで設計する


Excelの印刷ボタンは、フォームコントロールまたは図形へVBAマクロを登録することで作成できます。
- 最初は直接印刷せず、印刷プレビューを表示する
- フォームコントロールまたは図形を使う
- 対象シートをThisWorkbook.Worksheetsで明示する
- 印刷ボタン自体は出力対象から外す
- 印刷範囲の最終行を適切な列で判定する
- PDFの保存先とファイル名を確認する
- マクロは.xlsm形式で保存する
- 重要業務では作成者以外も復旧できる状態にする
ボタンを1回押せば終わることだけでなく、誰が操作しても同じ結果になる仕組みにすることが、実務で印刷マクロを使うポイントです。
今回のコードを自分の帳票に合わせて修正したり、PDF保存や複数処理へ応用したりしたい場合は、VBAの変数、条件分岐、オブジェクト、エラー処理まで一度体系的に理解すると応用しやすくなります。
VBA以外も含めて自動化方法を比較したい場合は、Excel自動化7選も参考にしてください。
\ 印刷マクロを自分で応用したい人向け /








