【入門編】【実務中級】AcadDocument.Utility.InitializeUserInputによる入力制限:キーワードと数値入力をスマートに制御する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:`InitializeUserInput`で「入力の暴走」を完璧に制御する

AutoCADマクロの開発において、ユーザーからの入力を受け取る `GetInteger` や `GetDistance` メソッドは避けて通れません。しかし、ただメソッドを呼ぶだけでは、ユーザーが想定外の値を入力した瞬間にプログラムがエラーで停止してしまいます。

「負の値を入力されたくない」「特定のキーワードで操作を切り替えたい」。
これらをスマートに解決するのが、今回解説する `InitializeUserInput` です。

このメソッドを使いこなせば、あなたのマクロは「ただ動くもの」から「実務で信頼されるツール」へと進化します。さあ、極限の入力制御の世界へ踏み出しましょう。

1. なぜ `InitializeUserInput` が必要なのか?

通常、`GetInteger` を実行すると、ユーザーはどんな整数でも入力できてしまいます。例えば「オフセット距離」を求めているのにマイナス値が入力されたら、図面が予期せぬ挙動を起こすかもしれません。

`InitializeUserInput` は、入力メソッド(Getxxx)が実行される直前に、「次に何を許可し、何を禁止するか」をAutoCADに教え込むための「検問所」のようなものです。

2. ビットコード:入力制御の「パスポート」

`InitializeUserInput` の最大の肝は「ビットコード」という数値です。複数の制限を組み合わせたい場合、これらを足し算して指定します。

| ビットコード | 意味 |
| :— | :— |
| 1 | Null入力(Enterのみ)を禁止する |
| 2 | 負の値を禁止する |
| 4 | ゼロ値を禁止する |
| 8 | 図面範囲外の入力を禁止する |
| 128 | キーワードの入力を許可する |

例えば、「負の値とゼロを禁止し、かつキーワードも使いたい」場合は `2 + 4 + 128 = 134` を指定します。

3. 実践:キーワードと数値制限の実装

以下のコードは、距離を入力する際に「Auto(自動)」というキーワードを受け付け、かつ負の値を拒否する実用的なテンプレートです。

Public Sub GetDistanceWithControl()
Dim returnDist As Double
Dim returnKey As String

‘ 1. 検問所の設置(ビットコード:2=負の禁止 + 128=キーワード許可)
‘ ユーザーが「Auto」と入力できるように登録します
ThisDrawing.Utility.InitializeUserInput 130, “Auto”

On Error Resume Next ‘ ユーザーのキャンセル(Escキー)対策

‘ 2. 入力メソッドの実行
returnDist = ThisDrawing.Utility.GetDistance(, “距離を入力 (または [Auto]): “)

‘ 3. エラーチェックと分岐処理
If Err.Number <> 0 Then
‘ GetInputメソッドでユーザーが入力した文字列を取得
returnKey = ThisDrawing.Utility.GetInput

If returnKey = “Auto” Then
MsgBox “自動モードが選択されました。”
Else
MsgBox “キャンセルまたは不正な入力です。”
End If
Err.Clear
Else
MsgBox “入力された距離: ” & returnDist
End If

On Error GoTo 0
End Sub

4. 開発者が陥りやすい「3つの罠」

この機能を実装する際、多くの初心者が以下のポイントで躓きます。

① `InitializeUserInput` は「一度きりの使い捨て」

このメソッドは、次に実行される入力メソッド1回分にしか効力を持たないという性質があります。連続して入力を求める場合は、その都度 `InitializeUserInput` を呼ぶ必要があります。

② キーワードの「頭文字」と「フルスペル」

`”Auto”` と指定した場合、ユーザーは `A` と打つだけで `Auto` と判定されます。これはAutoCADのコマンドラインの標準的な挙動ですが、もし `A` という別の選択肢も作りたい場合は、`”Auto A”` のように登録する必要があります。

③ エラーハンドリングは必須

`GetDistance` 等は、ユーザーが `Esc` を押すとVBAエラーを発生させます。`On Error Resume Next` を使い、その後の `Err.Number` を確認するスタイルは、AutoCAD開発における「鉄の掟」です。

結論:ユーザーの「自由」を奪い、マクロの「安全」を得る

プログラミングの初心者ほど、「すべてをユーザーに任せる」コードを書きがちです。しかし、真の業務自動化エンジニアは「ユーザーが間違えることを前提とした設計」を好みます。

`InitializeUserInput` を使って入力に制限をかけることは、ユーザーを不自由にすることではありません。むしろ、「予期せぬエラーでマクロが止まる」という最大のストレスからユーザーを解放する、優しさあふれる実装なのです。

ここをクリアしたあなたは、もう「マクロの記録」の枠を超えました。次は、この入力制御を組み合わせた「コマンド作成」に挑戦してみてください。AutoCAD VBAの世界が、ぐっと広がりますよ!

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