こんにちは!シニアアーキテクトの私だ。
今日も君のような熱意あるエンジニアから相談を受けることが多い。「社内の共有サーバーの奥底から、大昔の `.ppt` ファイルが山のように発掘されたんですが、最新の `.pptx` に手作業で直すなんて正気の沙汰じゃありません……なんとかならないでしょうか?」とね。
安心しなさい。PowerPoint VBAを極めれば、こうしたレガシーな移行地獄など一瞬でパラダイスに変えられる。
今回は、`Application.FileConverters` という通好みだが極めて強力なオブジェクトを駆使し、古い形式のファイルを最新の `.pptx` へ完全自動で一括バッチ変換するシステムを授けよう。
ここをクリアすれば、PowerPoint VBAの基本オブジェクトモデル(`Application`、`Presentation`、`Slide`)の本質もバッチリ見えてくる。さあ、一歩先へ進もうか。
—
1. なぜ「手作業」や「単純な名前変更」ではダメなのか?
まず大前提として、拡張子を無理やり `.ppt` から `.pptx` にリネームしても、ファイルの中身(構造)は古いバイナリ形式のままだ。現代のOffice環境では開けなかったり、レイアウトが崩壊したりする。
正しく変換するには、PowerPointのエンジン(Application)に一度ファイルを読み込ませ、最新のオープンXML形式(.pptx)として「名前を付けて保存」し直す必要がある。
これを何百ファイルも手動でやっていたら、あなたの貴重なエンジニアとしての時間が溶けてしまう。だからこそ、VBAで自動化するのだ。
—
2. 本日の主役:オブジェクトモデルの全体像
PowerPoint VBAを操る上で、以下の3つの階層構造(オブジェクトモデル)を頭に叩き込んでおく必要がある。
1. `Application` オブジェクト:PowerPointアプリそのもの。ファイルコンバーターの管理やウィンドウ制御を司る。
2. `Presentation` オブジェクト:開かれている「ファイル(プレゼンテーション)」そのもの。
3. `Slide` オブジェクト:その中にある個々のスライド。
今回は、この中の頂点である `Application` の機能、そしてファイルを開いて保存する `Presentation` のライフサイクルを完璧にコントロールする。
—
3. 実装:レガシー一括バッチ変換システム
以下のコードを、ExcelまたはPowerPointのVBAエディタ([Alt] + [F11])に貼り付けてほしい。
今回は、指定したフォルダ内にある `.ppt` ファイルを再帰的に(あるいは指定フォルダから)探し出し、最新の `.pptx` に変換して別フォルダへ保存する実用スクリプトだ。
Option Explicit
‘ =========================================================================
‘ 処理名: レガシーPowerPointファイル一括変換システム
‘ 概要 : 指定フォルダ内の旧形式(.ppt)を最新(.pptx)にバッチ変換する
‘ =========================================================================
Sub ConvertLegacyPptToPptx()
Dim targetDir As String
Dim saveDir As String
Dim fileName As String
Dim fso As Object
Dim pptApp As PowerPoint.Application
Dim pres As PowerPoint.Presentation
Dim convertedCount As Long
‘ 1. 変換元と保存先のパスを指定(環境に合わせて書き換えてください)
targetDir = “C:\PptLegacy\Source\”
saveDir = “C:\PptLegacy\Converted\”
‘ フォルダの存在チェック(FileSystemObjectを使用)
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(targetDir) Then
MsgBox “変換元フォルダが存在しません: ” & targetDir, vbCritical, “エラー”
Exit Sub
End If
If Not fso.FolderExists(saveDir) Then
fso.CreateFolder (saveDir) ‘ 保存先がなければ作成する
End If
‘ 2. PowerPointアプリケーションのインスタンスを裏で起動 (Automation)
‘ ※画面描画を隠すことで、処理速度を劇的に向上させます
Set pptApp = New PowerPoint.Application
pptApp.Visible = msoTrue ‘ 一部セキュリティやバージョンにより表示が必要な場合あり
‘ 3. フォルダ内のファイルをループ処理
fileName = Dir(targetDir & “.ppt”)
convertedCount = 0
‘ 処理開始前の最適化:画面更新を停止
Application.ScreenUpdating = False
Do While fileName <> “”
Dim fullPath As String
Dim savePath As String
Dim baseName As String
fullPath = targetDir & fileName
baseName = fso.GetBaseName(fileName)
savePath = saveDir & baseName & “.pptx”
On Error GoTo ErrorHandler
‘ 【重要】古い形式(.ppt)のファイルを読み込む
‘ ReadOnly:=msoTrue にすることで、オリジナルファイルを傷つけない
Set pres = pptApp.Presentations.Open(FileName:=fullPath, ReadOnly:=msoTrue, WithWindow:=msoFalse)
‘ 最新の .pptx 形式 (ppSaveAsOpenXMLPresentation = 11) で保存
pres.SaveAs FileName:=savePath, FileFormat:=ppSaveAsOpenXMLPresentation
‘ メモリ解放のためプレゼンテーションを閉じる
pres.Close
Set pres = Nothing
convertedCount = convertedCount + 1
fileName = Dir() ‘ 次のファイルへ
Loop
GoTo CleanUp
ErrorHandler:
‘ エラーが発生しても処理を止めず、ログを残して次へ進むタフな設計
MsgBox “ファイル変換中にエラーが発生しました: ” & fileName & vbCrLf & _
“エラー内容: ” & Err.Description, vbExclamation, “個別エラー”
If Not pres Is Nothing Then
pres.Close
Set pres = Nothing
End If
Resume Next
CleanUp:
‘ 4. 終了処理とリソースの解放
Application.ScreenUpdating = True
If Not pptApp Is Nothing Then
pptApp.Quit
Set pptApp = Nothing
End If
Set fso = Nothing
MsgBox “変換作業が完了しました!” & vbCrLf & _
“変換成功件数: ” & convertedCount & ” 件”, vbInformation, “完了”
End Sub
—
4. チーフアーキテクトが教える、コードの急所と極意
このコードには、現場で生き残るための「プロの知見」がいくつも散りばめられている。初心者から一歩抜け出すために、重要なポイントを解説しよう。
① `WithWindow:=msoFalse` による高速化
ファイルをオープンする際、画面上にわざわざPowerPointのウィンドウを表示させる必要はない。`WithWindow:=msoFalse` を指定することで、メモリ上のバックグラウンドで処理が走り、処理速度が何倍にも跳ね上がる。これが大規模バッチ処理の基本だ。
② `On Error GoTo` による「止まらないシステム」
何百個もあるファイルの中には、ファイルが破損しているものや、パスワードがかかっている地雷のようなレガシーファイルが必ず混ざっている。
ここでエラーハンドリングをサボると、100個目のファイルでマクロがクラッシュし、それまでの努力が水の泡になる。エラーをキャッチして「スキップして次へ進む(`Resume Next`)」タフな設計こそが、プロのコードだ。
③ 適切なオブジェクトの解放(ライフサイクル管理)
VBAで最も多いバグは「メモリリーク」だ。`Set pres = Nothing` や `Set pptApp = Nothing` を使い、使い終わったオブジェクトの参照を確実に消去する。これを怠ると、目に見えないところでPowerPointのプロセス(POWERPNT.EXE)がタスクマネージャーに残り続け、PCの動作が重くなる原因になる。
—
最後に:ここをクリアすれば、もう怖くない
今回は `Application` オブジェクトからファイルを操作し、レガシー資産を現代に蘇らせるバッチ処理の全貌を解説した。
オブジェクトの生成、メソッドの実行、エラーのハンドリング、そして確実な後始末。
この一連の流れをマスターした君は、もはや「マクロの記録をいじっているだけの初学者」ではない。立派な業務自動化エンジニアだ。
社内の古い資産を一掃し、周囲から「おっ、仕事が早いな!」と頼られる存在になってほしい。
それでは、次のアーキテクチャでお会いしよう。
