「教育版」の混入を防げ!商用プロジェクトを守るAutoCAD VBA「ガード機能」の実装術
こんにちは。現場の自動化を支えるエンジニアの皆さん。
今日は、単なる「作業の効率化」を超えた、「プロジェクトの品質とコンプライアンスを守る」ための、非常に重要で、かつ少しシビアなお話をしましょう。
皆さんは、AutoCADを使って図面を作成している際、「マクロの記録」を使って「線を引く」「色を変える」といった操作を自動化することに慣れてきたかもしれません。それは素晴らしい第一歩です。しかし、プロフェッショナルな現場で求められるのは、操作の自動化だけではありません。「間違ったデータが混入するのを未然に防ぐ仕組み」を作ることです。
今回のテーマは、「教育版(Student Version)で作られた図面が、商用プロジェクトに混入してしまうのを防ぐガード機能」の実装です。
なぜ「教育版スタンプ」の検知が必要なのか?
AutoCADの教育版は、学習目的には最適ですが、商用利用は厳格に禁止されています。
もし、教育版で作成された図面(あるいは教育版で一度でも開いて保存された図面)が、商用プロジェクトの図面セットに紛れ込んでしまったらどうなるでしょうか?
- 法的リスク: ライセンス違反として、企業としての信頼を失墜させる。
- 技術的リスク: 教育版特有のメタデータ(属性情報)が残っていることで、後続の処理や検図プロセスでエラーを引き起こす可能性がある。
これを防ぐには、「図面を開いた瞬間に、その図面が教育版の形跡を持っていないかスキャンし、もし見つかったら保存をブロックする」というガード機能が必要です。
「マクロの記録」から「オブジェクトの理解」へ
ここで、皆さんに意識を変えてほしいポイントがあります。
「マクロの記録」は、あなたがマウスで行った「動作」を記録します。しかし、今回の目的は「動作」ではなく、「図面が持っている情報(属性)」を調べることです。
図面ファイル(DWG)は、単なる線の集まりではありません。内部には、作成者、作成日時、ソフトウェアのバージョン、そして「SummaryInfo(概要情報)」と呼ばれる、図面の「履歴書」のようなデータが格納されています。
私たちは、この「履歴書」の特定の項目を読み取り、そこに「Educational」や「Student」といったキーワードが隠れていないかをチェックするのです。
実装の核心:SummaryInfoをスキャンする
では、実際にコードを見ていきましょう。
今回は、図面の「概要情報(SummaryInfo)」の中に、教育版であることを示す特定のキーワードが含まれていないかを判定する関数を作成します。
【実践コード】教育版検知ガード・モジュール
Option Explicit
' =================================================================
' モジュール名: SecurityGuard
' 概要: 図面ファイルが教育版による汚染を受けていないかチェックする
' =================================================================
''' <summary>
''' 図面が教育版の形跡を持っているか判定する関数
''' </summary>
''' <param name="acDoc">チェック対象のAutoCADドキュメントオブジェクト</param>
''' <returns>教育版の形跡があればTrue、そうでなければFalse</returns>
''' <remarks>
''' 教育版はSummaryInfoのKeywordsやSubjectに特定の文字列を残す傾向があるため、
''' それらをスキャンします。
''' </remarks>
Public Function IsEducationVersionContaminated(ByVal acDoc As AcadDocument) As Boolean
Dim summaryInfo As AcadSummaryInfo
Dim keywords As Variant
Dim i As Integer
Dim targetKeywords As Variant
' 判定の対象とする「教育版特有のキーワード」リスト
' ※実際の環境に合わせて調整が必要な場合があります
targetKeywords = Array("Educational", "Student", "Academic", "Education")
On Error GoTo ErrorHandler
' 1. 図面の概要情報(SummaryInfo)を取得
Set summaryInfo = acDoc.SummaryInfo
' 2. キーワードを取得(配列として返ってくる)
' Keywordsプロパティは、複数の単語がセミコロンで区切られている場合がある
keywords = summaryInfo.Keywords
' --- チェック開始 ---
' A. Keywordsプロパティのチェック
If Not IsEmpty(keywords) Then
For i = LBound(keywords) To UBound(keywords)
For Each item In targetKeywords
' 部分一致でチェック(大文字小文字を区別しない)
If InStr(1, keywords(i), item, vbTextCompare) > 0 Then
IsEducationVersionContaminated = True
Exit Function
End If
Next item
Next i
End If
' B. Subject(件名)プロパティのチェック
' キーワード以外にも、件名欄に書き込まれているケースを想定
For Each item In targetKeywords
If InStr(1, summaryInfo.Subject, item, vbTextCompare) > 0 Then
IsEducationVersionContaminated = True
Exit Function
End If
Next item
' 全てのチェックを通過した場合
IsEducationVersionContaminated = False
Exit Function
ErrorHandler:
' オブジェクトへのアクセス失敗などは、汚染されていないものとして扱う(安全策)
MsgBox "警告: 概要情報の読み取り中にエラーが発生しました。" & vbCrLf & _
"図面の整合性を確認してください。", vbExclamation
IsEducationVersionContaminated = False
End Function
''' <summary>
''' 図面を開いた際に実行するメインルーチン
''' </summary>
Public Sub RunSecurityCheck()
Dim doc As AcadDocument
Set doc = ThisDrawing ' 現在開いている図面を取得
Debug.Print "セキュリティスキャン開始..."
' 教育版チェックの実行
If IsEducationVersionContaminated(doc) Then
' 【重要】汚染が見つかった場合の処理
MsgBox "【警告: セキュリティ・ブロック】" & vbCrLf & _
"この図面には教育版(Student Version)の形跡が検出されました。" & vbCrLf & _
"商用プロジェクトへの混入を防ぐため、保存を禁止します。", _
vbCritical, "コンプライアンス違反検知"
' ここでユーザーに強制的に終了を促す、あるいは
' 独自の「安全な保存」以外の操作を制限するロジックをここに組み込む
' ※VBA単体では標準の「Save」ボタンを完全に無効化するのは難しいため、
' 運用ルールとして「この警告が出たら即座に閉じる」ことを徹底させる。
Else
MsgDebug "スキャン完了: 問題ありません。"
End If
End Sub
' デバッグ用補助関数
Private Sub DebugMsg(msg As String)
Debug.Print "[" & Now & "] " & msg
End Sub
コードの解説と「プロの視点」
このコードをただコピペするだけでは、あなたはまだ「マクロ使い」です。このコードの裏側にある「考え方」を理解してこそ、プロフェッショナルへの道が開けます。
1. オブジェクトの階層構造を捉える
`ThisDrawing`(図面) $\rightarrow$ `SummaryInfo`(概要情報) $\rightarrow$ `Keywords`(キーワード)という階層を辿っています。これは、AutoCAD VBAにおける「オブジェクトのライフサイクルとプロパティの探索」そのものです。大きな塊から、小さな情報へと絞り込んでいく感覚を掴んでください。
2. 「部分一致」の重要性
`InStr` 関数を使っていますよね? これは「完全に一致するか」ではなく、「その文字列が含まれているか」を判定しています。教育版のデータは `”Educational Version”` や `”Student-Use Only”` のように、様々な形で書き込まれる可能性があるため、部分一致でスキャンするのが実務上の鉄則です。
3. エラーハンドリング(Error Handling)
`On Error GoTo ErrorHandler` を入れています。これは、もし図面が破損していたり、プロパティが読み取れない特殊な形式だった場合に、マクロが強制終了してAutoCADごと落ちるのを防ぐためです。「自動化ツールが原因で業務を止めてはいけない」。これがエンジニアの鉄則です。
陥りやすいエラーと回避策
これからこのコードを試す皆さんが、ハマりやすいポイントを挙げておきます。
- 「キーワードが見つからない!」エラー:
`SummaryInfo.Keywords` が空(Empty)の場合、`LBound` や `UBound` を使うとエラーになります。必ず `If Not IsEmpty(keywords) Then` でチェックを入れるようにしましょう。
- 「保存が止められない!」問題:
実は、VBA単体ではAutoCADの「上部リボンにある保存ボタン」そのものを物理的に消し去ることは非常に困難です。
プロの運用テクニックとしては、以下の方法を組み合わせます。
1. 図面を開いた瞬間にこのマクロを自動実行する(`Document_Open`イベントを利用)。
2. 警告が出た場合、ユーザーに「保存せずに閉じる」ことを強く指示する。
3. (さらに高度な方法)標準の `Save` コマンドを上書きするカスタムボタンを作成し、そのボタン経由でしか保存できないように運用を設計する。
まとめ:ここをクリアすれば、AutoCAD VBAの基本はバッチリです
今回の内容は、単なる「文字探し」ではありません。
「図面というオブジェクトが持つ属性を理解し、それをビジネスのルール(コンプライアンス)に適合させる」という、極めて高度な自動化の考え方です。
1. オブジェクトの階層を理解する
2. 適切なプロパティ(SummaryInfo)を選択する
3. 例外(エラー)を考慮した堅牢なコードを書く
この3点をマスターすれば、あなたの書くコードは「ただ動くもの」から「現場で信頼されるシステム」へと進化します。
さあ、次は自分のプロジェクトにこの「ガード機能」を組み込んで、一歩先のエンジニアを目指してみましょう。応援していますよ!
