domingo, 27 de febrero de 2011

Actualización de una TD al recalcular de una celda

Descargar el fichero: eventocalcula.xlsm

Ya hemos hablado en un post anterior de cómo actualizar automáticamente una TD (Tabla Dinámica) ante la variación de una celda concreta o la variación de alguna celda que pertenezca a un rango previamente establecido. Pero en esos casos siempre teníamos que cambiar el valor de la celda a mano. Esto es, teníamos que escribir un valor o modificar alguno existente previamente. Al pulsar Intro es cuando se lanzaba la macro que actualizaba la TD.

Ver el post anterior: Actualización automática de una Tabla Dinámica

En esta ocasión vamos a comentar el caso en el que no es necesario cambiar manualmente la celda que al cambiar su valor lanza la macro, que a su vez actualiza la TD. Esto tiene la enorme ventaja de que esa celda puede ser una fórmula que está vinculada con otras muchas celdas que al cambiar modifican el valor de nuestra celda objetivo, y eso desencadena la actualización de la TD. O incluso pudiera estar la formula de esa celda objetivo apuntando a otras hojas, otros libros, o estar tomando valores vinculados de Access u otras fuentes de datos externas. Esto es muy importante, ya que esta automatización nos permite estar tranquilos de que la TD esta siempre actualizada y no requiere intervención humana. Así podremos automatizar sistemas complejos de forma completa.


Disponemos de una sencilla Base de Datos con tres campos: Comercial, Mes e Importe. En la celda G6 sumamos toda la columna D:

=+SUMA(D:D)

Esto hace que al cambiar algún valor de esa columna, y en particular las ventas de cada comercial (de color azul), se producirá un nuevo valor para la celda G6 (en color verde). Esta es la celda que desencadenará que la TD se actualice.

Haga la prueba cambie el valor de cualquiera de las celdas azules y verá como se actualiza la TD y el Gráfico Dinámico asociado.

La celda G7 es una celda auxiliar que hemos necesitado para saber si la celda verde cambia o no.

Esta es la macro que utiliza el evento Worksheet_Calculate.


Código:

Private Sub Worksheet_Calculate()
Dim vtas_old As Double
Dim vtas_new As Double
vtas_new = Sheets("Hoja1").Range("G6").Value
vtas_old = Sheets("Hoja1").Range("G7").Value
If vtas_old <> vtas_new Then
    [G7] = vtas_new
    ActiveSheet.PivotTables("TD1").PivotCache.Refresh
End If
End Sub

3 comentarios:

  1. FELICITACINES

    LOS EJEMPLOS Y APORTES SON INTERESANTES.

    SOY PROFESOR DE INFORMATICA BASICA
    LOS ALUMNOS ME PLANTEAN SITUACIONES QUEDEBEN RESOLVER ENSUS TRABAJOS.

    LOS EJEMPLOS ME HAN AYUDADO BASTANTE.

    GRACIAS

    ATT: HERNAN CALI COLOMBIA

    ResponderEliminar
  2. Muchas gracias. Me fue de gran utilidad para un proyecto en el que estoy trabajando.

    ResponderEliminar