【入門編】【初心者】編集中のプレゼンテーションに「社外秘」や「ドラフト」などのスライド固有のタイトルをファイル名に自動付与して上書きを防ぐ保存マクロ – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!パワポの単純作業に深夜まで付き合わされて、目が血走っていませんか?
「また上書き保存しちゃった…さっきの修正前のデータ、どこだっけ?」
そんなビジネスパーソンの悲鳴を、今日で完全に終わらせましょう。

私はこれまで数々の現場で、手作業による地獄のようなファイル管理を自動化してきたエンジニアです。今回は、PowerPoint VBAの入門編として、「編集中のスライドのタイトル(表題)を自動で読み取り、それをファイル名にドッキングさせて安全に保存する」という、実務で明日から使える神マクロを伝授します。

ここをクリアすれば、PowerPoint VBAの基本構造はバッチリです。優しく、そして本質的に解説していくので、リラックスしてついてきてくださいね。

—

なぜ「上書き保存ミス」は起きるのか?(そしてどう防ぐべきか)

私たちは日々、「〇〇提案書_修正版_v2(最終).pptx」のような混沌としたファイル名と戦っています。
特に、テンプレートを開いて編集し、うっかり「上書き保存(Ctrl + S)」を押してしまったときの絶望感といったらありませんよね。

これを防ぐための決定打が、「VBAにファイル名を自動生成させる」ことです。
人間の手でファイル名を打つからミスが起きる。ならば、PowerPointに「1枚目のスライドのタイトルは何?」と尋ね、その答えをファイル名の一部として強制的に組み込んでしまえばいいのです。

—

開発の第一歩:PowerPointでVBAを使えるようにする

まずは魔法の呪文を書き込むための「開発環境」を準備しましょう。初期状態のPowerPointには、エンジニアの扉は隠されています。

1. PowerPointを開き、画面上部のリボンメニューの何もないところで右クリックし、「リボンのユーザー設定」を選びます。
2. 画面右側のリストにある「開発」にチェックを入れ、「OK」を押します。
3. これで、メニューに「開発」タブが出現しました。ここが私たちのラボ(研究所)です。

—

【実戦】一撃で安全保存を実現するVBAコード

「開発」タブの中にある「Visual Basic」をクリック(または `Alt + F11`)すると、VBAの専用エディタが起動します。
「挿入」>「標準モジュール」をクリックし、以下のコードをそのままコピペしてください。

ここには、PowerPoint VBAの基本がすべて詰まっています。

Sub SaveWithSlideTitlePrefix()
‘ =====================================================================
‘ 目的: 1枚目のスライドのタイトルをファイル名に自動付与し、上書きを防ぐ安全保存マクロ
‘ ターゲット層: マクロの記録から一歩抜け出したいあなたへ
‘ =====================================================================

Dim targetPresentation As Presentation
Dim firstSlide As Slide
Dim slideTitle As String
Dim originalPath As String
Dim folderPath As String
Dim baseName As String
Dim extension As String
Dim newFileName As String
Dim fso As Object

‘ 1. 現在アクティブな(編集中の)プレゼンテーションを取得
Set targetPresentation = ActivePresentation

‘ 2. 未保存の新規ファイルの場合はエラーになるため、一度保存を促すガード処理
If targetPresentation.Path = “” Then
MsgBox “このファイルはまだ一度も保存されていません。” & vbCrLf & _
“まずは通常の「名前を付けて保存」を一度行ってから、このマクロを実行してください。”, _
vbExclamation, “安全装置作動”
Exit Sub
End If

‘ 3. 1枚目のスライドが存在するか確認して取得
If targetPresentation.Slides.Count < 1 Then MsgBox "スライドが1枚も存在しません。", vbCritical, "エラー" Exit Sub End If Set firstSlide = targetPresentation.Slides(1) ' 4. 1枚目のスライドからタイトル文字列の抽出を試みる slideTitle = "" On Error Resume Next ' 万が一タイトルプレースホルダーがない場合のエラー回避 If firstSlide.Shapes.HasTitle Then slideTitle = firstSlide.Shapes.Title.TextFrame.TextRange.Text End If On Error GoTo 0 W ' タイトルが取得できなかった場合のフォールバック(代替処理) If Trim(slideTitle) = "" Then slideTitle = "無題スライド" End If ' ===================================================================== ' 5. ファイル名に使用できない文字(禁則文字)の簡易クレンジング ' ===================================================================== slideTitle = Replace(slideTitle, vbCrLf, "") ' 改行を削除 slideTitle = Replace(slideTitle, vbCr, "") slideTitle = Replace(slideTitle, vbLf, "") slideTitle = Replace(slideTitle, "/", "_") ' フォルダパスと誤認される記号を置換 slideTitle = Replace(slideTitle, "\", "_") slideTitle = Replace(slideTitle, ":", "_") slideTitle = Replace(slideTitle, "", "_") slideTitle = Replace(slideTitle, "?", "_") slideTitle = Replace(slideTitle, """", "_") slideTitle = Replace(slideTitle, "<", "_") slideTitle = Replace(slideTitle, ">“, “_”)
slideTitle = Replace(slideTitle, “|”, “_”)

‘ 文字数が長すぎる場合の切り詰め(ファイル名ティアラ対策:最大30文字まで)
If Len(slideTitle) > 30 Then
slideTitle = Left(slideTitle, 30)
End If

‘ =====================================================================
‘ 6. ファイルパスの組み立てと別名保存(SaveAs)の実行
‘ =====================================================================
folderPath = targetPresentation.Path & “\”

‘ ファイルの拡張子とベース名を分離して取得するためにFileSystemObjectを使用
Set fso = CreateObject(“Scripting.FileSystemObject”)
baseName = fso.GetBaseName(targetPresentation.Name)
extension = “.” & fso.GetExtensionName(targetPresentation.Name)

‘ 新しいファイル名の構築: 【社外秘】元のファイル名_スライドタイトル.pptx
‘ ※ここで「社外秘」や「ドラフト」といったプレフィックスを強制付与します
newFileName = folderPath & “【社外秘】” & baseName & “_” & slideTitle & extension

‘ 実行確認のメッセージ
Dim confirmResult As VbMsgBoxResult
confirmResult = MsgBox(“以下のファイル名で新規に保存しますか?” & vbCrLf & vbCrLf & _
“保存先: ” & newFileName, _
vbQuestion + vbYesNo, “安全保存の確認”)

If confirmResult = vbYes Then
‘ 別名で保存(元のファイルを上書きしない!)
targetPresentation.SaveAs newFileName
MsgBox “保存が完了しました!元のファイルは上書きされていません。”, vbInformation, “成功”
Else
MsgBox “保存をキャンセルしました。”, vbInformation, “キャンセル”
End If

‘ オブジェクトの解放
Set fso = Nothing
Set firstSlide = Nothing
Set targetPresentation = Nothing

End Sub

—

コードの本質:エンジニアが仕込んだ「3つのこだわり」

このコードが単なる「おもちゃのマクロ」ではなく、実務で耐えうるプロの設計になっている理由を3つ解説します。

① 未保存ファイルに対する「安全装置(ガード節)」

初心者のVBAで最も多いエラーが、`ActivePresentation.Path` が空(まだ一度も保存されていない状態)のときに `SaveAs` を実行してフリーズ、あるいは予期せぬエラーを起こすケースです。
コードの序盤で `If targetPresentation.Path = “” Then` を設けることで、事故を未然に防いでいます。

② Windowsの禁則文字クリーニング

スライドのタイトルには、「/(スラッシュ)」や「?(クエスチョンマーク)」といった、Windowsのファイル名に使えない文字が含まれがちです。これを放置するとVBAは容赦なくエラーを吐いて停止します。
`Replace` 関数を使って、これらを安全なアンダースコア `_` に自動置換する処理を入れているのが、このコードの隠れた最大の強みです。

③ 「上書き」ではなく「別名保存(SaveAs)」の徹底

元のテンプレートや親ファイルを破壊しないよう、`SaveAs` を使って新しいファイル名としてディスクに書き出しています。これにより、オリジナルを守りながら、派生ファイルを安全に量産できるようになります。

—

さらに実務で使いこなすためのヒント

このマクロをさらに便利にするために、以下のカスタマイズもおすすめです。

  • プレフィックスの切り替え:

コード内の `【社外秘】` の部分を、変数やダイアログで「【ドラフト】」「【提出用】」に動的に切り替えられるように改造すると、さらに活用の幅が広がります。

  • クイックアクセスツールバーへの登録:

PowerPointの画面左上にある「クイックアクセスツールバー」にこのマクロを登録しておけば、ボタンひとつでいつでもこの安全保存が発動できるようになります。

—

ここをクリアすれば、PowerPoint VBAの基本はバッチリですよ!

お疲れ様でした!ここまで読み解けたあなたは、単なる「パワポの操作係」から「業務自動化をデザインするエンジニア」へと一歩踏み出しています。

オブジェクトの取得、条件分岐、文字列の置換、そしてファイルの保存。プログラミングの基礎の美味しいところがすべてこの短いコードに凝縮されています。

明日からのプレゼン資料作り、このマクロでヒヤヒヤするストレスから解放されてくださいね。あなたのエンジニアライフが少しでもスマートになりますように!

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