【実務・中級編】【初心者向け】開いている全図面のページ数をカウントし、PDF出力前にリスト化してログ保存する – Visio VBA解析バイブル

スポンサーリンク

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のオペレーターから、真の自動化エンジニアへと昇華できるはずだ。

健闘を祈る。何かあればまた聞きに来い。

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