【実務・中級編】【初心者向け】「読み取り専用」で開くべきか「通常」で開くべきか:実務上の判断基準とVBAでの切り替え – AutoCAD VBA解析バイブル

スポンサーリンク

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点を徹底するだけで、あなたの作成するツールは「ただのスクリプト」から「業務を支える堅牢なシステム」へと進化する。次のリリースでは、ぜひこの制御を組み込んでみてほしい。君のコードが変われば、現場の空気も変わるはずだ。

タイトルとURLをコピーしました