以编程方式向项添加事件处理程序

时间:2017-04-14 22:06:34

标签: vba events outlook-vba

我在自己的待办事项列表中提供了一些自定义属性,并且我希望在该属性发生变化时执行某个事件。有没有办法编写一个事件处理程序来处理CustomPropertyChange中所有项目的olFolderToDo事件,或以编程方式向项目添加事件处理程序,以便我可以在添加新项目时添加事件处理程序到文件夹?

我过去笨拙地处理了这个问题,方法是将我的代码放在ItemsChange的事件处理程序中,然后检查属性的值(例如,当我想触发一个动作时)一旦任务标记完成,我会检查项目中的更改,然后检查项目是否标记为已完成),但这不会处理对属性的任意更改,并且需要仔细处理以避免连续多次触发

我目前的做法示例:

Public WithEvents Items As Outlook.Items

Private Sub Application_Startup()
Set Items = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderToDo).Items
End Sub

Private Sub Items_ItemChange(ByVal Item As Object)
If TypeOf Item Is Outlook.TaskItem Then
    If Item.Status = olTaskComplete Then
        DoTheThing
    End If
ElseIf TypeOf Item Is Outlook.MailItem Then
    If Item.FlagStatus = olFlagComplete Then
        DoTheThing
    End If
End If
End Sub

1 个答案:

答案 0 :(得分:0)

当项目的自定义属性(它是父对象的实例)发生更改时,将触发CustomPropertyChange事件。为了能够处理该事件,您必须单独订阅Outlook中的每个项目,这不是一个好主意。更好的解决方案是订阅Items类的ItemChange事件,当更改指定集合中的项时触发该事件。在这种情况下,您可以监视文件夹,而不是单个文件夹。但它不会告诉你什么属性改变了。但是,您可以保留两个用于同步值的自定义属性(第一个用于源属性值,第二个用于旧值,因此您将能够确定哪些属性已更改以及旧值是什么)。

作为一种解决方法,您可以考虑使用Outlook所基于的低级API - 扩展MAPI。在那里你可以找到fnevObjectModified通知。有关详细信息,请参阅Event Notification in MAPI。请注意,您可以使用托管代码中的扩展MAPI周围的任何包装器来访问低级别通知(例如,Redemption或MAPI Store Accessor)。