IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

mail automatique en fonction d'une date


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    technicienne
    Inscrit en
    Septembre 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : technicienne

    Informations forums :
    Inscription : Septembre 2019
    Messages : 13
    Par défaut mail automatique en fonction d'une date
    Bonjour

    je vous explique mon petit problème (déjà savoir si cela est faisable ^^")

    je travaille en agroalimentaire et des fois nous avons besoin de faire un suivi sur nos produits a des dates spécifiques,

    et j'aimerai avoir un mail quand la date de sortie de ce produit est le jour même (ou du jour passé lorsque c'est le week end, histoire que lundi matin on reçoive les mails des produits qui sont sorti samedi dimanche et le lundi en question) pas sur d’être bien clair.

    ce fichier est partagé sur plusieurs postes et ce qui serait génial :
    - C'est que lorsque que quelqu'un ouvre ce fichier les mails partent à un certains nombre de destinataire prédéfini (4 maxi).
    - Que le mail soit envoyé qu'une seul fois dans la journée et ne soit plus renvoyer sur la même chose les jours suivant.


    Je vous joint le fichier en question pour être plus clair. (j'ai office 2016 et on a un PC avec office 2010)

    merci d'avance pour votre aide qui est toujours très précieuse
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Par défaut
    Bonjour à tous,

    Je ne suis pas un expert en VBA,
    mais oui cela est réalisable,
    il faudra ajouter (pour moi) 2 colonnes pour filtrer les dates,

    il n'y aura pas besoin d'ouvrir Excel, en créant une tâche planifiée sous Windows qui lancera tous les lundis à une heure précise un fichier VBScript (fichier *.vbs)
    qui lui à son tour :
    _ ouvrira Excel
    _ enverra les 4 mails via Outlook
    _ et refermera Excel.

    la tâche planifiée pourra être crée soit manuellement, soit en créant un AutoExecutable (fichier *.bat) via PowerShell (plus facile pour moi).
    cela paraît compliqué, mais j'ai 2 tâches planifiées qui s'exécutent automatiquement,
    une les jours de la semaine et une autre à une date bien précise pour me rappeler de renouveler certains documents (pour cette deuxième tâche, la date est automatiquement modifiée avec le fichier *.bat).

  3. #3
    Membre habitué
    Femme Profil pro
    technicienne
    Inscrit en
    Septembre 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : technicienne

    Informations forums :
    Inscription : Septembre 2019
    Messages : 13
    Par défaut
    Bonjour

    et merci d'avoir pris le temps de lire mon message

    effectivement ce serait un truc comme cela qu'il me faudrait mais avec le scrip qui analyse tous les jours si des produits sortent a cette date (car il arrive souvent qu'il n'y pas de sortie de produit prévu et donc pas besoin d'envoi de mail)

    a voir comment le mettre en place par contre :/

  4. #4
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    bonjour
    aussi autodidacte VBA donc on va commencer par tester le code avec un bouton de commande et puis on va intégrer le code dans workbook_open
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub test()
    Dim w1 As Worksheet
    Dim i As Long
    Dim D As Date
    Dim M As Object, OlApp As Object, Destinataire As String
    Application.ScreenUpdating = False
    D = Date
    Set w1 = Worksheets("Feuil1")
    Destinataire = "bennasr******@y****.fr" 'introduire votre mail ici
    For i = 2 To w1.Range("I" & Rows.Count).End(xlUp).Row
     
    On Error Resume Next
    If w1.Cells(i, "I") = D And w1.Cells(i, "I") <> "" Then
     
    w1.Cells(i, "J") = "Email Envoyé"
    Set OlApp = CreateObject("Outlook.application")
    Set M = OlApp.CreateItem(olMailItem)
    With M
    .Subject = "La date d'étalonnage de l'équipement suivant arrive à expiration ce mois-ci"
    .Body = w1.Cells(i, "A")
    .Recipients.Add Destinataire
    .Send
    End With
    End If
    Next i
    Application.ScreenUpdating = True
    End Sub

  5. #5
    Membre habitué
    Femme Profil pro
    technicienne
    Inscrit en
    Septembre 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : technicienne

    Informations forums :
    Inscription : Septembre 2019
    Messages : 13
    Par défaut
    Bonjour merci à toi

    j'ai mis en place le code mais je n'arrive pas à l'associer a un bouton et je ne sais pas si elle fonctionne du coup :/

  6. #6
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    teste ça svp
    Fichiers attachés Fichiers attachés

  7. #7
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Par défaut
    Citation Envoyé par TonyNiort79 Voir le message
    Bonjour à tous,

    Je ne suis pas un expert en VBA,
    mais oui cela est réalisable,
    il faudra ajouter (pour moi) 2 colonnes pour filtrer les dates,

    il n'y aura pas besoin d'ouvrir Excel, en créant une tâche planifiée sous Windows qui lancera tous les lundis à une heure précise un fichier VBScript (fichier *.vbs)
    qui lui à son tour :
    _ ouvrira Excel
    _ enverra les 4 mails via Outlook
    _ et refermera Excel.

    la tâche planifiée pourra être crée soit manuellement, soit en créant un AutoExecutable (fichier *.bat) via PowerShell (plus facile pour moi).
    cela paraît compliqué, mais j'ai 2 tâches planifiées qui s'exécutent automatiquement,
    une les jours de la semaine et une autre à une date bien précise pour me rappeler de renouveler certains documents (pour cette deuxième tâche, la date est automatiquement modifiée avec le fichier *.bat).
    Bonjour les amis,
    je ne vous ai pas oublié, mais 5mn plus tard je partais au travail,
    je n'ai pas beaucoup de temps devant moi car je cuisine aussi,
    et aujourd'hui pizza maison avec un bon gâteau au pommes avec la famille et amis,
    j'ai presque terminé le programme qu'il faudra adapter car je ne connais pas l'unité ni les chemins fichiers,
    j'ai presque résolu le problème des filtres automatiques comme cela il n'y aura pas besoin d'ajouter d'autres colonnes,
    à bientôt car le four me réclame.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Par défaut
    Bonjour à tous,

    Ci-dessous les explications pour l’envoi d’un mail automatique sous Excel, Via le Planificateur des tâches de Windows comprenant diverses étapes avec quelques fichiers et leurs langages informatiques :

    Pour m’y retrouver dans une tâche planifiée, je dois structurer mes fichiers,
    je crée donc un répertoire "TachePlanifiee" sur le lecteur de mon choix
    (ou plutôt du lecteur qui est à ma disposition), mon seul choix (pour moi bien entendu)
    c’est le répertoire " I:\TachePlanifiee\SuiviProduits"

    Ma méthode :
    nommer les fichiers par ordre alphabétiques AB, AC, AD, etc... (pas de numérique, pas d’accents …), comme pour cet exemple :
    ABcreationTacheSuiviProduits.bat
    ACcommandeLancementBatchVBS.bat
    ADbatchLancementVBAExcel.vbs
    Suivi Des réincubations.xlsm

    Ce qui nous donnera cela,
    Nom : GestionnaireFichiers.jpg
Affichages : 1577
Taille : 40,2 Ko

    Le raccourci "Task Scheduler" n'est pas obligatoire, mais il me permet de vérifier immédiatement si la tâche est bien prise en compte dans le Planificateur des tâches, tout comme le fichier Excel qui sera dans son emplacement prévu.

    Les fichiers "*.bat" et "*.vbs" seront créés avec le Bloc-Notes en fichier texte, Puis il faudra changer l'extension "*.txt"

    Dans un premier temps j'ajoute donc l'extension "*.txt ", cela me permet de ne pas lancer le programme en double-cliquant par erreur ou autre.
    Cette extension je la supprimerai une fois le fichier terminé.

    ABcreationTacheSuiviProduits.bat.txt
    Pour plus de facilité je copie directement le code ci-dessous dans un fichier texte avec le Bloc-Notes

    Nom : Exemple Batch AB.jpg
Affichages : 1570
Taille : 44,6 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @echo off
    echo Importing All Tasks
    echo.
    schtasks.exe /create /TN "ProchaineDate" /F /SC weekly /D MON /SD 11/11/2019 /ST 09:00:00 /TR "'I:\TachePlanifiee\SuiviProduits\ACcommandeLancementBatchVBS.bat'"
    echo.
    Des explications bien entendu (à ma portée d'autodidacte) sur le "Batch file" (fichier batch)
    La ligne "Importing All Task", veut dire que sous echo. Nous pouvons mettre plusieurs tâches planifiées sur plusieurs lignes, je n'ai pas trouvé mieux comme programme pour insérer une tâche planifiée.

    schtasks.exe Programme Planificateur des tâches
    /create création d'une tâche planifiée
    /TN "ProchaineDate" Nom de la tâche planifiée (TaskName)
    /SC weekly tâche Hebdomadaire
    /F Une valeur qui crée avec force la tâche et supprime les avertissements si la tâche spécifiée existe déjà (aide Windows)
    /D MON D pour Date et MON pour le Lundi (MONday)
    /SD date de départ de la tâche planifiée (StartDate)
    /ST heure de départ de la tâche planifiée (StartTime)
    /TR le chemin et le nom du fichier Batch à lancer (les lettres AC servent uniquement pour l'ordre chronologique des événements)

    Pour des adaptations quelques exemples très utiles :
    https://docs.microsoft.com/en-us/pre...ectedfrom=MSDN

    Pour ceux qui veulent créer une tâche manuellement :
    https://jpcheck.developpez.com/tutor...ous-windows-7/

    Pour des explications sur les fichiers Batch :
    https://windows.developpez.com/cours/ligne-commande/


    Une fois que nous avons créé la tâche il faut la vérifier,
    Je double-clic sur le Planificateur des tâches (Le raccourci "Task Scheduler" m'est bien utile)

    Et cela nous donne : (je clique sur la bibliothèque du Planificateur de tâches à gauche)
    Je selectionne ma tâche "ProchaineDate" qui se trouve sur la droite en bas

    Puis plus bas sur l'onglet "Déclencheurs",
    Confirmation, la tâche se déclenchera toutes les semaines à 7h40, tous les lundis à partir du 07/10/2019

    Nom : Détail planificateur Déclencheur.jpg
Affichages : 1607
Taille : 133,4 Ko

    Je clique maintenant sur l'onglet "Actions"
    Là aussi nous voyons que la tâche démarre un programme avec le chemin complet de ce fichier "*.bat"

    Nom : Détail planificateur Actions.jpg
Affichages : 1616
Taille : 113,2 Ko

    La tâche est insérée, nous pouvons refermer le Planificateur de tâches
    Si nous voulons modifier les paramètres nous pouvons le faire :
    Soit manuellement
    Soit en modifiant le fichier sans modifier le nom de la tâche, puis double-clic


    Passons maintenant au prochain fichier : ACcommandeLancementBatchVBS.bat
    Là aussi j'ajoute une extension .txt que je supprimerai après.
    Nous copions le code ci-dessous dans un nouveau fichier du Bloc-Notes


    Explications : il y a 2 commandes, cscript.exe lancera le fichier VBS qui ouvrira à son tour Excel,
    Ne pas oublier d'enlever l'extension "*.txt"

    Nom : Détail AC.jpg
Affichages : 1549
Taille : 25,9 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\windows\system32\cscript.exe I:\TachePlanifiee\SuiviProduits\ADbatchLancementVBAExcel.vbs
    prochain fichier : ADbatchLancementVBAExcel.vbs
    n'oublions pas que Excel et Outlook sont fermés
    dans ce fichier nous écrivons comme du VBA, nous pouvons écrire toute la procédure Excel,
    mais je préfère juste lancer la macro qui se trouvera dans le fichier concerné,
    comme ça, je pourrai l'utiliser dans une autre tâche, ce que je fais actuellement.

    Ne pas oublier l'ajout de l'extension "*.txt" qui sera supprimée après,
    Ajouter le code suivant (à adapter bien sûr suivant vos chemins répertoires et fichiers)

    Nom : Détail fichier VBS.jpg
Affichages : 1612
Taille : 71,3 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
    On Error Resume Next
    ExempleMacroExcel
    Sub ExempleMacroExcel()
    Dim ApplicationExcel
    Dim ClasseurExcel
    Set ApplicationExcel = CreateObject("Excel.Application")
    Set ClasseurExcel = ApplicationExcel.Workbooks.Open("I:\TachePlanifiee\SuiviProduits\Suivi Des reincubations.xlsm")
    ApplicationExcel.Visible = False
    ApplicationExcel.Run "EnvoiMails"
    ApplicationExcel.Quit
    Set ClasseurExcel = Nothing
    Set ApplicationExcel = Nothing
    End Sub
    Enfin le fichier Excel : Suivi Des reincubations.xlsm
    Pour cette discussion, si j'ai bien compris :
    Ouverture Excel le lundi
    Lancement d'un mail a 4 destinataires pour prévenir des produits qui sont sorti le samedi, le dimanche et le lundi.
    Pour cela :
    Filtre automatique des dates concernées
    Création PDF des lignes concernées
    Envoi de 4 mails

    Dans le fichier j'ajouterai un onglet "Signature_Mails" qui pourra être masqué pour éviter toutes modifications
    Nous pouvons ajouter plusieurs destinataires sur une même ligne, les adresses devront êtres séparées d'un point-virgule ";" en "A20" "A21" "A22" "A23"

    Nom : SignatureMail.jpg
Affichages : 1620
Taille : 41,1 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    Sub EnvoiMails()
     
    Dim CheminSuiviProduits As String
    CheminSuiviProduits = "I:\TachePlanifiee\SuiviProduits\"
     
    Dim DatePlus1Jour As Date
    Dim DateMoins3Jours As Date
    DatePlus1Jour = Date + 1
    DateMoins3Jours = Date - 3
    Sheets("Feuil1").Select
     
    'Filtre automatique
    ActiveSheet.Range("Zone_d_impression").AutoFilter Field:=9, Criteria1:=">" & Format(DateMoins3Jours, "mm/dd/yyyy"), Operator:=xlAnd, Criteria2:="<" & Format(DatePlus1Jour, "mm/dd/yyyy")
     
    'Verification des dates a sortir avec Sous.Total
    Dim NbreDate As Integer
    NbreDate = WorksheetFunction.Subtotal(3, Sheets("Feuil1").Columns("I:I"))
    If NbreDate - 1 <= 1 Then GoTo PasDeMail:
     
    'Creation du fichier PDF qui sera envoye par mail
    Dim NomExcel As String
    Dim NomPdf As String
    NomExcel = ThisWorkbook.Path & "\" & ThisWorkbook.Name
    NomPdf = Left(NomExcel, Len(NomExcel) - 4) & "pdf"
    Sheets("Feuil1").Select
    Range("Zone_d_impression").Select
         Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:=NomPdf _
         , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
         :=False, OpenAfterPublish:=False
     
    'Creation de mail Via l'Onglet "Signature-Mail"
        Dim Phrase1 As String
        Dim Phrase2 As String
        Dim Phrase3 As String
        Dim Phrase4 As String
        Dim Phrase5 As String
        Dim Phrase6 As String
        Dim Phrase7 As String
        Dim Phrase8 As String
        Dim Phrase9 As String
        Dim Phrase10 As String
        Sheets("Signature_Mail").Visible = True
        Sheets("Signature_Mail").Select
        Phrase1 = Sheets("Signature_Mail").Range("A1")
        Phrase2 = Sheets("Signature_Mail").Range("A2")
        Phrase3 = Sheets("Signature_Mail").Range("A3")
        Phrase4 = Sheets("Signature_Mail").Range("A4")
        Phrase5 = Sheets("Signature_Mail").Range("A5")
        Phrase6 = Sheets("Signature_Mail").Range("A6")
        Phrase7 = Sheets("Signature_Mail").Range("A7")
        Phrase8 = Sheets("Signature_Mail").Range("A8")
        Phrase9 = Sheets("Signature_Mail").Range("A9")
        Phrase10 = Sheets("Signature_Mail").Range("A10")
     
        Dim OutApp As Object
        Dim OutMail As Object
        Dim strbody As String
        Dim SigString As String
        Dim Signature As String
        Dim SigLogo As String
        Dim NomSujet As String
        NomSujet = "Liste des produits a sortir en date du " & Date
     
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
     
     
    strbody = "<p>" & Phrase1 & "<p>" & _
                Phrase2 & "<br>" & _
                Phrase3 & "<br>" & _
                Phrase4 & "<br>" & _
                Phrase5 & "<br>" & _
                "<B>" & Phrase6 & "</B><br> " & _
                Phrase7 & "<br> " & _
                Phrase8 & "<br> " & _
                Phrase9 & "<br>" & _
                Phrase10 & "<br>"
     'langage HTML
     '<p> sauter une ligne
     '<br> a la ligne
     '</B> en gras
     
        On Error Resume Next
        With OutMail
            .To = Sheets("Signature_Mail").Range("A20").Value
            .CC = Sheets("Signature_Mail").Range("A21").Value & ";" & Sheets("Signature_Mail").Range("A22").Value & ";" & Sheets("Signature_Mail").Range("A23").Value
            .BCC = ""
            .Subject = NomSujet
            .HTMLBody = strbody ' & "<img src='" & CheminFichier & "\" & "NomImage.png'></img></html>"
     
            'demande un accuse de reception
            '.OriginatorDeliveryReportRequested = True
            'demande un accuse de lecture
            '.ReadReceiptRequested = True
            .Attachments.Add NomPdf
            .Send
            '.Display
        End With
     
        On Error GoTo 0
        Set OutMail = Nothing
        Set OutApp = Nothing
     
    NomExcel = ThisWorkbook.Path & "\" & ThisWorkbook.Name
    NomPdf = Left(NomExcel, Len(NomExcel) - 4) & "pdf"
     
    Kill NomPdf
     
    Sheets("Signature_Mail").Visible = False
    Sheets("Feuil1").Range("A1").Select
     
    PasDeMail:
    ActiveSheet.Range("Zone_d_impression").AutoFilter
    ActiveWorkbook.Close SaveChanges:=False
    End Sub
    Concernant le Powershell, j'ai été un peu vite, cette commande me sert pour modifier la date du fichier ABcreationTache.Bat si des dates ne se suivent pas, ce qui n'est pas le cas ici.

  9. #9
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    Bonjour TonyNiort79, la forum
    Merci pour les efforts déployés et les explications très claires ( au moins pour moi) qui seront très utiles pour plusieurs membres du site et/ou autres internautes passagers
    Respect Monsieur et bonne journée

  10. #10
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Par défaut
    Bonjour à tous,
    merci beaucoup cela me touche très fort,

    Tout cela c'est grâce à tous en faisant des recherches et des assemblages de codes car je suis loin d'être aussi performant que la très grande majorité du site
    j'essaye d'aider avec le peu de connaissances que j'ai,

    s'il faut adapter le programme avec des dates non-ponctuelles suivant un tableau,
    je pourrai aider aussi avec quelques commandes supplémentaires en faisant modifier la date de la tâche planifiée

    Salut à tous.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Par défaut
    Citation Envoyé par BENNASR Voir le message
    Bonjour TonyNiort79, la forum
    Merci pour les efforts déployés et les explications très claires ( au moins pour moi) qui seront très utiles pour plusieurs membres du site et/ou autres internautes passagers
    Respect Monsieur et bonne journée
    Bonjour BENNASR, bonjour le Forum,
    Une variante pour l'envoi d'un mail automatique sous Excel via le Planificateur des tâches de Windows

    Cette fois-ci au lieu de se déclencher avec une date ponctuelle (notre précédent cas : tous les lundis),
    ce sera Excel avec toute sa magie qui insérera une date dans le Planificateur des tâches suivant un tableau de suivi.

    En effet le 1er fichier AB_CreationTache qui ne servait pour le cas précédent qu'une seule fois pour créer la tâche planifiée
    sera modifié et exécuté par Excel avec la commande Shell,
    puis le jour J à l'heure H, le planificateur des tâches lancera le fichier AC_ qui lancera le fichier AD_ qui lancera Excel …
    la boucle est bouclée.

    Le nombre de fichiers ne change pas, par contre j'ai changé les noms pour une meilleure lisibilité
    Pour cette fois, je prendrai comme exemple le suivi des Habilitations.

    Nous aurons donc dans un répertoire " I:\TachePlanifiee\TachePlanAlerteSuiviHabilitations" des fichiers de type :

    AB_CreationTacheAlerteSuiviHabilitations.bat
    qui insérera une date dans le planificateur des tâches

    AC_LancementVBS.bat
    programme Script.exe qui lancera le VBScript

    AD_LancementVBAExcel.vbs
    qui lancera Excel et sa procédure

    Nom : CheminFichier.jpg
Affichages : 221
Taille : 38,7 Ko

    Vous me direz pourquoi ne pas lancer directement le VBScript directement avec le planificateur des tâches ?
    C'est ce que je faisais au début, puis avec les mises à jour, une fenêtre s'ouvrait et me demandait :
    Avec quel programme voulez-vous ouvrir le fichier AD_LancementVBAExcel.vbs ?
    Je n'ai plus de problèmes avec le fichier intermédiaire AC où j'indique clairement le Script.exe.

    Passons au premier fichier qui cette fois-ci aura la commande ONCE (tâche unique) au lieu de WEEKLY (tâche hebdomadaire)
    AB_creationTacheAlerteSuiviHabilitations.bat.txt
    N'oublions pas d'enlever l'extension .txt

    Nom : CodeAB.jpg
Affichages : 208
Taille : 48,2 Ko

    Quelques explications sur ce "Batch file" (fichier batch)

    schtasks.exe
    Programme Planificateur des tâches

    /create
    création d'une tâche planifiée

    /TN "AlerteSuiviHabilitations"
    Nom de la tâche planifiée (TaskName)

    /F
    Une valeur qui crée avec force la tâche et supprime les avertissements si la tâche spécifiée existe déjà (aide Windows)

    /SC ONCE
    tâche unique qui ne s'exécutera qu'une seule fois, mais Excel prendra le relais pour la boucle dans sa procédure

    /SD
    date de départ de la tâche planifiée (StartDate), si vous lancez la procédure avec Excel,
    mettre la Date du jour car quand le Planificateur des tâches se déclenchera,
    Excel remplacera la date du jour par la prochaine date à planifier.

    /ST
    heure de départ de la tâche planifiée (StartTime)

    /TR
    le chemin et le nom du fichier Batch à lancer (les lettres AC servent uniquement pour l'ordre chronologique des événements)

    Pour des adaptations beaucoup d'exemples très utiles (voir dans les pages plus bas) :
    https://docs.microsoft.com/en-us/pre...ectedfrom=MSDN

    Vérification de la nouvelle tâche, double-clic sur le Planificateur des tâches, voir dans la bibliothèque du Planificateur de tâches à gauche)
    Cette fois-ci, je sélectionne la tâche " AlerteSuiviHabilitations " qui se trouve sur la droite en bas

    Puis plus bas sur l'onglet "Déclencheurs", puis onglet "Actions"

    Si nous voulons modifier les paramètres nous pouvons toujours le faire :
    Soit manuellement
    Soit en modifiant le fichier sans modifier le nom de la tâche, puis double-clic

    AC_LancementVBS.bat et AD_LancementVBAExcel.vbs, vous connaissez la procédure : cette fois-ci la macro s'appellera "AlerteSuiviHabilitationsTachePlanifieeReconduction"
    nom très long j'en conviens, mais chacun est libre du nom

    Enfin le fichier Excel : Suivi Des Habilitations.xls

    Le cahier des charges
    (citation qui me plaît beaucoup empruntée à Pierre Fauconnier dont je salue au passage, moi qui croyait connaître parfaitement la fonction RechercheV, à savoir une seule commande, Je m'aperçois après lecture de son tutoriel que ma palette ne contenait qu'une seule couleur, un conseil à tous, aller visiter les Tutos de Pierre Fauconnier même pour les fonctions les plus simples, et votre palette sera beaucoup plus riche, n'oublions pas non-plus tous les autres qui ont contribués à élargir mes connaissances dans beaucoup de domaines),

    Revenons au cahier des charges :
    Ouverture d'Excel à la prochaine date de reconduction des habilitations,
    Pour cela nous ferons un filtre automatique des habilitations concernées,
    Création d'un PDF puis envoi d'un mail aux destinataires suivant :
    1er destinataire : moi-même pour me rappeler
    2ème destinataire : mon supérieur hiérarchique pour l'aviser
    3ème destinataire : le responsable des reconductions des habilitations

    Nom : TableauSuiviHabilitations.jpg
Affichages : 378
Taille : 104,1 Ko

    Bien entendu, je n'oublie pas l'onglet "Signature_Mails" qui pourra être masqué pour éviter toutes modifications
    En "A2" la procédure insèrera le texte suivant une plusieurs lignes trouvées

    Nom : SignatureMail.jpg
Affichages : 309
Taille : 36,2 Ko

    et enfin la procédure
    dans cette procédure il y a 2 sauts au cas où il n'y a pas de création de PDF et du coup rien à envoyer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    Sub AlerteSuiviHabilitationsTachePlanifieeReconduction()
     
    Dim DateMiniReconduction As Date 'Reconduction tous les 2 ans
     
    Dim ZoneFiltreAutomatique As Range ' Plage zone tableau filtre automatique
    Sheets("Feuille1").Select
    Range("A10:R10").Select
    Set ZoneFiltreAutomatique = Range(Selection, Selection.End(xlDown)) 'affectation de la plage du filtre automatique
     
    Dim ZoneImpression As Range ' Plage Zone d'impression
    Dim QuantiteLignes As Integer
    Sheets("Feuille1").Select
    Range("A10").Select
    QuantiteLignes = Range(Selection, Selection.End(xlDown)).Count
    Set ZoneImpression = Range("A1:R" & 9 + QuantiteLignes) 'affectation de la zone d'impression soit zone impression plus 9 premieres lignes
    Sheets("Feuille1").Select
     
    'Enlevement filtres automatiques
        With Worksheets("Feuille1")
            If .FilterMode = True Then .ShowAllData
        End With
     
    'nombre de dates uniques pour l'organisme Reconduction soit tous les 2 ans
        Dim DateReconductionUnique As Integer
        Dim I As Long
        Dim colNbrReconduction As New Collection
        I = 11 ' Ici on demarre en ligne 11
        Do While ThisWorkbook.Worksheets("Feuille1").Range("E" & I).Value <> ""
            On Error Resume Next
            colNbrReconduction.Add ThisWorkbook.Worksheets("Feuille1").Range("E" & I).Value, CStr(ThisWorkbook.Worksheets("Feuille1").Range("E" & I).Value)
            I = I + 1
        Loop
        DateReconductionUnique = colNbrReconduction.Count
     
     
    ' attribution nouvelle date Reconduction superieure a la date du jour (pour la tache planifiee)
        Dim PlageDateReconduction As Range
        Sheets("Feuille1").Select
        Range("E10").Select
        Set PlageDateReconduction = Range(Selection, Selection.End(xlDown)) 'affectation de la plage des dates Organisme Reconduction
        Dim PetiteValeurReconduction As Date
        Dim CompteurPetiteValeurReconduction As Integer
     
        CompteurPetiteValeurReconduction = 1
        While Date >= PetiteValeurReconduction
            PetiteValeurReconduction = WorksheetFunction.Small(PlageDateReconduction, CompteurPetiteValeurReconduction)
            CompteurPetiteValeurReconduction = CompteurPetiteValeurReconduction + 1
        Wend
     
        CompteurPetiteValeurReconduction = CompteurPetiteValeurReconduction - 1
        DateMiniReconduction = WorksheetFunction.Small(PlageDateReconduction, CompteurPetiteValeurReconduction) 'pour les taches planifiees
     
    'recherche QualificationsHabilitations perimees a la date du jour
        Dim DateReconductionPerimee As Date
        If Application.Min(Columns("E:E")) < Date Then
                ZoneFiltreAutomatique.AutoFilter Field:=5, Criteria1:="<=" & Format(Date, "mm/dd/yyyy"), Operator:=xlAnd
     
     
    'creation du fichier PDF QualificationsHabilitations perimees
        Dim NomPdfReconductionPerimee As String
        Dim CheminFichier As String
        CheminFichier = "I:\TachePlanifiee\TachePlanAlerteSuiviHabilitations\SuiviHabilitations"
        NomPdfReconductionPerimee = CheminFichier & "\" & "Reconduction Habilitation par organisme (tous les 2 ans).pdf"
        Dim CompteurHabilitationsPerimee As Integer
        Dim QualificationsHabilitations2ansPerimee As String
        CompteurHabilitationsPerimee = WorksheetFunction.Subtotal(3, PlageDateReconduction) - 1
     
       'Saut Du premier Pave de commande s'il n'y a rien a envoyer
        If CompteurHabilitationsPerimee = 0 Then GoTo SautPremierPave:
     
        ZoneImpression.Select
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:=NomPdfReconductionPerimee _
        , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
        :=False, OpenAfterPublish:=False
     
    'phrase ecrite en "A2"
        If CompteurHabilitationsPerimee = 1 Then
        QualificationsHabilitations2ansPerimee = "il y a " & CompteurHabilitationsPerimee & " Habilitation a reconduire par un organisme"
        ElseIf CompteurHabilitationsPerimee > 1 Then
        QualificationsHabilitations2ansPerimee = "il y a " & CompteurHabilitationsPerimee & " Habilitations a reconduire par un organisme"
        End If
     
    SautPremierPave:
    'Enlevement filtres automatiques
        With Worksheets("Feuille1")
        If .FilterMode = True Then .ShowAllData
        End With
        End If
     
    'programmation de la prochaine date de tache planifiee
        Dim ReplaceValues As Variant
        ReplaceValues = DateMiniReconduction
     
        Dim FileName As String
        Dim FSO As Object
        Dim FindValues As Variant
     
        Dim Text As String
        Dim TextFile As Object
        Dim Wks As Worksheet
     
    'Remplacement date dans le fichier creation tache planifiee
        FileName = CheminFichier & "\" & "AB_CreationTacheAlerteSuiviHabilitationsLigneDeCommandeBat.bat"
        Set Wks = Worksheets("Feuil1")
        FindValues = Date
        Set FSO = CreateObject("Scripting.FileSystemObject")
        Set TextFile = FSO.OpenTextFile(FileName, 1, False)
        Text = TextFile.ReadAll
        TextFile.Close
        Text = Replace(Text, FindValues, ReplaceValues)
     
        Set TextFile = FSO.OpenTextFile(FileName, 2, False)
        TextFile.Write Text
        TextFile.Close
     
    'Planification de la prochaine tache planifiee avec la commande Shell
        Shell "cmd /c" & CheminFichier & "\" & "AB_CreationTacheAlerteSuiviHabilitationsLigneDeCommandeBat.bat"
        Sheets("Feuille1").Select
        Range("A10").Select
     
    'Saut du deuximee Pave de commande s'il n'y a rien a envoyer
        If CompteurHabilitationsPerimee = 0 Then GoTo SautDeuxiemePave:
     
    'envoi par mail
        Dim Phrase1 As String
        Dim Phrase2 As String
        Dim Phrase3 As String
        Dim Phrase4 As String
        Dim Phrase5 As String
        Dim Phrase6 As String
        Dim Phrase7 As String
        Dim Phrase8 As String
        Dim Phrase9 As String
        Dim Phrase10 As String
        Sheets("Signature_Mail").Visible = True
        Sheets("Signature_Mail").Range("A2") = QualificationsHabilitations2ansPerimee
     
        Sheets("Signature_Mail").Select
        Phrase1 = Sheets("Signature_Mail").Range("A1")
        Phrase2 = Sheets("Signature_Mail").Range("A2")
        Phrase3 = Sheets("Signature_Mail").Range("A3")
        Phrase4 = Sheets("Signature_Mail").Range("A4")
        Phrase5 = Sheets("Signature_Mail").Range("A5")
        Phrase6 = Sheets("Signature_Mail").Range("A6")
        Phrase7 = Sheets("Signature_Mail").Range("A7")
        Phrase8 = Sheets("Signature_Mail").Range("A8")
        Phrase9 = Sheets("Signature_Mail").Range("A9")
        Phrase10 = Sheets("Signature_Mail").Range("A10")
     
        Dim OutApp As Object
        Dim OutMail As Object
        Dim strbody As String
        Dim SigString As String
        Dim Signature As String
        Dim SigLogo As String
        Dim NomSujet As String
        NomSujet = "Reconduction Habilitations"
     
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
     
    strbody = "<p>" & Phrase1 & "<p>" & _
                Phrase2 & "<br>" & _
                Phrase3 & "<p>" & _
                Phrase4 & "<br>" & _
                Phrase5 & "<P>" & _
                "<B>" & Phrase6 & "</B><br> " & _
                Phrase7 & "<br> " & _
                Phrase8 & "<br> " & _
                Phrase9 & "<br>" & _
                Phrase10 & "<br>"
     
     ' Langage HTML
     '<p> saut d'une ligne
     '<br> aller a la ligne
     '<B> Police en Gras
     
     
        On Error Resume Next
        With OutMail
            .To = Sheets("Signature_Mail").Range("A20").Value
            .CC = Sheets("Signature_Mail").Range("A21").Value & ";" & Sheets("Signature_Mail").Range("A22").Value & ";" & Sheets("Signature_Mail").Range("A23").Value
            .BCC = ""
            .Subject = NomSujet
            .HTMLBody = strbody & "<img src='" & CheminFichier & "\" & "logo.png'></img></html>" 'pour inserer un logo ou une image
            'demande un accuse de reception
            '.OriginatorDeliveryReportRequested = True
            'demande un accuse de lecture
            '.ReadReceiptRequested = True
            .Attachments.Add NomPdfReconductionPerimee
            .Send   'or use
            '.Display
        End With
     
        On Error GoTo 0
        Set OutMail = Nothing
        Set OutApp = Nothing
     
    Sheets("Signature_Mail").Visible = False
    SautDeuxiemePave:
    ActiveWorkbook.Close SaveChanges:=False
     
    End Sub

Discussions similaires

  1. [XL-2010] Mail alerte en fonction d'une date
    Par luis18 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/12/2013, 19h44
  2. [AC-2010] Mailing Automatique en fonction de la date
    Par FishAndChips dans le forum VBA Access
    Réponses: 10
    Dernier message: 11/09/2012, 16h44
  3. Envoie mail automatique en fonction d'une date
    Par ju3979 dans le forum Macros et VBA Excel
    Réponses: 39
    Dernier message: 29/06/2009, 14h07
  4. Réponses: 2
    Dernier message: 25/09/2007, 20h03
  5. Réponses: 2
    Dernier message: 03/10/2005, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo