Home » ADO(ActiveX Data Objects)の使い方 » CopyFromRecordsetでRecordsetの中身をワークシートに一括出力

CopyFromRecordsetでRecordsetの中身をワークシートに一括出力

動作検証バージョン:Windows版Excel(バージョン1810 ビルド11001.20108)+ Microsoft ActiveX Data Objects 6.1 Library

「vba ado recordset 一括出力」
という検索キーワードを見て、RangeオブジェクトのCopyFromRecordsetメソッドについて、

記事を書いていなかったことを思い出しました。

[スポンサードリンク]

ADOを使ってCSVからデータを取得するサンプルマクロ

ADOへの参照設定が行われている環境で以下のSubプロシージャを実行すると、Cドライブのtempフォルダーにあるsample.csvファイルの内容が、イミディエイトウィンドウに出力されます。

Sub ADOを使ってCSVからデータを取得する()
 Dim f_path As String: f_path = "C:\temp\"
 Dim f_name As String: f_name = "sample.csv"

 Dim cn As ADODB.Connection
 Set cn = New ADODB.Connection
 cn.Open _
   "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Data Source=" & f_path & ";" & _
   "Extended Properties='Text; HDR=NO'"

 Dim rs As ADODB.Recordset
 Set rs = cn.Execute("SELECT * FROM " & f_name)

 Do Until rs.EOF
  Dim buf As String
  Dim fld As ADODB.Field
  For Each fld In rs.Fields
   buf = buf & fld.Value & vbTab
  Next fld
  Debug.Print buf: buf = ""
  rs.MoveNext
 Loop

 rs.Close: cn.Close
 Set rs = Nothing: Set cn = Nothing
End Sub

ADODB.Recordsetからデータを出力する基本

このSubプロシージャで注目していただきたいのは、後半のデータをイミディエイトウィンドウに出力している、
  Do Until rs.EOF
   Dim buf As String
   Dim fld As ADODB.Field
   For Each fld In rs.Fields
    buf = buf & fld.Value & vbTab
   Next fld
   Debug.Print buf: buf = ""
   rs.MoveNext
  Loop
の部分です。

レコードに対するループの中で、
  Do Until rs.EOF
各レコードのフィールドに対するループを回しています。
   For Each fld In rs.Fields
書き方のバリエーションはありますが、全データを出力するなら、基本的にはこういった2重ループが必要になります。

Range.CopyFromRecordsetメソッドを使ったサンプルマクロ

Rangeオブジェクトに用意されているCopyFromRecordsetメソッドを使うと、以下のようなコードで、A1セルを起点にして一気にデータを書き出すことができてしまいます。

Sub CopyFromRecordsetメソッドのサンプル()
 Dim f_path As String: f_path = "C:\temp\"
 Dim f_name As String: f_name = "sample.csv"

 Dim cn As ADODB.Connection
 Set cn = New ADODB.Connection
 cn.Open _
   "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Data Source=" & f_path & ";" & _
   "Extended Properties='Text; HDR=NO'"

 Dim rs As ADODB.Recordset
 Set rs = cn.Execute("SELECT * FROM " & f_name)

 Range("A1").CopyFromRecordset Data:=rs

 rs.Close: cn.Close
 Set rs = Nothing: Set cn = Nothing
End Sub

先述のイミディエイトウィンドウに出力するSubプロシージャでは、
  Do Until rs.EOF
   Dim buf As String
   Dim fld As ADODB.Field
   For Each fld In rs.Fields
    buf = buf & fld.Value & vbTab
   Next fld
   Debug.Print buf: buf = ""
   rs.MoveNext
  Loop
と書いていたのに、
  Range("A1").CopyFromRecordset Data:=rs
だけで済んでいます。

「vba ado recordset 一括出力」
と検索なさった方が、どのアプリケーションで、どのような形で、どこに一括出力したかったのかわかりませんが、もしもExcelのワークシート上に一括出力したいということならば、Range.CopyFromRecordsetメソッドをご検討ください。

最終更新日時:2019-01-28 09:02

[スポンサードリンク]

Home » ADO(ActiveX Data Objects)の使い方 » CopyFromRecordsetでRecordsetの中身をワークシートに一括出力

Copyright © インストラクターのネタ帳 All Rights Reserved.

.