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

使用宏刷新excel工作簿中的所有数据透视表,excel,vba,refresh,Excel,Vba,Refresh,我有一个包含20个不同数据透视表的工作簿。有什么简单的方法可以找到所有透视表并在VBA中刷新它们吗?有 ThisWorkbook.RefreshAll 或者,如果您的Excel版本足够旧 Dim Sheet as WorkSheet, Pivot as PivotTable For Each Sheet in ThisWorkbook.WorkSheets For Each Pivot in Sheet.PivotTables Pivot.RefreshTable

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

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
在VB工作表对象上有一个数据透视表集合。因此,像这样的快速循环将起作用:

Sub RefreshPivotTables()
    Dim pivotTable As PivotTable
    For Each pivotTable In ActiveSheet.PivotTables
        pivotTable.RefreshTable
    Next
End Sub
战壕中的注释:

  • 请记住在更新数据透视表之前取消对任何受保护工作表的保护
  • 经常保存
  • 我会考虑更多,并在适当的时候更新…:)
    祝你好运

    此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
    
    另一个非编程选项是:

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

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

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


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


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

    如果您使用的是MS Excel 2003,请从此工具栏转到“查看->工具栏->数据透视表”,我们可以通过单击进行刷新!此符号。

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

    ActiveWorkbook.RefreshAll
    

    希望对您有所帮助。

    ActiveWorkbook.RefreshAll
    不仅刷新透视表,而且刷新ODBC查询。我有两个VBA查询,它们引用数据连接,使用此选项会在命令运行数据连接时崩溃,而没有VBA提供的详细信息

    如果只希望刷新数据透视,我建议使用此选项

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

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


    该代码用于激活工作表模块,因此当工作表被激活时,它会显示闪烁/故障。

    甚至我们可以刷新特定的连接,反过来它会刷新链接到它的所有枢轴

    对于这段代码,我已经从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
    

    这很有帮助。。但你没看到上面写的吗?就像4年前?!()检查得票最多的答案。。第二种方法实际上就是你在这里尝试过的。。但对于整个繁荣来说。。不仅适用于活动工作表。。这两种情况都要视情况而定。。从那以后我就没碰过它..如果透视表不在活动表中怎么办?我不同意。如果Lipis想要自动化刷新过程,例如,每当一个单元格被更改时,该怎么办?噢,一个否决票。五年多之后,这是一个令人耳目一新的变化;)的确真令人耳目一新。。有人甚至试图把这个问题作为离题来结束。。。这不像我要求只使用鼠标或任何东西来完成的那样:DFantastic,我必须使用它,因为我想在获得新的外部数据后刷新数据透视,所以这个工作簿.RefreshAll对我不起作用。只是一个注释。如果
    Application.Calculation=xlCalculationManual
    ,则此工作簿.RefreshAll方法因某种原因不起作用。在使用代码之前,请将calculation属性设置为
    Application.calculation=xlCalculationAutomatic
    。@GSerg很抱歉恢复此旧帖子,但我有一个问题(已发布):我们是否需要在
    刷新表后进行
    更新
    ?这两者有什么区别?