【テクニカル・上級編】【中級者】容量の大きいPPTXファイルを、挿入された画像を圧縮しながら別名で保存してファイルサイズを軽量化するマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

PowerPointの「肥大化」をVBAで制圧する:画像圧縮とメモリ管理の極致

現場のシニアエンジニア諸君。数GBに膨れ上がったプレゼンテーションファイルを開き、メモリリークの警告と格闘しながら、手作業で画像を圧縮して保存する……そんな泥臭い作業に時間を割くのは、今日で終わりにしよう。

PowerPointのファイルサイズを増大させる主犯は、往々にして「解像度を意識せず挿入された巨大なビットマップ」だ。VBAから`CommandBars.ExecuteMso`を叩く手法は一見古臭く見えるが、これこそがMS Officeのブラックボックスを安全かつ最小コストで操作する唯一の「正攻法」である。

今回は、単なるコードの羅列ではなく、システム稼働時の安定性を担保するための「メモリ解放」と「非同期的なプロセス制御」に焦点を当てる。

—

1. なぜ「ExecuteMso」なのか

多くの開発者が`Shape.PictureFormat.IncrementBrightness`のようなプロパティで画像をいじろうとするが、それは道筋が違う。画像圧縮という重い処理は、Officeの内部エンジン(Mso)に委ねるのが最も堅牢だ。

`CommandBars.ExecuteMso`は、UI上のボタンをクリックする挙動をエミュレートする。これにより、Officeが内部で持っている最適化アルゴリズムを直接呼び出せるため、カスタムロジックで画像処理を行うよりも遥かに高速で、かつ品質が保証される。

2. 実装の核心:画像圧縮・軽量化マクロ

このコードは、ファイルを開き、画像圧縮コマンドを強制実行し、別名で保存して即座に閉じる。ここで重要なのは「実行後の状態を待機する設計」だ。

‘ ————————————————————————–
‘ 権威あるアーキテクチャによる軽量化処理
‘ ————————————————————————–
Sub CompressAndSavePresentation(ByVal sourcePath As String, ByVal destPath As String)
Dim pptApp As Object
Dim pres As Presentation

‘ 1. インスタンスの制御(新規プロセスで隔離するのが安全)
Set pptApp = CreateObject(“PowerPoint.Application”)
Set pres = pptApp.Presentations.Open(sourcePath, WithWindow:=msoFalse)

‘ 2. コマンド実行(画像圧縮ダイアログを呼び出し、実行をトリガー)
‘ ※注意: このコマンドはUI依存のため、実行時にアクティブなウィンドウが必要な場合がある
‘ 隠しプロセスで行う場合は、画面描画を適宜制御すること
On Error Resume Next
pptApp.CommandBars.ExecuteMso “PicturesCompress”
On Error GoTo 0

‘ 3. 別名で保存(ppSaveAsOpenXMLPresentation = 12)
‘ ファイルサイズを最小化するため、圧縮後の保存は必須
pres.SaveAs destPath, 12

‘ 4. オブジェクトの完全解放
‘ メモリリークを許さないのがシニアの流儀
pres.Close
pptApp.Quit

Set pres = Nothing
Set pptApp = Nothing

Debug.Print “軽量化完了: ” & destPath
End Sub

3. シニアエンジニアが意識すべき「隠れた地雷」

メモリ解放の鉄則

VBAにおいて`Set obj = Nothing`を怠ることは、大規模なバッチ処理において自殺行為に等しい。特に`PowerPoint.Application`を何度も再利用するようなシステム設計では、メモリの断片化が即座にパフォーマンス低下に直結する。

圧縮品質のコントロール

`ExecuteMso “PicturesCompress”`を呼び出すと、環境によってはデフォルトのダイアログが表示されることがある。これを回避し、完全に自動化したい場合は、「Windows APIによるメッセージボックスの自動応答」を組み合わせる必要がある。`FindWindow`と`SendMessage`を使い、開いたダイアログの「OK」ボタンをプログラム側から押下するのだ。

競合のリスク(ファイルロック)

大量のファイルを一括変換する場合、ファイルシステム上のロックが問題になる。`DoEvents`を適切に挟み、OS側のファイル書き込みバッファが落ち着くのを待つ「遊び」の設計を忘れてはならない。

4. 運用の極意

このスクリプトを、社内のファイルサーバー上の重い資料を定期的にクリーンアップするタスクスケジューラとして組み込んでほしい。

  • ログ出力: 変換前後のファイルサイズを`Scripting.FileSystemObject`で取得し、CSVに記録する。
  • エラーハンドリング: 破損ファイルが混入していた場合の無限ループを防ぐため、`On Error GoTo`を適切に配置する。

最後に:ツールに支配されるな

VBAは、現代の言語から見ればレガシーかもしれない。しかし、ExcelやPowerPointという「組織のインフラ」を直接制御できる権限は、他のどの言語にもない強力な武器だ。

このコードをそのまま使うのもいいが、自分の手元にある環境でどこがボトルネックになっているか、タスクマネージャーを観察しながらチューニングを繰り返してほしい。技術の本質は、常に「環境を掌握すること」にある。

健闘を祈る。

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