6

SQL データベースを照会する Excel アプリケーションに取り組んでいます。クエリの実行には時間がかかる場合があります (20 ~ 40 分)。コードを間違えると、エラーが発生したりブレークポイントに到達するまでに長い時間がかかることがあります。結果をシートにうまく保存できます。記録セットで作業しているときは、問題が発生する可能性があります。

データベースのクエリをスキップするためにデバッグしているときに、データを ADODB.Recordset にロードする方法はありますか (初回以降)?

このようなものを使用しますか?

MS-Access VBA で Excel ワークシートをクエリする (ADODB レコードセットを使用)

4

3 に答える 3

8

msado15.dll を取得するには、MDAC をインストールする必要がありました。取得したら、(Win7 64 ビットで) 参照を追加しました。

C:\Program Files (x86)\Common Files\System\ado\msado15.dll

次に、現在アクティブなワークブックに存在するシート名を渡すことで、ADODB.Recordset オブジェクトを返す関数を作成しました。Test() Sub を含めて、動作するかどうかを確認する必要がある場合は、他のコードを次に示します。

Public Function RecordSetFromSheet(sheetName As String)

Dim rst As New ADODB.Recordset
Dim cnx As New ADODB.Connection
Dim cmd As New ADODB.Command

    'setup the connection
    '[HDR=Yes] means the Field names are in the first row
    With cnx
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source='" & ThisWorkbook.FullName & "'; " & "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"
        .Open
    End With

    'setup the command
    Set cmd.ActiveConnection = cnx
    cmd.CommandType = adCmdText
    cmd.CommandText = "SELECT * FROM [" & sheetName & "$]"
    rst.CursorLocation = adUseClient
    rst.CursorType = adOpenDynamic
    rst.LockType = adLockOptimistic

    'open the connection
    rst.Open cmd

    'disconnect the recordset
    Set rst.ActiveConnection = Nothing

    'cleanup
    If CBool(cmd.State And adStateOpen) = True Then
        Set cmd = Nothing
    End If

    If CBool(cnx.State And adStateOpen) = True Then cnx.Close
    Set cnx = Nothing

    '"return" the recordset object
    Set RecordSetFromSheet = rst

End Function

Public Sub Test()

Dim rstData As ADODB.Recordset
Set rstData = RecordSetFromSheet("Sheet1")

Sheets("Sheet2").Range("A1").CopyFromRecordset rstData

End Sub

Sheet1 データ: Field1 Field2 Field3 Red A 1 Blue B 2 Green C 3

Sheet2 にコピーするもの: 赤 A 1 青 B 2 緑 C 3

これにより、変更を加えてテストするたびに SQL に対してクエリを実行する時間を大幅に節約できます...

-- ロバート

于 2010-03-21T22:23:09.270 に答える
2

最も簡単なのは、クライアント側のレコードセットを使用rs.Save "filename"rs.Open "filename"てファイルにシリアル化することです。

于 2010-03-21T22:29:10.380 に答える
0

Recordsetからを取得するもう 1 つの方法は、ターゲットから をRange作成し、プロパティを使用してそのドキュメントから を開くことです。XMLDocumentRangeRecordsetRange.Value()

' Creates XML document from the target range and then opens a recordset from the XML doc.
' @ref Microsoft ActiveX Data Objects 6.1 Library
' @ref Microsoft XML, v6.0
Public Function RecordsetFromRange(ByRef target As Range) As Recordset
        ' Create XML Document from the target range.
        Dim doc As MSXML2.DOMDocument
        Set doc = New MSXML2.DOMDocument
        doc.LoadXML target.Value(xlRangeValueMSPersistXML)

        ' Open the recordset from the XML Doc.
        Set RecordsetFromRange = New ADODB.Recordset
        RecordsetFromRange.Open doc
End Function

上記の例を使用する場合は、両方への参照を設定してくださいMicrosoft ActiveX Data Objects 6.1 LibraryMicrosoft XML, v6.0必要に応じて、この関数を遅延バインディングに変更することもできます。

呼び出しの例

' Sample of using `RecordsetFromRange`
' @author Robert Todar <robert@roberttodar.com>
Private Sub testRecordsetFromRange()
    ' Test call to get rs from Range.
    Dim rs As Recordset
    Set rs = RecordsetFromRange(Range("A1").CurrentRegion)

    ' Loop all rows in the recordset
    rs.MoveFirst
    Do While Not rs.EOF And Not rs.BOF
        ' Sample if the fields `Name` and `ID` existed in the rs.
        ' Debug.Print rs.Fields("Name"), rs.Fields("ID")

        ' Move to the next row in the recordset
        rs.MoveNext
    Loop
End Sub
于 2020-06-03T22:03:59.730 に答える