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` 判定は、ほんの数行のコードですが、これがあるだけであなたのマクロの信頼性は段違いに向上します。
「自分の書いたコードが、誰かの作業を助け、守っている」
そう実感できた時、あなたはもう初心者ではありません。次のステップでは、図面内のオブジェクトをループで回す方法について深掘りしていきましょう。
もしコードが期待通りに動かない?そんな時は、いつでもこの記事に戻ってきてください。コードは裏切りません。応援していますよ!
