VBA-循环数据透视表筛选提取

VBA-循环数据透视表筛选提取,vba,excel,Vba,Excel,下面的代码将过滤器应用于数据透视表,然后从数据透视表复制特定数据并删除过滤器。。问题是,这一块代码使用了22次,子代码太长了 以下是我仅有的一个代码块的代码: Option Explicit Sub FilterPivotTable() Dim rLastCell As Range Dim PvtTbl As PivotTable Dim ws1 As Worksheet, ws2 As Worksheet

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

以下是我仅有的一个代码块的代码:

    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个不同的代码块执行相同的功能

这就是透视表结构的外观:


过滤器是在rows块下完成的,在漏洞名称上完成的。我担心这有点像是在暗箱操作

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

因此,您正在尝试更改ws1.PivotTables(“P1”).PivotFields(“漏洞名称”).PivotFilters添加类型:=xlCaptionContains,值1:=“Microsoft Windows”?@QHarr是,正在尝试将“Microsoft Windows”更改为“Adobe Reader”,并在With语句中再次出现特定单元格引用-这也需要为每个筛选器增加一个增量。。因此,MS Windows将粘贴在前3列的第一行,然后adobe将粘贴在下一行,然后MS Office将粘贴在下一行,依此类推。是否要在数据透视字段中循环所有项目?这是显而易见的事情,即使你只追求几项。另外,要小心With语句中的With语句。@QHarr第二个选择你是个天才!这是伟大的工作!哇!有三件事我只想知道:1)在汇总表上,每次粘贴后,它跳过一行,然后粘贴下一个过滤数据2)当我在汇总表上时,该表不会更新,我需要单击另一张表,当我返回汇总表时,它已被更新3)您对“总计”的评论没错,我现在会更新答案。对于1)您只需将.Cells(LastRow1+2,3)更改为.Cells(LastRow1+1,3)etcTbh,正如Rado先生所指出的,这可以更好地进行编码。所以我为你们改变了第一点。第二点我不知道为什么。我已经为PvtTbl.ManualUpdate注释掉了你的两行,如果没有差异,你可以再次取消注释。谢谢你,这太完美了。你注释掉的行不起作用,但很好。我很高兴,非常感谢你的帮助!谢谢:)那就祝你快乐吧