VBA „Application.OnTime” w połączeniu z timerem

Oto przykładowy kod VBA, który będzie wywoływał procedurę „MyProcedure” co 15 sekund w środowisku VBA 7:

				
					#If VBA7 Then
    Public Sub ScheduleProcedure()
        ' Uruchom procedurę po raz pierwszy
        Call MyProcedure

        ' Ustaw czas kolejnego wywołania procedury co 15 sekund
        Application.OnTime Now + TimeValue("00:00:15"), "MyProcedure"
    End Sub

    Public Sub MyProcedure()
        ' Kod procedury
        ' ...

        ' Ustaw czas kolejnego wywołania procedury za 15 sekund
        Application.OnTime Now + TimeValue("00:00:15"), "MyProcedure"
    End Sub

    Public Sub CancelScheduledProcedure()
        ' Anuluj zaplanowane wywołanie procedury
        Application.OnTime EarliestTime:=EarliestTime, Procedure:="MyProcedure", Schedule:=False
    End Sub
#Else
    Public Sub ScheduleProcedure()
        ' Kod dla wersji VBA niższej niż 7
    End Sub

    Public Sub MyProcedure()
        ' Kod dla wersji VBA niższej niż 7
    End Sub

    Public Sub CancelScheduledProcedure()
        ' Kod dla wersji VBA niższej niż 7
    End Sub
#End If

				
			

W powyższym kodzie, najpierw definiujemy trzy procedury: „ScheduleProcedure”, „MyProcedure” i „CancelScheduledProcedure”. W procedurze „ScheduleProcedure” najpierw wywołujemy procedurę „MyProcedure”, a następnie ustawiamy czas kolejnego wywołania procedury za pomocą funkcji „Application.OnTime”. W procedurze „MyProcedure” umieszczamy kod procedury, którą chcemy wykonać co 15 sekund. W ostatniej procedurze „CancelScheduledProcedure” anulujemy zaplanowane wywołanie procedury.

Aby uruchomić pierwsze wywołanie procedury, możesz umieścić kod linii „Call MyProcedure” w procedurze startowej, takiej jak „Workbook_Open” lub „UserForm_Activate”, lub ręcznie wywołać procedurę „ScheduleProcedure” po uruchomieniu arkusza lub formularza.

Ważne jest również, aby zapewnić odpowiednią obsługę błędów i wywołać funkcję „Application.OnTime” z parametrem „Schedule:=False” przed zamknięciem arkusza lub formularza, aby uniknąć problemów związanych z pozostawieniem niezakończonych operacji timera.