我将尝试尽可能明确地处理我的问题。
我有一个工作簿,其中所有工作表都受密码保护,并且在运行表单时会运行大量代码。
现在这个工作簿在3个不同的部门上运行,每个部门都有一个拥有自己密码的部门负责人。我尝试这样做的最简单方法是首先在模块中设置:
Public pass As String
我还有一个关于start事件的工作簿来定义这个变量:
pass = ThisWorkbook.Worksheets("Pass").Range("A1").Value
ThisWorkbook.Worksheets("Pass").Visible = xlSheetVeryHidden
因此,您可以看到我将密码存储在工作表“Pass”的A1中
这样部门主管可以随时通过我创建的表单更改密码。这使他们的密码保密。
现在所有的工作簿都很好,除非它进入我创建的超级用户模式,显示部门负责一些隐藏的工作表,并允许他们每月进行审计。
他们通过具有以下代码的表单访问此超级用户模式:
Private Sub cmdAdd_Click()
Dim min As Long
Dim sVal As String
Dim ws As Worksheet
Dim wb As Worksheet
Dim ktime As Date
Dim wn As Worksheet
Dim wc As Worksheet
Set ws = Worksheets("Formularios")
Set wb = Worksheets("LookupList")
Set wn = Worksheets("Coordenador")
Set wc = Worksheets("Time")
If Trim(Me.txtPass.Value) = "" Then
Me.txtPass.SetFocus
MsgBox "Por favor inserir Password"
Exit Sub
End If
If Trim(Me.txtMinuto.Value) = "" Then
Me.txtMinuto.SetFocus
MsgBox "Por favor inserir Tempo"
Exit Sub
End If
min = CInt(txtMinuto)
sVal = txtPass.Value
If sVal = pass Then
For Each Worksheet In ThisWorkbook.Worksheets
Worksheet.Unprotect Password:=sVal
Worksheet.Visible = xlSheetVisible
Next
ktime = Now + TimeSerial(0, min, 0)
ThisWorkbook.Sheets("Pass").Visible = xlSheetVeryHidden
ThisWorkbook.Sheets("Coordenador").Range("O" & Range("Coordenador!O1048000").End(xlUp).Row + 1).Value = ktime
Application.OnTime ktime, "CloseC"
ThisWorkbook.Sheets("Coordenador").Range("P11") = ktime
ws.Protect Password:=pass
wb.Protect Password:=pass
wn.Protect Password:=pass
wb.Visible = xlSheetHidden
Calc
wc.Unprotect Password:=pass
wc.Range("I1").Value = "c"
wc.Protect Password:=pass
Audit
Unload Me
Else: MsgBox "There is a problem - check your password, capslock, etc."
End If
End Sub
正如您所看到的,表格会询问他们成为超级用户的分钟数。并且它在结束时运行“CloseC”宏,这是将所有内容与密码重新组合在一起并结束超级用户的宏。
这是我的问题:如果一个部门负责人运行该表格两次或更多次,理论上它应该只是将新时间添加到excel的“Ontime”功能,该功能在他上次引入时运行宏“CloseC”,然而这并没有发生,而且excel正在创建一个新的“Ontime”实例,并且仍然是第一次运行CloseC。 当发生这种情况时,代码会发生奇怪的事情,它不再允许您运行超级用户表单,而是会出现密码错误的错误。我可以通过关闭并打开工作簿来绕过最后一个错误。
感谢您提供任何改进我的代码的帮助或方法。
答案 0 :(得分:0)
根据@Rory评论,我将此添加到代码中:
If wn.Range("O2") <> "" Then
For Tsweep = 2 To Range("Coordenador!O1048000").End(xlUp).Row
Application.OnTime EarliestTime:=Range("Coordenador!O" & Tsweep).Value, Procedure:="CloseC", Schedule:=False
Next Tsweep
wn.Range("O:O").ClearContents
End If
似乎工作正常。 谢谢你的帮助。