【上級プロフェッショナルへの登竜門】「保存」を支配し、図面の品質を自動で守る:AutoCAD VBAによるスタイル強制適用術
「マクロの記録」から一歩踏み出し、現場の「ルール」をコードで制御したい――。そう願うようになったあなたへ。
こんにちは。今日は、AutoCAD VBAにおける「自動化の極致」の一つ、イベント駆動型によるガバナンス(統制)の構築についてお話ししましょう。
現場でよくある悩みがあります。「せっかく図面を修正したのに、保存してみたら文字スタイルが社内規定と違う」「寸法スタイルがバラバラで、後工程の人が泣いている」。これらはすべて、人間の注意力の限界によるものです。
これを解決するのが、「ユーザーが保存しようとした瞬間に、プログラムが割り込んで、正しいスタイルに書き換えてしまう」という、いわば「図面の門番」を作る技術です。
この記事では、単なるコードの書き方ではなく、「なぜその書き方をしなければならないのか」という設計思想を含めて解説していきます。
1. 「イベント」を捉える:なぜ「保存ボタン」を監視するのか?
プログラミング初学者の多くは、「ボタンを押したらこの処理をする」という命令型のコードを書きます。しかし、プロフェッショナルは「イベント駆動型(Event-Driven)」という考え方を持っています。
「イベント」とは、ユーザーが保存ボタンを押した、図面を閉じた、といった「何かが起きた瞬間」のことです。
今回の目標は、AutoCADのコマンド(`QSAVE` や `SAVEAS`)が実行される直前に、私たちの「検閲プログラム」を割り込ませることです。これにより、ユーザーが意識することなく、常に「正しい状態」の図面だけがディスクに書き込まれるようになります。
2. 実装の核心:CommandWillStart イベントの活用
AutoCAD VBAにおいて、コマンドが開始される直前をフックするには、`CommandWillStart` というイベントを利用します。
ここで重要なのは、「全てのコマンドに対してチェックを行うと、動作が激重になる」という点です。例えば、線を引くたびにスタイルチェックが走ったら、CADは使い物になりません。
「もし実行されたコマンドが『保存』に関連するものだったら、チェックを開始する」という条件分岐が、パフォーマンスを維持する鍵となります。
🛠 実装コード例:社内標準スタイル・ガード
以下のコードは、標準モジュールではなく、`ThisDrawing` モジュールに記述することを想定しています。
' ※ ThisDrawing モジュールに記述してください
Option Explicit
' AutoCADのコマンドが開始される直前に呼び出されるイベント
Private Sub CommandWillStart(ByVal CommandName As String)
' 1. 監視対象のコマンドを特定する
' QSAVE (クイック保存) または SAVEAS (名前を付けて保存) の時だけ動かす
If CommandName = "QSAVE" Or CommandName = "SAVEAS" Then
Debug.Print "--- スタイル検閲を開始します ---"
' 2. スタイルチェック・修正ルーチンを呼び出す
' ここで「正しい状態」へ強制的に書き換える
Call EnforceStandardStyles
Debug.Print "--- 検閲完了:標準スタイルを適用しました ---"
End If
End Sub
' 社内規定のスタイルを強制適用するメインロジック
Private Sub EnforceStandardStyles()
Dim stdTextStyle As String
Dim stdDimStyle As String
' --- 設定エリア:ここを社内規定に合わせて書き換える ---
stdTextStyle = "Standard_Text" ' 社内規定の文字スタイル名
stdDimStyle = "Standard_Dim" ' 社内規定の寸法スタイル名
' --------------------------------------------------
On Error GoTo ErrorHandler
' 3. 文字スタイルのチェックと強制適用
' 図面内に規定のスタイルが存在するか確認
Dim ts As AcadTextStyle
Dim foundText As Boolean
foundText = False
For Each ts In ThisDrawing.TextStyles
If ts.Name = stdTextStyle Then
foundText = True
Exit For
End If
Next ts
' もし規定のスタイルがなければ、警告を出すか、デフォルトを適用する
' 今回は「既存のスタイルを、規定のスタイルへ強制的に切り替える」ロジックを想定
' ※ 実際には、図面内の全オブジェクトを走査してスタイルを変更する必要があります
' 【重要】パフォーマンスへの配慮:
' 全オブジェクトをループするのは重いため、ここでは「現在のスタイル」を
' 規定のものにセットする、という基本的なガードを例示します。
If ThisDrawing.ActiveTextStyle.Name <> stdTextStyle Then
' 警告なしで強制変更する場合
ThisDrawing.ActiveTextStyle = ThisDrawing.TextStyles.Item(stdTextStyle)
End If
' 4. 寸法スタイルのチェックと強制適用
If ThisDrawing.ActiveDimStyle.Name <> stdDimStyle Then
ThisDrawing.ActiveDimStyle = ThisDrawing.DimStyles.Item(stdDimStyle)
End If
Exit Sub
ErrorHandler:
' スタイルが見つからない場合などのエラーハンドリング
MsgBox "【警告】社内標準スタイルが見つかりません。" & vbCrLf & _
"規定のスタイルを適用できませんでした。管理者へ連絡してください。", vbCritical, "ガバナンスエラー"
End Sub
3. プロが教える「陥りやすい罠」と回避策
このコードを動かす際、初心者が必ずと言っていいほどハマるポイントが3つあります。ここを理解していれば、あなたはもう初心者ではありません。
① 無限ループの恐怖 ⚠️
もし、`CommandWillStart` の中で、再び `Save` を実行するようなコードを書いてしまうと、`CommandWillStart` $\rightarrow$ `Save` $\rightarrow$ `CommandWillStart`… という無限ループに陥り、AutoCADがフリーズします。
今回のコードのように、「プロパティ(名前など)を書き換えるだけ」に留めるのが鉄則です。
② オブジェクトのライフサイクルと存在確認 🔍
コード内の `ThisDrawing.TextStyles.Item(stdTextStyle)` は、もしその名前のスタイルが図面に存在しない場合、エラーで止まります。
「あるはずだ」という思い込みは捨てましょう。必ず `For Each` でループして存在を確認するか、エラーハンドリング(`On Error GoTo`)を組み込むのが、プロの作法です。
③ 「現在の設定」と「図面内の全オブジェクト」の違い 📐
ここが最も重要な概念です。
- ActiveTextStyle: 今、ユーザーが書き始めようとしている「現在の設定」。
- 全てのTextオブジェクトのStyle: すでに図面に配置されている「過去の遺産」。
上記のサンプルコードは「現在の設定(Active)」を強制するものですが、真のガバナンスを効かせるなら、`ThisDrawing.ModelSpace` 内のすべてのオブジェクトをループして、スタイルを書き換える処理が必要になります。
4. まとめ:自動化の先にあるもの
「保存ボタンを押すたびにチェックが入るなんて、ユーザーにとって邪魔じゃないか?」
そう思うかもしれません。しかし、考えてみてください。
「後工程で図面がやり直しになるコスト」と「保存時に数秒待たされるコスト」、どちらが大きいでしょうか?
自動化の真の目的は、ユーザーの手間を省くだけでなく、「ミスが起きようのない仕組み(仕組み化)」を作ることです。
今回紹介した `CommandWillStart` を使った手法をマスターすれば、あなたは単なる「マクロ作成者」から、組織の品質を守る「オートメーション・アーキテクト」へと進化できるはずです。
さあ、まずは小さなチェックから始めてみましょう。一歩ずつ、コードの力を自分のものにしていってくださいね。応援していますよ!
