Cómo mostrar el progreso en la barra de estado cuando se ejecuta una secuencia de consultas en MS Access

Tengo una macro en microsoft Access 2010 en Windows 7, el cual se ejecuta una secuencia de bastante lento de la Tabla y de las consultas de Actualización. Quiero que se muestre en la barra de estado de la consulta que se está ejecutando, como el habitual mensaje de «Ejecutar consulta» no dar 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 en la vuelta, como un argumento, y luego me llaman PutStatusBarBack al final de la macro. Me dirijo advertencias off al inicio y al final. Esto funciona realmente bien, justo como yo quiera.

Sin embargo, no quiero estar presionando OK en un cuadro de mensaje cada vez que se inicia una consulta. Si yo comente la MsgBox declaración, no funciona más. Los resultados son variables. A veces se muestra algo en la barra de estado, a veces no. Cuando me encontré con él ahora mismo, acabo de recibir el mensaje «Ready» en todo, pero a veces tengo la deseada mensaje que aparece para algunos, pero no en todas las consultas.

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

InformationsquelleAutor Zajonc | 2015-01-04

4 Kommentare

  1. 3

    Ahora topé con este así que lo más probable es demasiado poco, demasiado tarde, pero asegúrese de que durante cada iteración, después de cambiar la barra de estado de la llamada DoEvents. Esto indica que el procedimiento para devolver el control a la aplicación y Windows por un segundo, que es la forma en que los cambios que el texto de barra de estado. Es también la manera de mantener el Acceso de mirar para Windows como es no responder.

  2. 2

    Gracias a la ayuda que he recibido de HansUp en respuesta a una pregunta similar (Cómo mostrar el progreso en la barra de estado cuando se ejecuta el código (no consultas)) que he publicado después, ahora puedo responder a esta pregunta a mí mismo.

    Para que el código funcione sin la llamada a MsgBox, tienes que poner dos líneas antes de la llamada a la Aplicación.Eco:

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

    Esta ahora hace exactamente lo que quiero.

  3. 1

    Correspondiente a @Zajonc comentario a Hauns TM respuesta.

    Sucede, porque ot de esta línea:

    RetVal = SysCmd(5)
    

    Esto significa: la actualización de la barra de estado.

    Más acerca de la barra de estado en MS Access: ACC: Cómo Cambiar el Texto de Barra de Estado Mediante SysCmd()

    Así, hasta la primera procedimiento funciona, no actualizar de 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 ;)
    

    Saludos,

    Maciej

    • Gracias Maciej, pero, por desgracia, todavía no funciona. SysCmd(4,…) que se sobrescribe con Acceso propio mensaje de «Ejecutar Consulta». La única manera de evitar este parece ser el uso de la función Eco. Me siento tan cerca, debido a que se trabaja con el MsgBox!
    • lo que estoy tratando de decir es que para quitar el PutStatusBarBack de *RunQueryAndReportStatusWithMsgBox procedimiento 😉
    • Gracias Maciej. Tomé mi código original (ver la pregunta anterior) y poner un comentario en la parte delantera de la primera llamada a PutStatusBarBack (la llamada MsgBox también fue comentada, como se describe en la pregunta). Comentando PutStatusBarBack no hizo ninguna diferencia. No se muestra nada en la barra de estado, aparte de «Listo», la mayoría del tiempo. Hizo el trabajo para usted?
    • Muy interesante el comportamiento… No, no la he probado. Hoy en día es bastante tarde (sobre las 00:00 AM). Voy a buscar en el código de nuevo mañana.
  4. 0

    No estoy seguro de que esto es lo que están 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 %)
    

    I. e. cambiar la asignación en Application.StatusBar cada vez que usted desea cambiar.

    • Gracias por tu sugerencia Hans TM. Por desgracia, el Acceso no entiende de Aplicación.La barra de estado. Me hizo intentar RetVal = SysCmd(4, «Ejecutar» & QueryName & » …») en un principio, pero la barra de estado que se sobrescribe con Acceso diciendo «Ejecutar Consulta».

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein