jake
jake

Reputation: 165

Automatically Close Form After Certain Idle Time

I am having a little bit problem on my access form.

I have 2 forms:

After input-form has been idle for one minute, I want to close it and go back to the menu-form.

This is my code that isn't working.

Public ExpireTime    As Date  'expiration time-date value

Sub ResetExpiration()             

    If ExpireTime <> 0 And ExpireTime > Now Then
        Application.OnTime ExpireTime, "FormExpire", schedule:=False
    End If

    ExpireTime = Now + 1 / 1440#    

    Application.OnTime ExpireTime, "FormExpire", schedule:=True

End Sub

I also created a macro with this in it.

Sub FormExpire()
   Unload input-form
End Sub

Upvotes: 5

Views: 8728

Answers (3)

john rains
john rains

Reputation: 391

I realize that this thread is aged but I recently experienced a need to close forms from a timer event and came across the answers here. My situation was slightly different as I had several forms to close so here is my solution.

Private Sub Form_Timer()

Dim daysRemaining As Integer
Dim endDate As Date

endDate = "4/15/2021"

daysRemaining = DateDiff("d", Now, endDate)
 
MsgBox ("This is an evaluation version of the application. You have " & Str(daysRemaining) & " days of use remaining")
    
If daysRemaining < 1 Then
    Close_All
End If

End Sub

Private Sub Close_All()
    For Each myForm In CurrentProject.AllForms
        strFormName = myForm.name
        DoCmd.Close acForm, strFormName
    Next

End Sub

Upvotes: 0

RubberDuck
RubberDuck

Reputation: 12768

You've got a couple of potential issues here. First and foremost, that's not how you close a form.

This:

Sub FormExpire()
   Unload input-form
End Sub

Should look something more like this:

Sub FormExpire()
    DoCmd.Close acform, Me.Name
    DoCmd.OpenForm "menu-form"
End Sub

Your second issue is that I don't believe the Application.Ontime method is available from Access. MSDN says it's an Excel function, and I can't find it in the Access Documentation. I'd personally be interested in seeing you make your method work with the Access form Timer Event.

I'm not sure it matters, but I think this is what you were trying to do.

Public ExpireTime    As Date  'expiration time-date value

Private Sub InputForm_Timer()             

    If ExpireTime <> 0 And ExpireTime > Now Then
        Call FormExpired
    Else
        ' reset timer
        ExpireTime = Now + 1 / 1440#             
    End If

End Sub

I'm not sure this method would work without also including @iDevelop's answer. I just wanted to help clarify where you were going wrong.

Upvotes: 0

iDevlop
iDevlop

Reputation: 25272

You need to set the form.Timer to 60000 (that is 1 minute) then use on OnTimer event to check if some properties have changed. Below I quickly wrote something to give you an idea, but it is not complete nor tested.

Option Compare Database
Option Explicit

Dim isIdle As Boolean


Private Sub Form_LostFocus()
    'you can use this event also
End Sub


Private Sub Form_Timer()
    Dim ctlName As String, wasDirty As Boolean
    If ctlName = vbNullString Then ctlName = Me.ActiveControl.Name
    If Me.ActiveControl <> ctlName Then isIdle = False
    If wasDirty <> Me.Dirty Then isIdle = False
    'more checks....
    If isIdle Then DoCmd.Close acForm, Me.Name
End Sub

Upvotes: 1

Related Questions