【入門編】【実務中級】AcadDocument.Plot.PlotToDeviceによる「物理プリンタへの自動出力」:ページ設定を無視した強制印刷制御 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
図面の一括処理や、日々のルーティンワークからの解放を目指すあなたなら、きっと「マクロの記録」のその先にある、本当の自動化の力を求めていることでしょう。

今回は、実務で絶対に避けて通れないテーマ「AcadDocument.Plot.PlotToDeviceによる物理プリンタへの自動出力:ページ設定を無視した強制印刷制御」を徹底解説します。

「図面を開いたはいいが、古いページ設定が残っていて違うプリンタに飛ばされる……」
「大量の図面を、今すぐ特定のA1プロッターに同じ条件で一斉に出力したい!」

そんな現場の絶望を、たった数行の洗練されたVBAコードで鮮やかに解決する方法を、伝説のチーフアーキテクトである私と一緒にマスターしていきましょう。ここをクリアすれば、あなたのAutoCAD VBAスキルは確実に中級者の領域へ到達します。しっかりついてきてくださいね!

1. なぜ「ページ設定」に頼ると実務で破綻するのか?

AutoCADで普通に印刷(`PLOT`コマンド)するとき、私たちはダイアログボックスでプリンタ名、用紙サイズ、印刷スタイルなどを選びますよね。これをVBAでやろうとすると、多くの人が最初にハマる罠があります。それが「名前付ページ設定(Named Page Setup)」への依存です。

図面データ(`.dwg`)というのは厄介なもので、作成者によってページ設定がバラバラです。「A1で出力する設定」が保存されている図面もあれば、前任者が適当につけた「レイアウト1」のまま放置されている図面もあります。

この状態でVBAから「さあ印刷しろ!」と命令しても、AutoCADは「どのプリンタの、どのサイズで出せばいいのか分からないよ!」とエラーを吐くか、とんでもない設定で出力して紙を無駄にしてしまいます。

解決策:VBAから「強制的に上書き」する

私たちが目指すべきプロフェッショナルなコードは、図面側のページ設定を一切信用せず、VBA側から出力デバイス、用紙サイズ、印刷範囲を直接ねじ込む(オーバーライドする)アプローチです。

ここで登場するのが、今回主役となる `Plot.PlotToDevice` メソッドです。

2. 実戦投入コード:ページ設定を完全に無視する強制印刷エンジン

それでは、実務でそのまま使えるコードをお見せしましょう。
このコードは、現在アクティブな図面に対して、図面内のページ設定を一切無視し、指定した物理プリンタと用紙サイズで強制的に出力を行います。

Sub ForcePlotToPhysicalPrinter()
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing ‘ 現在アクティブな図面を対象とする

‘ 1. 印刷管理オブジェクト(Plot)を取得
Dim oPlot As AcadPlot
Set oPlot = oDoc.Plot

‘ 2. ターゲットとなるプリンタ名と用紙サイズを変数で定義
‘ ※お使いの環境にある実際のプリンタ名に書き換えてください
Dim strPrinterName As String
strPrinterName = “HP DesignJet Z6” ‘ 例:大判プロッターの名称

Dim strMediaName As String
strMediaName = “A1” ‘ 例:強制指定する用紙サイズ

On Error GoTo ErrorHandler

‘ 3. 【最重要】現在のアクティブレイアウトの一時設定を書き換える
Dim oLayout As AcadLayout
Set oLayout = oDoc.ActiveLayout

‘ 印刷デバイスを物理プリンタに強制変更
oLayout.ConfigName = strPrinterName

‘ 用紙サイズを強制変更
oLayout.CanonicalMediaName = strMediaName

‘ 印刷領域を「図面範囲」または「ディスプレイ」などに強制指定(今回は図面範囲:acExtents)
oLayout.PlotType = acExtents

‘ センター合わせを有効化
oLayout.CenterPlot = True

‘ 縮尺を「画面に合わせて印刷(フィッティング)」に設定
oLayout.StandardScale = acScaleToFit

‘ 4. 物理プリンタへ出力実行!
‘ 第1引数に「1」を指定することで、単一レイアウトの印刷を実行します
oPlot.PlotToDevice strPrinterName

MsgBox “プリンタへの出力指示が正常に送信されました!”, vbInformation, “自動印刷完了”
Exit Sub

ErrorHandler:
‘ 予期せぬエラー(プリンタが見つからない等)の捕捉
MsgBox “印刷処理中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “エラー発生”
End Sub

3. コードの急所を解説:なぜこれで動くのか?

初心者のうちは、「印刷ボタンを押すだけのマクロ」を作りたくなりますが、APIを叩く本物のエンジニアは「オブジェクトのライフサイクルと状態の書き換え」を意識します。このコードの肝を3つに絞って解説しましょう。

① `AcadLayout` オブジェクトへの介入

AutoCADの印刷設定は、実は図面全体ではなく「レイアウト(Layout)」というオブジェクトに紐づいています。
`oDoc.ActiveLayout` で現在見ている空間(モデル空間またはレイアウト空間)のレイアウト設定を取得し、そのプロパティ(`ConfigName` や `CanonicalMediaName`)をコードから直接書き換えています。これが「ページ設定を無視する」の正体です。図面側がどう設定されていこうと、VBAが強制的に上書きしてしまいます。

② 正確な用紙サイズ名(CanonicalMediaName)の罠

ここが多くの人が躓くポイントです。`strMediaName = “A1″` と書いていますが、これはAutoCADが内部で認識している「正規化されたメディア名(CanonicalMediaName)」である必要があります。
プリンタのドライバーによって「A1」「ISO_A1_594x841mm」「JIS A1」など、呼び名が微妙に異なります。もし「用紙サイズが無効です」というエラーが出たら、一度プリンタのプロパティや、有効なメディア名をリストアップする小さなコードを挟んで確認するのが鉄則です。

③ `PlotToDevice` の潔さ

`oPlot.PlotToDevice strPrinterName` を実行すると、ダイアログを出さずにバックグラウンド(またはフロントエンド)で一気にプリンタへデータが流し込まれます。大量の図面をループ処理で次々に印刷していく「一括バッチ印刷」を組むときは、このダイアログレスの挙動が絶対に必要になります。

4. 実務でさらにステップアップするための知見

ここまでのコードが書ければ、単体の図面の強制印刷はバッチリです。しかし、実務の現場では「フォルダ内にある100個の図面を全部この設定で印刷したい」という要望が飛んできます。

その場合、以下のような設計に拡張することになります。

1. 図面をサイレントオープンする
`Workbooks.Open` のような感覚で、`Application.Documents.Open(filePath, False)` を使い、画面を表示させずに(バックグラウンドで)図面を開く。
2. 今回のコードを適用する
開いたドキュメントオブジェクトに対して、上記の `Layout` 書き換えと `PlotToDevice` を走らせる。
3. 保存せずに閉じる
勝手にページ設定が上書きされて保存されてしまわないよう、`oDoc.Close False` で変更を破棄して閉じる。

この一連の流れをループ処理で組むことで、定時間際に「全図面をA1で出力して!」と言われても、ボタン一つポチッと押してコーヒーを飲んでいる間に仕事が終わる、そんな理想的な自動化環境が手に入ります。

まとめ

今回は、`AcadDocument.Plot.PlotToDevice` を用いた、ページ設定に依存しない強靭な印刷自動化の技術を解説しました。

  • 図面の古いページ設定は信用しない
  • `AcadLayout` のプロパティをVBAから直接書き換えてオーバーライドする
  • ダイアログを出さない `PlotToDevice` で一気にプリンタへ流し込む

この3つを抑えておけば、どんなに厄介なフォーマットの図面が持ち込まれても、あなたの一撃で美しく統制された印刷を実行できます。

ここをクリアしたあなたなら、もうAutoCAD VBAの基礎で迷うことはありません。自信を持って、日々の業務の自動化に挑んでください。
それでは、次のステップでお会いしましょう!エンジニアとしての健闘を祈ります。

タイトルとURLをコピーしました