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.