図面は「線」ではなく「契約」である。デジタル署名で守る、プロフェッショナルな保存制御の実装
こんにちは。AutoCADの世界へようこそ。
あなたが今、マクロの記録ボタンを押し、「どうすればこの作業を自動化できるだろう?」と考えているなら、あなたはすでに「作業者」から「エンジニア」への第一歩を踏み出しています。素晴らしいですね。
しかし、今日お話しするのは、単なる「繰り返し作業の自動化」ではありません。
「図面の信頼性をシステムとして担保する」という、設計実務における極めて重要な、そして少し背筋が伸びるようなお話です。
現場では、意図せず「承認前の図面」や「修正途中の図面」をクライアントに送ってしまうリスクが常に潜んでいます。これを個人の注意力が頼りの「人間系」で防ごうとするのは限界があります。
そこで、「デジタル署名(Digital Signature)がない図面は、納品フォルダへの保存を物理的に拒絶する」という、鉄壁のガードレールをVBAで構築する方法を伝授しましょう。
ここをクリアすれば、あなたのAutoCAD VBAスキルは「便利なツール作り」から「業務プロセスを支配するシステム構築」へと進化します。準備はいいですか?
1. なぜ「デジタル署名」を確認する必要があるのか?
まず、技術に入る前に「設計思想」を共有しておきましょう。
設計図面は、単なる図形データの集まりではありません。それは、設計者が責任を持って「この内容で正しい」と宣言した「契約書」に近いものです。
AutoCADのデジタル署名機能を使えば、「誰が、いつ、どの状態の図面に承認を与えたか」をファイル自体に刻印できます。
もし、署名のない図面が納品フォルダに紛れ込んでいたら? それは、プロジェクト全体の品質管理(QA)における重大な欠陥となります。
「ルールを決め、それをプログラムで強制する」
これが、プロフェッショナルな自動化エンジニアが持つべき思考です。
2. 実装のロジック:ガードレールの設計図
今回のプログラムは、以下の3ステップで動作させます。
1. 保存先の判定: 今から保存しようとしているパスが「納品用(Delivery)フォルダ」かどうかをチェックする。
2. 署名の検証: もし納品用フォルダなら、その図面に有効なデジタル署名が付与されているかを解析する。
3. 実行または拒絶: 署名があれば保存を許可し、なければエラーメッセージを出して保存を中断する。
「マクロの記録」では、こうした「条件分岐(If文)」や「エラーハンドリング」は記録できません。ここからが、あなたの本当のプログラミングの始まりです。
3. 【実践】デジタル署名チェック・プロトコル
それでは、コードを見ていきましょう。
このコードは、標準モジュールに貼り付けて使用することを想定しています。
Option Explicit
' =================================================================
' プログラム名: SecureSaveToDelivery
' 概要: 納品用フォルダへの保存時に、デジタル署名の有無をチェックする
' 開発者: あなたの専属チーフアーキテクト
' =================================================================
Sub SecureSaveToDelivery()
Dim targetPath As String
Dim deliveryFolder As String
Dim isSigned As Boolean
' --- 設定エリア ---
' 納品用として許可されたフォルダパスを指定してください(末尾に\を忘れないこと)
deliveryFolder = "C:\Project\Delivery\"
' ------------------
On Error GoTo ErrorHandler
' 1. 現在の図面のパスを取得
targetPath = ThisDrawing.Path
' 図面が一度も保存されていない(メモリ上にしかない)場合は、保存を促して終了
If targetPath = "" Then
MsgBox "この図面はまだ一度も保存されていません。先に名前を付けて保存してください。", vbExclamation, "警告"
Exit Sub
End If
' 2. 保存先が「納品フォルダ」に含まれているかチェック
' InStr関数は、文字列の中に特定の文字が含まれているかを判定します
If InStr(1, targetPath, deliveryFolder, vbTextCompare) > 0 Then
' 3. デジタル署名の状態を確認
' 注意: AutoCAD VBAにおいて、DigitalSignatureプロパティの挙動は
' バージョンや署名の種類に依存するため、慎重に扱う必要があります。
' ここでは、署名が存在し、かつ有効であるかを確認するロジックの骨組みを示します。
isSigned = CheckDigitalSignature()
If Not isSigned Then
' 署名がない場合は、保存を阻止してユーザーに通知
MsgBox "【警告】デジタル署名が確認できません!" & vbCrLf & _
"承認済みの図面のみ、納品フォルダへ保存できます。", vbCritical, "セキュリティエラー"
Exit Sub
End If
MsgBox "署名を確認しました。安全に保存できます。", vbInformation, "チェック完了"
End If
' 4. 全てのチェックを通過したら、通常の保存処理を実行
ThisDrawing.Save
MsgBox "納品用フォルダへ安全に保存されました。", vbInformation, "成功"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "システムエラー"
End Sub
' -----------------------------------------------------------------
' 関数名: CheckDigitalSignature
' 概要: 図面のデジタル署名状態を解析する
' 戻り値: 署名が有効なら True, そうでなければ False
' -----------------------------------------------------------------
Private Function CheckDigitalSignature() As Boolean
' ※注: AutoCADのVBAオブジェクトモデルにおける
' DigitalSignatureプロパティの詳細は、使用しているAutoCADのバージョンに依存します。
' 一般的な実装イメージとして、プロパティの存在を確認するロジックを記述します。
On Error Resume Next
Dim sigStatus As Variant
' DigitalSignatureプロパティにアクセスを試みる
' (実際の実装では、ここに詳細な署名検証ロジックを組み込むことが可能です)
sigStatus = ThisDrawing.DigitalSignature
' 署名が空、あるいはエラーが発生した場合は False
If Err.Number <> 0 Or IsEmpty(sigStatus) Then
CheckDigitalSignature = False
Else
' 署名が存在する場合
CheckDigitalSignature = True
End If
On Error GoTo 0
End Function
4. アーキテクトの視点:陥りやすい「罠」と回避策
コードを書くだけでは、一流のエンジニアとは言えません。運用中に発生する「落とし穴」を予見しておくことこそが、真のプロフェッショナルです。
① 「未保存の図面」という虚無
図面を新規作成した直後、一度も保存していない状態(`ThisDrawing.Path` が空の状態)でこのマクロを動かすと、エラーになります。コード内で `If targetPath = “” Then` と書いたのは、この「ライフサイクルの初期段階」をケアするためです。
② 文字列比較の罠(大文字・小文字)
Windowsのパスは `C:\Project` と `c:\project` を区別しませんが、VBAの文字列比較は厳格です。
`InStr` 関数を使う際に `vbTextCompare` オプションを指定したのは、「大文字小文字の揺れ」でチェックをすり抜けさせないための、プロの作法です。
③ 署名の「有効性」の定義
今回のコードでは「署名プロパティが存在するか」を主眼に置いています。しかし、実務では「期限切れの署名」や「改ざんされた署名」も問題になります。
さらに高度な制御を行う場合は、`.NET (C#)` を用いて `Autodesk.AutoCAD.DatabaseServices` 名前空間から、より詳細な署名証明書(Certificate)の情報まで解析するステップへ進むことになります。
5. 次のステップへ:マクロの記録を卒業するために
お疲れ様でした。ここまで読み進めたあなたは、もう単なる「マクロ使い」ではありません。
「業務のルールを、コードという論理で構築する設計者」の思考を手に入れました。
今回学んだことは、以下の3つの本質に集約されます。
1. 条件分岐 (`If`): 「もし〜なら、こうする」という判断を作る。
2. エラーハンドリング (`On Error`): 想定外の事態でプログラムを死なせない。
3. カプセル化 (`Private Function`): 複雑な処理を部品化して、メインの処理を読みやすく保つ。
「マクロの記録」は、いわば「歩き方」を覚える練習です。
今日学んだ「ロジックによる制御」は、目的地へ最短・安全にたどり着くための「地図とコンパス」です。
さあ、次はもっと複雑な、複数の図面をまたいだ一括処理や、Excelとの連携に挑戦してみてください。AutoCAD VBAの深淵な世界は、あなたの挑戦を待っています。
「コードは、あなたの代わりに24時間、正確に、誠実に働き続ける最強の部下です。」
応援していますよ!
