【入門編】【初心者向け】特定のフォルダ内の全プロジェクトファイルを一括で開いて閉じるループ処理の基本 – Project VBA解析バイブル

スポンサーリンク

やあ、Project VBAの世界へようこそ!
マクロの記録を卒業し、「コードを書いて複数のファイルを自由自在に操作したい」と思えた瞬間こそが、本物のエンジニアへの第一歩です。ここをクリアすれば、Project VBAの基本はバッチリですよ。

Microsoft Project(.mppファイル)の自動化において、最も頻出かつ強力なパターンが「指定したフォルダ内のファイルを片っ端から開いて、処理して、閉じる」という一括ループ処理です。

一見シンプルですが、Excel VBAとは少し異なるProject VBA特有の作法や、メモリを汚さないためのリソース管理など、プロとして知っておくべきポイントがいくつかあります。今回は、初学者のあなたに向けて、その本質を分かりやすく徹底解説します!

1. 処理の全体像(イメージをつかもう)

コードを書く前に、処理がどのように進むのか頭の中でイメージしてみましょう。
今回のプログラムは、次のようなステップで動きます。

[開始]

├─ 1. 対象フォルダと「.mpp」を指定する

├─ 2. Dir関数で最初のファイル名を取得する

🔄【繰り返しループ(ファイルがある限り)】
│ │
│ ├─ 3. ファイルを開く (FileOpenEx)
│ ├─ 4. 目的の処理を実行(データ読み取りや更新など)
│ ├─ 5. ファイルを閉じる (FileCloseEx)
│ └─ 6. Dir() で次のファイル名を取得する

└─ 7. 完了メッセージを出して終了

ポイントは「1つ開いて、処理して、すぐ閉じる」こと。
一度に何十個もファイルを開きっぱなしにすると、パソコンのメモリが圧迫されて動作が重くなったり、最悪の場合はフリーズしてしまいます。1つずつ丁寧に扱ってすぐ閉じるのが、スマートなコードの基本です。

2. 決定版!一括開閉ループの標準コード

それでは、開発現場でそのまま使える実用的なコードを紹介します。
VBE(Visual Basic Editor)を開いて、標準モジュールにコピペして試してみてください。

Option Explicit

”’

”’ 指定フォルダ内の全.mppファイルを順次開いて閉じ、一括処理を行う基本ルーチン
”’

Public Sub BatchProcessProjectFiles()

Dim folderPath As String
Dim fileName As String
Dim fullPath As String
Dim targetProject As Project

‘ —————————————————————–
‘ 1. 対象フォルダパスの設定
‘ ※環境に合わせて書き換えてください(末尾の “\” を忘れずに!)
‘ —————————————————————–
folderPath = “C:\ProjectFiles\”

‘ フォルダパスの末尾補正(”\” がない場合は補填する親切設計)
If Right(folderPath, 1) <> “\” Then
folderPath = folderPath & “\”
End If

‘ —————————————————————–
‘ 2. 最初の.mppファイル名を取得
‘ —————————————————————–
fileName = Dir(folderPath & “.mpp”)

‘ ファイルが存在しない場合のチェック
If fileName = “” Then
MsgBox “対象のフォルダに .mpp ファイルが見つかりませんでした。”, vbExclamation, “処理中断”
Exit Sub
End If

‘ パフォーマンス向上とポップアップ抑止
Application.DisplayAlerts = False

‘ —————————————————————–
‘ 3. ループ処理(ファイルが取得できなくなるまで繰り返す)
‘ —————————————————————–
Do While fileName <> “”

‘ フルパスの構築
fullPath = folderPath & fileName

‘ ————————————————————-
‘ ファイルを開く
‘ ※ReadOnly:=True にしておくと、読み取り専用で開くため安全です
‘ ————————————————————-
Application.FileOpenEx Name:=fullPath, ReadOnly:=True

‘ 開いたプロジェクトオブジェクトの参照を取得
Set targetProject = Application.ActiveProject

‘ ————————————————————-
‘ 【メイン処理領域】
‘ ここに各ファイルに対して行いたい処理を書きます!
‘ ————————————————————-
Debug.Print “処理中のファイル: ” & targetProject.Name
‘ (例:タスク数をイミディエイトウィンドウに表示してみる)
Debug.Print ” -> タスク数: ” & targetProject.Tasks.Count
‘ ————————————————————-

‘ ————————————————————-
‘ ファイルを閉じる
‘ pjDoNotSave を指定することで「保存しますか?」のダイアログを阻止
‘ ————————————————————-
Application.FileCloseEx Save:=pjDoNotSave

‘ メモリ解放(オブジェクト参照をクリア)
Set targetProject = Nothing

‘ 次のファイル名を取得(※引数は指定しない!)
fileName = Dir()

Loop

‘ —————————————————————–
‘ 4. 後始末
‘ —————————————————————–
Application.DisplayAlerts = True

MsgBox “すべてのファイルの処理が正常に完了しました!”, vbInformation, “完了”

End Sub

3. 初心者が絶対知っておくべき「3つのポイント」

上記のコードには、マクロの記録から一歩抜け出すための重要なテクニックが詰まっています。ポイントを噛み砕いて解説しますね。

① Project VBAでのファイル開閉は `FileOpenEx` と `FileCloseEx` を使う

Excel VBAでは `Workbooks.Open` や `Workbook.Close` を使いますが、Project VBAでは `Application.FileOpenEx``Application.FileCloseEx` を使うのが標準的です。

閉じる際の `Save:=pjDoNotSave`(保存しない)や `Save:=pjSave`(保存する)という定数の指定は非常に重要です。これがないと、マクロが動いている最中に「変更を保存しますか?」という警告ダイアログが止まってしまい、完全自動化ができなくなってしまいます。

② `Dir` 関数の「ルール」を守る

`Dir` 関数は少し特殊な動きをします。

  • 1回目: `Dir(“C:\folder\.mpp”)` とパスを指定して呼ぶことで、最初のファイル名を取る。
  • 2回目以降: ループ内で `Dir()` と引数なしで呼ぶことで、次のファイル名を順に取ってくる。

2回目以降にもパスを入れてしまうと、永久に1つ目のファイルを返し続けて無限ループに陥ります。ここは初心者が最も引っかかりやすい罠の一つです!

③ メモリ管理:使い終わったオブジェクトは `Nothing` でリセット

Set targetProject = Nothing

「開いて閉じたんだから自動で消えるでしょ?」と思いがちですが、VBAの変数(参照)が残っていると、裏でMS Projectがファイルを解放してくれないことがあります。
使い終わったオブジェクト変数には必ず `Set 変数 = Nothing` を代入して、参照を綺麗に開放してあげましょう。これがプロの書く「堅牢なコード」の条件です。

4. よくあるエラーと対処法(トラシュー)

開発中によく遭遇するエラーとその対策をまとめておきます。もし動かなくなったときは、ここをチェックしてみてください。

❓ エラー:ファイルが開けない / 見つからない

  • 原因: フォルダパスの末尾に `\`(円マーク/スラッシュ)が抜けている、またはパス自体が間違っている。
  • 対策: コード冒頭で `Right(folderPath, 1) <> “\”` の判定を入れているか確認しましょう。

❓ ループが途中で止まる / ポップアップが出る

  • 原因: 他のユーザーがファイルを開いていてロックされている、またはプロジェクトを開く際に警告メッセージが出ている。
  • 対策: `Application.DisplayAlerts = False` を設定することに加え、`FileOpenEx` の引数に `ReadOnly:=True`(読み取り専用)を指定して開くと、共有エラーを回避しやすくなります。

5. まとめ&次へのステップ

お疲れ様でした!
今回学んだ「Dir関数を使った一括ループ処理」は、Project VBAにおけるあらゆる自動化の「骨格(フレームワーク)」になります。

1. `Dir` でファイルを探す
2. `FileOpenEx` で開いて `ActiveProject` を取る
3. 処理をして `FileCloseEx` で閉じる

この型さえマスターしてしまえば、あとはループの中に「各タスクの遅延をチェックする処理」や「進捗データをExcelに書き出す処理」を組み込んでいくだけです。

基礎はこれで完璧です。自信を持って次のステップへ進んでくださいね!応援しています!

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