设置 PivotItem.Visible = false 时无法设置 PivotItem 类的 Visible 属性

Posted

技术标签:

【中文标题】设置 PivotItem.Visible = false 时无法设置 PivotItem 类的 Visible 属性【英文标题】:Unable to set the Visible property of the PivotItem class when setting PivotItem.Visible = false 【发布时间】:2017-05-06 13:59:43 【问题描述】:

我想创建PivotItem.Visible = False,但我不断收到错误消息:

无法设置 PivotItem 类的 Visible 属性

我尝试了我在互联网上找到的所有解决方案,但似乎没有一个有效

Sub FloorCompareSetter()

    Dim pt As PivotTable
    Dim pf As PivotField
    Dim pi As PivotItem
    Dim PivotSheet As Worksheet

    Set PivotSheet = ThisWorkbook.Worksheets("PIVOT")
    PivotSheet.PivotTables("PivotTable5").RefreshTable

    Set pt = PivotSheet.PivotTables("PivotTable5")
    pt.PivotCache.MissingItemsLimit = xlMissingItemsNone

    Set pf = pt.PivotFields("Period")

    For Each pi In _
        pt.PivotFields("Period").PivotItems
        Select Case pi.Name
            Case Is = "1601A"
                pi.Visible = True
            Case Else
                pi.Visible = False 'error
        End Select
    Next pi

End Sub

我尝试刷新表格和这一行但仍然无法正常工作:

pt.PivotCache.MissingItemsLimit = xlMissingItemsNone

这是我的数据透视表的图片:

我做错了什么,我该如何解决这个问题?

【问题讨论】:

我将它包含在问题中-Unable to set the Visible property of the PivotItem class 【参考方案1】:

如果您尝试隐藏任何轴上的所有项目(行、列、过滤器),您将收到此错误。您可以通过将PivotField 对象的HiddenItems.Count 属性与同一对象的PivotItems.Count 属性进行比较,在代码中捕获此错误,并确保您没有尝试从视图中删除集合的最后一项:

因此,在您的案例陈述中,您可以将 update 替换为以下内容:

Select Case pi.Name
    Case Is = "1601A"
        pi.Visible = True
    Case Else
        If pf.HiddenItems.Count < (pf.PivotItems.Count - 1) Then
            pi.Visible = False 
        Else
            MsgBox "Cannot hide all the items on this axis"
            Exit For '<~~ break the loop to stop the MsgBox popping up
        End If
End Select

请注意,在操作数据透视表时,Excel 不允许您从轴上删除最后一项 - 确定按钮将被禁用:

【讨论】:

这个总是带着这个消息框! 我更新了代码,当它到达无法将更多项目设置为隐藏的点时打破循环。 使用这个可以在代码获取之前破坏代码并显示我想要的列 在您发布的示例图片中,列轴中的1601A?导致错误是因为如果1601A 不存在,那么您将尝试隐藏所有该轴上的项目。 是的,它在那里,如果它不在那里,它甚至不会通过 Case Is = "1601A"【参考方案2】:

我加了

出错后继续下一步

之前

pi.Visible = False '错误

现在可以使用了!

【讨论】:

【参考方案3】:

上述解决方案的问题是:在循环达到预期的过滤器值之前,Robin的解决方案将停止(假设理想值是最后一项,但不需要的值是第一个,并且是唯一被选中的) ,而 Sabir 的解决方案(On Error Resume Next)可能会留下不需要的值。

在循环开始之前,将最后一项设置为可见怎么样?喜欢:

maxFilterIndex = objPivotField.PivotItems.Count
objPivotField.PivotItems(maxFilterIndex).Visible = True

然后在循环结束时,如果期望的值根本不在过滤器中,我们可以让最后一个保持可见,但弹出一个消息框说该值未找到。

With objPivotField

maxFilterIndex = objPivotField.PivotItems.Count
objPivotField.PivotItems(maxFilterIndex).Visible = True

For i = 1 To maxFilterIndex

    If objPivotField.PivotItems(i).Name = filterValue Then
        objPivotField.PivotItems(i).Visible = True
    Else
        'This is to skip the error. But the prob is it will leave the last quarter visible, if the last elelment not being ticked.
        On Error Resume Next
        objPivotField.PivotItems(i).Visible = False
        
        If i = maxFilterIndex _
           And objPivotField.HiddenItems.Count = (maxFilterIndex - 1) Then
            MsgBox "The chosen filter values are not found, and EXCEL can't hide all the items on this Pivot filter"               
        End If
    End If
Next i
End With

【讨论】:

以上是关于设置 PivotItem.Visible = false 时无法设置 PivotItem 类的 Visible 属性的主要内容,如果未能解决你的问题,请参考以下文章

VSTS Task Apple App Store 要求提供 2FA 代码,但设置了 Fastlane Session 和 App-Specific

Gitlab 账户 2FA 丢失

centos设置静态ip及出现的问题解决

RuntimeError:尝试在 CUDA 设备上反序列化对象,但 torch.cuda.is_available() 为 False,Dataloader 错误,并且设置 pin_memory=Fa

GNU Radio + HackRF: RuntimeError: firdes check failed: 0 < fa <= sampling_freq / 2

思科Cisco 三层交换机 生成树配置的问题