Mam arkusz programu Excel zawierający następujące makro. Chciałbym zapętlać to co sekundę, ale chciałbym znaleźć funkcję, która to zrobi. Czy to nie jest możliwe?
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
'Here I want to wait for one second
Loop
End Sub
DoEvents
jak pokazanoApplication.Wait(Now + #0:00:01#)
Pozdrawiam!Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
przez sekundę,Application.wait(now + 0.5e-5)
przez pół sekundy itd.Dodaj to do swojego modułu
Lub w przypadku systemów 64-bitowych użyj:
Nazwij to w swoim makrze w ten sposób:
źródło
Sleep()
pozwala określić czas oczekiwania poniżej 1 sekundy.Application.Wait
jest czasami zbyt ziarnisty.Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
zamiast używać:
wolę:
ponieważ później jest o wiele łatwiejsze do odczytania.
źródło
to działa bez zarzutu dla mnie. wstaw dowolny kod przed lub po pętli „do aż”. W twoim przypadku umieść 5 wierszy (pętla time1 = & time2 = & "do till") na końcu wewnątrz pętli do
źródło
Timer
ponieważTimer
podejście kończy się niepowodzeniem tuż przed północą.Deklaracja uśpienia w kernel32.dll nie będzie działać w 64-bitowym programie Excel. To byłoby trochę bardziej ogólne:
źródło
Po prostu wyczyszczona wersja kodu Clemo - działa w programie Access, który nie ma funkcji Application.Wait.
źródło
Timer
podaje liczbę sekund od północy, to podejście nie powiedzie się, jeśli zostanie wykonane tuż przed północą (czyli np.sngEnd
> = 86 400). O północyTimer
resetuje się do 0 i pozostaje mniej niż nasngEnd
zawsze.Większość z przedstawionych rozwiązań korzysta z Application.Wait, który nie uwzględnia czasu (milisekund), który już upłynął od rozpoczęcia bieżącego drugiego liczenia, więc mają one wewnętrzną niedokładność do 1 sekundy .
Podejście Timer jest najlepszym rozwiązaniem , ale musisz wziąć pod uwagę reset o północy, więc tutaj jest bardzo precyzyjna metoda uśpienia za pomocą Timera:
UŻYJ TEGO DO PRZETESTOWANIA KAŻDEJ FUNKCJI UŚPIENIA: (otwórz okno debugowania Bezpośrednie okno: CTRL + G)
źródło
Application.Wait Second(Now) + 1
źródło
źródło
Oto alternatywa dla snu:
W poniższym kodzie wykonuję efekt "poświaty" migający na przycisku obracania, aby skierować użytkowników do niego, jeśli mają "problemy", użycie "uśpienia 1000" w pętli nie spowodowało widocznego mrugania, ale pętla działa świetnie.
źródło
Wykonałem to, aby rozwiązać problem:
źródło
Zwykle używam funkcji Timer, aby wstrzymać aplikację. Wstaw ten kod do swojego
źródło
Timer
podaje liczbę sekund od północy, to podejście nie powiedzie się, jeśli zostanie wykonane tuż przed północą (tj. Takie, któreT0
jest mniejsze niż liczba sekund opóźnienia od północy). O północyTimer
resetuje się do 0 przed osiągnięciem limitu opóźnienia.Delay
nigdy nie osiąga limitu opóźnienia, więc pętla działa w nieskończoność.Loop Until Delay >= 1
, w przeciwnym razie ryzykujesz przekroczenie 1 i nigdy nie wychodzisz z pętli.Funkcje czekania i uśpienia blokują program Excel i nie można zrobić nic innego, dopóki opóźnienie się nie skończy. Z drugiej strony opóźnienia pętli nie dają dokładnego czasu oczekiwania.
Więc zrobiłem to obejście, łącząc trochę obu koncepcji. Powtarza się do momentu, w którym chcesz.
Wystarczy zadzwonić do Waste10Sec, jeśli potrzebujesz opóźnienia
źródło
Spróbuj tego :
źródło
Możesz użyć Application.wait now + timevalue ("00:00:01") lub Application.wait now + timeserial (0,0,1)
źródło