【上級】AcadApplication.Preferences.Files.AutoSavePathをネットワークドライブへ自動変更し、PC故障時の図面消失リスクをゼロにする
開発プロジェクトのリーダーである私から、現場のエンジニアたちに問いたい。
「設計者が魂を込めて何時間も修正した図面が、突然のブルースクリーンや電源ユニットの焼損によってパァになった」——そんな悪夢を、過去に何度経験しただろうか?
AutoCADの標準機能である自動保存(`SAVETIME`)は確かに強力だ。しかし、初期設定のままではローカルPCの隠しフォルダ(`C:\Users\…`)に一時ファイルが吐き出される。PCが物理的に沈黙した瞬間、その日の成果物はすべて闇に消える。バックアップを取っていなかった設計者の青ざめた顔を見るのは、もう終わりにするべきだ。
今回は、`AcadApplication.Preferences.Files` オブジェクトを極限までハックし、起動時に自動保存先をセキュアなネットワークドライブ(サーバー上の個人フォルダ)へ動的にリダイレクトする、堅牢なプロダクションコードを授けよう。
—
なぜこの設計が必要なのか?(素人がやりがちなアンチパターン)
この課題を素人が解決しようとすると、往々にして以下のような愚行に走る。
1. 手動設定の強要:「全員、オプション画面から保存先をサーバーに変えておいてね」とチャットで流す。
→ 結果: やらない奴が必ず現れ、トラブル時に「知りませんでした」で終わる。人間の意思決定に依存した運用はシステムとは言えない。
2. ACAD.LSPやテンプレートへのベタ書き:LISPやカスタムテンプレートでパスを固定する。
→ 結果: ネットワークドライブのパスが組織変更や個人ごとに異なる場合、スクリプトがハードコーディングの嵐になり破綻する。
我々が目指すべきは、「CAD起動と同時に、環境やユーザーIDを動的に解決し、レジストリ(Preferences)をプログラム側から安全にねじ伏せる」というアプローチだ。
—
堅牢な設計のための3つの技術的要件
実務の現場でこのマクロを稼働させるにあたり、以下の障害をクリアしなければならない。
1. ネットワークの存在確認とフォールバック
社内LANやVPNが切断されている状態でネットワークパスを指定すると、AutoCAD自体がフリーズするか、パスの書き込みエラーでVBAがクラッシュする。必ず事前にパスの生存確認(Errハンドリング)を入れること。
2. ユーザー固有動的パスの生成
`\\server\share\users\%USERNAME%\AutoCAD\Backup\` のように、Windows環境変数から動的にパスを組み立てる必要がある。
3. フォルダの自動生成(MkDirの罠)
指定したネットワーク上に「AutoCAD」や「Backup」フォルダが存在しなければ、`Path`プロパティへの代入時にエラーが発生する。VBA側で事前にディレクトリツリーを構築する防衛的プログラミングが不可欠だ。
—
【プロダクションコード】コピペで即導入できる堅牢なVBAモジュール
以下のコードは、エラーハンドリング、ネットワークの疎通、フォルダの自動生成、そしてAutoCADへの設定反映を完璧に網羅した実戦投入仕様のモジュールである。
Option Explicit
‘ Windows API: フォルダの存在確認や作成を確実に行うためのFileSystemObjectを使用するため宣言は最小限に
‘ ——————————————————————————–
‘ メインエントリーポイント:AutoCAD起動時(AcadDoc.dvbのStartup等)に呼び出すこと
‘ ——————————————————————————–
Public Sub SetEnterpriseAutoSavePath()
On Error GoTo ErrorHandler
Dim acadApp As AcadApplication
Set acadApp = ThisDrawing.Application ‘ または GetObject(, “AutoCAD.Application”)
Dim wsh As Object
Set wsh = CreateObject(“WScript.Shell”)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. 環境変数からユーザー名を取得し、ベースとなるネットワークパスを動的構築
‘ ※組織のファイルサーバー構成に合わせてルートパスを変更してください
Dim networkRoot As String
networkRoot = “\\fs01.corp.local\engineering\UserBackup\” & wsh.ExpandEnvironmentStrings(“%USERNAME%”) & “\AutoCAD_AutoSave\”
‘ 2. ネットワークパスの親が存在するか(サーバーに接続されているか)のチェック
Dim serverRoot As String
serverRoot = “\\fs01.corp.local\engineering\”
If Not fso.FolderExists(serverRoot) Then
MsgBox “警告: 設計部サーバー(fs01)への接続が確認できません。” & vbCrLf & _
“自動保存先はローカルのままで継続します。ネットワーク接続を確認してください。”, _
vbExclamation + vbApplicationModal, “AutoCADセーフティ起動”
Exit Sub
End If
‘ 3. ユーザー専用のバックアップフォルダが存在しなければ、再帰的に自動生成
If Not fso.FolderExists(networkRoot) Then
Call CreateDirectoryTree(fso, networkRoot)
End If
‘ 4. AcadPreferencesFiles を介して自動保存パスを書き換え
‘ ★ここが本テーマの核心部
Dim prefs As AcadPreferences
Set prefs = acadApp.Preferences
‘ 現在のパスと異なる場合のみ書き込み(無駄なレジストリ書き込みを抑制)
If StrComp(prefs.Files.AutoSavePath, networkRoot, vbTextCompare) <> 0 Then
prefs.Files.AutoSavePath = networkRoot
‘ ついでに自動保存間隔(分)を15分から10分へ強制的最適化
acadApp.SetSystemVariable “SAVETIME”, 10
‘ ログ出力(実運用ではDebug.Printをファイル出力に拡張しても良い)
Debug.Print “【AutoCAD自動保存先変更】成功: ” & networkRoot
End If
Exit Sub
ErrorHandler:
‘ 万が一の異常終了時もAutoCAD本体をクラッシュさせないための防壁
MsgBox “AutoCAD自動保存パスの設定中に予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, _
vbCritical, “自動保存設定スクリプト・致命的エラー”
‘ 本番環境ではログファイルへの書き出し処理をここに実装することを推奨
End Sub
‘ ——————————————————————————–
‘ 補助ルーチン: 指定されたパスの階層をトップダウンで安全に作成する
‘ ——————————————————————————–
Private Sub CreateDirectoryTree(ByRef fso As Object, ByVal targetPath As String)
On Error GoTo LocalError
‘ 最後のスラッシュを調整
If Right(targetPath, 1) <> “\” Then targetPath = targetPath & “\”
Dim parentPath As String
parentPath = fso.GetParentFolderName(targetPath)
If Not fso.FolderExists(parentPath) Then
CreateDirectoryTree fso, parentPath
End If
If Not fso.FolderExists(targetPath) Then
fso.CreateFolder targetPath
End If
Exit Sub
LocalError:
Err.Raise Err.Number, “CreateDirectoryTree”, “フォルダの作成に失敗しました: ” & targetPath & ” (” & Err.Description & “)”
End Sub
—
コードのアーキテクチャ解説:なぜこの実装が「プロフェッショナル」なのか?
1. 無駄なレジストリ・I/Oアクセスの排除
`prefs.Files.AutoSavePath` への代入は、内部でレジストリ(あるいはプロファイル)への書き込みが発生する。毎回無条件に書き換えるのではなく、現在の設定値と文字列比較(`StrComp`)を行い、一致しない場合のみ書き込みを実行するスマートな設計にしている。
2. `SAVETIME` システム変数との連動
単にパスを変更するだけでなく、`acadApp.SetSystemVariable “SAVETIME”, 10` によって、保存頻度自体も組織標準(例: 10分ごと)に強制同期させている。これにより、設計者の「うっかり設定忘れ」を完全に封殺する。
3. 完全に独立したエラーハンドリング
ネットワークドライブの接続断(VPN切断など)は現場で日常茶飯事だ。このスクリプトは、サーバーが見つからない場合に処理をサイレントに離脱(あるいは警告のみ表示)し、AutoCAD自体の起動シーケンスを絶対に阻害しない作り込みを行っている。基幹システムを組む上での鉄則である。
—
組織展開における運用ティップス
このVBAマクロを全社展開する場合、各個人のPCの `acaddoc.lsp` もしくは企業共通の `acad.lsp` の `S::STARTUP` 関数から呼び出すのが最も効果的だ。
(defun S::STARTUP ()
(vl-load-com)
;; VBAマクロを自動実行するトリガー
(vl-vba-run “SetEnterpriseAutoSavePath”)
(princ)
)
あるいは、ドキュメントオープンイベント(`AcadApplication_DocumentCreate` や `AcadApplication_DocumentActivate`)に組み込むことで、図面が開かれた瞬間にバックアップ網が構築される。
結びにかえて
「PCが壊れたから図面が消えた」などという言い訳は、もはやエンジニアリングの現場において許されるものではない。インフラのトラブルはいつだって起きる。だが、「データが消失するリスク」は、コードを書くことでゼロに収束させることができる。
プロフェッショナルたる者、設計データの保全までを自動化のスコープに入れよ。今回のコードを導入し、組織全体のバックアップ体制を次のフェーズへと引き上げてほしい。
