Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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
在Excel VBA中捕获Outlook电子邮件发送时间_Excel_Vba_Outlook - Fatal编程技术网

在Excel VBA中捕获Outlook电子邮件发送时间

在Excel VBA中捕获Outlook电子邮件发送时间,excel,vba,outlook,Excel,Vba,Outlook,每当我在Excel中执行VBA代码时,都会生成Outlook电子邮件。它不会自动发送,我也不希望它自动发送。电子邮件由一定范围内的单元格值填充(以ActiveCell为基础),我希望在手动将电子邮件发送到ActiveCell.Offset(0,13)中时以编程方式捕获,最好在我当前的Excel程序中使用VBA 这是我显示电子邮件的代码: 'Send Stock Request: Dim OutApp As Object Dim OutMail As Object Set OutApp = Cr

每当我在Excel中执行VBA代码时,都会生成Outlook电子邮件。它不会自动发送,我也不希望它自动发送。电子邮件由一定范围内的单元格值填充(以ActiveCell为基础),我希望在手动将电子邮件发送到ActiveCell.Offset(0,13)中时以编程方式捕获,最好在我当前的Excel程序中使用VBA

这是我显示电子邮件的代码:

'Send Stock Request:
Dim OutApp As Object
Dim OutMail As Object

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(olMailItem)

With OutMail
    .BodyFormat = olFormatHTML
    .HTMLBody = "My eMail's HTML Body"
    .To = "myrecipients@theiremails.com"
    .CC = ""
    .BCC = ""
    .Subject = "Stock Request"
    .Display
End With

Set OutMail = Nothing
Set OutApp = Nothing

可以通过VBA完成,但以下代码必须粘贴到Outlook模块中,而不是Excel中的
Outlook
=>
ThisOutlookSession
模块中。此外,请确保允许在Outlook中使用宏

Private Sub Application_ItemSend(ByVal olItem As Object, Cancel As Boolean)

Dim Xl As Object ' Excel.Application
Dim Wb As Object ' Excel.Workbook
Set Xl = GetObject(, "excel.application")
Set Wb = Xl.Workbooks("NameOfYourOpenedWorkbook.xlsb")
Wb.Activate
Xl.activecell.Offset(0, 13).Value = Date & " " & Time

End Sub

因此,现在当您手动发送自动创建的电子邮件时,您将在
ActiveCell.Offset(0,13)
cell中的打开工作簿中获取日期和时间。

将VBA项目引用添加到Outlook对象模型,并将此类添加到excel文件:

''clsMail
Option Explicit

Public WithEvents itm As Outlook.MailItem
Public DestCell As Range '<< where to put the "sent" message
'you can add other fields here if you need (eg) to 
'  preserve some other info to act on when the mail is sent

Private Sub itm_Send(Cancel As Boolean)
    Debug.Print "Sending mail with subject: '" & itm.Subject & "'"
    DestCell.Value = "Mail sent!"  '<< record the mail was sent
End Sub
“clsMail
选项显式
Public with events itm As Outlook.MailItem

Public DestCell As Range'如果在Excel vba中不可能(我不知道是否可能),则可能使用Outlook vba。有一个发送事件,您可以在其中检查发送的电子邮件,并将信息存储在Excel中。在这种情况下,您知道我如何访问该事件吗?我熟悉Excel的对象模型,但不幸的是,我不熟悉Outlook。邮件最终发送时Excel文件是否保证打开?是的,它将在整个过程中打开。非常感谢!我将尝试实现这一点,并让您知道会发生什么。这会影响所有发送的电子邮件还是仅影响通过Excel模块创建的电子邮件(如果答案很明显,请原谅我忽略了它,因为我在Outlook中使用VBA的经验很少)?这非常有效!非常感谢你在这方面的帮助!不客气。好问题,它会影响所有发送电子邮件的人。您可以在private sub中添加if语句,以便在打开特定工作簿时仅运行其余代码。或者,当不使用excel文件时,只需在outlook中禁用宏……这就是我的想法,但我想确保的。我认为添加IF语句来检查电子邮件的主题,并且工作簿是打开的,这将很好地解决这个问题。再次感谢大家!
Option Explicit

Dim colMails As New Collection

Sub Tester()

    Dim OutApp As Object
    Dim OutMail As Object
    Dim obj As clsMail

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(olMailItem)

    With OutMail
       .BodyFormat = olFormatHTML
       .HTMLBody = "My eMail's HTML Body"
       .To = "twilliams@theravance.com"
        .CC = ""
        .BCC = ""
        .Subject = "Stock Request"
        .Display
    End With
    'create an instance of the class and add it to the global collection colMails
    Set obj = New clsMail
    Set obj.itm = OutMail
    Set obj.DestCell = ActiveCell.Offset(0, 13) '<< "sent" flag goes here
                                                ' when the user sends the mail
    colMails.Add obj

End Sub