在一定的空闲时间后自动关闭表格

时间:2014-05-30 06:59:17

标签: vba ms-access timer access-vba ms-access-2010

我在访问表单上遇到了一些问题。

我有两种形式:

  • menu-form
  • 输入形式

输入表单空闲一分钟后,我想关闭它并返回菜单表单。

这是我的代码,它不起作用。

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

我还在其中创建了一个宏。

Sub FormExpire()
   Unload input-form
End Sub

3 个答案:

答案 0 :(得分:1)

您需要将form.Timer设置为60000(即1分钟),然后在OnTimer事件上使用以检查某些属性是否已更改。下面我快速写了一些东西来给你一个想法,但它不完整也没有经过测试。

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

答案 1 :(得分:0)

这里有几个潜在的问题。 首先,这不是你关闭表格的方式。

此:

Sub FormExpire()
   Unload input-form
End Sub

应该看起来像这样:

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

您的第二个问题是我不相信Access可以使用Application.Ontime方法。 MSDN说它是Excel函数,我在Access Documentation中找不到它。我个人有兴趣看到你让你的方法与Access form Timer Event一起使用。

我不确定这是否重要,但我认为这就是你要做的事情。

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

如果不包括@ iDevelop的answer,我不确定这种方法是否可行。我只是想帮助澄清你哪里出错了。

答案 2 :(得分:0)

我意识到这个线程已经过时了,但我最近遇到了需要从计时器事件中关闭表单的情况,并在这里找到了答案。我的情况略有不同,因为我有几个表单要关闭,所以这是我的解决方案。

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