vba - tareas - Iteración rápida a través de elementos de citas de Outlook
para que sirve tareas de outlook (2)
He escrito una macro que itera a través de un calendario de usuarios y hace modificaciones a las entradas que cubren un determinado critera.
El problema es que cuando el calendario es muy grande, esto lleva mucho tiempo. Parece que no puedo filtrar las citas porque oAppointmentItems
parece almacenar las entradas a medida que se crearon, lo que no es necesariamente el mismo orden que cuando comienzan.
El código que estoy usando es este:
Dim oOL As New Outlook.Application
Dim oNS As Outlook.NameSpace
Dim oAppointments As Object
Dim oAppointmentItem As Outlook.AppointmentItem
Set oNS = oOL.GetNamespace("MAPI")
Set oAppointments = oNS.GetDefaultFolder(olFolderCalendar)
For Each oAppointmentItem In oAppointments.Items
DoEvents
'' Something here
Next
Set oAppointmentItem = Nothing
Set oAppointments = Nothing
Set oNS = Nothing
Set oOL = Nothing
Si no se elimina el DoEvents
(que solo significa que Outlook parece bloquearse para el usuario) ¿hay alguna manera de acelerar esto aplicando algún tipo de filtro? Por ejemplo, citas que comienzan en el futuro.
Oye, no pude hacer que las tareas funcionaran, pero esto parece funcionar en las citas de explicación completa
Dim myStart As Date
Dim myEnd As Date
myStart = Date
myEnd = DateAdd("d", 30, myStart)
Debug.Print "Start:", myStart
Debug.Print "End:", myEnd
''Construct filter for the next 30-day date range
strRestriction = "[Start] >= ''" & _
Format$(myStart, "mm/dd/yyyy hh:mm AMPM") _
& "'' AND [End] <= ''" & _
Format$(myEnd, "mm/dd/yyyy hh:mm AMPM") & "''"
''Check the restriction string
Debug.Print strRestriction
Const olFolderCalendar = 9
Set olApp = CreateObject("Outlook.Application")
Set olNS = olApp.GetNamespace("MAPI")
Set oCalendar = olNS.GetDefaultFolder(olFolderTasks)
Set oItems = oCalendar.items
oItems.IncludeRecurrences = True
'' oItems.Sort "[Start]" '' commented out worked for me..
''Restrict the Items collection for the 30-day date range
Set oItemsInDateRange = oItems.Restrict(strRestriction)
Debug.Print oItemsInDateRange.Count
Puede usar Restringir para filtrar. Tenga en cuenta que las fechas tienen el formato de mes, día, año y que se filtran como cadenas, aunque estén almacenadas como fechas:
Set olApp = CreateObject("Outlook.Application")
Set olNS = olApp.GetNamespace("MAPI")
Set olRecItems = olNS.GetDefaultFolder(olFolderTasks)
strFilter = "[DueDate] > ''1/15/2009''"
Set olFilterRecItems = olRecItems.Items.Restrict(strFilter)
For i = 1 To olFilterRecItems.Count
<...>
Más información: http://msdn.microsoft.com/en-us/library/bb220369.aspx