あなたの知財を守る「動的ステンシル」の極意:Visio VBAによるマスターシェイプの保護と配布戦略
こんにちは。現場の設計図やプロセスフローを自動化するエンジニアの皆さん。
今日は、少し「大人な」話をしましょう。
業務を自動化し、誰でも使える高品質なステンシル(図形集)を作り上げたとき、ふと不安になりませんか?
「このステンシル、社外のパートナーに渡したら、中の設計思想や複雑なShapeSheetのロジックを丸裸にされてしまうのではないか?」 と。
実は、Visioの標準的な機能だけでは、ステンシル(.vssx)の保護は完璧ではありません。XML構造を解析されれば、中身のロジックは透けて見えてしまうからです。
今日は、単なる「マクロの記録」を卒業し、「プログラムによって図形をその場で組み立てる(動的生成)」という、アーキテクトレベルの防御手法を伝授します。ここをマスターすれば、あなたの作るツールは「単なる便利ツール」から「堅牢な製品」へと進化します。
1. なぜ「普通のステンシル」は盗まれるのか?
まず、敵を知ることから始めましょう。
Visioのステンシルファイルは、実態はXML形式のデータの集合体です。高度な知識を持つユーザーなら、ファイルを解凍して中身のテキストを見るだけで、あなたが苦労して設定した「ShapeSheet(シェイプの振る舞いを決める計算式)」のロジックをコピーできてしまいます。
これを防ぐための基本戦略は、「図形をファイルとして持たせない」ことです。
守りの三原則
1. 静的な配布をやめる: `.vssx` ファイルをそのまま渡さない。
2. ロジックの隠蔽: 図形の形状やプロパティを「暗号化された文字列(データ)」としてコード内に持たせる。
3. 環境の検証: 許可されたPC(特定のドメインやマシン名)でしか動かないようにする。
2. アーキテクチャ:動的シェイプ・リコンストラクション
私たちが構築するのは、「レシピ(データ)はあるが、料理(図形)は現場でしか作れない」という仕組みです。
1. ガードマン(Environment Check): 実行環境が許可されているか確認。
2. 金庫(Encrypted Data): 図形の座標や色、ロジックを難読化した文字列として保持。
3. シェフ(Shape Constructor): コードが実行された瞬間に、メモリ上で図形を組み立てる。
3. 実践コード:マスターシェイプを「コードから生成」する
それでは、具体的なコードを見ていきましょう。ここでは、「特定のPCでのみ、特定の図形を生成できる」仕組みを実装します。
' =================================================================
' Module: SecureShapeGenerator
' Description: 環境チェックを行い、暗号化されたデータから図形を生成する
' =================================================================
Option Explicit
' 許可されたコンピュータ名(本来は外部ファイルやAPIから取得するのが理想)
Private Const ALLOWED_COMPUTER_NAME As String = "MY-ENGINEERING-PC"
' 図形の構成データ(本来はもっと複雑なBase64等で難読化する)
' 形式: "Width|Height|Color(RGB)|Label"
Private Const SECRET_SHAPE_DATA As String = "2.5|1.5|255,0,0|SecureComponent"
''' <summary>
''' メインルーチン:セキュリティチェックを経て図形を生成する
''' </summary>
Public Sub CreateSecureMaster()
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
' 1. 環境チェック(ガードマン)
If Not IsAuthorized() Then
MsgBox "認証エラー: この環境での実行は許可されていません。", vbCritical, "Security Alert"
Exit Sub
End If
' 描画パフォーマンス向上のため画面更新を停止
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
Set vsoPage = ActivePage
' 2. 図形の動的生成(シェフ)
' ステンシルからドラッグするのではなく、コードで「描く」
Set vsoShape = GenerateShapeFromData(vsoPage, SECRET_SHAPE_DATA)
' 3. 仕上げ(プロパティの設定)
With vsoShape
.Text = "Authorized Asset"
.Cells("FillForeColor").FormulaU = "RGB(255, 255, 255)" ' 背景を白に
End With
Application.ScreenUpdating = True
MsgBox "セキュアな図形を生成しました。", vbInformation
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True
MsgBox "エラーが発生しました: " & Err.Description, vbExclamation
End Sub
''' <summary>
''' 実行環境が許可されているか判定する
''' </summary>
Private Function IsAuthorized() As Boolean
' Environ関数を使用してコンピュータ名を取得
' これにより、特定のPC以外ではマクロが動作しないように制限できる
If Environ("COMPUTERNAME") = ALLOWED_COMPUTER_NAME Then
IsAuthorized = True
Else
IsAuthorized = False
End If
End Function
''' <summary>
''' 暗号化された(難読化された)文字列から図形を組み立てる
''' </summary>
Private Function GenerateShapeFromData(targetPage As Visio.Page, dataString As String) As Visio.Shape
Dim parts() As String
Dim w As Double, h As Double
Dim rgb() As String
Dim label As String
' 文字列をパイプ記号で分割
parts = Split(dataString, "|")
' データのパース(解析)
w = CDbl(parts(0))
h = CDbl(parts(1))
rgb = Split(parts(2), ",")
label = parts(3)
' 図形の描画(ここでは長方形を例にする)
' 本来はもっと複雑な座標計算をここで行う
Set GenerateShapeFromData = targetPage.DrawRectangle(1, 1, 1 + w, 1 + h)
' 色の設定
GenerateShapeFromData.Cells("FillForeColor").FormulaU = _
"RGB(" & rgb(0) & "," & rgb(1) & "," & rgb(2) & ")"
End Function
4. プロが教える「ここが落とし穴」
コードを書き始めたばかりの方が陥りやすいポイントを整理しておきましょう。
① `Environ` 関数の限界を知る
上記のコードでは `Environ(“COMPUTERNAME”)` を使っています。これは非常に手軽ですが、実はユーザーが環境変数を書き換えると突破される可能性があります。
「極限のセキュリティ」を目指すなら、社内のActive Directory(ドメイン)に問い合わせるか、独自の認証サーバーへAPI経由で照会するロジックを組み込むのが正解です。
② パフォーマンスへの配慮
図形を一つずつ `DrawRectangle` で描画していくと、数が多い場合に動作が非常に重くなります。
必ず `Application.ScreenUpdating = False` を使い、描画処理をメモリ内で完結させてから、最後に画面を更新するようにしてください。これは「作法」ではなく、プロとしての「責任」です。
③ エラーハンドリングの重要性
「動的に作る」ということは、データの形式が少しでも狂うと、プログラムは即座にクラッシュします。
`On Error GoTo ErrorHandler` を使い、エラーが起きたときに「なぜ止まったのか」をユーザーに(あるいはログに)伝える仕組みを必ず入れてください。
5. まとめ:次の一歩へ
今回の手法は、従来の「ステンシルを配る」という概念を、「プログラムという鍵を使って、その場で図形を召喚する」という概念へシフトさせるものです。
1. 環境チェックで門前払いする。
2. データ(レシピ)をコード内に隠す。
3. VBAで図形を組み立てる。
このステップを踏むだけで、あなたの開発した資産の価値は劇的に高まります。
「マクロの記録」は、あくまで「動きのメモ」に過ぎません。
今回のように、「オブジェクトのプロパティをどう制御し、どう守るか」という設計思想(アーキテクチャ)を持つこと。それこそが、凡百のユーザーから伝説的なエンジニアへと脱皮するための唯一の道です。
さあ、次はもっと複雑な「ShapeSheetのロジックを文字列から再構築する」ことに挑戦してみませんか?
君ならできるはずですよ。応援しています。
