Execution macro programmée

Bonjour,

Je souhaiterai programmer une macro afin qu'elle s'exécute tout les 7 jours ou des qu'on dépasse 7 jours.

cependant, le fichier n'est pas ouvert en permanence mais il est ouvert plusieurs fois par jour.

(il m'est impossible d'utilise la programmation d'ouverture d'un fichier via Windows et d'exécuter la macro a l'ouverture)

ceci me permettra d'envoyer 1 fois par semaine un rapport par mail

Cordialement.

Bonjour,

Une façon très simple, c'est de stocker dans un Nom (Name) invisible la date du jour où la macro est exécutée et à chaque ouverture du classeur, on compare les dates et si c'est égal ou supérieur à 7, on lance la macro. Un exemple à mettre dans le module du classeur :

Private Sub Workbook_Open()

    Dim Nom As Name

    'évite l'erreur provoquée par l'inexistance du nom
    On Error Resume Next
    Set Nom = ThisWorkbook.Names("Jour")

    'si le nom n'existe pas, le crée avec comme valeur la date du jour
    If Err.Number <> 0 Then

        ThisWorkbook.Names.Add "Jour", Date, False

    Else

        'sinon, compare la date du jour à la date stocké dans le nom
        'et si c'est égat ou supérieur à 7, la condition est remplie...
        If Date - CDate(Right(Nom, Len(Nom) - 1)) >= 7 Then

            'dans ce cas, on mémorise la date du jour pour
            'une exécution de la macro dans 7 jours ou plus
            ThisWorkbook.Names.Add "Jour", Date, False

            'ici l'appel de ta macro...

        End If

    End If

End Sub

Si tu veux tester, tu rentres dans ce nom la date d'aujourd'hui - 7 et tu exécute la macro avec F8 pour voir le comportement. Donc, tout d'abords, tu exécutes la macro "Workbook_Open()" ci-dessus. Tu n'es pas obligé de fermer et ré-ouvrir le classeur, comme la macro n'attend pas d'argument, tu poses ton curseur dedans puis F5 ensuite, tu exécutes la ligne de code ci-dessous de la même manière (il n'y aura pas d'erreur car tu viens de créer le nom) puis à nouveau "Workbook_Open" mais avec F pour voir le déroulement :

Sub Test()

    ThisWorkbook.Names.Add "Jour", Date - 7, False

End Sub

Je vous avoue que je n'est pas compris le fonctionnement

Bonjour,

Tu colles le code que je t'ai donné dans le module du classeur et à chaque ouverture de ce dernier, la macro va contrôler si depuis le dernier enregistrement de la date dans le nom "Jour" (et donc la dernière exécution de ta procédure) il c'est passé plus de 6 jours (7 ou plus) et si c'est le cas, la date est modifiée dans le nom (pour dans 7 jours où plus tard) et ta macro est appelée (mettre l'appel à la place du commentaire "Ici l'appel de ta macro...")

Le code que je t'ai donné fait exactement ce que tu demandes !

je vais essayer je vous remercie,

je vais peux être vous en demander un peu trop mais pouvez vous regarder ce sujet: https://forum.excel-pratique.com/excel/envoie-de-mail-avec-variable-t91103.html

Bien cordialement.

Tu ne l'as pas mis dans le module du classeur (ThisWorkbook) car sinon, sur ton image je verrai, dans le ComboBox en haut à gauche au dessus du code, "Workbook" et dans celui de droite "Open" ce qui n'est pas le cas !

Dans la partie gauche et en haut de la fenêtre, tu double clique sur Thisworkbook et dans la partie d'édition qui vient de s'ouvrir tu colles le code et dans ce cas, dans les combo tu auras Workbook et Open qui sont concaténés pour donner "Workbook_Open", je ne vois pas où est la difficulté ?

Concernant ton autre post, il te suffit de mettre ton code (un peu modifié ci-dessous) dans un module standard :

Sub EnvoiSimple()

    Dim OutApp As Object
    Dim OutMail As Object
    Dim Entete As String
    Dim Corps As String
    Dim DerL As Long
    Dim Destinataire As String
    Dim i As Integer

    With ThisWorkbook.Sheets("Planning B737-800")

        DerL = .Range("A" & Rows.Count).End(xlUp).Row

        Entete = "Bonjour monsieur " & .Range("E9").Value & ","

        For i = 2 To DerL

            'ici, ceci >.Range("S9" & I).Value< me pose un problème ! C'est S92 qui est la première cible ? Car S9 et 2 font S92 !
            If .Range("X9") = 1 Or .Range("X9") = 2 Then Corps = Corps & .Range("S8").Value & " - " & .Range("S9" & i).Value

        Next i

        Destinataire = .Range("W9").Value

        Set OutApp = CreateObject("Outlook.Application")

        Set OutMail = OutApp.CreateItem(0)

        With OutMail

            .To = Destinataire
            .Subject = "EXPIRATION"
            .Body = Entete & Corps
            .Attachments.Add ThisWorkbook.Path & "\" & ThisWorkbook.Name
            .Display
            '.Send

        End With

    End With

    'fermer le classeur à la fin
    'ThisWorkbook.Close

End Sub

Attention tout de même à ces lignes de code :

 If .Range("X9") = "1" Then Corps = Corps & .Range("S8").Value & " - " & .Range("S9" & I).Value

et plus particulièrement à celle-ci :

.Range("S9" & I).Value

C'est qu'elles cellules qui sont visées, S92 et plus ? Car si I commence à 2, il y a concaténation de S9 et 2

Je ne vois pas non plus de retour à la ligne dans la construction de ton corps, est-ce normal ? Surtout que "Range("S8").Value" est répété à chaque fois dans la boucle !

Je verrai plus le message construit de cette façon mais difficile de savoir si ça va correspondre au résultat attendu quand on a pas de fichier exemple :

Sub EnvoiSimple()

    Dim OutApp As Object
    Dim OutMail As Object
    Dim Entete As String
    Dim Corps As String
    Dim DerL As Long
    Dim Destinataire As String
    Dim i As Integer

    With ThisWorkbook.Sheets("Planning B737-800")

        DerL = .Range("A" & Rows.Count).End(xlUp).Row

        Entete = "Bonjour monsieur " & .Range("E9").Value & "," & vbCrLf & vbCrLf 'deux lignes vides pour séparer

        For i = 2 To DerL

            'ici, ceci >.Range("S9" & I).Value< me pose un problème ! C'est S92 qui est la première cible ? Car S9 et 2 font S92 !
            If .Range("X9") = 1 Or .Range("X9") = 2 Then Corps = Corps & .Range("S8").Value & " - " & .Range("S9" & i).Value & vbCrLf

        Next i

        Destinataire = .Range("W9").Value

        Set OutApp = CreateObject("Outlook.Application")

        Set OutMail = OutApp.CreateItem(0)

        With OutMail

            .To = Destinataire
            .Subject = "EXPIRATION"
            .Body = Entete & Corps
            .Attachments.Add ThisWorkbook.Path & "\" & ThisWorkbook.Name
            .Display
            '.Send

        End With

    End With

    'fermer le classeur à la fin
    'ThisWorkbook.Close

End Sub

Rho je suis mais vraiment nul.....

Pour résumer le projet:

  • j'ai une base de donnée "onglet Planning B737-800" avec une liste de personnel.
  • le personnel à plein de formation obligatoire avec des dates butoir.

Mon objectif:

- Qu'un email soit envoyé aux employés avec la liste de leurs formations qui arrive en date butoir.

Ce qu'il faut savoir c'est que le fichier est ouvert tout les jours à des heures différents et par des personnes différentes.

d'où le rapprochement entre l'exécution d'une macro toute les 7 jours afin d'envoyer les emails (1/semaine).

Bonjour,

Quand tu as copié et collé le code que je t'ai donné [Private Sub Workbook_Open()] un caractère indésirable est venu se mettre juste après la dernière parenthèse de Workbook_Open() et c'est pour cette raison que le code est écrit en rouge. Supprime tout les code et recolles celui-ci (avec appel de ta proc pour l'envoi de mail) :

Private Sub Workbook_Open()

    Dim Nom As Name

    'évite l'erreur provoquée par l'inexistance du nom
   On Error Resume Next
    Set Nom = ThisWorkbook.Names("Jour")

    'si le nom n'existe pas, le crée avec comme valeur la date du jour
   If Err.Number <> 0 Then

        ThisWorkbook.Names.Add "Jour", Date, False

    Else

        'sinon, compare la date du jour à la date stocké dans le nom
       'et si c'est égat ou supérieur à 7, la condition est remplie...
       If Date - CDate(Right(Nom, Len(Nom) - 1)) >= 7 Then

            'dans ce cas, on mémorise la date du jour pour
           'une exécution de la macro dans 7 jours ou plus
           ThisWorkbook.Names.Add "Jour", Date, False

            'ici l'appel de ta macro...
            EnvoiSimple

        End If

    End If

End Sub

Si ce classeur est sur un serveur, je ne peut pas tester son comportement n'ayant pas de serveur (classeur en local)

ok merci beaucoup pour ton aide précieuse !

Je test et je te tiens au courant.

Rechercher des sujets similaires à "execution macro programmee"