Makro za štetje enot/celic v razredih

Pomoč pri izdelavi makrov
Odgovori
igorrogi
Prispevkov: 2
Pridružen: Sr Dec 10, 2008 12:34 pm

Makro za štetje enot/celic v razredih

Odgovor Napisal/-a igorrogi »

V Excel VBA želim napisati makro, ki bi v izbranih celicah izračunal kvantile oz. meje razredov (to ni problem), ko pa želim prešteti koliko enot spada v kak razred, pa ne nejdem poti naprej. Makro mi pravilno ne izračuna števil enot v posameznem razredu - bral sem na googlu da pri funkciji worksheet function countif ni možnosti sklicevanja na konstanto, poizkušal sem tudi s formulo Percentile za izračun vrednosti za konstanto c3,c4... pa ni delovalo.

Mi lahko kako pomagate oz. na konkretnem primeru napišete kodo, kako naj definiram funkcijo, da bo delovala.

Minvr = Application.Min(Selection)
MaxVr = Application.Max(Selection)
t0 = Minvr
t1 = t0 + ((MaxVr - Minvr) / 5)
t2 = t0 + ((MaxVr - Minvr) / 5 * 2)
t3 = t0 + ((MaxVr - Minvr) / 5 * 3)
t4 = t0 + ((MaxVr - Minvr) / 5 * 4)
t5 = MaxVr



ActiveSheet.Range("b2:b224").Select
vsi = Application.WorksheetFunction.Count(Selection)

c1 = Application.WorksheetFunction.countif(Selection, "<t1")
c2 = Application.WorksheetFunction.countif(Selection, ">t2") - Application.WorksheetFunction.countif(Selection, ">t2") - Application.WorksheetFunction.countif(Selection, "<t1")
c3 = Application.WorksheetFunction.Count(Selection) - Application.WorksheetFunction.countif(Selection, "<" & (Application.WorksheetFunction.Percentile(Selection, 0.4))) - Application.WorksheetFunction.countif(Selection, ">" & (Application.WorksheetFunction.Percentile(Selection, 0.6)))
c4 = Application.WorksheetFunction.Count(Selection) - Application.WorksheetFunction.countif(Selection, "<" & (Application.WorksheetFunction.Percentile(Selection, 0.6))) - Application.WorksheetFunction.countif(Selection, ">" & (Application.WorksheetFunction.Percentile(Selection, 0.8)))
c5 = Application.WorksheetFunction.countif(Selection, ">=" & (Application.WorksheetFunction.Percentile(Selection, 0.8)))
c6 = Application.WorksheetFunction.Count(Selection)


Ker sem v VBA na začetku, mi tole res predstavlja trd oreh:)
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

In zakaj želite napisati makro ki uporablja same excelove funkcije? vse kar ste napisali "v VBA kodi" je pravzaprav direktno vzeto iz Excelovih funkcij in v tem primeru je bolje vzeti excelove funkcije in le te na vašem primeru tudi delujejo.

Primer:

Koda: Izberi vse

Podatki so v celicah a1:a100

[D1] min	=MIN(A1:A100)
[D2] max	=MAX(A1:A100)
	
[D4] t0	=D1
[D5] t1	=$D$4 + (($D$2 - $D$1) / 5)
[D6] t2	=$D$4 + (($D$2 - $D$1) / 5*2)
[D7] t3	=$D$4 + (($D$2 - $D$1) / 5*3)
[D8] t4	=$D$4 + (($D$2 - $D$1) / 5*4)
[D9] t5	=D2
	
	
[D12] c0	=COUNTIF($A$1:$A$100; "<"&D4)
[D13] c1	=COUNTIF($A$1:$A$100;"<"&D5)-SUM($D$12:D12)
[D14] c2	=COUNTIF($A$1:$A$100;"<"&D6)-SUM($D$12:D13)
[D15] c3	=COUNTIF($A$1:$A$100;"<"&D7)-SUM($D$12:D14)
[D16] c4	=COUNTIF($A$1:$A$100;"<"&D8)-SUM($D$12:D15)
[D17] c5	=COUNTIF($A$1:$A$100;"<"&D9)-SUM($D$12:D16)
lp,
Matjaž Prtenjak
Administrator
igorrogi
Prispevkov: 2
Pridružen: Sr Dec 10, 2008 12:34 pm

Odgovor Napisal/-a igorrogi »

Če prav razumem moram te funkcije vedno vpisati v novem odprtem excel listu na worksheetu in ne v VB?

V mojem primeru imam podatke, ki se spreminjajo glede obsega celic, zato želim da mi avtomatsko izračuna razrede in število enot za posamezni razred, ne da bi moral vedno ko bi odprl novo datoteko, te formule vpisovati ?

Kako lahko uporabim COUNT IF v VBA oz je druga alternativa za izračun teh konstant c, ki jih potem kličem v excel preglednico?
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Hm.. Moram priznati, da sem popolnoma izgubljen in ne razumem vaših vprašanj? Zakaj bi formule pisali vsakič posebej, če pa imate enkrat že zapisane? Zakaj bi formule pisali v VBA modul, če pa je Excelov delovni list namenjen temu? Zakaj bi v VBA-ju izračunavali neke konstantice "c", ki bi jih potem spet vlekli na Excelov list, če pa jih lahko izračunate na excelovem listu?

Sicer pa funkcija countif deluje lepo in pravilno tako na delovnem listu kot v VBA-ju. Ravno tako ne razumem zakaj bi ne delovala s konstantami?? Kje pobirate takšne nesmisle?

V vašem primeru jo seveda uporabljate narobe:

Koda: Izberi vse

 ' tole ne more delovati, saj bi iskala številke, ki so manjši od niza '<t1'
c1 = Application.WorksheetFunction.countif(Selection, "<t1") 

 ' tole pa deluje, saj išče nize, ki so manjši od vrednosti zapisane v t1
c1 = Application.WorksheetFunction.countif(Selection, "<" & t1) 
Imam občutek, da želite obuti škornje, ki so vam mnogo preveliki :(. Preden se lotite VBA-ja si dobro poglejte Excel.
lp,
Matjaž Prtenjak
Administrator
Odgovori