毎回、エクセルでたくさんのシートにわたっている複雑な印刷の設定を確認したり、印刷をかけたりするのがたいへんで…
設定ミスや印刷漏れがあったりすると再度やり直しになるし…
そんなときはVBAでサクッと終わらせてしまいましょう!
VBAで印刷するメソッド PrintOut
Visual Basic for Applications (VBA) での印刷(PrintOut)は、Excel、Word、AccessなどのOfficeアプリケーション内で印刷操作を自動化するために使用されます。このメソッドは、印刷の対象、部数、ページ範囲、印刷の種類など、さまざまな印刷設定を指定するためのオプションを提供します。
PrintOutメソッドのパラメーターについて
VBAにおけるPrintOutメソッドは、パラメーター(引数)にさまざまな値を設定することによって、印刷プロセスを細かく制御することができます。
これらのパラメーターを使って、どのページを印刷するか、何部印刷するか、プリンターの選択、印刷プレビューの表示など、印刷に関するさまざまな条件を指定できます。Officeアプリケーションによって、オブジェクトや使えるパラメーターが異なりますので、詳細は下記の一覧からMicrosoft公式ドキュメントのVBAリファレンスで確認することが出来ます。
Excel
- Worksheet Object (ワークシートオブジェクト)
- Workbook Object (ブックオブジェクト)
Word
- Document Object (ドキュメントオブジェクト)
PowerPoint
- Presentation Object (プレゼンテーションオブジェクト)
Access
- DoCmd Object (ドゥー・コマンドオブジェクト)
ここではExcelを中心に解説していきます。
VBAでオブジェクトを印刷をする
まずはVBAで対象のオブジェクトを印刷してみましょう。
Excelブックの全シートを印刷
ActiveWorkbook.PrintOut
アクティブシートを印刷
ActiveSheet.PrintOut
特定のシートを印刷
Sheets("Sheet1").PrintOut
指定範囲を印刷
Range("A1:D10").PrintOut
配列で指定したシートを印刷
Sheets(Array("Sheet1", "Sheet2", "Sheet3")).PrintOut
ただし、非表示シートに対してPrintOutメソッドを使用するとエラーになってしまいます。その場合、シートを一時的に表示してから印刷し、再度非表示に戻すのが一般的な対策です。
シートに何も入力されていなかった場合は…
シートに何も入力されていない場合、Excelは自動的に空のシートに対する印刷をキャンセルするため、空白のページが印刷されることはありません。これは、無駄な印刷を防ぐためのExcelの標準的な動作ですが、たとえシートが「空」でも、たとえばセルに罫線や背景色が設定されている場合やヘッダーやフッターが設定されていればこれらは印刷されます。
パラメーターの設定の仕方
PrintOutメソッドにおけるパラメーターの設定の仕方を確認します。このパラメーターの設定方法は、基本的にVBAのメソッドにおける共通するルールです。
引数の順序
名前付き引数を使用しない場合、すべての引数は定義されている順序通りに指定する必要があります。引数が多いメソッドでは、この順序が特に重要です。
1ページ目から5ページ目を3部印刷し、印刷プレビューを表示する場合
ActiveSheet.PrintOut 1, 5, 3, True
引数の省略
途中の引数を省略する場合、省略する引数の位置にカンマを置くことで、その位置をスキップできます。これにより、後続の引数を設定できます。
印刷プレビューを表示せず、デフォルトのプリンターを使って、ページ範囲と部数を指定してファイルに出力する場合
ActiveSheet.PrintOut 1, 5, 3, False, , True
デフォルト値の使用
引数を指定しない場合、VBAはその引数に対してデフォルト値を適用します。これにより、すべての引数を毎回指定する必要がありません。前述のブックやシートを印刷した例は、すべての引数を省略しているのでデフォルト値が適用されています。
名前付き引数
名前付き引数を使うと、引数の順序に関係なく、引数名を指定して設定できます。これにより、コードの可読性が向上し、引数の順序に依存しない柔軟な設定が可能です。PrintOutは設定できる引数が多いので、名前付き引数を使用することを推奨します。
特定のページ範囲を指定し、2部印刷し、プレビューを表示する場合
ActiveSheet.PrintOut From:=2, To:=5, Copies:=2, preview:=True
残りの引数は指定していないため、それぞれのデフォルト値が使用されます。
PrintOutのパラメーター
VBAにおいて対象のオブジェクト、特にExcelワークシートを印刷(PrintOut)するためのパラメーターについて、いくつか実例を紹介しましたが、その中に出てきた、From: 印刷を開始するページの番号を指定、To: 印刷を終了するページの番号を指定、Copies: 印刷部数を指定、preview:=True: 印刷をする前に印刷プレビューを実行 などは比較的わかりやすいものであったと思います。そこで、これら以外のパラメーターについても個別にご紹介します。
ActivePrinter
指定したプリンターでの印刷を簡単に行うことができます。指定しないとデフォルトのプリンターで印刷します。
ActiveSheet.PrintOut ActivePrinter:="プリンター名 on ポート名"
ただし注意点として、 ActivePrinterに指定するプリンター名は、システムに登録されている正確な名前である必要があります。そのため、メソッドのパラメーターに値を設定する前に正しいプリンター名をあらかじめ確認しておくことをお勧めします。
現在のプリンター名を取得して表示する
MsgBox "現在のプリンターは: " & Application.ActivePrinter
すべての利用可能なプリンター名をイミディエイトウィンドウに表示
Sub PrintFolderItems()
Dim shellApp As Object
Dim targetFolder As Object
Dim folderItem As Object
' Shellオブジェクトの作成
Set shellApp = CreateObject("Shell.Application")
' 指定したフォルダのNamespaceを取得
Set targetFolder = shellApp.Namespace(4)
' フォルダ内のアイテムを順に取得し、イミディエイトウィンドウに出力
For Each folderItem In targetFolder.Items
Debug.Print folderItem.Name
Next folderItem
' オブジェクトの解放
Set folderItem = Nothing
Set targetFolder = Nothing
Set shellApp = Nothing
End Sub
Shell.Application は、Windowsのシェル(ユーザーインターフェース)とやり取りするためのオブジェクトで、VBAなどで使用されます。これを使うと、ファイルシステムやデスクトップ、スタートメニューなど、特定のシステムフォルダにアクセスし操作ができます。
Shell.NameSpace メソッドは、VBA で Shellオブジェクトを使用して、Windows の特定のフォルダーにアクセスするために使用されるメソッドです。このメソッドを使用することで、ファイルシステム内の特定のフォルダーや仮想フォルダー(コントロールパネルやスタートメニューなど)にアクセスし、その内容を操作できます。
ShellSpecialFolderConstants
VBAで、Windowsの特定のシステムフォルダーへのパスを簡単に取得するための定数です。これらの定数は、Shellオブジェクトのメソッドで使用され、ユーザーのデスクトップやマイドキュメント、プログラムデータフォルダーなど、特定のシステムディレクトリの場所を参照するのに役立ちます。
名前 | 定数 | 説明 |
---|---|---|
ssfDESKTOP | 0 | Windows デスクトップ |
ssfPROGRAMS | 2 | ユーザーのプログラム |
ssfCONTROLS | 3 | コントロール パネル |
ssfPRINTERS | 4 | インストールされているプリンター |
ssfPERSONAL | 5 | ドキュメント |
ここではプリンターの定数4を使用しています。
PrintToFile,PrToFileNameでファイルへ出力する
True の場合、ファイルへ出力します。 PrToFileName が指定されていない場合、出力ファイルの名前を入力するようにユーザーに求められます。
Sub SavePrintJobToFile()
Dim fileName As String
fileName = "C:\Path\To\Your\File.prn" ' 保存先ファイル名とパスを指定
' 印刷ジョブをファイルに保存
ActiveSheet.PrintOut _
PrintToFile:=True, _
PrToFileName:=fileName
End Sub
「.prn」とは、プリンターの印刷先や、特定のファイルを印刷する時などの印刷設定情報などを保存したファイルです。このファイルは、プリンタに送信するデータをファイル化したもので、このファイルをプリンタに直接送信することで内容を印刷できます。
Collate
ドキュメントを見ると、「True の場合、部単位で印刷します。」とされています。どういう意味でしょうか。
- True: 印刷する部数が複数ある場合、ページを順番に整理して印刷します。例えば、3部印刷する場合、ページ1, 2, 3の順に各部印刷されます。
- False: 各ページが部数分だけ連続して印刷されます。例えば、3部印刷する場合、ページ1, 1, 1, ページ2, 2, 2, ページ3, 3, 3の順に印刷されます。
IgnorePrintAreas
この設定がTrueの場合、印刷範囲の設定を無視してシート全体を印刷するために使用します。この引数を利用することで、設定された印刷範囲に関係なく、シート全体を印刷することができます。
よって設定がFalseであった場合は、印刷範囲を尊重し、設定された範囲内のデータのみを印刷します。
「Ignore(イグノア)」は英語で「無視する」または「気にしない」という意味で、コンピュータやプログラムにおいて「Ignore」という用語が使われる場合、それは通常、特定の設定や条件を無視する、またはそれに対して何もアクションを取らないことを意味します。
👉 【最大10,000円割引!】 XServer レンタルサーバー招待リンク
印刷プレビューを活用する
印刷を自動化するVBAで間違った印刷を大量に実行してしまっては元も子もないので、任意のタイミングで印刷プレビュー(preview:=True)を表示させたり、メッセージボックスなどで内容の確認を促す機能を組み込むことで、システムとしてより親切で使いやすい構築が可能になります。
印刷に関連するプロパティ
Excelのオブジェクトには、印刷に関する設定や情報を取得するためのさまざまなプロパティがあります。このプロパティを使うにはExcelやWordなどで印刷設定を管理するために使用されるオブジェクトであるPageSetupを使用します。
このオブジェクトを使用することで、シートやドキュメントの印刷に関する設定を細かく調整することができます。ここでも上記と同様に公式ドキュメントをご紹介します。➡ PageSetup オブジェクト (Excel)
PageSetupオブジェクト
このオブジェクトで制御できる内容には、おもにページの向き、用紙サイズ、印刷範囲、拡大/縮小率、余白などがあります。
ページの向きを指定 xlPortrait(縦)またはxlLandscape(横)
ActiveSheet.PageSetup.Orientation = xlLandscape
用紙サイズを指定 標準的なサイズには、xlPaperA4、xlPaperLetterなど
ActiveSheet.PageSetup.PaperSize = xlPaperA4
印刷時の拡大/縮小率をパーセンテージで指定 デフォルトで100
ActiveSheet.PageSetup.Zoom = 75
印刷するセルの範囲を指定
ActiveSheet.PageSetup.PrintArea = "A1:D10"
各余白のサイズをポイント単位で設定
With Worksheets(1).PageSetup
.LeftMargin = Application.InchesToPoints(0.5)
.RightMargin = Application.InchesToPoints(0.75)
.TopMargin = Application.InchesToPoints(1.5)
.BottomMargin = Application.InchesToPoints(1)
.HeaderMargin = Application.InchesToPoints(0.5)
.FooterMargin = Application.InchesToPoints(0.5)
End With
水平:CenterHorizontally・垂直:CenterVertically に中央揃え設定
ActiveSheet.PageSetup.CenterHorizontally = True
各ページの先頭に印刷する 行:PrintTitleRows や 列:PrintTitleColumns を指定
ActiveSheet.PageSetup.PrintTitleRows = "$1:$1"
ページの 幅:FitToPagesWide と 高さ:FitToPagesTall に合わせて1ページで印刷する設定
ActiveSheet.PageSetup.FitToPagesWide = 1
ActiveSheet.PageSetup.FitToPagesTall = 1
- 数値は目的のページ数を示し、False または 0 に設定すると調整が無効になります。
- これらのプロパティを使用すると、Zoomプロパティは自動的に無効化されます。
- 逆に、これらのプロパティが設定されている状態で Zoom を設定しようとするとエラーが発生してしまいます。
- また、印刷範囲が非常に広い場合に、FitToPagesWide や FitToPagesTall を使用すると、内容が非常に小さく印刷されて読めなくなる可能性があるので注意が必要です。
両面印刷について
VBAでは、直接的に両面印刷を設定する標準的な方法はありませんが、VBAでプリンタの設定ダイアログを自動的に開かせて、そこで両面印刷を設定するなどの間接的な方法をとることはできます。
もし可能であれば、プリンターのプロパティで両面印刷を有効にしてからVBAで印刷を実行するのが最も簡単で確実な方法です。
おわりに
VBAで印刷を自動化する方法を解説しましたが、やはり、この印刷メソッドが本領を発揮するのは、Excelのvlookup関数やVBAのfor文やwhile文などのループと組み合わせて、たくさんの一覧データから同じ様式の請求書や納品書、伝票などに一件、一件データを転記して連続印刷するなどの応用的な使い方になりますね。
ぜひ、これらを活用して面倒なExcelなどの印刷業務を大幅に時短することにお役立てできれば幸いです。最後までご覧頂きありがとうございました。
自分のサーバーを持ってみたいと思いませんか?
👇 本サイトからの申し込みならエックスサーバー【最大10,000円割引】!
キャンペーンと併用してさらにお得!