Niniejsze opracowanie zostało przygotowane z myślą o osobach, które posiadają już podstawową znajomość języka VBA (Visual Basic for Applications) i chcą pogłębić swoje zrozumienie modelu obiektowego w Excelu i wyjść poza ramy nagrywania kodu i drobnych modyfikacji. Zrozumienie hierarchii obiektów oraz zasad pracy z właściwościami, metodami i zdarzeniami stanowi fundament dla efektywnej automatyzacji procesów w arkuszach kalkulacyjnych.
Model obiektowy w VBA (Visual Basic for Applications) to struktura, która umożliwia zarządzanie elementami w aplikacjach Microsoft, takich jak Excel. Jego podstawą są obiekty, które reprezentują rzeczywiste elementy arkusza, na przykład skoroszyty, arkusze, komórki czy wykresy. Dzięki temu możliwe jest tworzenie zautomatyzowanych rozwiązań, które znacząco usprawniają pracę z danymi.
Za pomocą modelu obiektowego można w prosty sposób manipulować danymi, kontrolować wygląd arkuszy czy wykonywać operacje na dużych zbiorach informacji. Korzystanie z modelu obiektowego nie wymaga specjalistycznej wiedzy programistycznej, lecz odrobiny znajomości hierarchii obiektów i ich właściwości lub umiejętności obsługi przeglądarki obiektów Object Browser w edytorze VBA o czym napiszemy później 😉.
Obiekty w VBA i Excelu można porównać do rzeczywistych, fizycznych przedmiotów, które posiadają pewne cechy (właściwości), potrafią wykonywać określone działania (metody) i mogą reagować na różne zdarzenia. W kontekście Excela obiektami są wszelkie elementy, które składają się na strukturę programu, takie jak skoroszyty, arkusze, zakresy komórek, wykresy, przyciski, tabele czy nawet cała aplikacja Excel.
Obiekt w Excelu można porównać do różnych rzeczy spotykanych w życiu codziennym. Każdy przedmiot ma swoje cechy, może wykonywać określone funkcje i często reaguje na działania zewnętrzne. Oto kilka przykładów:
Excel jako aplikacja jest jak biuro, w którym odbywa się praca nad wieloma projektami.
Arkusz w skoroszycie można przyrównać do kartki w teczce.
Zakres komórek (Range) jako konkretne pola na kartce
Wszystkie obiekty w Excelu są ze sobą powiązane w hierarchicznej strukturze, co przypomina organizację drzewa.
Hierarchia w Excelu przypomina proces wykonywania zadania jak we wcześniej opisanym przykładzie biurowym:
Nie można wykonać działań na kartce, jeśli najpierw nie wybrano odpowiedniej teczki, ponieważ nie wiadomo, z którym dokumentem ma być prowadzona praca 😊.
Na szczęście w VBA korzystanie z hierarchii jest uproszczone. Gdy pracuje się w bieżącym skoroszycie lub arkuszu, nie ma konieczności podawania całej ścieżki hierarchii za każdym razem. Excel domyślnie zakłada, że wykonywane działania odnoszą się do aktywnego skoroszytu lub arkusza.
Można od razu wpisać tekst do komórki A1 bez odwoływania się do całej hierarchii:
Range(„A1”).Value = „Kursy Expose są najlepsze na rynku!”
Zamiast
Application.Workbooks("MójSkoroszyt.xlsx").Worksheets("Arkusz1") .Range(„A1”).Value = „Kursy Expose są najlepsze na rynku!”
Warto pamiętać o hierarchii, aby wiedzieć, jak precyzyjnie wskazać obiekt, gdy konieczne jest działanie na innym arkuszu lub skoroszycie nie uruchamiając tych okien lub arkuszy podczas działania kodu co znacznie przyśpiesza jego realizację.
(Nawet bez dostępu do Internetu 😊 )
Przeglądarka obiektów wbudowana w edytor VBA pozwala szybko znaleźć informacje o obiektach, ich metodach, właściwościach i zdarzeniach. Aby jej użyć:
W dolnej części przeglądarki można zobaczyć dostępne metody (np. ClearContents
), właściwości (np. Value
) oraz zdarzenia (np. Change
).
Workbook
, Worksheet
czy Range opisane powyżej
.Copy
(kopiowanie) czy Delete
(usuwanie). Można jest nazwać w pewnym sensie „funkcjami”, które coś konkretnego wykonują.Name
(nazwa arkusza) czy Value
(wartość komórki).a. Jak odwołać się do konkretnego skoroszytu i wykonać dowolną metodę?Sub OdwołanieDoSkoroszytu()
' Pełna ścieżka w hierarchii - aktywacja arkusza i zmiana koloru karty
Workbooks("Przykład.xlsx").Worksheets("Arkusz1").Activate ' Aktywacja arkusza
Workbooks("Przykład.xlsx").Worksheets("Arkusz1").Tab.Color = vbGreen ' Zmiana koloru karty arkusza na zielony
' Skrócona ścieżka - zakładamy, że skoroszyt "Przykład.xlsx" jest już aktywny
Worksheets("Arkusz1").Activate ' Aktywacja arkusza
Worksheets("Arkusz1").Tab.Color = vbGreen ' Zmiana koloru karty arkusza na zielony
End Sub
Pełna ścieżka jest bardziej uniwersalna, ponieważ nie wymaga uprzedniego aktywowania skoroszytu.
Skrócona ścieżka jest wygodniejsza i szybsza w zapisaniu, ale działa poprawnie tylko wtedy, gdy skoroszyt „Przykład.xlsx” jest aktywny. W przeciwnym razie wystąpi błąd.
b. Jak zmienić wartość w komórce?
Sub UstawWartoscKomorki()
' Pełna ścieżka w hierarchii - ustawienie wartości w komórce
Workbooks("Przykład.xlsx").Worksheets("Arkusz1").Range("A1").Value = "Witaj!"
' Skrócona ścieżka - zakładamy, że arkusz "Arkusz1" jest już aktywny
Range("A1").Value = "Witaj!"
End Sub
Najkrótsza ścieżka Range(„A1”).Value = „Witaj!” jest najbardziej czytelna i szybka, ale wymaga, aby wcześniej ręcznie lub za pomocą kodu ustawiono właściwy skoroszyt i arkusz jako aktywne.
Korzystanie z takiego rozwiązania częściej powoduje błędy w kodzie takiego typu, że kod się nie zatrzymuje tylko wykonuje czynności nie tam, gdzie byśmy tego chcieli. I jeśli tego nie wyłapiemy zawczasu to skutki mogą być ciężkie do naprawy.
Zupełnie jak zlecenie malowania pokoju w mieszkaniu, gdzie po wszystkim okazuje się, że to nie ten pokój!
c. Jak zaznaczyć zakres komórek?
Sub ZaznaczZakresKomorek()
' Pełna ścieżka w hierarchii - zaznaczenie zakresu komórek
Workbooks("Przykład.xlsx").Worksheets("Arkusz1").Range("A1:B10").Select
' Bardziej skrócona ścieżka - zakładamy, że arkusz "Arkusz1" jest już aktywny
Range("A1:B10").Select
End Sub
Poniżej prezentujemy przykład kodu, który wykorzystuje całą hierarchię, aby wpisać do komórek A1 i B1 dwa wyrazy Hello i World, a na końcu obie komórki pogrubia.
UWAGA! Jest to przykład bardzo nieoptymalny pokazujący całą ścieżkę. Zaraz poniżej będzie zaprezentowane profesjonalne podejście do tych samych czynności operujących na obiektach.
Sub PrzykladNieoptymalny()
‘Wprowadzenie wartości i ustawienie właściwości na obiekcie czcionki
Workbooks("Przykład.xlsx").Worksheets("Arkusz1").Range("A1").Value = "Hello"
Workbooks("Przykład.xlsx").Worksheets("Arkusz1").Range("B1").Value = "World"
Workbooks("Przykład.xlsx").Worksheets("Arkusz1").Range("A1:B1").Font.Bold = True
' Dodanie nowego arkusza
Workbooks("Przykład.xlsx").Worksheets.Add.Name = "NowyArkusz"
Workbooks("Przykład.xlsx").Worksheets("NowyArkusz").Range("A1").Value = "To jest nowy arkusz"
End Sub
Powyższy kod jest trudny do utrzymania i odczytania, ponieważ pełna ścieżka musi być powtarzana przy każdej operacji. Wielokrotne odwoływanie się do tego samego obiektu (np. Workbooks(„Przykład.xlsx”)) spowalnia działanie programu. Brak zmiennych powoduje zwiększenie ryzyka błędów w przypadku konieczności wprowadzenia zmian w nazwach skoroszytu lub arkusza. Na temat zmiennych więcej przeczytasz w naszym blogu tutaj.
Sub PrzykladOptymalny()
' Ustawienie zmiennych obiektowych
Dim wb As Workbook
Dim ws As Worksheet
' Przypisanie skoroszytu i arkusza do zmiennych obiektowych za pomocą Set
Set wb = Workbooks("Przykład.xlsx")
Set ws = wb.Worksheets("Arkusz1")
' Użycie With...End With dla obiektu arkusza
With ws
.Range("A1").Value = "Hello" ' Wstawienie wartości
.Range("B1").Value = "World" ' Wstawienie wartości
.Range("A1:B1").Font.Bold = True ' Pogrubienie tekstu
End With
' Dodanie nowego arkusza z pełną ścieżką
wb.Worksheets.Add
ws.Name = "NowyArkusz"
ws.Range("A1").Value = "To jest nowy arkusz"
End Sub
Dlaczego powinno się deklarować zmienne i używać konstrukcję With…End With?
Model obiektowy w VBA jest narzędziem, które w uporządkowany sposób umożliwia zarządzanie elementami Excela poprzez logiczną hierarchię obiektów, właściwości, metod i zdarzeń. Podobnie jak w bardziej zaawansowanych modelach obiektowych (możesz przeczytać tutaj o programowaniu OPP – object oriented programming) w językach takich jak Java, C++ czy Python, każdy obiekt w VBA jest częścią hierarchii, a jego funkcjonalność można rozszerzać poprzez metody i manipulować za pomocą właściwości. Kluczową cechą modelu VBA jest jego bezpośrednie powiązanie z interfejsem aplikacji Excel, co pozwala na automatyzację działań bez potrzeby tworzenia zaawansowanego kodu.
Hierarchiczna organizacja od ogólnego obiektu Application, przez Workbooks, aż po szczegółowe zakresy Range, zapewnia precyzyjną kontrolę nad różnymi aspektami arkusza, jednocześnie umożliwiając użytkownikowi wybór poziomu szczegółowości. W VBA istnieje również możliwość tworzenia własnych obiektów i właściwości za pomocą modułów klas, co pozwala na modelowanie bardziej złożonych struktur i organizowanie kodu w sposób logiczny i łatwy do utrzymania. Ponadto VBA obsługuje dodatkowe biblioteki obiektów, takie jak te do manipulacji programami Outlook, Word czy PowerPoint, co umożliwia budowanie rozwiązań integrujących wiele aplikacji pakietu Office.
W odróżnieniu od pełnoprawnego programowania obiektowego (OOP), VBA nie umożliwia dziedziczenia czy polimorfizmu, ale oferuje wystarczającą elastyczność do zarządzania strukturami danych i interfejsem użytkownika w kontekście aplikacji Office. Rozumienie różnic między typami obiektów oraz zasad, na jakich się ze sobą komunikują, pozwala na tworzenie kodu, który jest czytelny, wydajny i łatwy do utrzymania. Model obiektowy w VBA wypełnia lukę między funkcjonalnością arkusza kalkulacyjnego a potrzebą automatyzacji i interaktywności, co czyni go istotnym narzędziem w pracy z danymi w środowisku Excel, jak i Windows.