【実務・中級編】【中級者向け】ネットワーク環境でのファイルオープン失敗時に、ローカルキャッシュから復元を試みるリトライ処理 – Project VBA解析バイブル

スポンサーリンク

ネットワーク越しにProjectを叩くな。死ぬぞ。

諸君、Project VBAの世界へようこそ。

現場でよく見る光景がある。共有サーバー上の`.mpp`ファイルを直接叩き、ネットワークの瞬断でプロジェクトが「読み取り専用」で開かれ、あるいはハングアップしてタスクの進捗が吹き飛ぶ……。そんな悲劇を繰り返すのは、もう終わりにしよう。

プロフェッショナルな自動化エンジニアにとって、「ネットワークは必ず切れる」というのが前提条件だ。今回は、不安定な環境下でもタスクを完遂させるための、極限まで堅牢な「キャッシュ・フォールバック・オープン」の実装論を伝授する。

1. なぜ「そのままOpen」してはいけないのか

VBAの`FileOpen`メソッドは、ネットワーク遅延に対して驚くほど脆弱だ。タイムアウトが発生した際、Projectは中途半端なロックファイルを掴んだままフリーズしたり、最悪の場合、基幹データを破損させる。

我々が目指すべきは「ローカルへの一時退避」と「アトミックなオープン処理」だ。

1. 疎通確認: ネットワークが生きているか、最小限のコストで確認する。
2. 一時コピー: サーバーのファイルを一度ローカルのテンポラリフォルダへ「バイナリコピー」する。
3. ローカルオープン: ローカルに落ちてきたファイルをProjectで開く。
4. リトライロジック: 上記が失敗した場合、指数バックオフ(徐々に待機時間を延ばす)で再試行する。

2. 堅牢なオープン処理:プロダクションコード

以下のコードは、単なるコピペ用ではない。業務の要件定義から逆算した「落ちない」ための設計だ。

Option Explicit

‘ ネットワーク越しに開く際のリトライ設定
Private Const MAX_RETRIES As Integer = 3
Private Const RETRY_INTERVAL_SEC As Integer = 5

Public Sub OpenProjectRobustly(ByVal serverPath As String)
Dim localPath As String
Dim retryCount As Integer
Dim success As Boolean

‘ ローカルキャッシュパスを生成(TEMP環境変数を利用)
localPath = Environ(“TEMP”) & “\tmp_project_cache.mpp”

Do While retryCount < MAX_RETRIES On Error Resume Next ' 1. サーバーからローカルへファイルをコピー If CopyFileToServer(serverPath, localPath) Then ' 2. ローカルファイルをオープン FileOpen Name:=localPath, ReadOnly:=False If Err.Number = 0 Then success = True Exit Do End If End If ' 失敗時は待機 retryCount = retryCount + 1 Application.Wait (Now + TimeValue("00:00:" & Format(RETRY_INTERVAL_SEC retryCount, "00"))) On Error GoTo 0 Loop If Not success Then MsgBox "致命的エラー: ネットワーク接続が確立できませんでした。", vbCritical End If End Sub Private Function CopyFileToServer(ByVal src As String, ByVal dest As String) As Boolean Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") ' ファイルがサーバー上に存在するか確認し、コピーを実行 If fso.FileExists(src) Then ' 上書きコピー(Force: True) fso.CopyFile src, dest, True CopyFileToServer = True Else CopyFileToServer = False End If End Function ---

3. アーキテクトからの助言:ここが「プロの境界線」だ

コードは動けば良いというものではない。以下の3点に注意せよ。

A. バイナリコピーの優位性

`FileOpen`を直接呼ぶ前にFSO(FileSystemObject)でファイルをコピーしているのは、ネットワークの負荷を最小化し、Project側が「読み込み」を完了する時間を短縮するためだ。一度ローカルに落とせば、その後の操作は爆速になる。

B. ローカルキャッシュのライフサイクル管理

上記のコードでは`TEMP`フォルダを使用しているが、重要なプロジェクトであれば、`AppData`下の専用ディレクトリにハッシュ値付きで保存し、セッション終了時に適切に削除する「クリーンアップ処理」を実装するのが筋だ。ゴミを撒き散らす自動化ツールは、ただの迷惑ソフトである。

C. ベースライン設定との兼ね合い

もしこの後、自動的に「ベースラインの保存」や「進捗更新」を行うなら、必ず`Application.DisplayAlerts = False`を併用し、ネットワーク切断時のダイアログでスクリプトが止まるのを防げ。

結論:安定は「設計」でしか買えない

ネットワーク環境が不安定? それは言い訳だ。我々エンジニアの仕事は、不安定なインフラの上に、安定した業務フローを構築することにある。

今回提示した「ローカルフォールバック」の手法は、あらゆるVBAツールに応用可能な「基本の防弾チョッキ」だ。これを実装した時点で、君のツールは現場の非効率を撲滅する最強の武器の一つになる。

さあ、コードを書き換えろ。そして、ネットワークの気まぐれに二度と振り回されるな。

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