【実務・中級編】【中級者】大量のPPTXファイルを、画質(DPI)を指定して高解像度PNG画像へ一括変換する実用ツール – PowerPoint VBA解析バイブル

スポンサーリンク

PowerPointの「Export」で妥協するな。300DPIで完璧な画像変換を実現するプロの技術

現場でよく耳にする嘆きがある。「PowerPointを画像で書き出したら、文字がぼやけて使い物にならない」。
標準機能の「名前を付けて保存(PNG)」や、安易なVBAの`Export`メソッドに頼り切っているようでは、業務自動化エンジニアとしては三流だ。

PowerPointの描画エンジンは、デフォルトでは画面解像度(96 DPI相当)に最適化されている。印刷物や高精細なWeb媒体で耐えうるクオリティを出すには、レジストリによる解像度強制介入と、メモリリークを許さない堅牢なVBA設計が不可欠だ。

今日は、プロの現場で即戦力となる「高解像度PNG一括変換ツール」の設計思想と実装コードを伝授する。

—

1. なぜ「標準のExport」ではダメなのか?

PowerPointの`Slide.Export`メソッドは、レジストリに設定された`ExportBitmapResolution`という値を参照する。この値が未設定の場合、システムは「スクリーン最適化」を優先し、貧弱な解像度で画像を生成する。

我々が目指すべきは、「プログラム実行時に確実にDPIを強制し、処理が終わればクリーンにリソースを解放する」というライフサイクル管理だ。

—

2. 堅牢な設計のための3つの鉄則

1. レジストリ介入は最小限に: 変換開始前にDPIを設定し、終了後に「必ず」元に戻す。これを怠ると、ユーザーのPC環境を破壊する。
2. FileSystemObjectの徹底活用: フォルダの存在確認やパスの結合において、手動の文字列操作はバグの温床だ。`Scripting.FileSystemObject`を使え。
3. エラーハンドリングの神髄: 大量ファイル処理では、1つのファイルが破損しているだけで全処理が止まる。`On Error Resume Next`で放置するのではなく、個別にログを吐き出し、次へ進むループ構造を組め。

—

3. 実践コード:高解像度PNG変換エンジン

以下のコードを標準モジュールに貼り付け、適宜パスを修正して利用してほしい。

Option Explicit

‘ 必要な定数
Private Const REG_KEY_PATH As String = “HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\PowerPoint\Options\”
Private Const DPI_VALUE As Long = 300 ‘ 300DPIで固定

Public Sub BatchExportHighResPNG()
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim sourceFolder As String: sourceFolder = “C:\SourcePPTX\”
Dim outputFolder As String: outputFolder = “C:\OutputPNGs\”

‘ フォルダ存在確認
If Not fso.FolderExists(outputFolder) Then fso.CreateFolder (outputFolder)

‘ 1. DPI設定を強制適用
SetExportDPI DPI_VALUE

Dim pptApp As PowerPoint.Application: Set pptApp = New PowerPoint.Application
Dim file As Object

On Error Resume Next
For Each file In fso.GetFolder(sourceFolder).Files
If LCase(fso.GetExtensionName(file.Path)) Like “pptx” Then
Debug.Print “Processing: ” & file.Name
ExportPPTXToPNG pptApp, file.Path, outputFolder
End If
Next
On Error GoTo 0

‘ 2. DPI設定をリセット(重要)
DeleteExportDPI

pptApp.Quit
MsgBox “変換完了”
End Sub

Private Sub ExportPPTXToPNG(app As PowerPoint.Application, filePath As String, outFolder As String)
Dim pres As Presentation
Set pres = app.Presentations.Open(filePath, WithWindow:=False)

‘ ファイル名ごとの保存先を作成
Dim folderName As String
folderName = outFolder & “\” & Left(pres.Name, InStrRev(pres.Name, “.”) – 1)
If Not CreateObject(“Scripting.FileSystemObject”).FolderExists(folderName) Then
CreateObject(“Scripting.FileSystemObject”).CreateFolder (folderName)
End If

‘ スライドの書き出し(幅をDPIに応じて指定可能だが、レジストリ併用が最も確実)
pres.Export folderName & “\Slide”, “PNG”, 3000, 2250 ‘ 4:3の例

pres.Close
End Sub

Private Sub SetExportDPI(dpi As Long)
Dim wsh As Object: Set wsh = CreateObject(“WScript.Shell”)
‘ レジストリにExportBitmapResolutionを書き込み
wsh.RegWrite REG_KEY_PATH & “ExportBitmapResolution”, dpi, “REG_DWORD”
End Sub

Private Sub DeleteExportDPI()
Dim wsh As Object: Set wsh = CreateObject(“WScript.Shell”)
On Error Resume Next
wsh.RegDelete REG_KEY_PATH & “ExportBitmapResolution”
End Sub

—

4. プロの技術者が注意すべきポイント

パフォーマンスを稼ぐための「WithWindow:=False」

`Presentations.Open`メソッドで`WithWindow:=False`を指定することが極めて重要だ。画面描画を抑制することで、大量処理時のメモリ消費を抑え、処理速度を劇的に向上させる。これを怠ると、ファイルを開くたびにGUIがチラつき、PCのパフォーマンスを無駄に消費する。

レジストリ値の「戻し」の徹底

`DeleteExportDPI`を呼び出し忘れると、そのPCの他のPowerPoint作業にもDPI設定が引き継がれてしまう。最悪の場合、他のユーザーの環境設定を汚染する。プロは「例外が発生しても必ずクリーンアップが走る」ような、`Finally`ブロックに近い構造を意識するべきだ。

最後に

自動化とは、単にコードを書くことではない。「誰が、どのような環境で実行しても同じ結果を出す」ための堅牢なシステムを構築することだ。今回提供した設計思想を武器に、ぜひ現場の課題を根こそぎ解決してほしい。

質問があれば、コードの深淵まで付き合う準備はある。健闘を祈る。

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