使用VBA将范围粘贴到Outlook不会粘贴任何内容
我正在尝试自动生成一个报告,以便它复制一个范围,将其粘贴到电子邮件正文中,然后发送 我使用的是给出的精确代码,只是输入了我自己的范围和一个筛选语句 一切正常,除了当我收到/显示电子邮件时,它对我来说只是一封空白电子邮件。里面没有粘贴的范围。我觉得奇怪的是,在我过滤范围之前,这一切都很正常。当我在它上面使用任何类型的过滤器时,它会破裂,我不知道为什么 以下是我正在使用的代码,仅供参考:`使用VBA将范围粘贴到Outlook不会粘贴任何内容,vba,excel,email,outlook,Vba,Excel,Email,Outlook,我正在尝试自动生成一个报告,以便它复制一个范围,将其粘贴到电子邮件正文中,然后发送 我使用的是给出的精确代码,只是输入了我自己的范围和一个筛选语句 一切正常,除了当我收到/显示电子邮件时,它对我来说只是一封空白电子邮件。里面没有粘贴的范围。我觉得奇怪的是,在我过滤范围之前,这一切都很正常。当我在它上面使用任何类型的过滤器时,它会破裂,我不知道为什么 以下是我正在使用的代码,仅供参考:` Sub Mail_Selection_Range_Outlook_Body() Dim rng As
Sub Mail_Selection_Range_Outlook_Body()
Dim rng As Range
Dim OutApp As Object
Dim OutMail As Object
ActiveSheet.Range("A1").AutoFilter Field:=6, Criteria1:="<>"
ActiveSheet.Range("A1").AutoFilter Field:=1, Criteria1:="Brittany"
Set rng = Nothing
On Error Resume Next
'Only the visible cells in the selection
Set rng = ActiveSheet.Range("A:F").SpecialCells(xlCellTypeVisible)
rng.Copy
ActiveSheet.Range("U1").Paste
On Error GoTo 0
If rng Is Nothing Then
MsgBox "The selection is not a range or the sheet is protected" & _
vbNewLine & "please correct and try again.", vbOKOnly
Exit Sub
End If
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = "email@email.com"
.CC = ""
.BCC = ""
.Subject = "Test for Updates"
.HTMLBody = RangetoHTML(rng)
.Display 'or use .Display
End With
On Error GoTo 0
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
Function RangetoHTML(rng As Range)
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
'Copy the range and create a new workbook to past the data in
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
'Publish the sheet to a htm file
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
'Read all data from the htm file into RangetoHTML
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.readall
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
'Close TempWB
TempWB.Close savechanges:=False
'Delete the htm file we used in this function
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function
Sub-Mail\u Selection\u Range\u Outlook\u Body()
变暗rng As范围
Dim OutApp作为对象
将邮件变暗为对象
ActiveSheet.Range(“A1”)。自动筛选字段:=6,标准1:=“”
ActiveSheet.Range(“A1”)。自动筛选字段:=1,标准1:=“Brittany”
设置rng=无
出错时继续下一步
'仅显示所选内容中的可见单元格
设置rng=ActiveSheet.Range(“A:F”).SpecialCells(xlCellTypeVisible)
收到
ActiveSheet.Range(“U1”).粘贴
错误转到0
如果rng不算什么,那么
MsgBox“所选内容不是范围或工作表受保护”&_
vbNewLine&“请更正并重试。”,vbOKOnly
出口接头
如果结束
应用
.EnableEvents=False
.ScreenUpdate=False
以
Set-OutApp=CreateObject(“Outlook.Application”)
Set-OutMail=OutApp.CreateItem(0)
出错时继续下一步
发邮件
.To=”email@email.com"
.CC=“”
.BCC=“”
.Subject=“测试更新”
.HTMLBody=RangetoHTML(rng)
.Display'或use.Display
以
错误转到0
应用
.EnableEvents=True
.ScreenUpdate=True
以
发送邮件=无
设置应用程序=无
端接头
函数RangetoHTML(rng作为范围)
作为对象的Dim fso
将T作为对象
将文件设置为字符串
将TempWB设置为工作簿
TempFile=Environ$(“temp”)和“\”格式(现在是“dd-mm-yy h-mm-ss”)和“.htm”
'复制范围并创建一个新工作簿,以超过中的数据
收到
Set TempWB=工作簿。添加(1)
带临时工作表(1)
.单元格(1).粘贴特殊粘贴:=8
.单元格(1).粘贴特殊值,False,False
.单元格(1).粘贴特殊xlPasteFormats,False,False
.单元格(1)。选择
Application.CutCopyMode=False
出错时继续下一步
.DrawingObjects.Visible=True
.DrawingObjects.Delete
错误转到0
以
'将工作表发布到htm文件
使用TempWB.PublishObjects.Add(_
SourceType:=xlSourceRange_
文件名:=临时文件_
工作表:=临时工作表(1).名称_
来源:=TempWB.Sheets(1).UsedRange.Address_
HtmlType:=xlHtmlStatic)
.发布(真实)
以
'将htm文件中的所有数据读入RangetoHTML
设置fso=CreateObject(“Scripting.FileSystemObject”)
设置ts=fso.GetFile(TempFile).OpenAsTextStream(1,-2)
RangetoHTML=ts.readall
关闭
RangetoHTML=Replace(RangetoHTML,“align=center x:publishsource=”_
“align=left x:publishsource=”)
“关闭TempWB
TempWB.Close savechanges:=False
'删除此函数中使用的htm文件
杀死临时文件
设置ts=无
设置fso=无
设置TempWB=Nothing
端函数
`我不把它用于电子邮件,而是用于创建任务。一、 然而,对它进行了一些修改、测试,即使经过过滤,它也能工作
Dim olApp As Object
Dim olRem As Object
Dim myRange As Range
Dim olInsp As Object
Dim wdDoc As Object
Dim oRng As Object
Set olApp = CreateObject("Outlook.Application")
Set olRem = olApp.CreateItem(0)
Set myRange = Selection
myRange.Copy
Set olInsp = olRem.GetInspector
Set wdDoc = olInsp.WordEditor
Set oRng = wdDoc.Range
With olRem
.Subject = "Call " & contact & " - " & company & " - " & city & ", " & state
oRng.InsertAfter (oRng.PasteAndFormat(wdFormatOriginalFormatting))
oRng.Collapse wdCollapseEnd
oRng.InsertBreak (wdLineBreak)
oRng.InsertAfter (Comment)
oRng.Collapse wdCollapseEnd
oRng.InsertBreak (wdLineBreak)
oRng.InsertAfter (oRng.PasteAndFormat(wdFormatOriginalFormatting))
.display
End With
Set olApp = Nothing
Set olRem = Nothing
Set olInsp = Nothing
Set wdDoc = Nothing
Set oRng = Nothing
Set myRange = Nothing
我不把它用于电子邮件,而是用于创建任务。一、 然而,对它进行了一些修改、测试,即使经过过滤,它也能工作
Dim olApp As Object
Dim olRem As Object
Dim myRange As Range
Dim olInsp As Object
Dim wdDoc As Object
Dim oRng As Object
Set olApp = CreateObject("Outlook.Application")
Set olRem = olApp.CreateItem(0)
Set myRange = Selection
myRange.Copy
Set olInsp = olRem.GetInspector
Set wdDoc = olInsp.WordEditor
Set oRng = wdDoc.Range
With olRem
.Subject = "Call " & contact & " - " & company & " - " & city & ", " & state
oRng.InsertAfter (oRng.PasteAndFormat(wdFormatOriginalFormatting))
oRng.Collapse wdCollapseEnd
oRng.InsertBreak (wdLineBreak)
oRng.InsertAfter (Comment)
oRng.Collapse wdCollapseEnd
oRng.InsertBreak (wdLineBreak)
oRng.InsertAfter (oRng.PasteAndFormat(wdFormatOriginalFormatting))
.display
End With
Set olApp = Nothing
Set olRem = Nothing
Set olInsp = Nothing
Set wdDoc = Nothing
Set oRng = Nothing
Set myRange = Nothing
这将粘贴您设置的A列到F列的范围,或者您可以稍微修改以粘贴选定的范围,但我不明白过滤器是如何工作的,因此我将其注释掉。我看到过滤器添加到工作表中的列标题中,但整个范围仍被粘贴 代码:
Sub pasteRangeBody()
Dim IsCreated As Boolean
Dim OutlApp As Object
Dim RngCopied As Range
' ActiveSheet.AutoFilterMode = False
' ActiveSheet.Range("A1").AutoFilter Field:=2, Criteria1:="<>"
' ActiveSheet.Range("A1").AutoFilter Field:=1, Criteria1:="Brittany"
With ActiveSheet
' Set RngCopied = Selection
Set RngCopied = ActiveSheet.Range("A:F").SpecialCells(xlCellTypeVisible)
End With
On Error Resume Next
Set OutlApp = GetObject(, "Outlook.Application")
If Err Then
Set OutlApp = CreateObject("Outlook.Application")
IsCreated = True
End If
On Error GoTo 0
With OutlApp.CreateItem(0)
.Display ' Display email first for signature to be added
.Subject = ""
.To = ""
.CC = ""
.HTMLbody = RangetoHTML(RngCopied) & _
"Thank you," & _
.HTMLbody ' Add default signature
On Error Resume Next
Application.Visible = True
If Err Then
MsgBox "Unsuccessful", vbExclamation
Else
End If
On Error GoTo 0
End With
If IsCreated Then OutlApp.Quit
Set OutlApp = Nothing
End Sub
Function RangetoHTML(rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2010
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
'Copy the range and create a new workbook to past the data in
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
'Publish the sheet to a htm file
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
'Read all data from the htm file into RangetoHTML
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.ReadAll
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
'Close TempWB
TempWB.Close savechanges:=False
'Delete the htm file we used in this function
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function
Sub-pasteRangeBody()
Dim被创建为布尔值
作为对象的对象
变暗RngCopied As范围
'ActiveSheet.AutoFilterMode=False
'ActiveSheet.Range(“A1”)。自动筛选字段:=2,标准1:=
'ActiveSheet.Range(“A1”)。自动筛选字段:=1,标准1:=“Brittany”
使用ActiveSheet
'设置RngCopied=选择
设置RngCopied=ActiveSheet.Range(“A:F”).SpecialCells(xlCellTypeVisible)
以
出错时继续下一步
Set extlapp=GetObject(,“Outlook.Application”)
如果有错误,那么
设置extlapp=CreateObject(“Outlook.Application”)
IsCreated=True
如果结束
错误转到0
使用extlapp.CreateItem(0)
.Display“首先显示电子邮件以添加签名
.Subject=“”
.To=“”
.CC=“”
.HTMLbody=RangetoHTML(RngCopied)和_
“谢谢你,”_
.HTMLbody'添加默认签名
出错时继续下一步
Application.Visible=True
如果有错误,那么
MsgBox“未成功”,请使用感叹号
其他的
如果结束
错误转到0
以
如果已创建,则取缔。退出
设置为“无”
端接头
函数RangetoHTML(rng作为范围)
“由Ron de Bruin于2006年10月28日更改
“2000-2010年在办公室工作
作为对象的Dim fso
将T作为对象
将文件设置为字符串
将TempWB设置为工作簿
TempFile=Environ$(“temp”)&“/”和格式(现在是“dd-mm-yy h-mm-ss”)&.htm”
'复制范围并创建一个新工作簿,以超过中的数据
收到
Set TempWB=工作簿。添加(1)
带临时工作表(1)
.单元格(1).粘贴特殊粘贴:=8
.单元格(1).粘贴特殊值,False,False
.单元格(1).粘贴特殊xlPasteFormats,False,False
.单元格(1)。选择
Application.CutCopyMode=False
出错时继续下一步
.DrawingObjects.Visible=True
.DrawingObjects.Delete
错误转到0
以
'将工作表发布到htm文件
用TempWB