350 likes | 547 Views
Programiranje kroz aplikacije. Korisničke forme Upravljanje greška ma. Message box. VBA funkcija MsgBox prikazuje poruku korisniku i od korisnika se može dobiti povratna informaciju. Sintaksa je: Odgovor = MsgBox( P rompt , [ B uttons] , [ T itle] , [ H elpfile ] , [C ontext ])
E N D
Programiranje kroz aplikacije Korisničke forme Upravljanje greškama
Message box • VBA funkcija MsgBox prikazuje poruku korisniku i od korisnika se može dobiti povratna informaciju. Sintaksa je: • Odgovor = MsgBox(Prompt, [Buttons], [Title], [Helpfile], [Context]) • Prompt– tekst koji se prikazuje u box-u; • Buttons– numerički izraz koji određuje koja dugmad i ikonice će biti prikazane; • Title– naslov prozora message box-a; • HelpFile, Context– određuju help fajl i stavku help-a. Zadaju se u paru. • Argument Buttonsodređuje dugmad i ikonice kojiće se naći na message box-u, kao i koje dugme je podrazumevano. • Konstante koje određuju dugmad na message box-u su date u tabeli na sledećem slajdu.
Definisanje dugmadi na message box-u Ove konstante su deo specifikacije VBA i mogu se koristiti bilo gde u kodu umesto odgovarajućih numeričkih vrednosti.
Primer message box-a • Kombinovanjemkonstantizadugmad, ikonice i podrazumevanudugmadostvarujemoželjeniizgledprozora. Na primer, pozivom • MsgBox("Želite li da zatvoritefajl?", _ • vbYesNoCancel + vbQuestion + vbDefaultButton2, _ • "Zatvaranjefajla") • se pojavljujeprozorprikazannasliciispod.
Vraćene vrednosti message box-a • Odgovor korisnika na message box se dobija preko vrednosti koju vraća funkcija MsgBox. U zavisnosti od pritisnutog dugmeta, funkcija vraća jednu od celobrojnih vrednosti datih u tabeli ispod.
Input box • Input box predstavlja jednostavnu korisničku formu koja korisniku omogućava da unese podatak. Vraćeni podatak je tipa String. • Input box se aktivira pomoću VBA funkcije InputBox, čija je sintaksa: • Podatak = InputBox(Prompt, [Title], [Default], [XPos], [Ypos], [Helpfile], [Context]) • Prompt– tekst koji se prikazuje u box-u; • Title– naslovprozora input box-a; • Default– podrazumevana vrednost prikazana u input box-u; • XPos, YPos– ekranskekoordinategornjeglevoguglaprozora box-a; • HelpFile, Context– određuju help fajl i stavku help-a. Zadaju se u paru. • Jedino je prompt obavezan argument. Maksimalna dužina prompt-a je približno 1024 karaktera, zavisno od širine korišćenih karaktera. • U slučaju kad je unešeni podatak broj, InputBox treba kombinovati sa funkcijom Val: • Broj = Val(InputBox("Uneti broj: "))
Primer input box-a • Poziv • Ime = InputBox("Uneti ime: ", "Unos imena studenta") • će dati input box prikazan na slici ispod. • Unešeno ime će biti dodeljeno promenljivoj Ime nakon klika na dugme OK.
Korisnički kreirane forme • Korisnička forma, UserForm,se u projekt unosi saInsert / UserForm. Nakon toga se na formu dodaju kontrole, podese se njihove osobine i napišu procedure za upravljanje događajima vezanim za te kontrole.Ove procedure se nalaze u kodnom prozoru same forme. • Kontrole se na formu dodaju koristeći Toolbox, koji seaktivira opcijom View / Toolbox. Toolbox je dat na slici ispod.
Kontrole formi • Labela (Label) Labela služi za prikaz teksta na formi. Tekst labele se dobija ili menja pomoću osobine Caption. • Tekst boks (TextBox) Ova kontrola dozvoljava korisniku da unese tekst. Tekst kontrole se dobija ili menja pomoću osobine Text. • Kombo boks (ComboBox) Ova kontrola daje padajući meni sa kojeg biramo jednu opciju ili nam dopušta da sami unesemo podatak. Korisne metode ove kontrole su: • AddItem (dodavanje nove stavke menija) • RemoveItem (brisanje postojeće stavke menija) • Clear (brisanje svih stavki menija). Korisne osobine ove kontrole su: • ListCount (vraća broj stavki u meniju kontrole) • ListIndex (vraća broj trenutno odabrane stavke menija), • List (pristupanje pojedinim stavkama menija List(0), List(1) ...).
Kontrole formi (nastavak) • List boks (ListBox) List boks daje listu stavki sa koje korisnik može izabrati jednu ili više stavki. Ova kontrola je vrlo slična kombo boksu, s tim što kombo daje padajući meni za odabir jedne stavke. Druga razlika je da kod kombo boksa korisnik može uneti stavku koja se ne nalazi na listi. Nabrojane osobine i metode kombo boksa važe i za list boks. • Ček boks (CheckBox) Ček boks se upotrebljava kada želimo da definišemo neki binaran izbor, npr. da ili ne, istinito ili neistinito, uključeno ili isključeno. Kontrola ima dve moguće vrednosti, True (kontrola čekirana) ili False (kontrola nije čekirana). Promena vrednosti ček boksa se vrši pomoću osobine Value. • Opciono dugme (OptionButton) Opciona dugmad (radio dugmad) se koriste za odabir jedne od nekoliko opcija. Nalaze se u grupama od po minimum dva dugmeta. Kada se jedno dugme u grupi aktivira ostala se deaktiviraju. Pomoću osobine Value se dobija ili menja stanje dugmeta.
Kontrole formi (nastavak) • Toggle dugme (ToggleButton) Slično kao ček boks i opciona dugmad, ovo dugme ima dva moguća stanja, uključeno i isključeno. Vrednost dugmeta je True (pritisnuto) ili False (nije pritisnuto). Pomoću osobine Value se dobija ili menja stanje dugmeta. • Okvir (Frame) Okvir služi da obuhvati druge kontrole, bilo iz estetskih razloga, bilo zbog grupisanja kontrola na logičan način. Okvirse koristizagrupisanje opcionih dugmadi kada forma ima više od jedne grupe ovih dugmadi. U jednom okviru, sva opciona dugmad su međusobno isključiva. • Komandno dugme (CommandButton) Ovo dugme služi da izvrši određenu radnju koju programiramo u okviru događaja Click ovog dugmeta. Ova kontrola se najviše koristi i svaka forma koju kreiramo će imati bar jedno komandno dugme. • Tab strip (TabStrip) Ova kontrola služi za kreiranje formi sa više tabova (stranica).
Kontrole formi (nastavak) • Multi page (MultiPage) Slično kao tab strip, multi page kontrola kreira forme sa više stranica. • Klizač (ScrollBar) Kod klizača, odabir jedne od vrednosti iz određenog opsega vršimo prevlačenjem klizača. Minimalna, maksimalna i trenutna vrednost klizača se dobijaju i menjaju pomoću osobina Min, Max i Value. Osobine SmallChange i LargeChange definišu korak promene vrednosti klizača. • Spin dugme (Spin Button) Spin dugme omogućava odabir vrednosti kontrole klikanjem jedne od dve strelice, pri čemu jedna strelica povećava, a druga smanjuje vrednost. • Image kontrola (Image control) Image kontrola se koristi za prikaz slike koja je u formi zasebnog fajla. • RefEdit kontrola (RefEdit) RefEditkontrola se koristizaodabiropsega u radnomlistu.
Prikaz forme • Forma se prikazuje pomoću metode Show objekta UserForm. • Počev sa Office-om 2000, korisničke forme mogu biti nemodalne (eng. modeless), što znači da korisnik može pristupiti radnoj svesci, ili aplikaciji, bez zatvaranja forme. Nemodalnost se postiže sa UserForm.Show vbModeless • Podrazumevani način prikaza korisničke forme je modalan. • VBA poseduje i naredbu Load pomoću koje se vrši učitavanje forme u memoriju, na sledeći način: Load UserForm • Ipak, ovako učitana forma nije vidljiva dok se ne pozove Show. • Load se obično koristi kod složenih formi koje se učitaju u memoriju pre upotrebe kako bi se skratilo vreme prikaza forme metodom Show.
Zatvaranje forme • Za zatvaranje forme se može koristiti naredba Unload. Na primer, forma UserForm se može zatvoriti na bilo koji od sledeća dva načina: Unload UserForm Unload Me • Me je ključna reč VBA pomoću koje forma referencira samu sebe. Koristi se radi skraćenja zapisa referenciranja forme i odnosi se na onu formu u kojoj se nalazi procedura koja sadrži reč Me. Korišćenje reči Me umesto imena forme eliminiše potrebu menjanja kôda prilikom promene imena forme. • Forma se može zatvoriti metodom Hide. Pozivom Hide, forma nestaje sa ekrana, ali ostaje u memoriji, tako da naš kôd i dalje može pristupiti kontrolama. Hide se poziva na bilo koji od sledeća dva načina: UserForm.Hide Me.Hide
Pozivanje forme sa palete alatki • Korisničke forme se mogu prikazati pomoću odgovarajućeg dugmeta sa palete alatki. • Možemo kreirati sopstvenu paletu alatki i sa nje pozvati formu, ili koristiti neku od postojećih paleta. • Za oba načina je zajedničko da se dodavanje dugmeta koje prikazuje formu najčešće vrši pri otvaranju radne sveske, tj. u okviru procedure Workbook_Open. • Prikaz forme predstavlja poziv procedure koja u sebi sadrži naredbu UserForm.Show
Dodavanje dugmeta postojećoj paleti • Dugme koje se dodaje paleti alatki je VBA objekat tipa CommandBarButton. • Deklaracija dugmeta i dodavanje istog paleti se vrši na sledeći način: Dim Dugme As CommandBarButton Set Dugme = Application.CommandBars("Standard").Controls.Add( _ Type:=msoControlButton, Temporary:=True) • Dodavanje kontrole se vrši metodom Add kolekcije Controls. Argument Type određuje tip kontrole, dok Temporary određuje da li se kontrola automatski briše nakon zatvaranja aplikacije (True) ili ne (False). Podrazumevano je False.
Osobine dugmeta • Nakon dodavanja dugmeta paleti, definišemo mu osobine. Na primer: With Dugme .Style = msoButtonCaption .Caption = "Dugme" .OnAction = "Procedura" End With definiše dugme samo sa tekstom (osobina Style), tekst koji će biti ispisan na dugmetu (osobina Caption), kao i proceduru koja se poziva pritiskom na dugme (osobina OnAction). • Ako želimo da, umesto teksta, definišemo ikonicu koja će biti prikazana na dugmetu, imali bi konstrukciju sličnu sledećoj: With Dugme .Style = msoButtonIcon .Picture = LoadPicture("C:\Slika.bmp") .OnAction = "Procedura" End With Dozvoljena je i kombinacija teksta i ikonice, kada je stil msoButtonIconAndCaption
Kreiranje nove palete alatki • Paleta koja se dodaje je VBA objekat tipa CommandBar. • Dodavanje palete se vrši metodom Add kolekcije CommandBars. Dim Paleta As CommandBar Set Paleta = Application.CommandBars.Add(Name:="NasaPaleta", _ Position:=msoBarTop, Temporary:=True) Paleta.Visible = True • Argument Name definiše ime palete. Argument Position definiše poziciju palete u odnosu na prozor aplikacije. Konstantom msoBarTop se paleta smešta na vrh prozora. Argument Temporary određuje da li se paleta automatski briše nakon zatvaranja aplikacije (True) ili ne (False). Podrazumevano je False. • Kreirana paleta podrazumevano nije vidljiva. Da bi je učinili vidljivom, potrebno je podesiti njenu osobinu Visible na True. • Dodavanje dugmeta na paletu NasaPaleta se vrši na ranije opisan način, s tim što se paleta referencira sa CommandBars("NasaPaleta").
Primer 1 • Napraviti formu koja ima jedan tekst boks i dva dugmeta (Izmeni i Izađi. U tekst boks se unosi string i pritiskom na dugme Izmeni se menja ime prvog radnog lista unešenim stringom. Dugme Izađi zatvara formu. Prikaz forme se vrši desnim klikom miša na bilo koji radni list.
Primer 1 (nastavak) • U okviru modula forme imamo: Private Sub CommandIzmeni_Click() If Me.TextBoxIme.Text <> "" Then ThisWorkbook.Worksheets(1).Name = Me.TextBoxIme.Text Else MsgBox "Nisteuneliimelista" End If End Sub Private Sub CommandIzadji_Click() Unload Me End Sub
Primer 2 • Napraviti formu koja ima grupu od 3 opciona dugmeta kojima se podešava boja ćelija selekcije na crvenu, zelenu ili plavu, jedan ček boks za postavljanje i uklanjanje okvira selekcije, kao i klizač kojim se menja veličina teksta selekcije od 7 pt do 17 pt sa korakom od 0.5 pt. Ako je, pri startovanju forme, veličina fonta selekcije van opsega 7-17 pt ili selekcija sadrži više od jedne veličine fonta, podesiti veličinu fonta selekcije na 9 pt. Forma sadrži i dugme za zatvaranje forme. Prikaz forme se vrši pomoću dugmeta sa standardne palete alatki.
Primer 2 (nastavak) U okviru modula forme imamo: Private Sub CheckBoxOkvir_Click() If Me.CheckBoxOkvir.Value = True Then Selection.Borders.LineStyle = xlContinuous Selection.Borders.Weight = xlThick Else Selection.Borders.LineStyle = xlNone End If End Sub Private Sub CommandIzadji_Click() Unload Me End Sub Private Sub ScrollBarVelicinaFonta_Change() Selection.Font.Size = Me.ScrollBarVelicinaFonta.Value / 2 Me.LabelVelicinaFonta.Caption = "Veličina fonta je " & _ Selection.Font.Size & " pt" End Sub
Primer 2 (nastavak) U okviru modula forme dalje imamo: Private Sub OptionButtonCrvena_Click() If Me.OptionButtonCrvena.Value Then Selection.Interior.Color = RGB(255, 0, 0) End If End Sub Private Sub OptionButtonZelena_Click() If Me.OptionButtonZelena.Value Then Selection.Interior.Color = RGB(0, 255, 0) End If End Sub Private Sub OptionButtonPlava_Click() If Me.OptionButtonPlava.Value Then Selection.Interior.Color = RGB(0, 0, 255) End If End Sub
Primer 2 (nastavak) U okviru procedure Workbook_Open imamo: Private Sub Workbook_Open() Dim Dugme As CommandBarButton Set Dugme = Application.CommandBars("Standard").Controls.Add( _ Type:=msoControlButton, Temporary:=True) With Dugme .Style = msoButtonCaption .Caption = "Selekcija" .OnAction = "RadSaSelekcijom" End With End Sub
Primer 2 (nastavak) U okviru standardnog kodnog modula imamo: Sub RadSaSelekcijom() Dim VF As Variant VF = Selection.Font.Size FormSelekcija.Show modeless If VF < 7 Or VF > 17 Or IsNull(VF) Then Selection.Font.Size = 9 FormSelekcija.ScrollBarVelicinaFonta = 18 FormSelekcija.LabelVelicinaFonta = "Veličina fonta je 9 pt" Else FormSelekcija.ScrollBarVelicinaFonta = 2 * VF FormSelekcija.LabelVelicinaFonta = "Veličina fonta je " & _ VF & " pt" End If End Sub
Primer 3 • Napraviti formu koja ima kombo boks i četiri dugmeta sa natpisima: Upiši, Briši sve, Briši zadnji i Izađi. Pritiskom na dugme Upiši, imena radnih listova se unose u kombo boks (po principu jedno ime–jedna stavka). Dugme Briši sve briše sve stavke kombo boksa, dugme Briši zadnji briše samo zadnju stavku kombo boksa i dugme Izađi zatvara formu. Prikaz forme se vrši pomoću dugmeta sa novokreirane palete alatki.
Primer 3 (nastavak) Private Sub CommandBrisiSve_Click() Me.ComboBoxImena.Clear End Sub Private Sub CommandBrisiZadnji_Click() If Me.ComboBoxImena.ListCount > 0 Then Me.ComboBoxImena.RemoveItemMe.ComboBoxImena.ListCount - 1 End If End Sub Private Sub CommandIzadji_Click() Unload Me End Sub Private Sub CommandUpisi_Click() Dim I As Integer For I = 1 To ThisWorkbook.Worksheets.Count Me.ComboBoxImena.AddItemThisWorkbook.Worksheets(I).Name, I-1 Next End Sub • U okviru modula forme imamo:
Primer 3 (nastavak) Private Sub Workbook_Open() Dim Paleta As CommandBar, Dugme As CommandBarButton Set Paleta = Application.CommandBars.Add( _ Name:="Paleta", Position:=msoBarTop, temporary:=True) Paleta.Visible = True Set Dugme = Application.CommandBars("Paleta").Controls.Add( _ Type:=msoControlButton, temporary:=True) With Dugme .Style = msoIcon .Picture = LoadPicture("C:\VBA.gif") .Width = 30 .OnAction = "ImenaListova" End With End Sub • U okviru procedure Workbook_Open imamo:
Upravljanje greškama • Greške se dele na sintaksne greške (greške u pisanju kôda) i greške prilikom izvršavanja (eng. run-time errors). Od interesa za nas su greške prilikom izvršavanja. • Greške prilikom izvršavanja uzrokuju prekid rada procedure uz pojavljivanje dijalog prozora koji prikazuje broj greške i njen opis. Na primer, ako se u proceduri nađe A = B / 0 pojaviće se prozor greške deljenja sa nulom. • Dobro napisana procedura treba da vodi računa o pojavi grešaka prilikom izvršavanja, tj. treba da ih hvata i obrađuje. • Obradagrešaka podrazumeva preduzimanje koraka kako bi se izvršavanje procedure neometano nastavilo.
Naredba On Error • Naredba On Error omogućava hvatanje (detekciju) grešaka i koristi se u dva osnovna oblika: On Error GoTo linija On Error Resume Next • U prvom obliku, linija predstavlja labelu ili broj programske linije na koju će “skočiti” kontrola toka u slučaju greške, tj. prvu liniju kôda za obradu greške. Ova linija se mora naći u istoj proceduri gde se nalazi naredba On Error, tj. kôd za obradu grešaka je ograničen na proceduru gde se greška pojavljuje. • Naredba On Error se stavlja ispred dela kôda gde očekujemo grešku.
Primer – Deljenje sa nulom Sub ObradaDeljenjaSaNulom() Dim A As Integer, B As Integer On Error GoToObradiGresku B = 15 A = B / 0 B = A ^ 2 Exit Sub ObradiGresku: MsgBox"Greškabroj " & Err.Number & _ ": Pokušajdeljenjasanulom." End Sub • Svaka greška u VBA ima pridružen jedinstven kôd (ceo broj). • Kôd greške se dobija pomoću osobine Number objekta Err.Objekat Err sadrži informacije o greškama prilikom izvršavanja i njegova podrazumevana osobina je Number. • Ukoliko nije došlo do greške, osobina Number ima vrednost 0.
On Error Resume Next • KodOn Error Resume Next, kontrola se prebacuje na prvu naredbu nakon naredbe koja je uzrokovala grešku, tj.greška se ignoriše. • Jedan broj grešaka se može ignorisati. Na primer, ako ćelija ne sadrži komentar, doći će do greškepri pokušajučitanja komentara. U nastavku je dat primer procedure koja ispisuje komentare svih ćelija datog opsega R. Sub Komentari() Dim R As Range, celija As Range Set R = Worksheets(1).Range("A1:C10") On Error Resume Next For Each celija In R.Cells MsgBox "Ćelija " & celija.Address & vbCrLf & _ "Komentar: " & celija.Comment.Text Next On Error GoTo 0 End Sub
On Error GoTo 0 • NaredbaOn Error GoTo 0onemogućavahvatanjegrešaka u tekućojproceduri. Iako se ovajoblikmožeprotumačitikaoprviobliknaredbe, gde0predstavljabrojlinijekojompočinjekôdzaobradugreške, to nijeslučaj. Čak i da postojilinija procedure označenasa0, ova naredbaonemogućavahvatanjegrešaka. • Ukolikoprocedura ne sadržilinijuOn Error GoTo 0, onemogućavanjehvatanjagrešaka se postižeautomatski, izlaskomiz procedure. • Hvatanje grešaka je ponekad jednostavnije koristiti nego da sa mnoštvom uslova predviđamo svaku moguću grešku koja se može desiti u proceduri. • Primer:Proveriti da li postoji određena radnasveska. Umesto da proveravamo postojanje sveske pre njegovog otvaranja, možemo uhvatiti grešku koja se pojavljuje u pokušaju da je otvorimo.
Primer sa korišćenjem grešaka • Napisati proceduru koja utvrđuje da li aktivna radna sveska sadrži list Spisak i korisniku javlja odgovarajuću poruku. Sub TrazenjeLista() On Error Resume Next ActiveWorkbook.Worksheets("Spisak").Activate If Err.Number = 0 Then MsgBox "Postoji list Spisak" Else MsgBox "Ne postoji list Spisak" End If End Sub