こんにちは!AutoCADの自動化の世界へようこそ。
あなたが書いたVBAのマクロが、何百枚もの図面を相手に唸り声をあげて動き出すとき――それはエンジニアにとって最高にワクワクする瞬間です。
しかし、現場でそのマクロを動かした瞬間、こんな恐怖の沈黙が訪れたことはありませんか?
「……画面が固まった? 強制終了すべき?」
CADの画面がピクリとも動かなくなり、ユーザーは不安のあまりタスクマネージャーを開いてしまう。あの冷や汗が出る瞬間を防ぐために、プロの現場では「タイトルバーへの進捗表示」を実装します。
今回は、AutoCAD VBAの根幹である `AcadApplication` オブジェクトを操り、タイトルバーに「現在の処理進捗(%)」をリアルタイムで映し出す、優しくそして実用的なバッチ処理のテクニックを伝授しましょう。
ここをクリアすれば、あなたの作るマクロは一気に「プロのツール」へと進化しますよ。
—
1. なぜ「タイトルバー」を使うのか?
大量の図面を開いて、レイアウトを修正し、保存して閉じる……。そんなバッチ処理を組んだとき、VBAはひたすら裏で計算と描画を繰り返します。
画面上にフォーム(UserForm)を出してプログレスバーを表示するのも一つの手ですが、重い処理の最中にフォームを描画し直す負荷は、意外とバカになりません。さらに、AutoCAD自体のウィンドウがアクティブな状態を保ったまま、視線の自然な移動先(一番上にあるタイトルバー)に情報を出すのが、最もスマートで負荷の少ない方法なのです。
そこで登場するのが、AutoCADの根幹を司る `AcadApplication` オブジェクト です。
—
2. オブジェクトモデルの基礎:`ThisDrawing` と `Application`
AutoCAD VBAを書き始めると、よく目にするのが `ThisDrawing` という言葉ですね。これは「今、自分が触っている図面」を指します。
しかし、今回私たちが操作するのは図面の中身ではなく、AutoCADというアプリケーションそのものです。
- `ThisDrawing` : 今開いている「図面」のオブジェクト(AcadDocument)
- `Application`(または `AcadApplication`) : AutoCADという「ソフト全体」のオブジェクト
`Application` オブジェクトには、AutoCADのウィンドウそのものを制御するプロパティがたくさんあります。その一つが、ウィンドウのタイトルを変更する `Caption` プロパティ です。
—
3. 実装コード:タイトルバーを進捗表示にジャックする
それでは、実際に動くコードを見てみましょう。
今回は、仮想的に「5つの図面を一括処理する」というシナリオで、タイトルバーにパーセンテージと現在の処理ファイル名を表示するバッチ処理のサンプルを用意しました。
VBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub BatchProcessWithProgress()
‘ 変数の宣言
Dim app As AcadApplication
Dim originalCaption As String
Dim fileList(4) As String
Dim totalFiles As Long
Dim i As Long
Dim percent As Long
‘ 1. AutoCADアプリケーションオブジェクトの取得
‘ (ThisDrawing.Application でも取得可能です)
Set app = ThisDrawing.Application
‘ 2. 後で元に戻すために、元のタイトルを退避しておく(超重要!)
originalCaption = app.Caption
‘ 処理するファイルのリスト(今回は擬似的に配列で表現)
fileList(0) = “Aビル_1階平面図.dwg”
fileList(1) = “Aビル_2階平面図.dwg”
fileList(2) = “Aビル_電気設備図.dwg”
fileList(3) = “Aビル_空調設備図.dwg”
fileList(4) = “Aビル_外構図.dwg”
totalFiles = UBound(fileList) – LBound(fileList) + 1
On Error GoTo ErrorHandler ‘ エラー時にタイトルが戻らなくなるのを防ぐ
‘ 3. バッチ処理ループの開始
For i = LBound(fileList) To UBound(fileList)
‘ — [ここが今回のメインテーマ!] —
‘ 進捗率(%)の計算
percent = CLng(((i + 1) / totalFiles) 100)
‘ タイトルバーを書き換えてユーザーに安心感を与える
app.Caption = “【バッチ処理実行中… ” & percent & “%完了】 処理ファイル: ” & fileList(i)
———————————-
‘ 【CADのフリーズ感を消すための裏技】
‘ 画面の描画更新やWindowsのイベントを無理やり処理させる
DoEvents
‘ — ここに実際の重い処理を書く(今回は擬似的に2秒待機) —
Call SimulateHeavyWork(2)
‘ ———————————————————–
Next i
‘ 4. 正常終了:タイトルバーを元の状態に戻す
app.Caption = originalCaption
MsgBox “すべてのバッチ処理が正常に完了しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 5. エラーハンドリング:万が一マクロがクラッシュしてもタイトルを元に戻す
app.Caption = originalCaption
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ 擬似的に重い処理を再現するヘルパー関数
Sub SimulateHeavyWork(ByVal second As Long)
Dim startTime As Single
startTime = Timer
Do While Timer < startTime + second
DoEvents ' ループ中もWindowsの操作を受け付けるようにする
Loop
End Sub
---
4. コードの重要ポイントを深掘り解説
初心者のうちは、「動けばいいや」となりがちですが、実務で使うためにはいくつかの「お作法」があります。ここを理解しているかどうかが、プロとアマの分かれ道です。
① `app.Caption` への代入
`app.Caption = “…”` と記述するだけで、AutoCADのウィンドウの一番上(ファイル名が表示されているバー)のテキストが書き換わります。ここに現在何%終わっているかを表示するだけで、ユーザーは「あ、ちゃんと動いているんだな」と目で見て安心できます。
② 元のタイトルに戻すこと (`originalCaption`)
マクロが終了したとき、タイトルバーが「バッチ処理実行中… 100%完了」のまま残っていたらカッコ悪いですよね。それだけでなく、次に開く図面名が表示されなくなるなど不具合の元になります。
必ず処理の最初に `originalCaption = app.Caption` で元のタイトルを記憶させ、処理の最後(およびエラー時)に元に戻すようにしましょう。
③ `DoEvents` という魔法の呪文
VBAが重いループ処理に入ると、Windowsは「このアプリはフリーズしたのかな?」と判断しがちです。ここで `DoEvents` を挟むことによって、「OSに処理権を一時的に渡し、画面の再描画やユーザーからの操作を受け付ける余裕」を与えます。
タイトルバーの文字をリアルタイムで書き換えるためには、この `DoEvents` が絶対に不可欠です。
—
5. 現場でよくある「落とし穴」と対策
最後に、この実装を行う際につまずきやすいポイントをいくつか共有しておきます。
- エラーで止まったときにタイトルが戻らない問題
- 対策:上記のコードのように `On Error GoTo` を必ず用意し、エラーハンドラの中でもタイトルを元に戻す処理を書きましょう。これをサボると、AutoCADを再起動するまでタイトルがおかしなことになります。
- 処理が早すぎて文字がチラつく問題
- 対策:1図面あたりの処理が0.1秒未満で終わるような場合、逆にタイトルバーの書き換え処理がボトルネックになってマクロが遅くなります。処理が重い(数秒〜数十秒かかる)バッチ処理でのみ使うのがコツです。
—
おわりに:小さな気配りが、エンジニアの評価を変える
「ただ動くプログラム」を書くのは、少し勉強すれば誰にでもできます。
しかし、「使う人が不安にならないプログラム」「現場のストレスを減らすプログラム」を書ける人は、社内ニートから一目置かれる自動化エンジニアへと確実にステップアップできます。
タイトルバーに「いま何%か」を表示する。たったこれだけの工夫ですが、あなたの作るツールへの信頼度は劇的に変わります。
ぜひ、次の図面一括処理マクロから取り入れてみてください。「ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ!」
それでは、また次回の極限の知見でお会いしましょう。あなたの開発ライフが快適なものになりますように!
