【VBAリファレンス|実務向け】Excelユーザのデータベース活用法-ADOレコードセットからワークシートへ|Excel VBA

スポンサーリンク

なぜADOを使ったデータ連携が重要なのか

業務でExcelを使っていると、「Accessのデータベースや外部のCSVファイルから、必要なデータだけを抽出してExcelで集計したい」という場面に遭遇することは非常に多いです。セルに直接手入力したり、毎回インポートウィザードを使ったりしていませんか? ADO(ActiveX Data Objects)を活用すれば、SQLを使って自在にデータを抽出し、一瞬でExcelへ出力することが可能です。この技術を習得することで、データ転記のミスを防ぎ、業務効率を劇的に向上させることができます。

基礎知識:ADOとレコードセットとは

ADOとは、データベースに接続し、操作を行うための技術です。データベースから抽出されたデータは、VBA上ではレコードセット(Recordset)という「仮想的なテーブル」としてメモリ上に保持されます。このレコードセットの中身を、Excelのワークシートに書き出すことが今回の目的です。

実装のポイント:CopyFromRecordsetメソッドの活用

レコードセットをワークシートに展開する際、ループ処理で一つずつセルに書き込むのは非常に低速です。そこで登場するのがCopyFromRecordsetメソッドです。これを使うことで、数万件のデータであっても一括で高速に転記することが可能になります。

サンプルプログラム:ADOでデータを取得し転記する

以下のコードを実行するには、VBEの「ツール」メニューから「参照設定」を開き、「Microsoft ActiveX Data Objects x.x Library」にチェックを入れてください。

Sub GetDatabaseData()
‘ 変数の宣言
Dim Conn As ADODB.Connection
Dim Rst As ADODB.Recordset
Dim MySql As String
Dim MyPath As String

‘ データベースのパス(適宜変更してください)
MyPath = “C:\Data\販売管理.mdb”

‘ 接続オブジェクトの作成
Set Conn = New ADODB.Connection
Conn.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & MyPath & “;”
Conn.Open ‘ 接続開始

‘ SQL文の定義:売上テーブルから全データを取得
MySql = “SELECT FROM 売上;”

‘ レコードセットの取得
Set Rst = New ADODB.Recordset
Rst.Open MySql, Conn, adOpenStatic, adLockReadOnly

‘ フィールド名を1行目に出力
Dim i As Long
For i = 0 To Rst.Fields.Count – 1
Cells(1, i + 1).Value = Rst.Fields(i).Name
Next i

‘ 2行目からデータを一括転記
Range(“A2”).CopyFromRecordset Rst

‘ 後始末
Rst.Close
Conn.Close
Set Rst = Nothing
Set Conn = Nothing

MsgBox “データの取り込みが完了しました。”
End Sub

応用・注意点

現場で活用する際の注意点は以下の3つです。

1. 接続文字列のバージョン
上記の例は「.mdb」形式用です。「.accdb」形式の場合はプロバイダを「Microsoft.ACE.OLEDB.12.0」に変更する必要があります。
2. メモリと件数
CopyFromRecordsetは非常に高速ですが、データがExcelの最大行数(約104万行)を超える可能性がある場合は、事前に件数をカウントするか、データを分割して抽出する設計が必要です。
3. 参照設定の管理
配布するブックであれば、参照設定が外れるトラブルを防ぐため、「事前バインディング」ではなく「遅延バインディング(CreateObject関数を使用)」を検討するのも一つの手です。

データベースとExcelを繋ぐ技術は、あなたのVBAスキルを一段上のレベルへと押し上げてくれます。ぜひ実務でお試しください。

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