AutoCAD VBAの深淵:`SendCommand`の呪縛から脱却し、`PostCommand`で「真の同期」を操る
AutoCAD VBAを触り始めると、誰もが一度は「コマンドを送る」という壁にぶつかります。
「`ThisDrawing.SendCommand “_LINE 0,0 100,100 “`…これで動いた!」と喜ぶのも束の間、複雑な図面を処理し始めると、「コマンドが途中で止まる」「VBAとAutoCADのタイミングが噛み合わない」という悪夢があなたを襲います。
今日は、AutoCAD VBAの基礎でありながら、多くの人が誤解している「コマンド実行の真髄」について、現場の最前線からお話しします。
—
1. なぜ `SendCommand` は「不安定」なのか?
`SendCommand` は、その名の通りAutoCADのコマンドラインに文字列を直接投げ込むメソッドです。一見便利ですが、これには重大な弱点があります。
- 同期実行の罠: `SendCommand` は、AutoCADがそのコマンドを処理しきるまでVBAの実行を(基本的には)待とうとします。しかし、VBA側の実行タイミングとAutoCADの描画エンジンが微妙にズレると、「コマンドがまだ受け付けられない状態」で命令が空振りするという現象が多発します。
- モーダルダイアログの壁: コマンド中にダイアログが開くと、VBAの制御がAutoCADに奪われ、以降のVBAコードが死んだままになることがあります。
これこそが、多くの初心者が「マクロの記録」の延長から抜け出せない最大の理由です。
—
2. `PostCommand` という「切り札」
そこで登場するのが `PostCommand` です。
`PostCommand` は、コマンドを「予約」します。VBAの現在のサブルーチンが完全に終了し、AutoCADに制御が戻ったその瞬間に、予約されたコマンドが実行されるのです。
なぜこれが安全なのか?
VBAの処理が終わるのを待ってから実行されるため、「VBAがAutoCADをロックしている間にコマンドを投げようとして失敗する」という排他制御のエラーを回避できるからです。
—
3. 実践:図面を「確実に再描画」させるコード
例えば、VBAで大量の図形を描画した後、最後に確実に `REGEN`(再描画)をかけたい場合。`SendCommand` で無理やり書くと失敗しがちですが、`PostCommand` ならこう書けます。
Public Sub DrawAndRegenExample()
Dim lineObj As AcadLine
Dim startPoint(0 To 2) As Double
Dim endPoint(0 To 2) As Double
‘ 1. 大量の図形生成処理(ここが重いとSendCommandは不安定になりやすい)
startPoint(0) = 0: startPoint(1) = 0: startPoint(2) = 0
endPoint(0) = 100: endPoint(1) = 100: endPoint(2) = 0
Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
‘ 2. ここでSendではなくPostを使う
‘ VBAの処理が終わって、AutoCADが操作可能になった瞬間にREGENが走る
ThisDrawing.PostCommand “_REGEN ”
‘ メッセージを出しても、REGENはVBA終了後に実行されるため邪魔をしない
MsgBox “図形を描画しました。このウィンドウを閉じると再描画されます。”
End Sub
このコードの「本質」
このコードを実行すると、`MsgBox` が表示されている間はまだ `REGEN` は走りません。`MsgBox` を「OK」した瞬間にVBAが完全に終了し、AutoCADが制御を取り戻したその瞬間に `REGEN` が実行されます。この「あとのことはAutoCADに任せる」という姿勢こそが、大規模開発における極意です。
—
4. 使い分けのロードマップ
ここを理解すれば、あなたはもう脱・初級者です。
| メソッド | 特徴 | 用途 |
| :— | :— | :— |
| SendCommand | 即時実行(同期) | 単純なコマンドの連続実行。VBA内で結果を取得したい時。 |
| PostCommand | 遅延実行(非同期) | 処理の最後に必ず実行したいクリーンアップや再描画。 |
陥りやすいエラーと対策
- 「コマンドの引数が足りない」: `PostCommand` に送る文字列の末尾に「半角スペース」を入れるのを忘れないでください。AutoCADはコマンドの終わりをスペースで判定します。
- 「順番が逆になる?」: `PostCommand` を複数回呼ぶと、書いた順番にキューイングされます。しかし、複雑な依存関係を持つコマンドを連続してポストするのは避けましょう。その場合は、一つのコマンド文字列にまとめてからポストするのが鉄則です。
—
最後に:エンジニアとしてのマインドセット
「AutoCAD VBAで何でもかんでもSendCommandで解決しようとするな」
これは、私が後輩に必ず伝える教訓です。AutoCADという巨大なエンジンと、VBAという小さなスクリプト。この二つの間に「対話」を生むためには、「今、誰が主導権を握っているのか?」を常に意識してください。
`PostCommand` を使いこなすことは、AutoCADの挙動を信じ、賢く手放すこと。ここをクリアできれば、あなたの作るマクロは驚くほど安定し、現場の信頼を勝ち取ることでしょう。
さあ、次はどんな複雑な図面を自動化しますか?あなたのエンジニアリングライフを応援しています!
