【问题标题】:How can I implement the PropertyChange event?如何实现 PropertyChange 事件?
【发布时间】:2017-11-13 14:27:56
【问题描述】:

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

我已经能够根据 Application.Session.Folders("TargetFolder") 触发 ItemChange 到一个变量,如下所示: 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,但没有提供实现技术。

【问题讨论】:

  • 从进一步的问题来看,如果不完整的自我回答应该是合理的,您似乎需要重新考虑您的解决方案。特别是如果其他系统可能会更改项目,您可能必须保存旧的类别代码,可能在用户定义的字段中,并定期循环项目Run a code every half an hour,或通过提醒触发,以查看当前的猫代码是否匹配。跨度>
  • 当我回家处理这个问题时,我正在学习这个方向。如果我可以注册一个本地副本以在 ItemChanged 被触发时检查更改,它可能会运行良好。缓存为 UserProperty 的类别副本可能会理想地工作。我会随着进度更新内容。
  • 您仍然可以尝试对项目所做的更改,但我建议您不会识别由其他系统完成的 ItemChange 或 PropertyChange,这就是为什么在这种情况下您会将当前的 cat 代码与保存的 cat 进行比较定期编写代码。

标签: vba outlook


【解决方案1】:

没有办法做到这一点 - 即使在 MAPI 级别,商店提供商也不会跟踪更改的内容。您唯一的解决方案是比较旧值(由您保存在其他地方)和新值,看看发生了什么变化。

【讨论】:

    【解决方案2】:

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

    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,并使用Outlook.MailItem 的PropertyChange 事件触发我们希望采取的操作。

    问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 2016-01-30
      • 1970-01-01
      相关资源
      最近更新 更多