2009-04-18 45 views
5

Tengo una tabla dinámica con un campo de pivote y contiene muchos elementos. Tengo lógica de código VBA para decidir si el valor de pivote debe ser visible o no. El problema es que Excel recalcula la tabla dinámica para cada campo mostrado u oculto, lo que lo hace muy lento. Me gustaría algo donde se vuelva a calcular solo una vez, después de establecer todos los valores. Intenté usar Application.Calculation = xlCalculationManual pero no me ayudó.Speeding tabla dinámica que filtra código VBA

código VBA que estoy usando es algo como esto

For i = 1 To oPivotField.PivotItems.Count 
    If (oPivotField.PivotItems(i).Name = "TestCondition") Then 
     oPivotField.PivotItems(i).Visible = True 'Recalulates pivot table 
    Else 
     oPivotField.PivotItems(i).Visible = False 'Recalulates pivot table 
    End If 
Next 

he de hacerlo manualmente Desactive la casilla "mostrar todo" caja y volver a comprobar si los campos que quiero visible. Esto hace que Excel recalcule una vez y muestre solo los elementos dinámicos que quiero que sean visibles. Me gustaría hacer lo mismo a través del código VBA.

Incluso he intentado utilizar

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

pero no funcionó.

Respuesta

7

Oh! Acabo de resolver que uno:

Al comienzo de su código, apagar la actualización automática de la siguiente manera:

PivotTable.ManualUpdate = True 

Y luego, al final del código, volver a encenderla:

ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh 

Encontré este hilo buscando ayuda escribiendo el código que determina si un valor de la tabla dinámica debe ser visible. ¿Qué hay detrás de tu oPivotField? ¡Esa es la parte que me estoy perdiendo!

-1

Guarde una copia de su libro de trabajo y guárdelo como archivo "excel 93-2007". Luego prueba tu código. Espero que esto te ayude.

0

Intente agregar lo siguiente. Ayudado a dar velocidad extra en mi caso también.

Al principio:

Application.Calculation = xlCalculationManual 

Al final:

Application.Calculation = xlCalculationAutomatic 
0

pivottable.ManualUpdate [= ajuste]
Verdadero hace RefreshTable para borrar los datos de la tabla dinámica, en lugar de actualizándolo
False permite que RefreshTable funcione normalmente.
El valor predeterminado es False.
Esta propiedad se restablece en False automáticamente después de los extremos procedimiento de llamada (importante)

Esta propiedad debe valer true justo antes de realizar una actualización (por ejemplo,el cambio de elemento de pivote propiedad Visible)
lo que el código se vería así:

For i = 1 To oPivotField.PivotItems.Count 
    If (oPivotField.PivotItems(i).Name = "TestCondition") Then 
     oPivotField.Parent.ManualUpdate = True 
     oPivotField.PivotItems(i).Visible = True 'doesn't recalculate pivot table because ManualUpdate is set to True 
    Else 
     oPivotField.Parent.ManualUpdate = True 
     oPivotField.PivotItems(i).Visible = False 'doesn't recalculate pivot table because ManualUpdate is set to True 
    End If 
Next 

'setting pivot table ManualUpdate property to False might be redundant at this point because it gets reset to false immediately after you set Visible property of oPivotField 
oPivotField.Parent.ManualUpdate = False 
oPivotField.Parent.Update() 

Como conclusión, ManualUpdate cambio de propiedad no se mantiene por mucho tiempo (en mis pruebas, pude ver que se restablece en falso como pronto como sea posible, así que por eso me recomendó que ponemos a true cada vez que desee hacer un cambio para un elemento de pivote)

para obtener más información sobre lo que significa una actualización en Excel, puede comprobar lo siguiente:
Pivot Refresh vs. Update – is there a real difference?

Referencias:
Título: programación de Excel con VBA y .NET
Por: Jeff Webb, Steve Saunders
Imprimir ISBN: 978-0-596-00766-9 | ISBN 10: 0-596-00766-3
Ebook ISBN: 978-0-596-15951-1 | ISBN 10: 0-596-15951-X

Cuestiones relacionadas