Поделиться через


Метод 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

См. также

Объект Items

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.