エクセルマクロで印刷ボタンを作る方法|PDF保存・印刷しない設定も解説

エクセルマクロで印刷ボタンを作成し、設定からPDF出力までを完全解説する記事のメインビジュアル。

こんにちは、SkillStack Lab運営者のスタックです。

※本記事には広告・アフィリエイトリンクが含まれています。

Excelで請求書や報告書を印刷するたびに、印刷範囲やプリンター設定を確認し、同じ操作を繰り返していませんか。

結論から言うと、フォームコントロールまたは図形へVBAマクロを登録すれば、印刷プレビュー、印刷範囲の更新、PDF保存などをボタン1つで実行できます。

ただし、最初からプリンターへ直接出力するコードを使うのはおすすめしません。

印刷範囲や用紙設定を間違えても確認できるよう、まずは印刷プレビューを表示するボタンから作りましょう。

この記事では、印刷ボタンの作り方、ボタン自体を紙やPDFへ出さない設定、反応しない場合の確認項目、印刷範囲の自動調整、PDF保存まで、実務で使いやすい形に整理して解説します。

Excelの印刷ボタンで印刷操作の時短、ミス防止、手順統一を行うメリット

掲載コードはサンプルです。必ず元ファイルを残し、コピーしたファイルでテストしてください。会社の端末でマクロが制限されている場合は、セキュリティ設定を独断で変更せず、情報システム担当者へ確認しましょう。

この記事で分かること
  • フォームコントロールや図形で印刷ボタンを作る手順
  • 安全に印刷プレビューを表示する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にしているため、マクロを実行してもすぐプリンターへ送信されず、先に印刷プレビューが表示されます。

まずはこの状態で、印刷範囲、用紙サイズ、縦横の向き、余白、改ページが正しいか確認しましょう。

  1. Excelファイルを.xlsmで保存する
    VBAを保持できるExcelマクロ有効ブック形式を選びます。
  2. 開発タブを表示する
    マクロやフォームコントロールを操作できる状態にします。
  3. 標準モジュールへコードを貼る
    VBEを開き、「挿入」から「標準モジュール」を追加します。
  4. シートへボタンを置く
    フォームコントロールまたは図形を配置します。
  5. ShowPrintPreviewを登録する
    ボタンを右クリックし「マクロの登録」から選択します。
  6. 印刷プレビューで確認する
    問題がなければ実際の印刷やPDF保存へ進みます。

Excel for the webではVBAマクロを作成・編集・実行できません。今回のVBA印刷ボタンは、対応するデスクトップ版Excelで使用してください。

開発タブを表示してマクロを準備する

Excelの初期状態では、マクロやフォームコントロールを扱う「開発」タブが表示されていない場合があります。

Windows版Excelでは、次の手順で表示できます。

  1. 「ファイル」をクリックする
  2. 「オプション」を開く
  3. 「リボンのユーザー設定」を選ぶ
  4. 右側の「メインタブ」にある「開発」へチェックを入れる
  5. 「OK」を押す
Excelのリボン設定で開発タブを表示する手順

Mac版では「Excel」から「環境設定」または「設定」を開き、リボンとツールバーの設定から「開発」を表示します。

VBAコードを保存するファイル形式は、通常のExcelブック(.xlsx)ではなく、Excelマクロ有効ブック(.xlsm)を選んでください。

印刷ボタンはフォームコントロールと図形のどちらを使うか

印刷マクロを実行するだけなら、基本的にはフォームコントロールまたは図形のどちらかを選べば十分です。

種類特徴向いている用途
フォームコントロールマクロの登録が簡単初心者・社内帳票
図形色・形・文字を自由に変更しやすい操作が分かりやすい画面を作る
Excelのフォームコントロールと図形ボタンの特徴を比較した図

新しく印刷ボタンを作るためにActiveXを選ぶ必要はありません。
Microsoft 365とOffice 2024ではActiveXコントロールが既定で無効になっており、MacやWeb版Excelにも対応していません。単純な印刷ボタンならフォームコントロールまたは図形を優先しましょう。

フォームコントロールで印刷ボタンを作る

初めて印刷ボタンを作るなら、フォームコントロールが分かりやすい方法です。

  1. 「開発」タブを開く
  2. 「挿入」をクリックする
  3. フォームコントロールの「ボタン」を選ぶ
  4. シート上をドラッグして配置する
  5. 「マクロの登録」でShowPrintPreviewを選ぶ
  6. ボタン名を「印刷プレビュー」などへ変更する

ボタンを配置した直後に「マクロの登録」が表示されなかった場合は、ボタンを右クリックして「マクロの登録」を選びます。

図形を印刷ボタンとして使う

利用者が操作を間違えにくい画面を作りたい場合は、四角形などの図形をボタンとして使う方法もあります。

  1. 「挿入」タブから「図形」を選ぶ
  2. 角丸四角形などをシートへ配置する
  3. 図形へ「印刷プレビュー」などの文字を入力する
  4. 図形を右クリックする
  5. 「マクロの登録」を選ぶ
  6. ShowPrintPreviewを指定する

「印刷プレビュー」「PDF保存」のように処理ごとにボタン名を分けると、利用者も何が起こるか判断しやすくなります。

Microsoft公式でも、フォームコントロールのボタンへマクロを割り当てる方法が案内されています。

Microsoftサポート「フォームまたはコントロールボタンへマクロを割り当てる」

印刷ボタン自体を紙やPDFへ印刷しない設定

シート上に配置したボタンは、設定によっては請求書や報告書と一緒に印刷されます。

印刷物へ「印刷プレビュー」や「PDF保存」という操作ボタンを出したくない場合は、ボタンの印刷設定を解除しておきましょう。

  1. フォームコントロールまたは図形を右クリックする
  2. 「コントロールの書式設定」または「図形の書式設定」を開く
  3. 「プロパティ」などの項目を確認する
  4. 「オブジェクトを印刷する」の設定を解除する
  5. 印刷プレビューを表示する
  6. ボタンが印刷範囲へ出ていないことを確認する
Excelのオブジェクトを印刷する設定を解除する画面

Excelのバージョンやオブジェクトの種類によって設定画面の名称や位置が異なる場合があります。設定後は、必ず印刷プレビューまたはテストPDFでボタンが出力されないことを確認してください。

印刷ボタンが反応しないときの確認項目

ボタンを押しても何も起きない場合は、コードを何度も書き換える前に、保存形式やマクロの登録状態を確認しましょう。

確認項目 対処
再度開いたらマクロが残っていない .xlsm形式で保存されているか確認する
マクロが登録されていない ボタンを右クリックして「マクロの登録」を確認する
マクロが一覧へ出ない 引数のないPublic Subを標準モジュールへ置く
シート名が違う コード内のシート名と実際の名前を一致させる
Excel for the webを使っている 対応するデスクトップ版Excelで開く
マクロがブロックされている 出所と会社のセキュリティポリシーを確認する
印刷設定でエラーになる プリンター、用紙、印刷範囲を確認する

フォームコントロールや図形へ登録しやすいマクロは、次のような形式です。

Public Sub ShowPrintPreview()

    ' 印刷処理

End Sub

標準モジュールへ置いた、引数のないPublic Subであれば、ボタンへ登録するマクロとして扱いやすくなります。

コードをコピーするだけでなく、変数やエラー処理まで基礎から学びたい方は、UdemyのVBAおすすめ講座を比較した記事も参考にしてください。

マクロがブロックされたときは安易に解除しない

インターネットやメールなどから入手したOfficeファイルでは、VBAマクロがブロックされる場合があります。

これは、マクロを利用したマルウェアなどから利用者を守るためのセキュリティ対策です。

警告が表示されたからといって、すぐにマクロを有効化してはいけません。

マクロを実行する前に確認すること
  • 誰が作成したファイルか確認できる
  • 入手経路が分かっている
  • コードの処理内容を確認できる
  • 会社のマクロ利用ルールに反していない
  • 本番ファイルではなくコピーで試せる

会社管理のパソコンでマクロが無効化されている場合は、利用者自身がセキュリティ設定を弱めるのではなく、情報システム担当者へ確認してください。

共有フォルダー全体やダウンロードフォルダーなどを、安易に「信頼できる場所」へ登録するのは避けましょう。信頼できる場所ではセキュリティ確認の一部が省略されるため、組織では管理者による設定や配布ルールを優先してください。

Microsoft Learn「インターネットからのマクロが既定でブロックされる仕組み」

Excelマクロがブロックされた場合にファイルの出所とセキュリティ設定を確認する手順

印刷プレビューを表示する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
VBAのPrintOutメソッドで印刷プレビューを表示するコード

十分にテストし、利用者自身が直接印刷する必要がある場合はPreview:=Falseへ変更できます。

ただし、直接印刷ではプレビューによる確認工程がなくなります。

請求書、見積書、契約関係の帳票など、誤出力の影響が大きい書類では、プレビューを残す運用も検討してください。

データ件数に合わせて印刷範囲を自動調整する

請求明細や報告書の行数が毎回変わる場合、固定した印刷範囲ではデータが途中で切れたり、不要な空白ページが増えたりすることがあります。

次のコードでは、A列を基準に最終行を取得し、A1からF列の最終行までを印刷範囲として設定してからプレビューします。

Excel VBAで最終行を取得して印刷範囲を自動更新する仕組み
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はやめとけと言われる理由と代替手段で整理しています。

エクセルのマクロ印刷ボタンに関するよくある質問

印刷ボタンを紙やPDFに表示させないことはできますか?

できます。フォームコントロールや図形の書式設定で「オブジェクトを印刷する」の設定を解除し、印刷プレビューでボタンが出力されないことを確認してください。

フォームコントロールと図形はどちらがおすすめですか?

設定を簡単にしたいならフォームコントロール、色や文字を使って操作を分かりやすくしたいなら図形が向いています。印刷マクロを実行するだけなら、どちらでも対応できます。

ActiveXの印刷ボタンを使ってもよいですか?

既存ファイルで必要な場合を除き、新しく単純な印刷ボタンを作る目的でActiveXを選ぶ必要性は高くありません。Microsoft 365とOffice 2024ではActiveXが既定で無効になっており、MacやWeb版にも対応していないため、フォームコントロールまたは図形を優先すると管理しやすくなります。

Excel for the webでもVBAの印刷ボタンは動きますか?

Excel for the webではVBAマクロを作成・編集・実行できません。VBAを割り当てた印刷ボタンを使用する場合は、対応するデスクトップ版Excelで開いてください。

マクロが「マクロの登録」の一覧に表示されません

マクロが標準モジュールにない、Private Subになっている、引数を必要とするなどの原因が考えられます。まず、標準モジュールへ引数のないPublic Subとして作成されているか確認してください。VBAを保存して次回も使う場合は、ブックを.xlsm形式で保存します。

直接印刷と印刷プレビューのどちらがよいですか?

最初は印刷プレビューをおすすめします。印刷範囲、用紙方向、ページ数などを確認できるためです。十分にテストし、誤出力の影響が小さい業務であれば直接印刷も検討できます。

複数シートを一括印刷できますか?

できます。ただし、印刷対象の選択やエラー処理まで含めるとコードが複雑になります。複数シートをまとめて処理したい場合は、一括印刷専用の仕組みとして分けて設計する方が管理しやすくなります。

まとめ|印刷ボタンはプレビューと確認手順まで設計する

Excelの印刷ボタン作成からVBAによる業務標準化までの流れ

Excelの印刷ボタンは、フォームコントロールまたは図形へVBAマクロを登録することで作成できます。

  • 最初は直接印刷せず、印刷プレビューを表示する
  • フォームコントロールまたは図形を使う
  • 対象シートをThisWorkbook.Worksheetsで明示する
  • 印刷ボタン自体は出力対象から外す
  • 印刷範囲の最終行を適切な列で判定する
  • PDFの保存先とファイル名を確認する
  • マクロは.xlsm形式で保存する
  • 重要業務では作成者以外も復旧できる状態にする

ボタンを1回押せば終わることだけでなく、誰が操作しても同じ結果になる仕組みにすることが、実務で印刷マクロを使うポイントです。

今回のコードを自分の帳票に合わせて修正したり、PDF保存や複数処理へ応用したりしたい場合は、VBAの変数、条件分岐、オブジェクト、エラー処理まで一度体系的に理解すると応用しやすくなります。

VBA以外も含めて自動化方法を比較したい場合は、Excel自動化7選も参考にしてください。

\ 印刷マクロを自分で応用したい人向け /


次は、仕事で使えるスキルをもう一段積み上げる

SkillStack Labでは、Excel・生成AI・自動化・オンライン学習を、実務で使うことを前提に解説しています。今の課題に近いテーマから次の記事へ進んでみてください。

生成AIを仕事で使いたい

ChatGPTなどを「触ったことがある」から、実際の仕事で使えるレベルへ進みたい方へ。

生成AIの勉強方法・学習順序を見る →

Excel作業を自動化したい

関数だけでは限界を感じてきたら、Power Query・VBA・Pythonなども含めて自動化を考えます。

Excel業務を自動化する方法を見る →

体系的にスキルを学びたい

Excel・VBA・Python・生成AIなどを、動画講座で効率よく学びたい方へ。

社会人向けUdemy講座の選び方を見る →

何から始めるか迷ったら、今の仕事で最も時間がかかっている作業や、身につけたいスキルに近いテーマから選んでください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次