Excel VBAでシートをPDFとして出力する際、印刷ダイアログでキャンセルすると『実行時エラー1004: WorksheetクラスのPrintOutメソッドが失敗しました』が発生することがあります。この記事では、このエラーの原因と回避方法、そして安全にPDFを出力する方法について具体例を交えて解説します。
PrintOutメソッドでエラーが発生する原因
VBAのActiveSheet.PrintOutメソッドは、印刷先に指定したプリンタが正しく処理できない場合や、ユーザーが印刷ダイアログでキャンセルした場合にエラーを返します。
特に『Microsoft Print to PDF』を使用している場合、ユーザーが保存先を選ばずにキャンセルすると、VBA側では処理が失敗したと認識され、『1004』エラーが発生します。
エラーを防ぐための基本的な方法
エラーを回避する一つの方法は、On Error文を使用して例外処理を追加することです。これにより、印刷がキャンセルされた場合でもプログラムが停止せずに続行できます。
具体例としては次の通りです。
例:
On Error Resume Next
ActiveSheet.PrintOut ActivePrinter:="Microsoft Print to PDF"
If Err.Number <> 0 Then
MsgBox "PDF出力がキャンセルされました。"
Err.Clear
End If
PDFを自動的に保存する方法
キャンセルを避けたい場合、PrintOutではなくExportAsFixedFormatメソッドを使用すると便利です。この方法では、保存先のファイル名をVBAで指定できるため、ユーザーの操作によるキャンセルを回避できます。
具体例:
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\\Users\\UserName\\Documents\\output.pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
この方法なら、保存先を指定して自動的にPDFを出力できるため、印刷ダイアログを表示せずに安全に処理できます。
複数シートをまとめてPDFに出力する方法
複数のシートを1つのPDFとして出力したい場合も、ExportAsFixedFormatを使用することが推奨されます。Sheetsコレクションを使用して対象シートを選択し、一括で出力できます。
例:
Sheets(Array("Sheet1","Sheet2")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\\Users\\UserName\\Documents\\combined.pdf"
エラー処理のベストプラクティス
VBAで印刷やPDF出力を行う際は、必ずエラー処理を組み込みましょう。On Error Resume Nextだけでなく、エラー番号に応じて適切に処理を分岐させることで、より安全で安定したマクロを作成できます。
また、ユーザーにわかりやすいメッセージを表示することで、操作中の混乱を防ぐことができます。
まとめ
Excel VBAでPDF出力時に『実行時エラー1004』が発生する主な原因は、印刷ダイアログでのキャンセルです。これを回避するには、例外処理を組み込む方法と、ExportAsFixedFormatメソッドを使用して自動的にPDFを保存する方法があります。
これらの手法を組み合わせることで、安全かつ確実にPDFを生成でき、VBAマクロの信頼性を高めることができます。


コメント