Excel VBA - 数据透视表过滤多个不确定标准

问题描述 投票:2回答:1

我有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命令需要太长时间。如果找不到值,是否有更简单的解决方案可以跳过过滤器?或者触发不同的命令?

vba excel-vba
1个回答
0
投票

在我们开始之前:

使你的数据透视表更新更快的一种方法是在开始搞乱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
© www.soinside.com 2019 - 2024. All rights reserved.