「マクロの記録」を卒業するあなたへ。AutoCAD VBAで図面の「寿命」をコントロールする極意
こんにちは。現場のエンジニアリングを支える技術の世界へようこそ。
「マクロの記録」機能を使って、なんとか業務を自動化できた。そんな成功体験を掴んだあなたは、今、素晴らしい一歩を踏み出したところです。
しかし、ここからが本当の「エンジニア」としての旅の始まりです。
これまでは「どうすれば操作を自動化できるか」を考えてきたでしょう。これからは、「どうすれば、より堅牢で、ミスが起きにくく、プロフェッショナルなツールを作れるか」を考えるフェーズに入ります。
今日は、その第一歩として、多くのユーザーが見落としがちな「図面の保存(Save)」に潜む罠と、それをVBAでスマートに制御する方法についてお話ししましょう。
1. 忍び寄る「増分保存」の罠
AutoCADには、保存を高速化するための仕組みがあります。それが「増分保存(Incremental Save)」です。
図面を保存する際、毎回ファイル全体を書き直すのではなく、「変更された部分だけ」をファイルの後ろに付け足していく方式です。これによって、巨大な図面でも一瞬で保存が終わります。
一見、素晴らしい機能に見えますよね? しかし、ここには「データの断片化」という副作用があります。
なぜ「増分保存」がリスクなのか?
例えるなら、ノートに書き込みをする場面を想像してください。
- フルセーブ: 毎回、新しい真っ白なページに、これまでの内容をすべて書き直す。
- 増分保存: 古いページの余白に、修正した内容を「付箋」のようにペタペタ貼り付けていく。
付箋が増えすぎるとどうなるでしょうか? ページはどんどん分厚くなり、どこに何が書いてあるか管理が難しくなります。そして、ある時、その付箋が剥がれたり、重なり合ったりした瞬間に、「ファイルが壊れる(破損する)」のです。
長期間、同じファイルを増分保存だけで使い続けている図面は、内部構造が複雑化し、動作が重くなったり、最悪の場合開けなくなったりすることがあります。
2. 解決策:`INCREMENTALSAVEPERCENT` を支配する
ここで登場するのが、AutoCADのシステム変数 `INCREMENTALSAVEPERCENT` です。
この変数は、「どれくらいの変更があったら、フルセーブ(書き直し)に切り替えるか」を決める数値です。デフォルトでは何らかの数値が入っていますが、これを「0」に設定することで、常に「フルセーブ」を強制することができます。
「毎回フルセーブなんて時間がかかるじゃないか!」と思うかもしれません。しかし、現代のハードウェア性能において、数秒の差と「ファイル破損のリスク」を天秤にかけたとき、エンジニアが選ぶべきは間違いなく後者です。
3. 実践:クリーンセーブを実現するVBAコード
それでは、実際にVBAを使って、このシステム変数を制御するコードを書いてみましょう。
単に値を書き換えるだけではありません。「元の設定を壊さず、作業が終わったら元に戻す」。これがプロの作法です。
'==============================================================================
' Module: Module1
' Description: 図面の破損リスクを低減するため、フルセーブを強制して保存する
' Author: Senior Architect
'==============================================================================
Option Explicit
''' <summary>
''' 図面をフルセーブ(増分保存を無効化)して保存するプロシージャ
''' </summary>
Public Sub SafeFullSave()
Dim currentIncrementalValue As Double
Dim acadDoc As AcadDocument
' 現在の図面オブジェクトを取得
Set acadDoc = ThisDrawing
On Error GoTo ErrorHandler
' --- STEP 1: 現在の設定をバックアップ ---
' プログラムが勝手に設定を変えっぱなしにするのは、マナー違反です。
' ユーザーが元々使っていた設定を覚えておきましょう。
currentIncrementalValue = acadDoc.GetVariable("INCREMENTALSAVEPERCENT")
Debug.Print "現在のINCREMENTALSAVEPERCENT: " & currentIncrementalValue
' --- STEP 2: フルセーブモードへの切り替え ---
' 0を設定することで、増分保存を無効化し、常にクリーンな状態で書き込みます。
acadDoc.SetVariable "INCREMENTALSAVEPERCENT", 0
' --- STEP 3: 保存の実行 ---
' ここで実際にファイルへの書き込みが行われます。
Debug.Print "フルセーブを実行中..."
acadDoc.Save
' --- STEP 4: 設定を元の状態に戻す ---
' 作業が終わったら、ユーザーの環境を元に戻してあげましょう。
acadDoc.SetVariable "INCREMENTALSAVEPERCENT", currentIncrementalValue
MsgBox "クリーンな状態で保存が完了しました。", vbInformation, "Success"
ExitSub:
Exit Sub
ErrorHandler:
' エラーが発生した場合でも、設定を元に戻す努力を怠らないこと
MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "Error"
If Not acadDoc Is Nothing Then
acadDoc.SetVariable "INCREMENTALSAVEPERCENT", currentIncrementalValue
End If
Resume ExitSub
End Sub
4. コードの深掘り:なぜこの書き方をするのか?
このコードには、初級者と中級者を分ける「3つの鉄則」が組み込まれています。
① ライフサイクル管理(バックアップと復元)
`currentIncrementalValue = acadDoc.GetVariable(…)`
プロフェッショナルなコードは、「環境を汚さない」ことを極めて重視します。システム変数を書き換える際は、必ず「変更前の値」をメモリに保持し、処理が終わったら(あるいはエラーが起きても)必ず「元の値」に戻します。これを怠ると、ユーザーから「マクロを使った後にAutoCADの挙動がおかしくなった」というクレームを受けることになります。
② エラーハンドリングの重要性
`On Error GoTo ErrorHandler`
VBAにおいて、エラー処理は「おまけ」ではありません。「必須」です。
もし保存中にディスク容量不足などでエラーが起きた場合、エラーハンドラがなければ、`INCREMENTALSAVEPERCENT` は `0` のまま放置されてしまいます。エラーが起きても、「設定を元に戻して、安全に終了する」。これが、システムを安定させる鍵です。
③ デバッグ意識
`Debug.Print`
コードの中に、実行状況をログとして出力する記述を忍ばせています。これは、万が一動作が怪しい時に、イミディエイトウィンドウを見て「今、どのステップにいるのか」を確認するためです。
5. まとめ:エンジニアとしての視点
「マクロの記録」は、あなたの「手」を動かすための道具です。
しかし、今回学んだようなVBAの制御は、あなたの「思考」を設計に組み込むための道具です。
- 増分保存は速いが、図面の健康(整合性)にはリスクがある。
- `INCREMENTALSAVEPERCENT` を `0` に制御することで、クリーンな図面を維持できる。
- 設定を変更する際は、必ず「元に戻す」という責任を持つ。
この視点を持つだけで、あなたが作るツールは「ただ動くもの」から「信頼されるシステム」へと進化します。
ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ。
さあ、次はどんな自動化に挑戦しますか? 応援しています!
