AutoCAD VBAの流儀:MsgBoxを捨て、コマンドラインと対話せよ
AutoCADでの自動化、順調ですか?
マクロの記録から一歩踏み出し、自作ツールを作り始めたあなた。おそらく最初にぶつかる壁が「ユーザーへのメッセージ表示」でしょう。
多くの初心者がまず使うのが`MsgBox`です。しかし、声を大にして言います。「AutoCADの操作中に、画面中央で作業を止めるな」。
MsgBoxはユーザーのクリックを待機させ、作業のリズムを断ち切ります。プロの道具は、もっと静かで、それでいて確実なフィードバックを返さなければなりません。今日は、AutoCADという巨大なシステムと「会話」するための最もエレガントな手法、`Utility.Prompt`を伝授します。
—
なぜMsgBoxがいけないのか?
AutoCADの哲学は「コマンドライン主導」です。線を引き、円を描き、寸法を入れる。その一連の流れは、すべてコマンドラインに表示されるガイダンスに従っていますよね。
`MsgBox`を使うと、ユーザーは「OK」を押すまで他の操作ができなくなります。これでは、AutoCADの標準的な操作感(=シームレスな連続作業)が台無しです。一方、`Utility.Prompt`は、作業を中断させずに、必要な情報をコマンドラインの「履歴」として流し込みます。
—
実践:Utility.Promptによるスマートな対話
まずは、基本的なコードを見てみましょう。この書き方をマスターするだけで、あなたのツールは一気に「業務アプリ」の顔つきになります。
Sub DrawSmartCircle()
Dim ptCenter As Variant
Dim dblRadius As Double
‘ 1. コマンドラインでユーザーに指示を出す
‘ ユーザーを止めず、かつ明確に何をすべきか提示する
ThisDrawing.Utility.Prompt vbCrLf & “— 円作成プログラムを開始します —” & vbCrLf
‘ 2. 入力を求める(GetPointなどはUtilityオブジェクトの真骨頂)
On Error Resume Next ‘ キャンセル時のエラー回避
ptCenter = ThisDrawing.Utility.GetPoint(, “中心点を指定してください: “)
If Err.Number <> 0 Then
ThisDrawing.Utility.Prompt vbCrLf & “操作がキャンセルされました。”
Exit Sub
End If
‘ 3. 処理中であることをさりげなく伝える
ThisDrawing.Utility.Prompt “中心点を確認。半径を入力してください…”
dblRadius = ThisDrawing.Utility.GetReal(“半径: “)
‘ 4. 完了報告
ThisDrawing.Utility.Prompt vbCrLf & “成功:円を作成しました。” & vbCrLf
‘ 実際の描画処理(省略)
End Sub
コードのここがポイント!
- `vbCrLf` の活用: これを先頭に付けることで、コマンドライン上で1行改行されます。前のメッセージと混ざらないよう、「挨拶」として使いましょう。
- 非同期的なフィードバック: `GetPoint` や `GetReal` は、AutoCADの標準コマンドと全く同じ挙動をします。ユーザーは違和感なく操作できます。
- エラーハンドリング: `Utility`系のメソッドは、ユーザーがESCキーを押すとエラーを返します。`On Error Resume Next` で適切に処理し、`Prompt` で「キャンセルされました」と一言添える。この優しさが、信頼されるツールの条件です。
—
陥りやすい罠:なぜ表示されないのか?
「コードを書いたのに、コマンドラインに何も出ない!」という相談をよく受けます。その原因のほとんどはこれです。
1. コマンドラインが最小化されている: F2キーを押してテキストウィンドウを開いてみてください。実は出ていた、ということがよくあります。
2. 上書きされている: プログラムが高速すぎて、最後に `Prompt` した内容だけが残っているケースです。`vbCrLf` を使って、見やすいレイアウトを意識してください。
3. Utilityへの参照漏れ: `ThisDrawing` を省略しすぎると、現在アクティブでない図面に対して操作を行おうとしてエラーになることがあります。常に `ThisDrawing.Utility` と明示的に書く癖をつけましょう。
—
さらなる高みへ:エンジニアからのアドバイス
AutoCAD VBAを掌握するコツは、「AutoCADの既存コマンドになりきる」ことです。
ユーザーが「次に何をすればいいか?」を考えなくても、コマンドラインを見れば自然と操作がわかる。そんなツールこそが、現場を救う最強の自動化ツールになります。
`MsgBox`は、本当に重大なエラーが発生したとき(警告)だけに使ってください。普段の挨拶や状況報告は、すべて `Utility.Prompt` に任せる。この使い分けができたとき、あなたはもう「初心者」ではありません。
さあ、あなたのコードを、AutoCADという壮大なオーケストラの一員に変えてみませんか?次回の記事では、`Utility.GetEntity` を使った、さらに高度な対話術を解説します。お楽しみに。
