【问题标题】:VBA - Loop Pivot Table Filtering ExtractVBA - 循环数据透视表过滤提取
【发布时间】:2018-04-08 13:00:37
【问题描述】:

我有以下代码将过滤器应用于数据透视表,然后从数据透视表复制特定数据并删除过滤器。问题是,这一段代码使用了 22 次,子是 waaaay太长。

这是我只有一个块的代码:

    Option Explicit

        Sub FilterPivotTable()

        Dim rLastCell As Range
        Dim PvtTbl As PivotTable
        Dim ws1 As Worksheet, ws2 As Worksheet
        Dim LastRow1 As Long
        Set ws1 = ActiveWorkbook.Sheets("PivotTable")
        Set ws2 = ActiveWorkbook.Sheets("Summary")
        Dim rowCount As Long

            LastRow1 = ws1.Cells(Rows.Count, 1)

            'Microsoft Windows
            Application.ScreenUpdating = False

            ws1.PivotTables("P1").ManualUpdate = True

            ws1.PivotTables("P1").PivotFields(" Vulnerability Name").ClearAllFilters

    '---------------Block Starts Here---------------

            ws1.PivotTables("P1").PivotFields(" Vulnerability Name").PivotFilters. _
            Add Type:=xlCaptionContains, Value1:="Microsoft Windows"

            ws1.PivotTables("P1").ManualUpdate = False
            Application.ScreenUpdating = True

            With ws1.PivotTables(1).TableRange1
                Set rLastCell = .Cells(.Rows.Count, .Columns.Count)
                Set PvtTbl = Worksheets("PivotTable").PivotTables("P1")
                rLastCell.Copy

                With ws2

                    .Cells(LastRow1 + 2, 3).PasteSpecial xlPasteValues
                    .Range("$B$2").Value = "Microsoft Windows"

                    rowCount = PvtTbl.DataBodyRange.Rows.Count
                    .Range("$D$2") = rowCount - 1

                End With

            End With

            ws1.PivotTables("P1").PivotFields(" Vulnerability Name").ClearAllFilters

'---------------Block Ends Here---------------

        End Sub

此代码块在整个子程序中重复了 22 次,每次仅更改漏洞名称,即将 'Microsoft Windows' 更改为 'Adobe',然后更改将数据复制到汇总表的位置的单元格引用。

我希望有一个循环访问漏洞名称的代码块,而不是让 22 个不同的代码块执行相同的功能。

这是透视表结构的样子:

过滤器在行块下完成,并在漏洞名称上完成

【问题讨论】:

  • 所以您正在尝试更改 ws1.PivotTables("P1").PivotFields("Vulnerability Name").PivotFilters。 _ 添加类型:=xlCaptionContains, Value1:="Microsoft Windows" ?
  • @QHarr 是的,尝试将“Microsoft Windows”更改为“Adobe Reader”以及在 With 语句中它再次出现特定单元格引用 - 每个过滤器也需要有一个增量.. 所以 MS Windows 将被粘贴在前 3 列的第一行,然后是 adobe 在下一行,然后是 MS Office 在下一个,依此类推
  • 您打算循环数据透视字段中的所有项目吗?即使您只追求几项,这也是显而易见的事情。
  • 另外,注意With语句中的With语句。
  • @QHarr 第二个选项

标签: vba excel


【解决方案1】:

恐怕这有点像在黑暗中冒险

Option Explicit

Sub FilterPivotTable()

    Dim rLastCell As Range
    Dim PvtTbl As PivotTable
    Dim ws1 As Worksheet, ws2 As Worksheet

    Set ws1 = ActiveWorkbook.Sheets("PivotTable")
    Set ws2 = ActiveWorkbook.Sheets("Summary")

    Dim rowCount As Long
    Dim LastRow1 As Long
    Dim pvtField As PivotField

    Set PvtTbl = ws1.PivotTables("P1")

    Application.ScreenUpdating = False

    Set pvtField = PvtTbl.PivotFields(" Vulnerability Name") 'extend etc as required

    Dim myArr()
    myArr = Array("Microsoft Windows", "Adobe Reader", "Other")

    'PvtTbl.ManualUpdate = False

    Dim i As Long

    For i = LBound(myArr) To UBound(myArr)

        pvtField.ClearAllFilters
        pvtField.PivotFilters. _
        Add Type:=xlCaptionContains, Value1:=myArr(i)

        With ws1.PivotTables(1).TableRange1
            Set rLastCell = .Cells(.Rows.count, .Columns.count) 'grand total?
        End With

        With ws2
            LastRow1 = ws2.Cells(ws2.Rows.count, 3).End(xlUp).row
            rLastCell.Copy
            .Cells(LastRow1 + 1, 3).PasteSpecial xlPasteValues
            .Cells(LastRow1 + 1, 2).Value = myArr(i)
            rowCount = PvtTbl.DataBodyRange.Rows.count
            .Cells(LastRow1 + 1, 4) = rowCount - 1
        End With

    Next i

    Application.ScreenUpdating = True
    'PvtTbl.ManualUpdate = False
End Sub

【讨论】:

  • 你是个天才!这很好用!哇。我只想找出三件小事:1)在摘要表上,每次粘贴后,它会跳过一行然后粘贴下一个过滤的数据2)当我在上面时,表没有更新,我需要点击另一个表,当我返回摘要表时,它已更新 3)您对“总计”的评论是正确的
  • 我现在会更新答案。对于 1) 你只需将 .Cells(LastRow1 + 2, 3) 更改为 .Cells(LastRow1 + 1, 3) 等
  • Tbh 正如 Rado 先生所指出的,这可以更好地编码。所以我为你改变了第1点。第2点我不知道为什么。我已经临时注释掉了 PvtTbl.ManualUpdate 的两行,如果没有区别,您可以再次取消注释。
  • 谢谢你这是完美的。您注释掉的行没有用,但很好。我对此感到满意,非常感谢您的帮助!谢谢你:)
  • 那么快乐的日子
猜你喜欢
  • 2019-07-05
  • 2016-05-14
  • 2019-11-14
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
相关资源
最近更新 更多