【发布时间】: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 第二个选项