【问题标题】:trying to add filter to pivot using vba尝试使用 vba 将过滤器添加到枢轴
【发布时间】:2018-04-05 19:58:48
【问题描述】:

我正在尝试在数据透视表上运行 vba,因为我需要为我的报告更新 50 多个表,这只有在我可以使用 vba 执行此操作时才能节省时间。

使用 vba,我可以将数据透视表中的结果直接复制到同一工作簿的另一张工作表的单元格中。我在尝试添加过滤器时遇到了困难。

我能够运行获得摘要信息的第一部分,现在我正在尝试添加 "Revised Territory" 过滤器,我想过滤 "SE" 然后它什么也没做。

我使用 F8 进行检查,看起来它只是通过而没有任何错误,但没有添加任何过滤器,所以我得到了与我的摘要数据相同的信息.

我的代码

Sub InsertPivotTable()

''''''''''''''''''
'''Pivot Set Up'''
''''''''''''''''''
'Declare Variables
Dim PSheet As Worksheet
Dim DSheet As Worksheet
Dim SSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PRange As Range
Dim LastRow As Long
Dim LastCol As Long

'Insert a New Blank Worksheet
On Error Resume Next

Sheets.Add Before:=ActiveSheet
ActiveSheet.Name = "PivotTable"
Application.DisplayAlerts = True
Set PSheet = Worksheets("PivotTable")
Set DSheet = Worksheets("PIF Data")
Set SSheet = Worksheets("Summary")

'Define Data Range
LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = 76
Set PRange = DSheet.Cells(1, 1).Resize(LastRow, LastCol)

'''''''''
'Summary'
'''''''''
'Define Pivot Cache
Set PCache = ActiveWorkbook.PivotCaches.Create _
    (SourceType:=xlDatabase, SourceData:=PRange). _
    CreatePivotTable(TableDestination:=PSheet.Cells(3, 1), _
    TableName:="NB Summary")

'Insert Blank Pivot Table
Set PTable = PCache.CreatePivotTable _
    (TableDestination:=PSheet.Cells(1, 1), TableName:="NB Summary")
Dim Pvt As PivotTable
Set Pvt = Worksheets("PivotTable").PivotTables("NB Summary")

'Add fields to rows & values, re-name title of value
With Pvt
    .PivotFields("Policy Form").Orientation = xlColumnField
.PivotFields("Phone/Email").Orientation = xlRowField
    .AddDataField .PivotFields("Policy Number"), "Count of Policy Number", xlCount
End With

PSheet.Range("B5:B6").Copy
SSheet.Range("E6").PasteSpecial Paste:=xlPasteValues
PSheet.Range("C5:C6").Copy
SSheet.Range("G6").PasteSpecial Paste:=xlPasteValues

''''
'SE'
''''
With Pvt
    .ClearAllFilters
    .PivotFields("Revised Territory").PivotFilter.Add Type:=xlCaptionContains, Value1:="SE"
End With

PSheet.Range("B5:B6").Copy
SSheet.Range("E12").PasteSpecial Paste:=xlPasteValues
PSheet.Range("C5:C6").Copy
SSheet.Range("G12").PasteSpecial Paste:=xlPasteValues

'Delete PivotTable Sheet
Application.DisplayAlerts = False
Worksheets("PivotTable").Delete
Application.DisplayAlerts = True

End Sub

【问题讨论】:

  • 删除“on error resume next”行,这样您就可以查看发生的位置和错误(“on error resume next”会导致它被忽略)
  • @sc1324 你有什么理由不简单地使用数据透视表本身作为报告?鉴于您在下面的评论,听起来这只是您报告“难题”的一部分。如果您预先提供更多关于您的最终目标的背景信息,您可能不需要问那么多后续问题。
  • 嗨,对不起,我没有指定这个特定项目的要求,我的目的是尝试自己做这件事,所以我不想在身体,没有做任何事情,并试图在这里获得免费通行证。

标签: vba excel pivot-table


【解决方案1】:

试试下面的代码,代码的cmets中有详细的解释。

修改后的代码

Option Explicit

Sub InsertPivotTable()

''''''''''''''''''
'''Pivot Set Up'''
''''''''''''''''''
'Declare Variables
Dim PSheet As Worksheet
Dim DSheet As Worksheet
Dim SSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PFld As PivotField
Dim PItm As PivotItem
Dim PRange As Range
Dim LastRow As Long, LastCol As Long

' --- Check if there's already a sheet named "PivotTable" ---
On Error Resume Next
Set PSheet = ThisWorkbook.Sheets("PivotTable")
On Error GoTo 0
If PSheet Is Nothing Then ' there's no sheet named "PivotTable" >> create one
    Set PSheet = ThisWorkbook.Sheets.Add(Before:=ActiveSheet)
    PSheet.Name = "PivotTable"
End If

Application.DisplayAlerts = True

Set DSheet = Worksheets("PIF Data")
Set SSheet = Worksheets("Summary")

'Define Data Range
With DSheet
    LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    LastCol = 76 ' <-- you have 76 Colkumns of Data ??!
    Set PRange = .Cells(1, 1).Resize(LastRow, LastCol)
End With

'''''''''
'Summary'
'''''''''
' Set Pivot Cache object
Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange.Address(False, False, xlA1, xlExternal))

' create a new Pivot Table in "PivotTable" sheet, start from Cell A1
Set PTable = PSheet.PivotTables.Add(PivotCache:=PCache, TableDestination:=PSheet.Range("A1"), TableName:="NB Summary")

' Add fields to rows & values, re-name title of value
With PTable
    .PivotFields("Policy Form").Orientation = xlColumnField
    .PivotFields("Phone/Email").Orientation = xlRowField
    .AddDataField .PivotFields("Policy Number"), "Count of Policy Number", xlCount
End With

PSheet.Range("B5:B6").Copy
SSheet.Range("E6").PasteSpecial Paste:=xlPasteValues
PSheet.Range("C5:C6").Copy
SSheet.Range("G6").PasteSpecial Paste:=xlPasteValues

''''
'SE'
''''
' ===== Filter PivotField "Revised Territory" section according to "SE" =====
With PTable
    .ClearAllFilters

    ' set PivotField "Revised Territory"
    Set PFld = .PivotFields("Revised Territory")

    With PFld
        .Orientation = xlPageField
        .Position = 1

        ' loop through PivotField "Revised Territory" pivot-items
        For Each PItm In .PivotItems
            If PItm.Caption = "SE" Then
                PItm.Visible = True
            Else
                PItm.Visible = False
            End If
        Next PItm
    End With
End With

PSheet.Range("B5:B6").Copy
SSheet.Range("E12").PasteSpecial Paste:=xlPasteValues
PSheet.Range("C5:C6").Copy
SSheet.Range("G12").PasteSpecial Paste:=xlPasteValues

'Delete PivotTable Sheet
Application.DisplayAlerts = False
PSheet.Delete
Application.DisplayAlerts = True

End Sub

【讨论】:

  • 是的,我有 76 列数据。亲爱的,你的代码拯救了我的一天。现在我可以继续了。请继续关注更多问题,哈哈。谢谢。
  • 在 PivotField 中循环 PivotItems 很慢...特别是如果您没有将 PivotTable .ManualUpdate 属性设置为 TRUE,因为 PivotTable 在每个数据透视表更改后都会刷新。鉴于 PivotFields("Revised Territory") 是一个 PageField,在任何情况下都不需要循环遍历它,因为您可以简单地使用 PFld.CurrentPage = "SE" 从而完全避免循环。我在dailydoseofexcel.com/archives/2013/11/14/… 上写了一篇相当全面的博文,其中包含有关如何有效循环 PivotItems 的更多信息
  • @jeffreyweir 我知道这个选项,但我仍然更喜欢使用这种方法。此外,定义慢速,我也将此选项用于 ~200 Pivot items ,但整个代码仍然运行,包括一些繁重的复制>>粘贴不到 0.5 秒。我可以忍受
  • 当然,200 个 PivotItems 不算什么。但不问,谁知道 PivotField 中是否有 200 或 200,000 个项目?正如我链接到的那篇文章所显示的,如果一个 Pivot 有 20,000 个项目,那么循环这些项目、检查状态并进行更改将需要四分钟以上的时间。事实上,如果您将 ManualUpdate 设置为 FALSE,它会花费更长的时间。
猜你喜欢
  • 2015-07-31
  • 2018-08-26
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2015-09-04
相关资源
最近更新 更多