【入門編】【上級プロフェッショナル】AcadApplicationのイベントハンドリングを活用し、図面保存やコマンド終了をトリガーに外部DBを自動更新する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:イベント駆動で「図面とDB」を同期させる極限のアーキテクチャ

こんにちは。AutoCADの自動化の世界へようこそ。
「マクロの記録」ボタンを押すだけの世界から、AutoCADの鼓動(イベント)を直接操るプロフェッショナルの領域へ足を踏み入れましょう。

今日は、「図面を保存した瞬間に外部DBへ情報を飛ばす」という、実務で即戦力となる高度なテクニックを伝授します。これさえ理解すれば、あなたは単なる「スクリプト書き」から「システムアーキテクト」へと進化できます。

1. なぜ「イベント」なのか?

通常のVBAマクロは「ボタンを押すと実行される」という受動的なものです。しかし、イベント駆動(Event-Driven)は違います。AutoCADという生き物が「保存した」「コマンドを終えた」と呟くのを背後で聞き取り、自動的に処理を開始する。これが真の自動化です。

陥りやすい罠:なぜ「動かない」のか?

多くの初学者がここで挫折します。「コードを書いたのにイベントが発火しない」。
原因はただ一つ。「クラスモジュール」という概念を避けているからです。

VBAの標準モジュールは「静的な命令書」ですが、イベントを受け取るには「動的な監視者(クラス)」が必要です。ここから先は、その「監視者」の作り方を解説します。

2. 実践:イベント監視クラスの構築

まずは、VBAプロジェクトに「クラスモジュール」を挿入し、名前を `EventMonitor` に変更してください。これが監視者の設計図になります。

クラスモジュール:EventMonitor

‘ 監視対象のAutoCAD Applicationを宣言
Public WithEvents AppEvents As AcadApplication

‘ 初期化処理:AutoCADアプリとこのクラスを紐付ける
Public Sub Initialize(app As AcadApplication)
Set AppEvents = app
End Sub

‘ 図面保存イベント:保存の直前に発火
Private Sub AppEvents_BeginSave(ByVal FileName As String)
MsgBox “図面が保存されます!DB同期を開始します。” & vbCrLf & “対象ファイル: ” & FileName

‘ — ここに外部DB更新処理を記述します —
‘ Call UpdateDatabase(FileName)
End Sub

‘ コマンド終了イベント:コマンドが完了した時に発火
Private Sub AppEvents_EndCommand(ByVal CommandName As String)
‘ 頻繁に動きすぎるので、必要なコマンドだけ選別するのがコツです
If CommandName = “LINE” Then
Debug.Print “線分が引かれました。DBの長さを更新しました。”
End If
End Sub

3. 「監視者」を起動させる司令塔

クラスを作っただけでは動きません。AutoCADが起動した瞬間に、「監視者」を駐在させる仕組みが必要です。`ThisDrawing` または標準モジュールに以下のコードを配置します。

Dim myMonitor As EventMonitor ‘ クラスのインスタンスを保持する変数

Public Sub StartMonitoring()
‘ 監視者を生成
Set myMonitor = New EventMonitor
‘ AutoCAD本体を監視させる
myMonitor.Initialize Application

MsgBox “イベント監視を開始しました。保存やコマンド実行を試してください。”
End Sub

ここが重要です!
変数をプロシージャ内で宣言すると、終了後にメモリから消えて監視が止まります。`Dim myMonitor As EventMonitor` はモジュールレベル(コードの最上部)で宣言してください。これがプロのコードと素人のコードを分かつ境界線です。

4. プロの視点:パフォーマンスと安定性のために

実際に現場で使う際、以下の3点に注意してください。

  • 処理の重さに注意: `BeginSave` イベント内で重いDB検索や通信を行うと、保存操作そのものがフリーズします。処理はなるべく軽く、非同期的な設計を心がけてください。
  • エラーハンドリング: イベント内でエラーが起きるとAutoCAD全体が不安定になることがあります。必ず `On Error Resume Next` 等を活用し、堅牢に作り込んでください。
  • 「コマンド終了」の選別: `EndCommand` はあらゆる操作で呼ばれます。`If` 文でコマンド名をフィルタリングしないと、処理が重すぎて業務になりません。

最後に:あなたはもう「記録者」ではない

ここまで読み進めたあなたは、既にAutoCADの内部モデルを理解する土台ができています。

「保存」という当たり前の動作を、「DB更新のトリガー」に変える。この発想の転換こそが、自動化エンジニアとしての第一歩です。

まずは、上記のコードをコピペして `StartMonitoring` を実行してみてください。AutoCADが自分の手足のように動く快感を知れば、もう退屈な手作業には戻れないはずです。

何か詰まったら、いつでも聞いてください。AutoCADという巨大なシステムを飼い慣らすその日まで、私はあなたの隣にいます。さあ、最高の自動化ライフを!

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