こんにちは。プロジェクト管理の現場で、毎日何十ものMPPファイルを開いては閉じて……そんな退屈な「手作業の刑」に服していませんか?
マクロの記録ボタンを押すだけの世界は今日で卒業です。今日は、Microsoft Project VBAの真髄である「FileSystemObject(FSO)」を使い、フォルダ内のMPPファイルを縦横無尽に操る「自動化の魔法」を伝授しましょう。
これを習得すれば、あなたのPCが寝ている間に、全プロジェクトの進捗を確認したり、ベースラインを一斉に設定したりすることが可能になります。準備はいいですか?
—
なぜ「FSO」が最強の武器なのか?
VBAには標準でファイル操作機能がありますが、古い手法(Dir関数など)は再帰的(サブフォルダまで深く潜る)な検索が苦手です。そこで登場するのがFileSystemObject (FSO)です。
FSOはWindowsのファイルシステムをオブジェクトとして扱うための強力なインターフェース。これを使うと、まるでフォルダという宝箱を自由に探索する冒険者のようなコードが書けます。
—
【実践】再帰的にファイルを検索するコード
以下のコードをProjectの標準モジュールに貼り付けてください。単に開くだけでなく、「処理の対象を制御する」というエンジニアの視点を込めています。
‘ 参照設定: Microsoft Scripting Runtime を有効にするとインテリセンスが効いて快適です
Sub BatchProcessProjectFiles()
Dim fso As Object
Dim targetFolder As Object
Dim rootPath As String
‘ 処理したいフォルダパスを指定
rootPath = “C:\Projects\2023_Report”
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set targetFolder = fso.GetFolder(rootPath)
‘ 再帰処理を開始
ProcessFolder targetFolder, fso
MsgBox “全ファイルの処理が完了しました。”, vbInformation
End Sub
‘ 再帰的にサブフォルダも探索するプロシージャ
Sub ProcessFolder(folder As Object, fso As Object)
Dim file As Object
Dim subFolder As Object
Dim proj As Project
‘ 1. ファイルを順次開く
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) = “mpp” Then
‘ プロジェクトを開く(Read Onlyにすると安全です)
Set proj = Application.Projects.Add(False) ‘ 空のプロジェクトで初期化
FileOpenEx Name:=file.Path, ReadOnly:=True
‘ — ここにやりたい処理を記述 —
Debug.Print “処理中: ” & file.Name
‘ 例: BaselineSave Name:=”Baseline1″
‘ —————————-
‘ ファイルを閉じる(保存せずに閉じる例)
ActiveProject.Close pjDoNotSave
End If
Next
‘ 2. サブフォルダがあれば再帰的に呼び出す
For Each subFolder In folder.SubFolders
ProcessFolder subFolder, fso
Next
End Sub
—
ここをクリアすれば一人前! 3つの重要ポイント
このコードをただコピペするだけでなく、以下の「現場の知恵」を理解してください。
1. `Application.Projects.Add` の意味
プロジェクトファイルを開く前に、実は「見えないプロジェクト」が背後に存在しています。`Projects.Add(False)`を呼ぶことで、余計なテンプレートに邪魔されず、クリーンな状態で目的のファイルを開くことができます。
2. 再帰(Recursion)という考え方
`ProcessFolder`の中で自分自身を呼び出しているのが「再帰」です。
「フォルダの中にフォルダがあったら、その中身も同じルールで処理する」というこの構造は、ディレクトリ構造がどれだけ複雑でも全ファイルを網羅できる、非常にエレガントな手法です。
3. エラーハンドリングは「礼儀」
現場では、読み取り専用のファイルや、破損したMPPファイルに遭遇することがあります。実務では必ず `On Error Resume Next` と `If Err.Number <> 0 Then` を組み合わせて、「1つのファイルがダメでも、全体が止まらない」設計にしましょう。
—
陥りやすい罠:メモリ解放を忘れない
VBAは、一度開いたMPPファイルのオブジェクトをメモリに保持し続けようとします。大量のファイルを処理する場合、`ActiveProject.Close` を忘れると、メモリ不足でPCが悲鳴を上げます。
常に「開く」と「閉じる」はセットであることを意識してください。後片付けこそ、プロのエンジニアの流儀です。
—
さあ、あなたのターンです
今回解説したFSOの使い方は、プロジェクト管理だけでなく、ExcelやWordのファイル操作にもそのまま応用できます。
「このフォルダ内の全ファイルのベースラインを一度に設定したい」
「特定のタスク名が含まれるファイルを自動で抽出したい」
そんな要望が来ても、もう怖くありませんね。このコードをベースに、あなたの現場に合わせた「最強の自動化ツール」へと育て上げてください。
迷ったら、またここへ戻ってきてください。いつでもあなたのコードをレビューしますよ。応援しています!
