【Visio VBA】ファイル管理の極意:タイムスタンプ自動付与による版管理の自動化
現場で「なぜファイルが上書きされたのか?」という問いに答える時間は、エンジニアにとって最も生産性の低いコストだ。Visioでの図面管理において、ファイル名にタイムスタンプを強制的に付与する仕組みは、単なる利便性ではなく、「システムとしての健全性」を担保するための防波堤である。
今回は、単に文字列を連結するだけの稚拙なスクリプトではなく、メモリ管理と将来的なAPI連携を見据えた、プロフェッショナルな実装パターンを伝授する。
—
1. アーキテクチャの要諦:なぜ「明示的な解放」が必要か
VBAはガベージコレクションをOSに委ねる言語ではない。特にVisioの`Document`オブジェクトや`Application`オブジェクトはCOMのラッパーであり、不適切な参照はメモリリークや、最悪の場合、Visioプロセスがバックグラウンドにゾンビとして残り、次回のファイルオープンを阻害する。
我々が書くコードは、常に「例外が発生してもオブジェクトを解放する」という責務を負う。
2. 実装コード:堅牢なPDFエクスポート・ロジック
以下のコードは、単にPDFを保存するだけではない。日付のパース、パスの整合性チェック、そしてオブジェクトのライフサイクル管理を徹底している。
Option Explicit
‘ PDF保存の核となるプロシージャ
Public Sub ExportVisioToTimestampedPDF()
Dim doc As Visio.Document
Dim targetPath As String
Dim fileName As String
Dim timestamp As String
‘ 1. オブジェクトの安全な取得
Set doc = Visio.ActiveDocument
‘ 2. タイムスタンプ生成 (YYYYMMDD_HHMM形式)
‘ Format関数はロケール依存を考慮して安定した文字列を生成
timestamp = Format(Now, “yyyymmdd_hhmm”)
‘ 3. ファイル名の構築(拡張子を除去し、タイムスタンプを付与)
‘ 左記はファイル名取得のロジック。拡張子(.vsdx)を分離する
fileName = Left(doc.Name, InStrRev(doc.Name, “.”) – 1) & “_” & timestamp & “.pdf”
‘ 保存パスの指定(現在のドキュメントと同じフォルダへ)
targetPath = doc.Path & fileName
‘ 4. PDF出力の実行
‘ VisioのExportメソッドは、フィルタIDとして 11 を指定することでPDF出力となる
On Error GoTo ErrorHandler
doc.ExportAsFixedFormat visFixedFormatPDF, targetPath, visDocFromAllPages
MsgBox “PDF出力完了: ” & fileName, vbInformation
CleanUp:
‘ 5. オブジェクトの明示的解放(メモリ管理の鉄則)
Set doc = Nothing
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
3. シニアエンジニアが意識すべき「現場の罠」
パス区切り文字の安全な取得
`doc.Path` は、ファイルが一度も保存されていない場合(新規作成直後)、空の文字列を返す。この場合、デスクトップや特定のログディレクトリへ強制的にリダイレクトするロジックを組み込むのが、システム管理者としての矜持だ。
ファイル名の不正文字(Illegal Characters)
Windows APIレベルでは、ファイル名に `:` や “ などの予約文字は含まれない。しかし、ユーザーが図面名にこれらを含めた場合、`InStrRev`でパスを取得しようとしてクラッシュする。実運用では、保存前にファイル名のクリーニング関数(正規表現などで制御)を通すのが「伝説的なコード」の条件となる。
システム連携への拡張性
このコードをベースに、`FileSystemObject` (FDO) を追加すれば、出力したPDFを自動的に社内共有サーバー(UNCパス)へ転送したり、出力ログをCSVに書き出し、版管理台帳を自動生成することも容易だ。
4. まとめ:コードは書くものではなく「守る」もの
今回紹介した手法は、Visio APIのごく一部に過ぎないが、この「オブジェクトを握りしめない(=使い終わったら即座に解放する)」「異常系を想定する」という姿勢こそが、大規模なVisio自動化システムを安定稼働させる秘訣である。
初心者のうちは動くことが正義だが、中堅から先は「いかに壊れないか」が正義となる。君たちが明日書くコードが、数年後の自分やチームメイトを救う資産となることを期待している。
もし君の現場でVisioのプロセスがタスクマネージャーに残り続けているなら、それはコードの解放漏れが原因だ。今すぐ見直すべきだ。
