Visio自動化の極意:なぜ「ファイル名の固定」が地獄を招くのか?
業務効率化を目指すエンジニアの諸君。Visioで図面を作成し、PDF化する……この単純なルーチンを何百回と繰り返していないか?
特に危険なのが「手動でファイル名をリネームする」という原始的な行為だ。ファイル名に日時を打ち込む作業は、ヒューマンエラーの温床であり、版管理を崩壊させる第一歩である。
今回は、Visio VBAを用いて「現在の日時」をファイル名に自動付与し、かつ堅牢なエラーハンドリングを実装した「プロのPDF出力ロジック」を伝授する。これは単なるコードの提供ではない。「二度とファイル管理で迷わない」ための設計思想だ。
—
1. なぜ「Format関数」が最強なのか
日時をファイル名にする際、多くの初心者は `Replace` や `Mid` を駆使して文字列を切り貼りする。断言する。それは非効率だ。
VBAには `Format` 関数がある。これを使えば、日付や時間を任意の文字列パターンに変換できる。
‘ 推奨される命名規則:YYYYMMDD_HHMMSS
Dim timeStr As String
timeStr = Format(Now, “yyyymmdd_hhnnss”) ‘ 注意:分は “nn” である。VBAで “mm” は月を指す
なぜ “nn” なのか? VBAの内部仕様では、`mm` は「月(Month)」を意味し、分(Minute)を表現するには `nn` を使う必要があるからだ。この基本を知らないだけで、君のコードはバグを量産する。
—
2. 堅牢なPDF出力の実装コード
単に「保存するだけ」のコードは素人だ。業務環境では「ディレクトリの存在確認」「同名ファイルの上書き防止」「Visio固有のExportメソッドの癖」を考慮しなければならない。
以下のコードをモジュールに貼り付けてほしい。
Option Explicit
Public Sub ExportPdfWithTimestamp()
Dim doc As Visio.Document
Dim folderPath As String
Dim fileName As String
Dim fullPath As String
‘ 1. 対象ドキュメントの特定
Set doc = ActiveDocument
‘ 2. 保存先パスの設定(デスクトップの”Export”フォルダを想定)
folderPath = Environ(“USERPROFILE”) & “\Desktop\Export\”
‘ フォルダが存在しなければ作成する(堅牢性の担保)
If Dir(folderPath, vbDirectory) = “” Then
MkDir folderPath
End If
‘ 3. ファイル名の生成(命名規則:元ファイル名_YYYYMMDD_HHMMSS.pdf)
fileName = Left(doc.Name, InStrRev(doc.Name, “.”) – 1) & _
“_” & Format(Now, “yyyymmdd_hhnnss”) & “.pdf”
fullPath = folderPath & fileName
‘ 4. PDF出力の実行
‘ 固定パス・静的ファイル名で上書きするリスクを回避
On Error GoTo ErrorHandler
doc.ExportAsFixedFormat visFixedFormatPDF, fullPath
MsgBox “PDF出力が完了しました:” & vbCrLf & fullPath, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました:” & Err.Description, vbCritical
End Sub
—
3. 実務で「刺されない」ための設計上の注意点
このコードをプロダクション環境(本番運用)に載せる際、以下の3点を意識してほしい。
① パスの完全修飾
相対パスは絶対に使用するな。コードを実行するカレントディレクトリは、ユーザーの操作によっていとも簡単に書き換わる。`Environ(“USERPROFILE”)` や `ThisDocument.Path` を使い、常に「絶対的な場所」を特定する癖をつけること。
② エラーハンドリングの重要性
`On Error GoTo` は、単なるおまじないではない。PDF出力中に「ファイルが他のアプリで開かれている」「保存先フォルダに書き込み権限がない」といった事態は確実に起こる。コードが沈黙(サイレントフリーズ)するのが最悪の事態だ。必ずエラーの内容をユーザーに通知する設計にせよ。
③ 命名規則の標準化
チームで開発するなら、この命名規則(`YYYYMMDD_HHMMSS`)をプロジェクトの規約にしろ。このフォーマットは、OSのファイルエクスプローラー上で「名前順」にソートした際に、必ず時系列順に並ぶという極めて高い実用性を持つ。
—
結びに代えて
自動化とは、単にコードを書くことではない。「将来の自分やチームが、管理コストに悩まされる未来を消し去ること」である。
今回紹介したコードは、あくまで「最短で動くもの」だ。これに「設定ファイル(JSONやINI)からの出力先指定」や「ログ出力機能」を組み込めば、立派な業務アプリケーションになる。
さあ、退屈な手動管理から自分を解放し、コードで未来を設計せよ。君のエンジニアリングが、組織の生産性を変える。
