J'ai une feuille de calcul Excel contenant la macro suivante. Je voudrais le faire en boucle toutes les secondes, mais je suis dangé si je peux trouver la fonction pour le faire. N'est-ce pas possible?
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
'Here I want to wait for one second
Loop
End Sub
DoEvents
que vous voulez une démonstrationApplication.Wait(Now + #0:00:01#)
Cheers!Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
pendant une seconde,Application.wait(now + 0.5e-5)
pendant une demi-seconde etc.Ajoutez ceci à votre module
Ou, pour les systèmes 64 bits, utilisez:
Appelez-le dans votre macro comme ceci:
la source
Sleep()
vous permet de spécifier des temps d'attente inférieurs à 1 seconde.Application.Wait
est parfois trop granuleux.Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
à la place d'utiliser:
je préfère:
car c'est beaucoup plus facile à lire par la suite.
la source
cela fonctionne parfaitement pour moi. insérez n'importe quel code avant ou après la boucle «faire jusqu'à». Dans votre cas, mettez les 5 lignes (time1 = & time2 = & boucle "do until") à la fin de votre boucle do
la source
Timer
car l'Timer
approche échoue juste avant minuit.La déclaration pour Sleep dans kernel32.dll ne fonctionnera pas dans Excel 64 bits. Ce serait un peu plus général:
la source
Juste une version nettoyée du code de clemo - fonctionne dans Access, qui n'a pas la fonction Application.Wait.
la source
Timer
donne le nombre de secondes depuis minuit, alors cette approche échoue si elle est exécutée juste avant minuit (c'est-à-dire telle quesngEnd
> = 86 400). À minuit, seTimer
remet à 0 et reste donc moins quesngEnd
pour toujours.La plupart des solutions présentées utilisent Application.Wait, qui ne prend pas en compte le temps (millisecondes) déjà écoulé depuis le début du comptage actuel des secondes, elles ont donc une imprécision intrinsèque pouvant aller jusqu'à 1 seconde .
L'approche Timer est la meilleure solution , mais il faut tenir compte de la réinitialisation à minuit, voici donc une méthode de veille très précise utilisant Timer:
UTILISEZ CECI POUR TESTER TOUTE FONCTION DE SOMMEIL: (ouvrir la fenêtre Immédiat de débogage: CTRL + G)
la source
Application.Wait Second(Now) + 1
la source
la source
Voici une alternative au sommeil:
Dans le code suivant, je fais clignoter un effet "lueur" sur un bouton de rotation pour diriger les utilisateurs vers celui-ci s'ils "ont des problèmes", l'utilisation de "sleep 1000" dans la boucle n'a entraîné aucun clignotement visible, mais la boucle fonctionne très bien.
la source
J'ai fait faire ceci pour répondre au problème:
la source
J'utilise généralement la fonction Minuterie pour mettre l'application en pause. Insérez ce code dans le vôtre
la source
Timer
donne le nombre de secondes depuis minuit, alors cette approche échoue si elle est exécutée juste avant minuit (c'est-à-dire, de telle sorte que ceT0
soit inférieur au nombre de secondes de retard à partir de minuit). À minuit, seTimer
réinitialise à 0 avant que la limite de délai ne soit atteinte.Delay
n'atteint jamais la limite de délai, donc la boucle s'exécute indéfiniment.Loop Until Delay >= 1
, sinon vous risquez de dépasser 1 et de ne jamais quitter la boucle.Les fonctions d'attente et de mise en veille verrouillent Excel et vous ne pouvez rien faire d'autre avant la fin du délai. D'un autre côté, les délais de boucle ne vous donnent pas un temps d'attente exact.
Donc, j'ai fait cette solution de contournement en joignant un peu des deux concepts. Il boucle jusqu'à ce que l'heure soit celle que vous souhaitez.
Il vous suffit d'appeler Waste10Sec là où vous avez besoin du délai
la source
Essaye ça :
la source
Vous pouvez utiliser Application.wait now + timevalue ("00:00:01") ou Application.wait now + timeserial (0,0,1)
la source