こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけの日常から一歩踏み出し、「自分の手でプロジェクトを意のままにコントロールしたい」と思い立ったあなたへ。今日は、実務で即座に使える最高にスマートなテクニックをお伝えします。
ここさえクリアすれば、Project VBAの基本構造はバッチリです。ぜひ最後までついてきてくださいね。
—
なぜ、新規プロジェクト作成時に「標準カレンダー」で躓くのか?
MS Projectを立ち上げ、「さあ、新しいプロジェクトを始めるぞ!」と意気込んでファイルを作ったものの、ふとスケジュールを見ると……。
- 「あれ? 土曜日や日曜日なのに稼働日になってタスクが入っているぞ?」
- 「自社の就業時間(例:9:00〜18:00、休憩1時間)と、Projectのデフォルト(8:00〜17:00など)がズレているせいで、ガントチャートの工数計算が微妙に狂う……」
こんなイライラ、現場で何度も経験していませんか?
毎回手動で「プロジェクト情報」を開き、カレンダーを変更するのは、百害あって一利なしの無駄な作業です。
私たちが目指すべきゴールはシンプル。「新規プロジェクトを作った瞬間、あるいは専用のマクロを実行した瞬間に、自社標準のカレンダーと稼働時間が自動で適用されている状態」です。
今回は、これをProject VBAで完全に自動化する極意を伝授します!
—
そもそも「Project VBA」の基本を知ろう
Excel VBAやWord VBAと違い、MS ProjectのVBAには独特の「空気感」があります。
まずは、今回のコードを支える3つの重要オブジェクトを頭に叩き込んでおきましょう。
1. `ActiveProject` (アクティブプロジェクトオブジェクト)
今、画面の前面で開かれているプロジェクトそのものを指します。
2. `Project.Calendar` (カレンダー)
プロジェクト全体のリソース稼働やタスクスケジュールを支配する「時間的ルールの塊」です。
3. `Application` (アプリケーションオブジェクト)
MS Project全体を統括する親玉です。
今回の作戦は至って明快。
「新しく開いた、あるいは作成したプロジェクトに対し、VBAから強制的に自社標準のカレンダーを割り当て、稼働時間を上書き設定する」 これだけです。
—
実践!自動化マクロの全体像
以下のコードを、あなたのProjectのVBAエディタ(`Alt + F11` で起動)に貼り付けてみてください。
初心者の方でも迷わないよう、一行ずつ魂を込めてコメントを入れています。
Sub ApplyCompanyStandardCalendar()
‘ エラーハンドリングの基本:万が一の際に処理を止めず、正しくメッセージを出す
On Error GoTo ErrorHandler
Dim prj As Project
Set prj = ActiveProject
‘ 【重要】Projectオブジェクトの存在チェック
‘ ファイルが何も開かれていない状態でマクロが暴発するのを防ぎます
If ActiveProject Is Nothing Then
MsgBox “有効なプロジェクトが開かれていません。ファイルを作成または開いてから実行してください。”, vbCritical, “エラー”
Exit Sub
End:
With prj
‘ 1. プロジェクトの標準カレンダー名を自社用に設定(例:「標準」や「自社標準カレンダー」など)
‘ ※あらかじめベースとなるカレンダーがプロジェクト内に存在している前提です
Dim targetCalName As String
targetCalName = “標準” ‘ 自社の組織カレンダー名に合わせて変更してください
‘ プロジェクト全体のベースカレンダーを変更
.Calendar = targetCalName
‘ 2. 稼働時間の詳細設定(例として、朝9時から夕方18時、昼休憩1時間を強制適用)
‘ Projectのデフォルトの稼働時間を自社の就業規則に同期させます
‘ ※MinutesPerDay: 1日の総稼働分数 (8時間 = 480分)
‘ ※MinutesPerWeek: 週の総稼働分数 (40時間 = 2400分)
‘ ※DaysPerMonth: 月の平均稼働日数 (20日など)
.MinutesPerDay = 480 ‘ 8時間 × 60分
.MinutesPerWeek = 2400 ‘ 5日 × 480分
.DaysPerMonth = 20 ‘ 月20日稼働とする場合
‘ 3. 稼働時間帯の厳密な定義 (オプション:オプション設定の反映)
‘ ここをコードで担保することで、担当者のPC環境による設定の揺れを完全になくします
Application.DefaultStartTime = “09:00”
Application.DefaultEndTime = “18:00”
End With
‘ 成功のフィードバック
MsgBox “自社標準カレンダーおよび稼働時間の適用が完了しました!”, vbInformation, “自動化完了”
Exit Sub
ErrorHandler:
‘ 予期せぬエラーが発生した場合の逃げ道
MsgBox “エラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “想定外のエラー”
End Sub
—
初心者がハマりやすい「3つの罠」と対策
このコードを実際に動かす時、あるいはテンプレートとして組み込む時に、多くの人が以下の罠にハマります。先回りして回避方法を知っておきましょう。
罠その1:「指定したカレンダーが見つからない」エラー
- 現象: `targetCalName = “自社標準”` と指定したのに、「そんな名前のカレンダーはありません」とVBAに怒られる。
- 原因: MS Projectには、デフォルトで英語圏の「標準 (Standard)」や「夜勤 (Night Shift)」などが存在しますが、日本語環境では名前が微妙に異なる場合があります。
- 対策: あらかじめプロジェクトの「ツール」>「稼働時間の変更」から、自社用のカレンダーを作成し、その正確な名前をコードの文字列に代入してください。
罠その2: 空の状態でマクロを実行してしまう
- 現象: Projectを起動した直後(何もプロジェクトファイルが存在しない、またはすべて閉じている状態)でマクロを実行すると、`ActiveProject Is Nothing` で実行時エラーになる。
- 対策: 先ほどのコードのように、`If ActiveProject Is Nothing Then` によるガード節を必ず設けるのが、プロのエンジニアの作法です。
罠その3: 個人用マクロブック(Global.mpt)への保存忘れ
- 現象: せっかく書いたコードが、別のパソコンや新しいファイルを開いたときに消えてしまう。
- 対策: このマクロを特定のプロジェクトファイルだけに閉じ込めず、自分のPCの「Global.mpt(グローバルテンプレート)」に保存してください。そうすれば、いつ、どんな新しいプロジェクトを作っても、この自動化の恩恵をいつでも受けることができます。
—
テンプレート活用への発展:グローバルテンプレート(Global.mpt)の魔術
さらに一段階上のレベルへ進みましょう。
このマクロを `Global.mpt` に保存し、さらに `Auto_New` という特殊なプロシージャ名(またはイベントプロシージャ)に変更するとどうなるでしょうか?
‘ プロジェクトが新規作成された瞬間に自動で走るマジックルーチン
Sub Auto_New()
Call ApplyCompanyStandardCalendar
End Sub
これを行うことで、ユーザーが意識すらすることなく、「新規作成ボタンを押した瞬間から、社内基準のガントチャート環境が完璧に整った状態」を作り出すことができます。
バラバラだったプロジェクトの品質が綺麗に統一され、スケジュール管理の属人化が一撃で解消されます。これこそが、業務自動化エンジニアがもたらす本当の価値です。
—
最後に:ここをクリアすれば、あなたはもう初心者ではない
お疲れ様でした!
今回学んだ「オブジェクトの取得」「プロパティの上書き」「エラーハンドリング」、そして「グローバルな発想」。これらはすべて、Excel VBAや他の言語でも通用する本質的なエンジニアリングの思考法です。
「毎回手動で設定していたあの面倒な作業が、たった1秒で終わる快感」。
この感動を味わえたなら、あなたはもうマクロの記録の卒業生、立派なProject VBAの使い手です。
日々のプロジェクト管理をハックし、退屈な定型作業をコードの力で駆逐していきましょう。
あなたの自動化ライフを、心から応援しています!
