【发布时间】:2018-01-25 01:41:43
【问题描述】:
我有一个 VBA 应用程序,它调用多个工作表并为每个工作表获取一组数据。获得的所有信息必须以单个变体矩阵结尾。
我已经想到了几种解决方案。它们是:
- 他们中的第一个,加入记录集只得到一个。
- 第二个是顺序转储每个 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
使用这个解决方案我有一些问题:
- 最终的 RecordSet 混合了第一个和第二个 RecordSets
- 第一个变体数组需要转置
那么,有没有更好的解决方案?
【问题讨论】:
-
您可以使用 CopyFromRecordset 并使用此方法将所有结果转储到 Excel 中的临时选项卡上:ThisWorkbook.Worksheets("tmp_sheet"t).Range("A2").CopyFromRecordset RS01
-
或者也许构建一个独特的 UNION sql 来整合您的所有查询? (假设它们具有相同的字段) sFinalSQL=Query1 & " UNION " & Query2
-
MR,CopyFromRecorset 解决方案涉及从工作表写入和读取,减慢了进程
-
构建一个独特的 UNION 似乎是一个更好的解决方案,无论如何考虑有多个来源,是的,它们具有相同的字段,但我不知道这样做。你会怎么做?
-
很对,UNION 不能工作,因为有多个数据源。请在下面找到我的答案。