お世話になります。

現在、複数のファイルを指定し、一括で印刷をする処理を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ロト6は何通り?

ロト6で1~43までで6個の数字の組み合わせは何通りありますか?またその数式はどうなりますか?
さらに当籤番号で6個の中に同じ数字があることもあるのですか?またロト6は選んだ数字が順番どうりに当たらないとだめなのですか?初心者な質問ですいません。

Aベストアンサー

43個の数字の中から6個を選び出します。
その順番は問いません。

数学でいう、組み合わせの問題になります。

43C6 = 43*42*41*40*39*38/6*5*4*3*2*1
=6096454
約609万通りです。

ちなみに、当選確率は、
1等    1/6096454
2等    6/6096454
3等   216/6096454
4等  9990/6096454
5等 155400/6096454

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

Q6bitのうち、3bitが1になるのは何通りあるでしょうか?

6bitのうち、3bitが1になるのは何通りあるでしょうか?
(6bitなので0-63のうち何通りかです)
例として、
000111
111000
101010
が該当すると思います。
(地道に数えたら20通りありました)

プログラムではなく計算式で出したいです。

さらに一般化して、Xbit中Ybitが立つのは何通りあるか。
も出せると非常に助かります。

よろしくお願い致します。

Aベストアンサー

「0」3つと「1」3つ、あわせて6つの数字の並び替えが何通りあるのか考えると
6!になります。
ただこのなかには同じ並び替えが含まれているので(0と0を入れ替えるなど)
そのぶんを割ります。
どのくらいダブっているのかというと
「0」3つの並び替えの3!
「1」3つの並び替えの3!
あわせて3!x3!です。

よって答えは6!/3!x3!、確かに20です。
6!/3!x3!は6x5x4/3x2x1でもあるのでこれは6C3です。
記号C:コンビネーションについて詳しくはリンク先などを参照ください。

>さらに一般化して、xbit中ybitが立つのは何通りあるか。
同じように考えて xCy です。

参考URL:http://ja.wikipedia.org/wiki/%E7%B5%84%E5%90%88%E3%81%9B_(%E6%95%B0%E5%AD%A6)

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

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

Aベストアンサー

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

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

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

Q30個~50個以内の数字から10個ほど選んで、それらが何通りあり、その

30個~50個以内の数字から10個ほど選んで、それらが何通りあり、その何通りかの全ての数字羅列を表示してくれるフリーソフトってありますか?
あるなら、どんなものか教えて欲しいです。

Aベストアンサー

一般的にはフリーソフトでは無理。

30個~50個以内の数字というから,50個まで考えないといけない。それだと,1.03*10^10通りの組になる。うまく計算ができたとして,ディスプレイに出力するのにどれほどの時間がかかるか。毎秒1万個出力して,12日くらいかかりそうだ。もっと速く出力できるだろうか。30個~50個以内の数字のそれぞれの桁数の指定が無いので,Cなどのプログラムで扱う整数の10桁の数字まで扱うとすれば,1つの組合せは,100桁になる。これだとそんなに速くはできまい。また,これを文字列で扱うと,全部記憶装置に保持すれば,1TB以上必要になる。それくらいのHDDはいまどき珍しくも無いので,これは出来るが,これを読み書きするだけでも50時間くらいはかかるだろう。また,1つの組合せを得たら,すぐに出力して,記憶装置に保持しなければメモリだけで足りるだろうが,1度ディスプレイに表示するだけで,なくなってしまう。これを,印刷しておこうとすれば,軽く1000日は超えるだろうし,紙もA4で,1ページに100個出力すると,1億ページも必要になる。(任意精度演算なら,記憶装置容量はいくらか少なくなるかもしれないが,本質的には変わりない)
せいぜい,最低の2桁までの数字を拾うだけとしても,似たようなものだろう。印刷は別にして,このくらいの量だと全くできないわけでもなさそうだが,ほとんど実用的ではないし,一般的でもない。非常に特殊な目的に使うものなら,ソフトとしての需要は少ないから,フリーソフトで公開する人がいるだろうか。
まして,順列を考えるなら,ディスプレイ出力で1万年,印刷では,100万年以上はかかりそうだ。

自分でつくるか。

一般的にはフリーソフトでは無理。

30個~50個以内の数字というから,50個まで考えないといけない。それだと,1.03*10^10通りの組になる。うまく計算ができたとして,ディスプレイに出力するのにどれほどの時間がかかるか。毎秒1万個出力して,12日くらいかかりそうだ。もっと速く出力できるだろうか。30個~50個以内の数字のそれぞれの桁数の指定が無いので,Cなどのプログラムで扱う整数の10桁の数字まで扱うとすれば,1つの組合せは,100桁になる。これだとそんなに速くはできまい。また,これを文字列で扱う...続きを読む

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のバージョンと
ファイルを共有させたり、
ファイアウォールを開放したり、
ウィルスソフトが邪魔をしないようにしたり、

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

QAAABBCCのカードがある時、4枚選ぶ方法は何通りありますか?

AAABBCCのカードがある時、4枚選ぶ方法は何通りありますか?

Aベストアンサー

同じアルファベットのカードを区別しないとして、
Aが3枚のときは、2通り。
Aが2枚のときは、3通り。
Aが1枚のときは、2通り。
Aが0枚のときは、1通り。

あわせて8通りだけど、、、
式で表すとなると、よくわからない。

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

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

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

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

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

Aベストアンサー

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

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

QQRコード 何通り?

QRコードは、何通りありますか?
よろしくお願いします。

Aベストアンサー

Ano.2です。

http://www.qrcode.com/qrstandard.html
こちらに規格書入手先がありますので、入手して計算してみて下さい。

基本的には、埋め込む文字種・文字数・誤り訂正・バージョン、
あとは種類としてマイクロQRコードと一般のQRコードがあるようです。

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

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

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

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

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

Aベストアンサー

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


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

人気Q&Aランキング