【入門編】【上級者向け】Visioをバックグラウンドで隠蔽起動し、UIを表示せずにPDF変換を行う際の「メモリリーク対策」 – Visio VBA解析バイブル

スポンサーリンク

Visioを「裏方」として使いこなす:メモリリークを撲滅し、PDF変換を完全自動化する極意

こんにちは。現場で「動けばいい」というコードと、「止まらない」コードの境界線を知るエンジニアです。

皆さんはVisioの自動化で、こんな経験はありませんか?
「最初は順調だったのに、10ファイル、20ファイルと処理を続けるうちに、PCが重くなり、ついにはVisioがフリーズする……」

これはVBA初心者から一歩進んだエンジニアが必ずぶつかる壁、「メモリリーク」という悪魔の仕業です。今回は、Visioを裏側(バックグラウンド)で静かに走らせ、大量のPDFを生成する際に、いかにしてメモリをクリーンに保ち続けるか。その「伝説のコード」の核心を伝授します。

—

1. なぜVisioはメモリを食い散らかすのか?

VisioのVBAで `Documents.Open` を繰り返すと、プログラム上は閉じたつもりでも、OSのメモリ空間には「幽霊」のようなオブジェクトが残り続けます。

特にバックグラウンド処理(VisibleプロパティをFalseにする手法)は、UIを表示しない分、「今、裏で何が起きているか」が可視化されません。 その結果、目に見えないところでVisioのプロセスが肥大化し、システム全体のパフォーマンスを食いつぶすのです。

これを解決するための黄金律は、たった一つ。
「Visioアプリケーションそのものを定期的に再起動せよ」 です。

—

2. 破壊的再起動:メモリリーク対策の核心コード

今回は、PDF変換を安全に行うための「プロセス管理クラス」のような役割を持つメイン処理を紹介します。

‘ 【重要】参照設定で “Microsoft Visio x.0 Type Library” を追加してください
Option Explicit

Sub BatchConvertVisioToPDF()
Dim i As Long
Dim fileList As Variant
fileList = Array(“C:\Data\Doc1.vsdx”, “C:\Data\Doc2.vsdx”, “C:\Data\Doc3.vsdx”)

‘ 5ファイルごとにプロセスをリセットする安全設計
Dim batchSize As Integer: batchSize = 5

For i = LBound(fileList) To UBound(fileList)
‘ 節目の処理:メモリ解放のためプロセスを再起動
If i Mod batchSize = 0 Then
Call RestartVisioProcess
End If

‘ PDF変換実行
Call ExportToPDF(fileList(i))
Next i

MsgBox “全処理完了。メモリもクリーンです。”
End Sub

Private Sub ExportToPDF(filePath As String)
Dim appVisio As Visio.Application
Dim doc As Visio.Document

Set appVisio = GetObject(, “Visio.Application”)
Set doc = appVisio.Documents.Open(filePath)

‘ PDF出力(パスは適宜調整してください)
doc.ExportAsFixedFormat visFixedFormatPDF, Replace(filePath, “.vsdx”, “.pdf”)

‘ オブジェクトの明示的破棄
doc.Close
Set doc = Nothing
Set appVisio = Nothing
End Sub

Private Sub RestartVisioProcess()
‘ 既存のVisioプロセスを強制終了してから再起動する(荒療治ですが最も確実)
Shell “taskkill /F /IM visio.exe”, vbHide

‘ 少し待機(OSがプロセスを解放するのを待つ)
Application.Wait (Now + TimeValue(“00:00:02”))

‘ 再起動
Dim app As Object
Set app = CreateObject(“Visio.Application”)
app.Visible = False
End Sub

—

3. このコードが「伝説」である理由

① `Mod` 演算子による計画的パージ

`i Mod 5 = 0` の条件式が光ります。メモリリークが起きる前に、自らプロセスを落とす。これぞ、システムを「壊さない」ための予防保守です。

② 明示的な `Nothing` の代入

VBAはガベージコレクションが弱い言語です。`Set doc = Nothing` を行うことで、「この変数はもう使わない」という意思表示をOSに伝え、メモリの回収を促します。

③ `taskkill` の活用

`Application.Quit` だけでは、VisioのCOMプロセスが残ることが多々あります。コマンドラインから `taskkill` を叩くことで、確実にメモリ空間を更地に戻すことができます。

—

4. 初心者が陥りやすいエラーと回避策

  • 「オートメーションエラー」:

`GetObject` でVisioを捕まえようとした際、まだVisioが起動していないと発生します。`On Error Resume Next` でエラーハンドリングし、捕まえられなければ `CreateObject` で新規生成するロジックを組むのがプロの嗜みです。

  • 「PDF出力がうまくいかない」:

Visioのバージョンによって `ExportAsFixedFormat` の引数が異なる場合があります。必ず対象のVisioのドキュメント(MSDNのリファレンス)を引いて確認する癖をつけましょう。

—

最後に:自動化の先にあるもの

「マクロの記録」で生成されたコードは、いわば「独り言」です。しかし、今日学んだメモリ管理を意識したコードは、システムという大きな器と対話する「エンジニアの言葉」です。

Visioという巨大な図面生成エンジンを、あなたの意のままに、安定して動かし続けてください。この「メモリを制する」技術を身につければ、あなたはもう、ただの事務作業員ではなく、立派な業務自動化エンジニアです。

何か不明な点があれば、いつでも聞いてください。コードは裏切りませんが、メモリは時々裏切ります。その裏切りを封じ込める知恵を、これからも共に磨いていきましょう。

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