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