VBAで印刷をマスター!印刷業務を完全自動化

VBA

※この記事にはプロモーションが含まれています。

毎回、エクセルでたくさんのシートにわたっている複雑な印刷の設定を確認したり、印刷をかけたりするのがたいへんで…
設定ミスや印刷漏れがあったりすると再度やり直しになるし…

そんなときはVBAでサクッと終わらせてしまいましょう!

VBAで印刷するメソッド PrintOut

 Visual Basic for Applications (VBA) での印刷(PrintOut)は、Excel、Word、AccessなどのOfficeアプリケーション内で印刷操作を自動化するために使用されます。このメソッドは、印刷の対象、部数、ページ範囲、印刷の種類など、さまざまな印刷設定を指定するためのオプションを提供します。

PrintOutメソッドのパラメーターについて

 VBAにおけるPrintOutメソッドは、パラメーター(引数)にさまざまな値を設定することによって、印刷プロセスを細かく制御することができます。

 これらのパラメーターを使って、どのページを印刷するか、何部印刷するか、プリンターの選択、印刷プレビューの表示など、印刷に関するさまざまな条件を指定できます。Officeアプリケーションによって、オブジェクトや使えるパラメーターが異なりますので、詳細は下記の一覧からMicrosoft公式ドキュメントのVBAリファレンスで確認することが出来ます。

Excel

Word

PowerPoint

Access

 ここではExcelを中心に解説していきます。

レンタルサーバー 高速・高機能・高安定性の【エックスサーバー】
高速かつ高い安定性を誇る高性能レンタルサーバー【エックスサーバー】稼働率99.99%以上の高い安定性で、業界トップクラスの高コストパフォーマンスを誇る高品質レンタルサーバーです。月額990円(税込)から利用可能。まずは無料お試し10日間。

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オブジェクトのメソッドで使用され、ユーザーのデスクトップやマイドキュメント、プログラムデータフォルダーなど、特定のシステムディレクトリの場所を参照するのに役立ちます。

名前定数説明
ssfDESKTOP0Windows デスクトップ
ssfPROGRAMS2ユーザーのプログラム
ssfCONTROLS3コントロール パネル
ssfPRINTERS4インストールされているプリンター
ssfPERSONAL5ドキュメント

 ここではプリンターの定数を使用しています。

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 を設定しようとするとエラーが発生してしまいます。
  • また、印刷範囲が非常に広い場合に、FitToPagesWideFitToPagesTall を使用すると、内容が非常に小さく印刷されて読めなくなる可能性があるので注意が必要です。

両面印刷について

 VBAでは、直接的に両面印刷を設定する標準的な方法はありませんが、VBAでプリンタの設定ダイアログを自動的に開かせて、そこで両面印刷を設定するなどの間接的な方法をとることはできます。
 もし可能であれば、プリンターのプロパティで両面印刷を有効にしてからVBAで印刷を実行するのが最も簡単で確実な方法です。

おわりに

 VBAで印刷を自動化する方法を解説しましたが、やはり、この印刷メソッドが本領を発揮するのは、Excelのvlookup関数やVBAのfor文やwhile文などのループと組み合わせて、たくさんの一覧データから同じ様式の請求書や納品書、伝票などに一件、一件データを転記して連続印刷するなどの応用的な使い方になりますね。

 ぜひ、これらを活用して面倒なExcelなどの印刷業務を大幅に時短することにお役立てできれば幸いです。最後までご覧頂きありがとうございました。

 

タイトルとURLをコピーしました