VBA如何在不活动后保存和关闭工作簿,除非用户窗体打开?

时间:2017-03-24 13:47:58

标签: vba excel-vba userform excel

这是我第一次在本网站上发帖,并希望得到一些帮助。我是mrexcel论坛的成员,并且从那里的那些伟大的人那里得到了很多帮助,但是还没有找到我的问题的答案。在工作中,我创建了一个工作簿,允许我们通过用户表单将数据输入到不同的工作表中。我试图尽可能地使用户友好,尝试消除尽可能多的“用户错误”。我试图避免的一个问题是用户忘记在他们的班次结束时关闭工作表,并锁定所有人,因为当另一个用户打开文件时工作簿是只读的。所以,我有一个代码,可以在40分钟不活动后保存并关闭工作簿。这引起的一个问题(这是一个非常小的问题,但是我的一位员工提出的问题)是,每隔一段时间,巧合的是用户将数据输入到用户表单中那40分钟不活动,工作簿将在他们有机会提交数据之前关闭。我想知道是否有人可以帮我修改我的代码,以便当它达到40分钟不活动时,在保存和关闭之前,它会看到用户窗体打开并取消操作。这是我得到的代码。感谢您提供的任何帮助。

在第1单元中:

Dim CloseTime As Date
Sub TimeSetting()
    CloseTime = Now + TimeValue("00:40:00")
    On Error Resume Next
    Application.OnTime EarliestTime:=CloseTime, _
      Procedure:="SavedAndClose", Schedule:=True
End Sub
Sub TimeStop()
    On Error Resume Next
    Application.OnTime EarliestTime:=CloseTime, _
      Procedure:="SavedAndClose", Schedule:=False
End Sub
Sub SavedAndClose()
    ActiveWorkbook.Close Savechanges:=True
End Sub

在ThisWorkbook中:

Private Sub Workbook_Open()
    Call TimeSetting
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call TimeStop
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Call TimeStop
    Call TimeSetting
End Sub

3 个答案:

答案 0 :(得分:0)

只需致电TimeStop()事件中的Userform_Initialize()子,然后在关闭用户表单时调用TimeSetting()

答案 1 :(得分:0)

您可以使用此功能查看是否加载了用户表单:

Function IsUFLoaded(ByVal UFName As String) As Boolean
    Dim UForm As Object

    For Each UForm In VBA.UserForms
        If UForm.Name = UFName Then
            IsUFLoaded = True
            Exit For
        End If
    Next
End Function

然后在SavedAndClose Sub:

Sub SavedAndClose()
    ' change userform_name to your userform name
    If IsUFLoaded("userform_name") = False Then ActiveWorkbook.Close Savechanges:=True
End Sub

答案 2 :(得分:-1)

为什么不这样做,而不是做你建议的事情:允许用户不小心让自己登录到会导致你试图避免的问题的用户形式,而你也< / em>在用户表单中字段的更改事件中使用Call TimeStopCall TimeSetting重置计时器?