Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Excel是否可以基于单元格值向不同用户发送电子邮件?_Vba_Excel - Fatal编程技术网

Vba Excel是否可以基于单元格值向不同用户发送电子邮件?

Vba Excel是否可以基于单元格值向不同用户发送电子邮件?,vba,excel,Vba,Excel,在尝试之前,我想知道这是否可能/可行/合乎逻辑 我在一个网络驱动器上有一个共享文档,大约有20-30人在其中工作/更新 有多个字段,多个工作表 在多张图纸上有一个用户栏和一个状态栏 ROW ITEM USER STATUS ---------------------------------------------------- 1 Web Job 1 John In Progress 2

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

我在一个网络驱动器上有一个共享文档,大约有20-30人在其中工作/更新

有多个字段,多个工作表

在多张图纸上有一个用户栏和一个状态栏

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和Brian发送电子邮件,说“您的工作项已交付”

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


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

是的,这是可能的,但正如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
第三,您需要在每个包含状态列的工作表中添加一个
工作表\u Change
事件处理程序,该列应触发电子邮件。我建议使用VBA代码窗口上方的下拉菜单,在左侧下拉菜单中选择“工作表”,在右侧下拉菜单中选择“更改”,以获得正确的函数声明。在函数中,您需要确保
目标
位于状态列中,并且它与您要查找的字符串值匹配。我把它作为一个练习留给你,让你把它放在一起,但如果你有任何问题,请告诉我

有一些问题需要注意:

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

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

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


简而言之-是的,这是可能的,应该与事件处理程序一起使用。VBA并不是您真正想要使用的语言类型。移植一个COM对象,该对象将在单独的线程上运行,订阅工作表更改事件或选择,然后使用COM库发送电子邮件。至少这是我在共享工作簿上特别要做的,在共享工作簿中,有30多人在使用它。非常感谢您的全面回复!我必须处理的一个问题是,使用的是LotusNotes(我知道,我知道),而不是Outlook。在回答这个问题时,lotusnotes使用的参考是lotusdomino对象(因为该组没有使用Outlook)。如果有人感兴趣的话,请查看IBM支持链接:在实现这一点之前,我需要先考虑您的前两个警告,但如果没有其他的东西,这将是一个很好的经验教训,我很可能以后会在其他地方使用它(如果不在这里)。再次感谢!