Excel VBA需求:单元格修改后弹出确认框,选‘否’撤销修改
解决Excel工时追踪表的修改撤销问题
核心逻辑
要实现指定区域修改后需授权、未授权则撤销的功能,关键得在单元格被修改前提前记录原始值——因为Worksheet_Change事件触发时,单元格已经变成新值了,直接用系统Undo容易出问题,提前存旧值再恢复是最稳妥的方式。
具体代码实现
1. 先声明模块级变量存旧值
在工作表的代码模块最顶部(所有函数之外)加这两行,用来保存修改前的单元格区域和对应数据:
Private oldRng As Range Private oldValues As Variant
2. 在已有的SelectionChange事件里加记录逻辑
你已经有选中未来日期的提示代码,直接在里面新增记录原始值的部分:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 保留你原来的未来日期提示代码 ' ...(你的原有代码) ' 新增:只针对C5:CZ6区域记录原始值 If Not Intersect(Target, Me.Range("C5:CZ6")) Is Nothing Then Set oldRng = Target oldValues = Target.Value End If End Sub
3. 重写Worksheet_Change事件实现验证与撤销
替换你现在的Worksheet_Change代码,加入授权判断和值恢复逻辑:
Private Sub Worksheet_Change(ByVal Target As Range) Dim changedArea As Range Set changedArea = Intersect(Target, Me.Range("C5:CZ6")) ' 只处理目标区域的修改 If Not changedArea Is Nothing Then ' 先关闭事件触发,避免恢复值时再次触发Change事件 Application.EnableEvents = False ' 弹出授权确认框 If MsgBox("是否已获得直属经理授权?", vbYesNo + vbQuestion, "授权验证") = vbNo Then ' 恢复之前记录的原始值 oldRng.Value = oldValues MsgBox "修改已撤销,请获得授权后再操作。", vbInformation End If ' 重新开启事件触发 Application.EnableEvents = True End If End Sub
注意点
- 如果你的目标区域不是
C5:CZ6,直接修改代码里的Range参数就行。 - 批量修改(比如粘贴多个单元格)也能正常处理,因为
oldValues会以数组形式存储多单元格数据。 - 要是选中区域后没修改就切走,
oldRng和oldValues会自动更新,不影响后续操作。
内容的提问来源于stack exchange,提问作者BearOfVeryLittleBrain
相关产品推荐
相关产品推荐

