AutoCAD VBAで「読み取り専用」の壁を突破する:安全な自動保存術
こんにちは。現場で日々、AutoCADの自動化と格闘しているエンジニアの皆さん。
「マクロの記録」から卒業し、自力でコードを書くようになると、必ず一度はぶつかる壁があります。それが「読み取り専用(ReadOnly)の図面」の取り扱いです。
せっかく書いた自動化ツールが、「ファイルが書き込み禁止です!」という無機質なエラーで停止してしまう。あれほどやる気を削がれることはありませんよね。
今日は、AutoCAD VBAの深い部分に触れながら、「読み取り専用ファイルを検知し、安全に別名保存(名前を付けて保存)へ誘導する」という、実務で死ぬほど役に立つテクニックを伝授します。
—
なぜ「読み取り専用」を判定する必要があるのか?
AutoCADのAPIは非常に強力ですが、権限がないファイルに対して無理やり書き込みを行おうとすると、VBAエンジンは「予期せぬエラー」を吐いて沈黙します。
- 共有サーバー上の誰かが開いているファイル
- 読み取り専用属性が付与されたテンプレート
- 権限のないフォルダにある図面
これらを「開く前に判定」し、ユーザーに代わって「別名保存」という逃げ道を作ってあげること。これが、「止まらないツール」を作るための第一歩です。
—
極限の知見:判定と保存のロジック
まずは、今回の中核となるロジックを見てみましょう。ポイントは`Database`オブジェクトのプロパティを賢く使うことです。
Public Sub SaveAsIfReadOnly()
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ 1. 現在の図面が「読み取り専用」かどうかをチェック
‘ ThisDrawing.ReadOnly は、ファイルが開かれた瞬間の属性を保持しています
If doc.ReadOnly Then
MsgBox “この図面は「読み取り専用」です。安全のため、タイムスタンプ付きで別名保存します。”, vbExclamation
‘ 2. 保存用のパスを生成(現在のパスにタイムスタンプを付与)
Dim newName As String
Dim timeStamp As String
timeStamp = Format(Now, “yyyyMMdd_HHmmss”)
‘ ファイル名から拡張子を除いた部分にタイムスタンプを結合
newName = Left(doc.FullName, InStrRev(doc.FullName, “.”) – 1) & “_” & timeStamp & “.dwg”
‘ 3. エラーハンドリングを忘れずに
On Error Resume Next
doc.SaveAs newName
If Err.Number <> 0 Then
MsgBox “保存に失敗しました。書き込み権限を確認してください。” & vbCrLf & “エラー内容: ” & Err.Description, vbCritical
Else
MsgBox “別名保存が完了しました: ” & vbCrLf & newName
End If
On Error GoTo 0
Else
‘ 読み取り専用でなければ、そのまま上書き保存(あるいは処理続行)
doc.Save
MsgBox “上書き保存しました。”
End If
End Sub
—
コードのここがポイント! 3つの極意
1. `ThisDrawing.ReadOnly` プロパティの正体
このプロパティは「現在の図面が書き込み可能かどうか」をbool値(True/False)で返します。非常にシンプルですが、これを知っているだけで「保存時に落ちる」という事故の9割を防げます。
2. `InStrRev` でパスを分解するテクニック
`doc.FullName` は「C:\Project\Drawing.dwg」のような完全なパスを返します。ここからファイル名だけを抜き出し、後ろにタイムスタンプをくっつける。`InStrRev`関数で右からドットを探すのが、文字列操作の定石です。
3. ユーザーをパニックにさせない `On Error`
自動化において一番やってはいけないのは、ユーザーに「VBAのエラーメッセージ(デバッグウィンドウ)」を見せることです。必ず`On Error Resume Next`で処理を拾い、自分たちで作成したメッセージボックスで状況を伝えてください。
—
実務で陥りやすい罠:ファイルシステムとのギャップ
ここで一つ、皆さんに注意点があります。
「ReadOnlyプロパティがFalseでも、保存に失敗するケースがある」ということです。
なぜか? それは、AutoCADが「読み取り専用ではない」と認識していても、WindowsのOSレベルでフォルダの書き込み権限がなかったり、一時的にネットワークが切断されたりする可能性があるからです。
だからこそ、「保存コマンドは常にエラーハンドリングで囲む」のが、真のエンジニアの流儀です。
—
まとめ:ここをクリアすれば、あなたはもう脱初心者
今回紹介した「読み取り専用の判定と別名保存」は、実務自動化における「防御的プログラミング」の基本です。
1. 現状を確認する(ReadOnlyチェック)
2. 安全な代替案を用意する(タイムスタンプ付き保存)
3. 万が一に備える(エラーハンドリング)
この3ステップを意識するだけで、あなたの書くVBAコードの信頼性は劇的に向上します。
「マクロの記録」で生成されたコードをただ繋ぎ合わせる段階を卒業し、こうした「システムの状態」を管理できるようになれば、あなたはもう立派なAutoCAD開発者です。
次は、これを「図面を開いた瞬間に自動実行するイベントハンドラ」に組み込んでみると、さらに世界が広がりますよ。応援しています!
