lburmz
lburmz

Reputation: 1

RangetoHTML subroutine suddenly stopped working

I use the RangetoHTML-Sub from rondebruin.nl to paste the selected range in Outlook. It has been working perfectly for months, but has suddenly stopped. It last worked properly just a few days ago, and I can't figure out what may have happened in the meantime. Could there have been an update to Excel 2010 that would have changed something?

This is the code I have been using:

    Sub SendEmailToStores()


    Dim SendEmail   As Variant

    Dim rng As Range
    Dim OutApp As Object
    Dim OutMail As Object

    Dim strBody As String
    Dim strSignature As String


    Set rng = Nothing
    On Error Resume Next
    'Only the visible cells in the selection

    Worksheets("TEMP").Activate
    last_row = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
    last_col = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column

    Set rng = Sheets("TEMP").Range(Cells(1, 1), Cells(last_row, last_col)).SpecialCells(xlCellTypeVisible)
'    Set rng = Sheets("TEMP").Range("A1:F3").SpecialCells(xlCellTypeVisible)

    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

    strBody = "Please will you order the following for us:" & "

"
    strSignature = "

" & "Thank you"

    SendEmail = MsgBox("Would you like to review the order email to stores before sending it?", vbYesNoCancel, "Review email")
        With OutMail
        .To = {email address}
        .CC = ""
        .BCC = ""
        .Subject = "Canine Genetics Order"
        .HTMLBody = strBody & RangetoHTML(rng) & strSignature
            If SendEmail = vbCancel Then Exit Sub
            If SendEmail = vbYes Then
             'compile but don't send email
                .Display
            End If
            If SendEmail = vbNo Then
             'compile and send email
                .Send   'or use .Display
            End If
        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)
' 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

By stepping over the code line by line I realised that it gets to this specific point in the RangetoHTML function, and then skips the rest of the function entirely, and continues with the SendEmailToStores subroutine. So the ".Publish (True)" line and everything after it (within the function) doesn't happen. I assume that means that something in the "With" line is causing the problem.

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

Upvotes: 0

Views: 570

Answers (1)

user11527494
user11527494

Reputation: 26

There may be other problems but you have a common unqualified range in the following.

Set rng = Sheets("TEMP").Range(Cells(1, 1), Cells(last_row, last_col)).SpecialCells(xlCellTypeVisible)

The above will only work infallibly on the Temp worksheet's private code sheet; not a public module.

The Cells that make up Range need to belong to the same worksheet as the Range.

Set rng = Sheets("TEMP").Range(Sheets("TEMP").Cells(1, 1), Sheets("TEMP").Cells(last_row, last_col)).SpecialCells(xlCellTypeVisible)

'alternate
with Sheets("TEMP")
    Set rng = .Range(.Cells(1, 1), .Cells(last_row, last_col)).SpecialCells(xlCellTypeVisible)
end with

Upvotes: 1

Related Questions