Excel VBA数据透视表显示详细信息

Excel VBA数据透视表显示详细信息,vba,excel,pivot-table,drilldown,Vba,Excel,Pivot Table,Drilldown,我有一个数据透视表,其中包含许多与客户、年份和季度相关的展开/折叠按钮,所有这些按钮后面都有vba。根据需要显示详细信息。这些单独的代码集可以工作。然而,我正在努力使我的代码更高效、更易管理,多亏了另一位用户,我离这越来越近了 以下是每个有效按钮的代码: Sub Expand_Quarter() Range("R13").Select ActiveSheet.PivotTables("PivotTable1").PivotFields("Quarter").ShowDetail = IIf(

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

我已经解决了!!!以下代码将以我希望的方式运行:

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  

我希望这对其他人有所帮助:)

我认为这个问题可能与以下事实有关:字段的每个值可能具有不同的ShowDetail属性值,因此Excel甚至不会尝试返回它,即使所有值都相同

避免硬编码特定范围(取决于透视表的物理布局)的一种方法是使用以下代码:

pf.ShowDetail = Not pf.DataRange.Cells(1).ShowDetail

对不起,chukko,我刚看到这个。范围已编码,因为它们表示要展开/折叠的列。我确信有更好的方法来做我正在做的事情,我还在学习这门手艺:)当然。我们每天都在学习新的东西。如果你不硬编码精确的列,那么你需要更少的代码维护,因为每次你在左边插入一个新列或将表放在其他地方,你都需要调整硬编码的值,这是一个PITA.chukko,这太棒了,我现在已经将代码减少了至少7行……听起来不多,但这一切都有不同,它帮助我更好地理解这件事……现在我有一个稍微不同的问题,就是根据showdetail函数设置按钮的beveltoptype,该函数过去是有效的:(这用于s.ThreeD.beveltoptype=IIf(r.showdetail,7,3)
很高兴听到这个。对于你的问题。-首先找出左侧(s.ThreeD…)或右侧(r.ShowDetail)是问题所在。如果是前者,请提出一个新问题。如果是后者,则r可能不是单个单元格。Chukko,你完全正确,是右侧(r.ShowDetail)现在使用以下代码Dim pi作为数据透视项集pi=pf解决了这个问题。数据透视项(1)s.ThreeD.BevelTopType=IIf(pi.showdail,7,3)