AutoCAD VBA「応答なし」を撲滅せよ:プロフェッショナルな進捗バー実装の極意
AutoCADで数千もの図面を一括処理する際、画面が真っ白になり「応答なし」という文字がタイトルバーに浮かぶ……。この瞬間、ユーザーは「フリーズしたのか?」と不安になり、タスクマネージャーで強制終了する誘惑に駆られます。
「処理を止めずに、進捗を可視化する」。
これは単なる親切心ではなく、バッチ処理を完遂させるためのエンジニアリング上の必須要件です。今回は、AutoCAD VBAにおいて「堅牢な進捗バー」を実装するための、プロのアーキテクチャを伝授します。
—
1. なぜ「DoEvents」は諸刃の剣なのか
多くの初学者は、ループの中に無思考に `DoEvents` を叩き込みます。しかし、これを理解せずに行うと、CPU負荷が異常に跳ね上がり、逆に処理時間が倍増します。
`DoEvents` は「OSに制御を戻す」関数です。これを1回のループごとに呼び出すと、OSとの対話コストがオーバーヘッドとなり、本末転倒な結果を招きます。
プロの最適化戦略
- 間引き実行: 10件処理するごとに1回だけ `DoEvents` を叩く。
- 描画更新の制御: 毎回プログレスバーを再描画せず、計算上の「%」が変化した時のみUIを更新する。
—
2. 実装の設計思想:モードレスフォームの活用
進捗バーは、処理中もユーザーがAutoCADの画面を操作(あるいは最小化)できるように、モードレス(vbModeless)で起動する必要があります。
UserFormの準備
1. `UserForm1` を作成し、名前を `frmProgress` に変更。
2. `Frame` コントロール(名前: `fraBar`)を配置。
3. その中に `Label`(名前: `lblBar`)を配置し、背景色を青系に。
4. 進捗率表示用に `Label`(名前: `lblStatus`)を配置。
—
3. 実践!堅牢な進捗バー・プロダクションコード
このコードは、処理件数に関わらず「重さ」を最小化するよう設計されています。
進捗バーフォーム(frmProgress)のコード
‘ フォームのプロパティ:ShowModal = False に設定しておくこと
Public Sub UpdateProgress(ByVal current As Long, ByVal total As Long)
Dim percent As Double
percent = current / total
‘ 進捗バーの幅を計算(フレーム幅を最大値とする)
Me.lblBar.Width = Me.fraBar.Width percent
Me.lblStatus.Caption = “処理中: ” & Format(percent, “0%”) & ” (” & current & “/” & total & “)”
‘ 描画の強制更新
Me.Repaint
End Sub
メインモジュールの実行ロジック
Sub BatchProcessDrawings()
Dim totalItems As Long: totalItems = 500
Dim i As Long
Dim progressStep As Long: progressStep = 5 ‘ 5件ごとにUIを更新(オーバーヘッド削減)
‘ フォームをモードレスで表示
Load frmProgress
frmProgress.Show vbModeless
For i = 1 To totalItems
‘ — ここに実際の重い処理を記述 —
‘ e.g., AutoCAD APIを叩く処理
‘ 定期的にUIを更新
If i Mod progressStep = 0 Or i = totalItems Then
frmProgress.UpdateProgress i, totalItems
DoEvents ‘ OSに制御を戻し、応答なしを防ぐ
End If
Next i
Unload frmProgress
MsgBox “処理が完了しました。”, vbInformation
End Sub
—
4. 現場で生き残るための「鉄則」
コードを動かすことと、業務で使い続けることは別次元の話です。以下のポイントを必ず押さえてください。
1. ユーザーによる「キャンセル」の実装
処理が長引いた時、ユーザーは「やはり止めたい」と思うものです。フォームに「キャンセル」ボタンを配置し、グローバル変数(`bCancel As Boolean`)を監視して、`Exit For` を差し込む設計を必ず入れてください。
2. ファイルシステムとの整合性
ファイルを開くループ処理を行う場合、`On Error GoTo` でエラーハンドリングを徹底してください。1枚の図面が壊れていただけでプロセス全体が落ちるのは、自動化エンジニアとして失格です。ログファイルに「どの図面で止まったか」を書き出す処理を併用しましょう。
3. AutoCAD APIの「沈黙」を許さない
大量の図面を `Open` する際は、`Application.Documents.Open` の前に `Application.DisplayAlerts = False` を宣言し、ダイアログによる中断を物理的に遮断するのが定石です。
—
最後に:なぜ「作り込む」のか
「動けばいい」というコードは、数ヶ月後に必ず自分自身を苦しめます。
AutoCAD VBAの進捗バーは、単なる見た目の装飾ではありません。「システムが生きていること」を証明する心電図です。
この設計パターンをマスターすれば、あなたの作るツールは単なる「スクリプト」から、現場で信頼される「業務システム」へと昇華します。さあ、コードを開いて、あなたのツールに「命」を吹き込んでください。
