Tengo una tabla dinámica que contiene un número de Expandir/Contraer los botones relacionados con el Cliente, Año, y los Cuartos de los cuales todos han vba detrás de ellos .Showdetails según corresponda. Cada uno de estos conjuntos de código de trabajo. Sin embargo, yo estoy tratando de hacer que mi código sea más eficiente, y fácil de manejar, y gracias a otro usuario, me voy acercando.

Aquí está el código para cada botón que funciona:

Sub Expand_Quarter()

Range("R13").Select

ActiveSheet.PivotTables("PivotTable1").PivotFields("Quarter").ShowDetail = IIf(Selection.ShowDetail, False, True)

End Sub  

Y Aquí está el código que es tirar un error. He comentado donde se produce el error:

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  

La variable pf devolver exactamente lo que esperaba, así que estoy un poco perplejo. Toda la ayuda grandemente apreciada.

2 Comentarios

  1. 1

    He trabajado fuera!!! El siguiente código de trabajo exactamente cómo quiero que:

    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  

    Espero que esto ayude a alguien más por ahí 🙂

  2. 0

    Supongo que este problema podría estar relacionado con el hecho de que cada valor de campo puede tener diferente valor de ShowDetail propiedad, por lo que Excel no intenta siquiera volver incluso si todos los valores son idénticos.

    Una forma de evitar codificar rangos específicos (que depende de la disposición física de la tabla dinámica) es usar el siguiente código:

    pf.ShowDetail = Not pf.DataRange.Cells(1).ShowDetail
    • Lo siento chukko, sólo he visto esto. Los rangos son codificados, ya que representan la columna para ser expandida y se derrumbó. Estoy seguro de que hay mejores maneras de hacer lo que estoy haciendo yo, todavía estoy aprendiendo este arte 🙂
    • Seguro. Todos estamos aprendiendo algo nuevo cada día. Se necesita menos mantenimiento del código, si no te codificar el exacto columnas, como cada vez que inserte una nueva columna a la izquierda o lugar de la tabla en algún otro lugar usted necesita para ajustar los valores codificados, que es un pan de PITA.
    • chukko, este ha sido brillante, ahora he reducido mi código por al menos 7 líneas de código…..no suena mucho, pero todo se hace un mundo de diferencia, y esto me ayuda a comprender esta cosa mejor…….ahora tengo un poco diferente de problema con la configuración de la beveltoptype de los botones de mi basado en el showdetail función, que se utiliza para trabajar 🙁 Este se utiliza para trabajar <pre>s.ThreeD.BevelTopType = IIf(r.ShowDetail, 7, 3)<code>
    • bueno oír eso. Por su p. – averiguar primero si la izquierda (s).ThreeD…) o a la derecha (r.ShowDetail) es el problema. Si es el antiguo, por favor, abra una nueva pregunta. Si es esto último, entonces r no es probablemente la única célula.
    • Chukko, que eran absolutamente correcto, fue el lado derecho (r.Showdetail) que que me estaba causando el problema. Ahora resuelto usar el siguiente código Dim pi Como PivotItem Conjunto pi = pf.Pivotitems(1) s.ThreeD.BevelTopType = IIf(pi.Showdetail, 7, 3)

Dejar respuesta

Please enter your comment!
Please enter your name here