我在通过宏执行SQL查询时遇到问题,只需单击excel 2010中的“刷新”即可。
设置:
问题出现在哪里:
如果我右键单击表格并从右键单击弹出菜单中选择“刷新”,数据将刷新,屏幕底部显示“正在运行后台查询...”的小旋转地球将出现并旋转,直到查询运行完毕,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语句刷新超过几秒钟时才会出现明显的问题。这已经成为一个非常大的问题,所以我非常感谢任何可以提供帮助的人。非常感谢。
答案 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
在查询中慢跑并回滚结果