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?

35
demandé sur Community 2010-02-23 19:09:32

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
56
répondu Alain 2010-12-03 17:27:02

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é.

21
répondu Todd Main 2014-12-06 23:59:55

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

8
répondu Alex P 2017-11-17 19:06:48

(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
2
répondu PowerUser 2010-02-23 16:19:38

j'ai découvert que l'utilisation de OnTime peut être douloureuse, en particulier quand:

  1. vous essayez de coder et le focus sur la fenêtre est interrompu chaque fois que l'événement se déclenche.
  2. 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 .

0
répondu Gravity Grave 2018-05-08 21:49:49

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
0
répondu Julian 2017-02-06 16:36:30