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:
You need to change those two constants so that the contain the name of the file that you want to open and its path, including a trailing path separator.
 
Upvote 0

Excel Facts

Return population for a City
If you have a list of cities in A2:A100, use Data, Geography. Then =A2.Population and copy down.
You need to change those two constants so that the contain the name of the file that you want to open and its path, including a trailing path separator.

hi Andrew, i have already tried to change the file and file path, but the error is showing that "there was an error opening file". please check and revert its some urgent.

thanks in advance.
 
Upvote 0
i have changed the file name and file path in the code, but the same error coming.

Const sWBName As String = "data.xlsm"
Const sWBPath As String = "C:\Users\raksharm\Desktop"
 
Upvote 0
after using above code the below error showing " Run time error '52'. bad file name or Number.

can you please help,.
 
Upvote 0
I AM GETTING THE in below line

If Dir(oWS.Range("C" & iLoop).Value & "\" & Trim(aAttach(iStep)), vbNormal) <> "" Then
NewMessage.Attachments.Add oWS.Range("C" & iLoop).Value & "\" & Trim(aAttach(iStep))

i need every mail should attached separate file as i mention in the excel file (in which i have mention file name in Coloum A, Mail id in coloum B, and file path in coloum C.

also plz find below full code

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 = "dataa.xlsm"
Const sWBPath As String = "C:\Users\raksharm\Desktop\"
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

'/// Set workbook/worksheet here
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
'/// Variables set wrong or file name/path have changed
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

'/// Speed up Excel app here
ExcelObject.DisplayAlerts = True
ExcelObject.EnableEvents = True
ExcelObject.ScreenUpdating = True

' Read in the data and create a new message with attachment for each Excel entry
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.To = 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 = "TDS Certificate FY 2014-15"
NewMessage.Body = "Please Find attached TDS Certificate for the year 2014-15"
NewMessage.Display

Next iLoop

ExitEarly:

'/// Close Excel if we created it, otherwise restore settings
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
 
Upvote 0

Forum statistics

Threads
1,215,633
Messages
6,125,922
Members
449,274
Latest member
mrcsbenson

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