2017-06-21 55 views
1

有人可以指出我在這裏失蹤了什麼。每次我運行它時都會說需要一個對象。展望計數電子郵件標記爲重要

我很抱歉我覺得這是一個很簡單的解決方法,但我一直在破壞我的大腦。

基本上我試圖完成的是統計有多少電子郵件被標記爲高度重要。

再次,我覺得這是一個這麼簡單的錯誤,但我仍然在學習這一點。

Sub CheckForImportance() 

Dim myNs As Outlook.NameSpace 
Dim infldr As Outlook.Folder 
Dim impMail As Outlook.MailItem 
Dim ttlcount As Integer 

Set myNs = Application.GetNamespace("MAPI") 
Set infldr = myNs.GetDefaultFolder(olFolderInbox) 
Set impMail = infldr.Items 
Set ttlcount = 0 

If impMail.Importance = olImportanceHigh Then ttlImp = ttlImp + 1 

MsgBox ("count:" & ttlImp) 

End Sub 
+0

你不說的語句給出了錯誤,所以我會限制自己提了明顯的問題。 (1)默認收件箱不太可能是您想要的收件箱。您可能必須明確。 (2)'infldr.Items'是MailItem的集合而不是MailItem。你需要像'For Each impMail In infldr.Items'' Test for important mail item'' Next'。 –

+0

你也混淆了你的'ttlcount'和'ttlImp'變量。但最大的問題是缺少一個For循環 – finjo

+0

對不起,我對這個和學習還是比較陌生的。這是我整天嘗試後想到的。至於for循環不會有限制或過濾器工作更好?我不完全知道如何環路設置了.. '爲每個項目在folder.item' '如果項目=重要性(olimportanthigh),那麼'' = ttlcount +1 ttlcount'' next' 對不起,這是我認爲它看起來像一個非常粗略的草案。 – Jonboy89

回答

0

Outlook中存儲的郵件項目,日曆項目,任務等文件中調用存儲。有時候人們說郵件等等都存儲在PST文件中,這通常是正確的。但是,所有PST文件都是商店,但並非所有商店都是PST文件。

我記得默認情況下,發送到您的任何電子郵件地址的郵件將被加載到同一商店。在這種情況下,Set infldr = myNs.GetDefaultFolder(olFolderInbox)很有用,因爲默認收件箱位於該商店中。

在Outlook 2016中,也許還有其他一些最新版本,默認情況下每個電子郵件地址都有一個單獨的商店。每個商店均以電子郵件地址命名,例如:「[email protected]」或「[email protected]」。

複製此宏到Outlook組件,然後運行它:

Sub DsplUsernameOfDefaultStore() 

    Dim NS As Outlook.NameSpace 
    Dim DefaultInboxFldr As MAPIFolder 

    Set NS = CreateObject("Outlook.Application").GetNamespace("MAPI") 
    Set DefaultInboxFldr = NS.GetDefaultFolder(olFolderInbox) 

    Debug.Print DefaultInboxFldr.Parent.Name 

End Sub 

在我的系統,這個宏輸出「Outlook數據文件」。這是Outlook附帶的默認商店,但我的電子郵件都沒有加載到它。

你會需要這樣的東西:

Set infldr = Session.Folders("Xxxx").Folders("Inbox") 

其中xxxx是包含您要查詢的收件箱中存儲的名稱。

下面我有三個可供選擇的宏來計算收件箱中高重要性郵件的數量。要點特別注意:

  • 版本1使用For Each循環,正如我在我的評論中所建議的。版本2使用For IndexVariable循環。據我所知,這兩種For都沒有優勢。我使用哪個更便捷的手頭任務。版本3使用過濾器。我還沒有發現Outlook過濾器的使用經常足以成爲它的使用專家,所以我通常使用For循環。 olImportanceHigh是一個值爲2的常量。看起來你不能在Restrict字符串內使用常量,這就是爲什麼它說[Importance] = 2
  • 我發現Debug.Print在開發過程中比MsgBox方便得多。

如有必要,請回復關於我的代碼的問題。

Option Explicit 
Sub CountHighImportanceEmails1() 

    Dim FldrInbox As Folder 
    Dim MailItemCrnt As MailItem 
    Dim NumEmailsHighImport As Long 

    Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox") 

    NumEmailsHighImport = 0 
    For Each MailItemCrnt In FldrInbox.Items 
    If MailItemCrnt.Importance = olImportanceHigh Then 
     NumEmailsHighImport = NumEmailsHighImport + 1 
    End If 
    Next 

    Debug.Print "Number of high importance emails=" & NumEmailsHighImport 

End Sub 
Sub CountHighImportanceEmails2() 

    Dim FldrInbox As Folder 
    Dim InxMi As Long 
    Dim NumEmailsHighImport As Long 

    Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox") 

    NumEmailsHighImport = 0 
    With FldrInbox 
    For InxMi = 1 To .Items.Count 
     If .Items(InxMi).Importance = olImportanceHigh Then 
     NumEmailsHighImport = NumEmailsHighImport + 1 
     End If 
    Next 
    End With 

    Debug.Print "Number of high importance emails=" & NumEmailsHighImport 

End Sub 
Sub CountHighImportanceEmails3() 

    Dim FldrInbox As Folder 
    Dim MailItemsHighImport As Items 

    Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox") 

    Set MailItemsHighImport = FldrInbox.Items.Restrict("[Importance] = 2") 

    Debug.Print "Number of high importance emails=" & MailItemsHighImport.Count 

End Sub 
+0

感謝您使用類似於選項1的不同方法來執行此操作。 Debug.print是否比MsgBox更快? – Jonboy89

+1

使用'MsgBox'您必須先閱讀並記錄消息,然後按Enter鍵。使用'Debug.Print'將輸出寫入即時窗口。即時窗口將保存大約200行,可以在宏完成後研究,或者在方便時使用斷點。如果200行不足以滿足我需要的所有診斷信息,我會寫入一個文本文件。 –

0

例子是

Option Explicit 
Public Sub Example() 
    Dim Inbox As Outlook.folder 
    Set Inbox = Application.Session.GetDefaultFolder(_ 
            olFolderInbox) 

    Dim Filter As String 
     Filter = "[Importance] = 2" 

    Dim Items As Outlook.Items 
    Set Items = Inbox.Items.Restrict(Filter) 

    Debug.Print Items.Count 
    MsgBox Items.Count & " High importance Items are in " & Inbox.Name 

End Sub