所以我一直在尝试整理一个Excel表格,其中有一个条目登录。因此,无论何时关闭工作表,都会添加名称,日期和时间。
所以基本上我有三个宏运行,我只提两个。主宏将询问我是否要关闭工作表,我将不得不回答是或否。这很好用。如果我按是,主宏将调用子宏,这将要求我输入一个字符串。如果此Inputbox为空或条目被取消,我希望main sub停止运行并取消Close进程。这似乎没有成功。代码中的错误似乎很清楚,但我不知道如何防止它并找到更好的解决方案。如果你能帮我提出一个解决方案,我会非常感激。
这行代码似乎是问题所在:
If Cancel_Button_LOG = False Then Cancel = True
这里我将添加两个宏的压缩版本
Public Sub Add_Entry_to_Log()
Dim i As Integer
Dim response As Variant
Cancel_Button_LOG = True
response = InputBox("Please enter your Name", "Name")
If response <> "" Then
Else
Cancel_Button_LOG = False
MsgBox "Please enter your name", vbExclamation + vbOKOnly, "Name"
End If
Worksheets("Log").Protect "secret"
ThisWorkbook.Save
End Sub
现在我想使用Cancel_Button_log
变量来取消主要子
Dim answer As Variant
answer = MsgBox("Are your sure you want to close the workbook?", vbYesNo) Cancel = False
Select Case answer
Case Is = vbYes
Worksheets("Log").Unprotect "secret"
Call Test
Call Add_Entry_to_Log
If Cancel_Button_LOG = False Then Cancel = True
Worksheets("Log").Protect "secret"
Case Is = vbNo
Cancel = True
End Select
ThisWorkbook.Save
End Sub
答案 0 :(得分:2)
我认为你是以最复杂的方式做到这一点。如果我正确理解您的要求 - 您可以使用以下内容替换ThisWorkbook
模块中的所有代码:
Const WB_LOG As String = "Log" '// name of sheet that the log is in
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MsgBox("Do you really want to close the workbook?", vbYesNo) = vbYes Then
With Sheets(WB_LOG)
.Range("A" & .Rows.Count).End(xlUp).Offset(1, 0).Resize(1, 2).Value = Array(Environ$("USERNAME"), Now)
End With
ThisWorkbook.Save
Else
Cancel = True
End If
End Sub
Private Sub Workbook_Open()
With Sheets(WB_LOG)
.Protect Password:="secret", UserInterfaceOnly:=True
.Range("A1:B1").Value = Array("USERNAME", "TIMESTAMP")
End With
End Sub
这将取消用户手动插入其名称的必要性(假设他们的系统用户名足够*),并且每次因为我使用UserInterfaceOnly
选项时都不需要取消保护工作表。< / p>
* %USERNAME%
等环境变量可能会被伪造,如果用户希望这样做并且知道如何 - 但是在文本框中输入他们的名字更容易伪造...