こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

vbaを使ってエクセルリストからPDFを印刷する

エクセルシートA列に"ファイル場所+ファイル名.pdf"を合体させたリストを作成しました。
リストの上から順にPDFファイルを開き印刷するコードを作成しました。
印刷はされますが、リストの順番に印刷されず、ものすごくランダムに印刷されてしまいます。

このエラーについて、
「次々に実行させるから、ファイルの容量順に印刷されてしまうのでは?
PDFを開いて、一旦閉じるコードを入れればよいのでは?」
というアドバイスをもらいましたが、どう対応したらよいか分かりません。

他に考えられる原因があるかもしれません。
教えて下さい。よろしくお願いします



Dim i As Long

'セルC2に繰り返し数(ファイルの数)が入力されています
For i = 1 To Range("C2").Value

'セルB**に印刷フラグを立て、「空欄」なら印刷、「1」なら印刷しないとしています

'印刷フラグ「空欄」は印刷実行
If Cells(i + 1, 2).Value = "" Then

PrinterName = Application.ActivePrinter
fileName = Range("A" & i + 1).Value
Set myShell = CreateObject("WScript.Shell")
myShell.Run ("AcroRd32.exe /t " & fileName)

'印刷フラグ「1」は印刷しない
ElseIf Cells(i + 1, 2).Value = "1" Then

End If

Next i

End Sub

投稿日時 - 2013-12-11 13:58:17

QNo.8382099

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

Shellで起動させたアプリケーションを終了させる方法は以下のQ&Aを参考にしてください
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1412627229

あと

オブジェクトの開放が入っていないので、ループに中で

Set myShell = CreateObject("WScript.Shell")

するのでしたら

Next i

の前で

Set myShell = Nothing

をしてください。(開放せずに次々とオブジェクトを作成して印刷しているので、ランダムに印刷されてるのかもしれません)

ループ内で毎回SetせずにFor文より前で

Set myShell = CreateObject("WScript.Shell")

を指定して

End Subの前で

Set myShell = Nothing

したほうがいい感じはしますが…。

また、

myShell.Run ("AcroRd32.exe /t " & fileName)

の後に、3秒ほど待ち時間を入れてみたらいかがでしょう。

Application.Wait Now() + "0:00:03"


あと

ElseIf Cells(i + 1, 2).Value = "1" Then

は、いらないでしょう。

投稿日時 - 2013-12-11 15:36:22

お礼

kmetuさま

早々に回答くだり、ありがとうございます。
お礼が遅くなって申し訳ありません。

アプリケーションを終了させる方法を参考にしながら、
その他の箇所を直している最中ですが、時間がなくなってしまい、
完成までもう少し時間がかかりそうです。。。。

またこちらでご報告いたします。
先ずは取り急ぎお礼まで。

投稿日時 - 2013-12-16 17:49:44

あなたにオススメの質問