Mini kurs programowania dla początkujących [2/2] – Nauka VBA z AI

🛠️ Tutorial

To już druga część mojego mini kursu nauka programowania z AI. W pierwszym wpisie pokazałem Ci, jak wykorzystać AI do nauki Pythona (jeśli jeszcze go nie widziałeś, zajrzyj tutaj – tam znajdziesz pełne wprowadzenie, w którym tłumaczę, dlaczego nauka z AI to dobry sposób na start).

Teraz czas na VBA— język, który od lat rządzi w Excelu i pakiecie Office. To prostsze środowisko niż Python, ale za to niezwykle praktyczne w codziennej pracy biurowej. Dzięki VBA możesz stworzyć makro, które w sposób automatyczny wykona w Excelu dowolną operację, jaką dotychczas robiłeś ręcznie, np.: wprowadzi wartości do komórek, pokoloruje je, utworzy nowy arkusz czy wygeneruje wykres.

Ogromnym plusem VBA jest to, że od razu widzisz efekt działania swojego kodu w arkuszu. Excel staje się takim „interfejsem graficznym” Twoich programów. Przy odrobinie kreatywności można w nim nawet zbudować proste gry, gdzie planszą jest arkusz kalkulacyjny.

Wracając do tematyki związanej z biznesem i automatyzacją: kiedyś stworzyłem w Excelu narzędzie do wizualizacji wypełnienia wózków transportowych szybami. Program traktował komórki arkusza jak piksele i rysował wózek wraz z szybami. Dzięki temu można było zasymulować plan produkcyjny i sprawdzić, czy duże tafle szkła nie leżą obok małych (co było niewskazane).

Istotną zaletą VBA dla osób początkujących jest to, że wbudowany w Excela edytor kodu VBE (Visual Basic Editor) umożliwia nagrywanie makr. Tak! Możesz po prostu nagrać dowolne operacje, które wykonujesz w Excelu i od razu wygenerować program, który powtórzy nagrane czynności w sposób automatyczny.

I najlepsze — aby zacząć naukę VBA nie potrzebujesz żadnych dodatkowych instalacji — wszystko masz w swoim Excelu. Za chwilę przejdziemy do głównej części wpisu — listy z promptami dla nauczyciela AI. Identycznie jak w części pierwszej, w tym wpisie również dołączyłem odpowiedzi od AI (które zweryfikowałem i ewentualnie lekko zmodyfikowałem). Ciebie zachęcam do eksperymentowania z nauczycielem AI samodzielnie — wklejaj moje prompty do wybranego czata (rekomenduję GPT lub Gemini) i sprawdzaj, jak AI tłumaczy Ci kolejne tematy.


Wprowadzenie techniczne

Zanim zajmiemy się nauką VBA z AI, zróbmy krótkie wprowadzenie techniczne w którym m.in. wyjaśnię jak uruchomić edytor kodu VBE, a także pokażę Ci jak nagrywać makra w Excelu.

Zakładka Deweloper

Wszystkie narzędzia niezbędne do pracy z makrami znajdują się w zakładce Deweloper w Excelu. Otwórz Excela i sprawdź czy masz tę zakładkę widoczną u siebie. Jeśli nie – postępuj zgodnie z poniższą instrukcją.

  1. Kliknij prawym przyciskiem myszy na wstążce i wybierz Dostosuj wstążkę (rys. 1)
  2. Zaznacz opcję Deweloper i kliknij OK (rys. 2)
kurs vba dla początkujących - wstążka
Rys. 1. Excel – przycisk Dostosuj Wstążkę
makra VBA w Excelu - zakładka Deweloper
Rys. 2. Excel – włącz zakładkę Deweloper

Od teraz masz dostęp do wszystkiego, co potrzebne, żeby nagrać swoje pierwsze makro.

Nagrywanie pierwszego makra VBA w Excelu

Każdy dobry kurs VBA dla początkujących rozpoczyna się od rejestratora makr — nie inaczej będzie i tym razem. Po włączeniu karty Deweloper, w lewym dolnym rogu Twojego Excela pojawił się przycisk nagrywania makr (rys. 3). Jeśli go wciśniesz to wszystko, co robisz w Excelu, zostanie zarejestrowane do programu VBA (możesz też użyć przycisku Zarejestruj Makro na karcie Deweloper).

automatyzacja Excela z VBA - przycisk nagraj makro
Rys. 3. Excel – przycisk Rejestratora Makr

Wciśnij teraz ten przycisk aby nagrać swoje pierwsze makro, a następnie w okienku, które się pojawiło potwierdź nazwę makra przyciskiem OK. 

Od tej chwili każda czynność w Excelu zostanie zapisana w kodzie VBA. Na potrzeby testu przeprowadź następujące operacje:

  1. Zaznacz komórkę A1.
  2. Wpisz do zaznaczonej komórki tekst “toThePyPoint.pl” i wciśnij Enter.
  3. Jesteś teraz w komórce A2 – wpisz tutaj wartość 1 i wciśnij Enter.
  4. Do komórki A3 wprowadź wartość 2 i wciśnij Enter.
  5. Do komórki A4 wprowadź formułę =SUMA(A2:A3) i wciśnij Enter.
  6. Zaznacz ponownie komórkę A4 i zmień jej kolor na pomarańczowy.

Na koniec zatrzymaj nagrywanie przyciskiem w lewym dolnym rogu (rys. 4). Pierwsze cztery komórki kolumny A w Twoim Excelu powinny wyglądać tak, jak pokazałem na załączonym zrzucie ekranu (rys. 5).

automatyzacja Excela z VBA - przycisk zatrzymaj nagrywanie
Rys. 4. Excel – zatrzymaj nagrywanie makra
rejestrator makr VBA w Excelu - przykład
Rys.5. Excel – nagrywanie prostych operacji

Twoje makro zostało nagrane i możesz je wykorzystać do automatyzacji Excela z VBA w dowolnym momencie. Odnajdziesz je we wbudowanym edytorze kodu – VBE.

Edytor kodu

Wbudowany Edytor kodu możesz otworzyć wciskając na swojej klawiaturze skrót alt + F11.

Pojawi się okno (rys. 6) w którym — oprócz głównego okna z kodem — znajdziesz kilka innych sekcji (oznaczyłem je na rysunku stosownymi numerami):

  1. Ikony, np.: do uruchomienia makra. Klikając prawym przyciskiem myszy w tym obszarze, możesz dodać dodatkowe zestawy ikon — między innymi do łatwiejszej pracy z kodem (komentowanie wielu linii, ustawianie wcięć/akapitów)
  2. Okno struktury projektu. Tutaj znajdziesz arkusze z Twojego pliku oraz nazwy wszystkich modułów. Klikając prawym przyciskiem myszy w tym obszarze, możesz wstawić nowy moduł. Zapisywanie różnych makr w osobnych modułach pozwala zachować uporządkowaną strukturę projektu.
  3. Okno z cechami obiektów. Znajdziesz tutaj cechy wybranego obiektu — np.: modułu, arkusza czy formularza. Możesz tutaj zmienić domyślną nazwę modułu `Modul1` na dowolną inną np.: moduleMojeMakra. 
  4. Okno Immediate – , gdzie możesz testować pojedyncze linie kodu. Zaznacz w Excelu komórkę A1, a następnie wpisz w tym oknie ?ActiveCell.Value. Po naciśnięciu Enter zobaczysz wartość aktywnej komórki.
edytor kodu makr vba w Excelu
Rys. 6. Excel – edytor kodu VBA

Jak uruchomić nagrane makro?

Makro które zarejestrowałeś znajduje się w Module 1-szym. Jeśli prześledzisz otrzymany kod linia po linii zauważysz, że jest tam wszystko to, co przed chwilą robiłeś w Excelu manualnie. Na początek możesz zmienić nazwę tego programu z domyślnej Makro1() np. na PierwszeMakro(). Zrobisz to edytując pierwszą linię kodu – po słowie kluczowym Sub. 

Poniżej wklejam ten sam kod z komentarzami objaśniającymi:

Sub PierwszeMakro()
'
' To jest nazwa Twojego makra.
' Komentarze dodane przez rejestrator makr są pomijane dla czytelności.
'

    ' Zaznacza komórkę A1 w aktywnym arkuszu.
    Range("A1").Select
    
    ' Do aktywnej komórki (czyli A1) wstawia tekst "toThePyPoint.pl".
    ActiveCell.FormulaR1C1 = "toThePyPoint.pl"
    
    ' Zaznacza komórkę A2.
    Range("A2").Select
    
    ' Ustawia szerokość całej kolumny "A" na 13.71 jednostek.
    Columns("A:A").ColumnWidth = 13.71
    
    ' Do aktywnej komórki (A2) wstawia wartość "1".
    ActiveCell.FormulaR1C1 = "1"
    
    ' Zaznacza komórkę A3.
    Range("A3").Select
    
    ' Do aktywnej komórki (A3) wstawia wartość "2".
    ActiveCell.FormulaR1C1 = "2"
    
    ' Zaznacza komórkę A4.
    Range("A4").Select
    
    ' Do aktywnej komórki (A4) wstawia formułę, która sumuje dwie komórki powyżej.
    ' Zapis R[-2]C:R[-1]C to odwołanie względne w stylu R1C1, które oznacza:
    ' R[-2]C -> komórka 2 wiersze wyżej w tej samej kolumnie (czyli A2)
    ' R[-1]C -> komórka 1 wiersz wyżej w tej samej kolumnie (czyli A3)
    ' W efekcie w komórce A4 pojawi się formuła =SUMA(A2:A3).
    ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"
    
    ' Ponownie zaznacza komórkę A4 (ta linia jest zbędna, bo komórka jest już zaznaczona).
    Range("A4").Select
    
    ' Rozpoczyna blok operacji na tle (wnętrzu) zaznaczonej komórki (A4).
    With Selection.Interior
        ' Ustawia wzór tła na jednolity kolor.
        .Pattern = xlSolid
        ' Ustawia automatyczny indeks koloru dla wzoru.
        .PatternColorIndex = xlAutomatic
        ' Ustawia kolor tła na 49407, co odpowiada pomarańczowemu kolorowi.
        .Color = 49407
        ' Nie stosuje rozjaśnienia ani przyciemnienia koloru.
        .TintAndShade = 0
        ' Nie stosuje rozjaśnienia ani przyciemnienia dla wzoru.
        .PatternTintAndShade = 0
    ' Kończy blok operacji na tle komórki.
    End With
    
' Kończy procedurę makra.
End Sub

Kod nagrany rejestratorem działa, ale często zawiera zbędne linie (Select, Activate). Dobrą praktyką jest uproszczenie go. Zamiast długiego kodu z zaznaczaniem, możesz napisać coś takiego:

Sub LepszeMakro()
     ' Ustawia szerokość kolumny A
    Columns("A:A").ColumnWidth = 13.71
     ' Wypełnia komórki od A1 do A3 odpowiednimi wartościami
    Range("A1").Value = "toThePyPoint.pl"
    Range("A2").Value = 1
    Range("A3").Value = 2
     ' Wstawia formułę sumującą do komórki A4
    ' Użyto tu standardowej notacji A1 zamiast R1C1 dla większej czytelności
    Range("A4").Formula = "=SUM(A2:A3)"
    
    ' Formatowanie tła komórki A4 bez jej zaznaczania
    Range("A4").Interior.Color = 49407
End Sub

Prościej, szybciej i czytelniej.

Wskazówka: Rejestrator makr to bardzo praktyczne narzędzie. Za każdym razem, gdy nie wiesz, jak napisać jakiś fragment kodu automatyzacji albo po prostu chcesz zaoszczędzić czas, spróbuj nagrać makro, które później przerobisz i dopasujesz do reszty projektu.

Możesz teraz uruchomić nagrany w ten sposób program. W tym celu usuń kolumnę A w Twoim Excelu lub utwórz nowy arkusz (w którym kolumna A będzie pusta). Następnie ustaw kursor w nagranym kodzie i uruchom jego wykonanie odpowiednim przyciskiem z sekcji nr 1 – ten zielony trójkąt (patrz rys. 6).

Kod wykona się w ułamku sekundy, a Twoja kolumna A będzie ponownie wyglądać tak, jak pokazałem to wcześniej (rys. 5).

Składnia VBA — Sub, wcięcia i komentarze

Na początku nauki VBA warto od razu wyrobić sobie dobre nawyki dotyczące czytelności kodu. Dzięki temu łatwiej będzie Ci wracać do własnych makr i rozumieć je po czasie.

Sub – większość przykładów w VBA zaczyna się od słowa kluczowego Sub. To oznacza początek procedury, czyli fragmentu kodu, który wykonuje określone zadanie. Każdy Sub kończy się poleceniem End Sub. W kolejnych lekcjach poznasz dokładnie różnicę między Sub a Function, ale na razie wystarczy wiedzieć, że Sub to podstawowa „forma” makra w VBA.

Wcięcia – w VBA nie są obowiązkowe (kod zadziała nawet bez nich), ale warto je stosować przy pętlach, instrukcjach warunkowych czy właśnie procedurach Sub. Dzięki wcięciom od razu widać, który fragment kodu należy do danej instrukcji.

Komentarze – to notatki w kodzie, które nie są wykonywane przez program. W VBA komentarz zaczynamy od apostrofu (’). To świetny sposób, żeby dopisać krótkie wyjaśnienie, np.:

Sub Przyklad()
    ' To jest komentarz
    Dim x As Integer
    x = 5
    
    If x > 3 Then
        ' Jeśli warunek jest spełniony, pokaż komunikat
        MsgBox "Liczba większa niż 3"
    End If
End Sub

Dobre komentarze i wcięcia sprawiają, że nawet złożony kod staje się dużo łatwiejszy w utrzymaniu – i dla Ciebie, i dla osób, które będą z niego korzystać.

Zapisywanie plików z makrami

Na koniec pamiętaj, żeby pliki z makrami zapisywać w formacie .xlsm (skoroszyt z obsługą makr). Tylko taki format pozwala uruchamiać Twoje programy VBA.

Od tego momentu masz już wszystko, żeby przejść do głównej części kursu i zacząć naukę VBA z AI


>

Lekcje VBA z nauczycielem AI

Od tego momentu zaczynamy właściwą naukę VBA – czyli serię lekcji przygotowanych w formie promptów. Każdy prompt możesz wykorzystać w rozmowie z AI, żeby poznać nowe zagadnienia i od razu sprawdzić je w praktyce w Excelu.

Podzieliłem je na bloki tematyczne, żeby łatwiej było się w tym odnaleźć:

  • Podstawy języka i dane – zmienne, typy danych, konwersje, operacje na liczbach i tekstach.
  • Obsługa błędów i logika programu – instrukcje warunkowe, pętle, Sub vs Function, a także mechanizmy obsługi błędów.
  • Praca z Excelem – od komórek i zakresów, przez arkusze i skoroszyty, aż po operacje na plikach i CSV.
  • Debugowanie i dobre praktyki – breakpoints, krokowe uruchamianie kodu i podgląd wartości zmiennych.
  • Mini-projekty i automatyzacja – małe, praktyczne programy: lista zadań w Excelu czy wysyłanie maili przez Outlooka.

Dzięki temu zawsze będziesz wiedzieć, w którym miejscu kursu jesteś – i łatwo wrócisz do wybranego zagadnienia.

Prompt 0: ustaw nauczyciela

Zanim zaczniesz naukę, warto ustawić AI w odpowiedni tryb. Wykorzystaj do tego poniższy prompt. Został on napisany w taki sposób, aby sztuczna inteligencja wiedziała, czego będziesz od niej oczekiwał i czekała cierpliwie na właściwe zagadnienia do nauki.

Prompt 0:

„Chcę, żebyś pełnił rolę mojego nauczyciela VBA.
Będę zadawał Ci pytania w kolejnych promptach.

Twoim zadaniem jest:

  • tłumaczyć zagadnienia prosto i praktycznie,
  • podawać krótkie przykłady i zadania do samodzielnego wykonania,
  • czekać na moje kolejne prompty.

Nie zaczynaj lekcji teraz.
Na tym etapie tylko potwierdź, że ustawiłeś się w trybie nauczyciela i czekasz na następne pytanie.”

Prompt 1: Zmienne, typy danych i konwersja

Prompt 1:

 Wytłumacz mi, czym są zmienne w VBA i jakie są podstawowe typy danych (Integer, Long, Double, String, Boolean, Date). Pokaż przykłady deklaracji zmiennych oraz proste operacje na nich.
Dodatkowo pokaż, jak konwertować typy danych (np. CInt, CDbl, CStr) i kiedy to jest potrzebne.”

Treść lekcji:

Czym są zmienne w VBA?

Wyobraź sobie, że zmienna to pudełko z etykietą. Możesz do niego coś włożyć, a dzięki etykiecie zawsze wiesz, co jest w środku i jak się do tego odwołać.

W programowaniu, zmienna to po prostu nazwane miejsce w pamięci komputera, w którym przechowujemy dane, np. liczbę, tekst czy datę. Używamy zmiennych, żeby nasz kod był bardziej elastyczny i czytelny. Zamiast wpisywać w kodzie na sztywno liczbę 100, możemy stworzyć zmienną o nazwie liczbaProduktow i przypisać jej wartość 100.


Podstawowe typy danych i deklaracja zmiennych

Aby stworzyć „pudełko” (zmienną), musimy powiedzieć VBA dwie rzeczy: jak się będzie nazywać i co będziemy w nim przechowywać (jaki będzie typ danych). Robimy to za pomocą słowa kluczowego Dim (skrót od Dimension).

Składnia wygląda tak: Dim nazwa_zmiennej As Typ_danych

Oto najważniejsze typy, które musisz znać na początek:

1. Liczby całkowite

  • Integer: Do przechowywania mniejszych liczb całkowitych (od -32 768 do 32 767). Idealny do liczenia pętli, małych ilości wierszy itp.
  • Long: Do przechowywania bardzo dużych liczb całkowitych. Używaj go, gdy liczba może przekroczyć 32 tysiące, np. do liczenia wszystkich wierszy w arkuszu.
Dim liczbaUczniow As Integer 
Dim liczbaWierszy As Long 

liczbaUczniow = 30
liczbaWierszy = 200000

2. Liczby zmiennoprzecinkowe (z ułamkami)

  • Double: Do przechowywania liczb z częścią dziesiętną oraz bardzo dużych liczb. Używany do obliczeń finansowych, naukowych, wszędzie tam, gdzie potrzebna jest duża precyzja.
Dim cenaNetto As Double
cenaNetto = 123.99

3. Tekst

  • String: Przechowuje ciągi znaków (tekst). Wartość tekstową zawsze umieszczamy w cudzysłowie.
Dim imiePracownika As String
imiePracownika = "Jan Kowalski"

4. Wartości logiczne

  • Boolean: Przechowuje tylko jedną z dwóch wartości: True (prawda) lub False (fałsz). Świetny do sprawdzania warunków, np. „Czy faktura jest opłacona?”.
Dim czyZatwierdzone As Boolean
czyZatwierdzone = True

5. Daty

  • Date: Przechowuje datę i/lub godzinę. Wartości daty umieszczamy między znakami #.
Dim dataUrodzenia As Date
dataUrodzenia = #11/20/1990#

Proste operacje na zmiennych

Zobaczmy, jak to działa w praktyce. Poniższy kod deklaruje kilka zmiennych, wykonuje na nich proste działania i wyświetla wynik.

Sub ProsteOperacje()
    ' Deklaracja zmiennych
    Dim imie As String
    Dim wiek As Integer
    Dim bonus As Double
    Dim wiadomosc As String
    
    ' Przypisanie wartości
    imie = "Anna"
    wiek = 25
    bonus = 550.50
    
    ' Proste operacje
    wiek = wiek + 5 ' Zwiększamy wiek o 5
    
    ' Łączenie tekstu (nazywa się to "konkatenacją")
    wiadomosc = "Pracownik: " & imie & ", wiek: " & wiek & " lat."
    
    ' Wyświetlenie wyniku w okienku dialogowym
    MsgBox wiadomosc
    MsgBox "Bonus tej osoby wynosi: " & bonus & " zł"
End Sub

Konwersja typów danych

Czasami VBA przechowuje dane w „złym pudełku”. Najczęstszy przypadek: pobierasz od użytkownika jakąś liczbę za pomocą okienka InputBox. Taka liczba jest dla VBA zawsze tekstem (String), nawet jeśli wygląda jak liczba! Nie można na niej wykonywać obliczeń matematycznych.

Musimy wtedy jawnie zmienić typ danych (przełożyć zawartość do innego pudełka). Służą do tego funkcje C...() (skrót od Convert to…).

  • CInt() – konwertuj na Integer
  • CLng() – konwertuj na Long
  • CDbl() – konwertuj na Double
  • CStr() – konwertuj na String
  • CDate() – konwertuj na Date

Kiedy to jest potrzebne? Przykład:

Sub KonwersjaDanych()
    Dim tekstLiczba As String
    Dim prawdziwaLiczba As Integer
    Dim wynik As Integer
    
    ' InputBox ZAWSZE zwraca tekst (String)
    tekstLiczba = InputBox("Podaj swój wiek:")
    
    ' Jeśli spróbujemy dodać coś do tekstu, VBA może zgłupieć.
    ' Dlatego konwertujemy tekst na liczbę Integer.
    prawdziwaLiczba = CInt(tekstLiczba)
    
    ' Teraz możemy bezpiecznie wykonać obliczenia
    wynik = prawdziwaLiczba * 2
    
    MsgBox "Podwojony wiek to: " & wynik
End Sub

Bez CInt(), próba wykonania operacji matematycznej na tekście mogłaby spowodować błąd. Konwersja zapewnia, że operacje są wykonywane na właściwym typie danych.


✏️ Zadanie dla Ciebie

  1. Napisz procedurę o nazwie MojeDane.
  2. Zadeklaruj w niej trzy zmienne:
    • nazwaProduktu typu String
    • iloscSztuk typu Integer
    • cenaJednostkowa typu Double
  3. Przypisz do nich następujące wartości:
    • nazwaProduktu = „Długopis”
    • iloscSztuk = 50
    • cenaJednostkowa = 2.55
  4. Zadeklaruj czwartą zmienną wartoscCalkowita typu Double.
  5. Oblicz wartość całkowitą (iloscSztuk * cenaJednostkowa) i przypisz wynik do zmiennej wartoscCalkowita.
  6. Na koniec, za pomocą jednego MsgBox, wyświetl komunikat w formacie: "Produkt: Długopis, wartość całkowita: 127.5 zł"

Prompt 2: Odwoływanie się do komórek i zakresów

Prompt 2:

 „Wyjaśnij jak odwoływać się do komórek i zakresów w VBA.
Pokaż różnice między Range(„A1”), Cells(1,1), Range(„A1:A10”).
Dodaj przykłady: wpisanie wartości, odczyt wartości, zmiana koloru tła. Ma to być lekcja dla osoby początkującej – nie wykorzystuj pętli i instrukcji warunkowych w przykładach.”

Treść lekcji:

To jedna z najważniejszych lekcji. Prawidłowe odwoływanie się do komórek to fundament praktycznie każdego makra w Excelu. Teraz zobaczysz proste przykłady, a w lekcji 7 pokażę Ci, jak używać tego w pętlach i automatyzacji całych tabel.

Istnieją dwa podstawowe sposoby, aby odwołać się do komórek: za pomocą obiektu Range oraz obiektu Cells.

Obiekt Range

Obiekt Range jest najbardziej intuicyjny. Używa notacji, którą znasz bezpośrednio z arkusza, np. „A1” lub „A1:C5”.

Kiedy go używać? Gdy odwołujesz się do stałego, z góry znanego adresu lub do nazwanych zakresów.

Odwołania za pomocą Range

  • Pojedyncza komórka: Range("A1")
  • Prostokątny zakres komórek: Range("A1:B10")
  • Nazwany zakres: Jeśli w Excelu nazwiesz zakres np. „SprzedazKwartalna”, możesz go użyć w VBA. To najlepsza praktyka, bo kod jest czytelny i odporny na wstawianie nowych kolumn/wierszy. Kod VBA: Range("SprzedazKwartalna")

Przykład: Praca z obiektem Range

Poniższy kod pokazuje trzy podstawowe operacje na obiekcie Range.

Sub Praca_z_Range()
    Dim odczytanaWartosc As String

    ' 1. Wpisanie wartości do komórki B1
    Range("B1").Value = "Witaj, świecie!"
    
    ' 2. Odczytanie wartości z komórki B1 do zmiennej
    odczytanaWartosc = Range("B1").Value
    MsgBox "Odczytano z komórki B1: " & odczytanaWartosc
    
    ' 3. Zmiana koloru tła całego zakresu
    Range("B1:C5").Interior.ColorIndex = 36 ' Jasnożółty
End Sub

Obiekt Cells

Obiekt Cells odwołuje się do komórek za pomocą numerycznych indeksów wiersza i kolumny. Cells(numer_wiersza, numer_kolumny).

  • Cells(1, 1) to to samo co Range("A1").
  • Cells(2, 3) to to samo co Range("C2").

Kiedy go używać? W tej lekcji użyjemy go do prostych odwołań, ale jego prawdziwa moc ujawnia się w pętlach, gdzie możesz używać zmiennych do dynamicznego wskazywania komórek.

Przykład: Praca z obiektem Cells

Poniższy kod wpisze tekst do komórki A1 (wiersz 1, kolumna 1) i zmieni jej kolor tła.

Sub Praca_z_Cells()
    
    ' Wpisanie wartości do komórki A1
    Cells(1, 1).Value = "Witaj z komórki A1!"
    
    ' Zmiana koloru tła komórki A1
    Cells(1, 1).Interior.Color = vbYellow ' vbYellow to wbudowana stała koloru
End Sub

Łączenie Range i Cells

Możesz stworzyć obiekt Range definiując jego „rogi” za pomocą obiektu Cells. Jest to niezwykle przydatne do zaznaczania dynamicznych zakresów.

Struktura: Range(komorka_startowa, komorka_koncowa)

Przykład: Zaznaczenie dynamicznego zakresu

Sub ZaznaczDynamicznie()
    ' Zaznacza zakres od A1 do E10
    Range(Cells(1, 1), Cells(10, 5)).Select
End Sub

Różnice w pigułce

MetodaSkładniaKiedy najlepsza?
RangeRange("A1"), Range("A1:C10")Stałe adresy, nazwane zakresy, łatwość odczytu.
CellsCells(wiersz, kolumna)Gdy chcesz użyć numerów wierszy/kolumn zamiast liter. W przyszłości idealne do pętli.
Range(Cells, Cells)Range(Cells(1,1), Cells(10,5))Tworzenie zakresów o dynamicznym rozmiarze.

✏️ Zadanie dla Ciebie

Napisz makro o nazwie FormatujRaport, które bez użycia pętli i instrukcji warunkowych:

  1. Za pomocą obiektu Range wpisze tekst „Raport Sprzedaży” do komórki A1.
  2. Za pomocą obiektu Cells wpisze wartość 1000 do komórki B2 (wiersz 2, kolumna 2).
  3. Za pomocą obiektu Range pogrubi czcionkę (.Font.Bold = True) w komórce A1.
  4. Za pomocą obiektu Cells zmieni kolor tła komórki B2 na zielony (.Interior.Color = vbGreen).

To zadanie pozwoli Ci przećwiczyć oba sposoby odwoływania się do komórek i modyfikowania ich właściwości. Powodzenia!

Prompt 3: Operacje na liczbach

Prompt 3:

 „Pokaż jak dodawać, odejmować i porównywać liczby w VBA. Dodaj przykład obliczenia średniej wartości z kilku komórek Excela.
Pokaż też użycie prostych funkcji wbudowanych jak Round, Sqr, Abs.”

Przechodzimy do kolejnej lekcji. Skupimy się na operacjach matematycznych, które są sercem wielu programów.


Operacje arytmetyczne i porównania

Wykonywanie obliczeń w VBA jest bardzo intuicyjne i przypomina to, co znasz z kalkulatora czy arkusza Excel.

Podstawowe operatory arytmetyczne

OperatorNazwaPrzykładWynik
+Dodawanie10 + 515
-Odejmowanie10 - 55
*Mnożenie10 * 550
/Dzielenie10 / 42.5
^Potęgowanie10 ^ 2100

Przykład w kodzie: W tym przykładzie użyjemy Debug.Print, aby wyświetlić wyniki w okienku „Immediate” w edytorze VBA (możesz je włączyć skrótem Ctrl+G). To wygodniejsze niż MsgBox przy wielu wynikach.

Sub OperacjeArytmetyczne()
    Dim a As Integer
    Dim b As Integer
    a = 15
    b = 4
    
    Debug.Print "Dodawanie: " & (a + b) ' Wynik: 19
    Debug.Print "Mnożenie: " & (a * b)  ' Wynik: 60
    Debug.Print "Dzielenie: " & (a / b)  ' Wynik: 3.75
End Sub

Operatory porównania

Służą do porównywania dwóch wartości. Wynikiem takiego porównania jest zawsze wartość logiczna: True (prawda) lub False (fałsz). Najczęściej używamy ich w instrukcjach warunkowych If.

OperatorZnaczeniePrzykładWynik
=Równya = bFałsz
<>Różny oda <> bPrawda
>Większy niża > bPrawda
<Mniejszy niża < bFałsz
>=Większy lub równya >= 15Prawda
<=Mniejszy lub równyb <= 5Prawda

Przykład w kodzie:

Sub PorownywanieLiczb()
    Dim punkty As Integer
    punkty = 75
    
    ' Sprawdzamy, czy liczba punktów pozwala zdać egzamin
    If punkty >= 50 Then
        MsgBox "Gratulacje, egzamin zdany!"
    Else
        MsgBox "Niestety, nie udało się zdać."
    End If
End Sub

Przykład praktyczny: Obliczanie średniej z komórek

Załóżmy, że w komórkach od A1 do A3 masz wyniki sprzedaży i chcesz w komórce B1 obliczyć ich średnią.

  1. Wpisz dowolne liczby do komórek A1, A2 i A3 w swoim arkuszu Excel.
  2. Uruchom poniższy kod.
Sub ObliczSrednia()
    ' Deklarujemy zmienne do przechowania wartości z komórek
    Dim sprzedaz1 As Double
    Dim sprzedaz2 As Double
    Dim sprzedaz3 As Double
    Dim srednia As Double
    
    ' Pobieramy wartości z komórek do zmiennych
    ' .Value odnosi się do wartości w komórce
    sprzedaz1 = Range("A1").Value
    sprzedaz2 = Range("A2").Value
    sprzedaz3 = Range("A3").Value
    
    ' Obliczamy średnią i przypisujemy do zmiennej
    srednia = (sprzedaz1 + sprzedaz2 + sprzedaz3) / 3
    
    ' Wpisujemy wynik do komórki B1
    Range("B1").Value = srednia
    
    MsgBox "Obliczono średnią i wpisano wynik do komórki B1."
End Sub

Ten przykład pokazuje kluczową mechanikę pracy z Excelem: pobieranie danych z komórek, przetwarzanie ich w VBA i zwracanie wyniku do arkusza.


Proste funkcje wbudowane

VBA ma wiele gotowych funkcji, które wykonują popularne operacje matematyczne. Oto trzy bardzo przydatne:

  • Round(liczba, [miejsca_po_przecinku]) Zaokrągla liczbę do podanej liczby miejsc po przecinku.
Dim x As Double
x = 123.456
Debug.Print Round(x, 2)  ' Wynik: 123.46
Debug.Print Round(x, 0)  ' Wynik: 123
  • Sqr(liczba) Oblicza pierwiastek kwadratowy (SQuare Root) z liczby.
Dim y As Integer
y = 81
Debug.Print Sqr(y)  ' Wynik: 9
  • Abs(liczba) Zwraca wartość bezwzględną (absolutną) liczby, czyli liczbę bez znaku minus.
Dim z As Integer
z = -150
Debug.Print Abs(z)  ' Wynik: 150

✏️ Zadanie dla Ciebie

  1. Wpisz w komórce A1 arkusza Excel jakąś cenę netto, np. 199.99.
  2. Napisz procedurę o nazwie ObliczCeneBrutto.
  3. Wewnątrz procedury:
    • Zadeklaruj zmienną cenaNetto i pobierz do niej wartość z komórki A1.
    • Zadeklaruj stałą stawkę VAT: Const STAWKA_VAT As Double = 0.23. (Stałą deklaruje się słowem Const – to zmienna, której nie można później zmienić).
    • Oblicz kwotę VAT (cenaNetto * STAWKA_VAT).
    • Oblicz cenę brutto (cenaNetto + kwota VAT).
    • Użyj funkcji Round, aby zaokrąglić ostateczną cenę brutto do 2 miejsc po przecinku.
    • Wpisz wynik (zaokrągloną cenę brutto) do komórki B1.

Dzięki temu zadaniu poćwiczysz pobieranie i zapisywanie danych w komórkach, proste obliczenia oraz użycie funkcji wbudowanej.

Prompt 4: Operacje na tekstach (stringach)

Prompt 4:

 „Naucz mnie podstaw pracy z tekstami w VBA.
Pokaż jak łączyć teksty (&), wyciągać fragment (Left, Right, Mid), zmieniać wielkość liter (UCase, LCase) i szukać słowa (InStr).
Podaj przykład praktyczny: sprawdzenie, czy adres e-mail w komórce zawiera znak @.”

Treść lekcji:

Praca z tekstem jest niezwykle częstym zadaniem w automatyzacji, więc ta lekcja będzie bardzo praktyczna.

Podstawowe operacje na tekstach (String)

VBA oferuje zestaw prostych i potężnych funkcji do manipulowania tekstem.

Łączenie tekstów (Konkatenacja)

Do łączenia dwóch lub więcej ciągów tekstowych w jeden używamy operatora &. Jest to jedna z najczęściej wykonywanych operacji.

Sub LaczenieTekstow()
    Dim imie As String
    Dim nazwisko As String
    Dim pelneDane As String
    
    imie = "Jan"
    nazwisko = "Kowalski"
    
    ' Łączymy imię, spację i nazwisko
    pelneDane = imie & " " & nazwisko
    
    Debug.Print pelneDane ' Wynik: "Jan Kowalski"
End Sub

Wyciąganie fragmentów tekstu

  • Left(tekst, liczba_znaków): Wyciąga określoną liczbę znaków z lewej strony tekstu.
  • Right(tekst, liczba_znaków): Wyciąga określoną liczbę znaków z prawej strony tekstu.
  • Mid(tekst, start, liczba_znaków): Wyciąga określoną liczbę znaków ze środka tekstu, zaczynając od pozycji start.
Sub WyciaganieFragmentow()
    Dim kodProduktu As String
    kodProduktu = "ABC-12345-XYZ"
    
    Dim prefix As String
    Dim numer As String
    Dim sufix As String
    
    prefix = Left(kodProduktu, 3)     ' Wynik: "ABC"
    numer = Mid(kodProduktu, 5, 5)    ' Zaczynamy od 5. znaku, bierzemy 5 znaków. Wynik: "12345"
    sufix = Right(kodProduktu, 3)     ' Wynik: "XYZ"
    
    Debug.Print "Prefix: " & prefix
    Debug.Print "Numer: " & numer
    Debug.Print "Sufix: " & sufix
End Sub

Zmiana wielkości liter

  • UCase(tekst): Zmienia cały tekst na WIELKIE LITERY (Upper Case).
  • LCase(tekst): Zmienia cały tekst na małe litery (Lower Case).

Jest to bardzo przydatne do standaryzacji danych przed ich porównaniem. Np. „Polska” i „polska” to dla komputera dwa różne teksty, ale LCase("Polska") i LCase("polska") są już takie same.

Sub ZmianaWielkosci()
    Dim miasto As String
    miasto = "Warszawa"
    
    Debug.Print UCase(miasto) ' Wynik: "WARSZAWA"
    Debug.Print LCase(miasto) ' Wynik: "warszawa"
End Sub

Wyszukiwanie tekstu w tekście

  • InStr(tekst_przeszukiwany, tekst_szukany): (In String) Sprawdza, czy jeden tekst zawiera się w drugim.
    • Jeśli znajdzie szukany tekst, zwraca numer pozycji, od której się on zaczyna (liczbę większą od 0).
    • Jeśli nie znajdzie, zwraca 0.

To kluczowa funkcja do wszelkiego rodzaju walidacji i sprawdzania zawartości.

Sub SzukanieTekstu()
    Dim zdanie As String
    Dim pozycja As Integer
    
    zdanie = "VBA jest prostym językiem."
    
    ' Szukamy słowa "prosty"
    pozycja = InStr(zdanie, "prosty")
    Debug.Print pozycja ' Wynik: 10 (bo "prosty" zaczyna się na 10. pozycji)
    
    ' Szukamy słowa "trudny"
    pozycja = InStr(zdanie, "trudny")
    Debug.Print pozycja ' Wynik: 0 (bo nie znaleziono tego słowa)
End Sub

Przykład praktyczny: Sprawdzanie adresu e-mail

Zróbmy proste narzędzie, które sprawdzi, czy tekst w komórce A1 przypomina adres e-mail (czyli czy zawiera znak @).

  1. Wpisz w komórce A1 jakiś adres e-mail (np. test@example.com) lub zwykły tekst.
  2. Uruchom poniższy kod.
Sub SprawdzEmail()
    Dim adresEmail As String
    Dim pozycjaZnaku As Integer
    
    ' Pobierz wartość z komórki A1
    adresEmail = Range("A1").Value
    
    ' Wyszukaj znak "@" w pobranym tekście
    pozycjaZnaku = InStr(adresEmail, "@")
    
    ' Sprawdź wynik wyszukiwania
    ' Jeśli pozycjaZnaku > 0, to znaczy, że znak "@" został znaleziony
    If pozycjaZnaku > 0 Then
        MsgBox "Wygląda na poprawny e-mail (zawiera '@')."
    Else
        MsgBox "To nie jest poprawny e-mail (brak '@')."
    End If
End Sub

Ten skrypt doskonale pokazuje, jak funkcja InStr w połączeniu z instrukcją If może być używana do walidacji danych w arkuszu. Więcej na temat instrukcji If...Then dowiesz się w jednym z kolejnych promptów.


✏️ Zadanie dla Ciebie

Masz w komórce A1 numer faktury w formacie FV/2455/2023/KRK. Chcesz wyodrębnić i wyświetlić sam numer oraz miasto.

  1. Wpisz w komórce A1 tekst: FV/2455/2023/KRK.
  2. Napisz procedurę o nazwie AnalizujFakture.
  3. Wewnątrz procedury:
    • Pobierz cały numer faktury z komórki A1 do zmiennej.
    • Użyj funkcji Mid i InStr (lub samych Mid), aby wyciągnąć numer 2455. Podpowiedź: numer zaczyna się na 4. pozycji i ma 4 znaki.
    • Użyj funkcji Right, aby wyciągnąć kod miasta KRK.
    • Użyj MsgBox, aby wyświetlić komunikat: "Numer faktury: 2455, Miasto: KRK".

To zadanie wymaga połączenia kilku funkcji tekstowych. Daj znać, jak Ci poszło!

Prompt 5: Obsługa błędów (On Error)

Prompt 5:

 „Wyjaśnij jak działa obsługa błędów w VBA (On Error Resume Next, On Error GoTo).
Pokaż prosty przykład: dzielenie przez zero oraz otwieranie pliku, który nie istnieje.
Wytłumacz, dlaczego obsługa błędów jest szczególnie ważna w automatyzacji Excela.”

Treść lekcji:

Obsługa błędów to cecha, która odróżnia amatorskie makra od profesjonalnych, niezawodnych narzędzi.

Czym jest obsługa błędów?

Domyślnie, gdy VBA napotka błąd w trakcie działania (tzw. błąd wykonania, runtime error), robi dwie rzeczy:

  1. Zatrzymuje wykonywanie całego kodu.
  2. Wyświetla użytkownikowi techniczne okno z komunikatem o błędzie.

Jest to bardzo niepożądane, ponieważ przerywa automatyzację i straszy użytkownika. Obsługa błędów to mechanizm, który pozwala nam przechwycić błąd, zignorować go lub wykonać własny kod w odpowiedzi, zamiast pozwalać na awarię programu.

Służą do tego instrukcje On Error....

On Error GoTo [etykieta] – Skok do procedury ratunkowej

To najbardziej polecana i strukturalna metoda. Mówi ona VBA: „Od tego momentu, jeśli wystąpi jakikolwiek błąd, natychmiast przeskocz do fragmentu kodu oznaczonego [etykietą]„.

Struktura wygląda tak:

Sub Przyklad_GoTo()
    ' 1. Włączamy obsługę błędów
    On Error GoTo ObslugaBledu
    
    ' 2. Tutaj znajduje się Twój normalny kod, który może powodować błąd
    ' ...
    
    ' 3. Ważne: Zakończ procedurę, jeśli nie było błędu!
    Exit Sub

' 4. Etykieta i kod obsługi błędu
ObslugaBledu:
    MsgBox "Wystąpił nieoczekiwany błąd!"
    ' Tutaj możesz np. zapisać log, zamknąć pliki itp.
End Sub

Exit Sub jest kluczowe! Bez tego, kod wykonywałby się dalej i zawsze wpadałby do sekcji obsługi błędu, nawet gdyby błędu nie było.

Przykład 1: Dzielenie przez zero

Sub DzieleniePrzezZero()
    On Error GoTo HandlerBledu
    
    Dim a As Integer, b As Integer, wynik As Double
    a = 10
    b = 0 ' To spowoduje błąd
    
    wynik = a / b
    MsgBox "Wynik to: " & wynik
    
    Exit Sub ' Nie zapomnij o tym!

HandlerBledu:
    MsgBox "Wystąpił błąd! Prawdopodobnie próbujesz dzielić przez zero.", vbCritical
End Sub

Zamiast awarii, użytkownik zobaczy przyjazny komunikat.

On Error Resume Next – Ignoruj i idź dalej

Ta instrukcja mówi VBA: „Jeśli wystąpi błąd, zignoruj go i po prostu przejdź do wykonania następnej linijki kodu”.

Jest to bardzo potężne, ale i niebezpieczne, ponieważ błędy mogą przejść niezauważone. Używaj tej metody tylko wtedy, gdy spodziewasz się błędu w konkretnym miejscu i masz plan, jak na niego zareagować tuż po jego potencjalnym wystąpieniu.

Zawsze pamiętaj, aby wyłączyć ten tryb zaraz po jego użyciu za pomocą On Error GoTo 0, co przywraca standardową obsługę błędów.

Przykład 2: Otwieranie pliku, który nie istnieje

Chcemy otworzyć plik. Jeśli się nie uda, bo plik nie istnieje, chcemy poinformować o tym użytkownika, a nie zatrzymywać makro.

Sub SprobujOtworzycPlik()
    Dim wb As Workbook
    Dim sciezka As String
    
    sciezka = "C:\NieistniejacyFolder\plik.xlsx"
    
    ' Włącz ignorowanie błędów TYLKO na czas operacji otwierania pliku
    On Error Resume Next
    Set wb = Workbooks.Open(sciezka)
    ' Jeśli plik nie istnieje, linijka powyżej spowoduje błąd,
    ' ale VBA przejdzie do następnej, a zmienna 'wb' pozostanie pusta (Nothing).
    
    ' Natychmiast wyłącz ignorowanie błędów!
    On Error GoTo 0
    
    ' Teraz sprawdź, czy operacja się udała
    If wb Is Nothing Then
        MsgBox "Plik o podanej ścieżce nie został znaleziony.", vbExclamation
    Else
        MsgBox "Plik '" & wb.Name & "' został pomyślnie otwarty."
        ' wb.Close ' Możemy zamknąć plik po otwarciu
    End If
End Sub

Dlaczego obsługa błędów jest tak ważna w automatyzacji?

  1. Profesjonalny wizerunek i doświadczenie użytkownika (UX): Twoje narzędzie nie „wykrzacza się” z technicznym błędem, tylko informuje w zrozumiały sposób, co poszło nie tak. Użytkownik nie musi znać się na VBA.
  2. Integralność danych: Jeśli makro przetwarza tysiące wierszy i napotka błąd w połowie, może zostawić arkusz w stanie niekompletnym lub z uszkodzonymi danymi. Obsługa błędów pozwala na bezpieczne zakończenie operacji lub nawet cofnięcie zmian.
  3. Niezawodność procesów bez nadzoru: Makra często uruchamiane są w nocy lub w tle. Jakikolwiek nieprzewidziany problem (np. plik jest otwarty przez kogoś innego, zmieniła się nazwa arkusza, brak dostępu do sieci) zatrzymałby cały proces. Dzięki obsłudze błędów makro może np. zapisać log z informacją o problemie i przejść do następnego zadania.

Krótko mówiąc, obsługa błędów zamienia niestabilny skrypt w solidną aplikację.


✏️ Zadanie dla Ciebie

Napisz procedurę o nazwie BezpieczneZaznaczanieArkusza.

  1. Procedura ma prosić użytkownika o podanie nazwy arkusza za pomocą funkcji InputBox.
  2. Następnie ma spróbować zaznaczyć (Worksheets("nazwaArkusza").Select) arkusz o podanej nazwie.
  3. Użyj bloku On Error GoTo, aby obsłużyć sytuację, w której arkusz o podanej nazwie nie istnieje w skoroszycie.
  4. Jeśli arkusz nie zostanie znaleziony, zamiast błędu VBA, powinien pojawić się MsgBox z komunikatem: "Nie znaleziono arkusza o nazwie [tutaj wstaw nazwę podaną przez użytkownika]".
  5. Jeśli arkusz istnieje, makro powinno go po prostu zaznaczyć, a na końcu może pojawić się MsgBox z komunikatem "Arkusz [nazwa] został zaznaczony.".

To klasyczny przykład, gdzie obsługa błędów jest niezbędna w codziennej pracy z Excelem.

Prompt 6: Instrukcje warunkowe If i Select Case

Prompt 6:

 „Wyjaśnij działanie instrukcji warunkowych If i Select Case w VBA.
Pokaż przykłady z logiki biznesowej, np. przypisanie rabatu w zależności od typu klienta.”

Instrukcje warunkowe to mózg Twojego programu. Pozwalają kodowi podejmować decyzje i reagować w różny sposób w zależności od sytuacji, co jest esencją logiki w programowaniu.

W VBA mamy dwa główne narzędzia do tego celu: If oraz Select Case.

Instrukcja If...Then...Else

Instrukcji If używasz do sprawdzania, czy dany warunek jest prawdziwy, czy fałszywy. Jest to najbardziej uniwersalne narzędzie decyzyjne.

Prosta forma (jedna akcja)

Jeśli chcesz wykonać tylko jedną czynność, gdy warunek jest spełniony, możesz zapisać wszystko w jednej linii.

Sub ProstyIf()
    Dim sprzedaz As Double
    sprzedaz = 15000
    
    If sprzedaz > 10000 Then MsgBox "Gratulacje, przyznano bonus!"
End Sub

Forma blokowa (wiele akcji)

Gdy chcesz wykonać więcej niż jedną akcję, używasz struktury blokowej If...End If.

If sprzedaz > 10000 Then
    MsgBox "Gratulacje, przyznano bonus!"
    ' Możesz tu dodać więcej akcji, np. zapis do komórki
    Range("C1").Value = "BONUS"
End If

Pełna forma z Else (coś innego, gdy fałsz)

Else pozwala zdefiniować, co ma się stać, gdy warunek nie jest prawdziwy.

Dim wiek As Integer
wiek = 16

If wiek >= 18 Then
    MsgBox "Dostęp przyznany."
Else
    MsgBox "Brak dostępu. Osoba niepełnoletnia."
End If

Rozbudowana forma z ElseIf (wiele warunków)

Gdy masz kilka różnych warunków do sprawdzenia po kolei, używasz ElseIf.

Przykład z logiki biznesowej: Rabat od wartości zamówienia

Function ObliczRabat(wartoscZamowienia As Double) As Double
    '===Funkcja zostanie wyjaśniona w lekcji nr 7===
    '===============================================

    Dim rabat As Double
    
    If wartoscZamowienia >= 1000 Then
        rabat = 0.1 ' 10% rabatu
    ElseIf wartoscZamowienia >= 500 Then
        rabat = 0.05 ' 5% rabatu
    Else
        rabat = 0 ' Brak rabatu
    End If
    
    ObliczRabat = rabat
End Function

Sub TestRabat()
    ' Przykładowe użycie funkcji
    MsgBox "Dla 1200 zł rabat wynosi: " & ObliczRabat(1200) * 100 & "%"
    MsgBox "Dla 750 zł rabat wynosi: " & ObliczRabat(750) * 100 & "%"
End Sub

Instrukcja Select Case 🚦

Select Case jest jak wielopozycyjny przełącznik. Używasz go, gdy chcesz sprawdzić jedną zmienną pod kątem wielu możliwych wartości. Jest to często znacznie czystsza i bardziej czytelna alternatywa dla długiego łańcucha If...ElseIf.

Struktura:

Select Case zmienna_do_sprawdzenia
    Case wartosc1
        ' Kod dla wartosci1
    Case wartosc2
        ' Kod dla wartosci2
    ' ...
    Case Else
        ' Kod, gdy żadna z powyższych wartości nie pasuje
End Select

Przykład z logiki biznesowej: Rabat w zależności od typu klienta

Wyobraź sobie, że masz różne poziomy rabatów dla różnych typów klientów.

Function RabatDlaKlienta(typKlienta As String) As Double
    Dim rabat As Double
    
    ' Konwertujemy na wielkie litery, by uniknąć problemów z "Złoty" vs "złoty"
    Select Case UCase(typKlienta)
        Case "ZŁOTY", "VIP" ' Można podać kilka wartości po przecinku
            rabat = 0.15 ' 15%
        Case "SREBRNY"
            rabat = 0.1 ' 10%
        Case "BRĄZOWY"
            rabat = 0.05 ' 5%
        Case Else ' Dla wszystkich pozostałych
            rabat = 0
    End Select
    
    RabatDlaKlienta = rabat
End Function

Sub TestRabatKlienta()
    MsgBox "Klient Złoty ma rabat: " & RabatDlaKlienta("Złoty") * 100 & "%"
    MsgBox "Nowy klient ma rabat: " & RabatDlaKlienta("Nowy") * 100 & "%"
End Sub

Kiedy If, a kiedy Select Case?

  • Użyj If...ElseIf...Else, gdy:
    • Masz złożone warunki logiczne z operatorami And lub Or (np. If sprzedaz > 1000 And kraj = "Polska").
    • Każdy ElseIf sprawdza zupełnie inny warunek lub inną zmienną.
  • Użyj Select Case, gdy:
    • Sprawdzasz jedną zmienną lub wyrażenie pod kątem wielu prostych wartości (np. liczb, tekstów).
    • Kod staje się dzięki temu znacznie bardziej przejrzysty i łatwiejszy w utrzymaniu.

✏️ Zadanie dla Ciebie

Napisz procedurę OcenPracownika, która:

  1. Pobiera z komórki A1 ocenę liczbową pracownika (np. od 1 do 5).
  2. Za pomocą instrukcji Select Case zamienia ocenę liczbową na opis słowny i wpisuje go do komórki B1:
    • Case 5 -> „Wybitna”
    • Case 4 -> „Bardzo dobra”
    • Case 3 -> „Dobra”
    • Case 2 -> „Wystarczająca”
    • Case Else -> „Ocena nieprawidłowa”
  3. Następnie, za pomocą instrukcji If, sprawdza, czy ocena w komórce A1 jest większa lub równa 4.
  4. Jeśli tak, w komórce C1 pojawia się tekst „Premia”, w przeciwnym wypadku komórka C1 ma być pusta ("").

To ćwiczenie pozwoli Ci użyć obu instrukcji warunkowych w jednym, praktycznym scenariuszu. Powodzenia!

Prompt 7: Pętle (For, For Each, Do While)

Prompt 7:

 „Pokaż jak działa pętla For…Next, pętla For Each…Next oraz Do While/Do Until w VBA.
Podaj przykłady:

  • For i = 1 To 10 – liczenie od 1 do 10,
  • For Each cell In Range(„A1:A10”) – sprawdzanie wartości w komórkach,
  • Do While Not IsEmpty(Cells(row,1)) – działanie dopóki nie napotka pustej komórki.

Na końcu daj ćwiczenie: napisać makro, które przejdzie po wszystkich wierszach w kolumnie A i podświetli wartości większe niż 100.”

Treść lekcji:

Świetnie, przechodzimy do pętli. Pętle to absolutna podstawa programowania, która pozwala wykonywać tę samą operację wielokrotnie bez przepisywania kodu. To one sprawiają, że komputery są tak dobre w automatyzacji powtarzalnych zadań.

Pętla For...Next 🔄

Używamy jej, gdy znamy dokładną liczbę powtórzeń, które chcemy wykonać. Działa na zasadzie licznika, który zmienia swoją wartość w każdym „okrążeniu” pętli.

Struktura:

For licznik = wartosc_poczatkowa To wartosc_koncowa 
    ' Kod do powtórzenia
Next licznik

Przykład: Liczenie od 1 do 10

To makro 10 razy wykona kod zawarty w pętli. W każdej iteracji zmienna i będzie miała inną wartość (od 1 do 10).

Sub Petla_For_Next()
    Dim i As Integer
    
    ' Pętla wykona się 10 razy
    For i = 1 To 10
        ' Wypisz aktualną wartość licznika w okienku Immediate (Ctrl+G)
        Debug.Print "To jest okrążenie numer: " & i
    Next i
    
    MsgBox "Pętla For...Next zakończona!"
End Sub

Pętla For Each...Next

Idealna do pracy z kolekcjami obiektów, takimi jak komórki w zakresie, arkusze w skoroszycie czy pliki w folderze. Pętla ta automatycznie przechodzi przez każdy element kolekcji, bez potrzeby używania licznika.

Struktura:

For Each element In kolekcja
    ' Kod do wykonania na każdym elemencie
Next element

Przykład: Sprawdzanie wartości w komórkach

To makro przejdzie przez każdą komórkę w zakresie A1:A10 i sprawdzi, czy jej wartość jest tekstem.

Sub Petla_For_Each()
    ' Deklarujemy zmienną 'komorka' jako obiekt Range
    Dim komorka As Range
    
    ' Pętla przejdzie przez każdą komórkę w podanym zakresie
    For Each komorka In Range("A1:A10")
        ' Sprawdzamy, czy wartość w komórce jest tekstem
        If Not IsNumeric(komorka.Value) And Not IsEmpty(komorka.Value) Then
            Debug.Print "Komórka " & komorka.Address & " zawiera tekst: " & komorka.Value
        End If
    Next komorka
    
    MsgBox "Pętla For Each zakończona!"
End Sub

Pętla Do While...Loop / Do Until...Loop

Tej pętli używamy, gdy nie wiemy, ile razy ma się wykonać, a jej działanie zależy od spełnienia określonego warunku.

  • Do While [warunek] – wykonuj, dopóki warunek jest prawdziwy.
  • Do Until [warunek] – wykonuj, aż warunek stanie się prawdziwy.

UWAGA: W pętlach Do...Loop musisz samodzielnie zadbać o zmianę warunku. Jeśli tego nie zrobisz, możesz stworzyć pętlę nieskończoną, która zawiesi Excela!

Przykład: Działanie, dopóki komórka nie jest pusta

To najczęstsze zastosowanie pętli Do...Loop w Excelu: przetwarzanie danych w kolumnie wiersz po wierszu, aż dojdziemy do końca listy.

Sub Petla_Do_While()
    Dim numerWiersza As Long
    numerWiersza = 1 ' Zaczynamy od pierwszego wiersza
    
    ' Pętla będzie działać dopóki komórka w kolumnie A nie jest pusta
    Do While Not IsEmpty(Cells(numerWiersza, 1))
        ' Wykonaj jakąś operację, np. wypisz wartość z komórki
        Debug.Print "Wiersz " & numerWiersza & ": " & Cells(numerWiersza, 1).Value
        
        ' KLUCZOWY ELEMENT: Przejdź do następnego wiersza!
        ' Bez tego warunek nigdy się nie zmieni i pętla będzie nieskończona.
        numerWiersza = numerWiersza + 1
    Loop
    
    MsgBox "Pętla Do While zakończona!"
End Sub

Podsumowanie – którą pętlę wybrać?

Rodzaj pętliKiedy używać?
For…NextGdy znasz dokładną liczbę powtórzeń (np. 100 razy, tyle ile jest wierszy).
For Each…NextGdy chcesz wykonać operację na każdym obiekcie w grupie (np. na każdej komórce, każdym arkuszu).
Do…LoopGdy liczba powtórzeń zależy od warunku, który może się zmienić w trakcie (np. aż znajdziesz pustą komórkę).

✏️ Zadanie dla Ciebie

Twoim zadaniem jest napisanie makra, które przejdzie po wszystkich komórkach w zakresie od A1 do A20 i podświetli na żółto te, których wartość liczbowa jest większa niż 100.

  1. Wpisz w kolumnie A różne liczby, niektóre mniejsze, a niektóre większe od 100.
  2. Napisz procedurę o nazwie PodswietlWiekszeNiz100.
  3. Użyj pętli For Each...Next, aby przejść przez każdą komórkę w zakresie Range("A1:A20").
  4. Wewnątrz pętli użyj instrukcji If, aby sprawdzić, czy wartość komórki jest większa od 100.
  5. Jeśli warunek jest spełniony, zmień kolor tła komórki. Służy do tego właściwość .Interior.ColorIndex. Kolor żółty ma indeks 6.
    • Przykład: komorka.Interior.ColorIndex = 6

To zadanie doskonale łączy pętle z instrukcjami warunkowymi i pokazuje, jak w praktyce modyfikować arkusz za pomocą VBA.

Powodzenia!

Prompt 8: Sub vs Function (różnica + przykłady)

Prompt 8:

„Wyjaśnij różnicę między Sub a Function w VBA.
Podaj przykłady:

  • Sub – procedura wykonująca akcję (np. wpisanie daty do komórki),
  • Function – funkcja zwracająca wartość, którą można użyć w arkuszu (np. =MojaFunkcja(A1)).


Pokaż przykłady z parametrami (ByVal, ByRef, Optional).
Ćwiczenie: napisać funkcję, która przyjmuje kwotę netto i procent VAT, a zwraca kwotę brutto.”

Treść lekcji:

Zrozumienie różnicy między Sub a Function jest kluczowe, ponieważ to dwa podstawowe bloki konstrukcyjne każdego kodu w VBA.

Różnica jest bardzo prosta:

  • Sub (procedura) wykonuje akcję. Jak polecenie „posprzątaj pokój”. Coś się po prostu dzieje.
  • Function (funkcja) oblicza i zwraca wartość. Jak pytanie „która jest godzina?”. Oczekujesz konkretnej odpowiedzi.

Sub – Procedura wykonująca akcję

Procedury Sub to „konie robocze” VBA. Używasz ich do wykonania serii poleceń, które zmieniają coś w arkuszu, pliku lub programie. Nie zwracają one żadnej wartości.

Cechy Sub:

  • Zaczyna się od Sub, kończy na End Sub.
  • Można ją uruchomić bezpośrednio (np. skrótem klawiszowym, z przycisku).
  • Nie można jej użyć w formule w komórce Excela.

Przykład: Wpisanie aktualnej daty do komórki

Ta procedura wykonuje prostą akcję: wstawia dzisiejszą datę do komórki A1. Nic nie zwraca, po prostu wykonuje zadanie.

Sub WstawDate()
    ' To jest akcja: zmiana wartości komórki
    Range("A1").Value = Date
    MsgBox "Data została wstawiona do komórki A1."
End Sub

Function – Funkcja zwracająca wartość

Funkcji używasz, gdy potrzebujesz coś obliczyć i uzyskać wynik, który potem wykorzystasz w innym miejscu – np. w komórce arkusza lub w innej procedurze VBA.

Cechy Function:

  • Zaczyna się od Function, kończy na End Function.
  • Musi być zdefiniowana z typem danych, które zwraca (np. As String, As Double).
  • Zwraca wynik poprzez przypisanie wartości do swojej własnej nazwy.
  • Można jej używać bezpośrednio w formułach w komórkach Excela (stają się tzw. UDF – User Defined Functions).

Przykład: Funkcja, której można użyć w arkuszu

Ta funkcja przyjmuje tekst i dodaje do niego wykrzyknik. Zwraca zmodyfikowany tekst.

Function DodajWykrzyknik(tekst As String) As String
    ' Obliczenie wyniku i przypisanie go do nazwy funkcji
    DodajWykrzyknik = tekst & "!"
End Function

Po wklejeniu tego kodu do modułu VBA, możesz przejść do dowolnej komórki w Excelu i wpisać formułę: =DodajWykrzyknik("Witaj świecie") lub =DodajWykrzyknik(A1), a wynikiem będzie Witaj świecie!.


Parametry (argumenty): ByVal, ByRef i Optional

Zarówno Sub, jak i Function mogą przyjmować parametry, czyli dane wejściowe. Sposób ich przekazywania ma jednak znaczenie.

ByRef vs ByVal

  • ByRef (przez referencję – domyślne): Procedura otrzymuje oryginał zmiennej. Jeśli zmieni jej wartość w środku, oryginalna zmienna na zewnątrz również się zmieni. To jak dać komuś klucze do mieszkania.
  • ByVal (przez wartość): Procedura otrzymuje kopię zmiennej. Może z nią robić co chce, ale oryginalna zmienna pozostaje nietknięta. To jak dać komuś ksero dokumentu.

Przykład:

Sub Demonstracja_ByVal_ByRef()
    Dim mojaZmienna As Integer
    mojaZmienna = 10
    
    ' Przekazanie ByRef (oryginał)
    ZmienWartosc_ByRef mojaZmienna
    Debug.Print "Po ByRef, wartość to: " & mojaZmienna ' Wynik: 20 (oryginał został zmieniony!)
    
    ' Resetujemy wartość
    mojaZmienna = 10
    
    ' Przekazanie ByVal (kopia)
    ZmienWartosc_ByVal mojaZmienna
    Debug.Print "Po ByVal, wartość to: " & mojaZmienna ' Wynik: 10 (oryginał nietknięty!)
End Sub

Sub ZmienWartosc_ByRef(ByRef liczba As Integer)
    liczba = 20 ' Modyfikujemy oryginał
End Sub

Sub ZmienWartosc_ByVal(ByVal liczba As Integer)
    liczba = 20 ' Modyfikujemy tylko kopię
End Sub

Zasada: Jeśli nie masz pewności, używaj ByVal, aby uniknąć przypadkowych zmian w zmiennych.

Słowo kluczowe Optional

Parametr opcjonalny to taki, którego nie trzeba podawać podczas wywoływania procedury. Musi on mieć zdefiniowaną wartość domyślną.

Sub PrzykladOpcjonalny(wiadomosc As String, Optional powtorzenia As Long = 1)
    Dim i As Long
    For i = 1 To powtorzenia
        Debug.Print wiadomosc
    Next i
End Sub

Sub Test()
    ' Wywołanie z parametrem opcjonalnym
    PrzykladOpcjonalny "Test 1", 3 ' Wyświetli "Test 1" trzy razy
    
    ' Wywołanie bez parametru opcjonalnego (użyje wartości domyślnej: 1)
    PrzykladOpcjonalny "Test 2"  ' Wyświetli "Test 2" jeden raz
End Sub

✏️ Zadanie dla Ciebie

Napisz funkcję o nazwie ObliczBrutto, która będzie mogła być użyta w arkuszu Excel.

  1. Funkcja ma przyjmować dwa parametry:
    • kwotaNetto As Double
    • procentVAT As Double (np. dla 23% VAT, użytkownik poda 0.23)
  2. Funkcja ma zwracać wartość typu Double.
  3. Wewnątrz funkcja ma obliczyć kwotę brutto według wzoru: kwotaNetto * (1 + procentVAT).
  4. Wynik ma zostać przypisany do nazwy funkcji, aby go zwrócić.
  5. Po napisaniu funkcji, przetestuj ją w komórce Excela, wpisując formułę np. =ObliczBrutto(100; 0,23). Oczekiwany wynik to 123.

To zadanie idealnie pokazuje praktyczne zastosowanie funkcji do tworzenia własnych, użytecznych narzędzi w Excelu.

Powodzenia!

Prompt 9: Debugowanie i breakpoints

Prompt:

 „Pokaż, jak korzystać z debugowania w VBA.
Wyjaśnij jak ustawić Breakpoint, jak działa F8 (krokowanie), jak podejrzeć wartości zmiennych w okienku Locals/Immediate.
Podaj przykład prostego makra z błędem i pokaż, jak krok po kroku go znaleźć.”

Treść lekcji:

Debugowanie to proces znajdowania i naprawiania błędów w kodzie. Zamiast zgadywać, gdzie jest problem, używasz specjalnych narzędzi, aby obserwować działanie makra w zwolnionym tempie i dokładnie zobaczyć, co dzieje się na każdym etapie.

Narzędzia do debugowania w VBA 🛠️

W edytorze VBA (Alt+F11) masz do dyspozycji trzy kluczowe narzędzia.

1. Breakpoint (F9) – Znak stop

Breakpoint to pułapka, którą zastawiasz na konkretnej linii kodu. Gdy VBA wykonuje makro i dociera do tej linii, zatrzymuje się, ale nie kończy działania. Program zamraża się w tym momencie, czekając na Twoje dalsze polecenia.

Jak ustawić? Kliknij na szarym marginesie po lewej stronie edytora kodu lub ustaw kursor w linii i naciśnij F9. Linia podświetli się na bordowo.

2. Krokowanie (F8) – Linijka po linijce

Gdy makro jest wstrzymane (np. na breakpoincie), klawisz F8 staje się Twoim najlepszym przyjacielem. Każde jego naciśnięcie wykonuje jedną, następną linię kodu. Pozwala to śledzić ścieżkę, którą podąża program, i zobaczyć, czy wchodzi do odpowiednich instrukcji If lub poprawnie wykonuje pętle.

3. Okienka podglądu – Co kryją zmienne?

Gdy kod jest wstrzymany, możesz sprawdzić, jakie wartości przechowują Twoje zmienne.

  • Locals Window (Okienko zmiennych lokalnych): To najlepsze narzędzie. Automatycznie pokazuje wszystkie zmienne, które są aktualnie aktywne, wraz z ich typem i wartością. Obserwowanie, jak te wartości zmieniają się po każdym naciśnięciu F8, jest istotą debugowania. (Jeśli go nie widzisz, włącz je z menu View -> Locals Window).
  • Immediate Window (Okienko podręczne) (Ctrl+G): To konsola, w której możesz wpisywać polecenia, gdy kod jest wstrzymany. Najczęstsze użycie to wpisanie ? nazwa_zmiennej i naciśnięcie Enter, aby natychmiast zobaczyć jej wartość. Możesz tu też zmieniać wartości zmiennych w locie.

Studium przypadku: Znajdźmy błąd krok po kroku

Oto proste makro, które ma zsumować wartości z zakresu A1:A5. Kod zawiera błąd logiczny – uruchamia się bez awarii, ale podaje zły wynik.

Wpisz w komórkach od A1 do A5 jakieś liczby (np. 10, 20, 30, 40, 50). Suma powinna wynieść 150.

Oto wadliwy kod:

Sub SumujWartosci_Z_BLEDEM()
    Dim komorka As Range
    Dim sumaCalkowita As Double
    
    For Each komorka In Range("A1:A5")
        ' BŁĄD: Inicjalizacja sumy wewnątrz pętli
        sumaCalkowita = 0
        sumaCalkowita = sumaCalkowita + komorka.Value
    Next komorka
    
    MsgBox "Ostateczna suma to: " & sumaCalkowita
End Sub

Po uruchomieniu tego makra, MsgBox pokaże wynik 50 (wartość z ostatniej komórki), a nie 150. Zbadajmy, dlaczego.

Proces debugowania:

  1. Ustaw Breakpoint: Otwórz edytor VBA i kliknij na szary margines obok linii sumaCalkowita = 0, aby ustawić breakpoint.
  2. Uruchom Makro: Uruchom makro SumujWartosci_Z_BLEDEM. Wykonanie kodu natychmiast zatrzyma się na Twoim breakpoincie, a linia zaświeci się na żółto.
  3. Otwórz okienko Locals: Jeśli nie jest widoczne, włącz je (View -> Locals Window). Zobaczysz tam swoje zmienne: komorka i sumaCalkowita.
  4. Zacznij krokowanie (F8):
    • Naciśnij F8. Wykona się linia sumaCalkowita = 0. W okienku Locals zobaczysz, że sumaCalkowita ma wartość 0.
    • Naciśnij F8 ponownie. Wykona się sumaCalkowita = sumaCalkowita + komorka.Value. Wartość komorka.Value to 10, więc sumaCalkowita zmieni się na 10.
    • Naciśnij F8 ponownie. Pętla przechodzi do drugiej iteracji (komorka ma teraz wartość 20). Żółte podświetlenie wraca na linię z breakpointem.
    • Naciśnij F8 i obserwuj! Linia sumaCalkowita = 0 znowu się wykonuje. W okienku Locals widzisz, jak Twoja sumaCalkowita, która przed chwilą wynosiła 10, jest zerowana!
  5. Diagnoza: W tym momencie znalazłeś błąd. Zmienna sumaCalkowita jest resetowana do zera w każdym okrążeniu pętli, przez co gubi wynik z poprzednich iteracji.
  6. Naprawa: Zatrzymaj makro (przycisk „Reset” – kwadrat w edytorze VBA). Przesuń linię sumaCalkowita = 0 przed pętlę For Each.

Poprawiony kod:

Sub SumujWartosci_POPRAWIONE()
    Dim komorka As Range
    Dim sumaCalkowita As Double
    
    ' Poprawka: Inicjalizacja sumy PRZED pętlą
    sumaCalkowita = 0
    
    For Each komorka In Range("A1:A5")
        sumaCalkowita = sumaCalkowita + komorka.Value
    Next komorka
    
    MsgBox "Ostateczna suma to: " & sumaCalkowita
End Sub

Teraz zdejmij breakpoint (klikając na niego ponownie) i uruchom makro. Wynik będzie poprawny: 150.


✏️ Zadanie dla Ciebie

Oto kod, który ma za zadanie skopiować tylko niepuste wartości z kolumny A do kolumny B. Niestety, robi coś zupełnie innego.

Sub SkopiujNiepuste_Z_BLEDEM()
    Dim i As Long
    Dim ostatniWiersz As Long
    
    ostatniWiersz = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 1 To ostatniWiersz
        ' Warunek, który ma coś sprawdzać
        If IsEmpty(Cells(i, 1).Value) Then
            ' Ten kod powinien się wykonywać tylko dla NIEPUSTYCH
            Cells(i, 2).Value = Cells(i, 1).Value
        End If
    Next i
End Sub

Użyj breakpointu i krokowania F8, aby prześledzić działanie instrukcji If. Obserwuj, kiedy kod wchodzi do środka warunku i postaraj się znaleźć błąd logiczny. Powodzenia!

Prompt 10: Arkusze i skoroszyty

Prompt:

„Pokaż jak działa obiektowa praca z arkuszami w VBA.

  • Jak odwołać się do arkusza po nazwie (Sheets(„Arkusz2”)).
  • Jak odwołać się do arkusza z innego skoroszytu (Workbooks(„Plik.xlsx”).Sheets(„Dane”)).

Jak przechodzić między arkuszami (np. pobrać dane z Arkusza X i wkleić do Arkusza Y).
Dodaj ćwiczenie: napisać makro kopiujące dane z arkusza „Dane” do arkusza „Raport”.”

Treść lekcji:

W VBA, cały Excel jest zorganizowany jak hierarchia obiektów. Skoroszyt (Workbook) zawiera kolekcję arkuszy (Worksheets), a każdy arkusz zawiera komórki (Range, Cells). Zrozumienie tej struktury jest kluczowe do swobodnej pracy.

Odwoływanie się do arkuszy

Istnieje kilka sposobów, aby odwołać się do konkretnego arkusza w aktywnym skoroszycie.

1. Po nazwie (najpopularniejszy sposób)

To najbardziej czytelna metoda. Odwołujesz się do arkusza po nazwie, którą widzisz na jego karcie na dole ekranu. Nazwę arkusza zawsze podajemy w cudzysłowie.

' Odwołanie do arkusza o nazwie "Raport"
Sheets("Raport")

' Aktywacja (wybranie) tego arkusza
Sheets("Raport").Select

' Wpisanie wartości do komórki A1 w arkuszu "Raport" bez jego aktywowania
Sheets("Raport").Range("A1").Value = "To jest raport."

2. Po indeksie (numerze porządkowym)

Możesz odwołać się do arkusza po jego pozycji od lewej do prawej. Sheets(1) to pierwszy arkusz, Sheets(2) to drugi itd.

Uwaga: Jest to ryzykowna metoda, ponieważ jeśli użytkownik zmieni kolejność arkuszy, Twój kod przestanie działać poprawnie.

' Wybierz pierwszy arkusz od lewej
Sheets(1).Select

3. Po nazwie kodowej (najbezpieczniejszy sposób)

Każdy arkusz ma swoją „nazwę kodową”, którą widać w edytorze VBA w okienku Project Explorer. Domyślnie są to Arkusz1, Arkusz2 itd. Ta nazwa nie zmienia się, nawet jeśli użytkownik zmieni nazwę na karcie arkusza. To czyni ją najbardziej niezawodną metodą.

' Odwołanie do arkusza przez jego nazwę kodową
' Nawet jeśli użytkownik zmieni nazwę "Arkusz1" na "Mój Raport", ten kod wciąż zadziała!
Arkusz1.Range("A1").Value = "Najbezpieczniejsza metoda."

4. Do aktywnego arkusza

ActiveSheet to po prostu odwołanie do arkusza, który jest aktualnie zaznaczony przez użytkownika. Jest to przydatne, ale też ryzykowne, jeśli chcesz mieć pewność, że makro zadziała na konkretnym arkuszu.

' Wpisz wartość do komórki A1 w aktualnie aktywnym arkuszu
ActiveSheet.Range("A1").Value = "Wpisane w aktywnym."

Praca z arkuszami w różnych skoroszytach

Aby odwołać się do arkusza w innym, otwartym pliku Excela, musisz najpierw wskazać skoroszyt (Workbook), a dopiero potem arkusz.

' Składnia: Workbooks("NazwaPliku.xlsx").Sheets("NazwaArkusza")

Sub PobierzDaneZInnegoPliku()
    Dim dane As String
    
    ' Odczytaj wartość z komórki A1 z arkusza "Dane" w pliku "Budzet.xlsx"
    dane = Workbooks("Budzet.xlsx").Sheets("Dane").Range("A1").Value
    
    ' Wpisz odczytaną wartość do aktywnego skoroszytu
    ThisWorkbook.Sheets("Raport").Range("A1").Value = dane
End Sub

ThisWorkbook to specjalne słowo kluczowe oznaczające skoroszyt, w którym znajduje się kod VBA. Używanie go to dobra praktyka, która zwiększa czytelność i niezawodność kodu.


Przechodzenie i kopiowanie danych między arkuszami

Oto najczęstszy scenariusz: pobranie danych z jednego arkusza i wklejenie ich do drugiego.

Metoda 1: Kopiuj-Wklej (Copy/Paste)

Ta metoda używa schowka, tak jakbyś robił to ręcznie.

Sub KopiujMetoda1()
    ' Zaznacz i skopiuj zakres A1:B5 z arkusza "Dane"
    Sheets("Dane").Range("A1:B5").Copy
    
    ' Zaznacz komórkę docelową (A1) w arkuszu "Raport" i wklej
    Sheets("Raport").Range("A1").PasteSpecial xlPasteValues
    
    ' Wyczyszczenie schowka (dobra praktyka)
    Application.CutCopyMode = False
End Sub

Metoda 2: Bezpośrednie przypisanie wartości (szybsza i lepsza)

Ta metoda jest znacznie szybsza i bardziej niezawodna, ponieważ nie używa schowka systemowego. Po prostu przypisuje wartości z jednego zakresu do drugiego.

Sub KopiujMetoda2()
    ' Wartości z zakresu docelowego...
    Sheets("Raport").Range("A1:B5").Value = Sheets("Dane").Range("A1:B5").Value
End Sub

Zawsze, gdy to możliwe, używaj metody bezpośredniego przypisania wartości.


✏️ Zadanie dla Ciebie

Napisz makro, które automatyzuje proces tworzenia prostego raportu.

  1. W swoim pliku stwórz dwa arkusze i nazwij je „Dane” oraz „Raport”.
  2. W arkuszu „Dane” wpisz w zakresie A1:B5 dowolne dane (np. nazwy produktów i ich ceny).
  3. Napisz procedurę Sub StworzRaport().
  4. Wewnątrz procedury:
    • Zadeklaruj dwie zmienne obiektowe: wsDane As Worksheet i wsRaport As Worksheet.
    • Przypisz do nich odpowiednie arkusze, używając Set wsDane = ThisWorkbook.Sheets("Dane") (i analogicznie dla raportu). Używanie zmiennych czyni kod bardziej czytelnym.
    • Skopiuj wartości z zakresu A1:B5 z arkusza wsDane do zakresu zaczynającego się w komórce A2 w arkuszu wsRaport (użyj lepszej metody nr 2).
    • W komórce A1 w arkuszu wsRaport wpisz tytuł: „Raport Dnia”.
    • Na koniec wyświetl MsgBox z informacją: „Raport został wygenerowany.”.

Powodzenia! To ćwiczenie świetnie podsumowuje pracę z obiektami arkuszy.

Prompt 11: Praca z plikami i folderami

Prompt 11:

 „Pokaż jak w VBA sprawdzić, czy plik istnieje (Dir), jak go otworzyć i odczytać jego zawartość linia po linii. Pokaż też przykład przejścia po wszystkich plikach w folderze i wpisania ich nazw do Excela.”

Treść lekcji:

Interakcja z systemem plików (sprawdzanie, otwieranie i czytanie plików) to niezwykle potężna funkcja VBA, która pozwala na pełną automatyzację procesów wykraczających poza sam arkusz Excela.

Sprawdzanie, czy plik istnieje – funkcja Dir 📂

Najprostszym sposobem na sprawdzenie, czy plik lub folder istnieje, jest użycie funkcji Dir.

  • Jeśli funkcja Dir znajdzie plik o podanej ścieżce, zwróci jego nazwę (jako tekst).
  • Jeśli go nie znajdzie, zwróci pusty ciąg znaków ("").

Tę właściwość idealnie wykorzystuje się w instrukcji If.

Sub SprawdzCzyPlikIstnieje()
    Dim sciezkaDoPliku As String
    ' Pamiętaj, aby podać poprawną ścieżkę do pliku na Twoim komputerze!
    sciezkaDoPliku = "C:\Users\TwojaNazwa\Desktop\raport.xlsx"
    
    ' Sprawdzamy, czy Dir zwrócił cokolwiek
    If Dir(sciezkaDoPliku) <> "" Then
        MsgBox "Plik istnieje!"
    Else
        MsgBox "Plik o podanej ścieżce nie został znaleziony."
    End If
End Sub

Otwieranie i czytanie pliku tekstowego linia po linii

VBA potrafi otwierać pliki tekstowe (np. .txt, .csv) i czytać ich zawartość krok po kroku. Proces ten składa się z trzech etapów: Otwórz -> Czytaj w pętli -> Zamknij.

  • Open sciezka For Input As #1: Otwiera plik do odczytu (Input) i przypisuje mu numer identyfikacyjny #1.
  • Do Until EOF(1): Tworzy pętlę, która działa aż do napotkania końca pliku (EOF = End Of File) o numerze 1.
  • Line Input #1, zmienna: Czyta jedną, całą linię z pliku #1 i zapisuje ją do zmiennej tekstowej.
  • Close #1: Niezwykle ważne! Zawsze zamykaj plik po zakończeniu pracy, aby zwolnić zasoby systemowe.

Przykład

  1. Stwórz na pulpicie prosty plik tekstowy o nazwie test.txt.
  2. Wpisz w nim kilka linii tekstu, każdą w nowym wierszu.
  3. Uruchom poniższy kod (pamiętaj o poprawieniu ścieżki).
Sub CzytajPlikTekstowy()
    Dim sciezka As String
    Dim trescLinii As String
    Dim numerPliku As Integer
    
    sciezka = "C:\Users\TwojaNazwa\Desktop\test.txt"
    numerPliku = 1 ' Definiujemy numer, pod którym otworzymy plik
    
    ' Sprawdź, czy plik w ogóle istnieje, zanim spróbujesz go otworzyć
    If Dir(sciezka) = "" Then
        MsgBox "Plik test.txt nie istnieje!"
        Exit Sub ' Zakończ procedurę
    End If
    
    ' 1. OTWÓRZ plik
    Open sciezka For Input As #numerPliku
    
    ' 2. CZYTAJ w pętli aż do końca pliku
    Do Until EOF(numerPliku)
        Line Input #numerPliku, trescLinii
        ' Wypisz odczytaną linię w okienku Immediate (Ctrl+G)
        Debug.Print trescLinii
    Loop
    
    ' 3. ZAMKNIJ plik
    Close #numerPliku
    
    MsgBox "Zawartość pliku została wczytana."
End Sub

Przechodzenie przez wszystkie pliki w folderze

Funkcja Dir ma też drugie, potężne zastosowanie. Można jej użyć w pętli do wylistowania wszystkich plików pasujących do wzorca (np. wszystkich plików .xlsx) w danym folderze.

  • Pierwsze wywołanie Dir ze ścieżką (Dir("C:\Folder\*.*")) inicjuje proces i zwraca pierwszy pasujący plik.
  • Kolejne wywołania Dir bez argumentów (Dir()) zwracają kolejne pasujące pliki, aż nie będzie ich więcej.

Przykład: Wpisanie nazw wszystkich plików z folderu do Excela

Sub WypiszPlikiZFolderu()
    Dim sciezkaDoFolderu As String
    Dim nazwaPliku As String
    Dim i As Long
    
    ' Podaj ścieżkę do folderu, który chcesz przeszukać
    ' Ważne: Zakończ ścieżkę znakiem \ i dodaj wzorzec (*.* dla wszystkich plików)
    sciezkaDoFolderu = "C:\Users\TwojaNazwa\Desktop\" & "*.*"
    
    i = 1 ' Numer wiersza w Excelu
    
    ' 1. Inicjalizacja - pobranie pierwszego pliku
    nazwaPliku = Dir(sciezkaDoFolderu)
    
    ' 2. Pętla działa, dopóki Dir znajduje kolejne pliki
    Do While nazwaPliku <> ""
        ' Wpisz nazwę znalezionego pliku do komórki
        Cells(i, 1).Value = nazwaPliku
        
        ' Przejdź do następnego wiersza
        i = i + 1
        
        ' 3. Pobierz NASTĘPNY plik
        nazwaPliku = Dir()
    Loop
    
    MsgBox "Zakończono listowanie plików."
End Sub

✏️ Zadanie dla Ciebie

Napisz makro, które połączy obie poznane techniki.

  1. Stwórz na pulpicie folder o nazwie MojeNotatki.
  2. Wewnątrz tego folderu stwórz 2-3 pliki tekstowe (.txt) z dowolną, krótką treścią.
  3. Napisz procedurę Sub CzytajPierwszeLinie().
  4. Makro ma:
    • Przejrzeć wszystkie pliki z rozszerzeniem .txt w folderze MojeNotatki.
    • Dla każdego znalezionego pliku:
      • Otworzyć go.
      • Odczytać tylko pierwszą linię jego zawartości.
      • Zamknąć go.
      • Wpisać w arkuszu Excela nazwę pliku w kolumnie A i odczytaną pierwszą linię w kolumnie B.

To ćwiczenie doskonale symuluje realne zadania, takie jak masowe importowanie danych z wielu plików. Powodzenia!

Prompt 12: Praca z plikami CSV

Prompt 12:

 „Wyjaśnij jak zapisywać dane z arkusza do pliku CSV i jak odczytać plik CSV do Excela przy pomocy VBA.”

Treść lekcji:

Obsługa plików CSV (Comma-Separated Values) to kluczowa umiejętność w automatyzacji, ponieważ jest to uniwersalny format wymiany danych między różnymi programami.

CSV to prosty plik tekstowy, w którym dane tabelaryczne są zapisane w kolejnych wierszach, a wartości w każdym wierszu są oddzielone specjalnym znakiem – delimiterem (najczęściej przecinkiem , lub średnikiem ;).

Zapisywanie danych do pliku CSV

Istnieją dwie główne metody zapisu: szybka i automatyczna oraz manualna, dająca pełną kontrolę.

Metoda 1: Szybki zapis za pomocą SaveAs

Ta metoda jest idealna, gdy chcesz zapisać cały aktywny arkusz do pliku CSV. VBA zrobi wszystko za Ciebie.

  • FileFormat:=xlCSV używa przecinka jako separatora.
  • FileFormat:=xlCSVLocal (lub xlCSVMSDOS) używa separatora zgodnego z ustawieniami regionalnymi Twojego systemu (w Polsce jest to najczęściej średnik).
Sub SzybkiZapisCSV()
    Dim sciezkaDocelowa As String
    sciezkaDocelowa = ThisWorkbook.Path & "\MójRaport.csv"

    ' Wyłącz komunikaty Excela, np. o utracie formatowania
    Application.DisplayAlerts = False
    
    ' Zapisz aktywny arkusz w formacie CSV (używając średnika)
    ActiveSheet.SaveAs Filename:=sciezkaDocelowa, FileFormat:=xlCSVLocal, CreateBackup:=False
    
    ' Włącz komunikaty z powrotem (dobra praktyka)
    Application.DisplayAlerts = True
    
    MsgBox "Arkusz został zapisany jako plik CSV w lokalizacji: " & sciezkaDocelowa
End Sub

Uwaga: Ta metoda zapisuje tylko wartości z aktywnego arkusza i traci całe formatowanie.

Metoda 2: Zapis manualny (pełna kontrola)

Tej metody używasz, gdy chcesz zapisać tylko wybrany zakres danych lub mieć pełną kontrolę nad formatem. Polega ona na przejściu pętlą przez komórki i ręcznym zbudowaniu każdej linii tekstu.

Sub ZapisManualnyCSV()
    Dim sciezkaDocelowa As String
    Dim numerPliku As Integer
    Dim wiersz As Long, kolumna As Long
    Dim liniaTekstu As String
    
    sciezkaDocelowa = ThisWorkbook.Path & "\RaportRęczny.csv"
    numerPliku = FreeFile ' VBA sam znajduje wolny numer pliku
    
    ' Otwórz plik do zapisu
    Open sciezkaDocelowa For Output As #numerPliku
    
    ' Pętla po wierszach i kolumnach w zakresie A1:C5
    For wiersz = 1 To 5
        liniaTekstu = "" ' Zresetuj linię dla każdego nowego wiersza
        For kolumna = 1 To 3
            ' Zbuduj linię, dodając wartość z komórki i średnik
            liniaTekstu = liniaTekstu & Cells(wiersz, kolumna).Value & ";"
        Next kolumna
        
        ' Wpisz gotową linię do pliku (bez ostatniego średnika)
        Print #numerPliku, Left(liniaTekstu, Len(liniaTekstu) - 1)
    Next wiersz
    
    ' Zamknij plik
    Close #numerPliku
    
    MsgBox "Zakres A1:C5 został zapisany do pliku CSV."
End Sub

Odczytywanie danych z pliku CSV

Podobnie jak przy zapisie, mamy dwie metody: automatyczną i manualną.

Metoda 1: Szybki odczyt za pomocą Workbooks.Open

To najprostszy sposób. Excel sam otworzy plik CSV i inteligentnie podzieli dane na kolumny w nowym skoroszycie.

Sub SzybkiOdczytCSV()
    Dim sciezkaDoPliku As String
    sciezkaDoPliku = ThisWorkbook.Path & "\MójRaport.csv"
    
    If Dir(sciezkaDoPliku) <> "" Then
        ' Otwórz plik CSV. Excel utworzy nowy skoroszyt z danymi.
        Workbooks.Open Filename:=sciezkaDoPliku
    Else
        MsgBox "Plik nie istnieje!"
    End If
End Sub

Metoda 2: Odczyt manualny (linia po linii)

Ta metoda daje Ci elastyczność w umieszczaniu danych w dowolnym miejscu w istniejącym arkuszu. Wykorzystuje funkcję Split, która dzieli linię tekstu na tablicę na podstawie podanego separatora.

Sub OdczytManualnyCSV()
    Dim sciezkaDoPliku As String
    Dim numerPliku As Integer
    Dim trescLinii As String
    Dim danePodzielone() As String
    Dim wierszDocelowy As Long
    
    sciezkaDoPliku = ThisWorkbook.Path & "\RaportRęczny.csv"
    numerPliku = FreeFile
    wierszDocelowy = 1
    
    If Dir(sciezkaDoPliku) = "" Then Exit Sub
    
    Open sciezkaDoPliku For Input As #numerPliku
    
    Do Until EOF(numerPliku)
        ' Wczytaj jedną linię z pliku
        Line Input #numerPliku, trescLinii
        
        ' Podziel linię na fragmenty używając średnika jako separatora
        danePodzielone = Split(trescLinii, ";")
        
        ' Wpisz dane z tablicy do komórek w arkuszu
        ' UBound zwraca górną granicę tablicy (indeks ostatniego elementu)
        Range(Cells(wierszDocelowy, 1), Cells(wierszDocelowy, UBound(danePodzielone) + 1)).Value = danePodzielone
        
        wierszDocelowy = wierszDocelowy + 1
    Loop
    
    Close #numerPliku
    MsgBox "Dane z pliku CSV zostały wczytane."
End Sub

✏️ Zadanie dla Ciebie

Napisz makro, które wyczyści dane z arkusza, a następnie zaimportuje dane z pliku CSV.

  1. W arkuszu Excela wpisz dowolne dane w zakresie A1:B3 (np. imiona i nazwiska).
  2. Napisz procedurę Sub EksportujDane(), która za pomocą metody manualnej zapisze zakres A1:B3 do pliku kontakty.csv, używając przecinka , jako separatora.
  3. Napisz drugą procedurę Sub ImportujDane(), która:
    • Najpierw wyczyści zawartość zakresu A1:E10 w aktywnym arkuszu (Range("A1:E10").ClearContents).
    • Następnie, za pomocą metody manualnej, otworzy plik kontakty.csv, odczyta go linia po linii, podzieli dane za pomocą funkcji Split i wpisze je z powrotem do arkusza, zaczynając od komórki A1.

To ćwiczenie pozwoli Ci prześledzić cały cykl życia danych: od Excela, przez plik zewnętrzny, z powrotem do Excela. Powodzenia!

Prompt 13: Mały projekt: lista zadań w Excelu

Prompt 13:

 „Napisz prosty program w VBA, który pozwala dodać zadania do listy w arkuszu, wyświetlić je i oznaczyć jako wykonane (np. przekreślenie lub zmiana koloru).”

Treść lekcji:

Zbudujemy prosty menedżer zadań. To świetny przykład, jak połączyć wszystko, czego się do tej pory nauczyliśmy: pracę z komórkami, pętle, instrukcje warunkowe i interakcję z użytkownikiem.

Krok 1: Przygotowanie arkusza

Najpierw przygotujmy nasz arkusz.

  1. Otwórz nowy, czysty arkusz Excela.
  2. W komórce A1 wpisz nagłówek „Zadanie”.
  3. W komórce B1 wpisz nagłówek „Status”.
  4. Możesz pogrubić te nagłówki, aby wyglądały ładniej.

Nasz program będzie działał w oparciu o tę strukturę.


Krok 2: Kod VBA

Teraz otwórz edytor VBA (Alt+F11) i wklej poniższy kod do nowego modułu. Kod składa się z trzech oddzielnych procedur (Sub), które realizują poszczególne funkcje.

Option Explicit ' Dobra praktyka, wymusza deklarowanie wszystkich zmiennych

' ===================================================================
' PROCEDURA 1: Dodawanie nowego zadania do listy
' ===================================================================
Sub DodajNoweZadanie()
    Dim noweZadanie As String
    Dim pierwszyWolnyWiersz As Long
    
    ' 1. Zapytaj użytkownika o treść zadania
    noweZadanie = InputBox("Wpisz treść nowego zadania:", "Dodaj zadanie")
    
    ' 2. Sprawdź, czy użytkownik coś wpisał i nie anulował okienka
    If noweZadanie = "" Then
        Exit Sub ' Zakończ, jeśli puste
    End If
    
    ' 3. Znajdź pierwszy wolny wiersz w kolumnie A
    ' Zaczynamy szukanie od dołu, co jest najpewniejszą metodą
    pierwszyWolnyWiersz = Cells(Rows.Count, "A").End(xlUp).Row + 1
    
    ' 4. Wpisz zadanie i status do znalezionego wiersza
    Cells(pierwszyWolnyWiersz, "A").Value = noweZadanie
    Cells(pierwszyWolnyWiersz, "B").Value = "Do zrobienia"
    
    MsgBox "Zadanie zostało dodane do listy."
End Sub


' ===================================================================
' PROCEDURA 2: Oznaczanie zadania jako wykonane
' ===================================================================
Sub OznaczZadanieJakoWykonane()
    Dim zaznaczonaKomorka As Range
    
    ' 1. Sprawdź, czy użytkownik cokolwiek zaznaczył
    If Selection Is Nothing Then
        MsgBox "Najpierw zaznacz komórkę z zadaniem, które chcesz oznaczyć.", vbInformation
        Exit Sub
    End If
    
    ' Ustawiamy zmienną na pierwszą komórkę w zaznaczeniu użytkownika
    Set zaznaczonaKomorka = Selection.Cells(1, 1)
    
    ' 2. Sprawdź, czy zaznaczona komórka jest w kolumnie A i nie jest pusta ani nie jest nagłówkiem
    If zaznaczonaKomorka.Column = 1 And Not IsEmpty(zaznaczonaKomorka) And zaznaczonaKomorka.Row > 1 Then
        ' 3. Zmień formatowanie i status
        With zaznaczonaKomorka
            .Font.Strikethrough = True ' Przekreślenie
            .Font.ColorIndex = 15      ' Szary kolor
        End With
        
        ' Zmień status w kolumnie obok (kolumna B)
        zaznaczonaKomorka.Offset(0, 1).Value = "Wykonane"
    Else
        MsgBox "Proszę, zaznacz jedną komórkę z zadaniem w kolumnie A.", vbExclamation
    End If
End Sub


' ===================================================================
' PROCEDURA 3: Usuwanie wykonanych zadań z listy
' ===================================================================
Sub UsunWykonaneZadania()
    Dim ostatniWiersz As Long
    Dim i As Long
    
    ' 1. Znajdź ostatni używany wiersz
    ostatniWiersz = Cells(Rows.Count, "A").End(xlUp).Row
    
    ' 2. Pętla od dołu do góry (kluczowe przy usuwaniu wierszy!)
    For i = ostatniWiersz To 2 Step -1
        ' 3. Sprawdź, czy status w kolumnie B to "Wykonane"
        If Cells(i, "B").Value = "Wykonane" Then
            ' 4. Jeśli tak, usuń cały wiersz
            Rows(i).Delete
        End If
    Next i
    
    MsgBox "Wykonane zadania zostały usunięte."
End Sub

Krok 3: Jak z tego korzystać?

Masz teraz trzy niezależne makra. Możesz je uruchamiać ręcznie (z menu Deweloper -> Makra), ale znacznie wygodniej jest dodać przyciski w arkuszu.

  1. Przejdź do karty Deweloper -> Wstaw -> Przycisk (formant formularza).
  2. Narysuj przycisk na arkuszu.
  3. Pojawi się okienko „Przypisywanie makra”. Wybierz DodajNoweZadanie i kliknij OK.
  4. Zmień tekst na przycisku na np. „Dodaj zadanie”.
  5. Powtórz te kroki dla pozostałych dwóch makr, tworząc przyciski „Oznacz jako wykonane” i „Usuń wykonane”.

Instrukcja obsługi Twojego nowego programu:

  • Aby dodać zadanie: Kliknij przycisk „Dodaj zadanie” i wpisz treść w okienku.
  • Aby oznaczyć jako wykonane: Zaznacz komórkę z zadaniem, które ukończyłeś (w kolumnie A), a następnie kliknij przycisk „Oznacz jako wykonane”.
  • Aby posprzątać listę: Kliknij „Usuń wykonane”, a wszystkie przekreślone zadania znikną.

To kompletny, choć prosty, program użytkowy napisany w VBA. Gratulacje! Możesz go teraz dowolnie modyfikować i rozbudowywać.

Prompt 14: Automatyczne wysyłanie maili z Excela

Prompt 14:

„Pokaż jak w VBA wysłać maila przez Outlooka, z raportem Excela w załączniku.
Dodaj przykład, gdzie treść maila i odbiorca są pobierane z arkusza.”

Treść lekcji:

Automatyzacja Outlooka to jedna z najpotężniejszych funkcji VBA, pozwalająca na wysyłanie raportów, powiadomień i biuletynów bezpośrednio z poziomu Excela. Pokażę Ci, jak to zrobić.

Krok 1: Włączenie referencji do biblioteki Outlook

Zanim zaczniemy, musisz „powiedzieć” Excelowi, jak rozmawiać z Outlookiem. Robi się to przez dodanie odpowiedniej biblioteki obiektów.

  1. Otwórz edytor VBA (Alt+F11).
  2. W menu przejdź do Tools -> References… (Narzędzia -> Referencje…).
  3. Na liście znajdź i zaznacz pozycję „Microsoft Outlook XX.0 Object Library”. Numer wersji (XX.0) zależy od Twojej wersji Office (np. 16.0 dla Office 2016/365). Zazwyczaj jest to najwyższy dostępny numer. Jeśli domyślnie masz zaznaczoną opcję „Microsoft Office XX.0 Object Library” to też powinno wystarczyć do tej automatyzacji.
  4. Kliknij OK.

To kluczowy krok. Bez niego poniższy kod nie zadziała.


Prosty przykład: Wysłanie maila z załącznikiem

Poniższy kod tworzy nowego maila, dodaje do niego jako załącznik aktywny skoroszyt Excela, a następnie go wyświetla (nie wysyła automatycznie, co jest bezpieczniejsze na początek).

Sub WyslijProstyEmail()
    ' Deklaracja zmiennych obiektowych dla Outlooka
    Dim aplikacjaOutlook As Object
    Dim nowyMail As Object
    
    ' Utwórz instancję aplikacji Outlook
    ' On Error Resume Next - zabezpieczenie, gdyby Outlook był już otwarty
    On Error Resume Next
    Set aplikacjaOutlook = GetObject(, "Outlook.Application")
    If aplikacjaOutlook Is Nothing Then
        Set aplikacjaOutlook = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0
    
    ' Utwórz nowy obiekt maila
    Set nowyMail = aplikacjaOutlook.CreateItem(0) ' 0 oznacza olMailItem
    
    ' Użyj bloku With...End With dla czytelności
    With nowyMail
        .To = "adres@przyklad.com"
        .Subject = "Raport kwartalny"
        .Body = "Cześć," & vbCrLf & vbCrLf & "W załączniku przesyłam raport." & vbCrLf & "Pozdrawiam,"
        
        ' Zapisz skoroszyt przed wysłaniem, aby załącznik był aktualny
        ThisWorkbook.Save
        
        ' Dodaj aktywny skoroszyt jako załącznik
        .Attachments.Add ThisWorkbook.FullName
        
        ' .Display - wyświetla okno maila do ręcznego sprawdzenia i wysłania
        ' .Send - wysyła maila automatycznie w tle
        .Display
    End With
    
    ' Zwolnij zmienne z pamięci
    Set nowyMail = Nothing
    Set aplikacjaOutlook = Nothing
End Sub
  • vbCrLf to stała VBA oznaczająca przejście do nowej linii, odpowiednik naciśnięcia Enter.
  • Użycie .Display pozwala sprawdzić, czy mail wygląda poprawnie przed wysłaniem. Aby wysyłać automatycznie, zamień .Display na .Send.

Przykład zaawansowany: Dane pobierane z arkusza

To jest najbardziej praktyczny scenariusz. Przygotujmy arkusz:

  • W komórce A2 wpisz adres e-mail odbiorcy.
  • W komórce B2 wpisz temat maila.
  • W komórce C2 wpisz treść maila.

Poniższe makro pobierze te dane i użyje ich do stworzenia wiadomości.

Sub WyslijMailZDanych()
    Dim aplikacjaOutlook As Object
    Dim nowyMail As Object
    Dim ws As Worksheet
    
    ' Ustawiamy odwołanie do aktywnego arkusza dla czytelności
    Set ws = ThisWorkbook.ActiveSheet
    
    Set aplikacjaOutlook = CreateObject("Outlook.Application")
    Set nowyMail = aplikacjaOutlook.CreateItem(0)
    
    With nowyMail
        ' Pobierz dane z komórek arkusza
        .To = ws.Range("A2").Value
        .Subject = ws.Range("B2").Value
        .Body = ws.Range("C2").Value
        
        ' Dodaj załącznik - ten sam skoroszyt, w którym jest makro
        .Attachments.Add ThisWorkbook.FullName
        
        ' Wyświetl do akceptacji
        .Display
    End With
    
    Set nowyMail = Nothing
    Set aplikacjaOutlook = Nothing
End Sub

Dzięki takiemu podejściu możesz przygotować w Excelu całą listę mailingową i wysłać spersonalizowane raporty do wielu osób za pomocą pętli!

Uwaga dotycząca bezpieczeństwa: Outlook może wyświetlić ostrzeżenie o tym, że „program próbuje wysłać wiadomość e-mail w Twoim imieniu”. Jest to standardowe zabezpieczenie. Będziesz musiał zezwolić na tę akcję.


✏️ Zadanie dla Ciebie

Zmodyfikuj makro WyslijMailZDanych tak, aby:

  1. Zamiast dodawać jako załącznik cały skoroszyt, najpierw tworzyło nowy, tymczasowy skoroszyt.
  2. Do tego nowego skoroszytu kopiowało tylko zakres A1:D10 z aktywnego arkusza.
  3. Zapisywało ten tymczasowy plik w folderze z dokumentami pod nazwą Raport_dla_klienta.xlsx.
  4. To właśnie ten nowy, mniejszy plik dodawało jako załącznik do maila.
  5. Po wyświetleniu maila, zamykało tymczasowy skoroszyt bez zapisywania zmian i (opcjonalnie) usuwało plik z dysku.

To bardzo częsty scenariusz, gdy nie chcesz wysyłać całego pliku z danymi źródłowymi i makrami, a jedynie jego fragment. Powodzenia!


Podsumowanie – i co dalej?

Mam nadzieję, że to dopiero początek Twojej przygody z VBA. Świadomie pominąłem tutaj prompt z gotowym przykładem automatyzacji – bo jeśli na co dzień pracujesz z Excelem, to jestem przekonany, że w Twojej głowie już pojawiły się pomysły na mniejsze i większe usprawnienia. Właśnie od nich warto zacząć.

Na potrzeby tego mini kursu skupiłem się na podstawach, które pozwalają szybko zacząć pisać własne makra i automatyzacje w Excelu. Pominąłem jednak kilka ciekawych obszarów, które mogą Ci się przydać w codziennej pracy. Warto je zgłębić samodzielnie z pomocą AI, np.:

  • bardziej zaawansowane operacje na stringach (np. Replace, Split, Join),
  • praca z kolekcjami i obiektami (Collection, Dictionary),
  • formularze i proste interfejsy użytkownika (UserForms),
  • wydajność i optymalizacja makr (np. wyłączanie odświeżania ekranu),
  • interakcja z innymi aplikacjami pakietu Office poza Outlookiem (np. Word, PowerPoint).

Jeśli któryś z tych tematów szczególnie Cię zainteresuje – wystarczy, że poprosisz AI o lekcję z przykładami i ćwiczeniami. To naturalny kolejny krok, kiedy masz już w ręku podstawy VBA.

Spójrz też na przykład z Promptu 13. W kilka sekund dostaliśmy działający, mini program – całość wygenerowana przez AI. I to jest świetna wiadomość: gdy już poznasz podstawy składni VBA czy Pythona, AI może stać się Twoim partnerem do pisania fragmentów kodu, funkcji czy całych procedur. Ty dajesz pomysł, a AI przyspiesza jego realizację.

Ale uwaga – nie zatrzymuj się na teorii. Najlepsza nauka to learning by doing. Spróbuj samemu napisać kilka prostych automatyzacji, a kiedy coś nie będzie działać – dopytaj AI albo poszukaj rozwiązania. W ten sposób wiedza z lekcji zamieni się w realne umiejętności.

I pamiętaj – automatyzacja to nie domena wielkich programistów. To narzędzie dla każdego, kto chce pracować szybciej, mądrzej i z większą satysfakcją.

W kolejnych wpisach na blogu znajdziesz materiały o automatyzacji SAPa. Tam pokażę, jak w praktyce wykorzystać to, czego nauczyliśmy się tutaj. To będzie świetna okazja, by przejść o krok dalej.

Napisz komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Scroll to Top