【入門編】【上級プロフェッショナル向け】大量図面処理時の「AcadApplication」インスタンス再起動によるメモリリフレッシュ – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD大量図面処理の「闇」を断つ:プロセス再起動によるメモリ解放の極意

こんにちは。AutoCADの自動化の深淵へようこそ。

数千枚の図面をループ処理で一気に開閉するマクロを組んだとき、最初は快調でも、50枚、100枚と進むうちに「AutoCADが極端に重くなる」「突然落ちる」「謎のCOMエラーで停止する」といった経験はありませんか?

これはAutoCAD VBAの宿命、「メモリリークとCOMオブジェクトの残滓」による呪いです。AutoCADという巨大なアプリケーションは、図面を閉じるだけではメモリを完全にはクリーンアップしません。

今日は、この「メモリの死神」から解放され、数千枚の図面を完走させるための「最終奥義」を伝授します。

—

なぜ、図面を閉じるだけでは不十分なのか?

AutoCADは非常にリッチなアプリケーションです。図面を `Close` メソッドで閉じても、バックグラウンドではデータベースの残骸や、COM接続のキャッシュが微妙にメモリを蝕みます。

これを放置して数千回繰り返すと、OSのメモリリソースが枯渇し、処理速度の低下やフリーズを招くのです。

解決策:プロセスごと「焼き直す」

最も確実な対策は、一定の閾値(例えば50枚ごと)に達したら、一度AutoCADプロセスを完全に終了させ、新しいプロセスを立ち上げて処理を再開するという力技です。

—

究極の安定化手法:プロセス再起動の仕組み

この処理を実現するには、VBA単体ではなく、「処理を管理する親プロセス(またはバッチ)」と「AutoCAD」を分離するアーキテクチャが必要です。

今回は、最も導入しやすい「メインのVBAマクロが自身を再起動させる」ための考え方を紹介します。

実装のコード構造(概念モデル)

‘ 【メイン処理の指針】
‘ 1. 現在のインデックスをレジストリやテキストファイルに保存する(中断ポイント)
‘ 2. 次の起動時にどのファイルから再開するかを保持する
‘ 3. AutoCADを終了させ、外部からタスクスケジューラやシェルで再起動をかける

Sub BatchProcessStarter()
Dim i As Long
Dim limit As Long: limit = 50 ‘ 50枚ごとに再起動

‘ 現在のインデックスを読み込む(ファイルやレジストリから)
Dim startIdx As Long: startIdx = LoadCurrentIndex()

For i = startIdx To UBound(FileArray)
‘ 図面を開いて処理
Call ProcessDrawing(FileArray(i))

‘ 閾値に達したら再起動フラグを立てる
If i Mod limit = 0 And i <> startIdx Then
Call SaveCurrentIndex(i + 1)
Call RestartAutoCAD
Exit Sub ‘ プロセス終了へ
End If
Next i
End Sub

Sub RestartAutoCAD()
‘ AutoCADを終了させ、コマンドライン引数付きで自身を再起動させる
‘ /t はテンプレート指定、/ld はARX読み込みなど、環境に合わせて調整
Shell “acad.exe /b “”MyScript.scr”””, vbNormalFocus
Application.Quit
End Sub

—

ここをクリアすれば中級者への道は開ける

この手法を実装する際、初心者が必ずつまずくポイントが3つあります。ここを突破できれば、君はもう「マクロ記録」の世界には戻れません。

1. 状態の永続化(ステート管理)

プロセスが終了すると、変数の中身はすべて消えます。「今、何枚目の図面を処理していたか」をメモ帳やレジストリに書き出す処理(I/O操作)が不可欠です。これが「中断と再開」を可能にする鍵です。

2. COMオブジェクトの解放(Set obj = Nothing)

ループ内で生成した `AcDbDatabase` や `SelectionSet` は、必ず `Set = Nothing` で明示的にメモリから追放してください。VBAのガベージコレクションを信用してはいけません。

3. コマンドラインスイッチの活用

AutoCADには起動時に `Acad.exe /b “script.scr”` のようにスクリプトを指定する機能があります。これを利用して、再起動後のAutoCADに「次の処理を自動開始せよ」という命令を送り込むのが、最もプロフェッショナルな挙動です。

—

先輩エンジニアからのアドバイス

「数千枚処理できる」ことは、AutoCADエンジニアとしての誇りです。しかし、無理をしてPCを壊しては元も子もありません。

  • エラーハンドリングを怠るな: `On Error Resume Next` で誤魔化さず、失敗した図面はログに残し、次の図面へ進む堅牢なコードを書いてください。
  • バックアップは正義: 処理中の図面はコピーを作り、オリジナルを直接書き換えるような無謀な真似は避けましょう。

AutoCAD VBAは古くからある技術ですが、その深さは今もなお現役です。メモリの挙動を支配できるようになれば、君はもう設計現場の「見えない司令塔」になれるはず。

もしコードの具体的な書き方や、レジストリへの書き込み処理で迷うことがあれば、いつでも聞いてください。さあ、一緒に最強の自動化環境を構築しましょう!

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