< návrat zpět

MS Excel


Téma: Fungovanie Collection rss

Zaslal/a icon 9.8.2014 12:11

Ahoj, mám problém s chápaním collection, ktorá by mala obsahovať unikátne hodnoty. Jednotlivé hodnoty načítam zo stĺpca B z tabulky Druha v abecednom poradí. Potom data v tabulke Druha zotriedim abecedne podľa stĺpca B a nechám vypísať hodnoty z collection. Na moje prekvapenie dochádza k ich zmene napriek tomu, že (aspoň sa teda domnievam) jednotlivé položky collection nijak nemením. Dokáže mi niekto vysvetliť, prečo sa tak deje? Vzorový súbor prikladám.
Data z collection som síce pred triedením dat v tabulke Druha schopný zapísať do nejakého poľa a ďalej pracovať miesto collection s novým poľom, mňa by ale zaujímalo, ako je možné, že položky collection, ktoré boli na začiatku unikátne, po triedení dat v tabulke Druha sú zrazu duplicitné.

Příloha: zip20973_collectionproblem.zip (16kB, staženo 26x)
Zaslat odpověď >

Strana:  « předchozí  1 2 3   další »
icon #020988
avatar
@kp57:
ja som vo vzore schválne uviedol zjednodušený príklad problému, ktorý som riešil. V reále šlo o to, aby k triedeniu dát došlo až v prípade, kedy hodnoty v konkrétnom stĺpci (v uvedenom prípade v stĺpci B) nadobúdajú viac než jednu unikátnu hodnotu. To som v reále testoval cez vlastnosť Count vytvorenej collection. Celý problém v reále bol:
1. Otestuj počet unikátnych hodnôt v danom stĺpci (stĺpec B). To sa deje cez vytvorenie collection, do ktorej sú jednotlivé hodnoty načítané v abecednom poradí.

Len prípade, že počet položiek v collection je vyšší než jedna vykonaj nasledujúce kroky:

2. zotrieď dáta v tabuľke
3. v cykle otestuj, na ktorých riadkoch dochádza ku zmene v hodnotách v stĺpci B v tabuľke - porovnaním danej hodnoty s hodnotou príslušnej položky collection.
4. za príslušný riadok z bodu 3 vlož sumárny riadok, na ktorom budú úhrny hodnôt v jednotlivých stĺpcoch danej tabuľky, prislúchajúce tejto konkrétnej unikátnej hodnote (spravidla sa jedná o sumy, resp. teda sumify, ale môže nastať i iný, komplikovanejší prípad súhrnu). V argumente príslušných vzorcov som potom použil i-tu hodnotu collection.
5. za takýto súhrnný riadok pridaj ešte jeden prázdny riadok, ktorý príslušný blok dát oddelí od ďalšieho bloku.

Celé toto bolo treba vytvoriť do už existujúcej tabuľky, ktorá už bola nejakým spôsobom sformátovaná a uložená v časti predmetného listu, ktorý okrem toho obsahuje iné tabuľky atd., čiže horeuvedený postup mi prišiel jednoduchší, než tvorenie nejakej pomocnej kontingenčky.

Čiže, aby som to skrátil. Sort len v prípade výskytu viacerých než jednej unikátnej hodnoty. Samozrejme, počet unikátnych hodnôt som mohol určiť iným spôsobom, ale napr. hodnotu maticového vzorca v tvare =sum(1/countif(nejaky_moj_range;nejaky_moj_range)), ktorým sa počet unikátnych hodnôt dá zistiť, nie je možné dostať do premennej v kóde priamo, ani v kóde vyhodnotiť bez toho, aby bola predtým zapísaná do nejakej pomocnej bunky (ktorá by mohla byť následne vymazaná, iste). No a problém bol, že hodnoty collection neboli unikátne, tak ma zaujímalo prečo.

@eLCHa: s kukátkom príliš skúsenosť nemám, zvykol som si na immediate, nepriem sa o tom, že kukátko môže byť v niektorých prípadoch vhodná alternatíva. Ja mám pri ladení kódu okno immediate otvorené a okrem chytania hodnôt ho používam i ďalšími spôsobmi, ktoré som uviedol a kde kukátko, priznám sa, že neviem, ako by šlo použiť. Pozerám, že ste tu v pre Vás neobvyklej dobe 1

edit:
@kp
reagoval som na príspevok, ktorý si meditým zmazal 1citovat
#020989
avatar
Smazal jsem ho, protože jsem si až potom všiml, že můj Sort byl neúspěšný a tím pádem Kolekce byla OK. Ano je to tak jak tu píšete. Pokud se do Kolekce přidává bez Value, tak se vlastně přidavají Range a ne Value. Sory.citovat
icon #020990
avatar
@kp57
v pohode 1
@eLCHa
pretože viem, že nezvyknete plácať do vetru, tak som ešte premýšľal, čo vlastne watches myslíte - jedná sa o okno watches vo VBE, však? Tak, to, priznám sa, som doteraz úplne prehliadal a tým pádom vôbec netuším, ako ho používať... Skúsim sa na to pozrieť, keď teda píšete, že je k tomu vhodné, díky 1
edit: tak tie watches sú vskutku šikovné, určite to začnem používať, díky!!citovat
icon #021003
avatar
No, tak som nakoniec zistil i to, ako sa dá spočítať počet unikátnych hodnôt v oblasti za použitia maticového vzorca priamo vo VBA bez zápisu do pomocnej bunky (holt, stále je čo sa učiť, akurát, že toto asi bude závislé od lokalizácie):Sub test()
Dim a As Byte, b As Byte
a = Evaluate("SumProduct(1 / CountIf(pom, pom))")
b = Evaluate("SUM(1/COUNTIF(A1:A4,A1:A4))")
MsgBox a
MsgBox b
End Sub
citovat
icon #021004
eLCHa
@AL
ano je to nezvyklá doba, proto jsem četl jen vaše vlákno a to jen tak letmo a náhodou jsem zaregistroval immediate+proměnná - proto ten výkřik ze tmy mimo téma (problém s Collection jsem nestudoval)

ano samozřejmě - jedná se o VBE Watches a prostudujte pořádně - nezapomeňte na funkcionalitu zastavit při změně hodnoty ;)))
já mám v editoru 4 podokna
samozřejmě podokno s kódem
immediate
watches
locals - také doporuřuji, pokud nepoužíváte - je to podobné watches, kde se zobrazují všechny proměnné definované v právě aktuálním modulu (nemám spuštěné, snad jsem to popsal správně, pokud je to jinak, určitě pochopíte sám)

(holt, stále je čo sa učiť, akurát, že toto asi bude závislé od lokalizácie)
pokud sem tam čtete mé příspěvky, tak už jsem zde použil několikrát - pomocí Evaluate snadno využijete maticový vzorec ve VBA - není závislé od lokalizace, ve VBA je třeba ve spojení s Evaluate vždy použít anglické názvy funkcícitovat
icon #021005
eLCHa
A btw - přidám se k těm, co nejen Vám poradí (i když Vy už to teď víte)
Vždy uvádějte, co chcete s objektem provádět ;)))

Mně se dokonce nezamlouvají ani ty Vámi používané hranaté závorky místo Range, ale proti tomu nemám argument (kdysi jsem někde něco, ale uží nevím kde a co) a pokud Vám to vyhovuje - alespoň si poznáte vlastní kód ;))

Niekoľkokrát v minulosti som narazil na radu, že sa jeden nemá spoliehať na to, že pokiaľ potrebuje v kóde získavať hodnotu z bunky, tak miesto cell, je bezpečnejšie písaťcell.value,citovat
#021008
Opičák
Pánové eLCHa a AL (a samozřejmě i jiní, které považuji za excel odborníky), přemýšlel jsem nad tím, co se v tomto vláknu probírá, přišel domů a napsal jednoduché makro.
Teď je jasné proč to fungovalo tak, jak to fungovalo, ale jde mi o tu NewColl.
Mám pravdu nebo ne ?
Příloha: zip21008_new-coll.zip (15kB, staženo 14x)
citovat
icon #021009
avatar
@eLCHa
Ďakujem za tip k locals, to som tiež, ku svojej škode, nepoužíval a po Vašom upozornení určite začnem. Ja samozrejme Vaše príspevky v rámci možností študujem, páč patria k tým najlepším na tunajšom fóre. Pokiaľ ale cielene hľadám riešenie nejakého akútneho problému, tak naďalej víťazí ako prvá voľba spomedzi internetových zdrojov google. Toľko k vysvetleniu Evaluate. Áno, uvedomujem si, že Evaluate občas zmieňujete, ale pokiaľ to človek zrovna nepotrebuje použiť, tak mu síce mysľou prebehne "jj to je užitočné", ale časom táto informácia v pamäti zapadne.

@Opičák:
bude to zrejme tak, ako popisuješcitovat
#021010
avatar
@Opičák:
Taky tu pilně studuju. Důkaz, že je to tak, je nejlíp vidět v právě v okně Locals, ve tvém makru. Tam je u NC Item 1,2,atd. uveden Typ Variant/Object/Range (a další údaje o buňce) , kdežto u NCA je Typ Variant/Double a víc nic. Nebo Variant/Text když se místo Cell.Value použije Cell.Text.
A zrovna se tu zeptám.
Kdy přesně bych měl použít Cell.Text. Pro jaké účely, jenom když chci dělit, spojit texty? Vždyť i Cell.Value mi dá text, když je text v buňce. Jsem samouk, něco použiju a když to ve výsledku funguje, víc to nepitvám. Zprvu jsem důsledně psal všude Cell.Value, nechal jsem toho, když jsem to okoukal ve zdejších nebo jiných kódech, že je zvykem to neudávat.citovat
icon #021011
avatar
@eLCHa
btw, hranaté zátvorky: pred chvíľou som si uvedomil, že fungujú ako Evaluate, takže Evaluate vlastne používam skoro stále, akurát mi nedocvaklo, že sa dajú použiť i pre vyhodnotenie maticového vzorca v kóde. Dá sa potom teda napísať i ako:a=[sum(1/countif(A1:A4,A1:A4))]citovat

Strana:  « předchozí  1 2 3   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje