Tengo una base de datos que usa Access 2007-2010 y tengo un AutoExec que comienza automáticamente a detectar cuándo y si un usuario deja la interfaz abierta, se cerrará después de una hora. Utilicé Detectar tiempo de inactividad de usuario del sitio web de Microsoft https: // msdn. microsoft.com/en-us/library/office/ff192885.aspx y al final hice guardar y cerrar el programa en lugar de cómo lo hicieron. El problema que tengo es que rompe todos los demás códigos que se escribieron en vba. Tengo otro formulario con botones que copian entradas en una tabla y cambian lo que quiere el usuario, y todos funcionaron hasta que agregué esta macro. Cuando comento todo mi código para que no haga nada y dejo la macro igual para que se inicie, todavía rompe el otro código. No estoy seguro de si es porque tengo la macro para iniciar un formulario con el código para detectar el tiempo de inactividad que se ejecuta constantemente, lo que hace que todo lo demás funcione parcialmente.

Mi macro que se llama "AutoExec"

Aquí está mi código para detectar el tiempo de inactividad.

    Option Compare Database

    Sub Form_Timer()

     ' IDLEMINUTES determines how much idle time to wait for before
     ' running the IdleTimeDetected subroutine.
     Const IDLEMINUTES = 60

     Static PrevControlName As String
     Static PrevFormName As String
     Static ExpiredTime

     Dim ActiveFormName As String
     Dim ActiveControlName As String
     Dim ExpiredMinutes

     On Error Resume Next

     ' Get the active form and control name.

     ActiveFormName = Screen.ActiveForm.Name
     If Err Then
        ActiveFormName = "No Active Form"
        Err = 0
     End If

     ActiveControlName = Screen.ActiveControl.Name
        If Err Then
        ActiveControlName = "No Active Control"
        Err = 0
     End If

    Me.CurFormtxt = ActiveFormName

     ' Record the current active names and reset ExpiredTime if:
     '    1. They have not been recorded yet (code is running
     '       for the first time).
     '    2. The previous names are different than the current ones
     '       (the user has done something different during the timer
     '        interval).
     If (PrevControlName = "") Or (PrevFormName = "") _
       Or (ActiveFormName <> PrevFormName) _
       Or (ActiveControlName <> PrevControlName) Then
        PrevControlName = ActiveControlName
        PrevFormName = ActiveFormName
        ExpiredTime = 0
     Else
        ' ...otherwise the user was idle during the time interval, so
        ' increment the total expired time.
        ExpiredTime = ExpiredTime + Me.TimerInterval
     End If

     ' Does the total expired time exceed the IDLEMINUTES?
     ExpiredMinutes = (ExpiredTime / 1000) / 60
     Me.TimeInactivitytxt = ExpiredMinutes
     If ExpiredMinutes >= IDLEMINUTES Then
        ' ...if so, then reset the expired time to zero...
        ExpiredTime = 0

        ' ...and close the program
        Application.Quit acQuitSaveAll
     End If
  End Sub
1
Kayracer 15 dic. 2016 a las 02:44

2 respuestas

La mejor respuesta

Después de jugar, encontré una solución para este problema. Lo que hice fue crear un nuevo método que se encuentra a continuación, donde lo llamo en mis otros métodos dos veces. Esto es para que primero apague el temporizador, haga lo que tenga que hacer y vuelva a llamarlo para volver a habilitarlo. El único inconveniente es que tengo que agregarlo a todos los métodos que lo necesitan.

Private Sub TimerIntervalSwitch()

'MsgBox "TimerIntervalSwitch was called"
'To turn off and on the timer on the form DetectIdleTime
If Form_DetectIdleTime.TimerInterval = 1000 Then
    Form_DetectIdleTime.TimerInterval = 0
    MsgBox "Timer Off"
ElseIf (Form_DetectIdleTime.TimerInterval = 0) Then
    Form_DetectIdleTime.TimerInterval = 1000
    MsgBox "Timer On"

End If
End Sub
1
Kayracer 19 dic. 2016 a las 23:01

Ese es un problema bien conocido. El temporizador interrumpe y puede interrumpir lo que el usuario está trabajando actualmente.

Lamentablemente, no hay forma de evitarlo, y me he preguntado durante años por qué todavía se recomienda ese código. No causará más que problemas, como ha visto.

0
Gustav 15 dic. 2016 a las 07:28