【问题标题】:VBA How to save and close workbook after time of inactivity, unless userform is open?VBA如何在不活动时间后保存和关闭工作簿,除非用户窗体打开?
【发布时间】:2017-03-24 13:47:57
【问题描述】:

这是我第一次在这个网站上发帖,希望能得到一些帮助。我是 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

在本工作簿中:

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

【问题讨论】:

    标签: vba excel userform


    【解决方案1】:

    只需在Userform_Initialize() 事件上调用TimeStop() 子程序,然后在关闭用户窗体时调用TimeSetting() 子程序

    【讨论】:

    • 令我惊讶的是,我经常过度分析事物并完全忽略一个简单的解决方案。非常感谢。
    【解决方案2】:

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

    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
    

    然后在SavedAndCloseSub:

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

    【讨论】:

      【解决方案3】:

      为什么不呢,而不是按照你的建议去做:允许用户不小心让自己登录到用户表单,这会导致你试图避免的问题,而是重置用户表单中字段更改事件中带有Call TimeStopCall TimeSetting 的计时器?

      【讨论】:

      • 非常感谢。这是一个如此简单的解决方案。这些通常是我最看不起的。大声笑。
      猜你喜欢
      • 1970-01-01
      • 2017-12-19
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多