2016-04-26 50 views
1

我剛剛從Outlook 2010升級到2013,並且遇到了問題。我使用下面的代碼進行設置,以便刪除或移動到垃圾箱文件夾中的任何內容都會自動標記爲已讀。Outlook 2013:將項目標記爲刪除/移至垃圾時已讀取

Option Explicit 
Dim WithEvents DeletedItems As Outlook.Items 

Private Sub Application_Startup() 
    Set DeletedItems = Session.GetDefaultFolder(olFolderDeletedItems).Items 
End Sub 

Private Sub DeletedItems_ItemAdd(ByVal Item As Object) 
    If Item.UnRead = True Then 
     Item.UnRead = False 
     Item.Save 
    End If 
End Sub 

它的工作就像一個魅力在2010年,但不會在2013年我沒有多少運氣找到一個直接適用的答案在所有的工作,我太新VBA有一個關於如何應用我遇到的一些答案的好圖片,所以任何幫助,將不勝感激。

乾杯。

編輯:這是我用來檢查Outlook如何看到已刪除電子郵件的已讀/未讀狀態的代碼。我從here中解除了Pause函數。

Private Sub DeletedItems_ItemAdd(ByVal Item As Object) 
    RememberItem Item 'Remember which email this is 
    Debug.Print "At start: " & Item.UnRead 'Should be True 
    If Item.UnRead = True Then 
     Item.UnRead = False 
     Item.Save 
    End If 
    Debug.Print "After mark read: " & Item.UnRead 'Should be False 
    Pause 10 'In separate module. Code from https://stackoverflow.com/a/30196332/2623367 
    Debug.Print "After pause: " & Item.UnRead 'Should be False unless item has become Unread 
End Sub 

Private Function RememberItem(Optional ByVal Item As Object) As Object 
'Allows check-up on the deleted item after event-handler is done with it. 
    Static oDeleted As Object 
    If Not Item Is Nothing Then Set oDeleted = Item 
    Set RememberItem = oDeleted 
End Function 

Private Sub CheckStatus() 
    Dim CheckItem As Object 
    Set CheckItem = RememberItem 
    Debug.Print "Follow-up check: " & CheckItem.UnRead 'Should be False 
End Sub 

我從這個得到的輸出是:
- 啓動時:真(項目未讀的 - 這是正確的)
- 標記閱讀後:假(項目被讀取 - 這可能是也可能不是正確)
- 暫停後:假(項目被讀取 - 這是不正確的)
- 後續檢查:假(項目被讀取 - 這是不正確的)


UPDATE:

如果有人遇到此問題,請稍等。標記爲工作的答案確實解決了我的問題,但我偶爾仍然看到一些奇怪的行爲。再多一點發現,我的問題的根本原因是Outlook和電子郵件服務器之間的同步問題。 Outlook會刪除東西,但同步會變得棘手,而且在將自己的更新發送回去之前,Outlook看起來像從服務器獲取更新。這些差異似乎導致Outlook無法跟蹤應刪除的狀態。

我的工作場所使用Google Apps作爲他們的電子郵件提供商,並且我已經使用正確的IMAP設置在Outlook中設置了所有內容,但Google和展望不會很好。通過使用所選答案和Google的Outlook syncing tool for Google Apps能夠消除所有不可預知的行爲。同時確認我的原始代碼與Google Apps同步工具配合使用時的行爲應該如此。

我應該很早就意識到這個問題可能是谷歌和Outlook在根本上一起出錯,但它甚至沒有出現在我的面前,這就是爲什麼我沒有提到早先的谷歌組件的原因。希望此更新能夠拯救出現問題的其他人!

+0

是否有任何錯誤消息?將項目放入已刪除的項目文件夾時會發生什麼?代碼是否運行? – OpiesDad

+0

我在Outlook 2013中測試了這段代碼,它在爲我工作。 – OpiesDad

+0

您是否記得打開Outlook時打開宏? – OpiesDad

回答

0

我一直沒能找出你有確切的問題,因爲我不能複製,但試試這個:

Option Explicit 

Dim WithEvents MainFolder As Outlook.Folder 

Private Sub Application_Startup() 
    Set MainFolder = Session.GetDefaultFolder(olFolderInbox) 
End Sub 


Private Sub MainFolder_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As MAPIFolder, Cancel As Boolean) 

    If MoveTo.Name = Session.GetDefaultFolder(olFolderDeletedItems).Name And Item.UnRead = True Then 
     Item.UnRead = False 
     Item.Save 
    End If 
End Sub 
+0

這似乎是在做詭計!非常感謝。我非常感謝你花時間和精力來幫助我。 –

0

這對於評論來說太長了,但我對這個問題感到困惑,所以我會用我自己的話來重述它來澄清和顯示這個過程。

  1. 該項目被刪除並可能會或可能不會被讀取。

  2. DeletedItems_ItemAdd程序被自動調用。

    • 看起來好像你有時會遇到這個問題,但這不是你的主要問題。
  3. Item.UnRead被輸出。這似乎工作。

  4. 使用Item.UnRead屬性檢查消息以查看它是否未讀。如果未讀,則返回False;如果未讀取,則返回TrueItem.UnRead然後設置爲False,如果它是True。如果它已經是False,它仍然是False。此時,每條消息的Item.UnRead屬性應等於False,這實際上表示該項目已被讀取。

  5. Item.UnRead被輸出。

    • 我從你的問題解釋是,這總是False,這意味着該項目被讀取。根據第4步,我相信這應該是False
    • 你的記錄表明這個「可能或可能不正確」,但我不明白它何時不正確。
  6. 有一個暫停。

  7. Item.UnRead被輸出。

    • 您的留言建議此值爲False,表示該項目已被閱讀。你相信這是不正確的。我不懂爲什麼。
  8. 在正常程序之外執行後續檢查。我會假設代碼正常工作,並且檢查了正確的消息。再一次,您注意到Item.UnReadFalse,表示該消息已被讀取,然後聲明這是不正確的。再次,我不明白爲什麼這是不正確的。

如果我的分析是錯誤的,請大家指正,這樣我可以協助。事實上,我無法理解這個問題。代碼似乎試圖通過將Item.UnRead屬性設置爲False來設置每條消息。我可以看到的每一張支票都是返回False。預期什麼樣的行爲?

+0

你的分析是正確的;我只是不善於解釋自己,你的耐心和幫助非常感謝。我說退貨的原因是不正確的,因爲在以編程方式檢查Item.UnRead時返回FALSE - 該項目被讀取 - UI顯示爲未讀:在查看垃圾文件夾時添加了粗體,並添加到了未讀項目計數器中導航窗格。如果我打開該項目或突出顯示該項目並手動標記爲已讀,則UI將更改爲將項目顯示爲已讀。 –

+0

我寫「可能或不可能是正確的」的原因是因爲當物品移入垃圾箱時,有十分之幾秒的時間,該文件夾的未讀物品計數器不會增加,但隨後不可避免。我說「可能或不可以」,因爲我不確定這是否意味着它被移動,標記爲已讀,因此它沒有顯示在櫃檯中,然後恢復到未讀狀態,或者如果這種輕微的延遲只是結果在櫃檯更新滯後。 –

相關問題