Remplissage cellules après envoi mail

Bonjour !

Je possède un programme qui envoi automatiquement des mails si une date butoir est atteinte. Dès que le mail est envoyé, le mot "Oui" s'écrit dans une cellule pour empêcher que le mail se renvoi :

         Set oCell = zSheet.Cells(zRow, cColMailEnvoi)
        oCell.Value = "Oui"
        oCell.Font.Bold = True

Actuellement mon programme fonctionne très bien, les mails s'envoient une seule fois grâce au programme au dessus. Mon problème est le suivant : comment faire pour envoyer un seul mail quand il s'agit d'une commande groupée ? (La partie suivante vérifie que "Oui" n'est pas écrit) :

                    If oCell.Offset(, cColMailEnvoi - cColJoursRestants).Value <> "Oui" Then
                    SendFollowUpMail Worksheets("Commandes urgentes"), oCell.Row

Chaque fois qu'une commande dépasse la date butoir un mail s'envoi donc automatiquement, et le mot "Oui" s'écrit dans ma colonne cColMailEnvoi. Donc si je rentre une commande de 50 pièces différentes (soit 50 colonnes, donc 50 "Oui") mais de la même commande, 50 mails seront envoyé ce qui pose problème (Alors qu'un seul mail aurait suffit).

Avez-vous une idée sur comment envoyer un seul mail s'il s'agit d'une commande de multiples pièces ?

Bonjour Devery,

En utilisant une Boucle, tu peux mettre plusieurs références dans ton mails (donc la Boucle tourne 50 fois et met les 50 références à tes pièces).

A la fin de cette Boucle, tu met ton "Oui" pour éviter le renvoie d'un mail.

Sans fichier, impossible de te proposer un code.

Restant à dispo

Bonjour Juice,

Voici la partie de mon programme qui effectue l'envoi des mails :

    If OL_OK Then

            On Error Resume Next

             For Each oCell In Worksheets("Commandes urgentes").UsedRange.Columns(cColJoursRestants).Cells
                  If oCell.Value <= cNbJoursRelance2 Then

                    If oCell.Offset(, cColMailEnvoi - cColJoursRestants).Value <> "Oui" Then
                    SendFollowUpMail Worksheets("Commandes urgentes"), oCell.Row

                       End If
                  End If
             Next

Et dans mon Sub SendFollowUpMail, j'écris le "Oui" :

        Set oCell = zSheet.Cells(zRow, cColMailEnvoi)
        oCell.Value = "Oui"
        oCell.Font.Bold = True

Mon envoi de mail est totalement automatique lorsque je remplis des dates dans mes autres cellules. Si je mets le "Oui" à l'extérieur de la boucle cela ne posera-t-il pas problème ?

Re- Devery

Dans quelle partie de ce code tu touche au corps du mail (où est-ce que tu écrit le texte?) ?

Si je mets le "Oui" à l'extérieur de la boucle cela ne posera-t-il pas problème ?

Tout dépend de ton fichier :p

Restant à dispo

Salut Juice,

Voici la ligne d'une commande :

capture

J'envois donc un "Oui" quand le nombre de jours restants est inférieur à 3, dans ce cas un mail est envoyé dont le contenu est dans la colonne T(Message d'alerte 1).

= " Bonjour, le délai de la commande <b> "&AB2&" </b> est bientôt atteint : <br/> 
<br/> Date de reçue : <b> "&AG2&" </b>
<br/> Date limite d'envoi : <b> "&AH2&" </b>
<br/> Date de certificat : <b> "&AI2&" </b>
<br/>(Déploiement : <b> <font color=#FF0000>"&AE2&"</font></b>)     "

Je récupère ce texte en citant ma colonne dans mon programme :

Const cColMailBody = 20

Concernant le déclenchement de l'envoi du mail, j'ai mon programme dans une boucle IF qui vérifie le nombre de jours restants, et qui fait ensuite appel à mon Sub contenant le mail :

    If OL_OK Then
            On Error Resume Next
             For Each oCell In Worksheets("Commandes urgentes").UsedRange.Columns(cColJoursRestants).Cells
                  If oCell.Value <= cNbJoursRelance2 Then

                    If oCell.Offset(, cColMailEnvoi - cColJoursRestants).Value <> "Oui" Then
                    SendFollowUpMail Worksheets("Commandes urgentes"), oCell.Row

                       End If

L'envoi de mail se fait ici :

Sub SendFollowUpMail(zSheet As Excel.Worksheet, zRow As Long)
    Const cColMailList = 19
    Const cColMailBody = 20
    Const cSep = vbLf
    Const cMailItem = 0
    Dim oOL As Object
    Dim oMail As Object
    Dim oCell As Excel.Range
   ' Const strbody = "<br><br>"
    Dim sRecipients As String
    Dim aRecipients() As String
    Dim sBody As String
    Dim i As Integer

    'On récupère sur la ligne sélectionnée les données pour l'envoi
    Set oCell = zSheet.Cells(zRow, cColMailList)
    sRecipients = oCell.Value
    Set oCell = zSheet.Cells(zRow, cColMailBody)
    sBody = oCell.Value

    'On s'assure que les données soient disponibles
    If Len(sRecipients) > 0 And Len(sBody) > 0 Then
        On Error GoTo ErrorHandling
       ' Set oOL = GetObject(, "Outlook.Application")
        Set oOL = CreateObject("Outlook.Application")
        Set oMail = oOL.CreateItem(cMailItem)
        With oMail
            'On ajoute autant de destinataires que nécessaire
            aRecipients() = Split(Replace(sRecipients, cSep, ";"), ";")
            For i = 0 To UBound(aRecipients)
                .Recipients.Add aRecipients(i)
            Next
            .Subject = cSubject
            .htmlbody = sBody '& "<br)" & strbody
            .Send
        End With
        'On indique que le mail a été envoyé
        Set oCell = zSheet.Cells(zRow, cColMailEnvoi)
        oCell.Value = "Oui"
        oCell.Font.Bold = True
    End If
    GoTo Cleaning
ErrorHandling:
    Dim sMess As String
    sMess = "Erreur " & Err.Number & vbCrLf & vbCrLf _
        & Err.Description & vbCrLf & vbCrLf _
        & "Veuillez vérifier les adresses mails!"

    MsgBox sMess, vbCritical, "ERREUR MAIL"
    If Not oMail Is Nothing Then
        oMail.Display
    End If
Cleaning:
    'On fait le ménage
    Set oCell = Nothing
    Set oOL = Nothing
    Set oMail = Nothing

End Sub

Re-

J'ai fais un fichier test sur lequel on peut essayer d'écrire du code pour te trouver une solution (normalement c'est pas à celui qui aide de le faire mais bon, tu veux vraiment pas joindre ton fichier XD)

Je t'ai écris un code qui reprend ta logique du "Première alerte ?" ou "Deuxième alerte" ; qui tient compte du nbr de jour restant (inférieur à 3 ou non) et qui regroupe les commandes en un seul et même mail si la liste adresse est la même

Les "OUI" se mettent automatiquement

Je te laisse tester et revenir vers nous

6pour-devery.xlsm (20.47 Ko)

J'ai réussi à résoudre le problème sans passer par un code VBA, j'ai fait quelque calcules et au bout de 5 SI différents je suis arrivé à mon résultat ! Un peu fastidieux mais ça fonctionne .

Je suis parti de la case contenant mon numéro de rapport, cette dernière contient "" si l'alerte n'est pas déclenchée, et le numéro de rapport si elle l'est. J'ai séparé les valeurs "" et N° du rapport dans deux cases différentes, puis fusionné en une seule qui affiche les deux côtes à côte :

=I6&" "&J6

J'affiche donc "rien" avec mon numéro de rapport. C'est un peu mal expliqué, mais l'essentiel est que ça marche !

Je tiens quand même à te remercier pour le temps que tu m'as accordé Juice, c'est très sympa de ta part !

Cordialement,

Devery.

Bien joué à toi du coup XD!

A une prochaine fois ^^

Rechercher des sujets similaires à "remplissage envoi mail"