【実務・中級編】【上級者】マルチスレッド風処理を実現するため、複数のPowerPointバックグラウンドプロセスをVBAから非同期で立ち上げ、大量のPPTXを並列でPDF変換する超高速化エンジン – PowerPoint VBA解析バイブル

スポンサーリンク

PowerPoint VBAの限界を超えろ:マルチプロセス並列PDF変換エンジンの実装

VBAで数百のプレゼンテーションをPDF化しようとして、プログレスバーを眺めながらコーヒーを飲みに行くのは今日で終わりにしよう。

PowerPointのVBAはシングルスレッドだ。どんなにコードを最適化しても、CPUの1コアしか使わない。だが、我々のマシンにはマルチコアCPUが搭載されている。これを使わない手はない。

今回は、WSH(Windows Script Host)を活用し、バックグラウンドで複数のPowerPointインスタンスを並列起動し、CPUリソースを限界まで叩き出す「並列PDF変換エンジン」のアーキテクチャを伝授する。

—

なぜ「マルチスレッド」ではなく「マルチプロセス」なのか

VBA自体はスレッドセーフではない。同一プロセス内でマルチスレッド化を試みるのは、メモリ破壊とクラッシュの入り口だ。

そこで我々が採るべき戦略は「プロセス・アイソレーション」である。
PowerPointを個別のプロセスとして複数立ち上げ、それぞれにタスクを割り振る。これならメモリ空間は完全に分離され、片方のインスタンスが重い処理でハングしても、他の処理は止まらない。これが業務自動化における最強の生存戦略だ。

—

並列PDF変換エンジンの設計指針

堅牢なツールを作るために、以下の3つの鉄則を守る。

1. 死活監視(Heartbeat): 起動したプロセスがゾンビ化していないか、終了コードを監視する。
2. キューイング: ファイルリストをリスト化し、各プロセスが「次」を奪い合う形式にする。
3. リソース制限: CPU全開によるフリーズを防ぐため、物理コア数に合わせて同時起動数を制御する。

—

プロダクションコード:並列変換コントローラー

このスクリプトは、メインのVBAから呼び出し、別プロセス(VBScript経由)で変換処理を実行する設計だ。

1. 変換実行用エンジン(Worker.vbsとして保存)

このコードは個別のPowerPointインスタンスを操る「兵士」となる。

‘ Worker.vbs
Dim pptApp, pptPres
Set args = WScript.Arguments
inputPath = args(0)
outputPath = args(1)

Set pptApp = CreateObject(“PowerPoint.Application”)
‘ 非表示で実行
Set pptPres = pptApp.Presentations.Open(inputPath, , , False)

‘ PDF変換(非同期処理の核心)
pptPres.SaveAs outputPath, 32 ‘ 32 = ppSaveAsPDF
pptPres.Close
pptApp.Quit

Set pptPres = Nothing
Set pptApp = Nothing

2. メイン制御スクリプト(VBA側)

このエンジンを管理・起動する司令塔だ。

Sub ParallelExportPDF()
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim shell As Object: Set shell = CreateObject(“WScript.Shell”)
Dim fileList As Variant, fileItem As Variant
Dim maxProcesses As Integer: maxProcesses = 4 ‘ CPU負荷を見て調整

‘ 変換対象フォルダ(実務に合わせて変更)
Dim sourceFolder As String: sourceFolder = “C:\Reports\Source\”
Dim targetFolder As String: targetFolder = “C:\Reports\PDF\”

fileList = GetFileList(sourceFolder) ‘ ファイルリスト取得関数は別途定義

Dim i As Integer: i = 0
For Each fileItem In fileList
‘ WScriptで非同期起動(WaitOnReturnをFalseに設定)
Dim cmd As String
cmd = “wscript.exe “”C:\Scripts\Worker.vbs”” “”” & fileItem & “”” “”” & targetFolder & fso.GetBaseName(fileItem) & “.pdf”””

shell.Run cmd, 0, False

‘ 同時起動数を制御
i = i + 1
If i >= maxProcesses Then
MsgBox “バッチ処理開始。バックグラウンドで変換中…”
Exit Sub
End If
Next
End Sub

—

実務で突き当たる壁と解決策

Q. 「PowerPointが背後で詰まって消えない」ときは?

多くのエンジニアがここで挫折する。PowerPointのCOMオブジェクトは、エラーが起きるとプロセスが残り続ける。
対策として、「Process ID(PID)を管理し、タイムアウト時には `taskkill /pid [PID] /f` で強制終了させる」ロジックを必ず組み込め。

Q. データベースとの連携は?

大量のファイルを処理する場合、進捗状況をExcelやDBにログとして書き出す必要がある。
ただし、ファイル書き込みの競合には注意が必要だ。複数のプロセスから同時にログファイルへ書き込もうとすると確実にロックエラーが起きる。ログ収集は、メインスレッド側で「監視用のキュー」を作るか、ファイル名にPIDを含めることで書き込み先を分離する設計がスマートだ。

—

最後に:エンジニアとしての矜持

このアーキテクチャの真の価値は、ただ速いことではない。「失敗を許容できる構造」にある。
万が一、1つのファイルが破損していて変換に失敗しても、他のファイルまで連鎖的に止まることはない。

VBAは古臭い言語だと言われることもある。だが、OSの機能を呼び出し、COMを掌握し、リソースを限界までコントロールする力を持つ者にとって、それは「最強のOS操作ツール」に他ならない。

さあ、コードを書き換え、あなたのマシンのパワーを解放せよ。健闘を祈る。

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