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化してメール送信まで行う」といった、より高度なパイプラインに挑戦してみてください。
応援しています。あなたの自動化ライフが、より快適なものになりますように!
