Excel97からWord98を操作して、Wordを連続印刷した後にWordを自動的に保存せず
に終了するようなマクロを組もうと考えています。しかし、Wordのスプール処理に時間が
かかる為、スプールしている間に印刷処理のマクロを抜けて終了処理のマクロを実行して
しまい、スプール処理の終わっていないデータが全て破棄されるという事態に
陥ってしまいました。ここでプリンタのスプール処理が終わったことを判定
出来れば、それを検知してからWordの終了処理を実行すれば、全て上手くいく
のです。環境はプリンタがLANで接続されているPCを使っています。
(あまり良く分かりません)
すみませんが、どなたか教えて下さい!
No.2ベストアンサー
- 回答日時:
"バックグラウンドで印刷する"をoffにすればよい
PrintBackgroundプロパティ参照
参考URL:http://www.microsoft.com/JAPAN/developer/library …
非常に簡単、且つ効果的な手段でした。これでバッチリです。
有難うございました。
ただ、VBAのヘルプではPrintBackgroundの説明が見つからなかったので
ちょっと不便さを感じてます。
ヘルプも万能ではないんですね・・・。By初心者
No.1
- 回答日時:
どもども田吾作7です。
一応EXCEL2000でのサンプル作りました。っていうか、ほとんど参考URLのパクリです。
(http://f-ga.com/Lib/PrintJob.lzh)
サンプルプログラムは印刷ジョブを取得するプログラムです。
存在するジョブに、指定のファイルが出したジョブ名が存在したら、スプール完了としてみてはどうでしょうか?
(ネットワーク先のプリンタのジョブって見れたっけ?ちと不安・・・)
参考URLではPrinterで通常使うプリンタを使用していますが、Officeでは使用できないので、別の方法で通常使うプリンタを取得しています。
※サンプルを再現するために必要なもの
ユーザーフォーム
その中にListBox1とCommandButton1
標準モジュール
******ユーザフォームのソース ここから******
Private Sub CommandButton1_Click()
Dim strPrinterDeviceName As String
Dim lngPrinterHandle As Long
Dim lngJobInfo1FirstJob As Long
Dim lngJobInfo1EnumerateJob As Long
Dim lngJobInfo1Level As Long
Dim lngJobInfo1Needed As Long
Dim lngJobInfo1Returned As Long
Dim bytJobInfo1Buffer() As Byte
Dim udtJobInfo1() As JOB_INFO_1
Dim lngJobInfo1Count As Long
Dim bytDocumentBuffer(64) As Byte
Dim strDocument() As String
Dim strStatus() As String
' リストボックスを初期化
ListBox1.Clear
' 通常使うプリンタ名を取得
strPrinterDeviceName = getConstantPrinter
' プリンタのオブジェクトハンドルを取得
Call OpenPrinter(strPrinterDeviceName, lngPrinterHandle, ByVal vbNullString)
' 最初に列挙する印刷ジョブを指定
lngJobInfo1FirstJob = 0
' 列挙する印刷ジョブの総数を指定
lngJobInfo1EnumerateJob = 99
' 構造体のレベルを指定
lngJobInfo1Level = 1
' バッファの必要なサイズを取得
Call EnumJobs(lngPrinterHandle, lngJobInfo1FirstJob, lngJobInfo1EnumerateJob, lngJobInfo1Level, _
ByVal vbNullString, 0, lngJobInfo1Needed, lngJobInfo1Returned)
' 印刷ジョブが存在する場合は
If lngJobInfo1Needed > 0 Then
' バッファを確保
ReDim bytJobInfo1Buffer(lngJobInfo1Needed - 1)
ReDim udtJobInfo1(lngJobInfo1Needed - 1)
ReDim strUserName(lngJobInfo1Needed - 1)
ReDim strDocument(lngJobInfo1Needed - 1)
ReDim strStatus(lngJobInfo1Needed - 1)
' 印刷ジョブの情報を取得
Call EnumJobs(lngPrinterHandle, lngJobInfo1FirstJob, lngJobInfo1EnumerateJob, lngJobInfo1Level, bytJobInfo1Buffer(0), _
lngJobInfo1Needed, lngJobInfo1Needed, lngJobInfo1Returned)
' 印刷ジョブが取得できた場合は
If lngJobInfo1Returned > 0 Then
' 取得した印刷ジョブの情報を構造体へ移動
MoveMemory udtJobInfo1(0), bytJobInfo1Buffer(0), Len(udtJobInfo1(0)) * lngJobInfo1Returned
' プリンタドライバ情報を切り出し
For lngJobInfo1Count = 0 To lngJobInfo1Returned - 1
With udtJobInfo1(lngJobInfo1Count)
' ドキュメント名のアドレスを取得
Call lstrcpy(bytDocumentBuffer(0), ByVal .pDocument)
' ドキュメント名をバイト型から文字列へ変換
strDocument(lngJobInfo1Count) = StrConv(bytDocumentBuffer(), vbUnicode)
' 印刷ジョブの状態を取得
strStatus(lngJobInfo1Count) = ""
If .Status And JOB_STATUS_PAUSED Then:
If .Status And JOB_STATUS_ERROR Then:
If .Status And JOB_STATUS_DELETING Then:
If .Status And JOB_STATUS_SPOOLING Then:
If .Status And JOB_STATUS_PRINTING Then:
If .Status And JOB_STATUS_OFFLINE Then:
If .Status And JOB_STATUS_PAPEROUT Then:
If .Status And JOB_STATUS_PRINTED Then:
If .Status And JOB_STATUS_DELETED Then:
If .Status And JOB_STATUS_BLOCKED_DEVQ Then:
If .Status And JOB_STATUS_USER_INTERVENTION Then: strStatus(lngJobInfo1Count) = strStatus(lngJobInfo1Count) & "/ユーザ介在"
' 印刷ジョブを表示
ListBox1.AddItem .JobId & "-" & _
Left(strDocument(lngJobInfo1Count), _
InStr(strDocument(lngJobInfo1Count), vbNullChar) - 1) & vbTab & _
strStatus(lngJobInfo1Count)
End With
Next lngJobInfo1Count
Else
ListBox1.AddItem "印刷ジョブが取得できません。"
End If
Else
ListBox1.AddItem "印刷ジョブはありません。"
End If
' プリンタオブジェクトをクローズ
Call ClosePrinter(lngPrinterHandle)
End Sub
'通常使うプリンタの取得
Function getConstantPrinter() As String
Dim strSection As String
Dim strKey As String
Dim strDefault As String
Dim strBuff As String * 1024
' セクションを指定
strSection = "windows"
' キーを指定
strKey = "device"
' デフォルト値を指定
strDefault = ""
' 取得
Call GetProfileString(strSection, strKey, strDefault, strBuff, Len(strBuff))
getConstantPrinter = Left(strBuff, InStr(strBuff, ",") - 1)
End Function
******ユーザフォームのソース ここまで******
******標準モジュールのソース ここから******
' プリンタのオブジェクトハンドルを取得する関数の宣言
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" _
(ByVal pPrinterName As String, _
phPrinter As Long, _
pDefault As Any) As Long
' プリンタのオブジェクトハンドルを破棄する関数の宣言
Public Declare Function ClosePrinter Lib "winspool.drv" _
(ByVal hPrinter As Long) As Long
' プリンタの印刷ジョブを列挙する
Public Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" _
(ByVal hPrinter As Long, _
ByVal FirstJob As Long, _
ByVal NoJobs As Long, _
ByVal Level As Long, _
pJob As Any, _
ByVal cdBuf As Long, _
pcbNeeded As Long, _
pcReturned As Long) As Long
' 日付と時刻を定義する構造体
Public Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
' 印刷ジョブの情報を定義する構造体
Public Type JOB_INFO_1
JobId As Long
pPrinterName As Long
pMachineName As Long
pUserName As Long
pDocument As Long
pDatatype As Long
pStatus As Long
Status As Long
Priority As Long
Position As Long
TotalPages As Long
PagesPrinted As Long
Submitted As SYSTEMTIME
End Type
Public Const JOB_STATUS_PAUSED = &H1
Public Const JOB_STATUS_ERROR = &H2
Public Const JOB_STATUS_DELETING = &H4
Public Const JOB_STATUS_SPOOLING = &H8
Public Const JOB_STATUS_PRINTING = &H10
Public Const JOB_STATUS_OFFLINE = &H20
Public Const JOB_STATUS_PAPEROUT = &H40
Public Const JOB_STATUS_PRINTED = &H80
Public Const JOB_STATUS_DELETED = &H100
Public Const JOB_STATUS_BLOCKED_DEVQ = &H200
Public Const JOB_STATUS_USER_INTERVENTION = &H400 ' Windows 95 Only
Public Const NO_PRIORITY = 0
Public Const MAX_PRIORITY = 99
Public Const MIN_PRIORITY = 1
Public Const DEF_PRIORITY = 1
' ある位置から別の位置にメモリブロックを移動する関数の宣言
Public Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)
' 文字列をバッファにコピーする関数の宣言
Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
(lpString1 As Any, _
lpString2 As Any) As Long
'WIN.INIの中の値を取得
Declare Function GetProfileString Lib "kernel32.dll" _
Alias "GetProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
******標準モジュールのソース ここまで******
もしジョブを得ることが出来なかったら、スプールした時に現れるダイアログウィンドウを監視する方法もあります。こちらの方法はあまりお勧めしませんが、上記の方法で実現不可能だったら、調査してサンプルを作ってみますよ。
でわでわ
参考URL:http://www.galliver.co.jp/vbtips/sample/vbt0124. …
有難うございました。
でも、ちょっと私には難し過ぎたようです。
構造体やバッファを制御する文が見うけられましたが、
これらのプログラムを組み込むには、ちょっと勉強が必要なレベルなんです。
今書いているVBAプログラムよりもこの処理文だけで
それを遥かに越えてしまってるようで・・・。
でもレベルがあがったら参考にしたと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
字面がカッコいい英単語
あなたが思う「字面がカッコいい英単語」を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
Accessでのレポート印刷待機方法
Visual Basic(VBA)
-
Excel VBA の印刷後の判定
Excel(エクセル)
-
【Vb.net】プリンタジョブの取得
Visual Basic(VBA)
-
-
4
VBA PDFファイル印刷後のAcrobatReaderDCの起動画面を閉じたい
Excel(エクセル)
-
5
VBAで印刷の成功判定
Visual Basic(VBA)
-
6
VBでプリンタジョブの制御について
Visual Basic(VBA)
-
7
EXCEL VBA 印刷プレビューダイアログのボタン操作を判定したい
Visual Basic(VBA)
-
8
PDFファイルを開かずに印刷したい
Visual Basic(VBA)
-
9
マクロで待機時間を作りたい
Access(アクセス)
-
10
マクロを使って、シート印刷完了時にシートに”完了”マークをつけたいのですが
Visual Basic(VBA)
-
11
エクセルのマクロで印刷プレビューを閉じる方法
Excel(エクセル)
-
12
PDFファイルを印刷後、自動でファイルが閉じる方法を教えてください。
その他(ソフトウェア)
-
13
ExcelVBAでPDFを閉じるソース
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPでPDFの自動印刷
-
phpでの自動印刷
-
A4の2枚をA3の1枚にする編集方法?
-
両面印刷設定方法について
-
PHPでPDFファイルの直接印刷
-
ActiveReportsを使って[印刷ダ...
-
アウトルックが起動しているか...
-
Excel-VBAでDSOFile.dll使える?
-
意味不明の実行時エラーで困っ...
-
「読み込み違反」が起きたとき...
-
excel vbaから実行するexe実行...
-
VBSで起動したアプリが前面表示...
-
ManagementClassが見つからない。
-
64bitで作ったEXEを32bitで起動...
-
EXCEL VBAから他アプリケーショ...
-
VB.NETコーディング標準に沿っ...
-
MSペイントを画像ファイル名を...
-
MSDNのセットアップ方法(ヘル...
-
VS2005アプリケーションで、Ora...
-
clickonceの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
印刷要求順番と印刷出力順番が...
-
印刷ダイアログを表示させない方法
-
印刷ダイアログを表示させたくない
-
vbaでPDFファイルが印刷されない
-
プリンターを指定して印刷するには
-
A4の2枚をA3の1枚にする編集方法?
-
ACCESSで設定した帳票の用紙サ...
-
ファイルのパス指定での印刷方法
-
VBSでExcelファイル印刷時のプ...
-
VBでExcel印刷する時のプリンタ...
-
VBからプリンタに出力する時に...
-
2回以上PDFをコピーや印刷がで...
-
VBAで印刷スプール終了の判定を...
-
EXCELファイルの複数ダウンロー...
-
PDFファイルを印刷し終了するには
-
VB6上から印刷ダイアログを表示...
-
ActiveReportsを使って[印刷ダ...
-
MSAccessのVBAで印刷時の並べ替...
-
VBAで印刷の成功判定
-
[Visual Studio] ソースの印刷...
おすすめ情報