Excel VBA需求:单元格B6值为16/64/120时触发邮件发送(修复问题)
修复VBA代码实现特定值触发邮件功能
你遇到的问题我清楚了:原代码只在B6超过15(也就是16)时触发邮件,而且只要B6保持大于15,任何单元格变动都会重复发邮件,完全不符合你要的「仅当B6等于16、64、120时触发,且每个值只发一次」的需求。
下面是修复后的完整代码,我会逐一说明修改点:
Option Explicit Private Sub Worksheet_Calculate() Dim FormulaCell As Range Dim TargetValues As Variant Dim NotSentMsg As String Dim SentMsgPrefix As String Dim CurrentValue As Double Dim ValueSent As Boolean On Error GoTo errHandler: Sheet2.Unprotect Password:="1234" ' 定义需要触发邮件的目标值 TargetValues = Array(16, 64, 120) NotSentMsg = "Not Sent" SentMsgPrefix = "Sent: " ' 用来记录已发送的目标值 ' 锁定检查范围为B6 Set FormulaCell = Me.Range("B6") With FormulaCell ' 先判断当前值是否为数字 If IsNumeric(.Value) Then CurrentValue = .Value ValueSent = False ' 检查当前值是否在目标数组中 If UBound(Filter(TargetValues, CurrentValue)) >= 0 Then ' 检查该值是否已经发送过(通过C6的记录判断) If InStr(.Offset(0, 1).Value, CStr(CurrentValue)) = 0 Then ' 调用邮件发送函数 Call Mail_Outlook_With_Signature_Html_1 ' 更新C6的记录:如果之前是NotSent,替换为已发送值;否则追加 If .Offset(0, 1).Value = NotSentMsg Then .Offset(0, 1).Value = SentMsgPrefix & CStr(CurrentValue) Else .Offset(0, 1).Value = .Offset(0, 1).Value & ", " & CStr(CurrentValue) End If ValueSent = True End If End If ' 如果当前值不是目标值,且C6还没记录过任何发送,保持NotSent If Not ValueSent And .Offset(0, 1).Value = SentMsgPrefix Then .Offset(0, 1).Value = NotSentMsg End If Else ' 非数字值时重置状态 .Offset(0, 1).Value = "Not numeric" End If End With Sheet2.Protect Password:="1234" Application.EnableEvents = True On Error GoTo 0 Exit Sub errHandler: MsgBox "An Error has Occurred " & vbCrLf & _ "The error number is: " & Err.Number & vbCrLf & _ Err.Description & vbCrLf & "Please Contact Admin" Application.EnableEvents = True Sheet2.Protect Password:="1234" End Sub
关键修改点说明:
- 目标值精准匹配:用
TargetValues = Array(16, 64, 120)定义需要触发的特定值,通过Filter函数检查当前B6值是否在目标数组中,替代原来的「大于15」的模糊判断。 - 避免重复发送:用C6单元格记录已经发送过的目标值(格式如
Sent: 16, 64),每次触发前先检查该值是否已经在记录里,只有未记录过才发送邮件并更新记录。 - 状态动态重置:当B6的值从目标值变成其他值时,如果还没有发送过任何邮件,会把C6重置为
Not Sent;如果已经发送过部分值,会保留已发送的记录。 - 简化代码逻辑:因为你只需要检查B6一个单元格,去掉了多余的
For Each循环,直接操作单个单元格更高效。
这样修改后,就能实现:
- 仅当B6的值等于16、64或120时触发邮件
- 每个目标值只会发送一次,不会因为其他单元格变动重复发送
- 状态记录清晰,能直观看到哪些值已经发送过
内容的提问来源于stack exchange,提问作者Harin
相关产品推荐
相关产品推荐

