【入門編】【初心者向け】読み取り専用で開いたプロジェクトを、別名で自動保存して編集作業を開始する自動化フロー – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
「マクロの記録」ボタンを押してExcelの自動化から一歩踏み出したものの、MS ProjectのVBAを開いた途端、その独特なオブジェクトモデルに圧倒されていませんか?

「せっかく作ったスケジュールを、うっかり元のマスタファイルに上書き保存してしまい、冷や汗をかいた……」
そんなヒヤリハット、現場のプロジェクトマネージャーなら誰もが一度は経験する悲劇です。

今回は、「読み取り専用で開いたプロジェクトを、自動的に安全な別名で保存し、そのままスムーズに編集作業へ移行する自動化ルーチン」を構築します。

ここをクリアすれば、Project VBAの基本構造や、ファイル(Project)のライフサイクルが手に取るように分かりますよ。さあ、一緒に安全でスマートな自動化の世界へ進みましょう!

1. なぜ「読み取り専用」からの別名保存が必要なのか?

MS Projectで複数人が参照するマスター工程表などを扱うとき、最も恐ろしいのは「うっかり上書き保存」です。これを防ぐために「読み取り専用(Read-Only)」で開く運用ルールにしても、人間はうっかり忘れる生き物です。

そこで、VBAの出番です。
プロジェクトファイルを開いた瞬間(正確には開いた直後)に、VBAのプログラムが自動で動き出し、
1. 今開いたファイルが「読み取り専用」かどうかを判定する
2. 読み取り専用だった場合、現在の日付などを付与した新しいファイル名で自動保存する
3. ユーザーには「安全な作業用ファイルが開きましたよ」と優しく伝える

この仕組みを仕込んでおけば、もう上書き事故に怯える必要はありません。

2. Project VBAの心臓部:`Auto_Open` と `ActiveProject`

Excel VBAでは `Workbook_Open` というイベントお馴染みですが、Project VBAでは少々勝手(ライフサイクル)が異なります。

Projectファイルが開かれたときに自動実行させたい場合、標準モジュール内に `Auto_Open` サブルーチン を定義するのが最も確実でシンプルなアプローチです。

そして、Project VBAで現在操作しているファイルを指し示すのが `ActiveProject` オブジェクトです。これに「読み取り専用か?」を問うプロパティや、「名前を付けて保存する」メソッドを組み合わせていきます。

3. 実装コード:安全起動ルーチン

以下のコードを、MS ProjectのVBAエディタ(`[Alt] + [F11]`)を開き、「標準モジュール」に貼り付けてください。

‘ =====================================================================
‘ テーマ:読み取り専用で開いたプロジェクトを自動で別名保存する安全起動ルーチン
‘ 執筆者:シニアVBAアーキテクト
‘ =====================================================================

Sub Auto_Open()
Dim prj As Project
Set prj = ActiveProject

‘ 【1】現在アクティブなプロジェクトが「読み取り専用」かチェックする
If prj.ReadOnly = True Then

‘ ユーザーに現在の状況を優しく通知
MsgBox “このプロジェクトは「読み取り専用」で開かれました。” & vbCrLf & _
“元のファイルを保護するため、自動的に作業用ファイルとして別名保存します。”, _
vbInformation, “安全起動ガードシステム”

‘ 【2】新しいファイル名を動的に生成する(例: 元のファイル名_YYYYMMDD_作業用.mpp)
Dim originalPath As String
Dim originalName As String
Dim extPosition As Integer
Dim newFileName As String
Dim newFullPath As String

originalPath = prj.FullName

‘ フルパスから拡張子(.mpp)を除いたファイル名を取り出す
extPosition = InStrRev(originalPath, “.”)
originalName = Left(originalPath, extPosition – 1)

‘ プレフィックスとして今日の日付(例: 20231024)を付与
Dim dateStr As String
dateStr = Format(Date, “YYYYMMDD”)

‘ 保存先のパスを構築(元ファイルと同じフォルダに保存する場合)
newFullPath = originalName & “_” & dateStr & “_作業用.mpp”

On Error GoTo ErrorHandler

‘ 【3】別名で保存を実行する
‘ FileFormat:=pjFileMPP はMS Projectの標準形式を指定しています
FileSaveAs Name:=newFullPath, FileFormat:=pjFileMPP

MsgBox “別名保存が完了しました!” & vbCrLf & _
“保存先: ” & newFullPath & vbCrLf & _
“ここから安心して編集作業を開始してください。”, _
vbInformation, “準備完了”

Else
‘ すでに編集可能な状態で開かれている場合
MsgBox “編集可能な状態でプロジェクトが開かれました。” & vbCrLf & _
“今日も一日、安全なプロジェクト管理を!”, _
vbInformation, “通常起動”
End If

Exit Sub

ErrorHandler:
‘ 万が一、保存時にエラー(フォルダの権限がない等)が発生した場合のトラップ
MsgBox “【エラー】別名保存に失敗しました。” & vbCrLf & _
“エラー内容: ” & Err.Description & vbCrLf & _
“手動で「名前を付けて保存」を行ってください。”, _
vbCritical, “緊急エラー”
End Sub

4. コードの深掘り解説:ここがプロの技

初学者のうちは難しく見えるかもしれませんが、ポイントはたったの3つです。

① `prj.ReadOnly` プロパティの活用

Excel同様、Projectオブジェクトにも「読み取り専用か?」を判定する `ReadOnly` プロパティ(Boolean型)が用意されています。これを使うことで、「開くモード」に応じた条件分岐が完璧にコントロールできます。

② 文字列操作による安全なファイル名生成

`InStrRev` 関数を使って、ファイルパスの後ろからドット(`.`)の位置を探し、拡張子の手前までの文字列を抽出しています。そこに `Format(Date, “YYYYMMDD”)` で今日の日付を挟み込むことで、上書きされにくいユニークな作業用ファイル名を自動生成しています。

③ `FileSaveAs` メソッドの明示的な指定

Project VBAでファイルを別名保存するときは `FileSaveAs` メソッドを使います。引数に `Name` と `FileFormat` を正しく渡すことで、ファイル形式のバグを防ぎます。

5. 初学者が陥りやすい罠とエラー回避のコツ

罠1:コードを入れたのに `Auto_Open` が動かない!

  • 原因: コードを「ThisProject」モジュールに書いていませんか?
  • 解決策: Project VBAのイベントや自動実行マクロは、「標準モジュール」(挿入 > 標準モジュール)の中に記述しないと動かない仕様になっています。ここがExcel VBA(ThisWorkbookに書く)との大きな違いなので注意しましょう。

罠2:保存先フォルダの書き込み権限エラー

  • 原因: 共有サーバーの「読み取り専用フォルダ」にあるファイルを元ファイルにしている場合、同じ場所に別名保存しようとするとエラー(権限不足)になります。
  • 応用テクニック: 現場の実務では、保存先をローカルのデスクトップ(`Environ(“USERPROFILE”) & “\Desktop\”` など)に指定してあげる親切設計にすると、より堅牢なシステムになりますよ。

まとめ

今回は、Project VBAの基本オブジェクトである `ActiveProject` を操作しながら、読み取り専用からの自動別名保存ルーチンを作成しました。

  • `Auto_Open` でファイルオープン時の自動化をフックする
  • `ReadOnly` プロパティで状態を正確に検知する
  • `FileSaveAs` で安全に別名保存へ導く

このフローをマスターすれば、あなたのプロジェクト管理における「うっかりミス」は完全にゼロになります。業務自動化エンジニアとしての第一歩、おめでとうございます!

ここをクリアできれば、Project VBAの基本はバッチリです。ぜひ明日の実務から試してみてくださいね。それでは、また次回の極限知見でお会いしましょう!

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