【入門編】【初心者向け】マクロ記録が使えないProject VBAで、最初の1行を書き始めるためのデバッグテクニック – Project VBA解析バイブル

スポンサーリンク

こんにちは!MS Projectの自動化の世界へようこそ。
私はこれまで数々の巨大プロジェクトのスケジュール管理や、VBAによる泥臭い自動化をくぐり抜けてきたチーフアーキテクトです。

さて、読者の皆さんの中に、こんな絶望を味わった方はいませんか?

「Excelなら『マクロの記録』ボタンを押して操作すればコードが書けたのに、Projectにはマクロの記録がない……!」

そう、Microsoft Projectには、残念ながら操作を自動記録する魔法のボタンはありません。「じゃあ、オブジェクトのプロパティ名や書き方なんて、どうやって調べればいいんだよ!」と、暗闇に放り出されたような気持ちになりますよね。

でも、安心してください。ここをクリアすれば、Project VBAの基本はバッチリですよ。
今回は、マクロ記録が使えない荒野で、イミディエイトウィンドウを最強の相棒にして「最初の1行」を導き出す実践的なデバッグテクニックを、優しく、そして本質的なところまで徹底的に解説します。

1. なぜProject VBAは難しく感じるのか?

Excel VBAやWord VBAに慣れている人ほど、Projectのオブジェクトモデルの厳格さに戸惑います。
Excelのセルなら `Range(“A1”).Value = “完了”` と直感的に書けますが、Projectの世界では、タスク(Task)やリソース(Resource)といったオブジェクトが、独特の階層構造(プロジェクトの中にタスクがあり、タスクの中に担当者やコストがある)を持っています。

マクロの記録がないということは、「今、自分がどのオブジェクトを掴んでいるのか」をコードで明確に指し示してあげる必要があるということです。

ここで多くの初心者が「エラーが出て動かない…」と挫折しますが、闇雲にネットのコードをコピペする必要はありません。Project自身に「今の状態はどうなっているの?」と直接聞く方法を覚えればいいのです。それが、これから紹介するイミディエイトウィンドウを使った探索手法です。

2. 魔法の小道具:イミディエイトウィンドウを召喚せよ

まずはVBE(Visual Basic Editor)を開きましょう([Alt] + [F11]キー)。
画面の下部にある「イミディエイトウィンドウ」(もし見当たらなければ、上のメニューの「表示」>「イミディエイト ウィンドウ」をクリック、または `[Ctrl] + [G]`)を出してください。

こここそが、Projectの内部構造を丸裸にするための「秘密の小部屋」です。

最も簡単な確認コマンド「Print」

イミディエイトウィンドウでは、行の頭に `?`(Printの意味)をつけてコードを書き、[Enter]キーを押すだけで、その場で結果が返ってきます。

まずは、現在開いているプロジェクトのファイル名を確認してみましょう。
イミディエイトウィンドウに次のように打ち込んで、[Enter]を押してみてください。

? ActiveProject.Name

どうですか? 今開いているプロジェクトのファイル名がズバッと表示されたはずです。
成功です!これであなたは、Projectの根幹である `ActiveProject` というオブジェクトと対話することに成功しました。

3. 「分からない」を解決する探索的デバッグの極意

「じゃあ、選択しているタスクの名前を知りたいときはどうするの?」
ここからが本番です。マクロ記録がない世界で、オブジェクトのプロパティを探る手順をステップ・バイ・ステップで見ていきましょう。

ステップ①:適当なタスクを選択した状態で、コードを試す

まずはProjectのガントチャート画面に戻り、適当なタスクを1つだけクリックして選択状態にしてください。
再びVBEに戻り、イミディエイトウィンドウにこう打ち込みます。

? ActiveSelection.Tasks(1).Name

[Enter]を押すと……選択したタスクの名前が表示されましたね!
ここで重要なのは、「ActiveSelection(選択しているもの) > Tasks(1)(その中の1番目のタスク) > Name(名前)」という構造を、自分の手で暴き出したという事実です。

ステップ②:IntelliSense(入力補完)を味方につける

コードを書くときは、あまり先入観を持たず、ドット(`.`)を打ったときに出てくるポップアップ(IntelliSense)を頼りにしましょう。

例えば、コードウィンドウに次のように途中まで打ってみます。

Sub CheckTaskInfo()
Dim tsk As Task
Set tsk = ActiveProject.Tasks(1)

‘ ここで tsk. と打つと、使えるプロパティの一覧が出る!
‘ 試しに tsk. と打って、[ . ] の後に何が出るか見てみよう
End Sub

`tsk.` と打った瞬間に、`Name`、`Start`、`Finish`、`Cost`、`PercentComplete` といった、タスクが持つべきあらゆるプロパティ(属性)の一覧がずらりと表示されます。
「あ、ここには進捗率(PercentComplete)や残余コスト(Cost)なんていうプロパティもあるんだな」と、コードを書きながらオブジェクトの仕様書代わりにしてしまうのです。これがプロの探索テクニックです。

4. 最初の1行を書き上げる!実践的なサンプルコード

さて、イミディエイトウィンドウで「今、何が取れるか」を確認する方法が分かったところで、最初の1行から組み立てた「選択したタスクの情報をメッセージボックスで表示するマクロ」を書いてみましょう。

以下のコードを、標準モジュールにコピペして実行してみてください。

Sub ShowSelectedTaskInfo()
‘ ==========================================================
‘ テーマ:選択されたタスクの情報を安全に取得して表示する
‘ ==========================================================

Dim targetTask As Task

‘ エラー対策:何もタスクが選択されていない状態で実行されたらどうするか?
On Error GoTo ErrorHandler

‘ 1. 現在選択されている最初のタスクを変数に格納する
‘ (※ActiveSelection.Tasksを使うのがProject VBAの定石です)
If ActiveSelection.Tasks.Count > 0 Then
Set targetTask = ActiveSelection.Tasks(1)

‘ 2. 取得したオブジェクトのプロパティを組み合わせてメッセージを作る
MsgBox “【選択中タスクの情報】” & vbCrLf & _
“・タスク名: ” & targetTask.Name & vbCrLf & _
“・開始日: ” & targetTask.Start & vbCrLf & _
“・終了日: ” & targetTask.Finish & vbCrLf & _
“・進捗率: ” & targetTask.PercentComplete & “%”, _
vbInformation, “Project VBA 探索完了!”
Else
MsgBox “タスクが選択されていません。ガントチャートでタスクを選択してください。”, vbExclamation
End If

Exit Sub

ErrorHandler:
‘ 万が一のエラーを優しくキャッチする防壁
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub

このコードの「本質」を解説

1. `ActiveSelection.Tasks.Count > 0` による安全確認
Project VBAでは、ユーザーが何も選択していない状態でオブジェクトを操作しようとすると、容赦なく実行時エラー(エラー番号91など)で止まります。これを防ぐために「数が0より大きいか?」をチェックする習慣(ガード節)が、実務では命を救います。
2. `vbCrLf` と `&` による文字列の連結
取得したプロパティ(NameやStartなど)を人間が読みやすいように綺麗に整形して出力する、VBAの基本テクニックです。

5. 初心者が絶対にハマる「トラップ」と回避の極意

最後に、Project VBA特有の、初心者が必ずと言っていいほど踏み抜く「地雷」を一つだけ共有しておきます。

トラップ:Excelの感覚でセル(タスク)を書き換えようとして撃沈する

Excelなら `Cells(1, 1).Value = “テスト”` と書けば、そのセルが何であれ強制的に文字が入りますよね。しかし、Projectでこれをやると大怪我をします。

  • プロジェクトのタスクは、一筋縄ではいかない生き物です。
  • サマリータスク(要約タスク)の開始日や期間を無理やりVBAで書き換えようとすると、子タスクとの整合性が崩れてProjectがエラーを吐いたり、予期せぬスケジュール崩壊を引き起こします。

【回避の極意】
値を書き換えるときは、必ずそのプロパティが「書き込み可能(Read/Write)」なものか、イミディエイトウィンドウで実験してからにしましょう。
例えば、進捗率を変えるなら:

ActiveProject.Tasks(1).PercentComplete = 50

これは安全に書き換えられます。まずは安全なプロパティの読み書きから始めて、徐々にスケジュール計算(スケジュール・エンジン)に干渉する複雑な処理へとステップアップしていきましょう。

まとめ:今日からあなたもProject VBAの探検家

マクロの記録がないことは、最初は不便に感じるかもしれません。しかし視点を変えれば、「自分自身の手でオブジェクトを直接操作し、システムと対話する本当のプログラミングの楽しさ」を味わえる最高の環境とも言えます。

困ったら、まずはイミディエイトウィンドウを開き、`?` をつけてオブジェクトに話しかけてみてください。
「今、あなたは何を持っているの?」と対話を重ねるうちに、Projectのオブジェクトモデルはあなたにとって頼もしい相棒へと変わっているはずです。

ここをクリアしたあなたなら、もうProject VBAの基本はバッチリです!
自信を持って、最初の1行を書き始めてみてくださいね。応援しています!

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