过滤:AODB vs Autofilter vs SQLite

时间:2018-01-21 09:55:38

标签: sql excel vba sqlite autofilter

我有一张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秒。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

与使用以下方法之一相比,这些方法可能会变慢:

  • 数据透视表,结合GETPIVOTDATA功能
  • 高级过滤器(不要与自动过滤器混淆)
  • 范围对已排序的数据进行切片,这将在速度方面胜过其他所有内容。

......其中任何一个都可以从VBA调用。 有关这些内容的进一步详细说明,请参阅Optimizing Excel formulas - SUMPRODUCT vs SUMIFS/COUNTIFS

上的答案

答案 1 :(得分:0)

我最终将电子表格移动到Microsoft Access,并使用Excel中的ADODB / SQL查询从Access数据库中检索值。这有助于将我的代码加速大约10倍,所以绝对值得一提。

谢谢大家!