Génération de mail Outlook automatiquement selon une date

Bonjour,

Je suis désolée de poster à nouveau sur le sujet mais malgré les nombreuses heures que j'ai passé sur les forums, je ne trouve pas de solution quant à mon problème.

En effet, je suis novice en VBA mais mon employeur me demande l'envoi automatique d'un mail selon une date précise dans un tableau excel et je ne vois pas comment faire autrement que de passer par VBA.

458essai3.zip (10.86 Ko)

Voici ma problématique, je vais essayer d'être assez claire :

1) Dans un tableau ouvert tous les jours et même plusieurs fois par jour, je dispose de plusieurs informations concernant des demandent d'interventions.

2) Je dois automatiser l'envoi d'un mail lorsque la date de remise du décompte est dépassée de 30 jours à l'ouverture du fichier.

3) Ce mail doit être envoyé à plusieurs personnes et contenir les informations des autres cellules de la ligne.

4) Ce fichier étant ouvert plusieurs fois par jours, le mail risque d'être envoyé plusieurs fois par jours et j'aimerais l'éviter...

J'ai tout de même déjà ébauché ce code :

Sub Mail_workbook_Outlook_1()
Dim R As Long, Derlig As Long
 Dim OutApp As Object
    Dim OutMail As Object
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
    If Sheets("Feuil1").Cells(R, 5) = Date - 30 Then
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
            OutMail.From = ("***************@*****************.fr")
            OutMail.To = ("*****************@****************************.fr")
            OutMail.Subject = "Alerte - Décompte maintenance"
            OutMail.Body = "Le décompte envoyé le " & Sheets("Feuil1").Cells(R, 5) & "Pour la maintenance effectuée sur la commune de " & Sheets("Feuil1").Cells(R, 1) & " n'a toujours pas été validé par le client, merci de faire une relance"
            OutMail.Send
        Set OutApp = Nothing
    End If
End Sub

Mais cela ne fonctionne pas du tout : j'ai plusieurs erreurs qui apparaissent successivement (erreur d'execution 1004, ....)

Mon problème semble surtout résider dans l'objet ou l'application Outlook, qu'en pensez-vous ?

Je cherche malheureusement une solution depuis plusieurs jours et à force, les codes finissent par se mélanger et ne plus rien dire....

Au fait, j'ai oublié de mentionné que j'avais bien cohcé Microsoft Outlook Library dans les références.

Je remercie d'avance tous ceux qui veulent bien m'apporter un coup de main car mon patron pense que ça va se faire en claquant des doigts....

Encore merci d'avance.

Bonne journée

Bonjour,

Ce mail doit être envoyé à plusieurs personnes et contenir les informations des autres cellules de la ligne.

De quelle colonne s'agit-il ? Il ya 4 décomptes.

Ce fichier étant ouvert plusieurs fois par jours, le mail risque d'être envoyé plusieurs fois par jours et j'aimerais l'éviter...

On peut prévoir une colonne supplémentaire avec un X qui confirmera l'envoi du mail, de sorte que si le X est là, le mail n'est pas envoyé.

Merci de confirmer

Bonjour,

Merci de votre aide et surtout de votre rapididté.

Excusez-moi de ne pas avoir précisé : il s'agit de la colonne E "décompte remis".

Concernant la colone supplémentaire, cela pourrait être envisageable mais le X devrait-il être inscrit manuellement ou peut-il être automatisé ? Montableau final comporterait environ un millier de lignes et cela devriendrait assez délicat de devoir mettre à jour cette nouvelle colonne à chaque fois que le mail serait envoyé.

Merci

re

Ce serait fait automatiquement bien sûr.

Je vais voir pour proposer quelque chose.

Re,

Une remarque au sujet des erreurs.

Ecrit comme cela dans le code, il y aura toujours une erreur:

OutMail.From = ("***************@*****************.fr")
OutMail.To = ("*****************@****************************.fr")

Les informations seront-elles complétées dans le code ou doivent-elles venir d'une feuille du fichier ?

Re,

L'info .From n'est pas nécessaire puisque c'est toujours moi qui ouvrirait le fichier en premier tous les jours, donc cela partira forcément de ma propre adresse mail (enfin je suppose !!!)

Concernant l'info .To elle provient du code en lui-même, ma propre adresse mail en l'occurence ainsi que celles de certains de mes collègues en copie.

Le but étant de prévenir mes colègues qu'ils doivent gérer certaines relances et garder une copie chez moi dans Outlook pour le suivi de leur travail.

Ces réponses peuvent-elles vous aider ?

merci

re,

Code à essayer

Sub Mail_workbook_Outlook_1()
Dim R As Long, Dlg As Long
Dim outapp As Object, outmail As Object
Dlg = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
Set outapp = CreateObject("Outlook.Application")
Set outmail = outapp.CreateItem(0)
For R = 2 To Dlg
    If UCase(Sheets("Feuil1").Cells(R, 8)) <> "X" And Sheets("Feuil1").Cells(R, 5) = Date - 30 Then
        With outmail
          '  .From = ("***************@*****************.fr")
            .To = ("*****************@****************************.fr")
            .Subject = "Alerte - Décompte maintenance"
            .Body = "Le décompte envoyé le " & Sheets("Feuil1").Cells(R, 5) & "Pour la maintenance effectuée sur la commune de " & Sheets("Feuil1").Cells(R, 1) & " n'a toujours pas été validé par le client, merci de faire une relance"
            .Send
        End With
        Sheets("Feuil1").Cells(R, 8) = "X" 'Mise du X en colonne H
    End If
Next
Set outapp = Nothing
End Sub

Il faut remplacer les ***** dans le .To par une adresse correcte pour que cela fonctionne.

Si ok, lors de votre réponse, merci de cloturer le fil en cliquant sur le v vert à coté du bouton EDITER

Amicalement

C'est super,

Ca fonctionne impeccable.

Mzerci beaucoup de votre aide.

Excusez-moi, j'ai peut être validé un peu vite.

En effet, cela a bien fonctionné la première fois mais lorsuqe j'ouvre à nouveau mon fichier, plus rien ne se passe.

Ne devrais-je pas insérer un bouton pour lui faire exécuter la macro ou cela peut il se faire dès l'uverture du fichier ? et si oui, comment ?

D'autre part, si j'ai plusieurs lignes qui sont concernées, je n'ai qu'un seul mail qui est envoyé, or j'aimerais que chaque décompte arrivé à la date des Aujourdhui()-30 génère un mail qui lui est propre.

J'espère avoir été suffisament claire dans mes demandes.

Merci d'avance


Alors, au final, j'ai bien réussi à insérer un bouton qui exécute la macro mais le problème du mail reste le même :

Si j'ai 3 lignes qui arrivent à échéance, il n'y a que la dernière qui fait l'objet d'un mail, même si je vois (et c'est très rapide) que les autres mails apparaissent quelques millisecondes.

Pardon, je suis désolée mais j'aurais dû vous prévenir que j'ai modifié le .send en .display afin de vérifier le contenu du mail avant de l'envoyer.

Le problème vient probablement de là.

Excusez-moi encore

Re

En effet, cela a bien fonctionné la première fois mais lorsuqe j'ouvre à nouveau mon fichier, plus rien ne se passe.

Oups en effet j'avais zappé cette demande

Bon il suffit de mettre le code ci-dessous dans THISWORKBOOK.

Private Sub Workbook_Open()
Call Mail_workbook_Outlook_1
End Sub

Pour le placer :

  • ouvrir VBA
  • CTRL + R pour afficher VBA Project à gauche
  • dans VBA project, double clique sur THISWORKBOOK
  • Dans la fenêtre de droite, coller le code ci-dessus

Si j'ai 3 lignes qui arrivent à échéance, il n'y a que la dernière qui fait l'objet d'un mail, même si je vois (et c'est très rapide) que les autres mails apparaissent quelques millisecondes

Essaie en changeant le code car je n'avais pas pu testé l'envoi de mails

Sub Mail_workbook_Outlook_1()
Dim R As Long, Dlg As Long
Dim outapp As Object, outmail As Object
Dlg = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row

For R = 2 To Dlg
    If UCase(Sheets("Feuil1").Cells(R, 8)) <> "X" And Sheets("Feuil1").Cells(R, 5) = Date - 30 Then
        Set outapp = CreateObject("Outlook.Application")
        Set outmail = outapp.CreateItem(0)
        With outmail
          '  .From = ("***************@*****************.fr")
           .To = ("*****************@****************************.fr")
            .Subject = "Alerte - Décompte maintenance"
            .Body = "Le décompte envoyé le " & Sheets("Feuil1").Cells(R, 5) & "Pour la maintenance effectuée sur la commune de " & Sheets("Feuil1").Cells(R, 1) & " n'a toujours pas été validé par le client, merci de faire une relance"
            .Send
        End With
        Set outapp = Nothing
        Sheets("Feuil1").Cells(R, 8) = "X" 'Mise du X en colonne H
   End If
Next
End Sub

Si souci je testerai Lundi au boulot

Amicalement

Bonjour

Private Sub Workbook_Open()
Call Mail_workbook_Outlook_1
End Sub

Malheureusement, ce code me pose un petit problème car lorsque j'ouvre mon fichier, le message "Erreur de compilation - Sub ou Function non définie" apparaît.

et la ligne suivante est surlignée en jaune :

Private Sub Workbook_Open()

Merci de votre patience.

Re,

Cela arrive si le code "Mail_workbook_Outlook_1" ne se trouve pas dans le module VBA ou que le nom n'est pas correct

D'où mes questions :

  • la macro pour le mail s'appelle bien comme ceci ?? --> "Mail_workbook_Outlook_1"
  • la macro se trouve bien dans un module le fichier en question ?

Bonjour,

je me suis posé les même questions toute la matinée et au final, en effet, la macro pour le mail était dans la Feuil1 et non pas dans le module.

J'ai bien réussi à faire ma macro : elle se lance parfaitement à l'ouverture du fichier et génére bien un mail pour chaque ligne.

Merci beaucoup de votre aide qui m'a été si précieuse. Je comprends un peu mieux la logique des macros à présent.

Par contre, et si je peux me permettre d'abuser de votre gentillesse et de vos connaissance, j'aurais un tout dernier conseil à vous demander :

Dans la partie "Body" de mon mail, j'aimerais mettre en forme le texte, qui soit variable ou non. En fait, j'aimerais que ma première variable soit en gras et que ma dernière invariable soit surlignée ou écrite en rouge.

Cela est-il faisable ou dois-je passer par le .display pour pouvoir mettre en forme mes mails ?

Dans l'attente de vos précieux conseils et en vous remerciant du temps que vous avez accordé à mes demandes....

re,

je me suis posé les même questions toute la matinée et au final, en effet, la macro pour le mail était dans la Feuil1 et non pas dans le module.

Ah ben oui.

Sans rentrer dans les détails, pour ma part je mets toujours les SUB dans un module et non dans les feuilles.

La SUB dans un module permet d'être utilisée et appelée dans tout le fichier. Donc l'intéressant c'est qu'elle peut être unique et commune à toutes les feuilles

Dans les feuilles, j'y mets des PRIVATE SUB qui sont liées à la feuille en question.

Dans la partie "Body" de mon mail, j'aimerais mettre en forme le texte, qui soit variable ou non.

Là c'est beaucoup moins évident à faire ....

Je vois de ce coté si une solution simple existe

Re

Alors j'ai un peu avancé toute seule concernant la mise en forme de la partie .body mais je me retrouve tout de même dans une impasse :

- J'ai testé le langage html : en remplaçant

.Body

en

.HTMLBody

, et là, je peux bien entendu, grâce aux balises HTML mettre en forme mon texte "fixe"

"Bonjour" & "Le décompte envoyé le "

, ce qui donne au final :

"<HTML><body><b>Bonjour, le décompte envoyé le </b></body><HTML>" 

et rend mon texte gras.

Malheureusement, le langage html ne fonctionne pas avec

Sheets("Feuil1").Cells(R, 7)

car il remplace le code par du texte normal.

- J'ai testé le langage vba : en ajoutant à

Sheets("Feuil1").Cells(R, 7)

le code suivant :

.Font.Bold = True

, ce qui donne :

Sheets("Feuil1").Cells(R, 7)].Font.Bold = True

Malheureusement, le corps du mail envoyé devient alors 0 et plus rien, même le texte normal n'apparaît dans le message du mail.

A noter que, bien entendu, ce sont ces valeurs "variables " comme

Sheets("Feuil1").Cells(R, 7)

que je veux mettre en forme puisque ce sont elles les plus importantes pour les relances.

Existe-t-il un moyen pour éviter ce 0 ou alors de faire en sorte que ma "variable" soit prise comme telle avec le langage html ?

Merci de vos réponses.

re

Dans mon code, remplace :

 .Body = "Le décompte envoyé le " & Sheets("Feuil1").Cells(R, 5) & "Pour la maintenance effectuée sur la commune de " & Sheets("Feuil1").Cells(R, 1) & " n'a toujours pas été validé par le client, merci de faire une relance"

Par ceci :

.HTMLBody = "Le décompte envoyé le " & _
"<b>" & Sheets("Feuil1").Cells(R, 5) & "</b><p>" & _
"Pour la maintenance effectuée sur la commune de " & _
"<FONT COLOR=RED>" & Sheets("Feuil1").Cells(R, 1) & "</FONT><p>" & " n'a toujours pas été validé par le client, merci de faire une relance"

Amicalement

Bonjour,

Merci beaucoup de votre aide et à présent tout fonctionne parfaitement. Voici mon code final :

Sub Mail_workbook_Outlook_1()
Dim R As Long, Dlg As Long
Dim outapp As Object, outmail As Object
Dlg = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row

For R = 2 To Dlg
    If UCase(Sheets("Feuil1").Cells(R, 10)) <> "X" And Sheets("Feuil1").Cells(R, 7) <= Date - 30 And Sheets("Feuil1").Cells(R, 8) = "" Then
    Set outapp = CreateObject("Outlook.Application")
        Set outmail = outapp.CreateItem(0)
        With outmail
          '  .From = ("e.bringuez@etde.fr")
          .To = ("e.bringuez@etde.fr")
            .Subject = "Alerte - Décompte maintenance"
            .HTMLBody = "<HTML><body>Bonjour, " & "<br>" & "<br>" _
            & "A ce jour aucune validation client n'a été enregistrée pour le décompte envoyé le : " & "<span style=background:#FFFF33><b><i>" & Sheets("Feuil1").Cells(R, 7) & "</span></b></i><p>" _
            & "Concernant la maintenance effectuée le : " & "<span style=background:#FFFF33><b><i>" & Sheets("Feuil1").Cells(R, 5) & "</i></b></span>" & " sur la commune de : " & "<span style=background:#FFFF33><b><i>" & Sheets("Feuil1").Cells(R, 3) & "</i></b></span><p>" _
            & "Merci de faire une relance." & "<br>" & "<br>" _
            & "Emilie BRINGUEZ" & "<br>" & "<br>" _
            & "<a target= _blank href=http://www.hostingpics.net title=Hebergeur d'image><img src=http://img4.hostingpics.net/pics/549871Sanstitre.png border=0 alt=Hebergeur d'image /></a>"
            .Display
        End With
        Set outapp = Nothing
        Sheets("Feuil1").Cells(R, 10) = "X" 'Mise du X en colonne H
  End If
Next
End Sub

Il ne me reste plus qu'un "détail" absolument gigantesque à résoudre puisqu'il me faudrait dans le corps du mail, un bouton de commande qui renvoie le destinataire du mail sur le fichier excel initial.

A noter que ce fichier est sur un serveur commun à tous les destinataires potentiels des mails, donc il n'y a aucun problème de partage, c'est déjà ça.

Pouvez-vous m'aider à nouveau ? et je vous promets que ce sera le dernier conseil que je vous demande.

Merci d'avance.

Re,

Il ne me reste plus qu'un "détail" absolument gigantesque à résoudre puisqu'il me faudrait dans le corps du mail, un bouton de commande qui renvoie le destinataire du mail sur le fichier excel initial.

Faire un bouton serait complexe. Une autre solution est de faire un lien hypertexte dans le message qui renvoie vers le fichier.

Pour se faire, on peut ajouter cette ligne à l'instruction Htmlbody --> "file://" & ThisWorkbook.Path & "\" & ThisWorkbook.Name

L'instruction dans le code devien la suivante :

.HTMLBody = "<HTML><body>Bonjour, " & "<br>" & "<br>" _
            & "A ce jour aucune validation client n'a été enregistrée pour le décompte envoyé le : " & "<span style=background:#FFFF33><b><i>" & Sheets("Feuil1").Cells(R, 7) & "</span></b></i><p>" _
            & "Concernant la maintenance effectuée le : " & "<span style=background:#FFFF33><b><i>" & Sheets("Feuil1").Cells(R, 5) & "</i></b></span>" & " sur la commune de : " & "<span style=background:#FFFF33><b><i>" & Sheets("Feuil1").Cells(R, 3) & "</i></b></span><p>" _
            & "file://" & ThisWorkbook.Path & "\" & ThisWorkbook.Name _
            & "Merci de faire une relance." & "<br>" & "<br>" _
            & "Emilie BRINGUEZ" & "<br>" & "<br>" _
            & "<a target= _blank href=http://www.hostingpics.net title=Hebergeur d'image><img src=http://img4.hostingpics.net/pics/549871Sanstitre.png border=0 alt=Hebergeur d'image /></a>"

Amicalement

Bonjour,

Merci encore de votre aide. Malheureusement, je n'y arrive pas :

"file://" & U:\RESEAUX_SECS\ARCHIVES_RESEAUX SECS\MAINTENANCE\Tableau_de_bord_maintenance_2012.xls & "\" & U:\RESEAUX_SECS\ARCHIVES_RESEAUX_SECS\MAINTENANCE\Tableau_de_bord_maintenance_2012.xls

Il me donne l'erreur suivante :

"Erreur de compilation

Attendu : numéro de ligne ou étiquette

ou instruction ou fin d'instruction

Ensuite il me mets en surbrillance les : \

re,

Avez-vous essayé avec les instructions que j'ai données (Thisworkbook......) et pas avec U:......

Rechercher des sujets similaires à "generation mail outlook automatiquement date"