Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Struktura Class-e

[es] :: Office :: Excel :: Struktura Class-e

Strane: 1 2

[ Pregleda: 4407 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.sbb.rs.



+322 Profil

icon Struktura Class-e24.10.2017. u 20:17 - pre 78 meseci
Ne baratam bas potpuno klasama, pa me zanima kako bi izgledala klasa koja bi se pozivala na sledeci nacin?
Code:
Menica("AB1234561").Add("Sheet1").EndRow


Sta bi ova klasa radila?
1. Pozivam klasu Menica, komandom Menica("AB1234561") sto klasi govori da cu baratati sa menicom serijski broj AB1234561.

2. Zatim sa .Add("Sheet1") kazem da cu dodati menicu u "Sheet1"

3. a deo .EndRow kaze da ce tu menicu upisati u prvoj slobodnoj celiji u nekom redu.

Dakle rezultat svega ce biti da ce se u nekoj koloni npr. "A", u Sheet1 u prvom slobodnom redu upisati AB1234561.
Kasnije se mogu dodati pored Add npr. Remove odredjene menice i sl.

Nije mi bitan konkretan primer, mozete osmisliti i neki svoj, vec mi je bitno kako se napravi ta struktura pri pozivanju klase Menica("AB1234561").Add("Sheet1").EndRow?

Ja bih to rastavio u vise delova tipa setuj broj menice, setuj sheet i pronadji poslendji slobodan red i tu bih je upisao, ali ne umem da to napravim lepo u jednom redu, kako se inace koriste Microsoft-ove klase.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Struktura Class-e25.10.2017. u 08:10 - pre 78 meseci
Nemoj pogrešno da me shvatiš, ali ti si jako daleko od toga da počneš da koristiš klase u VBA.

Samo tvoje pitanje pokazuje koliko toga ne razumeš. Bez obzira na to, znam da si napredan korisnik Excela, ali za korišćenje klasa ti je potrebno jako mnogo vežbe. Čak i ako uđeš u tu problematiku, korišćenje klasa može znatno da uspori razvoj aplikacija u Excelu. Možda ti ovo deluje kontraintuitivno (zašto bi neko uopšte koristio klase ako treba više vremena), ali tek prilikom razvoja većih aplikacija, klase postaju korisne. Naročito ako na problemu radi više programera, pa se razviju biblioteke klasa koje možeš da koristiš, bez pisanja od početka. Objektni pristup programiranju zahteva znatno veći period planiranja nego ono što sada radiš. Da ti to objasnim slikovito: to ti je kao razlika između krečenja sobe u sopstvenoj režiji i gradnje kuće. Kada sam krečiš, kupiš farbu, pomeriš nameštaj na sredinu sobe, pokriješ najlonom i udri. Kada gradiš kuću, prvo napraviš projekat, dobiješ dozvole, angažuješ puno majstora različite struke, pa onda svako odradi svoj deo posla. Ne samo to, nego je za organizaciju i koordinaciju posla svih tih ljudi potreban znatan napor.

Klasa je NACRT. Ona ne sadrži sama po sebi nikakve "korisne" podatke, ona opisuje OSOBINE koje svi OBJEKTI iste klase imaju, kao i METODE koje služe da se manipuliše OBJEKTIMA.

Recimo da imaš klasu Menica. Klasa Menica ima Property (osobinu) ID (identifikator menice). Ima Metodu Print (ispisivanje menice). Da bi recimo napravio novu menicu i ispisao njen ID, uz pretpostavku da imaš napravljenu klasu Menica sa osobinom ID i metodom Print, uradio bi nešto kao:

Dim m1 as new Menica

m1.ID ="AB1234561"
m1.Print

Ako sad počneš da se buniš da to tako ne izgleda kada koristiš Microsoftove klase, to je zato što ne razumeš šta je tu klasa, šta objekat, šta kolekcija, šta osobina, a šta metod klase (a o kolekcijama i tipovima nisam ti ništa ni napisao).
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Struktura Class-e25.10.2017. u 08:41 - pre 78 meseci
Evo jedan primer da bolje razumeš o čemu pričam.

Worksheets("Sheet1").Activate
ActiveSheet.PageSetup.Orientation = xlLandscape
ActiveSheet.PrintOut

U ovom primeru Worksheets je KOLEKCIJA OBJEKATA KLASE Worksheet.
Worksheets("Sheet1") je jedan od OBJEKATA u KOLEKCIJI Worksheets, čiji je indeks "Sheet1"
Activate je METODA KLASE Worksheet, koja služi za to da se Worksheet prikaže na ekranu (da postane aktivan)
ActiveSheet je OSOBINA (property) OBJEKTA KLASE Application koja je sama OBJEKAT KLASE Worksheet.
PageSetup je OBJEKAT koji pripada OBJEKTU klase Worksheet.
Orientation je OSOBINA KLASE PageSetup.
xlLandscape je KONSTANTA tipa INTEGER koja za OSOBINU KLASE PageSetup znači da je orijentacija stranice Lendscape
PrintOut je METODA KLASE Worksheet koja služi da isprinta OBJEKAT KLASE Worksheet (koji se zove ActiveSheet - zamisli da je ActiveSheet promenljiva tipa Worksheet koja sadrži pokazatelj na objekat klase Worksheet koji je trenutno aktivan)

[Ovu poruku je menjao djoka_l dana 25.10.2017. u 09:51 GMT+1]
 
Odgovor na temu

Jpeca
Predrag Jovanović
poslovni analitičar
Gowi
Pančevo

Moderator
Član broj: 25683
Poruke: 2267
89.216.49.*

Sajt: www.gowi.rs


+109 Profil

icon Re: Struktura Class-e25.10.2017. u 08:58 - pre 78 meseci
djoka_l je već napomenou nekoliko stvari koje imaju smisla, ali evo u prilogu sam pokušao da napravim nešto na osnovu tvojih uputstava, pa ti vidi da li to može da ti koristi

Klase u VBA praviš u posebnom Class modulu. U primeru je klasa Menica u modulu CMenica. Klase imaju svojstva (property) i ovde sam ja dodao Broj i Vrednost (ne koristi se ali za primer) i Metode - ovde sam dodao metodu Add za upis broja u list

U standardnom modulu sam napravio funkiju koja kreira klasu menica - da bih mogao da imitiram poziv iz tvog primera Menica("...")

Code:
Function Menica(brojMenica As String) As CMenica
' Kreiranje i inicijalizacija klase
    Set Menica = New CMenica
    Menica.Broj = brojMenica
End Function


U rutini test je deo koji si ti tražio
Code:
Sub Test()
' Test klase CMenica
    Menica("AB1234564").Add ThisWorkbook.ActiveSheet
End Sub


Neko upoznavanje sa klasam u Excelu imaš https://excelmacromastery.com/vba-class-modules/
Nije to loše Rembrante, samo što ne bi dodao još malo boje?
Prikačeni fajlovi
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Struktura Class-e25.10.2017. u 09:49 - pre 78 meseci
Bravo Peco!

Ja sam klase koristio poslednji put u Excelu pre jedno 3 godine. Inače, sve što pišem od makroa je ono za šta mi treba oko 15 minuta kuckanja. Isključivo za neke ad hoc primene.
Tada kada sam koristio klase, zamolila me koleginica iz kontrolinga da joj pomognem da automatizuje neki užasno kompleksan izveštaj za top menadžment. Imao sam "fore" 3 dana da ga napravim. Samo da ga razumem, potrošio sam ceo dan, pa sam ukapirao da nema teorije da ga bez klasa rešim "iz prve".

Sa druge strane, pošto je izveštaj išao iz firme, nisam hteo da sadrži neuredan kod (nazovi to programerskom taštinom, ali ja nikada nisam napisao "javni" kod ispod kojeg ne bih hteo da se potpišem). Pošto je koleginica "makro entuzijasta", dobro sam iskomentarisao kod, da bi ona mogla da ga modifikuje. Kad sam joj poslao izveštaj, poslala mi mejl posle 10 minuta i rekla da sve radi kako treba, samo ona ne razume kako to uopšte radi.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.sbb.rs.



+322 Profil

icon Re: Struktura Class-e25.10.2017. u 16:45 - pre 78 meseci
Prvo hvala oboma za pojasnjenja. Ja retko kada mogu da dodjem ovde u toku dana (jedino uvece) pa mozda delujem nezainteresovano ali nisam.

Sto se tice klasa, zaista im nisam vican u smislu da verovatno u zivotu nisam napravio vise od 3 klase u nekim svojim mini programima ali me zanima njihovo koriscenje.

Nisu mi potpuno nepoznate i umem da ih koristim na sledeci nacin:
Code:

Dim m1 as new Menica
dim br as integer

m1.serijskiBroj ="AB1234561"
m1.Ukloni("AB1234561")
br=m1.Count



i slicno. Medjutim ne mogu uopste da zamislim kako se pravi jednostavna struktura tako da neke property-e ne unosim kao u gore primeru jedno po jedno vec da u jednoj liniji mogu da zadam klasi da mi vrati neki podatak koji se da tako kazem "grana" (dakle da ima puno onog "posle tacke"), dakle .Add pa .EndRow, da obuhvata property-e, SUB-ove i funkcije iz klase.
Code:
Menica("AB1234561").Add("Sheet1").EndRow


@Djoka_l ja sam ti taj "makro entuzijasta". Nije mi to profesija ali 90% problema koje imam uspevam sam da resim putem pisanja macro-a, cesto i pre programera, posto oni kao sto si rekao ne poznaju u startu materiju kojom ja vladam, pa dok se upoznaju sa njom....

Dakle nije mi problem da napisem klasu za npr telefonski imenik koja ce vrsiti pretragu po imeniku, unos kontakta, brisanje starog kontakta vraca broj unetih kontakata i sl. To je rutina. Ali ne znam kako bih napisao klasu koja bi se pozivala na nacin Imenik("Petar Petrovic").telefon.visible=True tako u jednom redu.

[Ovu poruku je menjao Blue82 dana 25.10.2017. u 17:55 GMT+1]
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Struktura Class-e25.10.2017. u 17:29 - pre 78 meseci
Taj "poziv u jednom redu" treba da čitaš od pozadi.

Tako bi
Imenik("Petar Petrovic").telefon.visible=True

Imalo smisla i moglo bi se rastumačiti na sledeći način

objektu telefon, postavi osobinu visible na True. Taj objekat telefon pripada objektu koji se nalazi u kolekciji Imenik.

Sa druge strane,

Menica("AB1234561").Add("Sheet1").EndRow

nema smisla. EndRow bi trebalo da bude METOD ili OSOBINA nečega što se dobija od objekta koji vraća Add. A Add više liči na metodu nego na objekat. Onaj EndRow bi moglo da bude neka konstanta, pa da se napiše kao

Menica("AB1234561").Add("Sheet1", EndRow)

Na osnovu toga sam procenio da ti se nije "posložilo" kako objekti rade...

Dakle, ima smisla pisati:
Objekat.Objekat.Objekat.Objekat.osobina

ali ne i

Objekat.metoda.osobina

jer osobina ima smisla da se zalepi samo na objekat, a ne na metodu (osim ako metoda ne vraća objekat kao izlaznu vrednost).
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.sbb.rs.



+322 Profil

icon Re: Struktura Class-e25.10.2017. u 19:28 - pre 78 meseci
Daj mi jedan primer za ovo nebilo ti tesko? Kontam da nema vise od 20 linija code-a.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.sbb.rs.



+322 Profil

icon Re: Struktura Class-e26.10.2017. u 20:16 - pre 78 meseci
Nista od konkretnog primera? Bar mi recite, da znam da trazim na drugom mestu, ovako samo cekam.
Primer za objekat pripada objektu. To ne razumem kako da napravim.

[Ovu poruku je menjao Blue82 dana 26.10.2017. u 22:41 GMT+1]
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Struktura Class-e27.10.2017. u 07:10 - pre 78 meseci
A to ti nije jasno.

Imaš napravljenu klasu CTelefon
Napraviš klasu COsoba i unutra staviš

Public mobilni as CTelefon
Public kucni as CTelefon

....


Dakle, objekat klase COsoba imaće u sebi dva objekta tipa CTelefon.

Dim PeraMitic as COsoba

PeraMitic.mobilni.NEKIPROPERTYILIMETODKLASECTELEFON
PeraMitic.kucni.Show (ako je Show neka metoda u klasi CTelefon)
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.sbb.rs.



+322 Profil

icon Re: Struktura Class-e27.10.2017. u 16:19 - pre 78 meseci
To je to!
Tenk Ju :)
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-100.bvcom.net.



+1064 Profil

icon Re: Struktura Class-e27.10.2017. u 16:26 - pre 78 meseci
"Imaš napravljenu klasu CTelefon
Napraviš klasu COsoba i unutra staviš"

Uzasi Mikrosofta, a sto bre to C ispred? ;)
To sam provalio svi koji su radili na Windows-u sve klase prefixuju sa C a ne znam zasto ;\)
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.sbb.rs.



+322 Profil

icon Re: Struktura Class-e27.10.2017. u 19:11 - pre 78 meseci
Sada sam malo cunjao po svemu i moram priznati da si mi otvorio jedan potpuno novi horizont. Ako sam dobro razumeo svaka klasa je jedan objekat. Da li jos nesto moze da bude objekat ili su to samo klase?

Procunjao sam kroz Object Browser i sklapao u glavi sta se tu sve desava, i sta se sa cime povezuje sto do sada nisam znao, i nisam tako ni zamisljao, pa nisam mogao ni razmisljati u tom pravcu. Sada mi je jasan tvoj prvi post o zidanju kuce i zasto je to tezi put ali mi se veoma svidja.



[Ovu poruku je menjao Blue82 dana 27.10.2017. u 22:27 GMT+1]
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Struktura Class-e27.10.2017. u 23:21 - pre 78 meseci
Citat:
Blue82: Ako sam dobro razumeo svaka klasa je jedan objekat.

Ne, klasa opisuje kako odredjena vrsta objekata "izgleda" a objekti su primeri te vrste.
Klasa je ona koja kaze da svi ljudi imaju glavu, noge, ruke, itd. Znaci, samo opis ne neki konkretan covek. A objekti su Pera, Mika, Zika, i razni konkretni ljudi.
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.dynamic.sbb.rs.



+322 Profil

icon Re: Struktura Class-e28.10.2017. u 11:40 - pre 78 meseci
Pretpostavljam da je ovo moje poslednje pitanje na tu temu.

Konstrukcija sa pocetka teme, koja definitivno radi i izgleda onako kako sam zeleo ima jednu manu koja je verovatno lako resiva, ali ne dobijam ideju.
Code:
Function Menica(brojMenica As String) As CMenica
' Kreiranje i inicijalizacija klase
    Set Menica = New CMenica
    Menica.Broj = brojMenica
End Function


Code:
Sub Test()
' Test klase CMenica
    Menica("AB1234564").Add ThisWorkbook.ActiveSheet
End Sub


Po ovom programu, za svaku novu menicu koju dodajem, ako se ne varam kreira se novi objekat: Set Menica = New CMenica. Ako je to tacno, to bi znacilo da ukoliko imas unos 10000 menica, u memoriji ce se kreirati 10000 objekata koji apsolutno nisu potrebni i samo jedu memoriju. Posle dodavanja menice trebalo bi da se izvrsi

Code:
 Set Menica=Nothing


Ali gde to da stavim? To sto se nova instanca formira prilikom koriscenja funkcije Menica je super, jer to znaci da ne moze greskom da ostane, kada se neka operacija sa menicom radi, zaostali property od ranije koriscene menice. Ali ako na kraju te funkcije stavim Set Menica=Nothing, to ce se izvrsiti odmah po setovanju serijskog broja menice
Code:
Menica("AB1234564")
pa ce se za nastavak
Code:
.Add ThisWorkbook.ActiveSheet
u konstrukciji
Code:
Menica("AB1234564").Add ThisWorkbook.ActiveSheet
dobijati greska jer objekat nije setovan posto sam ga malopre unistio. Kako da unistim to setovanje, kada se na kraju izvrsi cela komanda?

[Ovu poruku je menjao Blue82 dana 28.10.2017. u 12:56 GMT+1]
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Struktura Class-e28.10.2017. u 12:04 - pre 78 meseci
Pa, ono što ne znaš, to je da klase mogu imati konstruktore i destrukture (ne i u VBA, tamo imaju sam konstruktore).

Konstruktor je metoda koja kreira objekat neke klase,
Destruktor je metoda koja "briše" objekat. U VBA postoji garbage collection, tako da se objekti automatski uništavaju kada više nisu potrebni. Recimo, imaš neku proceduru u kojoj kreiraš neki objekat. Varijabla u kojoj je objekat je lokalna za tu proceduru. Prilikom povratka iz procedure, taj objekat više nije potreban i on se automatski briše (mehanizam je malo komplikovaniji, garbage collection se dešava povremeno i u tom procesu se proverava da li postoje objekti u memoriji za koje ne postoje reference u programu, pa se onda brišu, ne obavezno odmah posle izlaska iz procedure).
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-100.bvcom.net.



+1064 Profil

icon Re: Struktura Class-e28.10.2017. u 12:06 - pre 78 meseci
Citat:
Shadowed:
Citat:
Blue82: Ako sam dobro razumeo svaka klasa je jedan objekat.

Ne, klasa opisuje kako odredjena vrsta objekata "izgleda" a objekti su primeri te vrste.
Klasa je ona koja kaze da svi ljudi imaju glavu, noge, ruke, itd. Znaci, samo opis ne neki konkretan covek. A objekti su Pera, Mika, Zika, i razni konkretni ljudi.


Ma klasa je struktura, a objekt je varijabla tipa te strukture ;)
Pusti te buzzworde, mene je to jako bunilo u pocetku ;)
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-100.bvcom.net.



+1064 Profil

icon Re: Struktura Class-e28.10.2017. u 12:14 - pre 78 meseci
"U VBA postoji garbage collection, tako da se objekti automatski uništavaju kada više nisu potrebni."

Ma jok, GC ne unistava objekt, on samo oslobodi memoriju. Ako hoces da unistis objekt onda moras mozvati metodu koja to radi. U jezicima koji to nemaju smislis sam ime za tu metodu.
Finalizer nije destruktor zato sto nema deterministicko izvrsavanje i zato sto GC uopste nije duzan da ga pozove, i sto je najgore izvrsava se asinhrono i nema redosleda po kom se izvrsava,
tj ako imas referencu na neki objekt, ne znas dal je taj vec pokojni ili ne, pa ne smes da ga diras.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Struktura Class-e28.10.2017. u 12:19 - pre 78 meseci
Ne moraš da me ispravljaš, ja objašnjavam GC ekonomisti, a ne programeru. Ne moraš dodatno da mu komplikuješ život.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-100.bvcom.net.



+1064 Profil

icon Re: Struktura Class-e28.10.2017. u 12:30 - pre 78 meseci
Izvini ;)
 
Odgovor na temu

[es] :: Office :: Excel :: Struktura Class-e

Strane: 1 2

[ Pregleda: 4407 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.