SQL サーバーに関連して VBA マクロを数回使用しましたが、それらは常に単一の「select」ステートメントであるか、単一の結果セットを返すストアド プロシージャを呼び出していました。現在、ストアド プロシージャを呼び出すマクロを作成していますが、ストアド プロシージャは複数の結果セットを返します。マクロで各 SQL 結果セットをキャプチャして、別のワークシートに配置することはできますか? 例やガイダンスをいただければ幸いです。
質問する
4688 次
2 に答える
4
これは、.NextRecordsetを使用して非常に簡単に実行できます。
Dim rs As ADODB.Recordset, success As Boolean
success = getAResultWith2Recordsets(rs)
If success = False Then
MsgBox "Unable to records, no data"
Exit Sub
Else
Set Me.Recordset = rs ' for example on a report
Set SecondRs = New ADODB.Recordset ' create empty recordset
Set SecondRs = rs.NextRecordset ' assign it the next batch result
Set rs = Nothing
End If
等々。これは単なる例であり、 .nextRecordsetのマニュアルに必要なすべての情報があります。たとえば、それらを反復処理する方法などです。
于 2012-10-11T14:51:56.830 に答える
0
YMMV; ただし、ほとんどの場合、クエリごとに複数のレコードセットを返すことは "ベスト プラクティス" に反します。これは、レコードセットが序数 (0、1、2) で返されるため、自己文書化されていないためです。ただし、これを書いていて、レコードセットの順序を知っていると仮定すると、このようなものが機能します。
'' ---> Assuming you have logic to execute SQL and place results into a DataSet <--- ''
dt = ds.tables(0)
if dt.rows.count > 0 then
'' This datatable as datarows ''
'' apply logic relevant to specific worksheet ''
end if
dt = ds.tables(1)
if dt.rows.count > 0 then
'' This datatable as datarows ''
'' apply logic relevant to specific worksheet ''
end if
dt = ds.tables(2)
if dt.rows.count > 0 then
'' This datatable as datarows ''
'' apply logic relevant to specific worksheet ''
end if
dt.dispose
ds.dispose
---> データテーブル コレクションを繰り返すこともできます。しかし、これは正確にはエレガントではありません。
dim i as integer = 0
for i = 0 to ds.tables.count-1
dt = ds.tables(i)
if dt.rows.count> 0 then
'' Apply worksheet logic here ''
end if
next
このコードはテストされていません。
于 2012-10-11T15:41:59.073 に答える