AutoCAD VBAを掌握する極限の知見:`InitializeUserInput`のビットコードを制する者が、堅牢なUIを制す
開発プロジェクトの現場で、こんなコードを書いていないだろうか。
‘ 【アンチパターン】愚直なインプットボックスの罠
Dim val As Double
val = ThisDrawing.Utility.GetReal(“数値を入力してください: “)
‘ ここでユーザーが「0」や「負数」、あるいは何も入力せずにEnterを押したらどうなる?
業務自動化ツールを実務に投入した途端、ユーザーは設計者の想像を遥かに超えた「斜め上の入力」をしてくれる。0を入力して除算エラーを引き起こす、負の長さを入力してジオメトリ生成を破綻させる、あるいは無言でEnterキーを叩いてプログラムをクラッシュさせる。
プログラミング初心者であれば「エラー処理(`On Error Resume Next`)を挟めばいい」と言うかもしれない。だが、チーフアーキテクトである我々が求めるのは、後追いのアプローチではない。AutoCADのAPIレベルで不正入力を物理的にブロックし、VBA側に制御を渡さない「攻めのバリデーション設計」だ。
今回は、`AcadDocument.Utility.InitializeUserInput` のビットコード(1, 2, 4)を極限まで使いこなし、実務に耐えうる鉄壁の入力ルーティングを構築する手法を伝授する。
—
1. なぜ `GetReal` 単体のバリデーションでは実務で破綻するのか?
VBAの `GetReal` や `GetDistance` メソッドは、画面上のユーザーインタラクションを伴う強力な機能だが、デフォルトの状態では「何でも通すザル」である。
後から `If val <= 0 Then` で弾くロジックを書くのは、以下の理由から非効率であり、バグの温床となる。
1. 無限ループの自前実装コスト: 不正値のたびにメッセージボックスを出し、再入力を促すループを書くのはコードが冗長化する。
2. CAD本来の操作感の喪失: AutoCADのネイティブコマンド(`CIRCLE` や `MOVE` など)のように、コマンドラインでスマートに弾かれる挙動にならない。
3. 予期せぬ型ミスマッチ・キャンセル処理の漏れ: ユーザーが右クリックやESCでキャンセルした際の例外処理が複雑化する。
これらを一撃で解決するのが、入力メソッドを呼び出す直前に実行する `InitializeUserInput` である。
—
2. ビットコードの真髄:`InitializeUserInput` とは何か
`InitializeUserInput` は、次に実行される `Get` 系メソッド(`GetReal`, `GetInteger`, `GetKeyword` など)の入力条件を制限・拡張するためのメソッドだ。
その心臓部が 「ビットコード(Bitcode)」 である。複数の制約を足し算(または論理和)の要領で組み合わせて指定する。
実務で必須となる主要ビットコード一覧
| ビット値 | 定数的な意味 | 実務での活用シーン |
| :— | :— | :— |
| `1` | ゼロ入力を禁止 (No Zero) | 面積、長さ、係数など「0」が物理的にあり得ないパラメータ |
| `2` | 負数を禁止 (No Negative) | 距離、半径、数量など「マイナス」が存在しない物理・幾何データ |
| `4` | 空入力を禁止 (No Null) | Enterのみ(前回値の流用やスキップ)を許容したくない必須項目 |
これらを組み合わせることで、例えば 「0も負数も空入力も一切許さない(ビットコード: 1 + 2 + 4 = 7)」 という厳格なバリデーションゾーンを、AutoCADのカーネルに直接構築できるのだ。
—
3. 【プロダクションコード】ゼロ・負数・空入力を完全に封殺する堅牢な入力関数
実際の業務ツールでそのまま流用できる、高度な入力ラッパー関数の実装例を提示する。エラーハンドリングとビットコードの制御を完璧に統合したプロフェッショナルコードだ。
Option Explicit
Public Sub ExecuteRobustParameterInput()
Dim dblRadius As Double
‘ 堅牢な入力関数を呼び出し、値を取得する
dblRadius = GetValidatedPositiveReal( _
PromptString:=”円の半径を入力してください (0不可/負数不可): “, _
AllowZero:=False, _
AllowNegative:=False, _
AllowNull:=False _
)
‘ 取得した値を使った後続処理(安全に担保されている)
MsgBox “有効な半径が入力されました: ” & dblRadius, vbInformation, “処理成功”
‘ ここにジオメトリ生成処理などを記述
‘ Call ThisDrawing.ModelSpace.AddCircle(Pnt, dblRadius)
End Sub
‘ ==============================================================================
‘ 担当者必携:APIレベルで不正入力を弾く汎用バリデーション関数
‘ ==============================================================================
Private Function GetValidatedPositiveReal( _
ByVal PromptString As String, _
ByVal AllowZero As Boolean, _
ByVal AllowNegative As Boolean, _
ByVal AllowNull As Boolean) As Double
Dim bitCode As Integer
bitCode = 0
‘ — ビットコードの構築 —
‘ ビット 1: ゼロ入力を禁止
If Not AllowZero Then bitCode = bitCode + 1
‘ ビット 2: 負数を禁止(※通常、負数不可ならゼロも不可にすることが多いが独立制御も可能)
If Not AllowNegative Then bitCode = bitCode + 2
‘ ビット 4: 空入力を禁止(Enterのみを弾く)
If Not AllowNull Then bitCode = bitCode + 4
‘ AutoCADユーティリティの参照キャッシュ
Dim util As AcadUtility
Set util = ThisDrawing.Utility
On Error GoTo ErrorHandler
Do
‘ 1. 【最重要】入力制限の初期化をGetメソッドの直前に実行
util.InitializeUserInput bitCode, “”
‘ 2. 数値取得の実行(条件に違反した場合、AutoCAD側が自動で再入力を促すかエラーを返す)
GetValidatedPositiveReal = util.GetReal(PromptString)
‘ 正常に取得できたらループ抜脱
Exit Do
ErrorHandler:
‘ ユーザーがESCキー等でキャンセルした場合(Err.Number = -2147352567 等)
If Err.Number <> 0 Then
‘ キャンセル時は静かに終了、またはカスタムメッセージ
If MsgBox(“入力がキャンセルされました。処理を中断しますか?”, vbYesNo + vbQuestion, “確認”) = vbYes Then
Err.Clear
End
Else
Err.Clear
‘ ループを継続して再入力へ
End If
End If
Loop
Exit Function
End Function
—
4. チーフアーキテクトが教える実装上の注意点と設計哲学
上記のコードをプロジェクトに組み込むにあたり、プロとして押さえておくべき実務上の知見を共有する。
ライフサイクルとスコープの罠
`ThisDrawing.Utility` への参照は、毎回呼び出すよりもローカル変数にキャッシュ(`Set util = ThisDrawing.Utility`)したほうが、オブジェクトモデルのオーバーヘッドをわずかだが軽減できる。大規模なループ処理や一括処理の中では、こうした微差がパフォーマンスの差となって現れる。
データベース連携・ファイル出力前夜の「最後の砦」
Excelや外部データベース(SQL Server / SQLite等)へAutoCADからデータを書き出す際、データベース側のカラム制約(`NOT NULL` や `CHECK制約`)に引っかかってトランザクション全体がロールバックする事故が後を絶たない。
「DB側でエラーを出させないために、CAD側のUI(API)で入口を完全に塞ぐ」。これがデータインテグリティ(データの整合性)を保つための鉄則である。この `InitializeUserInput` によるバリデーションは、まさにその最前線なのだ。
—
総括
たかが数値入力、されど数値入力。
「動けばいい」というアマチュアのコードから、「破綻しないことが証明されている」プロフェッショナルのコードへ脱却するためには、AutoCADが提供するネイティブAPIの仕様を骨の髄まで理解し、利用することだ。
ビットコード(1, 2, 4)を自在に操り、無駄なエラーハンドリングのスパゲッティコードからプロジェクトを解放してほしい。あなたの書くツールが、現場のエンジニアたちから絶大な信頼を得るための武器となることを確信している。
