Przeglądając tematy na forach Excela zauważyłem, że niektórzy często próbują odkryć koło na nowo. Tymczasem Excel dostarcza narzędzia, które są zaprojektowane specjalnie do wykonania konkretnej pracy.
Wbudowane Narzędzia
Jakkolwiek kreatywność jest oznaką inteligencji, tak w przypadku VBA zdecydowanie lepiej korzystać z wbudowanych narzędzi Excela. Powody są przynajmniej dwa.
Szybkość
Po pierwsze – szybkość. Wbudowane narzędzie Excela zawsze będzie działać dużo szybciej od naszego kodu rozwiązującego problem.
Pierwszym przykładem z brzegu są funkcje. Przeliczanie formuł arkuszowych trwa znacznie krócej od funkcji VBA. Przykład drugi z brzegu to filtr zaawansowany. Kopiowanie unikatowych wpisów potrwa krócej jeśli zastosujemy wbudowane narzędzie. Własnoręcznie napisane makro oparte na kolekcji czy słowniku zawsze będzie wykonywać się dłużej.
Zamiast tracić czas na wymyślanie “koła na nowo” znacznie lepiej jest dobrze poznać wbudowane narzędzia Excela i wykorzystać je w kodzie VBA.
Wygoda
Po drugie – wygoda. Zastosowanie wbudowanego narzędzia to przeważnie krótkie polecenie, kawałek kodu. Oprogramowanie własnego rozwiązania często wiąże się z napisaniem sporej ilości kodu, co czyni pracę bardziej czasochłonną i skomplikowaną.
Przeciąganie Formuły
W sytuacji gdy trzeba przeciągnąć formułę, często pisze się kod, który kopiuje formułę z komórki źródłowej i wstawia ją w określone miejsce.
Zadanie polega na tym aby “przeciągnąć” formułę makrem z komórki A3 do zakresu A4:A10.
Formuła to zwykła suma dwóch poprzednich liczb.
=SUMA(A1:A2)
W ten sposób utworzymy Ciąg Fibonacciego.
Nagrana Formuła
Aby to zrobić włączyłem rejestrator makr i nagrałem operację przeciągania komórki z formułą aż do komórki A10.
Rejestrator wykonał w tym przypadku 90% pracy dając mi taki oto kod:
Sub PrzeciagnijFormule()
'
' Macro1 Macro
' Macro recorded 2011-08-20 by Mariusz Jankowski
'
'
Selection.AutoFill Destination:=Range("A3:A10"), Type:=xlFillDefault
End Sub
Korekta Formuły
Wiedziałem już, że odpowiedzialna za przeciągnięcie formuły jest metoda AutoFill obiektu Range. Pozostało mi jedynie zmienić zwrot Selection na odwołanie do komórki z formułą, a także wprowadzić do kodu nazwy arkuszy.
Sub PrzeciagnijFormule()
' Makro wypełnia zakres A4:A10 formułą z komórki A3
' formuła zawiera sumę dwóch powyższych komórek
With Arkusz1
.Range("A3").AutoFill Destination:=.Range("A3:A10"), Type:=xlFillDefault
End With
End Sub
Mariuszu,
a jaki jest powód użycia bloku With dla jednego Range?
Tak tylko, z ciekawości pytam… 😉
Marcin, przyczyna jest taka, że dwukrotnie odwołuję się do obiektu Range, i nie chcę za każdym razem poprzedzać go nazwą arkusza :-).
Wszystko jasne – nie zauważyłem drugiego Range’a 😀
Chyba już w tym wieku tak bywa, że czasami wzrok zawodzi… ;P
Zgadzam się…..z jednym ALE 🙂
Są przypadki gdzie własne makro będzie szybsze…..
Zobacz taki kod
….mniej pisania i szybciej działa niż ten podany (zarejestrowany) przez Ciebie
Zbyszek, czy mniej pisania? – chyba nie, bo ja zawsze podaję nazwy argumentów żeby kod był bardziej zrozumiały. A czy ten kod jest szybszy? Musiałbym sprawdzić robiąc test dla większego zbioru danych. Nie mniej jednak pomysł jest jak najbardziej warty uwagi 🙂
Nie napisałbym że szybszy gdybym nie sprawdził 😉
p.s.
chociaż czasami zdarza mi się napisać zanim sprawdzę, ale ten przypadek naprawdę sprawdzałem 🙂