Aplikacja Excel VBA zatrzymuje się spontanicznie z komunikatem „Wykonanie kodu zostało zatrzymane”

151

Z tego, co widzę w sieci, jest to dość powszechna skarga, ale odpowiedzi wydają się być rzadsze. Problem jest taki:

Mamy wiele aplikacji Excel VBA, które działają doskonale na wielu komputerach użytkowników. Jednak na jednej maszynie zatrzymują się na pewnych liniach kodu. Są to zawsze te same wiersze, ale wydaje się, że nie mają one ze sobą nic wspólnego.

Jeśli naciśniesz F5 (uruchom) po zatrzymaniu, aplikacja będzie kontynuowana, więc jest prawie jak punkt przerwania. Próbowaliśmy wybrać „usuń wszystkie przerwy” z menu, a nawet dodać przerwę i usunąć ją ponownie.

Mieliśmy już ten problem z pojedynczymi aplikacjami i `` zarzuciliśmy '' go, wycinając kod z modułów, kompilując, a następnie wklejając go z powrotem itp.

Wydaje się, że problem dotyczy teraz samego programu Excel, a nie pojedynczego pliku .xls, więc nie jesteśmy pewni, jak sobie z tym poradzić.

Każda pomoc zostanie przyjęta z wdzięcznością :)

Dzięki,

Philip Whittington

Phil Whittington
źródło
2
Czy użytkownik naciska klawisz Escape w trakcie przetwarzania? Lub jakakolwiek inna aplikacja, która wysyła klawisz Escape?
shahkalpesh
1
Czy po wybraniu opcji Usuń wszystkie punkty przerwania również ponownie skompilowałeś i zapisałeś projekt VBA? Widziałem podobny problem w programie Word VBA, w którym wcześniej usunięte punkty przerwania nadal powodują przerwę.
Dirk Vollmar
Podczas egzekucji nic nie jest przetwarzane, shahkalpesh. Divo - dzięki, być może nie wypróbowałem ich dokładnie w tej kolejności. Zrobi to teraz ...
Phil Whittington
Oprócz komentarza divo przydatne może być zakomentowanie odpowiednich wierszy i wszelkich wierszy, które zatrzymałyby debugowanie, można je następnie odkomentować i ponownie skompilować kod (ponownie).
Fionnuala
I zapomniałem wspomnieć: aby faktycznie wywołać przebudowę, zwykle konieczne jest zmodyfikowanie linii, a następnie przesunięcie kursora do następnej linii, aby oznaczyć kod źródłowy jako zmodyfikowany (np. Wprowadzić zmianę, przesunąć kursor w dół, przesunąć kursor w górę i cofnij zmianę ręcznie)
Dirk Vollmar

Odpowiedzi:

404

Znalazłem drugie rozwiązanie.

  1. Naciśnij przycisk „Debuguj” w wyskakującym okienku.
  2. Naciśnij dwukrotnie Ctrl+ Pause|Break.
  3. Naciśnij przycisk odtwarzania, aby kontynuować.
  4. Zapisz plik po zakończeniu.

Mam nadzieję, że to komuś pomoże.

Stan
źródło
12
+1: Wow, ten post uratował mnie przed światem bólu. Bardzo nieoczekiwane rozwiązanie dziwnego problemu. Po dwukrotnym naciśnięciu [Ctrl + Break] i kontynuowaniu zapisałem plik. Po tym problem już nie pojawiał się, gdy zamknąłem i ponownie otworzyłem plik.
dbenham
28
Jeśli kiedykolwiek odpowiedź zasługiwała na pochwałę, to jest to. Świetna odpowiedź.
The_Barman
4
To mi bardzo pomogło. Ta odpowiedź zasłużyła na 1000 głosów za. Ten problem nękał mnie przez ostatnie 4-5 dni. To działało doskonale.
demouser123
25
Czy ktoś wie, dlaczego to działa? Albo skąd się bierze? Czy to magia?
ZX9
4
Wciąż mi pomagasz w 2017 roku. Dziękuję!
Slab
16

Ten problem pochodzi z dziwnego dziwactwa w pakiecie Office / Windows.

Po opracowaniu tego samego fragmentu kodu VBA i uruchomieniu go setki razy (dosłownie) w ciągu ostatnich kilku dni napotkałem ten problem. Jedyną różnicą jest to, że tuż przed tym kłopotliwym problemem przypadkowo zakończyłem wykonywanie kodu VBA niekonwencjonalną metodą.

Wyczyściłem wszystkie pliki tymczasowe, zrestartowałem komputer itp. Kiedy po tym wszystkim ponownie uruchomiłem kod, nadal występował problem - zanim wszedłem do pierwszej pętli. Sensowne jest, aby „nacisnąć przycisk„ Debuguj ”w wyskakującym okienku, a następnie dwukrotnie nacisnąć [Ctrl + Break] i po tym można kontynuować bez zatrzymywania” ponieważ coś w kombinacji Office / Windows nie zwolniło wykonania. Zablokowało się.

Nadmiarowa akcja Ctrl + Break prawdopodobnie rozwiązuje długotrwałe wykonanie.

user2052260
źródło
14

Oto jedno rozwiązanie :

Rozwiązaniem tego problemu jest dodanie wiersza kodu „Application.EnableCancelKey = xlDisabled” w pierwszym wierszu makra. To rozwiąże problem i umożliwi pomyślne wykonanie makra bez wyświetlania komunikatu o błędzie „Kod wykonanie zostało przerwane ”.

Ale po wstawieniu tego wiersza kodu nie mogłem już używać Ctrl + Break. Więc to działa, ale nie bardzo.

Stan
źródło
Dzięki, Stan - to z pewnością rozwiązanie, jeśli jesteś pod presją czasu i po prostu chcesz, aby działał! Bardzo przydatne.
Phil Whittington
1
Możesz ponownie włączyć w tym samym wykonaniu, ustawiając go na xlInterrupt. (To również automatycznie włącza się ponownie po zakończeniu wykonywania kodu). Twoja druga odpowiedź zadziałała dla mnie, ale w najgorszym przypadku można to wykorzystać jako tymczasową poprawkę. Więcej informacji na temat Application.EnableCancelKey
Kodithic
2
Prawidłowa odpowiedź - i jedyna poprawna odpowiedź - znajduje się powyżej. Wstawienie dowolnego wiersza kodu, w tym „Application.EnableCancelKey = xlDisabled”, po prostu przenosi problem do innego wiersza. Często nowy „punkt przerwania” to dokładnie ten wiersz, który wstawiłeś. Jedynym powodem, dla którego nie odrzucam twojej odpowiedzi, jest to, że w ciągu ostatniej dekady wielokrotnie uciekałem się do jej używania.
Nigel Heffernan
6

Znalazłem naciśnięcie ctrl + break, gdy makro nie było uruchomione, rozwiązało problem.

James
źródło
3

Spróbowałbym zwykłych środków zaradczych: - Uruchom narzędzie VBA Code Cleaner Roba Boveya na swoim kodzie VBA - usuń wszystkie dodatki na komputerze użytkownika, szczególnie dodatki COM i .NET - Usuń wszystkie pliki .EXD użytkowników (niezgodności MSoft Update) - Uruchom program Excel Wykryj i napraw w systemie użytkowników - sprawdź rozmiar pliku .xlb użytkownika (powinien wynosić 20-30 KB) - Uruchom ponownie, a następnie usuń pliki tymczasowe wszystkich użytkowników

Charles Williams
źródło
2

Dziękuję wszystkim za wkład. Ten problem został rozwiązany, wybierając opcję NAPRAWA w Panelu sterowania. Wydaje mi się, że to jawnie ponownie rejestruje niektóre natywne komponenty COM pakietu Office i robi rzeczy, których REINSTALL nie robi. Spodziewam się, że ten ostatni po prostu przechodzi przez listę kontrolną i czasami akceptuje to, co jest, jeśli jest już zainstalowany. Wtedy miałem osobny problem z zarejestrowaniem własnej biblioteki .NET dll dla współpracy COM na komputerze użytkownika (pomimo tego działającego również na innych maszynach), chociaż myślę, że to był mój błąd, a nie Microsoft. Jeszcze raz dziękuję, naprawdę to doceniam.

Phil Whittington
źródło
2

Kilka razy zetknąłem się z tym problemem podczas tworzenia jednej złożonej aplikacji Excel VBA. Czasami program Excel zaczął dość przypadkowo łamać obiekt VBA. Jedynym lekarstwem było ponowne uruchomienie komputera. Po ponownym uruchomieniu Excel zwykle zaczynał działać normalnie.

Wkrótce odkryłem, że możliwym rozwiązaniem tego problemu jest jednokrotne naciśnięcie CTRL + Break, gdy makro NIE jest uruchomione. Może to też może ci pomóc.

bazinac
źródło
2

Miałem ten problem również podczas korzystania z programu Excel 2007 ze skoroszytem foobar.xlsm (z włączoną obsługą makr), który powodował wyświetlenie komunikatu „Wykonywanie kodu zostało przerwane”, po prostu próbując zamknąć skoroszyt na czerwonym X w prawym rogu bez makr uruchomionych w wszystkie lub dowolne makra formularza, skoroszytu lub arkusza „inicjalizuj”. Dostępne opcje to „Koniec” lub „Kontynuuj”. Debugowanie było zawsze wyszarzone. Zrobiłem tak, jak sugerował poprzedni plakat Panel sterowania-> Programy i funkcje-> kliknij prawym przyciskiem myszy „Microsoft Office Proffesional 2007” (w moim przypadku) -> zmień-> napraw.

To rozwiązało problem. Mogę dodać, że stało się to niedługo po aktualizacji MS i znalazłem również dodatek w Excelu o nazwie "Team Foundation" firmy Microsoft, którego z pewnością nie zainstalowałem dobrowolnie

Carlito
źródło
1

Chciałbym dodać więcej szczegółów do odpowiedzi Stana nr 2 z poniższych powodów:

  • Sam miałem do czynienia z tym problemem kilkanaście razy iw zależności od warunków projektu wybierałem między magiczną odpowiedzią voodoo # 1 lub # 2 Stana. Kiedy stawałem przed tym ponownie, stałem się bardziej dociekliwy, dlaczego tak się dzieje na pierwszym miejscu.

  • Chciałbym dodać odpowiedź również dla użytkowników komputerów Mac.

  • Istnieją ograniczenia dotyczące obu tych możliwych odpowiedzi:

    • jeśli kod jest chroniony (a nie znasz hasła), odpowiedź nr 1 nie pomoże.
    • jeśli kod nie jest chroniony, odpowiedź nr 2 nie pozwoli ci debugować kodu.

  1. Może się to zdarzyć z jednego z poniższych powodów:

    • System operacyjny nie przydziela zasobów systemowych do procesu programu Excel. ( Rozwiązanie: wystarczy uruchomić system operacyjny - wskaźnik sukcesu jest bardzo niski, ale wiadomo, że działa wiele razy)

    • Kod P jest kodem pośrednim, który był używany w Visual Basic (przed .NET) i dlatego jest nadal używany w VBA. Umożliwiło to bardziej kompaktowy plik wykonywalny kosztem wolniejszego wykonywania. Dlaczego mówię o p-kodzie? Ponieważ czasami ulega uszkodzeniu między wieloma uruchomieniami i dużymi plikami lub po prostu z powodu instalacji oprogramowania (Excel) gdzieś się zepsuł. Kiedy p-kod jest uszkodzony. wykonanie kodu jest ciągle przerywane.Rozwiązanie: W takich przypadkach zakłada się, że kod zaczął się uszkadzać i istnieje prawdopodobieństwo, że w przyszłości skoroszyt programu Excel również ulegnie uszkodzeniu, wyświetlając komunikaty typu „plik Excel uszkodzony i nie można go otworzyć”. Dlatego jako szybkie rozwiązanie możesz polegać na odpowiedzi nr 1 lub odpowiedzi nr 2, zgodnie z własnymi wymaganiami. Jednak nigdy nie ignoruj ​​oznak korupcji. Lepiej jest skopiować moduły kodu w notatniku, usunąć moduły, zapisać i zamknąć skoroszyt, zamknąć program Excel. Teraz ponownie otwórz skoroszyt i zacznij tworzyć nowe moduły z kodem skopiowanym wcześniej do notatnika.

  2. Użytkownicy komputerów Mac, wypróbuj jedną z poniższych opcji, a z pewnością będą działać w zależności od architektury systemu, tj. Wersji systemu operacyjnego i Office

    • Ctrl + Pause
    • Ctrl + ScrLk
    • Esc+ Esc(Naciśnij dwa razy pod rząd)

Zostaniesz przełączony w tryb przerwania przy użyciu powyższych kombinacji klawiszy, ponieważ makro zawiesi wykonywanie natychmiast kończąc bieżące zadanie. To jest zamiennik kroku 2.

  1. Rozwiązanie: Aby przezwyciężyć ograniczenia związane z użyciem odpowiedzi nr 1 i odpowiedzi nr 2 , używam xlErrorHandlerwraz z Resumeinstrukcją w module obsługi błędów, jeśli kod błędu to 18. Następnie przerwanie jest wysyłane do uruchomionej procedury jako błąd, który można przechwycić przez błąd program obsługi skonfigurowany za pomocą instrukcji On Error GoTo. Kod błędu, który można wykryć to 18. Bieżąca procedura została przerwana, a użytkownik może debugować lub zakończyć procedurę. Firma Microsoft ostrzega, aby nie używać tego, jeśli program obsługi błędów ma instrukcję resume, w przeciwnym razie program obsługi błędów zawsze powraca do tej samej instrukcji. Dokładnie tego chcemy w niechcianych bezsensownych przerwach w wykonywaniu kodu.

jainashish
źródło
0

Moja obecna reputacja nie pozwala jeszcze na opublikowanie tego jako komentarza. Rozwiązanie Stansa, aby wejść w tryb debugowania, naciśnij dwukrotnie Ctrl + Break, graj dalej, zapisywanie rozwiązało mój problem, ale mam dwa nieoczekiwane zwroty akcji:

  1. Mój projekt jest chroniony hasłem, więc aby wejść w tryb debugowania musiałem najpierw wejść w tryb programisty, kliknąć na strukturę projektu i wpisać hasło.

  2. Mój projekt to plik szablonu (.xmtl). Otworzyłem plik poprzez dwukrotne kliknięcie, co otwiera go jako .xml z „1” na końcu poprzedniej nazwy pliku. Naprawiłem błąd zgodnie z instrukcją Stansa i zapisałem go jako ten ... plik 1.xml. Kiedy następnie ponownie otworzyłem szablon, tym razem jako szablon, i chciałem zastosować tę samą poprawkę błędu do tego pliku, błąd zniknął! Nie zmieniłem tego pliku i nadal nie ma błędu podczas wykonywania makra. Oznacza to dla mnie, że błąd nie jest w rzeczywistości w pliku, ale w (ukrytym) ustawieniu w programie Excel.

blablubbb
źródło
-1

Wydaje się, że problem dotyczy teraz samego programu Excel

Zainstaluj ponownie i załataj :) Poza tym trudno to stwierdzić.

Andy
źródło
Próbowaliśmy przeprowadzić ponowną instalację, chociaż użytkownik „zapomniał” o ponownym uruchomieniu po tym, jak osoba obsługująca zrobiła swoje. Próbuję uniknąć kolejnej ponownej instalacji pakietu Office, ale może to być nieuniknione ... Dzięki
Phil Whittington