こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩踏み出し、自分の手でAutoCADを自在に操りたい――そう思っているあなたへ。
今回は、実務の現場で「おっ、やるな!」と一目置かれるような、ちょっとした、しかし極めて実用的なテクニックをご紹介します。
テーマは 「バッチ処理中の『残り図面枚数』をタイトルバー(タスクバー)でリアルタイムに確認する方法」 です。
何十枚、何百枚という図面を一括処理(バッチ処理)している最中、AutoCADを最小化して他の作業をしていませんか?「今、何枚目が終わったんだろう……」と、わざわざウィンドウを開いて確認するストレス、今日で終わりです。
ここをクリアすれば、AutoCAD VBAの基本とオブジェクトモデルの考え方がグッと身につきますよ。さあ、一緒に扉を開けましょう!
—
1. AutoCAD VBAの心臓部:`AcadApplication` とは何者か?
AutoCAD VBAのコードを書き始めると、必ずと言っていいほど目にするのが `ThisDrawing` や `AcadApplication` という言葉です。
- `AcadApplication`: AutoCADという巨大なアプリケーションそのものを指す最高責任者です。
- `AcadDocument`(`ThisDrawing`など): 今まさに画面に開いている「個別の図面ファイル」です。
初心者の方が最初に勘違いしやすいのが、「図面を閉じたらVBAも終わってしまうの?」という点です。しかし、`AcadApplication` は「AutoCADが起動している間、ずっとそこに君臨し続ける親分」です。図面が閉じられようとも、アプリケーション自体が生きていれば、この親分を通じて様々な命令を出すことができます。
そして、今回主役として登場するのが、この親分が持つプロパティの一つ `Caption`(キャプション) です。
—
2. タイトルバーの文字列をハックする:`AcadApplication.Caption`
AutoCADのウィンドウの一番上、バージョン名や開いている図面名が表示されている帯を見たことがありますよね?あれが「タイトルバー」であり、VBAからは `AcadApplication.Caption` という文字列として自由にいじることができます。
通常、ここには「AutoCAD 2024 – [図面1.dwg]」といった味気ない文字が入っていますが、ここに「現在何枚目を処理中か」という動的な情報をリアルタイムで流し込んでやろうというのが今回の作戦です。
Windowsのタスクバーには、このタイトルバーの文字列がそのままアイコンの横(またはプレビュー)に反映されます。つまり、AutoCADを最小化して他のソフトで作業していても、タスクバーを見るだけで進捗が一目でわかるようになるのです。
—
3. 実践!進捗表示バッチ処理マクロのコード
百聞は一見に如かず。実際に動くコードを見てみましょう。
以下のコードを、ご自身のVBAエディタ([Alt] + [F11])の標準モジュールに貼り付けてみてください。
今回は、擬似的に「5枚の図面を順番に処理している」というシナリオで、タイトルバーがカウントダウンしていく様子を再現します。
Sub BatchProcessWithProgress()
Dim i As Long
Dim totalFiles As Long
Dim originalCaption As String
‘ 1. 処理する総図面枚数を設定(今回はダミーで5枚とします)
totalFiles = 5
‘ 2. 処理前の元のタイトルバーを記憶しておく(後で元に戻すため重要!)
originalCaption = ThisDrawing.Application.Caption
On Error GoTo ErrorHandler ‘ エラー時にタイトルが戻らなくなるのを防ぐ
‘ 3. バッチ処理のループ開始
For i = 1 To totalFiles
‘ —————————————————-
‘ 【ここが今回のハイライト】
‘ タイトルバーに残り枚数と進捗をリアルタイムで表示する
‘ —————————————————-
ThisDrawing.Application.Caption = “【バッチ処理中】 完了: ” & (i – 1) & “枚 / 残り: ” & (totalFiles – i + 1) & “枚 (” & i & “/” & totalFiles & “)”
‘ 4. ここに実際の図面処理(開く、修正、保存、閉じる等)が入ります
‘ 今回は処理している雰囲気を出すため、1秒間プログラムを停止させます
Call Sleep1Sec
Next i
‘ 5. 処理終了!タイトルバーを元の状態に戻す
ThisDrawing.Application.Caption = originalCaption
MsgBox “すべてのバッチ処理が完了しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ 万が一エラーが発生しても、タイトルバーが元のまま放置されないようにする配慮
ThisDrawing.Application.Caption = originalCaption
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ 1秒間待機するためのヘルパープロシージャ(雰囲気用)
Sub Sleep1Sec()
Dim start As Single
start = Timer
Do While Timer < start + 1
DoEvents ' WindowsがフリーズしないようにOSに主導権を渡すお作法
Loop
End Sub
コードの注目ポイント
1. `originalCaption` による復元処理
プログラミングにおいて「自分が汚した環境は元通りにして綺麗に退散する」のはプロの基本です。処理が終わった後、あるいはエラーで強制終了したときにも、元のタイトルバーを復元する気配りを忘れません。
2. `DoEvents` の存在
ループの中で重い処理や待機を行う際、`DoEvents` を挟むことで、Windowsが「あ、このアプリまだ生きてるな」と認識し、タスクバーの表示更新やウィンドウの描画がスムーズに行われます。これがないと、画面がフリーズしたように固まってしまいます。
—
4. 初心者が陥りやすい罠とエンジニアの知見
このコード自体は非常にシンプルですが、実務の現場(何百枚もの図面を相手にするバッチ処理)でこれを実装する際、いくつか知っておくべき「プロの知見」があります。
罠その1:エラーでマクロが止まると、タイトルバーが変なままになる
「処理中のままマクロが異常終了してしまい、いつまでもタイトルバーが『【バッチ処理中】…』のまま直らない」という現象がよく起きます。これを防ぐために、上記のコードのように `On Error GoTo` を使って、どんな結末を迎えても必ず元のタイトルバーに戻る「後始末の仕組み」を必ず組み込んでください。
罠その2:頻繁すぎる書き換えはパフォーマンスの敵
`AcadApplication.Caption` の書き換えは比較的軽い処理ですが、1秒間に何千回もループ内で呼び出すと、わずかながらGUIスレッドに負荷がかかります。図面1枚の処理に数秒〜数分かかるような一般的なバッチ処理であれば全く問題ありませんが、「1つの図面の中にある何万個ものオブジェクトを舐めるループ」の中で毎回Captionを書き換えるのは避けましょう。「図面が1枚終わるごとに更新する」という粒度にするのがベストプラクティスです。
—
おわりに
いかがでしたでしょうか?
たった1行、`ThisDrawing.Application.Caption = …` というコードを書き換えるだけでも、AutoCADという巨大なアプリケーションの「内部(オブジェクトモデル)」と対話している実感が湧いてきたのではないでしょうか。
マクロの記録では決して作れない、こうした「かゆいところに手が届くUIの工夫」ができるようになると、あなたの業務自動化スキルは一気に次のステージへと駆け上がります。
ここをクリアしたあなたなら、もう立派なAutoCAD VBAの書き手です。ぜひ、日々の退屈なバッチ処理にこのテクニックを組み込んで、コーヒーを飲みながらタスクバーのカウントダウンを眺める優雅な開発ライフを手に入れてください!
