2016-06-14 5 views
1

Привет У меня есть сводная таблица, которую мне нужно обновить командой VBA. Однако, когда я обновляю сводную команду, она исключает некоторые требуемые значения метки столбца. Я считаю, что мне нужно изменить Pivot Cache, который был настроен изначально, но не уверен, как это сделать? (Может кто-нибудь посоветовать, как это сделать?)Pivot Cache Обновить VBA

код я использую ниже:

Worksheets("Summary by Account").PivotTables("PivotTable1").RefreshTable 

Dim pt As PivotTable 
Dim pf As PivotField 
Dim pi As PivotItem 
For Each pt In ActiveSheet.PivotTables 
    pt.ManualUpdate = True 
    pt.PivotCache.MissingItemsLimit = xlMissingItemsNone 
    For Each pf In pt.PivotFields 
     If pf.Orientation <> 0 Then 
      If pf.Orientation = xlPageField Then 
       pf.CurrentPage = "(All)" 
      Else 
       For Each pi In pf.PivotItems 
        pi.Visible = True 
       Next pi 
      End If 
     End If 
    Next pf 
    pt.ManualUpdate = False 
Next pt 
Set pi = Nothing 
Set pf = Nothing 
Set pt = Nothing 
Set wks = Nothing 

With ActiveSheet.PivotTables("PivotTable1").PivotFields("Nominal/Category") 
    .PivotItems("(blank)").Visible = False 
End With 

ответ

1

Я использую следующий код, чтобы обновить свою сводную таблицу кэша, мой исходный файл находится в удаленном рабочей книги, поэтому вы можете настроить параметры в соответствии с вашими потребностями.

Const Pivot_sht_str    As String = "Summary by Account" 
Const Pivot_name_str   As String = "PivotTable1" 
Dim pt       As PivotTable 

Dim Data_FilePath    As String 
Dim Data_book     As String 
Dim Data_sht_str    As String 
Dim Data_sht     As Worksheet 
Dim Data_range     As Range 
Dim Data_range_str    As String 
Dim lrow      As Long 

' Asign Pivot table to pt 
Set pt = Worksheets(Pivot_sht_str).PivotTables(Pivot_name_str) 

' Asign Pivot's Data source parameters >> this part is needed only if source for PIVOT table is data in another workbook 
Data_FilePath = "\\Folder\Nested Folder\Nested Folder 2\" 'modify to your needs 
Data_book = "File_Name.xlsx" 'modify to your needs 
Data_sht_str = "Worksheet Name" 'modify to your needs 

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 
On Error Resume Next 
Workbooks.Open (Data_FilePath & Data_book) 

Set Data_sht = ActiveWorkbook.Worksheets(Data_sht_str) 
lrow = Data_sht.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row 
Data_range_str = Data_sht.Name & "!" & Range("$A$1:$P$" & lrow).Address '.Address(ReferenceStyle:=xlR1C1) ' adjust Columns to your needs 
Set Data_range = Data_sht.Range(Data_range_str) 

' check if Data Range consists of a legal range, Workbook and worksheet are legal 
If Not Data_range Is Nothing Then 
    Data_range_str = Data_FilePath & "[" & Data_book & "]" & Data_sht.Name & "!" & Range("$A$1:$P$" & lrow).Address 

    'Change Pivot Table Data Source Range Address (refresh it's cache data) 
    pt.ChangePivotCache ThisWorkbook.PivotCaches.Create(xlDatabase, Data_range_str, xlPivotTableVersion12) ' verify last parameter to have the correct Excel version 
    pt.RefreshTable 
    On Error Resume Next 

    ActiveWorkbook.Close (False) ' Workbooks(Data_FilePath & Data_book).Close savechanges:=False 
End If 

Application.ScreenUpdating = True 
Application.DisplayAlerts = True 

If Data_range Is Nothing Then Exit Sub 
1

Мой метод к обновлению шарнирных кэшей с новой информацией, чтобы хранить все данные на отдельный лист в пределах рабочей книги и поместить в формуле, проходящий диапазона по имени Диапазон - с этой формулой

=OFFSET($A$1,0,0,COUNTA($A:$A),COUNTA($1:$1)) 

Затем в VBA используйте:

ThisWorkbook.RefreshAll 

Надеюсь, что это поможет!

0

Я использую этот код для сброса всех кэшей сводных таблиц во всей книге и предотвращения выпадающих фильтров сводной таблицы от отсутствия отсутствующих элементов, которые фактически не существуют в базовых данных.

Sub PivotCacheReset() 
' When a data set is pivoted and then some of the underlying data is 
' removed, even after a refresh old removed values can still remain in the 
' pivot filter. This macro changes the properties of all pivot tables in 
' the active workbook, to prevent missing items from appearing, or clear 
' items that have appeared. It also resets all pivot table caches in the 
' active workbook. 

    Dim wb As Workbook 
    Set wb = ActiveWorkbook 

    Dim iWs As Worksheet 
    Dim pvt As PivotTable 
    Dim iProtectState As Boolean 

    ' Loop through each worksheet. 
    For Each iWs In wb.Worksheets 

     ' If the worksheet is protected, unprotect it. Remember 
     ' it was protected so that it can be re-protected later. 
     iProtectState = False     ' Reset variable that remembers if each sheet is protected. 
     If iWs.ProtectContents = True Then 
      ' Worksheet is protected. 
      iWs.Unprotect      ' Unprotect the worksheet. 
      iProtectState = True     ' Remember that this worksheet was protected. 
     End If 

     ' Loop through each pivot table in the sheet. 
     For Each pvt In iWs.PivotTables 
      pvt.PivotCache.MissingItemsLimit = xlMissingItemsNone ' Don't allow missing items in the pivot table filters. 
      pvt.PivotCache.Refresh    ' Reset the pivot table cache including any missing items. 
     Next pvt 

     ' If the worksheet was originally protected, re-protect it. 
     If iProtectState = True Then iWs.Protect 

    Next iWs 

End Sub 
Смежные вопросы