Excel含跨表公式单元格变更触发MsgBox的VBA代码问题
失效原因
Worksheet_Change 事件仅会在单元格内容被手动编辑修改时触发,公式计算产生的数值变动无法触发该事件,这是你当前代码不生效的核心原因。
实现方案
改用 Worksheet_Calculate 事件,搭配存储上一次单元格数值的变量做差异对比,即可检测到公式结果的变化。
如果你要监控E10单个单元格(匹配你的需求描述)
- 打开对应工作表的VBA代码编辑界面,在模块最顶部(所有过程之外)先声明模块级变量:
' 存储E10上一次的计算结果 Dim 旧E10值 As Variant
- 新增工作表激活事件,首次进入工作表时初始化旧值,避免刚打开就误弹提示:
Private Sub Worksheet_Activate() 旧E10值 = Me.Range("E10").Value End Sub
- 新增计算事件,每次工作表重算时对比新旧值,有变化则弹出提示:
Private Sub Worksheet_Calculate() Dim 当前值 As Variant 当前值 = Me.Range("E10").Value ' 仅数值变化时触发提示 If 当前值 <> 旧E10值 Then If 当前值 = "No" Then MsgBox "No Work assigned :( ! E10", vbOKOnly, "Abhishek" Else MsgBox "New task Work on It! E10", vbOKOnly, "Abhishek" End If ' 更新旧值为当前值,供下次对比 旧E10值 = 当前值 End If End Sub
如果你要监控E12:E19区域(匹配你原有代码的范围)
- 模块顶部声明变量:
' 存储E12:E19上一次的计算结果 Dim 旧区域值 As Variant
- 新增激活事件初始化:
Private Sub Worksheet_Activate() 旧区域值 = Me.Range("E12:E19").Value End Sub
- 新增计算事件对比触发:
Private Sub Worksheet_Calculate() Dim 目标区域 As Range, i As Long, j As Long Set 目标区域 = Me.Range("E12:E19") ' 逐单元格对比新旧值 For i = 1 To UBound(旧区域值, 1) For j = 1 To UBound(旧区域值, 2) If 目标区域.Cells(i, j).Value <> 旧区域值(i, j) Then If 目标区域.Cells(i, j).Value = "No" Then MsgBox "No Work assigned :( ! " & 目标区域.Cells(i, j).Address, vbOKOnly, "Abhishek" Else MsgBox "New task Work on It! " & 目标区域.Cells(i, j).Address, vbOKOnly, "Abhishek" End If End If Next Next ' 更新旧值 旧区域值 = 目标区域.Value End Sub
注意事项
- 文件必须保存为
.xlsm启用宏的格式,否则代码会失效 - 打开文件时需要选择允许宏运行,功能才能正常触发
内容的提问来源于stack exchange,提问作者DAAVA
相关产品推荐
相关产品推荐

