我发现当我通过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
这会产生以下输出:
4/16是我要记录的重复事件的实例。但是,当我调用GlobalAppointmentID属性时,它会将.Start属性的值更改为周期性事件的第一个实例的值。我已经测试过并且可以实现一个解决方法,该方法涉及我在调用GlobalAppointmentID之前将开始日期存储在变量中,但是我想尝试诊断并修复问题的根本原因以确保它不是导致我还没有注意到的任何问题。任何人都可以解释造成这个问题的原因吗?
谢谢!
答案 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”是多余的,所以我删除了它。我现在可以按任何顺序调用任何属性,而不必担心值的变化。