读取 AppointmentItem.GlobalAppointmentID 个重复事件导致问题
Reading AppointmentItem.GlobalAppointmentID of Recurring Event is Causing Issues
我发现当我通过我的 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/2015 10:00:00 上午
- 咖啡原版 1.1 2015 年 4 月 16 日 10:00:00 上午
- [全局约会 ID 已编辑,但相同]
- [全局约会 ID 已编辑,但相同]
- Coffee orig 1.5 2/19/2015 10:00:00 AM
4/16 是我要记录的重复事件的实例。但是,当我调用 GlobalAppointmentID 属性 时,它会将 .Start 属性 的值更改为重复事件的第一个实例的值。我已经测试并可以实施一个解决方法,涉及我在调用 GlobalAppointmentID 之前将开始日期存储在变量中,但是我想尝试诊断并修复问题的根本原因以确保它不会引起任何问题我还没有注意到。任何人都可以阐明导致此问题的原因吗?
谢谢!
the problem does not occur when I call the AppointmentItem by index instead of looping via For Each
我建议改用 for 循环并尽快释放对象。如果您的代码试图在存储在 Microsoft Exchange Server 上的集合中枚举超过 256 个 Outlook 项目,这一点尤其重要。如果您不及时释放这些对象,您可能会达到 Exchange 对任何一次打开的最大项目数的限制。在函数作用域(循环作用域)声明一个对象,并设置为Nothing,尽快释放对该对象的引用。
我最近再次查看了我的代码并确定了问题的根源。以下是导致问题的代码片段:
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”和“.IncludeRecurrances”没有调用“.Restrict”方法导致了问题。我确定第二个“With”是多余的,所以我删除了它。我现在可以按任何顺序调用任何 属性,而不必担心值会发生变化。
我发现当我通过我的 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/2015 10:00:00 上午
- 咖啡原版 1.1 2015 年 4 月 16 日 10:00:00 上午
- [全局约会 ID 已编辑,但相同]
- [全局约会 ID 已编辑,但相同]
- Coffee orig 1.5 2/19/2015 10:00:00 AM
4/16 是我要记录的重复事件的实例。但是,当我调用 GlobalAppointmentID 属性 时,它会将 .Start 属性 的值更改为重复事件的第一个实例的值。我已经测试并可以实施一个解决方法,涉及我在调用 GlobalAppointmentID 之前将开始日期存储在变量中,但是我想尝试诊断并修复问题的根本原因以确保它不会引起任何问题我还没有注意到。任何人都可以阐明导致此问题的原因吗?
谢谢!
the problem does not occur when I call the AppointmentItem by index instead of looping via For Each
我建议改用 for 循环并尽快释放对象。如果您的代码试图在存储在 Microsoft Exchange Server 上的集合中枚举超过 256 个 Outlook 项目,这一点尤其重要。如果您不及时释放这些对象,您可能会达到 Exchange 对任何一次打开的最大项目数的限制。在函数作用域(循环作用域)声明一个对象,并设置为Nothing,尽快释放对该对象的引用。
我最近再次查看了我的代码并确定了问题的根源。以下是导致问题的代码片段:
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”和“.IncludeRecurrances”没有调用“.Restrict”方法导致了问题。我确定第二个“With”是多余的,所以我删除了它。我现在可以按任何顺序调用任何 属性,而不必担心值会发生变化。