Быстрая итерация по элементам встреч в Outlook - PullRequest
12 голосов
/ 18 декабря 2009

Я написал макрос, который просматривает календарь пользователя и вносит изменения в записи, которые заполняют определенные критерии.

Проблема в том, что когда календарь очень большой, это занимает много времени. Кажется, я не могу отфильтровать встречи, потому что oAppointmentItems, кажется, хранит записи в том виде, в котором они были созданы, что не обязательно соответствует порядку, когда они начинаются.

код, который я использую, это:

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

Если не считать удаления DoEvents (что означает только то, что Outlook кажется заблокированным для пользователя), есть ли способ ускорить это, применив какой-то фильтр? Например, встречи, которые начинаются в будущем.

Ответы [ 2 ]

14 голосов
/ 18 декабря 2009

Вы можете использовать ограничение для фильтрации. Обратите внимание, что даты имеют формат месяц, день, год и что они фильтруются как строки, даже если они хранятся в виде дат:

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

Дополнительная информация: http://msdn.microsoft.com/en-us/library/bb220369.aspx

0 голосов
/ 09 июня 2017

Эй, не могли заставить задачи работать, но это, кажется, работает на встречах полное объяснение

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...