【入門編】【上級プロフェッショナル向け】図面保存イベント(BeginSave)をフックしたカスタムメタデータの自動埋め込み – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の世界へようこそ。
今回は、プログラミング初学者の方や「マクロの記録」から一歩抜け出して本格的なツールを作りたい方に向けて、とってもエキサイティングで実用的なテーマをお届けします。

テーマは「図面保存イベント(BeginSave)をフックしたカスタムメタデータの自動埋め込み」です。

なんだか難しそうな名前が並びましたね。「イベントをフックする」とか「カスタムメタデータ」とか……。でも安心してください。噛み砕いて説明すれば、仕組み自体はとてもシンプルで、かつ現場でめちゃくちゃ重宝するテクニックです。

ここをクリアすれば、AutoCAD VBAの「ただの作業代行」からの脱却を果し、ワンランク上のエンジニアにグッと近づけますよ。さあ、一緒に扉を開けていきましょう!

—

1. なぜ「保存時イベント」が必要なのか?

皆さんは、複数人で一つの図面を管理する現場で、こんな困った経験はありませんか?

  • 「この図面、最後に誰が修正したんだっけ?」
  • 「いつの間にか古いバージョンのまま上書きされちゃってるよ……」
  • 「トレーサビリティ(追跡可能性)を確保したいけれど、手動でプロパティを入力させるのは面倒くさがる人が多い」

これを人間の手ではなく、AutoCADに自動でやらせてしまおうというのが今回の試みです。

ユーザーが「保存」ボタンを押した瞬間(あるいは `Ctrl + S` を押した瞬間)、AutoCADの裏側でVBAがこっそり起動し、図面の「カスタムプロパティ」に編集者の名前や最終保存日時を自動で書き込む――。そんな夢のような仕組みを実装します。

—

2. AutoCAD VBAの「イベント」ってなに?

通常、VBAのマクロは、私たちが「実行ボタン」を押したときにしか動きませんよね。
しかし、AutoCADには「特定のタイミングで自動的に呼び出される特別なルーチン(イベント)」が用意されています。

今回使うのは、図面が保存される直前に発火する `BeginSave` というイベントです。

  • 通常のマクロ: 人間が「動かして」と言わないと動かない(受動的)
  • イベントプロシージャ: AutoCADの特定の動作を感知して、勝手に立ち上がる(能動的・番人のような存在)

このイベントをどこに書くのか、どうやって捕まえるのかが、今回の最大のポイントになります。

—

3. 実装のステップ:魔法のコードを仕込もう!

ここからは、実際に開発環境(VBAエディタ)を開いてコードを書いていきましょう。
※今回は分かりやすさを優先し、図面ごとに常駐する標準的なアプローチで解説します。

ステップ1:クラスモジュールの準備(イベントの番人を作る)

AutoCADのアプリケーション全体の動きを監視するためには、「クラス」という特別なモジュールを使います。

1. AutoCADで `Alt + F11` を押してVBAエディタ(IDE)を開きます。
2. メニューの [挿入] > [クラス モジュール] をクリックします。
3. プロパティウィンドウで、このクラスの名前を `CEventWatcher` に変更します。
4. 以下のコードを貼り付けてください。

‘ =================================================================
‘ クラスモジュール名: CEventWatcher
‘ 役割: AutoCADの保存イベントをキャッチする番人
‘ =================================================================

‘ WithEventsキーワードを使って、AutoCADのアプリケーションイベントを監視します
Public WithEvents App As AcadApplication

‘ 【重要】保存が始まった瞬間に自動で呼び出されるイベントプロシージャ
Private Sub App_BeginSave(ByVal Document As Document, ByVal FullName As String)
On Error GoTo ErrorHandler

Dim infoMessage As String
infoMessage = “自動メタデータ埋め込みシステムが作動しました。” & vbCrLf & _
“対象ファイル: ” & FullName

‘ 1. カスタムプロパティに「最終保存日時」を書き込む
Call SetCustomProperty(Document, “LastSavedDate”, Format(Now, “yyyy/mm/dd HH:nn:ss”))

‘ 2. カスタムプロパティに「編集者(Windowsログインユーザー名など)」を書き込む
Call SetCustomProperty(Document, “LastEditor”, Environ(“USERNAME”))

‘ デバッグ用(現場では邪魔にならないようコメントアウトしてもOKです)
‘ MsgBox infoMessage, vbInformation, “トレーサビリティ強化”

Exit Sub

ErrorHandler:
MsgBox “保存時イベントの処理中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub

‘ — ヘルパー関数: 図面の「図面プロパティ」のカスタムタブに値を書き込む汎用ロジック —
Private Sub SetCustomProperty(doc As Document, propName As String, propValue As String)
Dim summaryInfo As AcadSummaryInfo
Set summaryInfo = doc.SummaryInfo

Dim i As Long
Dim found As Boolean
found = False

‘ 既存のカスタムプロパティを探して、あれば更新する
For i = 0 To summaryInfo.NumCustomKeys – 1
Dim key As String, val As String
Call summaryInfo.GetCustomByIndex(i, key, val)
If key = propName Then
Call summaryInfo.SetCustomByIndex(i, key, propValue)
found = True
Exit For
End If
Next i

‘ なければ新しく追加する
If Not found Then
Call summaryInfo.AddCustomKeyValue(propName, propValue)
End If
End Sub

ステップ2:標準モジュールで番人を起動する

クラスを作っただけでは、番人は眠ったままです。AutoCADを起動したタイミング、あるいはマクロを実行したタイミングで「番人を起こす(インスタンス化する)」必要があります。

1. メニューの [挿入] > [標準モジュール] をクリックします。
2. 以下のコードを貼り付けます。

‘ =================================================================
‘ 標準モジュール名: MdlInitializer
‘ 役割: イベント監視クラスを起動・管理する
‘ =================================================================

‘ グローバル変数としてクラスのインスタンスを保持し続ける
Public Watcher As CEventWatcher

‘ このマクロを実行すると、保存イベントの監視がスタートします
Sub StartEventWatcher()
If Watcher Is Nothing Then
Set Watcher = New CEventWatcher
‘ AutoCADのアプリケーション本体を監視対象にセット
Set Watcher.App = ThisDrawing.Application
MsgBox “図面保存イベントのフックを開始しました!” & vbCrLf & _
“これより、保存時にメタデータが自動付与されます。”, vbInformation, “初期化成功”
Else
MsgBox “すでに監視システムは稼働中です。”, vbInformation, “通知”
End Sub
End Sub

‘ 監視を停止したい時用
Sub StopEventWatcher()
Set Watcher = Nothing
MsgBox “イベント監視を停止しました。”, vbInformation, “通知”
End Sub

—

4. 実際に動かしてみよう!動作確認の手順

さあ、準備は整いました。実際にその目で魔法が起きる瞬間を確認してみましょう。

1. まず、標準モジュールの `StartEventWatcher` を実行してください(F5キーなど)。「初期化成功」のメッセージが出ればOKです。
2. 適当な図面を編集し、上書き保存(`QSAVE` または `Ctrl + S`)をしてみます。
3. 保存が終わったら、AutoCADのメニューから [ファイル] > [図面プロパティ (DRAWINGPROPERTIES)] を開いてみてください。
4. 「カスタム」タブ を見てみましょう……!

なんと、何も手入力していないのに、そこに `LastSavedDate` と `LastEditor` という項目が現れ、それぞれ正確な日時とあなたのユーザー名が刻み込まれているはずです。

これが、イベントをフックしてメタデータを自動埋め込みする仕組みの本質です。

—

5. 陥りやすいエラーとプロの知見(トラブルシューティング)

現場でこのシステムを運用するにあたり、初学者が必ずと言っていいほどハマる「罠」がいくつかあります。プロの知見としてシェアしておきますね。

罠1:VBAを閉じるとイベントが消える(動かなくなる)

  • 原因: グローバル変数(`Public Watcher`)としてメモリ上に保持しているため、VBAのエラー等で変数がリセットされたり、AutoCADを再起動したりすると、番人が消えてしまいます。
  • 対策: 本格的な運用(アドイン化)を目指す場合は、AutoCAD起動時に自動でこの `StartEventWatcher` が走るように `acad.lsp` や `acaddoc.lsp` と連携させる仕組み(`vbaload` の自動化など)を構築するのがプロの常道です。

罠2:無限ループやクラッシュの恐怖

  • 原因: `BeginSave` の中で図面を「保存するような操作(`doc.Save` など)」を記述してしまうと、保存 ➔ イベント発火 ➔ コード内で保存 ➔ 再びイベント発火…… の無限地獄(デッドロック)に陥り、AutoCADが強制終了します。
  • 対策: 今回のコードのように、`SummaryInfo`(図面プロパティのメモリ上のデータ)を書き換えるだけに留めてください。プロパティの書き換え自体は「ファイルを保存する行為そのもの」ではないため、無限ループは発生しません。ここが安全な設計のキモです。

—

まとめ

いかがでしたでしょうか?
今回は少し背伸びをして、図面保存イベント(`BeginSave`)をフックした高度なメタデータ自動化手法を解説しました。

ここをクリアできたあなたは、単なる「マクロの記録が使える人」から、「AutoCADの挙動をコントロールできる業務自動化エンジニア」へ確実にステップアップしています。

図面の品質管理、トレーサビリティの向上、そして何より社内のメンバーの手間を減らす素晴らしいソリューションです。ぜひご自身の設計環境や業務フローに合わせてアレンジし、活用してみてくださいね。

ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ。次のステップでも、さらにディープで実用的な知見をお届けします。お疲れ様でした!

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