Excel 正在读取定期事件的AppointItem.GlobalAppointId导致问题

Excel 正在读取定期事件的AppointItem.GlobalAppointId导致问题,excel,vba,outlook,Excel,Vba,Outlook,我发现,当我通过Excel VBA代码读取Outlook中重复事件的GlobalAppointId时,事情开始变得奇怪 下面是我一直在使用的代码的一部分,我试图了解这种行为的根本原因: For Each otItem In resCal If otItem.Class = olAppointment Then Set cItm = otItem If calItem.Subject = "Coffee Date" Then Deb

我发现,当我通过Excel VBA代码读取Outlook中重复事件的GlobalAppointId时,事情开始变得奇怪

下面是我一直在使用的代码的一部分,我试图了解这种行为的根本原因:

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
这将产生以下输出:

  • 咖啡起源于2015年4月16日上午10:00:00
  • 咖啡起源1.1 2015年4月16日上午10:00:00
  • [全球预约ID已编辑,但相同]
  • [全球预约ID已编辑,但相同]
  • 咖啡源1.5 2015年2月19日上午10:00:00
4/16是我想要记录的重复事件的实例。但是,当我调用GlobalAppointmentID属性时,它会将.Start属性的值更改为定期事件的第一个实例的值。我已经测试并可以实现一种变通方法,在调用GlobalAppointmentID之前将开始日期存储在一个变量中,但是我想尝试诊断并修复问题的根本原因,以确保它不会导致我尚未注意到的任何问题。谁能解释一下是什么导致了这个问题

谢谢

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


我建议使用for循环,并尽快释放对象。如果代码试图枚举存储在Microsoft Exchange服务器上的集合中超过256个Outlook项目,则这一点尤为重要。如果您不及时释放这些对象,您可以达到Exchange对任何时间打开的最大项目数施加的限制。在函数作用域(循环作用域)中声明一个对象,并将其设置为“无”,以尽快释放对该对象的引用。

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

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

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

您是否能够在没有循环的情况下重现该问题?就一个约会项目?这是Exchange配置文件吗?我没想过要测试这个。我只是这样做了,事实上,当我通过索引调用AppointItem而不是通过For Each循环调用AppointItem时,问题并没有出现。这个电子邮件地址是用来工作的,我敢肯定我们用的是Exchange。