[[20170724094254]] 『VBA リストの順番通りにPDFを印刷する』(ひでと) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA リストの順番通りにPDFを印刷する』(ひでと)

印刷リストがあります。
D2にパス名
C3〜C43までに印刷枚数
D3〜D43までに印刷するPDFの名前
を入れています。

 A B C   D        E
1
2   枚数 C:\Users\あああ
3    9  AAA.PDF
4    2  BBB.PDF
5    5  CCC.PDF
6    7  DDD.PDF

リストの順番通りに印刷していってほしいのに、ぐちゃぐちゃに
印刷されてしまいます。
先日アドバイスを頂いたものに、色々見て自分で付け足しのですが、
これだと一回一回Acrobatreaderを 手動で閉じないと、
次に進まないのです。
どうしたものでしょう…見て頂けないでしょうか。
宜しくお願いいたします。

Sub 印刷2()
Dim i As Integer
Dim j As Integer
Dim strshellcommand As String
Dim obJWSH As Object
PrinterName = Application.ActivePrinter
For j = 3 To 43

    Filename = Range("D2") & "\" & Range("D" & j)
    If Range("C" & j).Value >= 0 Then
        For i = 1 To Range("C" & j)
            strshellcommand = "AcroRd32.exe /t " & Filename
            Set obJWSH = CreateObject("WScript.Shell")
            obJWSH.Run strshellcommand, vbNormalFocus, True
            Set obJWSH = Nothing
        Next i
    End If
Next
End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


軽く調べてみましたがダイアログボックスを表示せずに印刷する/tを用いるには引数が足りないかもしれません。よく知らないんで適当ですが・・・

AcroRd32.exe /t path printername drivername portname

path : ファイルパス
printername : プリンタ名
drivername : プリンタドライバ名
portname : プリンタポート名

順番に関しても一応調べてみます。
私が調べている間に誰か優秀な方が回答してくれることを祈ります。
(チック) 2017/07/24(月) 10:23


 横から失礼します。

 根本的な解決方法ではないですが、コマンドラインから操作できる「pdftk」というツールがあります。

 PDFの結合が出来ますので、エクセルvbaからコマンドラインを使用し、pdfファイルを指定の順番で
 結合、そのあと、出来たpdfを印刷、とします。

 他に方法がなかった場合の最後の手段として検討してみてください。
(カリーニン) 2017/07/24(月) 10:32

/tに関してですが、新規起動でなければ終了してくれるとのことです。
あらかじめループに入る前に空のAcrobatを起動しておいて印刷が終わったら終了するって感じのコードにすればいいかもしれません。

順番はよくわかりませんねぇ。バッチファイルとかでやってるの見る限りこの方法なら順次印刷されそうですけど・・・サイズとかで勝手に順番変えちゃうのかな。もう少し調べてみます。
(チック) 2017/07/24(月) 10:46


印刷と印刷の間にSleepなどで時間を稼ぐ
(mm) 2017/07/24(月) 11:10

チック様
ありがとうございます。
すみません。前に質問したものをコピペしたので誤りがありました。
先日質問して回答頂いたコードがあって、それだと
順番がめちゃくちゃになったので自分で色々付け足して、今回質問した
コードをつくりました。でもこれだと、順番はリスト通りなのですが
一回一回Acrobatreaderを手動で閉じないと、次に進まないので
チック様がおっしゃる通り、ループに入る前にAcrobatを起動して
印刷が終わったら終了するようにしてみようと思います。

カリーニン様、mm様もありがとうございます。
うまくできなかったら、参考にさせていただきます。
(ひでと) 2017/07/24(月) 15:58


チック様

先にACROBATを起動して印刷したら、一回一回手動で閉じなくて
よくなりましたが、順番はばらばらです…
AAAが1枚印刷され、BBBが1枚印刷され、またAAAが1枚印刷され
といった感じです。

どうすればいいでしょうか<m(__)m>
(ひでと) 2017/07/24(月) 18:15


 (mm)さん 2017/07/24(月) 11:10がよいアドバイスされてるのに、なぜ試さないのですか?
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'←プロシージャの外

    Sub test()
        Dim i As Long
        For i = 1 To 10
            '印刷命令
            Sleep 3000 '←これを入れるだけ
        Next i
    End Sub

(稲葉) 2017/07/24(月) 18:45


 気になったので調べてみましたが、同じ現象で悩んでいる人いるみたいですね。

https://forums.adobe.com/thread/406574

 その中で試して効果がありそうなのが
https://support.microsoft.com/ja-jp/help/891594

 「スプールされたドキュメントを最初に印刷する」のチェックをはずしたり

https://answers.microsoft.com/ja-jp/windows/forum/windows_7-hardware/windows7%E3%81%A7%E3%82%B9%E3%83%97%E3%83%BC/8310ee59-b57d-4388-b542-822d391b41bc

 「プリンタへ直接印刷データを送信する」
 を試してみてはどうでしょうか?
(稲葉) 2017/07/24(月) 19:21

稲葉様

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'←プロシージャの外
を入れて、 Sleep 3000をいれましたが、コンパイルエラーがでました。

プリンタの諸々も試してみましたが、やっぱりダメでした…

そこで、SLEEPの代わりに

WaitSec = 3

    Application.Wait (DateAdd("s", WaitSec, Now))

をNEXT iの前に入れて、とりあえず順番通りに印刷できるようになりました。
色々とアドバイス、ありがとうございました。

(ひでと) 2017/07/25(火) 12:32


 >Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'←プロシージャの外 
 >を入れて、 Sleep 3000をいれましたが、コンパイルエラーがでました。 

 標準モジュールに記述しましたか?
 ThisWorkbookモジュールやユーザーフォームに記述してませんか?
(カリーニン) 2017/07/25(火) 21:37

 参考HPです。

http://officetanaka.net/excel/vba/beginner/10.htm
(カリーニン) 2017/07/25(火) 21:40


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.