こんにちは!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の基本はバッチリですよ。次のステップでも、さらにディープで実用的な知見をお届けします。お疲れ様でした!
