1 Algorytmy 1. Zapoznaj się z symboliką schematów blokowych. 2. Przeanalizuj podany algorytm wyznaczający minimalną liczbę spośród danych: a, b, c. dr Piotr Borkowski 1/10
3. Przeanalizuj podany algorytm wyznaczający minimalną liczbę spośród danych: a,, a 1 200. 4. Wykonaj algorytm wyznaczający: liczbę przeciwną do a iloczyn dwóch danych liczb: a, b iloraz dwóch danych liczb: a, b pole prostokąta o bokach: a, b rozwiązania równania kwadratowego o zadanych współczynnikach: a, b, c silnię z danej liczby naturalnej n sumę elementów leżących na przekątnej macierzy kwadratowej o wymiarach 4 4 sumę elementów leżących na przekątnej macierzy kwadratowej o wymiarach n n dr Piotr Borkowski 2/10
2 Visual Basic for Applications 2.1 Wprowadzenie 1. Zapoznaj się z podstawowymi informacjami na temat pisania programów w VBA. Informacje ogólne Visual Basic for Applications (VBA) to oparty na Visual Basicu (VB) język programowania zaimplementowany w aplikacjach pakietu Microsoft Office (MS Word, MS Excel, MS PowerPoint). Ta uproszczona wersja Visual Basica służy przede wszystkim do automatyzacji pracy z dokumentami pakietu Microsoft Office. Podstawową różnicą między VBA a VB jest to, że VBA nie pozwala na tworzenie samodzielnie wykonujących się aplikacji typu *.exe. Kod programu (makra) napisanego w VBA zawsze zawarty jest w dokumencie utworzonym przy pomocy programu obsługującego VBA, na przykład w pliku *.xls arkusza kalkulacyjnego MS Excel. Program taki wymaga zatem środowiska uruchomieniowego, którym jest zainstalowana na komputerze aplikacja obsługująca dany dokument. Na zajęciach wykorzystywać będziemy do tego celu MS Excel. Edytor VBA uruchamiamy na przykład poprzez wciśnięcie ALT+F11 (oczywiście w aktywnym oknie MS Excel). Pisanie makra rozpoczynamy wybierając z menu Insert, a następnie Module. Po wstawieniu nowego modułu, po prawej stronie pojawia się puste pole edycji, w którym możemy zacząć pisać swój program. Makro uruchamia się poprzez kliknięcie na znak Run (lub klawisz F5). Struktura programu Program w VBA składa się z jednej lub wielu procedur napisanych w jednym module. Może zawierać również zdefiniowane funkcje (jest to procedura, która zwraca wartość). Procedury jak i funkcje mogą korzystać z argumentów, czyli zmiennych które są przekazywane do procedury (funkcji) w momencie jej wywołania (jeśli procedura wywołana zmienia wartość argumentu, czyli zmienną przekazaną to zmiana ta pozostanie kiedy sterowanie powróci do procedury wywołującej). Składnie procedury i funkcji mają postać: Sub nazwa_procedury(argument1, argument2,...) deklaracja zmiennych... kod procedury... End Sub Function nazwa_funkcji(argument1, argument2,...) As zwracany_typ_danych deklaracja zmiennych... kod funkcji... nazwa_funkcji = wartość_zwrócona_przez_funkcję End Function W kodzie procedury (funkcji) można umieścić instrukcję Exit Sub ( Exit Function ), jeśli chcemy zaprzestać w danym miejscu wykonywania tej procedury (funkcji). Deklaracja zmiennych Programy manipulują danymi, które są przechowywane w zmiennych. Zmienne mogą przechowywać różne typy danych (liczby, tekst, data i tak dalej). Stąd termin typ danych. dr Piotr Borkowski 3/10
funkcje wejścia/wyjścia funkcje tekstowe funkcje matematyczne operatory logiczne operatory porównania operatory arytmetryczne Algorytmy i VBA Zmienne można deklarować zarówno na poziomie modułu (wówczas mają zasięg na cały moduł) jak i na poziomie procedury, czy też funkcji (wówczas mają zasięg wewnątrz procedury, czy też odpowiednio wewnątrz funkcji). Deklaracja zmiennej odbywa się za pomocą następującej składni: Dim nazwa_zmiennej As typ_danych - standardowa deklaracja zmiennej Public nazwa_zmiennej As typ_danych - gdy zmienna ma mieć zasięg we wszystkich modułach W kodzie procedury (funkcji) następuje nadanie wartości zmiennym za pomocą operatora równości. Kod procedury (funkcji) Kod procedury (funkcji) jest pisany z wykorzystaniem operatorów, funkcji wbudowanych oraz instrukcji. OPERATORY Operator Opis + operator dodawania - operator odejmowania * operator mnożenia / operator dzielenia ^ operator potęgowania Mod operator modulo & operator łączenia łańcuchów < operator mniejszości <= operator mniejszości lub równości > operator większości >= operator większości lub równości = operator równości Not operator negacji And operator koniunkcji Or operator alternatywy Eqv operator równoważności Imp operator implikacji FUNKCJE WBUDOWANE Funkcja Opis Abs(argument) wartość bezwzględna Sgn(argument) znak argumentu Int(argument) zwraca największą liczbę całkowitą z argumentu Log(argument) logarytm naturalny Exp(argument) funkcja wykładnicza o podstawie e Sqr(argument) pierwiastek kwadratowy Sin(argument) funkcja sinus Cos(argument) funkcja cosinus Tan(argument) funkcja tangens Val( tekst ) zmienia tekst na liczbę Str(liczba) zmienia liczbę na tekst Len( tekst ) zwraca długość tekstu Left( tekst,n) zwraca n pierwszych znaków tekstu Right( tekst,n) zwraca n ostatnich znaków tekstu Mid( tekst n,m) zwraca m znaków od n-tego InputBox( komunikat ) wyświetla okno wprowadzania danych MsgBox(dane) wyświetla okno wyjścia danych Cells(n,m) odwołanie się do komórki Excela WorkSheets( arkusz ).Cells(n,m) odwołanie się do komórki w określonym arkuszu Shell( ścieżka ) uruchamia zewnętrzny program LoadPicture( ścieżka ) ładuje obraz do obiektu dr Piotr Borkowski 4/10
INSTRUKCJE Instrukcja Call nazwa_procedury(argument1, argument2,...) If warunek1 Then kod wykonywany gdy warunek1 jest prawdziwy ElseIf warunek2 Then kod wykonywany gdy warunek2 jest prawdziwy, a warunek1 nieprawdziwy Else kod wykonywany gdy wszystkie warunki są nieprawdziwe End If Select Case nazwa_zmiennej Case war_1 kod wykonywany gdy zmienna przyjmie wartość war_1... Case war_n kod wykonywany gdy zmienna przyjmie wartość war_n Case Else kod wykonywany gdy zmienna nie przyjmie wartości: war_1,..., war_n End Select For licznik = początek_licznika TO koniec_licznika kod Next licznik Opis wywołanie procedury instrukcja warunkowa instrukcja wyboru instrukcja powtarzania kodu Programowanie obiektowe VBA umożliwia programowanie obiektowe, czyli kod wielu formantów (obiektów graficznych tworzących program) jest tworzony automatycznie. W tym celu z menu Insert edytora VBA należy wybrać polecenie UserForm. Jeśli nie pokazało się okno z właściwościami powstałego formularza (w którym możemy np. zmienić nazwę itp.) to w menu View wybieramy polecenie Properties. Teraz możemy zabrać się do narysowania potrzebnych nam formantów (CommandButton przycisk, ComboBox - pole kombi, ListBox - pole listy, SpinButton - przycisk pokrętła, TextBox - pole tekstowe, Label - etykieta). Chcąc napisać procedury, które mają towarzyszyć określonemu zdarzeniu (np. kliknięciu w przycisk), najeżdżamy na narysowany formant, a następnie klikamy w niego prawym przyciskiem myszy i wybieramy View Code. Rejestrowanie makra VBA umożliwia również automatyczne tworzenie kodu poprzez rejestrowanie operacji wykonanych w aplikacji. W tym celu z menu Narzędzia (MS Excel) należy wybrać polecenie Makro, a następnie Zarejestruj nowe makro. Zakończenie rejestrowania makra odbywa się poprzez kliknięcie na przycisk Zatrzymaj rejestrowanie. 2. Wpisz do edytora VBA oraz przeanalizuj podany kod makra wyznaczającego minimalną liczbę spośród danych: a, b, c, wykorzystującego funkcję InputBox oraz funkcję MsgBox. Sub Min_z_trzech() Dim a, b, c, x As Double a = InputBox("Podaj a:") b = InputBox("Podaj b:") c = InputBox("Podaj c:") x = a If x > b Then x = b End If If x > c Then x = c End If MsgBox ("Najmniejsza z trzech podanych liczb to: " & x) End Sub 3. Wpisz do edytora VBA oraz przeanalizuj podany kod makra wyznaczającego minimalną liczbę spośród danych: a,, a 1 200 pobieranych z pierwszej kolumny aktywnego arkusza. dr Piotr Borkowski 5/10
Sub Min_z_dwustu() Dim x As Double x = Cells(1, 1) For i = 2 To 200 If x > Cells(i, 1) Then x = Cells(i, 1) End If Next i MsgBox ("Najmniejsza z dwustu podanych liczb to: " & x) End Sub 4. Wpisz do edytora VBA oraz przeanalizuj podany kod makra wyznaczającego z daty, dzień tygodnia. Makro wykorzystuje algorytm Zellera (nie uwzględnia źle wpisanej daty). Sub Dzień_tygodnia() Dim d, m, r As Integer d = InputBox("Podaj dzień:") m = InputBox("Podaj miesiąc:") r = InputBox("Podaj rok:") ' Algorytm Zellera wyznaczający numer dnia tygodnia If m < 3 Then r = r - 1 m = m + 12 End If d = r + Int(r / 4) - Int(r / 100) + Int(r / 400) + _ 3 * m - Int((2 * m + 1) / 5) + d + 1 d = d - Int(d / 7) * 7 Select Case d Case 0 MsgBox ("Podany dzień to niedziela") Case 1 MsgBox ("Podany dzień to poniedziałek") Case 2 MsgBox ("Podany dzień to wtorek") Case 3 MsgBox ("Podany dzień to środa") Case 4 MsgBox ("Podany dzień to czwartek") Case 5 MsgBox ("Podany dzień to piątek") Case 6 MsgBox ("Podany dzień to sobota") End Select End Sub 5. Utwórz formularz, za pomocą którego można będzie przeliczyć walutę euro na złotówki. Powinien on zawierać trzy pola tekstowe, trzy etykiety oraz przycisk, tak jak to zostało pokazane na rysunku. Na rysunkach przedstawiono również kod procedury jaka jest wykonywana po kliknięciu na przycisk oraz właściwości formularza i formantów na nim umieszczonych. dr Piotr Borkowski 6/10
dr Piotr Borkowski 7/10
6. Zarejestruj makro, które rysuje linię, a następnie zmienia jej grubość na 6 pkt. Przeanalizuj kod powstałego makra. 2.2 Programowanie w VBA 1. Napisz makro wyznaczające liczbę przeciwną do liczba a, wykorzystujące funkcję InputBox oraz funkcję MsgBox. 2. Napisz makro drukujące w komórce E1 iloczyn dwóch liczb pobieranych z komórek A1 i C1. W komórkach B1 i D1 powinny być drukowane odpowiednio znaki mnożenia i równości. 3. Napisz makro drukujące w komórce E1 iloraz dwóch liczb pobieranych z komórek A1 i C1. W komórkach B1 i D1 powinny być drukowane odpowiednio znaki dzielenia i równości. W przypadku, dr Piotr Borkowski 8/10
gdy wartość pobierana z komórki C1 byłaby zerem, zamiast wyniku powinien wyświetlić się komunikat: Nie dziel cholero przez zero. 4. Napisz makro wyznaczające pole prostokąta. Przy wprowadzeniu i wyprowadzeniu danych użyj funkcji InputBox i MsgBox. Pamiętaj, że pole nie może być wartością ujemną. 5. Napisz makro wyznaczające pierwiastki równania kwadratowego. Przy wprowadzaniu i wyprowadzaniu danych użyj funkcji InputBox i MsgBox. Pamiętaj, że gdy współczynnik przy niewiadomej w najwyższej potędze jest zerem, to równanie nie jest równaniem kwadratowym. 6. Napisz makro wyznaczające silnię z liczby naturalnej. Przy wprowadzeniu i wyprowadzeniu danych użyj funkcji InputBox i MsgBox. Omiń warunek sprawdzania czy wprowadzona liczba jest naturalna. 7. Napisz makro wyznaczające sumę elementów leżących na przekątnej macierzy kwadratowej o wymiarach 4 4, gdzie dane są pobierane z komórek: A1, A2, A3, A4, B1, B2, B3, B4, C1, C2, C3, C4, D1, D2, D3, D4, zaś wynik drukowany jest przy użyciu funkcji MsgBox. 8. Napisz makro wyznaczające sumę elementów leżących na przekątnej macierzy kwadratowej o wymiarach n n (n jest wprowadzane przy użyciu funkcji InputBox), gdzie dane są pobierane z komórek arkusza, zaś wynik drukowany jest przy użyciu funkcji MsgBox. 9. Napisz makro drukujące w komórce D1 pole trójkąta o współrzędnych wierzchołków pobieranych z komórek: A1, B1, A2, B2, A3, B3. Wykorzystaj do tego wzór Herona. 10. Napisz makro drukujące w arkuszu tabliczkę mnożenia poczynając od komórki B2. 11. Napisz makro wyznaczające sumę dwóch macierzy o wymiarach n m (n i m są wprowadzane przy użyciu funkcji InputBox), gdzie dane są pobierane z komórek Arkusza1 i Arkusza2, zaś wynik drukowany w Arkuszu3. 12. Napisz makro wyznaczające iloczyn dwóch macierzy o wymiarach n1 m1, n2 m2 (n1, n2, m1, m2 są wprowadzane przy użyciu funkcji InputBox), gdzie dane są pobierane z komórek Arkusza1 i Arkusza2, zaś wynik drukowany w Arkuszu3. Pamiętaj, że nie zawsze dwie macierze można przez siebie pomnożyć. 13. Napisz makro drukujące w arkuszu wartości funkcji: sinus, cosinus, tangens, cotangens dla argumentów od 0 do 90 stopni. 14. Napisz makro wyznaczające pole wspólnej części dwóch prostokątów, których po dwa boki są równoległe do osi OX i dokładnie jeden wierzchołek jednego z prostokątów, znajduje się we wnętrzu drugiego prostokąta. Współrzędne wierzchołków pierwszego prostokąta są pobierane z komórek: A1, B1, A2, B2, A3, B3, A4, B4 w taki sposób, że kolejne komórki zawierają współrzędne wierzchołków, rozpoczynając od lewego górnego, a kończąc na prawym górnym. Podobnie pobieraną mają być współrzędne wierzchołków drugiego prostokąta z komórek: A5, B5, A6, B6, A7, B7, A8, B8. Wynik ma być wydrukowany w komórce D1. 15. Napisz makro zmieniające liczby na tekst według poniższego wzoru: tak aby użytkownik najpierw podawał długość kodu liczbowego (za pomocą funkcji InputBox), a następnie poszczególne jego składowe. Wynik ma być wyprowadzony za pomocą funkcji MsgBox. W następnej kolejności odszyfruj kryptogram: 16. Napisz makro na wzór stworzonego w poprzednim punkcie, które szyfruje tekst według klucza przez siebie wymyślonego. Następnie zaszyfruj dowolny tekst. 17. Napisz makro, za pomocą którego można odszyfrować kryptogram stworzony w poprzednim punkcie. 18. Napisz makro sprawdzające czy dana liczba jest naturalna. Przy wprowadzaniu i wyprowadzaniu danych użyj funkcji InputBox i MsgBox. 19. W oparciu o stworzone w poprzednim punkcie makro, napisz funkcję zwracającą daną typu Boolean, która sprawdza czy jej argument jest liczbą naturalną, a następnie uzupełnij o tą funkcję, makro wyznaczające silnię z liczby naturalnej. 20. Przerób formularz przeliczający walutę euro na złotówki, tak, aby wykonywał operację odwrotną. 21. Zaprojektuj prosty kalkulator z funkcjami przedstawionymi na rysunku. dr Piotr Borkowski 9/10
dr Piotr Borkowski 10/10