こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進み、自分の手でCADを自在に操るプログラムを書こうとしているあなたへ、最高にエキサイティングな扉を開く時が来ました。
今回は、AutoCAD VBAにおける「ユーザーインタラクション(対話)」の最も基本にして最重要なテーマを取り上げます。
図面を描いているとき、「いくつ複写しますか?」「何ミリオフセットしますか?」と、プログラム側からユーザーに数値を尋ねたい場面は数え切れないほどありますよね。そのときに使うのが `AcadDocument.Utility.GetInteger` メソッドです。
しかし、ここには初心者だけでなく、中級者でも油断するとハマる「罠」があります。
――そう、ユーザーが「やっぱりやめた!」と [Esc]キーを押してキャンセルしたときの対策 です。
ここをクリアすれば、あなたの書くVBAコードの安全性とプロっぽさは一気に跳ね上がります。さあ、一緒に本質をマスターしていきましょう!
—
なぜ `InputBox` ではなく `Utility.GetInteger` なのか?
VBAの標準機能には `InputBox` という関数がありますが、AutoCADの自動化において、これを図形的操作のパラメータ入力に使うのは御法度(NG)です。
なぜなら、`InputBox` はAutoCADの画面からフォーカス(入力の焦点)を奪ってしまうからです。ユーザーは「いまどの画面を見ているんだっけ?」と混乱してしまいます。
その点、`AcadDocument.Utility.GetInteger` は、AutoCADのコマンドラインと連動してスマートに整数値を受け取ることができます。CADオペレーターにとって非常に馴染みのある操作感を提供できるのです。
基本的な書き方
まずは、何も考えずに動かした場合のコードを見てみましょう。
Sub GetCountBasic()
Dim intCount As Integer
‘ ユーザーに整数入力を促す
intCount = ThisDrawing.Utility.GetInteger(“個数を入力してください: “)
MsgBox “入力された個数は ” & intCount & ” 個です。”, vbInformation
End Sub
これだけ見ると、「なんだ、簡単じゃないか!」と思いますよね。
しかし、このコードのままでは現場で使い物になりません。なぜなら、ユーザーが入力欄で `[Esc]` キーを押した瞬間、VBAは無慈悲な実行時エラー(エラー番号:-2147352567 / 自動化エラーなど)を引き起こし、プログラムが強制終了してしまうからです。
—
現場の鉄則:[Esc]キー(キャンセル)を安全にトラップする
プロのエンジニアが書くコードと、そうでないコードの決定的な違いは、「異常系(ユーザーの気まぐれやキャンセル)」に対してどれだけ優しく作られているかです。
ユーザーが `[Esc]` を押したとき、AutoCAD VBAはエラーを発生させます。これを「エラーが起きたら別の場所に逃げる」という仕組み(エラーハンドリング)を使って、優しく包み込んであげましょう。
以下が、現場でそのまま使える安全な数値取得の模範コードです。
Sub GetCountSafely()
Dim intCount As Integer
‘ — エラーハンドリングの準備 —
On Error GoTo ErrorHandler
‘ ユーザーに入力を求める
intCount = ThisDrawing.Utility.GetInteger(“複写する個数を入力してください: “)
‘ 【正常系】入力が成功した場合の処理
MsgBox “処理を続行します。個数: ” & intCount, vbInformation
‘ 正常終了時はここでプロシージャを抜ける(エラーHandlerに落ちないようにする)
Exit Sub
ErrorHandler:
‘ 【異常系】[Esc]キーなどでキャンセルされた場合
‘ Err.Number = -2147352567 (または特定のキャンセルエラー) を捕捉
If Err.Number <> 0 Then
‘ ここではシンプルにメッセージを出して終了する
MsgBox “操作がキャンセルされました。”, vbExclamation, “中断”
End If
‘ エラーをクリアして安全に終了
Err.Clear
End Sub
コードの解説:ここがポイント!
1. `On Error GoTo ErrorHandler`
「もしこの後でエラー(キャンセルなど)が起きたら、慌てずに `ErrorHandler:` のラベルがついている場所に飛んでね」というお約束の呪文です。
2. `Exit Sub` の重要性
正常に処理が終わったあとも `ErrorHandler` を通過してしまうバグを防ぐため、エラーハンドラの手前に必ず `Exit Sub` を置くのが鉄則です。
3. `Err.Clear`
エラー情報を綺麗に掃除して、VBAのメモリにゴミを残さないようにします。
—
さらに一歩進む:値の「範囲バリデーション」
個数や回数を受け取る際、「0個」や「マイナス(-5回)」を入力されては困りますよね。実務では、キャンセル対策だけでなく、「意味のある数値かどうかのチェック(バリデーション)」もセットで行うのがプロの作法です。
`GetInteger` 自体に範囲を制限する高度な機能もありますが、まずはVBAの `If` 文を使ってシンプルに弾くのが初学者には最も分かりやすく、メンテナンスも容易です。
Sub GetCountWithValidation()
Dim intCount As Integer
On Error GoTo ErrorHandler
Do
‘ 入力を促す
intCount = ThisDrawing.Utility.GetInteger(vbCrLf & “複写する個数を入力してください (1~100): “)
‘ 範囲チェック
If intCount >= 1 And intCount <= 100 Then
Exit Do ' 正しい値ならループを抜け出す
Else
MsgBox "1から100までの整数を入力してください。", vbExclamation, "入力エラー"
End If
Loop
MsgBox "正常に受け付けました。個数: " & intCount, vbInformation
Exit Sub
ErrorHandler:
' キャンセル時の処理
If Err.Number <> 0 Then
MsgBox “操作がキャンセルされました。”, vbExclamation, “中断”
End If
Err.Clear
End Sub
`Do 〜 Loop` 構造を組み合わせることで、正しい値が入力されるか、ユーザーが根負けして `[Esc]` でキャンセルするまで、何度でも優しく再入力を促すことができます。これがユーザービリティの高いマクロの姿です。
—
まとめ:ここをクリアすればAutoCAD VBAの基本はバッチリ!
今回は `AcadDocument.Utility.GetInteger` を用いた安全な数値取得と、エラーハンドリングの基本を解説しました。
- `InputBox` は使わず、`Utility.GetInteger` でCADと対話する
- `On Error GoTo` を使って、[Esc]キーによるキャンセルを必ず捕捉する
- 業務で使うなら、値の範囲チェック(バリデーション)とループを組み合わせる
この3つを抑えておけば、あなたがこれから作るどんな自動化ツールも、予期せぬエラーでフリーズしたり、ユーザーをイライラさせたりすることがなくなります。
ここをクリアできれば、もうあなたは「初心者マーク」を卒業し、確かな技術を持つVBAエンジニアの仲間入りです。ぜひ、日々の業務の自動化ツールにこのテクニックを組み込んでみてくださいね。それでは、次回の極限の知見でお会いしましょう!
