【入門編】Project VBA開発におけるバージョン管理とチーム共有のベストプラクティス – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
普段、Excelのマクロは書くけれど、Microsoft Project(以下、MS Project)の自動化となると「なんだか難しそう……」と足踏みしていませんか?

実は、Project VBAはコツさえ掴めば、Excel以上に「劇的な業務改善」をもたらしてくれる魔法の杖になります。しかし、その魔法をチーム全員で、かつ安全に使い続けるためには、「コードの管理術」と「配布の戦略」という、マクロの書き方以前の「型」を知っておく必要があります。

今日は、マクロの記録を卒業したいあなたへ、WBS(タスク構造)の自動設定を題材に、「プロが現場で実践するバージョン管理と共有のベストプラクティス」を優しく、かつ深く解説します。

1. なぜProject VBAは「共有」でつまずきやすいのか?

Excelの場合、ブック(.xlsm)の中にコードを書いて送れば動きますよね。しかし、MS Projectには「Global.mpt(グローバルテンプレート)」という特殊な仕組みがあります。

  • 落とし穴: マクロを記録すると、デフォルトでは自分自身のPC内の「Global.mpt」に保存されます。
  • 結果: 「自分のPCでは動くのに、同僚のPCではボタンすら出てこない!」という悲劇が起こります。

これを防ぐには、「コードをプロジェクトファイル(.mpp)側に保存する」か、「配布用のテンプレートを作成する」という意識が重要です。ここをクリアすれば、チーム開発のスタートラインに立てます。

2. チーム開発の鉄則:コードを「テキスト」で管理する

複数人で開発する際、「誰がいつコードを直したか分からない」状態は避けたいものです。プロのエンジニアは、VBAの画面(VBE)からモジュールを右クリックして「ファイルのエクスポート」を行い、`.bas` や `.cls` といったテキスト形式で保存します。

これをGitなどのバージョン管理ツール(あるいは共有フォルダの履歴管理)に置くことで、「先週の動いていた状態に戻したい!」という時に、自分自身を救うことができます。

3. 実践:WBSの階層構造と依存関係を自動設定する

それでは、実際にコードを書いてみましょう。今回は、以下の3つのポイントを自動化するツールを作成します。

1. タスクの作成
2. アウトラインレベル(階層)の設定
3. 先行タスク(依存関係)の連結

このコードは、新しいプロジェクトファイル(.mpp)の標準モジュールにコピーして試してみてください。

Option Explicit

‘———————————————————-
‘ 手順: WBS構造の自動構築サンプル
‘ 内容: 階層構造(WBS)とタスクの繋がりを自動で設定します
‘———————————————————-
Sub CreateSampleWBS()
Dim pj As Project
Set pj = ActiveProject

‘ 描画更新を停止(処理速度向上のための魔法の1行)
Application.ScreenUpdating = False

On Error GoTo ErrorHandler

‘ 1. プロジェクトの初期設定(自動スケジューリングモードにする)
‘ これを忘れると、日付が自動で計算されません
Dim t As Task

‘ — フェーズ1: 企画 —
Dim t1 As Task
Set t1 = pj.Tasks.Add(“1. 企画フェーズ”)
t1.OutlineLevel = 1 ‘ 最上位の階層
t1.Manual = False ‘ 自動スケジューリング

Dim t1_1 As Task
Set t1_1 = pj.Tasks.Add(“1.1 要件定義”)
t1_1.OutlineLevel = 2 ‘ 1段下げる
t1_1.Duration = “5d” ‘ 5日間
t1_1.Manual = False

Dim t1_2 As Task
Set t1_2 = pj.Tasks.Add(“1.2 承認プロセス”)
t1_2.OutlineLevel = 2
t1_2.Duration = “2d”
t1_2.Predecessors = t1_1.ID & “FS” ‘ 1.1が終わったら開始
t1_2.Manual = False

‘ — フェーズ2: 実行 —
Dim t2 As Task
Set t2 = pj.Tasks.Add(“2. 実行フェーズ”)
t2.OutlineLevel = 1
t2.Predecessors = t1.ID & “FS” ‘ フェーズ1が全部終わったら開始
t2.Manual = False

Dim t2_1 As Task
Set t2_1 = pj.Tasks.Add(“2.1 詳細設計”)
t2_1.OutlineLevel = 2
t2_1.Duration = “10d”
t2_1.Manual = False

‘ 最後に全体を再計算
Application.CalculateAll

MsgBox “WBSの構築が完了しました!”, vbInformation

Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Application.ScreenUpdating = True
End Sub

コードの解説:ここがポイント!

  • `OutlineLevel`: これがWBSの命です。`1`なら「要約タスク(親)」、`2`なら「その下のタスク(子)」になります。
  • `Predecessors`: 前提条件(先行タスク)を設定します。`”1FS”`のように「タスクID + 連結タイプ」を文字列で指定するのがProject VBAの基本スタイルです。
  • `Manual = False`: 多くの初心者がハマるポイントです。MS Projectには「手動計算」と「自動計算」がありますが、VBAで日付を自動計算させたいなら、必ず`False`(自動)に設定しましょう。

4. ツールをチームに配布する「賢い方法」

コードが書けたら、いよいよ配布です。おすすめの戦略を2つ紹介します。

A. グローバルテンプレート(.mpt)の共有

チーム共通の「標準テンプレート(.mpt)」を用意し、そこにコードを格納して配布する方法です。

  • メリット: 全員が同じボタン、同じマクロを使える。
  • 運用: サーバー上に「これを自分の `AppData\Roaming\Microsoft\MS Project\…\1041` にコピーしてね」とマニュアル化します。

B. アドイン(.com形式等)または専用ツールファイル

マクロが含まれた特定の `.mpp` ファイルを「ツール本体」として配布し、そこから他のプロジェクトファイルを操作する方法です。

  • メリット: 利用者の環境を汚さず、バージョンアップもファイルの差し替えだけで済みます。

5. よくあるエラーと回避策

1. 「実行時エラー ‘1101’: 引数が正しくありません」

  • 原因:存在しないタスクIDを`Predecessors`に指定したり、自分自身を先行タスクに指定(循環参照)したりすると発生します。
  • 対策:リンクを張る前に、対象のタスクが `Not Nothing` であるか確認しましょう。

2. 日付が勝手に変わる

  • 原因:カレンダー設定(稼働日・非稼働日)の影響です。
  • 対策:`pj.Calendar` オブジェクトを確認し、土日設定がどうなっているか把握する癖をつけましょう。

最後に:Project VBAを掌握するあなたへ

Project VBAは、単なる「操作の自動化」ではありません。バラバラになりがちな「チームの計画の立て方」を標準化するための強力な武器です。

最初は「マクロの記録」で出てきたコードを眺めることから始めても構いません。でも、今日お伝えした「階層構造(OutlineLevel)」「依存関係(Predecessors)」、そして「共有を意識した管理」を意識するだけで、あなたのコードは「自分専用のお遊び」から「チームを支えるインフラ」へと進化します。

一歩ずつ、確実に。この魔法を使いこなせるようになれば、PMO業務やプロジェクト管理の効率は、今までの何倍にも跳ね上がるはずですよ。

応援しています。頑張ってくださいね!

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