Przyspieszanie wykonywania makra
Po dłuższej (kilkumiesięcznej) nieobecności ExcelMagazine.pl wraca do żywych. Reaktywację blogu rozpoczniemy od cyklu krótkich artykułów ułatwiających - szczególnie początkującym użytkownikom - pisanie czy usprawnianie makr oraz radzenie sobie z najczęściej występującymi trudnościami.
W tym poście zajmę się najprostszym sposobem (ale jakże skutecznym) na przyspieszenie wykonywania makra oraz nadaniu mu nieco bardziej profesjonalnego wyglądu.
Powody, dla których makra wykonują się powoli może być kilka - od niewydajnego sprzętu, po źle napisany kod makra - np. utworzony automatycznie podczas rejestracji.
Uruchomienie kodu powstałego w wyniku rejestracji makra bardzo często powoduje migotanie ekranu. Pomijając fakt, że to znacznie spowalnia wykonywanie makra, to również wygląda wyjątkowo nieprofesjonalnie: wydaje się, że makro pracuje w sposób chaotyczny i nierówny. Na szczęście bardzo łatwo możemy temu zaradzić przyspieszając jednocześnie wykonanie kodu.
Cudownym remedium na migotanie ekranu jest właściwość ScreenUpdating obiektu Application. Jeśli na początku makra przypiszemy tej właściwości wartość False, uzyskamy w ten sposób dwie rzeczy:
- ekran nie będzie migotać podczas pracy makra,
- kod wykona się znacznie szybciej, niż z wartością ustawioną na True (która to wartość jest ustawiona domyślnie).
Zysk na szybkości wykonania wynika z faktu, że Excel nie będzie już musiał odświeżać ekranu za każdym razem, gdy napotka takie polecenia jak Select, Activate, LargeScroll, SmallScroll itp.
Jak to zrobić w praktyce? Należy włączyć edytor VBA (Alt+F11), znaleźć moduł, w którym znajduje się nasze makro i przejść do jego edycji. Następnie musimy umieścić następujący kod:
Application.ScreenUpdating = False
w miejsce po instrukcji Sub NazwaMakra() ale przed właściwym kodem makra. Musimy też koniecznie pamiętać, aby przywrócić odświeżanie arkusza Excela przed zakończeniem wykonywania makra, poprzez instrukcję:
Application.ScreenUpdating = True
którą należy umieścić tuż przed instrukcją End Sub. Wprawdzie w momencie przekazania kontroli do Excela (po zakończeniu makra) przypisanie wartości True nastąpi automatycznie, niemniej jednak na wszelki wypadek warto to zrobić samemu. Schemat takiego makra wygląda następująco:
Sub Makro1() ' ' Makro1 Makro ' ' Application.ScreenUpdating = False 'WŁASNY/ZAREJESTROWANY KOD MAKRA Application.ScreenUpdating = True End Sub
Czasami (wersje Excel 2003 i wersje wcześniejsze) zdarza się, że mimo to w pewnym momencie wykonywania makra ekran znów zaczyna migotać (np. jeśli często wykonywane jest polecenie Select. W takim przypadku musimy ponownie użyć instrukcji Application.ScreenUpdating = False w odpowiednim miejscu makra.
Warto porównać czas wykonywania jakiegoś długotrwałego makra (np. usuwającego kilka tysięcy wierszy jeden po drugim dla podanego warunku) raz z wykorzystaniem powyższej procedury a drugi raz bez niej… wyniki czasem są zaskakujące.

[...] struktura makra może wyglądać następująco (uwzględniająca również opisane w poście o przyspieszaniu wykonywania makra wyłączenie odświeżania [...]