こんにちは!プロジェクト管理の現場で、日々MS Projectと格闘お疲れ様です。
「新しいプロジェクトを作るたびに、カレンダーを直して、標準作業時間(1日の労働時間数)を直して……あぁ、また設定を忘れてスケジュールが狂ってしまった!」
そんな絶望を味わったことはありませんか?
マクロの記録から一歩抜け出し、いよいよProject VBAの世界に足を踏み入れようとしているあなたへ。今日は、「新規プロジェクト作成時に、組織標準のカレンダーと作業時間を自動でねじ込むテンプレート自動化マクロ」の作り方を、基礎から優しく、かつ本質的な部分まで徹底的に解説します。
ここをクリアすれば、Project VBAの基本はバッチリですよ。さあ、一緒にプロの自動化エンジニアへの第一歩を踏み出しましょう!
—
なぜ「新規作成時の標準化」がプロの第一歩なのか?
MS Projectをそのまま起動して新しいプロジェクトを作ると、世界標準の汎用的なカレンダー(土日休み、8:00〜17:00など)が適用されます。しかし、日本の現場や自社の就業規則ではどうでしょう?
「水曜日はノー残業デー」「土曜日は隔週出勤」「1日の実働は7.5時間」など、会社固有のルールがありますよね。
これを手動で設定しているうちは、ヒューマンエラーが必ず起きます。だからこそ、「プロジェクトが生まれた瞬間(New Project時)に、VBAで強制的にインフラを整える」ことが、プロジェクト管理自動化の極みなのです。
—
開発の前に:Project VBAの扉を開こう
Excel VBAなら触ったことがあるという方も多いでしょう。しかし、MS ProjectのVBA(Project VBA)には、Excelとは少し違う独特の「お作法」があります。
まず、ProjectでVBAを書く画面(VBE)を開くには、`[Alt] + [F11]`を押します。
そして、コードを記述する場所ですが、今回のテーマである「新しいプロジェクトが作られた瞬間に発動する処理」を行うためには、通常の標準モジュールではなく、`ThisProject`(または `ThisDocument`)という特別なモジュールを使います。
ここが、今日の最大のポイントです。
—
実装コード:カレンダーと標準作業時間を自動適用する
以下のコードを、VBEのプロジェクトエクスプローラーにある `ThisProject` にそのままコピペしてください。
‘ ==============================================================================
‘ 【テーマ】新規プロジェクト作成時の標準カレンダー&作業時間自動適用マクロ
‘ ターゲット:Project VBA初学者、手動設定のミスから脱却したい方へ
‘ ==============================================================================
Private Sub Project_New(ByVal AS_Project As Project)
On Error GoTo ErrorHandler
‘ 画面描画を停止して処理を高速化(プロの技!)
Application.ScreenUpdating = False
Dim targetProj As Project
Set targetProj = AS_Project
‘ ————————————————————————–
‘ 1. 1日の標準作業時間(時間/日)を「7.5時間」に強制設定する
‘ ————————————————————————–
‘ ※MS Projectの内部データは「分」で保持されているため、7.5時間 = 450分 とします
targetProj.MinutesPerDay = 450
‘ 1週間の標準作業時間も連動して設定(7.5時間 × 5日 = 37.5時間 = 2250分)
targetProj.MinutesPerWeek = 2250
‘ ————————————————————————–
‘ 2. 組織標準カレンダーを適用する
‘ ————————————————————————–
‘ 事前にMS Project側で「社内標準カレンダー」という名前のベースカレンダーを
‘ 作成・登録してある前提のコードです。
‘ プロジェクト自体の標準カレンダーを変更
‘ ※Note: Projectのベースカレンダー設定はActiveProjectに対して行います
targetProj.CalendarDefaultID = “社内標準カレンダー”
‘ 処理完了のフィードバック
Application.ScreenUpdating = True
MsgBox “ようこそ!組織標準のカレンダーおよび作業時間(7.5時間/日)が適用されました。”, vbInformation, “自動初期化完了”
Exit Sub
ErrorHandler:
‘ 万が一エラーが起きた場合の安全装置(画面描画の復元を忘れない)
Application.ScreenUpdating = True
MsgBox “初期化処理中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
コードの深掘り解説:ここが分かれば怖くない!
初心者の方に向けて、コードの重要なパーツを噛み砕いて説明しますね。
1. `Private Sub Project_New(ByVal AS_Project As Project)` とは?
これは、MS Projectがあらかじめ用意してくれている「イベントプロシージャ」と呼ばれる特別な仕組みです。
人間が「新しいプロジェクト」ボタンを押した瞬間、MS Project自身がこのコードを検知し、自動的に呼び出します。あなたが手動でマクロを実行する必要すらありません。これが「自動適用」のカラクリです。
2. なぜ `MinutesPerDay = 450` なのか?
MS Projectの内部エンジンは、時間をすべて「分(Minute)」単位で計算しています。
- 8時間労働なら: $8 \times 60 = 480$分
- 7.5時間労働なら: $7.5 \times 60 = 450$分
ここを文字列や「時間」のままで渡そうとするとエラーになります。プロジェクトのスケジュール計算の根幹に関わる部分ですので、必ず「分」で指定するという鉄則を覚えておいてください。
3. `Application.ScreenUpdating = False` というおまじない
プロのエンジニアが必ず書くコードのテクニックです。処理の途中で画面がパタパタと切り替わるのを防ぎ、処理速度を爆発的に向上させます。最後に `True` に戻す(ScreenUpdating = True)セットで覚えるのが鉄則です。
—
陥りやすい罠とエラー回避のコツ
このマクロを動かすとき、初心者が必ずと言っていいほどハマる「罠」が一つあります。
> Q. 「社内標準カレンダーが見つかりません」というエラーが出ます!
>
> A. コード内の `”社内標準カレンダー”` という文字列は、あなたのPC(または組織のテンプレートファイル)の中に、実際に存在するベースカレンダーの名前と一字一句一致していなければなりません。
>
> あらかじめ、親となるテンプレートファイル(Global.mpt または 組織用の空プロジェクト)の `[プロジェクト]タブ > [稼働日の変更]` から、該当するカレンダーを作成しておいてくださいね。
—
まとめ:自動化の第一歩を踏み出したあなたへ
お疲れ様でした!
今回学んだ「イベントプロシージャを使ったプロジェクトの自動初期化」は、単なるコードのテクニックにとどまらず、「人間の手によるミスをシステムで根絶する」という、業務自動化エンジニアの核心を突くアプローチです。
ここをクリアできれば、次はタスクの自動生成や、WBSの自動インポートなど、より高度なProject VBAの世界があなたを待っています。
あなたのプロジェクト管理が、もっとスマートでストレスフリーなものになりますように。
それでは、次の現場でお会いしましょう!
