こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して「動いた!」と感動したのも束の間、「実務で使えるような、ユーザーフレンドリーな対話型ツールを作りたい」と思ったとき、多くの人が最初にぶつかる壁が『コマンドラインからのオプション(キーワード)入力』です。
例えば、標準の「LENGTHEN(長さ変更)」コマンドなどを思い出してください。距離を数値で入力できるだけでなく、途中で「S」と打つと別のモードに切り替わったりしますよね。あのプロっぽくてスムーズな操作感を、あなたの作ったVBAツールでも再現したくありませんか?
今回は、`AcadDocument.Utility.GetDistance` メソッドを極め、数値入力だけでなく「設定(Settings)」などのキーワード入力を完璧に受け付ける実務直結の高度なテクニックを伝授します。
ここをクリアすれば、あなたのVBAスキルは「お遊びのマクロ」から「プロの業務システム」へと一気に昇格します。さあ、一緒に扉を開けましょう!
—
1. なぜ `GetDistance` なのか?そしてキーワードの壁
AutoCAD VBAでユーザーから数値や距離を受け取る際、`InputBox` を使っていませんか?
ちょっと待ってください。画面上の図面を見ながら、ピッと2点をクリックして距離を測ったり、CADの正確なスナップ機能(端点や交点など)を使ったりしたいのに、味気ないダイアログボックスが出てきたら、ユーザーはイライラしてしまいます。
そこで登場するのが、AutoCADの作図空間とダイレクトに対話できる `Utility.GetDistance` メソッドです。
基本的な `GetDistance` の使い方
Dim dist As Double
dist = ThisDrawing.Utility.GetDistance(, “2点目を指定 または 距離を入力: “)
これだけでも非常に強力なのですが、実務では「あ、やっぱり設定画面を開いて許容差を変えたいな」というシチュエーションが必ず発生します。ここで「一度プログラムを終了して、フォームを開き直して…」なんてやっていたら、実用ツールとしては失格です。
ここでキーワード入力(`InitializeUserInput`)の出番となります。
—
2. キーワード入力を実装する黄金の3ステップ
AutoCAD VBAでキーワードを受け付けるには、以下の3つのステップを踏む必要があります。これが今回の核心です。
1. キーワードの登録 (`InitializeUserInput`)
2. 値の取得 (`GetDistance`)
3. 戻りの判定 (`Err` オブジェクトのトラップ)
百聞は一見に如かず。まずは実務でそのまま使えるコード全体を見てみましょう。
実用サンプルコード
Public Sub GetDistanceWithKeyword_Sample()
Dim returnDist As Double
Dim promptStr As String
On Error GoTo ErrorHandler ‘ エラー(キーワード入力やキャンセル)をトラップする準備
‘ —————————————————————–
‘ Step 1: ユーザー入力を初期化し、キーワードを登録する
‘ —————————————————————–
‘ 第1引数 (BitFlags):
‘ 1 = 空Enterを許可しない(必要に応じて変更)
‘ 32 = キーワードの大文字小文字を区別しない、など
‘ 今回はシンプルに「0(特に制限なし)」としつつ、キーワードを有効化
‘ 第2引数 (Keywords):
‘ 半角スペース区切りで、受け付けたいキーワードを登録する
‘ 大文字で登録するのがAutoCADの作図作法です。
ThisDrawing.Utility.InitializeUserInput 0, “Settings Exit”
‘ —————————————————————–
‘ Step 2: プロンプトを表示して距離を取得する
‘ —————————————————————–
promptStr = vbCrLf & “長さを指定 [設定(S)/終了(E)] <10.0>: ”
‘ ※ここでユーザーが「S」や「E」とキーボードから入力すると、
// 通常の距離(Double型)ではなく、エラーとして返ってくる仕様になっています。
returnDist = ThisDrawing.Utility.GetDistance(, promptStr)
‘ —————————————————————–
‘ 通常の数値入力が成功した場合の処理
‘ —————————————————————–
MsgBox “指定された距離: ” & returnDist, vbInformation, “成功”
Exit Sub
ErrorHandler:
‘ —————————————————————–
‘ Step 3: キーワード入力やキャンセルをキャッチして分岐する
‘ —————————————————————–
‘ AutoCAD VBAでは、キーワードが入力されると実行時エラー(Err.Number)が発生します。
If Err.Number = -2145320939 Then ‘ AutoCAD固有のエラーコード:ユーザーがキーワードを入力した
Dim keywordResult As String
‘ 最後に取得されたキーワードを取り出す
keywordResult = ThisDrawing.Utility.GetInput()
Select Case UCase(keywordResult)
Case “SETTINGS”, “S”
‘ — ここで設定用UserFormを呼び出す —
MsgBox “設定画面(UserForm)を呼び出します!”, vbExclamation, “オプション選択”
‘ UserForm1.Show などと繋げます
‘ 設定変更後、もう一度処理をやり直したい場合はループに戻す等の工夫をします
Resume
Case “EXIT”, “E”
MsgBox “処理を終了します。”, vbInformation, “終了”
Exit Sub
End Select
ElseIf Err.Number = -2147352567 Then ‘ ユーザーが [Esc] キー等でキャンセルした場合
MsgBox “操作がキャンセルされました。”, vbInformation, “キャンセル”
Exit Sub
Else
‘ その他の予期せぬエラー
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End If
End Sub
—
3. コードの深い解説:エンジニアが知るべき「舞台裏」
初心者のうちは、「なぜキーワードを入れるとエラー(`Err.Number`)になるの?」と驚くはずです。ここがAutoCAD VBAの最もユニーク(かつ少しクセのある)仕様です。
「エラー」は異常事態ではなく「シグナル」
`GetDistance` は本来「数値を返す」ための関数です。そこにユーザーが文字(キーワード)を入力したため、AutoCADの内部エンジンは「おい、数値が期待されたのに文字が来たぞ!」と、VBA側にエラーを投げます。
プログラミングの定石としてはエラーは避けるべきものですが、このAutoCAD VBAのインタラクションにおいてだけは、「キーワードが選択されたというシグナル(合図)」として積極的に利用します。これが、AutoCAD APIの伝統的な作法なのです。
`GetInput()` という魔法のメソッド
エラーをキャッチしたら、`ThisDrawing.Utility.GetInput()` を呼び出します。これにより、「ユーザーが直前にどのキーワードを入力したか」という文字列を回収できます。
上記のコードでは、
- `”Settings Exit”` と登録し、
- ユーザーが `S` や `Settings` と入力したときは `Case “SETTINGS”, “S”` で拾う、
- というスマートな分岐を実現しています。
さらに、設定画面(UserForm)でパラメータを変更したあと、`Resume` ステートメントを使うことで、エラー処理から元の入力ループへ華麗に戻ることも可能です。
—
4. 陥りやすい罠と実務での注意点
ここで、現場でよくある失敗パターンをいくつか共有しておきます。これを知っておくだけで、無駄なデバッグ時間を何時間も節約できますよ。
- 罠1: キーワードの大文字・小文字問題
`InitializeUserInput` で登録するキーワードは `”Settings”` のように大文字始まり(あるいはすべて大文字)で登録するのが無難です。ユーザーが小文字の `settings` や `s` と入力しても、コード側で `UCase(keywordResult)` を使って大文字に統一して判定すれば、入力ミスによるバグを防げます。
- 罠2: エラー番号の環境依存
AutoCADのバージョン(2020から2024、あるいは最新版など)や言語環境によって、キャンセル時のエラー番号が微妙に異なる場合があります。実務で堅牢なシステムを作る際は、エラー番号だけでなく `Err.Description` に特定の文字列が含まれているかチェックするか、あるいは `On Error Resume Next` と組み合わせてスマートに判定するラッパー関数を作ると完璧です。
—
まとめ:ここをクリアすれば、あなたはもう中級者!
今回は、`AcadDocument.Utility.GetDistance` を使ったキーワード入力の併用術を解説しました。
- `InitializeUserInput` でキーワードを事前登録する。
- キーワード入力はエラーとして飛んでくるので、`Err.Number` でトラップする。
- `GetInput()` で文字列を回収し、条件分岐やUserFormの呼び出しにつなげる。
このパターンをマスターすれば、単なる「自動化スクリプト」の枠を超え、プロが作る市販のCADアドオンソフトと同等の優れたユーザーインターフェースをVBAだけで構築できるようになります。
「ここをこう変えたら、もっと現場の作業がラクになるのでは?」というアイデアが浮かんできたら、もうあなたは立派なAutoCAD VBAエンジニアです。ぜひ、日々の業務効率化にこのテクニックを役立ててくださいね!
