ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

お世話になります。

現在、複数のファイルを指定し、一括で印刷をする処理をVBで作成しています。

●問題
印刷される順番には意味があり、要求順に出力してほしいのですが、VB側でかけている印刷要求の順番と、プリンタのジョブにたまる順番が違う。

ループ内で1ファイル単位で印刷要求をかけているので、VB側は問題ないと思うのですが、原因がわかりません。
(ちなみにブレイクポイントをおき、1枚1枚印刷されるのを確認しながら行うと正常に印刷されます。)
また、Sleep関数を使用し10秒待ちを入れても出力順が変わってきます。

問題解決のきっかけになれば幸いです。
宜しくお願い致します。

---- 環境 ----
Windows2000
VB6.0

プリンタ xerox - DocuCentre607CP

このQ&Aに関連する最新のQ&A

A 回答 (4件)

多分スプーラーで


印刷量が多いと後回しにされます

プリンターのプロパティの
詳細設定のタブで
スプールされたドキュメントを最初に印刷するが
チェックされていますか?

この回答への補足

チェックされています。

推測ですが、VBから印刷要求を出してからプリンタのジョブに並ぶ前に順番が入れ替わってしまっていると思います。

プリンタのジョブに並んでいる時点で順番がおかしいので。

やはり、印刷出力されたのを確認してから、次の印刷要求をかけなければならないのでしょうか?

補足日時:2004/11/16 16:19
    • good
    • 1

ShellExecute()ではだめですね。


印刷するものがどんなもんだかわかりませんが、出力させるアプリの作りによって順番が狂っても不思議ではありません。

なので、確実に印刷が終わってから次のファイルを印刷するようにする必要があります。

ShellExecuteEx()で印刷アプリを起動し、取得したプロセスハンドルを使用してWaitForSingleObject()で起動した印刷アプリが終了するまで次の印刷を行わないようにするのがいいかと。
    • good
    • 0
この回答へのお礼

ご意見ありがとうございます。

その方法も考えました。(まだ試してないですけど。)

今XEROXの方に何が問題なのか聞いている段階です。
今回の場合、印刷速度を重視しているので、XEROXの解答で対応出来ないようであればそちらを試したいと思います。

お礼日時:2004/11/10 10:07

それはヘンですね。


私はそのような現象に陥ったことはありません。

帳票ツールは何を使用しているのでしょうか?
あるいは、VBのPrinterオブジェクトにより出力しているのでしょうか?

また、後者の場合、EndDocメソッドの発行は適切な順番で行われてますか?

それでもダメな場合は、出力した後にDoEvents関数を挿入してみてはいかがでしょうか?
「確認しながら行うと」というのが「メッセージボックスを出力しOKボタンを押すと」ということでしたら、Windowsに制御が渡ってないことが原因かもしれませんので試してみてください。

この回答への補足

'実行する操作を指定
srtOperation = "print"

'ファイル名を指定
strFileName = ファイルパス

'デフォルトディレクトリを指定
strDefaultDirectory = ""

lngExecutableHInstance = _
ShellExecute(Me.hwnd, _
srtOperation, _
strFileName, _
vbNullString, _
strDefaultDirectory, _
SW_SHOWNORMAL)

上記の処理で印刷要求をかけています。

DoEvents関数ではダメでした。

補足日時:2004/11/09 13:13
    • good
    • 0

こんにちは。



プリンターをポーリングして、印刷終了後に次のJOBを出すのはダメですか?
JOBをスプールする必要がなければ・・・ですが。
(^^ゞ
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPDFファイルを順番通りに印刷するためには?

100個くらいのPDFファイルを一度に印刷するためにはどうしたらよいのでしょうか?
Acrobat ProfessionalにはExplorer上でファイルを選択することで複数ファイルを印刷する機能はあるのですが、これはなぜか順番がめちゃくちゃになって印刷されます。
一度一つのPDFファイルに結合してから印刷するという方法はありますが非常に時間も負荷もかかってしまいます。
もっと手軽に出来る方法があれば教えて下さい。

Aベストアンサー

こんにちは
ちょっと古いですが過去log
http://q.hatena.ne.jp/1147713104
が参考にならないですか。

では。

Qプリンタに200~1000くらい印刷ジョブを送ると印刷順が狂う

仕事上A4サイズの1枚書類を月末に一度に200~1000枚程印刷しています。この印刷は枚数分印刷ジョブがプリンタに渡され印刷される事になります。印刷順番がとても大切なのに、大量の印刷ジョブが送られると印刷順番が狂ってしまう場合があるのです。どの位の印刷ジョブで印刷順番が狂うのかも時と場合によってで状況発生する場合としない場合があり振りまわされ状態です。プリンタエラーになる訳でもないので数百枚の印刷物の印刷頁を毎回確認しなければならない状況です。どなたか印刷物の順番が混乱しないようなソフトコントロールとかあったら教えて下さい。印刷ジョブをプリンタに流す側のプログラムを作成しているのでソフト面での対処か、ハード設定面での対処があれば助かります。

Aベストアンサー

プリンタとデータサーバはローカル接続ですか?ネットワーク接続ですか?
また、Windows用のプリンタドライバを使用しての印刷でしょうか?直接プリンタ言語で印刷していますか?
また、枚数分印刷ジョブが渡されるということは、200ページ印刷すると200ジョブになる(1ジョブ200ページではない)ということですね?
アプリ-ドライバ-接続形態-プリンタハードのどこに問題があるのか一カ所ごとにためしくしかありません。
プリンタメーカと協力して調査していくのがベストだと思われます。

プリンタドライバを使用している場合で、印刷するPCのHDD空きに問題がなければドライバ内の印刷後ドキュメントを残すにチェックを入れ印刷します。(ジョブは印刷時刻でソートがかかるので日にちをまたがない印刷で検証のこと)
印刷の紙結果とドキュメント名を付け合わせます。ドキュメント名のならびは正しく紙出力に誤りがあれば、ドライバ・アプリの問題ではありません。が、プリンタハードか通信形態(接続形態)か判別がつきませんので、たまっているドキュメントをドライバから再印刷かけます。同一現象であれば、できたら接続形態をかえて(lanだったらパラレルなどのローカル接続にかえる)試してみてください。

データが1ジョブで200ページ分の場合は、たまっているドキュメントをドライバのポートをfileにかえ、prnファイルにして直接プリンタにcopyコマンドなどを使って転送し、データに問題があるのか切り分けすることも可能です。

ドライバにわたる時点でデータが並び代わっている場合はアプリ側の問題の可能性が高くなります。(プリンタハードではない)

もしネットワーク接続上の問題に絞り込みができればネットワークパケットをとって再度組み立て直しデータ送信に誤りがないかを確認します。これは非常に時間と労力とお金がかかるので最終手段です。(ものすごく大変です)

経験上、不定期にでる場合はアプリ側かネットワーク上の問題であることが多いようです。原因に行き着くまでに短くても数ヶ月、ながいケースですと一年かかる場合もあります。MS系のアプリの場合は関連メーカを巻き込んでMSへ調査依頼していく方法が早いようです。

プリンタとデータサーバはローカル接続ですか?ネットワーク接続ですか?
また、Windows用のプリンタドライバを使用しての印刷でしょうか?直接プリンタ言語で印刷していますか?
また、枚数分印刷ジョブが渡されるということは、200ページ印刷すると200ジョブになる(1ジョブ200ページではない)ということですね?
アプリ-ドライバ-接続形態-プリンタハードのどこに問題があるのか一カ所ごとにためしくしかありません。
プリンタメーカと協力して調査していくのがベストだと思われます。

プリンタド...続きを読む

Q印刷の順序が逆になる

2ページ分を印刷すると、2ページ、1ページの順に印刷される

※OKWaveより補足:「キヤノン製品」についての質問です。

Aベストアンサー

逆順印刷機能ですかね。

http://blog.goo.ne.jp/rikopinpinpin/e/9a23ef65bde50f0ab0620164634659c3

QPDFファイルを開き、印刷し、閉じるマクロ

Excel 2003 VBAにて、
PDFファイルを開き、印刷し、閉じるマクロを作りたいと思っています。

Dim AA, AAA

AA = "C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe C:\Scan\20131101160734050_001.pdf"
AAA = Shell(AA, vbNormalFocus)

にて、PDFファイルを開くことは出来ました。
このPDFファイルを、「印刷し、閉じる」ためには、
このPDFファイルを指定する必要があると思いますが、
その構文が判りません。
知っている方、教えて下さい。

Aベストアンサー

#3です。
WShell.Execを使うと閉じる事ができる様ですが、色々と気難しくて苦労しました。
まず、なぜかAdobe Reader/Acrobatのフルパスを与えないと、ファイルがみつからないとゴネます。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test()
printPdf2 GetDesktopPath & "\test.pdf", "DocuWorks Printer", "DocuWorks Printer Driver"
' printPdf2 GetDesktopPath & "\test.pdf"
End Sub

Sub printPdf2(pdfDocument As String, Optional printerName As Variant, Optional printerDriver As Variant)
Dim cmdLine As String
Dim WShell As Object
Dim oExec As Object
'ここは調整の必要がありそう
Const waitTime As Long = 1000
'Windows7 Home 64bitの場合です
Const pgmFullPath As String = "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe"

Set WShell = CreateObject("WScript.Shell")
If IsMissing(printerName) Or IsMissing(printerDriver) Then
cmdLine = "pgmFullPath /n /s /o /h /t ""pdfFullPath"""
cmdLine = Replace(cmdLine, "pgmFullPath", pgmFullPath)
cmdLine = Replace(cmdLine, "pdfFullPath", pdfDocument)
Else
cmdLine = "pgmFullPath /n /s /o /h /t ""pdfFullPath"" ""printerName"" ""printerDriver"""
cmdLine = Replace(cmdLine, "pgmFullPath", pgmFullPath)
cmdLine = Replace(cmdLine, "pdfFullPath", pdfDocument)
cmdLine = Replace(cmdLine, "printerName", printerName)
cmdLine = Replace(cmdLine, "printeDriver", printerDriver)
End If
Debug.Print cmdLine
Set oExec = WShell.exec(cmdLine)
Sleep waitTime
'Windows7Home/64bit環境ではここで実行時エラーが出るので無理矢理先に進めていますが
'Adobe Readerは閉じられる様です
On Error Resume Next
oExec.Terminate
Set WShell = Nothing
End Sub

Private Function GetDesktopPath() As String
Dim wScriptHost As Object, strInitDir As String
Set wScriptHost = CreateObject("Wscript.Shell")
GetDesktopPath = wScriptHost.SpecialFolders("Desktop")
Set wScriptHost = Nothing
End Function

Terminateで原因不明のエラーが出るのでWebを漁っいて下記をみつけました。64bit環境でエラーが出るのはこれも関係しているのでしょうか?少々無理をしている様なので、ご使用時はご注意下さい。
Terminate メソッドは最後の手段としてのみ使用します。これは、アプリケーションによっては適切にクリーンアップできない場合があるためです。通常は、プロセスを途中で中断せず、プロセス自身で実行を終了させるようにします。Terminate メソッドは WM_CLOSE メッセージを使ってプロセスを終了しようとします。これで終了できない場合は、通常のシャットダウン手順を実行せずに、プロセスを強制終了します。
http://msdn.microsoft.com/ja-jp/library/cc364387.aspx

#3です。
WShell.Execを使うと閉じる事ができる様ですが、色々と気難しくて苦労しました。
まず、なぜかAdobe Reader/Acrobatのフルパスを与えないと、ファイルがみつからないとゴネます。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test()
printPdf2 GetDesktopPath & "\test.pdf", "DocuWorks Printer", "DocuWorks Printer Driver"
' printPdf2 GetDesktopPath & "\test.pdf"
End Sub

Sub printPdf2(pdfDocument As String, Optional printerName As Variant, Optional prin...続きを読む

Qプリンタのスプール設定について

プリンタのプロパティで[詳細設定]というタグの中に

・印刷ドキュメントをスプールし、プログラムの印刷処理を高速に行う

とありますが、標準設定ではスプールする様になってます。印刷時の問題により「プリンタに直接印刷データを送る」に設定変更していますがこの場合なにか問題(スプール設定でなければいけないような)があるのでしょうか?

注意しなければならないことなどありましたら教えてください。
よろしくお願いします。

Aベストアンサー

スプールのメリットとはプリンタに集中しがちな処理をPC側に分散させることにあります。
またプリンタよりはPCの方が汎用性が高いため、例えば全然使わないオンボロマシンをプリンタサーバーとしてのみ活用するというような使い方もできますし。
もちろん少々集中したところでガンガン処理ができる高級プリンタでしたら別にスプールなんてする必要はありません。逆にさせない方が処理は早くなると思います。ただ高級プリンタよりはオンボロマシンを活用させる方が費用対効果は著しいですよね。

ということでまぁ環境次第ですが、プリンタが低機能、印刷量の割にプリンタの数が少ない、あるいは印刷ジョブが溜まるような運用形態ということであるならスプールを使った方がより効率的に・エラーも少なく印刷が出来るかと思います。
逆でしたらどっちでも良い問題ですが、直接送りでの方が多少印刷が早く終わるかもしれません。

QVBAで印刷スプール終了の判定をする

Excel97からWord98を操作して、Wordを連続印刷した後にWordを自動的に保存せず
に終了するようなマクロを組もうと考えています。しかし、Wordのスプール処理に時間が
かかる為、スプールしている間に印刷処理のマクロを抜けて終了処理のマクロを実行して
しまい、スプール処理の終わっていないデータが全て破棄されるという事態に
陥ってしまいました。ここでプリンタのスプール処理が終わったことを判定
出来れば、それを検知してからWordの終了処理を実行すれば、全て上手くいく
のです。環境はプリンタがLANで接続されているPCを使っています。
(あまり良く分かりません)
すみませんが、どなたか教えて下さい!

Aベストアンサー

"バックグラウンドで印刷する"をoffにすればよい
PrintBackgroundプロパティ参照

参考URL:http://www.microsoft.com/JAPAN/developer/library/off2000/vbawrd/woproPrintBackground.htm

Q複数のワード書類を一括印刷するときの印刷順

winXP Proの環境です。
フォルダ内のワード書類を複数選択して右クリック→印刷、で複数書類の一斉印刷ができるのですが、
この印刷される順番の法則性が分からないので教えてください。
ファイル名の若い順でもないし、選択された順でもないようなのですが‥

Aベストアンサー

XP Personalの環境です。
私もよく複数印刷をするのですが、「並べ替え」を「名前」の順にして印刷するとその順の通りに印刷できます。

QPDFファイルを開かずに印刷したい

幾つものPDFファイルを印刷したいのですが、
できればAdobeReaderを起動させずに印刷したいです。

ファイルのアイコン上で右クリック→印刷でも可能ですが、
数が多くなると、この作業も大変です。
そこでVisualBasic2008ExpressEditionを使って、
簡単なシステムを作りたいと考えています。

しかし、PDFを開かずに印刷する方法が、どうしてもわかりません。
ネット検索、教えてgoo内の検索でもヒットせず途方に暮れています。
参考になるホームページや書籍がありましたら教えてください。
「こんな手法があるよ」というものでも構いません。

宜しくお願いします。

Aベストアンサー

PDFを開く際にACRORD32.exeに対して以下のコマンドラインを指定してください。

ACRORD32.EXE /s /l /p /h [PDFのパス]

コマンドラインの解説は参照URLを。

参考URL:http://scripting.cocolog-nifty.com/blog/2007/07/adobe_reader_81_e41e.html

QvbaでPDFファイルが印刷されない

エクセルのA列に「フォルダ場所+ファイル名.pdf」のリストを作成し、
PDFファイルを開き、印刷し、閉じるマクロを作成しましたが、全く印刷されません。
エラーが出て止まることなく、次々進んでいるのですが、肝心の印刷が実行されていません。

ネット検索で見つけたものをアレンジしたのですが、高度すぎて苦戦しています。
エクセルシートの内容は、
セルA2~には、フォルダ場所+ファイル名.pdf  例)C:\work\test1.pdf
C2には印刷実行数(ファイルの数)
を置いています。

どなたかご存知の方いらっしゃいましたら、どうか教えてください。
よろしくお願いいたします。

----------------------------------------------------

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub PDF()

Dim AA, BB, CC, DD
Dim AAA, BBB
Dim i As Long

For i = 1 To Range("C2").Value


AA = "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe /t "
BB = Range("A" & i + 1).Value
CC = Application.ActivePrinter
DD = AA & """" & BB & """" & " " & """" & CC & """"
Debug.Print DD
Set AAA = CreateObject("WScript.Shell")
Set BBB = AAA.exec(DD)
Sleep 1000
On Error Resume Next
BBB.Terminate
Set BBB = Nothing
Set AAA = Nothing

Next i

End Sub

エクセルのA列に「フォルダ場所+ファイル名.pdf」のリストを作成し、
PDFファイルを開き、印刷し、閉じるマクロを作成しましたが、全く印刷されません。
エラーが出て止まることなく、次々進んでいるのですが、肝心の印刷が実行されていません。

ネット検索で見つけたものをアレンジしたのですが、高度すぎて苦戦しています。
エクセルシートの内容は、
セルA2~には、フォルダ場所+ファイル名.pdf  例)C:\work\test1.pdf
C2には印刷実行数(ファイルの数)
を置いています。

どなたかご存知の方いらっしゃい...続きを読む

Aベストアンサー

yon56です。

私の参照設定と同じにしてみて下さい。

Visual Basic For Applications
Microsoft Excel 11.0 Object Library
OLE Automation
Microsoft Office 11.0 Object Library
Microsoft Forms 2.0 Object Library
Windows Script Host Object Model

残りの点として、
マクロのプリンターの名称をApplication.ActivePrinterとしないで、
プリンタとFAXに表示されたプリンターの名前をコピー貼付してみて下さい。

Application.ActivePrinterが正しく機能していないこともあります。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング