Project VBAの深淵へ:SQL Serverとタスクを繋ぐ「ADO」の極意
こんにちは。現場で泥臭い自動化を積み重ね、いつしかVBAの深淵を覗くようになったエンジニアです。
Excel VBAなら触ったことがあるけれど、Project VBAは未知の領域……そう感じている方も多いでしょう。しかし、Projectの真価は「データベースと接続して、生きたプロジェクトデータを操ること」にあります。
今日は、SQL Serverという「外部の脳」とProjectをADO(ActiveX Data Objects)で繋ぎ、タスクデータを読み込むための「最短にして最速のルート」を伝授します。
—
1. なぜ「ADO」なのか?
Project VBAは単体でも強力ですが、データがProjectファイルの中に閉じ込められている限り、その分析能力は限定的です。SQL Serverにデータを逃がせば、Power BIでの可視化や、他システムとの連携が自由自在になります。
ここで登場するのがADOです。ADOは、データベースとプログラムを繋ぐ「翻訳機」のようなもの。これを使えば、SQL Serverのテーブルを、まるで手元のExcelシートのように操作できるようになります。
—
2. 接続の儀式:ADO設定の基本
まず、Project VBAのエディタ(Alt + F11)を開き、`ツール` > `参照設定` から 「Microsoft ActiveX Data Objects x.x Library」 にチェックを入れてください。これがなければ始まらない、最初の儀式です。
次に、SQL Serverに接続するためのコードの骨子を見てみましょう。
‘ 接続に必要なADOオブジェクトを宣言
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
‘ 接続文字列(ここが一番のハマりポイント!)
Dim connString As String
connString = “Provider=SQLOLEDB;Data Source=サーバー名;Initial Catalog=データベース名;Integrated Security=SSPI;”
Set conn = New ADODB.Connection
conn.Open connString
現場の知恵:接続文字列の罠
`Integrated Security=SSPI` は「Windows認証」を使います。もしユーザー名とパスワードが必要な場合は、`User ID=…;Password=…;` を追記してください。ここが間違っていると、どんなにコードが正しくても門前払いされます。
—
3. SQL Serverからデータを引き抜く
接続が開けたら、次はタスク情報を取得します。ここでのポイントは、「SQLを投げてRecordsetで受け取る」という一連の作法です。
Sub ImportTasksFromSQL()
‘ (接続処理は上記と同様)
strSQL = “SELECT TaskName, StartDate, Duration FROM dbo.ProjectTasks WHERE ProjectID = 101”
Set rs = New ADODB.Recordset
‘ SQLを実行して結果セットをメモリ上に展開
rs.Open strSQL, conn, adOpenStatic, adLockReadOnly
‘ レコードセットをループしてProjectのタスクとして書き込む
Dim t As Task
Do Until rs.EOF
‘ 新規タスクの追加
Set t = ActiveProject.Tasks.Add(rs!TaskName)
t.Start = rs!StartDate
t.Duration = rs!Duration
rs.MoveNext
Loop
‘ 後始末(リソースの解放)
rs.Close
conn.Close
Set rs = Nothing: Set conn = Nothing
End Sub
—
4. 陥りやすいエラーと「データ型の落とし穴」
初心者が必ずと言っていいほど躓くのが「型」の問題です。
- Duration(期間)の解釈: SQL側では数値(分単位など)で保存していても、Project側は「12h」「3d」といった単位付きの文字列を期待します。`CStr()` などで明示的に変換する意識を持ちましょう。
- NULLの恐怖: SQL Server側のフィールドがNULLの場合、VBAで `rs!FieldName` にアクセスするとエラーを吐きます。`If IsNull(rs!FieldName) Then …` で必ずガードを固めるのが、伝説的なコードの条件です。
- オブジェクトの寿命: `Recordset` を開きっぱなしにするのは、メモリの浪費であり、最悪の場合ロック競合を引き起こします。処理が終わったら即座に `Close` する。これがプロの流儀です。
—
最後に:ここをクリアすれば世界が変わる
SQL ServerとProjectが手を取り合えば、これまで手作業で行っていた進捗報告書作成や、複雑なリソース配分計算は、全て「ボタン一つ」で終わるタスクに変わります。
最初はエラーの海に溺れるかもしれませんが、それこそが成長の証です。まずは小さなテーブルを読み込むところから始めてみてください。
「Projectのタスクを自在に操る」――その感覚を掴んだとき、あなたはもうVBAの初心者ではありません。次回の記事では、ProjectからSQL Serverへデータを書き戻す「逆転の発想」について解説します。
何か不明点があれば、ぜひコメント欄で教えてくださいね。応援しています!
