Tôi có một sổ làm việc với 20 bảng tổng hợp khác nhau. Có cách nào dễ dàng để tìm tất cả các bảng tổng hợp và làm mới chúng trong VBA không?
Câu trả lời:
Đú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
ThisWorkbook.RefreshAll
phương pháp đối với một số lý do không hoạt động, nếu Application.Calculation = xlCalculationManual
. Đặt thuộc tính tính toán Application.Calculation = xlCalculationAutomatic
trước khi sử dụng mã.
Update
sau dấu RefreshTable
không? sự khác biệt giữa hai là gì?
Mã VBA này sẽ làm mới tất cả các bảng / biểu đồ tổng hợp trong sổ làm việc.
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 tùy chọn không có chương trình khác là:
Thao tác này sẽ làm mới bảng tổng hợp mỗi khi mở sổ làm việc.
ActiveWorkbook.RefreshAll
làm mới mọi thứ, không chỉ bảng tổng hợp mà còn cả các truy vấn ODBC. Tôi có một số truy vấn VBA đề cập đến Kết nối dữ liệu và sử dụng tùy chọn này bị lỗi 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 đề xuất tùy chọn nếu bạn chỉ muốn các trục được làm mới
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
Trong những trường hợp nhất định, bạn có thể muốn phân biệt giữa PivotTable và PivotCache của nó. Cache có phương pháp làm mới riêng và các bộ sưu tập của riêng nó. Vì vậy, chúng tôi có thể đã làm mới tất 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 liệu bạn có muốn nó dựa trên bảng trước đó hay không. Nếu bạn nói không, Pivot Table này có bộ nhớ cache của riêng nó và tăng gấp đôi kích thước của dữ liệu nguồn. Nếu bạn nói có, bạn giữ cho WorkBook của mình nhỏ, nhưng bạn thêm vào bộ sưu tập Bảng Pivot dùng chung một bộ nhớ cache. 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 lẻ nào trong bộ sưu tập đó. Do đó, bạn có thể tưởng tượng sự khác biệt có thể là gì giữa việc làm mới mọi bộ đệm trong WorkBook, so với việc làm mới mọi Pivot Table trong WorkBook.
Có một tùy chọn làm mới tất cả trong thanh công cụ Pivot Table. Thế là đủ. Không phải làm bất cứ điều gì khác.
Nhấn ctrl + alt + F5
Bạn có bộ sưu tập PivotTables trên đối tượng VB Worksheet . 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ừ chiến hào:
Chúc may mắn!
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 trang tính kích hoạt, do đó, nó hiển thị nhấp nháy / trục trặc khi trang tính được kích hoạt.
Thậm chí chúng ta có thể làm mới kết nối cụ thể và đến lượt nó, nó sẽ làm mới tất cả các trục được liên kết với nó.
Đối với mã này, tôi đã tạo bộ cắt từ bảng hiện diện 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
Tôi đã sử dụng lệnh được liệt kê bên dưới trong quá khứ gần đây và nó có vẻ hoạt động tốt.
ActiveWorkbook.RefreshAll
Hy vọng rằng sẽ giúp.