Excel VBA Course
Excel VBA Course - From Beginner to Expert

200+ Video Lessons
50+ Hours of Video
200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Excel VBA Outlook Body

0

Hi, was wondering how do I copy a range of cells and paste them into the outllook email as a body using exel VBA? I have had a look around, but there seems to be alot of code from something simple?

My current code is:

Sub Email()
On Error GoTo ErrHandler

    ' SET Outlook APPLICATION OBJECT.
    Dim objOutlook As Object
    Dim r As Variant
    Dim P As Range
    Dim q As Range
        Set objOutlook = CreateObject("Outlook.Application")
    r = Application.WorksheetFunction.VLookup(Range("A1"), Sheet1.Range("C:D"), 2, 0)
   
   
    ' CREATE EMAIL OBJECT.
    Dim objEmail As Object
    Set objEmail = objOutlook.CreateItem(olMailItem)

    With objEmail
        .to = r
        .Subject = "This is a test message from Arun Banik"
        .Body = "please see your report below" & ActiveSheet.Range("A1:B5")
        .Display        ' DISPLAY MESSAGE.
    End With
   
    ' CLEAR.
    Set objEmail = Nothing:    Set objOutlook = Nothing

ErrHandler:
    '

End Sub

Answer
Discuss

Answers

0
Selected Answer

DarkBlade

I think your code fails when you try to make the email body include a range of cells.

This can be solved with a solution from Ron de Bruin (as @Variatus says, the guru!). That is to take the cells (and your introductory text) and call Ron's function which converts a range of cells to HTML...

Please make cell F1 (or change the code below to the cell of your choice) to be Please see your report below: (and autofit the column width) then make the changes in bold below to your code and add the Function from Ron (with only name in bold)  - or you can just copy the lot and drop it onto VB Editor since I've changed the email sub name to suit:

Sub EmailAsHTML()
On Error GoTo ErrHandler

    ' SET Outlook APPLICATION OBJECT.
    Dim objOutlook As Object
    Dim r As Variant
    Dim P As Range
    Dim q As Range
    Dim Rng As Range

    Set objOutlook = CreateObject("Outlook.Application")
    Set Rng = ActiveSheet.Range("A1:B5")

    r = Application.WorksheetFunction.VLookup(Range("A1"), Sheet1.Range("C:D"), 2, 0)
   
   
    ' CREATE EMAIL OBJECT.
    Dim objEmail As Object
    Set objEmail = objOutlook.CreateItem(olMailItem)

    With objEmail
        .to = r
        .Subject = "This is a test message from Arun Banik"
        '.Body = "please see your report below" & ActiveSheet.Range("A1:B5")
         .HTMLBody = RangetoHTML(ActiveSheet.Range("F1")) & RangetoHTML(Rng)
        .Display        ' DISPLAY MESSAGE.
    End With
   
    ' CLEAR.
    Set objEmail = Nothing:    Set objOutlook = Nothing

ErrHandler:
    '

End Sub

Function RangetoHTML(Rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2016
    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

It seems like a lot of code but it should do the job!

Hope this helps (if so please mark this Answer as Selected)

Discuss

Discussion

Hey there, thanks for your reply.
Wow that is alot of code. I understand it won't be as simple however, I have another code which is used when sending out reports, and this allows me to view the pivot tabel / range of cells as image pasted into the email. This one works great, but having difficutly to merge this with a vba for a  Pivot Table Looping through the Filters (the top left pivot table options box?) as well as  using a Vlookup in the VBA to get the email address as per the filters and email them out. I hope this makes some sense?

Sub First_Attempts()

 'DSP
 ActiveSheet.Range("D1:H500").Select
  
   ' Show the envelope on the ActiveWorkbook.
   ActiveWorkbook.EnvelopeVisible = True
  
   ' Set the optional introduction field thats adds
   ' some header text to the email body. It also sets
   ' the To and Subject lines. Finally the message
   ' is sent.
   With ActiveSheet.MailEnvelope
      .Introduction = "Please see your Attempts breakdown below returning to Debrief. Please start looking into re-attempts."
      .Item.To = "xxx@xxx.com"
      .Item.Subject = "1st Attempts"
      .Item.Display

End With

End Sub
darkblade80 (rep: 2) Dec 8, '20 at 11:18 am
Darkblade

Thanks for selecting my Answer, glad it helps you.

Your follow-on question is somewhat separate from the original so (under the rules of the forum) needs to be posted as a new Question (please).

When you do that, please add a file if possible (to show the pivot table filters) and clarify whether you need help on one or both of the bold items below:
With ActiveSheet.MailEnvelope
   ...
   .Item.To = "<<address from pivot table>>"

   .Item.Attachments.Add ("<<file path or HTML conversion as above")
John_Ru (rep: 6142) Dec 8, '20 at 2:48 pm
Add to Discussion
0

The undisputed authority on this subject ist Ron de Bruin who has published extensive code about many variations of your problem on his website.

The reason why the process does indeed require a lot of code is because it isn't that simple. There is a bridge to create between two applications, Outlook and Excel, and between two methods of storing data, Office (where Outlook actually uses Word) and HTML. But since you can copy and paste the code, why care about a few lines more of it or less?

Does the code you have give you any trouble? If so, what is it?

Discuss

Discussion

Hi thanks for your reply. The code works fine except from having cells in pasted as an image in the email body. I have another code from another file used which is as follows:

Sub First_Attempts()

 'DSP
 ActiveSheet.Range("D1:H500").Select
  
   ' Show the envelope on the ActiveWorkbook.
   ActiveWorkbook.EnvelopeVisible = True
  
   ' Set the optional introduction field thats adds
   ' some header text to the email body. It also sets
   ' the To and Subject lines. Finally the message
   ' is sent.
   With ActiveSheet.MailEnvelope
      .Introduction = "Please see your Attempts breakdown below returning to Debrief. Please start looking into re-attempts."
      .Item.To = "xxx@xxx.com"
      .Item.Subject = "1st Attempts"
      .Item.Display

End With

End Sub


This allows me to send an email with a range of cells in the body as an image
darkblade80 (rep: 2) Dec 8, '20 at 11:11 am
Add to Discussion


Answer the Question

You must create an account to use the forum. Create an Account or Login