こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステップから抜け出し、いざ「実務で使える自動化ツールを作ろう!」と意気込んだとき、私たちエンジニアの前に時折立ち塞がる最大の壁――それが「ファイルの破損」です。
何時間もかけて作り込んだプレゼンテーションファイルを開こうとした瞬間、非情にも聞こえるこんなエラーダイアログ。
> 「PowerPointで〇〇.pptxの一部のコンテンツを読み取れませんでした。このプレゼンテーションを修復しますか? [修復する] [キャンセル]」
手動であればボタンをポチッと押せば済む話ですが、これが毎朝実行する自動集計バッチや、数十個のファイルを一括処理するマクロの最中に発生したらどうでしょう? そう、容赦なくコードは止まり、エラーでプログラムは強制終了してしまいますよね。
今回は、そんな絶望的な状況を華麗に回避し、プログラムを止めることなく安全に壊れたファイルを救出するための極秘テクニック――`CorruptLoad`引数の活用法を伝授します。ここをクリアすれば、あなたもエラーハンドリングの引き出しが一気にプロの領域に達しますよ。ぜひ最後までついてきてくださいね!
—
1. PowerPoint VBAの心臓部と「オブジェクトモデル」の基本
まずは、今回の主役であるPowerPointのオブジェクト構造(階層)を軽くおさらいしておきましょう。
PowerPoint VBAを操るということは、アプリケーションのトップから順に「お目当てのオブジェクト」を手繰り寄せる作業に他なりません。
Application (PowerPoint本体)
┗ Presentations (開かれている、または開くことのできる全ファイルのコレクション)
┗ Presentation (個別のファイル・オブジェクト)
┗ Slides (スライドの集まり)
┗ Slide (個別のスライド)
通常、VBAからファイルを開くときは、以下のように書きますよね。
Dim prs As Presentation
Set prs = Application.Presentations.Open(“C:\Path\To\File.pptx”)
非常にシンプルで美しいコードです。しかし、このファイルが「もし破損していたら」どうなるでしょうか?
先ほどの「修復しますか?」というダイアログが画面に表示され、VBAの実行はそこで完全にフリーズ(ユーザーの入力を待つ状態)してしまいます。無人稼働させたい自動化スクリプトにおいて、ユーザーのクリックを待つダイアログほど恐ろしいものはありません。
—
2. 救世主現る! `CorruptLoad` 引数の正体
この問題を一発で解決するのが、`Presentations.Open` メソッドに隠された知られざる引数、`CorruptLoad` です。
実は `Open` メソッドには、Microsoft公式の古いリファレンスにはサラッとしか書かれていない強力なパラメータが存在します。それが以下のような構文です。
expression.Open(FileName, ReadOnly, Untitled, WithWindow, CorruptLoad)
この最後の引数 `CorruptLoad` に `msoTrue` を指定してあげることで、PowerPointに対してこう命令できます。
> 「おい、このファイルは壊れているかもしれない。ダイアログを出してユーザーに聞くんじゃなく、有無を言わさず『修復モード』で強制的にこじ開けろ!」
この挙動を知っているだけで、ファイル破損によるマクロの突然死を完全に見据えた、極めて堅牢(ロバスト)なシステムが構築できるようになります。
—
3. 【実践】壊れたファイルを安全に修復・オープンするVBAコード
それでは、実際の現場でそのままコピー&ペーストして使える実用的なコードを見ていきましょう。
単に開くだけでなく、「開けなかったときの保険(エラーハンドリング)」もセットで実装するのがプロの作法です。
Option Explicit
Sub SafeOpenAndRepairSample()
Dim targetPath As String
Dim prs As Presentation
‘ 処理対象のファイルパスを指定
targetPath = “C:\MyData\BrokenPresentation.pptx”
‘ エラーが発生してもプログラムを止めず、Errorトラップへ逃げる準備
On Error GoTo ErrorHandler
Debug.Print “ファイルのオープンを試みます: ” & targetPath
‘ 【ここが本記事の核心!】
‘ CorruptLoad:=msoTrue を指定し、破損ファイルを修復モードで強制オープンする
‘ ついでに WithWindow:=msoFalse にすることで、画面を非表示のまま裏で処理し高速化
Set prs = Application.Presentations.Open( _
FileName:=targetPath, _
ReadOnly:=msoFalse, _
Untitled:=msoFalse, _
WithWindow:=msoTrue, _
CorruptLoad:=msoTrue _
)
MsgBox “ファイルのオープンおよび修復に成功しました!”, vbInformation, “成功”
‘ — ここに通常の処理(スライドの操作など)を記述 —
‘ 例: Debug.Print prs.Slides.Count & “枚のスライドを検出しました。”
‘ 処理が終わったら安全に閉じる(必要に応じて保存する場合は prs.Save など)
‘ prs.Close
Exit Sub
ErrorHandler:
‘ 破損が激しすぎてCorruptLoadでも開けなかった場合や、ファイルが存在しない場合
MsgBox “致命的なエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “救出失敗”
‘ 必要に応じたク処理をここに記述
End Sub
コードのポイント解説
1. `CorruptLoad:=msoTrue` の指定
これが今回の最大のミソです。破損したXML構造やメディア要素をPowerPointが可能な限り自力で修復しながら、メモリ上にプレゼンテーションオブジェクトを展開してくれます。
2. `On Error GoTo ErrorHandler` による二重の防壁
`CorruptLoad` を使ってもなお、ファイルが完全に消滅していたり、ディスク自体が壊れている場合はエラーになります。そのため、必ず `On Error` 構文でエラーフックを仕掛け、マクロが唐突に強制終了するのを防ぎましょう。
—
4. 応用編:フォルダ内の「壊れたファイル」を一括で検出し救出する
実務では「どのファイルが壊れているか分からない状態」で、大量のPPTXファイルを一括処理したいという要望がよくあります。
最後に、指定フォルダ内の全プレゼンテーションを巡回し、破損しているファイルがあれば修復して別名で保存し、ログに残すという実践的自動化スクリプトをプレゼントします。
Sub BatchRepairPresentations()
Dim fso As Object
Dim folderPath As String
Dim targetFile As Object
Dim prs As Presentation
Dim successCount As Long
Dim repairCount As Long
‘ 処理対象のフォルダパス(環境に合わせて変更してください)
folderPath = “C:\MyData\PowerPointFiles\”
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(folderPath) Then
MsgBox “指定されたフォルダが存在しません。”, vbExclamation
Exit Sub
End If
successCount = 0
repairCount = 0
‘ フォルダ内の全ファイルをループ
For Each targetFile In fso.GetFolder(folderPath).Files
‘ 拡張子が .pptx のファイルのみを対象にする
If LCase(fso.GetExtensionName(targetFile.Path)) = “pptx” Then
On Error GoTo OpenFailed
‘ まずは通常オープンを試みる(または最初からCorruptLoadを使ってもOK)
‘ 今回は堅牢性を重視し、最初から CorruptLoad を使用
Set prs = Application.Presentations.Open( _
FileName:=targetFile.Path, _
ReadOnly:=msoFalse, _
Untitled:=msoFalse, _
WithWindow:=msoFalse, _
CorruptLoad:=msoTrue _
)
‘ ここに来られたということは、正常か(修復されて)開いたということ
‘ 安全のため「_repaired.pptx」という名前で別名保存して保護する
Dim savePath As String
savePath = fso.BuildPath(folderPath, fso.GetBaseName(targetFile.Path) & “_repaired.pptx”)
prs.SaveAs savePath
prs.Close
repairCount = repairCount + 1
GoTo NextFile
OpenFailed:
‘ 開けなかった場合の処理
Debug.Print “【救出失敗】完全破損ファイル: ” & targetFile.Name
NextFile:
On Error GoTo 0 ‘ エラーハンドラをリセット
End If
Next targetFile
MsgBox “一括処理が完了しました。” & vbCrLf & _
“処理・修復完了ファイル数: ” & repairCount, vbInformation, “一括処理終了”
Set fso = Nothing
End Sub
—
まとめ
今回は、PowerPoint VBAにおける隠れた名引数 `CorruptLoad` を用いた、堅牢なファイル修復・オープン処理について解説しました。
- 「マクロの途中で壊れたファイルにあたって止まってしまう」という悩みは、`CorruptLoad:=msoTrue` で完全に解決できる。
- どんなに強力なメソッドでも例外(予期せぬ完全破壊など)はあるため、`On Error GoTo` と組み合わせることで真価を発揮する。
- 裏側で処理を完結させたい場合は `WithWindow:=msoFalse` を組み合わせるとスマート。
ここをクリアできれば、あなたの書くPowerPointマクロは、単なる「おもちゃの自動化」から、現場で頼られる「プロフェッショナルな業務システム」へと大きく飛躍します。
ぜひ、日々の業務やファイル整理の自動化にこのテクニックを取り入れてみてくださいね。「ここもっと詳しく知りたい!」という疑問があれば、いつでも先輩エンジニアに聞いてください。応援しています!
