Search code examples
exceloutlookrangemailingvba

Mail range with formatting through vba in excel


there are lot`s of articles in the web, how to pass excel range in the outlook mail. So i am using the following code:

Set OutApp = GetObject(, "Outlook.Application")
If OutApp Is Nothing Then Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
Set rng = Sheets("Report").Range("A3:F" & ThisWorkbook.Worksheets("Report").UsedRange.Rows.Count)

With OutMail
    .HTMLBody = RangetoHTML(rng)   
    .Display
End With

In my range i have table of hyperlinks. And i want them to be clickable in the email body. But they are not. I understand this, because the BodyFormat propherty is olFormatHTML. And if i change the BodyFormat to Plain or RichText, hyperlinks become clickable but all the formatting crashes. How can i save all the formatting and make hyperlinks clickable in the same time?

Thanks for your help!


Solution

  • I believe you are using Ron's RangetoHTML

    If yes then you have to add some extra code to it so that it retains the hyperlinks.

    I have added the code and you can see the same between

    '~~~~~~~~~~~~~~~~~~~~  ADDED THIS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    

    Here is the amended Code.

    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
    
        '~~~~~~~~~~~~~~~~~~~~  ADDED THIS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        Dim HyperL As Hyperlink
        For Each HyperL In rng.Hyperlinks
            TempWB.Sheets(1).Hyperlinks.Add _
            Anchor:=TempWB.Sheets(1).Range(HyperL.Range.Address), _
            Address:=HyperL.Address, _
            TextToDisplay:=HyperL.TextToDisplay
        Next HyperL
        '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
        '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
    

    FOLLOWUP

    SNAPSHOT

    enter image description here