Makrodefinicje i programowanie
Makrodefinicja (makro, makropolecenie) to ciąg instrukcji i poleceń działające podobnie
jak pojedyncze polecenie, służące do automatycznego wykonania określonego zadania.
Dzięki stosowaniu makrodefinicji można znacznie przyspieszyć np. redagowanie tekstu, jak
również wyeliminować powtarzanie tych samych, często nużących i pracochłonnych
czynności. Makro można tworzyć na dwa sposoby:
Korzystając z rejestratora makr wówczas wszystkie wykonywane czynności będą
rejestrowane
Korzystając z edytora języka Visual Basic
Makrodefinicje możemy stosować we wszystkich aplikacji pakietu Office
Aby można było korzystać z własnych makr musisz ustawić w menu
Narzędzia/Makra/Zabezpieczenia... poziom zabezpieczeń na średni lub niski
1) Otwórz teraz plik zadanko.doc znajdujący się na dysku G w folderze zadania\makra
i wykonaj wskazane w nim zadanie. Następnie zamknij go.
2) Utwórz nowy dokument w edytorze tekstu Word. Wpisz do niego tekst: Uczę się
tworzyć makra . Aby utworzyć nowe makro skorzystaj z opcji
Narzędzia/makro/Zarejestruj nowe makro. Pojawi się okienko dialogowe. Nadaj
nazwę makro1 tworzonej właśnie makrodefinicji. Następnie wybierz miejsce
przechowywania makra w bieżącym dokumencie i kliknij na przycisk OK. Od tego
momentu rozpoczynasz rejestracje makra. Jest to sygnalizowane
innym kursorem oraz minipaskiem narzędzi. W trakcie rejestracji
wykonujesz kolejno czynności, które mają składać się na makropolecenie. Wykonaj
następujące czynności: zmień kolor liter na czerwony, ustaw czcionkę na ARIAL o
rozmiarze 14 pt., litery pogrubione, kursywa. Zatrzymaj teraz działanie makra. Zaznacz
teraz np. słowo Uczę i uruchom utworzone przed chwilą makro wybierając opcję
Narzędzia/Makro/Makra...
Rejestracja makropolecenia jest tak naprawdę napisaniem programu komputerowego, którego
kod generuje Visual Basic for Aplication (VBA). Zajmijmy się teraz przykładami, dzięki
którym poznasz podstawy tego języka. Na dysku G w katalogu zadania\makra znajdują się
gotowe projekty, które będziesz musiał umiejętnie uzupełnić o kilka instrukcji. Każde zadanie
ma nauczyć Ciebie czegoś innego: instrukcji podstawiania, warunkowych, pętli. Większość
projektów jest autorstwa p. Sławomira Żaboklickiego.
3) Otwórz teraz plik if-then-else.doc. Z menu Narzędzia\Makra
wybierz opcję Edytor Visual Basic lub naciśnij kombinację
klawisz
+ . W oknie projektu (Project) otwórz
moduł IfThenElse. Celem tego ćwiczenia jest wyjaśnienie
zasady działania instrukcji If Then Else. Użytkownik wpisuje
dwie liczby w pola tekstowe A i B a następnie klika na przycisku
Oblicz. Jeśli spełniony jest warunek A>B, to tekst Wynik.Text
= "A > B" zmienia swój kolor na czerwony. W przeciwnym
Okno projektu
przypadku (gdy warunek nie jest spełniony, to tekst
Wynik.Text = "A <=B" zmienia swój kolor na czerwony.
Pierwszy tekst przechowywany jest w formancie Wieksza zaś drugi w formancie
NieWieksza. Instrukcja:
Wieksza.ForeColor = &HFF&
-1-
http://til.scholaris.pl
Makrodefinicje i programowanie
powoduje zmianę koloru tekstu dla formantu Wieksza na kolor czerwony (w systemie RGB).
A oto gotowy kod procedury:
If A > B Then
Wieksza.ForeColor= &HFF& ' Zmiana koloru na czerwony
NieWieksza.ForeColor= &H0& ' Zmiana koloru na czarny
Else
Wieksza.ForeColor= &H0&
NieWieksza.ForeColor= &HFF&
End If
Przywołujemy teraz okno procedur klikając dwa razy na przycisku oblicz. Procedura jest
częściowo utworzona, wskazano nawet miejsce gdzie należy ją uzupełnić. Wpisujemy więc
powyższy kod starając się nie pomylić. Aby sprawdzić działanie naszej aplikacji możemy np.
z menu Run wybrać opcję Run Macro lub też nacisnąć klawisz F5.
Zapisz teraz dokument na własnym dysku sieciowym.
Zastanów się dlaczego trzeba zmieniać niektóre napisy na czarne, pomimo tego , że są one już
czarne?
4). Czasami pewną grupę instrukcji należy wykonać wielokrotnie. Wykorzystując
instrukcję For Next operację sumowania kolejnych liczb naturalnych począwszy od 1 do
1000 można zapisać w postaci:
For i = 1 To 1000
Suma = Suma + i
Next i
Ogólna budowa instrukcji jest następująca:
For licznik = wartość początkowa To wartość końcowa
Instrukcje
Next licznik
Pod zmienną licznik podstawia jest wartość początkowa, a następnie sprawdzane jest, czy
nowa wartość zmiennej licznik nie jest większa od wartości końcowej. Jeżeli nie
jest większa, to są wykonywane Instrukcje. Po wykonaniu wszystkich instrukcji
następuje zwiększenie wartości zmiennej licznik o 1 i program wraca do wiersza
zaczynającego się od For. Tu ponownie sprawdza, czy licznik jest większy od
wartości końcowej itd. Pętla jest wykonywana do momentu, aż wartość zmiennej
licznik stanie się większa od wartości końcowej. Wtedy program przechodzi do
wykonania instrukcji zapisanej po wierszu zawierającym Next licznik.
Otwórz teraz plik for-next.doc i przejdz do edytora Visual Basic. Twoim celem będzie
obliczenie sumy kolejnych liczb naturalnych od 1 do N. Aby to zrobić musisz:
1) Utworzyć (zadeklarować) 3 zmienne. Jedną do przechowywania bieżącej sumy, drugą
do przechowywania aktualnej wartości licznika, trzecią do przechowywania wartości
końcowej
Deklaracja zmiennych wygląda następująco:
Dim nazwa_zmiennej as typ_zmiennej
Nazwa zmiennej powinna zaczynać się od literki, nie zawierać odstępów i polskich
znaków diakrytycznych.
-2-
http://til.scholaris.pl
Makrodefinicje i programowanie
Typ zmiennej określa rodzaj przechowywanej informacji (Integer liczba całkowita,
Single rzeczywista, String ciąg znaków itd.)
Nasza deklaracja będzie miała postać:
Dim i as Integer
Dim Suma as Integer
Dim N as Integer
2) Odczytać wartość liczbową z pola liczba i zapisać ją do zmiennej N
N=liczba.Value
3) Utworzyć pętlę. Nasz pętla będzie miała postać:
Suma=0 'ustalamy wartość początkowa sumy
For i = 1 To N
Suma = Suma + i
Next i
4) Zapisać wynik w polu Wynik
Instrukcja podstawienia
Wynik.Value=Suma
Powoduje przepisanie wartości zmiennej suma do pola tekstowego wynik
5). Instrukcję For można wykorzystać jedynie wtedy, gdy wiadomo ile razy ma być
wykonywana pętla. Istnieje jednak cały szereg problemów, w których nie posiadamy
informacji o niezbędnej liczbie powtórzeń (np. szukaj informacji dopoki jej nie znajdziesz ).
W takich sytuacjach wykorzystuje się pętle Do ... Loop Until lub While ... Do.
Pętla Do ... Loop Until ma budowę:
Do
Instrukcje
Loop Until wyrażenie logiczne
Instrukcje wewnątrz pętli będą wykonywane dopóki wyrażenie logiczne nie przyjmie
wartości True. Oczywiście przynajmniej jedna z instrukcji wewnątrz pętli musi w pewnym
momencie zmienić wartość wyrażenia logicznego. W przeciwnym przypadku pętla będzie
wykonywana bez końca.
Instrukcja Do ... Loop Until wykorzystywana jest wtedy, gdy wpierw należy wykonać pewne
instrukcje, a dopiero potem można sprawdzać spełnienie wyrażenia logicznego.
Otwórz teraz plik do-loop.doc. Przejdz do edytora Visual Basic i wybierz formę DoLoop.
Aplikacja ta służy do demonstracji prostej
animacji. Po kliknięciu na przycisk Start ikony
psa i narciarza zaczynają się przesuwać w prawo,
z tym, że pies biegnie dwa razy szybciej. Po
osiągnięciu przez psa lewej krawędzi narciarza
ruch ustaje.
Ruch obrazków psa i narciarza uzyskiwany jest
poprzez zastosowanie metody Move. Na
przykład instrukcja:
-3-
http://til.scholaris.pl
Makrodefinicje i programowanie
Narciarz.Left=Narciarz.Left+1
Powoduje przesunięcie obrazu narciarza o1. Właściwości Narciarz.Left i Pies.Left określają
współrzędne lewej krawędzi obrazków, a właściwość Narciarz.Width i Pies.Width ich
szerokość.
Pies.Left Pies.Width
Narciarz.Left Narciarz.Width
Algorytm jest następujący: należy powtarzać przesuwanie obrazka psa o dwie jednostki
i narciarza o jedną dopóki współrzędna prawej krawędzi psa będzie większa od współrzędnej
lewej części narciarza
Niestety ruch odbywa się zbyt szybko. Aby zatrzymać wykonywanie pętli na jakiś czas
wykorzystamy funkcję sleep, należącą do biblioteki API. Wstrzymuje ona działanie programu
na określoną liczbę milisekund (1sekunda to 1000 milisekund). Jej użycie jest następujące:
sleep 500 zatrzymuje działanie programu na 0,5 sekundy
Ponieważ procedura sleep jest zewnętrzna w stosunku do aplikacji, to musi być w odpowiedni
sposób zadeklarowana:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Po każdym przejściu pętli musimy odświeżyć okienko, w którym odbywa się ruch:
Ramka.Repaint
6. Instrukcja While ... Wend jest w pewnym sensie odwrotna do instrukcji Do ... Loop
Until. Wpierw sprawdzana jest wartość wyrażenia logicznego i jeśli jest ono prawdziwe, to
wykonywane są instrukcje wewnątrz pętli. Umożliwia to realizację algorytmów typu: jeżeli
jest zbyt zimno, to ogrzewaj pomieszczenie . Budowa instrukcji While ... Wend jest
następująca:
While wyrażenie logiczne
Instrukcje
Wend
Otwórz teraz dokument while-wend.doc. Zasymulujesz w nim lądowanie promu
kosmicznego.
Ponieważ początek układu współrzędnych znajduje się w lewym górnym rogu (oś Y jest
skierowana w dół), więc lądowanie statku jest symulowane przez przesuwanie lewego
górnego rogu formantu Rakieta w dół:
Rakieta.Top=Rakieta.Top+1
Pętla ma działać dotąd, dopóki wysokość formantu ziemia będzie większa od sumy wysokości
rakiety i położenia jej lewego górnego rogu:
Ziemia.Height > (Rakieta.Top + Rakieta.Height)
Niestety, tak jak w poprzednim zadaniu lądowanie rakiety odbywa się zbyt szybko. Aby je
zwolnić wykorzystaj procedurę sleep.
-4-
http://til.scholaris.pl
Makrodefinicje i programowanie
7. Jeżeli VBA nie może wykonać jakiejś instrukcji, to przekazuje odpowiedni sygnał
o błędzie do edytora VBA i kończy działanie programu. Przyczyny błędu mogą być różne,
najczęściej jest to wina programisty, który zle przewidział działanie procedury. Mogą to też
być błędy użytkownika, który np. wpisze literę zamiast cyfry w pole tekstowe. W każdym
przypadku program nie powinien przerywać działania, a jedynie zasygnalizować pojawienie
się błędu i dać użytkownikowi możliwość jego poprawienia lub choćby zapisania wyników.
Właśnie do tego celu służy instrukcja On Error GoTo. Jej zadaniem jest przechwycić sygnał
o błędzie i nakazać przeskok do miejsca w programie, które zawiera instrukcje obsługi
błędów. Instrukcja On Error GoTo jest ściśle związana z sama procedurą i ma budowę:
Sub nazwa(parametry)
On Error GoTo Etykieta
Instrukcje wykonywane, gdy nie ma błędu
Exit Sub
Etykieta:
Instrukcje wykonywane, gdy wystąpił błąd
End Sub
Jeżeli w trakcie działania procedury
nie jest sygnalizowany błąd, to
wykonywane są instrukcje po
wierszu On Error ..., a instrukcja
Exit Sub nakazuje normalnie
zakończyć działanie procedury.
Jeżeli przy wykonywaniu
którejkolwiek instrukcji wystąpi
Aplikacja powinna być zabezpieczona przed błędami
błąd, to VBA przerwie dalsze
użytkownika. Instrukcja On Error GoTo pozwala na
wykonywanie instrukcji i zacznie
przechwycenie i obsługę błędów
wykonywać instrukcje zapisane po
wierszu Etykieta:
Otwórz teraz dokument kantorek.doc.
Aplikacja jak na rysunku ma służyć do przeliczania kwoty z dolarów na złote
z wykorzystaniem obsługi błędów. Po kliknięciu na przycisk Oblicz w polu PLN ma
pojawić się obliczona wartość w złotych, aby to zrobić do właściwości Value kontrolki PLN
należy przypisać iloczyn wartości kursu i ilości dolarów:
PLN.Value = USD.Value * Kurs.Value
Aby poinformować użytkownika o błędzie wykorzystamy funkcję MsgBox, która wyświetla
komunikat w oknie. Funkcja ta ma postać:
MsgBox(Tekst_komunikatu, przyciski,Tytuł)
My wykorzystamy najprostszą jej postać:
Dim i as Integer
I = MsgBox( Podałeś nieprawidłową liczbę )
I umieścimy ją po wierszu Etykieta:
-5-
http://til.scholaris.pl
Makrodefinicje i programowanie
8. Aplikacja ma służyć do zamiany stopni w skali Celsjusza na stopnie w skali
Fahrenheita i odwrotnie. Lewy pasek przewijania i lewe pole etykiety dotyczą temperatur w
skali Celsjusza, prawy pasek przewijania i pole dotyczą temperatur w skali Fahrenheita.
Przesunięcie któregokolwiek paska przewijania powoduje odpowiednie przesunięcie suwaka
na drugim pasku i zmianę wartości wyświetlanych w etykietach.
Algorytm
Poniższa procedura obsługuje pasek przewijania SuwCels. Położenie suwaka określa liczbę
stopni w skali Celsjusza (wyświetlaną w etykiecie StCels) oraz jest przeliczane na stopnie w
skali Fahrenheita. Obliczona wartość w skali Fahrenheita (zmienna Fahren) zmienia położenie
suwaka w pasku SuwFahr i jest wyświetlana w etykiecie StFahr.
Private Sub SuwCels_Change()
Dim Fahren As Single
StCels.Caption = Format$(SuwCels.Value, "0.00")
Fahren = (SuwCels.Value * 9 / 5) + 32
StFahr.Caption = Format$(Fahren, "0.00")
SuwFahr.Value = Fahren
End Sub
Przebieg ćwiczenia
1. Wczytaj projekt stopnie.doc
2. Uzupełnij kod procedury Sub SuwFahr-
Change ( ).
Private Sub SuwFahr_Change()
Dim Cels As Single
' Tu należy uzupełnić procedurę
End Sub
Procedura powinna:
" w etykiecie StFahr wyświetlić wartość w
skali Fahrenheita odpowiadającą
położeniu suwaka w pasku SuwFahr;
" obliczyć wartość w skali Celsjusza z
położenia suwaka w pasku SuwFahr;
" wyświetlić wartość w skali Celsjusza w okienku StCels;
" zmienić położenie suwaka w pasku SuwCel s tak, żeby odzwierciedlił on zmianę w
skali Fahrenheita.
Sprawdz działanie aplikacji. Jeżeli nie działa ona poprawnie, spróbuj zlokalizować błąd
zawieszając wykonanie ostatnich instrukcji przez
umieszczenie przed nimi znaku komentarza.
9. W systemie RGB dowolny kolor jest
określany jako suma trzech kolorów podstawowych:
czerwonego, zielonego i niebieskiego. Intensywność
każdej składowej określa się w przedziale [0, 255]. W
projektowanej aplikacji odbywa się to za pomocą
trzech pasków przewijania. Kolor wynikowy jest
prezentowany w ramce poniżej, a aktualna wartość
intensywności jest wyświetlana w okienkach
oznaczonych "R", "G", "B".
-6-
http://til.scholaris.pl
Makrodefinicje i programowanie
Algorytm
Paski przewijania noszą w programie nazwy Czerw, Ziel i Nieb. Odczytanie wprowadzonej
wartości np. koloru czerwonego, następuje przy użyciu instrukcji
C = Val(Czerw.Value)
Ramka do wyświetlenia koloru wynikowego nazywa się Kolor. Instrukcja:
Kolor.BackColor = RGB(Czerwony, Zielony, Niebieski)
ustawia kolor tła ramki w zależności od wartości składowych. Funkcja RGB oblicza numer
koloru wypadkowego. Pola etykiet do wyświetlania wartości kolorów składowych noszą
nazwy WR, WG i WB. Dla każdego z pasków przewijania należy:
odczytać wartości ich położeń (będą się one mieścić w zakresie [0,255]);
zmienić kolor tła ramki Kolor zgodnie z odczytanymi wartościami;
wyświetlić w odpowiednim polu etykiet wartość koloru składowego, np.
WR.Caption = Str$(C).
Przebieg ćwiczenia
1. Wczytaj projekt KoloryRGB.doc
2. Dla każdego paska przewijania uzupełnij związaną z nim procedurę tak, żeby
realizowała ona powyższy algorytm.
Private Sub Czerw_Change()
Dim C, Z, N As Integer
C = Val(Czerw.Value)
Z = Val(Ziel.Value)
N = Val(Nieb.Value)
'Tu należy uzupełnić procedurę
End Sub
3. Sprawdz działanie aplikacji.
10. Działanie aplikacji ma być następujące:
w pole "Rmin" należy wpisać promień najmniejszego okręgu;
w pole "Rmax" należy wpisać promień największego okręgu;
w pole "dR" należy wpisać liczbę określającą wielkość przyrostu
promienia okręgu;
na koniec należy kliknąć na przycisku Rysuj, co spowoduje
narysowanie okręgów.
Algorytm
Dane z pól tekstowych są czytane do lokalnych zmiennych (z ograniczeniem promienia do
400 px):
Rmin = Val(R0.Text)
Rmax = Val(RM.Text)
If Rmax>400 Then Rmax=400
dR = Val(Przyrost.Text)
W aplikacji wykorzystuje się procedurę :
ActiveDocument.Shapes.AddShape msoShapeOval, R, R, 300, 300
rysującą okrąg w punkcie o współrzędnej X=300, Y=300 i mającego promień R.
Należy rysować okręgi, zmieniając ich promień od Rmax do Rmin z krokiem dR.
-7-
http://til.scholaris.pl
Makrodefinicje i programowanie
Przebieg ćwiczenia
1. Wczytaj projekt okregi.doc.
2. Uzupełnij procedurę związaną z przyciskiem Rysuj tak, żeby realizowała powyższy
algorytm.
Private Sub Rysuj_Click()
Dim Rmin, Rmax, dR As Integer
Rmin = Val(R0.Text)
Rmax = Val(RM.Text)
If Rmax>400 Then Rmax=400
dR = Val(Przyrost.Text)
'Tu należy uzupełnić procedurę
End Sub
Uwaga: Aby uzyskać efekt taki jak na rysunku powyżej należy rysować okręgi od tego o
największym promieniu do tego o najmniejszym
3. Sprawdz działanie aplikacji.
11. Projekt jak na rysunku obok służy do
demonstracji animacji. Po kliknięciu na
przycisk Ruszaj ikona traktora zaczyna
się przesuwać w prawo. Po osiągnięciu
przez ciągnik lewej krawędzi ikony drzewa
ruch ustaje (w wyniku działania traktorzysty
a nie zderzenia z drzewem;-))
Algorytm
Ruch obrazka traktora uzyskiwany jest przez przesunięcie ikony traktora o 1:
Traktor.Left=Traktor.Left+1
Właściwości Traktor.Left i Drzewo.Left określają współrzędne lewej krawędzi
obrazków, a właściwości Traktor.Width i Drzewo.Width ich szerokości.
Algorytm jest następujący: należy powtarzać przesunięcie obrazka traktora o jedną jednostkę
dopóki współrzędna prawej krawędzi traktora będzie mniejsza od lewej współrzędnej
drzewa.
Aby spowolnić nieco ruch możesz w pętli wykorzystać instrukcje:
Sleep(x) powodującą zamrożenie wykonania instrukcji na x milisekund oraz instrukcję
Droga.Repaint, która odrysuje ponownie komponent Droga, po którym porusza się
ciągnik.
Przebieg ćwiczenia
1. Wczytaj projekt rolnik.doc
2. Uzupełnij procedurę związaną z przyciskiem Ruszaj tak, żeby realizowała powyższy
algorytm.
Private Sub Ruszaj_Click()
' Tu należy uzupełnić procedurę
End Sub
3. Sprawdz działanie aplikacji.
-8-
http://til.scholaris.pl
Makrodefinicje i programowanie
12. Działanie aplikacji ma być następujące:
w pole tekstowe należy wpisać dowolną liczbę naturalną;
następnie należy kliknąć na przycisku Oblicz silnię. Jako
wynik działania aplikacji pojawi się wartość silni wprowadzonej
liczby.
Po kliknięciu na przycisk Wklej wynik do arkusza do aktywnej
komórki arkusza zostaje wklejony wynik obliczenia silni dla podanej liczby.
Algorytm
Silnia liczby naturalnej n jest definiowana następująco:
n!=1*2*3*...*n
na przykład 5! = l. 2 . 3 . 4 . 5 = 120. Algorytm powinien uwzględnić, że 0! = l.
W pętli należy wykonać mnożenie kolejnych liczb całkowitych, a kolejne wyniki
przechowywać w zmiennej Si.
Przebieg ćwiczenia
1. Wczytaj projekt silnia.xls.
2. Dla przycisku Oblicz n! uzupełnij procedurę Sub Oblicz_Click ( ) tak, aby
realizowała powyższy algorytm. -
Private Sub Oblicz_Click()
Dim n, i As Integer
Dim Si As Double
n = Val(WartoscN.Text)
' Sygnalizacja zbyt dużej liczby
If n > 170 Then
n = 170
WartoscN.ForeColor = &HFF
WartoscN.Text = Str$(n)
End If
'Tu należy uzupełnić procedurę
End Sub
3. Dla przycisku Wklej wynik do arkusza uzupełnij procedurę Wklej_Click()
ActiveCell.Value = Wynik.Text
4. Sprawdz działanie aplikacji. Zobacz, jaką największą liczbę możesz uzyskać.
13. Otwórz znów wzorcowy arkusz silnia.xls
Tym razem wykorzystamy wbudowaną do arkusza kalkulacyjnego formułę Fact (która
wyznacza silnię).
Aby to zrobić w procedurze Sub Oblicz_Click ( ) posłuż się następującym wpisem:
Wynik.Text = Application.WorksheetFunction.Fact(WartoscN)
Zapisz arkusz jako silnia1.xls na swoim dysku sieciowym.
-9-
http://til.scholaris.pl
Makrodefinicje i programowanie
14. Aplikacja jak na rysunku ma służyć do
przybliżonego wyznaczania liczby Ą
Działanie aplikacji ma być następujące:
w pole tekstowe "Dokładność=" należy wpisać
wymaganą dokładność obliczenia wartości liczby Ą
(np. 0.01),
wybrać przycisk "Oblicz". Wynik pojawi się w
oknie "pi=", a poniżej (w oknie "i =") liczba
zsumowanych składników.
Algorytm
Wartość liczby Ą z zadaną dokładnością wyznacza się wykorzystując rozwinięcie liczby Ą w
szereg:
Sumowania dokonuje się w pętli do momentu, aż kolejny składnik Ti stanie się mniejszy od
zadanej dokładności. Algorytm obliczenia liczby Ą jest przedstawiony na formularzu
aplikacji. Należy go uzupełnić wewnątrz pętli instrukcjami wyświetlania obliczonych
wartości zmiennych:
WartoscT.Caption = T
WartoscPi.Caption = Pi
WartoscI.Caption = i
Przebieg ćwiczenia
1. Wczytaj projekt pi.xls.
2. Dla przycisku "Oblicz" uzupełnij treść procedury Sub OBLICZ_Click() tak, aby
realizowała ona powyższy algorytm.
Private Sub Oblicz_Click()
Dim i As Integer
Dim Dokladnosc, T, Pi As Single
Dokladnosc = Val(Dokl.Text)
If Dokladnosc > 0 Then
Pi = 0
i = 1
T = 1
'Tu należy uzupełnić procedurę
End If
End Sub
3. Uruchom aplikację. W pole tekstowe wpisz dokładność 0.01
4. Sprawdz działanie aplikacji. Jaka jest zależność liczby składników sumy od założonej
dokładności?
-10-
http://til.scholaris.pl
Makrodefinicje i programowanie
14(a). Otwórz znów wzorcowy arkusz pi.xls
Wykorzystując wbudowana do arkusza formułę wyznaczającą liczbę Ą wyznacz jej wartość
Ą
Ą
Ą
z dokładnością dostępną w arkuszu kalkulacyjnym.
Pracę zapisz jako pi1.xls
15. Informatyczne jednostki miary podawane są
zwykle jako krotności potęgi 2
np. 1 Kb = 210 B = 1024 B. Aplikacja, jak na rysunku
ma służyć do przeliczania KB, MB, GB, itd. na bajty.
Użytkownik wpisuje w oknie tekstowym liczbę, z
listy rozwijanej wybiera jednostkę i klika na
przycisku Bajtów . W odpowiedzi aplikacja
wyświetla liczbę bajtów.
Algorytm
Do wczytania liczby służy pole tekstowe Wartosc. Instrukcja:
Wczytana = CDbl(Wartosc.Text)
wczytuje wpisaną liczbę i podstawia ją pod zmienną Wczytana. Instrukcja:
Jednostka = Jedn.ListIndex
wczytuje wybraną prze użytkownika jednostkę (potęgę, do której należy podnieść 1024)
i podstawia ją pod zmienną Jednostka. Należy uzupełnić procedurę o instrukcję
obliczania liczby bajtów (wg wzoru Liczba = Wczytana * 1024Jednostka).
WSK: Potęgę w VBA zapisujemy w postaci ^ np.: 34 przyjmie postać: 3^4
Przebieg ćwiczenia
1. Wczytaj projekt bajty.xls
2. Dla przycisku "Oblicz" uzupełnij treść procedury Sub OBLICZ_Click() tak, aby
realizowała ona powyższy algorytm.
Private Sub Oblicz_Click()
' tu należy uzupełnić Procedurę
End Sub
3. Uzupełnić procedurę Sub Wklej_Click() wklejająca do aktywnej komórki arkusza
wynik
Private Sub Wklej_Click()
'tu też należy uzupełnić procedurę
End Sub
4. Sprawdz działanie aplikacji
5. Przeanalizuj również procedurę Sub UserForm_Initialize(), która odpowiada za
poprawne wczytanie wielokrotności Bajta podczas
uruchamiania formularza. Być może będzie to dla
ciebie ciekawa lektura ;-)
-11-
http://til.scholaris.pl
Makrodefinicje i programowanie
16. Działanie aplikacji ma być następujące: należy wpisać pięć liczb w pola tekstowe,
wybrać przycisk Znajdz największą . Jako wynik działania aplikacji w okienku
"Największa" pojawi się wartość największej z wpisanych liczb.
Algorytm
W tym ćwiczeniu wykorzystamy po raz pierwszy strukturę danych zwaną tablicą. Tablica jest
to zestawienie zmiennych jednego typu, do których odwołujemy się podając ich indeks
(numer). Numeracja zaczyna się od liczby 0. Jej deklaracja jest następująca:
Dim tablica(ilość_elementów) as typ_zmiennej
np.:
Dim liczby(2) as Double
określa dwuelementową tablicę liczb rzeczywistych (a właściwie pewnego ich podzbioru).
W pierwszym kroku obliczeń do komórek 5 elementowej tablicy wprowadzimy wartości z
poszczególnych okienek tekstowych:
liczba(0) = CInt(Liczba1.Text)
liczba(1) = CInt(Liczba2.Text)
liczba(2) = CInt(Liczba3.Text)
liczba(3) = CInt(Liczba4.Text)
liczba(4) = CInt(Liczba1.Text)
W następnym kroku chwilowo za maksymalną (zmienna Max) liczbę wpisana do pierwszego
okienka tekstowego:
Max = liczba(0)
Następnie w pętli należy wykonać następujące operacje:
porównać zmienną Max z następnym elementem tablicy Liczba. Jeżeli następny
element tablicy ma wartość większą od chwilowej maksymalnej, to jest ona przyjmowana za
chwilową maksymalną:
Max = liczba(indeks)
W efekcie, po przeszukaniu wszystkich wpisanych liczb, wartość chwilowej maksymalnej jest
równa największej z nich. Wartość zmiennej Max wyświetla się w polu etykiet
Najwieksza.Caption = Max
Przebieg ćwiczenia
1. Wczytaj projekt max.xls
2. Dla przycisku z napisem "Znajdz największą" uzupełnij procedurę realizującą powyższy
algorytm.
Private Sub Znajdz_Click()
Dim liczba(5), bl, Max As Integer
On Error GoTo blad
liczba(0) = CInt(Liczba1.Text)
liczba(1) = CInt(Liczba2.Text)
liczba(2) = CInt(Liczba3.Text)
liczba(3) = CInt(Liczba4.Text)
liczba(4) = CInt(Liczba1.Text)
' Tu należy uzupełnić procedurę
Exit Sub
3. Sprawdz działanie aplikacji,
4. Zmień procedurę tak, żeby szukała najmniejszej z wpisanych liczb. Sprawdz działanie
aplikacji.
-12-
http://til.scholaris.pl
Makrodefinicje i programowanie
17. Działanie aplikacji ma być następujące. Należy
odgadnąć ukryte słowo, zgadując kolejno litery, z których się
ono składa. Po wpisaniu w okienku" Wpisz literę" kolejnej
litery należy kliknąć na przycisku Czy jest? Jeżeli litera
znajduje się w słowie, to zostanie ona wyświetlona na swojej
pozycji. W każdym przypadku (czy się zgadnie, czy nie)
zwiększa się o l wskazanie pola "Licznik".
W globalnej tablicy UkryteSlowo (8) jest ukryte
ośmioliterowe słowo. Cecha Zgadywana.Text zawiera
zgadywaną literę. Odgadnięte litery są wyświetlane w tablicy etykiet SzukaneSlowo.
Po wpisaniu litery i kliknięciu na przycisku Czy jest? aplikacja powinna przeszukać tablicę
UkryteSlowo. Jeżeli litera występuje w ukrytym słowie (Zgadywana.Text =
UkryteSlowo(i)), to powinna być ona wyświetlona na odpowiedniej pozycji
(SzukaneSlowo(i).Tekst = Zgadywana.Text).
W każdym przypadku należy zwiększyć o l wskazanie licznika (Ile = Ile + 1).
Przebieg ćwiczenia
1. Wczytaj projekt Slowo.xls.
2. Przyciskowi CzyJest? przypisz procedurę Sub CzyJest_Click( ), działającą
według powyższego algorytmu.
Private Sub CzyJest_Click()
Dim i As Integer
'Tu należy uzupełnić procedurę
Zgadywana.Text = ""
Wynik.Caption = CStr(Ile) + " próba"
Zgadywana.SetFocus
End Sub
3. Sprawdz działanie aplikacji.
4. Zmodyfikuj działanie aplikacji , tak aby pobierała ona ośmioliterowe słowo
z komórki A1 (kolor czcionki komórki A1 jest taki sam jak kolor tła, więc ukrytego
słowa nie będzie widać). W procedurze Sub UserForm_Initialize() posłuż się
instrukcją:
Slowo=Cells(1,1).Value
5. Wpisz słowo komputer do komórki A1 i sprawdz działanie
aplikacji.
18. Aplikacja jak na rysunku ma służyć nauce pisania na
klawiaturze. Jej działanie ma być nastepujące:
Użytkownik po kliknięciu na przycisk Start wstukuje
z klawiatury znaki, które pojawiają się w etykiecie o nazwie
Litera powyżej. Po wprowadzeniu 10 znaków wyświetlany jest wynik będący procentową
wartością poprawnych odpowiedzi.
-13-
http://til.scholaris.pl
Makrodefinicje i programowanie
Algorytm
W zmiennych globalnych ile_popr, ile przechowywane są wartości odpowiednio:
poprawnych odpowiedzi i wszystkich udzielonych już odpowiedzi.
Procedura Sub start_Click() zawiera warunki początkowe dla zmiennych
ile_popr i ile oraz losuje liczbę naturalną z przedziału 65 ...122 będą numerem znaku w tzw.
kodzie ASCII. Np. kod o numerze 65 odpowiada literze A .
kodASCII = Int((57 * Rnd) + 65)
Następnie kod zamieniany jest na znak za pomocą instrukcji Chr
Litera.Caption = Chr(kodASCII)
Na pole tekstowe znak, w którym wprowadzamy litery nakładany jest tzw. fokus, czyli pole
to pozostaje cały czas aktywne:
znak.SetFocus
Procedura Sub znak_KeyPress(....) jest uaktywniana w chwili naciśnięcia
dowolnego klawisza. Wówczas należy zwiększyć wartość zmiennej ile o 1 (ile=ile+1).
Jeśli wciśnięty znak jest równy znakowi z etykiety Litera
If Chr(KeyAscii) = Litera.Caption ...
Zwiększamy ilość poprawnych odpowiedzi o jedną.
Jeśli udzieliliśmy już dziesięć odpowiedzi (ile=10) to:
" uaktywniany jest przycisk start (Start.Enabled=true), zaś pole znak staje się
nieaktywne (Znak.Enabled=false)
" wyświetlany jest procentowy wynik wszystkich poprawnych odpowiedzi:
wyn = MsgBox(" Twój wynik to: " & ile_popr / ile * 100 & " % ", _
vbInformation, "WYNIK")
Jeśli liczba odpowiedzi jest mniejsza od dziesięciu wówczas:
" czyścimy pole znak:
znak.Text = ""
" Losujemy nowy kod, zamieniamy go na znak i wprowadzamy do kontrolki Litera:
Litera.Caption = Chr(Int((57 * Rnd) + 65))
Przebieg ćwiczenia
1. Wczytaj arkusz Mistrz_Klawiatury.xls
2. Uzupełniamy procedurę
Sub znak_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
zgodnie z powyższym algorytmem.
3. Sprawdzamy działanie aplikacji.
19. W tym ćwiczeniu zdefiniujemy własną formułkę (funkcję) arkusza, która będzie
dostępna w kategorii funkcji Użytkownika.
Funkcje zazwyczaj pobierają argument (lub argumenty) i zwracają wynik. Możemy je
utożsamiać z funkcjami znanymi z lekcji matematyki.
-14-
http://til.scholaris.pl
Makrodefinicje i programowanie
Stworzymy funkcję o nazwie OcenaSlownie. Pobierała będzie ona liczbę naturalną (ocenę
w postaci liczbowej) i zwracała napis będący opisem słownym oceny. Np.: wynikiem funkcji
OcenaSlownie(4) będzie wartość dobry.
Algorytm
Funkcję zdefiniujemy następująco:
OcenaSlownie(ocena as Integer) as String
Oznacza ona, że funkcja pobiera argument typu całkowitego i zwraca napis.
Ponieważ skala ocen jest sześciostopniowa, więc stosowanie instrukcji IF ... THEN
... ELSE będzie kłopotliwe. Wykorzystamy więc instrukcję języka VBA postaci
SELECT CASE ... Dzięki niej uprościmy sprawdzanie warunków:
Select Case ocena
Case 1
OcenaSlownie= niedostateczny
Case 2
OcenaSlownie= dopuszczający
Case 3
OcenaSlownie= dostateczny
Case 4
OcenaSlownie= dobry
Case 5
OcenaSlownie= bardzo dobry
Case 6
OcenaSlownie= celujacy
Case Else
OcenaSlownie= Nie ma takiej oceny!
End Select
Przebieg ćwiczenia
1. Utwórz nowy arkusz kalkulacyjny i zapisz go pod nazwą ocena.xls
2. Przejdz do Edytora Visual Basica
3. Z menu Edytora wybierz Insert/Module
4. Zdefiniuj funkcję OcenaSlownie zgodnie z powyższym algorytmem.
5. Zapisz zmiany i przejdz do arkusza kalkulacyjnego
6. Sprawdz działanie nowej formuły zaznaczając kategorię funkcji Użytkownika z menu
Wstaw/Funkcja.
-15-
http://til.scholaris.pl
Makrodefinicje i programowanie
20(*). To już ćwiczenie trudniejsze.
Utwórz funkcję użytkownika o nazwie LiczbaSlownie, która dla podanej liczby
naturalnej będzie zwracała słowny zapis jej cyfr np.:
Wynikiem wywołania formuły LiczbaSlownie(123)powinien być napis:
jeden-dwa-trzy, zaś wywołanie LiczbaSlownie(7) jest napis: siedem.
WSK: Musisz posłużyć się tutaj instrukcją DIV i MOD. Pierwsza z nich realizuje dzielenie
całkowite, zaś druga zwraca resztę z dzielenia, np.:
7 DIV 3 = 2 12 DIV 4 = 3
6 MOD 3 = 2 13 MOD 2 = 1
To już koniec.
Życzę satysfakcji w wymyślaniu i testowaniu własnych aplikacji
RAFAELLO
-16-
http://til.scholaris.pl
Wyszukiwarka
Podobne podstrony:
makra
Excel 2007 Jezyk VBA i makra Rozwiazania w biznesie
Excel Makra i VB zad 65 67(1)
excell makra
Bibliografia Makra
MAKRA
excel makra
Makra cwiczenia
makra
makra
pi st2009z lab06 excel makra
więcej podobnych podstron