【入門編】【初心者向け】図面の「読み取り専用」状態を判定し、書き込み不可時のエラーを未然に防ぐAcadDocumentの運用 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステップから抜け出し、「いよいよ本格的な自動化ツールを作りたい!」という熱いエンジニアの卵たちと日々向き合っている先輩エンジニアです。

さて、業務で大量の図面を一括処理するマクロを作っていると、必ずと言っていいほどぶつかる壁があります。それが「他の人が開いている図面をうっかり上書きしようとしてエラーでマクロが強制終了してしまう問題」です。

現場で「なぜか夜間に走らせたバッチ処理が途中で止まって朝泣きを見た……」という悲劇を起こさないために、今回はAutoCAD VBAの心臓部である `AcadDocument` オブジェクトを使いこなし、図面の「読み取り専用(ReadOnly)」状態をスマートに判定・回避する極意を伝授します。

ここをクリアすれば、あなたの書くマクロの「実用性・堅牢性」はプロの領域に一歩近づきますよ。さあ、一緒に扉を開けましょう!

1. なぜ「読み取り専用」の判定が必要なのか?

AutoCADの図面(DWGファイル)は非常にデリケートです。社内の共有サーバーやPDM上で、誰かがすでに開いている図面を別の誰かが「書き込み権限あり」で開こうとすると、AutoCADはお馴染みの警告ダイアログを出してブロックします。

ここで人間が操作していればダイアログの「読み取り専用で開く」をクリックして回避できますが、VBAなどのプログラムが裏で動いているときは、このダイアログが原因で処理が完全にフリーズ(無応答)してしまいます。

さらに、運良く読み取り専用として開けたとしても、知らずにマクロが図面内の線を一本でも変更して `Save` を実行しようものなら……。
「エラー番号: 424オブジェクトが必要です」や「図面が読み取り専用です」といった残酷なランタイムエラーが発生し、マクロは無残にクラッシュします。

だからこそ、「開く前、あるいは開いた瞬間に、その図面が書き込み可能かどうかをプログラム自身が知る必要がある」のです。

2. AcadDocumentの `ReadOnly` プロパティという羅針盤

AutoCAD VBAには、現在アクティブな図面や、開かれているドキュメントを操作するための `AcadDocument` というオブジェクトが用意されています。

このオブジェクトには、図面の状態を知るための様々なプロパティが備わっていますが、今回最も重要になるのが `ReadOnly` プロパティ です。

`ReadOnly` プロパティの仕様

  • 戻り値: `Boolean` 型 (`True` または `False`)
  • `True` の場合: 図面は「読み取り専用」として開かれています(誰かが開いている、またはファイルに書き込み権限がない)。変更の保存(上書き)はできません。
  • `False` の場合: 図面は「書き込み可能(通常)」な状態で開かれています。自由に保存が可能です。

非常にシンプルですが、この真偽値をいかに的確なタイミングでキャッチし、分岐させるかが、プログラマの腕の見せ所です。

3. 実践!安全に図面を裁くコードレシピ

それでは、実際に現場でそのままコピペして使える実用的なサンプルコードを見ていきましょう。
このコードでは、現在アクティブになっている図面が読み取り専用かどうかを判定し、もし書き込み不可であればメッセージを出して安全に処理をスキップ、書き込み可能であれば「自動化処理のシミュレーション」を行う流れを記述しています。

Sub CheckDrawingReadOnlyStatus()
‘ —————————————————————–
‘ プロシージャ名: CheckDrawingReadOnlyStatus
‘ 概要: 現在のアクティブ図面の読み取り専用状態を判定し、
‘ 書き込み不可時のエラーを未然に防ぐ実用サンプル
‘ —————————————————————–

Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument

‘ 1. AutoCADのアプリケーションオブジェクトを取得
‘ ※VBAをAutoCAD内部(VBAIDE)から実行している場合は GetObject(, “AutoCAD.Application”) でも可
Set acadDoc = ThisDrawing

‘ 2. エラーハンドリングの準備(念のための保険)
On Error GoTo ErrorHandler

‘ 3. ReadOnlyプロパティによる状態判定の核心
If acadDoc.ReadOnly = True Then
‘ — 【ケースA】 読み取り専用の場合 —
MsgBox “【警告】この図面は現在「読み取り専用」で開かれています。” & vbCrLf & _
“他のユーザーが使用中のため、変更の保存はできません。” & vbCrLf & _
“処理をスキップします。”, _
vbExclamation + vbOKOnly, “読み取り専用の検出”

‘ ここで処理を安全に抜け出す(Exit Sub)
Exit Sub

Else
‘ — 【ケースB】 書き込み可能な場合 —
MsgBox “この図面は書き込み可能です。自動処理を開始します。”, _
vbInformation + vbOKOnly, “ステータス正常”

‘ ————————————————————-
‘ ここに本来の業務自動化処理(レイヤー作成、文字一括置換など)を記述
‘ 例: 処理が成功したと仮定して図面を保存する場合
‘ acadDoc.Save
‘ ————————————————————-

MsgBox “自動処理が正常に完了しました。”, vbInformation, “完了”
End If

Exit Sub

ErrorHandler:
‘ 予期せぬエラーが発生した際のトラップ
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”

End Sub

コードの解説のポイント

1. `ThisDrawing` の活用: AutoCAD内蔵VBAであれば、`ThisDrawing` はそのまま現在の `AcadDocument` を指します。これを変数 `acadDoc` に受けてプロパティを叩くのが安全です。
2. `If acadDoc.ReadOnly = True Then`: ここが今回のテーマの心臓部です。この条件分岐を挟むだけで、読み取り専用図面に対する無謀な書き込みトライを防ぎ、プログラムを優しく離脱(`Exit Sub`)させることができます。
3. ユーザーへの親切なフィードバック: 単にプログラムを止めるだけでなく、なぜ処理をしなかったのかを `MsgBox` でユーザーに伝えるのが、愛されるツールを作るエンジニアの流儀です。

4. 現場で陥りがちな「よくある罠」と回避策

初心者から一歩抜け出すために、この `ReadOnly` 判定やドキュメント操作に関連して、現場でよくある失敗パターンをいくつか共有しておきます。

罠その1:「ファイルを開くとき」の制御を忘れている

今回のサンプルは「すでに開いている図面」の判定ですが、VBAから `Documents.Open` メソッドを使って外部の図面を次々と開いてバッチ処理する場合は、開くコード自体がエラーを吐くことがあります。
外部図面を操作する場合は、ファイルを開く際に `ReadOnly` 引数(オプション)を制御するか、ファイルシステムオブジェクト(FSO)などで事前にファイルの属性(読み取り専用属性)をチェックするアプローチも併用すると、より鉄壁になります。

罠その2:マルチドキュメント環境での `ActiveDocument` の勘違い

AutoCADは複数の図面を同時に開けるMDI(マルチドキュメントインターフェイス)環境です。
「今、ユーザーが見ている図面」と「VBAが裏で操作しようとしている図面」がズレていると、意図しない図面に対して `ReadOnly` チェックを行ってしまいます。
複数図面をループ処理するような高度なマクロを書くときは、`Application.Documents` コレクションを回し、個々のドキュメントオブジェクトに対して `ReadOnly` を判定する癖をつけましょう。

おわりに:堅牢なマクロは「優しさ」からできている

お疲れ様でした!今回は `AcadDocument` の `ReadOnly` プロパティを通じた、実務に直結するエラー回避のテクニックを解説しました。

動けばいいや、と雑に書いたコードは、少し環境が変わったり、他の人が使ったりした瞬間に簡単に壊れてしまいます。しかし、今回のように「相手(図面)の状態を思いやり、状況に合わせてスマートに身を引く(あるいは警告を出す)」コードを書けるようになると、あなたの作るマクロは一気に「プロフェッショナルなツール」へと生まれ変わります。

ここをクリアしたあなたなら、もうマクロの記録のユーザーではありません立派なAutoCAD VBAエンジニアです。
ぜひ、日々の業務効率化にこの知見を役立ててくださいね。それでは、次回の極意でお会いしましょう!

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