いつもお世話になっております。
開発環境は
・Windows XP
・VB6.0(SP6)
・Adobe Acrobat 6.0 Standard
です。
Excelファイルを [Adobe PS プリンタ] を使用しPSファイルへ変換する処理を作っております。
変換に失敗した場合に、変換をキャンセル(ジョブ削除)する方法がわかりません。
手順としては
①[Adobe PS プリンタドライバ] を使用してExcelファイルをPSファイルに変換。
'(1)excelオープン
Set objBook = objExcel.Workbooks.Open(sPath)
'(2)psファイル出力
Call objBook.Sheets.PrintOut(PrintToFile:=True, PrToFileName:=sPsPath)
'(3)excelをcloseする
objBook.Close
②PrintOutの結果を取得。
③PrintOutの結果がエラーの場合、印刷をキャンセル(ジョブ削除)
と処理を行いたいのですが、②と③の印刷結果を取得しキャンセルする方法が分かりません。
ご存じの方がおいででしたら、ご教授お願い致します。
いつもお世話になっております。
監視アプリを別途作成し、試行錯誤のうえ解決しました。
以下は、サンプル的に作ったソースの一部です。
【ファイル変換実行】
Public Sub PS()
①[Adobe PS プリンタドライバ] を使用してExcelファイルをPSファイルに変換。
'(1)excelオープン
Set objBook = objExcel.Workbooks.Open(sPath)
'(2)監視アプリを起動
Call Shell("PsJobWatch.exe") … 監視アプリの①
'(3)psファイル出力
On Error Resume Next
Call objBook.Sheets.PrintOut(PrintToFile:=True, PrToFileName:=sPsPath)
'(4)excelをcloseする
objBook.Close
If (Err.Number = 1044) Then
MsgBox "Error"
End If
End Sub
------------------------------------------------------------
【監視アプリ】
Public Sub Main()
①監視タイマー開始
sFileName = Replace(Command$(), Chr$(34), "")
Form.Hide
JobWatch.Interval = 10 '※0.01秒間隔でJobを監視する
End Sub
Private Sub JobWatch_Timer()
Dim lPrinterRet As Long ' プリンタ処理結果
Dim lPrinterHandle As Long ' プリンタオブジェクトのハンドル
Dim lNeeded As Long ' 印刷ジョブ数
Dim lReturned As Long ' 印刷ジョブ数
Dim bytJob() As Byte ' 印刷ジョブ格納領域
Dim rJobInfo1() As JOB_INFO_1 ' 印刷ジョブ格納領域
Dim i As Long ' カウンタ
①PSプリンタをオープン
lPrinterRet = OpenPrinter(Printer.DeviceName, lPrinterHandle, 0&)
lPrinterRet = EnumJobs(lPrinterHandle, 0&, &HFFFFFFFF, 1&, ByVal 0&, 0&, lNeeded, lReturned)
If (lNeeded = 0&) Then
Call ClosePrinter(lPrinterHandle)
GoTo LABexit
End If
②ジョブ取得
ReDim bytJob(lNeeded - 1)
lPrinterRet = EnumJobs(lPrinterHandle, 0, &HFFFFFFFF, 1, bytJob(0), lNeeded, lNeeded, lReturned)
If (lReturned = 0) Then
Call ClosePrinter(lPrinterHandle)
GoTo LABexit
End If
ReDim rJobInfo1(lReturned - 1)
For i = 0 To (lReturned - 1)
'// 指定されたドキュメントのジョブ状態を判定する
Call MoveMemory(rJobInfo1(i), bytJob(Len(rJobInfo1(0)) * i), Len(rJobInfo1(0)))
③ジョブが指定されたファイルの場合、ステータスを確認する
エラーの場合、ジョブをキャンセルする。
ジョブをキャンセルする事で、【ファイル変換実行 - (4)】に処理が遷移される。
If (Trim$(fFConvert_Ptr_Str(rJobInfo1(i).pDocument, 64)) = sFileName) Then
Select Case rJobInfo1(i).Status
' [ステータス:スプール中・印刷中(PS変換中)]
Case JOB_STATUS_SPOOLING, JOB_STATUS_PRINTING
'※監視処理続行
Call ClosePrinter(lPrinterHandle)
Exit For
' [ステータス:完了(PS変換が正常に終了)]
Case JOB_STATUS_PRINTED + JOB_STATUS_DELETING
'// 監視処理を終了する
Call ClosePrinter(lPrinterHandle)
Exit For
' [ステータス:上記以外]
Case Else
'// ジョブをキャンセルする
lPrinterRet = SetJob(lPrinterHandle, rJobInfo1(i).JobId, 0&, ByVal 0&, JOB_CONTROL_CANCEL)
'// 監視処理を終了する
JobWatch.Interval = 0
Call ClosePrinter(lPrinterHandle)
Exit For
End Select
End If
Next i
End Sub
第一歩進んだといった状況です。
もう少し工夫をして完成していきたいと思います。
ありがとうございました。
ツイート | ![]() |