una progreso mientras macro ejemplo ejecuta datos consulta barra actualizar actualizacion access-vba ms-access-2010 statusbar

access-vba - progreso - consulta de actualizacion access 2013



Cómo mostrar el progreso en la barra de estado al ejecutar una secuencia de consultas en MS Access (4)

Tengo una macro en MS Access 2010 en Windows 7 que ejecuta una secuencia bastante lenta de hacer consultas de tabla y actualización. Quiero que se muestre en la barra de estado cuya consulta se está ejecutando, ya que el mensaje habitual "Ejecutar consulta" no da el nombre de la consulta.

He escrito el siguiente VBA:

Function RunQueryAndReportStatusWithMsgBox(QueryName As String) Dim RetVal As Variant On Error GoTo ErrHandler PutStatusBarBack MsgBox "About to run query" Application.Echo False, "Executing " & QueryName & " ..." DoCmd.OpenQuery QueryName, acViewNormal, acEdit On Error GoTo 0 Exit Function ErrHandler: Select Case Err Case 2501: '' OpenQuery cancelled by the user pressing escape MsgBox "The OpenQuery action for query " & QueryName & " was cancelled by the user." Case Else: '' Another error has occurred. '' Display the error number and the error text. MsgBox "Error # " & Err & " : " & Error(Err) End Select '' Put status bar back to normal. PutStatusBarBack End Function Function PutStatusBarBack() Dim RetVal As Variant On Error GoTo ErrHandler '' Put status bar back to normal. RetVal = SysCmd(5) '' not sure if I need this. Application.Echo True, "" On Error GoTo 0 Exit Function ErrHandler: '' Display the error number and the error text. MsgBox "Error # " & Err & " : " & Error(Err) '' Put status bar back to normal. RetVal = SysCmd(5) '' not sure if I need this. Application.Echo True, "" End Function

He escrito una macro para llamar a RunQueryAndReportStatusWithMsgBox con cada consulta a su vez como argumento, y luego llamo a PutStatusBarBack al final de la macro. Apago las advertencias al principio y al final. Esto funciona realmente bien, justo como yo quiero.

Sin embargo, no quiero presionar Aceptar en un cuadro de mensaje cada vez que se inicia una consulta. Si comento la declaración MsgBox , ya no funciona. Los resultados son variables A veces muestra algo en la barra de estado, a veces no. Cuando lo ejecuté en este momento, acabo de recibir el mensaje "Listo", pero a veces aparece el mensaje deseado para algunas, pero no para todas las consultas.

He intentado usar RefreshDatabaseWindow lugar de MsgBox , pero eso no hace ninguna diferencia.


Correspondiente al comentario de @ Zajonc a la respuesta de Hauns TM.

Sucede, porque de esta línea:

RetVal = SysCmd(5)

Esto significa: barra de estado de actualización.

Más sobre la barra de estado en MS Access: ACC: Cómo cambiar el texto de la barra de estado usando SysCmd ()

Por lo tanto, hasta que el primer procedimiento funcione, no actualice la barra de estado;)

For i = 1 to 10 SysCmd(4, "Running query " i & " of " & 10) ''your code here... RunQueryAndReportStatusWithMsgBox(...) Next ''here you should refresh status bar ;)

Aclamaciones,
Maciej


No estoy seguro de que esto es lo que estás buscando? Tal vez:

Dim statusText As String Dim statusPercent As Integer statusText = "Yada yada..." statusPercent = 100 / 500 * 100 Application.StatusBar = "Progress: " & statusText & "(" & Cstr(statusPercent) & " %)" ''Progress: Yada yada... (20 %)

Es decir, cambie la asignación en Application.StatusBar cada vez que desee que cambie.


Acabo de tropezar con esto, así que es muy poco, demasiado tarde, pero asegúrese de que durante cada iteración, después de cambiar la barra de estado, llame a DoEvents. Esto le indica a su procedimiento que devuelva el control a la aplicación y a Windows por un segundo, que es cómo cambia ese texto de la barra de estado. También es la forma de evitar que Access acceda a Windows como si no respondiera.


Gracias a la ayuda que recibí de HansUp al responder una pregunta similar ( Cómo mostrar el progreso en la barra de estado al ejecutar código (no consultas) ) que publiqué después, ahora puedo responder esta pregunta yo mismo.

Para hacer que el código funcione sin la llamada a MsgBox, debe poner dos líneas antes de la llamada a Application.Echo:

RetVal = SysCmd(4, "Executing " & QueryName & " ...") DoEvents

Esto ahora hace exactamente lo que quiero.