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

