【入門編】【上級】バージョン管理システム(Git等)と連携したステンシル配布の自動化 – Visio VBA解析バイブル

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

孤立したマクロから「チームの資産」へ:Gitと連携するステンシル自動同期システムの構築

こんにちは。今日もコードの海を渡っていますか?

「マクロの記録」で一歩を踏み出し、VBAの構文を少しずつ理解してきたあなた。素晴らしい進歩です。しかし、もしあなたが「現場のプロ」を目指すなら、今すぐ意識を変えなければならない壁があります。

それは、「自分のPCで動けばいい」という思考からの脱却です。

設計図(ダイアグラム)を扱うVisioにおいて、図形(マスターシェイプ)の定義である「ステンシル」は、チーム全体の共通言語です。一人がステンシルを改良したとき、他のメンバーが古いステンシルを使い続けていたらどうなるでしょうか? 整合性が崩れ、設計ミスを誘発します。

今日は、ステンシルを「単なるファイル」ではなく、「バージョン管理されるコード」として扱い、Gitと連携してチーム全員の環境を自動で最新に保つ、極限の自動化手法を伝授しましょう。

ここをクリアすれば、あなたは単なる「VBA使い」ではなく、「業務プロセスを設計できるエンジニア」へと進化できますよ。

1. アーキテクチャの全体像:なぜVBAだけで完結させないのか?

まず、設計思想(アーキテクチャ)を理解しましょう。

「VBAだけでGitの操作をしよう」と考えるのは、非常に危険な罠です。VBAはあくまでVisioの操作に特化した言語であり、Gitのような高度なバージョン管理システムを直接制御するのには向いていません。

そこで、「役割分担」を明確にします。

1. Git(外部ツール): ステンシルファイル(`.vssx`)の真の正解(Single Source of Truth)を保持し、変更履歴を管理する。
2. シェルスクリプト/Batch(橋渡し): Gitの `pull` コマンドを実行し、ローカル環境に最新ファイルをダウンロードする。
3. Visio VBA(司令塔): ユーザーの代わりに「更新があるか?」を確認し、必要ならシェルを叩き、完了後にステンシルを再読み込みする。

【図解:同期のフロー】

graph LR
    A[Git リポジトリ] -- pull --> B[ローカルフォルダ]
    B -- 更新を検知 --> C[Visio VBA]
    C -- Shell実行 --> D[Git Pull実行]
    D -- 完了通知 --> C
    C -- 再読み込み --> E[Visio上のステンシル]

2. 実装:ステンシル・シンクロナイザー

では、具体的なコードを見ていきましょう。このコードの肝は、「Visioがファイルを掴んでロックしている間にGit操作をしようとしてエラーになる」という、現場で必ず直面する問題をどう回避するか、にあります。

ステップ1:外部スクリプトの準備

まず、プロジェクトのルートフォルダに `sync_stencil.bat` という名前で以下のファイルを用意しておきます。

@echo off
:: Gitリポジトリのディレクトリへ移動
cd /d "%~dp0"
:: 最新のステンシルを取得
git pull origin main
:: 実行結果をログに残す(デバッグ用)
echo %date% %time% : Sync completed >> sync_log.txt
exit /b 0

ステップ2:VBAによる制御ロジック

次に、Visio側からこのバッチを呼び出し、ステンシルを制御するコードを書きます。

Option Explicit

' --- 定数定義:管理するステンシルのパスを指定 ---
Private Const STENCIL_PATH As String = "C:\Work\Project\Stencils\Standard_Shapes.vssx"
Private Const BATCH_PATH As String = "C:\Work\Project\Scripts\sync_stencil.bat"

''' <summary>
''' ステンシルの同期と再読み込みを行うメインルーチン
''' </summary>
Public Sub SynchronizeStencil()
    Dim stencilObj As Visio.Stencil
    Dim shellCmd As String
    Dim waitStatus As Long
    
    On Error GoTo ErrorHandler

    ' 1. 現在開いているステンシルを特定し、一旦閉じる
    ' 【重要】ファイルがロックされているとGit pullが失敗するため、
    ' プロフェッショナルな設計では「先に閉じる」のが鉄則です。
    Set stencilObj = GetOpenedStencil(STENCIL_PATH)
    If Not stencilObj Is Nothing Then
        Debug.Print "既存のステンシルを閉じます..."
        stencilObj.Close
    End If

    ' 2. 外部スクリプト(Git Pull)の実行
    Debug.Print "Git同期を開始します..."
    shellCmd = """" & BATCH_PATH & """"
    
    ' vbHideで黒い画面を出さずに実行。実行完了を待機。
    ' ※ 本格的な運用では、戻り値を確認してエラーハンドリングを行う。
    Dim wsh As Object
    Set wsh = CreateObject("WScript.Shell")
    waitStatus = wsh.Run(shellCmd, 0, True) ' 第3引数をTrueにすることで完了まで待機

    If waitStatus <> 0 Then
        Err.Raise vbObjectError + 513, "SyncModule", "Gitの同期に失敗しました。ネットワークを確認してください。"
    End If

    ' 3. 最新のステンシルを読み込み直す
    Debug.Print "最新のステンシルをロード中..."
    Set stencilObj = Application.Documents.OpenEx(STENCIL_PATH, visOpenDocked)
    
    MsgBox "ステンシルの同期が完了しました!", vbInformation, "Success"
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbCritical, "Sync Error"
    ' エラー時でも、もしファイルが開ける状態なら再開を試みる等のリカバリ処理をここに書く
End Sub

''' <summary>
''' 指定したパスのステンシルが現在開いているか確認し、オブジェクトを返す
''' </summary>
Private Function GetOpenedStencil(ByVal path As String) As Visio.Stencil
    Dim doc As Visio.Document
    For Each doc In Application.Documents
        ' パスを比較(大文字小文字の違いを考慮してLCaseを使用)
        If LCase(doc.FullName) = LCase(path) Then
            Set GetOpenedStencil = doc.Stencil
            Exit Function
        End If
    Next doc
    Set GetOpenedStencil = Nothing
End Function

3. 伝説のアーキテクトが教える「陥りやすい罠」

このコードをコピペして動かすだけでは、まだ不十分です。実戦で戦うために、以下の3点を必ず心に刻んでおいてください。

① ファイルロックの呪い

Visioは、ステンシルを開いている間、そのファイルに対して「書き込み禁止」のロックをかけます。この状態で `git pull` を実行すると、Gitは「ファイルが使用中です」と怒って止まってしまいます。
私のコードでは、「まず `stencilObj.Close` でファイルを解放してから、Gitを叩く」という手順を踏んでいます。これが、初心者とプロを分ける境界線です。

② パスの解決問題

`STENCIL_PATH` を `C:\Users\Tanaka\…` のように個人の絶対パスで書いていませんか? それではチームには配布できません。
実戦では、`Application.ActiveDocument.Path` を起点とした相対パス、あるいは環境変数を利用したパス解決を行うように設計してください。

③ 非同期実行の制御

`wsh.Run(shellCmd, 0, True)` の第3引数を `True` にしていますね。これは「バッチ処理が終わるまでVBAの実行を待機させる」という意味です。
もしここを `False` にしてしまうと、Gitがファイルをダウンロードしている最中に、VBAが「さあ、新しいファイルを開くぞ!」と動いてしまい、「ファイルが見つかりません」というエラーで自爆します。同期は「待ち」の美学です。

4. まとめ:次なるステップへ

お疲れ様でした。これであなたは、単に「図形を動かすマクロ」を書く段階を卒業し、「チームのインフラを支える仕組み」を構築する一歩を踏み出しました。

今回のポイント:

  • 役割分担: VBAは司令塔、Gitは実務者。
  • ライフサイクル管理: ファイルを閉じてロックを解除してから更新する。
  • 同期の確実性: 外部プロセスの完了を待機(Wait)させる。

「マクロの記録」から卒業し、こうしてシステム全体を俯瞰して設計する癖をつければ、あなたのエンジニアとしての価値は飛躍的に高まります。

次は、この同期プロセスを「Visio起動時に自動でチェックする」仕組みや、「更新があった場合のみ通知する」差分検知ロジックに挑戦してみましょう。

道はまだ長いですが、一歩ずつ、確実に。
また次の技術解説でお会いしましょう!

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