Excel VBA - e-mail opstellen

excel_vba_e-mail_opstellenIn dit artikel worden twee methoden met elkaar vergeleken voor het versturen van een e-mail vanuit Excel via het Outlook-object.

In methode A wordt er gebruik gemaakt van een vroege binding en in methode B van een late binding.

Het voornaamste verschil zit in de declaratie en initialisatie van de Outlook objecten.

Methode A Methode B
Vroege binding Late binding
Dim objOutlook As Outlook.Application Dim objOutlook as Object
Dim objMail As Outlook.MailItem Dim objMail As Object
Set objOutlook = New Outlook.Application Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(olMailItem) Set objMail = objOutlook.CreateItem(0)

Het binden (koppelen) beoogt het binden van de ene applicatie met de andere applicatie. In dit geval dus Excel met Outlook.

excel_vba_e-mail_intellisenseexcel_vba_ontbrekende_verwijzingIn methode A wordt de koppeling in design time gemaakt. Dit heeft als voordeel dat je de IntelliSense (zie linker afbeelding) kan gebruiken voor het selecteren van eigenschappen c.q. methoden en dat fouten gelijk worden opgemerkt. Een nadeel van deze methode is dat er eenmalig handmatig een verwijzing moet worden gemaakt naar het Outlook-object. Zo is het oefenbestand gemaakt in Excel 2016 met een verwijzing naar 'Microsoft Outlook 16 Object Library'.

Wanneer deze methode bij een oudere versie van Excel wordt uitgevoerd, zal deze een fout opleveren (zie rechter afbeelding).

In methode B wordt de koppeling @ runtime tot stand gebracht. Deze methode kan langer duren. Gezien Outlook als (generiek) object wordt gedeclareerd kan de IntelliSense niet gebruikt worden en zullen fouten niet specifiek worden aangegeven. Het grote voordeel is wel dat er geen aparte verwijzing gemaakt hoeft te worden zoals bij methode A. Hierdoor kan deze methode ten alle tijden versie-onafhankelijk worden gebruikt.

'-----------------------------------------------------------------------------------------------------------------------
' Auteur        : pascalterheege.nl
' Datum         : 22-2-2016
' Object        : modOutlook
' Doel          : twee verschillende methoden voor het aanroepen van een andere Office applicatie
' Bron          : https://support.microsoft.com/nl-nl/kb/245115
'                 http://nieuwsbrief.helpmij.nl/artikel.php?id=2539
'-----------------------------------------------------------------------------------------------------------------------

Option Explicit

'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 22-2-2016
' Type          : Subroutine
' Verwijzing    : Microsoft Outlook X Object Library
' Opmerking     : vroege binding
'-----------------------------------------------------------------------------------------------------------------------
Sub methodeA()

    Dim objOutlook As Outlook.Application
    Dim objMail As Outlook.MailItem
    
    Dim strAan As String
    Dim strCC As String
    Dim strOnderwerp As String
    Dim strBericht As String

    Set objOutlook = New Outlook.Application
    Set objMail = objOutlook.CreateItem(olMailItem)
    
    strAan = [B1]
    strCC = [B2]
    strOnderwerp = [B3]
    strBericht = [B4]
    
    With objMail
        .To = strAan
        .CC = strCC
        .Subject = strOnderwerp
        .Body = strBericht
        .Display
    End With

    Set objMail = Nothing
    Set objOutlook = Nothing


End Sub
'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 22-2-2016
' Type          : Subroutine
' Opmerking     : late binding
'-----------------------------------------------------------------------------------------------------------------------
Sub methodeB()

    Dim objOutlook As Object
    Dim objMail As Object
    
    Dim strAan As String
    Dim strCC As String
    Dim strOnderwerp As String
    Dim strBericht As String

    Set objOutlook = CreateObject("Outlook.Application")
    Set objMail = objOutlook.CreateItem(0)

    strAan = [B1]
    strCC = [B2]
    strOnderwerp = [B3]
    strBericht = [B4]
    
    With objMail
        .To = strAan
        .CC = strCC
        .Subject = strOnderwerp
        .Body = strBericht
        .Display
    End With

    Set objMail = Nothing
    Set objOutlook = Nothing

End Sub

Download hier het oefenbestand.

Gezien de MAC een totaal ander besturingssysteem heeft zullen de Windows oplossingen niet werken. Deze verwijzen namelijk naar specifieke Windows gerelateerde (ActiveX) onderdelen.

Om Outlook toch aan te kunnen roepen wordt gebruikt gemaakt van het script RDBMacOutlook.scpt en de functie MacExcelWithMacOutlookPDF. Deze onderdelen zijn beiden ontwikkeld door Ron de Bruin.


Option Explicit

Sub verstuurPDF()

'-----------------------------------------------------------------------------------------------------------------------
'   Auteur    : pascalterheege.nl
'   Datum     : 22-1-2021
'   Doel      : huidige werkblad als bijlage toevoegen aan een nieuwe email
'   Opmerking : plaats RDBMacOutlook.scpt in de juiste locatie, zie onderstaande link
'   Bron      : https://macexcel.com/examples/mailpdf/macoutlook/ (Ron de Bruin)
'-----------------------------------------------------------------------------------------------------------------------
 
    Dim strPDF As String
    Dim strHTML As String
    Dim strBody As String
    Dim shWerkblad As Worksheet
    
    Set shWerkblad = ActiveSheet

    strPDF = MacScript("return POSIX path of (path to desktop folder) as string") & "test.pdf"
 
    With shWerkblad
'       Schakel zoom uit om te voorkomen dat de layout ongewenst wordt gewijzigd
        .PageSetup.Zoom = False
        .ExportAsFixedFormat _
            Type:=xlTypePDF, _
            FileName:=strPDF, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=False, _
            IgnorePrintAreas:=False
    End With
    
'   Maak een HTML bestaand aan - in dezelfde locatie - voor standaard e-mail tekst
    strHTML = ThisWorkbook.Path & Application.PathSeparator & "Tekst.html"
    
    Open strHTML For Input As #1
        strBody = Input(LOF(1), #1)
    Close #1
    
    MacExcelWithMacOutlookPDF _
        subject:="Test e-mail", _
        mailbody:=strBody, _
        toaddress:="info@pascalterheege.nl", _
        ccaddress:="", _
        bccaddress:="", _
        displaymail:="yes", _
        accounttype:="", _
        accountname:="", _
        attachment:=strPDF

End Sub

Function MacExcelWithMacOutlookPDF(subject As String, mailbody As String, _
    toaddress As String, ccaddress As String, _
    bccaddress As String, displaymail As String, _
    accounttype As String, accountname As String, _
    attachment As String)
    'Ron de Bruin : 11-Dec-2020 (renamed the function)
    'https://macexcel.com/examples/mailpdf/macoutlook/
    ' Change the displaymail argument to string instead of boolean
    Dim ScriptStr As String, RunMyScript As String

    ScriptStr = subject & ";" & mailbody & ";" & toaddress & ";" & ccaddress & ";" & _
                bccaddress & ";" & displaymail & ";" & accounttype & ";" & _
                accountname & ";" & attachment
 
    'Call the RDBMacOutlook.scpt script file with the AppleScriptTask function
    RunMyScript = AppleScriptTask("RDBMacOutlook.scpt", "CreateMailInOutlook", CStr(ScriptStr))

    'Delete the file we just mailed
    Kill attachment
End Function