设置 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
RuntimeError:尝试在 CUDA 设备上反序列化对象,但 torch.cuda.is_available() 为 False,Dataloader 错误,并且设置 pin_memory=Fa
GNU Radio + HackRF: RuntimeError: firdes check failed: 0 < fa <= sampling_freq / 2