【入門編】リソースの「カレンダー」を他のプロジェクトと同期させるツール – Project VBA解析バイブル

スポンサーリンク

こんにちは!Microsoft Projectの自動化の世界へようこそ。
「マクロの記録」ボタンを押してみたものの、生成されたコードのグチャグチャさに絶望し、「VBAって難しそう…」と諦めかけていませんか?

大丈夫。今日、あなたはその壁を完全に突破します。

私たちが向き合うMicrosoft Project(以下、Project)の世界では、複数プロジェクトを同時並行で走らせる時、こんな絶望的な状況によく直面します。
「Aプロジェクトでは祝日稼働なのに、Bプロジェクトでは休みになっている……これじゃ全社的なリソースの稼働率(コスト)計算が狂ってしまう!」

今回は、「マスターとなるプロジェクトのカレンダー設定を、他のプロジェクトへ一括同期する全自動ツール」の作り方を、基礎の基礎から徹底的に解説します。

ここをクリアすれば、Project VBAの基本構造はバッチリです。さあ、優しく知的な先輩エンジニアと一緒に、実務で即戦力になるコードを紐解いていきましょう!

—

1. なぜ「カレンダー同期」でリソース管理が安定するのか?

Excelとは異なり、Projectは「時間軸」と「リソース(人・モノ)」が複雑に絡み合う生き物です。

リソースの稼働基準となるのが「ベースカレンダー」。これがプロジェクトごとにバラバラだと、以下のような致命的なバグが現場で起きます。
1. 稼働日数のズレ:プロジェクト間でスケジュール感の整合性が取れなくなる。
2. コスト計算の破綻:残業時間や休日出勤のコスト算出がデタラメになる。

これを防ぐために、「マスターファイルのカレンダー定義を、配下のプロジェクトファイル群に一発で上書き・同期するVBAマクロ」を導入します。手作業でポチポチ設定を変更する地獄から、今日でサヨナラしましょう。

—

2. 【図解】Project VBAの基本構造を理解する

Excel VBAと違い、Project VBAには独特の「お作法」があります。まずはこれだけ頭に叩き込んでください。

[ Application (ExcelやProjectのアプリ全体) ]
│
├─ [ Projects (現在開いているプロジェクトファイルの集まり) ]
│ │
│ ├─ ActiveProject (いま画面で見ているファイル)
│ └─ “Master.mpp” (指定したファイル)
│
└─ [ Resources (リソースの集まり) ]
└─ Resource (個々のリソース:山田さん、会議室など)
└─ BaseCalendar (カレンダー設定)

Excelでは「セル(Range)」を操作しますが、Projectでは「タスク(Task)」や「リソース(Resource)」、そして「カレンダー(Calendar)」をオブジェクトとして操作します。

—

3. 実装コード:カレンダーを一括同期するマクロ

それでは、開発環境(Alt + F11キーでVBAエディタを開く)の準備はいいですか?
標準モジュールを挿入し、以下のコードをそのまま貼り付けてください。実務の現場でそのまま使えるよう、エラーハンドリングと丁寧なコメントを入れています。

Sub SyncResourceCalendars()
‘ =====================================================================
‘ テーマ:マスターファイルから他のプロジェクトへカレンダー設定を同期する
‘ 解説者:あなたの専属チーフアーキテクト
‘ =====================================================================

Dim masterProj As Project
Dim targetProj As Project
Dim targetPath As String
Dim resMaster As Resource
Dim resTarget As Resource

‘ 1. エラーハンドリングの準備
On Error GoTo ErrorHandler

‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お作法です)
Application.ScreenUpdating = False

‘ 2. マスタープロジェクトの特定(現在アクティブなファイルをマスターとする)
Set masterProj = ActiveProject
MsgBox “マスタープロジェクトとして「” & masterProj.Name & “」を認識しました。”, vbInformation, “同期開始”

‘ 3. 同期先ファイルのパスを指定(※実際の環境に合わせて変更してください)
‘ ここでは例としてデスクトップにある「SubProject.mpp」を指定します
targetPath = “C:\Users\YourUserName\Desktop\SubProject.mpp”

‘ 4. 同期先プロジェクトを開く(バックグラウンド、または可視状態)
‘ すでに開いている場合はエラーになるため、実務では開いているかチェックする処理を入れます
Set targetProj = Application.Projects.Open(targetPath)

‘ 5. リソースごとのカレンダー設定をループ処理で同期
For Each resMaster In masterProj.Resources
‘ リソースが空白(Nothing)でないことを確認
If Not resMaster Is Nothing Then
On Error Resume Next
‘ 同期先プロジェクトに同じ名前のリソースが存在するか探す
Set resTarget = targetProj.Resources(resMaster.Name)

If Not resTarget Is Nothing Then
‘ 【最重要】カレンダー名の同期
‘ マスター側のベースカレンダー名を、ターゲット側にそのまま適用します
resTarget.BaseCalendar = resMaster.BaseCalendar

‘ ついでに標準単価や最大稼働単位も同期させたい場合はここに追記可能
‘ resTarget.StandardRate = resMaster.StandardRate
‘ resTarget.MaxUnits = resMaster.MaxUnits
End If
On Error GoTo ErrorHandler
End If
Next resMaster

‘ 6. 同期先を保存して閉じる
targetProj.Save
targetProj.Close

‘ 完了メッセージ
Application.ScreenUpdating = True
MsgBox “リソースカレンダーの同期が正常に完了しました!”, vbInformation, “成功”
Exit Sub

ErrorHandler:
‘ エラー時の後始末
Application.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
End Sub

—

4. コードの深掘り解説:初心者がつまづきやすいポイント

このコードの重要なポイントを3つに絞って解説します。ここさえ分かれば、あなたも立派なProject VBAエンジニアです。

① `Application.ScreenUpdating = False` の魔力

Projectは、タスクやリソースが書き換わるたびに画面のガントチャートやリソースグラフを再描画します。これが動作が重くなる最大の原因です。処理の最初にこれをオフにし、最後に `True` に戻すことで、実行スピードが何倍にも跳ね上がります。これはプロの常識です。

② `For Each … In …` によるコレクション走査

「マスタープロジェクトにいる全てのリソースを1人ずつ確認しに行く」という処理です。Excelの `For Each cell In Range` と全く同じ感覚で使えます。オブジェクト指向の基本ですね。

③ `resTarget.BaseCalendar` プロパティの書き換え

今回のツールの核心部分です。Projectのリソースにはそれぞれ「どのカレンダーに従うか(BaseCalendar)」というプロパティを持っています。ここをマスター側の文字列に書き換えるだけで、組織全体の稼働基準が完璧に統一されます。

—

5. 陥りやすい罠とエラー回避のコツ

現場でこのマクロを動かす際、初心者が必ずと言っていいほどハマる「罠」が2つあります。

1. 「指定された名前が見つかりません」エラー(Run-time error ‘1101’)

  • 原因:マスター側にはいるリソース(例:「山田 太郎」)が、同期先のサブプロジェクト側に存在しない場合、`targetProj.Resources(resMaster.Name)` でエラーになります。
  • 対策:コード内に入れている `On Error Resume Next` と、オブジェクトが `Nothing` でないかの二重チェック(ガード節)がこの暴走を防いでいます。

2. ファイルの排他制御(読み取り専用で開いちゃう問題)

  • 同期先のプロジェクトを他のメンバーが編集していると、書き込み権限で開けません。実務では `Application.FileOpenEx` メソッドを使って読み取り専用モードでのオープン制御を入れると、より堅牢になります。

—

まとめ:ここをクリアすれば、Project VBAの基本はバッチリですよ!

お疲れ様でした!
リソースのカレンダー同期という、一見すると難解で泥臭い作業が、VBAを使うことでわずか数秒の自動処理に変わる快感を味わっていただけたでしょうか。

  • オブジェクトの階層構造を意識すること
  • 画面描画の制御(ScreenUpdating)を入れること
  • エラーハンドリングを怠らないこと

この3つさえ押さえておけば、Project VBAで書けないコードはありません。ぜひあなたの現場にこのツールを導入し、周囲をあっと言わせる業務改善を成し遂げてください。

あなたのVBAライフが、より知的でエキサイティングなものになりますように。次のステップでお会いしましょう!

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