Visio自動化の極意:全図面のページ数を網羅し、PDF出力の「事故」を未然に防ぐ堅牢なログ戦略
業務でVisioを扱う諸君、ご苦労様。
「開いている図面が多すぎて、どれをPDF化したか分からなくなった」「ページ数の不一致で検収時に手戻りが発生した」……そんな初歩的なミスで時間を浪費していないか?
Visioの自動化において、最も軽視されがちなのが「状態の監視」だ。今回は、ただページ数を数えるだけではない。本番環境で通用する、堅牢かつ保守性の高いログ出力ロジックを伝授する。
—
1. なぜ「手作業の確認」は失敗するのか
多くの初心者は、`Application.Documents`を漫然とループさせるだけで満足する。だが、プロの現場では以下のリスクを考慮せねばならない。
- Ghost Documentの存在: 見えないバックグラウンドプロセスが残っている場合。
- ファイルパスの欠如: 保存されていない(名前未設定の)図面をどう扱うか。
- 例外処理の欠落: 巨大な図面を開いた際のメモリ不足や、読み取り専用のファイルへのアクセス制限。
我々は「動くコード」ではなく、「止まらないコード」を書く必要がある。
—
2. 実践:ページ数カウント&ログ出力のアーキテクチャ
今回のコードは、以下の設計思想に基づいている。
1. 疎結合なログ出力: ファイルシステムへの書き込みを関数化し、将来的なDB連携にも対応可能にする。
2. 型定義の明確化: オブジェクトを直接操作せず、プロパティをキャッシュして高速化を図る。
3. 例外ハンドリング: 万が一のファイルアクセスエラーを握りつぶさず、ログに記録する。
プロダクションコード例
このコードを標準モジュールに貼り付けてくれ。
Option Explicit
‘ — 設定値 —
Private Const LOG_FILE_PATH As String = “C:\Temp\Visio_Export_Log.txt”
”’
”’
Public Sub ExportPageCountLog()
Dim doc As Visio.Document
Dim logContent As String
Dim fso As Object
Dim ts As Object
‘ ファイルシステムオブジェクトの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ログ内容のヘッダー生成
logContent = “— Visio Page Count Log: ” & Now & ” —” & vbCrLf
‘ 全図面をループ
For Each doc In Visio.Application.Documents
‘ 隠し図面やテンプレートを除外したい場合はここで制御
If Not doc.FullName = “” Then
logContent = logContent & “File: ” & doc.Name & vbCrLf & _
“Path: ” & doc.FullName & vbCrLf & _
“Pages: ” & doc.Pages.Count & vbCrLf & _
“—————————-” & vbCrLf
End If
Next doc
‘ ファイルへの書き込み(追記モード:8)
On Error Resume Next
Set ts = fso.OpenTextFile(LOG_FILE_PATH, 8, True)
If Err.Number = 0 Then
ts.Write logContent
ts.Close
MsgBox “ログ出力が完了しました。” & vbCrLf & LOG_FILE_PATH, vbInformation
Else
MsgBox “ログの書き込みに失敗しました: ” & Err.Description, vbCritical
End If
On Error GoTo 0
‘ クリーンアップ
Set ts = Nothing
Set fso = Nothing
End Sub
—
3. コードの解説:なぜこの書き方が「正解」なのか
① `For Each` と `FullName` のチェック
`For Each doc In Documents` はVisioオブジェクトモデルの基本だが、ここで重要なのは「保存されていない図面(FullNameが空)」をどう扱うかだ。保存されていない図面はログ出力の対象外とするか、エラーを吐かせる設計にすべきだ。今回は安全のために除外するロジックを組み込んでいる。
② ファイルシステムオブジェクト(FSO)の利用
`Print #` ステートメントを用いた古い書き方は捨てろ。FSOを使うことで、文字コードの指定やエラーハンドリングが圧倒的に容易になる。将来的にログをCSV形式に変更してExcelで管理したい場合も、この構成なら即座に対応できる。
③ インメモリでの文字列連結
ループ内で直接ファイルに書き込むのは、I/O負荷が高く非効率だ。一度 `logContent` 変数に溜め込み、最後に一度だけ書き出すことで、パフォーマンスを最適化している。
—
4. さらなる高みへ:PDF出力制御のヒント
このリストを出力した後にPDF変換を行う際は、以下の点に注意せよ。
- `doc.ExportAsFixedFormat` メソッド: これがVisioの公式PDF出力エンジンだ。
- 設定の固定: ページ範囲や品質設定をコード内でハードコーディングせず、定数あるいは設定ファイル(INIやJSON)から読み込む設計にせよ。
最後に:エンジニアの心得
このスクリプトは単なる便利ツールではない。「確認作業という人間の曖昧なプロセスを、ログという客観的なデータに置き換える」という自動化の第一歩だ。
次は、このログファイルをトリガーにして、自動的にPDF生成処理をキックする仕組みを構築してほしい。それができれば、君はVisioのオペレーターから、真の自動化エンジニアへと昇華できるはずだ。
健闘を祈る。何かあればまた聞きに来い。
