2017-06-07 111 views
2

爲什麼我面臨以下問題?發送後打開電子郵件

我寫了一個代碼,用於在發送電子郵件後打開發送的電子郵件。 VBA代碼不會打開最近發送的電子郵件,而是前一個。

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean) 
    Dim myItem As MailItem 
    Dim myNamespace As NameSpace 
    Dim myFolder As Folder 

    Set myNamespace = Application.GetNamespace("MAPI") 
    Set myFolder = myNamespace.GetDefaultFolder(olFolderSentMail) 
    Set myItem = myFolder.Items(myFolder.Items.Count) 

    myItem.Display 
End Sub 
+2

歡迎來到Stack Overflow,請閱讀[問]。將代碼添加爲鏈接屏幕截圖並不是一個好的做法,並且很難調試並最終提供幫助。 – Picard

+0

這裏的'Item'參數是對發送的電子郵件的引用 - 你可能只是顯示那個 –

+0

@TimWilliams不,你不能,看到我的答案(註釋)。該電子郵件不會在'Application_ItemSend'事件之前發送,而是之後發送。 –

回答

0

這就是答案爲什麼這不會與Application_ItemSend事件工作:

Application_ItemSend被稱爲之前發送的電子郵件。你可以看到,因爲它有一個Cancel參數。這意味着只有Cancel = False其他電子郵件被丟棄才發送電子郵件。

因此,您無法顯示電子郵件,因爲它目前不在Application_ItemSend事件中發送。它在Application_ItemSend完成後發送。

注意:如果您在Application_ItemSend範圍內設置了一個斷點,您將看到「新電子郵件」窗口在ItemSend事件完成前保持打開/可見狀態。因此,您無法在該事件中打開該電子郵件。


解決方法
你可以嘗試下面的代碼。這將爲項目添加到此文件夾時調用的已發送項目的默認文件夾創建一個事件。

添加代碼(或至少運行Application_Startup過程一次)後可能需​​要重新啓動Outlook。

Option Explicit 

Public WithEvents myOlItems As Outlook.Items 

Private Sub Application_Startup() 
    Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderSentMail).Items 
End Sub 

Private Sub myOlItems_ItemAdd(ByVal Item As Object) 
    Item.Display 
End Sub 

如果在您發送的郵件被移動到文件夾不是默認的Outlook發送的郵件文件夾中,那麼你需要找到合適的文件夾進行設置在Application_Startup

+0

我明白了你的觀點。請告訴我如何在沒有itemsend事件的情況下實現此目標... – Ganesh

+0

@Ganesh由於在發送電子郵件後**沒有任何事件,所以沒有內置方式,但您可以嘗試我添加的解決方法。 –