Una de las cosas que más agradecen los usuarios es poder ver el progreso de un programa cuando este tiene cierta duración. Esto supone un poco más de carga de la CPU (sobre todo por la actualización de la pantalla), pero totalmente despreciable a cambio del valor de la información que el usuario recibe.
Las macros de Excel no son una excepción y es necesario informar al usuario del progreso de una macro muchas veces para evitar que finalice/mate el proceso de Microsoft Excel al pensar que se ha bloqueado.
Desafortunadamente, Microsoft Excel no proporciona un control barra de progreso para VBA (Visual Basic for Applications). Una opción comúnmente utilizada es usar la barra de estado de Excel para mostrar el porcentaje de ejecución. Esta es una buena opción, pero podemos dar a nuestras macros un aire más profesional con el control de usuario que he desarrollado y he llamado lcf_ProgressBar.
Este control de usuario puedes integrarlo fácilmente en tus macros e informar al usuario del progreso de la ejecución con un estilo muy profesional.
El resultado final es el que se muestra en las imágenes que podéis a lo largo de este post.



Para poder incluir esta barra de progreso en vuestras macros, debéis descargaros el formulario de usuario que he creado. Necesitáis los dos siguientes archivos:
Una vez descargados debéis ir al editor de Visual Basic de Excel e importar el formulario frm_lcf_ProgressBar, tal y como podéis ver en la imagen:

Para ver un ejemplo de la barra de progreso en funcionamiento he creado un pequeño documento Excel. Lo podéis encontrar en el siguiente enlace:
Una vez descargado, sólo tenéis que pulsar el botón de “start example” y mostrara un sencillo ejemplo de la barra de progreso como el que se muestra en la siguiente imagen.

Nota: Toda la macro y los comentarios del código están en inglés, es cuestión de costumbre personal, no nada complejo y creo que podéis apañaros sin problemas con esta versión, sino es así, podéis usar los comentarios del post para realizar cualquier pregunta.
Nota2: Obviamente, el documento Excel de ejemplo contiene macros y Microsoft Excel os mostrará un mensaje de advertencia al abrir el fichero. Sino podéis abrir el documento Excel de ejemplo seguramente será por las opciones de seguridad, podéis cambiar estas opciones navegando a través del menú de Excel en: Herramientas –> Macros –> Seguridad…
Nota3: El ejemplo que he creado en Excel está copiado en las instrucciones del formulario, es decir, que podéis ver el ejemplo sólo descargando el formulario, importándolo en un Excel y copiando el código del ejemplo en un nuevo modulo.
Imprime este post
30 comentarios sobre Barra de progreso para Macros de Excel
Pana super bien ese programita cheveraso…………….. justo lo q necesitaba me salvaste………
esta muy padre la barra, me fue muy util por que se ve muy profesional y va de acuerdo a mi trabajo a demas te da confianza por la fecha de actualizacion, gracias por publicarlo, casi nunca hago comentarios pero para esto si vale la pena, espero y me comuniquen de todo que tenga que ver con macros se los agradeceria a tambien estoy dispuesto a aportar gracias.
lcflores, te agradesco de forma personal el compartir este tipo de eventos en visualq ue personalizan bastante el trabajo de uno mismo.
Abel, chile
Gracias por compartir tus ideas. muy bueeennaaazooooooooooo esta macro, te vuelvo a recalcar muchas gracias
Hola:
Pues estoy un poco nulo con esto, y quisiera saber cómo lo acomodo a una macro que ya tengo hecha en excel.
Gracias.
Hola Salsiria,
Descargate el Excel de ejemplo y mira los comentarios que hay, creo que te ayudaran en tus preguntas. En cualquier caso:
1) Incorpora el formulario de barra de progreso a tu Excel
2) Declaralo en tu macro
Dim oProgress As New frm_lcf_ProgressBar3) Inicializalo para 100 pasos
oProgress.Initialize 100, 2, "Prueba"4) Muestralo
oProgress.Show 05) Incrementa el contador, en un paso
oProgress.Increase6) Incrementa el contador, en n pasos
oProgress.Increase 47) Cierra el formulario de barra de progreso
Unload oProgressAsí de sencillo
Agradezco publicamente al creador de esta barra de progreso, ya que ha me ha ayudado a mejorar mis propios programas, saludos
Excelente aplicación y muy bien lograda…..no obstante tengo un problema….como puedo puedo personalizar el boton “Start Example”, quiero cambiarle el nombre.. saludos y desde ya “MUCHAS GRACIAS”
una pregunta,
¿cómo consigo que el incremento sea menor a la unidad?
tengo un for de 3500 elementos y si acada next me incrementa 1 se me va… y poner como incremento 100/total pues no me suma :S
el código del modulo esta claro, pero el del formulario… me pierdo del todo
Hola Diego,
Muy sencillo, sólo inicializalo para 3500 elementos/pasos y el programa hará el resto. Sólo recuerda que tienes que incrementar el contador 3500 veces. La instrucción es:
oProgress.Initialize 3500, 2, "Prueba para Diego"Espero haberte ayudado
lcflores
Te agradesco mucho por este código tan sencillo de implementar y que te resuelve tantos problemas a la hora de poner los programas en producción. Para los usuarios es muy importante. Ojalá que se puedean publicar mas cosas en VBA por que no las hay.
Hola Lc FLores . Tengo problemas … si entiendo bien en la parte donde tengo que ingresar mi codigo es dentro de ese ciclo for??
For i = 0 To endRow – 4 ‘ Dummy loop for this example
‘ ‘–
‘ ‘ <>
‘ ‘–
‘ oProgress.Increase ‘ Increases 1 unit the progress bar
‘ Next
Hola Charlie,
Sí, en este ejemplo, pero no tiene porque ser así.
Suponte que tienes que ejecutar una tarea que tiene 5 pasos y cada uno de ellos quieres que incremente un 20% la barra de progreso. Primero inicializa la barra a 5 (que es el número de pasos) y despues cada vez que hagas uno de los pasos ejecuta
oProgress.Increasepara incrementar en 1 la barra de progreso. El código quedaría parecido a esto:oProgress.Initialize 5, 2, "Prueba para Charlie"
Call ejecuta_paso_1 'Ejecutar uno de los pasos
oProgress.Increase 'Sumas 1 al contador, un 20%
Call ejecuta_paso_2
oProgress.Increase
Call ejecuta_paso_3
oProgress.Increase
Call ejecuta_paso_4
oProgress.Increase
Call ejecuta_paso_5
oProgress.Increase
Espero haberte ayudado,
lcflores
Hola LC Flores.
Me parece muy sencillo, pero necesito una ayuda:
Como puedo implementar la barra para que me aparezca en pantalla mientras estoy haciendo una consulta de SQL y desconozco el tiempo que va a tardar o el numero de registros a visualizar?.
Saludos.
Hola,
La respuesta es sencilla: NO se puede.
Lo que quieres hacer no es viable tal como lo estas planteando ahora mismo, por los siguientes motivos:
Soluciones:
No son soluciones perfectas, pero son métodos que he usado para tener al usuario “ocupado” mientras espera y que vea que el ordenador está trabajando.
Suerte
Hola LC Flores:
No he sido capaz de implememtarlo, seguiré investigando.
Por otro lado, voy a hacerte otra pregunta aunque no sea de éste tema: Tengo un formulario al que le he deshabilitado la apariencia de excel para no liar al usuario. El problema que tengo es que, cuando lo lanzo, no se viene al frente si el usuario está utilizando otro programa, y se queda detras y no es visible. ¿Como puedo traerlo al frente?.
Gracias. Saludos.
En primer lugar quiero felicitarte por tu aporte; me ha sido de mucha utilidad…
Mi necesidad es la siguiente:
Tengo una macro que tarda un poco a la cual le aplique tu barra de progreso… en un punto de ella llama a otra macro usando Application.Run “Macro5″ (que también es algo laga) y necesito que mientras se esta ejecutando esta macro (“Macro5″) continúe el conteo de la barra de progreso…. ¿Cómo hago?
Hola Dorian,
Si tu “Macro5″ está dentro de tu mismo fichero Excel, tienes 2 opciones:
1) Pasar el objeto como un parámetro de la función Macro5.
2) Crear una variable global de tipo frm_lcf_ProgressBar y podrás usarla en cualquier lugar del programa, puede consumir un poco más de memoria, pero nada importante hoy en día.
Si por el contrario, estas llamando a una macro de otro fichero Excel, en este caso, no podrás utilizar esta u otra barra de progreso porqué tu programa se quedará esperando a que la otra macro termine.
Un saludo,
Lcflores
Hola, muchas gracias por compartir tus desarrollos en verdad son de gran ayuda, tengo una duda respecto a como llamar e incrementar la barra, te comento.
Tengo un formulario en el cual se pueden seleccionar una o más opciones, cada una de estas opciones ejecuta una macro que son reportes, es decir, el formulario no procesa directamente cada reporte, los llama dependiendo de la seleccion del usuario, en el siguiente post te pongo un ejemplo
ej.
Select Case Opciones
case 1
Reporte A
case 2
reporte b
case 3
Reporte c
end select
Lo que me gustaría es que la barra de progreso se muestre dependiendo la cantidad de reportes y hasta que se generen estos, pero no sé en donde hacer el llamado y como pasar los parámetros, ojalá me puedas ayudar.
De antemano agradezco el apoyo.
Saludos!
Hola Jack,
Donde construyas cada uno de los reportes hay es donde debes introducir el código que muestro en el ejemplo. Cada uno de los reportes tendrá su barra de progreso. Lo más adecuado es que calcules los pasos que realices para construir el informe, después inicialices la barra a ese valor, para finalmente ir incrementando en 1 el valor de la barra de progreso después de realizar cada uno de los pasos.
Un saludo,
Lcflores
Interesante. muchas gracias por compartir tu trabajo.
A mí también me ha sido de gran ayuda esta información, lcflores, ¡mil gracias por publicarla!
Si está dentro de tus posibilidades, quisiera hacerte una consulta:
Al igual que jose, yo también ejecuto una macro con un número indeterminado de pasos a realizar; en mi caso se trata de un loop. Como se trata de un proyecto en el que no es necesario que el porcentaje mostrado por la barra sea exacto, por los momentos me he apañado introduciendo la instrucción:
oProgress.Increase 5
dentro del loop. Esto, dado el rango en el que puede variar el número de pasos, se acerca lo suficiente… pero me deja el inconveniente, claro, de que el caption de la barra de progreso no me llega a 100% jamás. Me gustaría forzar la llegada del status bar a 100% antes de descargarla, pero he probado con la instrucción
oProgress.Increase mIntMax – mIntCurrent
y no me funciona :$
¿Qué estoy perdiendo de vista?
¡Gracias otra vez!
Hola Sim,
Una pregunta muy interesante. Es una funcionalidad que inicialmente no había contemplado, pero que puede tener sentido.
Debajo incluyo el código que debería incluir en la función en el formunlario
frm_lcf_ProgressBar'>==============================================================================
' Move to 100 percentage
Public Sub MoveTo100()
Call Increase(mIntMax - mIntCurrent)
End Sub
'>==============================================================================
Ahora, cuando quieras que la barra de progreso llegue al 100% , llama a la nueva función:
oProgress.MoveTo100Esto moverá el estado al 100%. También te recomiendo dejar un tiempo la barra activa después de ejecutar esta llamada para que el usuario pueda verlo. En el peor de los casos siempre puedes utilizar la función
DoEventspara que programa se frene un poco o directamente:Application.Wait Now + TimeValue("0:00:01")
para que el programa se pare un segundo. (Este último ejemplo sólo funciona en VBA).
Un saludo,
Lcflores
GRACIAS….
ESTO ERA LO QUE ESTABA BUSCANDO…
saludos
de Igual Manera que los demas te agradezco por compartir tu trabajo, y te hago una pregunta sobre el programa.
El ciclo en el que estoy utilizando la barra es variable, es de acuerdo a un rango de registros que cambia constantemente, se podria de alguna forma aplicar una variable a la instruccion donde se inicializa el procedimiento ?
oProgress.Initialize 5000, 2, “Prueba”
agregue esta linea——
valorvariable=Range(“a1″).value
oProgress.Initialize valorvariable, 2, “Prueba”
ya hice esta prueba pero me di cuenta q no funciona…
Es posible inicializar el procedimiento con un valor variable?
saludos y gracias de antemano
Muchas gracias !!!
Está genial
Saludos
Very interesting!!!
feliciades, es de gran ayuda, poca gente como tu hay en la red, saludos
Muchisimas gracias, tu barra de progreso es super util.
Deja tu comentario sobre Barra de progreso para Macros de Excel
*Nota: Sólo se tendrán en cuenta los comentarios correctamente redactados y que estén relacionados con el tema de la entrada.RSS a los comentarios de esta entrada · TrackBack URI