Hola a todos 🙂
Hace unos días estuve implementado un proceso en VBA que duraba varios minutos (incluso programándolo de la forma más eficiente).
Esto me hizo reflexionar acerca de la conveniencia de agregar algún tipo de indicado que me mostrase de alguna manera el procentaje de trabajo realizado por la macro.
Lo que no quería era insertar una barra de progreso, (crear un userform, el insertar una etiqueta, un frame y programarlo todo). Pero recordé que con el uso de la propiedad Application.StatusBar (barra de estado), podría crear una sencilla línea de código que me mostrase lo que necesitaba.
Os lo explico con un ejemplo, voy a recurrir a un pequeño ejercicio que publiqué en su día sobre cómo buscar con varios criterios en VBA. En ese proceso utilizábamos varias
instrucciones for-next y eso nos vendrá muy bien para programar nuestra barra de estado.
En el ejemplo tenemos una hoja (TABLABASE) con la información de los automóviles matriculados en España hasta abril 2016, según marca, tipo de combustible y Comunidad Autónoma de residencia. Y en otra hoja (DATOS), la misma información pero solo de los automóviles diesel. El ejercicio es buscar la información en la tabla principal siguiendo los tres primeros criterios y añadiendo el total en la columna Datos:
Voy a conservar el mismo código que en el del post anterior y añadiré la nueva línea de código que hará lo que estamos buscando (resalto en azul):
Sub BUSCAR_INDICADOR_DE_PROGRESO()
'Declaramos variables
Dim i As Double
Dim j As Double
Dim Marca As String, Carburante As String, Comunidad As String
'Desactivamos actualización de pantalla
Application.ScreenUpdating = False
'Refrescamos la columna de total por cada búsqueda que hagamos
With Worksheets("DATOS")
Total = Application.CountA(.Range("D:D"))
If Total > 1 Then .Range("D2:D" & Total).ClearContents
End With
'Definimos rango de tablabase
fin = Application.CountA(Worksheets("TABLABASE").Range("A:A"))
'Definimos rango de datos
Final = Application.CountA(Worksheets("DATOS").Range("A:A"))
With Worksheets("TABLABASE")
'Iniciamos el bucle principal en tabla Datos
For i = 2 To Final
'Definimos cada uno de los Items por los que vamos a buscar
Marca = Sheets("DATOS").Cells(i, 1)
Carburante = Sheets("DATOS").Cells(i, 2)
Comunidad = Sheets("DATOS").Cells(i, 3)
'Segundo bucle en tablabase por cada item del primer bucle
For j = 2 To fin
'Buscamos con un condicional en tablabase cada una de las variables definidas
If Marca = .Cells(j, 1) And _
Carburante = .Cells(j, 2) And _
Comunidad = .Cells(j, 3) Then
'si encontramos coincidencia, igualamos celdas con el valor de la columna 4
Sheets("DATOS").Cells(i, 4) = .Cells(j, 4)
Exit For
End If
Next
'Insertamos mensaje en barra de tareas para mostrar % completo de la ejecución de la macro
Application.StatusBar = "Progreso: " & i & " de " & Final & " Porcentaje completado: " & Format(i / Final, "0%")
Next
End With
Application.ScreenUpdating = True
End Sub
Como podéis observar, nos ayudamos con los datos del primer bucle for-next dado que es el proceso principal (va recorriendo cada línea) y nos muestra la información de cual es el registro que está en uso (la variable «i») y cual es el número total de registros que nuestro proceso debe recorrer (variable «Final»).
Con esa información ya podemos confeccionar nuestra barra de esta perfectamente:
Application.StatusBar = "Progreso: " & i & " de " & Final & " Porcentaje completado: " & Format(i / Final, "0%")
Una vez que ejecutemos la macro nos mostrará el proceso de esta forma:
La clave es disponer de variables numéricas que nos permitan expresar los datos en %, y colocar el código en el bucle correspondiente (que debe ser el principal o el que de alguna forma nos pueda indicar el progreso de nuestro código). No tendrá sentido usar esta propiedad en macros que se ejecutan en pocos segundos.
Pues eso es todo, estoy seguro que os será de utilidad 🙂
Descarga el archivo de ejemplo pulsando en: AGREGAR INFORMACIÓN DEL PROCESO REALIZADO EN LA EJECUCIÓN DE UNA MACRO O UN PROGRAMA EN VBA
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Excelente. muy útil