【入門編】【実務中級】AcadDocument.Utility.InitializeUserInputのビットコード(1, 2, 4)を駆使し、ゼロ入力や空入力を防ぐバリデーション術 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進み、「自分で意のままにCADを動かしたい」と願うあなたにとって、VBAのオブジェクトモデルを理解することは最初の大きな関門であり、最大の楽しみでもあります。

今回は、実務の現場で必ず直面する「ユーザーからの入力値のバリデーション(妥当性検証)」について、プロのアーキテクトが実践している極意を伝授しましょう。

ここをクリアすれば、あなたの書いたマクロは「ちょっと変な値を入れられるとすぐエラーで止まるお騒がせツール」から、「プロが作った堅牢な業務システム」へと生まれ変わります。一緒にマスターしていきましょう!

1. なぜ「普通のInputBox」では実務で使い物にならないのか?

AutoCAD VBAでユーザーから数値や文字列を貰うとき、一番最初に覚えるのは `InputBox` 関数(あるいは `ThisDrawing.Utility.GetString` など)かもしれません。

しかし、実務でこれをそのまま使うと、次のような悲劇が起きます。

  • ユーザーがうっかり「0」と入力してしまい、ゼロ除算エラーでプログラムがクラッシュする。
  • 「マイナス(負の数)」を入れてはいけない設計図なのに、そのまま処理されておかしな図面が描画される。
  • 何も入力せずに「Enter」キーだけで進めてしまい、予期せぬNull値でバグる。

これを防ぐために、コードの何行にもわたって `If x <= 0 Then` なんて泥臭い判定を書くのは、もう止めにしましょう。 AutoCADのAPIには、「入力の受付段階で、不適切なデータを物理的にシャットアウトする」という超強力な機能が備わっています。それが今回紹介する `InitializeUserInput` です。

2. InitializeUserInput の正体とビットコードの魔法

`InitializeUserInput` は、その名の通り「次に実行されるユーザー入力メソッド(`GetReal`, `GetInteger` など)のルールを初期化・定義する」ためのメソッドです。

書き方の基本形はこうなります。

ThisDrawing.Utility.InitializeUserInput ビットコード, “キーワード”

この「ビットコード」という数字が、今回の主役です。複数の制限を「足し算(あるいはビット演算)」で組み合わせて指定できるのが特徴です。

実務で最もよく使う基本の3つを見てみましょう。

| ビットコード | 意味・制限内容 | 現場での実用例 |
| :— | :— | :— |
| `1` | ゼロ(0)の入力を禁止する | 「倍率」や「寸法」など、0では意味をなさない数値のとき |
| `2` | 負の数(マイナス)の入力を禁止する | 「長さ」「半径」「個数」など、物理的にマイナスがあり得ないとき |
| `4` | 空入力(何も入れずにEnter)を禁止する | スキップ不可の必須入力項目であるとき |

💡 先輩エンジニアからの知恵:制限を組み合わせるには?

「0もマイナスもダメ、おまけに空入力も許さない!」という、実務で一番多い厳格な要件はどう書くと思いますか?
答えは簡単、足し算するだけです。

‘ 1 (ゼロ不可) + 2 (負数不可) + 4 (空入力不可) = 7
Dim bitCode As Integer
bitCode = 1 + 2 + 4 ‘ つまり 7

これだけで、AutoCADはユーザーが不正な値を入れようとした瞬間に「無効な入力です。再度入力してください。」と自動で弾き返し、正しい値が入るまで先に進まなくしてくれます。エラー処理のコードを何行も書く必要がなくなるわけです。

3. 実践!堅牢な数値入力プロシージャのコード例

それでは、開発の現場でそのままコピペして使える実践的なコードを見てみましょう。
今回は、円の半径をユーザーに入力してもらうシーンを想定します。「半径は0より大きく、空エンターも許さない」という要件を `InitializeUserInput` で実装しています。

Public Sub DrawValidatedCircle()
On Error GoTo ErrorHandler

Dim util As AcadUtility
Set util = ThisDrawing.Utility

‘ —————————————————-
‘ 1. 入力制限の定義(ビットコードの設計)
‘ —————————————————-
‘ 1: ゼロを許可しない
‘ 2: 負の数を許可しない
‘ 4: 空入力(Enterのみ)を許可しない
‘ 合計: 1 + 2 + 4 = 7
Dim allowedRules As Integer
allowedRules = 7

‘ ルールをAutoCADにセット
util.InitializeUserInput allowedRules, “”

‘ —————————————————-
‘ 2. ユーザーからの数値取得(GetReal)
‘ —————————————————-
‘ ※ここでInitializeUserInputの効力が発動します
Dim dblRadius As Double
dblRadius = util.GetReal(vbCrLf & “作成する円の半径を入力してください(0より大きい値): “)

‘ —————————————————-
‘ 3. 実際の図面操作(安全に取得できたデータを使用)
‘ —————————————————-
Dim ptCenter As Variant
ptCenter = util.GetPoint(, vbCrLf & “円の中心点を指定してください: “)

‘ 円を描画
Dim colObjects As AcadModelSpace
Set colObjects = ThisDrawing.ModelSpace

Dim objCircle As AcadCircle
Set objCircle = colObjects.AddCircle(ptCenter, dblRadius)

MsgBox “半径 ” & dblRadius & ” の円を正常に作成しました!”, vbInformation
Exit Sub

ErrorHandler:
‘ ユーザーがESCキーでキャンセルした場合などのエラー処理
If Err.Number <> -2147352567 Then ‘ キャンセル以外の予期せぬエラー
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Else
MsgBox “処理がキャンセルされました。”, vbInformation
End If
End Sub

このコードの美しいポイント

1. API側で弾くからスマート
ユーザーが `-5` や `0` を入力しても、VBAのコードが実行時エラーを起こす前に、AutoCADのコマンドラインレベルで再入力を促してくれます。
2. エラーハンドリングとの共存
ユーザーが途中で「やっぱりやめた」と `ESC` キーを押した場合は、AutoCAD特有のエラー番号を考慮して穏やかに終了するようにしています。

4. ありがちな罠(初心者クスッとポイント)と注意点

ここで、AutoCAD VBAを学び始めた人が必ずハマる「罠」を一つシェアしておきます。

> ⚠️ 注意:InitializeUserInput は「次の1回」にしか効かない
> `InitializeUserInput` で設定したルールは、その直後にある最初の入力メソッド(`GetReal` や `GetPoint` など)にしか適用されません。
> 連続して入力を受け付ける場合は、入力を行う直前の行で毎回 `InitializeUserInput` を呼び出す必要があります。

「さっき設定したから大丈夫だろう」と油断して2つ目の入力を行わせると、制限がリセットされてスルーされてしまうので注意してくださいね。

まとめ:ここをクリアすれば、もう初心者卒業です!

今回は `AcadDocument.Utility.InitializeUserInput` を使った、プロ顔負けのバリデーション術を解説しました。

  • ビットコード(1, 2, 4)を足し算して、ゼロ・マイナス・空入力をスマートに防ぐ。
  • 不正なデータによるプログラムのクラッシュを未然に防ぎ、実用に耐える堅牢なツールを作る。

ここをクリアできれば、あなたもう「マクロの記録」を卒業した立派なAutoCAD VBAエンジニアです。ぜひ実際の業務ツールに取り入れて、その快適さを実感してみてください。

それでは、また次回の知見でお会いしましょう。あなたの自動化ライフが素晴らしいものになりますように!

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