こんにちは!AutoCAD VBAの世界へようこそ。
日々の設計業務で、ネットワーク上の共有サーバーにあるDWG図面を開いて作業することって多いですよね。
でも、こんなヒヤッとした経験はありませんか?
「よし、図面を描き終えた!」と意気込んで上書き保存(Ctrl + S)を押した瞬間……
『ネットワーク エラー: ファイルを保存できませんでした』
……冷や汗が背中を伝う瞬間です。あのままAutoCADがフリーズしたり、強制終了したりしようものなら、今日一日(あるいは数時間分)の努力が泡と消えてしまいます。
今回は、そんな現場の悪夢を華麗に回避し、「もしサーバーが落ちても、一瞬でローカルの安全地帯へデータを緊急退避させる」ための、上級プロフェッショナル直伝の例外処理(エラーハンドリング)とリカバリフローを伝授します。
ここをクリアすれば、あなたのVBAスキルは間違いなく一段上のステージに到達しますよ。一緒にマスターしていきましょう!
—
なぜ、通常の「上書き保存」だけでは危ないのか?
AutoCADで `ThisDrawing.Save` や `SaveAs` を実行するとき、背後ではOSを介したファイルI/O(入出力)が行われています。
ネットワークが一時的に切断されたり、サーバーの応答がなくなったりすると、AutoCADの内部エンジンは保存処理を完了できず、容赦なくエラーを返します。
ここで「エラー対策(On Error)」が組まれていないVBAマクロは、その場でデバッグ画面を出すか、最悪の場合はAutoCADごと強制終了します。
私たちが目指すべきエンジニアリングは、「エラーが起きた事実を瞬時に察知し、CADが落ちる前に、手元(ローカルPC)の安全な場所へそっと命綱を投げる」ことです。
—
現場で即戦力となる「緊急ローカル退避」の全体像
今回のプログラムのコンセプトはシンプルです。
1. 通常保存を試みる: まずはいつも通り、現在のパス(サーバー等)に保存を試みる。
2. エラーをトラップする: もし何らかの理由で保存に失敗したら、通常のVBAエラー画面を出さずに、コードの処理を「救助ルート(エラーハンドラ)」へジャンプさせる。
3. ローカルへ緊急退避: Windowsの環境変数から「一時フォルダ(Temp)」のパスを動的に取得し、そこに「緊急退避_元のファイル名_日時.dwg」という名前で別名保存する。
4. ユーザーへ優しく通知する: 「サーバーとの接続が切れましたが、ローカルに無事退避しました!」とポップアップで知らせる。
—
実装コード:緊急ローカル退避マクロ
以下のコードを、AutoCADのVBAエディタ(Alt + F11)の標準モジュールにそのまま貼り付けてみてください。現場でそのまま使える実用度マックスのコードです。
Sub EmergencySaveToLocal()
Dim originalPath As String
Dim originalName As String
Dim ext As String
Dim fso As Object
Dim localTempDir As String
Dim timeStamp As String
Dim emergencyPath As String
‘ —————————————————-
‘ 1. 事前チェック:一度も保存されていない新規図面か?
‘ —————————————————-
On Error GoTo CheckPathError
originalPath = ThisDrawing.Path
originalName = ThisDrawing.Name
If originalPath = “” Then
MsgBox “この図面はまだ一度も保存されていません。「名前を付けて保存」を先に実行してください。”, vbExclamation, “緊急退避ガード”
Exit Sub
End If
On Error GoTo 0 ‘ エラー監視をいったんリセット
‘ —————————————————-
‘ 2. 通常の保存処理(ここでネットワークエラー等を監視)
‘ —————————————————-
On Error GoTo CatchSaveError ‘ <-- ここが命綱!エラーが起きたらジャンプ
' 図面を上書き保存
ThisDrawing.Save
' 無事に保存できたらここで終了
MsgBox "図面の保存が正常に完了しました。", vbInformation, "保存成功"
Exit Sub
' ----------------------------------------------------
' 3. 【救助ルート】保存エラー発生時のリカバリ処理
' ----------------------------------------------------
CatchSaveError:
' エラーが発生したため、即座にローカルへの退避を試みる
On Error GoTo FinalizeError ' 退避中にもエラーが起きた場合の二重ガード
' 拡張子(.dwg)を除いたファイル名を取得
Set fso = CreateObject("Scripting.FileSystemObject")
ext = fso.GetExtensionName(originalName)
Dim baseName As String
baseName = Left(originalName, Len(originalName) - Len(ext) - 1)
' WindowsのローカルTempフォルダのパスを取得
localTempDir = Environ("TEMP")
' 重複上書きを防ぐためのタイムスタンプ生成 (例: 20231025_143022)
timeStamp = Format(Now, "yyyymmdd_hhnnss")
' ローカルの退避先フルパスを組み立て
emergencyPath = localTempDir & "\" & baseName & "_【緊急退避】_" & timeStamp & "." & ext
' 現在の図面をローカルのTempへ別名保存(SaveAs)
' ※AutoCADのSaveAsメソッドは (ファイルパス, [ファイルフォーマット]) を取ります
ThisDrawing.SaveAs emergencyPath
' ユーザーにネットワーク異常と退避成功を告げる
MsgBox "【警告】ネットワークとの通信が切断されたか、保存に失敗しました!" & vbCrLf & _
"しかしご安心ください。データを以下のローカルパスに緊急退避させました。" & vbCrLf & vbCrLf & _
emergencyPath, vbCritical, "緊急ローカル退避システム"
Exit Sub
' ----------------------------------------------------
' 4. 最終防衛ライン(めったにないが、ローカル保存すら失敗した場合)
' ----------------------------------------------------
FinalizeError:
MsgBox "致命的なエラー:ローカルへの緊急退避にも失敗しました。" & vbCrLf & _
"AutoCADを強制終了せず、手動でDXF形式などへの出力を試みてください。", vbCritical, "システムクリティカルエラー"
Exit Sub
CheckPathError:
MsgBox "図面情報の取得に失敗しました。", vbCritical, "エラー"
End Sub
---
コードの核心を優しく解説!
プログラミング初心者やマクロの記録からステップアップしたい方が、必ず押さえておきたい「エンジニアの技」がこのコードには詰まっています。
1. `On Error GoTo [ラベル名]` による例外トラップ
VBAの基本中の基本ですが、プロフェッショナルはこの記述を「どこでエラーが起きうるか」を予測して戦略的に配置します。
今回は `ThisDrawing.Save`(通常の保存)の直前に `On Error GoTo CatchSaveError` を置き、もしサーバーとの通信エラー等で保存がコケた瞬間、VBAの処理を強制的にエラー処理ルーチンへワープさせています。これがデータを守る最初の砦です。
2. `Environ(“TEMP”)` で環境に依存しないパス取得
ローカルの保存先を `C:\Users\Yamada\AppData\Local\Temp` のように決め打ちで書くのは素人のやり方です。PCのユーザー名が違えばエラーになります。
Windowsの環境変数 `Environ(“TEMP”)` を使うことで、どんなPCで実行しても、そのユーザー専用の安全な一時フォルダのパスを自動で取得できます。
3. タイムスタンプによる「名前衝突」の完全防止
緊急退避する際に、もし同じ名前のファイルがすでにローカルにあったら、上書き確認のダイアログが出てしまい、プログラムがそこでお手上げになってしまいます。
`Format(Now, “yyyymmdd_hhnnss”)` を使って「年月日_時分秒」をファイル名に結合することで、何回緊急退避が発動しても絶対に名前が被らない、堅牢な仕組みを作っています。
—
陥りやすい罠とアドバイス
- 「一度も保存していない図面」への配慮を忘れない
コードの最初で `ThisDrawing.Path` をチェックしているのは、新しく立ち上げたばかりの図面(まだどこにも保存されていない状態)では `Path` が空っぽ(`””`)だからです。ここを見落とすと、後続の処理で予期せぬエラーの連鎖が起きるので、必ず最初にガードを置きましょう。
- くまで「緊急避難」であることを忘れない
このマクロは、あくまで「データを失わないための救命ボート」です。ローカルのTempフォルダに保存された図面は、ネットワーク復旧後に改めて正しいサーバーのプロジェクトフォルダへ移動・上書きし直す必要があります。ユーザーへのアナウンスや運用ルールとセットで運用してください。
—
おわりに
いかがでしたでしょうか?
単に「図面を保存するコード」を書くだけなら数行で終わります。しかし、「現場で何が起きるかわからない(ネットワークが切れる、サーバーが落ちる)」というリスクを想定し、それをコードの力で完全にカバーすることこそが、私たちエンジニアの腕の見せどころです。
この「緊急ローカル退避」の知見をあなたの現場のツールに組み込めば、同僚や上司から「おっ、やるな!」と一目置かれること間違いなしです。
AutoCAD VBAの底力は、こうした泥臭いエラーハンドリングの積み重ねにあります。ぜひご自身の環境でも試して、堅牢な自動化ライフを手に入れてくださいね。それでは、次回の極限の知見でお会いしましょう!
