【入門編】タスクの依存関係をCSVから読み込み、リンクを一括設定する自動化スクリプト – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で、エクセルとMS Projectを行き来しながら「タスクの前提条件(依存関係)の設定、これ全部手動でやるの…?」と途方に暮れた経験はありませんか?

マクロの記録ボタンを押しても、MS ProjectはExcelのように親切にコードを吐き出してくれません。「一体どうやってVBAからタスクを操ればいいんだ…」と悩むあなたへ。

今回は、CSVファイルで管理したWBSの依存関係(FS、SS、FF、SF)を読み込み、MS Projectのタスクへ一瞬で一括設定する「極限まで洗練された自動化スクリプト」を伝授します。

ここをクリアすれば、あなたも脱・マクロの初心者! Project VBAの本質を掴んだエンジニアの仲間入りです。さあ、一緒に扉を開けましょう。

なぜ、MS Projectの依存関係設定は手動だと地獄なのか?

プロジェクトが大規模化するにつれ、WBS(Work Breakdown Structure)のタスク数は数百から数千に膨れ上がります。
「タスクBは、タスクAが完了してから開始する(FS:Finish-to-Start)」といった依存関係をGUIで一つずつマウスをカチカチして繋いでいく作業は、ヒューマンエラーの温床であり、プロジェクトマネージャーの貴重な時間を奪う最大の無駄です。

これをCSVから一撃で流し込めるようになると、以下のような圧倒的なメリットが生まれます。

1. 爆速の処理速度: 数百件のリンク設定が数秒で完了する。
2. メンテナンス性の向上: 変更があればCSVを直して再実行するだけ。
3. 属人化の排除: 誰が実行しても同じ正確なスケジュールが再現される。

それでは、この自動化を実現するための核心に迫っていきましょう。

押さえておくべきProject VBAの基本構造

Excel VBAと違い、MS Project VBAには独特の「お作法」があります。特に今回重要なのが `Task` オブジェクト`Predecessors`(先行タスク)プロパティ です。

依存関係の種類(リンクタイプ)

MS Projectでは、タスク間の関係を以下の4つのアルファベットで表現します。CSVを作る際も、この表記を使用します。

  • FS (Finish-to-Start): 先行タスクが終わってから、後続が始まる(最も一般的)
  • SS (Start-to-Start): 先行タスクが始まってから、後続も始まる
  • FF (Finish-to-Finish): 先行タスクが終わる時に、後続も終わる
  • SF (Start-to-Finish): 先行タスクが始まってから、後続が終わる(レアケース)

これらをVBAから設定するには、後続タスクの `Predecessors.Add` メソッドを使用します。

【実践】CSVから依存関係を一括設定するVBAコード

実務でそのままコピペして使える、極上のプロダクションコードを用意しました。
まずは、VBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてください。

前提となるCSVのフォーマット (`C:\Temp\dependencies.csv`)

CSVの1行目はヘッダーとし、2行目以降に「後続タスクID, 先行タスクID, リンクタイプ」を記述します。

SuccessorID,PredecessorID,LinkType
2,1,FS
3,2,SS
4,3,FF

VBAコード本体

Option Explicit

‘ ==============================================================================
‘ 処理名: CSVからタスクの依存関係を一括設定するプロシージャ
‘ 概要 : 指定されたCSVファイル読み込み、MS Project上のタスクへリンクを張る
‘ ==============================================================================
Sub ImportTaskDependenciesFromCSV()
Dim csvPath As String
Dim fileNum As Integer
Dim lineData As String
Dim dataFields() As String

Dim tskSuccessor As Task
Dim tskPredecessor As Task
Dim succID As Long
Dim predID As Long
Dim linkTypeStr As String
Dim pjLinkType As Long

Dim successCount As Long
Dim errorCount As Long

‘ — 1. CSVファイルのパスを指定 —
‘ 環境に合わせてパスを変更してください
csvPath = “C:\Temp\dependencies.csv”

‘ ファイルの存在確認
If Dir(csvPath) = “” Then
MsgBox “指定されたCSVファイルが見つかりません: ” & vbCrLf & csvPath, vbCritical, “エラー”
Exit Sub
End If

‘ — 2. ファイルを開く —
fileNum = FreeFile
Open csvPath For Input As #fileNum

‘ ヘッダー行をスキップ
If Not EOF(fileNum) Then
Line Input #fileNum, lineData
End If

successCount = 0
errorCount = 0

‘ 画面描画を停止してパフォーマンスを極限まで引き上げる(お作法)
App.ScreenUpdating = False

‘ — 3. 行ごとのループ処理 —
Do While Not EOF(fileNum)
Line Input #fileNum, lineData

‘ カンマ区切りでデータを分解
dataFields = Split(lineData, “,”)

If UBound(dataFields) >= 2 Then
succID = CLng(Trim(dataFields(0)))
predID = CLng(Trim(dataFields(1)))
linkTypeStr = UCase(Trim(dataFields(2)))

‘ リンクタイプの文字列をMS Projectの定数に変換
Select Case linkTypeStr
Case “FS”: pjLinkType = pjDependencyFS
Case “SS”: pjLinkType = pjDependencySS
Case “FF”: pjLinkType = pjDependencyFF
Case “SF”: pjLinkType = pjDependencySF
Case Else: pjLinkType = pjDependencyFS ‘ デフォルトはFS
End Select

On Error Resume Next
‘ タスクIDからタスクオブジェクトを取得
‘ ※ MS ProjectのIDはプロジェクト全体でユニークなIDを使用します
Set tskSuccessor = ActiveProject.Tasks.UniqueID(succID)
Set tskPredecessor = ActiveProject.Tasks.UniqueID(predID)

If Err.Number = 0 And Not tskSuccessor Is Nothing And Not tskPredecessor Is Nothing Then
‘ 依存関係(先行タスク)を追加
‘ Predecessors.Add(Task, [Type], [Lag])
tskSuccessor.Predecessors.Add tskPredecessor, pjLinkType
successCount = successCount + 1
Else
‘ タスクが見つからない等のエラーハンドリング
errorCount = errorCount + 1
End If
On Error GoTo 0
End If
Loop

‘ — 4. 後処理 —
Close #fileNum
App.ScreenUpdating = True

‘ 完了レポート
MsgBox “依存関係のインポートが完了しました!” & vbCrLf & _
“成功件数: ” & successCount & ” 件” & vbCrLf & _
“スキップ/エラー: ” & errorCount & ” 件”, vbInformation, “処理完了”

End Sub

コードの核心:ここがエンジニアの腕の見せ所

上記のコードで、初心者が見落りがちな「極意」をいくつか解説します。

1. `ActiveProject.Tasks.UniqueID` の使用

MS Projectには、行番号としての `ID` と、タスク固有の識別子である `UniqueID` が存在します。
行を挿入・削除すると通常の `ID` はズレてしまいますが、`UniqueID` は不変です。外部システム(CSV)と連携する場合、必ず `UniqueID` を基準にするのがプロの鉄則です。

2. `App.ScreenUpdating = False` による爆速化

MS Projectは、タスクのリンクを1つ追加するたびにスケジュール全体の再計算(ネットワークダイアグラムの再描画)走らせようとします。数千件処理するとこれだけで何分もかかります。
処理の最初に画面更新を止め、最後に戻すことで、処理時間を数分から数秒へと劇的に短縮できます。

3. 安全なエラーハンドリング (`On Error Resume Next`)

CSVに存在しないタスクIDが指定されていた場合、通常のコードではそこでVBAがクラッシュします。
あえて `On Error Resume Next` を挟み、タスクの取得に失敗した場合はエラーカウントに回して処理を継続させることで、堅牢な(バグに強い)マクロに仕上げています。

陥りやすい罠とエラー対策

最後に、現場でよくあるトラブルシューティングを共有します。

  • Q. 「型が一致しません」というエラーが出る
  • A. CSVの中に文字列(スペースやアルファベット)が混ざっている可能性があります。`CLng()` で数値変換する前に `Trim()` で余計な空白を削除しているか確認してください。
  • Q. リンクが二重に設定されてしまう
  • A. すでに設定されているリンクに対して再度 `.Add` を実行すると、MS Project側でエラーになるか重複リンクになります。必要に応じて、事前に既存のリンクをクリアする処理(`Predecessors.Clear` 等)を入れる設計も検討してください。

まとめ

今回は、CSVからタスクの依存関係を読み込み、MS Projectへ一括設定する自動化スクリプトを解説しました。

ここをクリアすれば、もはや「手作業でのスケジュール調整」とはおさらばです。Project VBAの裏側にあるオブジェクトの振る舞い(UniqueIDの概念や再描画の制御)を理解できたあなたなら、どんな複雑なWBS自動化要件も怖くありません。

ぜひ、あなたの現場のプロジェクト管理にこのコードを組み込み、圧倒的な生産性向上を体感してください。それでは、次の極限の知見でお会いしましょう!

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