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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top