Метод Items.Restrict (Outlook)
Применяет фильтр к коллекции Items , возвращая новую коллекцию, содержащую все элементы из исходного объекта, соответствующие фильтру.
Синтаксис
выражение. Restrict
( _Filter_
)
Выражение Выражение, возвращающее объект Items .
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Фильтр | Обязательный | String | Применяемое выражение строки фильтра. Дополнительные сведения см. в разделе Метод Find . |
Возвращаемое значение
Коллекция Items , представляющая элементы из исходной коллекции Items , которые соответствуют фильтру.
Замечания
Этот метод является альтернативой использованию метода Find или FindNext для итерации определенных элементов в коллекции. Методы Find или FindNext выполняются быстрее, чем фильтрация при наличии небольшого количества элементов. Метод Restrict выполняется значительно быстрее, если в коллекции имеется большое количество элементов, особенно если ожидается найти только несколько элементов в большой коллекции.
Примечание.
Если вы используете определяемые пользователем поля в составе предложения Find или Restrict , определяемые пользователем поля должны существовать в папке. В противном случае код создаст ошибку о том, что поле неизвестно. Вы можете добавить поле в папку, отобразив выбор поля и нажав кнопку Создать.
Этот метод не может быть использован и вызовет ошибку со следующими свойствами:
Основной текст | LastFirstNoSpaceCompany |
---|---|
Children | LastFirstSpaceOnlyCompany |
Class | LastFirstNoSpaceAndSuffix |
Companies | MemberCount |
CompanyLastFirstNoSpace | NetMeetingAlias |
CompanyLastFirstSpaceOnly | NetMeetingAutoStart |
ContactNames | NetMeetingOrganizerAlias |
Контакты | NetMeetingServer |
ConversationIndex | NetMeetingType |
DLName | RecurrenceState |
Email1EntryID | ReceivedByEntryID |
Email2EntryID | ReceivedOnBehalfOfEntryID |
Email3EntryID | ReplyRecipients |
EntryID | ResponseState |
HTMLBody | Saved |
IsOnlineMeeting | Sent |
LastFirstAndSuffix | Submitted |
LastFirstNoSpace | VotingOptions |
AutoResolvedWinner | DownloadState |
BodyFormat | IsConflict |
InternetCodePage | MeetingWorkspaceURL |
Разрешение |
Создание фильтров для методов поиска и ограничения
Синтаксис фильтра зависит от типа поля, по которого выполняется фильтрация.
Строка (для текстовых полей)
При фильтрации текстовых полей можно использовать пару одинарных кавычек (') или пару двойных кавычек ("), чтобы разделить значения, входящие в фильтр. Например, все следующие строки работают правильно, если поле имеет тип String :
sFilter = "[CompanyName] = 'Microsoft'" sFilter = "[CompanyName] = ""Microsoft"""
sFilter = "[CompanyName] = " & Chr(34) & "Microsoft" & Chr(34)
Если при указании фильтра в запросе Jet или DASL используется пара одинарных кавычек для разделения строки, которая является частью фильтра, а строка содержит еще одну кавычку или апостроф, добавьте одну кавычку в качестве escape-символа перед одной кавычками или апострофом. Используйте аналогичный подход, если для разделения строки используется пара двойных кавычек. Если строка содержит двойную кавычку, добавьте двойную кавычку в качестве escape-символа перед двойной кавычками.
Например, в строке фильтра DASL, которая фильтрует свойство Subject , равное слову can't
, вся строка фильтра разделяется парой двойных кавычек, а внедренная строка can't
разделяется парой одинарных кавычек. В этой строке фильтра необходимо экранировать три символа: начальная двойная кавычка и конечная двойная кавычка для ссылки на http://schemas.microsoft.com/mapi/proptag/0x0037001f
свойство , а также апостроф в условии значения для слова can't
. Применив соответствующие escape-символы, можно выразить строку фильтра следующим образом:
filter = "@SQL=""http://schemas.microsoft.com/mapi/proptag/0x0037001f"" = 'can''t'"
Кроме того, функцию chr(34)
можно использовать для представления двойной кавычки (значение символа ASCII — 34), используемого в качестве escape-символа. chr(34)
Используя подстановку для escape-символа с двойными кавычками, можно выразить последний пример следующим образом:
filter = "@SQL= " & Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x0037001f" _
& Chr(34) & " = " & "'can''t'"
Экранирование символов одиночных и двойных кавычек также требуется для запросов DASL с операторами ci_startswith или ci_phrasematch . Например, следующий запрос выполняет запрос can't
на совпадение фраз в теме сообщения:
filter = "@SQL=" & Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x0037001E" _
& Chr(34) & " ci_phrasematch " & "'can''t'"
Другим примером является строка фильтра DASL, которая фильтрует свойство Subject , равное словам the right stuff
, где слово stuff
заключено в двойные кавычки. В этом случае необходимо экранировать вложенные двойные кавычки следующим образом:
filter = "@SQL=""http://schemas.microsoft.com/mapi/proptag/0x0037001f"" = 'the right ""stuff""'"
Другой набор правил экранирования применяется к ссылке на свойство для именованных свойств, содержащих пробел, одну кавычку, двойную кавычку или символ процента. Дополнительные сведения см. в разделе Ссылки на свойства по пространству имен.
Дата
Хотя даты и время обычно хранятся в формате даты , методы Find и Restrict требуют преобразования даты и времени в строковое представление. Чтобы убедиться, что дата отформатирована так, как ожидается в Microsoft Outlook, используйте функцию Формат . В следующем примере создается фильтр для поиска всех контактов, которые были изменены после 15 января 1999 г. в 3:30 вечера.
sFilter = "[LastModificationTime] > '" & Format("1/15/99 3:30pm", "ddddd h:nn AMPM") & "'"
Логические операторы
Логические операторы , TRUE/ FALSE, ДА/НЕТ, ON/OFF и т. д., не следует преобразовывать в строку. Например, чтобы определить, включено ли ведение журнала для контактов, можно использовать следующий фильтр:
sFilter = "[Journal] = True"
Примечание.
Если вы используете кавычки в качестве разделителей с логическими полями, пустая строка будет находить элементы, поля которых имеют значение False , а все непустые строки будут находить элементы с полями True.
Ключевые слова (или категории)
Поле Категории содержит ключевые слова типа, предназначенные для хранения нескольких значений. При программном доступе к нему поле Категории ведет себя как текстовое поле, и строка должна точно соответствовать. Значения в текстовой строке разделяются запятой и пробелом. Обычно это означает, что нельзя использовать методы Find и Restrict в поле ключевых слов, если оно содержит несколько значений. Например, если у вас есть один контакт в категории "Бизнес" и один контакт в категориях "Бизнес" и "Социальные сети", вы не можете легко использовать методы Поиска и ограничения для получения всех элементов, которые находятся в категории "Бизнес". Вместо этого можно выполнить цикл по всем контактам в папке и использовать функцию Instr , чтобы проверить, содержится ли строка "Бизнес" во всем поле ключевых слов.
Примечание.
Возможное исключение — если поле "Категории" ограничено двумя или небольшим количеством значений. Затем можно использовать методы Find и Restrict с логическим оператором OR, чтобы получить все бизнес-контакты. Например (в псевдокоде): "Бизнес" ИЛИ "Бизнес, Личное" или "Личное, Бизнес". В строках категорий регистр не учитывается.
Целое число
Вы можете искать целочисленные поля с кавычками или без в качестве разделителей. Следующие фильтры помогут найти контакты, созданные с помощью Outlook 2000:
sFilter = "[OutlookInternalVersion] = 92711" sFilter = "[OutlookInternalVersion] = '92711'"
Использование переменных в составе фильтра
Как показано в примере метода Restrict , значения из переменных можно использовать в составе фильтра. Следующий пример кода Microsoft Visual Basic Scripting Edition (VBScript) иллюстрирует синтаксис, который использует переменные в качестве части фильтра.
sFullName = "Dan Wilson"
' This approach uses Chr(34) to delimit the value.
sFilter = "[FullName] = " & Chr(34) & sFullName & Chr(34)
' This approach uses double quotation marks to delimit the value. sFilter = "[FullName] = """ & sFullName & """"
Использование логических операторов в составе фильтра
Допустимые логические операторы: AND, OR и NOT. Ниже приведены варианты предложения для метода Restrict , чтобы можно было указать несколько условий.
ИЛИ. Следующий код возвращает все контактные элементы, у которых в качестве категории "Бизнес" или "Личные".
sFilter = "[Categories] = 'Personal' Or [Categories] = 'Business'"
И. Следующий код извлекает всех личных контактов, работающих в корпорации Майкрософт.
sFilter = "[Categories] = 'Personal' And [CompanyName] = 'Microsoft'"
НЕТ. Следующий код извлекает все личные контакты, которые не работают в Корпорации Майкрософт.
sFilter = "[Categories] = 'Personal' And Not([CompanyName] = 'Microsoft')"
Дополнительные примечания
Если вы пытаетесь использовать методы Find или Restrict с определяемыми пользователем полями, поля должны быть определены в папке, в противном случае возникнет ошибка. Нет способа выполнить операцию "contains". Например, нельзя использовать функцию "Найти " или "Ограничить " для поиска элементов с определенным словом в поле "Тема ". Вместо этого можно использовать метод AdvancedSearch или выполнить цикл по всем элементам в папке и использовать функцию InStr для поиска в поле. Используйте метод Restrict для поиска элементов, которые начинаются с определенного диапазона символов. Например, чтобы найти все контакты с фамилией, начинавшейся с буквы M, используйте следующий фильтр:
sFilter = "[LastName] > 'LZZZ' And [LastName] < 'N'"
Пример
В этом примере Visual Basic для приложений (VBA) используется метод Restrict для получения всех элементов папки "Входящие" категории "Бизнес" и их перемещения в папку Business. Чтобы запустить этот пример, создайте или убедитесь, что вложенная папка "Бизнес" существует в папке "Входящие".
Sub MoveItems()
Dim myNamespace As Outlook.NameSpace
Dim myFolder As Outlook.Folder
Dim myItems As Outlook.Items
Dim myRestrictItems As Outlook.Items
Dim myItem As Outlook.MailItem
Set myNamespace = Application.GetNamespace("MAPI")
Set myFolder = _
myNamespace.GetDefaultFolder(olFolderInbox)
Set myItems = myFolder.Items
Set myRestrictItems = myItems.Restrict("[Categories] = 'Business'")
For i = myRestrictItems.Count To 1 Step -1
myRestrictItems(i).Move myFolder.Folders("Business")
Next
End Sub
В этом Visual Basic для приложений примере используется метод Restrict для применения фильтра к контактным элементам на основе свойства LastModificationTime элемента.
Public Sub ContactDateCheck()
Dim myNamespace As Outlook.NameSpace
Dim myContacts As Outlook.Items
Dim myItems As Outlook.Items
Dim myItem As Object
Set myNamespace = Application.GetNamespace("MAPI")
Set myContacts = myNamespace.GetDefaultFolder(olFolderContacts).Items
Set myItems = myContacts.Restrict("[LastModificationTime] > '01/1/2003'")
For Each myItem In myItems
If (myItem.Class = olContact) Then
MsgBox myItem.FullName & ": " & myItem.LastModificationTime
End If
Next
End Sub
Следующий Visual Basic для приложений пример такой же, как и в приведенном выше примере, за исключением того, что в нем показано использование переменной в фильтре.
Public Sub ContactDateCheck2()
Dim myNamespace As Outlook.NameSpace
Dim myContacts As Outlook.Items
Dim myItem As Object
Dim DateStart As Date
Dim DateToCheck As String
Dim myRestrictItems As Outlook.Items
Set myNameSpace = Application.GetNamespace("MAPI")
Set myContacts = myNameSpace.GetDefaultFolder(olFolderContacts).Items
DateStart = #01/1/2003#
DateToCheck = "[LastModificationTime] >= """ & DateStart & """"
Set myRestrictItems = myContacts.Restrict(DateToCheck)
For Each myItem In myRestrictItems
If (myItem.Class = olContact) Then
MsgBox myItem.FullName & ": " & myItem.LastModificationTime
End If
Next
End Sub
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.