Excel VBA:如何获取单元格删除前的值并传递至其他宏?
解决B列删除单元格内容时获取原值并传递给其他宏的问题
嘿,我来帮你搞定这个需求!首先理清楚场景:当你删除表格里B列(标题行下方)的单元格内容时,现有代码会弹出确认删除整行的对话框,现在需要拿到这个单元格删除前的值,传给另一个宏去其他工作表删除对应内容。
你的原始表格
| B | Name | Number | Fab | Design | Hours |
|---|---|---|---|---|---|
| 1 | AAAA | 10 | 35 | 811 | 505 |
| 2 | BBBB | 11 | 541 | 18 | 694 |
| 3 | CCCC | 12 | 9622 | 81 | 181 |
| 4 | DDDD | 13 | 626 | 848 | 111 |
| 5 | EEEE | 14 | 6 | 821 | 6616 |
| 6 | FFFF | 15 | 6262 | 862 | 60 |
| 7 | GGGG | 16 | 306 | 941 | 6166 |
| 8 | HHHH | 17 | 365 | 484 | 6 |
现有代码
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
相关产品推荐
相关产品推荐

