使用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