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

时间:2011-03-08 22:17:31

标签: sql excel vba

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

设置:

  1. 我打开一个新的Excel 2010工作表。
  2. 转到“数据”标签
  3. 在“获取外部数据”部分下,我点击“从其他来源”,然后从该下拉列表中点击“来自Microsoft Query”
  4. 然后我选择正确的ODBC连接,通过“查询向导”窗口取消并关闭“添加表”窗口
  5. 然后在“Microsoft Query”窗口中,我只需单击“SQL”按钮,输入我的查询并点击确定
  6. 它在“Microsoft Query”窗口中执行查询,然后我关闭该窗口,在提示时选择我希望它填充的单元格并点击确定。
  7. 然后在我的电子表格中填充查询。
  8. 问题出现在哪里:

    如果我右键单击表格并从右键单击弹出菜单中选择“刷新”,数据将刷新,屏幕底部显示“正在运行后台查询...”的小旋转地球将出现并旋转,直到查询运行完毕,excel不会冻结,我可以在其他标签或其他工作表中工作。

    但是,如果我通过宏执行该确切语句:

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

    旋转的地球没有出现,excel停止响应,有时变白,当鼠标悬停在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语句刷新超过几秒钟时才会出现明显的问题。这已经成为一个非常大的问题,所以我非常感谢任何可以提供帮助的人。非常感谢。

2 个答案:

答案 0 :(得分:5)

这是:

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

答案 1 :(得分:0)

我总是以以下代码结束查询代码:

ActiveSheet.ListObjects(1).Refresh
Application.CalculateUntilAsyncQueriesDone
ActiveSheet.ListObjects(1).Unlist

在查询中慢跑并回滚结果