AutoCAD VBAを掌握する極限の知見
【実務中級者向け】図面保存と同時に「納品用PDF」と「管理用JPG」を自動生成するマルチフォーマット・セーブ
開発プロジェクトの現場で、こんな非効率な作業をまだエンジニアにやらせていないか?
「DWGを上書き保存する。次に『名前を付けて印刷』からPDFドライバを選んでペーパーサイズを設定し、納品フォルダへ出力する。さらに、社内管理ポータル用にJPG画像まで手動で書き出す……」
一人の作業者が1日に何度もこれを繰り返せば、年間でどれだけのマンパワーがドブに捨てられることか。しかも、PDFのラスタライズ漏れや、旧バージョンのまま上書きするヒューマンエラーが必ず発生する。
プロの業務自動化エンジニアであれば、この一連のプロセスを「1クリック(あるいは `ThisDrawing.Save` のフック)」でアトミックに実行させなければならない。
今回は、AutoCAD VBAを用いて、DWGの保存と同時に「クライアント納品用高精度PDF」と「社内管理用サムネイルJPG」を完全無人かつエラーフリーで生成する、プロダクション品質の統合セーブシステムを伝授する。
—
なぜ「素のVBAコード」では実用に耐えないのか?
AutoCADのバッチ処理やファイル出力において、アマチュアが書いたコードは必ず現場で破綻する。原因は主に以下の3点だ。
1. アクティブレイアウトの暴走: `Plot.PlotToDevice` は常に「現在アクティブなレイアウト」を対象にするため、意図しない空間が出力される。
2. ページ設定(PlotConfig)の依存性: PC環境やドライバ名(例: AutoCAD PDF (General Documentation).pc3 など)が変わっただけでエラーで落ちる。
3. ファイル競合と上書きプロンプト: 既存のPDF/JPGが存在する場合、AutoCADが裏でダイアログを出し、VBAの実行が完全にフリーズする。
これらを完全に克服し、どんなクライアント環境でも一発稼働する「堅牢な設計」のコードを以下に公開する。
—
プロダクションコード:`MultiFormatSaveEngine.bas`
以下のコードをAutoCADのVBAエディタ(IDE)に実装せよ。エラーハンドリング、ファイルシステムオブジェクト(FSO)によるパス制御、そして出力デバイスの動的切替を網羅した実用モジュールだ。
Option Explicit
‘ ==============================================================================
‘ 統合マルチフォーマット・セーブエンジン
‘ 概要: DWGの保存と同時に、指定レイアウトをPDF化し、さらに管理用JPGを生成する
‘ ==============================================================================
Public Sub ExecuteMultiFormatSave()
Dim oDoc As AcadDocument
Set oDoc = ThisDrawing
‘ 1. DWGファイルの保存パスチェック(未保存新規図面への対策)
On Error GoTo ErrorHandler
If oDoc.Path = “” Then
MsgBox “この図面はまだ一度も保存されていません。先に手動で名前を付けて保存してください。”, vbCritical, “致命的エラー”
Exit Sub
End If
Dim basePath As String
Dim baseName As String
basePath = oDoc.Path & “\”
baseName = Left(oDoc.Name, InStrRev(oDoc.Name, “.”) – 1)
‘ 2. DWG本体の保存
oDoc.Save
‘ 3. 納品用PDFの生成プロセス
Call ExportToPDF(oDoc, basePath & baseName & “.pdf”)
‘ 4. 管理用JPGの生成プロセス
Call ExportToJPG(oDoc, basePath & baseName & “.jpg”)
MsgBox “図面の保存およびマルチフォーマット(PDF/JPG)の生成が正常に完了しました。”, vbInformation, “処理完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “実行時エラー”
End Sub
‘ ——————————————————————————
‘ PDF出力サブルーチン
‘ ——————————————————————————
Private Sub ExportToPDF(oDoc As AcadDocument, outputPath As String)
Dim oLayout As AcadLayout
Set oLayout = oDoc.Layouts.Item(“Model”) ‘ 必要に応じて “Layout1” 等に変更
‘ アクティブレイアウトの切り替え(Plotオブジェクトの仕様対策)
oDoc.ActiveLayout = oLayout
Dim oPlot As AcadPlot
Set oPlot = oDoc.Plot
‘ PDF出力用PC3ファイルの指定(環境に合わせて調整してください)
Dim pdfConfig As String
pdfConfig = “AutoCAD PDF (General Documentation).pc3”
‘ 既存ファイルがある場合はFSOで事前に削除(ダイアログによるフリーズ防止)
Call RemoveExistingFile(outputPath)
‘ プロット設定の適用と実行
‘ ※事前にページ設定が完了している前提であれば PlotToDevice が最も安定します
If oPlot.PlotToDevice(pdfConfig) = False Then
Err.Raise vbObjectError + 1, “ExportToPDF”, “PDFのプロット処理に失敗しました。”
End If
‘ 注: AutoCADのPDF出力は非同期またはバックグラウンド処理が絡むため、
VBのファイル生成監視を入れるのが真のプロの技です。
Call WaitForFileCreation(outputPath, 10)
End Sub
‘ ——————————————————————————
‘ JPG出力サブルーチン(管理用サムネイル)
‘ ——————————————————————————
Private Sub ExportToJPG(oDoc As AcadDocument, outputPath As String)
Call RemoveExistingFile(outputPath)
‘ 画面表示範囲をそのままJPG化する(レタッチ不要の高速サムネイル生成)
‘ 引数: ファイルパス, 幅(ピクセル), 高さ(ピクセル)
On Error Resume Next
oDoc.Plot.ExportAsImage outputPath, 1920, 1080
If Err.Number <> 0 Then
‘ エラー時は低解像度でフォールバック
oDoc.Plot.ExportAsImage outputPath, 1024, 768
End If
On Error GoTo 0
Call WaitForFileCreation(outputPath, 5)
End Sub
‘ ——————————————————————————
‘ ユーティリティ: ファイルの事前削除(上書きダイアログ抑制)
‘ ——————————————————————————
Private Sub RemoveExistingFile(filePath As String)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
If fso.FileExists(filePath) Then
fso.DeleteFile filePath, True
End If
Set fso = Nothing
End Sub
‘ ——————————————————————————
‘ ユーティリティ: 非同期ファイル生成の同期待ち(I/Oラグ対策)
‘ ——————————————————————————
Private Sub WaitForFileCreation(filePath As String, maxSeconds As Long)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim startTime As Single
startTime = Timer
Do While Not fso.FileExists(filePath)
DoEvents
If Timer – startTime > maxSeconds Then
Exit Do ‘ タイムアウト
End If
Loop
Set fso = Nothing
End Sub
—
チーフアーキテクトからの実務アドバイス
1. PC3依存性の排除について
社内ネットワークで複数のPCからこのマクロを実行する場合、`AutoCAD PDF (General Documentation).pc3` の名前や用紙サイズ定義がローカル環境で異なるとエラーになる。確実を期すなら、あらかじめ図面テンプレート(DWT)側に名前付きページ設定(Named Page Setup)を作り込み、VBA側からそれを呼び出す設計に昇華させよ。
2. I/Oラグ(ファイル書き込み遅延)の罠
AutoCADが裏でファイルを吐き出す処理は、コードの実行完了と完全には同期しない。特に巨大なDWGのJPG化やPDF化において、直後にデータベースやクラウドストレージへアップロードする処理を繋げると、「ファイルがロックされていません」という例外を食らう。上記のコードにある `WaitForFileCreation` のような同期的待機ループ(ポーリング)を挟むのが、現場で生き残るエンジニアの作法だ。
業務効率化とは、単に手作業をコードに置き換えることではない。「エラーが起きる余地をシステム側で完全に塞ぎ、運用コストをゼロにする」ことだ。このアーキテクチャを導入し、チームの生産性を次のステージへ引き上げてほしい。
