「MsgBoxで思考を止めるな」:AutoCAD VBAのプロフェッショナルが教える、真に「親切」なコマンドラインUI設計
AutoCADの業務自動化ツールを開発する際、多くの初心者が陥る「最大の罠」がある。それが`MsgBox`の乱用だ。
「処理が完了しました」「次の図形を選択してください」――画面中央にポップアップを出し、ユーザーにわざわざ「OK」ボタンを押させる。これこそが、設計者がユーザーのワークフローを寸断し、生産性を殺している瞬間である。
CADオペレーターは、マウスとキーボードの連携の中でリズムを作っている。そのリズムを強制停止させるツールは、どんなに高度な処理をしていても「邪魔なプログラム」でしかない。
今日は、AutoCAD本来の挙動である「コマンドラインとの対話」をVBAで完璧に制御し、洗練されたインターフェースを実現するための極意を伝授する。
—
1. なぜ「コマンドライン」へ出力すべきなのか?
AutoCADのUI哲学において、ステータスバーとコマンドウィンドウは「ユーザーとの会話の場所」だ。
- 非同期的な通知: 処理を中断させず、ユーザーは必要に応じて過去のログを確認できる。
- AutoCAD標準との親和性: ユーザーはコマンドラインを見ること自体に慣れている。
- パフォーマンスの担保: ダイアログを表示するオーバーヘッドは、繰り返しの処理において意外にも大きなロスとなる。
`AcadDocument.Utility.Prompt` を使いこなすことは、単なる装飾ではなく、「プロフェッショナルなツール」への第一歩なのだ。
—
2. 実装の極意:使い捨てではない「Prompt」の設計
単に文字列を出すだけでは足りない。実務では「現在の処理がどこまで進んだか(進捗)」「どのオブジェクトを操作しているか」というコンテキストが不可欠だ。
以下のコードは、保守性が高く、かつ実務でそのまま利用できる「ロギング兼ユーザーガイダンス」のテンプレートである。
プロダクションコード例:スマート・プロンプト・コントローラー
Option Explicit
‘ ———————————————————
‘ 処理状況をコマンドラインへスマートに通知するためのクラス的関数
‘ ———————————————————
Public Sub WriteCommandLog(ByVal message As String, Optional ByVal isHeader As Boolean = False)
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ プロンプト表示の基本形
‘ vbCrLf で改行を制御し、ログを読みやすくする
If isHeader Then
doc.Utility.Prompt vbCrLf & “— ” & message & ” —” & vbCrLf
Else
doc.Utility.Prompt “>> ” & message & vbCrLf
End If
End Sub
‘ ———————————————————
‘ 実務での利用例:大量のブロックを一括処理する際のフィードバック
‘ ———————————————————
Public Sub ProcessBlocksEfficiently()
Dim block As AcadBlockReference
Dim i As Long
WriteCommandLog “処理を開始します。全ブロックを解析中…”, True
‘ エラーハンドリングを忘れずに(堅牢な設計の基本)
On Error GoTo ErrorHandler
For i = 0 To ThisDrawing.ModelSpace.Count – 1
‘ ここで実際の処理を行う
‘ ユーザーを止めずに進捗をチラ見せする
If i Mod 10 = 0 Then
WriteCommandLog “現在 ” & i & ” 個目のオブジェクトを処理中…”
End If
Next i
WriteCommandLog “処理が正常に完了しました。”, True
Exit Sub
ErrorHandler:
WriteCommandLog “エラー発生: ” & Err.Description, True
End Sub
—
3. 実務担当者が知るべき「3つの鉄則」
現場で動くツールを作るためには、コードの書き方以上に「設計の意識」が重要になる。
① 「ユーザーの思考を遮断しない」
複雑な計算が終わるまで画面を固めるのではなく、計算のステップごとに `Prompt` で状況を出すこと。これにより、フリーズしたのか計算中なのかをユーザーが即座に判断できる。
② 「エラーはコマンドラインに集約せよ」
`MsgBox` でエラーを出すと、マクロが途中で停止し、背後で開いているデータベース接続やファイルハンドルが解放されないまま残るリスクがある。エラーこそコマンドラインに書き出し、プログラムは静かに終了(またはロールバック)させるべきだ。
③ 「ログの階層化」
単なる文字列の羅列はノイズになる。`vbCrLf` を巧みに使い、処理の区切りを明確にすること。上記サンプルのように `isHeader` フラグを持たせるだけで、コマンドウィンドウの視認性は劇的に向上する。
—
結論:プロのツールは「空気」である
最高に優れた自動化ツールとは、使っているユーザーが「自分の手で操作している感覚」を失わないものだ。
コマンドラインを使いこなすことは、AutoCADの内部処理とユーザーの意思決定を同期させる技術である。`MsgBox` を卒業し、コマンドラインを支配せよ。そこから先が、あなたの書くコードが「ただのスクリプト」から「業務基盤」へと進化する境界線だ。
さあ、エディタを開き、あなたのツールをより「静かで力強い」ものへと書き換えてみてほしい。
