Création de mail avec conditions

12testmails.xlsm (19.26 Ko)

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é.

help . personne pour m'aider

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
outlook

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 , pour le "late biding" je ne connaissais pas mais ça semble être pas mal

@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. Car je ne sais pas ou intégrer le code de @BrunoM45 dans le code de MC Charon. Merci pour votre temps.

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.

5testmails.xlsm (23.72 Ko)

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

4testmails.xlsm (24.10 Ko)

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

Rechercher des sujets similaires à "creation mail conditions"