Refreshing all the pivot tables in my excel workbook with a macro

前端 未结 10 1331
长发绾君心
长发绾君心 2020-11-29 20:32

I have a workbook with 20 different pivot tables. Is there any easy way to find all the pivot tables and refresh them in VBA?

相关标签:
10条回答
  • 2020-11-29 20:35

    If you are using MS Excel 2003 then go to view->Tool bar->Pivot Table From this tool bar we can do refresh by clicking ! this symbol.

    0 讨论(0)
  • 2020-11-29 20:40

    This VBA code will refresh all pivot tables/charts in the workbook.

    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
    

    Another non-programatic option is:

    • Right click on each pivot table
    • Select Table options
    • Tick the 'Refresh on open' option.
    • Click on the OK button

    This will refresh the pivot table each time the workbook is opened.

    0 讨论(0)
  • 2020-11-29 20:44

    There is a refresh all option in the Pivot Table tool bar. That is enough. Dont have to do anything else.

    Press ctrl+alt+F5

    0 讨论(0)
  • 2020-11-29 20:45

    The code

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

    works fine.

    The code is used in the activate sheet module, thus it displays a flicker/glitch when the sheet is activated.

    0 讨论(0)
  • 2020-11-29 20:48

    In certain circumstances you might want to differentiate between a PivotTable and its PivotCache. The Cache has it's own refresh method and its own collections. So we could have refreshed all the PivotCaches instead of the PivotTables.

    The difference? When you create a new Pivot Table you are asked if you want it based on a previous table. If you say no, this Pivot Table gets its own cache and doubles the size of the source data. If you say yes, you keep your WorkBook small, but you add to a collection of Pivot Tables that share a single cache. The entire collection gets refreshed when you refresh any single Pivot Table in that collection. You can imagine therefore what the difference might be between refreshing every cache in the WorkBook, compared to refreshing every Pivot Table in the WorkBook.

    0 讨论(0)
  • 2020-11-29 20:48

    Even we can refresh particular connection and in turn it will refresh all the pivots linked to it.

    For this code I have created slicer from table present in 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
    
    0 讨论(0)
提交回复
热议问题