プロが教えるわが家の防犯対策術!

 お世話になります。
 
 以下のような構文でプリントイメージをファイル出力しています。
 
 ActiveWindow.SelectedSheets.PrintOut ,
  To:=PageEnd, PrintToFile:=False, PrToFileName:=PrintoutFile


 全ての印刷出力が完了後、次の処理へ進むと思っていたのですが、
どうも出力が完了する前に次の処理へ進んでいるようなのです。

 この処理が非同期でマクロ側に戻ってくるかどうかご存じの方は
いらっしゃいますでしょうか?
 もし非同期の場合、出力完了と同期をとることは可能でしょうか?

 利用しているバージョンは、office2003です。

A 回答 (3件)

試してないので「できる」のかどうか分からないのですが。

。。

要はファイルを書き出している間は排他アクセスできないと思う
ので、できるようになるまで待機していれば良いのではないかと。。

変数の宣言は一部省略。

' // ウェイト用 API
Private Declare Sub Sleep Lib "kernel32.dll" ( _
    ByVal dwMilliseconds As Long)


Sub Sample()

  PrintoutFile = "C:\aaa"
  
  ActiveWindow.SelectedSheets.PrintOut PrintToFile:=True, _
                     PrToFileName:=PrintoutFile
  
  '// ファイルが編集可能になるまで
  While Not IsFileEditable(PrintoutFile)
    DoEvents
    Sleep 100&
  Wend
  
  MsgBox "できたみたい(・∀・)", vbInformation
  

End Sub

' // ファイルが編集可能か調べる
Public Function IsFileEditable( _
    ByVal FilePath As String _
) As Boolean

  Dim n  As Integer
 
  IsFileEditable = False
   
  ' // ファイルが生成されてなければ False
  If CreateObject("Scripting.FileSystemObject") _
    .FileExists(FilePath) = False Then
    Exit Function
  End If
 
  ' // ファイルが使用可能ではない-->ファイル生成途中なら False
  n = FreeFile()
  On Error Resume Next
  Open FilePath For Binary Lock Read Write As #n
  Close #n
  IsFileEditable = CBool(Err.Number = 0)
  On Error GoTo 0

End Function


以下余談。

> 以下のような構文でプリントイメージをファイル出力しています。
>  
>  ActiveWindow.SelectedSheets.PrintOut ,
>   To:=PageEnd, PrintToFile:=False, PrToFileName:=PrintoutFile

ファイル出力するのに PrintToFile:=False なのは何故? 若しかして
PDF 出力とか画像出力印刷ドライバで画像ファイルとして。。って話?

この回答への補足

残念ながらプリンタドライバは、サイズゼロのファイルをまず作り
一旦開放した後、データの出力を始める動きをしているようです。
とりあえずは、時間をおくことにしましたが、書き込み中かどうかの
監視とともにサイズの監視を行って行く方法を検討したいと思います。

補足日時:2007/06/28 10:03
    • good
    • 0
この回答へのお礼

 ありがとうございます。
 取り急ぎ本処理を加えてどれぐらいWaitされるのか計測してみます。


 PrintToFile:=Falseは、Trueの間違いでした。
 コピペした後、間違ってると勘違いし書き換えてしまいました。
 すみません。

お礼日時:2007/06/13 17:36

ExcelVBAはExcelの機能を使っているだけです。

Excelの印刷は結果を
OSの印刷機能に投げているだけですから、OSが印刷ジョブを受け取れば
後は勝手に次のステップに進んでしまいます。

印刷ジョブと印刷の実行は、OSではなく更にその下のプリンタドライバ
の処理に依存しますので(例えばネットワークプリンタの場合、ジョブ
はプリントサーバに投げておしまいです)、Excelからは何をやってるか
全く分からない=印刷とは非同期になる、という結果になります。

逆に言えば、簡単には印刷終了をアプリケーション側で知る手段はない
わけで、どうしても同期したいということならば、原始的な手段ですが
メッセージボックスを表示させ、印刷終了を目視で確認させた上「OK」
ボタンをクリックさせる・・・などの方法になるかと思います。
    • good
    • 0
この回答へのお礼

>印刷ジョブと印刷の実行は、OSではなく更にその下のプリンタドライバ
の処理に依存しますので

 確かに「両面設定」などプリンタドライバに対する設定が
多いものほどprintoutメソッド終了後にファイルが完成
していないケースが多いように思われます。
 (ドライバの処理に依存しているというのもわかります。)

 printoutメソッドが、即時リターンということであれば
時間をあけるしかなそうですね。
 ファイルの有無で確認するのも作成中でもファイルが有る
ようなので難しそうです。

 プリンタイメージ作成後、待ち時間を調整できるような
仕組みを入れたいと思います。

 回答ありがとうございました。

お礼日時:2007/06/13 14:51

こんにちは。



> 全ての印刷出力が完了後、次の処理へ進むと思っていたのですが、
>どうも出力が完了する前に次の処理へ進んでいるようなのです。

上記の件は、そのとおりです。Excelから離れた時点で、VBAのPrintOut の処理は終わっています。「同期」という意味は、プリントアウトの処理の終了に対して、VBAが待つという意味でしょうか?

たびたび、ここのカテゴリやVBのカテゴリでも同様の質問は見かけます。要するに、物理的なプリンタの状態をVBAのコードで取るという方法だとは思いますが、たぶん、それを可能にする人はいると思いますが、私などは、あまり真剣に考えたことがありません。

私は、もうずいぶん前から、単純に、おおよその推定時間で Wait を入れるだけにしています。私はなどは、なるべくVBAの内部コマンド(メソッド,プロパティ)で済ませたいと思っています。もしも、必要なら、MsgBox で、人間が行えばよいと思います。
    • good
    • 0
この回答へのお礼

 回答ありがとうございます。

>上記の件は、そのとおりです。Excelから離れた時点で、VBAのPrintOut の処理は終わっています。「同期」という意味は、プリントアウトの処理の終了に対して、VBAが待つという意味でしょうか?

 実際のプリンタからの印刷を待つつもりではありません。
 プリンタ出力イメージのファイル出力を要求して
ファイルができあがるまでを待ちたいのです。
 また自動で処理を進めさせたいので、msgboxで時間を空ける
方法は使えません。

 printoutメソッドが、即時リターンということであれば
時間をあけるしかなそうですね。
 ファイルの有無で確認するのも作成中でもファイルが有る
ようなので難しそうです。

 プリンタイメージ作成後、待ち時間を調整できるような
仕組みを入れたいと思います。

お礼日時:2007/06/13 14:39

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