XL 2013 Problème exécution macro (fermeture automatique)

volwerik

XLDnaute Nouveau
Bonjour,

Je rencontre un problème un peu particulier et après plusieurs recherches impossibles de trouver une solution.
Situation :
- J'ai deux fichiers excel, dans le premier j'ai une macro de fermeture automatique, voir ci-après et dans le suivant j'ai une macro qui vient ouvrir mon classeur et copier les données puis le referme.

Dans le classeur j'ai le code suivant, fermeture automatique = fichier 1 :

Private Sub Workbook_Open()
ProchainArret
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
Application.OnTime HeureArrêt, Procedure:="Fin", Schedule:=False
ProchainArret
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
'ThisWorkbook.Saved = True
On Error Resume Next
Application.OnTime HeureArrêt, Procedure:="Fin", Schedule:=False ' annule événnement
End Sub

Dans un module j'ai le code suivant :

Public HeureArrêt
Sub ProchainArret()
HeureArrêt = Now + TimeValue("00:10:00")
Application.OnTime HeureArrêt, "Fin"
Sheets("Synthese").[A1000000] = HeureArrêt
End Sub

Sub Fin()
On Error Resume Next
Application.OnTime HeureArrêt, Procedure:="Fin", Schedule:=False 'annule événnement
ThisWorkbook.Close True
End Sub

Macro de copier des données = fichier numéro 2 :

Workbooks.Open "S:\Production\Mur.Qualite\27.04.listing.verificateur.xlsm"
With Workbooks("27.04.listing.verificateur.xlsm").Sheets("Donnees.controles")
.Range(.Cells(2, 13), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 1)).Copy
End With
Windows("Pilotage.Mur.Qualite.xlsm").Activate
Sheets("Donnees.controles").Select
Range("A3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A2").Select
Sheets("Synthese").Select
Application.CutCopyMode = False
Workbooks("27.04.listing.verificateur.xlsm").Close SaveChanges:=False

Mon problème est :
- Au bout de plusieurs minutes, j'ai le fichier dans lequel je viens récupérer des données qui s'ouvre de nouveau pour se refermer. J'ai l'impression que la macro du fichier 1 cherche de nouveau à s'activer. Est-ce que vous avez une idée d'où le problème peut venir ?

Merci à tous pour votre participation.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Volwarik, MaPomme,
Je confirme l'hypothèse de Mapomme.
Vous mettez cette PJ sur votre bureau, vous l'ouvrez, cliquez sur GO.
Vous fermez le fichier sans fermer XL. Au bout de 60s votre fichier va se ré ouvrir de lui même pour exécuter la macro Fin.
Il vous faut rajouter Application.OnTime HeureArrêt, Procedure:="Fin", Schedule:=False 'annule événnement avant de fermer le fichier.
 

Pièces jointes

  • Essai.xlsm
    20.3 KB · Affichages: 5

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @volwerik,
Bonjour @sylvanu :),

J'avais préparé un autre exemple. Je le publie.

la procédure "ArretEtRelance" se lance à l'ouverture du fichier
puis la procédure "ArretEtRelance" se lance toutes les 15 sec.
si on ferme le fichier, la procédure "ArretEtRelance" est définitement déprogrammée

Le test peut se faire avec la mise en commentaire ou non dans Workbook_BeforeClose des instructions:
VB:
   Application.OnTime EarliestTime:=HeureArrêt, procedure:="ArretEtRelance", schedule:=False
   MsgBox "Arrêt définitif du lancement de ProchainArret", vbInformation
Si instruction active -> la procédure ne se relance pas après fermeture du classeur
Si instruction inactive -> la procédure se relance après fermeture du classeur

Code dans ThisWorkBook :
Code:
Private Sub Workbook_Open()
   'on lance la programmation de la procédure "ArretEtRelance" pour la première fois
   ArretEtRelance
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   ' avant de quitter le fichier, on déprogramme la procédure "ArretEtRelance"
   On Error Resume Next
   Application.OnTime EarliestTime:=HeureArrêt, procedure:="ArretEtRelance", schedule:=False
   MsgBox "Arrêt définitif du lancement de ProchainArret", vbInformation
End Sub

Code dans module1 :
VB:
Sub ArretEtRelance()
   'on arrête la programmation de la procédure "ArretEtRelance"
   On Error Resume Next
   Application.OnTime EarliestTime:=HeureArrêt, procedure:="ArretEtRelance", schedule:=False
 
   ' autre code à exécuter
   ' autre code à exécuter
   ' autre code à exécuter
   ' autre code à exécuter
 
   'on relance la programmation de la procédure "ArretEtRelance" pour un prochain tour
   HeureArrêt = Now + TimeValue("00:00:15")
   Application.OnTime EarliestTime:=HeureArrêt, procedure:="ArretEtRelance", schedule:=True
   MsgBox "ArretEtRelance : prochaine exécution -> " & Format(HeureArrêt, "hh:mm:ss")
End Sub
 

Pièces jointes

  • volwerik- OnTime toujours et toujours- v1.xlsm
    15 KB · Affichages: 4

volwerik

XLDnaute Nouveau
@mapomme et @sylvanu, merci beaucoup pour vos réponses. C'est bien ce que j'avais compris mais je n'arrivais pas à comprendre pourquoi. Je vais rajouter la ligne dans mon code dans le second fichier pour couper la procédure et faire un test. Je garde également la seconde option ;).
Merci beaucoup pour votre retour.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Moi je n'aime pas me replonger sans arrêt dans des problème déjà résolus ailleurs. Alors j'écris des modules de service dans lesquels je n'ai plus à me replonger. Naturellement il portent des commentaires guides d'utilisation.
En glissant/déplaçant deux modules de service du classeur joint, le module standard MPlanificateur et le module de classe Planification, on devrait pouvoir écrire ça dans le ThisWorkbook:
VB:
Option Explicit
Private WithEvents Fermeture As Planification, WithEvents Relance As Planification
Private Sub Workbook_Open()
   Set Fermeture = New Planification
   Set Relance = New Planification
   Fermeture.PlanifierDans "00:10:00"
   End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
   Fermeture.PlanifierDans "00:10:00"
   End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
   Fermeture.Annuler
   If Application.ActiveWorkbook.Name <> Me.Name Then Exit Sub
' Sinon prévenir un possible "Annuler" au "Voulez-vous enregistrer les modifications ?"
   Relance.PlanifierDans 1
   End Sub
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
   Relance.Annuler
   End Sub
Private Sub Fermeture_Échoit()
   Me.Close True
   End Sub
Private Sub Relance_Échoit()
   Fermeture.PlanifierDans "00:09:00"
   End Sub
À tester
 

Pièces jointes

  • Progression.xlsm
    220.4 KB · Affichages: 17

volwerik

XLDnaute Nouveau
@Dranreb
Bonjour,
Merci beaucoup pour ton retour. Ton code fonctionne très bien dans le fichier de base cependant quand mon deuxième fichier vient récupérer les données j'ai toujours mon fichier 1 qui revient s'ouvrir et qui cherche à se refermer.
Est-ce que tu as une idée de comment couper la macro quand elle vient s'exécuter à partir de mon deuxième fichier ?
Cdt,
 

Dranreb

XLDnaute Barbatruc
C'est le fichier à ouvrir qui doit être équipé de ce système, pas celui qui l'ouvre.
Normalement la méthode Annuler de l'objet Planification fait le Application.OnTime avec Schedule:=False requis. Or elle est exécutée au Workbook_BeforeClose, à moins d'un Application.EnableEvents = False devant l'instruction qui veut le fermer …
Ce qui me fait me rendre compte d'ailleurs qu'on s'embête pour rien depuis un bon moment, faute d'avoir pensé qu'on pouvait ainsi empêcher l'exécution de sa Sub Workbook_Open !
 
Dernière édition:

volwerik

XLDnaute Nouveau
@Dranreb Merci ! Effectivement. C'est bien cette ligne de code qui annule la procédure ?

If Application.ActiveWorkbook.Name <> Me.Name Then Exit Sub

Tu viens comparer le nom des fichiers pour sortir de la procédure, c'est bien ça ?

Excuse moi par rapport à mes questions mais j'ai un niveau très limité. Le code je l'avais correctement intégré au fichier à ouvrir mais mon problème était revenu.
 

Dranreb

XLDnaute Barbatruc
Oui et puis moi je n'avais pas compris la question.
Effectivement si le classeur en voie d'être fermé n'est pas le classeur actif, il ne saurait se produire une désactivation de ses fenêtres, qui ne sont pas actives, ni donc d'annulation de la relance du dispositif. Mais heureusement, ça n'a pas d'importance parce que ça veut dire qu'il se ferme par un ordre extérieur et non par une manœuvre de l'utilisateur.
 

Discussions similaires

Réponses
2
Affichages
587

Statistiques des forums

Discussions
313 316
Messages
2 097 099
Membres
106 836
dernier inscrit
ChristopheDF