it-swarm-vi.tech

Làm mới tất cả các bảng xoay vòng trong sổ làm việc Excel của tôi bằng macro

Tôi có một bảng tính với 20 bảng trụ khác nhau. Có cách nào dễ dàng để tìm tất cả các bảng trụ và làm mới chúng trong VBA không?

78
Lipis

Vâng.

ThisWorkbook.RefreshAll

Hoặc, nếu phiên bản Excel của bạn đủ cũ,

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
158
GSerg

Mã VBA này sẽ làm mới tất cả các bảng/biểu đồ trục trong bảng tính.

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

Một lựa chọn phi lập trình khác là:

  • Nhấp chuột phải vào mỗi bảng trụ
  • Chọn tùy chọn bảng
  • Chọn tùy chọn 'Làm mới khi mở'.
  • Bấm vào nút OK

Điều này sẽ làm mới bảng xoay vòng mỗi khi bảng tính được mở.

25
Robert Mearns

ActiveWorkbook.RefreshAll làm mới mọi thứ, không chỉ các bảng xoay vòng mà cả các truy vấn ODBC. Tôi có một vài truy vấn VBA đề cập đến các kết nối Dữ liệu và sử dụng tùy chọn này gặp sự cố khi lệnh chạy các kết nối Dữ liệu mà không có chi tiết được cung cấp từ VBA

Tôi khuyên bạn nên tùy chọn nếu bạn chỉ muốn làm mới pivots

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

Trong một số trường hợp nhất định, bạn có thể muốn phân biệt giữa PivotTable và PivotCache. Cache có phương thức làm mới riêng và các bộ sưu tập riêng. Vì vậy, chúng tôi có thể đã làm mới tất cả các PivotCaches thay vì PivotTable.

Sự khác biệt? Khi bạn tạo Bảng Pivot mới, bạn sẽ được hỏi nếu bạn muốn nó dựa trên bảng trước đó. Nếu bạn nói không, Bảng Pivot này sẽ có bộ đệm riêng và nhân đôi kích thước của dữ liệu nguồn. Nếu bạn nói có, bạn giữ Sổ làm việc của mình nhỏ, nhưng bạn thêm vào bộ sưu tập Bảng Pivot chia sẻ một bộ đệm. Toàn bộ bộ sưu tập được làm mới khi bạn làm mới bất kỳ Bảng Pivot nào trong bộ sưu tập đó. Do đó, bạn có thể tưởng tượng sự khác biệt có thể có giữa việc làm mới mọi bộ đệm trong WorkBook, so với làm mới mọi Bảng Pivot trong WorkBook.

8
Steve WahWah Weeks

Có một tùy chọn làm mới tất cả trong thanh công cụ Bảng Pivot. Thế là đủ. Không phải làm bất cứ điều gì khác.

Nhấn ctrl + alt + F5

5
Prasenjit

Bạn có bộ sưu tập PivotTable trên bảng tính VB vật. Vì vậy, một vòng lặp nhanh như thế này sẽ hoạt động:

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

Ghi chú từ các chiến hào:

  1. Hãy nhớ bỏ bảo vệ bất kỳ trang tính được bảo vệ nào trước khi cập nhật PivotTable.
  2. Lưu thường xuyên.
  3. Tôi sẽ nghĩ thêm và cập nhật trong khóa học do ... :)

Chúc may mắn!

1
LohanJ

Thậm chí chúng ta có thể làm mới kết nối cụ thể và đến lượt nó sẽ làm mới tất cả các pivots được liên kết với nó.

Đối với mã này, tôi đã tạo bộ cắt từ bảng có trong 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
Rajiv Singh

Mật mã

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

hoạt động tốt.

Mã được sử dụng trong mô-đun bảng kích hoạt, do đó, nó sẽ hiển thị nhấp nháy/trục trặc khi trang tính được kích hoạt.

0
user3564681