現場で差がつくAutoCAD VBA:`GetKword`で「鉄壁のユーザー入力」を構築する極意
こんにちは。AutoCADの自動化という荒野を切り拓く皆さんに、今日は「実務で泣きを見ないための入力制御」という、非常に重要なテーマをお届けします。
マクロの記録から一歩踏み出し、自力でスクリプトを書くようになると、誰もが一度はこう思うはずです。
「ユーザーが勝手に変な文字を入力してエラーで落ちるのを、どうにか防げないか?」と。
今日は、AutoCAD VBAにおける「究極の守備兵」である`InitializeUserInput`と`GetKeyword`のコンビネーションを伝授します。これさえマスターすれば、あなたのコードは格段にプロフェッショナルな挙動を見せるようになります。
—
1. なぜ「GetKword」が必要なのか?
通常、`ThisDrawing.Utility.GetString`などで入力を求めると、ユーザーはキーボードで何を打ち込んでも受け入れてしまいます。しかし、実務では「Yes/No」「レイヤーA/レイヤーB」といった、開発者が許可した選択肢以外は受け付けないという強固な制限が必要です。
これを怠ると、後続の処理で予期せぬ文字列が渡され、コードがクラッシュする原因になります。
ここで登場するのが、AutoCADネイティブの入力制限機能です。
—
2. 鉄壁の入力制御を実装する
まずは、実務でそのまま使えるテンプレートコードを見てみましょう。
Public Sub GetUserDecision()
Dim util As AcadUtility
Set util = ThisDrawing.Utility
Dim keyList As String
Dim userReturn As String
‘ 1. 受付可能なキーワードを定義 (スペース区切りで指定)
‘ ユーザーは大文字部分の頭文字を入力するだけでOK
keyList = “Yes No Cancel”
‘ 2. InitializeUserInputで入力を制限
‘ 第1引数: 1 = 空文字入力を禁止(Enterのみを許可しない)
‘ 第2引数: 許可するキーワードのリスト
util.InitializeUserInput 1, keyList
‘ 3. キーワード入力を取得
On Error Resume Next ‘ キャンセル(Esc)によるエラーを回避するため
userReturn = util.GetKeyword(vbCrLf & “実行しますか? [Yes/No/Cancel]
‘ 4. キャンセル時の処理
If Err.Number <> 0 Then
MsgBox “処理が中断されました。”
Exit Sub
End If
On Error GoTo 0
‘ 5. デフォルト値の処理 (何も入力せずEnterを押した場合は最初の選択肢が返る)
If userReturn = “” Then userReturn = “Yes”
‘ 結果に応じた処理の分岐
Select Case userReturn
Case “Yes”: MsgBox “処理を実行します。”
Case “No”: MsgBox “処理を中止しました。”
Case “Cancel”: MsgBox “キャンセルされました。”
End Select
End Sub
—
3. コードの心臓部:3つの重要ポイント
① `InitializeUserInput`の「第1引数」の魔力
このメソッドの第一引数は「ビットマスク」と呼ばれる設定値です。
- `1`: 空入力を禁止する(Enterのみでの入力を防ぐ)
- `2`: 負の数値を許可しない
- `4`: ゼロを許可しない
これらを組み合わせることで、「何を入力して良いか」をAutoCADのエンジンレベルで強制できます。
② 大文字の意味
`keyList`で指定する際、`”Yes No Cancel”`と記述すると、ユーザーは `Y` か `N` か `C` を入力するだけで認識されます。AutoCADの標準コマンド(LINEコマンドなど)と同じ挙動を再現できるため、ユーザーにとっても非常に親切なUIとなります。
③ 「空入力」という名のデフォルト値
`GetKeyword`は、何も入力せずにEnterが押されると「空文字」を返します。実務では、「何も入力しなかったらYesとみなす」といったデフォルト値の処理が必須です。上記のコードのように、`If userReturn = “” Then` で判定するのが定石です。
—
4. 陥りやすい罠:Escキーの恐怖
初学者が必ず突き当たるのが、「ユーザーがEscキーを押した瞬間にコードがエラー落ちする」という現象です。
`GetKeyword`は、キャンセルされるとランタイムエラーを発生させて強制終了しようとします。これを防ぐために、必ず `On Error Resume Next` でエラーをトラップし、`Err.Number` を確認する書き方を徹底してください。これが「止まらないコード」を書くための最低限の作法です。
—
最後に:エンジニアとしての矜持
AutoCAD VBAは古き良き技術ですが、その設計思想は非常に洗練されています。`GetKeyword`を使うということは、「ユーザーの入力ミスをユーザーのせいにせず、システム側で完全に制御する」という意思表示です。
この「制御の美学」を身につければ、あなたはもう初学者ではありません。ぜひ、明日からの開発にこの「鉄壁の入力ルーチン」を組み込んでみてください。
ここをクリアしたあなたは、すでに次のステージへ進んでいます。また次回の講義でお会いしましょう。
