【入門編】【上級者】マルチプロセス・マルチスレッドの概念をVBAとVBScriptの連携で擬似的に実現し、複数コアをフル活用して数百ファイルのPPTXを並列かつ高速にPDF化・クラウド同期する超大型バッチ処理基盤 – PowerPoint VBA解析バイブル

スポンサーリンク

【極限の自動化】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を動かす強力なツールになります。まずは数個のファイルで実験し、徐々に並列数を増やしてみてください。処理が終わった瞬間の「あの爆速感」を一度味わえば、もう元の直列処理には戻れないはずです。

「ここが動かない!」「もっと高度なキューイングが知りたい!」といった悩みがあれば、いつでも相談してください。あなたの自動化の旅を、これからも全力でサポートします。

さあ、今日はこのコードを叩いて、定時退社を勝ち取りましょう!

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