【入門編】【上級者向け】複数ユーザーが同時編集する環境での、排他制御用ロックファイルの自動生成と生存確認ロジック – Project VBA解析バイブル

スポンサーリンク

現場を救う「共有の壁」を突破せよ!VBAによる排他制御の極意

こんにちは。現場で泥臭い自動化を積み重ね、いつの間にかシステム全体を俯瞰するようになった皆さんの先輩です。

Project VBAを触っていると、必ずぶち当たる壁があります。そう、「複数人で同時に編集してしまい、変更が上書きで消える」という悲劇です。MS Project標準の共有機能は重く、環境によっては不安定ですよね。

今回は、そんな現場の悩みを一掃する「独自のロックファイル(門番)を用いた排他制御」の実装術を伝授します。ここをクリアすれば、あなたのマクロは「ただの自動化ツール」から「堅牢なシステム」へと進化します。

なぜ「ロックファイル」が必要なのか?

皆さんがファイルを保存する瞬間、裏側では「読み込み」「変更」「保存」というプロセスが走っています。この間、他の人が同じファイルに触れると、データは容易に壊れます。

そこで、「私が今使ってますよ」という看板(空のテキストファイル)をネットワーク上に立てるという、原始的ですが最強に確実な仕組みを作ります。

1. 開く時: ロックファイルが存在するか確認。なければ作成し、作業開始。
2. 作業中: ロックファイルが常に存在する状態を維持。
3. 閉じる時: ロックファイルを削除して、門を解放。

【実践】排他制御を実装する極限のコード

それでは、実際にプロジェクトを開く際のロジックを見てみましょう。このコードは「標準モジュール」に記述してください。

Option Explicit

‘ ロックファイルのパス(ネットワーク上の共有フォルダを指定)
Private Const LOCK_FILE_PATH As String = “\\Server\Shared\ProjectLock.lock”

‘ プロジェクトを開く際の排他チェック
Public Sub OpenProjectSafely()
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 1. ロックファイルの存在確認
If fso.FileExists(LOCK_FILE_PATH) Then
MsgBox “現在、他のユーザーが作業中です。後ほどやり直してください。”, vbCritical
Exit Sub
End If

‘ 2. ロックファイルの生成(これが門番になる)
On Error Resume Next
Dim ts As Object
Set ts = fso.CreateTextFile(LOCK_FILE_PATH, True)
ts.WriteLine “Locked by User: ” & Environ(“USERNAME”) & ” at ” & Now
ts.Close

If Err.Number <> 0 Then
MsgBox “ロックファイルの作成に失敗しました。権限を確認してください。”, vbExclamation
Exit Sub
End If
On Error GoTo 0

MsgBox “排他ロックを確保しました。安全に編集可能です。”
End Sub

‘ プロジェクトを閉じる際の解放処理
Public Sub ReleaseLock()
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

If fso.FileExists(LOCK_FILE_PATH) Then
fso.DeleteFile LOCK_FILE_PATH
MsgBox “ロックを解放しました。”
End If
End Sub

陥りやすい罠と対策(ここがプロの知見)

1. 「強制終了」された時の幽霊ロック問題

もし、PCがフリーズしてマクロが最後まで走らず、ロックファイルが残り続けたらどうなるでしょう?誰も入れなくなりますね。

  • 対策: `Workbook_Open` イベントと `Workbook_BeforeClose` イベントを活用し、確実に処理を紐付けましょう。また、ロックファイルの中に「作成時刻」を書き込んでおけば、「30分以上前の古いロックなら自動で破棄する」といった自己修復ロジックも組めます。

2. 書き込み権限の壁

ネットワークドライブの権限設定によっては、VBAでファイルを生成できないことがあります。

  • 対策: IT部門に頼んで「全員が読み書き・削除可能な共有フォルダ」を一つ確保してもらうのが一番の近道です。

3. FSO (FileSystemObject) の扱い

コード内で `CreateObject(“Scripting.FileSystemObject”)` を使っています。これはVBAにおける最強の武器の一つです。`Kill` ステートメントよりもエラーハンドリングがしやすいため、実務ではこちらを強く推奨します。

先輩からのアドバイス

「マクロの記録」から一歩踏み出した皆さんへ。
プログラミングとは、「ありとあらゆる失敗を想定して、それを未然に防ぐこと」の積み重ねです。今回のロックファイルは、その第一歩です。

まずは、自分の環境でこのコードを走らせてみてください。「誰かが使っている時にエラーで止まる」という体験こそが、あなたのエンジニアとしての直観を鋭くします。

ここをクリアしたあなたは、もう初心者ではありません。次回のステップアップでは、「複数人での同時書き込みを許容するデータベース化」の話をしましょうか。

それでは、良いコードライフを!

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