【入門編】【上級者向け】マルチユーザー環境での同時編集競合を回避するファイル排他制御 – Project VBA解析バイブル

スポンサーリンク

こんにちは!Microsoft Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩踏み出し、「現場で本当に使える堅牢なシステム」を作りたいあなたへ。

今回は、複数人が同時に同じスケジュールファイルを触る現場で、避けて通れない「ファイル排他制御(同時編集の競合回避)」をテーマに解説します。

「共有フォルダに置いたProjectファイルを開こうとしたら、誰かが開いていて保存できない……」
「知らずに上書きしてしまい、他の人の変更が吹き飛んだ……」

そんな現場の悲劇をVBAの力でスマートに防ぐ方法を、優しく、そして本質的なアーキテクチャの視点から紐解いていきましょう。ここをクリアすれば、あなたのVBAスキルは確実にプロの領域へ到達します。

なぜProject VBAで排他制御が必要なのか?

ExcelやWordであれば、ファイルを開いたときに「読み取り専用で開きますか?」というダイアログが出て親切に教えてくれますよね。しかし、Microsoft Projectの裏側(特にVBAからの操作)では、無慈悲にファイルを強制オープンしようとしたり、保存時に競合エラー(Run-time error)を引き起こしたりします。

マルチユーザー環境(共有サーバーやSharePointなど)において、スケジュール管理ファイルを安全に運用するためには、「コードの力でファイルのロック状態を検知し、安全に避難・制御する」というアプローチが不可欠です。

現場でよくある失敗パターン

1. エラーハンドリングなしのオープン: 他の人が開いているファイルをVBAで開こうとして、容赦なく実行時エラーでマクロがクラッシュする。
2. 上書きの悲劇: 自分が開いた時点の古いデータで、後から別の人が保存した最新データを上書きしてしまう。

これらを完全に防ぐための「大人のVBAコード」をこれから一緒に見ていきましょう。

実装アプローチ:安全なファイルオープンの設計思想

今回目指すロジックの流れはこうです。

1. ファイルの存在確認: そもそも目当てのファイルがそこにあるか?
2. 排他ロック(オープン試行)のテスト: 実際に独占モード(または読み取り専用)で開けるかを安全に試す。
3. エラーハンドリング: もし他人が開いていた場合の優しく安全な離脱(または待機処理)。

それでは、実際のコードを見てみましょう。

実用VBAコード:ファイル排他制御の完全実装例

以下のコードは、共有フォルダにあるProjectファイルを安全に開き、必要に応じて読み取り専用や警告を行う実用的なプロシージャです。開発環境にそのままコピーして使えます。

Sub OpenProjectSafely()
Dim targetFilePath As String
Dim prjApp As MSProject.Application
Dim targetProject As MSProject.Project
Dim isFileOpenByOther As Boolean

‘ 対象となるプロジェクトファイルのパス(実際の環境に合わせて変更してください)
targetFilePath = “C:\SharedProject\MasterSchedule.mpp”

‘ 1. ファイルの存在チェック
If Dir(targetFilePath) = “” Then
MsgBox “指定されたファイルが見つかりません。” & vbCrLf & targetFilePath, vbCritical, “ファイルエラー”
Exit Sub
End If

‘ 2. エラーハンドリングの有効化(他人が開いている場合のエラーをトラップする)
On Error GoTo ErrorHandler

‘ 3. 排他制御を意識したオープン処理
‘ ProjectのFileOpenExメソッドを使用します
‘ ReadOnly:=True で安全に開くか、False(デフォルト)で書き込み権限を狙うか

‘ ここでは「書き込みモード」でのオープンを試みます
FileOpenEx Name:=targetFilePath, ReadOnly:=False, Notify:=True

‘ — ここからファイルが正常に取得できた(排他ロックを獲得できた)場合の処理 —
MsgBox “ファイルの排他ロックを獲得しました。安全に編集を開始できます。”, vbInformation, “排他制御クリア”

‘ 処理のメインロジックをここに記述
‘ 例: ActiveProject.BaselineSave … など

Exit Sub

ErrorHandler:
‘ エラー番号 1100番台やファイル競合関連のエラーをキャッチ
‘ ※Projectの仕様や環境によりエラー番号が異なるため、全トラップ型で優しく誘導します
Select Case Err.Number
Case Else
MsgBox “現在、このファイルは他のユーザーによって編集中です。” & vbCrLf & _
“上書き競合を防ぐため、処理を中断します。” & vbCrLf & _
“詳細エラー: ” & Err.Description, vbExclamation, “同時編集の検知”
Nbr_Exit:
‘ 必要に応じたクリーンアップ処理
Resume Next
End Select
End Sub

コードのポイント解説:プロエンジニアの視点

1. `On Error GoTo` による安全網(セーフティネット)

VBAにおいて、他のユーザーがファイルを開いている状態で強制的に書き込みオープンしようとすると、容赦なくコードが停止します。これを防ぐのが`On Error GoTo ErrorHandler`です。エラーを「クラッシュ」ではなく「シグナル」として捉え、ユーザーフレンドリーなメッセージに変換するのがプロの技です。

2. `FileOpenEx` メソッドの活用

単なる `FileOpen` ではなく、豊富な引数を持つ `FileOpenEx` を使用することで、読み取り専用(ReadOnly)の制御や、ファイル共有時の通知(Notify)をコントロールできます。現場の運用ルールに合わせて `ReadOnly:=True` で開いてレポート作成用に流用するなど、応用範囲がグッと広がります。

陥りやすいエラーと対策

Q. 「他の人が閉じたはずなのに、まだ『編集中』と言われて開けません!」

原因: 前のユーザーがProjectを異常終了(強制終了)させた場合、共有フォルダに `.ldb` のようなロックファイルやテンポラリファイルが残存し、Projectが誤認しているケースがあります。
対策: ネットワーク管理者に連絡して一時ファイルのクリアを依頼するか、数分待ってから再度トライする運用ルールを設けましょう。

まとめ

いかがでしたか?今回はマルチユーザー環境におけるファイル排他制御という、一歩進んだProject VBAのテクニックをご紹介しました。

「動くだけのコード」から「現場で壊れない堅牢なコード」へ。
この排他制御の概念をマスターすれば、チーム全体で安心して使える高度なプロジェクト管理自動化ツールが構築できるようになります。

ここをクリアしたあなたなら、もうProject VBAの基本はバッチリです!ぜひ実際の現場のワークフローに組み込んで、その効果を体感してみてください。あなたの自動化ライフがさらに素晴らしいものになるよう応援しています!

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