XL 2016 Envoyer un mail deux semaines avant la date indiquée dans la colonne

babacool22

XLDnaute Nouveau
Bonjour à toutes et à tous !

Pour un projet professionnel ( établir le planning de maintenance ), j'aurais aimé pouvoir intégrer une fonction d'envoi de mail à mon classeur. Je me suis donc renseigné sur ce forum et ailleurs sauf que petit bémol, cela dépasse de loin mes capacités.... J'ai vu énormément de possibilité afin d'effectuer cette manipulation et aucune n'est à ma porter ( je me suis pourtant donner les moyens... ). C'est pour cette raison que je viens vous consulter aujourd'hui. Je voudrais que mon classeur envoi un mail à la personne intéressé ( il n'y a qu'une personne à qui envoyer le mail ) pour le prévenir d'une maintenance en se basant sur deux critères : le nom de la machine et la date du début de la tâche ( de B5 à B56 et de D5 à D56 dans mon cas de figure ). Il faudrait que le mail s'envoie 2 semaines avant la date de début de tâche. Je n'ai aucune base en VBA à par un apprentissage scolaire ( faire des damiers ) je reste donc très limité dans le champ des possibilité.
Je vous remercie de m'avoir lu et de porter un intérêt à ma problématique.
Dans l'attente de vous lire,
Cordialement,
Babacool22
 
Solution
Bonjour,

Je répond à votre post d'hier, pas celui d'aujourd'hui. Désolé mais je suis pris par le temps et je fais ce que je peux. Nous ne sommes ni aux pièces, ni obligés à résultat.

Alors dans la version ci-jointe vous trouverez une réorganisation des choses :
1 - vos macros n'ayant rien à faire dans le module de code de la feuille, je les ai déplacées vers des modules dédiés (Interface et Mails)

2 - La macro qui faisait la liste des machines d'une semaine données est transformée en fonction qui renvoie un tableau (ou rien). vous pourrez l'utiliser ailleurs

3 - La macro qui envoie l' email pour les machine de la semaine d'une date passée en paramètre.

cordialement

P.S. pour moi, ayant largement répondu à la question...

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Regardez les discussions similaires, en bas de cette page, dans la dernière, au post #6 vous verrez une sub de @tototiti2008 que vous n'aurez qu'à essayer adapter, revenez avec vos tentatives et un fichier, si vous avez des problèmes.

Si cela ne convient pas, le forum est truffé de ce genre de code.
Faites des recherches.

cordialement
 

babacool22

XLDnaute Nouveau
Bonjour tout le monde, bonjour @Hasco

J'ai suivi vos conseil et j'ai essayé de mettre au point le système.
J'ai réussi à envoyer des mails depuis mon excel en appuyant sur un bouton. J'arrive à y mettre ce que je veux en corps et en sujet. J'aimerai mettre une condition pour envoyer le mail automatiquement et c'est sur cette partie que je bloque.

Sub Envoyer_mail() Dim LeMail As Variant Dim Ligne As Integer Set LeMail = CreateObject("Outlook.Application") 'création d'un objet outlook For Ligne = 46 To 97 If Range("bn" & Ligne) = Date Then With LeMail.CreateItem(olMailItem) 'informe le programme que nous voulons envoyer un mail .Subject = "Alerte maintenance préventive" .To = Range("E3") .Body = "Maintenance préventive de la " & Range("b12") & " prévue pour dans 14 jours à compter d'aujourd'hui." .Send 'Display 'afficher le mail avant de l'envoyer ou send pour envoyer End With End If Next Ligne End Sub

Mon problème est que je ne sais pas comment faire pour qu'il aille sélectionner la machine qui correspond à la date qu'il aura choisit ( la date du jour ).
Cette parcelle de code envoi un mail lorsque qu'une date comprise dans la colonne BN correspond à la date d'aujourd'hui. Les dates renseignées dans BN sont les dates de début de tâche - 14 jours. Je leur ai attribués à chaque date la machine en question mais je ne sais pas comment faire pour qu'il la sélectionne. J'aimerai également savoir si il est possible que lorsqu'il détecte qu'une date correspond à la date d'aujourd'hui il délivre automatiquement un seul et unique mail.
Dans l'attente de vous lire,
Cordialement,
 

Pièces jointes

  • Planning maintenance v3.xlsm
    111 KB · Affichages: 6
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Bien.
Pour mieux comprendre ce que vous voulez :

Pour chaque cellule de la plage D5:D56
Si la date de la cellule parcourue est égale à aujourd'hui + 14 (=Date+14) alors envoyer le mail

Est-ce cela ? Si oui, vous allez envoyez n mails pour n tâches à une seule et même personne tous les jours. Ca va ressembler à du harcèlement :)

Déjà envoyer un seul mail avec une liste des tâches à 14 jours si c'est tous les jours, je trouve ça limite mais envoyer n mails pour n tâches alors tous les jours...

Ne serait-il pas préférable par exemple d'envoyer en début de semaine les taches de la semaine ? Ou en début de mois, les taches du mois ?

cordialement
 

babacool22

XLDnaute Nouveau
Bonjour,

Exactement, c'est tout à fait ce que j'imagine !

Il est vrai que cela peut ressembler à du harcèlement je l'avoue, mais il est prévu que dans la planification des tâches qu'il n'y aura qu'une seule machine en maintenance par semaine ce qui fait que le destinataire n'aura normalement qu'un seul mail par semaine. Mais il est vrai que si l'on se projette et que l'on imagine que d'autre tâches puissent être intégrés il serait peut-être préférable de faire un check-up en début de semaine de ce qu'il y a à faire.
J'arrive maintenant à bien affiché la date du jour de la maintenance dans le corps du mail.
En vous remerciant pour l'intérêt porté à ma problématique.
Cordialement,
 

Pièces jointes

  • Planning maintenance v3.xlsm
    111.7 KB · Affichages: 4
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
RE,

Alors voici votre macro telle que vous l'avez demandée. Vous verrez plus tard, le cas échéant et avec la pratique, ce que vous voudrez faire.

J'y ai mis une petite gestion d'erreur, que vous devrez activer après vos essais en décommentant une ligne de code : ' On Error goto Fin

Faites le quand vous serez certain que la macro ne pose pas de problème. Cette ligne d'instruction pourrait masquer des erreurs qui pourraient être gérées.

P.S. j'ai changé la date de D23 pour test.

Cordialement
 

Pièces jointes

  • Planning maintenance v3.xlsm
    121.9 KB · Affichages: 7

babacool22

XLDnaute Nouveau
RE,

Alors voici votre macro telle que vous l'avez demandée. Vous verrez plus tard, le cas échéant et avec la pratique, ce que vous voudrez faire.

J'y ai mis une petite gestion d'erreur, que vous devrez activer après vos essais en décommentant une ligne de code : ' On Error goto Fin

Faites le quand vous serez certain que la macro ne pose pas de problème. Cette ligne d'instruction pourrait masquer des erreurs qui pourraient être gérées.

P.S. j'ai changé la date de D23 pour test.

Cordialement
Re,

Votre idée d'envoyer en début de semaine les informations contenant les tâches de la semaine me paraît la plus efficace. C'est cette méthode que je vais essayer d'adapter à votre code.
J'ai pu tester votre code et c'est impeccable tout marche comme sur des roulettes. Le seul petit bémol est que je n'arrive toujours pas à faire correspondre la date et la machine sur la quelle la maintenance sera effectué.
Encore une fois merci pour votre précieuse aides ainsi que tout ce que j'ai pu apprendre grâce à vous.
Dans l'attente de vous lire,
Cordialement,
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Voici la même avec la liste des machines à la date de maintenance.
Code:
Sub Envoyer_mail()

    Dim oOutlook As Object  ' Objet application Outlook
    Dim Limite As Date
    Dim c As Range, Plage As Range
    Dim Machines As String
    
    Set Plage = Range("D5:D56")
    
    ' date limite (aujourd'hui + 14 jours)
    Limite = Date + 14


    'Lorsque vous aurez fait vos tests, décochez la ligne suivante
    'pour que les erreurs soient gérées.
    'On Error GoTo FIN

    ' Compter combien de date = limite dans la plage
    ' pour envoyer l'email ou alerter l'utilisateur
    If Application.CountIf(Plage, Limite) > 0 Then
        '
        ' Parcourir les cellules de la plage
        ' à la recherche des machines qui corresponde à la date de maintenance prévue
        ' en construire une liste textuelle pour le corps du message
        For Each c In Plage
            ' le nom de la machine se trouve à 2 colonnes à gauche de la colonne de date
            ' lf = saut de ligne
            If c.Value2 = Limite Then Machines = Machines & lf & c.Offset(, -2)
        Next
        
        ' Création de l'application Outlook
        Set oOutlook = CreateObject("Outlook.Application")    'création d'un objet outlook

        ' Travailler sur un objet email créée
        With oOutlook.CreateItem(olMailItem)
            .Subject = "Alerte maintenance préventive"
            .To = Range("E3")    ' Destinataire
            .Body = "Liste des machines dont la maintenance est prévue le " & _
                    Format(Limite, "dd/mm/yyyy") & " : " & lf & Machines
            .Send        'Display 'afficher le mail avant de l'envoyer ou send pour envoyer
        End With
    Else

        MsgBox "Opération annulée : Aucune tâche n'a été trouvée!", vbInformation, "Envoi mail de rappel"

    End If

FIN:
    '
    ' Si une erreur a été rencontrée, prévenir l'utilisateur
    If Err.Number <> 0 Then
        MsgBox "Opération échouée en raison de l'erreur suivante :" & vbCrLf & vbCrLf & _
               "Numéro de l'erreur: " & Err.Number & vbCrLf & vbCrLf & "Description: " & Err.Description, _
               vbExclamation, "Envoi mail de rappel de tache"
    End If
    '
    On Error GoTo 0
    '
    '   Toujours détruire correctement les variables objets pour éviter les fuites de mémoire
    Set oOutlook = Nothing
End Sub


Cordialement
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Voici une macro faisant la liste des machines de la semaine correspondant à Aujourd'hui + 14:
Si vous ouvrez la fenêtre exécution (CTRL+G) vous y verrez en fin d'exécution de la macro, s'afficher la liste des machines concernées.

J'ai volontairement mis beaucoup de variables, pour que vous puissiez en suivre le cheminement et le comprendre.

La semaine part du lundi au dimanche, mais vous pouvez adapter à l'amplitude de votre semaine.

Code:
Sub MaintenancesDeLaSemaine()
    Dim Lundi As Date, Dimanche As Date, limite As Date
    Dim c As Range, Plage As Range
    Dim Machines As String

    Set Plage = Range("D5:D56")
    limite = Date + 14
    '
    ' Trouver le lundi de la semaine du jour limite
    ' Conversion en 'double' pour faciliter les comparaisons
    Lundi = CDbl(limite - Weekday(limite, vbMonday) + 1)
    Dimanche = CDbl(Lundi + 6)
    '
    ' Utilisation de la fonction NB.SI.ENS pour compter le nombre de machines cette semaine là
    If Application.CountIfs(Plage, ">=" & Lundi, Plage, "<=" & Dimanche) Then
        '
        ' Parcourir la plage à la recherche des dates de la semaine future
        For Each c In Plage
            If c.Value2 >= Lundi And c.Value2 <= Dimanche Then Machines = Machines & lf & c.Offset(, -2)
        Next
    End If
    '
    ' Affichage  dans la fenêtre exécution
    Debug.Print Machines
End Sub

Cordialement
 

babacool22

XLDnaute Nouveau
Re,

Voici la même avec la liste des machines à la date de maintenance.
Code:
Sub Envoyer_mail()

    Dim oOutlook As Object  ' Objet application Outlook
    Dim Limite As Date
    Dim c As Range, Plage As Range
    Dim Machines As String
   
    Set Plage = Range("D5:D56")
   
    ' date limite (aujourd'hui + 14 jours)
    Limite = Date + 14


    'Lorsque vous aurez fait vos tests, décochez la ligne suivante
    'pour que les erreurs soient gérées.
    'On Error GoTo FIN

    ' Compter combien de date = limite dans la plage
    ' pour envoyer l'email ou alerter l'utilisateur
    If Application.CountIf(Plage, Limite) > 0 Then
        '
        ' Parcourir les cellules de la plage
        ' à la recherche des machines qui corresponde à la date de maintenance prévue
        ' en construire une liste textuelle pour le corps du message
        For Each c In Plage
            ' le nom de la machine se trouve à 2 colonnes à gauche de la colonne de date
            ' lf = saut de ligne
            If c.Value2 = Limite Then Machines = Machines & lf & c.Offset(, -2)
        Next
       
        ' Création de l'application Outlook
        Set oOutlook = CreateObject("Outlook.Application")    'création d'un objet outlook

        ' Travailler sur un objet email créée
        With oOutlook.CreateItem(olMailItem)
            .Subject = "Alerte maintenance préventive"
            .To = Range("E3")    ' Destinataire
            .Body = "Liste des machines dont la maintenance est prévue le " & _
                    Format(Limite, "dd/mm/yyyy") & " : " & lf & Machines
            .Send        'Display 'afficher le mail avant de l'envoyer ou send pour envoyer
        End With
    Else

        MsgBox "Opération annulée : Aucune tâche n'a été trouvée!", vbInformation, "Envoi mail de rappel"

    End If

FIN:
    '
    ' Si une erreur a été rencontrée, prévenir l'utilisateur
    If Err.Number <> 0 Then
        MsgBox "Opération échouée en raison de l'erreur suivante :" & vbCrLf & vbCrLf & _
               "Numéro de l'erreur: " & Err.Number & vbCrLf & vbCrLf & "Description: " & Err.Description, _
               vbExclamation, "Envoi mail de rappel de tache"
    End If
    '
    On Error GoTo 0
    '
    '   Toujours détruire correctement les variables objets pour éviter les fuites de mémoire
    Set oOutlook = Nothing
End Sub


Cordialement
Re,

Merci beaucoup pour cette réponse rapide et très claire.
Effectivement tout marche à la perfection ! J'ai essayer de regarder comment je pourrais remplacer le fait d'envoyer le mail 14 jours avant le début de la tâche à envoyer un mail tout les lundis et automatiquement ( sans avoir à cliquer sur "envoyer un mail" ) quand le classeur est ouvert bien sûr. Première bonne piste j'ai réussi à comprendre le code que vous m'avez envoyer, peut-être pas dans son entièreté mais j'ai compris le procédé. Je ne sais pas comment rédiger une récurrence en VBA. De fait à ce que tout les lundis dés 8h si le classeur est ouvert, il doit directement envoyer le mail en question au destinataire. Pensez-vous que ceci est réalisable?
Dans l'attente de vous lire,
Cordialement,
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Voyez la macro que je viens de vous poster (nos réponses se sont télescopées).

Quant à la 'récurrence vba', c'est dans la macro la boucle (les lignes de codes) :
FOR each c in Range("D5: D56")
' Traitement
NEXT

Traduction : Pour Chaque cellule (que je mets dans la variable c) de la plage D5: d56 fait le traitement suivant puis recommence (NEXT) jusqu'à épuisement des cellules de la plage.

cordialement
 

babacool22

XLDnaute Nouveau
Re,

Voici une macro faisant la liste des machines de la semaine correspondant à Aujourd'hui + 14:
Si vous ouvrez la fenêtre exécution (CTRL+G) vous y verrez en fin d'exécution de la macro, s'afficher la liste des machines concernées.

J'ai volontairement mis beaucoup de variables, pour que vous puissiez en suivre le cheminement et le comprendre.

La semaine part du lundi au dimanche, mais vous pouvez adapter à l'amplitude de votre semaine.

Code:
Sub MaintenancesDeLaSemaine()
    Dim Lundi As Date, Dimanche As Date, limite As Date
    Dim c As Range, Plage As Range
    Dim Machines As String

    Set Plage = Range("D5:D56")
    limite = Date + 14
    '
    ' Trouver le lundi de la semaine du jour limite
    ' Conversion en 'double' pour faciliter les comparaisons
    Lundi = CDbl(limite - Weekday(limite, vbMonday) + 1)
    Dimanche = CDbl(Lundi + 6)
    '
    ' Utilisation de la fonction NB.SI.ENS pour compter le nombre de machines cette semaine là
    If Application.CountIfs(Plage, ">=" & Lundi, Plage, "<=" & Dimanche) Then
        '
        ' Parcourir la plage à la recherche des dates de la semaine future
        For Each c In Plage
            If c.Value2 >= Lundi And c.Value2 <= Dimanche Then Machines = Machines & lf & c.Offset(, -2)
        Next
    End If
    '
    ' Affichage  dans la fenêtre exécution
    Debug.Print Machines
End Sub

Cordialement
Re,

J'ai réussi à faire fonctionner cette parcelle de code, qui me donne les machines concernées par la maintenance après aujourd'hui+14 avec aujourd'hui+14 inclus c'est bien cela? Où il devrait trouver toutes les machines concernées ayant des dates entre la date d'aujourd'hui et la date d'aujourd'hui +14? Où alors il donne les maintenances prévu pour la semaine d'aujourd'hui + 14?

Re,

Voyez la macro que je viens de vous poster (nos réponses se sont télescopées).

Quant à la 'récurrence vba', c'est dans la macro la boucle (les lignes de codes) :
FOR each c in Range("D5: D56")
' Traitement
NEXT

Traduction : Pour Chaque cellule (que je mets dans la variable c) de la plage D5: d56 fait le traitement suivant puis recommence (NEXT) jusqu'à épuisement des cellules de la plage.

cordialement

D'accord donc si j'ai bien compris, il va fouiller dans la plage D5:D56 en boucle jusqu'a arriver en bas de la plage? Y'a t'il toujours besoin d'une interraction homme / machine pour envoyer ce mail?
Merci infiniment pour l'aide apporter.
Au plaisir de vous lire,
Cordialement,
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Pour l'instant l'interface homme machine est obligatoire le temps du développement ensuite on pourra à l'ouverture du classeur envoyer le mail.

La macro fait la liste des machines pour la SEMAINE qui contient Aujourd'hui+14
Aujourd'hui +14 = Mardi 8 juin
SEMAINE du mardi 8 juin = Lundi 7 au dimanche 13.


bon je vais être occupé, un moment je repasserai plus tard.

Cordialement
 

babacool22

XLDnaute Nouveau
Re,

Pour l'instant l'interface homme machine est obligatoire le temps du développement ensuite on pourra à l'ouverture du classeur envoyer le mail.

La macro fait la liste des machines pour la SEMAINE qui contient Aujourd'hui+14
Aujourd'hui +14 = Mardi 8 juin
SEMAINE du mardi 8 juin = Lundi 7 au dimanche 13.


bon je vais être occupé, un moment je repasserai plus tard.

Cordialement
Re,

D'accord j'ai saisi !

Très bien, je vais essayer d'avancer en vous attendant, bonne journée à vous et encore merci pour toute l'aide apportée !!

Cordialement
 

babacool22

XLDnaute Nouveau
Bonjour tout le monde, bonjour @Hasco,

J'ai essayer de fusionner les deux codes que vous m'avez fournis la semaine dernière afin d'avoir un bouton permettant d'envoyer un mail concernant les tâches de la semaine contenant aujourd'hui+14.
Résultat de la manipulation: La macro se lance sans erreur sauf que petit bémol, elle n'arrive plus reconnaître les dates correspondant à la semaine contenant aujourd'hui+14. L'erreur prévu dans la macro se lance et m'avertis qu'aucune tâche n'a était trouver.
Comment puis-je faire pour instaurer ce système?
Dans l'attente de vous lire,
Cordialement

VB:
Sub Envoyer_maintenance_de_la_semaine()
    Dim Lundi As Date, Dimanche As Date, limite As Date
    Dim c As Range, Plage As Range
    Dim Machines As String
    Dim oOutlook As Object  ' Objet application Outlook
    
    Set Plage = Range("D5:D56")
    limite = Date + 14
    
      ' Trouver le lundi de la semaine du jour limite
    ' Conversion en 'double' pour faciliter les comparaisons
    Lundi = CDbl(limite - Weekday(limite, vbMonday) + 1)
    Dimanche = CDbl(Lundi + 6)
    '
    ' Utilisation de la fonction NB.SI.ENS pour compter le nombre de machines cette semaine là
    If Application.CountIfs(Plage, ">=" & Lundi, Plage, "<=" & Dimanche) Then
        '
        ' Parcourir la plage à la recherche des dates de la semaine future
        For Each c In Plage
            If c.Value2 >= Lundi And c.Value2 <= Dimanche Then Machines = Machines & lf & c.Offset(, -2)
        Next

    
     ' Création de l'application Outlook
        Set oOutlook = CreateObject("Outlook.Application")    'création d'un objet outlook

        ' Travailler sur un objet email créée
        With oOutlook.CreateItem(olMailItem)
            .Subject = "Alerte maintenance préventive"
            .To = Range("E3")    ' Destinataire
            .Body = "Liste des machines dont la maintenance est prévue cette semaine " & " : " & lf & Machines
            .Display 'afficher le mail avant de l'envoyer ou send pour envoyer
        End With
    Else

        MsgBox "Opération annulée : Aucune tâche n'a été trouvée!", vbInformation, "Envoi mail de rappel"

    End If

FIN:
    '
    ' Si une erreur a été rencontrée, prévenir l'utilisateur
    If Err.Number <> 0 Then
        MsgBox "Opération échouée en raison de l'erreur suivante :" & vbCrLf & vbCrLf & _
               "Numéro de l'erreur: " & Err.Number & vbCrLf & vbCrLf & "Description: " & Err.Description, _
               vbExclamation, "Envoi mail de rappel de tache"
    End If
    '
    On Error GoTo 0
    '
    '   Toujours détruire correctement les variables objets pour éviter les fuites de mémoire
    Set oOutlook = Nothing
End Sub
 

Pièces jointes

  • Planning maintenance v4.xlsm
    113.5 KB · Affichages: 12

Discussions similaires

Réponses
6
Affichages
294

Statistiques des forums

Discussions
312 104
Messages
2 085 335
Membres
102 865
dernier inscrit
FreyaSalander