【问题标题】:Restrict Outlook Items by Date按日期限制 Outlook 项目
【发布时间】:2024-04-30 03:35:02
【问题描述】:

我有一个 Outlook 宏,它按日期过滤电子邮件对象并根据数组返回项目。

今天的过滤器如下:

sfilter = "[ReceivedTime]>=""&Date()12:00am&"""
Set myItems = myNewFolder.Items.Restrict(sfilter)

sFilter 是一个字符串,它会按预期返回今天的项目。

我正在尝试过滤昨天收到的电子邮件。

以下是我的尝试。

sfilter = "[ReceivedTime]>=""&Date(-1) 12:00am&"" AND [ReceivedTime]<= ""&Date() 12:00am&"" "
tfilter = Format(DateAdd("d", -1, Date), "mm/dd/yyyy")
rFilter = Format(DateAdd("d", 0, Date), "mm/dd/yyyy")

我打算使用 tFilter 和 rFilter 作为 sFilter 的上限和下限。

我在 MSDN 网站上查看函数信息后尝试使用 DateAdd 方法,但没有返回昨天的项目。

我尝试了针对此问题 (Outlook .Restrict method does not work with Date) 提供的解决方案。

带有 date(-1) 的方法不能与 date 一起工作。根据 MSDN 站点逻辑运算符应该可以工作。

注意:下面三个示例引用编译并且不返回任何错误。

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    您可以使用两个单独的Restricts 找到昨天的邮件。

    Private Sub EmailYesterday()
    
    Dim oOlInb As Folder
    Dim oOlItm As Object
    
    Dim oOlResults As Object
    Dim i As Long
    
    Dim sFilter As String
    Dim sFilter2 As String
    
    Set oOlInb = Session.GetDefaultFolder(olFolderInbox)
    
    'Filter recent - Lower Bound of the range
    sFilter = "[ReceivedTime]>'" & format(Date - 1, "DDDDD HH:NN") & "'"
    
    Debug.Print vbCr & sFilter
    Set oOlResults = oOlInb.Items.Restrict(sFilter)
    Debug.Print oOlResults.count & " items."
    
    If oOlResults.count > 0 Then
        For i = 1 To oOlResults.count
            Set oOlItm = oOlResults(i)
            Debug.Print oOlItm.Subject & " - " & oOlItm.ReceivedTime
        Next i
    End If
    
    ' Filter range - Upper Bound
    sFilter2 = "[ReceivedTime]<'" & format(Date, "DDDDD HH:NN") & "'"
    
    Debug.Print vbCr & sFilter; " AND " & sFilter2
    
    Set oOlResults = oOlResults.Restrict(sFilter2)   ' Restrict the Lower Bound result
    Debug.Print oOlResults.count & " items."
    
    If oOlResults.count > 0 Then
        For i = 1 To oOlResults.count
            Set oOlItm = oOlResults(i)
            Debug.Print oOlItm.Subject & " - " & oOlItm.ReceivedTime
        Next i
    End If
        
    ExitRoutine:
        Set oOlInb = Nothing
        Set oOlResults = Nothing
        Debug.Print "Done."
        
    End Sub
    

    【讨论】:

    • 谢谢!过滤器正在工作,但有没有办法在过滤器中包含时间?您提供的代码似乎也从今天返回了一些项目。这是否意味着它正在返回项目
    • ReceivedTime = & Date - 1 似乎也没有返回任何项目。我猜这是由于当前使用的时间。邮件的已发送属性会避免这个问题吗? (msdn.microsoft.com/en-us/library/office/…)
    • 似乎比最初想象的要复杂一些。向过滤器添加了日期格式。我觉得我的测试比以前好一点。
    • 谢谢!它现在工作得很好。还有一个快速的问题。如果我想改变时间,我会怎么做?我必须使用 dateadd 还是需要输入所需时间的字符串?
    • 您可以在此处查看如何添加时间 msdn.microsoft.com/en-us/library/office/ff869597.aspx sFilter = "[ReceivedTime]>'" & format(Date - 1 & " 11:30am", "DDDDD HH:NN ampm") &“'”
    【解决方案2】:

    昨天的日期可以过滤如下

    oOlResults.Restrict("@SQL=%yesterday(""urn:schemas:httpmail:datereceived"")%")
    

    今天或本月也一样。

     oOlResults.Restrict("@SQL=%today(""urn:schemas:httpmail:datereceived"")%")
     oOlResults.Restrict("@SQL=%thismonth(""urn:schemas:httpmail:datereceived"")%")
    

    更多信息here

    【讨论】: