我有一个数据透视表,其中包含许多与客户,年份和季度相关的展开/折叠按钮,所有这些按钮都将vba放在它们后面。显示相应的详细信息。这些单独的代码集有效。但是,我试图让我的代码更高效,更易于管理,并且感谢另一位用户,我越来越近了。
以下是每个按钮的代码:
Sub Expand_Quarter()
Range("R13").Select
ActiveSheet.PivotTables("PivotTable1").PivotFields("Quarter").ShowDetail = IIf(Selection.ShowDetail, False, True)
End Sub
以下是抛出错误的代码。我已经评论了错误发生的位置:
Sub ExpColl()
Dim pt As PivotTable, pf As PivotField, b As String
b = Application.Caller
With ActiveSheet
Set pt = .PivotTables("PivotTable1")
Select Case b
Case "btnExpCollCustProd": Set pf = pt.PivotFields(.Range("Q15").PivotField.Name)
Case "btnExpCollYear": Set pf = pt.PivotFields(.Range("R12").PivotField.Name)
Case "btnExpCollQtr": Set pf = pt.PivotFields(.Range("R13").PivotField.Name)
End Select
'--- Run Time Error 1004 Application-defined or Object Defined Error"
pf.ShowDetail = IIf(pf.ShowDetail, False, True)
End With
End Sub
变量pf确实返回了我期望的结果,所以我有点困惑。所有人都非常感谢。
答案 0 :(得分:1)
我解决了!以下代码将完全我的工作方式:
Sub ExpColl()
Dim pt As PivotTable, pf As PivotField, b As String, s As Shape, bev As Long, r As Range
b = Application.Caller
Set s = ActiveSheet.Shapes(b)
If b Like "btnExpColl*" Then
With ActiveSheet
Set pt = .PivotTables("PivotTable1")
Select Case b
Case "btnExpCollCustProd":
Set r = .Range("Q15")
Set pf = pt.PivotFields(r.PivotField.Name)
Case "btnExpCollYear":
Set r = .Range("R12")
Set pf = pt.PivotFields(r.PivotField.Name)
Case "btnExpCollQtr":
Set r = .Range("R13")
Set pf = pt.PivotFields(r.PivotField.Name)
End Select
pf.ShowDetail = IIf(r.ShowDetail, False, True)
s.ThreeD.BevelTopType = IIf(s.ThreeD.BevelTopType = 3, 7, 3)
End With
End If
End Sub
我希望这可以帮助其他人:)
答案 1 :(得分:0)
我认为这个问题可能与字段的每个值可能具有不同的ShowDetail属性值这一事实有关,因此即使所有值都相同,Excel也不会尝试返回它。
避免硬编码特定范围(取决于数据透视表的物理布局)的一种方法是使用以下代码:
pf.ShowDetail = Not pf.DataRange.Cells(1).ShowDetail