【Project VBAの極意】ActiveProjectに頼るな!複数プロジェクトを操る「確実な参照術」
こんにちは。プロジェクト管理の現場で、VBAを使って自動化に挑んでいる皆さん。
マクロの記録ボタンを押してコードを生成し、「よし、これで動いた!」と喜んでいる時期は、実は一番危うい時期でもあります。
特にMicrosoft ProjectのVBAにおいて、初心者が最初にぶつかる壁であり、かつ「脱・初心者」の登竜門となるのが、`ActiveProject`の罠です。
今日は、複数のプロジェクトファイルを同時に開いている現場で、あなたの書いたマクロが「どのファイルを操作しているのか分からなくなる」という悲劇を未然に防ぐための、堅牢な参照術を伝授します。
—
1. なぜ「ActiveProject」は危険なのか?
VBAを書くとき、ついついこのように書きたくなりますよね。
‘ 悪い例:今の作業画面を操作する
Application.ActiveProject.Tasks(1).Name = “修正完了”
これ、一見正しそうに見えます。しかし、現場では「Active(今アクティブになっている)」という状態は、ユーザーの気まぐれで一瞬にして変わります。
- マクロを実行しようとした瞬間に、別のウィンドウをクリックしていたら?
- バックグラウンドで別のプロジェクトが開かれていたら?
`ActiveProject`は、その瞬間に「一番手前にあるもの」を指し示すだけであり、あなたのプログラムが「操作したいプロジェクト」と一致する保証はどこにもありません。これが、意図しないデータを破壊するバグの温床です。
—
2. 脱・初心者への道:Projectsコレクションを活用せよ
Project VBAの世界では、開かれているすべてのプロジェクトは`Projects`というコレクション(箱)の中に管理されています。
`ActiveProject`という「あやふやなもの」に頼るのではなく、「自分が必要としているプロジェクトを明示的に特定する」のが、プロのエンジニアの流儀です。
プロジェクトを特定する3つのアプローチ
A. 名前で特定する(一番直感的)
プロジェクト名がわかっているなら、インデックスとして名前を渡すのが最も安全です。
Sub UpdateTargetProject()
Dim targetProj As Project
‘ プロジェクト名で直接指定する
Set targetProj = Projects(“計画書_2024.mpp”)
‘ 指定したプロジェクトに対して操作を行う
targetProj.Tasks(1).Name = “確実な操作”
End Sub
B. インデックス番号で特定する
開いた順番で管理する手法です。ただし、プロジェクトを閉じたり開いたりすると番号が変わるため、定型的なバッチ処理に向いています。
‘ 最初に開いたプロジェクトを操作
Set targetProj = Projects(1)
C. パスで特定する(最も堅牢)
同じファイル名のプロジェクトが複数存在しうる場合、フルパスで特定するのが最強です。
‘ ファイルパスが一致するものを探す
For Each p In Projects
If p.FullName = “C:\Projects\Target.mpp” Then
Set targetProj = p
Exit For
End If
Next p
—
3. 実践:安全なコードのテンプレート
現場でそのまま使える、堅牢な参照コードのテンプレートを作成しました。これをベースに書けば、もう「操作対象を間違える」ことはありません。
Sub SafeProjectOperation()
Dim targetProj As Project
Dim projName As String
‘ 操作したいプロジェクトの名前を定義
projName = “業務改善プロジェクト.mpp”
‘ エラーハンドリング:プロジェクトが開かれているか確認
On Error Resume Next
Set targetProj = Projects(projName)
On Error GoTo 0
‘ もしプロジェクトが見つからなければ処理を中断
If targetProj Is Nothing Then
MsgBox projName & ” が見つかりません。ファイルを開いてください。”, vbCritical
Exit Sub
End If
‘ ここから先は targetProj を使って操作する
‘ これにより、他のプロジェクトには一切影響を与えない
targetProj.Tasks(1).Start = Date
MsgBox “操作完了:” & targetProj.Name
End Sub
—
4. ここをクリアすれば、あなたはもう中級者です
「Active」という言葉に惑わされず、「オブジェクトを定義し、それを変数にセットしてから操作する」。
この、たった一つの習慣が、あなたの書くVBAコードの品質を劇的に向上させます。
`ActiveProject`は、あくまで「ユーザーが手作業で操作しているものを取得する」ときだけの限定的なツールだと心に刻んでおいてください。
今回の内容をマスターすれば、Project VBAの基本構造は完全にあなたの掌の中にあります。次は、`Tasks`や`Resources`の深い階層構造を攻略していきましょう。
もし不明点があれば、遠慮なく聞いてくださいね。あなたの自動化の旅を、これからも全力でサポートします。
