AutoCAD VBAの真髄:`InitializeUserInput`で「熟練者のUI」を構築する
AutoCADマクロを書き始めたばかりの頃、誰もが一度はぶつかる壁があります。それは、「ユーザーに値を入力させる際、どうやって例外をスマートに処理するか?」という問題です。
`InputBox`で済ませていませんか? それは、CADオペレーターの操作性を大きく損なう「非エンジニア的なアプローチ」です。AutoCADには、コマンドラインでネイティブに動作する強力な対話機能が備わっています。
今回は、AutoCAD VBAの真骨頂である`InitializeUserInput`と`GetInput`系メソッドを組み合わせ、「空エンターでデフォルト値を選択させる」といった、プロフェッショナルなUI構築術を伝授します。
—
1. なぜ「ビットコード」が必要なのか?
AutoCADの入力メソッド(`GetReal`, `GetPoint`など)は、デフォルトでは「ユーザーが何も入力せずにEnter」を押すとエラー(キャンセル)を返します。しかし、実務では「Enterを押したらデフォルト値(例: 100.0)を採用する」といった挙動が求められますよね。
ここで登場するのがビットコード(Bit Code)です。これは、入力メソッドに「どんな操作を許可するか」をフラグとして伝える魔法の数字です。
代表的なビットコードの構成
- 1 : 空の入力を禁止しない(Enterのみを許可)
- 2 : 負の値を禁止する
- 4 : ゼロ値を禁止する
- 8 : 図面範囲外の入力を禁止する
これらを合計(加算)することで、複数のルールを同時に設定できます。
—
2. 実践コード:洗練された入力制御
それでは、実際に「値を入力させるが、Enterなら100を返す」というコードを見てみましょう。
Public Sub GetValueWithDefault()
Dim util As AcadUtility
Set util = ThisDrawing.Utility
Dim userInput As Double
Dim defaultValue As Double
defaultValue = 100.0
‘ — ここが極意 —
‘ ビットコード 1: 空入力を許可する
‘ ビットコード 2: 負の値を禁止する
util.InitializeUserInput 1 + 2, “”
On Error Resume Next ‘ キャンセル時のエラー回避用
‘ ユーザーに入力を求める(プロンプトを表示)
userInput = util.GetReal(“数値を入力してください <" & defaultValue & ">: “)
‘ エラーが発生した場合(キャンセル、または空エンター)
If Err.Number <> 0 Then
‘ 空エンターならデフォルト値を採用
‘ GetInputで直前の入力内容を拾う
If util.GetInput = “” Then
userInput = defaultValue
Else
MsgBox “入力がキャンセルされました。”
Exit Sub
End If
End If
‘ 結果を出力
MsgBox “採用された値は: ” & userInput
End Sub
—
3. コードの解説:ここが「プロの境界線」
1. `InitializeUserInput 1 + 2` の意味
このメソッドは、「次に実行する `Get…` メソッドだけに」ルールを適用します。`1 + 2` は、「空エンターOK(1)」かつ「負の値はダメ(2)」という制約です。この設定がないと、ユーザーがEnterを押した瞬間にVBAは「エラー」と見なし、処理が止まってしまいます。
2. `On Error Resume Next` の正しい使い方
実務では、ユーザーが `Esc` キーを押して入力を中断することがあります。その際、エラーを放置するとマクロが強制終了します。`Err.Number` をチェックし、「本当にキャンセルされたのか? それとも単なるデフォルト選択の空エンターか?」を判別するのが、堅牢なプログラムの条件です。
3. `GetInput` の魔法
`GetInput` メソッドは、直前の入力操作でユーザーが入力した文字列を返します。空エンターの場合、ここには空文字 `””` が入ります。この性質を利用して、デフォルト値へのフォールバックを実現しています。
—
4. 陥りやすい罠と対策
初心者がやりがちなミスは、「ビットコードの適用範囲を勘違いすること」です。
- 注意点: `InitializeUserInput` は、直後の `Get…` メソッド1回のみに有効です。複数回入力させる場合は、都度設定し直す必要があります。
- コツ: コマンドのプロンプト(`GetReal`の引数)に、必ず `<デフォルト値>` を含めてください。これがないと、ユーザーは「Enterを押していいのか、数値を入れなければならないのか」迷ってしまいます。
—
最後に:エンジニアとしての視点
AutoCAD VBAは、単に「作業を自動化するツール」ではありません。「ユーザー(自分や同僚)がCAD上でストレスなく操作を完了させるためのインターフェース」を設計する仕事です。
今回紹介したビットコードの制御をマスターすれば、マクロの記録から脱却し、AutoCADの標準コマンドと見紛うような自然なUIを構築できるようになります。
まずはこのコードをコピペして、`1 + 2` の数値を `1 + 2 + 4` に変えて「0を入力禁止にする」などの実験をしてみてください。そこから、あなたのエンジニアとしての視界が一気に開けるはずです。
応援していますよ。困ったことがあれば、またいつでも聞きに来てくださいね。
