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という巨大な図面生成エンジンを、あなたの意のままに、安定して動かし続けてください。この「メモリを制する」技術を身につければ、あなたはもう、ただの事務作業員ではなく、立派な業務自動化エンジニアです。
何か不明な点があれば、いつでも聞いてください。コードは裏切りませんが、メモリは時々裏切ります。その裏切りを封じ込める知恵を、これからも共に磨いていきましょう。
