VBA Mostrar cuadro con % de Avance

¿Qué código puedo agregar a mi macro para que muestre el porcentaje de avance?

Es que la macro tarda como 10 minutos ejecutando un proceso y quisiera que aparezca cuadrito con información que me diga 30% Completado... Y luego 60% completado... Y así.

2 respuestas

Respuesta
1

Stela Arias!

Hay veces en que será fácil implementar la barra de progreso, otras no lo es tanto, fijate la cantidad de barras de progreso que habrás visto que llegan a la derecha, vuelven a salir por la izquierda y así varias veces sin saber cuanta tarea se ha hecho ni cuanta queda.

Es responsabilidad del programador decidir que va a marcar la barra de progreso, el programa no sabe hacerlo por si mismo, por eso el arte está en la persona. Hay procesos que al principio van muy lentos y al final muy rápido, otros al contrario, el hacer que la barra progrese a velocidad constante es el arte del que hablaba.

Si sabemos cuántas operaciones se tienen que hacer y son todas de la misma duración es cuando saldrá una barra de progreso buena fácilmente. Como por ejemplo en bucles for-next.

Bueno, te pongo un ejemplo bien sencillo y facil de entender con el que empezar.

El control se llama ProgressBar en VisualStudio 2012 que es el que uso. Y tiene estas tres propiedadades

. Minimum

. Maximum

.Value

Como su nombre indica Minimum es el valor menor, Maximum el mayor y Value es valor actual de la barra de progreso.

Esto es un sencillo programa que tiene un control Label para que se retarde algo el bucle al escribir en él, un botón para empezar y una barra de progreso.

-----------------

Public Class Form1
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     ProgressBar1.Minimum = 3000
     ProgressBar1.Maximum = 30000
     For i = 3000 To 30000
         Label1.Text = i
         ProgressBar1.Value = i
    Next
End Sub
End Class

-----------------------------

Como ves tu pones el valor de la propiedad Value de forma adecuada entre el mínimo y el máximo que puede valer.

Hola, sucede que tengo una macro en VBA que ejecuta un proceso en excel y quería que se fuera marcando el avance por medio de una barra, como un efecto visual para el usuario. ¿Se podrá implementar algo así? si es así como podría hacerlo exactamente.

Muchas gracias

Yo pensaba que decías Visual Basic de verdad, no esto de Excel. Excel no tiene el control de barra de desplazamiento, luego es bastante difícil hacerlo. Aquí tienes una página donde explica como hacerlo, espera que lo voy a probar a ver que tal queda.

http://support.microsoft.com/kb/211736/es 

Si, el frame se va rellenado de color rojo, lo que pasa es que lo hace muy rápido en mi ordenador, para verlo he retardarlo el proceso 25 veces poniendo un bucle

For i = 1 To 25
Cells(r, c) = Int(Rnd * 1000)
Next

en lugar del simple

Cells(r,c) = Int(Rnd*1000) que traía.

Naturalmente tu cuando lo uses para tu proceso no le metas ningún retardo salvo la propia tarea. No tienes porque seguir el mismo modelo porque la faena tampoco tiene porque ser igual, aqui la faena era hacer algao el tantas filas por culumnas pero lo tuyo puede ser solo filas o algún proceso difícil de medir.

Tu tendrás que a intervalos regulares hacer que la variable PctDone aumente desde 0 al principio hasta 1 al final y mostrarla con

UpdateProgressBar PctDone

las veces que sea necesario, si pasarse no sea que la faena de mostrarlo retrase mucho la faena principal.

Y eso es todo, espero que te sirva y lo hayas entendido. Si no es así y quieres que te haga la barra para un proceso concreto te pediría por favor que lo hicieses en una pregunta nueva una vez hayas puntuado esta.

Respuesta
1

Me llegó esta pregunta y no sé si ya está contestada o quieras una nueva respuesta.

Tal vez ayudaría si reviso tu macro y veo la posibilidad de optimizarla, claro, además de ponerle el cuadro de progreso.

Si quieres que revise tu macro envíame tu archivo.

Hola Dante, ya te pasé el correo desde la cuenta de un amigo. Dice "Leandro" el remitente y el asunto dice mi nombre y el título de mi pregunta.

Muchísimas gracias

Esta es la macro con el código para hacer las búsquedas más rápidas.

Sub Buscar()
'Mod.Por.DAM
    Application.ScreenUpdating = False
    Set h1 = Sheets("Estados de cuenta")
    Set h2 = Sheets("Cartera.")
    '
    h1.Range("A18:E6000").ClearContents
    j = 18
    Set r = h2.Columns("G")
    Set b = r.Find(h1.Range("A6"), LookIn:=xlValues, LookAt:=xlWhole)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            H1.Cells(j, "A") = h2. Cells(b. Row, 4)
            H1.Cells(j, "B") = h2. Cells(b. Row, 9)
            H1.Cells(j, "C") = h2. Cells(b. Row, 5)
            H1.Cells(j, "D") = h2. Cells(b. Row, 2)
            H1.Cells(j, "E") = h2. Cells(b. Row, 8)
            j = j + 1
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell
    End If
    h1.Range("A17:F17").AutoFilter
    u1 = h1.Range("A" & Rows.Count).End(xlUp).Row
    With h1.Sort
        .SortFields.Clear
        .SortFields.Add Key:=h1.Range("E17:E" & u1), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=h1.Range("A17:A" & u1), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange h1.Range("A17:F" & u1)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Selection.AutoFilter
    Application.ScreenUpdating = True
    MsgBox "Consulta terminada"
End Sub

Si el tiempo de la macro se mejoró, recuerda valorar la respuesta.

Saludos. Dante Amor

La pregunta no admite más respuestas

Más respuestas relacionadas