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