如何使outlook VBA宏在每次单击“编写”时正常工作;新邮件;?

如何使outlook VBA宏在每次单击“编写”时正常工作;新邮件;?,vba,outlook,Vba,Outlook,我有outlook的此模块: Sub NewMessageWithAttachment() Dim oMsg As Outlook.MailItem Set oMsg = Application.CreateItem(olMailItem) With oMsg .Attachments.Add "C:\Users\Vinicius\image" .Display End With End Sub 但是每次我想运

我有outlook的此模块:

Sub NewMessageWithAttachment()
    Dim oMsg As Outlook.MailItem
    Set oMsg = Application.CreateItem(olMailItem)
    With oMsg
        .Attachments.Add "C:\Users\Vinicius\image"
        .Display
    End With
End Sub

但是每次我想运行它,需要按f5或启动它,是否有任何方法可以使它在每次我按以撰写新邮件时自动运行?

您可以重新调整相应的功能区按钮的用途。因此,当用户单击功能区按钮创建新电子邮件时,您的事件处理程序将在此之前被触发。有关更多信息,请参阅


处理reply、replyll和forward事件的另一种方法是处理
Explorer
类的事件。因此,您将知道当前在资源管理器窗口中选择了哪个项目,并且能够订阅项目级别的事件。您可能会发现这篇文章很有帮助。

对象中没有类似的事件。我能找到的最接近的东西是关于这个事件的。这将允许您在发送邮件项目之前在保存或自动保存时附加。您还可以捕获事件。

您可以使用一个
应用程序\u ItemLoad
事件,但它可能比您希望的要复杂一些-您需要将
Item
参数筛选为仅邮件项,还有一个额外的复杂性,就是在这个过程中,
项的大部分属性都是不可访问的

要解决属性访问问题,可以将对象缓存在全局变量中,并设置一个短的Windows计时器来调用子对象来处理该项目(如果发现附件看起来像新的未发送邮件对象,则添加附件)

在本了望会话中

Private子应用程序\u ItemLoad(ByVal项作为对象)
如果项目类型为MailItem,则
设置NewLoadedItem=Item
斯塔蒂默
如果结束
端接头
modHandleItemLoad“

选项显式
公共NewLoadedItem作为邮件项
子进程loadeditem()
如果NewLoadedItem为Nothing,则退出Sub
用NewLoadedItem
'选中此处并在适当时添加附件
以
Set NewLoadedItem=Nothing
端接头
modTimer:

选项显式
公共声明函数SetTimer Lib“user32”(_
ByVal HWnd尽可能长,ByVal nIDEvent尽可能长_
ByVal UELASS As Long,ByVal lpTimerFunc As Long)As Long
公共声明函数KillTimer Lib“user32”(_
ByVal HWnd尽可能长,ByVal nIDEvent尽可能长)尽可能长
公共时间越长越好
亚StartTimer()
TimerID=SetTimer(0&,0&,500&,TimerProc的地址)
端接头
子结束计时器()
出错时继续下一步
KillTimer 0&,TimerID
端接头
子TimerProc()
EndTimer'停止计时器
ProcessLoadedItem
端接头
已获得


Private Sub Application_ItemLoad(ByVal Item As Object)
    If (TypeOf Item Is MailItem) Then
        Set myItem = Item
    End If
End Sub

Private Sub myItem_Open(Cancel As Boolean)
    myItem.Subject = ""
    myItem.To = ""
    myItem.Attachments.Add "C:\Users\Public\Documents\teste.xlsx"

End Sub

它将取消“创建新邮件”事件,而是打开带有附件的个性化邮件。

相关:这是否回答了您的问题?