Excel VBA-Privot表筛选器多个不确定条件

时间:2018-09-05 05:18:37

标签: vba excel-vba

我有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命令会花费太长时间。如果没有找到值,是否有更简单的解决方案只是跳过过滤器?还是触发其他命令?

1 个答案:

答案 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