Excel Querytable刷新仅适用于一次
问题描述:
我正在使用VBA向Excel 2007工作簿添加ListObject。 ListObject的后面有一个QueryTable,链接到Access数据库。代码如下所示:Excel Querytable刷新仅适用于一次
Dim l As ListObject
Dim c As ADODB.Connection
Dim r As ADODB.Recordset
Set c = New ADODB.Connection
c.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=myAccessDatabasePath;Persist Security Info=False;"
Set r = New ADODB.Recordset
r.Open "Select * From myTable", c
Set l = ActiveSheet.ListObjects.Add(xlSrcQuery, r, True, xlYes, Range("A1"))
l.QueryTable.Refresh False
'this line causes an error
l.QueryTable.Refresh False
本质上问题是我无法多次刷新表格。数据和表格设计功能区上的刷新按钮呈灰色。我尝试过使用类似的代码而不使用Listobjects(即仅仅是QueryTables)并得到相同的问题。我已经尝试刷新底层连接对象,并再次获得相同的问题。
我花了整个早上谷歌搜索无济于事。
这是一个错误,设计的行为或(我很可能)在做一些愚蠢的事情吗?
提前许多感谢,
史蒂夫
答
好吧,我得到它的工作。宏记录器(感谢迪克的建议)实际上有用一次。
Dim s As Worksheet
Dim l As ListObject
Set s = ActiveSheet
Set l = s.ListObjects.Add(xlSrcExternal, "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=myDatabasePath;", True, xlYes, Range("A1"))
l.QueryTable.CommandType = xlCmdTable
l.QueryTable.CommandText = "mytable"
l.QueryTable.Refresh False
'this now works!
l.QueryTable.Refresh False
答
这是UNTESTED,但它仍然应该工作,它会检查表已在刷新,如果是,它会等待1秒,再次检查,直到它不再刷新,那么它将继续
Dim l As ListObject
Dim c As ADODB.Connection
Dim r As ADODB.Recordset
Set c = New ADODB.Connection
c.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=myAccessDatabasePath;Persist Security Info=False;"
Set r = New ADODB.Recordset
r.Open "Select * From myTable", c
Set l = ActiveSheet.ListObjects.Add(xlSrcQuery, r, True, xlYes, Range("A1"))
With l
.QueryTable.Refresh False
Do while .Refreshing
Application.Wait Now + TimeValue("00:00:01")
Loop
'this line causes an error
.QueryTable.Refresh False
End With
+0
再次感谢。它不起作用,但正如我在上面的评论中提到的,我不认为这是问题。最初的刷新很快就会发生。即使我关闭并重新打开Excel(并从午餐返回),似乎没有任何方法可以重新刷新查询。 – steveo40 2013-05-09 13:38:40
由于第一次刷新尚未完成。 – user2140261 2013-05-09 13:24:22
谢谢,但我试过。即使我通过Excel删除了刷新和刷新,我也可以看到数据到达工作表(仅十几行)。但是,再次刷新的选项灰显。即使我关闭并重新打开它,该选项仍然显示为灰色。我认为连接对象发生了一些事情 - 但我无法弄清楚什么。 – steveo40 2013-05-09 13:31:31
除此之外,刷新方法后的'false'参数应该阻止事物在后台刷新(我认为)。所以如果我的理解是正确的,代码应该等到它完成之后再开始下一行。不过谢谢。 – steveo40 2013-05-09 13:32:59