Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从excel加速ms access sql查询_Sql_Performance_Excel_Ms Access_Vba - Fatal编程技术网

从excel加速ms access sql查询

从excel加速ms access sql查询,sql,performance,excel,ms-access,vba,Sql,Performance,Excel,Ms Access,Vba,我有下面的代码,打开记录集并运行附带的查询似乎需要一些时间,准确地说是62秒。虽然1分钟就可以了,但当我需要做13次时,运行代码开始需要很长时间 我已经调试了代码,直到打开记录集为止,花费了最长的时间 我的问题是:有没有一种方法可以让它运行得更快?我正在从Excel 2013连接到MS Access 2013 提前感谢, 丰富的 你可以试试: Sub M_snb() c00 = "C:\Users\rich.wolff\Desktop\2014POSDatabase\HMKPOSDataba

我有下面的代码,打开记录集并运行附带的查询似乎需要一些时间,准确地说是62秒。虽然1分钟就可以了,但当我需要做13次时,运行代码开始需要很长时间

我已经调试了代码,直到打开记录集为止,花费了最长的时间

我的问题是:有没有一种方法可以让它运行得更快?我正在从Excel 2013连接到MS Access 2013

提前感谢,

丰富的

你可以试试:

Sub M_snb()
  c00 = "C:\Users\rich.wolff\Desktop\2014POSDatabase\HMKPOSDatabase2014.accdb"
  With Sheets("sheet2")
    sn = Array(.Cells(3, 2), .Cells(4, 2), .Cells(8, 14), .Cells(9, 14)) ' model 1, model 2, weeknumber, year
  End With

  For j = 1 To 13
    c01 = "SELECT Sum(StoreSalesData.QTY) AS Units"
    c01 = c01 & " FROM VSNConversionData INNER JOIN ([Sleepys Store List] INNER JOIN StoreSalesData ON [Sleepys Store List].[Store Code] = StoreSalesData.STR) ON VSNConversionData.VSN = StoreSalesData.VSN"
    c01 = c01 & " WHERE (((VSNConversionData.VSNStyle)='" & sn(1) & "') AND ((StoreSalesData.WeekNum)=" & sn(2) & ") AND ((StoreSalesData.Year)=" & sn(3) & ") AND ((StoreSalesData.STR) In (SELECT FloorModels2.[Source Org]"
    c01 = c01 & " FROM FloorModels2"
    c01 = c01 & " WHERE (((FloorModels2.[Source Org]) In (SELECT FloorModels2.[Source Org]"
    c01 = c01 & " FROM FloorModels2"
    c01 = c01 & " WHERE (((FloorModels2.WeekNumber)=" & sn(2) & ") AND ((FloorModels2.Year)=" & sn(3) & ") AND ((FloorModels2.VSNStyle)='" & sn(0) & "')))) AND ((FloorModels2.WeekNumber)=" & sn(2) & ") AND ((FloorModels2.Year)=" & sn(3) & ") AND ((FloorModels2.VSNStyle)='" & sn(1) & "')))));"

    With CreateObject("ADODB.recordset")
      .Open c01, "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" & c00
      Sheets("sheets2").Cells(11, 14 + j).CopyFromRecordset .DataSource
    End With
  Next
End Sub

我是否无意中进入了PHP论坛

使用tools:references声明ADODB库-它们将运行得更快,您可以在对象浏览器中获得intellisense和所有可用属性和选项的列表,并且可以异步运行查询

这是早期绑定,是对后期绑定的改进

接下来,使用dbforward打开Recordset对象,只需稍微快一点,然后使用Recordset.GetRows方法将其转储到VBA数组变量中:在代码中转置数组,并将其写入范围


我可以看出您在优化SQL方面取得了进展:尝试将其保存为数据库中的参数查询。ADODB.Command对象可以打开命名查询,填充参数,并返回记录集-查询本身可能运行得更快,也可能运行得不更快,但解析SQL的前置时间将大大加快。

从Access运行查询时会发生什么?我认为这将使我们和您更容易从Access本身调试和优化这样的查询,并消除所有Excel“噪音”。表结构、索引和有关数据库的其他信息可能比此VBA代码更相关。在access中运行查询大约需要9秒钟。我同意@GolezTrol的观点-很难想象为什么Excel会成为此应用程序的中心。大约9秒的回复只是强化了这种看法。我看了一下access数据库的索引。把它修好了。运行速度更快。为什么选择两个子系统?将第二个子查询合并到第一个的where条件中。仅尝试了此操作-我发现找不到提供程序。它可能没有正确安装。错误。您可以调整此数字:Microsoft.Jet.OLEDB.12.0;例如微软.Jet.OLEDB.4.0 ;;
Sub M_snb()
  c00 = "C:\Users\rich.wolff\Desktop\2014POSDatabase\HMKPOSDatabase2014.accdb"
  With Sheets("sheet2")
    sn = Array(.Cells(3, 2), .Cells(4, 2), .Cells(8, 14), .Cells(9, 14)) ' model 1, model 2, weeknumber, year
  End With

  For j = 1 To 13
    c01 = "SELECT Sum(StoreSalesData.QTY) AS Units"
    c01 = c01 & " FROM VSNConversionData INNER JOIN ([Sleepys Store List] INNER JOIN StoreSalesData ON [Sleepys Store List].[Store Code] = StoreSalesData.STR) ON VSNConversionData.VSN = StoreSalesData.VSN"
    c01 = c01 & " WHERE (((VSNConversionData.VSNStyle)='" & sn(1) & "') AND ((StoreSalesData.WeekNum)=" & sn(2) & ") AND ((StoreSalesData.Year)=" & sn(3) & ") AND ((StoreSalesData.STR) In (SELECT FloorModels2.[Source Org]"
    c01 = c01 & " FROM FloorModels2"
    c01 = c01 & " WHERE (((FloorModels2.[Source Org]) In (SELECT FloorModels2.[Source Org]"
    c01 = c01 & " FROM FloorModels2"
    c01 = c01 & " WHERE (((FloorModels2.WeekNumber)=" & sn(2) & ") AND ((FloorModels2.Year)=" & sn(3) & ") AND ((FloorModels2.VSNStyle)='" & sn(0) & "')))) AND ((FloorModels2.WeekNumber)=" & sn(2) & ") AND ((FloorModels2.Year)=" & sn(3) & ") AND ((FloorModels2.VSNStyle)='" & sn(1) & "')))));"

    With CreateObject("ADODB.recordset")
      .Open c01, "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" & c00
      Sheets("sheets2").Cells(11, 14 + j).CopyFromRecordset .DataSource
    End With
  Next
End Sub