Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VBA excel proste makro czasem zawiesza działanie programu

12 Lip 2020 20:56 171 4
  • Poziom 24  
    Witam!

    Od czasu do czasu korzystam z VBA lub po prostu rejestruję proste makro, żeby ułatwić sobie pracę. Ostatnio natrafiłem na problem. Zarejestrowałem proste makro ułatwiające dodawanie kolejnych odczytów do tabeli w arkuszu, który jest częścią większego skoroszytu, ale innych makro w nim nie ma. Ku mojemu zdziwieniu okazało się, że makro czasem działa, a czasem zawiesza działanie programu i wówczas excel nie reaguje na polecenia, konieczne jest całkowite zamknięcie programu.

    Starałem się dojść co jest nie tak ze skoroszytem - bo samo makro jest tak banalne, że nie widzę żadnych szans na wyszukanie odpowiedzi w nim samym. Zresztą używane w innym skoroszycie działa za każdym razem. Nie znalazłem rozwiązania, ale przynajmniej wypreparowałem z całego skoroszytu niewielki fragment, który jest bardzo prosty, nie ma powiązań z resztą świata a mimo to nadal co pewien czas to makro zawiesza działanie programu.

    Załączam dwa pliki, jeden (Woda.xlsm) zawiera tylko arkusz na którym działa makro i tu nigdy nie zaobserwowałem wystąpienia problemu. W drugim pliku (Woda bad.xlsm) jest pięć arkuszy w tym ten z makro, który powoduje (niezbyt często) zawieszenie programu. Makro 3 (przycisk "Dodaj") dodaje jeden wiersz do tabeli i właśnie przy dodawaniu nowego wiersza czasem się zawiesza. Makro "Usuń" (przycisk usuń) usuwa dodane wiersze żeby ułatwić testy. Zauważyłem jednak, że gdy korzystam z niego to znacznie trudniej zawiesić program, natomiast gdy ręcznie usuwam dopisane dane zaznaczając je i korzystając z <Ctrl> - to wówczas prawdopodobieństwo zawieszenia się programu gwałtownie rośnie.

    Przyznam, że nie rozumiem tego. Po pierwsze czemu za każdym razem, reakcja programu nie jest taka sama? Po drugie czemu reakcja na te same polecenia w ramach makro jest inna niż gdy są wydawane w tradycyjny sposób? I co mają do tego te pozostałe arkusze, które nie są w żaden sposób powiązane z tym, na którym wykonywane są operacje?

    Będę wdzięczny za pomoc.

    Pozdrawiam,
    Jurek
  • Poziom 34  
    Nie podałeś w jakich okolicznościach obserwujesz zawieszanie się programu, czy plik daje się odzyskać w całości i tym podobne szczegóły.
    Na pierwszy rzut oka trudno doszukać się błędów w tych kodach, ale są one niezbyt efektywne (kod rejestrowany zawiera dużo niepotrzebnych Selectów). Spróbuj zamienić je na kody podane poniżej. One powinny być funkcjonalnie równoważne i wydają się dość bezpieczne. W razie występowania problemów podaj bardziej szczegółowe okoliczności.
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
  • Poziom 24  
    Dzięki za próbę pomocy!

    Wiem, że to nie jest efektywny kod, ale to moje najmniejsze zmartwienie. Właściwe makro, w roboczym skoroszycie, ma być wykonywane raz na miesiąc. Oczywiście jest znacznie bardziej rozbudowane, ale i tak to bez znaczenia, czy będzie się wykonywało 1ms czy nawet 100 razy dłużej. Sens tego makro leży w automatyzacji czynności, o których operator(ka) nie ma większego pojęcia, a dzięki makro wykona je na pewno poprawnie.

    Cały skoroszyt obejmuje kilkanaście arkuszy więc gdy trafiłem na problem starałem się maksymalnie ograniczyć jego rozmiary i stopień komplikacji by dojść do sedna. W pełnym skoroszycie makro sypie się praktycznie za każdym razem (czy mój kod, czy Twój - bez różnicy). W tym prostym, który wysłałem o wiele rzadziej, niełatwo go zawiesić, ale daje się. W drugim pliku, gdzie nie ma nic poza tym arkuszem nie udało mi się go zawiesić ani razu. Przy okazji - pełnego skoroszytu nie mogę wysłać bez pracochłonnej anonimizacji, bo zawiera masę danych osobowych.

    Co do okoliczności występowania problemu to właśnie one są w tym najciekawsze. Gdy operacje wykonuję "na piechotę" zawsze jest ok. Gdy uruchamiam makro (znów: bez różnicy mój kod czy Twój), to w pełnym skoroszycie zawiesza się prawie na 100%, w tym okrojonym natomiast często trzeba wykonać kilkadziesiąt prób aż się zawiesi - stąd to drugie makro do "sprzątania". Dlaczego po iluś poprawnych wykonaniach w końcu się zawiesza? Czemu nie tak często jak w pełnym skoroszycie?

    Jak już pisałem można istotnie zwiększyć prawdopodobieństwo zawieszenia, jeżeli operację usuwania wpisanych wcześniej danych wykona się ręcznie (zaznacz obszar danych; <Ctrl> -) i znów wywoła makro. Czemu to ma znaczenie? Twój kod zawiesza się wtedy prawie na 100%, mój na jakieś 50%. Skąd ta różnica?

    Po zawieszaniu wykonania Excel podaje komunikat o błędzie (różne - zrzut w załączeniu), po wybraniu opcji Debug stoi na wklejaniu z przesunięciem. F8 powoduje kolejne wystąpienie błędu w tym samym miejscu. Reset niby kończy wykonanie makro, ale Excel nadal nie działa poprawnie, nie reaguje na próbę wybrania innych komórek. Właściwie w pewien sposób reaguje, bo pojawia się informacja o wielkości zaznaczonego obszaru, ale nie widać tego zaznaczenia i nie pozostaje po zwolnieniu klawisza myszy (zrzut). Owszem, można w tym stanie zapisać plik i zachowuje zmiany (nawet to nowe zaznaczenie), ale potem trzeba wyjść z Excela, bo nie da się nic zrobić. Po wyjściu można znów wywołać Excel i działa normalnie.

    Czy komuś udało się uzyskać efekt zawieszenia na swoim komputerze? Bo już się doszukuję problemu w samym Excelu, choć próbowałem na dwóch komputerach i w obu przypadkach wszystko się powtarza. Jednak na obu mam tę samą wersję Office Professional 2013.
    VBA excel proste makro czasem zawiesza działanie programu VBA excel proste makro czasem zawiesza działanie programu VBA excel proste makro czasem zawiesza działanie programu
  • Pomocny post
    Poziom 34  
    Mnie te makra nie zawiesiły Excela ani razu, ale testowałem je na wersji 2007 i 2010.
    Być może problem jest spowodowany przez połączenie wklejania danych ze schowka z wstawianiem komórek. Jeśli formatowanie komórek nie ma znaczenia i kopiowane są stałe (tak to przynajmniej wygląda w przykładowym pliku), to może zrezygnować z kopiowania na rzecz przypisywania wartości, a przy wstawianiu będą się wstawiać puste komórki i dopiero w następnym etapie wpisywać do nich wartości. Makro do wstawiania wierszy mogłoby wyglądać tak:
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
  • Poziom 24  
    W oryginale makro jest znacznie bardziej rozbudowane a kopiowany obszar zawiera istotne formatowanie i formuły a nie tylko stałe. Myślałem już o tym, żeby to tak rozdzielić. Wypróbowałem na szybko przesłane makro i owszem, nie zawiesiło się podczas ok. 20 prób, a to "normalne" zawiesza się dość regularnie. Więc w pewnym sensie to jest rozwiązanie, dziękuję.

    Jednak problem postrzegam w czym innym. Bez tego makro bym przeżył, sam też wpadłem na to, że można rozdzielić operacje. Ale podstawowe pytanie to czy moje makro jest poprawne? A jeżeli tak, to w czym problem? Czy faktycznie mam trefnego Excela? Używam go od wielu lat, nigdy nie miałem problemów. Nie chce mi się przeinstalowywać go od zera, tym bardziej próbować z inną wersją (na krótko o ile wiem można zainstalować bez licencji). Z VBA eksperymentuję od niedawna, dotąd nie zdarzył mi się błąd nie wynikający z mojej niewiedzy. Liczyłem na to, że ktoś mi wytknie błąd, tak byłoby najprościej. Liczę też na weryfikację, czy Kolegom będzie się ten arkusz zawieszał, czy nie i czy ma to związek z wersją Excela (rozważam zakup nowszej)?