Excel VBA:已发送的Outlook电子邮件不包含粘贴的范围

时间:2014-01-07 02:42:02

标签: excel vba email excel-vba outlook

我有initially answered个问题How to only paste visible cells in an email body

我测试和发布的代码(见下文)不包括发送电子邮件。在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 de Bruin的典型代码,见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 = "test@email.com"
        .To = "SSEREBRINSKY@TENARIS.COM"
        .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

1 个答案:

答案 0 :(得分: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,您可以使用Ron de Bruin的SendKeys函数,而不是使用RangetoHTML HERE

修改

如果以上操作不起作用,则表示SendKeys执行速度过快,在DoEvents/Wait之后立即使用.Display

.Display
DoEvents

或者

.Display
Wait 2