我有 2 个表,一个包含项目列表,另一个是包含这些项目详细信息的数据透视表。我需要做的是从一个表中取出一组项目编号,根据该编号过滤数据透视表,复制他提供的数据,然后从第一个表移至下一个项目编号。
我使用了 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,但数据透视表不包含我收到错误的那些值。
一种解决方案是在运行过滤器之前运行比较脚本来检查数据透视表是否具有该值,但使用 vlook up 或其他 FOR 命令需要太长时间。如果找不到值,是否有任何更简单的解决方案可以跳过过滤器?还是触发不同的命令?
最佳答案
在我们开始之前:
使数据透视表更新更快的一种方法是设置 PVT.ManualUpdate = True
在开始弄乱 PivotItems 之前,请将其设置为 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
关于vba - Excel VBA - 数据透视表过滤多个不确定标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52177545/