到期日临近时使用Excel VBA发送电子邮件通知

到期日临近时使用Excel VBA发送电子邮件通知,excel,vba,email,Excel,Vba,Email,我正在开发一个机器维护系统。当特定机器的维修日期临近时,我需要向机器维护方发送提醒电子邮件 我想从服务详情表中搜索下一次服务的日期,并从机器详情表中获取该特定机器的服务提供商的电子邮件地址 我想发两封电子邮件: 服务日期前七天 在服务日期 电子邮件的正文应该是 照片复印机(机器类型取自机器详细信息表)计划于2020年1月1日(下次维修日期取自服务详细信息表)进行维修 今天计划为照片复印机(机器类型取自机器详细信息表)提供服务 我想在不打开Excel文件的情况下自动发送电子邮件 我浏览了许多类似的

我正在开发一个机器维护系统。当特定机器的维修日期临近时,我需要向机器维护方发送提醒电子邮件

我想从服务详情表中搜索下一次服务的日期,并从机器详情表中获取该特定机器的服务提供商的电子邮件地址

我想发两封电子邮件:

  • 服务日期前七天
  • 在服务日期
  • 电子邮件的正文应该是

  • 照片复印机(机器类型取自机器详细信息表)计划于2020年1月1日(下次维修日期取自服务详细信息表)进行维修
  • 今天计划为照片复印机(机器类型取自机器详细信息表)提供服务
  • 我想在不打开Excel文件的情况下自动发送电子邮件

    我浏览了许多类似的在线帖子,但找不到我正在搜索的内容,而且我对VBA的熟练程度还不足以适应它们

    以下是我正在使用的代码:

    Sub email()
    
    Dim r As Range
    Dim cell As Range
    
    Set r = Range("U2:U10000")
    
    For Each cell In r
        If cell.Value = Date + 7 Then
    
            Dim Email_Subject, Email_Send_From, Email_Send_To, _
            Email_Cc, Email_Body As String
            Dim Mail_Object, Mail_Single As Variant
            Dim Machine_Code As Long
            Dim Machine_Type As Long
    
            Machine_Code = Application.WorksheetFunction.VLookup(cell.Value, Range("A:U"), 21, False)
            Machine_Type = Application.WorksheetFunction.VLookup(Machine_Code, Sheet1.Range("B:C"), 1, False)
    
            Email_Subject = "Service Reminder"
            Email_Send_From = "k.s@*******"
            Email_Send_To = Application.WorksheetFunction.VLookup(Machine_Code, Sheet1.Range("C:M"), 11, False)
            Email_Cc = "D@******.com"
            Email_Body = "There is a Service scheduled for a" & Machine_Type & "on" & cell.Value
    
            On Error GoTo debugs
            Set Mail_Object = CreateObject("Outlook.Application")
            Set Mail_Single = Mail_Object.CreateItem(0)
            With Mail_Single
                .Subject = Email_Subject
                .To = Email_Send_To
                .cc = Email_Cc
                .Body = Email_Body
                .send
            End With
    
        End If
    Next
    
    Exit Sub
    
    debugs:
        If Err.Description <> "" Then MsgBox Err.Description
    End Sub
    
    Sub-email()
    调光范围
    暗淡单元格作为范围
    设置r=范围(“U2:U10000”)
    对于r中的每个单元格
    如果cell.Value=日期+7,则
    Dim Email_主题、Email_Send_From、Email_Send_To、_
    电子邮件抄送,电子邮件正文为字符串
    Dim Mail_对象,Mail_单个作为变量
    变暗机器代码(如长)
    变暗机器类型,如长
    Machine_Code=Application.WorksheetFunction.VLookup(cell.Value,Range(“A:U”),21,False)
    Machine_Type=Application.WorksheetFunction.VLookup(Machine_代码,Sheet1.Range(“B:C”),1,False)
    电子邮件\u Subject=“服务提醒”
    电子邮件发送自=“k.s@********”
    Email\u Send\u To=Application.WorksheetFunction.VLookup(机器代码,表1.Range(“C:M”),11,False)
    电子邮件_Cc=“D@*********.com”
    Email\u Body=“有一个为“&Machine\u Type&“on”&cell.Value”计划的服务
    关于错误转到调试
    设置Mail\u Object=CreateObject(“Outlook.Application”)
    设置Mail\u Single=Mail\u Object.CreateItem(0)
    单程邮寄
    .Subject=电子邮件主题
    .To=发送电子邮件至
    .cc=电子邮件\u cc
    .Body=电子邮件\正文
    .发送
    以
    如果结束
    下一个
    出口接头
    调试:
    如果错误描述为“”,则MsgBox错误描述为“”
    端接头
    
    调度宏并不像听起来那么困难! 下面的代码可以在任何给定时间执行其所在模块内的任何子模块 在您的情况下,任务_sub是“电子邮件”

    Sub schedule_macro()
    Application.OnTime "05:00:00", "task_sub"
    End Sub
    
    这是这个宏要工作的关键。包含宏的文件需要打开,基本上总是要打开才能真正有意义

    为了避免这种情况,windows(我猜所有其他操作系统都有类似的选项)有任务调度器。我找到了一个很好的解释

    现在,这仍然需要你的机器在一天中的某个时候打开。因此,也许你可以简单地将所有这些安排在午休时间,以免干扰你的正常日程安排。如果你要去度假,只需将日常工作复制粘贴到你休息时间在办公室的同事身上即可


    我希望这些信息能对您有所帮助!

    我也知道通过这条线索这是可能的