In this post, we will be looking at how to send an Access report as an attachment.
We have a Customer report that we are looking to attach to the email. We would like to save it to our local computer as a PDF file and attach it from there.
The Code
Public Function sendReportAsAttachment(strSQL As String, strEmailField As String, _
strSubject As String, strMessage As String, strReport As String)
On Error GoTo ErrorHandler
''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''' 1 ''''''''''''''''''''
''''''''''''''''''' Declarations '''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim olApp As Object
Dim olMail As Outlook.MailItem
Dim olRecipient As Outlook.Recipient
Dim olAttachment As Outlook.Attachment
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strPath As String
Dim strSendName As String
Dim strHtml As String
Dim strLine As String
' Create the Outlook session.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'if outlook is open it will need to be run as administrator
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Set olApp = New Outlook.Application
Set olMail = olApp.CreateItem(olMailItem)
' Create the message.
Set olMail = olApp.CreateItem(olMailItem)
'path where html file will be written
strPath = "C:\AccessTemp"
strSendName = "FileToSend"
On Error Resume Next
MkDir strPath
On Error GoTo ErrorHandler
'print to pdf
Application.Echo False
DoCmd.OpenReport strReport, acViewPreview
DoCmd.OutputTo acOutputReport, "", acFormatPDF, strPath & "\" & strSendName & ".pdf", False
DoCmd.Close acReport, strReport
Application.Echo True
''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''' 2 ''''''''''''''''''''
''''''''''''''''''' Recipients '''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''
'open up a recordset and move through it
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)
With rs
If Not .BOF And Not .EOF Then
.MoveLast
.MoveFirst
While (Not .EOF)
' Add the To recipient(s) to the message.
Set olRecipient = olMail.Recipients.Add(.Fields(strEmailField))
olRecipient.Type = olTo
.MoveNext
Wend
End If
End With
''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''' 3 ''''''''''''''''''''
''''''''''''''''''''' Message'''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''
With olMail
' Set the Subject, Body, and Importance of the message.
.Subject = strSubject
.Body = strMessage
.Importance = olImportanceHigh 'High importance
' Add attachments to the message.
.Attachments.Add strPath & "\" & strSendName & ".pdf"
' Resolve each Recipient's name.
For Each olRecipient In .Recipients
olRecipient.Resolve
Next
''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''' 4 ''''''''''''''''''''
''''''''''''''' Display, Save, Send'''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''
.Display
End With
sendReportAsAttachment = True
ExitFunction:
Set olRecipient = Nothing
Set olMail = Nothing
Set olApp = Nothing
Application.Echo True
Exit Function
ErrorHandler:
sendReportAsAttachment = False
Resume ExitFunction
End Function
The Explanation
Public Function sendReportAsAttachment(strSQL As String, strEmailField As String, _
strSubject As String, strMessage As String, strReport As String)
In order to attach a report we will need to know its name. strReport will need to be the exact name of the report that should be attached.
'path where html file will be written strPath = "C:\AccessTemp" strSendName = "FileToSend"
We will need to save the report to the local computer and for that we will need a folder. We have created a folder under the C Drive called AccessTemp and we are setting strPath equal to that folder path.
strSendName is the name that the file will be called when it is saved to the local computer.
On Error Resume Next
MkDir strPath
On Error GoTo ErrorHandler
MkDir will create a directory at “C:\AccessTemp” (strPath). What happens if that directory doesn’t exist? Well, an error will be generated but because we have surrounded the MkDir line with On Error Resume Next…On Error GoTo ErrorHandler, the error will be ignored.
'print to pdf
Application.Echo False
...
Application.Echo True
When we save the report to the local computer, we don’t need the end user to see the report being opened so we use Application.Echo false.
DoCmd.OpenReport strReport, acViewPreview
We first open the report but because Application.Echo has been set to False, we will be not be seeing it.
DoCmd.OutputTo acOutputReport, "", acFormatPDF, strPath & "\" & strSendName & ".pdf", False
Having opened the report (in memory) we now want to save the report as a PDF to a predefined location in the database. The location is made up of strPath & “\” & strSendName & “.pdf” which in our case would become C:\AccessTemp\FileToSend.pdf.
DoCmd.Close acReport, strReport
We now close the report.
' Add attachments to the message.
.Attachments.Add strPath & "\" & strSendName & ".pdf"
Having opened the report we want and saved it to a predefined location in the database, we now need to attach it to the email. In order to attach it, we only need pass in the full path of the file we are attaching.
Testing The Function
The Form
The form will look like this:
And the end result will look like this:
The Conclusion
In this post, we have shown you how to attach a report to an email. In the next post, we will be showing you how to read from a report and display it as a message in the email.

