Excel可以根据单元格值向不同用户发送电子邮件吗?

时间:2013-11-04 14:39:25

标签: excel vba excel-vba

我想在尝试之前知道它是否可行/可行/合乎逻辑。

我在网络驱动器上有一个共享文档,大约有20-30人在处理/更新。

有多个字段,多张。

在多个工作表中有一个USER列和一个STATUS列。

ROW   ITEM               USER              STATUS
----------------------------------------------------
1     Web Job 1          John             In Progress
2     Web Service A      Mike             Delivered
3     WPF Job 2          Amy              In Progress
4     Test Job 1         Brian            Delivered

当使用“已发送”更新状态行时(同样,处理此工作簿的30个人中的任何一个都可以更改状态),是否可以为VBA宏发送电子邮件(在此示例中)Mike和布莱恩说'你的工作项目已经交付'?

我担心的是,有太多的手在搅拌锅,可以说,基于正在更新的工作簿自动化通知过程是不切实际的。

值得追求还是我应该完全放弃?

1 个答案:

答案 0 :(得分:2)

是的,这是可能的,但正如mehow所说,使用共享工作簿可能不是最好的主意。如果您希望继续使用它,我会这样做。出于此解决方案的目的,我假设每个用户都在其计算机上安装了Outlook。

首先,打开VBA IDE,单击“工具”---> “引用...”并选中“Microsoft Outlook 14.0对象库”旁边的框(您可能有不同的版本号)以添加对Outlook COM的引用。

其次,您可以使用以下代码的某些变体来生成电子邮件。我使用了HTMLBody属性,因为我通常使用html标签格式化自动生成的电子邮件,但您可能只想使用纯文本。创建一个模块并将此代码添加到其中。

Public Sub sendMail(strTo As String, _
                strSubject As String, _
                strBodyText As String, _
                Optional strCC As String = "", _
                Optional oAttachments As Collection = Nothing)
'This function creates an email and immediately sends it.

    Dim Attachment As Variant
    Dim oMailItem As Outlook.MailItem

    'Create the email
    Set oMailItem = Outlook.Application.CreateItem(olMailItem)

    'Populate the email properties
    With oMailItem
        .Subject = strSubject
        .To = strTo
        'Add the CC recipients, if any
        .CC = strCC
        .HTMLBody = strBodyText
        .BodyFormat = olFormatHTML


        'Add the attachments, if any
        If Not (oAttachments Is Nothing) Then
            For Each Attachment In oAttachments
                .Attachments.Add (Attachment)
            Next Attachment
        End If

        'Send it!
        .Send
    End With

    'Release the object
    Set oMailItem = Nothing
End Sub

第三,您需要为每个工作表添加一个Worksheet_Change事件处理程序,其中包含应触发电子邮件的状态列。我建议使用VBA代码窗口上方的下拉菜单,通过选择左下拉菜单中的“工作表”和右侧的“更改”来获得正确的功能声明。在该函数中,您需要确保Target位于STATUS列中,并且它与您要查找的字符串值匹配。我把它作为一个练习让你把它放在一起,但如果你有任何问题,请告诉我。

有一些问题需要注意:

  • 更改事件在用户离开目标单元格后立即触发,这意味着电子邮件也是如此。这意味着即使有人意外更改了状态列,电子邮件仍会发送。

  • 代码在每个用户的计算机上运行,​​因此如果两个用户更改相同的STATUS单元格,则会从两台计算机上发送电子邮件(不太确定Excel多用户更改冲突解决方案对此有何影响)

  • 我相信如果Outlook没有运行,它将会启动以发送电子邮件。在发生这种情况时,Excel似乎会挂起。