2009-12-18 15 views
12

Ho scritto una macro che scorre il calendario di un utente e apporta modifiche alle voci che filtrano un determinato criterio.Iterazione rapida degli elementi di appuntamento di Outlook

Il problema è che quando il calendario è molto grande, questo richiede molto tempo. Non riesco a filtrare gli appuntamenti perché oAppointmentItems sembra memorizzare le voci così come sono state create, che non è necessariamente lo stesso ordine di quando iniziano.

Il codice che sto usando è questo:

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 

Breve di rimuovere la DoEvents (il che significa solo che Outlook sembra bloccarsi per l'utente) c'è un modo per accelerare questo applicando qualche tipo di filtro? Ad esempio, appuntamenti che iniziano in futuro.

risposta

14

È possibile utilizzare Limita per filtrare. Si noti che sono date nel mese format, giorno, anno e che vengono filtrati come stringhe, anche se memorizzato come date:

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 
    <...> 

Maggiori informazioni: http://msdn.microsoft.com/en-us/library/bb220369.aspx

+0

questo era esattamente quello che stavo cercando per oggi! Questo mi ha salvato così tanti problemi. Una cosa che noto è che non riesco a farlo funzionare con un filtro data usando =, ed è difficile ottenere una data esatta (sembra dipendere dal fatto che siano una data o una data/ora in Outlook). Come> Data - 1 giorno e Data e Data Jeff

+0

Usando l'associazione anticipata in VBA, come dovrebbero essere DIM'd olRecItems? (Prospettiva.???). Grazie .. –

+1

@iDevlop come Outlook.MAPIFolder AFAIK. – Fionnuala

0

Hey non ha potuto ottenere i compiti di lavorare, ma questo sembra funzionare per le nomine 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 
Problemi correlati