2024年3月18日月曜日

VBAからPDFファイルの特定のページを印刷する PDF-Xchange Viewer を使用

 ExcelやAccessのVBAからPDFファイルの特定のページを印刷するためには、一般的には「Acrobat」が必要で、「Acrobat Reader」ではなかなか上手くいかない。

「Acrobat」があっても、結構複雑な処理を書かないとだめ。

そこで、「PDF-Xchange Viewer」に行き着いた。
これは結構前に開発が終了していて、「PDF-Xchange Editer」になっているが、今でも窓の杜からダウンロードすることができた。

EditerではなくてViewerがいい点は、インストールが必要なく、「PDFXCview.exe」だけで動くこと。
EditerはEXE単体では動かない。

Shell "c:\pro****\PDFXCview.exe /print:pages='3-5' 'c:\target.pdf'"

これだけで標準プリンターから指定ページ(例なら3,4,5ページ)を出力して、自動的にViewerを終了する。そもそもバックグラウンドで動くので、終了したかどうかは画面上は不明です。

「pages='1-5'」とすれば1から5ページまでを印刷する。
「pages='3,5,7'」とすれば、3と5と7ページを印刷する。
「pages='1-3,5'」とすれば1から3ページまでと、5ページを印刷する。

まあ想像通りの動作です。

これを一つのプリントキューとして流すので、両面印刷設定済みのプリンターに対して、「pages='1-3,5'」と指定すれば、1枚目の紙の表に1ページ、裏に2ページ、2枚目の紙の表に3ページ、2枚目の紙の裏に5ページを印刷します。

これも想像通りの動作です。

もし、上記の例で、5ページを3枚目の表に印刷したければ、処理を分けて、1-3で1回流して、5ページだけを2回目として流すことになります。

2024年2月1日木曜日

VBA の Keybd_Event のパラメタの件

画面のハードコピー(スクリーンキャプチャ)を撮って、自動で印刷したくて、(画面ハードコピーツール)エクセルのマクロを作ったときにちょっとはまった。

多くの参考Web上では、第2パラメタを「使用しないので、常に0を指定。」としていることが多いのですが、私が参考にしたのはちょっと違いました。

多い解説

Sub 全画面()
    keybd_event &H2C, 0, 0, 0        'Print screen押す
    keybd_event &H2C, 0, 2, 0        'Print screen上げる
End Sub 

Sub アクティブウインドウのみ()
    keybd_event &H12, 0, 0, 0        'ALT押す
    keybd_event &H2C, 0, 0, 0        'Print screen押す
    keybd_event &H2C, 0, 2, 0        'Print screen上げる
    keybd_event &H12C, 0, 2, 0        'Print screen上げる
End Sub 

この第2パラメタを「1」にすれば、「ALT」を押しながら「PrintScreen」=アクティブウインドウのみになります。

Sub アクティブウインドウのみ()
    keybd_event &H2C, 1, 0, 0        'Print screen押す
    keybd_event &H2C, 1, 2, 0        'Print screen上げる
End Sub 

'MSの解説の意訳
keybd_event  bVk, bScan, dwFlags, dwExtraInfo
bVk=仮想キーコード(16進のキーコード)
bScan=キーのハードウェア スキャン コード(意味は不明だが、PrintScreenの時はとりあえず使える。)
dwFlags=関数操作のさまざまな側面を制御します。 このパラメーターには、次の 1 つ以上の値を指定できます(意味は不明だが、「0」を指定すれば、キーを押し下げ、「1」を指定すれば、押している(指定した)キーを放します。)
dwExtraInfo=意味不明かつ使い道不明