reagowanie na błędy

Transkrypt

reagowanie na błędy
REAGOWANIE NA BŁĘDY
Czasem tworząc makra spodziewamy się błędów, które mogą wystąpić i chcemy na nie reagować.
Przykładowym błędem będzie próba otworzenia pliku, który nie istnieje, lub nadanie arkuszowi nazwy,
którą ma inny arkusz.
Standardowo, gdy wystąpi błąd - makro zostaje wstrzymane i pojawia się komunikat o błędzie.
Reagowanie na błędy pozwala zastąpić komunikat Excela dowolnymi poleceniami.
Przed linią, w której spodziewamy się błędu można wstawić komendę:
On Error Resume Next
Oznacza ona, że błędy od tego momentu będą ignorowane, tzn. po wystąpieniu błędu makro przejdzie
do następnej komendy. Może być użyteczna w sytuacji, gdy otworzenie pliku pociąga za sobą
otworzenie kilku innych plików, co do których nie mamy pewności czy nadal istnieją. Pliki
nieistniejące nie zostaną otworzone.
W momencie gdy nie spodziewamy się kolejnych błędów w makrze należy z powrotem włączyć
reagowanie na błędy komendą:
On Error GoTo 0
Jest to ważne szczególnie wtedy, gdy testujemy działanie makra. Informacja o tym, że błąd wystąpił
umożliwia jego poprawienie.
Przykładem może być makro umieszczone w module ThisWorkbook:
Private Sub Workbook_Open()
On Error Resume Next
Workbooks.Open Me.Path & "\Plik1.xls"
Workbooks.Open Me.Path & "\Plik2.xls"
On Error GoTo 0
End Sub
Czasem chcemy sprawdzić czy błąd wystąpił. Do tego używa się polecenia: Err.Number,
które zwraca numer ostatniego błędu. Jeżeli do danego momentu nie wystąpił żaden błąd
Err.Number jest równe 0. Jeżeli wystąpił jakiś błąd Err.Number jest różne od 0. Ponieważ
zmienna Err.Number kryje w sobie nr ostatniego błędu który wystapił, w sytuacji gdy
spodziewamy się błędów w kolejnych liniach należy tą zmienna wyczyścić poleceniem
Err.Clear.
Korzystając z tych poleceń można zmodyfikować makro otwierające pliki dodając
komunikat o tym, że dany plik nie istnieje:
Private Sub Workbook_Open()
On Error Resume Next
Workbooks.Open Me.Path & "\Plik1.xls"
If Err.Number <> 0 Then MsgBox "Nie można otworzyć pliku Plik1.xls"
Err.Clear
Workbooks.Open Me.Path & "\Plik2.xls"
If Err.Number <> 0 Then MsgBox "Nie można otworzyć pliku Plik2.xls"
On Error GoTo 0
End Sub
Czasem ignorowanie błędów nie jest wystarczającym sposobem reagowania na nie. Jeżeli
chcemy stworzyć własny sposób reagowania na błędy należy na końcu modułu umieścić
obszar z komendami, które zostaną wykonane gdy błąd się pojawi, a w makrze umieścić
linię On Error GoTo NazwaObszaru.
Przykładowo, jeżeli Plik1 nie istnieje dalsze wykonywanie makra nie ma sensu. Można
wtedy zmodyfikować makro następująco:
Private Sub Workbook_Open()
On Error GoTo BrakPliku
Workbooks.Open Me.Path & "\Plik1.xls"
Exit Sub
BrakPliku:
MsgBox "Plik1.xls znajduje się w innej lokalizacji, lub nie istnieje"
Exit Sub
End Sub
Przed obszarem reakcji na błędy powinno się znaleźć polecenie Exit Sub. Inaczej komendy z
tego obszaru będę wykonywane nie tylko w momencie wystąpienia błędu ale również jak
zwykłe polecenia w makrze.
Blok obsługi błędów może kończyć się jednym z poniższych poleceń:
- Exit Sub, gdy wystąpienie błędu ma pociągnąć za sobą zakończenie makra,
- Resume Next, gdy po wystąpieniu błędu i wykonaniu poleceń z bloku błędu należy
wrócić do kolejnych poleceń w makrze. Po tym poleceniu należy także umieścić
polecenie Exit Sub.
BLOK POLECEŃ
W podobny sposób jak bloki obsługi błędów można tworzyć bloki poleceń.
Zaczynają się one od nazwy bloku po której stawia się dwukropek. W kolejnej linii
zaczynają się komendy bloku poleceń. Taki blok kończy się poleceniem Return.
Aby przejść do bloku poleceń należy użyć komendy GoSub NazwaBloku. Komenda Return
umieszczona na końcu bloku powoduje przejście do linii za za linią z komendą GoSub (w
przypadku gdy takich komend jest więcej do linii z ostatnio wywołaną komendą GoSub).
Private Sub Workbook_Open()
Dim NazwaPliku As String, Wks As Worksheet, i As Integer
Set Wks = Worksheets("Pliki")
i=1
Do While Cells(i, 1).Value <> ""
NazwaPliku = Cells(i, 1).Value
On Error Resume Next
Workbooks.Open Me.Path & "\" & NazwaPliku
If Err.Number <> 0 Then GoSub BrakPliku
Err.Clear
i=i+1
Loop
Exit Sub
BrakPliku:
MsgBox NazwaPliku & " znajduje się w innej lokalizacji, lub nie istnieje"
Return
End Sub
TABLICE
Bardzo przydatnymi danymi są tablice. Deklarujemy je podobnie do zmiennych, z tą różnicą, że po
nazwie zmiennej podajemy dodatkowo wymiary tablicy. Standardowo elementy w tablicach
numerowane są od zera (choć można to zmienić, wstawiając na górze modułu linię OptionBase 1,
dzięki czemu elemnty tablic będą numerowane od 1). Aby ustalić samodzielnie zakres indeksów w
tablicy podajemy dla każdego wymiaru zakresy górny i dolny. Na przykład:
Dim Tablica_1 (7) as String, Tablica_2 ( 3 To 7 ) as Double
Dim Tablica_3 (4, 5 To 7) as Integer
Tablica_1 będzie zawierać osiem wierszy numerowanych od 0 do 7, Tablica_2 będzie zawierać 5
wierszy numerowanych od 3 do 7, a Tablica_3 bedzie zawierać pięć wierszy numerowanych od 0 do 4
i trzy kolumny numerowane od 5 do 7.
Aby wpisać jakąś daną do tablicy odwołujemy sie do odpowiedniego elementu tablicy używając
indeksów dla każdego wymiaru:
Tablica_1(3)=”Anna”
Tablica_3(1,6)=12.567
W ten sam sposób pobieramy elementy z tablicy.
Znacznie częściej wykorzystywane są tablice dynamiczne, deklarowane bez podawania wymiarów.
Dim Tablica_Dyn as Variant
Takiej tablicy możemy przypisywać wartości z zakresów w arkuszach:
Tablica_Dyn=Range(„A1:D8”)
Po wykonaniu tego polecenia Tablica_Dyn będzie miała osiem wierszy i cztery kolumny, numerowane
od 1 do 8 i od 1 do 4 odpowiednio. Dodatkowo, można taką tablicę wykorzystać do przekazania
danych z arkusza na przykład do wykresu (serie danych na wykresach zapisane sa w tablicach), lub do
pola listy ListBox. Przykłady takiego wykorzystania tablic znajdą Państwo w pliku excela Wykresy.xls
w module mTablice.
Dużą zaletą tablic dynamicznych jest możliwość zmiany ich wymiarów w trakcie działania makra. Do
teog uzywamy polecenia Redim, po którym podajemy nowe wymiary tablicy:
Redim Tablica_Dyn(1 to 10, 4)
Jeżeli zmieniając wymiary chcemy zachować wartości, które już zostały wpisane do tablicy używamy
słowa Preserve. Trzeba jednak pamiętać, że aby zachować wcześniej wpisane dane możemy tylko
zmieniać ostatni spośród wszystkich wymiarów tablicy na większy zakres.
Przykładowo:
Tablica_Dyn = Range(„A1:B4”)
Redim Preserve Tablica_Dyn(1 To 4,1 To 5)
Aby odczytać górny (dolny) zakres odpowiedniego wymiaru tablicy używamy komendy UBound
(LBound odpowiednio) z dwoma parametrami – nazwą tablicy i numerem wymiaru (wymiary
numerowane są od 1.
Przykładowo, dla powyższej tablicy Tablica_Dyn polecenie UBound(Tablica_Dyn,2) zwróci wartość
5, a LBound(Tablica_Dyn,1) wartość 1.
WYKRESY
Makra tworzące wykresy najlepiej jest nagrać, ponieważ w różnych wersjach excela dostępne są różne
typy wykresów. Stworzony wykres warto przypisać zmiennej typu Chart.
W makrze nagranym w Excelu 2003 i wcześniejszych wykres jest wstawiany komendą: Charts.Add.
Dodatkowo polecenie to zwraca jako wynik obiekt typu chart, dzięki czemu można nowy wykres
przpisać zmiennej za pomocą linii:
Set Wykres = Charts.Add
W nowszych wersjach Excela powyższa komenda zadziała, ale jeżeli chce się skorzystać z makra
nagranego będzie ono zaczynało się od polecenia ActiveSheet.Shapes.AddChart
Komenda ta zwraca obiekt typu Shape. Jeżeli chcemy wyłapać obiekt typu wykres należy to zrobić za
pomocą dwóch poleceń:
ActiveSheet.Shapes.AddChart
Set Wykres=ActiveChart
W starszych wersjach Excela wykres jest umieszczany najpierw jako osobny arkusz, i dopiero potem
jest przenoszony do jednego z arkuszy z danymi. Zmiana położenia wykresu, za pomocą metody
Location usuwa wykres i tworzy taki sam wykres w innej lokalizacji. W tym momencie znika obiekt
na który wskazywała zmienna wykres, i trzeba przypisać jej obiekt raz jeszcze.
Kolejnymi koniecznymi do ustalenia elementami wykresu są typ wykresu i źródło danych. Typ
wykresu zmieniamy za pomocą własności ChartType.
Dane na których oparty jest wykres podajemy za pomocą komendy SetSourceData w parametrami są
zakres z danymi oraz kierunek odczytywania danych (serie danych mogą być umieszczone w
kolumnach bądź w wierszach)
Przykładowe makro wstawiające wykres to:
Sub Wykres_Zmiany()
Dim Wykres As Chart
Set Wykres = Charts.Add
Wykres.ChartType = xlColumnClustered
Wykres.SetSourceData Source:=Sheets("2006").Range("A1:B13"), PlotBy:= _
xlColumns
Set Wykres = Wykres.Location(Where:=xlLocationAsObject, Name:="2006")
End Sub
Wykres nie jest umieszczony bezpośrednio w arkuszu, tylko w „pudełku” typu ChartObject. Do
obiektu zawierającego wykres trzeba się odwołać aby zmienić położenie w arkuszu oraz wymiary
wykresu. Przykładowo, jeżeli chcę zmienić wysokość wykresu skorzystam z własności Height, dla
obiektu ChartObject, związanego z wykresem.
Dim WykresObiekt as ChartObject
Set WykresObiekt=Wykres.Parent
WykresObiekt.Height=150
Podobnie, jeżeli chcemy za pomocą makra zmienić właściwości wszystkich wykresów umieszczonych
w arkuszu odwołamy się do związanej z arkuszem kolekcji ChartObjects i dopiero poprzez te
elementy odwołamy się do elementów typu Chart.
Sub Wykresy_Przegladanie()
'to makro dla wszystkich wykresów w aktywnym arkuszu zmieni
'wysokość wykresu i jego typ
Dim WykresObiekt As ChartObject, Wykres As Chart
For Each WykresObiekt In ActiveSheet.ChartObjects
WykresObiekt.Height = 150
Set Wykres = WykresObiekt.Chart
Wykres.ChartType = xlLine
Next WykresObiekt
End Sub
SERIE DANYCH
Na wykresach prezentowane są serie danych. Serie tworzą kolekcję Series (związaną z wykresem).
Każda seria, oprócz właściwości takich jak nazwa, zakres danych, typ wykresu, zawiera tablicę Values,
którą możemy modyfikować, tak jak inne tablice. Przykładowo wartości serii możemy przypisać
zmiennej Tablica:
Tablica=Chart.Series(1).Values
Po zmianie wymiaru Tablicy (np. po dopisaniu do niej kilku danych) można ją z powrotem przypisać
serii danych z wykresu:
Chart.Series(1).Values=Tablica

Podobne dokumenty