こんにちは!パワポの自動化、楽しんでいますか?
マクロの記録から一歩踏み出し、「自分でコードを書いて業務を効率化したい!」という中級者への階段を登っているあなたへ、今日はとても実用的で、かつ少しディープなPowerPoint VBAのテクニックをお伝えします。
現場でこんな無茶振りを受けたことはありませんか?
「このプレゼン資料、横向きのスライドと、A4縦の資料が混ざってるんだけど、印刷の都合上、横向きのページと縦向きのページで別々のPDFに分けて出力してくれない?」
……これを手作業でやろうとすると、PDFを書き出した後にAcrobatでページを分割したり、スライドを削除して保存し直したりと、気が遠くなるような手間がかかりますよね。
ご安心ください。PowerPoint VBAを正しく掌握すれば、こんな複雑な分岐処理も一瞬で、かつ美しく自動化できます。
ここをクリアすれば、あなたのVBAスキルは間違いなく「実務で頼られるエンジニア」の領域に到達します。さあ、一緒に極限の知見を紐解いていきましょう!
—
1. なぜ「向きの混在」はVBAで苦戦するのか?
まず、PowerPointのオブジェクトモデルにおける「スライドの向き」の仕様を知る必要があります。
実は、PowerPointの各スライドには、「私は横向きです」「私は縦向きです」という直接的なプロパティ(フラグ)はありません。
あるのは、プレゼンテーション全体、あるいはスライドごとの「幅(Width)」と「高さ(Height)」の数値だけです。
- 横向き(16:9などのワイド画面): 幅 > 高さ
- 縦向き(A4縦など): 幅 < 高さ
つまり、混在資料を制御するためには、「ループを回して1枚ずつスライドの幅と高さを比較し、動的に一時的なプレゼンを組み立ててPDF化する」という、アーキテクチャの設計が必要になります。ここが今日の最大のポイントです。
—
2. 【実戦投入コード】向きを検知してPDFに自動分割するマクロ
それでは、開発環境(VBE)の標準モジュールにそのまま貼り付けて実行できる、実用的なコードを公開します。
コメントを隅々まで読み込んで、コードの息遣いを感じてください。
Sub SplitPresentationByOrientation()
Dim srcPres As Presentation
Dim targetPres As Presentation
Dim sld As Slide
Dim i As Long
Dim landscapeCount As Long
Dim portraitCount As Long
‘ 画面描画を停止して処理速度を爆発的に上げる(プロの常識)
Application.ScreenUpdating = False
‘ アクティブなプレゼンテーションを基準とする
Set srcPres = ActivePresentation
‘ 念のため保存先パスの確認(元ファイルと同じフォルダに保存)
Dim basePath As String
Dim ext As String
Dim baseName As String
If srcPres.Path = “” Then
MsgBox “このプレゼンテーションはまだ保存されていません。一度保存してから実行してください。”, vbCritical
Exit Sub
End If
basePath = srcPres.Path & “\”
baseName = Left(srcPres.Name, InStrRev(srcPres.Name, “.”) – 1)
‘ — 【処理1】横向き用・縦向き用の「空のプレゼンテーション」を裏で新規作成 —
‘ 元のファイルと同じスライドサイズ(幅・高さ)を一旦引き継ぐため、複製ベースで作成します
Dim landscapePres As Presentation
Dim portraitPres As Presentation
Set landscapePres = Application.Presentations.Add(msoTrue)
‘ 最初のデフォルトスライドを削除するために後で調整
Set portraitPres = Application.Presentations.Add(msoTrue)
landscapeCount = 0
portraitCount = 0
‘ — 【処理2】元スライドを総ナメし、向きを判定して振り分ける —
For i = 1 W
For i = 1 To srcPres.Slides.Count
Set sld = srcPres.Slides(i)
‘ 幅と高さを比較して「横」か「縦」かを判定
If sld.Master.Width >= sld.Master.Height Then
‘ 【横向きスライドの処理】
‘ ※スライドのデザインやサイズを完全に保持するため「Copy」を使用
sld.Copy
landscapePres.Slides.Paste
landscapeCount = landscapeCount + 1
Else
‘ 【縦向きスライドの処理】
sld.Copy
portraitPres.Slides.Paste
portraitCount = portraitCount + 1
End If
Next i
‘ — 【処理3】新規作成時の最初から入っている余分なスライドを削除 —
‘ 新規作成時は必ず1枚スライドが存在するため、それを削除する
If landscapeCount > 0 And landscapePres.Slides.Count > landscapeCount Then
landscapePres.Slides(landscapeCount + 1).Delete
End If
If portraitCount > 0 And portraitPres.Slides.Count > portraitCount Then
portraitPres.Slides(portraitCount + 1).Delete
End If
‘ — 【処理4】それぞれのプレゼンテーションをPDFとして出力 —
Dim pdfPathLandscape As String
Dim pdfPathPortrait As String
If landscapeCount > 0 Then
pdfPathLandscape = basePath & baseName & “_【横向き】.pdf”
landscapePres.SaveAs pdfPathLandscape, ppSaveAsPDF
End If
If portraitCount > 0 Then
pdfPathPortrait = basePath & baseName & “_【縦向き】.pdf”
portraitPres.SaveAs pdfPathPortrait, ppSaveAsPDF
End If
‘ — 【処理5】裏で開いた一時ファイルを保存せずに閉じる(メモリ解放) —
landscapePres.Close
portraitPres.Close
‘ 画面描画を復元
Application.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “PDFの分割出力が完了しました!” & vbCrLf & _
“・横向きPDF: ” & landscapeCount & “枚” & vbCrLf & _
“・縦向きPDF: ” & portraitCount & “枚”, vbInformation, “処理完了”
End Sub
—
3. コードのキモ:プロが教える3つの技術的解説
このコードには、PowerPoint VBAでありがちな「エラーの沼」にハマらないための知見が詰め込まれています。
① `Application.ScreenUpdating = False` による高速化
スライドのコピー(`Copy` & `Paste`)を大量に行うマクロは、画面がチラつき、処理が非常に遅くなります。処理の最初に画面描画を止め、最後に復元することで、体感速度を何倍にも跳ね上げることができます。
② `sld.Master.Width / Height` による正確な判定
スライド個別のレイアウトやマスターのサイズを安全に取得するため、`sld.Master`(またはスライド自体のプロパティ)の幅と高さを比較しています。これにより、ユーザーが途中でレイアウトを手動変更したスライドであっても、正確に向きを検知できます。
③ メモリリーク(リソースの枯渇)を防ぐ `Close`
VBAで新規プレゼンテーション(`Presentations.Add`)をコード内で立ち上げると、目に見えないところでPowerPointのメモリを消費します。処理の最後には必ず `.Close` を実行し、オブジェクトを綺麗に消去するのがプロの作法です。
—
4. 陥りやすいエラーと回避策
実際にこのコードを運用する際、初心者が直面しやすい壁と、そのスマートな回避策をシェアしておきます。
- エラー:「このファイルはまだ保存されていません」
- 原因: `srcPres.Path` が空(新規作成しただけで一度も名前をつけて保存していない状態)の時に発生します。
- 対策: コード内でもチェックを入れていますが、必ず一度ローカルフォルダに保存してからマクロを実行してください。
- 「貼り付け(Paste)」でエラーが出る
- 原因: クリップボードを酷使すると、Windowsのクリップボード競合エラー(Error 460など)が発生することが稀にあります。
- 対策: 実務で数千枚規模の巨大なファイルを扱う場合は、`Copy` / `Paste` ではなく、スライド自体を複製する `Duplicate` メソッドや、`InsertFromFile` などの高度なアプローチに切り替えるのがエンジニアの腕の見せ所です。今回は分かりやすさを優先して `Copy` を採用しています。
—
まとめ
いかがでしたでしょうか?
「横と縦が混ざった資料のPDF分割」という一見難しそうな課題も、「向きを判定するロジック」「一時的なコンテナ(新規ファイル)の作成」「PDFエクスポート」というパーツに分解すれば、確実に自動化することができます。
ここをクリアできたあなたなら、PowerPointのオブジェクト操作の基本はもうバッチリです!ぜひ実際の業務データで試して、周囲をあっと言わせる自動化を体験してください。
それでは、また次の極限の知見でお会いしましょう。良きVBAライフを!
