2014-01-07 86 views
4

我有initially answered問題How to only paste visible cells in an email bodyExcel的VBA:發送Outlook電子郵件不包括粘貼區域

我測試併發布(見下文),不包括髮送電子郵件的代碼。在OP向他的問題添加之後,我添加了.Send部分,但是我獲得的行爲非常奇怪。 如果我在發送之前放置一個斷點,並執行Sub,則會使用正確的信息(包括粘貼的Excel Range)創建一封電子郵件。然後我繼續執行,並正確發送電子郵件。但是,如果我一次運行整個Sub,並且沒有斷點,則電子郵件在發送時不會粘貼Excel Range

這是什麼原因,以及解決方案是什麼?

我試過評論/取消註釋最後兩行(Set ... = Nothing),但它沒有幫助。


相關問題:

Copy range of cells from Excel to body of email in Outlook

Pasting formatted Excel range into Outlook message


代碼的參考(基於由Ron日布魯因典型的代碼,請參閱thisthis):

Sub SendEmail() 

    Dim OutlookApp As Object 
    'Dim OutlookApp As Outlook.Application 
    Dim MItem As Object 
    'Dim MItem As Outlook.MailItem 

    'Create Outlook object 
    Set OutlookApp = CreateObject("Outlook.Application") 
    'Set OutlookApp = New Outlook.Application 

    Dim Sendrng As Range 
    Set Sendrng = Worksheets("Test").Range("A1").SpecialCells(xlCellTypeVisible) 
    Sendrng.Copy 

    'Create Mail Item 
    Set MItem = OutlookApp.CreateItem(0) 
    'Set MItem = OutlookApp.CreateItem(olMailItem) 
    With MItem 
     .To = "[email protected]" 
     .To = "[email protected]" 
     .Subject = "Test" 
     .CC = "" 
     .BCC = "" 
     '.Body = "a" 
     .Display 
    End With 
    SendKeys "^({v})", True 
    With MItem 
     .Send 
    End With 

    'Set OutlookApp = Nothing 
    'Set MItem = Nothing 

End Sub 

回答

6

但是,如果我一次運行整個Sub,沒有斷點,電子郵件發送時沒有在主體中粘貼Excel範圍。這是什麼原因,以及解決方案是什麼?

原因很簡單。當你使用斷點時,你給Excel足夠的時間來複制粘貼。 SendKeys因此在使用其他應用程序時非常不可靠。

有很多方法可以解決您的問題。一種是給複製粘貼足夠的時間。您可以使用DoEvents或強制Wait Time來完成此操作。例如

SendKeys "^({v})", True 
DoEvents 

或者

SendKeys "^({v})", True 
Wait 2 '<~~ Wait for 2 seconds 

,並在你的代碼

Private Sub Wait(ByVal nSec As Long) 
    nSec = nSec + Timer 
    While nSec > Timer 
     DoEvents 
    Wend 
End Sub 

BTW使用此子,而不是使用SendKeys您可以通過羅恩·德布魯因使用RangetoHTML函數,如HERE

編輯

如果以上不工作,那麼這意味着SendKeys在這種情況下,獲取執行太快了,用DoEvents/Wait.Display之後也是如此。

.Display 
DoEvents 

或者

.Display 
Wait 2 
+0

+1:我第二個使用完全相同的代碼粘貼你想進入人體'Range'。這也是我使用的。唯一的缺點是'Body'被轉換爲'HTMLBody',這限制了你想要做的一些事情(並且爲我默認的郵件字體改爲Times New Roman,icky但很容易解決)。 – Manhattan

+1

@ BK201:真:)人們總是可以使用'SendMessage' API;) –

+1

每天都有新的東西可以學習。將閱讀這個'SendMessage' API。看起來很有希望,它甚至可以解決我將圖表和圖形發送到郵件正文時遇到的問題。 ;) – Manhattan

相關問題