我有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的典型代码,见this和this):
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
答案 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