【入門編】【初心者】マクロ有効プレゼンテーション(.pptm)からマクロを完全に除去した安全な「.pptx」を自動生成して別名保存するマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステップから抜け出し、いよいよ自分の手でコードを書いて自動化を成し遂げようとしているあなたへ、最高に実用的なテクニックをお伝えします。

今回は、業務の現場で非常によくある「あるある」な課題をスマートに解決するスクリプトを取り上げます。

それは、「社内用にマクロ(VBA)をガリガリ書いた『.pptm』ファイルから、危険なコードを綺麗さっぱり消し去り、安全な『.pptx』として社外やクライアントへワンクリックで配布できるように別名保存する」という自動化です。

「手動で別名保存して、VBAプロジェクトを開いて……ってやるのは面倒だし、うっかりコードを残したまま送りそうになる!」
そんなヒヤッとするリスクを、PowerPoint VBAの力で完全にハックしましょう。ここをクリアすれば、ファイルの保存とオブジェクト操作の基本はバッチリですよ。それでは、いってみましょう!

—

なぜ「マクロの除去+別名保存」を自動化するのか?

PowerPointでマクロを使う場合、ファイル形式は必ず「マクロ有効プレゼンテーション(拡張子:.pptm)」になります。しかし、この形式のまま社外にファイルを送ると、受け取った側でセキュリティ警告が出たり、マクロウイルスを疑われたりして印象がよくありません。

かといって、手動で「名前を付けて保存」から「PowerPoint プレゼンテーション(.pptx)」を選ぼうとすると、PowerPointは親切心(?)からこう聞いてきます。

> 「このプレゼンテーションには、VBAプロジェクトが含まれています。マクロなしの形式で保存すると、VBAプロジェクトは失われます。保存しますか?」

このポップアップ、毎回クリックするのは地味にストレスですよね。さらに、うっかり「はい」を押した後に、元の `.pptm` 側でコードを消し忘れて上書き保存してしまい、「自分の手元からマクロが消えた!!」という絶望的な事故を経験したエンジニアは数知れません。

だからこそ、「元の `.pptm` はそのまま保護しつつ、コードだけを剥ぎ取った `.pptx` を自動生成する」仕組みをマクロで構築してしまうのが、最も安全でスマートなプロの選択なのです。

—

魔法の解決コード(コピペで即動く!)

それでは、実際のコードを見てみましょう。
今あなたが作業している `.pptm` ファイルの標準モジュールに、以下のコードをそのまま貼り付けてください。

Sub SaveAsCleanPresentation()
Dim sourcePath As String
Dim extPos As Long
Dim newPath As String
Dim targetPres As Presentation

‘ 1. 現在のファイルが一度も保存されていない(パスがない)場合はエラーを防ぐため終了
If ActivePresentation.Path = “” Then
MsgBox “このプレゼンテーションはまだ保存されていません。” & vbCrLf & _
“一度保存してから実行してください。”, vbExclamation, “保存エラー”
Exit Sub
End If

‘ 2. 現在のファイルのフルパスと名前を取得
sourcePath = ActivePresentation.FullName

‘ 3. 拡張子(.pptm)の直前の位置を探し、”.pptx” に置き換えた新しいパスを作る
extPos = InStrRev(sourcePath, “.”)
newPath = Left(sourcePath, extPos – 1) & “_【配布用】” & “.pptx”

‘ 4. 現在のプレゼンテーションを「コピー」して新しいオブジェクトとして開く
‘ ※ActivePresentationを直接いじると元ファイルのマクロが消えてしまうため、必ず別名でSaveCopyAsする
On Error GoTo ErrorHandler

‘ 【重要】SaveCopyAsメソッドは、メモリ上のファイルを汚さずに指定パスへコピー保存する
ActivePresentation.SaveCopyAs newPath, ppSaveAsDefault

‘ 5. コピーしたファイル(.pptx)をバックグラウンド(またはウィンドウ)で開く
‘ ※PowerPoint VBAでは、保存されたファイルからVBAを直接消すことはセキュリティ上できないため、
‘ 一度PowerPointの外、またはPresentationオブジェクト経由で操作…したいところですが、
‘ 実はもっとシンプルな「隠しワザ」があります!

MsgBox “マクロを除去した安全なファイルを生成しました!” & vbCrLf & _
“保存先: ” & newPath, vbInformation, “完了”

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub

……おっと、ここで鋭い読者なら気がついたはずです。
「あれ? `SaveCopyAs` で `.pptx` として保存したら、本当にマクロは消えているの?」と。

実は、ここがPowerPoint VBAの少し厄介で、かつ知っておくべき極限の知見(罠)です。

—

⚠️ ここが重要!PowerPoint VBAのオブジェクトの裏側

Excel(VBA)の場合、`SaveAs` でファイル形式を変えればマクロは自動的に消えます。しかし、PowerPointの `SaveCopyAs`(または `SaveAs`)は、元の `.pptm` が持っているVBAプロジェクト(コード)をそのまま新しいファイルに引き継いでコピーしてしまう仕様になっています。

つまり、上記のコードのままでは、拡張子こそ `.pptx` になっていますが、中身を開くとちゃっかりマクロが生き残っているという「ゾンビファイル」が生まれてしまうのです。これではセキュリティリスクの排除にはなりませんよね。

「じゃあ、どうやってコードを完全に消すの?」
安心してください。プロのエンジニアは、ファイル保存のテクニックではなく、「ファイル変換の標準エンジン」を使います。

真に安全な `.pptx` を生成する、完成版のコードはこちらです!

—

【完全版】安全にマクロを消し去るプロのコード

PowerPointには、ファイルを特定の形式で「発行(Export)」あるいは「名前を付けて保存」する際に、VBAのコンポーネントを一切含まないクリーンな状態に強制変換するルートがあります。

以下のコードに書き換えて実行してみてください。

Sub CreateCleanPptxForDistribution()
Dim sourcePath As String
Dim extPos As Long
Dim newPath As String
Dim targetPres As Presentation

‘ 1. 未保存チェック
If ActivePresentation.Path = “” Then
MsgBox “このプレゼンテーションはまだ保存されていません。” & vbCrLf & _
“一度保存してから実行してください。”, vbExclamation, “保存エラー”
Exit Sub
End If

‘ 2. 配布用ファイルのパスを構築(元の名前の後に「_Clean」を付与)
sourcePath = ActivePresentation.FullName
extPos = InStrRev(sourcePath, “.”)
newPath = Left(sourcePath, extPos – 1) & “_Clean.pptx”

‘ 3. 【核心】一度「PowerPoint プレゼンテーション(マクロなし)」形式を指定して保存する
‘ ppSaveAsDefault は、元の拡張子(今回は.pptm)を引き継ごうとしますが、
‘ 拡張子に “.pptx” を明示して渡すことで、PowerPointは強制的にマクロを剥ぎ取った標準形式で保存します。
On Error GoTo ErrorHandler

‘ 現在のアクティブプレゼンテーションを別名で.pptxとして保存
‘ ※注意:これを行うと、VBAの仕様上、この直後から「このファイルにはマクロがありません」状態になるか、
‘ あるいは元の.pptmを保護するために、一度別ファイルとして切り離す必要があります。

‘ 安全のため、一度別名でコピーを作ってから開くアプローチをとります
ActivePresentation.SaveCopyAs newPath

‘ — ここからが職人技:生成された.pptxを裏で開き、万が一残ったVBAコンポーネントを完全破壊する —
Dim cleanPres As Presentation
Set cleanPres = Presentations.Open(newPath, ReadOnly:=False, WithWindow:=False)

‘ PowerPoint 2002以降、VBAから直接VBAProjectのコードモジュールを削除するには
‘ 「信頼できるトラスティッドアクセス」が必要ですが、もっと確実な方法があります。
‘ 実は、Presentation.SaveAsメソッドでファイル形式に `ppSaveAsDefault` (または指定なし) ではなく、
‘ 単に拡張子を .pptx にして SaveAs を行うと、VBAはパージ(削除)されます。

‘ 一度開いたクリーン用プレゼンテーションを、さらに安全な形式で上書き保存し直す
cleanPres.SaveAs newPath, ppSaveAsPresentation
cleanPres.Close

MsgBox “マクロを完全に除去した安全な「.pptx」の生成に成功しました!” & vbCrLf & _
“保存先: ” & newPath, vbInformation, “処理完了”

Exit Sub

ErrorHandler:
If Not cleanPres Is Nothing Then cleanPres.Close
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub

コードのポイント解説

1. `ActivePresentation.SaveCopyAs newPath`: 元のファイル(`.pptm`)を汚さずに、まずは指定したパスに丸ごとコピーを作ります。これで「自分の手元からマクロが消えてしまった!」という悲劇を100%防ぎます。
2. `Presentations.Open(…, WithWindow:=False)`: 画面にチラ見せすることなく(バックグラウンドで)、生成したコピーファイルをオブジェクトとしてメモリ上に呼び出します。
3. 安全な再保存とクローズ: 開いたクリーンファイルを適切なPowerPoint形式で再保存し、すぐに閉じます。これにより、VBAの残骸を完全にシャットアウトしたピカピカの `.pptx` が完成します。

—

陥りやすいエラーと初心者がハマる罠

罠1:セキュリティセンターの警告が出る

このマクロを実行した際、ExcelやPowerPointのセキュリティ設定によっては、「プログラムからVBAプロジェクトへのアクセスは信頼されていません」というエラーが出る場合があります。

  • 対策: PowerPointの `[ファイル]` > `[オプション]` > `[トラストセンター]` > `[トラストセンターの設定]` > `[マクロの設定]` から、「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェックを入れておく必要があります(※社内セキュリティポリシーに従ってください)。

罠2:パスに日本語や特殊文字が含まれていてエラーになる

`InStrRev` や文字列結合の処理で、ファイルパスに特定の記号が含まれていると、稀にパスが見つからないというエラー(実行時エラー ‘5’: プロシージャの呼び出しまたは引数が不正です)が発生します。

  • 対策: マクロを実行する大元の `.pptm` ファイルは、必ず一度デスクトップや分かりやすいフォルダに「名前を付けて保存」し、パスが通った状態(`ActivePresentation.Path` が空でない状態)で実行するようにしてください。

—

まとめ:自動化の第一歩を踏み出そう

今回は、マクロ有効プレゼンテーションから安全な `.pptx` を自動生成する実用的なスクリプトを解説しました。

  • 元ファイルを保護するために `SaveCopyAs` を使うこと。
  • 確実にマクロを排除するために、オブジェクトを操作してクリーンアップすること。

この2つを押さえておけば、ファイルの安全性と業務効率は劇的に向上します。ここをクリアできれば、PowerPoint VBAの基本はもうバッチリです!

ぜひ、あなたの日常の業務にこのコードを組み込んで、ワンクリックの快適さを味わってみてください。それでは、次のステップでお会いしましょう!

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