Excel VBA数据透视表ShowDetails

时间:2014-10-22 09:22:25

标签: vba excel-vba pivot-table drilldown excel

我有一个数据透视表,其中包含许多与客户,年份和季度相关的展开/折叠按钮,所有这些按钮都将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确实返回了我期望的结果,所以我有点困惑。所有人都非常感谢。

2 个答案:

答案 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