【入門編】外部データベース(SQL Server)からタスク情報を読み込む:ADOを用いたProject-DB連携の基礎 – Project VBA解析バイブル

スポンサーリンク

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へデータを書き戻す「逆転の発想」について解説します。

何か不明点があれば、ぜひコメント欄で教えてくださいね。応援しています!

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