プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

VBA フォルダ内のPDFファイル印刷

VBAで任意のフォルダ内のPDFファイルを一括印刷する方法

まずは全体のソースコードを記載し、その後詳しく解説していく
 

【全体のソースコード】

※都合上、コメントアウトを「//」としているのでコピペする場合は「’」に置換してください
 

////// README //////

//【事前準備】
//「ツール」⇒「参照設定(R)」⇒「Windows Script Host Object Model」にチェックを入れておく

//【コメントについて】
//★:環境に合わせて変更が必要
//△:無くてもよい

////// グローバル変数 //////

//印刷する対象フォルダまでのフルパス
Dim fullFolderPath As String

////// メインプロシージャ //////

Sub Main()

    Call FolderSearch

    Call OpenFile

End Sub

////// 印刷する対象フォルダまでのフルパスを設定するプロシージャ //////

Sub FolderSearch()

    //★ベースとなるフォルダパス ※最後の&yenマークを忘れないように
    Const FOLDER_PATH_BASE As String = "C:&yenUsers&yenhogehoge&yenDesktop&yenPrintOut&yenPDF&yen"

    //変動するフォルダパス(日付部分)
    Dim datePath As String

    //★変動するフォルダパスの後に続く固定のフォルダ名
    Const AFTER_PATH As String = "_hogehoge"

    //印刷するファイルが格納されているフォルダの親フォルダ名(月部分)
    Dim monthPath As String

    //印刷する対象フォルダの日付部分(YYYYMMDD)を入力するテキストボックスを表示
    datePath = InputBox("印刷する対象フォルダの日付を8桁で入力してください" & vbCrLf & "例) 20190801")

    //入力値が8桁かどうかのチェック
    If Len(datePath) <> 8 Then
        //8桁でない場合は処理を終了
        MsgBox ("入力値が8桁ではありません" & vbCrLf & "処理を終了します")
        End
    Else
        //8桁の場合は先頭から6文字(YYYYMM)を取得し、印刷するファイルが格納されているフォルダの親フォルダ名(月部分)にセット
        monthPath = Left(datePath, 6) & "&yen"
    End If

    //印刷する対象フォルダまでのフルパスをセット
    fullFolderPath = FOLDER_PATH_BASE & monthPath & datePath & AFTER_PATH

    //△フルパスをメッセージボックスで表示
    MsgBox ("印刷する対象フォルダのフルパス:" & fullFolderPath)

End Sub

////// PDFファイルを開いて印刷するプロシージャ ※印刷部分は「PrintOutファンクション」で実行 //////

Sub OpenFile()

    //指定したフルパスを元にPDFファイルが格納されているフォルダの存在チェック
    If Dir(fullFolderPath, vbDirectory) = "" Then
        //フォルダが存在しない場合は処理を終了
        MsgBox ("対象フォルダがありません" & vbCrLf & "処理を終了します")
        End
    End If

    //印刷対象フォルダ内のPDFファイル名をセット
    Dim fileName As String
    fileName = Dir(fullFolderPath & "&yen" & "*.pdf")

    //印刷対象フォルダ内のPDFファイルの存在チェック
    If fileName = "" Then
        //ファイルが1つも無い場合は処理を終了
        MsgBox ("対象フォルダにPDFファイルがありません" & vbCrLf & "処理を終了します")
        End
    End If

    //印刷対象フォルダ内のPDFファイルを開く(全てのPDFファイルを開くまで処理をループ)
    Do While fileName <> ""
        //PDFファイルを開く時の決まり文句 ⇒ 【CreateObject("Shell.Application").ShellExecute <対象ファイルのフルパス>】
        CreateObject("Shell.Application").ShellExecute (fullFolderPath & "&yen" & fileName)

        //開いたPDFファイルを印刷する為に「PrintOutファンクション」を呼び出し ※引数にフォルダのフルパスとPDFファイル名を渡して処理
        Call PrintOut(fullFolderPath, fileName)

        //次のPDFファイルを取得
        fileName = Dir()
    Loop

End Sub

////// 印刷処理ファンクション ※Adobe Readerで印刷 //////

Function PrintOut(fullFolderPath As String, fileName As String)

    //「IWshRuntimeLibrary」ライブラリにある「WshShell」型のオブジェクトを宣言し、変数「obj」にセット
    Dim obj As IWshRuntimeLibrary.WshShell
    Set obj = New IWshRuntimeLibrary.WshShell

    //プリンター名 ※プリンター名はイミディエイトウィンドウに「?Application.ActivePrinter」で取得可能(「on Ne00」の前までがプリンター名)
    Dim printerName As String

    //★プリンター名をセット
    printerName = "PX-047A Series(ネットワーク)"

    //プリントアウト用のコマンド設定
    Dim printOutCommand As String
    printOutCommand = "AcroRd32.exe /t " & fullFolderPath & "&yen" & fileName

    //プリントアウト用のコマンド実行
    obj.Run (printOutCommand)

    //オブジェクトで使用していたメモリを開放
    Set obj = Nothing

End Function

 
 


ここから詳しく解説

 

【README】

VBAの解説を記載している

////// README //////

//【事前準備】
//「ツール」⇒「参照設定(R)」⇒「Windows Script Host Object Model」にチェックを入れておく

//【コメントについて】
//★:環境に合わせて変更が必要
//△:無くてもよい

 
■ポイント:参照設定をする
VBA画面で「ツール」⇒「参照設定(R)」⇒「Windows Script Host Object Model」にチェック
 

 

 

 
 


【グローバル変数】

各プロシージャで使用する共通変数を宣言している

////// グローバル変数 //////

//印刷する対象フォルダまでのフルパス
Dim fullFolderPath As String

 
■ポイント:PDFファイルが格納されているフォルダのパスを「fullFolderPath」でグローバル変数で宣言することにより、全てのプロシージャで使用することを可能にしている
 
 


【メインプロシージャ】

後記する「FolderSearch」と「OpenFile」のプロシージャをCallステートメントで呼び出している

////// メインプロシージャ //////

Sub Main()

    Call FolderSearch

    Call OpenFile

End Sub

 
■ポイント:5行目と7行目の「PDFファイルが格納しているフォルダを探す」という処理と「PDFファイルを開く」という処理を分けて記述することによってプログラムの可読性と汎用性を高めている
 
 


【印刷する対象フォルダまでのフルパスを設定するプロシージャ】

Sub FolderSearch()

    //★ベースとなるフォルダパス ※最後の&yenマークを忘れないように
    Const FOLDER_PATH_BASE As String = "C:&yenUsers&yenhogehoge&yenDesktop&yenPrintOut&yenPDF&yen"

    //変動するフォルダパス(日付部分)
    Dim datePath As String

    //★変動するフォルダパスの後に続く固定のフォルダ名
    Const AFTER_PATH As String = "_hogehoge"

    //印刷するファイルが格納されているフォルダの親フォルダ名(月部分)
    Dim monthPath As String

    //印刷する対象フォルダの日付部分(YYYYMMDD)を入力するテキストボックスを表示
    datePath = InputBox("印刷する対象フォルダの日付を8桁で入力してください" & vbCrLf & "例) 20190801")

    //入力値が8桁かどうかのチェック
    If Len(datePath) <> 8 Then
        //8桁でない場合は処理を終了
        MsgBox ("入力値が8桁ではありません" & vbCrLf & "処理を終了します")
        End
    Else
        //8桁の場合は先頭から6文字(YYYYMM)を取得し、印刷するファイルが格納されているフォルダの親フォルダ名(月部分)にセット
        monthPath = Left(datePath, 6) & "&yen"
    End If

    //印刷する対象フォルダまでのフルパスをセット
    fullFolderPath = FOLDER_PATH_BASE & monthPath & datePath & AFTER_PATH

    //△フルパスをメッセージボックスで表示
    MsgBox ("印刷する対象フォルダのフルパス:" & fullFolderPath)

End Sub

 
■ポイント①:16行目のInputBox関数によりPDFファイルが格納しているフォルダを動的に選択できるようにしている
InputBox("印刷する対象フォルダの日付を8桁で入力してください" & vbCrLf & "例) 20190801")
 
■ポイント②:19行目でLen関数を使い、「If Len(datePath) <> 8 Then」で入力値が8文字かどうかを判断
本来はこれに加えて全角半角もチェックするべきだが、ソースコードをシンプルにする為に割愛している
 
■ポイント③:25行目のLeft関数で「monthPath」に入力値のうち、左から6文字(年月)までをセット
Left関数で第1引数に対象の文字列、第2引数で取得する文字数をセット
 
 


【PDFファイルを開いて印刷するプロシージャ】

////// PDFファイルを開いて印刷するプロシージャ ※印刷部分は「PrintOutファンクション」で実行 //////

Sub OpenFile()

    //指定したフルパスを元にPDFファイルが格納されているフォルダの存在チェック
    If Dir(fullFolderPath, vbDirectory) = "" Then
        //フォルダが存在しない場合は処理を終了
        MsgBox ("対象フォルダがありません" & vbCrLf & "処理を終了します")
        End
    End If

    //印刷対象フォルダ内のPDFファイル名をセット
    Dim fileName As String
    fileName = Dir(fullFolderPath & "¥" & "*.pdf")

    //印刷対象フォルダ内のPDFファイルの存在チェック
    If fileName = "" Then
        //ファイルが1つも無い場合は処理を終了
        MsgBox ("対象フォルダにPDFファイルがありません" & vbCrLf & "処理を終了します")
        End
    End If

    //印刷対象フォルダ内のPDFファイルを開く(全てのPDFファイルを開くまで処理をループ)
    Do While fileName <> ""
        //PDFファイルを開く時の決まり文句 ⇒ 【CreateObject("Shell.Application").ShellExecute <対象ファイルのフルパス>】
        CreateObject("Shell.Application").ShellExecute (fullFolderPath & "¥" & fileName)

        //開いたPDFファイルを印刷する為に「PrintOutファンクション」を呼び出し ※引数にフォルダのフルパスとPDFファイル名を渡して処理
        Call PrintOut(fullFolderPath, fileName)

        //次のPDFファイルを取得
        fileName = Dir()
    Loop

End Sub

 
■ポイント①:6行目のDir関数でフォルダが存在するかをチェック
Dir関数の第2引数で「vbDirectory」を指定してフォルダが存在するかをチェックしている
 
■ポイント②:14行目の「.pdf」で拡張子が「pdf」、ファイル名はワイルドカード「」でどのようなファイル名でも良いようにしている
「fileName = Dir(fullFolderPath & "¥" & "*.pdf")」でフォルダ内に存在するPDFファイルの1つを取得し、「fileName」にセット
 
■ポイント③:24行目の「Do While ~ Loop」でフォルダ内のファイル名が空文字になるまでループ処理
Dir関数は対象ファイルを全て取得すると空文字("")を返す
よって、ループ処理の条件を「fileName <> ""」とし、「ファイルを全て取得するまで」としている
 
■ポイント④:26行目の下記記述でPDFファイルを開く
【CreateObject("Shell.Application").ShellExecute <対象ファイルのフルパス>】
 
■ポイント⑤:29行目でプリントアウトする処理を「PrintOut(fullFolderPath, fileName)」ファンクションで呼び出す
ファンクション内で使用する為に第1引数に「フォルダパス」、第2引数に「ファイル名」を指定
 
■ポイント⑥:32行目の「Dir()」で次のファイルを取得
ファイルを全て取得した場合は空文字("")を返す
 
 


【印刷処理ファンクション ※Adobe Readerで印刷】

////// 印刷処理ファンクション ※Adobe Readerで印刷 //////

Function PrintOut(fullFolderPath As String, fileName As String)

    //「IWshRuntimeLibrary」ライブラリにある「WshShell」型のオブジェクトを宣言し、変数「obj」にセット
    Dim obj As IWshRuntimeLibrary.WshShell
    Set obj = New IWshRuntimeLibrary.WshShell

    //プリンター名 ※プリンター名はイミディエイトウィンドウに「?Application.ActivePrinter」で取得可能(「on Ne00」の前までがプリンター名)
    Dim printerName As String

    //★プリンター名をセット
    printerName = "PX-047A Series(ネットワーク)"

    //プリントアウト用のコマンド設定
    Dim printOutCommand As String
    printOutCommand = "AcroRd32.exe /t " & fullFolderPath & "&yen" & fileName

    //プリントアウト用のコマンド実行
    obj.Run (printOutCommand)

    //オブジェクトで使用していたメモリを開放
    Set obj = Nothing

End Function

 
■ポイント①:6、7行目でWshShellクラスのインスタンス変数をセット
WshShellのRunメソッドでプリントアウトする為の準備
 
■ポイント②:13行目でプリンター名をセット
プリンター名がわからない場合
⇒VBA画面のイミディエイトウィンドウに「?Application.ActivePrinter」と入力するして「Enter」を押すと取得できる
※「on Ne00:」の前までがプリンター名

 

 
■ポイント③:プリントアウト用のコマンド設定
「Adobe Reader」を起動し、「/t」オプションで印刷ダイアログボックスを表示せずにPDFファイルを印刷するコマンド
"AcroRd32.exe /t " & fullFolderPath & "¥" & fileName
 
■ポイント④:プリントアウト実行
obj.Run (printOutCommand)
ポイント③で設定したコマンドをWshShellのRunメソッドで実行してプリントアウト
 
■ポイント⑤:オブジェクトで使用していたメモリを開放
「Set obj = Nothing」でメモリを開放