Création de mail avec conditions
Bonjour,
Je suis débutant en vba et j'aimerais un code pour générer des mails automatiquement lorsque j'appuis sur mon macro si possible.
Dans mon tableau j'ai des enquêtes avec trois états "création" "relance" "clôture".
Les mails doivent se générer tous les 5 jours par rapport à la dernière relance d'une enquête.
Je ne dois pas avoir de mail qui se génère pour les "créations" pour les "clôtures" et non plus pour les vieilles relance.
je vois un code comme ça:
Si l'enquête 21-22 n'est pas clôturée et que la dernière relance a 5 jours ou plus par rapport à la date du jour
alors je génère un mail.
Un grand merci d'avance à la communauté.
Bonjour, pas tout compris niveau condition, mais voilà un code pour envoyer un mail
Sub SendMail(ByVal Sujet As String, ByVal Dest As String, ByVal Cont As String, Optional ByVal PJ As String)
'Initialisation
On Error GoTo Send
Dim oOutlook As Outlook.Application
Set oOutlook = Outlook.Application
Dim oMailItem As Outlook.MailItem
Dim oReci As Outlook.Recipient
'Si l'Email est vide on envoie rien
If Len(Cont) = 0 Then
MsgBox "Mail non envoye car vide", vbOKOnly, "Message"
Exit Sub
End If
Call Prep(oOutlook)
Set oMailItem = oOutlook.CreateItem(olMailItem)
'Configuration du mail
With oMailItem
'On rentre le destinataire
Set oReci = .Recipients.Add(Dest)
oReci.Type = olTo
oReci.Resolve
'On indique le sujet plus la mise en forme du messae
.Subject = Sujet
.BodyFormat = olText
.Body = Cont
'Rajout piece jointe s'il y a
If Dir(PJ) <> "" Then .Attachments.Add PJ
.Display
.Send
End With
'Supprime le mail
If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
Exit Sub
Send:
'Message erreur si probleme
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 etre envoye"
End Sub
'Procedure - Preparation du mail
Private Sub Prep(ByRef oOutlook As Object)
On Error Resume Next
Set oOutlook = GetObject(, "Outlook.Application")
'si probleme on quitte la macro
If (Err.Number > 0) Then
Err.Clear
Set oOutlook = CreateObject("Outlook.Application")
If (Err.Number > 0) Then
Exit Sub
Else
End If
Else
End If
End Sub
Ensuite il faut activer la bibliothèque Outlook, dans outils -> Références -> Microsoft Outlook 16.0 Object Library
Bonjour le fil
Et voici un code pour les condition (joli travail d'équipe
Sub EnvoiMail()
Dim lstO As ListObject
Dim Elem As Range
Dim DateRelance As Date
' Définit la tableau structuré
Set lstO = Range("Tableau1").ListObject
' Pour chaque élément de la colonne Etat
For Each Elem In lstO.ListColumns("etat").DataBodyRange
' Si l'élément contient Relance
If Elem.Value = "relance" Then
' Récupérer la date de la dernière relance
DateRelance = lstO.ListColumns("date de relance").DataBodyRange.Cells(Elem.Row - 1)
' Si l'écart avec la date d'aujourd'hui est > 5
If DateDiff("d", DateRelance, Date) > 5 Then
' Envoyer un mail
End If
End If
Next Elem
End Sub
Nota : Mc Charon, perso je préfère le "late biding"
A+
2 cerveaux vaut mieux qu'un
@Mc Charon, ça évite le souci de compatibilité, quand on a plusieurs versions dans une même société
Déjà un grand merci pour vos réponses. Après étant vraiment débutant j'aurais aimé un combo des deux réponses
Bonjour Nitrogramme,
Ce n'est pas parce que l'on est grand débutant, qu'on ne doit pas étudier, analyser et essayer de comprendre
c'est ce que j'ai fait à mes débuts...
Vous mettez les 2 sub dans un seul module, et en dessous mon commentaire ' Envoyer un mail
Vous faite un
Call SendMail("Mon sujet", "mondestinataire@gamil.com", " Ceci est mon message")
A+
bonjour BrunoM45,
Tout d'abord je tenais à te dire que tu avais raison car j'ai écrit un peu vite mon message.
j'ai effectivement réussi à intégrer ton code avec celui de Mc Charon.
Ton code fonctionne bien mais il ne remplit pas toutes les conditions.
Je m'explique.
J'aimerais qu'un mail se génère par enquête sur la dernière relance. Mais si l'enquête est clôturée alors pas de mail.
exemple: pour l'enquête 21-22 je dois avoir un seul mail pour la dernière relance. pour l'enquête 21-24 je ne dois pas
avoir de mail car clôturer.
Dans l'exemple de mon tableau je devrais avoir 2 mails générés.
Merci pour votre temps.
Bonjour;
N'ayant pas eu de retour je me pose la question de savoir si j'ai été claire dans ma demande ou si personne n'a eu le temps. si c'est par manque de temps je patiente car je comprends par contre si mon explication ne convient pas merci de me le faire savoir.
merci à vous.
Bonjour Nitrogramme
Voici un nouvel essai, je vous laisse faire pour le contenu du mail
A+
Bonjour BrunoM45,
Un grand merci pour ton aide, le code fonctionne correctement. Malheureusement je rencontre un nouveau problème qui est d'intégrer le numéro de l'enquête dans le corps des mails générés.
Je te joins le code que j'ai fait mais c'est une vraie catastrophe. Peux-tu jeter un œil ?
Merci
Re,
Cela sert à quoi d'après vous le "Lig" dans Sub EnvoiMail(Lig As Long)
Je vous laisse apprendre le VBA
Bon courage
Bonjour Bruno,
Pour commencer une bonne nouvelle j'ai trouvé à quoi servait Lig" dans sub Envoie Mail(Lig As Long).
Il m'aura fallu le week-end.
Par contre je me suis rendu compte que le code proposé fonctionne pour les deux premières enquêtes (21-22 ET 21-23) mais
si je change la 21-24 de l'état "clôturer" en "relance" je n'ai pas de mail généré pour celle-ci.
Pour être claire si je supprime la date de "clôture" de la "21-24" pour lui mettre une date de "relance" aux "15/03/2022"
et je lance la macro il ne se passe rien.
Je n'ai toujours que deux mails générés.
Peux tu encore m'aider stp.
Merci
Re,
Désolé, il faut changer le test par
If lstO.DataBodyRange(Lig, 1) <> lstO.DataBodyRange(Lig + 1, 1) _
Or Lig = dLig And lstO.DataBodyRange(Lig + 1, 1) <> "" Then
A voir
re,
Ça ne fonctionne pas . il me lance directement 3 mails. Sans modifier les dates du tableau.
Re,
Petit rappel, voici votre demande initial
Les mails doivent se générer tous les 5 jours par rapport à la dernière relance d'une enquête.
Je ne dois pas avoir de mail qui se génère pour les "créations" pour les "clôtures" et non plus pour les vieilles relance.
Donc c'est ce que fait le code
Re,
oui je suis d'accord avec toi mais si je modifie mon enquête clôturée en relance avec une date de relance il n'y a pas de mail générer.
Re,
J'ai modifié un peu les tests et chez moi cela fonctionne
A+
Bonjour Bruno,
Merci pour la modif cela a l'air de fonctionner correctement, je suis en plein test. j'aurais aimé comprendre une ligne du code.
"Vérifier si dernière ligne de l'enquête"
If lstO.DataBodyRange(Lig, 1) <> lstO.DataBodyRange(Lig + 1, 1) Or Lig = dLig Then
lig 1 = colonne 1 mais "Lig +1, 1 " je ne comprends pas
merci