Excelを裏で動かすな!ADOで実現する「Word VBA超高速データ連携」の極意
こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアとして、今日は「マクロの記録」から一歩先へ進みたいあなたへ、Word VBAの真髄を伝授します。
多くの人がやってしまう失敗。それは「Excelを開いて、セルを選択して、コピーして、貼り付ける」という、人間と同じ動きをVBAにさせることです。これでは動作が重く、画面がチラつき、何より非効率です。
今日マスターするのは、ADO (ActiveX Data Objects) という技術。Excelファイルを「データベース」として扱い、必要なデータだけをピンポイントで引き抜く。この手法を覚えれば、あなたのWord自動化は別次元の速さになります。
—
1. なぜ「ADO」なのか?
WordからExcelを操作する際、多くの人が `Excel.Application` を起動します。しかし、これはWordにとって「巨大な重りを背負って走る」ようなもの。
ADOを使えば、Excelを起動せずにファイルの中身だけをSQL文で抽出できます。
- メリット1:圧倒的スピード(Excelの起動時間がゼロ)
- メリット2:画面がチラつかない(バックグラウンド処理のため)
- メリット3:堅牢性(操作中のExcelの干渉を受けない)
—
2. 実装のステップ:データを取り込み、Wordへ流し込む
今回は、「Excelの『顧客リスト』から氏名と住所を抽出し、Wordの指定した場所に流し込む」というシナリオでコードを書いてみましょう。
事前準備
WordのVBAエディタ(Alt + F11)を開き、`ツール` > `参照設定` から 「Microsoft ActiveX Data Objects 6.1 Library」 にチェックを入れてください。これがADOを使うための「鍵」です。
実装コード
Sub ImportDataFromExcel()
Dim cn As Object, rs As Object
Dim strPath As String, strSQL As String
Dim doc As Document
‘ Excelファイルのパス(適宜変更してください)
strPath = ThisDocument.Path & “\DataList.xlsx”
‘ ADOオブジェクトの生成
Set cn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)
‘ 接続文字列(HDR=Yesは1行目をヘッダーとして扱う設定)
cn.Open “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & strPath & _
“;Extended Properties=””Excel 12.0 Xml;HDR=YES;”””
‘ SQLでデータを抽出(Sheet1のA列からC列を対象)
strSQL = “SELECT 氏名, 住所 FROM [Sheet1$]”
rs.Open strSQL, cn
‘ Wordへの流し込み
Set doc = ActiveDocument
Do Until rs.EOF
‘ 抽出したデータをWordの末尾に追記する例
doc.Range.InsertAfter “顧客名: ” & rs!氏名 & ” / 住所: ” & rs!住所 & vbCrLf
rs.MoveNext
Loop
‘ 後片付け(メモリ解放はエンジニアの嗜み)
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
MsgBox “データ連携完了!”, vbInformation
End Sub
—
3. コードの「意味」を解剖する
- `ADODB.Connection`: Excelファイルへの「トンネル」を作る役割です。
- `HDR=YES`: これを忘れると、1行目の「氏名」「住所」という項目名までデータとして読み込んでしまいます。忘れずに!
- `[Sheet1$]`: SQLの世界では、Excelのシート名は最後に `$` を付けるルールがあります。これを忘れると「オブジェクトが見つかりません」と怒られます。
- `rs.MoveNext`: レコードセットの中身を一行ずつ進めるコマンドです。これを忘れると永遠に同じデータを読み込む「無限ループ」に陥るので注意してください。
—
4. 初学者が陥りやすい罠と解決策
罠1:「ファイルが使われています」エラー
ADOは読み取り専用で開くのが基本です。もしExcelファイルを開いたまま実行すると、読み取り専用で開けない場合があります。「Excelは閉じてから実行する」のが、自動化の鉄則です。
罠2:Word側の「Range」を使いこなせていない
`doc.Range.InsertAfter` は便利ですが、特定の場所(ブックマークなど)に流し込みたい場合は以下のように書きます。
‘ 「Target」というブックマークに流し込む場合
doc.Bookmarks(“Target”).Range.Text = rs!氏名
Word VBAを使いこなすコツは、「Selection(カーソル位置)」を使わず、「Range(範囲オブジェクト)」を直接指定すること。これが脱・初心者への最大の近道です。
—
最後に:エンジニアとしての一歩
ADOによる連携は、業務自動化の「基礎体力」です。これさえできれば、Wordは単なる文書作成ツールから、「データベースをフロントエンドで可視化するアプリケーション」へと昇華します。
最初は難しく感じるかもしれませんが、このコードを一度動かせれば、あとはSQLの `WHERE` 句を変えるだけで、どんな抽出も自由自在です。
「ここをクリアすれば、Word VBAの基本はバッチリですよ」。
迷ったらまた戻ってきてください。あなたの自動化ライフを、心から応援しています!
