【AutoCAD VBA】図面開放の「事故」をゼロにする。堅牢なオープン制御の極意
AutoCADの自動化において、最も初歩的かつ致命的なミス。それは「意図しない図面を不用意に開き、編集プロセスを破壊すること」だ。
業務効率化ツールを開発する際、多くのエンジニアは「何を実行するか」に注力する。しかし、真のプロフェッショナルは「何を実行させないか」に心血を注ぐ。特に図面ファイル操作は、一度の誤操作が数百時間の設計資産を台無しにするリスクを孕んでいる。
今日は、VBAを用いて図面オープン時の「安全装置」を実装するアーキテクチャを伝授する。
—
なぜ、単純な `Documents.Open` では不十分なのか
初心者が書くコードは、往々にしてこうだ。
‘ 危険な例:ガードレールがない
ThisDrawing.Application.Documents.Open(“C:\Project\Sample.dwg”)
これでは、現在アクティブな図面の未保存データが吹き飛ぶリスクや、読み取り専用モードへの配慮が皆無だ。「ファイルパスがあれば開く」という発想は、実務では「エンジニアの怠慢」と同義である。
堅牢な設計には以下の3要素が欠かせない。
1. ユーザーへのインタラクティブな確認(意図の確認)
2. 例外処理(ファイル不在、ロック中、読み取り専用のハンドリング)
3. オブジェクトライフサイクルの管理(メモリリークの防止)
—
プロダクション環境に耐えうる「安全なオープン関数」
以下は、私が実際の現場で標準ライブラリとして採用しているコードだ。これをモジュールに組み込み、すべての図面操作のゲートウェイとして使用してほしい。
Option Explicit
”’
”’
”’ 開きたいファイルのフルパス
”’ Trueの場合、読み取り専用で開く
Public Sub SafeOpenDrawing(ByVal filePath As String, Optional ByVal readOnly As Boolean = False)
Dim doc As AcadDocument
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. ファイル存在確認(事前チェックの徹底)
If Not fso.FileExists(filePath) Then
MsgBox “エラー:ファイルが見つかりません。” & vbCrLf & filePath, vbCritical
Exit Sub
End If
‘ 2. ユーザーへのプロンプト(意図的な操作かを確認)
Dim msg As String
msg = “以下の図面を開きますか?” & vbCrLf & _
“——————————–” & vbCrLf & _
filePath & vbCrLf & _
“——————————–”
If MsgBox(msg, vbQuestion + vbYesNo + vbDefaultButton2, “図面オープン確認”) = vbNo Then
Exit Sub
End If
‘ 3. エラーハンドリングを伴うオープン処理
On Error GoTo ErrorHandler
Set doc = ThisDrawing.Application.Documents.Open(filePath, readOnly)
doc.Activate
Exit Sub
ErrorHandler:
MsgBox “オープン中にエラーが発生しました:” & vbCrLf & Err.Description, vbCritical
‘ 必要に応じてログ出力処理などを追加
End Sub
—
この設計が「堅牢」である理由
1. FSO(FileSystemObject)による事前検証
`Documents.Open` を叩く前に `FileSystemObject` でファイルパスを検証している。AutoCADのAPIがエラーを投げる前に、VBA側で論理チェックを完了させることで、予期せぬ実行時エラーを最小化できる。
2. ユーザーの「ブレーキ」を強制する
`vbDefaultButton2` を設定し、誤ってEnterキーを押しても「いいえ」が選択されるようにしている。これはUI/UXの基本であり、人為的ミスを防ぐための最強の防御壁だ。
3. セッション管理の意識
`doc.Activate` を呼ぶことで、開いた直後のオブジェクトが確実にアクティブ状態であることを保証している。これにより、オープン直後の図面に対してコマンドを投げる際、「どの図面に対して処理しているか不明」というバグを完全に排除できる。
—
プロの視点:さらに上のレベルへ
もしあなたが、さらに大規模な自動化システムを構築するなら、以下の点も考慮すべきだ。
- ReadOnlyフラグの動的制御:
図面が開かれているか(`.dwl`ファイルの有無)を検知し、編集権限がない場合は自動的に `readOnly = True` にスイッチするロジックを組み込むこと。
- イベント駆動との併用:
`AcadApplication` の `BeginOpen` イベントを監視すれば、ユーザーが手動で図面を開く際にもこの検証を走らせることが可能だ。
最後に:エンジニアとしての矜持
コードを書くことは、誰かの業務の「リスク」を引き受けることだ。
「動けばいい」というコードは、数ヶ月後の自分や、そのツールを使う同僚を裏切る。今回紹介したような、些細だが確実なガードレールを敷くことこそが、真のエンジニアリングである。
さあ、このコードをあなたのツールに組み込み、一歩先の「破壊されない開発」を実現してほしい。
