我有一张Excel表格,其中包含大约100,000行,16列的数据。我必须从这个表中提取数据(我找到的1行中的一个值)几千次。我一直在使用Autofilter来提取这个值,但也尝试过AODB / SQL语句,看看我是否可以提高查询的速度。
数据按列1排序。当我使用自动过滤时,无论值的位置如何,获取我的值平均需要0.3秒。 AODB需要0.1到0.6秒来查找值,具体取决于表中值的位置(如果值接近表的顶部,则需要0.1秒,而如果数据接近表的末尾,则可能需要0.6秒)。我原本以为AODB要比Autofilter快得多,但看起来它们的平均值大致相同。
当我将这些数据导入SQLite并使用SQLiteStudio等工具时,查询返回的值小于0.01s!
我可以更改代码中的任何内容以加快VBA中的查询速度吗?
代码如下。 AODB方法:
Sub AODB_method()
'Freeze Screen and other options to run code faster
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayStatusBar = False
Application.EnableEvents = False
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim vv As Double
Dim Time2 As Double
Time2 = Timer
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With ThisWorkbook
If Application.Version < 12 Then
cn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & .FullName & ";" & _
"Extended Properties=Excel 8.0"
Else
cn.ConnectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & .FullName & ";" & _
"Extended Properties=Excel 8.0"
End If
cn.Open
Set rs = cn.Execute("SELECT [Cl] FROM [Table1$] WHERE [Wind]=150 AND [Weight]=200000 AND [Altitude] = 20000 AND [ISA] = 0")
vv = rs.Fields(0).Value
rs.Close
cn.Close
End With
'Turn Options on again
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayStatusBar = True
Application.EnableEvents = True
Debug.Print "Connection Time: " & Timer - Time2
End Sub
自动过滤方法:
Sub Autofilter_method()
'Freeze Screen and other options to run code faster
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayStatusBar = False
Application.EnableEvents = False
Dim vv As Double
Dim Time2 As Double
Time2 = Timer
With ThisWorkbook.Worksheets("Table1")
.AutoFilterMode = False
With .Range("A1:H1")
.AutoFilter
.AutoFilter Field:=4, Criteria1:=0
.AutoFilter Field:=2, Criteria1:=200000
.AutoFilter Field:=3, Criteria1:=20000
.AutoFilter Field:=1, Criteria1:=-150
End With
End With
vv = Range("H" & finallastrow("Table1", "H")).Value
'Turn Options on again
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayStatusBar = True
Application.EnableEvents = True
Debug.Print "Connection Time: "; Timer - Time2
End Sub
一些注释:
我正在使用Excel 2013. Jet OLEDB提供程序似乎更快,但我无法将值保存在变量vv中(我收到错误)。
当Wind为-150(Column1,-150靠近表格顶部)时,AODB查询以0.1秒运行,而风值+150则需要0.6秒。
感谢您的帮助!
答案 0 :(得分:0)
与使用以下方法之一相比,这些方法可能会变慢:
......其中任何一个都可以从VBA调用。 有关这些内容的进一步详细说明,请参阅Optimizing Excel formulas - SUMPRODUCT vs SUMIFS/COUNTIFS
上的答案答案 1 :(得分:0)
我最终将电子表格移动到Microsoft Access,并使用Excel中的ADODB / SQL查询从Access数据库中检索值。这有助于将我的代码加速大约10倍,所以绝对值得一提。
谢谢大家!