🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の PrintOut — シート・範囲・部数をマクロから印刷する

|

Excel VBA の PrintOut — シート・範囲・部数をマクロから印刷する

TL;DR — PrintOut はページをプリンターへ送ります。シート・範囲・シートのグループ・ブックに対して呼び、必要なものを名前付き引数で指定します。Copies、From/To、Preview、Collate です。印刷されるのは ページ設定 が定義したページなので、まずページを直しましょう。マクロを作っている間は Preview:=True で印刷します。そして、出力先が紙ではなくファイルなら、そもそも印刷しないこと — PDF に書き出し ます。

Sub PrintInvoices()
    With ThisWorkbook.Worksheets("Invoice")
        .PageSetup.PrintArea = "$A$1:$G$45"
        .PrintOut Copies:=2, Collate:=True, Preview:=False
    End With
End Sub

これは、Excel から出力を取り出すための三部作のうち、紙の側の出口にあたる記事です。 ページ設定 がページとは何かを決めます。この記事で扱う PrintOut はそのページをプリンターへ送ります。ExportAsFixedFormat は同じページを PDF ファイルへ送ります。どちらの出力も一つのページ定義から読み取るので、「印刷結果がおかしい」という問題のほとんどはページの問題であり、直すのはこの一行が走るよりも前です。

この記事で学べること

  • PrintOut が実際に何を印刷するのか、そしてページはどこから来るのか
  • 知っておくべき引数:部数、ページ範囲、プレビュー、部単位で印刷
  • シート一枚、範囲一つ、複数のシート、ブック全体を印刷する方法
  • 紙を無駄にせずにテストする方法
  • ActivePrinter でプリンターを選び、元のプリンターに戻す方法
  • 判断の分かれ目:紙なら PrintOut、ファイルなら書き出し

考え方の軸:PrintOut が印刷するのはセルではなくページ

PrintOut はあなたの表のことを知りません。知っているのは ページ です。印刷範囲・印刷の向き・拡大縮小・余白・改ページを使って、Excel がシートを切り分けた長方形のことです。PrintOut はそのページを順番にプリンターへ送ります。ですから、一列だけが 2 ページ目に取り残されたり、最後に白紙のページが出てきたりするとき、原因は印刷の呼び出しではなくページの定義にあります。

  • 列が新しいページにはみ出すのは、シートが縦向き・100% の倍率だからです。
  • 白紙のページが出てくるのは、データのはるか下にある書式付きのセルが 使用範囲 を引き伸ばしているからです。
  • レポートの半分が欠けているのは、古い印刷範囲がまだ設定されているからです。

この役割分担を頭に置いておけば、あとは簡単です。ページ設定 がページの形を作り、 PrintOut がそれを届けます。

押さえるべき PrintOut の引数

PrintOut は最大九つの引数を取ります。実際に使うのは次のものです。

引数 役割
From、To 印刷する最初と最後のページ。省略するとすべてのページ。
Copies 部数。
Collate True で一部ずつ順番に印刷します(1-2-3、1-2-3)。
Preview True で、すぐに印刷せずまず印刷プレビューを開きます。
ActivePrinter このジョブで使うプリンター。
IgnorePrintAreas True で印刷範囲を無視し、シート全体を印刷します。

必ず名前付き引数で書きましょう。.PrintOut 1, 2, 3 はコンパイルが通りますが、どの数字が部数なのか誰にもわかりません。

シート一枚、範囲一つ、複数のシート、ブック全体

どのオブジェクトに対して PrintOut を呼ぶかで、印刷する範囲が決まります。

Worksheets("Report").PrintOut                       ' シート一枚
Worksheets("Report").Range("A1:F30").PrintOut       ' 範囲一つ(印刷範囲は無視)
Worksheets(Array("North", "South")).PrintOut        ' 複数のシートを一つのジョブで
ThisWorkbook.PrintOut                               ' 表示されているすべてのシート

複数のシートを一つのジョブとして印刷することは、ページ番号と両面印刷のプリンターにとって意味があります。シートは一つの文書として出てきて、フッターで &P を使っていれば、ページ番号がシートをまたいで続きます。シートを一枚ずつ別々に印刷するなら、For Each でループし、ループの中で PrintOut を呼びます。

紙を無駄にせずにテストする

開発中の印刷マクロは、紙のシュレッダーのようなものです。二つの習慣でそれを止められます。

Worksheets("Report").PrintOut Preview:=True    ' プレビューを表示し、印刷するかはユーザーが決める
Worksheets("Report").PrintPreview              ' プレビューのみ。それ自体は決して印刷しない

Preview:=True は、マクロが完成したときに切り替えるスイッチです。コードはそのままで、変えるのはその引数だけです。さらによいのは、作業中は PDF に書き出してレイアウトを確かめることです — PrintOut が送るはずのページがそのまま見えて、費用は一切かかりません。

プリンターを選び、元のプリンターに戻す

Application.ActivePrinter は Excel が使うプリンターです。設定することはできますが、名前は Windows が割り当てたポートまで含めて完全に一致しなければなりません — たとえば "Label Printer on Ne02:" のような形で、このポートはパソコンごとに異なることがあります。しかも設定すると、ユーザーがそのあと印刷するすべてのもののプリンターも変わってしまいます。ですから、現在の値を保存し、切り替え、印刷し、元に戻します — 印刷が失敗したとしてもです。

Sub PrintOnLabelPrinter()
    Dim oldPrinter As String
    oldPrinter = Application.ActivePrinter
    On Error GoTo Restore
    Application.ActivePrinter = "Label Printer on Ne02:"
    Worksheets("Labels").PrintOut
Restore:
    Application.ActivePrinter = oldPrinter
    If Err.Number <> 0 Then MsgBox "印刷できませんでした: " & Err.Description
End Sub

正確な名前を調べるには、一度そのプリンターに手作業で印刷してから、 イミディエイト ウィンドウ で Debug.Print Application.ActivePrinter を実行します。

判断の分かれ目:紙は PrintOut で、ファイルは書き出しで

PrintOut には PrintToFile と PrToFileName という引数があり、これを Microsoft Print to PDF プリンターと組み合わせて PDF を作るコードを見かけることがあるでしょう。避けてください。プリンター名はパソコンや Windows の言語によって変わりますし、保存ダイアログが開いて無人で走るはずのマクロが固まることがあり、アクティブプリンターまで変えてしまいます。ExportAsFixedFormat なら、プリンターもダイアログも副作用もなしに同じ PDF を作れます。ルールはこうです。PrintOut は紙のため。ファイルは書き出すもの。 そして、どちらの出力を選んでも、そのページは ページ設定 から来ています — 直すのはそこです。

ExcelMaster の活用

印刷マクロは、紙に出して初めてわかる形で失敗します。2 ページ目にぽつんと取り残された一列、最後に出てくる白紙のページ、間違ったプリンター、二部のつもりが二十部。どれも、誰かがコードを見るより先に刷り直しのコストを生みます。

ExcelMaster には、仕事の内容をそのまま伝えられます — 「請求書シートを二部、横向きで、横 1 ページに収めて、ラベルプリンターで印刷して」 — すると、ページ設定と PrintOut の呼び出しをまとめて書き、プリンターの保存と復元まで組み込んでくれます。紙が一枚でも動く前に、PDF でプレビューできます。

よくある質問

VBA でシートを印刷するには?

ワークシートに対して PrintOut を呼びます。Worksheets("Report").PrintOut です。必要に応じて Copies:=2 や From:=1, To:=3 のような名前付き引数を加えます。印刷されるのはシートのページ設定が定義したページなので、レイアウトが大事なら先に印刷範囲と印刷の向きを設定しましょう。

VBA で特定の範囲を印刷するには?

範囲に対して PrintOut を呼びます。Range("A1:F30").PrintOut です。シートの印刷範囲がどうであれ、その範囲だけが印刷されます。よく印刷する範囲なら、PageSetup.PrintArea を一度設定しておき、シートのほうを印刷しましょう。

印刷する前に印刷プレビューを表示するには?

PrintOut に Preview:=True を渡します。印刷プレビューが開き、ユーザーが印刷するかキャンセルするかを選べます。まったく印刷せずにプレビューだけを表示するなら、シートに対して PrintPreview を呼びます。マクロの開発中はプレビューを使えば、テストで紙を無駄にしません。

VBA で特定のプリンターに印刷するには?

Application.ActivePrinter にプリンターの正確な名前をポートまで含めて設定し — たとえば "Office Printer on Ne01:" — それから PrintOut を呼びます。先に以前の値を保存し、終わったら元に戻しましょう。この設定は、ユーザーが次に印刷するすべてのものに効き続けるからです。

PrintOut で PDF を作れますか?

作れます。Microsoft Print to PDF プリンターと PrToFileName を使えばです。ただし壊れやすい方法です。プリンター名はパソコンごとに異なり、保存ダイアログがマクロを止めてしまうことがあります。代わりに ExportAsFixedFormat Type:=xlTypePDF を使いましょう — プリンターを必要とせず、ファイルのパスを引数として受け取ります。

検証環境

検証環境: Excel 365 (Windows 11)、VBA 7.1 — 最終確認 2026-09-29。

関連ガイド: VBA Save as PDF · VBA Page Setup · VBA Used Range · VBA For Each · VBA Workbook BeforePrint · VBA Immediate Window · VBA On Error