miércoles, 27 de noviembre de 2019

Actualizar consultas Excel mediante código VBA


Actualizar una consulta generada en Excel por Power Query (Obtener y transformar datos) es sencillo, sea cual sea el método que queramos utilizar: interfaz de usuario o VBA.

Si recopilamos los métodos más habituales son:

  1. Actualizar mediante interfaz de usuario, manualmente:
    • Desde el botón desplegable "Actualizar todo" de la ficha Datos
      • Opción Actualizar todo (se actualizan todas las consultas y tablas dinámicas del libro)
      • Opción Actualizar (se actualiza solo la tabla activa)
    • Desde la lista de consultas (Ficha Datos/Consultas y conexiones/Botón derecho sobre la consulta/Actualizar)
  1. Actualizar automáticamente la consulta configurando la actualización automática desde sus propiedades (Ficha Datos/Consultas y conexiones/Botón derecho sobre la consulta/Propiedades/Actualizar al abrir el archivo o Actualizar cada....x minutos)
  2. Actualizar mediante una macro con código VBA:
    • Para una consulta sería:
      •  ActiveWorkbook.Connections("Consulta - nombreConsulta").Refresh
    • Para todas las consultas sería:
      • ActiveWorkbook.RefreshAll

Como comentario para usuarios avanzados, tenemos que decir que en este último caso, a veces, ocurre un problema de sincronización entre el tiempo de actualización de la consulta y el tiempo de ejecución del código VBA.

Problema
Esto es, si una consulta se ejecuta mediante código VBA e inmediatamente después del código VBA de actualización de la consulta hay otro código VBA, este último código NO SE EJECUTA DESPUÉS DE FINALIZADA LA ACTUALIZACIÓN de la consulta, sino que se ejecuta inmediatamente después de INICIADA la actualización de la consulta. En otras palabras:

Cuando se ejecuta la consulta, esta comienza a ejecutarse y tarda un cierto tiempo, pero el código siguiente se ejecuta inmediatamente después y podría ocurrir que la consulta terminara después de que el código siguiente termine. Un ejemplo sería la macro:

Sub miMacro()
    ActiveWorkbook.Connections("Consulta - REV").Refresh
    ActiveSheet.ListObjects("tbl_REV").Range.AutoFilter Field:=5, Criteria1:="="
End Sub

Con el código anterior:

  1. La primera línea de código inicia la actualización de la consulta REV
  2. La segunda línea de código aplica un filtro a la tabla donde se carga la consulta REV
  3. La consulta termina de actualizarse y se carga sobre la tabla REV, eliminando el filtro aplicado en la línea anterior

Con todo lo anterior, se evidencia el problema: la segunda línea de código queda inutilizada.

Solución
Es simple. Configurar la consulta de forma distinta a como está configurada por defecto:  (Ficha Datos/Consultas y conexiones/Botón derecho sobre la consulta/Propiedades/Desactivar la opción Habilitar actualización en segundo plano)



 José Manuel Pomares Medrano
 











No hay comentarios:

Publicar un comentario