AutoCAD VBAを掌握する極限の知見
第1回:レガシーの壁を打ち破れ!AutoCAD R12 DXF形式エクスポートの完全自動化設計
開発プロジェクトのリーダーである私のもとに、たびたびこんな悲鳴が上がってくる。
「取引先から送られてきた古いCADシステムが、最新のDWGはもちろん、新しいDXFすら読み込めなくてデータが渡せない……」
「手動で『名前を付けて保存』から『DXF R12/LT2 DXF』を選んで保存する作業を、数百枚の図面に対してやらされて手が腱鞘炎になりそうだ……」
笑い事ではない。製造業やプラント業界、あるいは地方自治体とのデータやり取りの現場では、いまだに2パーソナライズされた骨董品のようなCADが現役で稼働しているケースが多々ある。そして、それらのシステムが唯一理解できる共通言語が 「AutoCAD R12/LT2 DXF形式」 なのだ。
今回は、このレガシーな互換性問題に終止符を打つため、AutoCAD VBAを用いた「R12 DXFエクスポートの完全自動化」について、実務でそのまま使える堅牢なコードとともに解説しよう。素人が書くような「動くだけの脆弱なコード」はここにはない。プロの現場で生き残るための設計思想を授ける。
—
1. なぜ「R12 DXF」なのか? そしてVBAにおける最大の罠
DXF(Drawing Exchange Format)はAutodeskが開発したオープンなデータ交換フォーマットだが、バージョンが進むにつれて複雑怪奇なオブジェクト(スプライン、リージョン、ダイナミックブロックなど)が追加され、古いCADにとっては「爆弾」のようなファイルと化している。
その点、AutoCAD R12形式のDXFは極めてプリミティブ(原始的)だ。
- 2Dポリラインしか持てない(3Dは分解される)
- スプラインや文字スタイルなどの高度な定義が削ぎ落とされる
- すべての図形が単純な線・円・文字の集合体に平坦化(フラット化)される
この「情報の引き算」こそが、古いCADシステムでエラーを起こさないための最大の強みとなる。
しかし、VBAからこれを制御する際、多くの開発者が「SaveAsメソッドのファイル形式引数の指定ミス」や「図面がダーティ(未保存・変更あり)状態のまま処理を進めてしまうことによるCOM例外」で爆死する。この現実を直視し、エラーを完全にねじ伏せるコードを構築しなければならない。
—
2. プロダクションコード:堅牢なR12 DXFコンバーター
以下のコードは、単に保存するだけではなく、「指定フォルダ内のDWGを全自動でキャッチし、元図面を汚さずに、かつ確実にR12 DXFへ変換する」ための実務仕様のプロシージャだ。
エラーハンドリング、ファイルシステムのオブジェクト(FSO)の活用、そしてAutoCADのドキュメントライフサイクルを考慮した、プロの仕事を見せてやろう。
Option Explicit
‘================================================================================
‘ 担当者必携:DWGをAutoCAD R12 DXFへ一括変換する堅牢なプロシージャ
‘================================================================================
sub ExportToR12DXF_Batch()
‘ 1. 宣言とイニシャライズ
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Dim targetFolder As String
Dim dxfFolder As String
Dim fileName As String
Dim fso As Object
Dim fileCount As Long
On Error GoTo ErrorHandler
‘ 処理カウンター初期化
fileCount = 0
‘ FileSystemObjectの生成(レイトバインディングで参照設定のトラブルを回避)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 【重要】パスは実環境に合わせて必ず書き換えてください
targetFolder = “C:\AutoCAD_Work\Source_DWG\”
dxfFolder = “C:\AutoCAD_Work\Output_DXF\”
‘ 出力先フォルダが存在しない場合は自動生成する親切設計
If Not fso.FolderExists(dxfFolder) Then
fso.CreateFolder (dxfFolder)
End If
‘ AutoCADのインスタンスを取得(起動していなければ新規起動)
On Error Resume Next
Set acadApp = GetObject(, “AutoCAD.Application”)
If acadApp Is Nothing Then
Set acadApp = New AutoCAD.Application
acadApp.Visible = True ‘ 処理過程を目視確認できるように可視化
End If
On Error GoTo ErrorHandler
‘ フォルダ内のDWGファイルをループ処理
fileName = Dir(targetFolder & “.dwg”)
If fileName = “” Then
MsgBox “対象となるDWGファイルがが見つかりません。”, vbExclamation, “処理中断”
GoTo Cleanup
End If
‘ 画面更新をロックしてパフォーマンスを極限まで引き上げる(プロの技)
acadApp.Caption = “DXF一括変換処理を実行中…”
Do While fileName <> “”
Dim fullPathDWG As String
Dim fullPathDXF As String
fullPathDWG = targetFolder & fileName
‘ 拡張子をDXFに変更
fullPathDXF = dxfFolder & fso.GetBaseName(fileName) & “.dxf”
‘ 図面を開く(ReadOnlyで開き、元ファイルを保護する)
Set acadDoc = acadApp.Documents.Open(fullPathDWG, True)
‘ 【最重要コアロジック】
‘ AutoCAD R12 DXF形式で保存する
‘ 第1引数: フルパス, 第2引数: acR12DXF (R12/LT2 DXF形式を指定)
acadDoc.SaveAs fullPathDXF, acR12DXF
‘ ドキュメントを閉じる(変更を保存しない = False)
acadDoc.Close False
fileCount = fileCount + 1
fileName = Dir() ‘ 次のファイルへ
Loop
‘ 完了通知
MsgBox “変換処理が正常に完了しました。” & vbCrLf & _
“処理件数: ” & fileCount & ” ファイル”, vbInformation, “処理成功”
Cleanup:
‘ オブジェクトの解放(メモリリークを絶対に防ぐ)
Set acadDoc = Nothing
Set acadApp = Nothing
Set fso = Nothing
Exit Sub
ErrorHandler:
‘ 予期せぬエラーの捕捉
MsgBox “致命的なエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “異常終了”
‘ エラー時も図面が開いたまま残るのを防ぐためのクリーンアップ
If Not acadDoc Is Nothing Then
On Error Resume Next
acadDoc.Close False
End If
Resume Cleanup
End Sub
—
3. コードの急所:なぜこの設計なのか?
このコードには、現場で幾多の修羅場をくぐってきたエンジニアとしてのこだわりが詰まっている。ポイントを3つに絞って解説しよう。
① `Documents.Open` の第2引数(ReadOnly)の活用
自動化スクリプトで最も恐ろしいのは、処理対象のDWGファイルを誤って上書き保存してしまうことだ。「うっかり元の画層設定やダイナミックブロックが破壊された」なんてことになれば、始末書どころでは済まない。
ここでは `Open fullPathDWG, True` とすることで、強制的に読み取り専用(ReadOnly)で開き、元データを鉄壁のガードで保護している。
② `acR12DXF` 定数の正確な指定
AutoCADの型ライブラリ(`acLisp` や `acSaveAsType` 列挙体)には、保存形式を指定する数々の定数が用意されている。R12形式を指定するには `acR12DXF` を使う。
もしこの定数が型ライブラリから正しく引けない環境(Excel VBAからAutoCADを操作する場合など)であれば、生の値である `36` を直接指定しても動作するが、保守性を考慮して可能な限りAutoCADの参照設定を行った上でこの定数名を使用することを強く推奨する。
③ 徹底的なメモリ管理とエラーハンドリング
AutoCADのCOMオブジェクトはメモリを食う。ループ内でエラーが発生した際、図面が開いたままゾンビプロセスのように残ると、PCのメモリが枯渇する。
`ErrorHandler` ラベルを設け、異常終了時であっても確実に `acadDoc.Close False` を叩く構造にしている点が、このコードの「プロたる所以」である。
—
4. 運用上の注意点とさらなる高みへ
このスクリプトを導入するにあたって、現場の担当者に必ず伝えておかなければならない注意点がある。
- 監査(Audit)とパージ(Purge)の事前実施
古い図面は破損していることが多い。もし図面自体が壊れていると、`SaveAs` の瞬間にAutoCADがダイアログを出してフリーズする(いわゆる「ダイアログ待ちの無応答地獄」に陥る)。大量処理を行う前段階として、事前に図面の修復ルーチンを挟むのが真のプロフェッショナルの設計だ。
- ファイル名・パスの文字数制限
ネットワークドライブ上の深すぎる階層にあるファイルを処理させると、WindowsのMAX_PATH(260文字)制限に引っかかり、COMエラーを引き起こす。作業用フォルダは必ずローカルの浅い階層(例: `C:\Work`)に用意させよう。
業務効率化とは、単に手作業をコードに置き換えることではない。「起こり得るエラーを先回りして完全に潰し、無人でも安心して走らせられる堅牢な仕組みを作る」ことだ。
このコードをあなたの環境に組み込み、レガシーデータとの不毛な戦いに終止符を打ってほしい。
