Vba 手动发送电子邮件时记录的触发代码

Vba 手动发送电子邮件时记录的触发代码,vba,excel,email,outlook,Vba,Excel,Email,Outlook,我使用Excel VBA发送电子邮件。我想记录消息是否已发送 我从中获取了一些代码 我创建了如上所述的类,并添加了一些额外的位以查看它是否工作。 它会初始化,但随后不会发生其他任何事情。邮件发送后,该类在后台以某种方式保持打开状态,因此我必须在VBE中停止它 以下是呼叫代码: Sub SendProc2(添加为字符串) Set-OutApp=CreateObject(“Outlook.Application”) Set-OutMail=OutApp.CreateItem(0) 出错时继续下一步

我使用Excel VBA发送电子邮件。我想记录消息是否已发送

我从中获取了一些代码

我创建了如上所述的类,并添加了一些额外的位以查看它是否工作。
它会初始化,但随后不会发生其他任何事情。邮件发送后,该类在后台以某种方式保持打开状态,因此我必须在VBE中停止它

以下是呼叫代码:

Sub SendProc2(添加为字符串)
Set-OutApp=CreateObject(“Outlook.Application”)
Set-OutMail=OutApp.CreateItem(0)
出错时继续下一步
发邮件
.To=添加
.CC=“”
.BCC=“”
.Subject=此工作簿。名称
.Body=Application.WorksheetFunction.VLookup(工作表(“数据”).Range(“B135”)、Range(“formversion”)、2、False)_
&“附件:”&vbCrLf&vbCrLf&ThisWorkbook.Name
.Attachments.add ActiveWorkbook.FullName
.Display'或use.Send
以
Dim CurrWatcher作为EmailWatcher
设置CurrWatcher=新的EmailWatcher
设置CurrWatcher.TheMail=OutMail
错误转到0
发送邮件=无
设置应用程序=无
卸载UserForm4
端接头
称为EmailWatcher的类模块代码:

选项显式
公共事件,邮件为Outlook.MailItem
私有子类_Terminate()
Debug.Print“Terminate”&Now()
端接头
专用子主题邮件发送(取消为布尔值)
Debug.Print“Send”&现在()
'在此处输入代码
端接头
私有子类_Initialize()
Debug.Print“Initialize”&Now()
端接头
它似乎从不注册
\u Send
,我认为这可能与未定义类对象或其他原因有关。有时我会在初始化时收到警告,然后在不等待
\u发送的情况下立即终止

在Windows 7上,通过我无法控制的本地机构网络使用Excel 2007。

Private WithEvents EM As Outlook.MailItem

Public Sub INIT(x As Outlook.MailItem)
    Set EM = x
End Sub

Private Sub EM_Send(Cancel As Boolean)

End Sub
模块

Public WATCHER As clsEmailWatch

Sub EMAIL()

Dim o As Outlook.Application
Dim m As Outlook.MailItem

Set o = New Outlook.Application
Set m = o.CreateItem(olMailItem)

Set WATCHER = New clsEmailWatch
WATCHER.INIT m

m.To = "xyz@abc.com"

m.Send

End Sub

希望这有帮助,这看起来像是在用户窗体运行时显示邮件

我遇到了同样的问题,即当用户表单存在时,Outlook事件没有注册。为了解决这个问题,我实施了一种黑客攻击:

在类或userform模块中需要布尔属性:

Private someBool as Boolean
您需要订阅并设置新的布尔值:

Private Sub TheMail_Close(Cancel As Boolean)
    someBool = True
End Sub
关闭、发送或保存显示的电子邮件时引发此事件

那么您显然需要一个属性获取方法:

Public Property Get MailClosed() As Boolean
    MailClosed = someBool
End Property
现在,要处理所有事件,您需要在显示邮件的模块中创建一个循环:

[...]
Dim CurrWatcher As EmailWatcher
Set CurrWatcher = New EmailWatcher
Set CurrWatcher.TheMail = OutMail

Do Until CurrWatcher.MailClosed
    DoEvents
Loop

[...]

我不确定为什么有效,如果有人能解释一下,我会把它添加到我的答案中。

这里还有输入代码吗?我想你是在邮件消失后把它设置成你的沉没类。Outmail应该是类对象,我相信嗯,我想我贴错了,我会编辑它。你试过我的代码了吗?