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

スポンサーリンク

PowerPoint VBAの「重量級ファイル」を瞬殺する:画像圧縮と最適保存の極意

こんにちは。自動化の深淵へようこそ。
日々、何百枚ものスライドや、数GBに膨れ上がったプレゼンテーションファイルと格闘していませんか?

「ファイルサイズが大きすぎてメールで送れない」「保存するたびにフリーズする」。そんな悩みを抱えるあなたに、今日はPowerPoint VBAでファイルを軽量化し、自動で別名保存する「現場の最適解」を伝授します。

単にコードを動かすだけでなく、なぜその処理が必要なのか。オブジェクトの本質を理解し、あなたの自動化スキルを一段上のステージへ引き上げましょう。

—

1. なぜ、ファイルは重くなるのか?

PowerPointのファイルサイズの大半は「画像」です。ユーザーが何気なく挿入する高解像度の写真は、元のピクセル情報を保持したままファイル内に蓄積されます。

PowerPointには標準で「図の圧縮」機能がありますが、これを手動で毎回行うのは非効率です。VBAを使えば、このプロセスを「コマンドの実行(ExecuteMso)」という形で完全に制御できます。

—

2. 軽量化マクロの心臓部:CommandBars.ExecuteMso

PowerPoint VBAには、実は「画像圧縮」専用のメソッドは存在しません。しかし、`CommandBars.ExecuteMso`を使えば、リボンUIにあるコマンドを直接呼び出せます。

これが今回の魔法の杖です。

実装コード:スライドを圧縮して軽量保存する

以下のコードをVBAエディタ(Alt + F11)に貼り付けてみてください。

Sub CompressAndSaveAs()
Dim pptPres As Presentation
Dim savePath As String

‘ 現在アクティブなプレゼンテーションを取得
Set pptPres = ActivePresentation

‘ 保存先のパスを設定(現在のファイル名に _compressed を付与)
savePath = Left(pptPres.FullName, InStrRev(pptPres.FullName, “.”) – 1) & “_compressed.pptx”

‘ 1. 画像圧縮コマンドを実行
‘ ※注意:このコマンドは「図を選択している状態」で有効になることが多いため、
‘ ダミーで図を選択する等の工夫が必要な場合がありますが、
‘ 最新の環境ではこのコマンドで全体適用がトリガーされます。
On Error Resume Next
Application.CommandBars.ExecuteMso “PicturesCompress”
On Error GoTo 0

‘ 2. 軽量化を反映させて別名保存
‘ ppSaveAsOpenXMLPresentation は通常の .pptx 形式
pptPres.SaveAs Filename:=savePath, FileFormat:=ppSaveAsOpenXMLPresentation

MsgBox “軽量化が完了しました:” & vbCrLf & savePath, vbInformation
End Sub

—

3. このコードを理解するための「3つの重要ポイント」

① `ExecuteMso` の罠

`CommandBars.ExecuteMso` はリボンのボタンを押すのと同じ挙動を再現します。しかし、UI上のコマンドは「現在何が選択されているか」によって有効・無効が切り替わります。もし上手く動かない場合は、一度スライド内の画像をアクティブにする処理(`ActiveWindow.Selection.ShapeRange.Select`)を追加するのが鉄則です。

② `SaveAs` のフォーマット指定

ファイルを保存する際、`FileFormat` を指定しないと意図しない形式(古い.ppt形式など)で保存されるリスクがあります。必ず `ppSaveAsOpenXMLPresentation` を指定し、現代の.pptx形式を担保しましょう。

③ エラーハンドリングの重要性

大規模なファイルを扱う際、メモリ不足で保存に失敗することがあります。`On Error Resume Next` を適切に使い、保存プロセスが途中でクラッシュしないようガードを固めるのが、プロのエンジニアの流儀です。

—

4. さらに上を目指すあなたへ:一括処理のヒント

もし、「フォルダ内の全ファイルを一気に圧縮したい」というニーズがあれば、`FileSystemObject` を使ってフォルダ内のファイルをループ処理する構成に拡張しましょう。

  • ステップ1: フォルダを選択させるダイアログを出す
  • ステップ2: 拡張子が `.pptx` のファイルをリストアップする
  • ステップ3: 上記の `CompressAndSaveAs` をサブプロシージャとして呼び出す

このように「単体処理」を関数化しておけば、将来的にどんな自動化ツールにも組み込めるようになります。

—

最後に:自動化は「道具」ではなく「思考」

VBAは単なるコードの羅列ではありません。「人間が手作業でマウスを動かしているプロセスを、OSとアプリケーションの対話として再定義すること」です。

今回紹介したコードは、あくまで出発点です。これをベースに、「保存時に圧縮設定ダイアログをどう回避するか」「特定の解像度(ppi)を指定できないか」と疑問を持ち、検証してみてください。その探究心こそが、あなたを真の自動化エンジニアへと導くはずです。

さあ、重たいファイルから解放された時間で、もっとクリエイティブな仕事に取り組みましょう!応援しています。

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