【入門編】【中級者】日付やバージョン番号(v1.0, v1.1…)をファイル名に自動付与し、世代管理を行いながら「上書き防止」で保存するスマート保存マクロ – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは。シニア・オートメーション・アーキテクトの私です。

PowerPointで資料を作成していて、こんなヒューマンエラーをやらかしたことはありませんか?

  • 「あぁっ!昨日作った最新版のデータの上に、今日の修正途中のデータを上書き保存しちゃった……!」
  • 「ファイル名が `企画書_最終版_本当に最終_rev2.pptx` みたいになって、どれが本当の最新かわからない……」

ビジネスの現場では、ファイルの「上書き事故」や「バージョン管理の混乱」は致命的なタイムロスを生みます。これを人間の記憶力や注意力で防ごうとするのは、最初から無理な相談です。

今回は、マクロの記録から一歩抜け出し、「ファイルを保存するボタンを押すだけで、自動的に日付とバージョン番号(v1.0, v1.1…)を付与し、絶対に既存ファイルを上書きしないスマートな世代管理マクロ」の作り方を解説します。

ここをクリアすれば、あなたのVBAスキルは「ただの自動化ツール使い」から「現場を救うアーキテクト」へと確実にワンランクアップします。一緒に本質を学んでいきましょう!

—

なぜ、このマクロが必要なのか?(設計思想の共有)

私たちが目指すのは、「思考停止で安全に保存できる仕組み」です。

多くの初学者は、「現在の日付」や「連番」をファイル名に入れようとするとき、毎回 `InputBox` で名前を聞かせたり、手動でキーボードから打たせたりしがちです。しかし、それではヒューマンエラーは防げません。

今回構築するマクロのアルゴリズムはこうです。
1. 現在開いているプレゼンテーションの「元の名前(プレフィックス)」を抽出する。
2. 保存先フォルダをスキャンし、同じ名前のファイルがすでに存在するか確認する。
3. 同名ファイルが存在する場合、バージョン番号(`v1.0`, `v1.1`…)を自動でインクリメント(+1)する。
4. 今日付(`YYYYMMDD`)を挟んで、美しく秩序あるファイル名で自動保存する。

これさえあれば、どれだけ慌てて保存ボタンを連打しても、大切な過去の成果物が消えることは絶対にありません。

—

現場で即戦力となる「スマート保存マクロ」全コード

それでは早速、実際のコードを公開します。
PowerPointのVBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてください。

Option Explicit

‘ =====================================================================
‘ 処理名: 世代管理付きスマート保存マクロ
‘ 概要 : 同名ファイルの存在を検知し、バージョンを自動付与して上書きを防止する
‘ =====================================================================
Sub SaveWithSmartVersioning()
Dim wsShell As Object
Dim targetPath As String
Dim baseName As String
Dim ext As String
Dim todayStr As String
Dim versionNum As Integer
Dim finalFileName As String
Dim fullPath As String
Dim fso As Object

‘ 1. プレゼンテーションが一度も保存されていない場合のガード処理
If ActivePresentation.Path = “” Then
MsgBox “このプレゼンテーションはまだ一度も保存されていません。” & vbCrLf & _
“一度、任意の名前で手動保存してからこのマクロを実行してください。”, _
vbExclamation, “保存エラー”
Exit Sub
End If

‘ 2. ファイルシステムオブジェクト(FSO)の生成(フォルダ操作の必需品)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 3. 基本情報の取得
‘ 例: C:\Reports\企画書.pptx から “C:\Reports” と “企画書” と “.pptx” を分解する
targetPath = ActivePresentation.Path

‘ 拡張子を除いたファイル名を取得する(例: “企画書_v1.0” からベース名を取り出すための前処理)
baseName = fso.GetBaseName(ActivePresentation.Name)
ext = “.” & fso.GetExtensionName(ActivePresentation.Name)

‘ すでに付いている古いバージョン表記(_v1.0など)をベース名から削ぎ落とす(正規表現的なアプローチ)
‘ ※ファイル名に “_v” が含まれている場合、その手前までをベース名とする
Dim vPos As Long
vPos = InStrRev(baseName, “_v”)
If vPos > 0 Then
baseName = Left(baseName, vPos – 1)
End If

‘ 4. 今日の日付文字列を取得 (YYYYMMDD形式)
todayStr = Format(Date, “yyyymmdd”)

‘ 5. バージョン番号の自動インクリメントロジック
versionNum = 1
Do
‘ 試行するファイル名を組み立てる: [ベース名]_[日付]_v[番号].[拡張子]
‘ 例: 企画書_20231024_v1.0.pptx
finalFileName = baseName & “_” & todayStr & “_v1.” & (versionNum – 1) & ext
fullPath = targetPath & “\” & finalFileName

‘ 同名ファイルが存在するかチェック
If Not fso.FileExists(fullPath) Then
Exit Do ‘ 存在しなければ、このファイル名を採用してループを抜け出す
End If

versionNum = versionNum + 1

‘ 無限ループ防止の安全装置(バージョンが100を超えたら異常終了)
If versionNum > 100 Then
MsgBox “バージョン番号が上限(100)を超えました。ファイル整理を行ってください。”, vbCritical
Exit Sub
End Sub
Loop

‘ 6. アクティブプレゼンテーションを指定パスで別名保存(上書き防止)
On Error GoTo ErrorHandler
ActivePresentation.SaveAs fullPath
On Error GoTo 0

‘ 7. 成功通知(邪魔にならないステータスバー表示、または控えめなMsgBox)
MsgBox “スマート保存が完了しました!” & vbCrLf & _
“保存ファイル名: ” & finalFileName, vbInformation, “保存成功”

Exit Sub

ErrorHandler:
MsgBox “保存中にエラーが発生しました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
End Sub

—

コードの核心を読み解く:3つの重要ポイント

プログラミング初学者から一歩抜け出すために、このコードで使われている「エンジニアの知恵」を3つに絞って解説します。

① `FileSystemObject (FSO)` の活用

VBAには標準でファイルパスを操作する関数(`Dir`や`Mid`など)がありますが、少々癖が強く複雑になりがちです。
プロの現場では、Windowsのファイルシステムを直感的に操る `Scripting.FileSystemObject` を使います。
`fso.GetBaseName` や `fso.FileExists` を使うことで、OS依存のパスエラーを綺麗に回避し、堅牢なコードを書くことができます。

② バージョン表記の「剥ぎ取り(ストリッピング)」

ここがこのマクロの最もスマートな部分です。
もしユーザーが `企画書_20231024_v1.0.pptx` を開いた状態で何度も保存を実行したとき、ファイル名が `企画書_20231024_v1.0_v1.1.pptx` のように無限に縦長になっていったら最悪ですよね。
コード内の `InStrRev` を使った処理は、「すでに付いているバージョン部分を綺麗に脱ぎ捨ててから、新しいバージョンの数字を採番し直す」という高度なクリーニングを行っています。

③ 無限ループを防ぐ「番兵(ガード)」

`Do … Loop` を使うときは、必ず「抜け道」を用意するのがエンジニアの鉄則です。もし何らかのバグでファイルが存在し続けたら、プログラムは永遠に止まらなくなってしまいます(フリーズの原因)。
ここでは `If versionNum > 100 Then` という安全装置(番兵)を置き、暴走を未然に防ぐ設計にしています。

—

現場で陥りがちなエラーと対策

1. 「このプレゼンテーションはまだ一度も保存されていません」と怒られる

  • 原因: 新規作成しただけのPowerPoint(まだ名前をつけて保存していない状態)は、`ActivePresentation.Path`(保存場所)が空っぽ(`””`)です。
  • 対策: マクロを実行する前に、必ず一度手動で任意のフォルダに保存してください。

2. ファイルが開いたまま上書きできないエラーが出る

  • 原因: このマクロは「別名で保存(`SaveAs`)」を使用しているため、同名ファイルが開かれているわけではなく新規ファイルとして保存されます。ただし、ネットワークドライブの権限やOneDriveの同期タイミングによっては一時的にロックがかかることがあります。
  • 対策: 保存先がローカルPCの同期フォルダ(OneDrive等)の場合は、少し時間を置いてから実行するか、同期競合が発生していないか確認してください。

—

まとめ:ここをクリアすれば、PowerPoint VBAの基本はバッチリ!

お疲れ様でした!今回のテーマを通じて、以下のスキルが身についたはずです。

  • オブジェクトのパスや名前を分解・再構築する文字列操作
  • ファイルシステムの有無を判定し、安全に分岐させるロジック
  • `Do Loop` と安全装置を組み合わせた堅牢なプログラミング

これらはPowerPointだけでなく、ExcelやWordのVBA、さらには本格的なシステム開発の現場でもそのまま通用する普遍的なテクニックです。

「手作業の繰り返し」や「ヒューマンエラーの恐怖」から自分とチームを解放できるのは、マクロを書けるエンジニアの特権です。ぜひ、あなたの仕事の現場にこのスマート保存マクロを導入し、快適なプレゼンテーションライフを手に入れてください。

それでは、次のステージでお会いしましょう。あなたの開発ライフが素晴らしいものになりますように!

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