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.

NazwaFormularza.Show

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. 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:
Private Sub cmdCancel_Click()
 
End Sub

Dodam tutaj jedną instrukcję. Wywołanie specjalnej instrukcji zamykania formularza. Czytaj więcej...

Kurs VBA – cz. 21 – Formularze – Wstęp

Cały kurs VBA zaczyna się generalnym wstępem i instrukcją napisania pierwszego programu, bez wchodzenia w szczegóły. Rozdział o formularzach też tak rozpocznę. Poniżej trochę teorii i ogólników, w następnej części napiszemy pierwszy program używający formularzy. Da nam to generalne pojęcie o temacie.

Do tej pory użytkownik przekazywał programowi informacje głównie przez wypełnianie komórek Excela. W ten sposób trudno jest programiście zapanować nad tym gdzie,co i kiedy użytkownik wpisuje.

Formularze są przeznaczone do sformalizowanej komunikacji z użytkownikiem. Sami decydujemy kiedy taki formularz ma się pokazać. Planujemy ile jakich pól będzie się na nim znajdować, czyli co użytkownik  będzie mógł wpisać. Formularze umożliwiają też strukturyzowanie informacji dla użytkownika w formę o wiele bardziej zaawansowaną niż zwykły arkusz kalkulacyjny z wykresami i tabelkami. Czytaj więcej...

Wyprzedaż książek o Office

Do niedzieli trwa wyprzedaż książek dotyczących pakietu Office w księgarni Helion.pl. Można znaleźć wiele ciekawych pozycji dotyczących Excela, Worda, Outlook i innych.

Oferta książek do 40% taniej.

W promocji można znaleźć najlepszą moim zdaniem książkę na temat VBA (promocja obejmuje wydanie w formie ebooka):

 

Kurs VBA – cz. 20 – Debugging

W ramach kursu napisaliście już nie jeden program i na pewno spotkaliście się z niejednym błędem, który sprawiał, że program nie działał jak powinien. Wszystkie rodzaje błędów jakie możecie napotkać opisałem w cz. 18 – Obsługa błędów. Kiedy już znajdziemy błąd, uporanie się z nim jest stosunkowo proste. Właśnie szukanie ich zajmuje programistom dużo czasu i przyprawia o siwiznę.=&0=&. Nazwa jest może trochę niefortunna, ale powszechnie używana w Polsce. Jest to proces uruchamiania programu krok po kroku w celu znalezienia błędów (bugów) lub po prostu przeanalizowania działania programu.

Powyższa, nieco lakoniczna definicja może być niezrozumiała. Spróbujmy więc debugowania samodzielnie, krok po kroku.

Stwórzmy nowy skoroszyt z najprostszym makrem:

Option Explicit Const gs_EdytowanyZakres As String = "A1:A10" Sub test() Dim lr_Komorka As Range Dim i As Integer     Range(gs_EdytowanyZakres).Clear     For Each lr_Komorka In Range(gs_EdytowanyZakres)         If lr_Komorka.Row Mod 2 = 0 Then             lr_Komorka = losowa_liczba         Else             lr_Komorka = nr_wiersza(lr_Komorka)         End If     Next lr_Komorka          msgbox "Skonczyłem pracę!" End Sub Function losowa_liczba() As Integer     losowa_liczba = Rnd() * 1000 End Function Function nr_wiersza(ir_komorka As Range) As Integer     nr_wiersza = ir_komorka.Row End Function Czytaj więcej...

Kurs VBA – cz. 19 – Nazywanie zmiennych

O zmiennych pisałem już w dziesiątej części. Jeżeli uczciwie przeszedłeś cały kurs to pewnie już dość swobodnie się nimi posługujesz w podstawowym zakresie. Dzisiaj napiszę o często ignorowanym ale bardzo ważnym elemencie zmiennych i stałych, czyli ich nazwie.

Już teraz nadmienię, że koncepcji nazywania zmiennych jest mnóstwo. Poniższa działa dla mnie i proponuję ją stosować oraz ewentualnie później modyfikować. Ostatecznie ważne jest, żeby w ramach jednego projektu konsekwentnie korzystać z jednej konwencji. Czytaj więcej...

Kurs VBA – cz. 18 – Obsługa błędów

Niezależnie jak dokładnie będziemy pisać program i ile do niego przygotowywać, zawsze pojawią się jakieś błędy. Istnieje szereg czynności, które pozwolą nam się do nich przygotować i lepiej z nimi radzić. Czasem możemy nawet świadomie je wywoływać. Najważniejsze jest jednak, żeby w przypadku błędów program zachowywał się w sposób przewidywalny, tak jak to sobie zaplanowaliśmy. Jest to tak samo ważne jak projektowanie samych procedur.

Do najważniejszych zasad należą:
  1. Dokładne projektowanie programu.
  2. Automatyczne sprawdzanie składni (patrz niżej).
  3. Włączenie Option Explicit (patrz niżej)
  4. Tworzenie małych części kodu.
  5. Tworzenie komentarzy
  6. Testowanie aplikacji
Punktowi numer 6 poświęcona zostanie osobna część kursu.
Poniżej zajmiemy się sytuacjami, w których błąd już się pojawił.

Błędy podczas projektowania

Najprostszy i najczęstszy błąd to zwykła literówka. VBE podczas pisania kodu sprawdza czy wszystkie pisane instrukcje są rozpoznawalne. Wszystkie słowa kluczowe są domyślnie kolorowane na niebiesko. Na tym etapie nie są jeszcze sprawdzane funkcje i nazwy zmiennych.
Jeżeli składnia nie będzie odpowiadać VBE, linia zostanie zaznaczona na czerwono, dodatkowo domyślnie pojawi się msgbox z odpowiednią informacją.
Szybko okazuje się, że ten MsgBox jest bardzo irytujący i jeżeli jeszcze go nie wyłączyłeś to można to zrobić w Tools/Options/Auto Syntax Check. Po wyłączeniu tej opcji nieprawidłowe linie wciąż będą się zaznaczać na czerwono, jednak będziemy mogli łatwo przerwać pisanie linii kodu (na przykład, żeby zadeklarować jakąś zmienną).

Błędy podczas uruchamiania

Podczas uruchamiania programu sprawdzane są nazwy wszystkich procedur. Jeżeli gdzieś w kodzie napiszemy funkcję, która nie jest ani wbudowana, ani napisana przez nas to pojawi się ostrzeżenie i uruchamianie zatrzyma się na nazwie uruchamianej procedury.

Option Explicit

Jeżeli chcemy, żeby w tym momencie Excel sprawdzał także poprawność zmiennych, należy na początku modułu napisać instrukcję Option Explicit. Jest do absolutnie kluczowa rzecz, o czym napiszę za chwilę. Jeżeli chcemy, żeby ta instrukcja pojawiała się automatycznie możemy włączyć: Tools/Options/require Variable Declaration i bezwględnie każdy to powinien zrobić.
Po włączeniu tej opcji każda zmienna / stała musi być zadeklarowana przy pomocy instrukcji odpowiednio Dim lub Const, zanim zostanie użyta. Odpowiedni komunikat pojawi się jeżeli użyjemy zmiennej nie zadeklarowanej. Co się stanie, jeżeli nie włączymy tej opcji? Nie musimy deklarować żadnej zmiennej. Odpowiednie miejsce w pamięci zostanie dla niej zajęte w momencie pierwszego użycia i przyjmie typ Variant. Na pierwszy rzut oka może być to wygodne. Jednak:
  • Tracimy kontrolę nad typami zmiennych.
  • Przede wszystkim: Narażamy się na błędy związane z literówkami

Spójrzmy na poniższy kod, option explicit nie zostało użyte. Nie musiałem deklarować zmiennej text.

Sub analiza()

    Text = "ala ma kota"
    
    MsgBox tekst
End Sub

Przy braku Option Explicit powyższy kod wykona się, jednak nic nie pojawi się w okienku MsgBox ponieważ zostaną utworzone dwie różne zmienne: Text i tekst. Przy włączonym zabezpieczeniu VBE ostrzeże nas, że nie zadeklarowaliśmy zmiennej Text, a chcemy z nią cos robić.

Dla mnie Option Explicit ma dodatkową wartość. Zawsze nazywam zmienne używając dużych liter. Następnie piszę zmienne używając tylko małych liter. Jeżeli napisałem zmienną prawidłowo, VBE automatycznie zmienia małe litery na duże zgodnie z definicją. Wiem wtedy, że wpisałem zmienną prawidłowo. O znaczeniu gc w nazwie opowiem w następnej części kursu.

Błędy podczas wykonywania

Wszelkie błędy uniemożliwiające uruchomienie zostały już usunięte, zajmijmy się więc błędami podczas samego działania programu. Są to błędy, które zwykle przerywają działanie programu.
ActiveSheet.Next.Select

Powyższa instrukcja zaznacza następny arkusz. Przerywa działanie programu i pokazuje błąd, jeżeli aktualnie zaznaczony arkusz jest już ostatnim (brak następnego do zaznaczenia). Żaden kod więcej się nie wykona.

Przy pomocy poniższej instrukcji, możemy kontynuować wykonanie i zdecydować co się będzie działo w przypadku błędu.

On Error

Powyższa instrukcja występuje w trzech wariantach:

  • On Error GoTo Etykieta
  • On Error Resume Next
  • On Error GoTo 0
=&1=& jest z reguły umieszczane na początku procedury i działa na wszystkie następujące instrukcje do końca procedury lub wywołania On Error GoTo 0. Instruuje program, że w przypadku błędu sterowanie ma przeskoczyć do etykiety.
Sub zmiana()
    On Error GoTo ErrHandler
       
    ActiveSheet.Next.Select
    
    Exit Sub
    
ErrHandler:
    MsgBox "Nie mogę zmienić arkusza"
End Sub

 

Po etykiecie musi być zawsze napisany dwukropek. Istotne jest, żeby przed etykietą wstawić Exit Sub. Inaczej nasz kod obsługi błędu wykona się nawet, jeżeli błąd nie nastąpi (spróbuj sam uruchomić ten program bez Exit Sub). W każdej chwili mamy dostęp do obiektu Err, który zawiera szczegóły problemu. Dzięki temu możemy napisać bardziej ogólną procedurę obsługi. Interesują nas szczególne atrybuty Err.Number i Err.Description. Err.number jest równy zero, dopóki nie zajdzie błąd.

Sub zmiana()     On Error GoTo ErrHandler             ActiveSheet.Next.Select          Exit Sub      ErrHandler:     If Err.Number = 91 Then         MsgBox "Nie ma następnego arkusza."     Else     'inny błąd         MsgBox "Wystąpił błąd nr: " & Err.Number & Chr(10) & _            Err.Description     End If     Err.Clear End Sub Czytaj więcej...

Drugi Ogólnopolski Excelzlot

Dzień dobry,
W weekend 17-18 maja odbył się w Białce Tatrzańskiej drugi ogólnopolski zlot ExcelForum.pl. Zabawa była przednia. Wszystkich chętnych zapraszam do udziału w tej społeczności i wzięcia udziału w zlocie za rok.

 

Kurs VBA – cz. 17 – Dobre praktyki programowania

=&0=&W poprzedniej części napisałem jak przygotować się do pisania programu, najwyższy czas się tym zająć. Jak jednak programować łatwo i przyjemnie? Postaram się przedstawić różne aspekty programowania w VBA i programowania w ogóle, które ułatwią wejście w ten pozornie zawiły świat i mam nadzieję zaoszczędzą dużo kłopotów początkującym programistom.

Na początek napiszę się co sprawia, że dobry kod jest dobry. Później przejdę do praktycznych elementów programowania.

Poszczególne fragmenty są mniej lub bardziej powiązane. Nie odważę się powiedzieć, że pewne zasady są ważniejsze niż inne. Zdecydowanie należy przyswoić sobie je wszystkie i zacząć stosować bez wyjątku. Zaoszczędzicie sobie tym dużo czasu i nerwów. Zapewniam, że wcześniej czy później każda z nich zemści się, jeżeli o niej zapomnimy.

Cechy dobrego kodu

  • Prostota – Nie rób w dziesięciu instrukcjach coś co możesz zrobić w pięciu. Mniej instrukcji to mniej okazji na błąd. Każdą rzecz można zrobić na 10 sposobów, wybierz najprostszy.
  • Czytelność – Twój kod musi być czytelny dla innych i samego Ciebie, kiedy wrócisz do niego za pół roku i będziesz się zastanawiać co oznacza zmienna o nazwie trx. Można było ją nazwać tax_rate_expenses.
  • Modularność – VBA udostępnia procedury, korzystaj z nich. Składaj później program z nich jak z klocków. Samochód jest złożony z części o różnej funkcjonalność, niech twój program też tak działa.
  • Wydajność – Czy twój program działa w czasie akceptowalnym dla użytkownika?
  • Niezawodność –  Czy twój program generuje błędy?  Na jakie błędy jesteś przygotowany?
Oczywiście różne cechy można mnożyć i oceniać z wielu stron, powyżej wypisałem najistotniejsze według mnie. Jak można powyższe wymagania spełnić?

Przygotowanie do kodowania

Mamy już przygotowaną specyfikację od strony biznesowej. Czas zająć się dokładniejszym opisem. Rozrysuj sobie wszystkie formularze i arkusze. Praca pójdzie dużo szybciej, jeżeli nie będziesz projektował „na żywo”. Łatwiej coś zmienić na papierze, niż w edytorze. Zastanów się, które elementy są potrzebne a które zbędne. Możesz napisać swój program w pseudo kodzie.

Sub analiza()

' Sprawdź, czy data wejściowa jest prawidłowa
' Opróżnij docelowy arkusz
' Zaznacz dane mieszczące się w zakresie
' Kopiuj dane do docelowego arkusza
' Formatuj docelowe dane
' Stworz wykres

End Sub

 

Taki kod może być później bezpośrednio wpisany w module. Kolejne linie będziemy wtedy uzupełniać o prawdziwe instrukcje. Na przykład poniżej uzupełniam pierwszy komentarz.

Option Explicit Const gc_AdresDataWejsciowa As String = "A1" Const gc_MsgDataNieprawidlowa As String _     = "Data wejściowa nieprawidłowa" Sub analiza() '    Sprawdź, czy data wejściowa jest prawidłowa     If Not IsDate(Range(gc_AdresDataWejsciowa)) Then         MsgBox gc_MsgDataNieprawidlowa         Exit Sub     End If      '    Opróżnij docelowy arkusz '    Zaznacz dane mieszczące się w zakresie '    Kopiuj dane do docelowego arkusza '    Formatuj docelowe dane '    Stworz wykres End Sub Czytaj więcej...

Kurs VBA – cz. 16 – Projektowanie programu

Poznaliśmy już wszystkie istotne elementy kodu. Możemy już napisać większość programów w VBA. Oczywiście dobry murarz potrzebuje nie tylko cegieł ale i umiejętności ich układania w spójną i bezpieczną całość. Poniższy tekst należy raczej traktować bardziej jako lekturę do poduszki niż ścisły kurs techniczny.

Na temat projektowania oprogramowania napisano tysiące książek i opracowano setki metodyk. Poniżej ledwie pływam po powierzchni tego problemu, mam jednak nadzieję, że po przeczytaniu tego tekstu początkujący programista VBA będzie lepiej przygotowany na to, co przyniesie przygoda z programowaniem. Czytaj więcej...