Erreur envoi de mail avec Outlook 15.0
Bonjour tout le monde,
J'ai un fichier Excel qui envoie un mail automatiquement à la suite de plusieurs autres opérations
Il fonctionnait jusqu'à maintenant, ce n'est plus cas et je soupçonne Outlook d'être responsable. J'ai eu quelques problèmes avec récemment et l'ai réinstallé mais rien ne change
Je précise que mon code n'a pas changé
Je précise aussi que ce fichier a fonctionné avec Outlook 15.0, puis 14.0 (au travail) et que rapatrié chez moi (télétravail oblige) j'ai veillé à ce qu'il tourne avec Outlook 15.0 (en fait, il a automatiquement basculé avec la bonne référence)
J'ai cherché la cause mais je suis perdu là
Le code :
PreparerOutlook oOutlook
Set oMailItem = oOutlook.CreateItem(0)
With oMailItem
.To = "blablabla@hotmail.fr"
.Subject = "blablabla"
.HTMLBody = "<html><p>" & "Bonjour,<br><br>Merci de m'aider :<br><br>" & contenu & "<html><p>" & "Merci encore.<br><br>Cordialement,<br>"
.Send
End With
If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
Exit Sub
EnvoyerEmailErreur:
If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
MsgBox "Le mail n'a pas pu être envoyé...", vbCritical, "Erreur"
End Sub
En l’occurrence ça dit ce qu'on voit en fin de code : "Le mail n'a pas pu être envoyé..."
Si quelqu'un peut me venir en aide en me suggérant où chercher par exemple ce serait super, je suis à court d'idée
Merci !
Bonjour Sk8Strong
Il manque le début de ta procédure
A priori tu as coché une référence Outlook dans ton éditeur VBA ?
A+
Bonjour BrunoM45,
Le début de mon code c'est celui-ci :
On Error GoTo EnvoyerEmailErreur
Dim oOutlook As Outlook.Application
Dim WasOutlookOpen As Boolean
Dim oMailItem As Outlook.MailItem
Dim Body As Variant
Dim MyBench As String
MyBench = Sheets("bla").Range("H10").Value
MyBench2 = Sheets("bla").Range("F10").Value
MyBench3 = Sheets("bla").Range("H12").Value
MyBench41 = Sheets("blabla").Range("D2").Value
MyBench42 = Sheets("blabla").Range("D3").Value
MyBench43 = Sheets("blabla").Range("D4").Value
contenu = _
"<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" & _
"<style>.tdblack {font-family: times new roman,arial,sans-serif;font-size: 16px;border: 1px solid black;}" & _
".tdred {font-family: times new roman,arial,sans-serif;font-size: 16px;font-weight: bold;color: white;background-color: red;border: 1px solid black;}" & _
"</style>" & _
"<body><table>" & "<th>" & "Désignation" & "<th>" & "Nbre" & "<th>" & "Stock" & "</th>"
If MyBench41 <= 5 Then couleur41 = "tdred" Else couleur41 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur41 & "'>" & MyBench & "</td><td class='" & couleur41 & "'>" & MyBench2 & "</td><td class='" & couleur41 & "'>" & MyBench41 & "</td></tr>"
If MyBench42 <= 5 Then couleur42 = "tdred" Else couleur42 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur42 & "'>" & MyBench3 & "</td><td class='" & couleur42 & "'>" & MyBench4 & "</td><td class='" & couleur42 & "'>" & MyBench42 & "</td></tr>"
If MyBench43 <= 5 Then couleur43 = "tdred" Else couleur43 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur43 & "'>" & MyBench5 & "</td><td class='" & couleur43 & "'>" & MyBench6 & "</td><td class='" & couleur43 & "'>" & MyBench43 & "</td></tr>"
If MyBench44 <= 5 Then couleur44 = "tdred" Else couleur44 = "tdblack" & _
"</table></body>"
Je l'ai un peu raccourcis (j'ai nettement plus de ligne au tableau qui constitue le corps de mon mail)
Pour la référence, elle a basculé automatiquement sur la bonne à savoir : Microsoft Outlook 15.0 Object Library
Re,
Donc c'est bien ça
Dim oOutlook As Outlook.Application
Dim oMailItem As Outlook.MailItem
Décoche ta référence et recherche Outlook en Late binding
Pas sûr de comprendre, je viens de décocher la référence comme tu dis et quand je tente à nouveau j'ai un nouveau message qui me dit :
Erreur de compilation :
Type défini par l'utilisateur non défini
Late binding, ça veut dire quoi ?
Re,
Mon ami Google est là pour ça
Cocher une référence de DLL ou OCX dans l'éditeur VBA, t'oblige à rester avec la même version en général
Le late binding permet de déclarer ton objet en création tardive et du coup peut importe la version
Ouais c'est précisément ce que j'ai fait en attendant ta réponse
J'ai trouvé des trucs en CDO (je ne sais pas ce que c'est)
J'avais espéré un peu de vulgarisation pour m'aider un peu (je ne suis pas super fortiche en vba, je bricole)
Euh j'ai pas tout saisi... en plus ce que j'ai déclaré correspond à la version d'Outlook que j'utilise alors où est le mal !?
Re,
Euh j'ai pas tout saisi... en plus ce que j'ai déclaré correspond à la version d'Outlook que j'utilise alors où est le mal !?
Il n'y a pas de mal, j'ai juste à minima 30 ans de métier, c'est tout
Pas de référence Outlook à cocher
Voici un des nombreux code que j'utilise et qui t'aidera peut-être à comprendre
Private Sub SosBug()
Dim OutObj As Object, Email As Object
' Création d'une instance Outlook pour envoyer un mail
Set OutObj = CreateObject("Outlook.Application")
Set Email = OutObj.CreateItem(0)
Email.To = "BrunoM45@Provider.fr"
Email.Subject = "Sujet de mon mail"
Email.HtmlBody = "Bonjour,<BR><BR>" & "Tu trouveras ci-joint"
'Email.Attachments.Add sPath & sNomFic
' Ne pas envoyer directement, afficher le mail
Email.Display
' Sinon l'envoyer
'Email.Send
' Effacer les variables objets
Set OutObj = Nothing: Set Email = Nothing
' Supprimer le fichier temporaire
'Kill sPath & sNomFic
End Sub
Au fait... quel est ton message d'erreur, j'aurais peut être dû commencer par là
A+
Whouah, ça fonctionne !
Pour ceux qui comme moi sont pas très forts et ont des problèmes avec les références Outlook selon les versions voici le code avec la référence Outlook déclarée qui merde :
On Error GoTo EnvoyerEmailErreur
Dim oOutlook As Outlook.Application
Dim WasOutlookOpen As Boolean
Dim oMailItem As Outlook.MailItem
Dim Body As Variant
Dim MyBench As String
MyBench = Sheets("bla").Range("H10").Value
MyBench2 = Sheets("bla").Range("F10").Value
MyBench3 = Sheets("bla").Range("H12").Value
MyBench41 = Sheets("blabla").Range("D2").Value
MyBench42 = Sheets("blabla").Range("D3").Value
MyBench43 = Sheets("blabla").Range("D4").Value
contenu = _
"<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" & _
"<style>.tdblack {font-family: times new roman,arial,sans-serif;font-size: 16px;border: 1px solid black;}" & _
".tdred {font-family: times new roman,arial,sans-serif;font-size: 16px;font-weight: bold;color: white;background-color: red;border: 1px solid black;}" & _
"</style>" & _
"<body><table>" & "<th>" & "Désignation" & "<th>" & "Nbre" & "<th>" & "Stock" & "</th>"
If MyBench41 <= 5 Then couleur41 = "tdred" Else couleur41 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur41 & "'>" & MyBench & "</td><td class='" & couleur41 & "'>" & MyBench2 & "</td><td class='" & couleur41 & "'>" & MyBench41 & "</td></tr>"
If MyBench42 <= 5 Then couleur42 = "tdred" Else couleur42 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur42 & "'>" & MyBench3 & "</td><td class='" & couleur42 & "'>" & MyBench4 & "</td><td class='" & couleur42 & "'>" & MyBench42 & "</td></tr>"
If MyBench43 <= 5 Then couleur43 = "tdred" Else couleur43 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur43 & "'>" & MyBench5 & "</td><td class='" & couleur43 & "'>" & MyBench6 & "</td><td class='" & couleur43 & "'>" & MyBench43 & "</td></tr>"
If MyBench44 <= 5 Then couleur44 = "tdred" Else couleur44 = "tdblack" & _
"</table></body>"
PreparerOutlook oOutlook
Set oMailItem = oOutlook.CreateItem(0)
With oMailItem
.To = "blablabla@hotmail.fr"
.Subject = "blablabla"
.HTMLBody = "<html><p>" & "Bonjour,<br><br>Merci de m'aider :<br><br>" & contenu & "<html><p>" & "Merci encore.<br><br>Cordialement,<br>"
.Send
End With
If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
Exit Sub
EnvoyerEmailErreur:
If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
MsgBox "Le mail n'a pas pu être envoyé...", vbCritical, "Erreur"
End Sub
Et voici la version en Late binding qui enverra le mail quelle que soit la version Outlook :
Dim OutObj As Object
Dim Email As Object
Set OutObj = CreateObject("Outlook.Application")
Set Email = OutObj.CreateItem(0)
MyBench = Sheets("bla").Range("H10").Value
MyBench2 = Sheets("bla").Range("F10").Value
MyBench3 = Sheets("bla").Range("H12").Value
MyBench41 = Sheets("blabla").Range("D2").Value
MyBench42 = Sheets("blabla").Range("D3").Value
MyBench43 = Sheets("blabla").Range("D4").Value
contenu = _
"<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" & _
"<style>.tdblack {font-family: times new roman,arial,sans-serif;font-size: 16px;border: 1px solid black;}" & _
".tdred {font-family: times new roman,arial,sans-serif;font-size: 16px;font-weight: bold;color: white;background-color: red;border: 1px solid black;}" & _
"</style>" & _
"<body><table>" & "<th>" & "Désignation" & "<th>" & "Nbre" & "<th>" & "Stock" & "</th>"
If MyBench41 <= 5 Then couleur41 = "tdred" Else couleur41 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur41 & "'>" & MyBench & "</td><td class='" & couleur41 & "'>" & MyBench2 & "</td><td class='" & couleur41 & "'>" & MyBench41 & "</td></tr>"
If MyBench42 <= 5 Then couleur42 = "tdred" Else couleur42 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur42 & "'>" & MyBench3 & "</td><td class='" & couleur42 & "'>" & MyBench4 & "</td><td class='" & couleur42 & "'>" & MyBench42 & "</td></tr>"
If MyBench43 <= 5 Then couleur43 = "tdred" Else couleur43 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur43 & "'>" & MyBench5 & "</td><td class='" & couleur43 & "'>" & MyBench6 & "</td><td class='" & couleur43 & "'>" & MyBench43 & "</td></tr>"
If MyBench44 <= 5 Then couleur44 = "tdred" Else couleur44 = "tdblack" & _
"</table></body>"
Email.To = "blablabla@hotmail.fr"
Email.Subject = "blablabla"
Email.HTMLBody = "<html><p>" & "Bonjour,<br><br>Merci de m'avoir aidé :<br><br>" & contenu & "<html><p>" & "Merci encore.<br><br>Cordialement,<br>"
Email.Send
Set OutObj = Nothing: Set Email = Nothing
End Sub
Merci beaucoup BrunoM45, ton bout de code m'a précisément aidé. Je ne pensais pas que je pourrais l'adapter à mon code, mais il semblerait que je progresse !
Merci encore !
D'ailleurs BrunoM45,
Ma référence Microsoft Outlook 15.0 Object Library est cochée mais cela ne semble pas empêcher le mail de partir en Late binding
Normal ?
Re,
Un petit oubli dans le code donné et celui que tu as posté, tu peut supprimer la ligne
Exit Sub
C'est parce que chez moi en dessous j'ai un traitement d'erreur
Ma référence Microsoft Outlook 15.0 Object Library est cochée mais cela ne semble pas empêcher le mail de partir en Late binding
Normal ?
Oui normal, car le code n'en as pas besoin, en revanche si tu la laisse cochée et que tu mets ce classeur à dispo sur un PC avec une autre version... tu auras une erreur
Ok, j'ai modifié le modèle que j'ai partagé
Question, ce que tu appelles traitement d'erreur c'est au cas où le mail ne part pas ?
Parce que j'avais ça dans mon code précédent c'est justement le message d'erreur dont je parle sur mon premier commentaire
J'aimerais avoir cette sécurité, d'être certain que le mail est parti
Re,
Voici avec la gestion d'erreur
Sub EnvoiMail()
Dim OutObj As Object
Dim Email As Object
' En cas d'erreur
On Error GoTo Erreur_Proc
' Définir les objets Outlook et Mail
Set OutObj = CreateObject("Outlook.Application")
Set Email = OutObj.CreateItem(0)
' Préparer le message
MyBench = Sheets("bla").Range("H10").Value
MyBench2 = Sheets("bla").Range("F10").Value
MyBench3 = Sheets("bla").Range("H12").Value
MyBench41 = Sheets("blabla").Range("D2").Value
MyBench42 = Sheets("blabla").Range("D3").Value
MyBench43 = Sheets("blabla").Range("D4").Value
contenu = _
"<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" & _
"<style>.tdblack {font-family: times new roman,arial,sans-serif;font-size: 16px;border: 1px solid black;}" & _
".tdred {font-family: times new roman,arial,sans-serif;font-size: 16px;font-weight: bold;color: white;background-color: red;border: 1px solid black;}" & _
"</style>" & _
"<body><table>" & "<th>" & "Désignation" & "<th>" & "Nbre" & "<th>" & "Stock" & "</th>"
If MyBench41 <= 5 Then couleur41 = "tdred" Else couleur41 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur41 & "'>" & MyBench & "</td><td class='" & couleur41 & "'>" & MyBench2 & "</td><td class='" & couleur41 & "'>" & MyBench41 & "</td></tr>"
If MyBench42 <= 5 Then couleur42 = "tdred" Else couleur42 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur42 & "'>" & MyBench3 & "</td><td class='" & couleur42 & "'>" & MyBench4 & "</td><td class='" & couleur42 & "'>" & MyBench42 & "</td></tr>"
If MyBench43 <= 5 Then couleur43 = "tdred" Else couleur43 = "tdblack"
contenu = contenu & "<tr><td class='" & couleur43 & "'>" & MyBench5 & "</td><td class='" & couleur43 & "'>" & MyBench6 & "</td><td class='" & couleur43 & "'>" & MyBench43 & "</td></tr>"
If MyBench44 <= 5 Then couleur44 = "tdred" Else couleur44 = "tdblack" & _
"</table></body>"
Email.To = "blablabla@hotmail.fr"
Email.Subject = "blablabla"
Email.HTMLBody = "<html><p>" & "Bonjour,<br><br>Merci de m'avoir aidé :<br><br>" & contenu & "<html><p>" & "Merci encore.<br><br>Cordialement,<br>"
Email.Send
Set OutObj = Nothing: Set Email = Nothing
' Si tout est ok, sortir de la sub ici
Exit Sub
' En cas d'erreur
Erreur_Proc:
MsgBox "Un erreur c'est produite : " & Err.Number & " - " & Err.Description _
& "Le mail n'a pas été envoyé (à vérifier)", vbCritical, "OUPS..."
Set OutObj = Nothing: Set Email = Nothing
' On arrête
End Sub
A+
Merci encore et à plus !