可通过VBA的Workbook_Open、Worksheet_Activate或Application.OnTime事件配合日期判断实现自动保护:设定截止日期后,系统日期到达或超过该日期时,目标工作表将自动启用密码保护;支持定时校验与密码安全优化,并提供应急解锁方法。

如果您希望在Excel工作表中设定一个特定日期,当系统日期到达或超过该日期后,工作表自动进入保护状态,防止进一步编辑,则可以通过VBA中的Worksheet_Activate或Workbook_Open事件结合日期判断逻辑来实现。以下是具体操作步骤:
一、使用Workbook_Open事件在打开文件时自动检查并锁定
此方法在每次打开工作簿时触发,读取预设的截止日期,若当前系统日期大于等于该日期,则对指定工作表启用保护。需确保工作簿以启用宏格式(.xlsm)保存。
1、按 Alt + F11 打开VBA编辑器。
2、在左侧“工程资源管理器”中双击 ThisWorkbook 模块。
3、在代码窗口中粘贴以下代码:
Private Sub Workbook_Open()
Dim lockDate As Date
lockDate = #12/31/2024# '此处替换为您设定的具体日期
If Date >= lockDate Then
Sheets("Sheet1").Protect Password:="123456", UserInterfaceOnly:=True
End If
End Sub
4、关闭VBA编辑器,将工作簿另存为 Excel启用宏的工作簿(.xlsm)。
二、使用Worksheet_Activate事件在切换至工作表时实时校验
该方法在用户每次激活目标工作表时执行日期比对,适用于多工作表场景且需更频繁响应的情况。即使工作簿已打开,切换标签页也会触发保护检查。
1、在VBA编辑器中,于左侧找到目标工作表(如 Sheet1),双击进入其模块。
2、粘贴以下代码:
Private Sub Worksheet_Activate()
Dim lockDate As Date
lockDate = #12/31/2024#
If Date >= lockDate And Not Me.ProtectContents Then
Me.Protect Password:="123456", UserInterfaceOnly:=True
End If
End Sub
3、注意:需确保该工作表此前未被手动保护,否则事件可能不触发;若已保护,请先取消保护再保存代码。
三、使用Application.OnTime实现每日定时校验(增强型方案)
此方法通过设置定时器,在每天指定时间(如凌晨0点)自动运行校验过程,可应对用户长期不关闭文件但日期已变更的情形,弥补Open/Activate事件的覆盖盲区。
1、在 ThisWorkbook 模块中添加如下启动代码:
Private Sub Workbook_Open()
Call ScheduleDailyCheck
End Sub
2、在标准模块(插入 → 模块)中新建模块,粘贴以下内容:
Sub ScheduleDailyCheck()
Dim nextRun As Double
nextRun = TimeValue("00:00:00") + 1
Application.OnTime nextRun, "RunLockCheck"
End Sub
Sub RunLockCheck()
Dim lockDate As Date
lockDate = #12/31/2024#
If Date >= lockDate Then
On Error Resume Next
Sheets("Sheet1").Protect Password:="123456", UserInterfaceOnly:=True
On Error GoTo 0
End If
Call ScheduleDailyCheck
End Sub
3、保存后重启工作簿,定时任务即生效。
四、设置密码保护时的关键安全提示
使用Password参数保护工作表虽可阻止常规编辑,但密码本身若硬编码在VBA中存在泄露风险。建议采用不可见但可复用的密钥生成方式,避免明文暴露。
1、在标准模块中定义函数替代明文密码:
Function GetLockPassword() As String
GetLockPassword = Application.WorksheetFunction.Substitute("A1B2C3", "1", "X") & "D4"
End Function
2、将原代码中 Password:="123456" 替换为 Password:=GetLockPassword()。
3、该函数返回值为 AXB2C3D4,既规避直接可见密码,又保证每次调用结果一致。
五、解除自动锁定的应急操作路径
当误触发锁定或需临时编辑时,可通过VBA立即撤防,无需依赖密码记忆。该操作仅限具备VBA编辑权限的用户执行。
1、按 Alt + F11 进入VBA编辑器。
2、在任意模块中插入新过程:
Sub UnlockSheet()
Sheets("Sheet1").Unprotect Password:="123456"
End Sub
3、将光标置于该过程内,按 F5 即刻执行解锁。










