お世話になります。

現在、複数のファイルを指定し、一括で印刷をする処理を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
    • 0

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と関連する良く見られている質問

QVBからの印刷でページが順番に印刷されません。

VBからPrinterオブジェクトを使用して複数ページを印刷しています。

Printer.print "1ページ目"
Printer.EndDoc
Printer.print "2ページ目"
Printer.EndDoc
Printer.print "3ページ目"
Printer.EndDoc

のように命令を実行すると、1,2,3の順に印刷されず、1,3,2の順に印刷されます。(いつもではありません)

おそらくプリンタのプロパティのスプール周りの設定によってこのようになるのかなと思っているのですが、確実に印刷命令を発行した順番に紙が排出されるようにするにはどのようにしたらよいでしょうか?

Aベストアンサー

NewPage は印刷を開始しないはずですね。

おっしゃるような条件では #1 の方法はだめですね。

私だったら

WINAPI を使用して、プリンタの状態を見ながら順番に印刷する方法

を試してみます。

あるいは数ページずつまとめて印刷かな。

それでもだめなら C で DLL を作って VB から呼び出すかな。

参考URL:http://www.winapi-database.com/Graphics/Printer/GetJob.html

QVBでのプリンタのテスト印刷処理について

プリンタを接続したときに、プリンタのテスト印刷が出力されますが、VBの処理のなかで処理させたいのですが、テスト印刷と同じように印字させたいのですが、
プリンタの名称を取得はできたのですが、それ以外に情報を印刷したいのですが、方法がわかりません。よろしくお願いします。

Aベストアンサー

テストページ印刷の件で#1の方の補足ですが。

http://www.vbvbvb.com/jp/gtips/1001/gSHInvokePrinterCommandPrintactionTestpage.html

うまくリンクで飛ばなかったら「1031」で検索してみてください。

QVB6でのネットワークプリンタ(OS:WInXP)に対する印刷

ご存じの方がおられましたら教えていただきたいのですが・・・

当方、VB6(SP6)でアプリを作成し印刷機能も作りました。
以前はWin2000からプリンタサーバー(Win2000につながっているプリンタ)に対してネットワーク印刷を行っていました。APIを使用して用紙方向等変更できてました。簡単な処理の流れとしては、
(1)現在選択されているプリンタの情報を取得し記憶しておく。
(2)用紙方向等の変更
(3)印刷
(4)記憶しておいた内容にプリンタを戻す
と言う具合です。
ところが、社内環境がかわり、WinXPからプリンタサーバー(WinXPにつながったプリンタ)に対して上記の処理を行うとエラーが出力されます。
調べたところ、始めにOpenPrinter関数を呼んでいるのですがこの時点で戻り値が0(関数が失敗)が帰ってきています。
ソースは以下のような感じです(一部抜粋)

' 標準的な権利を要求することを示す定数の宣言
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
' プリンタアクセス権の管理者権限を示す定数の宣言
Public Const PRINTER_ACCESS_ADMINISTER = &H4&
' プリンタアクセス権のユーザー権限を示す定数の宣言
Public Const PRINTER_ACCESS_USE = &H8&
' プリンタアクセス権すべての権限を示す定数の宣言
Public Const PRINTER_ALL_ACCESS = _
(STANDARD_RIGHTS_REQUIRED Or _
PRINTER_ACCESS_ADMINISTER Or _
PRINTER_ACCESS_USE)

' プリンタのオブジェクトハンドルを取得する関数の宣言
Declare Function OpenPrinter Lib "winspool.drv" _
Alias "OpenPrinterA" _
(ByVal pPrinterName As String, _
phPrinter As Long, _
pDefault As Any) As Long
'****************************************************
'↓処理
' プリンタ名を指定
strPrinterDeviceName = Printer.DeviceName

' プリンタアクセス権を指定
With udtPrinterDefaults
.DesiredAccess = PRINTER_ALL_ACCESS
End With

' プリンタのオブジェクトハンドルを取得
lngWin32apiResultCode = OpenPrinter(strPrinterDeviceName, lngPrinterHandle, udtPrinterDefaults)

この変数の戻り値が0

試しに色々やってみました。

(1)WinXPからプリンタサーバー(OS:WinXP)  ×
(2)WinXPからプリンタサーバー(OS:Win2000)  ○
(3)プリンタサーバー(OS:WinXP)にアプリを ○
インストール後印刷
※ローカルプリンタに対する印刷


うまくいかないのはプリンタサーバーがWinXPの時のみエラーが
出てしまうようです。

宜しくお願いします。

ご存じの方がおられましたら教えていただきたいのですが・・・

当方、VB6(SP6)でアプリを作成し印刷機能も作りました。
以前はWin2000からプリンタサーバー(Win2000につながっているプリンタ)に対してネットワーク印刷を行っていました。APIを使用して用紙方向等変更できてました。簡単な処理の流れとしては、
(1)現在選択されているプリンタの情報を取得し記憶しておく。
(2)用紙方向等の変更
(3)印刷
(4)記憶しておいた内容にプリンタを戻す
と言う具合です。
ところが、社内環境がかわり、WinXPか...続きを読む

Aベストアンサー

先日xpのsp2でファイアウォールを開放していなかったために
共有(していると思った)フォルダにアクセスできなかった
素人のばか者ですので、アイディアがあるわけではないですが
 
xpのバージョンと
ファイルを共有させたり、
ファイアウォールを開放したり、
ウィルスソフトが邪魔をしないようにしたり、

その類のことでやったこと、
やっていないことを教えていただくことは可能でしょうか?

Qvbから印刷時に、プリンタの厚紙設定をしたい。

出力先プリンタの切り替えや、用紙サイズや向きやトレイなどは設定できたのですが、
用紙の厚さ(普通紙なのか厚紙なのかなど)が設定できません。

どうしたらできるのでしょうか?

おそらく、厚紙設定は、そのプリンタ固有の情報なのでvbに用意されている一般的なプロパティでは対応できず、そのプリンタのドライバとのやり取りが必要なのかな?となんとなく想像していますが、ネットで調べても、なかなか答えに結びつきません。

分かる方、お願いします。

Aベストアンサー

プリンタメーカーに問い合わせるとか。

例えばリコーさんはパートナー契約を結ぶとプリンタドライバAPIの仕様を提供してくれるようです。
http://www.ricoh.co.jp/operius/partner/program.html

QVB6からエクセルの印刷機能を使って印刷する方法

ご存じの方ご教示願います。

やりたいことは、VB6で画面のハードコピーをBMPで保存し、そのBMPをエクセルで印刷したいのですが・・・

ただ、VB6のボタン一つで画像保存→エクセル起動→BMPロードまでを行いたいのです。

当方、BMP保存、エクセル起動までは行えるのですが、BMPのロード方法がわかりません。宜しくお願いします。

Aベストアンサー

Excelで「マクロの記録」を使い、ファイルから図を挿入する時のコードを参照すればよいでしょう。
【例】
ワークシート.Pictures.Insert("C:\hoge.bmp")


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

このカテゴリの人気Q&Aランキング

おすすめ情報