我有2个表,一个包含项目列表,另一个是包含这些项目详细信息的数据透视表。我需要做的是从一个表中获取一组对象的几个项目编号,根据该编号过滤数据透视表,复制他提供的数据,然后从第一个表移至下一个项目编号。
我使用了Excel VBA - Privot table filter multiple criteria中的部分代码
通过Shai Rado
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,但是数据透视表没有保存这些值,我得到了一个错误。
一种解决方案是运行比较脚本,以在运行过滤器之前检查数据透视表是否具有该值,但是为此使用vlookup或另一个FOR命令会花费太长时间。如果没有找到值,是否有更简单的解决方案只是跳过过滤器?还是触发其他命令?
答案 0 :(得分:0)
使PivotTable更新更快的一种方法是在开始与PivotItem混淆之前设置PVT.ManualUpdate = True
,然后将其设置为PVT.ManualUpdate = False
,并在所有设置完成后运行PVT.Update
。 / p>
这将阻止Excel在每次更改项目时尝试 重建数据透视表,而在最后进行1次大更新。
您是否尝试过仅添加校验和?首先将Long
设置为0,然后每次将PivotItem.Visible = True
设置为1。如果为0,则没有要显示的项目。如果它不是 not 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