【问题标题】:One RecordSet with multiple Connections & SQL Querys一个具有多个连接和 SQL 查询的 RecordSet
【发布时间】:2018-01-25 01:41:43
【问题描述】:

我有一个 VBA 应用程序,它调用多个工作表并为每个工作表获取一组数据。获得的所有信息必须以单个变体矩阵结尾。

我已经想到了几种解决方案。它们是:

  1. 他们中的第一个,加入记录集只得到一个。
  2. 第二个是顺序转储每个 RecordSet 单一矩阵

这两种解决方案似乎都不是解决方案... 这是解决方案 1 的代码:

Sub Test()
Dim RS01 As ADODB.Recordset
Dim RS02 As ADODB.Recordset
Dim Query As String
Dim FField As Variant
Dim Pair As Variant
Dim Pairs As Variant
Dim MFTE() As Variant
Dim Temp() As Variant
Dim Rows As Long
Dim Row As Long
Dim Column As Long
Dim Connection As String
'Looping throught the pairs
Pairs() = Array("EURAUD", "EURCAD")
For Each Pair In Pairs
    Select Case Par
        Case "EURAUD"
            Query = _
                "SELECT [FE], [HO], [AP], [MAX], [MIN], [CIE], [PAR]" & _
                "FROM [EURAUD$]" & _
                "WHERE (FE >=" & Date1 & ") and (FE <=" & Date2 & ")"
            Connection = _
                "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=File Number 1;" & _
                "Extended Properties=Excel 12.0"
            Set RS01 = New ADODB.Recordset
            RS01.Open Query, Connection, adOpenForwardOnly, adLockReadOnly
        Case "EURCAD"
            Query = _
                "SELECT [FE], [HO], [AP], [MAX], [MIN], [CIE], [PAR]" & _
                "FROM [EURCAD$]" & _
                "WHERE (FE >=" & Date1 & ") and (FE <=" & Date2 & ")"
            Connection = _
                "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=File Number 2;" & _
                "Extended Properties=Excel 12.0"
            Set RS02 = New ADODB.Recordset
            RS02.Open Query, Connection, adOpenForwardOnly, adLockOptimistic
    End Select
Next Pair
'Joining RS01 & RS02
RS01.MoveFirst
Do Until RS01.EOF
    RS02.AddNew
    For FField = 0 To RS01.Fields.Count - 1
        RS02.Fields(FField).Value = RS01.Fields(FField).Value
    Next FField
    RS02.Update
    RS01.MoveNext
Loop
'Dumping data into 1st variant Array
Do Until RS07.EOF
    Temp() = RS07.GetRows
Loop
'Transpose data into 2nd variant Array
Rows = RS07.RecordCount
ReDim MFTE(Rows, 7) As Variant
For Row = LBound(Temp, 2) To UBound(Temp, 2)
    For Column = LBound(Temp, 1) To UBound(Temp, 1)
        MFTE(Row, Column) = Temp(Column, Row)
    Next Column
Next Row
End Sub

使用这个解决方案我有一些问题:

  1. 最终的 RecordSet 混合了第一个和第二个 RecordSets
  2. 第一个变体数组需要转置

那么,有没有更好的解决方案?

【问题讨论】:

  • 您可以使用 CopyFromRecordset 并使用此方法将所有结果转储到 Excel 中的临时选项卡上:ThisWorkbook.Worksheets("tmp_sheet"t).Range("A2").CopyFromRecordset RS01
  • 或者也许构建一个独特的 UNION sql 来整合您的所有查询? (假设它们具有相同的字段) sFinalSQL=Query1 & " UNION " & Query2
  • MR,CopyFromRecorset 解决方案涉及从工作表写入和读取,减慢了进程
  • 构建一个独特的 UNION 似乎是一个更好的解决方案,无论如何考虑有多个来源,是的,它们具有相同的字段,但我不知道这样做。你会怎么做?
  • 很对,UNION 不能工作,因为有多个数据源。请在下面找到我的答案。

标签: excel vba recordset


【解决方案1】:

我仍然推荐“CopyFromRecordset”,其中涉及一些编码,但我认为该过程不会显着减慢,可能只有几分之一秒

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多