こんにちは!Project VBAの世界へようこそ。
日々、プロジェクト管理で多くのメンバーとファイルを共有していると、こんなストレスにぶつかったことはありませんか?
「あ、誰かがこのプロジェクトファイルを開いているから、『読み取り専用』になっちゃった……」
「このままじゃ編集して保存できないから、わざわざ『名前を付けて保存』し直して……って、あーっ!うっかり元の共有ファイルを上書きしそうになった!」
現場のイライラをスマートに解消し、安全かつ爆速で作業をスタートさせる。今回は、そんな「かゆいところに手が届く」実用的な自動化フローを一緒に作っていきましょう。
ここをクリアすれば、Project VBAの基本と「ファイル・オブジェクトの安全な扱い方」がバッチリ身につきますよ。さあ、肩の力を抜いて、一緒にコードの扉を開いてみましょう!
—
なぜ「読み取り専用」で開くと事故が起きるのか?
複数人でプロジェクトを管理する現場では、MS Projectのファイル(`.mpp`)がサーバーや共有フォルダに置かれることがよくあります。
先客がファイルを開いている状態であなたがアクセスすると、Projectは親切心(?)から「読み取り専用」でファイルを開きます。
この状態でうっかり編集を加え、「上書き保存」ボタンを押しでもしたら……?
- 「他のユーザーが変更した内容を上書きして消してしまった!」
- 「自分の作業内容が保存できなくて泣く泣くゼロからやり直しになった!」
こうした悲劇は、「共有ファイルを開いた瞬間、即座に別名でローカル(自分の手元)へ保存し、作業用ファイルに切り替える」というルーチンを自動化してしまえば、完全に防ぐことができます。
—
全体像:自動化フローの設計図
今回実装するVBAのマクロの動きは、たったこれだけです。
1. ベースとなる共有ファイルを開く
2. 「今開いたファイル、読み取り専用になってないか?」をVBAに判定させる
3. もし読み取り専用なら、今日の 日付をファイル名に付けて、指定した作業用フォルダに「名前を付けて保存」する
4. そのままシームレスに作業を続行する
これらをすべて、マクロ一発で裏側で処理させます。
—
実装コード:そのまま使える実用マクロ
それでは、開発の現場でそのままコピペして使えるコードを公開します。
VBE(Visual Basic Editor)を開き、標準モジュールに貼り付けてみてください。
Sub OpenAndSaveAsEditable()
‘ =====================================================================
‘ 目的: 共有ファイルを読み取り専用で開いた際、自動で別名保存して作業用にする
‘ 著者: チーフアーキテクト(あなたを応援する先輩より)
‘ =====================================================================
Dim originalPath As String
Dim workFolder As String
Dim newFileName As String
Dim newFullPath As String
Dim targetProj As Project
‘ 【設定エリア】環境に合わせてフォルダパスを変更してください
originalPath = “C:\SharedProjects\MasterSchedule.mpp” ‘ 共有ファイルのパス
workFolder = “C:\MyWorkSpace\” ‘ あなたのローカル作業フォルダ
On Error GoTo ErrorHandler
‘ 1. 共有ファイルをバックグラウンド(ウィンドウ非表示などお好みで)で開く
‘ ※既に開いている場合はエラーになるため、通常のFileOpenを使用します
FileOpen Name:=originalPath, ReadOnly:=True
‘ 今アクティブになったプロジェクトをオブジェクトとして変数に格納
Set targetProj = ActiveProject
‘ 2. 本当に「読み取り専用」で開かれているかチェック
If targetProj.ReadOnly Then
MsgBox “共有ファイルが使用中のため、読み取り専用で開きました。” & vbCrLf & _
“安全に作業するため、自動で別名保存して作業用ファイルに切り替えます。”, _
vbInformation, “自動保存モード起動”
‘ 3. ファイル名に「今日の日付(YYYYMMDD)」を付与して一意のファイル名を作る
‘ 例: MasterSchedule_20231025.mpp
newFileName = Left(targetProj.Name, InStr(targetProj.Name, “.”) – 1) & _
“_” & Format(Date, “YYYYMMDD”) & “.mpp”
newFullPath = workFolder & newFileName
‘ 4. 別名で保存する(FileSaveAsメソッドを使用)
‘ ※pjMppはMS Projectの標準ファイル形式を表す定数です
FileSaveAs Name:=newFullPath, FormatID:=”MSProject.Mpp”
MsgBox “作業用ファイルの準備が完了しました!” & vbCrLf & newFullPath, _
vbInformation, “準備完了”
Else
‘ 奇跡的に誰も使っていなくて、普通に編集権限持ちで開けた場合
MsgBox “編集権限のある状態でファイルを開きました。”, vbInformation, “通常オープン”
End If
Exit Sub
ErrorHandler:
‘ エラーハンドリング:ファイルが見つからない場合などの備え
MsgBox “エラーが発生しました。” & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
コードのここがポイント!知っておくべき3つの本質
初心者のうちは、コードの長さに圧倒されてしまうかもしれませんが、本質的なポイントはたったの3つです。
① `ActiveProject` と `ReadOnly` プロパティの合わせ技
Project VBAでは、現在操作しているプロジェクトファイルは `ActiveProject` というオブジェクトで指し示すことができます。
この `ActiveProject.ReadOnly` を見に行くことで、「今、自分は安全に編集できるか?」をプログラムに判定させることができます。ここがこの自動化のキモです。
② ファイル名に「日付」を自動付与するテクニック
`Format(Date, “YYYYMMDD”)` というコードを使うことで、今日の日付を文字列(例: `20231025`)に変換しています。
これにより、毎日作業用ファイルを作ってもファイル名が重複せず、「いつの時点の作業ファイルか」が一目でわかるようになります。
③ `FileSaveAs` メソッドの正しい作法
マクロの記録を使うと余計なコードが大量に入ってしまいますが、本質的には `FileSaveAs Name:=保存先パス` だけでも十分に機能します。
第二引数の `FormatID` を指定してあげることで、ファイル形式のブレを防ぎ、確実に `.mpp` として保存させることができます。
—
陥りやすい罠とエラー回避のコツ
現場でこのマクロを動かす際、初心者が陥りがちな「罠」がいくつかあります。事前に知っておけば怖くありません。
- 罠1:保存先のフォルダ(`workFolder`)が存在しない
- 対策:コード内の `workFolder = “C:\MyWorkSpace\”` で指定したフォルダが、あなたのPCに実際に存在しているか確認してください。フォルダがない状態で保存しようとすると、VBAが盛大にエラーを吐いて止まります。
- 罠2:すでに同名のファイルが存在している
- 対策:同じ日に2回以上このマクロを実行すると、「同名のファイルが存在します。上書きしますか?」というProjectの標準ダイアログが出てしまい、完全な自動化がストップします。厳密にやるなら `Dir` 関数などでファイルの存在チェックを入れるとプロフェッショナルですが、まずは上記コードで十分に実用になります。
—
おわりに
お疲れ様でした!
今回学んだ「状態を判定し、安全な別ルートへ自動で舵を切る」というアプローチは、Project VBAだけでなく、ExcelやWordのVBA、ひいてはあらゆる自動化エンジニアリングの基本にして極意です。
「誰かが開いていても、焦らず、スマートに自分用の作業スペースへ移行する」。
この小さな自動化が、あなたのプロジェクト管理のストレスを劇的に軽減してくれるはずです。
ここをクリアできれば、もうProject VBAの初級者卒業は目の前ですよ。
明日からのプロジェクト業務に、ぜひこの知見を取り入れてみてくださいね。それでは、また次のステージでお会いしましょう!
