【入門編】【実務中級】AutoCAD VBAでの「進捗バー」実装:大量図面処理のストレスを軽減するUserFormとDoEventsの活用術 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは。AutoCADの自動化という深淵な世界へようこそ。

「大量の図面をバッチ処理している間、AutoCADがフリーズしたように真っ白になり、不安な気持ちで画面を眺める……」
そんな経験、ありませんか?

AutoCAD VBAは強力ですが、シングルスレッドの制約上、重いループ処理を回すとOSからは「応答なし」と判断されてしまいます。これは初心者から脱却し、プロのエンジニアを目指すあなたが最初に乗り越えるべき「洗礼」です。

今日は、ただ動くコードではなく、「ユーザーに安心感を与える、プロ品質の進捗表示」を実装する技術を伝授しましょう。

1. なぜ「応答なし」になるのか?

AutoCAD VBAが処理中にフリーズするのは、「メッセージループ」が止まっているからです。

Windowsは常に「マウスクリックはないか?」「画面の再描画は必要か?」といったイベントを監視しています。しかし、VBAで重いループ処理(何百もの図面を開くなど)を始めると、プログラムはその計算に没頭してしまい、Windowsからの問い合わせを無視してしまう。これが「応答なし」の正体です。

これを解決する鍵が、「UserForm(モードレス)」「DoEvents関数」の黄金コンビです。

2. 実装のステップ:モードレスフォームの準備

まずは、進捗を表示するUserFormを作成しましょう。

1. VBAエディタで `挿入` > `ユーザーフォーム` を選択。
2. 名前を `frmProgress` とします。
3. フォーム内に `Label` を配置し、名前を `lblProgress` とします。
4. 重要: フォームの `ShowModal` プロパティを `False` に設定してください。これが「モードレス」の正体です。これがないと、フォームが開いている間、他の操作がブロックされてしまいます。

3. 実践コード:進捗バーを動かす心臓部

以下のコードは、100回繰り返す処理を想定したサンプルです。`DoEvents` がどれほど重要か、その目で確かめてください。

Public Sub RunBatchProcess()
Dim i As Long
Dim totalSteps As Long: totalSteps = 100

‘ 1. フォームをモードレスで表示
frmProgress.Show vbModeless

‘ 2. メインのループ処理
For i = 1 To totalSteps
‘ — ここに重い処理を書く —
‘ 例: データベースへのアクセス、図面オブジェクトの編集など
‘ Call DoSomething(i)

‘ 3. 進捗状況の更新
frmProgress.lblProgress.Caption = “処理中: ” & i & ” / ” & totalSteps

‘ 4. 【極めて重要】DoEventsでOSに制御を返す
‘ これがないと画面が更新されず、応答なしになります
DoEvents

Next i

‘ 5. 処理終了後にフォームを閉じる
Unload frmProgress
MsgBox “全処理が完了しました!”
End Sub

なぜ `DoEvents` が魔法なのか?

`DoEvents` は、VBAが占有しているCPUの制御権を一時的にOSへ戻す命令です。「おい、Windows、溜まっているマウス操作や画面描画のキューを今すぐ処理してくれ!」と割り込むことで、AutoCADは「自分はまだ生きている(応答している)」とOSにアピールできるのです。

4. 陥りやすい罠とエンジニアの心得

この実装には、初心者が見落としがちな「落とし穴」がいくつかあります。

  • DoEventsの過剰使用:

ループのたびに `DoEvents` を呼ぶのは、実は少しだけ負荷がかかります。1万回以上のループなら、`If i Mod 10 = 0 Then DoEvents` のように、10回に1回だけ呼ぶようにするだけで、処理速度と応答性のバランスが劇的に向上します。

  • ユーザーによる強制終了:

モードレスフォームを使っていると、ユーザーが処理の途中で「×」ボタンを押してフォームを閉じてしまう可能性があります。これを防ぐには、フォームの `QueryClose` イベントで `Cancel = True` を設定し、処理中には閉じられないようにガードするのがプロの流儀です。

最後に:自動化は「対話」である

自動化プログラムは、ただ動けばいいというものではありません。それを使うのは「人間」です。

進捗バーを表示するということは、「私は今、正しく動いていますよ。あと少しで終わりますよ」とユーザーと対話することです。この小さな気配りが、あなたの書くコードを「ただのプログラム」から「信頼できる業務ツール」へと昇華させます。

さあ、次はあなたのバッチ処理にこのロジックを組み込んでみてください。画面がスムーズに更新され、進捗が進んでいく様子を見たとき、あなたはまた一つ、エンジニアとしての階段を登ったことになります。

応援していますよ。何かあれば、いつでも聞きに来てください。

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