AutoCAD VBAで「徹夜」を卒業する。複数図面バッチ処理の極意
こんにちは。AutoCADの自動化の世界へようこそ。
毎日何百もの図面を開き、同じレイヤー設定を繰り返し、名前を付けて保存する。そんな「修行」のような作業に終止符を打つ時が来ました。AutoCAD VBAは、単なるマクロ記録の延長ではありません。AutoCADの心臓部(ObjectDBXとApplicationオブジェクト)を制御する、最強の自動化ツールです。
今日は、中級者への登竜門である「複数図面のバッチ処理」を、現場で即戦力となるレベルで解説します。
—
1. なぜ「手動」で開いてはいけないのか?
初学者が陥る最大の罠は、`Application.Documents.Open` を連発することです。これをやると、図面が開くたびにAutoCADの画面がチラつき、メモリを浪費し、最悪の場合は途中でフリーズします。
極限の知見:
大量の図面を処理する場合、「図面を表示せずにバックグラウンドで処理する(ObjectDBX)」か、「不可視状態で制御する」のが鉄則です。今回は、まず基本の「開いて処理して保存する」流れを堅牢に構築しましょう。
—
2. 失敗しないバッチ処理の基本構成
バッチ処理のコードは、以下の「4つの壁」を越える必要があります。
1. 対象ファイルの選定: フォルダ内のDWGを確実にリストアップする。
2. エラーハンドリング: 1つ図面が壊れていても処理を止めない。
3. 図面のクローズ: メモリリークを防ぐため、確実に閉じる。
4. バージョン管理: 保存時に余計なダイアログを出さない。
実践コード:フォルダ内の全図面を自動処理する
以下のコードは、指定フォルダ内の全図面に対して「特定のレイヤーを削除する」処理の雛形です。
Sub BatchProcessDrawings()
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim doc As AcadDocument
Dim targetFolder As String
‘ 1. 処理対象フォルダの設定
targetFolder = “C:\Project\Drawings\”
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(targetFolder)
‘ 2. 各ファイルに対してループ
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “dwg” Then
On Error Resume Next ‘ エラーが発生しても次へ進む
‘ 図面を開く(Visible:=Falseでバックグラウンド処理も可能)
Set doc = Application.Documents.Open(file.Path)
If Err.Number = 0 Then
‘ — ここに処理を記述 —
Call CleanUpDrawing(doc)
‘ 保存して閉じる(上書き保存)
doc.Close SaveChanges:=True
Else
Debug.Print “開けませんでした: ” & file.Name
End If
On Error GoTo 0
End If
Next file
MsgBox “全図面の処理が完了しました!”
End Sub
Sub CleanUpDrawing(doc As AcadDocument)
‘ 例:特定のレイヤー「TEMP」を削除する処理
Dim layerObj As AcadLayer
On Error Resume Next
Set layerObj = doc.Layers.Item(“TEMP”)
If Not layerObj Is Nothing Then
layerObj.Delete
End If
End Sub
—
3. 知っておくべき「現場の落とし穴」
① 図面のバージョン互換性
`doc.SaveAs` メソッドを使う際、第2引数の `Version` を省略してはいけません。古いAutoCADで開く必要がある場合、`ac2013_dwg` などの定数を明示的に指定しないと、最新形式で保存されてしまい、現場の誰かが開けなくなる事故が発生します。
② 「ActiveDocument」の罠
コード内で `ThisDrawing` を多用していませんか? バッチ処理中は、「今どの図面がアクティブか」が非常に不安定になります。常に `doc` オブジェクト(引数で渡したもの)を明示的に指定する癖をつけてください。
③ プロンプトの抑制
AutoCADが「この図面は読み取り専用で開きますか?」といったダイアログを出すと、マクロはそこで停止します。`Application.FileDia = 0` を一時的にセットして、ダイアログを無効化するテクニックも検討しましょう。
—
最後に:自動化エンジニアの心得
ここまでできれば、あなたはもうマクロの記録係ではありません。図面管理という退屈な作業から解放され、よりクリエイティブな設計に時間を割くことができます。
次なるステップ:
もし数千枚単位の処理が必要になったら、次は「ObjectDBX(AxDbDocument)」を学んでください。図面を一切画面に出さず、メモリ上だけで図形を操作する、まさに「伝説のエンジニア」の領域です。
ここをクリアすれば、AutoCAD VBAの基本はバッチリです。あなたの自動化ライフが、より快適なものになることを願っています。何か詰まったら、いつでも戻ってきてくださいね。応援しています!
