Retards dans la VBA

je voudrais un délai d'une seconde dans mon code. Ci-dessous le code que j'essaie de faire ce retard. Je pense qu'il analyse la date et l'heure du système d'exploitation et attend jusqu'à ce que l'heure corresponde. Je rencontre un problème avec le retard. Je pense qu'il n'interroge pas le moment où il correspond au temps d'attente et il est juste assis là et se fige. Ça ne bloque que 5% du temps où j'exécute le code. Je me demandais à propos de l'Application.Attendez et s'Il ya un moyen de vérifier si l'heure sondée est de plus que le temps d'attente.

   newHour = Hour(Now())
   newMinute = Minute(Now())
   newSecond = Second(Now()) + 1
   waitTime = TimeSerial(newHour, newMinute, newSecond)
   Application.Wait waitTime
14
demandé sur ashleedawg 2011-08-05 21:43:07

11 réponses

j'utilise cette petite fonction pour VBA.

Public Function Pause(NumberOfSeconds As Variant)
    On Error GoTo Error_GoTo

    Dim PauseTime As Variant
    Dim Start As Variant
    Dim Elapsed As Variant

    PauseTime = NumberOfSeconds
    Start = Timer
    Elapsed = 0
    Do While Timer < Start + PauseTime
        Elapsed = Elapsed + 1
        If Timer = 0 Then
            ' Crossing midnight
            PauseTime = PauseTime - Elapsed
            Start = 0
            Elapsed = 0
        End If
        DoEvents
    Loop

Exit_GoTo:
    On Error GoTo 0
    Exit Function
Error_GoTo:
    Debug.Print Err.Number, Err.Description, Erl
    GoTo Exit_GoTo
End Function
19
répondu Steve Mallory 2013-06-27 20:06:37

si vous êtes dans Excel VBA vous pouvez utiliser ce qui suit.

Application.Wait(Now + TimeValue("0:00:01"))

(la chaîne temporelle doit ressembler à H:MM:SS.)

36
répondu TheFuzzyGiggler 2016-10-19 03:20:39

vous pouvez le copier dans un module:

Sub WaitFor(NumOfSeconds As Long)
Dim SngSec as Long
SngSec=Timer + NumOfSeconds

Do while timer < sngsec
DoEvents
Loop

End sub

et chaque fois que vous voulez appliquer la pause écrire:

Call WaitFor(1)

j'espère que ça aidera!

11
répondu Financial Economist 2011-08-05 18:25:25

avez-vous essayé de dormir?

il y a un exemple ici (copié ci-dessous):

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Form_Activate()    

frmSplash.Show
DoEvents
Sleep 1000
Unload Me
frmProfiles.Show

End Sub

remarquez qu'il pourrait geler la demande pour la période de temps choisie.

6
répondu Tiago Cardoso 2011-08-05 18:20:59

une autre variante de la réponse de Steve Mallorys, j'avais spécifiquement besoin d'excel pour s'enfuir et faire des choses en attendant et 1 seconde était trop longue.

'Wait for the specified number of milliseconds while processing the message pump
'This allows excel to catch up on background operations
Sub WaitFor(milliseconds As Single)

    Dim finish As Single
    Dim days As Integer

    'Timer is the number of seconds since midnight (as a single)
    finish = Timer + (milliseconds / 1000)
    'If we are near midnight (or specify a very long time!) then finish could be
    'greater than the maximum possible value of timer. Bring it down to sensible
    'levels and count the number of midnights
    While finish >= 86400
        finish = finish - 86400
        days = days + 1
    Wend

    Dim lastTime As Single
    lastTime = Timer

    'When we are on the correct day and the time is after the finish we can leave
    While days >= 0 And Timer < finish
        DoEvents
        'Timer should be always increasing except when it rolls over midnight
        'if it shrunk we've gone back in time or we're on a new day
        If Timer < lastTime Then
            days = days - 1
        End If
        lastTime = Timer
    Wend

End Sub
2
répondu James Barrass 2015-08-19 09:30:21

Le Timer fonction s'applique également à Access 2007, Access 2010, Access 2013, l'Accès À 2016, Access 2007 Développeur, Access 2010 Développeur, Access 2013 Développeur. Insérer ce code pour arrêter le temps pendant un certain nombre de secondes

T0 = Timer
Do
    Delay = Timer - T0
Loop Until Delay = 1 'Change this value to pause time in second
2
répondu Anastasiya-Romanova 秀 2016-07-02 23:41:18

accès peut toujours utiliser la procédure Excel aussi longtemps que le projet a le Microsoft Excel XX.X objet référence incluse :

Call Excel.Application.Wait(DateAdd("s",10,Now()))
2
répondu user3298002 2016-08-02 17:22:55

votre code ne crée qu'une heure sans date. Si votre hypothèse est correcte quand il exécute l'application.attendez le temps réellement déjà atteint ce temps, il attendra 24 heures exactement. Je m'inquiète aussi un peu d'appeler maintenant () plusieurs fois (pourrait être différent?) Je changerais le code en

 application.wait DateAdd("s", 1, Now)
1
répondu Eddy 2011-08-05 18:24:32

j'ai utilisé la réponse de Steve Mallory, mais je crains que le minuteur jamais ou au moins parfois ne va pas à 86400 ni 0 (zéro) sharp (MS Access 2013). J'ai donc modifié le code. J'ai changé la condition de minuit EN "If Timer > = 86399 alors" et a ajouté la rupture de la boucle "Exit Do" comme suit:

Public Function Pause(NumberOfSeconds As Variant)
    On Error GoTo Error_GoTo

    Dim PauseTime As Variant
    Dim Start As Variant
    Dim Elapsed As Variant

    PauseTime = NumberOfSeconds
    Start = Timer
    Elapsed = 0
    Do While Timer < Start + PauseTime
        Elapsed = Elapsed + 1
        If Timer >= 86399
            ' Crossing midnight
            ' PauseTime = PauseTime - Elapsed
            ' Start = 0
            ' Elapsed = 0
            Exit Do
        End If
        DoEvents
    Loop

Exit_GoTo:
    On Error GoTo 0
    Exit Function
Error_GoTo:
    Debug.Print Err.Number, Err.Description, Erl
    GoTo Exit_GoTo
End Function
1
répondu Miroslav Kovarik 2015-07-23 03:42:30

Sur l'horloge de Windows renvoie centièmes de seconde... La plupart des gens utilisent juste des secondes parce que sur la plate-forme Macintosh timer renvoie des nombres entiers.

0
répondu Peter 2014-03-11 21:53:18

avec les remerciements à Steve Mallroy.

j'ai eu minuit questions dans la Parole et dans le code ci-dessous a fonctionné pour moi

Public Function Pause(NumberOfSeconds As Variant)
 '   On Error GoTo Error_GoTo

    Dim PauseTime, Start
    Dim objWord As Word.Document

    'PauseTime = 10 ' Set duration in seconds
    PauseTime = NumberOfSeconds
    Start = Timer ' Set start time.

    If Start + PauseTime > 86399 Then 'playing safe hence 86399

    Start = 0

    Do While Timer > 1
        DoEvents ' Yield to other processes.
    Loop

    End If

    Do While Timer < Start + PauseTime
        DoEvents ' Yield to other processes.
    Loop

End Function
0
répondu Ateeq 2015-11-18 14:15:51