Я хочу добавить пользовательское свойство к элементам календаря (в идеале оно должно содержать уникальный идентификатор), чтобы я мог использовать Ограничение для сбора экземпляров повторяющихся элементов встречи.Но хотя мне кажется, что я могу добавить свойство, я не могу найти способ использовать метод Items.Restrict (), чтобы найти элементы, содержащие свойство.
Я знаю, что могу собрать коллекцию всех элементов в календаре и зациклить каждый, чтобы найти то, что я хочу, - но это текущий метод, который я использую, и это медленный способ.
Я просмотрел десятки сайтов и нашел противоречивые ответы о том, возможно ли это вообще, - но Microsoft, похоже, так думает (см. Первую ссылку), а также другие люди (см. Вторую ссылку).
Я использовал окно locals в режиме отладки, и Restrict определенно не собирает какие-либо объекты.
Я могу только предположить, что я делаю что-то не так в разделе Column (основываясь на этом "Пользовательские свойства должны быть определены впапку, в которой вы применяете фильтр. Если пользовательские свойства определены только в элементе, поиск не удастся "- первая ссылка) или представление, но я не могу понять, что.
Я знаю, что яне может использовать TableView, потому что он не будет включать повторяющиеся экземпляры (см. третью ссылку).
- https://docs.microsoft.com/en-us/office/vba/outlook/how-to/search-and-filter/filtering-a-custom-field
- http://www.outlookcode.com/threads.aspx?forumid=2&messageid=27942
https://docs.microsoft.com/en-us/office/client-developer/outlook/pia/how-to-filter-recurring-appointments-and-search-for-a-string-in-the-subject
Sub AddAndRestrictCustomProperty()
Dim NS As Outlook.NameSpace
Dim dcal As Folder
Dim dCalItmes As Items
Dim objd As Items, objc As Items
Dim item As Outlook.AppointmentItem
Dim upCheck As Outlook.UserProperty
Dim udpCheck As Outlook.UserDefinedProperty
Set NS = Application.GetNamespace("MAPI")
Set dcal = NS.GetDefaultFolder(olFolderCalendar)
Set dCalItems = dcal.Items
Set item = dCalItems.Add(olAppointmentItem)
With item
.Subject = "Placeholder Appt"
.Start = "2/12/2019 4:30PM"
.Body = "nothing"
.MeetingStatus = olMeeting
.Save
End With
'adds custom property
Set upCheck = item.UserProperties.Add("userPropCheck", olText, True, olText)
upCheck.Value = "testing"
Debug.Print item.ItemProperties.item("userPropCheck").Value 'prints "testing"
item.Save
'gets instances of custom property in objd
dCalItems.Sort "[Start]"
dCalItems.IncludeRecurrences = True
Set objd = dCalItems.Restrict("[subject] = Placeholder Appt And [Start] >= '2/11/2019' and [Start] <= '2/13/2019'")
Debug.Print objd(1).ItemProperties.item("userPropCheck").Value 'prints testing
'setColumns seems to not work for custom properties
objd.SetColumns ("userPropCheck, subject, start") 'ERROR: The property "userPropCheck" is unknown error
'Jet Restrict Fails
Set objc = dCalItems.Restrict("[userPropCheck] = " & Chr(34) & "testing" & Chr(34))
Debug.Print objc(1).ItemProperties.item("userPropCheck").Value 'ERROR: object variable or with block variable not set error
'Jet Find Fails
Set objc = dCalItems.Find("[userPropCheck] = " & Chr(34) & "testing" & Chr(34))
Debug.Print objc(1).ItemProperties.item("userPropCheck").Value 'ERROR: object variable or with block variable not set error
'DSAL Restrict Fails
sFilter = "@SQL=" & Chr(34) & "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/userPropCheck" & Chr(34) & "= 'testing'" ''"@SQL=" & Chr$(34) & "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/userPropCheck" & Chr(34) & " = 'testing'"
Set objc = dCalItems.Restrict(sFilter)
Debug.Print objc(1).ItemProperties.item("userPropCheck").Value 'ERROR: object variable or with block variable not set error
'DSAL Find Fails
sFilter = "@SQL=" & Chr(34) & "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/userPropCheck" & Chr(34) & "= 'testing'" ''"@SQL=" & Chr$(34) & "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/userPropCheck" & Chr(34) & " = 'testing'"
Set objc = dCalItems.Find(sFilter)
Debug.Print objc(1).ItemProperties.item("userPropCheck").Value 'ERROR: object variable or with block variable not set error
'THIS WORKS to filter the actual calendar view
Set objView = Application.ActiveExplorer.CurrentView
objView.Filter = Chr(34) & "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/userPropCheck" & Chr(34) & "= 'testing'"
objView.Save
objView.Apply
End Sub
Как видите, я довольно растерян.Я могу добавить настраиваемое свойство к элементу, а затем ограничить что-либо, кроме этого свойства, чтобы получить элемент, а затем распечатать настраиваемое свойство, и я могу отфильтровать текущее представление по настраиваемому свойству, используя представление DSAL.Filter, но используячто в Restrict также не работает.