Project VBAの深淵へ:Excel連携を「爆速」に変えるプロの流儀
こんにちは。Project VBAの世界へようこそ。
「マクロの記録」から卒業し、独自の自動化ツールを作り上げようとしているあなたへ。今日は、多くの開発者が躓く「ExcelからProjectへのデータ同期」という壁を、技術的に美しく、かつ圧倒的な速度で突破する極意をお伝えします。
Project VBAを扱う上で、初心者が陥りがちな最大の罠。それは「セルやタスクを一つずつ操作する」ことです。これでは、まるで砂時計を眺めるような待ち時間が生まれます。
プロは違います。「メモリ上で処理を完結させ、最後にProjectへ流し込む」。この思考こそが、業務自動化の極致です。
—
1. なぜ「セル操作」が遅いのか?
Excelのセルを読み取ったり、Projectのタスクを一つずつ `Task.Name = …` と書き換える処理は、実は非常にコストが高い「通信」を行っています。VBAがExcel/Projectのインターフェースを叩くたびに、OSを跨いだオーバーヘッドが発生するからです。
これを解決するのが、ADO(ActiveX Data Objects)によるデータ取得と、配列(Array)による一括処理です。
—
2. 実装の設計図:ADO × 配列の威力
今回の手法では、以下のステップを踏みます。
1. ADO(SQL)でExcelファイルをデータベースとして開き、データを一括でメモリ(レコードセット)に取り込む。
2. レコードセットを配列(Variant型)に格納し、VBA内で高速に回す。
3. Projectのタスクオブジェクトへ一気に反映させる。
サンプルコード:Excelからタスクを爆速インポート
このコードをProject VBAの標準モジュールに貼り付けてください。
Sub ImportExcelToProject()
Dim conn As Object, rs As Object
Dim strPath As String, strSQL As String
Dim tsk As Task
Dim dataArr As Variant
Dim i As Long
‘ 1. Excelファイルのパス指定(FSO等で取得可能)
strPath = “C:\Data\ProjectTask.xlsx”
‘ 2. ADOで接続(ExcelをDBとして扱う)
Set conn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)
conn.Open “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & strPath & “;Extended Properties=’Excel 12.0 Xml;HDR=YES;’;”
‘ SQLで必要な列だけを抽出(セルを一つずつ見るより遥かに高速)
strSQL = “SELECT [TaskName], [Duration] FROM [Sheet1$]”
rs.Open strSQL, conn
‘ 3. レコードセットを配列へ格納(メモリ上での高速処理の鍵)
If Not rs.EOF Then
dataArr = rs.GetRows()
End If
‘ 終了処理
rs.Close: conn.Close
‘ 4. Projectへ反映
‘ 配列のインデックス(0, i)がTaskName、(1, i)がDuration
For i = 0 To UBound(dataArr, 2)
Set tsk = ActiveProject.Tasks.Add(dataArr(0, i))
tsk.Duration = dataArr(1, i)
Next i
MsgBox “同期完了!数秒で終わったはずです。”, vbInformation
End Sub
—
3. コードの心臓部を読み解く
- ADOの役割: Excelをデータベースと見なすことで、特定の範囲を一瞬でメモリに引き上げます。`HDR=YES` は1行目をヘッダーとして扱う設定です。
- GetRowsメソッド: これが今回のハイライトです。レコードセットの内容を一括で2次元配列に変換します。これにより、Excelを開いたままセルの値を取得するような、遅い処理を排除できます。
- メモリ上での配列処理: 一度配列にしてしまえば、VBA内でのループ処理はCPUの速度で動作します。Projectへの書き込みは最小限の回数で済むため、UIの更新負荷も軽減されます。
—
4. 陥りやすいエラーと対処法
「データ型」の不一致
Excelのセルに数値と文字列が混在していると、ADOが列の型を正しく判定できずエラーになることがあります。
- 対策: SQLで `SELECT CStr([TaskName]) …` のようにキャストするか、Excel側の列の書式設定を統一してください。
Projectの「計算エンジン」の干渉
タスクを追加するたびにProjectのスケジュール計算が走り、動作が重くなることがあります。
- 対策: 大量データを投入する際は、一時的に `Application.Calculation = pjManual` とし、最後に自動計算へ戻す工夫をすると、さらに高速化します。
—
最後に:ここをクリアすれば「自動化」は自由自在
いかがでしたか?
「セルを一つずつ読み取って、一つずつProjectに書く」という非効率なループから脱却し、「データは一括で取り出し、メモリで料理して、結果を流し込む」というエンジニアの作法を感じていただけたでしょうか。
ここをクリアすれば、あなたはもうProject VBAの初学者ではありません。次は「FSO(FileSystemObject)」を使ってフォルダ内の複数ファイルを自動巡回する処理に挑戦してみてください。
あなたの作る自動化ツールが、誰かの残業を減らす力になることを願っています。応援していますよ!
