2015-12-21 119 views
2

我有一个带有几百个数据透视表的Excel工作簿。所有数据透视表都使用来自SSAS多维数据集的数据。这些表格的结构基本相同,但它们具有不同的“位置”过滤器。我想要做的是有代码将更改所有表的“日期”过滤器,以便我不需要手动更新每个表。 (不,切片机不适合我)。我对使用VBA非常陌生,所以我有点茫然。我发现了这个代码,我认为这可能会起作用,但是它对我来说确实清除了其他表格上的过滤器......可能是因为我从外部来源提取?任何帮助将不胜感激。使用VBA更改所有数据透视表上的过滤器

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) 
On Error Resume Next 
Dim wsMain As Worksheet 
Dim ws As Worksheet 
Dim ptMain As PivotTable 
Dim pt As PivotTable 
Dim pfMain As PivotField 
Dim pf As PivotField 
Dim pi As PivotItem 
Dim bMI As Boolean 

On Error Resume Next 
Set wsMain = ActiveSheet 
Set ptMain = Target 

Application.EnableEvents = False 
Application.ScreenUpdating = False 

For Each pfMain In ptMain.PageFields 
bMI = pfMain.EnableMultiplePageItems 
For Each ws In ThisWorkbook.Worksheets 
    For Each pt In ws.PivotTables 
     If ws.Name & "_" & pt <> wsMain.Name & "_" & ptMain Then 
      pt.ManualUpdate = True 
      Set pf = pt.PivotFields(pfMain.Name) 
        bMI = pfMain.EnableMultiplePageItems 
        With pf 
         .ClearAllFilters 
         Select Case bMI 
          Case False 
           .CurrentPage = pfMain.CurrentPage.Value 
          Case True 
           .CurrentPage = "(All)" 
           For Each pi In pfMain.PivotItems 
            .PivotItems(pi.Name).Visible = pi.Visible 
           Next pi 
           .EnableMultiplePageItems = bMI 
         End Select 
        End With 
        bMI = False 

      Set pf = Nothing 
      pt.ManualUpdate = False 
     End If 
    Next pt 
Next ws 
Next pfMain 

Application.EnableEvents = True 
Application.ScreenUpdating = True 

End Sub 
+0

所以,你需要刷新所有的枢纽刷新你上面提到的日期列??? –

+0

例如,所有数据透视表中的日期过滤器需要从“Jan 1”更改为“Mar 3” – TSim

回答

0

请尝试下面的代码。

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) 
On Error Resume Next 
Dim wsMain As Worksheet 
Dim ws As Worksheet 
Dim ptMain As PivotTable 
Dim pt As PivotTable 
Dim pfMain As PivotField`enter code here` 
Dim pf As PivotField 
Dim pi As PivotItem 

Dim pvfilter as string 
On Error Resume Next 
Set wsMain = ActiveSheet 
Set ptMain = Target 

Application.EnableEvents = False 
Application.ScreenUpdating = False 
pvfilter = InputBox("Enter the pivot filter string") 
For Each pfMain In ptMain.PageFields 

For Each ws In ThisWorkbook.Worksheets 
    For Each pt In ws.PivotTables 
     If ws.Name & "_" & pt <> wsMain.Name & "_" & ptMain Then 
      pt.ManualUpdate = True 
      Set pf = pt.PivotFields(pfMain.Name) 

        With pf 
         .ClearAllFilters 
           .CurrentPage = pvfilter 
        End With 


      Set pf = Nothing 
      pt.ManualUpdate = False 
     End If 
    Next pt 
Next ws 
Next pfMain 

Application.EnableEvents = True 
Application.ScreenUpdating = True 

End Sub 
+0

什么属于“在此输入代码”?我试图离开代码,它提出了一个错误。如果我消除了这一点并更改了过滤器,那么它为我提供了一个输入框,但它似乎并没有做任何事情。 – TSim

+0

实际上,运行此代码与我之前尝试的代码具有相同的效果。它清除了其他表上的过滤器 – TSim

+0

问题是数据源是否具有层次结构中的信息?当我去过滤器,它有像“+日期”,我需要点击之前,我可以选择指定日期。我如何指定数据的完整路径? – TSim

0

我会建议您更新此代码作为子程序,每当你需要应用过滤器来透视表,而不是直接使用枢轴更新事件的代码运行此宏。

Sub Test() 
On Error Resume Next 
Dim wsMain As Worksheet 
Dim ws As Worksheet 
Dim ptMain As PivotTable 
Dim pt As PivotTable 
Dim pfMain As PivotField 
Dim pf As PivotField 
Dim pi As PivotItem 

Dim pvfilter As String 
On Error Resume Next 
Set wsMain = ActiveSheet 
Set ptMain = Target 

Application.EnableEvents = False 
Application.ScreenUpdating = False 
pvfilter = InputBox("Enter the pivot filter string") 
For Each pfMain In ptMain.PageFields 

For Each ws In ThisWorkbook.Worksheets 
    For Each pt In ws.PivotTables 
     If ws.Name & "_" & pt <> wsMain.Name & "_" & ptMain Then 
      pt.ManualUpdate = True 
      Set pf = pt.PivotFields(pfMain.Name) 

        With pf 
         .ClearAllFilters 
           .CurrentPage = pvfilter 
        End With 


      Set pf = Nothing 
      pt.ManualUpdate = False 
     End If 
    Next pt 
Next ws 
Next pfMain 

Application.EnableEvents = True 
Application.ScreenUpdating = True 

End Sub 
相关问题