2011-12-23 30 views
7

Estoy intentando crear un mensaje Please Wait en Excel-VBA. Esto es para recordar al usuario que procesa una consulta sql que el proceso aún está en curso.Excel VBA mensaje emergente "Espere por favor"

Me gustaría que este mensaje se muestre en una forma de usuario.

Actualmente, el usuario se conecta a sql db, selecciona db y algunas otras opciones, presiona Ir ... y el formulario no se descarga. En el punto Ir, tengo otro formulario que aparece con el mensaje Please Wait, pero este formulario no se descarga, es decir, el comando sql execute no se ejecuta.

Mi código para llamar el formulario de usuario Please Wait, incluyendo una etiqueta:

Call WaitShowSQl.ExecuteCall KillWaitCall WaitShow 
    SQl.Execute 
    Call KillWait 

En otro módulo de código que tengo:

Sub WaitShow() 
    Wait.Show 
    End Sub 

    Sub KillWait() 
    Unload Wait 
    End Sub 

he UserForm llamada wait con siguiente código:

Private Sub UserForm_Activate() 
Call PleaseWait 
End Sub 

Sub PleaseWait() 
Wait.Label1.Caption = "Calculating...Please Wait!" 
End Sub 

Ahora, al ejecutar el código, el tiempo de ejecución es no mover hacia atrás a través del módulo con el fin de ejecutar lo siguiente:

SQl.ExecuteSQl.Execute 

puedo mostrar el progreso del programa con una barra de estado, pero un formulario de usuario mensaje emergente sería muy útil para este programa.

Respuesta

6

El comportamiento predeterminado del método Form.Show es mostrar el formulario como un cuadro de diálogo modal. Lo que se busca es un cuadro de diálogo modal, por lo que deberá especificar que, de esta manera:

Sub WaitShow() 
    Wait.Show vbModeLess 
End Sub 

Actualización:

Si no puedes usuario un cuadro de diálogo modal, tiene otras opciones, como mencionado en un comentario. Uno de ellos es dejar que la forma de usuario de espera ejecute el SQL. Esto podría hacerse así:

En la forma de espera, primero declarar las variables

Private mySomeParameter1 As String 
Private mySomeReturnValue1 As String 

'Input parameters to the form 
Public Sub Init(ByVal some_parameter1 As String, ...) 
... Initialize your SQL, NOT execute it 
End Sub 

'Output values from the from 
Public Sub GetReturns(ByRef some_return_value1 As String, ...) 
... set the output parameters... 
End Sub 

'Do the work 
Private Sub UserForm_Activate() 
    Call PleaseWait 
    'Either call DoEvents or a manual Refresh to let the label display itself 
    Call ExecutSQL ' A function that executes the SQL 
    Unload Me 
End Sub 

Y en la forma principal:

Sub WaitShow() 
    Wait.Init(the parameters...) 
    Wait.Show 
    Wait.GetReturns(the results...) 
End Sub 

Sin embargo, otra opción para usted sería saltarse la Espera forma completamente y en su lugar muestra una imagen "Esperando" en la forma principal y la oculta cuando se realiza el procesamiento de SQL.

+0

Gracias por responder GTG. Ya lo he intentado y entiendo esto: no se puede mostrar el formulario no modal cuando se muestra el formulario modal. – Fwafa

+0

Además, olvidé mencionar que todavía se muestra el primer formulario donde el usuario selecciona las opciones. – Fwafa

+1

Suponiendo que su primer formulario debe ser modal, puede colocar su código SQL Execution dentro de la forma de usuario "Waiting" o llamar a una función en el formulario principal desde la forma de usuario "Waiting". De esta forma no necesitas módulos adicionales. Una tercera opción sería crear un .exe ActiveX para el formulario "Waiting" y dejar que ese proceso muestre un formulario "Waiting" no modal. Sin embargo, eso requeriría que implementes ese .exe junto con tu hoja de Excel. – GTG

1

Así es como para mostrar una barra de progreso mientras los usuarios están esperando para Excel para terminar el procesamiento:

https://stackoverflow.com/a/10791349/138938

Excel progress bar

En su caso, se puede adivinar un tiempo razonable "promedio" para sus consultas y la actualización de la barra de progreso con porcentajes de ese tiempo, lo que garantizará a los usuarios que Excel está funcionando y que no deben entrar en pánico.

0

Mi solución es mucho menos elegante e impresionante que las demás. FYI, mi script está procesando para una cantidad de socios dentro de FOR ...NEXT loop, y quiero actualizar la pantalla con el socio que se está procesando actualmente.

Creé una pestaña de la hoja de trabajo llamada "Mensajes". Expandí la celda A1 todo lo que pude, y elegí una fuente que me gustaba y me gustaba. Mi script comienza apagando ScreenUpdating. Luego

Sheets("Messages").Select 
Cells(1, 1).Value = "Processing " & Partner 
Application.ScreenUpdating = True 
Application.ScreenUpdating = False 

Después de esto, vuelvo a la hoja que necesito. Nada de lujos, pero es rápido, fácil y hace lo que necesito. :)

0

Puedo usar un botón de comando en la forma establecida en un tamaño muy pequeño, oculto cuando se carga el formulario, con el subtítulo "Un momento, procesamiento ..."

que cambiar el tamaño del botón en forma Evento Iniliatlise (simplemente cambio el tamaño del tamaño del formulario usando las propiedades de altura superior, izquierda, ancho &). Por supuesto, puede hacerlo de cualquier tamaño que desee.

Pongo el botón de comando visible justo antes de que mi código que consume tiempo & lo vuelva a ocultar al final del código.

Requiere algunos "DoEvents", pero funciona perfectamente.