RefreshAll 不更新数据透视表

问题描述 投票:0回答:7

我有一个模板工作簿,其中有几个连接到sql连接的数据表,以及一些数据透视表,其来源是通过带来的数据。

我的印象是

ActiveWorkbook.RefreshAll
会更新所有连接,然后更新枢轴。事实上,这就是我手动运行刷新时发生的情况。但是,当我运行 VBA(实际上在 Access 中,但被正确引用等)时,它会更新连接而不是数据透视表?

我在

DoEvents
之后尝试了
RefreshAll
,但没有效果。

我现在唯一的选择是通过所有工作表、数据源、数据透视缓存运行

For each
并以这种方式刷新它们吗?

excel ms-access vba
7个回答
18
投票

ActiveWorkbook.RefreshAll 实际上是 RefreshAll 连接和枢轴。但是,在您的场景中,数据透视表可能基于您必须首先刷新的数据。当数据尚未加载时,数据透视表将刷新,因此会出现意外的行为。

对此有多种解决方案:

  • 要么将通过连接返回的数据作为数据透视缓存,以便数据返回时数据透视表将自动刷新。 这样,您也不会将数据本身存储在工作簿中的单独工作表中。

  • 在代码中或通过 UI 将所有连接的“后台刷新”属性设置为 false,然后正常执行。 两次。第二次,数据透视缓存将具有更新的数据,从而按预期刷新。 - 编辑:我不推荐这样做,因为你将打开数据库连接两次,加载数据两次等等。效率非常低!

  • 如上所述,将“后台刷新”属性设置为 false。使用“全部刷新”进行刷新后,循环遍历工作表的数据透视表集合,以在加载数据后手动刷新这些集合,如下所示。

代码:

Sub test()

Dim ws as Worksheet
Dim pt as PivotTable

ActiveWorkbook.RefreshAll 'make sure the refresh in bg property is false for all connections

For each ws in ActiveWorkbook.Worksheets
    For each pt in ws.pivottables
        pt.RefreshTable
    Next pt
Next ws

End Sub

或者简单地仅刷新数据透视缓存(更高效,尤其是在多个表使用相同缓存的情况下):

Sub test()
Dim pc as PivotCache

ActiveWorkbook.RefreshAll 'make sure the refresh in bg property is false for all connections

For each pc in ActiveWorkbook.PivotCaches
    pc.Refresh
Next pc

End Sub

6
投票

我已经使用以下方法解决了这个问题

    For Each sht In .Sheets
        For Each qt In sht.QueryTables
            qt.Refresh
        Next qt
        For Each lo In sht.ListObjects
            lo.QueryTable.Refresh BackgroundQuery:=False
        Next lo
        For Each pvt In sht.PivotTables
            pvt.PivotCache.Refresh
        Next pvt
    Next sht

2
投票

我通过在代码中添加一个简单的“计算”解决了这个问题。

Calculate
ActiveWorkbook.RefreshAll

1
投票

我在通过宏复制和保存工作簿时遇到了这个问题,并且在不同的数据透视表/缓存刷新方面没有运气,但在更改每个数据透视表的 SaveData 属性时发现了运气。以防万一有人像我一样读到这篇文章并正在寻找其他东西来尝试。

For Each pt in ws.PivotTables
   pt.SaveData = True
Next pt

0
投票

我还假设 RefreshAll 会刷新所有可以刷新的内容,但很惊讶事实似乎并非如此。下面是我尝试提供的一个过程,尝试刷新所有可以刷新的内容。请注意,您可以尝试删除一些部件以使其运行得更快。

Sub RefreshAllData()

    ' Declare the required variables
    Dim wb As Workbook
    Dim sht As Worksheet
    Dim qt As QueryTable
    Dim lo As ListObject
    Dim pvt As PivotTable
    Dim conn As WorkbookConnection
    Dim pq As Object
    
    ' Set the active workbook to work on
    Set wb = ActiveWorkbook
    

    With wb

        ' Loop through each connection in the workbook and refresh it
        For Each conn In .Connections
            On Error Resume Next ' Skip any errors that may occur during refreshing
            conn.Refresh
            On Error GoTo 0 ' Resume normal error handling
        Next conn
        
        ' Loop through each query in the workbook and refresh it
        For Each pq In .Queries
            On Error Resume Next ' Skip any errors that may occur during refreshing
            pq.Refresh
            On Error GoTo 0 ' Resume normal error handling
        Next pq

        ' Loop through each sheet in the workbook
        For Each sht In .Sheets
            
            ' Loop through each QueryTable in the sheet and refresh it
            For Each qt In sht.QueryTables
                qt.Refresh
            Next qt
            
            ' Loop through each ListObject in the sheet and refresh its QueryTable
            For Each lo In sht.ListObjects
                lo.QueryTable.Refresh BackgroundQuery:=False
            Next lo
            
            ' Loop through each PivotTable in the sheet and refresh its PivotCache
            For Each pvt In sht.PivotTables
                pvt.PivotCache.Refresh
            Next pvt
            
        Next sht
        
    End With

End Sub

0
投票

这是我对堆栈溢出的第一个贡献,所以请对我温柔点:D

我遇到了同样的问题,但是当我手动运行代码时,我意识到“RefreshAll”方法在后台执行,而其余代码继续运行。

解决该问题的一种方法是将“后台刷新”设置设置为 false。

这是其他人已经提到过的......(没什么新意)

但是我在不同的线程中找到了另一个解决方案,该解决方案适用于尝试刷新工作簿的每个人,即使他们没有更改 Excel 应用程序的设置。

“Application.CalculateUntilAsyncQueriesDone”是告诉 Excel 在代码继续运行之前等待后台查询完成的方法。

祝你有美好的一天!

Sub Refresh()

Dim sht As Worksheet
Dim pvt As PivotTable

ActiveWorkbook.RefreshAll

Application.CalculateUntilAsyncQueriesDone

For Each sht In ActiveWorkbook.Sheets
    For Each pvt In sht.PivotTables
        pvt.PivotCache.Refresh
    Next pvt
Next sht

结束子


0
投票

我遇到了与此相关的各种问题,其中包含错误消息,例如“请等待 Microsoft Excel 完成刷新数据透视表...”。对我有用的是:

#Apparently, RefreshAll does not work if have xlCalculationManual
Application.Calculation = xlCalculationAutomatic
#Do it twice, as per answer above
ThisWorkbook.RefreshAll
ThisWorkbook.RefreshAll

不适合纯粹主义者,但工作速度足够快且(更重要的是)可靠。

© www.soinside.com 2019 - 2024. All rights reserved.