こんにちは! AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して図面を描かせるだけの自動化から一歩進み、実際の業務で数百枚もの図面を一括処理するフェーズに入ると、誰もが一度は「なんだか処理がやたらと遅いな……」という壁にぶつかります。
その原因、もしかして`.bak`(バックアップファイル)の生成にあると気づいていますか?
今回は、実務中級者を目指すあなたに向けて、AutoCADの裏側を支配するシステム変数`ISAVEBAK`(アイセーブバック)をVBAから華麗にコントロールし、図面保存のパフォーマンスを極限まで引き上げる知見を授けましょう。
ここをクリアすれば、大量処理のマクロを書かせたら社内で一番のエンジニアになれますよ。さあ、一緒に本質を学んでいきましょう!
—
1. なぜ、大量の図面保存は遅くなるのか?
AutoCADで図面を上書き保存(`Save` または `SaveAs`)するとき、標準の設定では「必ず同じフォルダに古い図面のバックアップ(`.bak`ファイル)」が生成されます。
人間が1枚ずつ図面を保存する分には、このバックアップ機能は神様のような存在です。うっかりデータを飛ばしたときに救ってくれますからね。
しかし、これが「100枚の図面を連続で自動処理するVBAプログラム」だったらどうでしょう?
1. 図面を1枚書き込む
2. OSが裏で既存のファイルを`.bak`にリネーム(またはコピー)する
3. 新しい図面データをディスクに書き込む
4. 次の図面へ……
これを何百回も繰り返すと、ハードディスクやSSD(特にネットワークドライブ上の共有サーバーなど)には凄まじいI/O(入出力)負荷がかかります。`.bak`の生成を挟むだけで、処理時間が文字通り2倍近くに跳ね上がることもあるのです。
—
2. 救世主:システム変数 `ISAVEBAK` とは?
この無駄なバックアップ生成を、プログラムの実行中だけピタッと止める魔法のスイッチがあります。それが、AutoCADのシステム変数 `ISAVEBAK` です。
- `1` (初期値): バックアップファイル(`.bak`)を作る(安全第一)
- `0` : バックアップファイルを作らない(高速化・ストレージ負荷軽減)
「じゃあ、常に `0` にしとけばいいじゃん!」と思ったそこのあなた。それはエンジニアとして少し短絡的です。
バックアップを切るということは、万が一のクラッシュ時に保険がなくなるということ。実務においては、「VBAが走っている間だけ一時的に `0` にし、終わったら元の状態(`1`)に戻す」という、プロとしての気配りが絶対に必要なのです。
—
3. 【実践】バックアップを抑制する安全・高速なVBAコード
それでは、実際にAutoCAD VBAで `ISAVEBAK` を制御しつつ、安全に図面を連続処理するコードを見てみましょう。
開発環境(VBAエディタ)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub OptimizeAndSaveDrawings()
Dim originalIsavebak As Integer
On Error GoTo ErrorHandler ‘ エラー時に設定が戻らなくなるのを防ぐ
‘ —————————————————-
‘ 1. 現在の ISAVEBAK の値を取得・退避する
‘ —————————————————-
originalIsavebak = ThisDrawing.GetVariable(“ISAVEBAK”)
‘ —————————————————-
‘ 2. ISAVEBAK を 「0(バックアップなし)」に変更する
‘ —————————————————-
ThisDrawing.SetVariable “ISAVEBAK”, 0
MsgBox “ISAVEBAKを ‘0’ に設定しました。バックアップ作成を抑制します。”, vbInformation, “最適化開始”
‘ —————————————————-
‘ 3. ここに大量の図面処理(保存など)を記述
‘ —————————————————-
‘ ※今回は例として、現在開いている図面をそのまま上書き保存します
Dim i As Long
For i = 1 To 5
‘ 【実務ではここで別図面のOpenや処理が入ります】
ThisDrawing.Save
Debug.Print i & “回目の保存完了(.bakは生成されていません)”
Next i
‘ —————————————————-
‘ 4. 処理が終わったら、必ず元の値に復元する
‘ —————————————————-
ThisDrawing.SetVariable “ISAVEBAK”, originalIsavebak
MsgBox “処理が完了しました。ISAVEBAKの設定を元に戻しました。”, vbInformation, “正常終了”
Exit Sub
ErrorHandler:
‘ 予期せぬエラーが発生した場合でも、確実に設定を元に戻す(重要!)
ThisDrawing.SetVariable “ISAVEBAK”, originalIsavebak
MsgBox “エラーが発生しましたが、システム変数の復元は安全に行われました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “異常終了”
End Sub
コードの解説と、プロが仕込んだ「罠」への対策
1. `GetVariable` と `SetVariable`
AutoCADのシステム変数(`ISAVEBAK` や `FILEDIA` など)は、`ThisDrawing.GetVariable` で現在値を取得し、`SetVariable` で書き換えます。これがVBAからAutoCADを自在に操る基本のキです。
2. エラーハンドリング(`On Error GoTo`)の絶対性
ここが今回の記事で一番伝えたい「プロの知見」です。
もしプログラムの途中でエラー(ファイルが書き込み禁止だった、メモリが足りなくなった等)が起きたとき、`ISAVEBAK = 0` のままプログラムが強制終了したらどうなるでしょう?
次にそのPCで作業するユーザーの環境が、「バックアップが一切作られない危険な状態」のまま放置されてしまいます。
それを防ぐために、エラー発生時でも必ず元の値に戻すための `ErrorHandler`(後始末のルーチン)を必ず仕込むこと。これがプロのエンジニアの流儀です。
—
4. まとめ:ここをクリアすれば、あなたももう中級者!
いかがでしたか?
今回はただコード動かすだけでなく、「システムの現状を退避し、高速化し、エラーが起きても確実に元の状態へロールバックする」という、実務で絶対に求められる堅牢性(ロバストネス)を含めて解説しました。
- 大量処理の前には `ISAVEBAK = 0` でストレージ負荷を激減させる。
- 処理が終わったら(あるいはエラー時でも)必ず元の設定に戻す。
この作法を身につければ、あなたの書くAutoCAD VBAマクロは、単なる「おもちゃの自動化」から「現場を救う堅牢なシステム」へとランクアップします。
ここをクリアできれば、AutoCAD VBAの基本と裏側の制御はもうバッチリです!
ぜひ、日々の業務効率化に役立ててくださいね。それでは、次のステップでお会いしましょう!
