web-dev-qa-db-ja.com

OutlookのVBA検索

このコードを自分のフォルダーで検索します。 「スケッチ」という件名の電子メールがありますが、VBAはそれを見つけていません(ELSE句に移動します)

誰が何が悪いのか教えてもらえますか?

Set olApp = GetObject(, "Outlook.Application")

Set olNs = olApp.GetNamespace("MAPI")
Set olFldr = olNs.GetDefaultFolder(olFolderInbox)
Set olItms = olFldr.Items

Set Mail = olItms.Find("[Subject] = ""*sketch*""") 'Tracking
If Not (Mail Is Nothing) Then
    'use mail item here

Else
    NoResults.Show
End If
9
AndroidDev

あなたの理由.Findが機能しないのは、Items.Findはワイルドカードの使用をサポートしていません。 Items.Findは、部分文字列の検索もサポートしていません。したがって、実際にメールを見つけるには、ワイルドカードを削除して、検索条件に文字列全体を含める必要があります。

だからここにあなたのオプションがあります:

探している完全な件名がわかっている場合は、次のようにコードを変更します。

Set Mail = olItms.Find("[Subject] = ""This Sketch Email""")

件名全体を知らない(または知らない)場合は、受信トレイフォルダをループして、次のように件名の一部を検索できます。

未テスト

Sub Search_Inbox()

Dim myOlApp As New Outlook.Application
Dim myNameSpace As Outlook.NameSpace
Dim myInbox As Outlook.MAPIFolder
Dim myitems As Outlook.Items
Dim myitem As Object
Dim Found As Boolean

Set myNameSpace = myOlApp.GetNamespace("MAPI")
Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
Set myitems = myInbox.Items
Found = False

For Each myitem In myitems
    If myitem.Class = olMail Then
        If InStr(1, myitem.Subject, "sketch") > 0 Then
            Debug.Print "Found"
            Found = True
        End If
    End If
Next myitem

'If the subject isn't found:
If Not Found Then
    NoResults.Show
End If

myOlApp.Quit
Set myOlApp = Nothing

End Sub

お役に立てば幸いです。

13
ARich

アイテム制限を使用して検索する方法は次のとおりです。

これは高速に実行され、検索基準に一致するアイテムを見つけるためにアイテムをループする必要はありません。

Sub Search_Inbox()

Dim myOlApp As New Outlook.Application
Dim objNamespace As Outlook.NameSpace
Dim objFolder As Outlook.MAPIFolder
Dim filteredItems As Outlook.Items
Dim itm As Object
Dim Found As Boolean
Dim strFilter As String


Set objNamespace = myOlApp.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)

strFilter = "@SQL=" & Chr(34) & "urn:schemas:httpmail:subject" & Chr(34) & " like '%sketch%'"

Set filteredItems = objFolder.Items.Restrict(strFilter)

If filteredItems.Count = 0 Then
    Debug.Print "No emails found"
    Found = False
Else
    Found = True
    ' this loop is optional, it displays the list of emails by subject.
    For Each itm In filteredItems
     Debug.Print itm.Subject
    Next
End If


'If the subject isn't found:
If Not Found Then
    'NoResults.Show
Else
   Debug.Print "Found " & filteredItems.Count & " items."

End If

'myOlApp.Quit
Set myOlApp = Nothing

End Sub
18
jeffld