Wpis z mikrobloga

via Wykop Mobilny (Android)
  • 1
Dobra, mam naprawdę durne pytanie...
Mam w #excel #vba odziedziczony plik, który wykonuje wiele operacji obliczeniowych na danych. W produkcji zajmuje mu to ok. 40 minut.
Przygotowałem sobie mały, testowy zestaw danych, który się liczy w okolicach 3 minut.

I teraz zaczyna się magia ( ͡° ͜ʖ ͡° )*:

Liczy się 3 minuty. Ale jak podczas wykonywania się makra kliknę myszą gdziekolwiek na Excela proces przyspiesza jakby się naćpał i całość zajmuje ok. 15 sekund...

Pytania są dwa:
A) Dlaczego?!
B) Jak przyspieszyć ten kod bez klikania, bo to ma się wykonywać w całości zdalnie?
  • 13
  • Odpowiedz
@DarkAlchemy: jakieś dziwne zarządzanie energią? Bo to wygląda tak, jakby po kliknięciu Excel trafiał na pierwszy plan i rozkręcał procesor. Kiedyś przestawiłem procesor w oszczędzanie energii i o tym zapomniałem. Wszystko bardzo, bardzo zwolniło.
  • Odpowiedz
A) Dlaczego?!


@DarkAlchemy: tu można powróżyć z fusów, ale VBA to prosty język, ale ma sporo wad i niedociągnięć. Na przykład (przynajmniej jeszcze w 2013) dość łatwo stworzyć kod, który dużo wolniej uruchamia się gdy otwarty jest edytor VBA, a jeszcze wolniej, gdy okno edytora jest aktywne. Na pewno jednak nie jest to różnica 12x jak opisane wyżej.

Jak przyspieszyć ten kod bez klikania>


To zależy co poeta tam popisał, jak
  • Odpowiedz
@DarkAlchemy: wystarczy 5 sekund, żeby stwierdzić, że to nie jest kod napisany przez osobę z choćby średnią znajomością VBA. Brak deklaracji zmiennych, kod ewidentnie skopiowany z rejestratora makr i koszmarki typu:

If c = 86 Or c = 87 Or c = 93 Or c = 95 Or c = 100 Or c = 105 Or c = 106 Or c = 108 Or c = 109 Or c = 115
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@brak_nicku: dane są w skoroszycie, jako źródło jest tabela definiowania na początku kodu (pivoty już są) :)
A magic numbers w sumie można na samym początku wrzucić do Array'a i go przeszukiwać
  • Odpowiedz
@DarkAlchemy: patrząc na kod, to jest pętla, w której:
- są zagnieżdżone pętle
- odświeżane są jakieś tabele przestawne
- jakieś sortowania
- co jakiś czas dane są kopiowane z formuł jako wartości, ale nie wiadomo jakie to formuły i nigdzie nie jest wyłączone automatyczne przeliczanie formuł
Reasumując - nie wiadomo, co ten kod ma robić i czy robi to dobrze. Nie widzę też żadnej oczywistej przesłanki czemu miałby działać kilkanaście
  • Odpowiedz
@brak_nicku: akurat sam kod rozumiem i co robi mniej więcej też, z reguły operuje na ~70-80k wierszy.
Robić, robi dobrze, chociaż niekoniecznie efektywnie i zgodnie ze sztuką ( ͡° ͜ʖ ͡°)

Tutaj nawet nie tyle chodzi o "aktywnego" Excela, bo kod puszczam np. z edytora przy użyciu F5 (czyli chociaż edytor musi być aktywny) i on sobie leci powoli, a jak kliknę gdziekolwiek w edytor lub Excela
  • Odpowiedz
@DarkAlchemy: nie widząc pacjenta więcej nie pomogę, ostatnio pomagałem komuś, kto miał koszmarne problemy z wydajnością i tam wystarczyło wyłączyć zawijanie wierszy... Tu problemem mogą być formuły, algorytm obliczeń, albo coś równie mało oczywistego jak w tamtym przypadku
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@brak_nicku: i tak dzięki za pomoc, pliku niestety nie będę w stanie aż tak zanonimizowac żeby się nim podzielić, ale na pewno jeszcze jutro będę w tym grzebał, może przepiszę od zera i zobaczymy co wyjdzie ( ͡ ͜ʖ ͡)
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@DarkAlchemy: wystarczy 5 sekund, żeby stwierdzić, że to nie jest kod napisany przez osobę z choćby średnią znajomością VBA. Brak deklaracji zmiennych, kod ewidentnie skopiowany z rejestratora makr i koszmarki

@brak_nicku: jak to rozpoznałeś? O tym rejestratorze
  • Odpowiedz
@nohtyp_: kod dotyczący sortowania ewidentnie pochodzi z rejestratora (oczywiście jest troszkę zmodyfikowany). Nie twierdzę, że to coś bardzo złego, ale jeśli ktoś by ten kod sam pisał, to nie ustawialłby za każdym razem w tej samej pętli parametru dotyczącego sposobu sortowania chińskich znaków (xlPinYin).
  • Odpowiedz