¿Cómo creo un cuadro de diálogo de estado en Excel?
Pregunta
He creado un generador de informes de base de datos en Excel.Estoy intentando crear un cuadro de diálogo que muestre información de estado mientras se ejecuta el programa.
Cuando genero el informe, aunque aparece el cuadro de diálogo, no puedo actualizar/actualizar la información que muestra.La mayoría de las veces, el cuadro de diálogo sólo aparece parcialmente.Intenté usar el método .repaint, pero sigo obteniendo los mismos resultados.Solo veo el cuadro de diálogo completo, después de generar el informe.
Solución
El siguiente código funciona bien al realizar acciones en Excel (XP o posterior).
Para acciones que tienen lugar fuera de Excel, por ejemplo conectarse a una base de datos y recuperar datos, lo mejor que ofrece esto es la oportunidad de mostrar cuadros de diálogo antes y después de la acción (p. ej. "Obteniendo datos", "Tengo datos")
Crea un formulario llamado "estadofrm", coloque una etiqueta en el formulario llamado "Etiqueta1".
Establecer la propiedad del formulario 'MostrarModal' = falso, esto permite que el código se ejecute mientras se muestra el formulario.
Sub ShowForm_DoSomething()
Load frmStatus
frmStatus.Label1.Caption = "Starting"
frmStatus.Show
frmStatus.Repaint
'Load the form and set text
frmStatus.Label1.Caption = "Doing something"
frmStatus.Repaint
'code here to perform an action
frmStatus.Label1.Caption = "Doing something else"
frmStatus.Repaint
'code here to perform an action
frmStatus.Label1.Caption = "Finished"
frmStatus.Repaint
Application.Wait (Now + TimeValue("0:00:01"))
frmStatus.Hide
Unload frmStatus
'hide and unload the form
End Sub
Otros consejos
Intente agregar un hacereventos llama a tu bucle.Eso debería permitir que el formulario se vuelva a pintar y acepte otras solicitudes.
He utilizado la propia barra de estado de Excel (en la parte inferior izquierda de la ventana) para mostrar información de progreso para una aplicación similar que desarrollé en el pasado.
Funciona muy bien si sólo desea mostrar actualizaciones textuales sobre el progreso y evita la necesidad de un cuadro de diálogo de actualización.
Ok @JonnyGold, aquí hay un ejemplo del tipo de cosas que usé...
Sub StatusBarExample()
Application.ScreenUpdating = False
' turns off screen updating
Application.DisplayStatusBar = True
' makes sure that the statusbar is visible
Application.StatusBar = "Please wait while performing task 1..."
' add some code for task 1 that replaces the next sentence
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = "Please wait while performing task 2..."
' add some code for task 2 that replaces the next sentence
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = False
' gives control of the statusbar back to the programme
End Sub
¡Espero que esto ayude!
Inserte una hoja en blanco en su libro de trabajo. Cambie el nombre de la hoja, por ejemplo."información"
Sheets("information").Select
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Continuar Macro
Sheets("information").Select
Range("C3").Select
Application.ScreenUpdating = True
ActiveCell.FormulaR1C1 = "Preparing Information"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Continuar Macro
Etc. Alternativamente, seleccione una celda en blanco en algún lugar de la hoja existente en lugar de insertar una nueva hoja
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Etc
El cuadro de diálogo también se ejecuta en el mismo hilo de la interfaz de usuario.Por lo tanto, está demasiado ocupado para volver a pintarse.No estoy seguro de si VBA tiene buenas capacidades de subprocesos múltiples.