【入門編】【プロフェッショナル】Application.FileConvertersの限界を突破:古いPowerPoint 95-2003形式(.ppt)のVBAコードを最新の.pptm形式へ移植する際のマクロ有効化・セキュリティ警告自動突破技術 – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPoint VBAの世界へようこそ。
今日は、少しマニアックだけど、企業の現場で絶大な需要がある「レガシー資産のモダン化」というテーマについてお話ししていくよ。

「古いPowerPoint 95-2003形式(`.ppt`)に眠っている大切なVBAコードを、最新のセキュリティが厳しい`.pptm`形式へ安全に、かつ自動で移植したい!」
そんな現場の切実な悩みを解決する、超上級バッチシステムの裏側を覗いてみよう。

「マクロの記録」から一歩進んで、PowerPointのオブジェクトモデルの深淵に触れる旅になるけれど、一歩ずつ優しく解説していくから安心してついてきてね。ここをクリアすれば、君も立派なPowerPoint VBAのアーキテクトだ!

1. なぜ `.ppt` から `.pptm` への移行は一筋縄ではいかないのか?

私たちが普段何気なく使っているPowerPointですが、ファイル形式の歴史には大きな壁がある。
それが、「バイナリ形式(.ppt)」「OpenXML形式(.pptm / .pptx)」の壁だ。

古い `.ppt` ファイルには、独自のVBAプロジェクトがバイナリの海の中に埋め込まれている。これを最新の `.pptm` に変換する際、以下の3つの巨大な障壁が立ちはだかるんだ。

1. セキュリティ警告のブロック:現代のOfficeは、マクロ付きファイルをデフォルトで厳しくブロックする。
2. オブジェクトモデルの構造変化:`.ppt` と `.pptm` では、内部のVBAコンポーネント(VBProject)へのアクセス権限や挙動が微妙に異なる。
3. 参照設定の破損:古いActiveXコントロールやライブラリを参照している場合、移行時にコードがクラッシュする。

「手動で一つずつファイルを開いて、コードをコピーして……」なんて、100個もファイルがあったら発狂しそうになるよね? だからこそ、これをVBAのコードで完全自動化する仕組みが必要なんだ。

2. PowerPoint VBAの基礎:オブジェクトモデルの三兄弟を知ろう

本格的なコードを書く前に、PowerPoint VBAの基本中の基本、オブジェクトモデルの「三兄弟」をおさらいしておこう。

  • `Application`(長男:アプリ全体)

PowerPointそのものを表す。画面の表示・非表示や、セキュリティ設定の管理など、全体を統括するよ。

  • `Presentation`(次男:ファイル)

開かれている個々のプレゼンテーションファイル(`.ppt`や`.pptm`)を表す。

  • `Slide`(三男:スライド)

ファイルの中にある1枚1枚のスライドを表す。

今回のミッションでは、長男の `Application` に安全な環境を作ってもらい、次男の `Presentation` を次々と召喚して、内部のコードをゴッソリ摘出・移植していくことになる。

3. 信頼できるパス(Trusted Locations)の罠を突破する

レガシーなマクロを自動処理する上で最大の敵が、「VBAプロジェクトへのプログラムからのアクセスへの信頼」というセキュリティ設定だ。ここがオフになっていると、VBAから他のファイルのコードを読み書きした瞬間にエラー(実行時エラー’1004’など)で強制終了させられてしまう。

プロとして、このセキュリティリスクをプログラム側、あるいは事前の環境構築でどうクリアするかを意識することが重要なんだ。

4. 実践!レガシーVBAコード自動抽出・移植バッチシステム

お待たせしました。ここからが本題だ。
特定のフォルダ内にある古い `.ppt` ファイルを自動で開き、内部のVBAモジュールをすべてテキストとして書き出し、新しい `.pptm` ファイルを新規作成してモジュールをインポートする、プロ仕様の自動化スクリプトを公開しよう。

このコードは、現在開いているプレゼンテーション(または適当な新規プレゼンテーション)の標準モジュールに貼り付けて実行してね。

Option Explicit

‘ ==============================================================================
‘ 【プロフェッショナル仕様】レガシー.pptから最新.pptmへのVBAコード自動移植ツール
‘ 前提条件: PowerPointのセキュリティセンターで
‘ 「VBA プロジェクトへのプログラムからのアクセスを信頼する」にチェックが入っていること
‘ ==============================================================================
Sub MigrateLegacyPresentationMacro()
Dim targetFolder As String
Dim fileName As String
Dim oldPath As String
Dim newPath As String
Dim pptOld As Presentation
Dim pptNew As Presentation

‘ 対象となるフォルダパスを指定(環境に合わせて変更してください)
targetFolder = “C:\LegacyPptFolder\”

If Dir(targetFolder, vbDirectory) = “” Then
MsgBox “指定されたフォルダが存在しません: ” & targetFolder, vbCritical, “パスエラー”
Exit Sub
}

‘ 画面描画を停止してパフォーマンスを極限まで高める(お約束のプロ技!)
Application.ScreenUpdating = False

‘ フォルダ内のすべての .ppt ファイルをスキャン
fileName = Dir(targetFolder & “.ppt”)

Do While fileName <> “”
‘ .pptm は除外する(.ppt や .pps などレガシーなものだけを対象に)
If LCase(Right(fileName, 4)) = “.ppt” Then
oldPath = targetFolder & fileName
newPath = targetFolder & Replace(fileName, “.ppt”, “.pptm”)

On Error GoTo ErrorHandler

‘ 1. 古いプレゼンテーションを読み取り専用でサイレントオープン
Set pptOld = Presentations.Open(FileName:=oldPath, ReadOnly:=True, WithWindow:=msoFalse)

‘ 2. 最新の .pptm 形式で空のプレゼンテーションを新規作成
Set pptNew = Presentations.Add(WithWindow:=msoFalse)

‘ 3. スライドを丸ごと最新ファイルへコピー(スライドの移植)
Dim sld As Slide
For Each sld In pptOld.Slides
sld.Copy
pptNew.Slides.Paste
‘ クリップボードをクリアしてメモリリークを防ぐ
Next sld

‘ 4. VBAコンポーネント(モジュールやクラス)の移植処理
Call ExportAndImportVBA(pptOld, pptNew)

‘ 5. 新しい .pptm 形式として保存
pptNew.SaveAs FileName:=newPath, FileFormat:=ppSaveAsOpenXMLPresentationMacroEnabled

‘ クリーンアップ
pptOld.Close
pptNew.Close

Debug.Log “成功: ” & fileName & ” -> 移植完了”
End If

NextFile:
fileName = Dir()
Loop

Application.ScreenUpdating = True
MsgBox “すべてのレガシー資産の移植が完了しました!”, vbInformation, “完了”
Exit Sub

ErrorHandler:
MsgBox “ファイル ” & fileName & ” の処理中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbExclamation, “移植エラー”

‘ エラー時もオブジェクトを確実に解放して安全にループを継続
If Not pptOld Is Nothing Then pptOld.Close
If Not pptNew Is Nothing Then pptNew.Close
Resume NextFile
End Sub

‘ ——————————————————————————
‘ 補助ルーチン:VBAプロジェクトのコンポーネントを移行する
‘ ——————————————————————————
Private Sub ExportAndImportVBA(srcPres As Presentation, destPres As Presentation)
Dim vbComp As Object
Dim exportPath As String
Dim tempFiles As Collection
Set tempFiles = New Collection

‘ 一時保存用のフォルダパス
exportPath = Environ(“TEMP”) & “\”

On Error GoTo CleanUp

‘ 元ファイルからすべてのVBAコンポーネントを一時ファイルとしてエクスポート
For Each vbComp In srcPres.VBProject.VBComponents
‘ 標準モジュール、クラスモジュール、フォームなどを対象にする(文書モジュール以外)
If vbComp.Type = 1 Or vbComp.Type = 2 Or vbComp.Type = 3 Then
Dim compFileName As String
compFileName = exportPath & vbComp.Name & GetExtension(vbComp.Type)

vbComp.Export compFileName
tempFiles.Add compFileName

‘ 新しいファイルへインポート
destPres.VBProject.VBComponents.Import compFileName
End If
Next vbComp

CleanUp:
‘ 一時ファイルを削除してゴミを残さない
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim f As Variant
For Each f in tempFiles
If fso.FileExists(f) Then fso.DeleteFile f
Next f
End Sub

‘ ——————————————————————————
‘ 補助ルーチン:コンポーネントの種類に応じた拡張子を返す
‘ ——————————————————————————
Private Function GetExtension(compType As Long) As String
Select Case compType
Case 1: GetExtension = “.bas” ‘ 標準モジュール
Case 2: GetExtension = “.cls” ‘ クラスモジュール
Case 3: GetExtension = “.frm” ‘ ユーザーフォーム
Case Else: GetExtension = “.txt”
End Select
End Function

5. 陥りやすいエラーとプロの回避術

このコードを動かすときに、初心者が必ずと言っていいほど躓くポイントが2つある。ここを覚えておくだけで、トラブルシューティングのスピードが何倍も早くなるよ。

エラー①:「プロジェクトへのプログラムからのアクセスは信頼されていません」

  • 原因:ExcelやPowerPointのセキュリティ設定で、外部からVBAのコードを触ることが禁止されている。
  • 対策

1. PowerPointを開き、`ファイル` > `オプション` > `セキュリティ センター` > `セキュリティ センターの設定` を開く。
2. `マクロの設定` 項目にある 「VBA プロジェクトへのプログラムからのアクセスを信頼する」 にチェックを入れる。

エラー②:コンパイルエラー(`VBProject` が認識されない)

  • 原因:VBAの参照設定に「Microsoft Visual Basic for Applications Extensibility 5.3」が追加されていない。
  • 対策

VBAのコードエディタ画面(`Alt + F11`)を開き、上部メニューの `ツール` > `参照設定` から 「Microsoft Visual Basic for Applications Extensibility X.X」 にチェックを入れてね。これがないと、プログラムからコードの輸出入ができないんだ。

最後に:ここをクリアすれば、君はもう初心者じゃない

レガシーな `.ppt` から `.pptm` への移行は、単なるファイルの形式変換ではない。過去のエンジニアが残した貴重な知見(マクロ)を、現代のセキュリティ基準を満たしたモダンな環境へと蘇らせる、非常に価値の高いエンジニアリングだ。

Applicationオブジェクトの制御、画面描画の抑制、VBProjectを通じたコードの動的操作……これらを使いこなせれば、君はもう「マクロを記録する人」ではなく、立派な「PowerPoint VBAアーキテクト」だ。

ぜひ自分の開発環境で試して、自動化の爽快感を味わってみてほしい。
もし分からないところがあれば、いつでも先輩エンジニアに聞いてくれよな!

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