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

如何通过VBA向特定员工发送其分配的每日任务邮件

修改后的VBA代码(按需求适配)

以下是适配你需求的VBA代码,实现工作簿保存后,自动给每位员工发送包含其专属任务的邮件:

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    Dim xOutApp As Object
    Dim xMailItem As Object
    Dim xTaskWs As Worksheet ' 任务分配工作表
    Dim xMailWs As Worksheet ' 员工邮箱对照表
    Dim xLastRow As Long, xRow As Long, xTaskStartRow As Long
    Dim xEmpName As String, xEmpEmail As String
    Dim xTaskList As String, xTaskRow As Long
    
    ' 请根据实际工作表名称修改下面的名称
    Set xTaskWs = ThisWorkbook.Worksheets("任务分配")
    Set xMailWs = ThisWorkbook.Worksheets("员工邮箱")
    
    ' 仅在保存成功时执行邮件发送
    If Not Success Then Exit Sub
    
    On Error Resume Next
    Set xOutApp = CreateObject("Outlook.Application")
    If Err.Number <> 0 Then
        MsgBox "无法启动Outlook,请检查是否已安装", vbExclamation
        Exit Sub
    End If
    On Error GoTo 0
    
    xLastRow = xTaskWs.Cells(xTaskWs.Rows.Count, "A").End(xlUp).Row
    xRow = 1
    
    ' 遍历任务表,提取每位员工的信息
    Do While xRow <= xLastRow
        ' 跳过空行
        If Trim(xTaskWs.Cells(xRow, "A").Value) = "" Then
            xRow = xRow + 1
            Continue Do
        End If
        
        ' 获取员工姓名
        xEmpName = xTaskWs.Cells(xRow, "A").Value
        xTaskStartRow = xRow
        xTaskList = ""
        
        ' 收集该员工的所有任务
        Do
            If Trim(xTaskWs.Cells(xTaskStartRow, "B").Value) <> "" Then
                xTaskList = xTaskList & "- " & xTaskWs.Cells(xTaskStartRow, "B").Value & Chr(13) & Chr(13)
            End If
            xTaskStartRow = xTaskStartRow + 1
            ' 直到遇到空行或下一个员工姓名(A列有内容)
        Loop Until xTaskStartRow > xLastRow Or Trim(xTaskWs.Cells(xTaskStartRow, "A").Value) <> ""
        
        ' 在邮箱表中查找员工对应的邮箱
        xEmpEmail = ""
        On Error Resume Next
        xEmpEmail = xMailWs.Range("A:A").Find(What:=xEmpName, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1).Value
        On Error GoTo 0
        
        ' 如果找到邮箱,创建并发送邮件
        If xEmpEmail <> "" Then
            Set xMailItem = xOutApp.CreateItem(0)
            With xMailItem
                .To = xEmpEmail
                .Subject = "你的任务分配通知"
                .Body = "Hi " & xEmpName & "," & Chr(13) & Chr(13) & "以下是你的当前任务:" & Chr(13) & Chr(13) & xTaskList & "请查收附件中的最新文件。"
                .Attachments.Add ThisWorkbook.FullName
                .Display ' 测试时用Display,正式使用可改为.Send
            End With
            Set xMailItem = Nothing
        Else
            MsgBox "未找到员工" & xEmpName & "的邮箱地址,请检查员工邮箱表", vbExclamation
        End If
        
        ' 跳转到下一个员工的行
        xRow = xTaskStartRow
    Loop
    
    Set xOutApp = Nothing
    Set xTaskWs = Nothing
    Set xMailWs = Nothing
End Sub

关键说明

  • 工作表名称修改:请将代码中的"任务分配"和"员工邮箱"替换为你实际的工作表名称
  • 邮箱表格式要求:员工邮箱表需满足A列为姓名,B列为对应邮箱,且姓名与任务表中的姓名完全一致(区分大小写)
  • 任务收集逻辑:自动识别每位员工的任务范围(从姓名行开始,直到下一个姓名行或空行结束),并将任务整理为带项目符号的列表
  • 错误处理:增加了Outlook启动失败、邮箱未找到的提示,避免代码崩溃
  • 发送控制:默认使用.Display显示邮件方便测试,确认无误后可改为.Send自动发送

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:20:34