8
VBA – Objects, Properties, Methods, Events, ... PROJEKTOVANJE KLASNIH MODULA ... mr Milovan Milivojević dipl. ing. Objekti Svojstva Metode Dogadjaji KLASE Kolekcije Deo J 28.05.13 1 Visoka Poslovno- Tehnička Škola - Užice Preporučena literatura: Srpsko izdanje Excel 2003- Programiranje u VBA, Steven M. Hansen, Komjuter Biblioteka, Beograd- Čačak, 2005., pp 233-258 Englesko izdanje: Mastering Excel 2003 Programming with VBA, Steven Hansen, SYBEX, 2004.

Objects, Properties,Methods,Events, PROJEKTOVANJE KLASNIH ... u objektno... · VBA –Objects, Properties,Methods,Events, ... PROJEKTOVANJE KLASNIH MODULA... mr Milovan Milivojević

  • Upload
    others

  • View
    17

  • Download
    0

Embed Size (px)

Citation preview

VBA – Objects, Properties, Methods, Events, ... PROJEKTOVANJE KLASNIH MODULA ...

mr Milovan Milivojević dipl. ing.

Objekti

Svojstva

Metode

Dogadjaji

KLASE

Kolekcije

Deo J

28.05.131Visoka Poslovno-Tehnička Škola - Užice

Preporučena literatura:Srpsko izdanjeExcel 2003- Programiranje u VBA, Steven M. Hansen, Komjuter Biblioteka, Beograd-Čačak, 2005., pp 233-258 Englesko izdanje:Mastering Excel 2003 Programming with VBA, Steven Hansen, SYBEX, 2004.

28.05.132

…PRIMER///Formiranje klase NIZ….

Visoka Poslovno-Tehnička Škola - Užice

'Svojstva/Properties sa atributom readPublic Property Get MaxClan() As Variant

MaxClan = Application.WorksheetFunction.Max(PodrucjeNizaMM)End PropertyPublic Property Get MinClan() As Variant

MinClan = Application.WorksheetFunction.Min(PodrucjeNizaMM)End PropertyPublic Property Get ProsekNiza() As Variant

ProsekNiza = Application.WorksheetFunction.Average(PodrucjeNizaMM)End PropertyPublic Property Get SumNiza() As Variant

SumNiza = Application.WorksheetFunction.Sum(PodrucjeNizaMM)End PropertyPublic Property Get stDEVIJACIJA() As Variant

stDEVIJACIJA = Application.WorksheetFunction.stDEV(PodrucjeNizaMM)End Property

Option Explicit'Deklarisanje modularnih varijabli koje se azurirajuDim mvOznakaVarijable As VariantDim mvPodrucjeNizaMM As Range'

Private Sub Class_Initialize()mvOznakaVarijable = "MM"Set mvPodrucjeNizaMM = Nothing

End Sub

'Svojstvo/Promenjiva OznakaVarijable je read/writePublic Property Get OznakaVarijable() As Variant

OznakaVarijable = mvOznakaVarijableEnd PropertyPublic Property Let OznakaVarijable(ByVal vNewValue As Variant)

mvOznakaVarijable = vNewValueEnd Property

'Objektna promenjiva rgMM je read/writePublic Property Get PodrucjeNizaMM() As Variant

PodrucjeNizaMM = mvPodrucjeNizaMMEnd Property

Public Property Let PodrucjeNizaMM(ByVal vNewValue As Variant)Set mvPodrucjeNizaMM = vNewValue

End Property

28.05.133

…PRIMER///Testiranje klase NIZ….

Visoka Poslovno-Tehnička Škola - Užice

Sub Niz()Dim rg As RangeDim objNiz As NizDim PocetakNiza, KrajNiza, AdresaNiza As StringDim ZonaNiza As Range 'Oblast u kome se nalaze merenja///niz

Set rg = ThisWorkbook.Worksheets("Merenja").Range("A1")

Do Until IsEmpty(rg)MsgBox rg.Address

Set objNiz = New Niz'Dodela svojstva OznakaVarijableobjNiz.OznakaVarijable = rg.ValueMsgBox "Analiza niza: " & objNiz.OznakaVarijable

'Odredjivanje Adrese za zonu u kojoj se nalazi nizSet rg = rg.Offset(1, 0)PocetakNiza = rg.AddressDo Until IsEmpty(rg)

Set rg = rg.Offset(1, 0)LoopSet rg = rg.Offset(-1, 0)KrajNiza = rg.AddressAdresaNiza = PocetakNiza & ":" & KrajNiza

Set ZonaNiza = Range(AdresaNiza)MsgBox ZonaNiza.Address 'Kontrola

Range(AdresaNiza).Name = "Niz_" & objNiz.OznakaVarijable'ovim je programski imenovana zona niza

With objNiz.PodrucjeNizaMM = ZonaNizaMsgBox "MAX clan je " & .MaxClanMsgBox "MIN clan je " & .MinClanMsgBox "PROSEK je " & .ProsekNizaMsgBox "SUMA niza je " & .SumNizaMsgBox "STDEV niza je " & .stDEVIJACIJA

End With

Set rg = rg.Offset(-(ZonaNiza.Count), 1)

LoopSet objNiz = NothingSet rg = NothingSet ZonaNiza = Nothing

End Sub

28.05.13Visa Poslovno Tehnička Škola - Užice 4

Poboljšan objekat /klasa/KREDITFinal!!!• Enumeracija !!!.• Validacija!!!• Generisanje poruka o greškama !!!

Šta možemo poboljšati!!!• Varijable tipa VARIANT uskladiti sa pravom prirodom tih varijabli !!!.• vNewValue imenovati u skladu sa prirodom problema koji se rešava!!!• Validacija podataka i generisanje poruka o greskama !!!

Option Explicit'privatne klasne varijable za memorisanje'vrednosti svojstavaDim mcGlavnica As Currency ' mc-module currencyDim mdKamatnaStopa As DoubleDim mlBrojKredita As LongDim mnRokOtplate As Integer

'Kreiranje enumeracije rokova otplateEnum lnPropisaniRokOtplate

ln2God = 24ln3God = 36ln4God = 48ln5God = 60

End Enum

'Ogranicenje GlavnicePrivate Const MinGlavnica = 5000Private Const MaxGlavnica = 75000

'Ogranicenje KamatneStopePrivate Const MinKamatnaStopa = 0.04Private Const MaxKamatnaStopa = 0.21

Private Sub Class_Initialize()mcGlavnica = 0mdKamatnaStopa = 0.08mlBrojKredita = 0mnRokOtplate = 36

End Sub

Public Property Get Glavnica() As CurrencyGlavnica = mcGlavnica

End PropertyPublic Property Let Glavnica(ByVal ZadataGlavnica As Currency)

If ZadataGlavnica < MinGlavnica Or ZadataGlavnica > MaxGlavnica Then'generisanje greske'Ovim se omogucuje da se nastali problem resi primenom odgovarajuce'-error-handling- rutine *ovde nije primenjeno*, ili'primenom err.raise objekta koji programeru ukazuje na gresku vec tokom'projektovanja klase ili aplikacije *primenjeno u ovom koodu*Err.Raise vbObjectError + 1, "Klasa KreditFinal", _

"Nepravilan unos Glavnice kredita. Glavnica mora biti izmedju" & _MinGlavnica & " i " & MaxGlavnica & "ukljucujuci i ove vrednosti"

ElsemcGlavnica = ZadataGlavnica

End IfEnd Property

28.05.13Visa Poslovno Tehnička Škola - Užice 5

Public Property Get Kamatnastopa() As DoubleKamatnastopa = mdKamatnaStopa

End PropertyPublic Property Let Kamatnastopa(ByVal ZadataKamatnaStopa As Double)

If ZadataKamatnaStopa < MinKamatnaStopa Or ZadataKamatnaStopa > MaxKamatnaStopa Then

'generisanje greskeErr.Raise vbObjectError + 2, "Klasa KreditFinal", _

"Nepravilan unos KamatneStope. KamatnaStopa mora biti izmedju" & _MinKamatnaStopa & " i " & MaxKamatnaStopa & "ukljucujuci i ove

vrednosti"Else

mdKamatnaStopa = ZadataKamatnaStopaEnd If

End Property

Public Property Get BrojKredita() As LongBrojKredita = mlBrojKredita

End PropertyPublic Property Let BrojKredita(ByVal ZadatiBrojKredita As Long)

mlBrojKredita = ZadatiBrojKreditaEnd Property'Obracun kamatne stope na mesecnom nivouPublic Property Get IznosRate() As Currency

IznosRate = Application.WorksheetFunction.Pmt _(mdKamatnaStopa / 12, mnRokOtplate, mcGlavnica)

End Property

Public'PAZNJA primena enumeracijePublic Property Get RokOtplate() As lnPropisaniRokOtplate

RokOtplate = mnRokOtplateEnd Property

Public Property Let RokOtplate(ByVal ZadatiRokOtplate As lnPropisaniRokOtplate)

Select Case ZadatiRokOtplateCase ln2God

mnRokOtplate = ZadatiRokOtplateCase ln3God

mnRokOtplate = ZadatiRokOtplateCase ln4God

mnRokOtplate = ZadatiRokOtplateCase ln5God

mnRokOtplate = ZadatiRokOtplateCase Else

'generisanje greskeErr.Raise vbObjectError + 3, "Klasa KreditFinal", _

"Nepr. unos RokaOtplate. RokOtplate mora jedna od vrednosti" & _"propisanih sa lnPripisaniRokOtplate"

End SelectEnd Property

klasaKREDITFinalnastavak

28.05.13Visa Poslovno Tehnička Škola - Užice 6

Sub KreditFinal()

Dim rg As RangeDim objKreditF As KreditFinal

Set rg = ThisWorkbook.Worksheets("KreditiFINAL"). _Range("PocetakZaglavljaFinal")

'Podrazumeva se da postoji imenovana zona'--"PocetakZaglavljaFinal"...Celija A1 na listu KreditiFINALDo Until IsEmpty(rg)

Set rg = rg.Offset(1, 0)LoopSet objKreditF = New KreditFinal

With objKreditF.BrojKredita = InputBox("Unesite broj Kredita", "Prometej")rg.Value = .BrojKredita.RokOtplate = InputBox("Unesite RokOtplate", "Prometej")rg.Offset(0, 1).Value = .RokOtplate.Kamatnastopa = InputBox("Unesite KamatnuStopu", "Prometej")rg.Offset(0, 2).Value = .Kamatnastopa.Glavnica = InputBox("Unesite Glavnicu", "Prometej")rg.Offset(0, 3).Value = .Glavnicarg.Offset(0, 4).Value = .IznosRate

End With

Set objKreditF = NothingSet rg = Nothing

End Sub

…Testiranje klase KREDITFinal….

Private Sub cmdKreditFinal_Click()Call KreditFinal

End Sub

28.05.13Visa Poslovno Tehnička Škola - Užice 7

''''Primer KOLEKCIJE OBJEKTA /// KREDITISub TestKolekcijeKredita()

Dim rg As RangeDim objKolekcijaKredita As CollectionDim objKreditX As KreditComplex

Set rg = ThisWorkbook.Worksheets("Krediti"). _Range("KreditiPocetakListe").Offset(1, 0)

'Dobijanje KOLEKCIJE kreditaSet objKolekcijaKredita = FormiranjeKolekcije(rg)

Debug.Print "Postoji " & objKolekcijaKredita.Count & " kredita"

'Prolazak kroz sve kredite

For Each objKreditX In objKolekcijaKreditaDebug.Print "Kredit br." & objKreditX.BrojKredita & _

" ima ratu u iznosu od " & Format(objKreditX.VisinaRate, "Currency")Next

Set objKolekcijaKredita = NothingSet objKreditX = NothingSet rg = Nothing

End Sub

…KOLEKCIJE OBJEKATA primer KREDITI.

Kolekcije klasa!!!• Objekat Collection je jednostavan generički objekat u koji se može smestiti

grupa srodnih objekata.• KLASE su sveoma otvorene prema upotrebi Collection objekta.• Primeri (Workbooks, Worksheets...)...

Function FormiranjeKolekcije(rg As Range) As CollectionDim objKreditX As KreditComplexDim objKolekcijaKredita As Collection

'Instanciranje objekta objKolekcijaObjekataSet objKolekcijaKredita = New Collection

Do Until IsEmpty(rg)Set objKreditX = New KreditComplexWith objKreditX

.BrojKredita = rg.Value

.RokOtplate = rg.Offset(0, 1).Value

.KamatnaStopa = rg.Offset(0, 2).Value

.Glavnica = rg.Offset(0, 3).Value'Za studente!: Zasto nije procitana Visinakamate!?!

End With'dodavanje tekuceg kredita u kolekciju

objKolekcijaKredita.Add objKreditX, CStr(objKreditX.BrojKredita)

Set rg = rg.Offset(1, 0)

LoopSet objKreditX = NothingSet FormiranjeKolekcije = objKolekcijaKreditaSet objKolekcijaKredita = Nothing

End Function

objCollection.Add Item, [key], [before], [after]

28.05.13Visa Poslovno Tehnička Škola - Užice 8

'Preuzeto sa MicroSoft Help//Collection objectSub ClassNamer()

Dim MyClasses As New Collection ' Kreira Collection object.Dim Num ' Brojac za individualni kljuc.Dim Msg As String ' Variable koja cuva trenutno uneti String.Dim TheName, MyObject, NameList ' Variants promenjive koji cuvaju informacije.

DoDim Inst As New Class1 ' Create a new instance of Class1.Num = Num + 1 ' Increment Num, then get a name.Msg = "Please enter a name for this object." & Chr(13) _& "Press Cancel to see names in collection."

TheName = InputBox(Msg, "Name the Collection Items")Inst.InstanceName = TheName ' Put name in object instance.' If user entered name, add it to the collection.If Inst.InstanceName <> "" Then

' Add the named object to the collection.MyClasses.Add Item:=Inst, Key:=CStr(Num)

End If' Clear the current reference in preparation for next one.Set Inst = Nothing

Loop Until TheName = ""

For Each MyObject In MyClasses ' Create list of names.NameList = NameList & MyObject.InstanceName & Chr(13)

Next MyObject' Display the list of names in a message box.MsgBox NameList, , "Instance Names In MyClasses Collection"

For Num = 1 To MyClasses.Count ' Remove name from the collection.MyClasses.Remove 1 ' Since collections are reindexed

' automatically, remove the firstNext ' member on each iteration.

End Sub

…KOLEKCIJE OBJEKATA primer MS Help.

Primer objekta tipa Collection!!!• Analizirati formiranje klasa !!!.• Analizirati kreiranje kolekcije objekata!!!• Analiza :=