KB0209: PowerPoint 2013 以降で PowerPoint ファイルを修復できない
問題
PowerPoint が破損した PowerPoint ファイルの修復に失敗します。
説明
PowerPoint がスライドを修復する前にプログラムからスライドにアクセスすると、PowerPoint ファイルの修復は失敗します。しかし、thinkcell やおそらく他のアドインも、ファイルを開いたときにスライドへアクセスする必要があり、アドイン側でファイルが破損していることを知る方法はありません。
弊社は Microsoft にケースを提出しましたが、これまでのところ Microsoft は修正を決定していません。貴社にMicrosoft Officeサポートの連絡先があり、この問題についてMicrosoftに連絡して修正プログラムを要請なさりたい場合は、Microsoftケース番号115040112590053を使用してください。 このエラーは thinkcell なしでも再現できます。 もっと読む
thinkcell を使用しない再現手順
修復が完了する前に何らかのコードが破損したスライドにアクセスすると、このエラーは thinkcell なしでも再現できます。以下の再現手順では、ファイルを開いたとき、つまり修復前に、PresentationOpen イベント ハンドラーがすべてのスライドにアクセスするコードを呼び出します。
- PowerPoint 2013 以降を新しい空のファイルで開きます。
- PowerPoint で、Insert > thinkcell > Tools
> Deactivate thinkcell に移動します。
- Alt + F11 を押して Microsoft Visual Basic for Applications を開きます。
-
このコードを Class Module として追加し、
cEventClassという名前を付けます:Public WithEvents PPTEvent As Application Private Sub Class_Initialize() MsgBox "EventHandler is now active." End Sub Private Sub PPTEvent_PresentationOpen(ByVal pres As Presentation) On Error GoTo errHandle: Debug.Print "open file: " & pres.Name Dim i As Integer For i = 1 To pres.Slides.Count Debug.Print "Slide " & pres.Slides.Item(i).SlideNumber; " / " _ & pres.Slides.Count Next i Exit Sub errHandle: Debug.Print ("VBA Error: " & Err.Number & " " & Err.Description) & vbCr End Sub -
このコードを Module として追加します:
Dim cPPTObject As New cEventClass Sub Initialize_Eventhandler() Set cPPTObject.PPTEvent = Application Debug.Print "**** EventHandler active ****" End Sub - PowerPoint のプレゼンテーション ウィンドウで、Alt + F8 を押して Macro ウィンドウを開きます
- Initialize_Eventhandler マクロを Run します。
- 次に、破損した PowerPoint ファイルを開いて修復を試みます。
解決策
Microsoft がこのバグを修正するまでの一時的な回避策として、thinkcell を無効化できます。
- PowerPoint で thinkcell を無効化します: Insert > thinkcell > Tools
> Deactivate thinkcell
- 破損したファイルを開いて修復します
- PowerPoint で thinkcell を再度有効化します: Insert > thinkcell > Activate