La Macro VBA sur le style de minuterie pour exécuter le code à chaque nombre de secondes défini, c'est-à-dire 120 secondes
j'ai besoin d'exécuter un morceau de code toutes les 120 secondes. Je cherche un moyen facile de le faire en VBA. Je sais qu'il serait possible d'obtenir la valeur de minuterie de l'événement Auto_Open
pour éviter d'avoir à utiliser un nombre magique, mais je ne peux pas tout à fait obtenir Comment démarrer un minuterie pour obtenir quelque chose à exécuter toutes les 120 secondes.
Je ne veux pas vraiment utiliser une boucle infinie avec un sommeil si je peux l'éviter.
EDIT :
Cross-post basé sur une réponse fournie est à: Excel VBA Application.OnTime. Je pense que c'est une mauvaise idée pour l'utiliser... les pensées de toute façon?
6 réponses
lorsque le classeur s'ouvre pour la première fois, exécutez ce code:
alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"
alors il suffit d'avoir une macro dans le classeur appelé" EventMacro " qui va le répéter.
Public Sub EventMacro()
'... Execute your actions here'
alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"
End Sub
Oui, vous pouvez utiliser Application.OnTime
pour ceci et ensuite le mettre dans une boucle. C'est un peu comme un réveil où vous gardez hittig le bouton snooze pour quand vous voulez qu'il sonne à nouveau. Les mises à jour suivantes cellule A1 toutes les trois secondes avec le temps.
Dim TimerActive As Boolean
Sub StartTimer()
Start_Timer
End Sub
Private Sub Start_Timer()
TimerActive = True
Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
End Sub
Private Sub Stop_Timer()
TimerActive = False
End Sub
Private Sub Timer()
If TimerActive Then
ActiveSheet.Cells(1, 1).Value = Time
Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
End If
End Sub
vous pouvez mettre la procédure StartTimer
dans votre événement Auto_Open
et changer ce qui est fait dans la procédure Timer
(en ce moment il est juste mettre à jour le temps dans A1 avec ActiveSheet.Cells(1, 1).Value = Time
).
Note : vous voulez le code (en plus de StartTimer
) dans un module, pas un module de feuille de travail. Si vous l'avez dans un module feuille de travail, le code doit être légèrement modifié.
Dans le Classeur des événements:
Private Sub Workbook_Open()
RunEveryTwoMinutes
End Sub
dans un module:
Sub RunEveryTwoMinutes()
//Add code here for whatever you want to happen
Application.OnTime Now + TimeValue("00:02:00"), "RunEveryTwoMinutes"
End Sub
si vous voulez seulement le premier morceau de code pour exécuter après le cahier s'ouvre alors il suffit d'ajouter un délai de 2 minutes dans le Workbook_Open
événement
(ceci est paraphrasé à partir des fichiers D'aide de MS Access. Je suis sûr que XL a quelque chose de similaire.) Fondamentalement, TimerInterval est une propriété au niveau de la forme. Une fois défini, utilisez le sous-Form_Timer pour effectuer votre action prévue.
Sub Form_Load()
Me.TimerInterval = 1000 '1000 = 1 second
End Sub
Sub Form_Timer()
'Do Stuff
End Sub
j'ai découvert que l'utilisation de OnTime
peut être douloureuse, en particulier quand:
- vous essayez de coder et le focus sur la fenêtre est interrompu chaque fois que l'événement se déclenche.
- vous avez plusieurs classeurs ouverts, vous fermez celui qui est censé utiliser le minuteur, et il continue de déclencher et de rouvrir le classeur (si vous avez oublié de tuer l'événement correctement).
Cet article par Chip Pearson était très instructif. Je préfère utiliser la minuterie Windows maintenant, au lieu de OnTime
.
ma solution:
Option Explicit
Public datHora As Date
Function Cronometro(action As Integer) As Integer
'This return the seconds between two >calls
Cronometro = 0
If action = 1 Then 'Start
datHora = Now
End If
If action = 2 Then 'Time until that moment
Cronometro = DateDiff("s", datHora, Now)
End If
End Function
comment utiliser? Facile...
dummy= Cronometro(1) ' This starts the timer
seconds= Cronometro(2) ' This returns the seconds between the first call and this one