2013-05-09 57 views
4

我正在使用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)并得到相同的问题。我已经尝试刷新底层连接对象,并再次获得相同的问题。

我花了整个早上谷歌搜索无济于事。

这是一个错误,设计的行为或(我很可能)在做一些愚蠢的事情吗?

提前许多感谢,

史蒂夫

+0

由于第一次刷新尚未完成。 – user2140261 2013-05-09 13:24:22

+0

谢谢,但我试过。即使我通过Excel删除了刷新和刷新,我也可以看到数据到达工作表(仅十几行)。但是,再次刷新的选项灰显。即使我关闭并重新打开它,该选项仍然显示为灰色。我认为连接对象发生了一些事情 - 但我无法弄清楚什么。 – steveo40 2013-05-09 13:31:31

+0

除此之外,刷新方法后的'false'参数应该阻止事物在后台刷新(我认为)。所以如果我的理解是正确的,代码应该等到它完成之后再开始下一行。不过谢谢。 – steveo40 2013-05-09 13:32:59

回答

3

好吧,我得到它的工作。宏记录器(感谢迪克的建议)实际上有用一次。

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 
1

这是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