Bonjour,

Je travaille avec Access depuis maintenant plusieurs semaines et j'ai remarqué quelques désagréments lors de l'envoi d'emails en passant par Outlook.

Avec la plupart des codes génériques que l'on trouve sur internet (FAQ comprise) l'envoi se déroule très bien avec .Send lorsque Outlook est déjà ouvert.
Cependant lorsqu'il est fermé au début de l'execution du code .Send provoque l'erreur 287.
La parade est d'appeler .Display juste avant qui va pouvoir règler le problème

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Public Sub sendEmail(addrEmail As String, sujetEmail As String, txtEmail As String)
' méthode qui envoie des email de confirmation
On Error GoTo Erreur
 
Dim strHTML As String
Dim oEmail As Outlook.MailItem
Dim appOutlook As Outlook.Application
 
Set appOutlook = CreateObject("Outlook.Application")
Set oEmail = appOutlook.CreateItem(olMailItem)
 
strHTML = "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">" & _
          "<HTML><HEAD>" & _
          "<META http-equiv=Content-Type content=""text/html; charset=iso-8859-1"">" & _
          "<META content=""MSHTML 6.00.2800.1516"" name=GENERATOR></HEAD>" & _
          "<BODY><DIV STYLE=""font-size: 15px; font-face: Calibri;"">"
 
With oEmail
    .To = addrEmail
    .CC = email_QUA
    .HTMLBody = strHTML & Replace(txtEmail, Chr(10), "<br>") & "</DIV></BODY></HTML>"
    .Subject = sujetEmail
    .Display
    .Send
End With
 
Sortie:
    Set oEmail = Nothing
    Set appOutlook = Nothing
    Exit Sub
 
Erreur:
    MsgBox "Erreur lors de l'envoi de l'email", vbExlamation, "Erreur N°" & err.Number
    Resume Sortie
End Sub
L'inconvénient de cette méthode est que le .Display affiche la fenêtre quelque millisecondes (estétique bof) et que j'ai l'impression que dans certains cas (à confirmer) que le message fini dans la boite d'envoi sans être envoyé lorsque Outlook est fermé.

Une ébauche de parade serait d'appeler l'ouverture du programme si outlook est fermé, on se passe du .Display
On rajoute au début du code précédent :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
If ctrOpenOutlook = False Then
    Call Shell("OUTLOOK.EXE", 6)
    'l'argument 6 minimise normalement la fenêtre à l'ouverture
    With GetObject(, "Outlook.Application")
        .ActiveWindow.WindowState = 1   ' olMinimized = 1
    End With
End If
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Public Function ctrOpenOutlook() As Boolean
    Dim Appli As Object
    On Error Resume Next
    Set Appli = GetObject(, "Outlook.Application")
    If Appli Is Nothing Then
        ctrOpenOutlook = False
        Else
        ctrOpenOutlook = True
    End If
End Function
Malheuresement c'est assez bancale car le temps que la fenêtre s'ouvre (malgré tout en grand écran) le code VBA continue à s'executer et plante.

Je tenais à capter votre attention sur cette limitation, si vous avez des idées d'amélioration n'hésitez pas