用宏刷新我的Excel工作簿中的所有数据透视表


84

我有一本包含20个不同数据透视表的工作簿。有什么简单的方法可以找到所有数据透视表并在VBA中刷新它们?

Answers:


170

是。

ThisWorkbook.RefreshAll

或者,如果您的Excel版本足够旧,

Dim Sheet as WorkSheet, Pivot as PivotTable
For Each Sheet in ThisWorkbook.WorkSheets
    For Each Pivot in Sheet.PivotTables
        Pivot.RefreshTable
        Pivot.Update
    Next
Next

17
噢,真是个烂人。五年多之后,这是一个令人耳目一新的变化;)
Gserg

3
确实..令人耳目一新..有人甚至试图以离题的方式结束这个问题……这不像我要求仅通过使用鼠标或其他任何方式来做到这一点:D
Lipis 2013年

3
太好了,我必须使用它,因为我想在获得新的外部数据后刷新数据透视表,因此ThisWorkbook.RefreshAll对我不起作用。
Yasskier 2014年

5
请注意。如果,ThisWorkbook.RefreshAll由于某种原因该方法不起作用Application.Calculation = xlCalculationManualApplication.Calculation = xlCalculationAutomatic在使用代码之前,将计算属性设置为。
kolcinx

3
@GSerg抱歉,恢复了该旧帖子,但我有一个问题(在此处发布):我们需要在Update之后RefreshTable吗?两者有什么区别?
奥斯卡·安东尼

26

此VBA代码将刷新工作簿中的所有数据透视表/图表。

Sub RefreshAllPivotTables()

Dim PT As PivotTable
Dim WS As Worksheet

    For Each WS In ThisWorkbook.Worksheets

        For Each PT In WS.PivotTables
          PT.RefreshTable
        Next PT

    Next WS

End Sub

另一个非编程选项是:

  • 右键单击每个数据透视表
  • 选择表格选项
  • 勾选“打开时刷新”选项。
  • 点击确定按钮

每次打开工作簿时,这将刷新数据透视表。


20

ActiveWorkbook.RefreshAll刷新所有内容,不仅刷新数据透视表,而且刷新ODBC查询。我有几个引用数据连接的VBA查询,由于该命令在没有VBA提供的详细信息的情况下运行数据连接,因此使用此选项会崩溃

如果您只希望刷新枢轴,则建议使用此选项

Sub RefreshPivotTables()     
  Dim pivotTable As PivotTable     
  For Each pivotTable In ActiveSheet.PivotTables         
    pivotTable.RefreshTable     
  Next 
End Sub 

1
检查最投票的答案..第二种方法实际上是您在这里尝试的方法..但是,对于整个繁荣期..不仅对于活动工作表..这两种情况都取决于..从那以后我再也没有碰过。
Lipis 2012年

如果数据透视表不在活动工作表中怎么办?
异想天开

8

在某些情况下,您可能需要区分数据透视表和其数据透视表。缓存具有自己的刷新方法和自己的集合。因此,我们可以刷新所有的数据透视表而不是数据透视表。

区别?创建新的数据透视表时,系统会询问您是否要基于上一个表。如果您拒绝,则此数据透视表将获得其自己的缓存,并使源数据的大小增加一倍。如果您说“是”,则可以使WorkBook保持较小,但会添加到共享单个缓存的数据透视表的集合中。刷新该集合中的任何单个数据透视表时,整个集合都会得到刷新。因此,您可以想象刷新工作簿中的每个缓存与刷新工作簿中的每个数据透视表之间的区别是什么。


5

数据透视表工具栏中有一个全部刷新选项。足够了。不必做任何其他事情。

按Ctrl + Alt + F5


3
我不同意。如果Lipis想例如在每次更改单元格时自动执行刷新过程怎么办?
2013年

1

您在VB工作表对象上有一个数据透视表集合。因此,这样的快速循环将起作用:

Sub RefreshPivotTables()
    Dim pivotTable As PivotTable
    For Each pivotTable In ActiveSheet.PivotTables
        pivotTable.RefreshTable
    Next
End Sub

战笔记:

  1. 在更新数据透视表之前,切记要取消保护所有受保护的工作表。
  2. 经常保存
  3. 我会考虑更多并在适当的时候更新... :)

祝好运!


0

编码

Private Sub Worksheet_Activate()
    Dim PvtTbl As PivotTable
        Cells.EntireColumn.AutoFit
        For Each PvtTbl In Worksheets("Sales Details").PivotTables
        PvtTbl.RefreshTable
        Next
End Sub 

工作正常。

该代码在激活工作表模块中使用,因此在激活工作表时它会显示闪烁/毛刺。


0

甚至我们都可以刷新特定的连接,并依次刷新与其链接的所有枢轴。

对于此代码,我已经从Excel中存在的表中创建了切片器

Sub UpdateConnection()
        Dim ServerName As String
        Dim ServerNameRaw As String
        Dim CubeName As String
        Dim CubeNameRaw As String
        Dim ConnectionString As String

        ServerNameRaw = ActiveWorkbook.SlicerCaches("Slicer_ServerName").VisibleSlicerItemsList(1)
        ServerName = Replace(Split(ServerNameRaw, "[")(3), "]", "")

        CubeNameRaw = ActiveWorkbook.SlicerCaches("Slicer_CubeName").VisibleSlicerItemsList(1)
        CubeName = Replace(Split(CubeNameRaw, "[")(3), "]", "")

        If CubeName = "All" Or ServerName = "All" Then
            MsgBox "Please Select One Cube and Server Name", vbOKOnly, "Slicer Info"
        Else
            ConnectionString = GetConnectionString(ServerName, CubeName)
            UpdateAllQueryTableConnections ConnectionString, CubeName
        End If
    End Sub

    Function GetConnectionString(ServerName As String, CubeName As String)
        Dim result As String
        result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
        '"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False"
        GetConnectionString = result
    End Function

    Function GetConnectionString(ServerName As String, CubeName As String)
    Dim result As String
    result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
    GetConnectionString = result
End Function

Sub UpdateAllQueryTableConnections(ConnectionString As String, CubeName As String)
    Dim cn As WorkbookConnection
    Dim oledbCn As OLEDBConnection
    Dim Count As Integer, i As Integer
    Dim DBName As String
    DBName = "Initial Catalog=" + CubeName

    Count = 0
    For Each cn In ThisWorkbook.Connections
        If cn.Name = "ThisWorkbookDataModel" Then
            Exit For
        End If

        oTmp = Split(cn.OLEDBConnection.Connection, ";")
        For i = 0 To UBound(oTmp) - 1
            If InStr(1, oTmp(i), DBName, vbTextCompare) = 1 Then
                Set oledbCn = cn.OLEDBConnection
                oledbCn.SavePassword = True
                oledbCn.Connection = ConnectionString
                oledbCn.Refresh
                Count = Count + 1
            End If
        Next
    Next

    If Count = 0 Then
         MsgBox "Nothing to update", vbOKOnly, "Update Connection"
    ElseIf Count > 0 Then
        MsgBox "Update & Refresh Connection Successfully", vbOKOnly, "Update Connection"
    End If
End Sub

-2

我最近使用了下面列出的命令,它似乎工作正常。

ActiveWorkbook.RefreshAll

希望能有所帮助。


6
它很有帮助..但是您没有看到它实际上写在上面吗?像4年前一样?(stackoverflow.com/a/70976/8418
立卑

-3

如果您使用的是MS Excel 2003,则请转到视图->工具栏->数据透视表从此工具栏中,单击可以刷新!这个符号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.