Excel/Outlook vba - macro to attach multiple files to an Outlook email...

EverClear

New Member
Joined
Oct 23, 2012
Messages
32
Hello!!!</SPAN>

(Using Excel 2010 & Outlook 2010)</SPAN>
I am trying to write a macro from </SPAN>Outlook</SPAN> to send an email with multiple Excel files attached to a recipient. What the macro will do is read in a separate Excel file containing a list of the filenames in Column A, the email addresses of the recipients in Column B, and the file pathway in Column C.

The macro sort of works. That is to say, it doesn't crash. The problem is that if there are *multiple* files to attach in the email, the macro will create multiple emails. So if I have 9 files to attach, the macro will create 9 emails to the same recipient.

How can I adjust my code to attach multiple files to *single* email? Here's what I have so far:
Rich (BB code):
Option Explicit
 
Sub ReadExcel()
    Dim ExcelObject             As Object
    Dim OutlookApp              As Application
    Dim NewMessage              As MailItem
    Dim NS                      As NameSpace
    Dim fName                   As String
    Dim fLoc                    As String
    Dim eAddress                As String
    Dim fNameAddress            As String
    Dim fLocAddress             As String
    Dim eAddressAddress         As String
    Dim myAttachments           As Attachments
    Dim oWB                     As Object
    Dim oWS                     As Object
    Dim bExcelCreated           As Boolean
    Dim bBookOpened             As Boolean
    Dim CellRow                 As Long
    Dim iLastRow                As Long
    Dim iLoop                   As Long
    Dim iStep                   As Long
    Dim aAttach()               As String
    Const sWBName               As String = "mailfile.xlsm"
    Const sWBPath               As String = "C: \PathGoesHere"
    Const sWSName               As String = "Sheet1"
    Const sDelim                As String = ";"
    
' Set up the spreadsheet you want to read
    On Error Resume Next
    Set ExcelObject = GetObject(, "Excel.Application")
    bExcelCreated = False
    If ExcelObject Is Nothing Then
        Set ExcelObject = CreateObject("Excel.Application")
        bExcelCreated = True
    End If
    
     </SPAN>'/// Set workbook/worksheet here</SPAN>
    If WORKBOOKISOPEN(sWBName, ExcelObject) = True Then
        Set oWB = ExcelObject.Workbooks(sWBName)
        bBookOpened = False
    Else
        Set oWB = ExcelObject.Workbooks.Open(sWBPath & sWBName)
        bBookOpened = True
    End If
    If oWB Is Nothing Then
         </SPAN>'/// Variables set wrong or file name/path have changed</SPAN>
        MsgBox "There was an error opening the file '" & sWBName & "'."
        GoTo ExitEarly
    End If
    Set oWS = oWB.Worksheets(sWSName)
    If oWS Is Nothing Then
        MsgBox "There was an error getting the sheet name in file '" & sWBName & "'."
        GoTo ExitEarly
    End If
    On Error GoTo 0
    
    </SPAN> '/// Speed up Excel app here</SPAN>
    ExcelObject.DisplayAlerts = True
    ExcelObject.EnableEvents = True
    ExcelObject.ScreenUpdating = True
    
     ' </SPAN>Read in the data and create a new message with attachment for each Excel entry</SPAN>
    CellRow = 1
    iLastRow = oWS.Cells(oWS.Rows.Count, 1).End(-4162).Row
    
    Set OutlookApp = Application
    
    For iLoop = CellRow To iLastRow
        
        aAttach() = Split(oWS.Range("A" & iLoop).Value, sDelim)
        Set NewMessage = OutlookApp.CreateItem(olMailItem)
        NewMessage.Recipients.Add oWS.Range("B" & iLoop).Value & ";"
        For iStep = LBound(aAttach) To UBound(aAttach)
            If Dir(oWS.Range("C" & iLoop).Value & "\" & Trim(aAttach(iStep)), vbNormal) <> "" Then
                NewMessage.Attachments.Add oWS.Range("C" & iLoop).Value & "\" & Trim(aAttach(iStep))
            End If
        Next iStep
        NewMessage.Subject = ""
        NewMessage.Body = ""
        NewMessage.Display
        
    Next iLoop
    
ExitEarly:
    
    </SPAN> '/// Close Excel if we created it, otherwise restore settings</SPAN>
    If bBookOpened = True Then
        oWB.Close False
    End If
    If bExcelCreated = True Then
        ExcelObject.Quit
    Else
        ExcelObject.DisplayAlerts = True
        ExcelObject.EnableEvents = True
        ExcelObject.ScreenUpdating = True
    End If
    
End Sub
 
Function WORKBOOKISOPEN(wkbName As String, oApp As Object) As Boolean
    On Error Resume Next
    WORKBOOKISOPEN = CBool(oApp.Workbooks(wkbName).Name <> "")
    On Error GoTo 0
End Function
 
Last edited by a moderator:

Excel Facts

Why does 9 mean SUM in SUBTOTAL?
It is because Sum is the 9th alphabetically in Average, Count, CountA, Max, Min, Product, StDev.S, StDev.P, Sum, VAR.S, VAR.P.
I imagine that's because you have this line within your loop:

Code:
Set NewMessage = OutlookApp.CreateItem(olMailItem)
 
Upvote 0
Aha - Thanks!! Trouble is, when I remove that line, I get a Run time error '91': Object variable or With block variable not set.
 
Upvote 0
Hang on, I think I have it...I needed to move the code, not *remove* the code. I misunderstood - forgive me. Thanks for your help!!
 
Upvote 0
Hang on, I think I have it...I needed to move the code, not *remove* the code. I misunderstood - forgive me. Thanks for your help!!

Hi, could you please tell me where you moved that part of the code as I am having the same problem however when I move it above the iLoop command (see below) it puts everbody on the same email with all the attachments?

I just need all separate emails unless there is more than one attachment for the same person, in which case I would like one email for that person with all the attachments. Your help will be greatly appreciated.

Thanks, Kelly


Code:
Set OutlookApp = Application
 Set NewMessage = OutlookApp.CreateItem(olMailItem)
 For iLoop = CellRow To iLastRow
 
 aAttach() = Split(oWS.Range("A" & iLoop).Value, sDelim)
 
 NewMessage.Recipients.Add oWS.Range("B" & iLoop).Value & ";"
 For iStep = LBound(aAttach) To UBound(aAttach)
 If Dir(oWS.Range("C" & iLoop).Value & "\" & Trim(aAttach(iStep)), vbNormal) <> "" Then
 NewMessage.Attachments.Add oWS.Range("C" & iLoop).Value & "\" & Trim(aAttach(iStep))
 End If
 Next iStep
 NewMessage.Subject = "Reports"
 NewMessage.Body = "Hi"
 NewMessage.Display
 Next iLoop
 
Upvote 0
It sounds to me like the original code is what you want - one email per recipient with multiple attachments.
 
Upvote 0
It sounds to me like the original code is what you want - one email per recipient with multiple attachments.

Hey, thanks, but the original code sends 3 seperate emails to the same person as there are 3 workbooks that are emailed to him. I want all of these workbooks on one email to him.
 
Upvote 0
I think your workbook setup must be different then because this part:
Code:
        aAttach() = Split(oWS.Range("A" & iLoop).Value, sDelim)
        Set NewMessage = OutlookApp.CreateItem(olMailItem)
        NewMessage.Recipients.Add oWS.Range("B" & iLoop).Value & ";"
        For iStep = LBound(aAttach) To UBound(aAttach)
            If Dir(oWS.Range("C" & iLoop).Value & "\" & Trim(aAttach(iStep)), vbNormal) <> "" Then
                NewMessage.Attachments.Add oWS.Range("C" & iLoop).Value & "\" & Trim(aAttach(iStep))
            End If
        Next iStep

is supposed to add all the attachments specified in the delimited list in the cell in column A to the email.
 
Upvote 0
EverClear was experiencing the same issue as I am, "The problem is that if there are *multiple* files to attach in the email, the macro will create multiple emails. So if I have 9 files to attach, the macro will create 9 emails to the same recipient."

So the original code was doing the same for them. EverClear then posted that this part was moved Set NewMessage = OutlookApp.CreateItem(olMailItem) to get the result they were after but did not specify to where it was moved.

Any ideas other than where I have already tried?

Thanks,

Kelly
 
Upvote 0
My workbook is set up with 'File name' in Column A, 'Email adress' in Column B, 'File path' in Column C.

Should I be laying it out a different way?
 
Upvote 0

Forum statistics

Threads
1,214,646
Messages
6,120,716
Members
448,985
Latest member
chocbudda

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
Back
Top