It is possible to use the built-in function ActiveWorkbook.SendMail. However, it only allows simple e-mails to be created, and there is no way to add attachments.
In this example we are going to use the COM library of Microsoft Outlook to get more control. Attachments are not covered in this example.
We start by checking if an instance of Outlook is already running. To be independent of the installed version of Outlook we use the GetObject to try to get an existing instance. Another option would have been to reference the Outlook library directly, but then we are required to update the reference every time a new version of Microsoft Office is installed. If no instance is running, we start Outlook by calling CreateObject. Please remember to close down Outlook when you are finished. Otherwise you will get multiple instance of the same application without the user knowing it.
We get a reference to the current users inbox by calling getDefaultFolder(6).The value 6 is a constant referring to the Inbox. If you used a reference to the COM library, you would have used the enum value olFolderInbox.
' Send E-mail
' strTo - Recipients. List of e-mails (separated by ';')
Public Sub SendEmail(ByVal strTo As String)
Dim objOutlookApp As Object
Dim objEmail As Object
Dim objMapi As Object
Dim objInboxFolder As Object
' Valid e-mails?
If (strTo = "") Then
' Error
MsgBox "No e-mails have been set!", vbExclamation, "No e-mails"
' Finished
Exit Sub
End If
' Attach to outlook
On Error Resume Next
Set objOutlookApp = GetObject(, "Outlook.Application")
On Error GoTo 0
' Is Outlook running?
If (objOutlookApp Is Nothing) Then
' Create new instance of outlook
Set objOutlookApp = CreateObject("Outlook.Application")
' Get the MAPI namespace (e-mails)
Set objMapi = objOutlookApp.GetNamespace("MAPI")
' Get the inbox folder
Set objInboxFolder = objMapi.getDefaultFolder(6)
' Display the inbox folder (make outlook visible)
Call objInboxFolder.Display
End If
' Create the new e-mail
Set objEmail = objOutlookApp.CreateItem(0)
' Set the properties of the new email
With objEmail
' Set the recipients
.To = strTo
' Show the message
Call .Display
' Resolve all recipients (Same as pressing the "Check Names" button)
Call .Recipients.ResolveAll
End With
' Free memory
Set objEmail = Nothing
Set objOutlookApp = Nothing
End Sub