1. Zaczynamy programować w VB

Lekcja 1

Obliczamy pole i objętość kuli.

Analiza:

Pole wynosi: p = 4π r2, objętość wynosi: v = 4/3 πr3.

Projekt:

- wprowadzamy dane, czyli wartość promienia r,

- obliczamy pole p i objętość v,

- wyprowadzamy wyniki.

Programowanie:

Uruchamiamy MS ACCESS wybieramy Moduły, a następnie przycisk Nowy (otwierając tym samym środowisko VBA).

Zobaczymy następujący zapis:

Option Compare Database

i może jeszcze (zależy od wersji MS ACCESS i ustawień domyślnych Opcji): 

Option Explicit

Są to deklaracje opcji. Pierwsza oznacza sposób sortowania danych w bazie (nieistotna w naszym kodzie), druga natomiast wymusza deklaracje zmiennych. Użycie zmiennej nie zadeklarowanej wcześniej powoduje powstanie błędu kompilacji. Na pierwszy „rzut oka” -  deklaracja zbędna, ale po głębszej analizie warta stosowania. Unikamy wtedy znacznie trudniejszych w lokalizacji błędów wykonania programu. Kompilator sam „pilnuje” abyśmy używali tylko zadeklarowanych zmiennych.

Wpisujemy nagłówek procedury:

Sub Pole_kuli()

Po wciśnięciu  ENTER edytor sam dopisze zakończenie procedury:

End Sub

Każda procedura zaczyna się od słowa kluczowego Sub, po którym występuje nasza nazwa procedury np. Pole_kuli (jedno słowo) i para nawiasów (), między którymi mogą być zawarte parametry procedury. Stosujemy je nawet w przypadku braku parametrów.

Po nagłówku procedury zadeklarujemy stałe i zmienne, które użyjemy w procedurze.

Słowo kluczowe Const rozpoczyna deklarację stałych:

Const PI = 3.1415926

Zmienne i stałe powinny być literami alfabetu łacińskiego, łańcuchami tych liter i ewentualnych cyfr (muszą zaczynać się od liter). Polskie znaki (np. ą) dozwolone są w nazwach stałych i zmiennych, w niektórych aplikacjach MS OFFICE, np. w MS ACCESS. Nie warto ich jednak stosować ze względu na późniejszy brak możliwości przeniesienia kodu do innej aplikacji.

W deklaracji stałej występuje przypisanie wartości po znaku ”=”. Wartości rzeczywiste wpisujemy używając kropki jako separatora dziesiętnego: 3.1415926. Przecinek będzie używany przez użytkownika, wpisującego dane w okna dialogowe, bądź obserwującego wyniki.

Słowem kluczowym Dim rozpoczynamy deklaracje zmiennych:

Dim r As Single, pole As Single, obj As Single

Po nim występuje identyfikator i przypisanie typu. Typ zmiennej jest informacją dla kompilatora o sposobie zapisu zmiennej do pamięci i ilości bajtów zajmowanych przez nią. Single to zmienna rzeczywista zajmująca 4 bajty w pamięci operacyjnej. Kolejne deklaracje rozdzielamy przecinkami lub powtarzamy słowo Dim w następnych wierszach.

            Wartość promienia r możemy wprowadzić stosując instrukcję podstawienia, np.:

            r = 5

Ogranicza to jednak nasz program do jednej kuli o promieniu równym 5, a więc kod nie jest uniwersalny i przy każdej zmianie promienia musielibyśmy ingerować w kod źródłowy.

Bardziej użyteczne jest następujące przypisanie:

r = InputBox("Podaj promień:", "Dane", "0")

Oznacza ono pobranie wartości z okna wejściowego podczas działania programu. Pierwszy parametr, to polecenie ukazujące się w oknie, drugi – tytuł okna, a trzeci – wartość domyślna, brana pod uwagę, gdy użytkownik nie poda innej. Drugi i trzeci parametr nie są obowiązkowe i można je opuścić.

Obliczenie pola i objętości realizowane jest w poniższych wyrażeniach:

pole = 4 * PI * r * r

obj = 4/3 * PI * r * r * r

Aby zobaczyć wyniki, musimy wyprowadzić je do odpowiedniego obiektu. Można tu zastosować okno komunikatu MsgBox, okno analizy programu Debug lub raport (jeżeli jest użyjemy go w naszym programie).

Użycie okien komunikatu może wyglądać następująco:

MsgBox pole, 64, "Pole kuli wynosi:"

MsgBox obj, 64, "Objętość kuli wynosi:"

Pierwszy parametr jest wyprowadzaną wartością, drugi – ikoną przypisaną do okna, a trzeci – tytułem okna. Jest to wyjaśnienie pobieżne. Dokładny opis parametrów można znaleźć we wbudowanej Pomocy (kursor umieszczamy na interesującym nas haśle i wciskamy F1). Oprócz powyższej postaci, będziemy w przyszłości używać postaci funkcyjnej MsgBox zapewniającej większe możliwości.

            Innym sposobem wyprowadzenia wyników jest okno analizy programu Debug:

Debug.Print "Pole =", pole

Debug.Print "Objętość =", obj

W środowisku MS ACCESS 2000 okno to nazwane zostało Immediate- natychmiastowe. Można je otworzyć poleceniem View/ImmediateWindow.

W nim można również uruchamiać nasze procedury pisząc po prostu ich nazwę i naciskając Enter. Wygodniejszym sposobem uruchamiania jest przycisk Run Sub.

Wypróbujmy nasz program!

Lekcja 1a

Wyprowadzamy wyniki z zadaną dokładnością - trzy cyfry po przecinku.

Wyprowadzanie sformatowanych wyników można realizować przy pomocy funkcji Format. Zastosujmy   dla wydruku w oknie Immediate:

Debug.Print „Pole =”, Format(pole, „##0.000”)

Drugi parametr funkcji Format jest łańcuchem formatującym. W naszym przypadku oznacza on, że wartość wyprowadzana będzie zawierać 3 cyfry przed przecinkiem dziesiętnym i 3 cyfry po przecinku. # oznacza, że cyfra jest nieobowiązkowa (w przypadku, gdy liczba ma mniej niż 3 cyfry przed przecinkiem). 0 oznacza pozycję obowiązkową.

Funkcja Format ma bogate możliwości formatowania wyprowadzanych wartości numerycznych, łańcuchów, dat i czasu. Dokładny jej opis można znaleźć w Pomocy (F1).

Zadanie

Napisać procedury obliczające pola i objętości innych brył: walca, stożka, prostopadłościanu (wystarczy jeden przykład).

Lekcja 2

Pierwiastki rzeczywiste trójmianu kwadratowego.

Analiza:

 Sprawdzamy, czy istnieją pierwiastki rzeczywiste trójmianu kwadratowego o zadanych współczynnikach a, b, c. Obliczamy w tym celu wyróżnik trójmianu kwadratowego. Po jego analizie wyliczamy ewentualne pierwiastki.

Projekt:

-         wprowadzamy wartości współczynników a, b, c

-         obliczamy wyróżnik Δ = b2- 4ac

-         jeżeli Δ < 0 =>  wyprowadzimy komunikat: „brak pierwiastków”

-         w przeciwnym wypadku: jeżeli Δ = 0 => komunikat: „jest jeden pierwiastek”; obliczamy go x=-b/(2a) i drukujemy

-         w przeciwnym wypadku: komunikat: „są dwa pierwiastki”; obliczymy je x1 = (-b – sqr(Δ)/(2a)) i x2 = (-b + sqr(Δ)/(2a)), a następnie wydrukujemy.

Programowanie:
            Sub Trójmian()
            Dim a As Single, b As Single, c As Single
            Dim delta As Single, x1 As Single, x2 As Single
            a = InputBox(„Podaj wsp. A:”)
            b = InputBox(„Podaj wsp. B:”)
            c = InputBox(„Podaj wsp. C:”)
            delta = b * b – 4 * a * c
            Sprawdzenie wartości delty polegać będzie na zastosowaniu instrukcji warunkowej:
If warunek1 then 
  instrukcje wykonywane w przypadku, gdy warunek1 jest spełniony
ElseIf warunek2 then
  instrukcje wykonywane w przypadku, gdy warunek2 jest spełniony
Else
    instrukcje wykonywane w przypadku, gdy powyższe warunki nie zostały spełnione.
End If
Instrukcja warunkowa If może zawierać więcej fraz ElseIf, bądź w wersji najprostszej – wcale. Fraza Else również jest opcjonalna.
  If delta < 0 Then
     Debug.Print „Brak pierwiastków!”
  Else If delta = 0 Then
     Debug.Print „Jest jeden Pierwiastek:”
                 x1 = -b / (2 * a)
                 Debug.Print “x=”, x1
  Else
                 Debug.Print „Są dwa pierwiastki:”
                 x1 = (-b – Sqr(delta)) / (2 * a)     sqr(delta) – pierwiastek z delty
                 x2 = (-b + Sqr(delta)) / (2 * a)
             Debug.Print “x1=”, x1
                 Debug.Print “x2=”, x2
              End If
End Sub
Algorytm można uzupełnić warunkiem sprawdzającym: czy a jest różne od zera? W przypadku, gdy a = 0 wystąpi błąd dzielenia przez 0.

Zadanie

Pierwiastki trójmianu kwadratowego możemy wyliczyć także stosując wzory Viete’a: x1*x2=c/a, x1+x2=-b/a.
Ze względu na sposób umieszczania liczb rzeczywistych w pamięci operacyjnej komputera (zapis zmiennopozycyjny – warto poznać go bliżej), pierwiastki obliczane są w przybliżeniu. Stabilność algorytmu polega na takiej jego konstrukcji, aby dla różnych zestawów danych wejściowych, obliczane wyniki były zawsze wystarczająco dokładne. Można udowodnić, że gdy b/a>0, dokładniej wyliczany jest (z wzorów: x1 = (-b – sqr(Δ)/(2a)) i x2 = (-b + sqr(Δ)/(2a)) ) pierwiastek x1, natomiast, gdy b/a<0 – pierwiastek x2.
Obliczyć ewentualne pierwiastki trójmianu kwadratowego stosując:
·         metodę wcześniej omówioną,
·         wzory Viete’a,
·         metodę mieszaną:
ü          b/a>0 => x1 =(-b – sqr(Δ)/(2a)) i x2=c/a/x1
ü          b/a<0 => x2 =(-b + sqr(Δ)/(2a)) i x1=c/a/x2.
Zastosować zmienne typu Double.
Porównać wyniki dla identycznych danych (np. a=1, b=-10000, c=0,001).

3.     Powtarzanie nie musi być uciążliwe – „pętle”

Lekcja 3

Drukujemy tablicę wartości funkcji trygonometrycznych.

Czasami spotykamy problemy wymagające wielokrotnego powtarzania sekwencji instrukcji. Z pomocą przychodzą nam instrukcje powtarzania (tzw. pętle). Bez nich programowanie byłoby mozolne. Język VBA proponuje całą gamę instrukcji powtarzania. Jedną z najczęściej stosowanych jest tzw. „pętla odliczana”:

     for zmienna = wartość_ początkowa to wartość_końcowa step  wart_kroku

              Fraza step nie jest obowiązkowa. W przypadku jej braku krok domyślny wynosi 1.

Analiza: 

                   Wydrukujmy w pierwszej kolumnie wartość argumentu x zmieniającego się co 1 w zakresie od 0 do 90 stopni, a następnie w kolejnych kolumnach wartości funkcji trygonometrycznych: sinus, cosinus, tangens i cotangens.

Możemy skorzystać z wbudowanych funkcji standardowych sin(x), cos(x), tan(x). Funkcję cotangens zdefiniujemy sami: cos(x)/sin(x). Argumenty funkcji należy podać w radianach, a nie w stopniach. Wobec tego musimy znaleźć zależność między tymi jednostkami. Następująca proporcja, wynikająca z definicji jednostek, posłuży nam jako wzór wyjściowy: x/r = 360/2π.

Po przekształceniu: r = π/180*x

Projekt:

-         deklarujemy stałą PI i zmienne x, r,

-         korzystając z instrukcji powtarzania „for” przeliczamy jednostki ze stopni – x, na radiany – r , dla każdego x, zmieniającego się od 0 do 90, według wyżej podanej zależności,

-         drukujemy, dla każdego x, w kolejnych kolumnach x i sin(r),

-         później dodamy kolejne funkcje trygonometryczne.

Programowanie:

              Sub f_trygonometryczne()

                Const PI = 3.1415926

                Dim x As Integer, r As Single

                For x = 0 To 90

                   r = PI / 180 * x

                   Debug.Print x; Spc(3); Format(Sin(r), „0.000000“)

                Next x

              End Sub

Zmienna typu Integer przechowuje wartości całkowite z zakresu od

 -32768 do 32767.

Spc(3) – 3 spacje rozdzielające x od sin(r).

Funkcję Format omówiliśmy wcześniej.

W instrukcji Print średnikiem rozdzielamy kolejne parametry, gdy chcemy, aby były drukowane kolejno po sobie, przecinkiem – aby drukować od następnego „tabulatora”.

Dodajmy kolumnę z cos(r). Ponieważ wiersz drukujący będzie teraz długi, możemy go rozdzielić na dwa:

Debug.Print x; Spc(3); Format(Sin(r), „0.000000“); _

      Spc(3); Format(Cos(r), “0.000000”)

W języku VBA długie polecenia możemy “łamać” na dwa lub więcej wierszy. Na końcu danego wiersza musi jednak wystąpić znak kontynuacji w następnym („  _” – spacja i podkreślenie).

Program działa prawidłowo, więc kontynuujmy dalej:

Debug.Print x; Spc(3); Format(Sin(r), „0.000000“); _

      Spc(3); Format(Cos(r), “0.000000”); _

                           Spc(3); Format(Tan(r), „0.000000”)

Po tej poprawce, program nasz niestety nie działa już prawidłowo (chociaż nie zgłasza błędu). Funkcja tangens nie jest określona dla 90 stopni (dąży do nieskończoności). Przybliżenie, jakie tu otrzymaliśmy - jest nie do przyjęcia. Zadaniem programisty jest właściwa ingerencja. Zastosujmy instrukcję warunkową, która w przypadku, gdy x = 90 wydrukuje napis „brak”, zamiast niewłaściwej wartości.

            Przepiszmy instrukcję Print, bez drukowania tangensa:

Debug.Print x; Spc(3); Format(Sin(r), „0.000000“); _

                        Spc(3); Format(Cos(r), “0.000000”);

Średnik na końcu instrukcji Print zapewnia kontynuację wydruku w tym samym wierszu przez kolejną instrukcję Print.

Następująca konstrukcja spowoduje warunkowy wydruk wartości:

           If x = 90 then

             Debug.Print Spc(3); „brak    

           Else

             Debug.Print Spc(3); Format(Tan(r), “0.000000”)

           End If

Bezwarunkowy wydruk cotangensa:

Debug.Print Spc(3); Format(Cos(r) / Sin(r), “0.000000”)

spowoduje błąd kompilacji dla x = 0 ( błąd dzielenia przez zero):

Zastosujmy ponownie instrukcję If:

If x = 0 then

             Debug.Print Spc(3); „brak    

           Else

             Debug.Print Spc(3); Format(Cos(r)/Sin(r), "0.000000")

           End If

Nie zapomnijmy uzupełnić średnikami poprzednich instrukcji drukowania.              

Zadanie

Wydrukować tablicę wartości x, x2, x3, sqr(x) w zakresie od 0 do 100.

Lekcja 4

Obliczamy największy wspólny dzielnik dwóch liczb naturalnych.

Nie zawsze możemy określić, ile razy należy powtórzyć daną sekwencję instrukcji. Może to zależeć od danych wprowadzanych przez użytkownika w trakcie działania programu. Z pomocą przychodzą nam „pętle” uzależniające powtarzanie od spełnienia, bądź niespełnienia określonego warunku. Jedną z takich instrukcji jest:

            While warunek

              Instrukcje wykonywane, gdy warunek jest spełniony

            Wend

Cechą takich instrukcji jest ustawianie wartości początkowych zmiennych, występujących w warunku przed „wejściem do pętli”, a także sterowanie tymi zmiennymi „wewnątrz pętli”, np.:

            a =  5

            While  a > 0

              

              

               a = a – 1

            Wend  

Analiza:

 Zastosujemy algorytm Euklidesa z odejmowaniem.

Projekt:

-         sprawdzamy, czy podane dwie liczby naturalne są różne,

-         w przypadku pozytywnym: od większej odejmujemy mniejszą i różnicę podstawiamy pod zmienną większą,

-         czynności powyższe powtarzamy, dopóki zmienne są różne,

-         po zrównaniu się zmiennych, drukujemy jedną z nich jako wynik.

Programowanie:

Sub nwd()

  Dim x As Long, y As Long

  x = InputBox("Podaj licznik:", "Dane", 1)

  y = InputBox("Podaj mianownik:", "Dane", 1) 

  While x <> y

    If x > y Then

      x = x - y

    Else

      y = y - x

    End If

  Wend

  Debug.Print "NWD ="; x

End Sub

Zamiast zmiennej typu Integer czasami użyjemy zmiennej Long. Zmienna tego typu zajmuje w pamięci operacyjnej 4 bajty i przechowuje liczby całkowite z zakresu od -2.147.483.648 do 2.147.483.647.

Zadanie

Ponownie wydrukować tablicę wartości x, x2, x3, sqr(x) w zakresie od 0 do 10 , z krokiem 0,1. Zamiast instrukcji powtarzania for..., zastosować instrukcję while... .