プログラミングの世界へようこそ。Project VBAの深淵に足を踏み入れたあなたへ、今日は「現場で生き残るための生存戦略」を授けましょう。
MS Projectでネットワーク上の共有ファイルを開く際、一瞬の通信断絶で「ファイルが見つかりません」という無慈悲なダイアログに阻まれた経験はありませんか? 記録されたマクロをそのまま走らせるだけでは、プロの現場は乗り切れません。
今日は、「ネットワークの気まぐれに左右されない、極限の堅牢性を持つファイルオープン処理」を実装します。
—
1. なぜ「そのまま」ではいけないのか?
Project VBAで `FileOpen` メソッドを呼ぶ際、多くの初心者は以下のように書きます。
‘ 危険なコード例:通信が切れたら即座にエラー停止する
FileOpen Name:=”\\Server\Project\MyProject.mpp”
これの何が問題か。「通信が不安定である」という前提が欠けていることです。サーバーは混雑し、Wi-Fiは時折息を止めます。エラーでマクロが止まるたびに手動で再実行するのは、自動化の目的(=人間が楽をすること)から本末転倒ですよね。
ここでは「リトライ処理(再試行)」という、システム開発の鉄則を組み込みます。
—
2. 堅牢なオープン処理を実装する
以下のコードは、ネットワーク環境で「開けなければ、少し待って、もう一度開く」という手順を最大3回まで繰り返す仕組みです。
Sub RobustFileOpen()
Dim targetPath As String
Dim retryCount As Integer
Dim maxRetries As Integer
Dim success As Boolean
targetPath = “\\Server\Project\MyProject.mpp”
maxRetries = 3
retryCount = 0
success = False
‘ エラーが発生しても止めず、次の行へ進ませる指示
On Error Resume Next
Do While retryCount < maxRetries And Not success retryCount = retryCount + 1 ' ファイルを開く試行 FileOpen Name:=targetPath ' エラーチェック:Err.Numberが0なら成功 If Err.Number = 0 Then success = True Debug.Print "成功: " & targetPath & " を開きました。" Else Debug.Print "試行 " & retryCount & " 回目失敗。待機して再開します..." Err.Clear ' エラー情報をクリア ' 2秒間待機(Application.Waitはマクロを一時停止させます) Application.Wait (Now + TimeValue("00:00:02")) End If Loop ' 最終判定 If Not success Then MsgBox "何度試してもファイルが開けません。ネットワークを確認してください。", vbCritical End If ' エラー監視を元に戻す On Error GoTo 0 End Sub
コードの重要ポイント解説
1. `On Error Resume Next`: これが「盾」です。エラーが発生してもマクロを強制終了させず、次の行(エラー判定)へ進むための呪文です。ただし、使い終わったら必ず `On Error GoTo 0` で解除するのがマナーです。
2. `Err.Number`: VBAの心臓部です。エラーが発生すると、ここに固有の番号が入ります。`0` であれば「エラーなし(正常)」を意味します。
3. `Application.Wait`: ネットワークが回復する「余白」を作る処理です。即座にリトライするのではなく、少し待つことで成功率は劇的に上がります。
—
3. 次のステップ:ローカルキャッシュの活用
もしネットワークが完全に断絶していたら? その時のために、「直前に保存したローカルのバックアップ」を読み込むという選択肢を持っておくのが、シニアエンジニアの流儀です。
‘ 疑似コード:ネットワークNGならローカルから開く
If Not success Then
‘ ネットワーク版が開けなかったら、ローカルのコピーを開く試み
FileOpen Name:=”C:\LocalBackup\MyProject_Backup.mpp”
MsgBox “ネットワークに繋がらないため、ローカルキャッシュを開きました。”
End If
このように、「AがダメならBを試す」という多層的な防御層を作ることで、あなたの自動化ツールは「たまに失敗するおもちゃ」から「頼りになる相棒」へと進化します。
—
まとめ:ここをクリアすれば、あなたはもう脱初心者
今回紹介した「リトライ処理」と「エラーハンドリング」の概念は、Project VBAに限らず、あらゆる自動化開発の共通言語です。
- 何事も「失敗する可能性がある」ことを前提にコードを書くこと
- エラーを「異常」ではなく「制御すべき流れ」として捉えること
この視点を持つだけで、あなたの書くコードの品質は格段に上がります。最初は難しく感じるかもしれませんが、この小さな「盾」を実装する習慣こそが、世界最高峰のエンジニアへの第一歩です。
さあ、恐れずにエディタを開いてください。あなたの書くコードが、誰かの現場の景色を変えるはずです。何か困ったことがあれば、いつでもまた聞きに来てくださいね。応援しています!
