【テクニカル・上級編】【実務中級】複数図面の一括処理中に「ESCキー」で安全に中断させるためのAcadApplication制御 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの限界を突破する:一括処理を「ESC」で制御下に置く極限の作法

数千枚の図面を開き、属性を抽出し、あるいは図層を整理する。AutoCAD VBAでバッチ処理を組むとき、エンジニアが必ず直面する壁がある。「処理中のフリーズ」と「強制終了の恐怖」だ。

VBAはシングルスレッドの制約上、重いループに入るとAutoCADのメッセージループを飲み込み、Windowsからは「応答なし」と見なされる。ここでESCキーによる安全な中断を実装できないシステムは、もはや「野良マクロ」と変わらない。

今日は、Windows APIの深い階層からこの課題を解決し、堅牢なバッチ処理アーキテクチャを構築する極意を伝授する。

1. なぜ「DoEvents」だけでは足りないのか

多くの初学者は `DoEvents` をループに挿入して満足する。だが、`DoEvents` はOSのメッセージキューを捌くためのものであり、CPUリソースの消費を抑える最適化や、非同期的なキー入力を完璧に検知する手段としては不十分だ。

我々プロフェッショナルは、`GetAsyncKeyState` API を直接叩く。これはOSレベルでキーボードの状態をポーリングする手法であり、AutoCADのメインスレッドがビジー状態でも、キーの押下をミリ秒単位で検知できる。

2. 実装:ESCキー割り込み制御のテンプレート

以下のコードは、単なるサンプルではない。実務でそのまま運用可能な「安全装置付きループ」の標準だ。

‘ Windows API: キー入力の直接監視
If Win64 Then
Private Declare PtrSafe Function GetAsyncKeyState Lib “user32” (ByVal vKey As Long) As Integer
Else
Private Declare Function GetAsyncKeyState Lib “user32” (ByVal vKey As Long) As Integer
End If

Private Const VK_ESCAPE As Long = &H1B

Public Sub BatchProcessExample()
Dim doc As AcadDocument
Dim i As Long

‘ ループの設計:安全な中断ポイントを設ける
For i = 0 To 100
‘ 0.1秒に1回程度のチェックがパフォーマンスと応答性のバランスが良い
If CheckForEscape() Then
If MsgBox(“処理を中断しますか?”, vbYesNo + vbCritical) = vbYes Then
MsgBox “ユーザーにより中断されました。”
Exit Sub
End If
End If

‘ — ここに重い処理を記述 —
‘ DoEventsを過剰に叩くと処理速度が落ちるため、必要最小限に
DoEvents
Next i
End Sub

‘ ESC押下検知関数
Private Function CheckForEscape() As Boolean
‘ GetAsyncKeyStateの戻り値はビットフラグ
‘ 最上位ビットが立っていれば押下状態
If (GetAsyncKeyState(VK_ESCAPE) And &H8000) <> 0 Then
CheckForEscape = True
End If
End Function

3. メモリ管理と「オブジェクトの死」を意識せよ

AutoCAD VBAにおいて、大量の図面をループ処理する場合、最も恐れるべきは「メモリリーク」と「ゾンビプロセス」である。

  • `AcadDocument` の明示的解放: ループ内で `Documents.Open` を使用した後は、必ず `doc.Close False` を呼び出し、直後に `Set doc = Nothing` を実行すること。これを怠れば、数時間のバッチ処理の末にAutoCADは必ずメモリ不足でクラッシュする。
  • イベントの停止: バッチ処理中は `AcadApplication.EnableEvents = False` に設定せよ。不要なイベントの発火を抑えることで、処理速度は劇的に向上する。

4. アーキテクトからの提言:VBAは「接着剤」である

もしあなたが、数万枚規模の図面を扱うシステムを構築しているなら、VBAだけで完結させようと考えるのはやめなさい。VBAはあくまでAutoCADという巨大なエンジンの操作権を握る「接着剤」だ。

1. 重い計算処理: .NET (C#) のDLLに外部化し、COM Interop経由で呼び出す。
2. データ処理: データベース(SQLiteなど)に一度書き出し、SQLでフィルタリングする。
3. VBAの役割: 図面を開く・閉じる・APIを叩くという「AutoCADの操作」に特化させる。

ESC割り込みは、単なる機能ではなく「システムの生存権」をユーザーに返すための安全装置だ。この設計思想をインストールすることで、あなたの書くコードは、単なるスクリプトから「エンジニアリング・ツール」へと昇華する。

極限の現場では、常に「壊れたときにどう止めるか」を先に考えろ。それが、伝説的な自動化エンジニアのたしなみである。

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