Oct 22 2009

Przyspieszanie wykonywania makra

Posted by Marcin

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.

Powiązane artykuły:

Filed under : VBA, Wszystkie | 1 Comment »

One Response to “Przyspieszanie wykonywania makra”

  1. [...] 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 [...]

Leave a Reply