こんにちは!Project VBAの世界へようこそ。いつも業務の自動化やプロジェクト管理の効率化に挑戦しているあなたを、私は心から応援しています。
「Excel VBAなら少し触ったことがあるけれど、Microsoft Project(以下、MS Project)のVBAになった途端、思ったように動かなくて戸惑ってしまった……」
そんな経験はありませんか?
実は、それはあなたのプログラミングスキルのせいではありません。MS Projectというアプリケーションが持つ「独特のオブジェクト構造(設計思想)」を少しだけ知らないだけなのです。
この記事では、マクロの記録から一歩踏み出し、「タスクの進捗率(%)に応じて、タスク名やテキストのフォント色を自動で塗り分けるマクロ」を題材に、Project VBAの基本と、実務で絶対に外せないポイントを優しく、かつ深く解説します。
ここをクリアすれば、Project VBAの基礎はバッチリ掴めますよ。さあ、一緒に新しい扉を開けましょう!
—
1. なぜExcelと同じように書けないの?Project VBAの思想を知る
Excel VBAでは、セルに色を塗るときに以下のように書きますよね。
‘ Excel VBAの例(直感的で分かりやすい)
Range(“A1”).Font.Color = RGB(255, 0, 0)
しかし、MS Projectには `Range` という概念がありません。
MS Projectは、Excelのような単なる「表計算ソフト」ではなく、「タスクやリソースが複雑に紐づいたデータベース」だからです。
タスクのデータを保持する `Task` オブジェクトには、実は直接フォントの色を変更するプロパティ(例: `Task.FontColor` のようなもの)が存在しません。
では、どうやって色を変えるのか?
MS Projectでは、以下のようなステップを踏んで画面上のフォント色を変更します。
1. 対象となるタスク(行)を画面上で選択する(`SelectRow`)
2. 選択された行に対して、フォント変更コマンドを実行する(`Font32Ex`)
「えっ、わざわざ画面上で選択しないといけないの?」と思うかもしれません。そうです。MS Project VBAは「今見ているビュー(画面)に対して書式を適用する」というお作法を持っているのです。この思想さえ理解してしまえば、Project VBAの難易度は一気に下がります。
—
2. 【実践コード】進捗率に応じてフォント色を動的に変更する
まずは、そのままコピーして使える実用的なコードをご紹介します。
このマクロは、各タスクの「進捗率(`PercentComplete`)」を読み取り、以下のようにフォント色を自動で変更します。
- 進捗率 100%(完了) $\rightarrow$ シックな グリーン(完了した安心感)
- 進捗率 1%〜99%(進行中) $\rightarrow$ 鮮やかな ブルー(現在進行形)
- 進捗率 0%(未着手) $\rightarrow$ 落ち着いた ダークグレー(未着手)
Sub VisualiseTaskProgressColor()
‘ ————————————————————————-
‘ 処理名:進捗状況に応じたタスクフォント色の自動視覚化
‘ 開発者:チーフアーキテクト(後輩のあなたへ贈るコード)
‘ ————————————————————————-
Dim t As Task
Dim targetProject As Project
Set targetProject = ActiveProject
‘ 1. 画面の更新を止めて処理を高速化する(Project VBAの必須テクニック)
ScreenUpdating = False
‘ 2. すべてのタスクを1つずつ順番にチェックする
For Each t In targetProject.Tasks
‘ 【重要】空白行(中身がNothingのタスク)はスキップする
If Not t Is Nothing Then
‘ 【重要】サマリータスク(大項目)は色を変えずにスキップする(お好みで変更可能)
If Not t.Summary Then
‘ 対称のタスクがある行を選択する
‘ Row:=t.ID でそのタスクの行番号を指定し、RowRelative:=False で絶対位置で選択します
SelectRow Row:=t.ID, RowRelative:=False
‘ 3. 進捗率(PercentComplete)に応じて分岐処理
Select Case t.PercentComplete
Case 100
‘ 進捗率100%:完了(グリーン)
Font32Ex Color:=RGB(46, 139, 87) ‘ SeaGreen
Case 1 To 99
‘ 進捗率1%〜99%:進行中(ブルー)
Font32Ex Color:=RGB(30, 144, 255) ‘ DodgerBlue
Case 0
‘ 進捗率0%:未着手(ダークグレー)
Font32Ex Color:=RGB(128, 128, 128) ‘ Gray
End Select
End If
End If
Next t
‘ 4. 画面更新を元に戻す
ScreenUpdating = True
‘ 完了メッセージ
MsgBox “すべてのタスクの進捗色を更新しました!”, vbInformation, “処理完了”
End Sub
—
3. 鍵となるコードを徹底解説!
このコードの中で、マクロの記録から脱却するために最も重要なポイントを解説します。
① `If Not t Is Nothing Then`(空白行のガード)
MS Projectのタスクシートには、中身が何も入力されていない「空白行」が存在することがあります。
VBAでタスクをループ処理するとき、この空白行にアクセスすると「オブジェクト変数または With ブロック変数が設定されていません」というエラー(エラー91)が発生してしまいます。
`If Not t Is Nothing` と書くことで、実体のあるタスクだけを安全に処理することができます。
② `SelectRow Row:=t.ID, RowRelative:=False`
タスクの `ID`(行番号)を使って、そのタスクがある行を強制的に選択します。
`RowRelative:=False` を指定することで、「現在の選択位置からの相対的な行数」ではなく、「上から数えて何行目か」という絶対的な位置で正確に選択することができます。
③ `Font32Ex` メソッド
MS Projectで文字色やフォントを変更するための本命メソッドです。
「マクロの記録」をすると古い `Font` メソッドが記録されることがありますが、`Font32Ex` を使うことで、RGB値(`RGB(Red, Green, Blue)`)を使って、1,600万色の中から自由で美しい色を指定することができます。
—
4. 初心者が絶対に踏む「3つの地雷」と回避策
Project VBAには、Excel VBAにはない特有の落とし穴があります。先輩として、あらかじめ回避策を教えておきますね。
地雷1:ガントチャート(シート)が表示されていないとエラーになる
このマクロは「画面上の行を選択して色を塗る」という仕組み上、画面が「ガントチャート」や「タスクシート」などのタスクが一覧表示されているビューになっていないとエラーになります。
- 対策:マクロを実行するときは、ガントチャート画面を開いた状態で実行してください。コードの冒頭に `ViewApply Name:=”&Gantt Chart”` を入れて、強制的にガントチャートビューに切り替える処理を足すとさらに親切です。
地雷2:マクロの実行スピードが遅い
タスク数が100件、200件と増えてくると、1行ずつ選択して色を塗る処理は画面がチラついて非常に遅くなります。
- 対策:コードの最初と最後にある `ScreenUpdating = False` / `True` を必ず入れてください。画面の描画を一時的に止めることで、処理速度が数倍〜数十倍に跳ね上がります。
地雷3:マニュアルタスクと自動スケジュールの混在
MS Projectには「手動スケジュール」と「自動スケジュール」のタスクがあります。どちらであっても進捗率は取得できますが、手動スケジュールの場合は期間や日付が未入力の場合があるため、条件分岐で日付を参照する際は注意しましょう。
—
5. 次のステップへのエール
お疲れ様でした!
今回学んだ「タスクをループで回し、条件に応じて書式を変える」というテクニックは、Project VBAの基本中の基本でありながら、最も応用が効く強力な武器です。
これがマスターできれば、次は以下のような応用も簡単に作れるようになりますよ。
- 「期限が過ぎているのに、進捗率が100%になっていないタスク(遅延タスク)を赤色にする」
- 「特定のリソース(担当者)が割り当てられているタスクを太字にする」
MS Projectは、使いこなせばプロジェクトマネジメントの強力な司令塔になります。マクロの力を使って、退屈な手作業から卒業し、スマートで美しいガントチャートを作り上げていってくださいね。
何か分からないことがあれば、いつでも聞いてください。応援しています!
