こんにちは!プロジェクト管理の現場で、ExcelとMS Projectを行き来しながら「あぁ、この何百行もあるWBSの階層化を自動でやってくれたらなぁ……」と遠い目をしたことはありませんか?
マクロの記録のボタンを押してみたものの、Project VBAの世界はExcel VBAとは空気が少し違っていて、戸惑った方も多いはずです。でも、大丈夫。ここをクリアすれば、Project VBAの基本はバッチリですよ。
今日は、Excelのインデント(階層構造)を美しく読み取り、Project側のタスク階層(OutlineLevel)へと一気通貫で流し込む、実戦的な基本テンプレートをあなたにお届けします。
—
1. なぜExcelからProjectへの取り込みでつまずくのか?
実務でよくあるのが、ExcelのWBSを「コピペ」でProjectに持っていくアプローチです。これ、一見うまくいきそうですが、タスクの親子関係(WBSの階層)が崩れたり、データ型のエラーで夜を徹した手直しが必要になったりしますよね。
Excelの行データをProjectへ「正しく」流し込むためには、以下の3つのステップをVBAに教え込む必要があります。
1. Excelの表(Range)を安全にメモリ上にキャプチャする
2. Project側に空っぽのタスクを順次生成する
3. Excel側のインデントやタスク名から「階層(OutlineLevel)」を計算し、親子関係を構築する
この仕組みさえ手に入れてしまえば、どれほど巨大なWBSであっても、コーヒーを一口飲んでいる間に自動構築が完了します。
—
2. 実装の全体像:極限まで洗練された自動化テンプレート
今回は、Excel側の「A列:タスク名」「B列:インデントレベル(または階層の深さ)」というシンプルな構造を想定し、それをProject側へ流し込むVBAコードを用意しました。
このコードは、Excel側のVBAエディタ(またはProject側のVBAエディタからExcelを参照する形)のどちらでも動作しますが、今回はProject側からExcelファイルをダイアログで指定して読み込む、最も堅牢な設計(アーキテクチャ)で記述しています。
‘ ==============================================================================
‘ 処理名 : ExcelのWBSリストからProjectタスクを一括生成する基本テンプレート
‘ 概要 : 指定したExcelファイルからタスク名と階層構造を読み込み、
‘ Project側にOutlineLevelを正しく設定して一括展開します。
‘ ==============================================================================
Sub ImportWBSFromExcel()
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Dim filePath As Variant
Dim lastRow As Long
Dim i As Long
Dim tsk As Task
Dim taskName As String
Dim indentLvl As Long
On Error GoTo ErrorHandler
‘ 1. 読み込むExcelファイルをユーザーに選択させる
filePath = Application.GetOpenFilename( _
FileFilter:=”Excelファイル (.xlsx; .xls), .xlsx; .xls”, _
Title:=”インポートするWBSのExcelファイルを選択してください”
