sql - Excel 2010通过宏执行SQL语句时卡住

标签 sql excel vba

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

设置:

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

这里是问题出现的地方:

如果我右键单击表格并从右键单击弹出菜单中选择“刷新”,数据将刷新,屏幕底部会出现一个旋转的小地球,上面写着“正在运行后台查询...”并旋转直到查询完成运行并且 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 语句刷新时间超过几秒时才会出现明显问题。这正在成为一个相当大的问题,所以我将非常感谢任何可以提供帮助的人。非常感谢。

最佳答案

这里是:

BackgroundQuery:=False 

这意味着“在查询完成之前不要让任何人做任何事情”。

Excel 正在执行您所要求的操作。如果你希望人们能够继续,你需要改变 FalseTrue .

如果您需要在查询后执行进一步处理,您有两个选择(除了加速查询,我假设您已经完成了)。

在等待查询完成时使用 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 中,在查询完成时调用该 Sub。

参见http://support.microsoft.com/kb/213187了解如何执行此操作。

关于sql - Excel 2010通过宏执行SQL语句时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5239043/

相关文章:

excel - 如何从过滤范围中复制粘贴特殊单元格

c# - OpenXml SpreadsheetDocument.Open(...) 出现异常 - 缺少主要部分

vba - Excel 使用表格 : How to hide application but have icon in the taskbar

mysql - ON DUPLICATE KEY 更新(带有多个 where 子句)

java - 在 JDBC 中对单个语句对象使用 batchExecute 和 execute 方法

sqlite 根据列值创建有序分区,即密集等级()

mysql - 集团每月及城市数据

error-handling - 使用GetText从剪贴板获取文本-仅在剪贴板上显示图形时避免错误

vba - 在 VBA 中循环列时选择单元格

excel - 每个循环的 VBA 包含 64K+ ListRows(内存不足)