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
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
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.)
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!
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.
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
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
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()))
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)
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
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.
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