Items.Restrict 方法 (Outlook)

将筛选器应用于 Items 集合,返回一个新集合,其中包含与筛选器匹配的原始项的所有项。

语法

expressionRestrict( _Filter_ )

expression:返回 Items 对象的表达式。

参数

名称 必需/可选 数据类型 说明
Filter 必需 字符串 要应用的筛选器字符串表达式。 有关详细信息,请参阅 Find 方法。

返回值

一个 Items 集合,表示与筛选器匹配的原始 Items 集合中的

备注

此方法是使用 Find 方法或 FindNext 方法循环访问集合中特定项的替代方法。 如果集合中只有较少数量的项目,FindFindNext 方法要比筛选更快。 如果集合中项目较多,尤其是预计在大型集合中仅可查找到少量几个项目时,Restrict 方法的速度会明显更快。

注意

如果将用户定义的字段作为 FindRestrict 语句的一部分,则文件夹中必须有这些用户定义的字段。 否则代码会产生错误,指出字段未知。 可以通过显示“字段选择器”然后单击“新建”来将字段添加到文件夹中。

此方法不能与下列属性一起使用,否则将导致错误:

正文 LastFirstNoSpaceCompany
子女 LastFirstSpaceOnlyCompany
Class LastFirstNoSpaceAndSuffix
Companies MemberCount
CompanyLastFirstNoSpace NetMeetingAlias
CompanyLastFirstSpaceOnly NetMeetingAutoStart
ContactNames NetMeetingOrganizerAlias
Contacts 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
权限

创建 Find 方法和 Restrict 方法的筛选器

根据要筛选的字段类型,筛选器的语法将有所不同。

字符串(适用于文本字段)

筛选文本字段时,你既可以使用一对单引号 ('),也可以使用一对双引号 (") 来分隔作为筛选器一部分的值。 例如,当字段为字符串类型时,下列所有行均可正常使用:

sFilter = "[CompanyName] = 'Microsoft'" sFilter = "[CompanyName] = ""Microsoft"""  
sFilter = "[CompanyName] = " & Chr(34) & "Microsoft" & Chr(34)

在 Jet 或 DASL 查询中指定筛选器的过程中,如果使用一对单引号来分隔构成筛选器的字符串,而且该字符串包含另一个单引号或撇号,则应在这个单引号或撇号前面添加一个单引号以用作转义符。 如果使用一对双引号来分隔字符串,则也可使用类似方法。 如果该字符串包含一个双引号,则应在该双引号前面添加一个双引号以用作转义符。

例如,在 DASL 筛选器字符串中,筛选 的 Subject 属性等于 单词 can't,整个筛选器字符串由一对双引号分隔,嵌入的字符串 can't 由一对单引号分隔。 此筛选器字符串中需要转义三个字符:的起始双引号和结束双引号用于 的属性引用 http://schemas.microsoft.com/mapi/proptag/0x0037001f,以及单词 can't的值条件中的撇号。 通过应用适当的转义符,您可将筛选器字符串表示如下:

filter = "@SQL=""http://schemas.microsoft.com/mapi/proptag/0x0037001f"" = 'can''t'"

或者,可以使用 chr(34) 函数来表示双引号 (其 ASCII 字符值为 34) 用作转义字符。 通过使用 chr(34) 代替双引号转义符,您可将上一个示例表示如下:

filter = "@SQL= " & Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x0037001f" _  
    & Chr(34) & " = " & "'can''t'"

对于使用 ci_startswithci_phrasematch 运算符的 DASL 查询而言,转义单引号和双引号字符也是必需的。 例如,以下查询可在邮件主题中执行针对 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""'"

对于包含空格、单引号、双引号或百分号字符的命名属性,对这些属性的引用将应用一组不同的转义规则。 有关更多信息,请参阅按命名空间引用属性

日期

尽管日期和时间通常以日期格式存储,但 FindRestrict 方法要求将日期和时间转换为字符串表达形式。 为确保日期的格式满足 Microsoft Outlook 的要求,请使用 Format 函数。 以下示例创建了筛选器以查找所有在 1999 年 1 月 15 日下午 3:30 以后修改过的联系人。

sFilter = "[LastModificationTime] > '" & Format("1/15/99 3:30pm", "ddddd h:nn AMPM") & "'"

布尔运算符

布尔运算符、TRUE/ FALSE、YES/NO、ON/OFF 等都不应转换为字符串。 例如,若要确定是否已为联系人启用日记,则可使用以下筛选器:

sFilter = "[Journal] = True" 

注意

如果使用引号作为 Boolean 字段的分隔符,则空字符串将查找其字段为 False 的项目,所有非空字符串将查找其字段为 True 的项目。

关键字(或类别)

类别字段属于关键字类型,用于保存多个值。 如果以编程方式进行访问,则类别字段的行为与文本字段类似,且字符串必须完全匹配。 文本字符串中的值将通过逗号和空格分隔。 这通常意味着,当关键字字段包含多个值时,不能使用 FindRestrict 方法对关键字字段进行操作。 例如,如果“商务”类别和“商务和社会”类别中各包含一个联系人,则无法轻松使用 FindRestrict 方法检索“商务”类别中的所有项目。 但可循环遍历文件夹中的所有联系人,并使用 Instr 函数测试字符串“商务”是否包含在整个关键字字段中。

注意

一个可能的例外是,如果将“类别”字段限制为两个,或者值数较少。 此时,可以使用 FindRestrict 方法结合 OR 逻辑运算符来检索所有商务联系人。 例如,伪代码) 中的 (:“Business”或“Business,Personal”或“Personal,Business”。类别字符串不区分大小写。

整数

可以搜索带引号或不使用引号作为分隔符的 整数 字段。 下列筛选器将查找使用 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 方法的 子句变体,因此可以指定多个条件。

OR:以下代码返回所有类别为“商务”或“个人”的联系人项目。

sFilter = "[Categories] = 'Personal' Or [Categories] = 'Business'"  

AND:以下代码检索所有工作单位为 Microsoft 的私人联系人。

sFilter = "[Categories] = 'Personal' And [CompanyName] = 'Microsoft'"

NOT:以下代码检索所有工作单位不是 Microsoft 的私人联系人。

sFilter = "[Categories] = 'Personal' And Not([CompanyName] = 'Microsoft')"

其他注意事项

如果试图通过用户定义的字段使用 FindRestrict 方法,这些字段必须在文件夹中已定义,否则将发生错误。 无法执行“包含”操作。 例如,不能使用 FindRestrict 搜索“主题”字段中包含特定字词的项目。 而应使用 AdvancedSearch 方法,或循环遍历文件夹中的所有项目并使用 InStr 函数在字段内执行搜索操作。 使用 Restrict 方法搜索从特定字符范围开始的项目。 例如,若要搜索姓氏以字母 M 开头的所有联系人,请使用以下筛选器:

sFilter = "[LastName] > 'LZZZ' And [LastName] < 'N'"

示例

此Visual Basic for Applications (VBA) 示例使用 Restrict 方法获取“企业”类别的所有收件箱项目,并将其移动到“业务”文件夹。 若要运行本示例,请在“收件箱”中创建“商务”子文件夹或确保“商务”子文件夹存在。

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 for Applications示例使用 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 for Applications 示例除演示在筛选条件中使用变量外与上例相同。

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 支持和反馈,获取有关如何接收支持和提供反馈的指南。