こんにちは!AutoCAD VBAの自動化の世界へようこそ。
これまで「マクロの記録」ボタンを押して作られたコードを眺めたり、ボタンをポチッと押して図形を描画するだけのスクリプトを作ったりしていませんでしたか?
もちろん、それだけでも作業効率は上がります。しかし、世界中のプロフェッショナルが認める真の自動化エンジニアは、「人間がボタンを押すことすらしない」世界を目指します。CADが自ら周囲の状況を察知し、裏側でデータベースと同期を取る――今回は、そんな映画のワンシーンのような高度な連携を実現する『AcadApplicationのイベントハンドリング』の世界へご案内します。
ここをクリアすれば、あなたのAutoCAD VBAスキルは間違いなく「基礎の卒業」を超え、プロの領域に到達します。ゆっくり、丁寧にお話ししていくので、一緒にマスターしていきましょう!
—
1. なぜ「イベント」なのか?(マクロの記録からの脱却)
通常、私たちが書くVBAマクロは「指示待ちのロボット」です。人間がVBAエディタから `Sub` プロシージャを実行するか、画面上のボタンを押して初めて動き出します。
しかし、実際の業務ではどうでしょう?
- 「図面が上書き保存された瞬間に、変更履歴をサーバーのデータベースに自動で記録したい」
- 「特定のコマンド(例えば印刷やブロック作成など)が終わったタイミングで、集計データを更新したい」
こうした要望に対して、人間が毎回マクロを起動し忘れたらシステムは崩壊します。ここで登場するのが、AutoCAD自身が発する「イベント(出来事)」をVBAで聞き取る「イベントハンドリング」という技術です。
AutoCADの親玉である `AcadApplication` オブジェクトを監視下に置くことで、図面が保存された瞬間や、コマンドが終了した瞬間をキャッチし、自動的にコードを走らせることができるのです。
—
2. 【図解的解説】イベント監視の全体像
イベントを受け取る仕組みは、少し特殊です。通常のモジュールではなく、「クラスモジュール」という専用の型枠を使います。
[ AutoCAD アプリケーション (AcadApplication) ]
│
├─ (図面が保存される) ──> 発生!【 BeginSave イベント 】
│ │
│ ▼
│ [ クラスモジュール ]
│ WithEvents でイベントを捕捉!
│ │
│ ▼
│ [ 外部DBへ自動書き込み処理 ]
│ (SQL Server / SQLite等へ通信)
この仕組みの肝は、`WithEvents` というキーワードです。「このオブジェクトのイベントを監視し続けるよ」とVBAに宣言するための特別な合言葉になります。
—
3. 実践!外部DB連携を見据えたイベント実装コード
それでは、実際にコードを書いていきましょう。
今回は、「図面が保存され始めた瞬間(BeginSave)」をフックして、ログを記録する(今回はイミディエイトウインドウおよび外部連携を想定した処理)プロフェッショナルな実装を行います。
ステップ1:クラスモジュールの作成(イベントを受け止める受話器)
まず、VBAエディタ(IDE)のメニューから [挿入] > [クラス モジュール] を選択してください。
プロパティウィンドウで、このクラスの名前を `C_AutoCADEvents` に変更します。
そして、以下のコードを貼り付けます。
‘ =================================================================
‘ クラスモジュール名: C_AutoCADEvents
‘ 役割: AutoCADアプリケーションのイベントを常時監視する
‘ =================================================================
‘ WithEventsキーワードを使い、AcadApplicationのイベントを捉える変数宣言
Public WithEvents AppEvents As AcadApplication
‘ 図面が保存され始める瞬間に自動発火するイベント
Private Sub AppEvents_BeginSave(ByVal FullName As String)
On Error GoTo ErrorHandler
Dim msg As String
msg = “【DB連携ログ】図面の保存が検知されました。” & vbCrLf & _
“対象ファイル: ” & FullName & vbCrLf & _
“実行時刻: ” & Now
‘ ———————————————————
‘ 【実務ポイント】ここに外部DB(SQL Server等)への書き込み処理を記述します
‘ 例: ADO (ADODB.Connection) を用いたINSERT文の実行など
‘ ———————————————————
‘ デバッグ用にメッセージを表示(本番ではログテーブルに書き込みます)
Debug.Print msg
Exit Sub
ErrorHandler:
‘ イベント内でエラーが発生した際、AutoCAD本体をクラッシュさせないための防衛策
MsgBox “イベント処理中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub
ステップ2:標準モジュールの作成(監視のスイッチを入れる起爆剤)
次に、通常の [標準モジュール] を挿入し、以下のコードを書きます。ここで先ほどのクラスを実体化(インスタンス化)し、監視をスタートさせます。
‘ =================================================================
‘ 標準モジュール名: M_InitializeEvents
‘ 役割: イベント監視クラスを起動する
‘ =================================================================
‘ クラスの設計図から実体(インスタンス)を作り、マクロ終了後も消えないようグローバル保持する
Public GlobalEventSource As C_AutoCADEvents
Sub StartAutoCADMonitoring()
‘ すでに監視が始まっている二重起動を防ぐ
If Not GlobalEventSource Is Nothing Then
MsgBox “すでにAutoCADのイベント監視は稼働中です。”, vbInformation
Exit Sub
End If
‘ クラスのインスタンスを生成
Set GlobalEventSource = New C_AutoCADEvents
‘ AutoCADのアプリケーション本体をイベントのソースとして紐付ける
Set GlobalEventSource.AppEvents = ThisDrawing.Application
MsgBox “プロフェッショナル監視モードが起動しました。” & vbCrLf & _
“これより図面保存等のイベントがバックグラウンドで自動フックされます。”, vbInformation
End Sub
Sub StopAutoCADMonitoring()
‘ 監視を終了し、メモリを解放する
Set GlobalEventSource = Nothing
MsgBox “イベント監視を停止しました。”, vbInformation
End Sub
—
4. 開発現場で絶対にハマる!陥りやすい「罠」と回避策
このコードを書いて動かしたとき、初心者の多くが以下の壁にぶつかります。ここを知っているかどうかが、エンジニアとしての分かれ道です。
罠1:「あれ? イベントが発火しないんだけど…」
原因: 標準モジュールのマクロが終わった瞬間に、メモリ上のクラスが消滅している可能性があります。
解決策: 今回のコードでは、モジュールレベル変数(`Public GlobalEventSource As C_AutoCADEvents`)として宣言しているため、Excel/AutoCADを閉じるか `StopAutoCADMonitoring` を実行するまでメモリ上に残り続けます。変数のスコープ(生存期間)を意識することが極めて重要です。
罠2:「イベント内でエラーが起きてAutoCADごと強制終了した」
原因: イベントプロシージャ内で未処理のエラー(例えば、存在しないDBへの接続など)が発生すると、AutoCADのプロセス自体が巻き添えを食って落ちることがあります。
解決策: 上記のコードにも入れている通り、必ず `On Error GoTo ErrorHandler` を仕込み、CAD本体を絶対にクラッシュさせない「防衛的プログラミング」を徹底してください。
—
5. さあ、試してみよう!
1. 標準モジュールの `StartAutoCADMonitoring` を一度だけ実行します(これで監視がスタートします)。
2. その後、適当な図面を上書き保存(Ctrl + S など)してみてください。
3. VBAエディタの「イミディエイト ウインドウ(Ctrl + G)」を開いてみましょう。
そこには、あなたが保存ボタンを押した瞬間をキャッチして出力された、美しいログの記録が残っているはずです。
ここから先は、ADO(ActiveX Data Objects)を使ってSQL Serverに接続し、`INSERT INTO DrawingLogs…` と流し込むだけで、完全自動の設計管理システムへと進化します。
—
まとめ
今回は `AcadApplication` のイベントハンドリングを通じて、図面保存の裏側で外部システムと連携する高度な手法を解説しました。
- 受話器役の「クラスモジュール (`WithEvents`)」
- スイッチ役の「標準モジュール (インスタンスの維持)」
この2つを組み合わせることで、あなたのAutoCADは単なる「お絵描きソフト」から「自律型データハブ」へと生まれ変わります。
ここをクリアしたあなたなら、もう初級者ではありません。自信を持って、次の自動化の扉を開いてください。バッチリですよ!
