如何使用vba使用接收时间过滤邮件

时间:2016-01-29 12:30:44

标签: vba outlook-vba

我正在尝试找到一种基于多个条件过滤电子邮件的方法,但是在运行以下代码时,我收到错误“无法解析条件。错误在”09“。接收日期是8/24/2008 9:下午55:30

ReceivedDate = Me.cballocation.Column(1)
Sender = Me.cballocation.Column(2)
Subject = Me.cballocation.Column(0)

sFilter = "[subject] = '" & Subject & "' and DateValue[ReceivedTime]=" & Format$(ReceivedDate, "ddddd h:nn AMPM") & " and " & "[Sender]= '" & Sender & "'"
Set Ns = ol.GetNamespace("MAPI")
Set ml = Ns.Folders("MIMUMBAI").Folders("Inbox").Folders("Completed")
Set ml = ml.Items.Restrict(sFilter)

3 个答案:

答案 0 :(得分:1)

DateValue [ReceivedTime]不是有效条件。您必须使用范围

([ReceivedTime] > Date1) AND ([ReceivedTime] < Date2)

答案 1 :(得分:0)

过滤字符串确实存在错误。您使用的地方:

sFilter = "[subject] = '" & Subject & "' and DateValue[ReceivedTime]=" & Format$(ReceivedDate, "ddddd h:nn AMPM") & " and " & "[Sender]= '" & Sender & "'"

您应该使用:

sFilter = "[subject] = '" & Subject & "' and DateValue[ReceivedTime]='" & Format$(ReceivedDate, "ddddd h:nn AMPM") & "' and " & "[Sender]= '" & Sender & "'"

日期和时间的过滤条件必须作为字符串传递 - 而您的错过了单引号。

答案 2 :(得分:0)

首先,您需要格式化日期和时间对象,以便Outlook可以理解它与实际值进行比较。例如,您可以使用ToSting结构的DateTime方法:

DateTime dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                           DateTime.Now.Day, 23, 59, 00, 00);
string dateTimeEnd = dt.ToString("MM/dd/yyyy hh:mm tt");
string searchCriteria = "[Start]<=\"" + dateTimeEnd + "\"" + " AND [End]>=\""+ dateTimeStart +"\"";

您可能会发现以下文章包含VB.NET中的示例代码有用:

如果是VBA宏,您可以使用Format功能。这是MSDN所说的:

  

日期和时间通常以Date格式存储,Find和Restrict方法要求将日期和时间转换为字符串表示形式。若要确保将日期格式设置为Microsoft Outlook所需的格式,请使用“格式”功能。以下示例创建一个过滤器,以查找1999年1月15日下午3:30后修改的所有联系人。

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