通过macros执行SQL语句时,Excel 2010冻结

我在通过macros执行SQL查询时遇到问题,只需在Excel 2010中单击“刷新”即可。

设置:

  1. 我打开了一个新的Excel 2010工作表。
  2. 进入“数据”选项卡
  3. 在“获取外部数据”部分,我点击“从其他来源”,从下拉列表中单击“从Microsoft Query”
  4. 然后我select正确的ODBC连接,通过“查询向导”窗口取消并closures“添加表”窗口
  5. 然后在“Microsoft Query”窗口中,我只需单击“SQL”button,input我的查询并点击确定
  6. 它在“Microsoft Query”窗口中执行查询,然后closures该窗口,在提示时select我希望它填充的单元格,然后点击“确定”。
  7. 查询然后填充在我的电子表格中。

这是问题出现的地方:

如果我右键单击表格并从右键单击popup菜单中select“刷新”,数据将刷新,屏幕底部将显示“正在运行的后台查询…”的小旋转球体,并旋转直到查询已经完成运行,excel不会冻结,我可以在其他选项卡或其他工作表中工作。

但是,如果我通过一个macros来执行这个确切的语句:

Range("A6").Select Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False 

旋转的地球不出现,excel停止响应,有时会变成白色,当鼠标hover在excel上时,鼠标变成旋转的“不响应”的圆圈。 在这一点上,我无法在excel中工作,直到查询结束执行并且excel重新开始响应。

这是一个问题,因为在我的大多数报告中,我使用excel中的单元格来允许用户将参数插入到我执行的SQL语句中。

例:

 Dim oQuery As QueryTable Dim oDate As String Set oQuery = ActiveWorkbook.Sheets("Sheet1").ListObjects(1).QueryTable oDate = Range("B1") oQuery.CommandText = "exec database.dbo.ExampleProcedure @SuppliedDate = '" + oDate + "'" oQuery.Refresh False 

这不是在Excel 2003中的问题,但只有当我切换到2010年,并不得不改变查询表vb代码,如下面的例子中所示

在2003年:

  Set oQuery = Sheet1.QueryTables(1) 

在2010年:

 Set oQuery = ActiveWorkbook.Sheets("Sheet1").ListObjects(1).QueryTable 

另外它只发生在我编写的报告中的大约75%,并且只是在SQL语句刷新超过几秒钟时才是一个明显的问题。 这成了一个很大的问题,所以我会非常感激任何人的帮助。 非常感谢。

这里是:

 BackgroundQuery:=False 

这意味着“不要让任何人做任何事情,直到查询完成”。

Excel正在做你所问的。 如果您希望人们能够继续下去,则需要将False更改为True

如果在查询之后需要执行进一步的处理,则有两个选项(除了加速查询之外,我假定您已经完成了这些查询)。

在等待查询完成时使用DoEvents循环(检查QueryTables.Item(1).Refreshing以查看它是否仍在运行),

 Sub RefreshQueryAndWait(ByVal oQuery As QueryTable) '' Assume oQuery is the current query oQuery.Refresh BackgroundQuery:=False Do While oQuery.Refreshing DoEvents Loop End Sub 

或者:将VB代码的第二部分(在刷新之后)放入到查询完成时调用的另一个Sub中。

有关如何执行此操作,请参阅http://support.microsoft.com/kb/213187