2009-12-18 10 views
12

He escrito una macro que repite en un calendario de usuarios y hace modificaciones a las entradas que cumplen un determinado criterio.Iteración rápida a través de elementos de citas de Outlook

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 la siguiente:

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 

corto de la eliminación de la DoEvents (que sólo significa que Outlook parece encerrar al usuario) ¿hay alguna manera de que pueda acelerar este proceso mediante la aplicación de algún tipo de filtro? Por ejemplo, citas que comienzan en el futuro.

Respuesta

14

Puede utilizar Restringir para filtrar. Tenga en cuenta que las fechas están en el formato de mes, día, año y que se filtran en forma de cadenas, a pesar de que almacena 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

+0

esto era exactamente lo que estaba buscando para hoy! Esto me ha ahorrado tantos problemas. Sin embargo, una cosa que noto es que no puedo hacer que funcione con un filtro de fecha usando =, y es difícil obtener una fecha exacta (parece depender de si son una fecha o una fecha/hora en Outlook). Me gusta> Fecha - 1 día y Fecha y fecha Jeff

+0

Usando el enlace anticipado en VBA, ¿cómo deben ser olvidados los artículos? (Panorama.???). Gracias .. –

+1

@iDevlop como Outlook.MAPIFolder AFAIK. – Fionnuala

0

Hey no podría conseguir tareas para trabajar, pero esto parece funcionar en las citas full explaination

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 
Cuestiones relacionadas