当我在特定 Outlook 文件夹中打开主题为特定邮件时自动打开附件的副本

Automatically open a copy of the attached file when I open a specific message with subject on specific outlook folder

我在 outlook 上创建了一个名为“MyTemplate”的自定义文件夹,并在该文件夹中创建了一封主题为 Auto Plan 的电子邮件(这是一封带有常用扩展名的模板电子邮件),
在该电子邮件中有一个 excel 工作簿。
出于自动化目的,我需要在打开该电子邮件后自动打开附件工作簿的副本。
我找到了下面的代码,但我无法利用它来满足我的需要。
注意事项:出于测试目的,我将 outlook 和 excel 宏安全设置设置为“启用所有宏”。
那是我自己的email meassge(我完全相信),我还在工作簿中添加了个人数字证书和ThisOutlookSession。 我正在使用 outlook 2016 32 位和 Windows 10 64 位。
一如既往,感谢任何帮助。

Public WithEvents myItem As Outlook.MailItem
Public EventsDisable as Boolean
 
Private Sub Application_ItemLoad(ByVal Item As Object)
    If EventsDisable = True Then Exit Sub
    If Item.Class = olMail Then
        Set myItem = Item
    End If
End Sub
 
Private Sub myItem_Open(Cancel As Boolean)
    EventsDisable=True
   'Your code
    EventsDisable=False
End Sub
  1. 正如我在评论中尝试建议的那样,您应该将 Outlook Macro Security Settings 修改为 'Notifications for all macros'。然后,必须关闭会话并重新打开选择 Macro Enabled

  2. 将下一个代码复制到上一个代码之上Sub:

Option Explicit

Public WithEvents MyItem As Outlook.MailItem
Public EventsDisable As Boolean

Private Sub Application_ItemLoad(ByVal Item As Object)
    If EventsDisable = True Then Exit Sub
    If Item.Class = olMail Then
        Set MyItem = Item
    End If
End Sub
Private Sub myItem_Open(Cancel As Boolean)
    EventsDisable = True
        If MyItem.Subject = "Auto Plan" And Application.ActiveExplorer.CurrentFolder.Name = "MyTemplate" Then
            If MyItem.Attachments.Count > 0 Then
                Dim obAttach As Attachment, strSaveMail As String, objExcel As Object
                Set obAttach = MyItem.Attachments(1)
                strSaveMail = "C:\Teste VBA Excel\outlook-attachments\"
                obAttach.SaveAsFile strSaveMail & obAttach.DisplayName
  
                Set objExcel = CreateObject("Excel.Application")
                objExcel.Workbooks.Open strSaveMail & obAttach.DisplayName
                objExcel.Visible = True: AppActivate objExcel.ActiveWindow.Caption
                Set objExcel = Nothing
            End If
        End If
    EventsDisable = False
End Sub

Open 事件先前保存附件工作簿,创建一个 Excel 会话,使其可见并在那里打开。它可能可以获得现有会话,但我正在那里做一个项目,我不敢冒险不小心关闭它...

请测试它并发送一些反馈。它可能可以优化,但我只是尝试获得一个可行的解决方案。它适用于我的环境...

当 Outlook 项目开始加载到内存中时,将触发 ItemLoad 事件。除了 Outlook 项目的 ClassMessageClass 属性的值外,该项目的数据尚不可用,因此在调用 [=12= 以外的任何 属性 时会发生错误] 或 MessageClass 对于 Item 中返回的 Outlook 项目。

相反,我建议处理 Explorer class 的 SelectionChange 事件,当用户以编程方式或通过与用户界面。当用户(以编程方式或通过用户界面)单击或切换到包含项目的不同文件夹时,也会发生此事件,因为 Outlook 会自动选择该文件夹中的第一个项目。

Public WithEvents myOlExp As Outlook.Explorer 
 
Public Sub Initialize_handler() 
 Set myOlExp = Application.ActiveExplorer  
End Sub 
  
Private Sub myOlExp_SelectionChange()
 MsgBox myOlExp.Selection.Count & " items selected." 
End Sub

在事件处理程序中,您可以检查 Explorer.CurrentFolder 属性 哪个 returns 一个 Folder 对象,代表浏览器中显示的当前文件夹。

如果您需要处理检查器 windows,您还需要使用 Inspectors.NewInspector 事件,该事件在打开新检查器 window 时触发,无论是作为用户操作的结果或通过程序代码。