阅读Recurring Event的AppointmentItem.GlobalAppointmentID导致问题

时间:2015-05-07 17:34:33

标签: excel excel-vba outlook outlook-vba vba

我发现当我通过Excel-VBA代码在Outlook中读取定期事件的GlobalAppointmentID时,事情开始变得奇怪。

这是我尝试了解此行为的根本原因的代码的一部分:

For Each otItem In resCal
    If otItem.Class = olAppointment Then
        Set cItm = otItem

        If calItem.Subject = "Coffee Date" Then
            Debug.Print "Coffee orig " & cItm.Start
            Debug.Print "Coffee orig 1.1 " & cItm.Start
            Debug.Print cItm.GlobalAppointmentID
            Debug.Print cItm.GlobalAppointmentID
            Debug.Print "Coffee orig 1.5 " & cItm.Start
        End If

    End If
Next otItem

这会产生以下输出:

  • 咖啡orig 4/16/2015 10:00:00 AM
  • 咖啡原价1.1 4/16/2015 10:00:00 AM
  • [全球约会ID编辑,但相同]
  • [全球约会ID编辑,但相同]
  • 咖啡原价1.5 2/19/2015 10:00:00 AM

4/16是我要记录的重复事件的实例。但是,当我调用GlobalAppointmentID属性时,它会将.Start属性的值更改为周期性事件的第一个实例的值。我已经测试过并且可以实现一个解决方法,该方法涉及我在调用GlobalAppointmentID之前将开始日期存储在变量中,但是我想尝试诊断并修复问题的根本原因以确保它不是导致我还没有注意到的任何问题。任何人都可以解释造成这个问题的原因吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

  

当我通过索引调用AppointmentItem而不是通过For Each循环时不会发生问题

我建议使用for循环,并尽快释放对象。如果您的代码尝试枚举存储在Microsoft Exchange Server上的集合中的256个以上的Outlook项目,则这一点尤为重要。如果您未及时发布这些对象,则可以达到Exchange对任何时候打开的最大项目数的限制。声明函数作用域中的对象(循环作用域)并将其设置为Nothing以尽快释放对象的引用。

答案 1 :(得分:0)

我最近又看了一下我的代码并确定了问题的根源。以下是导致问题的代码片段:

With oItms
    .Sort "[Start]", False
    .IncludeRecurrences = True
End With

Set rCal = oItms.Restrict("[Start] >= '" & CStr(date) & "'")

With rCal
    .Sort "[Start]", False
    .IncludeRecurrences = True
End With

具体来说,在不调用“.Restrict”方法的情况下在rCal上运行“.Sort”和“.IncludeRecurrances”会导致问题。我确定第二个“With”是多余的,所以我删除了它。我现在可以按任何顺序调用任何属性,而不必担心值的变化。