【実務・中級編】【初心者】AcadApplication.Captionに「現在の処理進捗(%)」を表示させ、ユーザーに安心感を与えるバッチ処理の実装 – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA実践】タイトルバー(AcadApplication.Caption)をジャックせよ! ユーザーの不安を消し去る進捗率表示の極意

開発プロジェクトの現場において、VBAによるバッチ処理は日常茶飯事だ。数百枚におよぶ図面の一括パージ、属性データの吸い上げ、レイアウトの自動生成――。

だが、ここで開発者が陥りがちな「致命的な悪手」がある。
それは、「重い処理を黙々とバックグラウンドで実行し、画面をフリーズ状態のまま放置すること」だ。

画面がピクリとも動かなくなったAutoCADを前に、ユーザーはこう思う。
「おい、これ固まってないか? 強制終了したほうがいいか?」
そして恐怖のタスクマネージャー強制終了。結果、中途半端に書き換えられた図面データと、半日分の労力が闇に消える。

この悲劇を防ぐために必要なのは、高度なアルゴリズムではない。「今、何%終わっていて、あとどれくらいで解放されるのか」という、ユーザーへの最低限の「生存確認(安心感)」だ。

今回は、`AcadApplication.Caption` を極限まで活用し、AutoCADのタイトルバーをリアルタイム進捗モニターに変貌させるプロダクションコードを伝授する。

なぜ `AcadApplication.Caption` なのか?

AutoCADのUIをハックする方法はいくつかある。ステータスバーに文字を表示する手法もあるが、処理が重い最中ではステータスバーの更新が追いつかなかったり、視認性が悪かったりする。

そこで着目すべきが、ウィンドウ最上部に君臨する `AcadApplication.Caption` だ。
アプリケーションのタイトルバーは、AutoCADのメインプロセスと密接に連動しており、VBAから直接文字列をねじ込むことで、OSレベルで即座に描画が更新される。しかも、図面領域の邪魔を一切しない。

ここに `[35%完了] 処理中: A-101_Bldg.dwg` といった動的テキストを表示できれば、ユーザーは安心してコーヒーを飲みに行くことができる。

堅牢なバッチ処理設計の3原則

実務で使えるコードを書く前に、プロのアーキテクトとして守るべき3つの原則を頭に叩き込んでほしい。

1. 画面描画のロック(`ScreenUpdating`の概念)
AutoCAD VBAにはExcelのような `Application.ScreenUpdating` は存在しないが、`SetFocus` や不必要な図面ウインドウのアクティブ化を排除することで、無駄な再描画コストを削る。
2. エラー時の原状復帰(Exception Safety)
処理中にエラー落ちした際、タイトルバーが「[98%完了 処理中…]」のまま固定されるのはプロとしてダサい。必ず `Finally` 相当の例外処理(Error Handler)でデフォルト値に戻すこと。
3. 適切なイベントの抑制
一括処理中は `DisplayAlerts` や自動保存のタイミングを制御し、ポップアップダイアログで処理がストップする「フリーズの罠」を断ち切る。

【コピペOK】プロダクション・コード例

以下のコードは、指定フォルダ内の全DWGファイルを巡回し、処理進捗を `AcadApplication.Caption` にリアルタイムパーセンテージ表示しながらバッチ処理を行う完成版モジュールだ。

Option Explicit

‘ メインエントリーポイント:バッチ処理の実行
Sub ExecuteBatchProcessWithProgress()
Dim originalCaption As String
Dim targetFolder As String
Dim fso As Object
Dim folder As Object
Dim file As Object
Dim dwgFiles() As String
Dim fileCount As Long
Dim i As Long
Dim startTime As Double

startTime = Timer

‘ 1. 現在のタイトルバーを退避(処理終了後に復元するため絶対必要)
originalCaption = ThisDrawing.Application.Caption

On Error GoTo ErrorHandler

‘ 2. 対象フォルダの指定(ここでは例として固定パス、またはダイアログ等で取得)
targetFolder = “C:\AutoCAD_Work\TargetDrawings\”

Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(targetFolder) Then
MsgBox “指定されたフォルダが存在しません: ” & targetFolder, vbCritical, “パスエラー”
Exit Sub
End If

Set folder = fso.GetFolder(targetFolder)

‘ 3. 対象ファイルのリストアップとカウント
fileCount = 0
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = “dwg” Then
fileCount = fileCount + 1
ReDim Preserve dwgFiles(1 To fileCount)
dwgFiles(fileCount) = file.Path
End If
Next file

If fileCount = 0 Then
MsgBox “処理対象のDWGファイルが見つかりませんでした。”, vbExclamation, “通知”
Exit Sub
End If

‘ 4. AutoCADの余計な警告を抑制し、パフォーマンスを最大化
ThisDrawing.Application.Preferences.System.DisplayPlotPreview = False

‘ 5. メインループ:進捗率の計算とCaptionの書き換え
For i = 1 To fileCount
Dim progressPercent As Long
progressPercent = CLng((i / fileCount) 100)

‘ ★ここに極上の安心感を与えるタイトルバー制御を実装
UpdateCaption progressPercent, i, fileCount, fso.GetFileName(dwgFiles(i))

‘ —————————————————-
‘ 【実務用処理ブロック】 ここに図面に対する実際の処理を書く
‘ —————————————————-
ProcessSingleDrawing dwgFiles(i)
‘ —————————————————-

‘ Windowsに制御を少し返し、タイトルバーの描画を確実に行わせるための軽量ウェイト
DoEvents
Next i

‘ 6. 正常終了時の処理
ThisDrawing.Application.Caption = originalCaption
MsgBox “すべてのバッチ処理が完了しました!” & vbCrLf & _
“処理ファイル数: ” & fileCount & ” 件” & vbCrLf & _
“所要時間: ” & Format(Timer – startTime, “0.0”) & ” 秒”, vbInformation, “完了”

Exit Sub

ErrorHandler:
‘ 7. 異常終了時も必ずタイトルバーを元に戻す(死活管理の鉄則)
ThisDrawing.Application.Caption = originalCaption
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

‘ タイトルバー文字列を組み立ててアサインするヘルパー関数
Private Sub UpdateCaption(ByVal percent As Long, ByVal current As Long, ByVal total As Long, ByVal fileName As String)
Dim bar As String
Dim filled As Long
Dim empty As Long

‘ 視覚的なプログレスバーを文字で表現(例: [██████░░░░] 60%)
Const BAR_Length As Long = 10
filled = CLng((percent / 100) BAR_Length)
If filled > BAR_Length Then filled = BAR_Length
empty = BAR_Length – filled

bar = “[” & String(filled, “■”) & String(empty, “□”) & “]”

‘ AcadApplication.Captionに反映
ThisDrawing.Application.Caption = “【バッチ処理中 ” & bar & ” ” & percent & “%】 (” & current & “/” & total & “) 処理ファイル: ” & fileName
End Sub

‘ 個別図面に対する処理(サンプル)
Private Sub ProcessSingleDrawing(ByVal filePath As String)
Dim doc As AcadDocument

‘ データベースを開く(非表示またはバックグラウンドに近い形で開くのが理想)
Set doc = Documents.Open(filePath)

‘ — ここに監査、パージ、属性変更などのコードを記述 —
doc.PurgeAll
‘ ————————————————–

‘ 保存して閉じる
doc.Save
doc.Close False
End Sub

ジグザグに動くテキストプログレスバー(`[■■■■□□□□□□] 40%`)をタイトルバーに搭載することで、ユーザーは「あ、ちゃんと動いているな」と視覚的に確信でき、余計な問い合わせや誤った強制終了を防ぐことができる。

チーフアーキテクトからの現場への助言

このコードを導入するにあたって、1点だけ注意してほしい。
`Documents.Open` を大量に繰り返す手法は、AutoCADのバージョンや図面の重さによってはメモリリークのリスクを孕む。もし数千枚単位の極限のパフォーマンスを求めるなら、`Documents.Open` で画面上に図面を開くのではなく、ObjectDBX (`AxDb.AxDbDocument`) を使用してメモリ上で直接DWGを操作するアーキテクチャへと昇華させるべきだ。

とはいえ、まずは目の前のユーザーの不安を解消し、「動いている安心感」を提供すること。それが、頼れる自動化エンジニアの第一歩である。

明日からの開発現場で、ぜひこのコードを組み込み、スマートなシステムを構築してほしい。

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