通过macros执行SQL语句时,Excel 2010冻结
我在通过macros执行SQL查询时遇到问题,只需在Excel 2010中单击“刷新”即可。
设置:
- 我打开了一个新的Excel 2010工作表。
- 进入“数据”选项卡
- 在“获取外部数据”部分,我点击“从其他来源”,从下拉列表中单击“从Microsoft Query”
- 然后我select正确的ODBC连接,通过“查询向导”窗口取消并closures“添加表”窗口
- 然后在“Microsoft Query”窗口中,我只需单击“SQL”button,input我的查询并点击确定
- 它在“Microsoft Query”窗口中执行查询,然后closures该窗口,在提示时select我希望它填充的单元格,然后点击“确定”。
- 查询然后填充在我的电子表格中。
这是问题出现的地方:
如果我右键单击表格并从右键单击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 。