【入門編】ADOを用いてProjectのタスク情報をCSV/XMLへエクスポートする汎用データ変換ツール – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握せよ:ADOでタスクデータをCSVへ叩き出す「究極のデータ変換術」

こんにちは。現場の最前線で自動化の仕組みを組み上げているエンジニアです。

「マクロの記録」ボタンを押して満足するのは今日で終わりにしましょう。Microsoft Projectのデータ構造は、Excelのセルとは全くの別物。「階層構造(WBS)」と「時間軸」が絡み合う、極めて緻密なオブジェクトモデルで成り立っています。

今回は、Projectのタスク情報を抽出し、外部システムと連携するための「データ変換ツール」の作り方を伝授します。単なるコードのコピペではなく、「なぜそう書くのか?」というエンジニアの視点をインストールしてください。

1. Project VBAの心臓部を知る

Projectのオブジェクトモデルは、いわば「ツリー構造の王様」です。

  • Application: プロジェクト全体を包む宇宙。
  • Project: 読み込んでいるファイルそのもの。
  • Task: 最も重要な構成要素。WBSのインデント(階層)を持っています。
  • Resource: タスクに割り当てられる人や物。

私たちがやるべきことは、「Taskオブジェクトを走査し、必要なプロパティを抽出し、外部ファイルに書き出す」という至ってシンプルな作業です。しかし、ここで「ADO」の力を借りることで、ファイル入出力の処理が劇的に安定します。

2. なぜ「ADO」を使うのか?

VBAでテキストファイルを書き出す際、`Open #1 For Output` という古典的な手法もありますが、文字コード管理やエラーハンドリングが非常に脆いのが難点です。

ADO (ActiveX Data Objects) の `ADODB.Stream` を使う理由は以下の3点。
1. UTF-8対応: 外部システム連携では、日本語の文字化けを防ぐためにUTF-8が必須です。
2. 高速性: メモリ上でバッファリングされるため、大規模なタスクリストでも一瞬で処理が終わります。
3. 安全性: ファイルロックや競合への耐性が強く、業務ツールとしての信頼性が段違いです。

3. 実装コード:TaskデータCSVエクスポートツール

以下のコードをVBAエディタ(Alt + F11)に貼り付けてください。

‘ 必要な参照設定: Microsoft ActiveX Data Objects x.x Library
Sub ExportTasksToCSV()
Dim proj As Project
Dim tsk As Task
Dim stream As Object
Dim csvContent As String
Dim filePath As String

Set proj = ActiveProject
filePath = ThisWorkbook.Path & “\TaskExport_” & Format(Now, “yyyymmdd_hhnn”) & “.csv”

‘ CSVのヘッダー作成
csvContent = “ID,Name,Start,Finish,Duration,Work” & vbCrLf

‘ 全タスクをループ処理(ここがProject VBAの肝)
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then ‘ 削除されたタスクの残骸を防ぐチェック
csvContent = csvContent & tsk.ID & “,” & _
“””” & tsk.Name & “””,” & _
tsk.Start & “,” & _
tsk.Finish & “,” & _
tsk.Duration & “,” & _
tsk.Work & vbCrLf
End If
Next tsk

‘ ADODB.Streamでファイル書き出し
Set stream = CreateObject(“ADODB.Stream”)
With stream
.Type = 2 ‘ adTypeText
.Charset = “UTF-8”
.Open
.WriteText csvContent
.SaveToFile filePath, 2 ‘ adSaveCreateOverWrite
.Close
End With

MsgBox “エクスポート完了: ” & filePath, vbInformation
End Sub

4. 陥りやすい「罠」とその回避策

罠1:`tsk Is Nothing` の壁

Projectのタスクリストをループする際、「削除されたタスク」がメモリ上に空のオブジェクトとして残っていることがあります。`If Not tsk Is Nothing Then` を入れないと、途中で「オブジェクトがありません」というエラーで沈没します。これは現場で最も多い初歩的ミスです。

罠2:カンマの混入

タスク名にカンマ(,)が含まれていると、CSVが崩壊します。上記のコードでは `”””” & tsk.Name & “”””` とダブルクォーテーションで括っていますが、さらに堅牢にするなら、タスク名内のダブルクォーテーション自体をエスケープする関数を通すのが「プロの仕事」です。

罠3:時間のフォーマット

Projectの `Start` プロパティは日付型ですが、CSVに書き出す際にOSの設定に依存する場合があります。`Format(tsk.Start, “yyyy/mm/dd hh:nn”)` のように明示的なフォーマットを適用することを強く推奨します。

5. 次のステップへ

ここをクリアしたあなたは、もう「マクロの記録」に頼る初心者ではありません。

今回のコードをベースに、次は「特定の階層だけ抽出する」「Resourceの割り当て状況を紐付けてXML形式で出力する」といった応用を試してみてください。Projectのデータを自在に操れるようになると、プロジェクト管理の工数は半分以下にまで圧縮できます。

VBAは古臭い技術だと言う人もいますが、「アプリケーションの裏側にあるロジックを直接叩ける」という点において、これほど強力な武器はありません。

さあ、あなたのプロジェクトを、あなたのコードでコントロールしてください。応援しています!

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