【入門編】【ドキュメントサイレント印刷】Shell.Application の InvokeVerb を用いたPDF・Wordファイルのバックグラウンド一括印刷 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!業務自動化の現場を駆け抜けてきたエンジニアの先輩です。

毎日のように大量のPDFやWord、Excelファイルを開いては「印刷」ボタンを押す……。そんな単調で退屈な作業に、大切な時間を奪われていませんか?「マクロの記録」やGUI操作の自動化から一歩抜け出して、本当の意味でPCを働かせる自動化の技術を身につけたい。そう思っているあなたへ。

今回は、VBScript(Visual Basic Scripting Edition)とWSH(Windows Script Host)の底力をフル活用し、「GUI(画面)を一切表示させずに、指定フォルダ内のドキュメントを一括サイレント印刷する極限の自動化ロジック」を授けましょう。

ここをクリアすれば、あなたもVBScriptの裏の仕組みやOSのシェル制御の本質がグッと見えてきますよ。さあ、一緒に扉を開けましょう!

なぜ「Shell.Application」なのか?(本質的アプローチ)

通常、ファイルを印刷するには、WordならWordの、AcrobatならAcrobatのプログラムを起動して、印刷命令を送る必要があります。しかし、これではアプリごとにコードを書く必要があり、何より画面がバタバタと立ち上がって邪魔です。

ここで登場するのが、Windowsのデスクトップ環境を裏で操る中核、`Shell.Application` オブジェクトです。

Windowsのエクスプローラーでファイルを右クリックすると「印刷」というメニューがありますよね?あれは、OSが「この拡張子のファイルなら、このアプリケーションにこの動詞(Verb)を渡せば印刷できる」と知っているから成り立っています。
`InvokeVerb(“print”)`(または動詞を省略した標準実行)は、「人間が右クリックして『印刷』を押した挙動」をプログラムから極限のサイレント(バックグラウンド)で実行するという、極めてエレガントなアプローチなのです。

現場で即戦力になる!ドキュメント一括サイレント印刷スクリプト

それでは、実際のコードを見てみましょう。
メモ帳を開き、以下のコードを `SilentPrint.vbs` という名前で保存してください。

‘ ==============================================================================
‘ スクリプト名: SilentPrint.vbs
‘ 概要: 指定フォルダ内の対象ドキュメントをバックグラウンドで一括印刷する
‘ 著者: チーフアーキテクト先輩
‘ ==============================================================================

Option Explicit

‘ — 設定エリア —
‘ 印刷したいファイルが入っているフォルダパス(環境に合わせて書き換えてください)
Dim targetFolderPath
targetFolderPath = “C:\Work\PrintFolder”

‘ — メイン処理 —
Sub Main()
Dim fso, folder, file, shell, shellApp, folderObj

‘ 1. ファイルシステムオブジェクトの生成(フォルダの存在確認・走査用)
Set fso = CreateObject(“Scripting.FileSystemObject”)

If Not fso.FolderExists(targetFolderPath) Then
MsgBox “指定されたフォルダが存在しません: ” & targetFolderPath, vbCritical, “エラー”
Exit Sub
End If

‘ 2. Shell.Application の生成(OSのシェル機能を利用して印刷命令を投げる)
Set shellApp = CreateObject(“Shell.Application”)
Set folderObj = shellApp.NameSpace(targetFolderPath)

If folderObj Is Nothing Then
MsgBox “Shellオブジェクトの取得に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

Set folder = fso.GetFolder(targetFolderPath)

Dim printCount
printCount = 0

‘ 3. フォルダ内のファイルを1つずつループ処理
For Each file In folder.Files
Dim ext
ext = LCase(fso.GetExtensionName(file.Name))

‘ 印刷対象とする拡張子をフィルタリング(PDF、Word、Excelなど)
Select Case ext
Case “pdf”, “doc”, “docx”, “xls”, “xlsx”, “txt”
‘ 該当ファイルアイテムをShell経由で取得
Dim item
Set item = folderObj.ParseName(file.Name)

If Not item Is Nothing Then
‘ 【核心】InvokeVerbEx(“print”) または “print” 動詞の実行
‘ 拡張子に紐付いたアプリのバックグラウンド印刷機能を呼び出す
item.InvokeVerb(“print”)
printCount = printCount + 1

‘ 連続印刷時のOS側(スプーラー)の負荷を考慮し、わずかにウェイトを入れる
WScript.Sleep 1500
End If

Case Else
‘ 対象外の拡張子はスキップ
End Select
Next

‘ 4. 終了通知
MsgBox “印刷処理が完了しました。” & vbCrLf & “処理ファイル数: ” & printCount & “件”, vbInformation, “完了”

‘ オブジェクトの解放(メモリ管理の基本)
Set item = Nothing
Set folderObj = Nothing
Set shellApp = Nothing
Set fso = Nothing
End Sub

‘ メイン処理の実行
Main()

コードの重要ポイントと「知っておくべき極意」

プログラミング初学者のうちは、「動けばいいや」となりがちですが、業務自動化エンジニアとして知っておくべき本質的なポイントを3つ解説します。

1. `Option Explicit`(変数の宣言強制)はエンジニアの命綱

コードの2行目にある `Option Explicit`。これ、絶対に省略しないでください。
これを書いておくと、うっかり変数のスペルミス(例: `targetFolderPat` と書いてしまうなど)をしたときに、VBScriptが即座にエラーで止めてくれます。バグの温床を防ぐための必須の作法です。

2. なぜ `InvokeVerb(“print”)` なのか?

今回の自動化のキモです。`Shell.NameSpace(パス).ParseName(ファイル名)` で取得したアイテムは、いわば「エクスプローラーが見ているファイルそのもの」です。
これに対して `.InvokeVerb(“print”)` を実行すると、OSがファイルの関連付け(拡張子)を見て、該当アプリに「印刷しろ」という命令を裏側で投げます。
※環境やアプリケーション(特にAcrobat Readerなど)のバージョンによっては、稀にウィンドウが瞬時に開いて閉じる挙動をすることがありますが、基本的にはGUIを最小限に抑えたサイレント印刷が可能です。

3. `WScript.Sleep 1500` の隠された理由(極意)

「ファイルを一瞬でループ処理して印刷命令を投げまくれば早いじゃん!」と思いませんか?
実はこれ、プリンターの印刷スプーラーや関連アプリ(WordやAcrobat)をパンクさせる原因になります。OSやプリンターがファイルを受け取り、バックグラウンドプロセスを立ち上げる暇を与える前に次の命令を投げると、印刷が抜け落ちたり、アプリケーションがフリーズしたりします。
「あえて少し待つ(Sleepする)」。これが、現場で安定稼働するシステムを作るためのプロの知見です。

陥りやすいエラーとトラブルシューティング

現場でこのスクリプトを動かす際、初心者が必ずと言っていいほどハマる罠があります。

  • エラー:「オブジェクトは、変数が見つかりません」

→ `Option Explicit` を入れている状態で、変数を `Dim` で宣言し忘れています。コードを上から見直しましょう。

  • ファイルが印刷されない・何も起きない

→ その拡張子(例: `.pdf`)に対して、Windows側で「既定のプログラム」が正しく関連付けられていない可能性があります。エクスプローラーでそのファイルを右クリックし、「印刷」というメニューが手動で正常に機能するか確認してください(メニューが出ない場合、Shell経由の印刷もできません)。

  • Office文書(Word/Excel)でプロセスが残る

→ Officeアプリの仕様上、バックグラウンド印刷の際にプロセスがメモリ上に残る場合があります。タスクマネージャーで適宜ゾンビプロセスを掃除するか、PCの定期的な再起動を組み込んでください。

おわりに

お疲れ様でした!
今回は、VBScriptとShellオブジェクトを駆使した、ドキュメントのサイレント一括印刷ロジックを解説しました。

VBScriptは、専用の開発環境をインストールしなくても、メモ帳一つでWindowsの心臓部に直接アクセスできる非常にパワフルな言語です。「画面の操作を自動化する」から「OSの仕組みを命令する」への視点のシフトができるようになると、あなたの自動化スキルは一気にプロの領域へと引き上げられます。

ここをクリアしたあなたなら、どんな定型業務の自動化も怖くありません。
明日からの業務効率化に、ぜひこの知見を役立ててくださいね。それでは、次の自動化の旅でお会いしましょう!

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