お世話になります。
以下のような構文でプリントイメージをファイル出力しています。
ActiveWindow.SelectedSheets.PrintOut ,
To:=PageEnd, PrintToFile:=False, PrToFileName:=PrintoutFile
全ての印刷出力が完了後、次の処理へ進むと思っていたのですが、
どうも出力が完了する前に次の処理へ進んでいるようなのです。
この処理が非同期でマクロ側に戻ってくるかどうかご存じの方は
いらっしゃいますでしょうか?
もし非同期の場合、出力完了と同期をとることは可能でしょうか?
利用しているバージョンは、office2003です。
No.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 出力とか画像出力印刷ドライバで画像ファイルとして。。って話?
この回答への補足
残念ながらプリンタドライバは、サイズゼロのファイルをまず作り
一旦開放した後、データの出力を始める動きをしているようです。
とりあえずは、時間をおくことにしましたが、書き込み中かどうかの
監視とともにサイズの監視を行って行く方法を検討したいと思います。
ありがとうございます。
取り急ぎ本処理を加えてどれぐらいWaitされるのか計測してみます。
PrintToFile:=Falseは、Trueの間違いでした。
コピペした後、間違ってると勘違いし書き換えてしまいました。
すみません。
No.2
- 回答日時:
ExcelVBAはExcelの機能を使っているだけです。
Excelの印刷は結果をOSの印刷機能に投げているだけですから、OSが印刷ジョブを受け取れば
後は勝手に次のステップに進んでしまいます。
印刷ジョブと印刷の実行は、OSではなく更にその下のプリンタドライバ
の処理に依存しますので(例えばネットワークプリンタの場合、ジョブ
はプリントサーバに投げておしまいです)、Excelからは何をやってるか
全く分からない=印刷とは非同期になる、という結果になります。
逆に言えば、簡単には印刷終了をアプリケーション側で知る手段はない
わけで、どうしても同期したいということならば、原始的な手段ですが
メッセージボックスを表示させ、印刷終了を目視で確認させた上「OK」
ボタンをクリックさせる・・・などの方法になるかと思います。
>印刷ジョブと印刷の実行は、OSではなく更にその下のプリンタドライバ
の処理に依存しますので
確かに「両面設定」などプリンタドライバに対する設定が
多いものほどprintoutメソッド終了後にファイルが完成
していないケースが多いように思われます。
(ドライバの処理に依存しているというのもわかります。)
printoutメソッドが、即時リターンということであれば
時間をあけるしかなそうですね。
ファイルの有無で確認するのも作成中でもファイルが有る
ようなので難しそうです。
プリンタイメージ作成後、待ち時間を調整できるような
仕組みを入れたいと思います。
回答ありがとうございました。
No.1
- 回答日時:
こんにちは。
> 全ての印刷出力が完了後、次の処理へ進むと思っていたのですが、
>どうも出力が完了する前に次の処理へ進んでいるようなのです。
上記の件は、そのとおりです。Excelから離れた時点で、VBAのPrintOut の処理は終わっています。「同期」という意味は、プリントアウトの処理の終了に対して、VBAが待つという意味でしょうか?
たびたび、ここのカテゴリやVBのカテゴリでも同様の質問は見かけます。要するに、物理的なプリンタの状態をVBAのコードで取るという方法だとは思いますが、たぶん、それを可能にする人はいると思いますが、私などは、あまり真剣に考えたことがありません。
私は、もうずいぶん前から、単純に、おおよその推定時間で Wait を入れるだけにしています。私はなどは、なるべくVBAの内部コマンド(メソッド,プロパティ)で済ませたいと思っています。もしも、必要なら、MsgBox で、人間が行えばよいと思います。
回答ありがとうございます。
>上記の件は、そのとおりです。Excelから離れた時点で、VBAのPrintOut の処理は終わっています。「同期」という意味は、プリントアウトの処理の終了に対して、VBAが待つという意味でしょうか?
実際のプリンタからの印刷を待つつもりではありません。
プリンタ出力イメージのファイル出力を要求して
ファイルができあがるまでを待ちたいのです。
また自動で処理を進めさせたいので、msgboxで時間を空ける
方法は使えません。
printoutメソッドが、即時リターンということであれば
時間をあけるしかなそうですね。
ファイルの有無で確認するのも作成中でもファイルが有る
ようなので難しそうです。
プリンタイメージ作成後、待ち時間を調整できるような
仕組みを入れたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Excel(エクセル) エクセルVBA、間違っているコード内容を正して頂けませんか? エクセルワークシートに納品書を作ったの 2 2023/08/02 21:13
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) マクロで謎の現象が起きていて困ってます。 エクセルで作ったボタンを押すとマクロが動いて処理をしてくれ 3 2023/06/22 17:28
- Excel(エクセル) マクロの付いたExcelが開けません 3 2023/02/01 10:54
- その他(クラウドサービス・オンラインストレージ) OneDrive同期が完了しない。(windows10) 4 2023/04/06 02:27
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) Excelのマクロについてご教授ください 2 2023/02/25 09:43
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
- Excel(エクセル) エクセルの印刷マクロについて質問があります。 現在、下記のマクロで印刷しています。Sheet1のD6 5 2023/06/12 10:59
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
-
COBOL FILLER
-
Fortranでの出力ファイル
-
excel vbaでのxml出力がわかり...
-
“ファイルに出力”した印刷ファ...
-
C++のプログラミング(画像処理)
-
Acrobat参照設定
-
PHP:unzipコマンドにおけるエ...
-
フォルダ内のサブフォルダ名や...
-
Thunderbird 受信メールからの...
-
コマンドプロンプトのテキスト...
-
プロフィールビデオ作成につい...
-
ACCESSのライセンス(?)
-
ショートカットで起動した場合...
-
ファイナルカットで編集した動...
-
ATTファイルってどうやって開け...
-
パイソンでのテキストデータの...
-
【VBA】複数CSVの特定範囲を1つ...
-
ディレクトリのサイズの取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
accessでクエリをExcelにエクス...
-
CSVファイルの時刻の形式について
-
コマンドプロンプトのテキスト...
-
COBOL、項目末尾に空白がある場...
-
Thunderbird 受信メールからの...
-
VB6.0でExcel,PDF,Word出力方法
-
ショートカットで起動した場合...
-
AccessのレポートからPDFをペー...
-
accessのリポートを、excelに出...
-
Acrobat参照設定
-
Excel で「OLE は現在使用でき...
-
ファイナルカットで編集した動...
-
WshShellから起動したbat(ftp)...
-
COBOL FILLER
-
エクセルが裏で動いたままなん...
-
Fortranでの出力ファイル
-
マクロについて質問です。 現在...
-
TransferSpreadsheetでフルパス...
-
iTextでPDFを表示させたら日本...
-
ACCESS2002(or2003)の日付表示...
おすすめ情報