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.