You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:55:20