Visual Basic – Obsługa błędu
Transkrypt
Visual Basic – Obsługa błędu
Visual Basic – Obsługa błędu 1. Program wykonuje linie po kolei, jeżeli chcemy mieć wpływ na kolejność 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”) Jeżeli w dowolnym miejscu programu wpiszemy instrukcję GoTo okienko Program przeskoczy do tej linii (do przodu lub do tyłu). 2. Uruchom makropolecenie 5, ale zamiast liczby podaj wartość tekstową. Reakcja programu na błąd może być kontrolowana przez On Error Instrukcje Z reguły instrukcją jest przekserowanie programu do innej linii, która „obsłuży błąd”. Jako przykład takiego działania uzupełnij makropolecenie 5 zgodnie ze wzorem poniżej(szare linie powinny się w nim już znajdować). 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”) 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”. 3. Po wprowadzeniu komendy i= MsgBox( "Treść komunikatu", Przyciski, "Tytuł okna", ”Help”, ”Context”) użytkownik udziela odpowiedzi (klikając jeden z przycisków). Odpowiedź ta jest zapisywana w zmiennej i jako liczba całkowita 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). 4. Aby sterować działaniem programu w zależności od reakcji użytkownika potrzebne są tzw. instrukcje warunkowe: Sub warunek() If warunek Then Dim n As Integer Instrukcje które mają być wykonane n = MsgBox("Odpowiedź Tak lub Nie", 4, gdy warunek jest spełniony "Pytanie") Else: instrukcje gdy warunek If n = 6 Then niespełniony MsgBox ("Odpowiedziałeś Tak") End If Else MsgBox ("Odpowiedziałeś Nie") Przetestuj działanie instrukcji If na End If przykładzie po prawej stronie End Sub. 5. Udoskonalimy Makro5. a. Zastąp komunikat w linii blad: na komunikat pytający „Czy chcesz ponownie wprowadzić dane?”. Pamiętaj o zaprojektowaniu okna z przyciskami Tak/Nie b. Jeżeli odpowiedz brzmi Tak skieruj instrukcją GoTo ponownie do linii wprowadzania danych InputBox (należy uprzednią tę linię nazwać). c. Sprawdź działanie programu, spróbuj dwukrotnie wprowadzić błąd. Przy powtórnym popełnieniu błędu wpisywania danych Komenda On Error GoTo blad nie przekierowuje już do linii blad. 6. Aby uzyskać wielokrotną kontrolę błędu należy rozbić nasze makropolecenie na dwa kawałki. Instrukcja do wywołania makra przez inne to Call Napiszemy makropolecenie które kontroluje popełnienie błędu, informuje o tym użytkownika i odnotowuje jego reakcję: Sub blad() Sub MakroGlowne() On Error GoTo blad start: Call blad X = InputBox("…………….") If n = 6 Then GoTo start Y=…… MsgBox(“Wynik =”&y) Exit Sub End Sub blad: n = MsgBox(………..) End Sub MakroGłówne 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! Dla programu n w każdym z makr jest traktowane jako osobna zmienna. Podobnie y. Tym samym odpowiedź użytkownika nie jest „przenoszona” między makrami. Aby to zmienić należy obie zmienne zadeklarować globalnie, poza makrami. Wybieramy w prawym górnym rogu Declarations i piszemy deklaracje Dim poza makrami: