Macro VBA: mail auto avant échéance

alexpepe - 30 mars 2016 à 09:59 - Dernière réponse :  alexpepe
- 5 avril 2016 à 09:41
Bonjour à tous,

Je fais appel à votre aide car la je bloque sur du code VBA.

Pour mon travail j'ai un tableau de suivi des visites médicales qui comprend plusieurs données (jour de la visite colonne C, heure colonne D, agent concerné colonne E, le mail du responsable colonne F et une colonne pour savoir si la convocation est réalisée en colonne G.

Mon sujet est le suivant: j'aimerai qu'automatiquement sans que le fichier excel soit ouvert, il envoie un mail trois jours avant la date de visite à l'adresse mail du responsable pour lui faire un rappel.

J'ai sur ce forum trouvé un sujet qui correspond à ce problème mais le code ne fonctionne pas quand j'essaie de le mettre en forme pour mon tableau.

voici le code que j'ai actuellement dans mon fichier:
Option Explicit

Sub TesteDate()
'envoie un mail si la date est dépassée
Dim sSujet, sBody, sAdresseMail, sAdresseRetour As String 'chaines pour le sujet, corps, adresse d'envoi, adresse de retour
Dim duree As Long 'nbre de jours entre aujourd'hui et la date à tester
Dim Lig_Deb, Lig_Fin As Integer 'ligne de début, de fin
Dim sDates_Col, sMails_Col As String 'colonnes qui contiennent les dates à tester et les adresses mail
Dim I As Integer

'initialisation des constantes de la macro :
Lig_Deb = 2 'dans ma feuille Excel, les dates à tester commencent en ligne 2
sDates_Col = "C" ' et elles sont en colonne C ( 3 ième colonne)et les adresses mail sont en colonne D à côté

'initialisation des données du mail envoyé :
sSujet = "Visite médical"
sBody = "Votre agent doit passer sa visite médicale dans trois jours"
sAdresseRetour = "***@***"

'Ligne de fin =1ère cellule vide dans la colonne des dates
Lig_Fin = Val(Range(sDates_Col & CStr(Lig_Deb)).End(xlDown).Row)

' boucle de test dans la plage des dates (=> )
For I = Lig_Deb To Lig_Fin
Range(sDates_Col & CStr(I)).Select 'activer la cellule testée
duree = Now - ActiveCell.Value ' la date est dans la cellule active
If duree < 4 Then 'la date est dépassée
sAdresseMail = ActiveCell.Offset(0, 3).Value 'l'adresse mail est dans la colonne suivante offset (0,1)
'MsgBox ("Envoi de courrier à " & sAdresseMail)
' envoyer le mail :
CDO_SendMail sSujet, sBody, sAdresseMail, sAdresseRetour
Else
'MsgBox ("La date n'est pas atteinte")
End If

Next I

End Sub

Sub CDO_SendMail(ByVal sSujet As String, ByVal sBody As String, ByVal sAdresseMail As String, ByVal sAdresseRetour)
'MARCHE IMPEC, sans demande de confirmation ;-)))))
'on peut préciser : le sujet, le corps , l'adresse mail, l'adresse de retour
Dim iMsg As Object
Dim iConf As Object

Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")

With iMsg
.Configuration = iConf
.To = sAdresseMail
.Sender = sAdresseRetour 'adresse de l'expéditeur pour le rapport envoyé
.From = sAdresseRetour 'adresse de l'expéditeur du mail
.ReplyTo = sAdresseRetour 'adresse à laquelle sera envoyée la réponse
.CC = ""
.BCC = ""
.Subject = sSujet 'sujet du message
.TextBody = sBody 'corps du message
'.AddAttachment Fichier 'fichier joint
.DSNOptions 14 'confirmation demandée dans tous les cas (voir ci-dessous avec 14 8 + 4 + 2)
' (0=pas réponse ; 2=rapport si échec ; 4=rapport si réussi ; 8=rapport si délai)

' pour demander des confirmations de réception ou d'envoi :
.Fields("urn:schemas:mailheader:return-receipt-to") = sAdresseRetour
.Fields("urn:schemas:mailheader:disposition-notification-to") = sAdresseRetour
' Update fields
.Fields.Update

' envoi
.Send
End With

End Sub


Lorsque je lance la macro via un bouton que j'ai créé cela m'indique l'erreur suivante:
"Erreur d'exécution 438 : Propriété ou méthode non gérée par cet objet"

Le débogage m'envoie sur la ligne :
.DSNOptions 14 'confirmation demandée dans tous les cas (voir ci-dessous avec 14 8 + 4 + 2)


Merci à vous pour votre aide car la je bloque vraiment sachant que je suis plutôt novice en VBA.
Afficher la suite 

18 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 30/03/2016 à 11:53
0
Utile
Bonjour,
Mon petit doigt me dit que tu as déjà (au moins) mal copié collé ...
La syntaxe d'une propriété ne saurait être le nom de cette propriété suivi d'un argument ...
On attribue une valeur à une propriété comme on le ferait avec n'importe quelle variable ...
.DSNOptions 14 est totalement incompréhensible

Il est bien évidemment possible que tu aies recopié une ligne mal écrite.
Ce que je t'ai dit juste au-dessus devrait te permettre alors de la corriger sans la moindre hésitation (si tu n'es pas qu'un copieur/colleur)

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
0
Utile
16
Merci pour ta réponse rapide, en effet je l'ai vu après et j'ai rajouter le = sur le DSNOptions (en effet erreur d’inattention car logique), par contre nouvelle erreur "la valeur de configuration "SendUsing" est non valide".
Et le débogage m'affiche le ".Send" à la fin.
cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention > alexpepe - 31 mars 2016 à 20:03
Plusieurs étapes sont donc à réalisées pour cela:
- trouver du code qui analyse l'ensemble des dates de la colonne B et si c'est 4 jours avant la date d'aujourd'hui envoyer un mail au responsable situé en colonne E. --> cela fonctionne sur un onglet à l'heure actuelle avec le code trouvé sur un forum + du code d'envoi de mail que j'ai déjà fait de mon côté.
- faire en sorte que la macro se lance automatiquement --> cela fonctionne avec woorbook open à l'ouverture du fichier, mais du coup ce n'est pas bon vu que le fichier sera ouvert plusieurs fois par jours par différents interlocuteurs
- faire en sorte que la macro se déclenche automatiquement une seule fois par jour et fasse la recherche sur tous les onglets du fichier


Si tu lis bien ce que t'explique ucfoutu, tu verrais que même en utilisant Workbook_Open, tu peux utiliser une colonne pour noter les lignes à qui tu as envoyé un courriel. Ça peut être une date, un "X" ou autre. Il faut donc vérifier cette cellule avant de faire un envoi.

Pour vérifier tes feuilles, tu peux boucler celles-ci
For Each Feuille in Worksheets
For each Cellule in MonRange
If... Then EnvoiCourriel CetteLigne
Next
Next
alexpepe > cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention - 5 avril 2016 à 09:40
Bonjour cs_MPI,

oui j'ai bien compris ce que m'a dit ucfoutu pour mettre un "x" lorsque la macro est lancé et qu'elle trouve une date qui correspond, cela serait très pratique et c'est aussi une idée qui m'est passée par la tête mais même avec vos explications je ne sais pas comment l'adapter et dire qu'il faut vérifier toutes les lignes les unes à la suite des autres, s'il y a un X alors ne rien faire mais si pas de X alors lancer la macro de test sur les dates, si une date correspond et envoie un mail alors mettre un X.

Du coup pour reprendre mon sujet et essayer d'être plus clair et suivre les règles du forum, je vais créer de nouveau sujet de discussion pour chacun de mes problèmes.

Merci à toi et j'espère avoir de nouveau ton aide sur les autres sujets.
cs_MPi 3863 Messages postés mardi 19 mars 2002Date d'inscription 13 mars 2018 Dernière intervention > alexpepe - 31 mars 2016 à 20:15
Et j'imagine que vous avez des weekends et/ou des congés.
Si c'est le cas, le fichier ne roulera pas à tous les jours.
Il faudrait donc valider la cellule date est <= Date + 4
Whismeril 11410 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 avril 2018 Dernière intervention - 31 mars 2016 à 16:04
Bonjour,

Quand un modérateur te rappelle de garder un thème par discussion, c'est par ce que c'est une règle du forum.... Bon j'ai ma part de responsabilité, j'ai dérivé aussi.

Mais en fait, tu peux ouvrir plusieurs sujet, chacune des questions de ton dernier message peut mériter un sujet à part entière, et rien ne t'empêche de mettre un lien vers ici pour le contexte, mais
"macro pour toute les feuilles" Bonjour, j'ai une macro qui marche pour la feuille 1 et je voudrais qu'elle fonctionne pour toutes les feuilles.
ne nécessite pas forcément tout le contexte, tu voies?
alexpepe > Whismeril 11410 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 avril 2018 Dernière intervention - 5 avril 2016 à 09:41
Bonjour Whismeril,

oui je comprend bien le souci, et du coup pour reprendre et obtenir l'aide nécessaire je vais créer de nouveaux sujets de discussions pour chacun de mes problèmes. Histoire de suivre les règles du forum.

A bientôt sur mes nouveau sujet j'espère :)
Commenter la réponse de alexpepe

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.