【入門編】【上級プロフェッショナル向け】「Digital Signature(デジタル署名)」の有無を確認し、未署名図面の外部送信を防止する保存制御 – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

図面は「線」ではなく「契約」である。デジタル署名で守る、プロフェッショナルな保存制御の実装

こんにちは。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時間、正確に、誠実に働き続ける最強の部下です。」

応援していますよ!

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