Korzystanie z timera w makrach VBA pakietu Office
Kodowanie makra VBA w celu dodania timera do oprogramowania
Dimitri Otis/Digital Vision/Getty Images
Dla tych z nas, którzy głęboko zagłębiają się w VB.NET , podróż powrotna do VB6 może być mylącą podróżą. Korzystanie z Timera w VB6 jest właśnie takie. Jednocześnie dodawanie do kodu procesów czasowych nie jest oczywiste dla nowych użytkowników makr VBA.
Zegary dla początkujących
KodowanieMakro Word VBA do automatycznego określania czasu testu, który został napisany w programie Word, jest typowym powodem korzystania z czasomierza. Innym częstym powodem jest sprawdzenie, ile czasu zajmują różne części kodu, dzięki czemu możesz pracować nad optymalizacją wolnych sekcji. Czasami możesz chcieć sprawdzić, czy coś się dzieje w aplikacji, gdy komputer wydaje się po prostu siedzieć bezczynnie, co może stanowić problem z bezpieczeństwem. Czasomierze mogą to zrobić.
Uruchom minutnik
Czasomierz uruchamiasz, kodując instrukcję OnTime. Ta instrukcja jest zaimplementowana w programach Word i Excel, ale ma inną składnię w zależności od tego, którego używasz. Składnia programu Word to:
expression.OnTime(Kiedy, Nazwa, Tolerancja)
Składnia programu Excel wygląda tak:
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
Oba mają wspólny pierwszy i drugi parametr. Drugi parametr to nazwa innego makra, które jest uruchamiane po osiągnięciu czasu w pierwszym parametrze. W efekcie kodowanie tej instrukcji przypomina tworzenie podprogramu zdarzenia w warunkach VB6 lub VB.NET. Zdarzenie osiąga czas w pierwszym parametrze. Drugim parametrem jest podprogram zdarzenia.
Różni się to od sposobu kodowania w VB6 lub VB.NET. Po pierwsze, makro wymienione w drugim parametrze może znajdować się w dowolnym dostępnym kodzie. W dokumencie programu Word firma Microsoft zaleca umieszczenie go w szablonie dokumentu Normal. Jeśli umieścisz go w innym module, Microsoft zaleca użycie pełnej ścieżki: Project.Module.Macro.
Wyrażenie jest zwykle obiektem Application. Dokumentacja Worda i Excela stwierdza, że trzeci parametr może anulować wykonanie makra zdarzenia w przypadku, gdy okno dialogowe lub inny proces uniemożliwi jego uruchomienie w określonym czasie. W programie Excel możesz zaplanować nowy termin na wypadek, gdyby tak się stało.
Zakoduj makro zdarzenia czasowego
Ten kod w programie Word jest przeznaczony dla administratora, który chce wyświetlić powiadomienie o wygaśnięciu czasu testowania i wydrukować wynik testu.
Publiczny podtestOnTime()
Debug.Print 'Alarm włączy się za 10 sekund!'
Debug.Print ('Przed OnTime: ' & Teraz)
alertTime = Now + TimeValue('00:00:10')
Application.OnTime alertTime, „EventMacro”
Debug.Print ('Po OnTime: ' & Teraz)
Napis końcowy
Zdarzenie podrzędneMakro()
Debug.Print („Wykonywanie makra zdarzenia: ” i teraz)
Napis końcowy
Skutkuje to następującą treścią w bezpośrednim oknie:
Alarm włączy się za 10 sekund!
Przed OnTime: 25.12.2000 19:41:23
Po OnTime: 25.12.2000 19:41:23
Wykonywanie makro zdarzenia: 27.02.2010 19:41:33
Opcja dla innych aplikacji biurowych
Inne aplikacje pakietu Office nie implementują OnTime. Dla nich masz kilka możliwości. Po pierwsze, możesz użyć funkcji Timer, która po prostu zwraca liczbę sekund od północy na twoim komputerze i wykonuje własne obliczenia, lub możesz użyć wywołań interfejsu API systemu Windows. Korzystanie z wywołań interfejsu API systemu Windows ma tę zaletę, że jest bardziej precyzyjne niż Timer. Oto procedura sugerowana przez Microsoft, która załatwia sprawę:
Prywatna funkcja deklaracji getFrequency Lib 'kernel32' _
Alias „QueryPerformanceFrequency” (cyFrequency jako waluta) jako długi
Prywatna funkcja deklaracji getTickCount Lib 'kernel32' _
Alias „QueryPerformanceCounter” (cyTickCount jako waluta) tak długi
Sub TestTimeAPICalls()
Dim dTime jako podwójny
dTime = MikroTimer
Dim StartTime jako pojedynczy
Czas rozpoczęcia = godziny
Dla i = 1 do 10000000
Przyciemnij j jako podwójne
j = Sqr(i)
Następny
Debug.Print ('Czas pracy MicroTimera wynosił: ' & MicroTimer - dTime)
Napis końcowy
Funkcja MicroTimer() jako Double
'
' Zwraca sekundy.
'
Dim cyTicks1 jako waluta
cyFrequency jako waluta statyczna
'
Mikrozegar = 0
' Pobierz częstotliwość.
Jeśli cyFrequency = 0 Wtedy getFrequency cyFrequency
' Zdobądź kleszcze.
getTickCount cyTicks1
' Sekundy
Jeśli cyFrequency to MicroTimer = cyTicks1 / cyFrequency
Koniec funkcji