VBA 2 HIERARCHIA OBIEKTÓW ODWOŁYWANIE SIĘ DO OBIEKTÓW WŁAŚCIWOŚCI OBIEKTÓW PĘTLE I INSTRUKCJE WARUNKOWE ZFPBIG LABORATORIUM Przypomnienie VBA Visual Basic for Application skryptowy język programowania wywodzący się z Visual Basic a (VB) zintegrowany z aplikacjami pakietu Microsoft Office i innych programach (np. AutoCAD, WordPerfect). Możliwości języka VBA można wykorzystać przede wszystkim do automatyzacji pracy z dokumentami używając makropoleceń. Możliwości VBA można rozbudowywać włączając dodatkowe biblioteki lub funkcje Windows API co pozwala na tworzenie bardzo rozbudowanych narzędzi z użyciem graficznego interface u użytkownika tak jak to ma miejsce w aplikacjach kompilowanych do pliku EXE. W języku VBA niestety nie można tworzyć samodzielnych skompilowanych plików z rozszerzeniem EXE. Kod programu (makro, procedura, funkcja) napisane w edytorze VBE (Visual Basic Editor [dostęp przez skrót ALT+F11] dostępny w pakiecie Office od wersji 2000+) zapisywane są bezpośrednio w otwartym dokumencie programu w którym wywołujemy wspomniany edytor. Dla aplikacji Excel będą to pliki *.XLS (do wersji 2003) lub *.XLSM (od wersji 2007+), natomiast dla aplikacji MS Word będą to pliki *.DOC (do wersji 2003) lub *.DOCM (od wersji 2007+). ----------------------------------- Excel bazuje na idei programowania obiektowego. Obiekt jest pewnego rodzaju pojemnikiem odzwierciedlającym jakiś element Excela. Jest on identyfikowany przez nazwę i zawiera: atrybuty (property) metody (methods) zdarzenia (events) Do obiektów nie odwołujemy się bezpośrednio, tylko przez ich atrybuty i metody. Obiekt.identyfikator[.identyfikator] Identyfikator może być: metodą, która wykonuje jakieś działanie (dokładnie tak jak procedura lub funkcja), atrybutem, który jest jakąś zwykłą wartością, lub kolejnym obiektem. W ten sposób możemy tworzyć cały łańcuszek, na którego końcu musi być jakiś atrybut lub metoda. HIERARCHIA OBIEKTÓW Obiekt Application (czyli excel) zawiera inne obiekty. Niektóre obiekty są kontenerami dla innych obiektów. Oto przykłady innych obiektów zawartych w obiekcie Application: 1. Workbooks (kolekcja wszystkich obiektów workbook skoroszyt) o Worksheets (arkusze) ChartObjects Range PageSetup (Ustawienia strony) PivotTable (Tabela przestawana) 1
o Charts (wykresy) o Names (nazwa) 2. Windows (kolekcja wszystkich obiektów window okno) Przez prawie cały czas pracy z Excelem jakieś obiekty są zaznaczone. Czyli zostały kliknięte przez użytkownika. Są to: ActiveCell - zaznaczona komórka, ActiveChart - zaznaczony wykres, ActivePrinter - domyślna drukarka, ActiveSheet - aktywny arkusz, ActiveWindow - otwarte okno ActiveWorkbook - wybrany skoroszyt Application Workbooks CommandBar Worksheet Functions Worksheets Buttons Range PivotTable ODWOŁYWANIE SIĘ DO OBIEKTÓW Aby odwołać się do obiektu należy podawać nazwy kwalifikowane, łącząc przy pomocy kropki nazwy poszczególnych obiektów. Worksheets("Arkusz1") sytuacji gdy otwarte są dwa skoroszyty a w każdym znich znajduje się Arkusz1, rozwiązanie polega na utworzeniu odwołania do obiektu poprzez zawarcie w nim nazwy jego kontenera. Workbooks("Zeszyt1"). Worksheets ("Arkusz1") Workbooks("Zeszyt1"). Worksheets ("Arkusz1").Range("A1") Application.( "Zeszyt1"). Worksheets ("Arkusz1").Range("A1") W większości przypadków można pominąć obiekt Application w odwołaniach, ponieważ jest on przyjmowany domyślnie. Jeśli obiekt Zeszyt1 jest aktywnym skoroszytem w odwołaniu można go również pominąć i zastosować następujące odwołanie: Worksheets ("Arkusz1").Range("A1") Range("A1") 2
Obiekt Range Większość pracy z Excelem polega na modyfikowaniu komórek. Prawie każdy element Excela ma odpowiadający sobie obiekt, w efekcie dużą część pracy w VBA wykonujemy przy pomocy zakresów (obiekt Range). Range może reprezentować: pojedynczą komórkę, wiersz, kolumnę, grupę komórek z zakresu ciągłego lub nie albo nawet zakres z kilku skoroszytów jednocześnie. Oznaczenie jednej komórki Worksheets("Arkusz1").Range("A1").Value = 1 Oznaczenie zakresu komórek ActiveSheet.Range("A1:A10").Value = 1 Worksheets("Arkusz1").Range("F1", "F10").Value = 10 Oznaczenie komórek nie sąsiadujących ze sobą Worksheets("Arkusz1").Range("A1, A2, A5") = 1 Cells Kolejna metoda do odwoływania się do zakresu polega na użyciu właściwości cells. Jest używana do obiektów Worksheet i Range. Obiekt.Cells(rowIndex, columnindex) Worksheets("Arkusz1").Cells(9, 9) = 22 Aby do komórki znajdującej się bezpośrednio poniżej aktywnej komórki wprowadzić tekst napis, należy użyć następującej instrukcji (rozpocznij od aktywnej komórki i traktuj ją jakby to była komórka A1. Następnie wpisz tekst napis w komórce znajdującej się w drugim wierszu i pierwszej kolumnie. ActiveCell.cell(2, 1) = "napis" Ta składnia może też zostać użyta w przypadku obiektu Range. W tym przypadku zwrócona komórka jest względna w stosunku do obiektu Range, do którego się odwołano. Jeśli np. obiekt Range jest zakresem A1:D10 (40 komórek), właściwość Cells może pobrać argumet o wartości z przedziału od 1 do 40 i zwrócić jedną z komórek obiektu Range. W przykładzie poniżej wartość 2000 jest wprowadzana do komórki A2, ponieważ jest to 5 komórka zakresu (licząc od góry i w prawą stronę a następnie od początku następnego wiersza): Range("A1:D10").Cells(5) = 2000 WŁAŚCIWOŚCI OBIEKTÓW Każdy obiekt ma swoje właściwości. Value Przykładowo obiekt Range posiada właściwość o nazwie Value. Poniższe makro, po uruchomieniu, będzie wyświetlać w oknie wartość komórki A1. Sub wartosckom() MsgBox Worksheets("Arkusz1").Range("A1").Value 3
ĆWICZENIE 1 Po wykonaniu procedury poniżej w komórce A1 arkusza Arkusz1 pojawi się wartość 123. Sub wartosckom() Worksheets("Arkusz1").Range("A1").Value = 123 Formula ĆWICZENIE 2 HasFormula W kolejnym przykładzie konstrukcja IF THEN została użyta do warunkowego wyświetlania okna dialogowego. jeśli w komórce A1 znajduje się jakaś formuła, to zostanie ona wyświetlona w oknie dialogowym za pomocą właściwości Formula obiektu Range, jeśli w komórce nie ma formuły nic się nie dzieje. Sub hasformula() If Worksheets("Arkusz1").Range("A1").hasFormula Then MsgBox Range("A1").Formula Właściwość Formula obiektu Range jest właściwością do odczytu i zapisu, stąd można umieścić formułę w wybranej komórce arkusza (Niestety musimy użyć wtedy angielskiej wersji formuły.): Sub wstawformule() Range("D12").Formula = "=RAND()*100" Sub wpiszdwa() Range("C1:C10") = 2 Name Name jest atrybutem Obiektu Worksheet i oznacza jego nazwę. Zmieniamy w ten sposób nazwę na "Zielony". Sub zmiennazwe() Worksheets(1).name = "zielony" W ten sposób nadajemy zmiennej NazwaArkusza wartość nazwy pierwszego arkusza i wyświetlany wynik w oknie dialogowym Sub PodajNazwe() NazwaArkusza = Worksheets(1).Name MsgBox NazwaArkusza METODY OBIEKTOWE Oprócz właściwości obiekty posiadają również swoje metody. Metoda to operacja wykonywana na obiekcie. Usunie zawartość komórek wraz z formatowaniem Sub wyczysc() Range("C1:C10").Clear Clear 4
ClearContents Aby usunąć wartości z zakresu I pozostawić formatowanie komórek, należy zastosować metodę obiektu Range o nazwie ClearContents Sub wyczysc() Range("C1", "C10").ClearContents Copy Poniżej zamieszczono przykład procedury kopiującej przy użyciu Copy obiektu Range zawartość komórki A2 z arkusza1 do komórki A2 w arkuszu2. Sub kopiuj() Worksheets("Arkusz1").Range("A2").Copy Worksheets("Arkusz2").Range("A2") W przykładzie poniżej posłużono się sekwencją (spacja za którą znajduje się znak podkreślenia) kontynuującą instrukcję w kolejnym wierszu. Sub kopiuj() Worksheets("Arkusz1").Range("A3").Copy _ Worksheets("Arkusz2").Range("A3") Select Zaznaczanie komórek - do zaznaczania komórek używamy metody Select. Worksheets(2).Range("B1:B15").Select Po wykonaniu powyższego przykładu zakres B1:B15 zostaje podstawiony pod obiekt Selection. Obiekt Selection jest typu Range, ma więc jego wszystkie atrybuty i metody. Sub zaznaczanie() Worksheets(2).Range("B1:B15").Select Selection.Value = 4 Add Niektóre metody przyjmują argumenty, wywołuje się je podobnie jak zwykłe procedury. Worksheets.Add Worksheets(1),, 1 Powyższa metoda dodaje nowy arkusz i może przyjąć cztery argumenty: 1. Before - przed którym arkuszem ma być dodany nowy, 2. After - po którym arkuszu ma być dodany nowy, 3. Count - ile arkuszów ma być dodanych 4. Type - jakiego typu mają być nowe arkusze Powyżej podano pierwszy i trzeci argument. Drugi i czwarty został pominięty, więc między przecinkami jest puste miejsce. Wszystkie argumenty, które znajdują się na końcu są już pominięte, nie trzeba stawiać przecinków, Excel domyśla się, że nie chcemy ich przekazać. Argumenty można też dodać poprzez nazwy, jest to szczególnie przydatne dla metod, które mają dużo, np. kilkanaście argumentów. Nie musimy wtedy stawiać dużo zbędnych przecinków. Instrukcję Worksheets.Add Worksheets(1),,, xlworksheet można tez zapisać: 5
Worksheets.Add before:=worksheets(1), Type:=xlWorksheet OPERATORY Operatorami nazywamy różnego rodzaju znaki i symbole, które sklejają razem instrukcje i słowa kluczowe. Są one bardzo istotne i użyte nieprawidłowo mogą całkowicie zmienić logikę kodu. Operator przyjmuje argumenty tworząc wyrażenia, argumentami operatorów mogą być kolejne wyrażenia itd. W ten sposób można tworzyć skomplikowane instrukcje. Wyrażenie 1 operator Wyrażenie 2 niektóre operatory przyjmują tylko jeden argument operator Wyrażenie Operator przypisania Dim zmienna1 As Integer Dim zmienna2 As Integer Dim zmienna3 As String Dim zmienna4 As Date zmienna1 = 1 zmienna2 = zmienna1 + 2 zmienna3 = "Programowanie w VBA" zmienna4 = MsgBox("Tak czy nie? ", vbyesno) Operator łamania linii Zwykle jedna linia równa się jednej linii kodu. Excel czytając nasz kod spodziewa się, że każda linia będzie zamkniętą logiczną całością. Długie linie kodu można dzielić operatorem " _". Składa się ze spacji i podkreślenia. Sub _ test() zmiennaa = "Bardzo długi i malo treściwy " & _ "tytul lektury szkolnej " & _ "do wypozyczenia w miejskiej " & _ "bibliotece publicznej" MsgBox zmiennaa Dwukropek Przed chwilą pisaliśmy jedną instrukcję w kilku liniach, można też napisać kilka krótkich instrukcji w jednej linii. Poszczególne instrukcje powinny być rozdzielone dwukropkiem. Oczywiście należy to robić tylko jeżeli nie zmniejszy to czytelności kodu. Sub jedenwiersz() Dim imie As String Dim nazwisko As String imie = "Jan": nazwisko = "Kowalski": MsgBox imie & " " & nazwisko Operator Łączenia tekstu Dwa fragmenty tekstu łączymy operatorem "&". Można w ten sposób łączyć kilka tekstów, zmiennych String, lub funkcji zwracających String. Sub zlacz() 6
Const Imie As String = "Jan" Const Nazwisko As String = "Kowalski" MsgBox Imie & " " & Nazwisko Operatory matematyczne VBA udostępnia nam wszystkie podstawowe działania matematyczne, uwzględniając standardową kolejność działań. Operator działanie kolejność przykład - Liczba ujemna 0-2 ^ Potęga 1 3^2 * Mnożenie 2 2*2 / Dzielenie 2 2/2 \ Dzielenie całkowite 3 7\2 =3 mod Reszta z dzielenia 4 7 mod 2 = 1 + dodawanie 5 2+2 - odejmowanie 5 2-2 Zmianę kolejności wykonywania działań możemy dokonywać przy pomocy nawiasów. "(" i ")". Operatory logiczne Różne wyrażenia zwracające wartości logiczne (True/False) możemy dodatkowo łączyć przy pomocy operatorów logicznych. Operator opis And Operator koniunkcji Or Operator alternatywy Not Operator przeczenia 7
JĘZYK VBA POSIADA KILKA INSTRUKCJI DO TWORZENIA PĘTLI WARUNKOWYCH: Instrukcja For... Next - pętla For... Next powtarza blok instrukcji określoną liczbę razy, stosujemy ją jeżeli z góry wiadomo ile razy pętla ma być wykonana. Pętle warunkowe Do...Loop - bardzo wygodnym narzędziem są pętle, służą one do wielokrotnego wykonywania danego bloku kodu. Instrukcji Do...Loop użyjemy jeżeli nie wiemy ile razy pętla ma być wykonana. Jest to pętla warunkowa, w której kluczową cechą jest warunek. Instrukcja If... Then... Else - najczęściej stosowana instrukcja warunkowa. Instrukcja Select Case - jest to inna droga realizacji procesu podjęcia decyzji w programie. Instrukcja For Each... Next - pętla służąca do wykonywania operacji na obiektach kolekcji. PĘTLA FOR NEXT SKŁADNIA: For licznik=pocz to koniec Instrukcje powtarzane Next licznik Lub For licznik=pocz to koniec Step krok Instrukcje powtarzane Next licznik Konstruując pętle For... Next należy na wstępie określić zmienną sterującą tą pętlą (w naszym przypadku jest nią zmienna o nazwie licznik) oraz zdefiniować zakres w jakim ta zmienna będzie się zmieniała, czyli jej wartość początkową, pocz, jej wartość końcową, koniec, oraz krok z jakim ta zmienna będzie się zwiększała przy każdym dojściu do końca pętli, czyli do intrukcji Next. Podczas wykonywania pętli za pierwszym razem, pod zmienną sterującą licznik podstawiona jest wartość początkowa, pocz. Następnie sprawdzany jest warunek, czy wyznaczona w ten sposób zmienna licznik ma wartość mniejszą lub równą niż koniec. Jeśli warunek jest ten jest spełniony to pętla jest wykonywana, czyli wykonywane instrukcje zawarte pomiędzy wierszem For licznik=pocz to koniec, a wierszem Next licznik. Przykład 1. Procedura oblicza sumę pierwszych 10 liczb całkowitych. Po zakończeniu obliczeń procedura wyświetla komunikat zawierający wynik. Sub suma() Makro oblicza sumę pierwszych 10 liczb całkowitych Dim total As Integer Dim i As Integer total = 0 For i = 1 To 10 total = total + i Next i MsgBox total Procedura zawiera kilka często stosowanych elementów języka VBA: Komentarz (wiersz rozpoczynający się apostrofem) 8
Deklaracje zmiennych (wiersz rozpoczynający się poleceniem Dim) Dwie zmienne (total oraz i) Dwie instrukcje przypisania wartości do zmiennych (total = 0 oraz total = total + 1) Struktura pętli (For Next ) Wbudowana funkcja VBA (MsgBox). Przykład 2. Wyświetlenie w oknie dialogowym dziesięciu kolejnych wartości zmiennej licznik. Przykład 3. Zgadywanka w 10 próbach Sub petla1() Dim i As Integer For i = 1 To 10 MsgBox "Wartość licznika " & i Next i Sub petla2() Zgadywanka w 10 próbach Dim i, sekret, strzal As Integer sekret = InputBox("Wprowadzam sekretną liczbę") MsgBox "W 10 próbach zgadnij moją sekretną liczbę" For i = 1 To 10 MsgBox "Próba nr " & CStr(i) strzal = InputBox("Zgaduj") If strzal = sekret Then MsgBox "Brawo. Trafiłeś w " & CStr(i) & " próbie." Exit For End If Next i PĘTLE WARUNKOWE DO...LOOP Mamy do dyspozycji jakby pięć odmian pętli Do...Loop, wszystkie z nich działają w podobny sposób różnice przedstawiam w tabeli poniżej. Typ pętli Do...Loop Do While...Loop Do...Loop While Do Until...Loop Opis Wielokrotnie wykonuje blok kodu tak długo aż instrukcja warunkowa umieszczona wewnątrz tej pętli wykona instrukcje Exit Do. W tym przypadku użycie instrukcji Exit Do jest praktycznie obowiązkowe gdybyśmy jej nie zastosowali pętla byłaby wykonywana w nieskończoność. Rozpoczyna i powtarza blok kodu umieszczonego wewnątrz pętli jeżeli jest spełniony warunek umieszczony na początku tej pętli. Jest to prawdopodobnie najczęściej stosowana odmiana pętli warunkowej. Wykonuje blok kodu umieszczony wewnątrz pętli jeden raz i powtarza go tak długą jak długo jest spełniony warunek umieszczony na końcu pętli. Rozpoczyna i powtarza blok kodu umieszczony wewnątrz pętli 9
Do...Loop Until dopóki nie zostanie spełniony warunek umieszczony na początku tej pętli. Wykonuje blok kodu umieszczony wewnątrz pętli jeden raz i powtarza go do czasu gdy zostanie spełniony warunek umieszczony na końcu pętli. Pętla Do While Loop Do While warunek Intrukcje powtarzane Loop gdzie warunek jest dowolnym wyrażeniem logicznym (np. i<10). Jeśli wartość tego wyrażenia jest równa True, czyli warunek jest spełniony, to intrukcje w pętli są wykonywane. Pod dojściu do intrukcji Loop sterowanie wraca do początkowej instrukcji pętli, Do While warunek i ponownie sprawdzany jest warunek. Jeśli w dalszym ciągu jest on spełniony (tzn. ma wartość True), to instrukcje wewnątrz pętli są wykonywane ponownie i po dojściu do końca pętli sterowanie ponownie wraca do początku, warunek jest sprawdzany itd. Jeśli warunek nie jest spełniony to wykonywana jest instrukcja następna po wierszu Loop. Zatem pętla Do While wykonywana jest tak długo dopóki warunek ma wartość True. Ważna uwaga: aby uniknąć nieskończonych pętli wartość warunku musi mieć możliwość zmiany wewnątrz pętli z wartości True na wartość False. Przykład 4. Sub petla3() Dim a As Integer a = 0 Do While a < 10 a = a + 1 MsgBox a Loop INSTRUKCJA IF THEN ELSE Postać tej instrukcji jest następująca: If warunek Then Else Instrukcje gdy warunek nie jest spełniony End If Warunek może być dowolnym wyrażeniem logicznym lub wyrażeniem relacji, którego wynik jest True lub False. Podczas wykonywania instrukcji If, najpierw obliczany jest warunek i jeśli jego wartość jest równa True (tzn. warunek jest spełniony), to wykonywana jest instrukcja lub instrukcje znajdujące się po słowie kluczowym Then (aż do słowa kluczowego Else), w przeciwnym razie, gdy wartość warunku jest równa False (tzn. warunek nie jest spełniony), to pomijane są instrukcje znajdujące się po słowie Then natomiast program przechodzi do wykonywania instrukcji następujących po słowie kluczowym Else, aż do słów kluczowych End If. W obydwu przypadkach po wykonaniu odpowiedniej grupy instrukcji w zależności od spełnienia warunku, program przechodzi następnie do wykonania kolejnej instrukcji znajdującej się po słowie kluczowym End If Warto zauważyć, że instrukcje wykonywane po Then lub Else mogą zawierać również kolejne instrukcje if/else. 10
Przykład 5 Przykład zastosowania instrukcji if/else do sprawdzenia poprawności wykonania operacji dzielenia. Sub dziel() Dim x As Single Dim y As Single Dim z As Single x = InputBox("Wprowadz liczbę x") y = InputBox("Wprowadz liczbę y") If y <> 0 Then z = x / y MsgBox "wynik dzielenia = " & z Else MsgBox "Pamiętaj... nie dzielić przez zero" End If Złożona instrukcja If Jeśli w wyniku sprawdzenia warunku możliwe są nie dwa, lecz więcej działań do wykonania, wówczas można posłużyć się złożoną instrukcją If. Ma ona następującą postać: If warunek1 Then Instrukcje1 gdy warunek1 jest spełniony ElseIf warunek2 Then Instrukcje2 gdy warunek2 jest spełniony ElseIf warunek_n Then Instrukcje_n gdy warunek_n jest spełniony Else Instrukcje gdy nie spełniony jest żaden z powyższych warunków End If Przykład 6 Sprawdzanie w jakiej porze dnia się znajdujemy Sub czas() Dim t As Date t = Time 'Pobranie czasu systemowego komputera If t < #7:00:00 AM# Then MsgBox "Jest zbyt wcześnie, żeby myśleć" ElseIf t < #12:00:00 PM# Then MsgBox "Przedpołudniowa pora pracy" ElseIf t < #6:00:00 PM# Then MsgBox "Pracujemy też po południu" ElseIf t < #11:00:00 PM# Then MsgBox "Wieczór - czas na relaks" Else MsgBox "Czas na spanie. Noc" End If INSTRUKCJA WYBORU SELECT CASE Instrukcja wyboru Select Case jest bardzo podobna w działaniu do złożonej instrukcji If. Instrukcja ta pozwala wykonać określone grupy instrukcji w zależności od wartości testu sterującego instrukcją Select Case. Postać tej instrukcji jest następująca: Select Case Test Case Wartość1 11
Instrukcje_1 Case Wartość2 Instrukcje_2 Case Wartość3 Instrukcje_3 Case Wartość_n Instrukjce_n Case Else Instrukcje_po_else End Select Przy wykonywaniu instrukcji Select Case najpierw jest obliczana wartość wyrażenia stojącego w wierszu Select Case zaznaczonego wyżej jako Test, a następnie w zależności od jego wartości jest wykonywana ta grupa instrukcji, która znajduje się po Case odpowiadającym obliczonej wartości. Należy zwrócić uwagę, że po każdym Case może występować albo pojedyńcza wartość, albo pewien zakres wartości. W każdym przypadku Visual Basic próbuje dopasować odpowiedni Case do aktualnej wartości wyrażenia testowego Test. Gdy żaden z Case nie może być dopasowany, wówczas wykonywane są instrukcje stojące po Case Else. Należy jednak zauwazyć, że stosowanie Case Else nie jest obowiązkowe. Po wykonaniu odpowiedniej grupy instrukcji z danego Case program przechodzi do instrukcji następującej po End Select. Przykład 7 Sub ocena() Dim ocena As Integer 'Wczytanie danej oceny ocena = InputBox("Podaj ocenę") Select Case ocena Case 6 MsgBox "ocena celująca" Case 5 MsgBox "ocena bardzo dobra" Case 4 MsgBox "ocena dobra" Case 3 MsgBox "ocena dostateczna" Case 2 MsgBox "ocena dopuszczająca" Case 1 MsgBox "ocena niedostateczna" Case Else MsgBox "To nie jest ocena" End Select Przykład 8 Sub ocena2() Dim ocena As Integer ocena = InputBox("Podaj ocenę") Select Case ocena Case 2 To 6 MsgBox "ocena pozytywna" Case 1 MsgBox "ocena negatywna" Case Else MsgBox "To nie jest ocena" End Select 12
Przykład 9 Sub czas() Dim t As Date Select Case Time 'Pobranie czasu systemowego komputera Case ID < #7:00:00 AM# MsgBox "Jest zbyt wcze?nie aby my?leć" Case #7:00:00 AM# To #12:00:00 PM# MsgBox "Przedpołudniowa pora pracy" Case #12:00:00 PM# To #6:00:00 PM# MsgBox "Pracujemy też popołudniu" Case #6:00:00 PM# To #11:00:00 PM# MsgBox "Wieczór - czas na relaks" Case Else MsgBox "Czas na spanie. Noc" End Select ZADANIA: Zadanie Napisać program realizujący algorytm rozwiązania liniowego ax+b=0 Oprócz oczywistego rozwiązania, w przypadku gdy a jest różne od zera, x = -b/a, trzeba rozważyć również przypadki, gdy a=0 oraz b=0. Aby ustrzec się błędów wykorzystania przy wprowadzeniu za a wartości zero, program będzie to sprawdzał i wysyłał odpowiedni komunikat. Formularz do rozwiązania tego zadania powinien umożliwiać wprowadzenie dwóch danych liczbowych: a oraz b, wykonanie obliczeń i wyświetlenie wyniku. 13