プレゼンテーションの自動化を「暴力」から「調律」へ。CPU監視による動的スロットリングの実装
こんにちは。業務自動化の深淵へようこそ。
皆さんは、大量のPowerPointファイルをPDFに一括変換する際、PCがフリーズして他の操作が一切できなくなった経験はありませんか?あれは、PowerPointがOSのリソースを「奪い尽くしている」状態です。
「マクロの記録」で生成されたコードは、いわば「アクセル全開で壁に向かって走る車」です。今回は、WindowsのWMI(Windows Management Instrumentation)というOSの心臓部に直接アクセスし、マシンの負荷状況を常に監視しながら、過負荷時には自動的に処理を一時停止(スロットリング)する、プロ仕様の堅牢なアーキテクチャを伝授します。
—
なぜ「待機」が必要なのか?
PowerPointのCOMオブジェクトを操作して `ExportAsFixedFormat` を叩くと、OSは瞬時にCPUとメモリを食いつぶします。特に仮想デスクトップ(VDI)環境では、この「リソースの暴力」が他のユーザーの業務を阻害し、管理者から警告を受ける原因となります。
私たちが作るべきは、「自分の負荷を自覚し、状況に応じて自制するプログラム」です。
—
極限のアーキテクチャ:WMIによる監視と制御
今回使用するのは `SWbemServices` です。これはVBAからOSのパフォーマンスカウンターを覗き見るための窓口です。
実装コード:安全なバッチ処理のテンプレート
以下のコードを標準モジュールに貼り付けてください。
Option Explicit
‘ メイン処理:フォルダ内のPPTXをPDFに変換(負荷制御付き)
Sub BatchExportPDF_With_Throttling()
Dim pptApp As Object: Set pptApp = Application
Dim folderPath As String: folderPath = “C:\Your\Path\To\PPTX\”
Dim fileName As String: fileName = Dir(folderPath & “.pptx”)
Do While fileName <> “”
‘ 1. 負荷チェック:CPU使用率が80%を超えていたら待機
Do While GetCpuLoad() > 80
Debug.Print “高負荷検知:待機中…”
DoEvents ‘ OSに処理権を渡してフリーズを回避
Sleep 2000 ‘ 2秒間一時停止
Loop
‘ 2. 変換処理
Dim pptPres As Presentation
Set pptPres = pptApp.Presentations.Open(folderPath & fileName, , , msoFalse)
pptPres.ExportAsFixedFormat folderPath & Replace(fileName, “.pptx”, “.pdf”), 2
pptPres.Close
fileName = Dir
Loop
End Sub
‘ WMIを利用してCPU負荷を取得する関数
Function GetCpuLoad() As Double
Dim wmi As Object, cpuSet As Object, cpu As Object
Set wmi = GetObject(“winmgmts:\\.\root\cimv2”)
‘ Win32_Processor から負荷率を取得
Set cpuSet = wmi.ExecQuery(“SELECT LoadPercentage FROM Win32_Processor”)
For Each cpu In cpuSet
GetCpuLoad = cpu.LoadPercentage
Exit For
Next
End Function
‘ 待機用API宣言
If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If
—
コードの核心を解剖する
1. `DoEvents` の魔法
VBAで重い処理を行うと、PowerPointの画面が「応答なし」になりがちです。`DoEvents` をループ内に挟むことで、OS側が「ユーザーからの操作や描画の更新」を処理する隙間を作ります。これが「堅牢さ」の第一歩です。
2. `WMI` というOSの監視窓
`winmgmts:\\.\root\cimv2` という文字列は、Windowsが持っている管理情報のデータベースへのアクセスキーです。ここから `Win32_Processor`(CPU)の情報を引き抜くことで、PCが今どれだけ「苦しんでいるか」を数値化します。
3. `Sleep` によるスロットリング
闇雲に処理を急ぐのではなく、CPU負荷が80%を超えたら「休憩」を入れる。この「間(ま)」を作ることで、他の業務アプリを動かしながらバックグラウンドで安全に処理を完遂させることができます。
—
陥りやすいエラーと対策
- 「オートメーションエラー」が出る場合:
PowerPointをバックグラウンドで開く際、`msoFalse` (表示しない) を指定していますが、まれに読み込みが間に合わずエラーになります。`DoEvents` を挟むか、読み込み後に少し `Sleep` を入れると安定します。
- 権限エラー:
WMIへのアクセスには、PowerPoint自体を「管理者として実行」する必要がある場合があります。社内環境で制限がある場合は、IT部門と相談してください。
—
最後に:エンジニアとしての矜持
コードを書くことは、単に動くものを作ることではありません。「実行される環境の健康を保つこと」まで配慮して初めて、それはプロの仕事と言えます。
今回紹介した「監視+自制」のパターンは、PDF変換だけでなく、Excelの大量データ処理やAPI連携など、あらゆるVBA自動化に応用可能です。ぜひあなたのツールボックスに加え、よりスマートで、より「気遣いのできる」自動化エンジニアを目指してください。
ここをクリアしたあなたなら、もう中級者への道はすぐそこです。応援しています!
