求助:如何用Excel VBA实现单元格G6的密码保护功能
G6单元格密码保护VBA实现(新手友好版)
这里给你修正后的代码,完全满足你的三个需求,逻辑简单且稳妥:
Private Sub Worksheet_Change(ByVal Target As Range) ' 只对G6单元格的修改做出响应 If Intersect(Target, Me.Range("G6")) Is Nothing Then Exit Sub ' 关闭事件触发,避免写入单元格时重复触发本程序 Application.EnableEvents = False Dim oldValue As Variant Dim newValue As Variant Dim passwordInput As String Const correctPwd As String = "123" ' 固定密码 ' 先把用户输入的新值存起来,再撤销修改恢复成原来的值 newValue = Target.Value Application.Undo oldValue = Target.Value Do passwordInput = InputBox("请输入密码确认修改(取消则恢复原值):", "需要密码") ' 密码正确:把之前存的新值写入单元格 If passwordInput = correctPwd Then Target.Value = newValue Exit Do ' 用户点了取消:直接退出,保持旧值 ElseIf passwordInput = "" Then Exit Do ' 密码错误:提示后让用户重新输入 Else MsgBox "密码错误,请重新输入!", vbExclamation End If Loop ' 恢复事件触发,不影响其他操作 Application.EnableEvents = True End Sub
代码关键点说明(新手必看)
- 关闭事件触发:
Application.EnableEvents = False是核心,不然我们修改G6的时候会再次触发这个程序,导致无限循环。 - 先恢复旧值:触发程序时G6已经变成新值了,先撤销修改回到旧状态,这样不管用户输错多少次密码,单元格都显示原来的值,直到密码正确才更新。
- 循环逻辑:
- 输入正确密码:写入用户之前输入的新内容,结束流程
- 点击取消对话框:直接结束,单元格保持原来的值
- 密码错误:弹出提示,继续让用户输入
你原代码的问题
- 没关闭事件触发,写入新值时会重复触发程序,容易出问题
- 单元格一直保持新值等待密码,若用户多次输错后取消,
Application.Undo可能没法准确恢复最初的旧值 - 密码错误时没有提示,用户不知道自己输错了
内容的提问来源于stack exchange,提问作者Brendon Medeiros
相关产品推荐
相关产品推荐

