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

Excel VBA:如何获取单元格删除前的值并传递至其他宏?

解决B列删除单元格内容时获取原值并传递给其他宏的问题

嘿,我来帮你搞定这个需求!首先理清楚场景:当你删除表格里B列(标题行下方)的单元格内容时,现有代码会弹出确认删除整行的对话框,现在需要拿到这个单元格删除前的值,传给另一个宏去其他工作表删除对应内容。

你的原始表格

BNameNumberFabDesignHours
1AAAA1035811505
2BBBB1154118694
3CCCC12962281181
4DDDD13626848111
5EEEE1468216616
6FFFF15626286260
7GGGG163069416166
8HHHH173654846

现有代码

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 若目标为B列、标题行下方且新值为空则...
    If Target.Column = 2 And Target.Row > 1 And Target.Value = "" Then
        ans = MsgBox("Are you sure you want to Delete......This cannot Be Undone !!!", vbYesNo)
        If ans = vbYes Then
            '如何选中当前单元格所在第2列并复制其值?
            '如何将该值存入变量YYY?
            Rows(ActiveCell.Row).EntireRow.Delete
            Exit Sub
        End If
    End If
End Sub

问题关键与解决方案

这里要注意:当Worksheet_Change事件触发时,Target.Value已经变成空值了,所以不能直接从这里拿删除前的值。我给你两种可靠的实现方式:

方法一:提前记录选中单元格的值(推荐)

这个方法更稳定,不会干扰用户操作流程:

' 声明一个模块级变量,用来存储B列单元格的原值
Private previousBValue As Variant

' 当用户选中单元格时,记录B列(标题行下方)单元格的值
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ' 只处理单个单元格的情况,避免多选出错
    If Target.Column = 2 And Target.Row > 1 And Target.Cells.Count = 1 Then
        previousBValue = Target.Value
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 限定只处理单个单元格、B列、标题行下且值被清空的情况
    If Target.Column = 2 And Target.Row > 1 And Target.Cells.Count = 1 And Target.Value = "" Then
        Dim ans As VbMsgBoxResult
        ans = MsgBox("Are you sure you want to Delete......This cannot Be Undone !!!", vbYesNo)
        
        If ans = vbYes Then
            ' 把提前记录的原值存入变量YYY
            Dim YYY As Variant
            YYY = previousBValue
            
            ' 调用你的另一个宏,把YYY传进去,替换成你实际的宏名
            ' Call YourOtherMacro(YYY)
            
            ' 删除当前行
            Target.EntireRow.Delete
        Else
            ' 如果用户取消删除,恢复原来的值
            Application.EnableEvents = False ' 关闭事件防止触发Change循环
            Target.Value = previousBValue
            Application.EnableEvents = True ' 重新开启事件
        End If
    End If
End Sub

方法二:在Change事件里用Undo临时恢复原值

如果不想依赖选中事件,也可以通过临时恢复值来获取:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 And Target.Row > 1 And Target.Cells.Count = 1 And Target.Value = "" Then
        Dim ans As VbMsgBoxResult
        ans = MsgBox("Are you sure you want to Delete......This cannot Be Undone !!!", vbYesNo)
        
        If ans = vbYes Then
            Dim YYY As Variant
            Application.EnableEvents = False
            
            ' 先Undo恢复原值
            Application.Undo
            YYY = Target.Value ' 此时拿到的就是删除前的值
            
            ' 再把单元格清空,准备删除行
            Target.Value = ""
            Application.EnableEvents = True
            
            ' 调用你的另一个宏
            ' Call YourOtherMacro(YYY)
            
            ' 删除行
            Target.EntireRow.Delete
        End If
    End If
End Sub

额外注意事项

  • 两种方法都加了Target.Cells.Count = 1的判断,防止用户一次性删除多个B列单元格导致逻辑混乱。
  • 调用其他宏时,确保目标宏接受对应参数,示例如下:
    Sub YourOtherMacro(deleteValue As Variant)
        ' 在这里写其他工作表的删除逻辑,比如:
        ' Sheets("目标工作表名").Columns("B").Find(deleteValue).EntireRow.Delete
    End Sub
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:49:02