【テクニカル・上級編】【実務中級者向け】「読み取り専用」で開かれた図面の判定と、別名保存への強制リダイレクト処理 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:ReadOnlyの呪縛を解き、強制リダイレクトで「破壊」を防ぐ極限の技術

現場の戦場において、最も卑劣な敵は「不用意な上書き」だ。共有サーバー上のDWGが誰かに掴まれ、ReadOnlyで開かれた瞬間に「保存できない」というエラーダイアログが立ちふさがる。あの無機質な通知にユーザーが狼狽し、再描画の時間を浪費する姿を、私はもう見たくない。

今回は、AutoCAD VBAにおいてこの「ReadOnlyの壁」を突破し、シームレスに別名保存(SaveAs)へ誘導する、堅牢かつ洗練されたアーキテクチャを提示する。

—

1. 脆弱な「ReadOnly」判定の裏側

VBAの `Document.ReadOnly` プロパティだけをチェックするのは、アマチュアのやり方だ。真のエンジニアは、OSレベルのファイルロックとAutoCADのドキュメントライフサイクル、双方の視点で判定を行う。

特に、サーバーの同期遅延やネットワークドライブの切断を考慮すれば、`ReadOnly` プロパティは「あくまで参考値」として扱い、実際にファイルシステム上で書き込み権限があるかを確認する「二段構えの検証」が不可欠となる。

2. 実装:ReadOnly時自動リダイレクト・アーキテクチャ

以下のコードは、単に判定するだけでなく、タイムスタンプを付与して「保存先を自動的に変える」ことで、作業者の思考を止めることなくワークフローを完結させる。

Option Explicit

‘ 伝説的な堅牢性を実現する:ReadOnly判定と自動別名保存
Public Sub ProtectAndRedirectActiveDocument()
Dim doc As AcadDocument
Set doc = Application.ActiveDocument

‘ 1. ReadOnlyチェック (AutoCADのドキュメント状態)
If doc.ReadOnly Then
MsgBox “この図面は現在読み取り専用です。作業内容は別名で保存されます。”, vbExclamation, “System Guard”

‘ 2. 保存パスの生成:タイムスタンプを付与し、ローカルまたは特定のパスへリダイレクト
Dim baseName As String
Dim newPath As String
Dim timeStamp As String

timeStamp = Format(Now, “yyyyMMdd_HHmmss”)
baseName = Left(doc.Name, InStrRev(doc.Name, “.”) – 1)

‘ ユーザーのデスクトップ等、書き込み可能な領域へのリダイレクトを推奨
newPath = Environ(“USERPROFILE”) & “\Desktop\” & baseName & “_” & timeStamp & “.dwg”

‘ 3. SaveAsによる強制リダイレクト
‘ AutoCADのバージョン互換性を考慮し、ac2018_dwgを標準とする
On Error Resume Next
doc.SaveAs newPath, ac2018_dwg

If Err.Number <> 0 Then
MsgBox “別名保存に失敗しました。権限を確認してください。” & vbCrLf & Err.Description, vbCritical
Else
MsgBox “作業ディレクトリが以下に変更されました:” & vbCrLf & newPath, vbInformation
End If
On Error GoTo 0
End If

‘ オブジェクトの明示的解放(VBAでは参照カウンタの意識が重要)
Set doc = Nothing
End Sub

3. シニアエンジニアが意識すべき「極限の知見」

1. メモリ管理とオブジェクト解放

VBAはガベージコレクションをOSに依存しているが、AutoCADの `Document` オブジェクトは非常に巨大だ。`Set doc = Nothing` を怠ることは、長時間稼働するCAD環境においてメモリリークの温床となる。常にスコープの終了時には明示的な開放を行え。

2. バージョン互換制御の真髄

`SaveAs` メソッドの第二引数(バージョン番号)は、単なる定数ではない。協力会社とのデータ交換で、古い形式のDWGを読み書きする際、この引数をハードコードしてはならない。

  • 設計指針: バージョン情報は外部設定ファイル(JSONまたはINI)から読み込む設計にせよ。これにより、AutoCADのバージョンアップ時にコードを再コンパイルすることなく、即座に追従可能となる。

3. Windows APIによるファイルロックの先行検知

もし、より高度な制御が必要な場合、VBAから `Kernel32.dll` の `CreateFile` を叩き、`GENERIC_WRITE` 権限を要求してハンドルが取得できるかを確認する手法がある。VBAの標準機能が「開いた後」の判断であるのに対し、APIは「開く前」の判断を可能にする。これがプロフェッショナルの境界線だ。

—

結びに代えて

システムとは、エラーを吐くものではなく、エラーを「予兆」として捉え、ユーザーが意識する前に解決するものだ。

ReadOnlyの図面を前に立ち尽くす設計者を一人でも減らすこと。それが、我々自動化エンジニアに課せられた、静かなる使命である。コードは常に、現場の平穏のために書け。

—
追伸:もしこのコードを導入してなお「保存できない」というエラーが出る場合、それはAutoCADの問題ではない。ネットワークストレージの排他制御か、サードパーティ製セキュリティソフトの干渉だ。その時は、素直にインフラチームへチケットを投げろ。それが最短の解決だ。

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