【问题标题】:Excel VBA: Sent Outlook email does not include pasted RangeExcel VBA:发送的 Outlook 电子邮件不包括粘贴的范围
【发布时间】:2014-01-24 15:04:31
【问题描述】:

我有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

【问题讨论】:

    标签: vba email excel outlook


    【解决方案1】:

    但是,如果我一次运行整个 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
    

    顺便说一句,您可以使用 Ron de Bruin 的 RangetoHTML 函数,而不是使用 SendKeys,如图所示 HERE

    编辑

    如果上述方法不起作用,则表示SendKeys 在这种情况下执行速度过快,请在.Display 之后使用DoEvents/Wait

    .Display
    DoEvents
    

    或者

    .Display
    Wait 2
    

    【讨论】:

    • +1:我第二次使用确切的代码将您想要的 Range 粘贴到正文中。这也是我使用的。它唯一的大缺点是Body 被转换为HTMLBody,这限制了你想做的一些事情(对我来说,将默认邮件字体更改为 Times New Roman,有点恶心但很容易解决)。跨度>
    • @BK201: True :) 总是可以使用SendMessage API ;)
    • 每天都要学习一些新东西。将阅读此SendMessage API。看起来很有希望,它甚至可以解决我在将图表和图形发送到邮件正文时遇到的问题。 ;)
    • 我确认只在SendKeys 之后添加DoEvents 就足够了。我怀疑这与电子邮件的某些(不需要的)快速处理有关,但我不知道DoEvents(请参阅documentation)。太棒了。
    • + 1 我只能到处看到你的答案:)
    猜你喜欢
    • 2021-09-27
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多