在 Excel 2010 中通过 VBA 查询 Excel 数据时,我遇到一个有趣的问题。
我正在使用这些驱动程序连接到 xls 或 xls(x|m) 文件:
Sub OpenCon(ByRef theConn As Connection, ByVal FilePath As String)
'Opens the connection based on Excel version
If Right(FilePath, 4) = ".xls" Then
theConn.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
"DriverId=790;" & _
"Dbq=" & FilePath & ";" & _
"DefaultDir=" & FilePath
Else
theConn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
"DriverId=790;" & _
"Dbq=" & FilePath & ";" & _
"DefaultDir=" & FilePath
End If
End Sub
现在,如果我在 Sheet1 中有来自 A5:O15000 的数据并且我想查询它,我会做类似的事情
Dim rs as Recordset
Dim con as Connection
Set con = New Connection
OpenCon con, ThisWorkbook.FullName
Set rs = New Recordset
Set rs = con.Execute("SELECT * FROM [Sheet1$A5:O15000]")
请注意,我的数据从第五行开始。现在,15.000 行不会造成问题,但是当我们超过 Excel 2003 的 65,000 行时,代码就会崩溃。所以如果我有[Sheet1$A5:O100000]
那里的代码不会运行,抱怨数据引用无效。
我发现的另一件有趣的事情是,如果数据从 A1 开始,我只说[Sheet1$]
相同的代码(即使是 100.000 行)也可以正常运行。然而,我正在使用的文件是预先配置的,并且填充了大量宏,因此我不能将数据移动到工作表的开头。将数据复制到新的空白表并进行查询也不是一个选项,我尝试使用 SQL 来提高速度,并且复制整个数据集肯定不会对我有帮助。
无论如何,问题是 - 是否有另一个驱动程序可以支持额外的行数?或者有其他方法可以绕过这个问题吗?