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

VBA宏问题:删除上一行后后续行用户输入数据丢失

解决删除行时VBA宏清除用户输入数据的问题

当删除某一行时,原下方行上移后,其F列的下拉选项会触发宏重新执行,覆盖用户之前输入的数据(比如示例中J6的"3"上移后变为J5却被清空)——原因是宏将行移动导致的单元格内容变化,误判为用户主动修改了F列选项。

核心解决方案

通过区分用户主动修改F列选项与行操作导致的被动内容变更,仅在用户主动修改时执行宏的设置逻辑,避免行删除时覆盖已有数据。

具体实现代码

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim originalValue As Variant
    Dim isManualChange As Boolean
    Dim currentRow As Long
    Dim RngUnlock As Range, RngLock As Range, RngClear As Range
    Dim VarScenarios(1 To 3, 1 To 3) As Variant
    
    ' 仅处理F列的单个单元格变更,多单元格变更直接退出
    If Intersect(Target, Me.Columns("F")) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub
    
    ' 禁用事件防止递归触发
    Application.EnableEvents = False
    On Error GoTo Cleanup ' 确保事件最终重新启用
    
    ' 判断是否为用户主动修改F列选项:对比Undo前后的值
    Application.Undo
    originalValue = Target.Value
    Application.Redo
    
    isManualChange = (originalValue <> Target.Value)
    
    If isManualChange Then
        currentRow = Target.Row
        
        ' 根据实际需求定义各区域(请替换为你的实际单元格范围)
        Set RngUnlock = Me.Cells(currentRow, "J")
        Set RngLock = Me.Range(Me.Cells(currentRow, "G"), Me.Cells(currentRow, "I"))
        Set RngClear = Me.Range(Me.Cells(currentRow, "K"), Me.Cells(currentRow, "M"))
        
        ' 初始化场景配置
        VarScenarios(1, 1) = Empty
        Set VarScenarios(1, 2) = RngUnlock
        VarScenarios(1, 3) = RGB(155, 194, 230)
        
        VarScenarios(2, 1) = "NR"
        Set VarScenarios(2, 2) = RngLock
        VarScenarios(2, 3) = RGB(128, 128, 128)
        
        VarScenarios(3, 1) = Empty
        Set VarScenarios(3, 2) = RngClear
        VarScenarios(3, 3) = RGB(128, 128, 128)
        
        ' 根据F列下拉选项执行对应场景(请替换为你的实际选项文本)
        Select Case Target.Value
            Case "允许编辑"
                With VarScenarios(1, 2)
                    .Locked = False
                    .Value = VarScenarios(1, 1)
                    .Interior.Color = VarScenarios(1, 3)
                End With
            Case "锁定"
                With VarScenarios(2, 2)
                    .Locked = True
                    .Value = VarScenarios(2, 1)
                    .Interior.Color = VarScenarios(2, 3)
                End With
            Case Else
                With VarScenarios(3, 2)
                    .Locked = True
                    .Value = VarScenarios(3, 1)
                    .Interior.Color = VarScenarios(3, 3)
                End With
        End Select
    End If

Cleanup:
    Application.EnableEvents = True
    If Err.Number <> 0 Then MsgBox "宏执行错误:" & Err.Description, vbExclamation
End Sub

关键说明

  1. 变更类型判断:通过Application.Undo和Application.Redo对比变更前后的值,如果值相同,说明是行删除/插入导致的内容移动,不执行设置逻辑;只有值不同时,才判定为用户主动修改F列选项。
  2. 区域与选项适配:请根据你的表格实际单元格范围、下拉选项文本,调整代码中的区域定义和Select Case条件。
  3. 工作表保护处理:如果表格处于保护状态,需在代码开头添加Me.Unprotect Password:="你的保护密码",处理完成后添加Me.Protect Password:="你的保护密码", UserInterfaceOnly:=True(UserInterfaceOnly:=True允许宏直接修改单元格锁定状态,无需反复解除保护)。

内容的提问来源于stack exchange,提问作者Gregg Rosenstein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:05:00