【入門編】【初心者向け】AcadDocument.Utility.GetIntegerで「個数」や「回数」を安全に取得する:数値バリデーションの基本 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!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エンジニアの仲間入りです。ぜひ、日々の業務の自動化ツールにこのテクニックを組み込んでみてくださいね。それでは、次回の極限の知見でお会いしましょう!

タイトルとURLをコピーしました