如何实现PropertyChange事件?

时间:2017-11-13 14:27:57

标签: outlook-vba

我希望了解MailItem中已更改内容的详细信息。

我已经能够将ItemChange基于Application.Session.Folders(“TargetFolder”)触发到变量,如下所示: Private Sub olInvMbxItems_ItemChange(ByVal X As Object)

我想知道X中的属性已更改。如果我将X传递给Private Sub X_PropertyChange(ByVal x As Object)的全局变量,则会错过第一次迭代,因为在X的第一次传递中ItemChange未初始化。

如何监控MailItems的文件夹以检测类别更改。虽然ItemChange执行此操作,但如果我查找特定类别,它会提供重复操作,因为许多更改会触发ItemChange,如下所述:

Handle ItemChange event when outlook appointments are dismissed

在这里:

Outlook Macro that will copy an email I flag and put it in a folder

第二项中UserProperties的二进制标志将不起作用,因为它不是一次性事件。

Outlook Events VBA说使用PropertyChange但没有提供实现技术。

2 个答案:

答案 0 :(得分:1)

无法做到这一点 - 即使在MAPI级别,商店提供商也无法跟踪更改的内容。您唯一的解决方案是比较旧的(由您保存在其他地方)和新值,以查看更改的内容。

答案 1 :(得分:0)

这是一种适用于单一选择的方法。需要细化,但这是一个起点:

Private WithEvents olExplorer As Outlook.Explorer
Private olCurSel As Selection
Private WithEvents olCurSelItem As Outlook.MailItem

Private Sub olExplorer_SelectionChange()
  Set olCurSel = olExplorer.Selection
  Set olCurSelItem = Nothing
  Dim i As Long
  For i = 1 To olCurSel.Count
    If TypeName(olCurSel.Item(i)) = "MailItem" Then
      Set olCurSelItem = olCurSel.Item(i)
    End If
  Next i
End Sub

Private Sub olCurSelItem_PropertyChange(ByVal Name As String)
  Debug.Print Name; " is what changed!"
End Sub

使用Outlook.Explorer.Selection,我们可以知道已选择了某个项目。然后,我们可以有条件地将该项目分配给Outlook.MailItem,并使用该PropertyChange的{​​{1}}事件触发我们希望采取的操作。

问题:

  1. 不处理多项选择
  2. Outlook.MailItem也由每个选择的阅读窗格触发。因此,如果阅读窗格打开,则会触发两次。如上所述,SelectionChangeolCurSelItem设置两次。
  3. 这仅由本地更改触发。有权访问邮箱的其他系统可能会更改项目,但不会触发操作。