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
 











12 comentarios:

  1. Hola, tengo problemas en excel 2016, pese a que desactivé la actualización en segundo plano, el código sigue ejecutándose aún cuando no terminó la consulta. Probé de otras varias maneras incluyendo esto y tampoco:
    Dim cn As WorkbookConnection
    For Each cn In ThisWorkbook.Connections
    cn.Ranges(1).ListObject.QueryTable.Refresh BackgroundQuery:=False
    next

    pero ninguna me funcionó.

    ResponderEliminar
  2. No se que te puede ocurrir. En principio, a mi me funciona sin problemas.
    Saludos

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Muchas gracias, funcionó perfecto

    ResponderEliminar
  5. Hola, después de buscar por mil páginas, tu me has dado la solución a mi problema... muchas gracias

    ResponderEliminar
  6. Gracias, gracias, gracias!! Me estaba volviendo loco poniendo pausas en la ejecución y no había manera. He buscado y buscado, y afortunadamente hay quien se molesta en ayudar a los demás. Qué menos que agradecerlo!. Solución sencilla, pero si no te lo dicen, imposible imaginarlo. Lo dicho, un millón de gracias!

    ResponderEliminar
  7. Muchas gracias!!! no sabía y era lo que estaba buscando!!!!

    ResponderEliminar
  8. eliminaron el comentario ocupo ayuda gracias

    ResponderEliminar
  9. Soy Tom Kingsley, ha pasado un tiempo desde que
    escrito para agradecer al Dr. OHIKHOBO que me ayudó en mi
    vida. Me infecté con HERPES SIMPLEX VIRUS en 2016, fui a muchos
    hospitales para una cura, pero no había solución, así que estaba pensando cómo puedo
    buscar una solución para que mi cuerpo pueda estar bien. Un dia mi tia rosa
    Presénteme al Doctor OHIKHOBO después de haber visto tantos testimonios en línea.
    sobre su medicación a base de hierbas para curar HERPES y me dio su
    correo electrónico: drohikhoboherbalcenter@gmail.com, así que le envié un correo electrónico. Me dijo todo el
    cosas que necesitaba hacer y también me dio instrucciones a seguir, que
    seguido correctamente. Antes de que supiera lo que estaba pasando después de una semana,
    HERPES que estaba en mi cuerpo desapareció. así que si estás teniendo
    herpes o cualquier tipo de enfermedad que se enumera a continuación
    *DIABETES
    *CÁNCER
    *CARRERA
    *ESTERILIDAD
    *ENFERMEDAD DEL CORAZÓN
    *VIH
    * LLEGAS FRÍAS
    *VERRUGAS GENITALES
    Y si también quieres cura, también puedes enviarle un correo electrónico a: drohikhoboherbalcenter@gmail.com oa través de su WhatsApp + 1-740-231-2427

    ResponderEliminar
  10. Hola. Como se puede actualizar la consulta basada en varias hojas de un mismo archivo , pero que están protegidas. Me informa que primero tendría que desprotegerlas, pero querría automatizarlo con un botón. Gracias

    ResponderEliminar
  11. Estoy muy interesado en estudiar este sitio https://cursos-gratis.com.es/ pero no sé que curso tomar ¿Me pueden ayudar? 

    ResponderEliminar