无论如何我可以将 Find 或 Restrict 与outlookfield.contains(mystring) 之类的东西一起使用吗?
2 回答
您可以在方括号中指定字段,如以下代码段所示:
Set contact = objContacts.Items.Find("[Email1Address]=" & Chr(34) & .SenderEmailAddress & Chr(34))
Set contact = objContacts.Items.Find("[FileAs] = ""Smith, Jeff"" and [FirstName] = ""Jeff""")
字段名称在MSDN 文档中进行了描述,或者可以使用 VBA 对象目录查看器进行检查。
要实现Contains
,您可以*
在要查找的字符串之前和之后使用通配符(例如“*myString*”)。要在字段中搜索文字*
,您必须使用~*
.
根据您链接到的文档,没有办法做到这一点。
补充说明
如果您尝试对用户定义的字段使用 Find 或 Restrict 方法,则必须在文件夹中定义字段,否则会出现错误。没有办法执行“包含”操作。例如,您不能使用“查找”或“限制”来搜索主题字段中包含特定单词的项目。相反,您可以使用 AdvancedSearch 方法,或者您可以遍历文件夹中的所有项目并使用 InStr 函数在字段中执行搜索。您可以使用 Restrict 方法搜索以特定字符范围开头的项目。例如,要搜索姓氏以字母 M 开头的所有联系人,请使用以下过滤器:
sFilter = "[LastName] > 'LZZZ' 和 [LastName] < 'N'"
从您的问题中不清楚您到底想做什么以提供更多上下文我正在尝试计算所有主题包含某个字符串的电子邮件(我将其称为 mystring 以匹配您的示例)。
这是我开始的代码:
string mystring = "Such String";
int count = inboxFolder.Items.Restrict("[Subject] = " + mystring).Count;
Debug.WriteLine("{0} email(s) contain '{1}'", count, mystring);
只要电子邮件的主题与 mystring完全匹配,这还不够好,我需要它来计算字符串是否包含在主题中的任何位置。
我尝试了Axel Kemper 的添加 * 符号作为通配符的答案,但它对我不起作用。
我没有使用 AdvancedSeach 方法(这里的文档相当神秘),而是选择对每个项目执行循环并手动检查它是否包含感兴趣的字符串:
string mystring = "Such String";
int count = 0;
foreach (var item in inboxFolder.Items)
{
if (item is Outlook.MailItem)
{
Outlook.MailItem mailItem = item as Outlook.MailItem;
if (mailItem.Subject != null && mailItem.Subject.Contains(mystring))
{
count++;
}
}
}
Debug.WriteLine("{0} email(s) contain '{1}'", count, mystring);
为了便于阅读和理解,我保留了未重构的代码,但这也可以做成一个单行 LINQ 表达式:
string mystring = "Such String";
int count = inboxFolder.Items.OfType<Outlook.MailItem>().Count(mailItem => mailItem.Subject != null && mailItem.Subject.Contains(mystring));
Debug.WriteLine("{0} email(s) contain '{1}'", count, mystring);
两者的输出:
42 封电子邮件包含“此类字符串”