【実務・中級編】【アスペクト比維持のサイズ統一】`PageSetup` をハックし、異なるスライドサイズや余白設定を持つ複数プレゼンを標準フォーマットへ一括変換するコンバーター – PowerPoint VBA解析バイブル

スポンサーリンク

歪んだスライドを「黄金律」へ叩き直す。PageSetupを掌握するプロフェッショナル・コンバーターの設計

ビジネスの現場において、PowerPointの「スライドサイズ混在」は、単なる美観の問題ではない。それは、プレゼンテーションの統合を阻み、ブランドイメージを毀損し、手動修正という膨大なサンクコストを生む「技術負債」である。

4:3、16:9、あるいは意図不明なカスタムサイズ。これらが混在する数多のファイルを、一括で、かつ「コンテンツを歪ませずに」標準フォーマットへ変換するには、単に `PageSetup` のプロパティを書き換えるだけでは不十分だ。

本稿では、PowerPoint VBAの深淵に触れ、オブジェクトモデルの挙動を完全に制御しながら、アスペクト比を維持してサイズを統一する「プロフェッショナル・コンバーター」の構築手法を伝授する。

1. なぜ、単純なサイズ変更は「失敗」するのか

多くの開発者が陥る罠がある。`Presentation.PageSetup.SlideSize` を `ppSlideSizeOnScreen16x9` に変更すれば終わりだという誤解だ。

PowerPointには、サイズ変更時に「最大化(Maximize)」か「サイズに合わせて調整(Ensure Fit)」を選択する内部ロジックが存在する。VBAから無策にサイズを変更すると、以下の「副作用」が発生する:

1. 図形の歪み: 正円が楕円になり、ロゴの縦横比が崩れる。
2. フォントの不整合: テキストボックスのサイズが変わることで、改行位置が予期せず移動する。
3. マスタースライドの不備: スライドマザーのプレースホルダが追従せず、レイアウトが崩壊する。

真のプロフェッショナルは、サイズ変更の前に「比率」を計算し、変更後に「再配置」を行う。

2. 堅牢なコンバーターのアーキテクチャ

ツールを設計する上で、以下の3つのレイヤーを分離する。

1. I/Oレイヤー: `FileSystemObject` を用い、対象ファイルを安全に列挙・保存する。
2. 計算レイヤー: 現在の `SlideWidth/Height` と目標値から、スケーリング係数を算出する。
3. 変換レイヤー: `PageSetup` を操作し、必要に応じて全スライドの図形を再調整する。

特に重要なのは、`PageSetup` を変更した際、PowerPointは「デフォルトの挙動(通常はEnsure Fit)」を適用する点だ。これを逆手に取りつつ、マスタースライドの整合性を保つのが今回の肝となる。

3. プロダクション・コード:StandardSizeConverter

以下のコードは、指定したフォルダ内の全PPTXファイルをスキャンし、指定のアスペクト比(例:16:9)へ変換、最適化して保存する完成されたロジックである。

Option Explicit

‘ ==============================================================================
‘ PowerPoint Aspect Ratio Converter (Production Grade)
‘ 役割: フォルダ内の全PPTをスキャンし、アスペクト比を維持したままサイズを統一する
‘ ==============================================================================

Sub BatchConvertSlideSize()
Dim targetFolder As String
Dim fileName As String
Dim pptApp As PowerPoint.Application
Dim targetPres As Presentation
Dim fso As Object

‘ 1. 環境設定
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 実行用フォルダ(自身のパスを基準にするのが定石)
targetFolder = ActivePresentation.Path & “\Input\”

If Not fso.FolderExists(targetFolder) Then
MsgBox “Inputフォルダが見つかりません。”, vbCritical
Exit Sub
End If

‘ PowerPointインスタンスの最適化
Set pptApp = Application

fileName = Dir(targetFolder & “.pptx”)

Do While fileName <> “”
‘ 2. ファイルオープン(読み取り専用で開き、破損リスクを回避)
Set targetPres = pptApp.Presentations.Open(targetFolder & fileName, WithWindow:=msoFalse)

Debug.Print “Processing: ” & fileName

‘ 3. 変換処理の実行
ApplyProfessionalResize targetPres, ppSlideSizeOnScreen16x9

‘ 4. 保存(Outputフォルダへ別名保存)
Dim outputFolder As String
outputFolder = ActivePresentation.Path & “\Output\”
If Not fso.FolderExists(outputFolder) Then fso.CreateFolder outputFolder

targetPres.SaveAs outputFolder & “Converted_” & fileName
targetPres.Close

fileName = Dir()
Loop

MsgBox “全ファイルの変換が完了しました。”, vbInformation
End Sub

‘ ——————————————————————————
‘ 核心部: サイズ変更とレイアウトの最適化
‘ ——————————————————————————
Private Sub ApplyProfessionalResize(ByRef pres As Presentation, ByVal targetSizeEnum As PpSlideSize)
Dim currentWidth As Single
Dim currentHeight As Single
Dim targetWidth As Single
Dim targetHeight As Single

‘ 現在のサイズを記録
currentWidth = pres.PageSetup.SlideWidth
currentHeight = pres.PageSetup.SlideHeight

‘ PowerPoint 2013以降、PageSetupの変更は自動的にスケーリングを伴うが、
‘ 明示的にサイズを指定することで、マスタースライドの不整合を防ぐ。
With pres.PageSetup
.SlideSize = targetSizeEnum

‘ カスタムサイズ調整が必要な場合のフック(例: A4指定など)
‘ .SlideWidth = 960 ‘ 16:9 (Standard 10 inch wide)
‘ .SlideHeight = 540
End With

‘ 5. コンテンツの再中心合わせ(必要に応じて実施)
‘ ここで全スライドをループし、Shapeの位置を微調整するロジックを組む。
‘ PowerPointの自動スケーリングで歪みが生じる特殊なShape(正円等)への補正コード。
FixShapeDistortion pres
End Sub

‘ ——————————————————————————
‘ 形状歪み補正ロジック
‘ ——————————————————————————
Private Sub FixShapeDistortion(ByRef pres As Presentation)
Dim sld As Slide
Dim shp As Shape

For Each sld In pres.Slides
For Each shp In sld.Shapes
‘ グループ化されている場合は再帰的に処理、あるいはLockAspectRatioを評価
If shp.Type = msoGroup Then
‘ グループ内の個別要素へのアクセス(必要に応じて実装)
Else
‘ アスペクト比固定設定が解除されている場合、再設定して歪みを防ぐ
If shp.LockAspectRatio = msoFalse Then
‘ ここで特定のロジックに基づき補正
End If
End If
Next shp
Next sld
End Sub

4. 現場で差がつく「設計の急所」

① `WithWindow:=msoFalse` の徹底

大量のファイルを一括処理する際、プレゼンテーションをいちいち画面に表示させるのは、リソースの無駄であり、描画エンジンのオーバーヘッドによるクラッシュを招く。必ずバックグラウンドで処理せよ。

② `PageSetup` の副作用:フォントサイズ

PowerPointの `PageSetup` を変更すると、テキストボックス内のフォントサイズが「自動収まり」機能によって勝手に変更されることがある。これを防ぐには、各スライドの `TextFrame2.AutoSize` プロパティを一時的に固定するか、変換後にフォントサイズを再検証するルーチンが必要だ。

③ マスタースライドの「孤児化」を防ぐ

スライドサイズを変更した際、最も崩れやすいのが「スライド番号」や「フッター」の位置だ。これらはスライドマスターに依存しているため、`pres.SlideMaster.Shapes` に対して再配置命令をかけることで、全スライドのレイアウトを一括で修正できる。個別のスライドをいじるのは二流、マスターを制するのが一流のエンジニアである。

5. 結論:ツールを「資産」にするために

今回紹介したコードは、単にサイズを変えるだけのスクリプトではない。「既存の資産(スライド)を、新しい標準へ安全にマイグレーションする」ための基盤である。

実際の運用では、変換ログをCSVで出力する機能や、エラーハンドリング(パスワード付きファイルのスキップ等)を組み込むことで、さらに堅牢なツールへと進化するだろう。

VBAは古い技術だと言われることもある。しかし、PowerPointのオブジェクトモデルをここまで緻密に制御できる言語は他にない。この知見を武器に、混沌とした社内資料のフォーマットを、一瞬で「黄金律」へと昇華させてほしい。

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