【入門編】【初心者】AcadDocument.ReadOnlyプロパティによる「編集不可図面」の誤操作防止と警告表示 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの守護神:ReadOnly判定で「保存できない地獄」を回避する

こんにちは。AutoCADの自動化という深淵に足を踏み入れたあなたを歓迎します。

マクロの記録を卒業し、自分の手でコードを書こうとしているあなたは、すでに「エンジニア」の入り口に立っています。しかし、開発現場で最も恐ろしいのは、「時間をかけて処理したのに、最後に保存できず全てが水の泡になる」という悲劇です。

今日は、AutoCAD VBAの基礎にして奥義、`AcadDocument.ReadOnly`プロパティを使った「鉄壁のガードコード」の実装術を伝授します。

なぜ、ReadOnly(読み取り専用)を判定する必要があるのか?

AutoCADで図面を開く際、誰かが既にそのファイルを開いていたり、サーバーの権限が制限されていたりすると、図面は「読み取り専用」で開かれます。

この状態で、あなたが一生懸命書いた「図面を編集し、上書き保存するマクロ」を走らせたらどうなるか?

1. エラー発生: 保存処理で「ファイルに書き込めません」とVBAが悲鳴を上げる。
2. 作業消失: せっかく計算して描画したデータがメモリ上から消え、何も残らない。
3. 精神的ダメージ: エンジニアとして一番避けたい徒労感。

これを未然に防ぐのが、今回解説する「ガードコード」の役割です。

核心となるオブジェクト:AcadDocument

AutoCAD VBAにおいて、現在開いている図面は `ThisDrawing` という特別なオブジェクトで表されます。これは `AcadDocument` 型のインスタンスです。

この `ThisDrawing` には、図面の状態を知るための「プロパティ」が山ほどあります。その中の一つが `.ReadOnly` です。

  • `ThisDrawing.ReadOnly = True`: 今、図面は閲覧専用です。編集してはいけません。
  • `ThisDrawing.ReadOnly = False`: 自由に編集・保存してOKです。

これを利用して、処理の冒頭で「門番」を立たせるのです。

実装コード:鉄壁のガードコード

以下のコードは、どんなマクロの先頭にも組み込める「汎用テンプレート」です。

Sub SafeDrawingProcess()
‘ — 門番(ガード)のセクション —
‘ 現在開いている図面が読み取り専用か判定する
If ThisDrawing.ReadOnly Then
‘ 警告を表示し、処理を即座に中止する
MsgBox “【警告】この図面は読み取り専用です!” & vbCrLf & _
“編集作業は実行できません。保存によるデータ消失を防ぐため中断します。”, _
vbCritical, “ガード発動:操作中断”
Exit Sub
End If
‘ ——————————

‘ ここから下に、あなたが本来やりたかった処理を記述します
MsgBox “図面は書き込み可能です。処理を開始します。”

‘ 例:レイヤーを作る、図形を描くなどの処理…
End Sub

コードの解説:ここがエンジニアのこだわり

  • `vbCrLf`: 改行コードです。メッセージボックスを見やすく整形するプロの嗜みです。
  • `vbCritical`: メッセージボックスに「×」のアイコンを表示させ、ユーザーに「これは警告だ」と直感的に伝えます。
  • `Exit Sub`: これが最も重要です。条件に合致しなかった場合、プログラムを「即座に終了」させ、その後の危険な処理を一切実行させません。

初学者が陥りやすい「落とし穴」

1. `ThisDrawing` とは何か?

初心者の方は「なぜ `Set doc = …` と書かなくていいの?」と疑問に思うかもしれません。`ThisDrawing` はAutoCADのVBA環境において、「現在アクティブな図面」を指し示すショートカットのようなものです。非常に便利ですが、複数の図面を開いているときは注意が必要。基本的には「今見ている図面」を操作する前提で使いましょう。

2. 「保存」コマンドをコードに入れるべし

ガードコードを入れたなら、処理の最後には必ず `ThisDrawing.Save` を入れるのがセットです。これで「読み取り専用なら最初から動かない、編集可能なら必ず保存される」という確実なワークフローが完成します。

まとめ:エンジニアとしての第一歩

「動くコード」を書くのは簡単です。しかし、「壊れないコード」「想定外の事態で被害を出さないコード」を書くのが、真のエンジニアです。

今日学んだ `ReadOnly` 判定は、ほんの数行のコードですが、これがあるだけであなたのマクロの信頼性は段違いに向上します。

「自分の書いたコードが、誰かの作業を助け、守っている」

そう実感できた時、あなたはもう初心者ではありません。次のステップでは、図面内のオブジェクトをループで回す方法について深掘りしていきましょう。

もしコードが期待通りに動かない?そんな時は、いつでもこの記事に戻ってきてください。コードは裏切りません。応援していますよ!

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