Zdarzenia VBA

Spisie treści

VBA Zdarzenia funkcja tymczasowo wstrzymuje uruchomione makro, dając programowi Excel możliwość przetwarzania naciśnięć klawiszy, kliknięć myszą i innych komunikatów systemu operacyjnego.

W długotrwałych makrach program Excel może się zawiesić i przestać odpowiadać, a przerwanie makra może być niemożliwe. Jeśli kod DoEvents jest uwzględniony w kodzie, użytkownicy mogą mieć pewność, że makro nadal działa i w razie potrzeby nadal może przerwać wykonywanie.

Przykład VBA DoEvents

Rozważ następujący kod:

1234567891011 Podtest publiczny()Przyciemnij i tak długoDla i = 1 do 20000Zakres („A1”). Wartość = iDalej jaNapis końcowy

Gdy wypróbujesz ten kod, zauważysz, że nie można wchodzić w interakcję z oknem programu Excel. Ponieważ jednak nie jest to bardzo wymagające dla procesora, makro można przerwać wciskając ESC lub CTRL+BREAK.

Gdyby jednak w tej pętli wykonywanych było wiele złożonych i wymagających funkcji, program Excel potrzebowałby więcej czasu na zarejestrowanie zdarzenia naciśnięcia klawisza - do kilku minut lub nawet wcale, zwłaszcza jeśli na komputerze są uruchomione inne programy w tym samym czasie.

Teraz dodaj jedną linię z DoEvents poniżej przypisania zakresu:

123 Zakres("A1").Wartość = iZdarzenia

Jeśli uruchomisz ten kod ponownie, zobaczysz, że Excel jest teraz responsywny - można go skoncentrować i przenieść na pierwszy plan. DoEvents jest wywoływane za każdym razem w pętli, co zapewnia, że ​​makro zawsze zapewnia wykonanie, dzięki czemu program Excel może przetworzyć wszelkie wysyłane do niego wiadomości. Ponieważ to makro działa szybko, wygląda na to, że działa w tle (choć tak nie jest) - więcej operacji wewnątrz pętli szybko ujawniłoby tę iluzję.

Zdarzenia Niebezpieczeństwa

Ale spójrz jeszcze raz. Więcej niż tylko umożliwienie skupienia się na Excelu, możesz faktycznie klikać wewnątrz komórek, a nawet przełączać karty, gdy makro jest uruchomione (spróbuj – zobaczysz zabawne zachowanie). Pokazuje to jedno z niebezpieczeństw DoEvents - może to być przyczyną niezamierzonych konsekwencji, jeśli twoje makro nie jest starannie zakodowane.

Innym niebezpieczeństwem jest to, że DoEvents mogą służyć jako okno, w którym można uruchamiać inne makra. Wypróbuj to: umieść CommandButton ActiveX w arkuszu, kliknij go dwukrotnie i dodaj następujący kod wewnątrz zdarzenia CommandButton1_Click():

1234567 Dim c jako zakresDla każdego c W zakresie("B3:E8")c.Wartość = c.Wartość + 1Następny c

Wyłącz tryb projektowania w programie Excel, a następnie uruchom dodane wcześniej makro Test(). Gdy makro Test jest uruchomione, możesz kliknąć przycisk CommandButton w arkuszu, a skojarzone z nim makro zostanie uruchomione, gdy tylko DoEvents przerwie makro Test().

Niebezpieczeństwo polega na tym, że makro CommandButton zmieniło dane, nad którymi pracowało makro Test(), lub ponownie uruchomiło makro Test(). Możesz skończyć z bardzo bałaganiarskimi wynikami, jeśli nie będziesz ostrożny.

Na koniec powinieneś mieć świadomość, że DoEvents spowoduje, że twoje makro będzie miało wpływ na wydajność, gdy zostanie wywołane. Wewnątrz pętli wpływ ten szybko się zwiększy, chyba że ograniczysz częstotliwość wywoływania DoEvents. Odnosząc się do naszego przykładu Test(), spróbuj tego:

1 Jeśli i Mod 1000 = 0, to DoEvents

To wyraźnie zmniejsza czas reakcji programu Excel, ale wpływ na wydajność będzie mniejszy.

Kiedy używać DoEvents

Pomimo tych zagrożeń DoEvents to przydatna funkcja, która pomaga w testowaniu i debugowaniu. Rozważ dodanie DoEvents do długotrwałych pętli.

Innym powodem włączenia DoEvents jest umożliwienie opinii użytkowników. Na przykład makro może aktualizować etykiety formularza użytkownika za pomocą wskaźników postępu. Bez funkcji DoEvents program Excel może nie otrzymywać komunikatów o przemalowaniu UserForm, co daje użytkownikowi wrażenie, że makro przestało działać - zwłaszcza jeśli przełączysz się do innego programu, a następnie spróbujesz przełączyć się z powrotem do programu Excel. Jednak w przypadku DoEvents UserForm będzie nadal przemalowywany, a aktualizacje postępu makra będą nadal wyświetlane.

W większości przypadków DoEvents nie jest czymś, co chcesz często umieszczać w swoim kodzie i często można je pominąć. Jeśli jednak Twoje makro potrzebuje responsywności, nie rób tego!

Będziesz pomóc w rozwoju serwisu, dzieląc stronę ze swoimi znajomymi

wave wave wave wave wave