「vba ado recordset 一括出力」
という検索キーワードを見て、RangeオブジェクトのCopyFromRecordsetメソッドについて、
記事を書いていなかったことを思い出しました。
ADOを使ってCSVからデータを取得するサンプルマクロ
ADOへの参照設定が行われている環境で以下のSubプロシージャを実行すると、Cドライブのtempフォルダーにあるsample.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
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セルを起点にして一気にデータを書き出すことができてしまいます。
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.CloseSet 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
- Newer:DictionaryのNothing判定
- Older:イミディエイトウィンドウからSubプロシージャを実行する
Home » ADO(ActiveX Data Objects)の使い方 » CopyFromRecordsetでRecordsetの中身をワークシートに一括出力