【入門編】【上級】AcadDocumentのBeginCommandイベントを捕捉し、特定の禁止コマンド実行を自動キャンセル – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
今日は、マクロの記録をポチポチ押すだけの初級者から、一気に「AutoCADのシステムを手のうちに入れる上級エンジニア」へとステップアップするための、とびきりスリリングで実用的なテーマをお届けします。

テーマは「`BeginCommand`イベントを捕捉し、特定の禁止コマンド実行を自動キャンセルする社内統制ツールの作り方」です。

「せっかく作った図面のブロックを、うっかり爆破(EXPLODE)されてレイアウトが崩壊した…」
「大切な画層や寸法規格を勝手にいじられたくない…」

現場の管理者なら、一度は頭を抱えたことがある悩みですよね。これをAutoCAD VBAのイベント機能を使って、未然にガッチリガードしちゃいましょう!
ここをクリアすれば、あなたのAutoCAD VBAの理解度は間違いなく一段上のステージに到達します。さあ、一緒に本質を紐解いていきましょう!

1. なぜ「イベント」を使うのか?(基礎とオブジェクトモデルの本質)

これまでの一般的なVBAマクロは、「ボタンを押したら動く」「VBAの画面から実行する」という受動的なものでした。

しかし、今回使うのは「イベント(Event)」です。
イベントとは、AutoCADのなかでユーザーが何かアクションを起こしたとき(図面を開いた、線を描いた、コマンドを入力したなど)に、AutoCAD自身が「おっと、今こういうことが起きたよ!」と裏でVBAにこっそり教えてくれる仕組みのことです。

中でも、今回主役になるのは `AcadDocument` オブジェクトが持つ `BeginCommand` イベント です。

  • AcadApplication:AutoCADというアプリ全体を統括する神様のようなオブジェクト。
  • AcadDocument:今あなたが画面で開いている「個別の図面ファイル」に焦点を当てたオブジェクト。

ユーザーがコマンド名(例: `”EXPLODE”`)を打ち込んでEnterを押した瞬間、AutoCADは実際にコマンドを実行するコンマ数秒前に、この `BeginCommand` イベントを発火させます。
私たちはその瞬間を捕らえ、「おっと、そのコマンドはウチの会社じゃ禁止だよ!」と割り込んで、処理を無かったこと(キャンセル)にするという魔法をかけるのです。

2. 【実践】禁止コマンドを自動キャンセルするコード

百聞は一見に如かず。まずは開発現場でそのままコピペして使える実コードをお見せします。
このコードは、通常の標準モジュール(Module1など)ではなく、「ThisDrawing」という特別な場所に書く必要があるのが最大のポイントです。

手順1:VBAエディタを開く

1. AutoCAD上で `Alt + F11` キーを押してVBAエディタ(IDE)を起動します。
2. 左側の「プロジェクトエクスプローラ」から、現在作業中の図面(例: `Drawing1.dwg`)の中にある `ThisDrawing` をダブルクリックしてください。

手順2:コードの記述

以下のコードを、`ThisDrawing` のコードウィンドウに丸ごと貼り付けてください。

Option Explicit

‘ =====================================================================
‘ 【上級知見】AcadDocumentのBeginCommandイベントを活用した統制ツール
‘ =====================================================================

‘ 1. WithEventsキーワードを使い、AutoCADのドキュメントイベントを捕捉できるように宣言します
Public WithEvents ActiveDoc As AcadDocument

‘ 2. 図面が開かれた瞬間に、イベントの監視をスタートさせる
Private Sub AcadDocument_Activate()
‘ 自分自身(ThisDrawing)をイベント監視対象として紐付ける
Set ActiveDoc = ThisDrawing
End Sub

‘ 3. コマンドが「開始された直後」に割り込むイベントハンドラ
Private Sub ActiveDoc_BeginCommand(ByVal CommandName As String)

‘ ==========================================
‘ 設定エリア:社内で禁止したいコマンド名を大文字で列挙
‘ ==========================================
Dim TargetCommand As String
TargetCommand = “EXPLODE” ‘ ここでは例として「分解 (EXPLODE)」を指名

‘ ユーザーが入力したコマンド名が大文字・小文字どちらでも判定できるようにUCase関数を使用
If UCase(CommandName) = TargetCommand Then

‘ ① ユーザーに警告メッセージを表示
MsgBox “【社内統制アラート】” & vbCrLf & _
“コマンド ‘” & CommandName & “‘ の実行は、図面品質保持のため禁止されています。”, _
vbCritical, “AutoCAD自動ガードシステム”

‘ ② AutoCADのコマンドを強制中断させる(極限のテクニック)
‘ ※ BeginCommandの最中にエラーを意図的に発生させることで、AutoCADにコマンドを吐き出させます
Err.Raise Number:=vbObjectError + 1000, _
Source:=”CommandInterceptor”, _
Description:=”Command cancelled by company policy.”

End If

Exit Sub

ErrorHandler:
‘ エラーをハンドリングし、AutoCADが異常終了するのを防ぎます
Resume Next

End Sub

3. コードの深い解説:ここがエンジニアの腕の見せ所

初心者の方が「おっ?」と思うポイントや、現場でハマりやすい罠について優しく解説しますね。

① なぜ `WithEvents` が必要なのか?

通常のVBAなら変数宣言に `Dim` を使いますが、イベントを受け取るオブジェクトには `WithEvents` という特別なキーワードが必須です。
これをつけることで、「この変数は、AutoCADから発せられるシグナル(イベント)をキャッチするアンテナなんだな」とVBAに教えることができます。

② なぜ標準モジュールではなく `ThisDrawing` に書くのか?

`BeginCommand` は「その図面(Document)」で起きるイベントです。そのため、図面と一対一で紐づいている `ThisDrawing` クラスのモジュール内に書くのが最も自然であり、AutoCAD VBAの作法に則った正しい配置場所となります。

③ どうやってコマンドの実行を「キャンセル」しているのか?

ここが一番のキモです。実は、AutoCAD VBAのイベント引数には、VB.NETのように単純な `e.Cancel = True` のようなお行儀の良いキャンセルプロパティが用意されていない場合があります。

そのため、プロのエンジニアは「イベントの実行中に意図的にエラー(`Err.Raise`)を発生させる」という荒技を使います。
AutoCADは、コマンドの開始直後にVBA側で致命的なエラーが発生すると、「おっと、このコマンドは続行できないな」と判断し、安全にコマンドを自動キャンセル(中止)してプロンプトを初期状態に戻してくれるのです。これぞ知る人ぞ知るライフサイクルハックです!

4. 陥りやすいエラーと注意点

現場でこのコードをテストする際、以下のポイントに気をつけてください。

  • イベントが発火しない?
  • コードを貼り付けた後、一度図面をアクティベート(別の図面を開いて戻る、または `AcadDocument_Activate` が走るタイミング)させる必要があります。確実に動かすために、一度ファイルを保存して開き直すのが一番確実です。
  • 他のコマンドも巻き込んで止まってしまう
  • `If UCase(CommandName) = TargetCommand` の条件分岐を書き間違えると、すべてのコマンドが動かなくなる「恐怖の全停止バグ」が起きるので注意してください。複数禁止したい場合は、配列や `Select Case` 構文に拡張するのがスマートです。

まとめ:ここをクリアすれば、基本はバッチリ!

お疲れ様でした!今回は `AcadDocument` の `BeginCommand` イベントを使い、ユーザーの入力を監視して不正なコマンドを強制キャンセルする統制ツールの作り方を解説しました。

  • イベント監視の仕組み (`WithEvents`)
  • 図面オブジェクト (`AcadDocument`) のライフサイクル
  • エラーレイズを活用した高度なコマンド中断テクニック

これらを理解できたあなたは、もはや単なるマクロの利用者ではありません。立派な「AutoCADの自動化エンジニア」です。
ぜひ自社の図面管理ルールに合わせてアレンジし、現場のトラブルを未然に防ぐ強力な盾を作ってみてくださいね。

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

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