【入門編】【中級者向け】Word表のデータをSQL Serverから取得して流し込む連携技術 – Word VBA解析バイブル

スポンサーリンク

Word VBAで「脱・手作業」!SQL Serverのデータを表に流し込む極意

こんにちは。現場で泥臭い自動化と格闘し続けてきたエンジニアです。

「Wordの表に、いちいち手作業でデータを転記している……」。もしあなたがそんな退屈な作業に時間を溶かしているなら、今日でその生活とはお別れしましょう。

Word VBAは「ただの文章作成ツール」ではありません。ADO(ActiveX Data Objects)という強力な武器を使えば、SQL Serverから直接データを引き抜き、Wordの表へ一瞬で流し込む「業務システム」へと進化します。

今回は、マクロの記録を卒業したあなたが、次のステージへ進むための「データ連携の作法」を伝授します。

—

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

「Excelに一度出してからコピペすればいいのでは?」と思うかもしれません。しかし、それは中間ファイルを作る無駄な工程です。ADOを使えば、Wordから直接DBへクエリを投げ、結果をメモリ上で受け取れます。この「直接接続」こそが、自動化の真髄です。

2. 実装のステップ:まずは参照設定

コードを書く前に、VBAに「データベースと話すための辞書」を渡す必要があります。

1. VBAエディタを開く(`Alt + F11`)。
2. メニューの [ツール] > [参照設定] をクリック。
3. 「Microsoft ActiveX Data Objects 6.1 Library」 にチェックを入れてOK。

これがないと、VBAは「SQL?何それ?」とパニックになります。

—

3. SQLからWord表へ流し込む実戦コード

以下のコードは、指定した表にクエリ結果をループ処理で書き出すテンプレートです。

Sub ImportSQLToWordTable()
Dim conn As Object, rs As Object
Dim strSQL As String
Dim tbl As Table
Dim i As Integer

‘ 1. 接続設定(環境に合わせて変更してください)
Set conn = CreateObject(“ADODB.Connection”)
conn.Open “Provider=SQLOLEDB;Data Source=サーバー名;Initial Catalog=DB名;Integrated Security=SSPI;”

‘ 2. データの取得
strSQL = “SELECT Name, Price, Category FROM Products”
Set rs = conn.Execute(strSQL)

‘ 3. Wordの表を選択(文書内の最初の表を対象)
Set tbl = ActiveDocument.Tables(1)

‘ 4. データ流し込み
i = 2 ‘ 1行目は見出しと仮定し、2行目から開始
Do While Not rs.EOF
‘ 行が足りない場合は自動追加
If i > tbl.Rows.Count Then tbl.Rows.Add

‘ セルへの書き込み(.Cell(行, 列).Range.Text)
tbl.Cell(i, 1).Range.Text = rs.Fields(“Name”).Value
tbl.Cell(i, 2).Range.Text = rs.Fields(“Price”).Value
tbl.Cell(i, 3).Range.Text = rs.Fields(“Category”).Value

rs.MoveNext
i = i + 1
Loop

‘ 5. 後処理(メモリ解放の作法)
rs.Close
conn.Close
Set rs = Nothing: Set conn = Nothing

MsgBox “データの流し込みが完了しました!”, vbInformation
End Sub

—

4. 陥りやすい「落とし穴」と解決策

① 「セルの結合」が崩れる問題

Wordの表で一番厄介なのが「結合セル」です。結合があると、`.Cell(行, 列)` のインデックスが物理的な場所とズレてエラーになります。
解決策: 自動生成する表は、できるだけ「結合なしのシンプルな構造」にするのが鉄則です。どうしても結合が必要な場合は、表の構造を事前に計算するロジックを組む必要があります。

② 処理が遅いと感じたら

数千行をループで回すと、Wordが「応答なし」になることがあります。
極意: `Application.ScreenUpdating = False` をコードの冒頭に入れ、終了直前に `True` に戻してください。画面の再描画を止めるだけで、処理速度は劇的に向上します。

③ インジェクション対策

今回はサンプルとして簡略化しましたが、ユーザー入力をSQLに組み込む場合は必ずパラメータ化しましょう。文字列連結でSQLを作るのは、セキュリティ上のリスクになります。

—

最後に:自動化は「設計」が9割

コードを書くことは手段に過ぎません。「どんな表を作れば、後で修正しやすいか?」「DBのデータが空だったらどう挙動させるか?」といった、エラーハンドリング(`On Error Resume Next` を使いすぎないこと!)を意識するだけで、あなたのコードはプロの品質へと昇華します。

ここをクリアしたあなたは、もう初心者ではありません。次はぜひ「Word上でボタンを押すと、自動でPDF化してメール送信まで行う」といった、より高度なパイプラインに挑戦してみてください。

応援しています。あなたの自動化ライフが、より快適なものになりますように!

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