Złożone typy danych - TABLICE TABLICA (ang. array) pojedyncza zmienna z wieloma komórkami, w których można zapamiętać wiele wartości tego samego typu danych. * Może przechowywać dowolny typ danych, typ użytkownika, typ obiektowy. * W przypadku tablicy z elementami typu Variant, można zapamiętać różnego rodzaju dane (liczby, daty, łańcuchy znaków). Tym, co odróżnia tablice VBA od arkusza Excela jest liczba wymiarów. Arkusz Excela posiada zawsze dwa wymiary określone przez numer wiersza oraz numer kolumny. Tablice VBA mogą natomiast posiadać zróżnicowaną liczbę wymiarów - od jednego do trzydziestu (choć w praktyce tablice posiadające więcej niż trzy wymiary należą do rzadkości). * Dostęp do tablicy uzyskuje się za pomocą indeksów (typ Integer, Long, Byte). * Domyślnie indeks zaczyna się od numeru 0!!! Instrukcja Option Base 1 umieszczona na początku modułu zmienia numerację tablicy od 1. Deklaracja tablicy Deklaracja tablicy wygląda następująco: Dim tablica (x1 To y1,..., xn To yn) As typ_danych Tablica posiada tyle wymiarów, ile wyrażeń (xn To yn) zawartych jest w nawiasie po nazwie tablicy. Każde takie wyrażenie określa rozmiar poszczególnego wymiaru tablicy. Skrócona deklaracja tablicy wygląda następująco: Dim tablica (y1,..., yn) As typ_danych Jednakże wówczas numeracja indeksów zaczyna się domyślnie od wartości 0 np. 0,1,2,y1-1,y1,z opcją Option Base 1 od wartości 1 np. 1,2,, y1-1,y1.
Przypisywanie i pobieranie wartości Każdy element tablicy jest jakby oddzielną zmienną posiadającą taki typ, jaki posiada cała tablica. Przykładowo, dwuwymiarowa tablica typu Integer o trzech wierszach i dwóch kolumnach składa się ze 6 oddzielnych, niezależnych od siebie zmiennych typu Integer. Przypisywanie i pobieranie wartości każdego elementu z tablicy odbywa się poprzez podanie nazwy tablicy oraz indeksów dla wszystkich wymiarów w tablicy, które określają pozycję danego elementu w tablicy. Odwołanie się do tablicy jednowymiarowej nazwa_tablicy(index) np.: tablica_nazwisk(3) pacjeci(789) Odwołanie się do tablicy wielowymiarowej nazwa_tablicy(index1, index2) np.: kontrahenci(2, 5) koszty(1, 34) Przykład 1 Definicja tablicy jednowymiarowej. Przypisywanie wartości. Makro tworzy tablicę jednowymiarową z dziesięcioma elementami o indeksach od 0 do 9. Użytkownik wypełnia tablicę nazwiskami. Przykład 2 Definicja tablicy jednowymiarowej. Odczytywanie wartości. Przepisanie wartości elementów tablicy jak wyżej do komórek w 2-gim wierszu.
Zadanie 1 Zamień kod programu z przykładu 2 tak, aby elementy tablicy były numerowane od 1 do 10 a elementy z tablicy były przepisane do pierwszej kolumny (zamiast do wiersza). Zadanie 2 Wykonaj zadanie 1 z wykorzystaniem opcji Option Base 1. Zadanie 3 Utwórz w arkuszu poniższą tabelę i za pomocą procedury wypełnij ją danymi. Tabela wylicza koszt całkowity produkcji w poszczególnych miesiącach. Koszty stałe i zmienne stanowią dane losowe: - koszt stały w zakresie 1000-5000 zł (funkcja Rnd * (5000-1000) + 1000 ); - koszt zmienny w zakresie 0-1500 zł (funkcja Rnd * 1500). Koszt całkowity jest wyliczany (suma kosztu stałego i zmiennego).
Przykład 3 Definicja tablicy wielowymiarowej. Odczytywanie wartości. Przepisanie wartości z tabeli w arkuszu (zadanie 3) do zmiennej tablicowej. Sprawdź jak wyglądają dane dotyczące kosztów za pomocą okna Locals Window. Problem polega jednak na tym, że cała operacja zajmuje sporo czasu, a przecież arkusz może zawierać znacznie więcej danych. Język VBA oferuje jeszcze inny, nieporównywalnie szybszy, sposób masowego pobierania danych z arkuszy Excela. Polega on na zadeklarowaniu zmiennej typu Variant i przypisaniu do niej zakresu komórek arkusza. Odczytywanie danych ze zmiennej tablicowej typu Variant i zmiennej Variant jest zbliżone do siebie. Przykład 4 Efektywne przepisanie wartości z tabeli w arkuszu do zmiennej typu Variant. Zadanie 4 Utwórz zmienną tablicową (tablicę) typu Integer, zawierającą tabliczkę mnożenia do 30. Przepisz tabliczkę mnożenia do arkusza Excel.
Zadanie 5 Utwórz zmienną tablicową (tablicę) typu Variant zawierającą przychody i koszty firmy, generowane w ciągu 30 lat (1980-2010). Wypełnij tablicę losowymi danymi. Oblicz zysk firmy w poszczególnych latach. Podpowiedź: aby zaoszczędzić miejsce, rok można potraktować jako wartość indeksu dla pierwszego wymiaru. W pętli zadaj pytanie (InputBox) Podaj rok:. W odpowiedzi wyświetlaj zysk uzyskany dla firmy w danym roku. Pętlę zakończ, gdy zostanie wpisane w oknie InputBox. Przykład 5 Pamiętanie wartości tabeli. Dodawanie wartości do tabeli. Utworzenie tabeli zawierającej dane pojedynczego pracownika. Utworzenie przycisku, który pozwala na dodanie danych pracownika do tabeli pracownicy. Dane pracownika zostają pamiętane i przechowywane. Kolejne kliknięcie na przycisk spowoduje dodanie danych kolejnego pracownika.
W powyższym przykładzie tablica posiada stały rozmiar. Przy tworzeniu aplikacji bardzo często zdarza się, że potrzebna jest tabela, która będzie zmieniała swój rozmiar w trakcie wykonywania programu. Takie dynamiczne tabele są w poważnych aplikacjach wykorzystywane nawet częściej niż ich statyczne odpowiedniki. Ktoś mógłby w tym miejscu pomyśleć, że wystarczy zadeklarować odpowiednio dużą tablicę (np. tablica(100)), tak aby mieć pewność, że zmieszczą się w niej wszystkie elementy wpisywane przez użytkownika. Nie jest to jednak zbyt rozsądny pomysł. Po pierwsze, takiej pewności nigdy mieć nie można. Po drugie, w sytuacji kiedy użytkownik wpisałby przykładowo tylko 2 nazwy, pozostałe 98 pól tej tablicy nie byłoby wykorzystywane i zupełnie niepotrzebnie marnowałyby pamięć komputera. Język VBA posiada mechanizm pozwalający zmieniać rozmiar tablicy w trakcie działania makra. Poniżej znajduje się kod wspomnianej funkcji, wykorzystujący tablice dynamiczne. Mechanizm zostanie omówiony na przykładzie 5. Przykład 6 Definicja tabeli dynamicznej. Zmiana rozmiaru tabeli. Przykład jest analogiczny do przykładu 5. Proszę jednakże zauważyć, iż w tym przypadku mamy do czynienia z transpozycją tabeli danych. Jest to koniecznie, gdyż możemy zmieniać rozmiar tylko ostatniego wymiaru tabeli (a zatem możemy dodawać kolumny a nie wiersze).
Funkcja UBound zwraca wartość typu Long stanowiącą największy indeks danej tablicy. UBound( NazwaTablicy [, Wymiar]) Funkcja LBound zwraca wartość typu Long stanowiącą najmniejszy indeks danej tablicy. LBound( NazwaTablicy [, Wymiar]) Zadanie 6 Wypróbuj funkcję UBound i LBound w przykładzie 6. Np.