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

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循环,直接操作单个单元格更高效。

这样修改后,就能实现:

  1. 仅当B6的值等于16、64或120时触发邮件
  2. 每个目标值只会发送一次,不会因为其他单元格变动重复发送
  3. 状态记录清晰,能直观看到哪些值已经发送过

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:02:35