【入門編】【上級プロフェッショナル向け】大量図面処理時の「AcadApplication」再起動タイマー:メモリリークによる強制終了を防ぐ – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは、現場の最前線で設計オートメーションの極限に挑むエンジニアの皆さん。

数千枚、時には数万枚という膨大な図面を前に、「これを全部自動で処理できたら…」と夢見たことはありませんか?しかし、いざVBAを組んで走らせてみると、100枚目、200枚目あたりでAutoCADが重くなり、ついには「致命的なエラー」で強制終了してしまう。そんな苦い経験をした方も多いはずです。

実は、AutoCAD VBAを極める上で避けて通れないのが「メモリリーク(メモリの食いつぶし)」との戦いです。

今日は、マクロの記録を卒業し、プロフェッショナルな「大量図面処理」を実現するための究極のテクニック、『AutoCADインスタンスの再起動タイマー制御』について、優しく、かつ深く解説していきます。ここをマスターすれば、あなたのプログラムは「止まらない最強のツール」へと進化しますよ。

—

なぜAutoCADは「疲れて」しまうのか?

まず、なぜずっと動かし続けるとエラーが起きるのかを知っておきましょう。

AutoCAD VBAで図面を開き、処理して、閉じる。この一連の動作を繰り返すと、プログラム上では正しく解放したつもりでも、AutoCADの内部メモリには「目に見えないゴミ(残存オブジェクト)」が少しずつ蓄積されていきます。

  • Undo(元に戻す)情報の蓄積
  • 複雑なCOMオブジェクトの参照残り
  • 一時ファイルの肥大化

これらが積み重なると、WindowsがAutoCADに割り当てたメモリ領域がいっぱいになり、最後にはパンクしてしまいます。これを防ぐ唯一にして最も確実な方法が、「定期的にAutoCADを一度完全に終了させ、真っ新な状態で再起動する」ことなのです。

—

制御の司令塔は「Excel VBA」に任せる

AutoCADの中で動くVBA(acad.dvbなど)自身で、自分自身の親であるAutoCADを再起動させるのは非常に困難です。

そこで、プロフェッショナルは「司令塔」としてExcel VBAを使います。ExcelからAutoCADを遠隔操作し、一定枚数(例:50枚)処理するごとに、AutoCADという「駒」をリフレッシュさせるのです。

実装のイメージ図

1. Excelがリストから図面パスを読み込む
2. ExcelがAutoCADを起動する
3. 図面を1枚ずつ開き、処理する(ここでは50枚とします)
4. 50枚終わったら、AutoCADをQuit(終了)させる
5. Set AcadApp = Nothing でメモリを完全に空にする
6. 再びAutoCADを起動して、次の50枚へ……

—

魂のコード例:大量図面処理用テンプレート

このコードは、Excelの標準モジュールに貼り付けて使用することを想定しています。
※事前に「ツール」→「参照設定」で `AutoCAD 20xx Type Library` にチェックを入れてください。

Option Explicit

‘ — 定数設定 —
Const RESTART_INTERVAL As Integer = 50 ‘ 何枚ごとに再起動するか

Sub MassiveDrawingProcessor()
Dim acadApp As AcadApplication
Dim fileList As Variant
Dim i As Long
Dim processedCount As Integer

‘ 1. 処理したいファイルのリストを取得(ここでは例として配列に入れます)
‘ 実際はExcelのセルから取得するように書き換えてください
fileList = Array(“C:\DWG\File1.dwg”, “C:\DWG\File2.dwg”, “C:\DWG\File3.dwg”) ‘ … 実際は数千件

On Error Resume Next

‘ 初回のAutoCAD起動
Set acadApp = StartNewAutoCAD()

processedCount = 0

For i = LBound(fileList) To UBound(fileList)
‘ — 定期的なリフレッシュ処理 —
If processedCount >= RESTART_INTERVAL Then
Debug.Print “リフレッシュのためAutoCADを再起動します…”

‘ AutoCADを安全に閉じる
acadApp.Quit
Set acadApp = Nothing

‘ 数秒待機(OSがプロセスを完全に解放するのを待つ)
DoEvents
Application.Wait [Now() + “0:00:05”]

‘ 再起動
Set acadApp = StartNewAutoCAD()
processedCount = 0
End If

‘ — 個別の図面処理 —
Call ExecuteDrawingLogic(acadApp, fileList(i))

processedCount = processedCount + 1
DoEvents ‘ OSに制御を戻しフリーズを防ぐ
Next i

‘ 最後に後片付け
If Not acadApp Is Nothing Then
acadApp.Quit
Set acadApp = Nothing
End If

MsgBox “全ての処理が完了しました!”, vbInformation
End Sub

‘ AutoCADをクリーンに起動する関数
Function StartNewAutoCAD() As AcadApplication
Dim app As AcadApplication
Set app = New AcadApplication
app.Visible = True ‘ デバッグ時はTrue、本番はFalseでもOK
Set StartNewAutoCAD = app
End Function

‘ 実際の図面編集ロジック(ここを書き換える)
Sub ExecuteDrawingLogic(ByRef acadApp As AcadApplication, ByVal filePath As String)
Dim doc As AcadDocument

On Error GoTo ErrorHandler

‘ 図面を開く
Set doc = acadApp.Documents.Open(filePath)

‘ — ここに自動化したい処理を書く —
‘ 例:全図面内の特定の画層を非表示にする、文字を置換するなど
‘ doc.ModelSpace.Item(0).Layer = “0”

‘ 上書き保存して閉じる
doc.Close True
Set doc = Nothing
Exit Sub

ErrorHandler:
Debug.Print “エラー発生: ” & filePath & ” – ” & Err.Description
If Not doc Is Nothing Then doc.Close False
End Sub

—

ここがプロの勘所!陥りやすい罠と対策

1. `Application.Wait` の重要性

AutoCADに `Quit` を命じても、Windowsの中でプロセス(acad.exe)が完全に消えるまでには数秒のタイムラグがあります。消える前に次のインスタンスを作ろうとすると、古い「幽霊」プロセスに干渉してエラーになることがあります。5秒程度の「ひと休み」を入れるのが、安定稼働の秘訣です。

2. `Set doc = Nothing` を忘れない

図面を閉じた後、その変数に `Nothing` を代入するのは、プログラミングにおける「礼儀」です。これを怠ると、AutoCADを終了させようとしても「まだ図面が使われている」と誤認され、プロセスが残り続けてしまいます。

3. `On Error Resume Next` との付き合い方

大量処理では、1枚の図面が壊れているだけでマクロ全体が止まるのは避けたいものです。エラーハンドリングを適切に行い、エラーが起きたらその図面をスキップしてログを吐き出し、次の図面へ進む「止まらない仕組み」を作ることが大切です。

—

終わりに:この一歩が「自動化の壁」を突破する

今回ご紹介した「定期的な再起動」という手法は、実はAutoCADに限らず、あらゆる重厚なアプリケーションの自動化で使われる「プロの鉄板構成」です。

100枚の壁を越え、1,000枚、10,000枚の処理を涼しい顔でこなせるようになったとき、あなたはもう「マクロを使える人」ではなく、「システムを構築できるアーキテクト」へと進化しています。

「ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ」

焦らず、一つ一つのオブジェクトの挙動を確かめながら、最強の自動化ツールを組み上げてください。あなたの挑戦を、心から応援しています!

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