VBA Code to break list into separate emails worked on Friday - Broken today???


Board Regular
Aug 11, 2011
Office Version
  1. 365
  1. MacOS
Backi n March I started a thread asking for VBA help that would take a list ofrepairs, break them apart based on a change in store number and paste therepairs into an Outlook email. Next, based on the store number it would look ona second tab and pull the corresponding email addresses and put them in the “To”field of the email. I made a couple of modifications, but it has workedperfectly, including when we updated to Office 365 a few weeks ago.

Today,a coworker came to me and said the macro wasn’t working. She said it’s includedall repairs in the email rather than just the repairs for that particularstore. I figured she had accidentally changed something. I tested her file andshe was correct, the system was not breaking apart the repairs by store number.Then I came to my computer to test it using the backup file I had saved. Iencountered the exact same issues. The weird part is – nothing changed in myfile over the weekend. Any ideas on why it’s not working now? Suggestions on how to fix it?

Link to prior post: https://www.mrexcel.com/forum/excel-questions/1049522-break-data-into-files-when-store-changes-prepare-email.html

Description of the file I’m using:

2 tabs in data file:

  1. Tab Name: Store_Repairs
    1. Columns

Repair Ticket #

Customer Last Name


Repair Type

Repair Status

Est Comp Date

Ship Date

Tracking Number



  1. Tab Name: Store_info
    1. Columns

    2. StoreID




Sub SendEmails2Mgrs()
Dim shtSrc As Worksheet, shtTarg As Worksheet
Dim vEmail, vStoreID
Dim r As Long
Dim colMgrs As New Collection
Dim vTo, vSubj, vBody
Dim oMail As Outlook.MailItem
On Error Resume Next

'Set shtSrc = ActiveSheet

   'get uniq list of manager names
While ActiveCell.Value <> ""
   vStoreID = ActiveCell.Value
   colMgrs.Add vStoreID, vStoreID     'add store  to list

   'now scan data pulling only recs for 1 mgr, then email it.
r = ActiveSheet.UsedRange.Rows.Count

For Each vStoreID In colMgrs
    Selection.AutoFilter   'on
    ActiveSheet.Range("$A$1:$I$" & r).AutoFilter Field:=3, Criteria1:=vStoreID
    Range("A1:I" & r).Select
        'paste to email
    vEmail = Application.WorksheetFunction.VLookup(vStoreID, Sheets("store_info").Range("A1:C1500"), 3)
    vTo = vEmail
    vSubj = "Store " & vStoreID & " - Daily Repair Status Update - " & Format(Now, "m-d-yy")
    vBody = "Email message goes here  " & RangetoHTML()
  Set olAcct = OL.Session.Accounts("My Account Name")
    Call Email1(vTo, vSubj, vBody)

    Selection.AutoFilter   'off

Application.DisplayAlerts = True
Set colMgrs = Nothing
Exit Sub

End Sub

Private Sub NextRow()
ActiveCell.Offset(1, 0).Select   'next row
End Sub

'must have reference to “Microsoft Forms 2.0 Object Library.”
'VBE (alt-F11) menu: tools, references,
Function GetClipboard()
    Dim cb As New MSForms.DataObject
    GetClipboard = cb.GetText
End Function

'NOTE : YOU MUST HAVE THE OUTLOOK REFERENCE CHECKED IN VBE,(ALT-F11): menu,tools, references, Microsoft Outlook XX Object library
Public Function Email1(ByVal pvTo, ByVal pvSubj, ByVal pvBody, Optional ByVal pvFile) As Boolean
Dim oApp As Outlook.Application
Dim oMail As Outlook.MailItem
Const olMailItem = 0

On Error GoTo ErrMail

Set oApp = CreateObject("Outlook.Application")
Set oMail = oApp.CreateItem(olMailItem)

With oMail
    .To = pvTo
    .Subject = pvSubj
    .HTMLBody = pvBody
''    .SentOnBehalfOfName = [EMAIL="me@me.com"]me@me.com[/EMAIL]
    If Not IsMissing(pvFile) Then .Attachments.Add pvFile, olByValue, 1
    .Display False
    .Save    'draft, we are NOT sending...we save as draft
End With

Email1 = True
Set oMail = Nothing
Set oApp = Nothing
Exit Function

MsgBox Err.Description, vbCritical, Err
Resume endit
End Function

Function RangetoHTML() 'prng 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
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues
        .Cells(1).PasteSpecial xlPasteFormats
        Application.CutCopyMode = False
        On Error Resume Next
        '.DrawingObjects.Visible = True
        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
    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

Excel Facts

Workdays for a market open Mon, Wed, Friday?
Yes! Use "0101011" for the weekend argument in NETWORKDAYS.INTL or WORKDAY.INTL. The 7 digits start on Monday. 1 means it is a weekend.

Forum statistics

Latest member

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back