とにかく、outlookfield.contains(mystring)のようなものでFindまたはRestrictを使用できますか?
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' And [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と完全に一致している限り機能しますが、これは十分ではありません。文字列が件名のどこかに含まれているかどうかをカウントする必要がありました。
ワイルドカードとして*記号を追加するというAxelKemperの回答を試しましたが、うまくいきませんでした。
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通のメールに「このような文字列」が含まれています