Email outlook envoyé - VBA
Bonjour,
Je vous écris car je fais une macro d envois automatiques d emails. J'aimerais savoir comment on fait pour savoir si l'email est bien envoyé ?
Si le collaborateur ferme la fenêtre, Outlook l email n'est donc pas envoye. J'aimerais alors pouvoir afficher un message "Votre e-mail n'est pas envoyé" si on n envoie pas l email et qu'on ferme alors la fenêtre Outlook.
Comment faire ? Merci bien !
Voici le code... Merci pour votre aide !
...
On Error Resume Next
Do
DoEvents
Loop Until MonMessage.Sent = True
If (MonMessage.Sent = True And MonMessge.Closed = True) Then
Sheets(MaFeuille).Activate
Range("B4").Select
MsgBox ("Vous avez envoyé l'Email.")
Sheets(MaFeuille).Activate
Range("B4").Select
ElseIf (MonMessage.Sent = False And MonMessage.Closed = True) Then
MsgBox ("Attention, vous n'avez pas envoyé l'Email !")
Sheets(MaFeuille).Activate
Range("B4").Select
End If
J'aimerais prendre en considération les 2 cas suivants :
- Le fait que le collaborateur appuie sur "envoyer" afin d'envoyer l'Email -- > Ecriture de logs et message avertissant l'utilisateur de l'email envoyé
-Le fait qu'il ferme la fenetre Outlook de l'email Ou quelconque raison qui n'envoie pas l'email --> Message avertissant l'utilisateur de l'email non envoyé.
Merci bien :)
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
Pour cela, il faut passer par les événements OutLook, ci_dessous exemple de code à insérer dans une feuille ou dans ThisWorkbook :
Dim email_envoyé As Boolean
Private WithEvents OlApp As Outlook.Application
Private WithEvents email As Outlook.MailItem
Sub affichage_mail()
Set OlApp = CreateObject("Outlook.Application") 'création instance application outlook
email_envoyé = False
With OlApp.CreateItem(olMailItem)
.To = "xxxxx@domaine"
.Subject = "sujet"
.Display 'afficher le mail
End With
End Sub
Private Sub OlApp_ItemLoad(ByVal item As Object)
If item.Class <> olMail Then Exit Sub
'assignation variable objet email pour activation des evts email
Set email = item
End Sub
Private Sub email_Send(Cancel As Boolean)
email_envoyé = True
End Sub
Private Sub email_Close(Cancel As Boolean)
AppActivate ThisWorkbook.Name
If email_envoyé Then MsgBox "mail envoyé" _
Else MsgBox "mail non envoyé"
End Sub
Bonjour, Merci pour la réponse mais ca ne marche pas chez moi...
Comment faire ? Merci.
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Merci pour la réponse mais ca ne marche pas chez moi...
Si vous n'êtes pas plus précis sur ce qui ne marche pas et sans fichier exemple, impossible de vous aider.
Sheets("LOGS").Activate
On Error Resume Next
Do
DoEvents
Loop Until MonMessage.Sent = True
If Err.Number <> 0 Then
If MonMessage.Sent = True And MonMessage.Closed = True Then
'Référence Globe
Range("A" & DerniereLigne_Logs + 1).Value = Reference_Globe
'Zone
Range("B" & DerniereLigne_Logs + 1).Value = MaFeuille
'Code Dépositaire
Range("C" & DerniereLigne_Logs + 1).Value = Depositaire
'Type de Relance
Range("D" & DerniereLigne_Logs + 1).Value = "Relance Contrepartie"
'Date
Range("E" & DerniereLigne_Logs + 1).Value = Now
'Collaborateur
Range("F" & DerniereLigne_Logs + 1).Value = "@" & UCase(Environ("username")
Sheets(MaFeuille).Activate
Range("B4").Select
MsgBox ("Vous avez envoyé l'Email.")
Sheets(MaFeuille).Activate
Range("B4").Select
Exit Sub
ElseIf MonMessage.Sent = False And MonMessage.Closed = True Then
MsgBox ("Votre email n'a pas pu être envoyé. Merci de ressayer ultérieurement.")
Exit Sub
End If
End If
Désolé. Je souhaite donc pouvoir écrire des logs quand l'email est bien envoyé (fenetre Outlook fermée et email envoyé).
Par contre ici quand je veux fermer l'email, j'arrive à fermer l'email mais je n'ai pas la main... Je pense que c'est dû à la boucle Loop.
Merci pour votre aide.
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Vous ne fournissez que des extraits de code et non un fichier exemple. Je ne vois pas où vous avez essayé d'appliquer mon code.
Par exemple, avec votre instruction
Sheets("LOGS").Activate
vous lancerez la création du mail si vous mettez mon code dans votre feuille LOGS avec la procédure d'envoi du mail
Dim email_envoyé As Boolean
Private WithEvents OlApp As Outlook.Application
Private WithEvents email As Outlook.MailItem
Private Sub Worksheet_Activate()
'// procédure de création de votre mail
Set OlApp = CreateObject("Outlook.Application") 'création instance application outlook
With OlApp.CreateItem(olMailItem)
.To = "xxxxx@domaine"
.Subject = "sujet"
.Display 'afficher le mail
End With
End Sub
Private Sub OlApp_ItemLoad(ByVal item As Object)
If item.Class <> olMail Then Exit Sub
'assignation variable objet email pour activation des evts email
Set email = item
End Sub
Private Sub email_Send(Cancel As Boolean)
email_envoyé = True
'Référence Globe
Range("A" & DerniereLigne_Logs + 1).Value = Reference_Globe
'Zone
Range("B" & DerniereLigne_Logs + 1).Value = MaFeuille
'Code Dépositaire
Range("C" & DerniereLigne_Logs + 1).Value = Depositaire
'Type de Relance
Range("D" & DerniereLigne_Logs + 1).Value = "Relance Contrepartie"
'Date
Range("E" & DerniereLigne_Logs + 1).Value = Now
'Collaborateur
Range("F" & DerniereLigne_Logs + 1).Value = "@" & UCase(Environ("username"))
AppActivate ThisWorkbook.Name
MsgBox ("Vous avez envoyé l'Email.")
Sheets(MaFeuille).Activate
Range("B4").Select
End Sub
Private Sub email_Close(Cancel As Boolean)
AppActivate ThisWorkbook.Name
If Not email_envoyé Then MsgBox ("Votre email n'a pas pu être envoyé. Merci de ressayer ultérieurement.")
End Sub
Bonjour,
J'arrive a envoyer les emails. je n'arrive pas à écrire les Logs suite à l'envoi ou non de l'email.
Je ne sais pas ou mettre le code
Private Sub email_Close
et
Private Sub email_Send
au bon endroit... pour pouvoir alors avoir des messages suite aux events...
J'ai ça dans mon module d'envoi d'email mais ca ne fait rien... En fait je ne maitrise pas les events Outlook en vba.
End Sub
Private Sub OlApp_ItemLoad(ByVal item As Object)
If item.Class <> olMail Then Exit Sub
'assignation variable objet email pour activation des evts email
Set MonMessage = item
End Sub
Private Sub email_Send(Cancel As Boolean)
email_envoyé = True
End Sub
Private Sub email_Close(Cancel As Boolean)
AppActivate ThisWorkbook.Name
If email_envoyé Then MsgBox "mail envoyé" _
Else MsgBox "mail non envoyé"
End Sub
Merci pour votre aide.
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Ce code est à mettre dans un module objet (ThisWorkBook ou une de vos feuilles) et non dans un module général du dossier modules. Je vous ai fourni un exemple pour votre feuille "Logs" . Votre module d'envoi du mail doit être également dans le code de la feuille et la référence à la bibliothèque Outlook cochée.
Pour appeler le module d'envoi du mail, vous avez 2 solutions soit :
- le mettre dans la procédure événementielle d'activation de la feuille : Private Sub Worksheet_Activate()
- créer une procédure publique dans la feuille : Sub Envoi_Mail() qui peut être appelée via l'objet Feuille correspondant à votre nom de feuille. Par exemple, si vous avez Feuil5 (Logs), vous pouvez utiliser l'instruction : Call Feuil5.Envoi_Mail
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
ci-joint un exemple d'envoi de mail avec les infos que vous avez communiquées
ci-dessous code final
Dim email_envoyé As Boolean
Dim MaFeuille As Worksheet
Private WithEvents OlApp As Outlook.Application
Private WithEvents email As Outlook.MailItem
Sub envoi_mail(sh As Worksheet)
Set MaFeuille = sh
'// procédure de création de votre mail
Set OlApp = CreateObject("Outlook.Application") 'création instance application outlook
With OlApp.CreateItem(olMailItem)
.To = "xxxxx@domaine"
.Subject = "sujet"
.Display 'afficher le mail
End With
End Sub
Private Sub OlApp_ItemLoad(ByVal item As Object)
If item.Class <> olMail Then Exit Sub
'assignation variable objet email pour activation des evts email
Set email = item
End Sub
Private Sub email_Send(Cancel As Boolean)
Dim DerniereLigne_Logs As Long
email_envoyé = True
'Dernière ligne de la feuille
DerniereLigne_Logs = Cells.Find("*", SearchDirection:=xlPrevious).Row
'Référence Globe
Range("A" & DerniereLigne_Logs + 1).Value = Reference_Globe
'Zone
Range("B" & DerniereLigne_Logs + 1).Value = MaFeuille.Name
'Code Dépositaire
Range("C" & DerniereLigne_Logs + 1).Value = Depositaire
'Type de Relance
Range("D" & DerniereLigne_Logs + 1).Value = "Relance Contrepartie"
'Date
Range("E" & DerniereLigne_Logs + 1).Value = Now
'Collaborateur
Range("F" & DerniereLigne_Logs + 1).Value = "@" & UCase(Environ("username"))
MaFeuille.Activate
MaFeuille.Range("B4").Select
End Sub
Private Sub email_Unload()
If email_envoyé Then
MsgBox ("Vous avez envoyé l'Email.")
Else
MsgBox ("Votre email n'a pas pu être envoyé. Merci de ressayer ultérieurement.")
End If
End Sub
Bonjour,
Je vous remercie pour votre message mais il y a quelque chose que je ne comprends pas.
J'ai 3 modules différents pour les envois d'Email (Email Banque, Email CLient etc...) et j'ai des boutons sur chaque feuille Excel. Depuis n'importe qu'elle feuille on retrouve ces 3 boutons. Les différentes feuilles sont des périmètres (Europe, US etc...)
Peut-on adapter votre code à mon besoin c'est a dire adapter a mes 3 différents modules pour la création des LOGS dès qu'un Email est envoyé ou non ?
Merci bien.
Je viens de voir en détail votre code. Vous créez l'email dans la Feuil5 "LOGS".
Moi je crée les Email dans des modules bien séparés. Comment je peux adapter votre code à mon besoin ?
Merci bien :)
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Moi je crée les Email dans des modules bien séparés. Comment je peux adapter votre code à mon besoin ?
Il suffit dans la feuille "Logs" de rendre le module d'envoi de mail entièrement paramétrable, ce qui vous permet son appel de n'importe quelle autre feuille.
ci-dessous exemple :
Merci pour le fichier. Je vois très bien. Mais C'est a dire que comme j'ai 3 macro d'envoi d'Email différentes, comment je fais pour que quand j'appuie sur le bouton qui execute la macro "Envoi_Email_Banque" ça fasse le relai avec la macro qui est sur la feuille "LOGS" ?
C'est à dire que pour chaque type d'Email (une des 3 macros suivant le cas, relance banque, client etc...) ca fasse le lien avec la macro dans la feuille LOGS. Comment faire ?
Merci bien
Please ??
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Par exemple, dans votre macro "Envoi_Email_Banque"', vous supprimez toutes les références à Outlook et vous appelez la macro présente dans "Logs" en lui passant les paramètres nécessaires. Ci-dessous exemple de code :
Sub envoi_banque()
destinataire = "xxxxxx@dddddd"
personnes_en_copie = "aaaaaaaaa@dddddd;bbbbbbbbbbb@dddddd"
personnes_en_copie_cachée = "cccccccccc@dddddd"
Objet = "relance"
Contenu = "Veuillez nous régler ..."
Feuil5.envoi_mail ActiveSheet, destinataire, personnes_en_copie, personnes_en_copie_cachée, Objet, Contenu
End Sub
Fournissez un exemple de votre macro "Envoi_Email_Banque" et vous aurez une meilleure réponse.
Voici la macro pour l'envoi à la Contrepartie
Sub Creation_Email_Contrepartie_Groupe()
For i = 0 To Tableau_Lignes_Operations_Selectionnees.Count - 1
'Récupération des Données pour chaque opération
Call Recuperation_DATAS_Operations
'SSI CACEIS
Call SSI_CACEIS
Donnees_Financieres_Header = "<table><style>th, td {padding: 5px; border: 1px solid black; border-collapse: collapse;}, th, td {font-size:15px}</style><thead>" & _
"<th bgcolor='#B0091B'; align='center'; colspan='12'; style='color:white'>" & "Financial DATA" & "</th>" & _
"<tr bgcolor='#F2DCDB'>" & _
"<th align='center'>" & "Motive of non-matching" & "</th>" & _
"<th align='center'>" & "Settlement Type" & "</th>" & _
"<th align='center'>" & "Direction" & "</th>" & _
"<th align='center'>" & "ISIN" & "</th>" & _
"<th align='center'>" & "Quantity" & "</th>" & _
"<th align='center'>" & "Amount" & "</th>" & _
"<th align='center'>" & "Price" & "</th>" & _
"<th align='center'>" & "Currency" & "</th>" & _
"<th align='center'>" & "Intern Status" & "</th>" & _
"<th align='center'>" & "Market Status" & "</th>" & _
"<th align='center'>" & "Trade Date" & "</th>" & _
"<th align='center'>" & "Value Date" & "</th>" & _
"</tr><tbody>"
Donnees_Financieres = "<td bgcolor='white'; align='left'>" & Motif_Non_Matching & "</td>" & _
"<td bgcolor='white'; align='left'>" & Settlement_Type & "</td>" & _
"<td bgcolor='white'; align='left'>" & Direction & "</td>" & _
"<td bgcolor='white'; align='left'>" & Code_ISIN & "</td>" & _
"<td bgcolor='white'; align='left'>" & Quantite & "</td>" & _
"<td bgcolor='white'; align='left'>" & Montant_RL & "</td>" & _
"<td bgcolor='white'; align='left'>" & Cours_RL & "</td>" & _
"<td bgcolor='white'; align='left'>" & Devise & "</td>" & _
"<td bgcolor='white'; align='left'>" & Statut_Interne & "</td>" & _
"<td bgcolor='white'; align='left'>" & Statut_Marche & "</td>" & _
"<td bgcolor='white'; align='left'>" & TD & "</td>" & _
"<td bgcolor='white'; align='left'>" & DTH & "</td>" & _
"</thead></table>"
Ma_Trade_Tableau = Donnees_Financieres_Header & Donnees_Financieres
Mise_En_Forme_SSI_CACEIS = "<table><style> td {padding: 5px;border: 5px solid black; border-style:none}, th, td {font-size:15px}</style>" & _
"<th bgcolor='#B0091B'; align='center'; colspan='4'; style='color:white'>" & "CACEIS's SSI's" & "</th>" & _
"<tr style=font-size:15px>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "BUYER/SELLER:" & "</td>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "DEAG/REAG:" & "</td>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "NOSTRO AC:" & "</td>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "PSET:" & "</td>" & _
"</tr>" & _
"<tr style=font-size:15px>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & BUYER_SELLER_CACEIS & "</td>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & DEAG_REAG_CACEIS & "</td>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & Compte_NOSTRO & "</td>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & PSET_CODE & "</td>" & _
"</tr></table><br>"
'Nous sommes face à la CP
Broker_Facing = "<table><style>td {padding: 5px;border: 5px solid black; border-style:none}, th, td {font-size:15px}</style>" & _
"<th bgcolor='#B0091B'; align='center'; colspan='4'; style='color:white'>" & "Counterpartie's SSI's" & "</th>" & _
"<tr style=font-size:15px>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "BUYER/SELLER:" & "</b></td>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & BUYER_SELLER_CODE_BROKER & "</td>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "BUYER/SELLER AC:" & "</b></td>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & BUYER_SELLER_COMPTE_BROKER & "</td>" & _
"</tr>" & _
"<tr style=font-size:15px>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "DEAG/REAG:" & "</b></td>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & DEAG_REAG_CODE_BROKER & "</td>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "DEAG/REAG AC:" & "</b></td>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & DEAG_REAG_COMPTE_BROKER & "</td>" & _
"</tr>" & _
"<tr style=font-size:15px>" & _
"<td bgcolor='#F2DCDB'; align='left'><b>" & "PSET:" & "</b></td>" & _
"<td bgcolor='#F2DCDB'; align='left'>" & PSET_CODE & "</td>" & _
"<td bgcolor='#F2DCDB';>" & "</td>" & _
"<td bgcolor='#F2DCDB';>" & "</td>" & _
"</tr></th></table>" & _
"<br>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<br><br>"
Mon_Corps_Email = Mon_Corps_Email & Ma_Trade_Tableau & "<br><u>Our SSI'S are:</u>" & Mise_En_Forme_SSI_CACEIS & "<u>We are Facing:</u>" & Broker_Facing
Next
'Paramétrage et création de l'Email
Set MaMessagerie = CreateObject("Outlook.Application")
Set MonMessage = MaMessagerie.CreateItem(0)
'Affichage du message pour pouvoir faire afficher signature collaborateur
With MonMessage
MonMessage.Display
End With
MaSignature = MonMessage.HTMLBody
With MonMessage
'Paramétrage de la boîte d'Email d'envoi
If MaFeuille = "Europe" Or MaFeuille = "Europe_PM" Or MaFeuille = "Espagne" Or MaFeuille = "Espagne_PM" Or MaFeuille = "UK" Or MaFeuille = "UK_PM" Then
.SentOnBehalfOfName = "Bk-Sett-Intl-Europe@caceis.com"
ElseIf MaFeuille = "Afrique" Or MaFeuille = "Afrique_PM" Or MaFeuille = "Asie" Or MaFeuille = "Asie_PM" Or MaFeuille = "MIDDLE_EAST" Or MaFeuille = "MIDDLE_EAST_PM" Then
.SentOnBehalfOfName = "Bk-Sett-AsianAndRWMarkets@caceis.com"
ElseIf MaFeuille = "LATAM" Or MaFeuille = "LATAM_PM" Or MaFeuille = "NORTH_AM" Or MaFeuille = "NORTH_AM_PM" Then
.SentOnBehalfOfName = "Bk-Sett-AllAmericanMarkets@caceis.com"
End If
'Paramétrage de l'Email destinataire
.To = "yoel.touil@caceis.com"
'Objet de l'Email
Call Objet_Email
'Formule de Politesse au début de l'Email
Formule_Politesse_Debut = "<p style=font-size:15px; face='Calibri';>" & "Hello," & "<br><br>"
'Raison de l'envoi de l'Email
Raison_Envoi_Email = "You will find below a list of pending/failing trades we have with you." & "<br><br>" & _
"1. In case of motive CP missing, please check and advise whether you recognize the trade." & "<br>" & _
"2. In case of motive CP short or on-hold, please take necessary action to deliver us the securities or release your instruction." & "<br><br>" & _
"Should you not be right contact please forward this request to the correct team."
'Formule de Politesse à la fin de l'Email
Formule_Politesse_Fin = "Please, check and advise," & "<br><br>" & "Best regards," & "</p>"
'Corps de l'Email
.HTMLBody = Formule_Politesse_Debut & Raison_Envoi_Email & Mon_Corps_Email & Formule_Politesse_Fin & MaSignature
'Affichage de l'Email
.Display
'Désactiver de la mémoire l'Application Outlook
Set MaMessagerie = Nothing
End With
End Sub
C'est a dire que je n'arrive pas a adapter votre code a mon probleme.
Merci bien :)
Bonjour,
Je vous avoue avoir cherché comment faire mais je n'y arrive pas.
J'ai 3 macros différentes dans 3 modules différents qui créent les Emails. Je n'arrive pas a le relier avec les LOGS...
- Messages
- 4'097
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Question 1 : Quel est le nom de l'objet feuille associé à votre feuille LOGS ? Il figure dans l'éditeur VBA: Feuil?(LOGS).
Question2: Fournissez-moi cette procédure : Call Objet_Email
Réponse dans l'après-midi
Bonjour, c'est "Feuil37"
En faite j'ai bien compris ce que vous faite mais moi j'utilise 3 modules différents pour la creation des emails. Ils ne sont pas fait a l'interieur de la feuille LOGS.
Y a til un possibilite de faire appel a mes macros de creation d'email depuis la Feuille LOGS ?
Sub Objet_Email()
'*************************************************************************************************
'On parcourt toutes les opérations de la sélection et on regarde si le code dépositaire est unique
'*************************************************************************************************
Code_Depositaire_First = Replace(Cells(Tableau_Lignes_Operations_Selectionnees(0), 19).Value, " ", vbNullString)
For m = 1 To Tableau_Lignes_Operations_Selectionnees.Count - 1
'***************************************************************************************************************
'Si Codes Dépositaires uniques lors de la sélection, l'objet de l'Email est vraiment personnalisé avec le marché
'Si Codes Dépositaires différents lors de la sélection, l'objet de l'Email n'est pas personnalié
'***************************************************************************************************************
If Replace(Cells(Tableau_Lignes_Operations_Selectionnees(m), 19).Value, " ", vbNullString) <> Code_Depositaire_First Then
Objet = "UNMATCHED "
Else
Objet = "UNMATCHED " & Market_Name & " " & i & " TRADES"
End If
Next
End Sub
Merci