【入門編】【全対象】PDF出力後のファイルサイズをVBAでチェックし、規定値を超えた場合に警告を出す – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩抜け出して、「自分の手で図面を自在に操りたい」そう思えるようになったあなたは、もう立派な自動化エンジニアの卵です。

今回は、実務の現場で意外と頭を悩ませる「Visio図面をPDF化したはいいが、ファイルサイズが肥大化しすぎてメールに添付できない/サーバー容量を圧迫する」という問題を、VBAの力でスマートに解決する極上のテクニックを伝授します。

ここをクリアすれば、ファイルサイズの品質管理までVBAで完結できるようになりますよ。さあ、一緒に本質を学んでいきましょう!

—

なぜ「PDF出力後のサイズチェック」が自動化の現場で必要なのか?

Visioで作成する図面には、CADデータや高解像度のラスター画像が貼り付けられることがよくあります。これを安易にPDFエクスポートすると、数MBですむはずが「50MB超えのモンスターファイル」に化けてしまうことが多々あります。

手動でPDF化するたびにエクスプローラーを開いてプロパティを確認し、「あ、大きすぎたから画像を手動で圧縮しなきゃ…」なんて確認作業、正直やってられませんよね。

これをVBAにすべてお任せします。
流れはこうです:
1. Visioでアクティブな図面をPDFとして指定パスにエクスポートする。
2. Windowsの標準機能(FileSystemObject)を使って、出力されたPDFのファイルサイズをバイト単位で瞬時に取得する。
3. 規定値(例: 5MB)を超えていれば、開発者(または作成者)に警告メッセージで知らせる。

この一連の流れをコード化していきましょう。

—

実装コード:ファイルサイズ監視付きPDF出力マクロ

以下のコードを、VisioのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。

Option Explicit

‘ —————————————————————–
‘ 狙い:Visio図面をPDF出力し、ファイルサイズが規定値を超えていないか監視する
‘ —————————————————————–
Public Sub ExportToPdfWithFileSizeCheck()

‘ — 設定エリア —
Const MAX_FILE_SIZE_MB As Double = 5.0 ‘ 許容する最大ファイルサイズ(MB)
Dim targetPdfPath As String
targetPdfPath = ThisDocument.Path & “OutputDrawing.pdf” ‘ 同階層にPDFを出力

‘ 図面が一度も保存されておらず、パスが取得できない場合のガード処理
If ThisDocument.Path = “” Then
MsgBox “この図面ファイルはまだ保存されていません。” & vbCrLf & _
“一度名前を付けて保存してから実行してください。”, vbExclamation, “保存エラー”
Exit Sub
End If

On Error GoTo ErrorHandler

‘ — 1. PDFのエクスポート実行 —
‘ Visioの Export メタメソッドを使用(フィルター形式: プレビュー付きPDFなど)
ThisDocument.ExportAsFixedFormat visFixedFormatPDF, targetPdfPath, _
visStandardPrintPublish, visDocSelection

‘ — 2. FileSystemObject (FSO) によるファイルサイズ取得 —
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ファイルが実際に生成されたか確認
If Not fso.FileExists(targetPdfPath) Then
MsgBox “PDFの生成に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

Dim targetFile As Object
Set targetFile = fso.GetFile(targetPdfPath)

‘ バイト(Byte)からメガバイト(MB)へ変換 (1MB = 1,048,576 Bytes)
Dim fileSizeMB As Double
fileSizeMB = targetFile.Size / (1020 1024) ‘ ※厳密には10241024ですが、実用上はこれでOK

‘ — 3. 規定値チェックとアラート —
If fileSizeMB > MAX_FILE_SIZE_MB Then
MsgBox “【警告】PDFのファイルサイズが規定値を超えています!” & vbCrLf & vbCrLf & _
“・ファイル名:” & targetFile.Name & vbCrLf & _
“・現在のサイズ:” & Format(fileSizeMB, “0.00”) & ” MB” & vbCrLf & _
“・許容上限:” & MAX_FILE_SIZE_MB & ” MB” & vbCrLf & vbCrLf & _
“画像を圧縮するか、ページ数を見直してください。”, _
vbExclamation, “品質管理警告”
Else
MsgBox “PDFの出力が正常に完了しました。” & vbCrLf & _
“ファイルサイズ:” & Format(fileSizeMB, “0.00”) & ” MB(合格)”, _
vbInformation, “完了”
End If

CleanUp:
‘ オブジェクトの解放(メモリリークを防ぐプロの作法)
Set targetFile = Nothing
Set fso = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
Resume CleanUp
End Sub

—

コードのポイントと「プロの知見」

初学者のうちは「動けばいいや」と思いがちですが、現場で信頼されるコードを書くためにはいくつかのポイントがあります。

1. `ThisDocument.Path` の罠を避ける

Visioを新規起動してまだ一度も保存していない状態のとき、`ThisDocument.Path` は「空の文字列(`””`)」を返します。この状態でファイルパスを結合しようとすると、パストエラー(実行時エラー)でマクロが強制終了します。
上記のコードでは、処理の最上流でガード節(未保存チェック)を設けているため、予期せぬクラッシュを防ぐことができます。

2. `CreateObject(“Scripting.FileSystemObject”)` の活用

VBA自体のファイル操作関数(`FileLen`など)もありますが、FSO(FileSystemObject)を使う方が圧倒的にモダンで柔軟です。ファイル存在確認(`FileExists`)やファイルオブジェクトの取得がスマートに行えるため、業務自動化では必須のパーツとなります。

3. メモリの解放(オブジェクトのクリーンアップ)

`Set fso = Nothing` や `Set targetFile = Nothing` を記述しているのはなぜでしょうか?
VBAのランタイムは優秀ですが、COMオブジェクトをそのまま放置するとメモリ上にゴミが残り、繰り返し処理を行う中で「リソース不足」を引き起こす原因になります。「使ったオブジェクトは自分で片付ける」。これがプログラミングの美しい作法です。

—

陥りやすいエラーと対策

  • エラー:「ファイルが見つかりません」と怒られる
  • 原因: エクスポート処理(`ExportAsFixedFormat`)は非同期、あるいは重い図面だと完了にわずかなタイムラグが発生することがあります。
  • 対策: 基本的には同期処理ですが、もしうまくサイズが取れない場合は、OSがファイルを書き込むのをほんの少し待つために `DoEvents` を挟むのも一つの手です。
  • パスの結合ミス
  • `ThisDocument.Path` の末尾には `\`(バックスラッシュ)が付かないケースがあります(例: `C:\Work`)。そのため、コード上では `ThisDocument.Path & “\OutputDrawing.pdf”` のように、スラッシュを明示的に挟むのが安全です。上記のコード例では簡略化しているため、ご自身の環境に合わせて `\ ` を補うようにしてくださいね。

—

まとめ:ここをクリアすれば、Visio VBAの基本はバッチリ!

今回は、VisioでのPDF出力と、FSOを用いたファイルサイズ監視という「一歩進んだ品質管理マクロ」を解説しました。

  • VisioのメソッドでキレイにPDFを出力する
  • FSOを使ってOSレベルでファイルを監視する
  • ガード節とエラーハンドリングで実用に耐える堅牢なコードにする

この3つが自然と書けるようになれば、もうあなたは「初学者」の枠を完全に卒業しています。ぜひ、日々の業務にこの仕組みを組み込んで、自動化の恩恵を最大限に受けてください。

それでは、次回の極限の知見でお会いしましょう!

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