下面提到的示例过程用于从保存在文件夹中的输入excel文件中读取数据。 SQl查询具有来自 reportWorkbook 的一部分的几个表(表)的联接操作。在某些阶段在某些文件上成功运行此过程后,它将引发错误'[Microsoft] [ODBC Excel Driver]参数太少。下一个输入文件应为11。'。
Sub RunQueryOnInputFiles()
Dim fldr As Folder
Dim fil As File
Dim oConn As ADODB.Connection
Dim oRs As ADODB.Recordset
Dim tmpWkb As Workbook
Dim reportWorkbook As Workbook
Dim sSql As String
Set reportWorkbook = Workbooks.Add
reportWorkbook.Save tmpFilePath
'Loop through all files in input folder
For Each fil In fldr.Files
Set tmpWkb = Workbooks.Open(fil.Path)
tmpWkb.Sheets(1).Range("A1").CurrentRegion.Copy
reportWorkbook.Sheets("TmpSheet").Range("A1").Paste xlPasteValues
'Paste input data
tmpWkb.Close SaveChanges:=False
Set oConn = OpenConnection(reportWorkbook.FullName)
sSql = GenrateSQL("SOME QUERY FROM SHEET [TmpSheet$]")
'Genrate SQL query from [TmpSheet$]`
Set oRs = GetRecordset(sSql, oConn)
reportWorkbook.Sheets("XYZ").Range("A1").CopyFromRecordset oRs
CloseConnection oConn
Next fils
End Sub
我使用下面提到的过程分别调试问题
Sub testing()
Dim sSql As String
Dim x As ADODB.Connection
Dim r As Object
Dim fl As Object
sSql = "SELECT * FROM [TmpSheet$A1:U4]"
'considering reportWorkbook is in scope it is same workbook
Set x = OpenConnection(reportWorkbook.FullName)
GetRecordset sSql, x
Set r = GetRecordset(sSql, x)
For Each fl In r.Fields
Debug.Print fl.Name
Next
End Sub
在这里,fl.Name返回的名称属于先前已处理的文件,并且TmpSheet上的数据已被覆盖。几分钟后运行相同的testing()过程将显示Tmpsheet中可用的正确字段。
似乎无法刷新连接。请提出一些可以强制连接在运行时刷新的方法。
答案 0 :(得分:0)
在您的缩写代码后,您面临的挑战是查询正在处理的工作簿,该工作簿始终反映出最后保存的实例的快照。
在处理循环中的每个Excel文件之后,请考虑合并Workbook.Save
方法。
For Each fil In fldr.Files
...
reportWorkbook.Save
Next fils
此外,考虑在循环中查询当前工作簿,以避免打开文件以及复制和粘贴值的开销。
For Each fil In fldr.Files
' QUERY CURRENT WORKBOOK
Set oConn = OpenConnection(fil.Path)
sSql = GenrateSQL("SELECT * FROM [Sheet1$]")
Set oRs = GetRecordset(sSql, oConn)
reportWorkbook.Sheets("TmpSheet").Range("A1").CopyFromRecordset oRs
oRs.Close()
CloseConnection oConn
' QUERY MASTER WORKBOOK
Set oConn = OpenConnection(reportWorkbook.FullName)
sSql = GenrateSQL("SOME QUERY FROM SHEET [TmpSheet$]")
Set oRs = GetRecordset(sSql, oConn)
reportWorkbook.Sheets("XYZ").Range("A1").CopyFromRecordset oRs
oRs.Close()
CloseConnection oConn
reportWorkbook.Save
Next fils
附加说明:
如果打算这样做,则似乎每次循环迭代都覆盖 XYZ 工作表中的数据。添加或更改工作表以避免这种覆盖。
如果工作表包含标题,请确保复制从A2
开始的记录集并从A1
开始的循环字段名称(如testing()
子例程)。或在第1行中使用静态标头。
对于查询循环工作簿的底部解决方案,如果事先不知道工作表,则需要循环打开文档以获取工作表名称并将其传递给第一个SQL查询。