【実務・中級編】【実務中級】AcadApplication.Captionを動的に書き換え、バッチ処理の進捗をタスクバーに表示 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握せよ:タスクバーを「進捗モニター」に変える極限のUI術

AutoCADのバッチ処理において、最も忌むべきは「沈黙」だ。数千の図面をループで回す際、画面がフリーズしたように静まり返ると、ユーザーは不安に駆られ、無意識にタスクマネージャーを起動してプロセスを強制終了させる。

君たちが作るべきは、ただ動くツールではない。「今、何が起きているか」を雄弁に語る、信頼性の高いシステムだ。

今回は、ユーザーフォームという「重い」リソースを消費せず、AutoCADのメインウィンドウタイトル(`AcadApplication.Caption`)をハックして、タスクバーに進捗をリアルタイム表示させるプロフェッショナルな手法を伝授する。

1. なぜ「ユーザーフォーム」ではなく「Caption」なのか

AutoCAD VBAにおいて、`UserForm`は強力だが、多重起動やモーダル制御、メモリリークのリスクを孕む。特に、数百〜数千単位のファイルを開閉するようなバッチ処理において、Formの描画更新はオーバーヘッドとなり、パフォーマンスを著しく低下させる。

`AcadApplication.Caption`の書き換えは、AutoCADのメインプロセス直結のメタデータ操作だ。描画リソースを一切消費せず、OSレベルで進捗を表示できる。これが「極限の効率化」を求めるエンジニアが選ぶべき道だ。

2. 実装の要諦:堅牢なプログレスハンドラー

単に文字列を代入するだけでは素人だ。バッチ処理中にエラーが発生した際、ウィンドウタイトルが「処理中:99/100」のまま放置されるのは、システムとして美しくない。

以下のコードは、タイトルを動的に制御するだけでなく、終了時に元のタイトルへ確実に復帰させる設計思想を組み込んでいる。

実装コード

‘ — プロダクションレベルの進捗管理モジュール —

Public Sub RunBatchProcess()
Dim originalCaption As String
Dim i As Long, totalCount As Long

‘ 1. 現在のキャプションを退避(後始末のため必須)
originalCaption = ThisDrawing.Application.Caption
totalCount = 100 ‘ 例: 処理対象の総数

On Error GoTo ErrorHandler ‘ 予期せぬ停止に備える

For i = 1 To totalCount
‘ ここにメインの業務ロジックを記述
‘ …

‘ 2. 進捗をタイトルに反映
‘ リアルタイム性を高めるため、必要に応じて DoEvents を挟む
If i Mod 5 = 0 Then ‘ 描画負荷を抑えるため間引くのがコツ
ThisDrawing.Application.Caption = “処理中: ” & i & “/” & totalCount & ” – ” & originalCaption
DoEvents
End If
Next i

‘ 3. 正常終了時の復旧
ThisDrawing.Application.Caption = originalCaption
MsgBox “全処理が完了しました。”, vbInformation
Exit Sub

ErrorHandler:
‘ 4. エラー時の後始末:タイトルを戻さないとユーザーが混乱する
ThisDrawing.Application.Caption = originalCaption
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical
End Sub

3. エンジニアが守るべき3つの掟

この手法を実務で運用するにあたり、以下の原則を厳守してほしい。

① `DoEvents` の「毒と薬」を見極めろ

`DoEvents`はOSに制御を戻し、画面更新を促す魔法のコマンドだが、多用しすぎると処理速度が大幅に低下する。上記のコードのように、`Mod`(剰余演算)を使って更新頻度を適切に間引くことが、パフォーマンスを維持するエンジニアリングの勘所だ。

② ファイルI/Oとデータベース連携の注意点

バッチ処理中に外部DBやExcelを操作する場合、AutoCADのCaptionだけでなく、ログファイルへの書き出しを併用すること。万が一、途中でAutoCADがクラッシュしても、ログがあれば「どこまで終わったか」を追跡できる。

  • `Open “C:\Logs\batch_log.txt” For Append As #1`
  • 必ず `Close #1` を `Finally`(エラーハンドラ内)で確実に実行する習慣をつけろ。

③ 拡張性(将来への布石)

もし将来的に進捗表示が複雑化(例:パーセンテージバーをタイトルに擬似的に描画する等)したとしても、`Caption`更新ロジックを独立した `Sub` に切り出しておけば、修正は一箇所で済む。

最後に:ツールは「対話」である

ユーザーにとって、ブラックボックス化された処理ほど怖いものはない。タスクバーに表示される数値は、単なる進捗表示ではなく、システムからユーザーへの「私は正常に動作している」という信頼のシグナルだ。

コードを書くことは、ただ機能を実装することではない。使う側の心理を読み解き、ストレスフリーな体験を設計することだ。君たちのコードが、現場の空気を変える力になることを期待している。

さあ、エディタを開け。理論ではなく、コードで語れ。

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