【極限の自動化】PowerPoint VBAの限界を突破せよ!数百ファイルを並列処理で爆速PDF変換するアーキテクチャ
こんにちは。自動化の現場で血と汗を流してきた皆さんに、今日は少し「禁断のテクニック」をお話ししましょう。
PowerPoint VBAで数百枚のプレゼンをPDF化しようとして、プログレスバーを眺めながら「なぜこんなに遅いんだ…」と絶望したことはありませんか?実は、VBA単体では「シングルスレッド」という呪縛から逃れられません。CPUがどんなに高性能でも、VBAは一つのコアしか使わないのです。
今日は、この呪縛を解き放ち、OSレベルのマルチプロセス制御によってCPUの全コアをフル稼働させる、エンタープライズ級のバッチ処理基盤を構築する方法を伝授します。
—
なぜVBAだけではダメなのか?
PowerPoint VBAは、あくまで「PowerPointアプリの中で動く命令」です。そのため、100個のファイルを処理する際、順番に1つずつ処理を完了させる「直列処理」しかできません。
- 直列処理の弱点: 1ファイルに10秒かかるなら、100ファイルで1,000秒(約17分)の拘束。
- 並列処理の極意: 8コアCPUなら、8つのプロセスを同時に走らせることで、理論上は約2分強で完了します。
これを実現するために、「VBScript(管理役)」が複数の「PowerPointインスタンス(労働者)」を指揮するというアーキテクチャを採用します。
—
構築の設計図:並列処理基盤
このシステムは以下の二段構成で動かします。
1. 司令塔(VBScript): 全ファイルを分割し、CPUのコア数分だけPowerPointプロセスを立ち上げる。
2. 労働者(VBA): 受け取ったファイルリストを黙々とPDF化する。
ステップ1:司令塔となるVBScript(`BatchLauncher.vbs`)
このスクリプトが、Windowsの力を借りて並列処理を制御します。
‘ 並列処理の司令塔:BatchLauncher.vbs
Dim WshShell, fso, folderPath
Set WshShell = CreateObject(“WScript.Shell”)
Set fso = CreateObject(“Scripting.FileSystemObject”)
folderPath = “C:\TargetFiles” ‘ 対象フォルダ
‘ ファイルリストを配列化し、コア数で分割してコマンド実行
‘ ここでは簡易的に「ファイル1つにつき1プロセス」を立ち上げる例
Set folder = fso.GetFolder(folderPath)
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “pptx” Then
‘ PowerPointを非表示(/e)かつマクロ有効で起動し、引数を渡す
WshShell.Run “powerpnt.exe /macro “”ProcessFile “”” & file.Path & “”””””
End If
Next
ステップ2:労働者となるPowerPoint VBA
次に、呼び出される側のVBAコードです。これは標準モジュールに記述します。
‘ 労働者のVBAコード
Sub ProcessFile(filePath As String)
Dim pptApp As Presentation
On Error Resume Next
‘ ファイルを開く
Set pptApp = Presentations.Open(filePath, WithWindow:=msoFalse)
‘ PDFエクスポート(ここに最適化の肝がある)
pptApp.ExportAsFixedFormat _
Path:=Replace(filePath, “.pptx”, “.pdf”), _
FixedFormatType:=ppFixedFormatTypePDF
‘ 即座に閉じてメモリを解放(重要!)
pptApp.Close
‘ 処理が終わったら自分自身を閉じる
If Presentations.Count = 0 Then Application.Quit
End Sub
—
このアーキテクチャの「真髄」:注意すべき3つの罠
ここまで読んだあなたは、もうただの初心者ではありません。現場で必ず遭遇する「壁」と、その回避策を共有します。
1. メモリリークとの戦い
`Application.Quit` を忘れると、バックグラウンドに「ゾンビ化したPowerPoint」が溜まり続け、PCが重くなります。必ず `Set pptApp = Nothing` まで行い、メモリを確実に解放してください。
2. ファイルアクセスの競合
複数のプロセスが同時に同じフォルダに書き込もうとすると、時折「ファイルが使用中です」というエラーが出ます。出力先フォルダを処理ごとに分けるか、排他制御(ファイルが存在するか確認するループ)を実装するのがプロの流儀です。
3. CPUの焼き付き防止
数百ファイルある場合、全ファイルを一度に起動するとCPU使用率が100%に張り付き、PCがフリーズします。実運用では、「同時に走らせるプロセス数を4〜8程度に制限する」というキューイング処理をVBScript側に加えることを強く推奨します。
—
まとめ:自動化の先にある景色
今回ご紹介した手法は、単なる「効率化」を超えた「インフラエンジニアリングに近いVBA」です。
VBAは、工夫次第でOSを動かす強力なツールになります。まずは数個のファイルで実験し、徐々に並列数を増やしてみてください。処理が終わった瞬間の「あの爆速感」を一度味わえば、もう元の直列処理には戻れないはずです。
「ここが動かない!」「もっと高度なキューイングが知りたい!」といった悩みがあれば、いつでも相談してください。あなたの自動化の旅を、これからも全力でサポートします。
さあ、今日はこのコードを叩いて、定時退社を勝ち取りましょう!
