AutoCAD VBAを掌握せよ:ReadOnlyの真実と「破壊しない」設計思想
AutoCADの自動化において、最も初歩的でありながら、最も多くのエンジニアが設計ミスを犯す箇所。それが「ファイルのオープンモード」だ。
「とりあえず開いて、閉じる」。そんな安易な実装は、大規模な図面管理システムでは致命的なバグの温床となる。今回は、現場で生き残るための「ファイルオープン戦略」を、プロの視点から紐解く。
—
1. なぜ「ReadOnly」を正しく選ばねばならないのか
AutoCADの`Open`メソッドには、`ReadOnly`という引数が存在する。初心者はこれを「単に書き込みを禁止するもの」と考えがちだが、本質はそこではない。
真の目的は「ロックの解放」と「メモリ消費の最小化」だ。
- ReadOnlyで開くべきケース:
- 帳票出力用データ抽出(BOM集計、図面情報リスト作成)
- 図面整合性チェック(規定外の画層やブロックの使用確認)
- プレビュー生成・サムネイル保存
- 通常モード(書き込み可)で開くべきケース:
- 属性情報の自動書き換え
- 図面規格への強制適合処理(画層一括変換など)
ReadOnlyで開けば、他者がその図面を開いて作業していても競合しない。「業務を止めない自動化」の第一歩は、必要以上に図面を占有しないことにある。
—
2. 実務で「詰む」ポイント:Openメソッドの罠
AutoCAD VBAで`Documents.Open`を実行する際、単にパスを指定するだけでは甘い。以下のコードを見てほしい。
‘ 【アンチパターン】これだけでは現場で通用しない
Documents.Open “C:\Project\Sample.dwg”
この実装では、ファイルが既に他の誰かに開かれている場合や、読み取り専用属性がついている場合に、AutoCADがダイアログを表示して処理を止めてしまう。 自動化ツールが途中でフリーズして待機状態になるのは、エンジニアとして最も避けるべき醜態だ。
—
3. プロダクション環境に耐えうる「堅牢なオープン関数」
以下は、私がプロジェクトで必ず共通モジュールに組み込む「制御付きオープン関数」だ。エラーハンドリングとモード選択を分離し、保守性を高めている。
‘ 図面を安全に開くためのラッパー関数
‘ @param filePath: 開くファイルのフルパス
‘ @param openReadOnly: Trueなら読み取り専用、Falseなら通常
‘ @return 開いたDocumentオブジェクト(失敗時はNothing)
Public Function SafeOpenDocument(ByVal filePath As String, ByVal openReadOnly As Boolean) As AcadDocument
Dim doc As AcadDocument
‘ ファイル存在チェックは必須
If Dir(filePath) = “” Then
MsgBox “ファイルが見つかりません: ” & filePath, vbCritical
Exit Function
End If
On Error Resume Next
‘ 引数にReadOnlyを指定。これをTrueにすることで競合を回避する
Set doc = ThisDrawing.Application.Documents.Open(filePath, openReadOnly)
If Err.Number <> 0 Then
MsgBox “図面を開けませんでした。” & vbCrLf & “理由: ” & Err.Description, vbExclamation
Set SafeOpenDocument = Nothing
Else
Set SafeOpenDocument = doc
End If
On Error GoTo 0
End Function
この設計のポイント
1. On Error Resume Nextの局所化: オープン処理特有の「ファイル占有によるエラー」を捕捉し、意図しないダイアログを表示させない。
2. 戻り値の設計: 失敗時に`Nothing`を返すことで、呼び出し元で「処理を中断すべきか、スキップすべきか」のロジック判断を可能にする。
—
4. 運用時の注意:閉じるタイミングの徹底
ファイルを開いたら、必ず閉じる。当たり前だが、ループ処理の中でこれを見落とすと、メモリリークでAutoCADは数分でクラッシュする。
‘ 使用例
Dim targetDoc As AcadDocument
Set targetDoc = SafeOpenDocument(“C:\Design\Layout.dwg”, True)
If Not targetDoc Is Nothing Then
‘ ここで抽出処理を行う
Debug.Print targetDoc.Name
‘ 処理が終わったら即座に閉じる
targetDoc.Close False ‘ Falseは「変更を保存せずに閉じる」の意味
Set targetDoc = Nothing
End If
結論:あなたのツールは「他者を邪魔していないか?」
現場で「自動化ツールを使うと重くなる」「図面がロックされて開けない」と苦情が来る場合、それはReadOnlyの使い方が甘い証拠だ。
1. 読み取るだけなら、徹底してReadOnlyで開く。
2. 書き込みが必要な時だけ、排他制御を考慮する。
3. エラーはダイアログで止めず、ログに残すか戻り値で処理する。
この3点を徹底するだけで、あなたの作成するツールは「ただのスクリプト」から「業務を支える堅牢なシステム」へと進化する。次のリリースでは、ぜひこの制御を組み込んでみてほしい。君のコードが変われば、現場の空気も変わるはずだ。
