Kategoria: VBA

  • VBA IF THEN czyli jak sterować kodem

    VBA IF THEN czyli jak sterować kodem

    VBA IF…THEN… – czyli jak kontrolować kod

    Jeśli czytałeś poprzednie artykuły z cyklu „Podstawy VBA”, to teraz nadeszła chwila prawdy! Instrukcja VBA IF…THEN w połączeniu z wcześniejszą wiedzą pozwoli stworzyć Ci pierwszy użyteczny kod.

    VBA IF…THEN (dla jasności JEŻELI…WÓWCZAS…) pozwoli Ci sterować, jaką drogą powinien „iść” Twój program. Jeśli znasz funkcję JEŻELI, to pójdzie Ci naprawdę szybko 🙂

    Haker. Sterowanie kodem.
    Źródło: Pixabay.com

    Przeczytaj również:

    VBA IF: podstawy i składnia

    Tak naprawdę, tego typu instrukcja warunkowa jest chyba podstawą każdego języka programowania. Piszę „chyba”, bo nie jestem programistą. Ale na tyle na ile rozumiem pojęcie algorytmu, to w każdym języku potrzebna jest instrukcja, która pozwoli programiście sterować „zachowaniem” programu.

    Podobnie jest w języku VBA, a służy do tego między innymi instrukcja IF…THEN. Idea jest taka: jeżeli w trakcie działania programu trafiasz na dwie lub więcej możliwości to instrukcja pozwala zdecydować co ma się wydarzyć dalej. Graficznie można to pokazać jak na poniższym obrazku.

    VBA If Then - algorytm decyzji

    Dla przykładu, weźmy taki fragment Twojego kodu, gdzie dalsze działanie programu uzależnione jest od wartości wpisanej do komórki A1. Jeżeli użytkownik wpisze coś do komórki (PRAWDA), to ma nastąpić dalsze działanie, sprawdzające czy wartość jest liczbą czy tekstem. Jeżeli komórka A1 pozostaje pusta – nic się nie dzieje, a w zasadzie program kończy działanie nie wykonując żadnej operacji.

    VBA IF: 1 czy 2 linie kodu

    Składnia kodu VBA w podstawowej postaci, wygląda następująco:

    IF Range("A1")<>"" Then Range("A2").Value = Range("A1").Value

    W powyższym przykładzie, program sprawdza zawartość komórki A1. Jeśli komórka nie jest pusta (<>dwa znaki cudzysłowu), to komórka A2 przyjmie wartość taką samą jak komórka A1. W przeciwnym razie – nic się stanie i program zakończy swoje działanie.

    Opisaną wyżej instrukcję możesz również umieścić w dwóch liniach kodu. W takim przypadku na końcu musisz dodać wyrażenie End If, które zamyka działanie całej instrukcji.

    IF Range("A1")<>"" 
     Then Range("A2").Value = Range("A1").Value
    End If

    VBA IF…ELSE…ELSEIF…

    No dobrze, ale do tej pory nie mieliśmy okazji do rzeczywistego sterowania programem. Czyli nie pisaliśmy co ma się wydarzyć, jeżeli pierwszy warunek jest niespełniony. Program po prostu kończył działanie. Teraz to nadrobimy.

    Weźmy taki przykład. Program ma sprawdzić zawartość komórki A1, do której powinien być wprowadzana litera oznaczająca region (N oznacza Północ, S – Południe, W – Zachód, E – Wschód) Program ma zamienić literę na jeden z czterech regionów. Jeśli komórka nie będzie miała oznaczenia: N, S, W, E to powinien pojawić się napis „Brak”.

    Jak widzisz mamy tutaj do czynienia z więcej niż jednym warunkiem. Musimy bowiem sprawdzić, czy A1 = „N”, a jeżeli nie, to czy równa się „S”, a jeżeli nie…itd. Aby wprowadzić takie wielowarunkowe sprawdzenie, w wyrażeniu trzeba użyć instrukcji ELSEIF oraz ELSE. ELSEIF pozwala wprowadzić kolejny warunek, a po ELSE wskazujesz co ma się wydarzyć w każdym innym przypadku (poza opisanymi warunkami)

    Kod będzie wyglądał tak:

    Sub Regiony()
    
    If Range("A1") = "N" Then
        Range("A1") = "Północ"
    ElseIf Range("A1") = "S" Then
        Range("A1") = "Południe"
    ElseIf Range("A1") = "W" Then
        Range("A1") = "Zachód"
    ElseIf Range("A1") = "E" Then
        Range("A1") = "Wschód"
    Else
        Range("A1") = "Brak"
    End If
    
    End Sub

    Program zadziała jak na poniższym filmie.


    Chcesz lepiej poznać Excela? Zapisz się na Excelness News

    .

    Podsumowanie

    Znajomość instrukcji IF-THEN to kolejny krok, aby opanować podstawy VBA. W większości przypadków, będziesz mógł sterować działaniem swoich programów wykorzystując to rozwiązanie. Dla bardziej złożonych przypadków (większej ilości warunków) użyjesz wyrażenia SELECT CASE. Ale o tym w jednym z kolejnych artykułów. Nie przegap i zapisz się na newsletter, bądź dołącz do grupy na Facebooku.


    Masz problemy z Excelem? Uzyskaj pomoc na grupie Keep Calm And Use Excel.

  • Zmienne VBA – poznaj i wykorzystaj

    Zmienne VBA – poznaj i wykorzystaj

    Zmienne VBA. Poznaj i używaj ich stale.

    Jestem pewny, że już używasz zmiennych w Excelu. Nie muszą to być zmienne VBA. Wystarczy, że przynajmniej raz, napisałeś najprostszą formułę. Użyłeś w niej komórki z jakąś wartością. A wartości w komórkach mogą się zmieniać.

    A może używasz nazw? Nazwa reprezentuje wartość, zakres albo pojedynczą komórkę. Nazwa pozostaje stała, ale wartości jakie reprezentuje zmieniają się. Widzisz, że to nic skomplikowanego. Zatem do dzieła!

    Kobiety programujące na laptopie. Zmienne VBA.

    Czym są zmienne VBA i po co ich używać?

    Zmienna w VBA to nic innego jak nazwa, która służy do „przechowywania” wartości. Nazwy są przypisywane z wykorzystaniem znaku równości. Na przykład:

    mojaZmienna = Range("A1").Value

    Dlaczego używamy zmiennych? Po pierwsze, zmienne ułatwiają czytanie kodu VBA. Po drugie ułatwiają utrzymanie bardziej złożonych programów oraz pozwalają na bardziej zaawansowane kodowanie. I w końcu – oszczędzają czas!

    Wyobraź sobie sytuację, że w swoim kodzie użyłbyś 10 razy odwołania do komórki B1 w taki sposób:

    ....Range("B1").Value

    Jeżeli po jakimś czasie będziesz zmuszony zmienić to odwołanie, to czeka Cię aktualizacja wszystkich przypadków. Gdybyś użył zmiennej, na przykład tak:

     mojaDrugaZmienna = Range("B1").Value 

    to w opisanej sytuacji – zmienisz tylko tę zmienną.

    Na koniec być może najważniejszy powód, aby używać zmiennych VBA. Niektórych zadań w VBA, po prostu nie zrobisz efektywnie bez ich użycia. Mam na myśli na przykład wszelkiego rodzaju pętle. Są to fragmenty kodu gdzie przetwarzasz, jeden po drugim jakieś obiekty (np. komórki w zakresie)


    Nadając nazwy swoim zmiennym, pamiętaj o tych zasadach:

    • Pierwszy znak nazwy zmiennej musi być literą
    • Nie używaj słów zastrzeżonych, takich jak: if, for, with, select etc.
    • Używaj podkreślenia i/lub wielkich liter w środku nazwy w celu zwiększenia czytelności
    • Nie używaj znaków: #$&!
    • Nazwa zmiennej nie może mieć więcej niż 255 znaków

    Rodzaje zmiennych VBA

    Wiesz już czym są zmienne VBA i dlaczego warto ich używać. Porozmawiajmy zatem o ich rodzajach oraz kiedy ich używać.

    Generalnie rzecz biorąc, wskazując typ zmiennej mówisz ile pamięci ma zarezerwować na dane jakie przypiszesz do tej zmiennej. To przyspiesza kod, zmniejsza ryzyko popełnienia błędów i jest dobrą praktyką kodowania. Ale to jest cykl dla początkujących nie-programistów, więc na tym poprzestańmy. Nie będziemy liczyć ile to bajtów i ile milisekund szybciej będzie działał Twój kod 🙂

    Najważniejsze typy zmiennych znajdziesz w poniższej tabeli.

    TYP ZMIENNEJZAKRES
    ByteLiczby całkowite w zakresie od 0 do 255
    IntegerLiczby w zakresie od -32 768 do 32 768
    LongLiczby w zakresie od -2 147 483 648  do 2 147 483 648
    BooleanPrawda / Fałsz
    DoubleBardzo duże liczby (ujemne do dodatnich) z wysoką precyzją
    miejsc po przecinku. Używamy również w przypadku %.
    StringTekst. Może być bardzo długi.
    ObjectWszelkiego rodzaju obiekty, np. wykresy.
    DateData w zakresie od 1 stycznia 0001 do 31 grudnia 9999
    VariantDowolna wartość. Może przechowywać również takie wartości
    jak: „Empty” czy „Null”. Jeśli nie przypiszesz innego typu, to zmienna przyjmie właśnie typ Variant.

    Jak deklarować zmienne VBA?

    Aby zadeklarować jakąś zmienną musisz użyć słowa kluczowego Dim. Po słowie Dim wpisujesz wybraną przez siebie nazwę (zgodną z zasadami opisanymi na początku artykułu) Następnie używasz słowa „as” oraz wskazujesz na typ zmiennej.

    Pojedynczą zmienną deklarujesz w pojedynczym wierszu, tak:

    Dim MojTekst as String

    lub kilka zmiennych w ramach jednego wiersza kodu, w taki sposób:

    Dim PierwszyWiersz as Long, OstatniWiersz as Long

    Jeżeli potrzebujesz użyć w kodzie stałej wartości, która nie będzie się zmieniała użyj słowa kluczowego Const.

    Const StawkaVat as Double = 0,23

    Deklarując jednocześnie wiele zmiennych tego samego typu, w ramach tej samej nazwy użyjesz tablicy Array, w taki sposób:

    Dim Miesiace(1 to 12) as String

    O deklarowaniu zmiennych dość łatwo zapomnieć. Ale możesz na samym sobie wymóc taki obowiązek. Wystarczy jeżeli użyjesz Option Explicit, które pojawiając się na początku każdego kodu wymusi definiowanie każdej zmiennej. Zachęcam Cię gorąco do włączenia tej opcji. W edytorze VBA, przejdź do TOOLS > OPTIONS i zaznacz REQUIRE VARIABLE DECLARATION.

    Włączanie opcji Option Explicit.

    Jedną z typów zmiennych jest Object. Dlatego, że zmienne mogą przechowywać różne obiekty Excela. Mogą nimi być na przykład: arkusz, wykres, kształt czy zakres komórek.

    Nie wystarczy, że zadeklarujesz zmienną w ten sposób:

    Dim MojZakres as Object

    Musisz następnie przypisać dany obiekt do tej zmiennej używając słowa Set.

    Set MojZakres = Range("A1:C1000")

    W przypadku innych typów zmiennych, używasz znaku równości aby przypisać wartość do zmiennej. Co prawda w składni VBA występuje w takich przypadkach słowo Let, ale jego użycie jest opcjonalne. Taki zapis:

    OstatniWiersz = Rows.Count

    będzie równoznaczny z tym:

    Let OstatniWiersz = Rows.Count

    Zakres obowiązywania zmiennych

    Zmienne VBA możesz wykorzystywać na kilku poziomach. Oznacza to, że zmienna może istnieć w ramach danej: procedury, pojedynczego modułu, czy też wszystkich procedur i modułów. Jeśli wydaje Ci się to skomplikowane, to spójrz na poniższe przykłady.

    Option Explicit
    
    Sub MojaProcedura()
     Dim MojaZmienna as String
     ---jakiś kod---
    End Sub

    W powyższym przykładzie, zmienna MojaZmienna, będzie działała tylko w ramach procedury MojaProcedura. Oznacza to że zmienna istnieje tak długo, jak długo trwa procedura. Następnie pamięć jest zwalniana. Wartości przechowywanej przez zmienną, nie będziesz w stanie wykorzystywać w innych procedurach.

    Option Explicit
    
    Dim MojaZmienna as String 
    
    Sub MojaProcedura()
     ---jakiś kod---
    End Sub 

    Umieszczając deklarację zmiennej przed procedurą sprawisz, że będzie ona dostępna również dla innych procedur (w ramach danego modułu). Co więcej, po zakończeniu działania danej procedury, wartość przechowywana przez zmienną nie znika z pamięci – możesz jej użyć w innym kodzie.

    Option Explicit
    
    Public MojaZmienna as String 
    
    Sub MojaProcedura()
     ---jakiś kod---
    End Sub  

    Jeśli użyjesz słowa Public, to zdefiniowana zmienna będzie dostępna dla wszystkich modułów i procedur w ramach danego pliku Excel. Taką zmienną możesz zadeklarować w dowolnym module. Oczywiście, nie będzie też znikała z pamięci po zakończeniu działania danego kodu.

    Zakres obowiązywania zmiennych VBA. Moduły i procedury.

    .

    Podsumowanie

    Wiesz już wszystko co powinieneś wiedzieć (na dobry początek) o zmiennych w VBA. Używaj ich, bo to nie tylko dobra praktyka i ułatwienie w czytaniu kodu. Przede wszystkim, dzięki zmiennym, możesz robić naprawdę ciekawe rzeczy w VBA. Automatyzacja pracy, przetwarzanie wielu plików, arkuszy i wierszy – to wszystko jest możliwe między innymi, dzięki zmiennym.

    Nadal masz wątpliwości lub pytania? Zadaj je w komentarzu, lub dołącz do naszej grupy na Facebooku.


    Masz problemy z Excelem? Uzyskaj pomoc na grupie Keep Calm And Use Excel.

  • Jak pracować z zakresami komórek w VBA?

    Jak pracować z zakresami komórek w VBA?

    Jak pracować z zakresami komórek (Range) w VBA?

    Kontynuujemy naszą podróż po podstawach VBA. Z tego artykułu dowiesz się, jak w VBA pracować z zakresami komórek (Range). To jedna z najbardziej kluczowych umiejętności. Automatyzując pracę często chcemy wykonać jakieś działania właśnie na zakresach.

    Kolorowy obraz komórek

    W kolejnych akapitach dowiesz się:

    • jakie są metody na zapisywanie wartości do pojedynczej komórki, jak i do zakresów komórek,
    • jakie są najbardziej użyteczne metody i właściwości związane z zakresami,
    • poznasz metody na znalezienie ostatniego użytego wiersza w zakresie oraz używanego zakresu komórek.

    W dalszej części artykułu będę posługiwał się słowem Range, które może oznaczać zarówno pojedynczą komórkę jak i zakres komórek.

    Jak zapisywać wartość do komórek w VBA?

    Generalnie masz 3 możliwości, aby odwołać się do komórki lub zakresu w VBA:

    1. za pomocą właściwości Range
    2. za pomocą właściwości Cells
    3. lub wykorzystując nazwane zakresy komórek

    Pomiędzy Range, a Cells występuje kilka różnic ale zauważysz najważniejsze z nich w dalszej części artykułu oraz kiedy napiszę o pętlach w VBA.

    Najlepiej będzie zrozumieć te 3 przypadki na przykładach. Załóżmy, że chcesz stworzyć kod, który w komórce A1 umieści napis „Excelness”. Możesz to zrobić tak:

    Range("A1").Value = "Excelness"

    jak i tak:

    Cells(1,1).Value = "Excelness"

    I pewnie dostrzegasz już pierwszą różnicę. W metodzie Range odwołujemy się do adresu komórki w formacie litera kolumny (A) i numer wiersza (1). Natomiast w metodzie Cells podajemy kolejno: numer wiersza (1) i numer kolumny (1) do której chcemy się odwołać. Adres komórki A1 musimy umieścić w cudzysłowie. Parametr .Value jest opcjonalny ale warto go używać, szczególnie na początku przygody z VBA.

    Jeżeli komórkę A1 nazwiesz np. „Parametr” to w VBA możesz się do niej odwołać również tak:

    Range("Parametr").Value = "Excelness" 

    A co z zakresami? Załóżmy, że zakres A1:B20 chcesz wypełnić liczbą 100. Zapisz tak:

    Range("A1:B20").Value = 100

    lub

    Range(Cells(1,1), Cells(20,2)).Value = 100

    Jeżeli musisz odwołać się do rozdzielnych zakresów – użyj przecinka, aby je rozdzielić:

    Range("A1:B10, E2:E10").Value = 100 
    Wprowadzanie wartości do zakresu komórek Range.

    Natomiast używając poniższego sposobu – wstawisz wartości do wybranych komórek, ale pominiesz komórki pomiędzy nimi:

    Range("A4,E4") = "Excelness"
    Wprowadzanie wartości do rozdzielnego zakresu komórek Range.

    W dalszej nauce VBA, na pewno będziesz chciał używać pętli. W takich przypadkach przydaje się wykorzystanie poniższego odwołania, ponieważ numery wierszy mogą być zmienną (co oznacza, że wartość będzie się zmieniała po uruchomieniu pętli, np. od 1 do 100)

    Range("A" & 6, "E" & 9) = "Excelness"
    Wprowadzanie tekstu do zakresu komórek Range.

    Dobrze jest także wiedzieć, że w ramach jakiegoś zakresu możesz wykorzystać Cells, aby odwołać się do jakieś komórki w ramach tego zakresu:

    Range("A2:D10").Cells(4, 2).Value = 1000
    Wyznaczanie zakresu w zakresie i wprowadzanie wartości za pomocą VBA.

    Jeszcze innym sposobem na odwoływanie się do komórek i zakresów jest wykorzystanie właściwości: Offset oraz Resize.

    Najbardziej użyteczne metody i właściwości w pracy z zakresami (Range)

    Zacznijmy od właściwości Offset. Dzięki niej, możesz „przenieść się” z odwołaniem z jednego zakresu / komórki do drugiego. W poniższym przykładzie, zaczynając w komórce A1, przenosimy się 7 wierszy w dół i 2 kolumny na prawo i w nowej komórce wstawiamy wartość 100.

    Używając wartości ujemnych (np. Offset(-2, -2)) możesz poruszać się także w górę i w prawo.

    Range("A1").Offset(7, 2).Value = 100
    Wykorzystanie Offset na obiekcie Range

    Za pomocą Resize, będziesz mógł natomiast rozszerzyć wstępnie zdefiniowany zakres o daną ilość wierszy i kolumn. Na przykład poniższy kod rozszerza zakres z komórki A1, na 5 wierszy i 3 kolumny, i w nowo zdefiniowanym zakresie wstawia wartość 100.

    Range("A1").Resize(5, 3).Value = 100
    Wykorzystanie Resize na obiekcie Range

    Przykłady innych przydatnych właściwości i metod znajdziesz w poniższej tabeli. Najlepiej jak sam przetestujesz jak działają. Podobno człowiek uczy się najszybciej jak sam coś robi 😉

    Często polecanym sposobem nauki jest używanie rejestratora makr. W ten sposób możesz sprawdzić: składnię, argumenty, czy też w ogóle kluczowe słowa jakie używane są do wykonywania określonych czynności, np. sortowania. Musisz być jednak świadomy, że rejestrowany w ten sposób kod VBA nie jest optymalny i często ma wiele nadmiarowych poleceń.

    Tabela użytecznych metod i właściwości obiektu Range.

    Jak znaleźć ostatni wiersz w zakresie (Range) lub używany obszar?

    Jeżeli jesteś początkujący w VBA, to może Cię zastanawiać dlaczego ma Cię interesować odnajdywanie ostatniego użytego wiersza (czy kolumny) w zakresie.

    To ważny temat, ponieważ wielokrotnie będziesz tworzył kod, którego zadaniem będzie przetwarzanie zakresu, wiersz po wierszu. A przecież każdy zakres jest ograniczony, a co ważniejsze może się zmieniać! Na przykład mogą pojawiać się nowe dane. Dlatego musisz wiedzieć jak wyznaczyć ostatni wiersz (kolumnę) w danym zakresie.

    Metod jest kilka i chyba każda ma wady i zalety. Mam nadzieję, że odkryjemy je wspólnie w kolejnych artykułach. Tymczasem opiszę te (trzy) sposoby.

    Użyj właściwości End obiektu Range

    Powiedzmy, że w aktywnym arkuszu masz jakąś tabelkę w zakresie od A1 do F1000. Codziennie doklejasz tam nowe dane. Twój kod VBA musi za każdym razem znaleźć ostatni użyty wiersz.

    MsgBox Range("A1").End(xlDown).Row

    W powyższym kodzie używamy właściwości End obiektu Range. End ma argument xlDown, co oznacza ni mniej nie więcej, tylko przejście z komórki A1 do ostatnio użytego wiersza w kolumnie A – dokładnie tak jakbyś użył skrótu CTRL + strzałka w dół.

    Dla porządku, powyższy kod wykorzystuje właściwość Row, aby odczytać numer wiersza tej ostatniej komórki oraz funkcję MsgBox, która po prostu wyświetla ten numer w okienku dialogowym.

    Okienko dialogowe MsgBox

    Poeksperymentuj z innymi argumentami właściwości End: xlUp, xlToLeft, xlToRight, aby przekonać się jak możesz odnajdywać pierwszy użyty wiersz, pierwszą użytą kolumnę oraz ostatnią użytą kolumnę.

    Użyj właściwości CurrentRegion obiektu Range

    Kolejna metoda wykorzystuje CurrentRegion, czyli zaznaczenie użytego obszaru. To tak jakbyś w opisywanym zakresie A1:F1000, przykładowo aktywował komórkę F10 i użył skrótu CTRL+A. Cały obszar A1:F1000 – zostanie zaznaczony.

    MsgBox Range("F10").CurrentRegion.Rows.Count

    Jak pewnie się domyśliłeś – powyższy kod zlicza ilość wierszy w aktywnym zakresie – fragment .Rows.Count. Podobnie jak wcześniej MsgBox wyświetli liczbę tych wierszy. Co oczywiste ich liczba wyznacza numer ostatniego wiersza.

    Wykorzystaj metodę SpecialCells

    Wspominałem wcześniej o SpecialCells we fragmencie o najbardziej użytecznych metodach i właściwościach.

    MsgBox Cells.SpecialCells(xlCellTypeLastCell).Address

    Argument tej metody – xlCellTypeLastCell – odnajduje ostatnią użytą komórkę w zakresie. Tym razem użyłem właściwości Address, aby wyświetlić adres tej komórki.


    .

    Podsumowanie

    Jeżeli teraz napiszę, że poruszyliśmy kluczowe tematy w zakresie VBA, to w kolejnym artykule pewnie będę się powtarzał 🙂 W końcu to ma być cykl, który opisuje właśnie te najważniejsze obszary, dając Ci dobre podstawy do dalszych poszukiwań i eksperymentów.

    Jednak zarządzanie zakresami w VBA jest naprawdę kluczowe. Tak jak kluczowe jest dla poprawnego używania Excela. Wyobrażasz sobie użycie funkcji, formuł, tworzenie tabel przestawnych czy wykresów bez wiedzy o zakresach? No właśnie… ja też nie 🙂

    Mam nadzieję, że przybliżyłem Ci ten temat i zachęciłem do własnych ćwiczeń. Jeżeli natrafisz na problem – daj znać. Rozwiążemy go wspólnie!


    Masz problemy z Excelem? Uzyskaj pomoc na grupie Keep Calm And Use Excel.

  • Podstawy VBA. Od czego zacząć?

    Podstawy VBA. Od czego zacząć?

    Podstawy VBA

    Czy VBA jestem świętym Graalem, rozwiązującym wszystkie problemy jakie masz w Excelu? Najprostsza odpowiedź brzmi NIE. Ale jednocześnie, dzięki znajomości VBA, z pewnością możesz:

    • robić rzeczy jakich nie zrobiłbyś bez tej wiedzy – zyskujesz nowe możliwości,
    • automatyzować pracę swoją i innych – zyskujesz czas.
    Podstawy VBA. Kobieta pisząca kod na laptopie.

    Tym artykułem rozpoczynam cykl, którym zamierzam w uporządkowany sposób przekazać Ci podstawy VBA. Będę w 100% szczery. Nie jestem mistrzem VBA. Ale pomyślałem, że to może być zaleta. Nie będę mówił do Ciebie jak programista i być może dzięki temu ta wiedza będzie bardziej zjadliwa 😉

    Zanim przejdziesz dalej, przeczytaj mój artykuł o rejestrowaniu makr. Dzięki temu zyskasz wiedzę jak:

    • dodać na wstążce kartę DEVELOPER, która zbiera polecenia związane z makrami i VBA,
    • nagrać makro,
    • uruchomić edytor VBA i modyfikować zapisany przez rejestrator kod.

    To będzie dobry wstęp, aby ruszyć z dalszą nauką. Takie podstawy podstaw VBA 😉

    VBA, czyli manipulowanie obiektami

    Visual Basic for Applications (VBA) to język programowania, który pozwala na automatyzację pracy z dokumentami w programach Microsoft Office. Kod VBA będzie zapisany w pliku dokumentu MS Office, np. w arkuszu Excela. To oznacza, że aby wywołać działanie takiego programu potrzebujesz najpierw uruchomić dany program. W naszym przypadku – Excel.

    VBA wykorzystuje tzw. model obiektowy. Poprzez pisanie kodu VBA zazwyczaj rozumiemy manipulowanie obiektami. Obiekty mają właściwości i metody, za pomocą których wykonujesz działania na tychże obiektach. I jest to w zasadzie klucz do zrozumienia całego języka. No dobra, ale co to właściwie oznacza?

    Posłużę się analogią. Weźmy samochód. Samochód, ma: kolor, wielkość, określony silnik, pojemność i wiek. To właściwości samochodu. Samochód możesz także: uruchomić, ruszyć do przodu, zahamować…etc. – to metody jakich możesz użyć.

    Przełóżmy to na język Excela. Jeżeli obiektem będzie pojedyncza komórka (samochód) to jej właściwością może być np. adres (A1), a metodą – wyczyszczenie zawartości (Clear)

    Obiekty mogą występować w relacjach, tworząc hierarchię. I znowu posłużmy się analogią. Weźmy dom (obiekt podstawowy). Pojedynczy dom jest częścią osiedla (kolekcja) Natomiast osiedla są częścią dzielnicy, a dzielnice – miasta. Mamy więc kolekcję domów, osiedli i w końcu dzielnic.

    W Excel VBA mamy na przykład zakres (może być pojedyncza komórka), która jest obiektem w skoroszycie (skoroszytów może być więcej i tworzą kolekcję), a ten z kolei jest częścią zeszytu (pliku Excela) I tak, przykładowo w VBA aby odwołać się do zakresu / komórki A1 możesz użyć kodu:

    Workbooks("Zeszyt1").Worksheets("Arkusz1").Range("A1")

    Jak pewnie zauważyłeś odwołanie do kolejnych obiektów następuje z wykorzystaniem „.” (kropki)

    Właściwości vs. metody

    Jeżeli do tej pory wszystko jest dla Ciebie jasne to jesteś na dobrej drodze, aby opanować podstawy VBA 🙂 Sprawę komplikuje trochę fakt, że zarówno właściwości jak i metod używasz tak samo. Co mam na myśli? Spójrz na przykład:

    Range("A1").Address
    Range("A1").Select

    Jak widzisz, mamy ten sam obiekt – Range(„A1”) ale raz mówimy o właściwości (Address), a raz o metodzie (Select) Skąd właściwie masz wiedzieć co jest czym? O tym nieco później.

    Podstawy VBA: Właściwości

    Właściwości pojawiają się na końcu hierarchii obiektów. Przykładowo:

     Workbooks("Zeszyt1").Worksheets("Arkusz1").Range("A1").Value

    To pewnie zamiesza Ci trochę w głowie ale właściwości mogą także zwracać…obiekty.

    Część właściwości możesz tylko odczytać, a część zarówno odczytać jak i zapisać. Na przykład Address to właściwość, którą możesz tylko odczytać. To dość logiczne, bo przecież nie możesz zmienić adresu komórki A1.

    Z kolei Value, to przykład właściwości którą możesz zarówno odczytać, jak i zapisać. I to również jest logiczne, bo przecież możesz zarówno odczytać zawartość jakieś komórki, jak i zmienić jej wartość.

    Podstawy VBA: metody

    Co musisz wiedzieć o metodach? Na początku dwie rzeczy. Po pierwsze metoda może zmienić właściwość. Po drugie część metod, zawiera dodatkowe informacje, które precyzują jej działanie. To argumenty metody.

    Przykładowo metoda Clear, może zmienić wartość (Value) komórki, czyli jej właściwość.

    Range("A1").Clear

    Z kolei metoda PasteSpecial (wklej specjalnie) ma 4 dodatkowe argumenty / parametry: Paste, Operation, SkipBlanks, Transponse. Przykładowo możesz zapisać te dodatkowe parametry w metodzie tak:

    Range("B1").PasteSpecial xlPasteValues

    ale również tak:

    Range("B1").PasteSpecial Paste:=xlPasteValues

    Jak widzisz w pierwszym przypadku, od razu podajesz wartość parametru (xlPasteValues, oznacza tu wklejenie wartości), a w drugim następuje przypisanie do danego argumentu za pomocą znaków „:=”.

    Podstawy VBA: procedura SUB

    W zasadzie jesteś gotowy aby napisać swój pierwszy kod. I zanim zabierzemy się do rzeczy, dwa słowa wprowadzenia.

    Zazwyczaj (nie zawsze) kod wpisujesz w procedurze SUB. Wygląda to tak:

    Sub JakasNazwa()
    ...
     Twoj kod
    ...
    End Sub

    Procedura Sub to po prostu logiczny zestaw poleceń, który wykonuje jakieś działanie lub zestaw działań. Procedury umieszczasz w modułach (Module) ale to od Ciebie zależy, czy umieścisz wszystkie procedury w jednym module czy rozdzielisz na kilka. Na razie nie musisz się tym przejmować.

    Nie będziemy robić nic skomplikowanego i wystarczy nam jedna procedura i jeden moduł. Nasza procedura ma za zadanie skopiować zawartość komórki A1 i wkleić ją jako wartość (bez formuły) do komórki B1.

    Co musisz zrobić, aby to osiągnąć?

    • utwórz nowy plik, a następnie w komórce wpisz dowolną formułę. Może być =2+2 😉
    • uruchom edytor VBA (skrót ALT + F11),
    • po lewej stronie, w oknie Project – VBA Project odnajdź nazwę swojego pliku (zapewne Zeszyt1),
    • kliknij prawym przyciskiem myszy na tę nazwę (VBA Project – Zeszyt1) i wybierz INSERT > MODULE,
    • w środkowej części ekranu pojawi się puste okno, gdzie możesz zacząć pisać kod.
    Podstawy VBA. Wstawianie modułu.

    Podstawy VBA: procedura SUB (przykład)

    Sub KopiujWartosci()
     Range("A1").Copy
     Range("B1").PasteSpecial Paste:=xlPasteValues
    End Sub

    Po wpisaniu kodu, uruchamiasz go skrótem F5. Odpowiednią opcję znajdziesz również na pasku narzędzi.

    Podstawy VBA. Pasek narzędzi z poleceniem Uruchom.

    Jeżeli będziesz chciał zapisać plik z napisanym właśnie kodem, musisz to zrobić wybierając odpowiedni format pliku – skoroszyt programu Excel z obsługą makr (rozszerzenie pliku .xlsm)

    Prześledźmy wspólnie kod linijka po linijce.

     Sub KopiujWartosci()

    Zaczynamy od zdefiniowania procedury – słowo kluczowe Sub oraz nazwy KopiujWartosci. Całość kończy się nawiasami. Na marginesie, pomiędzy nawiasami będziesz mógł umieszczać argumenty i przekazywać wyniki z / do innych procedur. Ale póki co – po prostu zostawiamy otwarty i zamknięty nawias. To konieczne dla poprawności składni.

     Range("A1").Copy

    Dalej mamy zdefiniowany obiekt Range(„A1”), czyli po prostu komórka A1. Skąd wiadomo z którego arkusza / pliku to będzie komórka? Ponieważ nie definiujemy tego wcześniej (przed Range(„A1”)) będzie to komórka A1 aktywnego arkusza – w momencie uruchomienia kodu.

    Następnie, po kropce definiujemy metodę – Copy, czyli po prostu skopiowanie zawartości komórki.

      Range("B1").PasteSpecial Paste:=xlPasteValues

    Kolejna linijka, to znowu obiekt – Range(„B1”) oraz metoda PasteSpecial (wklej specjalnie) Dalej korzystamy z parametru xlPasteValues, aby wkleić tylko wartości.

    End Sub

    Całą procedurę musimy zakończyć słowami End Sub, co jest wymaganą składnią dla poprawności działania całej procedury.


    .

    Podsumowanie

    Zaryzykuję stwierdzenie, że VBA sprowadza się do manipulowania obiektami: komórkami, zakresami, wykresami, tabelami etc. Przy czym możesz wykorzystywać przy tym elementy charakterystyczne dla „klasycznych” języków programowania takich, jak: pętle, instrukcje warunkowe czy zmienne.

    Jeżeli zrozumiesz na czym polega hierarchiczność obiektów (np. komórka w arkuszu, arkusz w skoroszycie) oraz zapamiętasz najważniejsze pojęcia: obiekt, właściwość, metoda to będzie dobry początek aby szybko przyswajać pozostałe elementy VBA.

    Mam nadzieję, że wspólnie ze mną 😉 Daj znać w komentarzu, jeżeli masz jakieś pytania albo chciałbyś się podzielić swoimi doświadczeniami w nauce VBA.


    Masz problemy z Excelem? Uzyskaj pomoc na grupie Keep Calm And Use Excel.

  • Jak nagrać makro

    Jak nagrać makro

    Jak nagrać makro

    Kiedyś musi być ten pierwszy raz, prawda? Pierwsza praca. Pierwsza jazda samochodem. Pierwsze pieniądze. Po lekturze artykułu będziesz wiedział jak nagrać makro. Twoje pierwsze makro! Potem już tylko: sława, pieniądze… A nie, to nie ten temat 😉

    Przede wszystkim na temat makr krąży wiele mitów. Wielu widzi w nich remedium na wszystkie excelowe problemy. „Gdybym tylko znał makra, rozwiązałbym ten problem w pracy” – myśli niejeden z nas. Tymczasem to nieprawda. No, nie całkiem prawda.

    kamera w dłoniach

    Czym jest makro?

    Mówiąc w skrócie, jest to zestaw poleceń, który pozwala na zautomatyzowanie często powtarzanych czynności. Makro możesz zarejestrować, tak jak nagrywasz film. Klikasz wirtualną migawkę w Excelu i zaczynasz działać. Makro „nagrywa” kolejne kroki, które wykonujesz w postaci tajemniczo wyglądających poleceń.

    Na przykład jeżeli włączę rejestrowanie makra, wykonując czynności które w efekcie dadzą taki efekt:

    fragment danych Excel z nagłówkiem

    program zarejestruje taki kod:

    Sub Makro1()
    'Makro1 Makro
    With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .Color = 65535
    .TintAndShade = 0
    .PatternTintAndShade = 0
    End With
    Selection.Font.Bold = True
    ActiveCell.FormulaR1C1 = "Nagłówek"
    Range("A2").Select
    ActiveCell.FormulaR1C1 = "Firma A"
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "Firma B"
    End Sub

    Obłęd! Wpisałem trzy słowa. Wyboldowałem nagłówek. Pokolorowałem tło na żółto. A w efekcie mam tyle linijek jakiś „chińskich krzaczków” 😉

    Na szczęście w ogóle nie musisz patrzeć na te polecenia. Jeśli będziesz chciał uruchomić makro, po prostu wybierzesz odpowiednie polecenie. Program błyskawicznie wykona zestaw czynności, które zarejestrowałeś. I nie musisz nic więcej robić.

    Nagrywane makra są „tłumaczone” na język poleceń zrozumiałych dla Excela. Tym językiem jest VBA (Visual Basic for Application) Jeśli będziesz chciał zapisać zeszyt z nagranym makrem, musisz to zrobić wybierając odpowiedni format pliku – skoroszyt programu Excel z obsługą makr (rozszerzenie pliku .xlsm)

    Znając VBA wkraczasz w zupełnie nowy świat możliwości Excela. Ale nie od razu Kraków zbudowano 😉 Od czegoś trzeba zacząć.


    Przeczytaj również:


    Nagrywamy makro

    Powiedzmy, że chcesz stworzyć makro, które zaznaczy wszystkie komórki, które zawierają formuły. Taka dodatkowa wizualizacja na pewno pomoże, w codziennej pracy z wieloma arkuszami.

    Otwórz dowolny plik, który zawiera jakieś formuły. Możesz skorzystać z tego. Następnie postępuj wg poniższych kroków:

    1. Ustaw się w dowolnej komórce, w zakresie danych (w zakresie jakieś tabeli)
      tabela z danymi Excel
    2. Kliknij kartę DEWELOPER i wybierz ZAREJESTRUJ NOWE MAKRO.
      wstążka DEWELOPER programu Excel

    Jeżeli nie widzisz karty DEWELOPER, wybierz PLIK > OPCJE > DOSTOSOWYWANIE WSTĄŻKI i po prawej stronie zaznacz kartę DEWELOPER.

    widok opcji programu Excel
    1. Kliknij skrót CTRL + A na klawiaturze, tym samym zaznaczysz cały obszar tabeli
      zaznaczone dane w tabeli Excel
    2. Teraz użyj skrótu CTRL + G, aby przejść do komórek specjalnych.
      okienko dialogowe przechodzenie do komórek specjalnych
    3. Wybieramy FORMUŁY i oczywiście zatwierdzamy, klikając OK.
      okienko przechodzenie do - specjalne
    4. Excel zaznaczy tylko te komórki, które zawierają formuły.
    5. W dowolny sposób sformatuj te komórki. Ja wybrałem czerwoną czcionkę.
      tabela z danymi Excel - komórki z formułami pokolorowane na czerwono
    6. Gotowe! Możesz zatrzymać rejestrator makr wybierając ZATRZYMAJ REJESTROWANIE na karcie DEWELOPER.

    Modyfikujemy kod VBA

    Gratulacje! Nagrałeś makro. Jeżeli robiłeś to na moim pliku, powinieneś otrzymać poniższy kod.

    Sub Makro2()
    'Makro2 Makro
    Range("B2:G12").Select
    Range("E11").Activate
    Selection.SpecialCells(xlCellTypeFormulas, 23).Select
    With Selection.Font
    .Color = -16776961
    .TintAndShade = 0
    End With
    End Sub

    Aby zobaczyć kod, wybierz skrót ALT + F11, dzięki czemu przejdziesz do edytora Visual Basic. W tym artykule nie będziemy opisywać całego edytora. Skupimy się tylko na najważniejszej dla nas kwestii.

    Wybierz Module1 po lewej stronie, a po prawej ukaże się okno edytora z kodem makr które nagrywałeś.

    widok edytora VBA z zaznaczonym modułem i makrem

    W interesującym nas Makrze nr2 mamy taką linijkę kodu:

    Range("B2:G12").Select

    Co oznacza, że nasze makro będzie zawsze działało na zakresie B2:G12. No zaraz! Ale przecież chcieliśmy stworzyć uniwersalne narzędzie. Ma kolorować komórki z formułami niezależnie od tego, gdzie znajduje się nasz zakres danych. Co zrobić? Musisz ręcznie zmodyfikować kod. W miejsce tych dwóch linijek:

    Range("B2:G12").Select
    Range("E11").Activate

    wpisz:

    Selection.CurrentRegion.Select

    Ta linijka kodu powoduje, że zaznaczany jest cały obszar komórek przylegających do aktualnie zaznaczonej. Następnie cały ten obszar jest zaznaczany. Dalszą część kodu pomijamy.

    Teraz możesz już śmiało przetestować makro:

    • stwórz nowy arkusz z tabelką i formułami,
    • skopiuj do niego swoje makro (możesz po prostu skopiować kod),
    • następnie uruchom makro i sprawdź czy wszystkie komórki z formułami zostały pokolorowane na czerwono.

    Możesz też skorzystać z gotowego pliku.

    Wady i zalety rejestratora makr

    Jak widzisz samo nagrywanie makra to nic trudnego. Ale podobno w życiu istnieje zasada: jak coś przychodzi nam zbyt łatwo to najczęściej nie jest tak samo wartościowe, jak to co zdobywamy z trudem 😉

    W przypadku makr zasada sprawdza się znakomicie: możesz w prosty sposób zarejestrować czynności, które wykonujesz w Excelu, a potem odtworzyć je…w identyczny sposób. Problem w tym, że pomimo wykonywania tego samego zestawu czynności, najczęściej działamy: na różnych plikach, arkuszach, obszarach danych. Tu zwykły rejestrator makr nie pomoże. Trzeba poznać VBA.

    Wg mnie główną zaletą rejestratora makr, jest właśnie możliwość nauki. Rejestrujesz makro, zmieniasz wielkość czcionki. Wchodzisz w edytor.

    – Acha…więc takie polecenie zmieniło mi wielkość czcionki…noooo ciekawe…

    Niestety rejestrator nie da Ci najbardziej czystego i optymalnego kodu. Ale na początek to nie jest najważniejsze. Niemniej jednak, będziesz mógł posmakować świata automatycznego Excela. Skoro już wiesz jak nagrać makro, to do dzieła! Próbuj, ucz się, zadawaj pytania – działaj!


    Masz problemy z Excelem? Uzyskaj pomoc na grupie Keep Calm And Use Excel.