Realice un ciclo solamente en PivotItems filtrados

Quiero sumr el DataRange.Value de algunos PivotItems de una PivotTable que coincidan con ciertos criterios, y deseo hacerlo cada vez que se PageFilter un PageFilter . Aquí está mi código:

 Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) Dim pt As PivotTable, pi As PivotItem, q as Double Set pt = ActiveSheet.PivotTables(1) q = 0 For Each pi In pt.PivotFields(1).PivotItems If pi.Name = someCriteria Then q = q + pi.DataRange.Value End If Next pi End Sub 

El código se ejecuta cada vez que el PT cambia (obviamente), y se ejecuta muy bien hasta que un PageFilter oculta un elemento que concuerde con someCriteria , y luego ocurre un 1004 Error , dado que no puede DataRange propiedad DataRange de pi .

Dos preguntas:

(En este context) ¿Hay alguna manera de ejecutar el código solo cuando un PageFilter cambia (o tiene que hacerse con un evento Worksheet_Change )?

¿Cómo ejecuto mi For-Loop solo en los artículos filtrados?

He descubierto una solución para el event handling errores, pero supongo que tiene que haber una forma más elegante de hacerlo.

Gracias.

No puedo reproducir tu error Si creo una tabla dinámica simple con elementos de página "Prueba" y "Prueba 2" y cambio el filter de página para que no muestre "testing", no obtengo un error 1004. El es con algunos criterios igual a "Prueba". Obtengo un error 13 No coincide el tipo, ya sea "Prueba" oculta o no, porque está tratando de agregar un range a q.

Error 13

La línea resaltada por el depurador es "q = q + pi.DataRange.Value".

Tenga en count que la dirección de pi.DataRange no depende realmente de si la Prueba está seleccionada en el filter de página. Por ejemplo, en la image se selecciona Test2 y pi.DataRange.Address es igual a B4: B5.

Entonces, si cambio el código a lo siguiente, se ejecuta sin error, pero resulta en 3, aunque no se haya seleccionado Prueba:

 Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) Dim pt As PivotTable, pi As PivotItem, q As Double Dim someCriteria As String Dim cell As Excel.Range someCriteria = "test" Set pt = ActiveSheet.PivotTables(1) q = 0 For Each pi In pt.PivotFields(1).PivotItems If pi.Name = someCriteria Then For Each cell In pi.DataRange q = q + cell.Value Next cell Debug.Print q End If Next pi End Sub 

Debido a que no puedo duplicar su éxito inicial o la falla específica, claramente no soy de mucha ayuda. Tal vez con más detalles sobre la estructura de tu tabla dinámica podría ser.

Puedo decir positivamente que si desea capturar solo los cambios en el filter de página, debe codificar el evento Worksheet_Change, como sospechaba.