过滤数据透视表的最后一项 (vba)

Posted

技术标签:

【中文标题】过滤数据透视表的最后一项 (vba)【英文标题】:Filter Last items of Pivot table (vba) 【发布时间】:2019-08-06 05:20:24 【问题描述】:

SNapshot 我有一个只需要显示最后 13 个项目(周)的数据透视表。下面是我使用的代码。但是,无论透视中项目的可见状态如何,它都不会改变,甚至强制它为真/假。已经尝试过 if/else 语句,但仍然可见状态没有改变。

感谢您对此的帮助。谢谢!

Sub ShowLastXDays()
Dim pi As PivotItem
Dim lLoop As Long
Dim pt As PivotTable
Dim pf As PivotField
Dim lCount As Long
Dim lDays As Long
Dim Count As Long

On Error Resume Next
lDays = 13


' Application.ScreenUpdating = False
Set pt = ActiveSheet.PivotTables("WeeklyPivot")
' Count = pt.PivotFields("[FTYieldData].[Week].[Week]").PivotItems.Count

  Set pf = ActiveSheet.PivotTables("WeeklyPivot").PivotFields("[FTYieldData].[Week].[Week]")

        For Each pi In pf.PivotItems
            pi.Visible = False  'issue encountered. after False code, pi.VISIBLE value remains TRUE (not skipped)
        Next pi

    With pt.PivotFields("[FTYieldData].[Week].[Week]")
        Count = .PivotItems.Count
        For lLoop = .PivotItems.Count To 1 Step -1
            .PivotItems(lLoop).Visible = True  'issue encountered. after TRUE code, since earlier it was not change to FALSE (no error encountered)
            lCount = lCount + 1
            If lCount = lDays Then Exit For
        Next lLoop
    End With

  On Error GoTo 0

【问题讨论】:

您是否尝试使用 F8 运行您的?如果不能,您可以这样做,并在每个步骤中查看正在执行的内容以及正在跳过的内容。 @Mikku 我试过这样做,没有任何内容被跳过。事实上所有的行都在执行。如果项目可见 (TRUE),使用上面的行将其设置为 false 不会使项目隐藏并仍保持为 TRUE。 这是我认为的问题。删除行 .ClearAllFilters 并尝试运行您的代码。此行使所有项目可见,使您之前的循环无用。 已经在代码中删除了它,但对于 TRUE(后者)和 FALSE(代码的早期部分)值仍然存在。 第一个代码 pi.Visible = False 上显示错误。我添加了一个 If 语句,仅当它为真时才将其设为 FALSE。但是,在第一项中,Visible 是 TRUE,即使它没有在枢轴中被选中。 【参考方案1】:

问题:

.ClearFilters 在您的代码中使所有项目一次可见。因此,隐藏所有项目的循环不再有效。之后,您将循环将其中一些项目设置为 Visible,这不会应用,因为所有项目都已经可见。 On Error Resume Next。您无法隐藏数据透视字段中的所有项目,这应该会给您一个错误,至少一个项目应该是可见的。所以在你的第一个循环中你会得到一个错误。

试试:

    Sub ShowLastXDays()
    Dim pf As PivotField
    Dim i As Integer

        ActiveSheet.PivotTables("WeeklyPivot").RefreshTable
        ActiveSheet.PivotTables("WeeklyPivot").PivotCache.MissingItemsLimit = xlMissingItemsNone


        Set pf = ActiveSheet.PivotTables("WeeklyPivot").PivotFields("[FTYieldData].[Week].[Week]")

        For i = 1 To pf.PivotItems.Count
            If i > pf.PivotItems.Count - 13 Then
                  pf.PivotItems(i).Visible = True
            Else: pf.PivotItems(i).Visible = False
            End If
        Next i

    End Sub

工作:

注意:使用On Error Resume Next 不是一个好方法,因为它只会跳过错误,这在调试时有时会非常混乱。相反,您应该尝试处理错误。

【讨论】:

嗨@mikku,很抱歉,CLearFilters 在我的代码中被注释了。因此,它并没有真正清除所有过滤器。但是,同样的问题仍然存在。我在下一行也有问题,我应该将所有项目设置为隐藏,但即使我将其强制为 FALSE,TRUE 值仍会显示。对于 pf.PivotItems 中的每个 pi pi.Visible = False Next pi 实际上,删除 On Error Resume Next 并运行您的代码。您将收到一个错误。在你的问题中提到这一点。 @kyndelacruz 啊,明白了。我只是从网上复制了代码并使用我需要的设置对其进行了修改。现在我看到“无法设置数据透视项目类的可见属性”。我应该如何解决这个问题? @kyndelacruz .. 试试答案后半部分的代码,如果显示最后 13 项是唯一的动机 谢谢米库。我尝试了后一个代码。但是,我在 'Else: pf.PivotItems(i).Visible = False' 上遇到了同样的失败

以上是关于过滤数据透视表的最后一项 (vba)的主要内容,如果未能解决你的问题,请参考以下文章

同步数据透视表 - VBA 代码不起作用

如何用vba实现数据透视表自动筛选

加快数据透视表过滤 VBA 代码

使用 VBA 过滤 Excel 数据透视表

使用 VBA 根据下拉选择过滤多个数据透视表

如何刷新数据透视图