ProgressBar en userform de Excel

Ola, necesito una ayuda. Estoy creando un sistema, utilizando herramientas del visual Basic de Excel. En especial una de mis userform la cual la llamo "Plataforma" es como el menu o la ventana principal de mi sistema, esta tiene muchos eventos y alguno quizás largos, por lo cual aveces dependiendo del PC (considero que demorará), en mi PC a veces es rapido a veces demora... En resumen para evitar que mis clientes píensen que se esta colgando o que algo esta mal, pensé en colocar un aviso del avance de mis eventos, por lo cual pensé y por eso necesito utilizar un ProgressBar; a demás que le dará un estilo mas profesional a mi sistema. Confieso que soy empírico en esto... Pero cuando lo conocí me gusto y me metí a aprender. Esto es un evento que tiene uno de los botones de mi "Plataforma" (userform), un ejemplo:

Private Sub CommandButton7_Click()
If Bimestre = "" Then
MsgBox "No describió el Bimestre, elija un Bimestre para poder continuar"
Plataforma.Hide
Plataforma.Show
End
End If
If CursoB = "" Then
MsgBox "No describió el curso, elija un curso para poder continuar"
Plataforma.Hide
Plataforma.Show
End
End If
CommandButton7.Visible = False
Cursos = CursoB.Text
CursoB.Visible = False
Cursos.Visible = True
Modalidad = Bimestre.Text
Modalidad.Visible = True
Bimestre.Visible = False
CommandButton1.Visible = True
CommandButton2.Visible = True
Sheets("Csistema").Select
ActiveSheet.Unprotect "rbn"
ActiveSheet.PivotTables("BIMESTRAL").PivotFields("CURSO"). _
ClearAllFilters
ActiveSheet.PivotTables("BIMESTRAL").PivotFields("CURSO").CurrentPage = _
(Cursos)
ActiveSheet.Protect "rbn"
Sheets("RegistroBm").Select
ActiveSheet.Unprotect "rbn"
If Modalidad = "1er Bimestre" Then
Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
Selection.EntireColumn.Hidden = False
Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
Selection.EntireColumn.Hidden = True
ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
ActiveSheet.Protect "rbn"
Range("b3").Select
Plataforma.Hide
Plataforma.Show
End
End If
If Modalidad = "2do Bimestre" Then
Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
Selection.EntireColumn.Hidden = False
Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
Selection.EntireColumn.Hidden = True
ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
ActiveSheet.Protect "rbn"
Range("b3").Select
Plataforma.Hide
Plataforma.Show
End
End If
If Modalidad = "3er Bimestre" Then
Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
Selection.EntireColumn.Hidden = False
Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
Selection.EntireColumn.Hidden = True
ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
ActiveSheet.Protect "rbn"
Range("b3").Select
Plataforma.Hide
Plataforma.Show
End
End If
If Modalidad = "4to Bimestre" Then
Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
Selection.EntireColumn.Hidden = False
Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
Selection.EntireColumn.Hidden = True
ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
ActiveSheet.Protect "rbn"
Range("b3").Select
Plataforma.Hide
Plataforma.Show
End
End If
MsgBox "No a descrito que trimestre o curso desea ingresar, vuelva a intentarlo"
Plataforma.Hide
Plataforma.Show
End Sub

Espero haberme explicado bien, en todo caso gracias por leer mi pregunta, espero alguna respuesta. Gracias

Ruben

1 respuesta

Respuesta
1

Revisa el código de los 2 ejemplos "Progress Bar" y "Status Bar.

Intenta adecuar alguno de los 2 en tu macro, si tienes dudas avísame

https://www.dropbox.com/s/kqaahjh8m2i4yg8/progress%20bar.xls

Saludos. Dam
Si es lo que necesitas.

Gracias por la respuesta, no obstante al respecto del excel que me enviaste, comento. Al abrirlo y dar click en el button corre el userform con el progressbar pero no se si tiene un error o ese es el ejemplo que me estas dando... esto es que cuando corre el progress bar unas barras (avanza) aparece un mensaje el cual me pide que presione enter, este mensaje tiene un boton "Aceptar", en fin, o le doy enter o en Aceptar, el progressbar sigue en su avance hasta llegar al final. Pero aun no entiendo como utilizarlo en mis eventos, es decir que el progressbar avance barras tras barras, segun corre mis eventos. Perdon por mi falta de comprension, no obstante quizás un ejemplo:

'AQUI LA MACRO QUE UTILIZASTE EN EL USERFORM

Private Sub UserForm_Activate()
'Ejemplo de progress bar
'Por.dam

' AQUI LE DAS EL VALOR A TOTREG Y PROGRESBAR, ...EN SI EL MIN Y EL MAX

totreg = 10
ProgressBar1 = 0
ProgressBar1.Max = totreg

'AQUI DICES DE QUE REG SERA IGUAL AL AVANCE DE 0 HASTA EL VALOR DE TOTREG
For reg = 0 To totreg

'AQUI NO ENTIENDO...
Application.StatusBar = "Procesando registro " & reg & " de " & totreg

'AQUI DICES QUE PROGRESSBAR TIENE LA PROPIEDAD DE REG, ES DECIR DE 0 - 10

ProgressBar1 = reg

'AQUI ESTA EL MENSAJE PERO NO ENTIENDO EL VBINFORM..."PROGRESS..."

MsgBox "Presiona enter para avanzar el Progress Bar y el StatusBar", vbInformation, "PROGRESS BAR"
Next
Application.StatusBar = False
Unload Me
End Sub

En resumen no entiendo donde deberia o como deberia colocar mis eventos para que de acuerdo a la cantidad de procesos avance el progressbar.

Saludos, Ruben Q.

Quieres un progress bar, ¿para el código que pusiste?

Según puedo ver, solamente tienes un proceso, es decir, preguntas por la modalidad y dependiendo del número ejecutas unos pasos

If Modalidad = "1er Bimestre" Then
Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
Selection.EntireColumn.Hidden = False
Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
Selection.EntireColumn.Hidden = True
Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
Selection.EntireColumn.Hidden = True
ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
ActiveSheet.Protect "rbn"
Range("b3").Select
Plataforma.Hide
Plataforma.Show
End
End If

Y en cuál de esos pasos se tarda mucho?

También escribe al principio de tu macro esto

Application.ScreenUpdating = False

Y al final pon esto

Application.ScreenUpdating = True

La instrucción Application.ScreenUpdating = False, hace que los cambios en pantalla no se vean y hace más rápida la ejecución.

Te anexo la macro modificada, para que veas más o menos como debe quedar, no la puedo probar, porque tendría que recrear todos los controles que tienes, pero prueba y me comentas.

Private Sub CommandButton7_Click()
If Bimestre = "" Then
MsgBox "No describió el Bimestre, elija un Bimestre para poder continuar"
Plataforma.Hide
Plataforma.Show
End
End If
If CursoB = "" Then
MsgBox "No describió el curso, elija un curso para poder continuar"
Plataforma.Hide
Plataforma.Show
End
End If
Application.ScreenUpdating = False
ProgressBar1 = 0
ProgressBar1.Max = 5
CommandButton7.Visible = False
Cursos = CursoB.Text
CursoB.Visible = False
Cursos.Visible = True
Modalidad = Bimestre.Text
Modalidad.Visible = True
Bimestre.Visible = False
CommandButton1.Visible = True
CommandButton2.Visible = True
Sheets("Csistema").Select
ActiveSheet. Unprotect "rbn"
ActiveSheet. PivotTables("BIMESTRAL"). PivotFields("CURSO"). _
ClearAllFilters
ActiveSheet.PivotTables("BIMESTRAL").PivotFields("CURSO").CurrentPage = _
(Cursos)
ActiveSheet. Protect "rbn"
Sheets("RegistroBm").Select
ActiveSheet.Unprotect "rbn"
If Modalidad = "1er Bimestre" Then
    Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
    Selection.EntireColumn.Hidden = False
    ProgressBar1 = 1
    Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    ProgressBar1 = 2
    Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    ProgressBar1 = 3
    Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    ProgressBar1 = 4
    ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
    ActiveSheet.Protect "rbn"
    ProgressBar1 = 5
    Range("b3").Select
    Plataforma.Hide
    Plataforma.Show
    End
End If
If Modalidad = "2do Bimestre" Then
    Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
    Selection.EntireColumn.Hidden = False
    Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
    ActiveSheet.Protect "rbn"
    Range("b3").Select
    Plataforma.Hide
    Plataforma.Show
    End
End If
If Modalidad = "3er Bimestre" Then
    Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
    Selection.EntireColumn.Hidden = False
    Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
    ActiveSheet.Protect "rbn"
    Range("b3").Select
    Plataforma.Hide
    Plataforma.Show
    End
End If
If Modalidad = "4to Bimestre" Then
    Range("Tabla13[[#Headers],[1er Parcial4]:[Prom. 4to Bim.]]").Select
    Selection.EntireColumn.Hidden = False
    Range("Tabla13[[#Headers],[1er Parcial]:[Prom. 1er Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    Range("Tabla13[[#Headers],[1er Parcial2]:[Prom. 2do Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    Range("Tabla13[[#Headers],[1er Parcial3]:[Prom. 3er Bim.]]").Select
    Selection.EntireColumn.Hidden = True
    ActiveSheet.ListObjects("Tabla13").Range.AutoFilter Field:=4, Criteria1:=Cursos
    ActiveSheet.Protect "rbn"
    Range("b3").Select
    Plataforma.Hide
    Plataforma.Show
    End
End If
MsgBox "No a descrito que trimestre o curso desea ingresar, vuelva a intentarlo"
Plataforma.Hide
Plataforma.Show
Application.ScreenUpdating = True
End Sub

Saludos.Dam
Si es lo que necesitas.

Dam

Muchas gracias, ya lo probé... y corre correctamente. la ensaye con y luego sin la Application.ScreenUpdating Y por lo que estoy entendiendo esto me sirve para agilizar la macro, por lo que al quitarla funciona igual pero a mi parecer microsegundos mas lenta que sin ella.... en todo caso me funciona muy bien y al parecer solo me servirá cuando el PC DE MI CLIENTE SEA LENTO, por que en el mio me funciona tan rapido que casi no se siente el avance del progressbar. A demás gracias a tu ejemplo creo que podre desde ahora utilizar el progressbar en otros proyectos. Saludos y nuevamente Muchas Gracias.

Ruben Q.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas