【入門編】【上級プロフェッショナル向け】図面保存イベント(BeginSave)をフックした「社外秘情報の自動スクリーニング」 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
日々、膨大な図面と向き合い、手作業での図面整理やデータチェックに消耗していませんか?

「マクロの記録」ボタンを押して図形を描くだけの自動化は、もう卒業しましょう。今回は、AutoCADの裏側でシステム全体を監視し、図面のライフサイクル(保存・オープンなど)に深く介入する「イベント処理」と、実務で絶対に役立つ「社外秘情報の自動スクリーニング(保存ブロック)」を解説します。

ここをクリアすれば、あなたもAutoCAD VBAの本質を捉えた真の自動化エンジニアの仲間入りです。優しく、そして深く、プロの知見をお伝えしていきますね。

—

1. なぜ「保存イベント(BeginSave)」なのか?

図面を外部(クライアントや協力会社)に納品・共有する際、こんなヒヤリハットはありませんか?

  • 「社内秘」と書かれたレイアウト上のメモや、非表示にしたはずの機密寸法のレイヤーが残っていた。
  • 顧客名やプロジェクトコードのプレースホルダーを消し忘れた。

これらを「人間の目視」だけに頼るのは、システム開発の観点から言えば「設計の敗北」です。人間は必ずミスをします。だからこそ、「ファイルが保存されるその瞬間(物理的境界)」に、プログラムが自動で検閲(スクリーニング)を行い、危険なデータがあればセーブを強制キャンセルする仕組みが必要なのです。

ここで登場するのが、今回主役となる `BeginSave` イベント です。

—

2. AutoCAD VBAにおけるイベントの仕組みと「落とし穴」

通常のVBAマクロは、ユーザーがボタンを押した時や `Sub Main()` を実行した時に動き始めます。しかし、イベントプロシージャは違います。AutoCADのアプリケーション側で特定の動作(図面を開く、保存する、閉じるなど)が発生した瞬間、自動的に呼び出される特別なサブルーチンです。

ここで、多くの初学者が最初にハマる「最大の罠」についてお話ししておきましょう。

⚠️ 【極限の知見】クラスモジュールという「器」が必要

標準モジュール(`Module1` など)に `Sub Application_BeginSave()` と書いても、イベントは絶対に発火しません。
AutoCADのアプリケーション全体を監視するためには、「クラスモジュール」という特殊なオブジェクトの設計図を使い、イベントを受け取る「リスナー(監視者)」をメモリ上に明示的に常駐させる必要があります。

この仕組みを理解していないと、「なぜかイベントが動かない…」と丸一日溶かすことになります。ここが最初の難所ですが、一緒にクリアすれば怖くありませんよ!

—

3. 実装ステップ:社外秘スクリーニングシステムの構築

それでは、実際にコードを書いていきましょう。
今回は以下の2つのステップで実装します。

1. クラスモジュール:AutoCADのアプリケーションイベントをキャッチする監視役を作成する。
2. 標準モジュール:監視のスタート・ストップを制御するトリガーを作成する。

ステップ1:クラスモジュールの作成

VBAエディタ(Alt + F11)を開き、メニューの「挿入」>「クラスモジュール」をクリックしてください。
プロパティウィンドウで、このクラスの名前を `CAppEvent` に変更します。

そして、以下のコードを貼り付けてください。

.net
‘ =================================================================
‘ クラスモジュール名: CAppEvent
‘ 役割: AutoCADのアプリケーションイベントをフックし、保存動作を監視する
‘ =================================================================

‘ WithEventsキーワードを使い、AutoCADのアプリケーションイベントを有効にする
Public WithEvents AcadApp As AcadApplication

‘ 【最重要】保存が開始される直前に強制発火するイベント
Private Sub AcadApp_BeginSave(ByVal DrawingName As String)
Dim oLayer As AcadLayer
Dim targetLayerName As String
Dim hasConfidentialData As Boolean

‘ ここでは例として「SECRET_MEMO」という名前のレイヤーが存在するか、
C
targetLayerName = “SECRET_MEMO”
hasConfidentialData = False

On Error GoTo ErrorHandler

‘ 現在の図面内のレイヤーをスキャン
For Each oLayer In ThisDrawing.Layers
‘ レイヤー名に特定の機密文字列が含まれているか、または可視状態でオブジェクトがあるかチェック
If UCase(oLayer.Name) Like “” & UCase(targetLayerName) & “” Then
‘ さらに厳密にするなら、そのレイイヤーに図形が存在するか確認するロジックを追加します
hasConfidentialData = True
Exit For
End If
Next oLayer

‘ 機密データ(禁止レイヤー)が検出された場合
If hasConfidentialData = True Then
‘ 警告メッセージを表示
MsgBox “【セキュリティ警告】” & vbCrLf & _
“この図面には社外秘レイヤー [” & targetLayerName & “] が含まれています!” & vbCrLf & _
“安全のため、保存処理を中断しました。”, _
vbCritical + vbOKOnly, “AutoCAD自動スクリーニング”

‘ 【極限テクニック】
‘ BeginSaveイベント内でエラーを発生させる(あるいは特定の方法で強制終了)ことで、
‘ AutoCADのネイティブな保存処理をキャンセルさせることができます。
Err.Raise Number:=vbObjectError + 512, _
Description:=”社外秘情報検出のため保存がキャンセルされました。”
End If

Exit Sub

ErrorHandler:
‘ エラー(保存キャンセル)をトラップし、AutoCADにセーブ中止を伝達
If Err.Number = (vbObjectError + 512) Then
‘ エラーメッセージをクリアして静かに保存を中断
Err.Clear
Else
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub

ステップ2:標準モジュールでの監視制御

次に、メニューの「挿入」>「標準モジュール」をクリックし、`Module1` を作成します。
ここには、クラスを初期化してイベント監視を有効化(スタート)させるコードを記述します。

.net
‘ =================================================================
‘ 標準モジュール: Module1
‘ 役割: イベント監視クラスのインスタンスを保持・起動する
‘ =================================================================

‘ アプリケーション全体でイベントを維持するため、パブリック変数として宣言
Public EventWatcher As CAppEvent

‘ 監視をスタートさせるマクロ
Sub StartSecurityMonitor()
If EventWatcher Is Nothing Then
Set EventWatcher = New CAppEvent
‘ AutoCADアプリケーション本体とクラスを紐付ける
Set EventWatcher.AcadApp = ThisDrawing.Application

MsgBox “社外秘情報の自動スクリーニング機能が有効になりました。”, vbInformation, “セキュリティシステム起動”
Else
MsgBox “すでに監視システムは稼働中です。”, vbInformation
End If
End Sub

‘ 監視をストップさせるマクロ
Sub StopSecurityMonitor()
Set EventWatcher = Nothing
MsgBox “セキュリティ監視を停止しました。”, vbInformation
End Sub

—

ジッポーのライターに火を灯すように、まずは `StartSecurityMonitor` を一度だけ手動で実行してください。
これで準備は完了です。この状態で、テストとして「SECRET_MEMO」という名前のレイヤーを作成し、図面を上書き保存(Ctrl + S または QSAVE)してみてください。

どうでしょうか?
画面がフリーズしたように保存処理がバシッと中断され、警告メッセージボックスが立ち上がりましたね。社外秘データが外に出ていくのを、コードが完璧に阻止した瞬間です。

—

4. プロの現場でさらに応用するために

今回のコードは、レイヤー名をベースにしたシンプルなスクリーニングですが、実務ではさらに次のような拡張が可能です。

  • 文字エンティティの走査(`AcadText` / `AcadMText`):

図面内の文字列を一括スキャンし、「社外秘」「極秘」「Confidential」といった禁止ワードがテキスト要素に含まれていないかを正規表現でチェックする。

  • 図面プロパティのチェック:

カスタムプロパティに「承認者未記入」などのフラグがある場合に保存を弾く。

  • 自動常駐化(`acad.dvb` の活用):

AutoCAD起動時に自動で読み込まれる `acad.dvb` にこのコードを仕込んでおけば、ユーザーが意識することなく、会社全体の図面セキュリティをバックグラウンドで守り抜く鉄壁の防壁が完成します。

まとめ

今回は、AutoCAD VBAのイベント機能を用いた「保存時の自動スクリーニング」という、一歩進んだプロフェッショナルなテーマを解説しました。

「ただ図形を自動で描くだけのVBA」から、「図面のライフサイクルを制御するエンジニアリング」へ。この領域に踏み込めたあなたは、もう立派なAutoCAD自動化のアーキテクトです。

現場の品質を守るスマートな自動化システムを、ぜひあなたの手で組み上げてみてください。それでは、次回の極限知見でお会いしましょう!

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