1

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

我在网络驱动器上有一个共享文档,大约有 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 宏是否可以发送电子邮件给(在本例中)迈克和布赖恩说'您的工作项目已交付'?

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

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

4

1 回答 1

2

是的,这是可能的,但正如我所说,共享工作簿可能不是最好的主意。如果您确实希望继续进行,这就是我的做法。出于此解决方案的目的,我假设每个用户都在他们的计算机上安装了 Outlook。

首先,打开VBA IDE,点击“工具”--->“引用...”并勾选“Microsoft Outlook 14.0 Object Library”旁边的复选框(您可能有不同的版本号)添加对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 代码窗口上方的下拉菜单,通过选择左侧下拉菜单中的“工作表”和右侧下拉菜单中的“更改”来获得正确的函数声明。在函数中,您需要确保TargetSTATUS 列中的 以及它与您要查找的字符串值匹配。我把它作为练习留给你把它们放在一起,但如果你有任何问题,请告诉我。

有一些问题需要注意:

  • change 事件在用户进行更改后离开目标单元格后立即触发,这意味着电子邮件也会如此。这意味着即使有人不小心更改了状态栏,电子邮件仍然会发送。

  • 该代码在每个用户的计算机上运行,​​因此如果两个用户更改相同的状态单元格,电子邮件将从两台计算机触发(不太确定 Excel 多用户更改冲突解决方案如何影响这一点)。

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

于 2013-11-04T16:20:48.807 回答