这是我第一次在本网站上发帖,并希望得到一些帮助。我是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
答案 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 TimeStop
和Call TimeSetting
重置计时器?