Makropolecenia – podstawy
Transkrypt
Makropolecenia – podstawy
Makropolecenia – podstawy 1 Uruchom program Excel. Otwórz nowy dokument i przejdź do menu Deweloper. 2 Makropolecenie (w skrócie makro) to sekwencja czynności którą możemy powtarzać automatycznie. Najprostszą metodą tworzenia makropoleceń jest ich nagrywanie. Stworzymy makropolecenie generujące sześć liczb losowych ze zbioru {1,2,3, …, 49}. W tym celu: a. Uruchom przycisk Zarejestruj makro, b. Wprowadź własną nazwę makra zawierającą cyfrę 1 np. Zbyszek1 (unikaj nazw automatycznie proponowanych w stylu Moje1, Makro1 itp.), wybierz Przechowuj makro w: Ten skoroszyt, potwierdź OK., c. W komórce B2 wprowadź formułę =Zaokr.do.całk(49*los()+1) – funkcja ta losuje liczbę całkowitą ze zbioru {1,…,49}, d. Skopiuj całą formułę do pięciu kolejnych komórek poniżej przeciągając prawy dolny róg, e. Następnie: i. zaznacz blok 6 komórek, które właśnie wypełniłeś, ii. wybierz kopiuj, iii. kliknij prawym klawiszem myszki i wybierz wklej specjalne (na tym samym bloku komórek B2:B7), iv. zaznacz Wartości, v. potwierdź OK, vi. naciśnij klawisz Esc. f. Wybierz przycisk Zatrzymaj rejestrowanie. Twoje Makropolecenie zostało zapisane. 3 Wyczyść całą zawartość arkusza. Sprawdź działanie Twojego Makra. a. Aby uruchomić Makro należy wybrać przycisk Makra, zaznaczyć swoje Makro i przycisk Uruchom. Jeżeli Makro nie działa poprawnie powtórz punkt 2. 4 Zapisz plik, pamiętaj aby wybrać typ pliku Skoroszyt Excel z obsługą makr. 5 Zamknij Excela. Ponownie uruchom Excela, otwórz zapisany plik i uruchom Makro. Jeżeli Makra nie ma, prawdopodobnie nie wybrałeś w punkcie 4 typu pliku z obsługą Makr. W takiej sytuacji musisz ponownie wykonać punkty 2-4. Ogólne informacje 1. Zasady budowy Makropolecenia: a. makro zaczynamy od komendy Sub NazwaMakra, a kończymy End Sub, b. w jednej linijce znajduje się nie więcej niż jedna komenda, ale jedna komenda może zajmować wiele linijek, c. Linijka poprzedzona znakiem ‘ jest ignorowana przez program, znaku tego używamy w dwóch celach: i. aby umieścić własny komentarz w programie np. ‘ to makro stworzyłem dnia 1 października 2012, ii. modyfikując makra, nie usuwamy starej wersji komend ale poprzedzamy je znakiem ‘ . Jeżeli po modyfikacji makro nie działa poprawnie, łatwo jest przywrócić poprzednią wersję usuwając znaki ‘. 2. Podstawowe komendy składają się z dwóch członów oddzielonych kropką, np. Range(”A7”).Select – pierwszy człon - Range(”A7”) wskazuje miejsce (tu komórkę B7), drugi człon Select określa działanie (tu zaznaczenie komórki). W tym wypadku cała komenda odpowiada zaznaczeniu (kliknięciu) komórki B7. Ogólnie: a. Pierwszy człon (nazwany obiektem) często wskazuje miejsce wykonania operacji, zaliczają się tu: i. Range(”…. ”) –wskazuje komórkę lub zakres komórek zapisanych w nawiasie między znakami ” ”, ii. ActiveCell –jest to adres zaznaczonej komórki, z poziomu pisania makra, może być zmieniona np. poleceniem Select (patrz poniżej), iii. Selected – obszar zaznaczony – określany podobnie jak ActiveCell, b. Drugi człon (nazwany metodą) określa rodzaj operacji do wykonania: i. Select –zaznacza komórkę lub blok wskazany w pierwszym członie, po wykonaniu tej komendy Selected wskazuje na ten blok, a ActiveCell na pierwszą komórkę w bloku, ii. FormulaR1C1 – jedna z opcji wprowadza formuł do komórek, iii. Value – wprowadzanie wartości do komórek, iv. "=INT(49*RAND()+1)"- jest to zawartość =Zaokr.do.całk(49*los()+1) – polecenia INT i RAND są przetłumaczeniem funkcji z Excela do VB v. Copy – kopiuj, vi. Paste – wklej, vii. Clear – wyczyść zawartość, viii. Delete – usuń komórki. Uwaga ! Nie wszystkie obiekty współpracują z wszystkimi metodami. Przykłady: 1. Ustaw się poniżej nagranego makropolecenia, i wpisz Sub Przykład1 (potwierdź Enter). Następnie pomiędzy liniami Sub a End Sub dopisz dwie linie aby uzyskać: Sub Przykład1() Range(”B7”).Select ActiveCell.Value=”Jan Kowalski” End Sub Pierwsza linia deklaruje makro, Druga linia powoduje przejście do komórki B7 ( odpowiada to kliknięciu na komórce B7 w Excelu). Od tego momentu ActiveCell wskazuje na komórkę A7, Trzecia linia wpisuje do komórki aktywnej (a więc w tym wypadku A7) - Jan Kowalski. Czwarta linia zamyka Makropolecenie. 2. Napisz kolejne makropolecenie: Sub Przykład2() Range(”B7”).Value=”Jan Kowalski” End Sub Podobnie jak poprzedni do komórki B7 zostanie wpisany tekst, ale bez przechodzenie do tej komórki. 3. Celem tego punktu jest zaprezentowanie działania obiektu ActiveCell. Przejdź do Excela, usuń całą zawartość arkusza, ustaw się w komórce A1 i uruchom makro Przykład2, a następnie napisz abc. Tekst „abc” powinien pojawić się w komórce A1. Następnie usuń całą zawartość arkusza, uruchom makro Przykład1, a następnie napisz tekst abc. Tekst powinien pojawić się w komórce B7, usuwając Jan Kowalski. 4. Makropolecenie nagrane powinno być zbliżone do poniższego: Sub Makro1() ' ' Makro1 Makro ' ' Range("B2").Select ActiveCell.FormulaR1C1 = "=INT(49*RAND()+1)" Range("B2").Select Selection.AutoFill Destination:=Range("B2:B7"), Type:=xlFillDefault Range("B2:B7").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub 5. Komenda Range(„…”).Value pozwala zarówno wprowadzać, jak i pobierać wartości z/do komórki: a. Range(„B1”).Value=”xxx” wprowadza xxx do komórki B1, b. …= Range(„B1”).Value użyje zawartości komórki B1 do wyrażenia po lewej stronie np. Range(„B2”).Value= Range(„B1”).Value wprowadzi do komórki B2 wartość z komórki B1, usuwając starą zawartość B2 6. Wprowadzając wartość do komórki przy użyciu komendy Range(„…”).Value możemy używać prostych formuł jak dodawanie wartości również tekstu. Testy łączymy znakiem & np. a. Komendy Range(„B1”).Value=”xxx” Range(„B2”).Value= “y” & Range(„B1”).Value & “z” spowoduje wpisanie do komórki B2 tekstu “yxxxz”. b. Komenda Range(„B2”).Value= Range(„B2”).Value & Range(„B1”).Value spowoduje dołączenie do zawartości komórki B2 zawartość komórki B1 7. Napisz makropolecenie o nazwie ankieta które wprowadzi do komórki C10 Twoje imię, a do komórki D10 Twoje nazwisko. Następnie w komórce C11 imię i nazwisko przedzielone spacją jako sumę komórek C10 i D10. 8. (*) Na podstawie instrukcji opisanych poniżej napisz makropolecenie które pobiera z komórki A15 imię i nazwisko rozdzielone spacją, a następnie wpisuje do komórki A16 samo imię a do komórki B16 samo nazwisko. InStr(„tekst źródłowy”, „tekst szukany”) wyszukuje pozycji jednego tekstu w drugim. Len(”tekst”) zwraca długość tekstu. Left(„tekst”,n) lub Right(„tekst”,n) odcinają n znaków licząc odpowiednio od początku lub końca. Visual Basic - Zmienne 1. 2. Pisząc makropolecenia lub funkcje obliczone wartości przechowujemy w zmiennych. Zmienne deklarujemy komendą: Dim nazwa_zmiennej As typ zmiennej, Gdzie: nazwa zmiennej to nazwa własna, np. x lub dane typ_zmiennej – rodzaj wartości (tekstowe, liczbowe itd.) szczegóły na drugiej stronie Przykłady: Dim X As Integer – zarezerwuje nazwę X dla liczb całkowitych. Dim X, Y As Double – zarezerwuje nazwy X oraz Y dla liczb rzeczywistych. 3. Napiszemy makropolecenie o nazwie Ankieta2 które pobiera od użytkownika Imię i nazwisko, a następnie zwraca go jako komunikat: a. Zadeklarujemy zmienne: Dim imie, nazwisko, osoba As String b. Pobierzemy dane od użytkownika: Imie=InputBox("Podaj swoję imię", "Dane osobowe") c. W analogiczny sposób zapytaj o nazwisko d. Połącz pobrane dane komendą Osoba=imie & „ ” & nazwisko e. Zwróć w formie komunikatu wynik komendą MsgBox(osoba) UWAGA! Zasadniczo każdy program składa się z trzech etapów: I – pobranie danych (operacje wejścia), II – Wykonanie obliczeń lub inne działanie programu, III – Zwrócenie wyniku (operacje wyjścia). Dane możemy pobierać/zwracać również z/do komórek: X=Range(„ „).Value – wprowadzi do zmiennej X zawartość komórki, Range(„ „).Value=X – wprowadzi do komórki zawartość zmiennej X. 4. Napisz Makropolecenia o nazwie Przekrój obliczające pole przekroju rury o zadanej średnicy. Wynik ma być wprowadzony do wybranej komórki. W tym celu: a. Zadeklaruj zmienne D i P typu rzeczywistego podwójnej precyzji (komenda Dim), b. Pobierz wartość argumentu D komendą InputBox (użyj stosownych opisów), c. Oblicz wartość funkcji za pomocą formuły P=3,14*D^2/4 (jeżeli chcemy użyć dokładniejszej wartości π, użyj Excel.WorksheetFunction.Pi). d. Wprowadź wynik do wybranej komórki (np. B2) komendą Range(”…”).Value=P. 5. Napisz Makropolecenie obliczające średnią z dwóch liczb. a. NIE deklaruj zmiennych x, y typu Double, b. Pobierz wartości x, y od użytkownika, c. Oblicz wartość średniej do komórek B6 i B7 formułami: Range("B6").Value = (0 + x + y) / 2 Range("B7").Value = (x + y) / 2 d. Sprawdź działanie makropolecenia na liczbach 1 i 2, e. Zapoznaj się z działaniem instrukcji CTyp – część teoretyczna, a następnie popraw makropolecenie. f. Usuń instrukcje CDbl, ale zadeklaruj zmienne x,y typu Double. 6. (*) Napisz makropolecenie zamieniające miejscami zawartość komórek F10 i F12. Podstawa teoretyczna 1. 2. 3. 4. Typy zmiennych: a. Boolean – typ logiczny – możliwe dwie wartości True (prawda) lub False (fałsz), b. Integer – typ całkowity tak zwany krótki - liczby od -32 768 do 32 767, c. Long – typ całkowity tzw. długi – liczby około od – 2 mld do 2 mld, d. Single – typ rzeczywisty pojedynczej precyzji – mniejsza dokładność, e. Double – typ rzeczywisty podwójnej precyzji – większa dokładność, f. Date – typ Daty, g. Currency – typ walutowy, h. String*n – typ łańcuchowy – łańcuch znaków czyli tekst, gdzie n po * jest liczbą określającą długość tekstu, i. Range – zmienna typu tablicowego – wielowartościowa. Instrukcja InputBox powoduje wyświetlenie okna w którym użytkownik może wprowadzić dane Dane=InputBox(”Tekst z okienka” ; „Tekst z nagłówka”) Tekst wewnątrz okna ma poinformować użytkownika jakiego rodzaju dane ma podać (np. w jakich jednostkach itd.) Instrukcja Val(s) zamienia tekst na liczbę. Program Visual Basic „nie trzyma typu zmiennej”. Pomimo wcześniejszej deklaracji, może zmienić typ zmiennej z liczbowego na tekstowy. Wówczas np. 1+2=12. Z tego powodu istnieją instrukcje konwersji typu. Ogólna składnia to: CTyp(…) ( Convert to Typ). Np. x=CDbl(x) – zamienia x na wartość rzeczywistą podwójnej precyzji, y=CInt(y) – zamienia wartość na wartość liczbową całkowitą. Visual Basic – Komunikaty 1. Do wzajemnego komunikowania się programu z użytkownikiem służy komenda: MsgBox( "Treść komunikatu", Przyciski, "Tytuł okna”), Jest to komunikacja dwustronna: użytkownik czyta komunikat (odbiera informację) a następnie wybiera przycisk (przekazuje informacje). Program odpowiedź użytkownika musi gdzieś zapamiętać. Dlatego komendę MsgBox poprzedzamy zmienną np. x=MsgBox(…… Później możemy sterować działanie programu na zasadzie „ jeżeli x = 6 (czyli „Tak” patrz druga strona) to zrób …” 2. Aby sterować działaniem programu w zależności od reakcji użytkownika potrzebne są instrukcje warunkowe: If warunek Then Instrukcje które mają być wykonane gdy warunek jest spełniony Else: instrukcje gdy warunek niespełniony End If 2. W makro Ankieta 2 usuń linię MsgBox(osoba) a dopisz na końcu linie: I = MsgBox("Pan/Pani " & imie & " " & nazwisko, 4, "Potwierdź dane") If i=6 Then MsgBox(„Dziękuję za podanie danych”) Else MsgBox(„Popraw dane”) End If Dobrze napisany program w przypadku poprawki powinien sam ponownie wywołać okno wprowadzania danych. Na początku wybranej linii możemy wpisać nazwę własną a następnie dwukropek. Dopisz przed linią pobierającą imię np. Ta_linia: Imie=Inpu…… Jeżeli następnie w dowolnym miejscu programu użyjemy komendy GoTo Ta_linia Program przeskoczy do linii pobierania imienia. Dopisz taką linię po komendzie MsgBox(„Popraw dane”). 3. Ćwiczenie: Napisz makropolecenie które pobiera wartość stężenia zanieczyszczenia/ poziom rzeki etc. A następnie w oparciu o wybrane granice zwraca odpowiedni z komunikatów: a. Poziom w normie, b. Poziom podwyższony, c. Stan alarmowy. Zaopatrz okna komunikatów o stosowne ikony. Podstawa teoretyczna 1. Komenda MsgBox( "Treść komunikatu", Przyciski, "Tytuł okna”), Pozwala zaprojektować wygląd okna, w zależności od tego jaką liczbę zawiera parametr Przyciski. Liczba ta jest sumą trzech liczb odpowiadających za: i. Ilość i rodzaj przycisków: 0 tylko przycisk OK, 1 przycisk OK i Anuluj, 2 przyciski: Przerwij, Ponów próbę, Zignoruj, 3 przyciski: Tak, Nie, Anuluj, 4 przyciski: Tak i Nie, 5 przyciski: Ponów próbę i Anuluj. ii. Ikona obok komunikatu: 0 16 32 48 64 iii. Przycisk domyślny: 0 pierwszy przycisk, 256 drugi przycisk, 512 trzeci przycisk. Przykłady: MsgBox("Treść komunikatu", 257, "Tytuł okna") MsgBox("Treść komunikatu", 4 + 32 + 0, "Tytuł okna") 257=1+0+256 (przyciski OK i Anuluj, bez ikony, domyślny przycisk Anuluj) 4 + 32 + 0 (przyciski Tak i Nie, ikona „?”, domyślny przycisk Tak) 3. Po wprowadzeniu komendy i= MsgBox( "Treść komunikatu", Przyciski, "Tytuł okna”) Odpowiedź użytkownika jest zapisywana do zmiennej i zgodnie ze wzorcem: OK – 1 Przerwij3 Zignoruj -5 Anuluj 2 Ponów próbę - 4 Tak - 6, Nie -7 Zmienna i powinna być uprzednio zadeklarowana jako typ całkowity (integer). Funkcje - Ogólne informacje 1. Deklaracja funkcji: Function Nazwa_funkcji (Argument_1 As Typ, Argument_2 As Typ, …) As Typ …… Instrukcje ……. End Function UWAGA!!!!!!!!!!! Funkcje zapisujemy zawsze w modułach. Funkcja zapisana w arkuszu nie będzie w ogóle dostępna. Jeżeli część Modules jeszcze nie istnieje w danym pliku (zeszycie) należy wybrać Insert/Module. 2. Przeanalizuj poniższy przykład Function PierwiastekIloczynu (x,y As integer) As Double PierwiastekIloczynu=sqr(x*y) End Function 3. Linie deklaracji Function i End Function są pisane zamiast (!) Sub i End Sub. Ponadto linia Function spełnia wiele ról: i. Nazwa funkcji (w przykładzie ) jest jednocześnie zmienną typu zadeklarowanego za nawiasem. Jest to domyślna zmienna w której zostanie zapisana obliczona wartość funkcji. ii. Ponadto w nawiasie znajdują się zadeklarowane zmienne odpowiedniego typu będące argumentami funkcji. W przykładzie zadeklarowaliśmy dwie zmienne x i y typu całkowitego. Uwaga deklaracja zmiennych odbywa się dokładnie tak jak w makropoleceniach z tą różnicą, że nie piszemy komendy Dim. iii. Po uruchomieniu funkcji w Excelu linia deklaracji wywoła okno podobnie do komendy InputBox gdzie należy podać argumenty funkcji. UWAGA! Napisanie funkcji polega na wprowadzeniu lini obliczającej nazwa_funkcji= obliczenia wartości funkcji W przykładzie jest to linia PierwiastekIloczynu=sqr(x*y) Jeżeli funkcja za każdym razem oblicza 0 sprawdź czy nie ma różnicy (literówki) między nazwą funkcji po Function i nazwą zmiennej w linii obliczającej. Funkcje 1. Zapoznaj się z częścią teoretyczną. Następnie przepisz przykład z punktu 2, przejdź do Excela i uruchom kreatora funkcji jak pokazano na rysunku. Jeżeli funkcja została napisana w module, pojawi się kategoria funkcji użytkownika. Znajdziesz w niej swoją funkcję. 2. Napisz funkcję obliczającą pole przekroju rury o zadanej średnicy – Makropolecenie z poprzednich ćwiczeń, ale jako funkcja. 3. Każda funkcja utworzona w Excelu posiada krótki opis. Aby dodać opis funkcji przejdź do Excela, wybierz przycisk Makra. Pomimo, że lista zawiera tylko makra, okno to obsługuje również funkcje. Po wpisaniu w okno na górze nazwy funkcji, uaktywni się przycisk opcje – tam można dodać opis. 4. Dodaj sensowny opis działania stworzonej poprzednio funkcji. 5. (*) Napisz funkcję obliczającą wypływ przez przelew trójkątny, niezatopiony zgodnie ze wzorem Q 1.331tg 2 0.996 H 2.47 gdzie . Funkcja tangens to Tan( kąt). Ważne, funkcje trygonometryczne w Excelu liczą przy użyciu radianów. Dodaj stosowny opis funkcji mówiący o konieczności zamiany stopni na radiany i zakresach dla zmiennych. 6. Zwróć uwagę, że w przypadku funkcji nazwa zmiennej pojawia się w okienku wprowadzania danych. Dlatego powinna ona sugerować użytkownikowi co oznacza. Zdefiniuj funkcję o nazwie S_wazona2 obliczającą średnią ważoną dwóch liczb. b. Funkcja zależy od czterech argumentów typu Double, nazwijmy je: Liczba1, Waga1, Liczba2, Waga2. c. Wartość funkcji jest typu Double. d. Wzór na średnią ważoną Zmienne tablicowe i pętle - Ogólne informacje 1. Wprowadzanie danych dla średniej ważonej 3,4 lub więcej liczb byłoby dość uciążliwe. Wygodniej będzie podać wszystkie dane jako blok komórek – podobnie jak jest to robione np. dla funkcji suma służy do tego zmienna wielowymiarowa (typu tablicowego). Dim Zmienna As Range. Wartości zmiennej typu Range to bloki komórek. Tym samym zawierają wiele wartości. Do komórki w i-tym wierszu i j-tej kolumnie bloku (odpowiednik w macierzy aij) odwołujemy się przez Zmienna.Cells(i,j) Jeżeli blok komórek to np. B4:F8 to komórka zmienna. Cells(2,1) odwołuje się do komórki C4. Projektując funkcję/ makropolecenie nie wiemy jakiej wielkości blok zaznaczy użytkownik. Ta wielkość jest również zapisana w zmiennej jako: Zmienna.Rows.Count – liczba wierszy Zmienna.Columns.Count – liczba kolumn. 2. Pętle. Pętle służą do wykonywania sekwencji instrukcji pewną liczbę razy która może nie być zadany z góry. For licznik=początek To koniec step krok Instrukcje pętli Next licznik Jeżeli koniec jest zmienną, krotność wykonania pętli jest zmienna. W szczególności pętla For licznik=początek To zmienna.Rows.Count step krok Instrukcje pętli Next licznik Zostanie wykonana tyle razy ile wierszy zaznaczy użytkownik. Funkcje 2 - Zmienne tablicowe i pętle 1. 2. Zdefiniuj nową funkcję obliczającą średnią ważoną trzech liczb. Funkcja taka wymaga podania aż sześciu wartości, dlatego użyjemy zmiennej tablicowej typu Range. a. Zadeklaruj funkcję zależącą od jednego argumentu typu Range i o wartościach typu double b. Ustal, że pierwsza kolumna to liczby a druga to wagi (należy tę informację umieścić później w opisie funkcji). c. Wykorzystaj wzór analogiczny do średniej ważonej 2 liczb (do różnych wartości odnosimy się zmieniając odpowiednio numery w Cells. d. Dodaj opis funkcji e. Przejdź do Excela i wypełnij stosowny blok komórek liczbami i wagami. f. Sprawdź działanie funkcji. Napisz funkcję liczącą długość wektora w dowolnym wymiarze zgodnie ze wzorem a. b. c. 3. Zadeklaruj funkcję zależącą od jednego argumentu wektor typu Range i o wartościach typu double Wektor będzie zadawany jako blok komórek w jednym wierszu. Zwróć uwagę, że liczba zmiennych (wartość wymiaru) n to liczba komórek. Jeżeli zmienna nazywa się wektor to wartość wymiaru n ukryta jest w wektor.Rows. Count Jak stworzyć sumę nieznanej liczby wartości (n się zmienia)? Należy stworzyć pętlę która wykona się n razy za każdym razem dodając jeden element. W naszym wypadku będzie to następująca pętla For i=1 To n Suma=suma+wektor.cells(1,i)^2 Next i Docelową wersją funkcji średniej ważonej jest średnia ważona dowolnej ilości liczb. W takim przypadku nie wiemy z góry jak powinien wyglądać wzór (z ilu liczb należy liczyć średnią). Postępuj podobnie jak w punkcie 1 nazywając jeden argument tablicowy dane jednak wzór musimy podać z wykorzystaniem pętli: For i = 1 To dane.Rows.Count Step 1 Suma_iloczynow = Suma_iloczynow + dane.Cells(i, 1) * dane.Cells(i, 2) suma_wag = suma_wag + dane.Cells(i, 2) Next i S_wazona = Suma_iloczynow / suma_wag Visual Basic – Obsługa błędu 1. Uruchom makropolecenie przekrój z poprzednich zajęć, ale zamiast liczby wprowadź za średnicę dowolny tekst. Celem ćwiczenia jest skontrolowanie zachowania programu w przypadku zauważenia błędu. 2. Przeczytaj i przeanalizuj działanie przykładowego programu z obsługą błędu z drugiej strony. Przeanalizuj tabelkę. Następnie dodaj w podobny sposób obsługę błędu do makropolecenia przekrój. Dodatkowo makro powinno zareagować na ujemną wartość średnicy. Zmień komunikat błędu na „Należy podać wartość liczbową dodatnią.” Zwróć uwagę, matematycznie wzór jest prawidłowy dla wartości ujemnych, więc sama obsługa błędu nie zareaguje na wartość ujemną. Należy dopisać linię (instrukcja If) która przekieruje do linii błędu dla wartości ujemnych. 3. Sprawdź w teorii czym jest typ Variant a następnie przepisz poniższą funkcję: Function odwrotna(x As Double) As Variant On Error GoTo blad odwrotna = 1 / x Exit Function blad: odwrotna = "nieskończoność" End Function Sprawdź działanie funkcji dla 0, liczby różnej od zera i tekstu. Następnie zamień typ double na Variant i ponownie sprawdź działanie funkcji dla 0, liczby różnej od zera i tekstu. Czy jesteś w stanie wyjaśnić różnice w działaniu funkcji po zmianach? 4. Udoskonalimy makro przekrój, tak aby po wykryciu błędu program nie tylko zgłaszał komunikat błędu ale również pytał czy użytkownik chce wprowadzić zmiany. Przeprojektuj komendę blad: i= MsgBox("Nie podałeś wartości liczbowej", 48, „uwaga”) tak aby zadawała stosowne pytanie z przyciskami Tak/ Nie. Dopisz linię (instrukcja If) która w zależności od odpowiedzi opuści makropolecenie lub przekieruje do ponownego wprowadzenia danych. Podstawa teoretyczna 1. Sterowanie programem a. Nazywamy linie - na początku wybranych linii możemy wpisać nazwy własne z dwukropkiem np. okienko: i= MsgBox("Nie podałeś wartości liczbowej", 48, „uwaga”) b. Jeżeli w dowolnym miejscu programu wpiszemy instrukcję GoTo okienko program przeskoczy do tej linii. c. Dalsze sterowanie programem odbywa się przy użyciu funkcji jeżeli. 2. Obsługa błędu Jeżeli nie chcemy aby w wypadku błędnie wprowadzonych danych program reagował w sposób niezrozumiały dla użytkownika, możemy zadeklarować konkretne działanie w wypadku wystąpienia błędu instrukcją On Error polecenia Np. program Sub Makro() On Error GoTo blad X = InputBox("x=", "pobieranie zmiennej") Y=2*X+5 Range("A5").Value = Y Exit Sub blad: i= MsgBox("Nie podałeś wartości liczbowej", 48, „uwaga”) End Sub Jak to działa? On Error GoTo blad Linia ta określa procedurę jaką program ma wypełnić gdy zauważy błąd. W tym wypadku jest to przejście do linii oznaczonej blad: (i dalsze działanie). UWAGA: sama linia nie powoduje natychmiastowych efektów, jest to deklaracja w stylu: gdybyś kiedyś zauważył błąd to wtedy przejdź do linii….. X = InputBox("x=", Użytkownik podaje wartość. Są dwie możliwości: "pobieranie zmiennej") Użytkownik wprowadził Użytkownik nie wprowadził wartości wartość liczbową. Y=2*X+5 Range("A5").Value = Y Exit Sub blad: MsgBox("Nie podałeś wartości liczbowej", 48, „Uwaga”) Oblicza i wstawia za zmienną Y wartość wyrażenia. Wprowadza wartość zmiennej Y do komórki A5. Opuszcza makropolecenie. Linia nie jest wykonywana. Makropolecenie zostało zakończone linię wcześniej. liczbowej, w szczególności nie wprowadził żadnej wartości. Program próbując podstawić do formuły zauważa błąd. Zgodnie z wcześniejszą deklaracją przeskakuje do linii blad: Trzy linie programu są pomijane. Zgłasza komunikat – „Nie podałeś wartości liczbowej”. UWAGA! Zauważ różnicę: Exit Sub to inna instrukcja niż End Sub. 3. Zmienna typu Variant, jest to rodzaj Jokera – uniwersalny typ który dopasowuje się do wprowadzonych danych. 4. Spróbuj popełnić błąd w makropoleceniu przekrój po raz drugi. Problem polega na tym, że deklaracja On Error działa jednorazowo. Należy zatem po wykonaniu procedury błędu ponownie zadeklarować instrukcję On Error. Jest to możliwe tylko po ponownym uruchomieniu makropolecenia. Osiągniemy to poprzez rozbicie Makropolecenia Przekrój na dwa makropolecenia. 5. Wprowadź dwa makropolecenia: Sub PrzekrójGlowne() start: Call blad If n = 6 Then GoTo start MsgBox(“Wynik =”&P) End Sub Sub blad() n=1 On Error GoTo blad D = InputBox("…………….") P=…… Exit Sub blad: n = MsgBox(………..) End Sub Instrukcja Call blad powoduje uruchomienie wykonania makra blad. Przeanalizuj działanie programu: Makro Przekrój przywołuje makro blad, podejmuje działanie w zależności od rezultatu działania makra blad. Jeżeli odpowiedz użytkownika brzmiała Tak, makro główne ponownie uruchamia makro blad. UWAGA! Visual Basic traktuje zmienne lokalnie. Oznacza to, że dla programu n=6 w makro blad, ale niekoniecznie w makro Przekrój (są to dla VB różne zmienne). Podobny problem dotyczy zmiennej P. Dlatego chcąc „przenosić” wartości pomiędzy makropoleceniami należy zadeklarować tzw. Zmienne globalne. W tym celu wybieramy w prawym górnym rogu Declarations i piszemy deklaracje Dim poza makrami: Zadeklaruj stosowne zmienne globalnie. UWAGA! – nie wolno powtórzyć deklaracji zmiennej w makropoleceniu.