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
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 ?
Salut Juice,
Voici la ligne d'une commande :
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
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 ^^