【问题标题】:Excel Querytable Refresh only works onceExcel Querytable Refresh 只工作一次
【发布时间】:2013-05-09 11:21:06
【问题描述】:

我正在使用 VBA 将 ListObject 添加到 Excel 2007 工作簿。 ListObject 后面有一个 QueryTable,链接到 Access 数据库。代码如下所示:

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)的情况下尝试了类似的代码并得到了同样的问题。我尝试刷新底层连接对象,但又遇到了同样的问题。

我整个上午都在谷歌上搜索无济于事。

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

非常感谢,

史蒂夫

【问题讨论】:

  • 因为第一次刷新还没有完成。
  • 谢谢,但我试过了。即使我删除了刷新和通过 Excel 刷新,我也可以看到数据到达工作表(只有十几行左右)。但是,再次刷新的选项是灰色的。即使我关闭并重新打开它,该选项仍然是灰色的。我认为连接对象发生了一些事情 - 但我不知道是什么。
  • 除此之外,refresh 方法后面的 'false' 参数应该是为了防止事物在后台刷新(我认为)。因此,如果我的理解是正确的,代码应该等到它完成后再开始下一行。不过还是谢谢。
  • 如果工作簿中的任何表具有 Connection Property 以不启用后台刷新,则有时会覆盖后台刷新。但是有了新数据,我的解决方案不适用于您的特定问题。只是一个想法,您是否尝试将 Persist Security Info=False 更改为 True 以便保留安全信息
  • 我在外部数据方面做了很多工作,但我从来不知道您可以使用 ADODB 记录集作为源。但我可以确认它可以工作,然后刷新按钮(Win7、XL2010)变灰。如果您录制宏,它不使用 ADODB,而是使用 xlSrcExternal 的 SourceType 并传入连接字符串。我想知道你是否这样做而不是 ADODB 是否可以释放刷新(我们都会学到一些东西)。

标签: excel vba oledb


【解决方案1】:

好的,我开始工作了。宏记录器(感谢迪克的建议)实际上曾经有用过一次。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 再次感谢。它不起作用,但正如我在上面的 cmets 中提到的,我认为这不是问题所在。初始刷新需要不到一秒钟的时间。即使我关闭并重新打开 Excel(然后吃完午饭回来),似乎也没有任何方法可以重新刷新查询。
    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 2023-03-28
    • 2017-01-06
    • 2018-06-22
    • 2015-09-18
    • 2013-12-31
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多