【AutoCAD VBA】数千枚の図面処理を制御下に置く:ESCキーによる安全な中断処理の設計思想
AutoCADのバッチ処理を書いている時、誰もが一度は「しまった、設定を間違えた」と冷や汗をかいた経験があるはずだ。処理中にフリーズしたAutoCADをタスクマネージャーから強制終了し、貴重な作業時間を浪費する……。これはエンジニアとしてあってはならない。
プロのツールには、必ず「緊急停止ボタン」が必要だ。本稿では、`GetAsyncKeyState` APIを活用し、AutoCADのメインスレッドを殺さずに、かつ堅牢に処理を中断させるためのアーキテクチャを伝授する。
—
なぜ「DoEvents」だけでは不十分なのか
多くの初学者は、ループの中に `DoEvents` を入れるだけで満足する。しかし、これでは不十分だ。`DoEvents` はOSに対して制御を一時的に返すだけのものであり、ユーザーがいつESCキーを押したかを正確に検知し、処理の「安全なチェックポイント」で止めるためのロジックを伴わなければ、予期せぬ挙動を招く。
特に、`AcadDocument` を次々と開閉するバッチ処理では、「処理の途中で止めると、開いたドキュメントが掴まれたままになり、次回の起動や他者の操作に悪影響を与える」というリスクがある。
実装の極意:APIによるキー状態のポーリング
Windows APIである `GetAsyncKeyState` を用いて、ESCキーの入力をミリ秒単位で監視する。これを処理ループの「安全な場所」で呼び出すのが正解だ。
プロダクションコード:安全な中断処理の実装例
以下のモジュールは、標準モジュールにそのまま貼り付けて使用できる。
Option Explicit
‘ Windows API: ESCキーの状態を取得
If VBA7 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 Function IsEscapePressed() As Boolean
‘ GetAsyncKeyStateの戻り値の最上位ビットが1なら押されている
If (GetAsyncKeyState(VK_ESCAPE) And &H8000) <> 0 Then
IsEscapePressed = True
End If
End Function
‘ メイン処理のテンプレート
Public Sub BatchProcess()
Dim i As Long
On Error GoTo Cleanup
For i = 1 To 1000
‘ 1. ここでユーザーのESC入力をチェック
DoEvents
If IsEscapePressed() Then
If MsgBox(“処理を中断しますか?”, vbYesNo + vbQuestion) = vbYes Then
GoTo Cleanup
End If
End If
‘ 2. 本来の業務処理
Debug.Print “Processing file ” & i
‘ 注意: 長時間の処理を行う場合は、さらに細かくループを分割せよ
Next i
MsgBox “完了しました。”
Exit Sub
Cleanup:
‘ 3. 異常終了時も必ず「開いたオブジェクトのクローズ」を保証する
‘ ここで AcadDocument.Close や DB接続の切断を確実に行う
MsgBox “処理が中断されました。リソースを解放します。”
End Sub
—
堅牢な設計のための3つの鉄則
1. 「クリーンアップ」を単一化せよ
`On Error GoTo` を活用し、正常終了であれ強制終了であれ、最終的に通る `Cleanup` ラベルを用意すること。ここで、開いた `AcadDocument` があれば `Close False` を呼び出し、メモリリークを確実に防ぐ。
2. イベントの「間引き」を意識する
`DoEvents` は強力だが、過剰に呼び出すと処理速度が劇的に低下する。100回に1回呼び出すなど、処理コストに合わせて調整するのがプロのエンジニアの流儀だ。
3. データベース/ファイル連携への配慮
もしExcelや外部DBへログを書き込んでいるなら、中断時に「どこまで処理したか」をフラグとして記録しておくこと。再開時に続きから処理できる設計こそが、大規模バッチ処理の真骨頂である。
最後に:AutoCAD VBAの支配者であれ
AutoCADのオートメーションは、ただ動けばいいというものではない。「いかに予期せぬ事態に対してエレガントに振る舞えるか」が、ツール全体の信頼性を決定づける。
ESCキーによる中断処理は、あなたのツールを「動かしている間は触れないPC」から「いつでも制御可能な頼れる相棒」へと進化させる。この設計パターンを自身のライブラリに組み込み、真に堅牢な業務自動化環境を構築してほしい。
何か不明点があれば、コードの文脈とともに質問を投げてほしい。共に最高の自動化環境を追求しよう。
