Dataniedziela, 9 sierpnia 2026 Czas07:21:33
← Arkusz kalkulacyjny (Excel)

Lekcja 6. Makra i VBA — automatyzacja arkusza własnym kodem (rozszerzenie)

Trudny / egzaminacyjny

Po co się tego uczymy?

Formuły i tabele przestawne rozwiązują większość zadań w arkuszu — ale co, gdy chcesz, żeby jedno kliknięcie przycisku sformatowało cały raport, wysłało dane do innego arkusza i pokazało komunikat na koniec? To już nie jest formuła — to PROGRAM napisany wewnątrz arkusza. Makra i VBA (Visual Basic for Applications) to most między światem arkuszy a światem prawdziwego programowania, który poznajesz w tym kursie.

Teoria

Czym jest makro — to ZAPISANA sekwencja czynności wykonanych w arkuszu (kliknięcia, wpisywanie, formatowanie), którą można OD TWORZYĆ jednym kliknięciem przycisku, zamiast powtarzać te same kroki ręcznie za każdym razem.

Nagrywanie makra — najprostszy sposób tworzenia makra to REJESTRATOR: włączasz nagrywanie, wykonujesz czynności w arkuszu (np. formatujesz komórki na czerwono, sortujesz dane), wyłączasz nagrywanie — Excel automatycznie ZAPISUJE te kroki jako kod VBA, który możesz potem odtworzyć.

VBA (Visual Basic for Applications) — to język programowania wbudowany w Excel, w którym można pisać WŁASNY kod sterujący arkuszem — nie tylko nagrywać czynności, ale też używać zmiennych, pętli i instrukcji warunkowych, dokładnie jak w Pythonie czy C#, które już znasz z tego kursu.

Podstawowa struktura procedury VBA:

  • Sub NazwaProcedury() ... End Sub — blok kodu, który MOŻNA URUCHOMIĆ (odpowiednik funkcji void w innych językach — nie zwraca wartości).
  • Range("A1").Value = 10 — sposób ODWOŁANIA SIĘ do konkretnej komórki i wpisania do niej wartości z poziomu kodu.
  • Cells(wiersz, kolumna) — alternatywny sposób odwołania do komórki przez WSPÓŁRZĘDNE liczbowe (wygodny w pętlach).
  • For ... Next — pętla licznikowa w VBA, odpowiednik pętli for z Pythona/C#, pozwalająca przejść przez wiele wierszy/komórek automatycznie.
  • If ... Then ... Else ... End If — instrukcja warunkowa, działająca analogicznie do poznanego już if/elif/else.
  • MsgBox "tekst" — wyświetla okienko z komunikatem (przydatne np. do informowania użytkownika, że makro skończyło pracę).

Przypisanie makra do przycisku — makro można uruchomić z edytora VBA, ale w praktyce zwykle przypisuje się je do PRZYCISKU wstawionego na arkuszu, żeby użytkownik NIEZNAJĄCY VBA mógł uruchomić automatyzację jednym kliknięciem.

Bezpieczeństwo makr — pliki z makrami (.xlsm) mogą zawierać SZKODLIWY kod, dlatego domyślnie Excel BLOKUJE uruchamianie makr z plików pobranych z internetu i wymaga świadomej zgody użytkownika — ważna umiejętność cyfrowego bezpieczeństwa, do której wrócimy w dziale "Bezpieczeństwo i prawo".

Schemat

ZWYKŁA PRACA W ARKUSZU:          Z MAKREM VBA:
1. Zaznacz komórki ręcznie        1. Kliknij przycisk "Formatuj raport"
2. Ustaw kolor czcionki                    ↓
3. Ustaw pogrubienie              Sub FormatujRaport()
4. Posortuj dane                      Range("A1:D1").Font.Bold = True
5. Zapisz plik                        (sortowanie, formatowanie...)
   (5 kroków RĘCZNIE,                  MsgBox "Gotowe!"
    za KAŻDYM razem)                End Sub
                                   (1 KLIKNIĘCIE, zawsze te same kroki)

Przykład z życia

Księgowa, która co miesiąc dostaje nowy plik z listą transakcji i musi go sformatować w IDENTYCZNY sposób (pogrubić nagłówki, dodać sumy, pokolorować ujemne kwoty na czerwono), nagrywa TO makro RAZ, a potem każdego miesiąca klika JEDEN przycisk zamiast powtarzać 20 czynności ręcznie.

FormatujRaportSprzedazy.bas

Sub FormatujRaportSprzedazy()
    ' Pogrub i podkreśl wiersz nagłówkowy
    Range("A1:D1").Font.Bold = True
    Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlContinuous

    ' Przejdź przez wiersze 2-10 i pokoloruj ujemne kwoty na czerwono
    Dim i As Integer
    For i = 2 To 10
        If Cells(i, 4).Value < 0 Then
            Cells(i, 4).Font.Color = RGB(255, 0, 0)
        Else
            Cells(i, 4).Font.Color = RGB(0, 0, 0)
        End If
    Next i

    ' Wpisz sumę kwot w wierszu 11
    Cells(11, 4).Value = Application.WorksheetFunction.Sum(Range("D2:D10"))
    Cells(11, 4).Font.Bold = True

    MsgBox "Raport sformatowany! Suma: " & Cells(11, 4).Value
End Sub

Komentarz i wyjaśnienie kodu

Zwróć uwagę, jak bardzo ten kod przypomina Pythona i C#, których uczyłeś się wcześniej: Dim i As Integer to DEKLARACJA zmiennej (jak int i w C# albo po prostu i = 0 w Pythonie), For i = 2 To 10 ... Next i to PĘTLA licznikowa, a If ... Then ... Else ... End If to znana instrukcja warunkowa. VBA różni się głównie SKŁADNIĄ (słowa kluczowe zamiast nawiasów klamrowych czy dwukropków), ale LOGIKA programowania jest identyczna — to dowód, że umiejętności programistyczne PRZENOSZĄ SIĘ między językami.

Application.WorksheetFunction.Sum(...) pokazuje, że z poziomu VBA można wywoływać te same funkcje arkusza (SUMA, ŚREDNIA itd.), których nauczyłeś się w poprzednich lekcjach — VBA nie zastępuje formuł, tylko je ROZSZERZA o programowalną logikę.

Ćwiczenie samodzielne

Otwórz edytor VBA (Alt+F11 w Excelu), wstaw nowy moduł i napisz prostą procedurę Sub PrzywitajSie(), która wyświetla MsgBox "Cześć ze świata VBA!". Uruchom ją (F5) i sprawdź działanie.

Zadania do pracy własnej

  1. Napisz makro, które wpisuje wartości od 1 do 10 w komórki A1:A10 przy pomocy pętli For ... Next (bez ręcznego wpisywania każdej liczby).

  2. Napisz makro, które przechodzi przez komórki A1:A20 i dla każdej z nich sprawdza, czy liczba jest parzysta czy nieparzysta (użyj operatora Mod, odpowiednika Pythonowego %), wpisując wynik ("parzysta"/"nieparzysta") w sąsiedniej kolumnie B.

  3. Napisz makro, które: (1) przechodzi przez kolumnę z ocenami uczniów (np. A1:A15), (2) liczy średnią przy pomocy Application.WorksheetFunction.Average, (3) dla każdego ucznia wpisuje w kolumnie B komentarz "powyżej średniej" lub "poniżej średniej" na podstawie porównania z obliczoną średnią, (4) na końcu wyświetla MsgBox z podsumowaniem liczby uczniów w każdej grupie. Przypisz makro do przycisku na arkuszu.

Typowe błędy

Zapominanie o End Sub na końcu procedury — VBA zgłosi błąd składni, bo każdy blok Sub musi być jawnie zamknięty, podobnie jak zamykający nawias klamrowy w C# czy poprawne wcięcie w Pythonie.

Mylenie Range("A1") z Cells(1,1) — obie formy odnoszą się do TEJ SAMEJ komórki, ale mają inną składnię (Range przyjmuje adres jako tekst, Cells przyjmuje współrzędne liczbowe wiersz/kolumna) — mieszanie ich w jednej linii bez zrozumienia różnicy prowadzi do błędów przy pętlach.

Uruchamianie plików z makrami z nieznanego źródła — akceptowanie monitu "Włącz zawartość" dla pliku .xlsm pobranego z niezaufanej strony to częsty wektor ataku (makrowirusy) — nigdy nie włączaj makr w plikach z niepewnego źródła.

Nawiązanie do egzaminu zawodowego

To ostatnia, opcjonalna lekcja działu "Arkusz kalkulacyjny" (zakres rozszerzony) — VBA pokazuje, że nawet "zwykły" program biurowy można rozszerzyć PRAWDZIWYM kodem, łącząc świat arkuszy kalkulacyjnych ze światem programowania, które jest fundamentem całego tego kursu. W kolejnym dziale, "Grafika i multimedia", zajmiemy się zupełnie inną stroną informatyki — przetwarzaniem obrazu i dźwięku.