我有2个表,一个包含项目列表,另一个是包含这些项目详细信息的数据透视表。我需要做的是从一个表中获取一组数据,根据该数字过滤数据透视表,复制他提供的数据,然后从第一个表移动到下一个项目编号。 我使用了Shai Rado的Excel VBA - Privot table filter multiple criteria部分代码
For k = 1 To 10
conv = Cells(k, 24)
arr(k) = conv
Next
Set PVT = ActiveSheet.PivotTables("PivotTable1")
For Each PivotItem In PVT.PivotFields("Project ID").PivotItems
If Not IsError(Application.Match(PivotItem.Caption, arr, 0)) Then ' check if current item is not in the filter array
PivotItem.Visible = True
Else
PivotItem.Visible = False
End If
Next PivotItem
我遇到的问题是数据透视表中没有项目ID。
例如,我有项目Id 118和156,它们被分配给arr,但是Pivot表不保存那些我得到错误的值。
一种解决方案是运行比较脚本以在运行过滤器之前检查数据透视表是否具有该值,但是使用vlook up或其他FOR命令需要太长时间。如果找不到值,是否有更简单的解决方案可以跳过过滤器?或者触发不同的命令?
使你的数据透视表更新更快的一种方法是在开始搞乱PivotItems之前设置PVT.ManualUpdate = True
,然后将它设置为PVT.ManualUpdate = False
并在它们全部设置后运行PVT.Update
。
这将阻止Excel在每次更改项目时尝试重建数据透视表,而是在最后执行1次大更新。
您是否尝试过添加校验和?从Long
设置为0开始,然后每次设置PivotItem.Visible = True
时加1。如果为0,则表示没有要显示的项目。如果它不是0,那么你知道有多少匹配。作为一个粗略的指南,你正在寻找这样的东西:
For k = 1 To 10
conv = Cells(k, 24)
arr(k) = conv
Next
Set PVT = ActiveSheet.PivotTables("PivotTable1")
Dim lCounter As Long
lCounter = 0
PVT.ManualUpdate = True
For Each PivotItem In PVT.PivotFields("Project ID").PivotItems
If Not IsError(Application.Match(PivotItem.Caption, arr, 0)) Then ' check if current item is not in the filter array
PivotItem.Visible = True
lCounter = lCounter + 1
Else
PivotItem.Visible = False
End If
Next PivotItem
If lCounter < 1 Then
PVT.PivotFields("Project ID").ClearAllFilters 'Show EVERYTHING
MsgBox "None of the specified Projects were found.", vbCritical, ":("
End If
PVT.Update
PVT.ManualUpdate = False