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ą.
- Kliknij prawym przyciskiem myszy na wstążce i wybierz Dostosuj wstążkę (rys. 1)
- Zaznacz opcję Deweloper i kliknij OK (rys. 2)


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).

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:
- Zaznacz komórkę
A1. - Wpisz do zaznaczonej komórki tekst “toThePyPoint.pl” i wciśnij Enter.
- Jesteś teraz w komórce
A2– wpisz tutaj wartość1i wciśnij Enter. - Do komórki
A3wprowadź wartość2i wciśnij Enter. - Do komórki
A4wprowadź formułę=SUMA(A2:A3)i wciśnij Enter. - Zaznacz ponownie komórkę
A4i 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).


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):
- 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)
- 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.
- 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. - 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.

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) lubFalse(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 IntegerCLng()– konwertuj na LongCDbl()– konwertuj na DoubleCStr()– konwertuj na StringCDate()– 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
- Napisz procedurę o nazwie
MojeDane. - Zadeklaruj w niej trzy zmienne:
nazwaProduktutypuStringiloscSztuktypuIntegercenaJednostkowatypuDouble
- Przypisz do nich następujące wartości:
- nazwaProduktu = „Długopis”
- iloscSztuk = 50
- cenaJednostkowa = 2.55
- Zadeklaruj czwartą zmienną
wartoscCalkowitatypuDouble. - Oblicz wartość całkowitą (
iloscSztuk*cenaJednostkowa) i przypisz wynik do zmiennejwartoscCalkowita. - 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 coRange("A1").Cells(2, 3)to to samo coRange("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
| Metoda | Składnia | Kiedy najlepsza? |
Range | Range("A1"), Range("A1:C10") | Stałe adresy, nazwane zakresy, łatwość odczytu. |
Cells | Cells(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:
- Za pomocą obiektu
Rangewpisze tekst „Raport Sprzedaży” do komórki A1. - Za pomocą obiektu
Cellswpisze wartość1000do komórki B2 (wiersz 2, kolumna 2). - Za pomocą obiektu
Rangepogrubi czcionkę (.Font.Bold = True) w komórce A1. - Za pomocą obiektu
Cellszmieni 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 jakRound,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
| Operator | Nazwa | Przykład | Wynik |
+ | Dodawanie | 10 + 5 | 15 |
- | Odejmowanie | 10 - 5 | 5 |
* | Mnożenie | 10 * 5 | 50 |
/ | Dzielenie | 10 / 4 | 2.5 |
^ | Potęgowanie | 10 ^ 2 | 100 |
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.
| Operator | Znaczenie | Przykład | Wynik |
= | Równy | a = b | Fałsz |
<> | Różny od | a <> b | Prawda |
> | Większy niż | a > b | Prawda |
< | Mniejszy niż | a < b | Fałsz |
>= | Większy lub równy | a >= 15 | Prawda |
<= | Mniejszy lub równy | b <= 5 | Prawda |
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ą.
- Wpisz dowolne liczby do komórek
A1,A2iA3w swoim arkuszu Excel. - 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
- Wpisz w komórce
A1arkusza Excel jakąś cenę netto, np.199.99. - Napisz procedurę o nazwie
ObliczCeneBrutto. - Wewnątrz procedury:
- Zadeklaruj zmienną
cenaNettoi pobierz do niej wartość z komórkiA1. - Zadeklaruj stałą stawkę VAT:
Const STAWKA_VAT As Double = 0.23. (Stałą deklaruje się słowemConst– 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.
- Zadeklaruj zmienną
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 pozycjistart.
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 @).
- Wpisz w komórce
A1jakiś adres e-mail (np.test@example.com) lub zwykły tekst. - 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.
- Wpisz w komórce
A1tekst:FV/2455/2023/KRK. - Napisz procedurę o nazwie
AnalizujFakture. - Wewnątrz procedury:
- Pobierz cały numer faktury z komórki
A1do zmiennej. - Użyj funkcji
MidiInStr(lub samychMid), aby wyciągnąć numer2455. Podpowiedź: numer zaczyna się na 4. pozycji i ma 4 znaki. - Użyj funkcji
Right, aby wyciągnąć kod miastaKRK. - Użyj
MsgBox, aby wyświetlić komunikat:"Numer faktury: 2455, Miasto: KRK".
- Pobierz cały numer faktury z komórki
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:
- Zatrzymuje wykonywanie całego kodu.
- 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?
- 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.
- 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.
- 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.
- Procedura ma prosić użytkownika o podanie nazwy arkusza za pomocą funkcji
InputBox. - Następnie ma spróbować zaznaczyć
(Worksheets("nazwaArkusza").Select) arkusz o podanej nazwie. - Użyj bloku
On Error GoTo, aby obsłużyć sytuację, w której arkusz o podanej nazwie nie istnieje w skoroszycie. - Jeśli arkusz nie zostanie znaleziony, zamiast błędu VBA, powinien pojawić się
MsgBoxz komunikatem:"Nie znaleziono arkusza o nazwie [tutaj wstaw nazwę podaną przez użytkownika]". - Jeśli arkusz istnieje, makro powinno go po prostu zaznaczyć, a na końcu może pojawić się
MsgBoxz 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
AndlubOr(np.If sprzedaz > 1000 And kraj = "Polska"). - Każdy
ElseIfsprawdza zupełnie inny warunek lub inną zmienną.
- Masz złożone warunki logiczne z operatorami
- 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:
- Pobiera z komórki
A1ocenę liczbową pracownika (np. od 1 do 5). - Za pomocą instrukcji
Select Casezamienia ocenę liczbową na opis słowny i wpisuje go do komórkiB1:Case 5-> „Wybitna”Case 4-> „Bardzo dobra”Case 3-> „Dobra”Case 2-> „Wystarczająca”Case Else-> „Ocena nieprawidłowa”
- Następnie, za pomocą instrukcji
If, sprawdza, czy ocena w komórceA1jest większa lub równa 4. - Jeśli tak, w komórce
C1pojawia się tekst „Premia”, w przeciwnym wypadku komórkaC1ma 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ętli | Kiedy używać? |
For…Next | Gdy znasz dokładną liczbę powtórzeń (np. 100 razy, tyle ile jest wierszy). |
For Each…Next | Gdy chcesz wykonać operację na każdym obiekcie w grupie (np. na każdej komórce, każdym arkuszu). |
Do…Loop | Gdy 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.
- Wpisz w kolumnie A różne liczby, niektóre mniejsze, a niektóre większe od 100.
- Napisz procedurę o nazwie
PodswietlWiekszeNiz100. - Użyj pętli
For Each...Next, aby przejść przez każdą komórkę w zakresieRange("A1:A20"). - Wewnątrz pętli użyj instrukcji
If, aby sprawdzić, czy wartość komórki jest większa od 100. - 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
- Przykład:
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 naEnd 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 naEnd 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.
- Funkcja ma przyjmować dwa parametry:
kwotaNetto As DoubleprocentVAT As Double(np. dla 23% VAT, użytkownik poda 0.23)
- Funkcja ma zwracać wartość typu
Double. - Wewnątrz funkcja ma obliczyć kwotę brutto według wzoru:
kwotaNetto * (1 + procentVAT). - Wynik ma zostać przypisany do nazwy funkcji, aby go zwrócić.
- Po napisaniu funkcji, przetestuj ją w komórce Excela, wpisując formułę np.
=ObliczBrutto(100; 0,23). Oczekiwany wynik to123.
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 menuView -> 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_zmienneji 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:
- Ustaw Breakpoint: Otwórz edytor VBA i kliknij na szary margines obok linii
sumaCalkowita = 0, aby ustawić breakpoint. - Uruchom Makro: Uruchom makro
SumujWartosci_Z_BLEDEM. Wykonanie kodu natychmiast zatrzyma się na Twoim breakpoincie, a linia zaświeci się na żółto. - Otwórz okienko Locals: Jeśli nie jest widoczne, włącz je (
View -> Locals Window). Zobaczysz tam swoje zmienne:komorkaisumaCalkowita. - Zacznij krokowanie (
F8):- Naciśnij
F8. Wykona się liniasumaCalkowita = 0. W okienku Locals zobaczysz, żesumaCalkowitama wartość0. - Naciśnij
F8ponownie. Wykona sięsumaCalkowita = sumaCalkowita + komorka.Value. Wartośćkomorka.Valueto10, więcsumaCalkowitazmieni się na10. - Naciśnij
F8ponownie. Pętla przechodzi do drugiej iteracji (komorkama teraz wartość20). Żółte podświetlenie wraca na linię z breakpointem. - Naciśnij
F8i obserwuj! LiniasumaCalkowita = 0znowu się wykonuje. W okienku Locals widzisz, jak TwojasumaCalkowita, która przed chwilą wynosiła10, jest zerowana!
- Naciśnij
- Diagnoza: W tym momencie znalazłeś błąd. Zmienna
sumaCalkowitajest resetowana do zera w każdym okrążeniu pętli, przez co gubi wynik z poprzednich iteracji. - Naprawa: Zatrzymaj makro (przycisk „Reset” – kwadrat w edytorze VBA). Przesuń linię
sumaCalkowita = 0przed 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.
- W swoim pliku stwórz dwa arkusze i nazwij je „Dane” oraz „Raport”.
- W arkuszu „Dane” wpisz w zakresie
A1:B5dowolne dane (np. nazwy produktów i ich ceny). - Napisz procedurę
Sub StworzRaport(). - Wewnątrz procedury:
- Zadeklaruj dwie zmienne obiektowe:
wsDane As WorksheetiwsRaport 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:B5z arkuszawsDanedo zakresu zaczynającego się w komórceA2w arkuszuwsRaport(użyj lepszej metody nr 2). - W komórce
A1w arkuszuwsRaportwpisz tytuł: „Raport Dnia”. - Na koniec wyświetl
MsgBoxz informacją: „Raport został wygenerowany.”.
- Zadeklaruj dwie zmienne obiektowe:
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
Dirznajdzie 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 numerze1.Line Input #1, zmienna: Czyta jedną, całą linię z pliku#1i zapisuje ją do zmiennej tekstowej.Close #1: Niezwykle ważne! Zawsze zamykaj plik po zakończeniu pracy, aby zwolnić zasoby systemowe.
Przykład
- Stwórz na pulpicie prosty plik tekstowy o nazwie
test.txt. - Wpisz w nim kilka linii tekstu, każdą w nowym wierszu.
- 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
Dirze ścieżką (Dir("C:\Folder\*.*")) inicjuje proces i zwraca pierwszy pasujący plik. - Kolejne wywołania
Dirbez 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.
- Stwórz na pulpicie folder o nazwie
MojeNotatki. - Wewnątrz tego folderu stwórz 2-3 pliki tekstowe (
.txt) z dowolną, krótką treścią. - Napisz procedurę
Sub CzytajPierwszeLinie(). - Makro ma:
- Przejrzeć wszystkie pliki z rozszerzeniem
.txtw folderzeMojeNotatki. - 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.
- Przejrzeć wszystkie pliki z rozszerzeniem
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:=xlCSVużywa przecinka jako separatora.FileFormat:=xlCSVLocal(lubxlCSVMSDOS) 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.
- W arkuszu Excela wpisz dowolne dane w zakresie
A1:B3(np. imiona i nazwiska). - Napisz procedurę
Sub EksportujDane(), która za pomocą metody manualnej zapisze zakresA1:B3do plikukontakty.csv, używając przecinka,jako separatora. - Napisz drugą procedurę
Sub ImportujDane(), która:- Najpierw wyczyści zawartość zakresu
A1:E10w 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ą funkcjiSpliti wpisze je z powrotem do arkusza, zaczynając od komórki A1.
- Najpierw wyczyści zawartość zakresu
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.
- Otwórz nowy, czysty arkusz Excela.
- W komórce A1 wpisz nagłówek „Zadanie”.
- W komórce B1 wpisz nagłówek „Status”.
- 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.
- Przejdź do karty Deweloper -> Wstaw -> Przycisk (formant formularza).
- Narysuj przycisk na arkuszu.
- Pojawi się okienko „Przypisywanie makra”. Wybierz
DodajNoweZadaniei kliknij OK. - Zmień tekst na przycisku na np. „Dodaj zadanie”.
- 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.
- Otwórz edytor VBA (Alt+F11).
- W menu przejdź do Tools -> References… (Narzędzia -> Referencje…).
- 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.
- 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
vbCrLfto stała VBA oznaczająca przejście do nowej linii, odpowiednik naciśnięcia Enter.- Użycie
.Displaypozwala sprawdzić, czy mail wygląda poprawnie przed wysłaniem. Aby wysyłać automatycznie, zamień.Displayna.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:
- Zamiast dodawać jako załącznik cały skoroszyt, najpierw tworzyło nowy, tymczasowy skoroszyt.
- Do tego nowego skoroszytu kopiowało tylko zakres
A1:D10z aktywnego arkusza. - Zapisywało ten tymczasowy plik w folderze z dokumentami pod nazwą
Raport_dla_klienta.xlsx. - To właśnie ten nowy, mniejszy plik dodawało jako załącznik do maila.
- 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.

