【问题标题】:How to make a outlook VBA macro work every time i click on compose "new mail"?每次单击撰写“新邮件”时,如何使 Outlook VBA 宏工作?
【发布时间】:2021-05-27 20:08:25
【问题描述】:

我有这个用于 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 或启动它,有没有我可以让它在我每次按撰写新邮件时自动运行?

【问题讨论】:

标签: vba outlook


【解决方案1】:

您可以重新使用相应的功能区按钮。因此,当用户单击用于创建新电子邮件的功能区按钮时,您的事件处理程序将在之前触发。请参阅Temporarily Repurpose Commands on the Office Fluent Ribbon 了解更多信息。

另一种处理回复、回复和转发事件的方法是处理Explorer 类的SelectionChange 事件。因此,您将知道当前在资源管理器窗口中选择了哪个项目,并且能够订阅项目级事件。您可能会发现 Implement a wrapper for inspectors and track item-level events in each inspector 文章很有帮助。

【讨论】:

    【解决方案2】:

    Outlook.Application 对象中没有类似的事件可用。我能找到的最接近的东西是MailItem.Write 事件。这将允许您在发送邮件之前在保存或自动保存时附加。您还可以捕获.Send 事件。

    【讨论】:

      【解决方案3】:

      您可以使用 Application_ItemLoad 事件,但它可能比您想的要复杂一些 - 您需要将 Item 参数过滤到仅邮件项目,然后添加复杂的是,在该过程中,大多数 Item 属性都无法访问。

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

      ThisOutlooksession:

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

      modHandleItemLoad"

      Option Explicit
      Public NewLoadedItem As MailItem
      
      Sub ProcessLoadedItem()
          If NewLoadedItem Is Nothing Then Exit Sub
          With NewLoadedItem
              'check here and add the attachment if appropriate
          End With
          Set NewLoadedItem = Nothing
      End Sub
      

      modTimer:

      Option Explicit
      
      Public Declare Function SetTimer Lib "user32" ( _
          ByVal HWnd As Long, ByVal nIDEvent As Long, _
          ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
      
      Public Declare Function KillTimer Lib "user32" ( _
          ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
      
      Public TimerID As Long
      
      Sub StartTimer()
          TimerID = SetTimer(0&, 0&, 500&, AddressOf TimerProc)
      End Sub
      
      Sub EndTimer()
          On Error Resume Next
          KillTimer 0&, TimerID
      End Sub
      
      Sub TimerProc()
          EndTimer 'stop the timer
          ProcessLoadedItem
      End Sub
      

      【讨论】:

        【解决方案4】:

        已经拿到了;

        
        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
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-15
          • 1970-01-01
          • 2018-09-04
          • 1970-01-01
          • 1970-01-01
          • 2015-04-25
          相关资源
          最近更新 更多