当我在特定 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
正如我在评论中尝试建议的那样,您应该将 Outlook Macro Security Settings
修改为 'Notifications for all macros'。然后,必须关闭会话并重新打开选择 Macro Enabled
。
将下一个代码复制到上一个代码之上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 项目的 Class
和 MessageClass
属性的值外,该项目的数据尚不可用,因此在调用 [=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 时触发,无论是作为用户操作的结果或通过程序代码。
我在 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
正如我在评论中尝试建议的那样,您应该将 Outlook
Macro Security Settings
修改为 'Notifications for all macros'。然后,必须关闭会话并重新打开选择Macro Enabled
。将下一个代码复制到上一个代码之上
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 项目的 Class
和 MessageClass
属性的值外,该项目的数据尚不可用,因此在调用 [=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 时触发,无论是作为用户操作的结果或通过程序代码。