Czy istnieje sposób na uniknięcie zawieszania się i braku reakcji systemu Windows podczas pracy wewnątrz kodu / makra vba na dużych danych. Czasami nie mogę nawet przenieść okna z jednej pozycji do drugiej. Jaka jest rola DoEvents w tym przypadku.
Jest jeden szczególny przypadek z Excel vba, kiedy makro działa i aktualizuje dane w aktywnym arkuszu, zostaje zatrzymane, gdy użytkownik wpisze tekst w aktywnej komórce i naciśnie klawisz enter.
Często zdarza się, że nie można pracować z innymi skoroszytami programu Excel, gdy uruchomione jest jedno makro programu Excel VBA. Często mam ten problem.
Pozdrowienia,
Odpowiedzi:
Ctrl+ Pause lub Break powinien zatrzymać kod i wejść w stan debugowania.
źródło
Aplikacje biurowe są jednowątkowe. Jeśli wykonasz nadmierne działania w języku VBA, może to powodować, że aplikacja nie będzie reagować na Windows, więc Windows utworzy białą nakładkę na oknie aplikacji i doda [Nie odpowiada] do podpisu okna.
DoEvents zasadniczo mówi kolejce komunikatów systemu Windows, aby przetworzyła wszystkie wiadomości, które zgromadziły się od czasu ostatniego przetworzenia wiadomości. Jeśli proces jest bezczynny, jego komunikaty są przetwarzane natychmiast, ale jeśli proces jest bardzo zajęty, kolejka komunikatów może znacznie wzrosnąć, a przetwarzanie go jest odraczane, aż proces powróci do stanu bezczynności. Czasami można zaobserwować, że wszystkie działania interfejsu użytkownika są wykonywane błyskawicznie po osiągnięciu tego stanu, jak w przypadku filmu poklatkowego. Naprawdę niepożądane. Jednak DoEvents należy stosować z ostrożnością. Rzadko rozwiązuje problem polegający na wrzuceniu niektórych wierszy kodu DoEvents w dowolne miejsca.
Pomyśl też o biednych użytkownikach. Jeśli masz proces, który zajmuje więcej niż kilka sekund, bardziej niż łagodne jest przedstawienie okna dialogowego postępu z pewnymi informacjami o tym, jak daleko zaszedł proces i ile pozostało do zrobienia. To zabija dwa ptaki jednym kamieniem. DoEvents ma tutaj dobry cel. Jeśli przypiszesz nowe podpisy do etykiet (np. Procent ukończenia) lub ustawisz właściwość value paska postępu w trakcie działania procesu o dużej obciążalności, zmiany interfejsu użytkownika nie będą widoczne na ekranie, dopóki nie zostanie wydane polecenie DoEvents (przynajmniej kiedy proces jest nadal w toku). Możesz więc użyć DoEventsaby zapewnić regularną aktualizację interfejsu użytkownika. Na przykład, jeśli przetwarzasz rekordy z bardzo dużej tabeli, aktualizuj informacje o postępie co około 100 rekordów, a także upewnij się, że DoEvent zostanie wydany. Interwał zależy od tego, ile czasu zajmuje przetworzenie wielu rekordów. Powinieneś wybrać interwał, który można osiągnąć w ciągu sekundy, aby informacje o postępie były odświeżane wystarczająco często. Jeśli interwał jest zbyt długi, aplikacja ponownie nie będzie odpowiadać.
Wybranie odpowiedniego interwału aktualizacji zapobiegnie zamrożeniu interfejsu użytkownika i zmniejszy frustrację użytkowników, gdy dowiedzą się, ile czasu pozostało do oczekiwania. Jeśli upewnisz się, że okno dialogowe postępu jest modalne, użytkownicy nie będą mieli możliwości ingerowania, zaczynając wpisywać tekst w dowolnej komórce, dopóki proces się nie zakończy. Ponieważ to bardzo źle się dzieje. Rozpoczęcie edycji komórki zmienia kontekst funkcjonalny programu Excel. Wiele funkcji jest blokowanych podczas wykonywania operacji edycji. Po prostu obserwuj wstążkę podczas przejścia z nawigacji po komórce do edycji komórki (za pomocą F2 lub cokolwiek innego). Połowa wstążki zostanie wyszarzona. To samo dotyczy za kulisami wielu metod Excel API. Może powodować ignorowanie tego trybu przez wszelkiego rodzaju błędy w czasie wykonywania. Powinieneś za wszelką cenę zapobiegać, aby użytkownicy mogli zrobić wszystko, tylko czekać na zakończenie procesu.
źródło