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: