UDF – formuły z funkcjami użytkownika

Za pomocą UDF (user defined functions, funkcje zdefiniowane przez użytkownika) programista może stworzyć nowe funkcje do użycia w formułach. W poniższy sposób używam moją nową funkcję:

Kod znajduje się w module VBA:

Tworzy je się tak samo jak zwykłe funkcje VBA. Umieszczone w module kodu mogą być używane w tym samym pliku. Można je też dodać do pliku personal  lub dodatku. Funkcje UDF podlegają jednak kilku ograniczeniom.

Czytaj więcej...

Kurs VBA – Klasy – Atrybuty i właściwości

Zastanawiałem się przez jakiś czas czy atrybuty i właściwości podzielić na dwa osobne posty. Występują one bardzo często razem i poza klasą używa się je tak samo, jednak należy pamiętać, że są to dwie osobne funkcjonalności klas.

Atrybuty określają aktualny stan obiektu. Dla przykładowej klasy Samochód może to być:

  • Prędkość
  • Pojemność
  • Czy drzwi są zamknięte?
  • Czy światła są zapalone?
  • Stan oleju

Spójrzmy na taką (bardziej praktyczną) instrukcję:

Mamy tutaj atrybut, zadeklarowany następująco w module klasy.

Przybiera wartość True, jeżeli plik jest otwarty lub False, jeżeli zamknięty. W metodzie otwierającej plik ustawiamy ten atrybut na True. Mogę więc napisać gdzieś:

Czy ma w takim razie sens poniższa instrukcja?

Pozornie ma sens, jest jednak niebezpieczna. Ostatecznie zamykanie pliku nie może się ograniczać do ustawienia wartości jakieś zmiennej, plik należy zapisać. Z pomocą przychodzą właściwości, dzięki którym możemy tworzyć coś pomiędzy atrybutami a metodami. Poza klasą używa się je jak atrybuty. W środku klasy jest to jednak szereg wykonywanych instrukcji. Utworzę więc właściwość:

Dzięki temu powyższe przypisanie wartości False uruchamia instrukcje, które wywołują metodę CloseFile.

Czytaj więcej...

Kurs VBA – Klasy – Metody

Metody są różnymi działaniami, które może wykonywać modelowana przez naszą klasę rzecz. Modelując samochód możemy dać mu metody:
  • hamuj
  • przyspieszaj
  • włącz światła
  • wyłącz swiątła
  • otwórz bagażnik
  • itd.

Oczywiście w praktyce nie będziemy modelować samochodu. Bardziej praktyczna klasa może służyć do zapisywania danych do pliku. Metody w takiej klasie mogą wyglądać tak:

 

Mamy powyżej funkcje otwierającą plik, zapisującą do niego itd. W tym modelu jeden obiekt to jeden plik. Jeżeli chcemy otworzyć nowy plik, musimy zainicjować nowy obiekt naszej klasy. Możemy stworzyć kolekcję plików itd.

Jak widać metody definiuje się tak samo jak procedury i funkcje w tradycyjnym module. Metody oznaczone jako Private mogą być wywoływane tylko przez inne metody danej klasy.

Czytaj więcej...

Kurs VBA – Klasy – Tworzenie i inicjalizacja

W tej części kursu zobaczymy jak tworzyć i używać klasy. Nie będę się wdawał w szczegóły, które poznacie w kolejnych postach. Chciałbym abyście byli przygotowani do (technicznie) swobodnego tworzenia i używania klas, aby stosować elementy przedstawione później.

Stworzymy klasę, które będzie przechowywać oraz wypisywać do arkusza dane pracownika.

 

Definicja klasy

Każda klasa mieści się w osobnym module w pliku Excel. Moduł klasy tworzymy podobnie jak zwykłe moduły z kodem. Klikam prawym przyciskiem na dowolnej pozycji w oknie projektu i wybieram Insert / Class Module.

Jak widać dodał się nowy katalog z nowym modułem. Cały kod zawarty w tym nowym module będzie dotyczył jednej klasy.

Kiedy moduł jest zaznaczony w drzewie projektu, możemy zmienić nazwę klasy w oknie Properties.

Czytaj więcej...

Kurs VBA – Klasy – Wstęp, teoria

Poniższy tekst rozpoczyna kilka rozdziałów na temat programowania obiektowego. Pewnie dało by się to wszystko skrócić i umieścić w jednej części, ale cóż, taka ze mnie gaduła. Pisząc kolejne wiersze zakładam, że czytelnik porusza się względnie swobodnie w programowaniu VBA. Nie istotne czy nabył tą wiedzę przy pomocy niniejszego kursu czy nie. Nie można programować w VBA bez kontaktu z programowaniem obiektowym, czyli modelem obiektowym Excela. W tej i kolejnych częściach kursu dowiemy się po prostu jak rozszerzać nasz program o nasze własne klasy. Dzięki temu programy mogą stać się bardziej czytelna a ich projektowanie łatwiejsze. Na temat programowania obiektowego napisano mnóstwo książek, na pewno nie mam zamiaru napisać tutaj kolejnej, tym bardziej, że trudno jest znaleźć język programowania, który by spełniał oczekiwania uczonych głów co do realizacji wszystkich cech programowania obiektowego. Sam nie uważam się za wielkiego specjalistę z tego zakresu. Na szczęście wiedza praktyczna i teoretyczna nie muszą iść w parze. Po poniższe części teoretycznej przejdziemy do różnych przykładów praktycznych. Z pewnością VBA tylko w drobnym stopniu realizuje wymagania programowania obiektowego, ale wciąż możemy to wykorzystać do swoich celów. Programowanie obiektowe możemy realizować poprzez Abstrakcję i Hermetyzację.

Abstrakcja

Każdy obiekt w systemie służy jako model abstrakcyjnego „wykonawcy”, który może wykonywać pracę, opisywać i zmieniać swój stan oraz komunikować się z innymi obiektami w systemie bez ujawniania, w jaki sposób zaimplementowano dane cechy. Cyt. Wikipedia

Klasą nazywamy pewien schemat „realnego” bytu. Sama klasa jest dopiero definicją, która jest realizowana przez obiekty danej klasy. Często przytaczanym przykładem jest przypadek samochodu. Klasa to zbiór papierowych czy komputerowych schematów. Określają one rozmiar, możliwe kolory, budowę silnika, sposób użytkowania itd. Obiektem jest natomiast konkretna sztuka auta zbudowana no podstawie tego schematu. Klasę auto możemy zdefiniować w następujący sposób (w kolejnej części kursu napiszę dokładnie jak „pisać” kod klas):

Oczywiście pełna definicja klasy realizującej funkcje samochodu, zajęła by tysiące linii. Powyżej mamy tylko dwie metody, realizujące przyspieszanie i zwalnianie, oraz jeden atrybut przechowujący prędkość.

Czytaj więcej...

Kurs VBA – cz. 26 – Formularze – Metody

Czas na ostatnią część tryptyku atrybuty-zdarzenia-metody. Każdy obiekt formularza ma przypisany zestaw metod. Na szczęście jest ich tylko kilka (istotnych). Zdecydowanie w pracy z formularzami najważniejsze są atrybuty i zdarzenia.

Metody wywołujemy przez połączenie nazwy obiektu i nazwy metody, jak w przypadku każdego innego obiektu.

Najważniejsze metody

Show (pokaż)

Pokazuje formularz. Wspominana już we wcześniejszych cześciach kursu.

Hide (ukryj)

Ukrywa formularz przed użytkownikiem. Wszystkie kontrolki, razem ze swoimi wartościami dalej „istnieją” i możemy się do nich odnosić w programie.

Używamy tej metody, jeżeli przewidujemy, że użytkownik będzie chciał wrócić do tego ekranu i zobaczyć te same wartości, które były, kiedy go opuszczał. Na przykład możemy mieć pomocniczy formularz z listą adresową, który może być otwierany kilka razy, żeby wybrać adres do głównego formularza. Lista będzie uzupełniana tylko przy pierwszym otwarciu.

Czytaj więcej...

Kurs VBA – cz. 25 – Formularze – Zdarzenia

W tej części kursu opiszę najważniejsze zdarzenia formularza i jego kontrolek. W zdarzeniach możemy umieścić kod, który uruchomi się automatycznie w odpowiedzi na działanie użytkownika.Jest to główna metoda programowania formularzy. Ostatecznie taka jest ich filozofia, program wyświetla pewien szablon przed użytkownikiem i czeka na jego reakcję. Użytkownik może zacząć wypełniać pierwsze pole, może zacznie od drugiego, może kliknie od razu ok albo się rozmyśli i zamknie okno. Wszystkie te działania uruchamiają określone zdarzenia.

Czytaj więcej...

Kurs VBA – cz. 24 – Formularze – Atrybuty

W części kursu dotyczącej modelu obiektowego Excela opisałem, że każdy obiekt jest wyposażony w zestaw atrybutów, metod i zdarzeń. Atrybuty opisują stan obiektu, metody to procedury uruchamiane przez nas, natomiast zdarzenia uruchamiają się automatycznie. Poniżej opisuję kilka najważniejszych atrybutów występujących w formularzach. W kolejnych częściach kursu omówię najczęściej używane metody i zdarzenia. Ostatecznie podpowiem gdzie szukać dokładnych informacji na temat poszczególnych elementów.

AtrybutyKażdy obiekt na formularzu posiada zestaw atrybutów opisujących jego aktualny stan. Jedne występują we wszystkich obiektach formularzy, inne są specyficzne tylko dla kilku z nich. Wszystkie atrybuty zaznaczonego obiektu można zobaczyć w oknie properties. Znajdują się tam atrybuty aktualnie zaznaczonego obiektu. Jeżeli przypadkiem zamkniemy to okno można je otworzyć przyciskiem F4. Po zaznaczeniu atrybutu i naciśnięciu F1 zobaczymy jego wyczerpujący opis.

Atrybuty możemy przeglądać alfabetycznie, łatwiej w ten sposób je znaleźć, jeżeli pamiętamy nazwę. W innym przypadku lepiej pogrupować po kategoriach. Mamy wtedy obok siebie atrybuty dotyczące jednego typu (wygląd, położenie, zachowanie itp.).

Czytaj więcej...

Kurs VBA – cz. 23 – Formularze – Uruchamianie

=&0=&Przed poważnym wgłębieniem się w świat formularzy zobaczmy jak je uruchamiać. Przygotujemy się do zabawy z przykładami w kolejnych częściach kursu.

Po stworzeniu formularza chcemy go udostępnić użytkownikowi, czyli po prostu pokazać na ekranie. Robimy to poprzez wykonanie jednej z metod formularza.

Oczywiście powyższą instrukcję musimy gdzieś umieścić. W części kursu o uruchamianiu makr podanych jest wiele przykładów:

Jeden formularz może też uruchamiać inny. Wystarczy w jednym ze zdarzeń związanych z jednym formularzem uruchomić procedurę Show drugiego formularza.

CmdBtnOpen to nazwa przycisku a Click to nazwa powiązanego zdarzenia.

Czytaj więcej...

Kurs VBA – cz. 22 – Formularze – Pierwszy program

Poniżej napiszemy błyskawicznie pierwszy program używający formularzy. Wiemy już jak używać edytora VBE i pisać kod, skupię się więc na elementach tworzenia formularzy. Napiszemy program dodający jednocześnie kilka arkuszy. Formularz będzie zawierał dwa pola. W pierwszym będę wpisywał ilość arkuszy do dodania. W drugim pierwszy człon nazwy. Kolejne arkusze będę się nazywać: nazwa_1, nazwa_2, nazwa_3 itd. Dodam też przycisk uruchamiający samo dodawanie oraz przycisk anulowania. Przyciski i pola na formularzu są często nazywane kontrolkami. Rozpoczynamy od otworzenia nowego skoroszytu. Otwieram VBE , dodaję nowy formularz i zmieniam jego nazwę oraz nagłówek.
Dodawanie nowego formularza
Chciałbym teraz dodać dwa pola i jeden przycisk. Listę kontrolek do dodania znajdę w przyborniku toolbox. Włączę go w górnym menu view/toobox. 
Przybornik zawierający podstawowe kontrolki
Przy pomocy graficznego edytora dodam dwa pola tekstowe. Nie zapominam o nadaniu im odpowiednich nazw. Tak jak to opisałem w przypadku zmiennych, tutaj też jest bardzo istotne aby każdy element miał odpowiednią nazwę. Każde pole musi być odpowiednio opisane, żeby użytkownik wiedział co powinien wpisać. Dodam dwie kontrolki label. Na koniec dodam dwa przyciski z odpowiednimi nazwami i napisami. Zmienię jeszcze rozmiar formularza i mogę go już uruchomić przy pomocy przycisku Play (F5). Formularz można zamknąć krzyżykiem w prawym, górnym rogu. Naciskanie przycisków nic nie da, ponieważ nie dodaliśmy do nich żadnych zdarzeń. Zostało nam tylko dodać kod do przycisków. Znacznie mniej kodu będzie pod przyciskiem Anuluj. Wystarczy kliknąć dwa razy w przycisk Anuluj. Otwiera się edytor z automatycznie utworzonym zdarzeniem: Dodam tutaj jedną instrukcję. Wywołanie specjalnej instrukcji zamykania formularza. Możemy już zamknąć formularz przyciskiem anuluj. Przejdziemy teraz do sedna. Tak samo jak przed chwilą dodajemy zdarzenie cmdAdd_Click(). Jeżeli mamy otwarte okno kodu to możemy przejść do edycji samego formularza klikając dwa razy w jego pozycję w drzewie z lewej strony. Nie będę tutaj analizował powyższego kodu, jest on już dla was na pewno zrozumiały. Teraz uruchamialiśmy formularz z edytora VBE. Musimy udostępnić możliwość wygodnego uruchamiania formularza przez użytkownika. Służy do tego metoda Show formularza. Powyższą instrukcję możemy uruchomić na różne sposoby. Tym razem stworzę w nowym module kodu najprostszą procedurę: Dodam skrót klawiaturowy uruchamiający procedurę ShowForm. Od teraz naciśnięcie ctrl + y pokazuje nasz formularz.

Podsumowanie

 Powyższy kod wykonuje tylko podstawową zaplanowaną funkcjonalność. Oczywiście program można (nawet należy) jeszcze znacznie poprawić, na przykład dodać sprawdzanie czy podana ilość arkuszy ma rozsądną wartość (nie za dużą lub za małą) lub czy nazwa nie zawiera niedozwolonych znaków. W tej chwili pojawi się błąd, jeżeli program spróbuje dodać arkusz o nazwie, która już występuje.

Wstęp Spis treści Uruchamianie

Czytaj więcej...