LoginSignup
4
7

More than 3 years have passed since last update.

VBAマクロでPDFを印刷する方法およびプリンタ情報を取得する

Last updated at Posted at 2019-04-03

VBAマクロでPDF印刷をする

業務でExcelを処理しつつPDFを印刷する必要があったので、マクロでPDFを印刷する処理も組み込みました。

意外とすんなりいかなかったので記事にしました。

処理の概要

  1. プリンタ情報を取得
  2. PDFファイルのパスを取得
  3. Adobe Acrobat Reader DCを起動して、PDFファイル一つ一つを印刷する

事前準備

  1. Shellを使いますので、[VBE]-[ツール]-[参照設定]にて、「Microsoft Shell Controls And Automation」にチェックが入っていることを確認してください。
  2. Adobe Reader DCが必要なので、インストールしておいてください。
  3. 印刷に使いたいプリンタを「通常使うプリンターに設定」にチェックを入れてください。

プリンタ情報を取得

VBAではApplication.activePrinterで通常使うプリンタを取得できます。
形式は「プリンタ名 on ポート名:」です。
「プリンタ名」以外は不要なので、プリンタ名だけに切り分ける処理が必要です。


    '通常使うプリンターを取得
    Dim activePrinter As String
    activePrinter = Application.activePrinter

    '取得できなかった時の処理
    If activePrinter = "" Then
        MsgBox "プリンター情報が取得できませんでした" & Chr(13) & "プリンターが接続されていることを確認してください"
        End
    End If

    Dim intPoint1 As Long           'プリンタ名を切り出す為の文字数

    'ファイル名(" on"の前まで)とポート名("on "の後から最後まで)を切り出す
    '※プリンタによって形式が異なるかもしれませんので、お使いの環境に合わせてください
    intPoint1 = InStr(activePrinter, "on") - 2

    Dim usePrinter As String 'ポートを除いたプリンタ名
    usePrinter = Left(activePrinter, intPoint1)

マクロの都合により、プリンタ名をそのまま変数として持っているか、どこかのセルに書き込んだりしてください。

PDFファイルのパスを取得

印刷したいPDFファイルのフルパスとファイル名を取得します。
ファイル名の取得はもっといい方法あると思うので、あくまで参考くらいの感じでオナシャス。

なお、以下ではDirを使っていますが、別記事で指摘いただいた通り、Dirだとファイル名が文字化けする可能性があるので、FileSystemObjectを使った方が事故が防げるかと思われ。

サンプルコード

    'フォルダに格納しているserchFileファイル名を取得する
    Dim strPdfName() As String                                  'PDFファイルのフルパス配列
    ReDim strPdfName(0)                                         'まず0で初期化
    Dim serchFile As String
    serchFile = Dir("【フォルダの絶対パス】\*.pdf")               '指定のフォルダに置き換えてください
                                                                '拡張子がpdfのファイルを検索

    Do While serchFile <> ""
        strPdfName(UBound(strPdfName)) = "【フォルダの絶対パス】\" & serchFile
                                                                'パス+ファイル名追加
        ReDim Preserve strPdfName(UBound(strPdfName) + 1)     '配列を拡張
        serchFile = Dir()                                       '次のファイル名を取得
    Loop

    If UBound(strPdfName) > 0 Then
        ReDim Preserve strPdfName(UBound(strPdfName) - 1)     '余分な要素を削除
    End If

PDFファイルを印刷する

コマンドラインから起動して印刷します。
公式に書いてありました。

AcroRd32.exe /t path printername drivername portname
Adobe Reader を起動し、印刷ダイアログボックスを表示せずに PDF ファイルを印刷し、Adobe Reader を終了する

公式ページだと上記コマンドですが、色々試したところ、AcroRd32.exe /t path printernameで良さそうです。プリンタや環境によってdrivernameやportnameが必要かもしれませんが、今回は割愛します。

上記コマンドをテキスト形式で作成して、shellObj.Runで実行させます。


    'シェルオブジェクトの作成
    Dim shellObj As Object
    Set shellObj = CreateObject("WScript.shell")

    Dim itm As Variant
    Dim exeStm As String

    '先ほど取得したPDFファイルのフルパス配列をforeachで回す
    For Each itm In strPdfName

        exeStm = ""

        'コマンドラインの文字列を作成する
        exeStm = "AcroRd32.exe /t" & " " & itm & " " & printername
        shellObj.Run (exeStm)   '印刷する

        '1秒待機(不要かもしれない)
        Application.Wait [Now() + "0:00:01"]

    Next itm

    'お片づけ
    Set shellObj = Nothing

また、説明だと「Adobe Reader を終了する」とありますが、私の環境だと終了されませんでした。
印刷終わったら手動で閉じてください。

おわりに

これ作るためにめちゃくちゃテスト印刷した。
※この後スタッフが裏紙として使用しました

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7