< návrat zpět

MS Excel


Téma: Průměrný datum makrem rss

Zaslal/a 19.9.2013 18:12

Dobrý den.
Prosím, potřebuji makrem zjistit průměrný datum. Více jsem stručně popsal v příloze, v makru je část, za kterou se mi nedaří se dostat. Moc děkuji. Vladimír Krist

Příloha: zip15331_prumer_vypocet.zip (18kB, staženo 25x)
Zaslat odpověď >

Strana:  « předchozí  1 2
#015380
Opičák
@eLCHa
děkuji, za vysvětlení a že to asi nejde, už jsem se začínal bát, že demence u mě postupuje rychleji, než čekám . 9 9citovat
icon #015381
eLCHa
Tak změna
lze to - ale jestli to má využití

do zdrojové oblasti jsem zadal
=S_CARNO:S_KONTRAKT:S_Datum
a ona to vzala (i s vloženým sloupcem) ;))

edit:
Btw: ten vložený sloupec se po aktualizaci stejně objvil v KT, takže asi zbytečné a v podstatě plati, co jsem psal minulecitovat
#015390
avatar
Dobrý den pánové.
Jen na vysvětlenou. Celou tabulku zpracovávám makrem, výpočet průměru je v části procedury. Proto ne ručním zadáním vzorce, ani ničeho jiného.
Přidal jsem v příloze v makru trochu vysvětlení, proč potřebuji pojmenované sloupce. A současně i vyřešený problém. Možná pro někoho jiného. Ještě jednou díky za ochotu mi pomoci. Krist
Příloha: zip15390_prumer_vypocet_2.zip (18kB, staženo 23x)
citovat
icon #015403
eLCHa
Mám chvíli času, tak šťourám

1. to co děláte, tím simulujete Kontingenční tabulku (ale když chcete)
2. proč máte ty proměnné na úrovní modulu a ne v proceduře?
3. závěrečný cyklus - proč to neuděláte jedním krokem - zbytečně spouštíte přepočet listu v každém jeho kroku
4. Použití pojmenovaných oblastí je v pořádku, jen si nejsem jistý - píšete, že to celé zpracováváte pomocí VBA - i definici těchto oblastí (protože to v kódu nevidím)
5. zjišťování počtu sloupců převodem oblasti do pole variant a pak zjištovat dimenze pole - není to troch komplikované?

Jinak kód, který dělá to co ten váš, by mohl vypadat takto
Sub subAverage()
With Sheets("Pracovni").Columns(1)
.ClearContents
Range("S_KONTRAKT").Copy Sheets("Pracovni").Range("A1")
.RemoveDuplicates Columns:=1, Header:=xlYes
Range(.Cells(2, 1), .Cells(2, 1).End(xlDown)).Offset(0, 1).FormulaR1C1 = "=AVERAGEIF(S_KONTRAKT,RC[-1],S_DATKONEC)"
End With 'Sheets("Pracovni").Columns(1)
End Sub
citovat
#015434
avatar
elCHa:Váš kód jsem použil.Úžasné,poučné.Všeobecně čerpám z knihy o makrech včetně příkladů v souborech,upravuji ze záznamníku makra a nakonec i tato diskuze. A systém pokus omyl.
Odpovědi:
2.Mám více procedur v jednom modulu, 3.Vaše řešení je prostě bomba, 4.Pracuji s 2 "cizími" sešity. Sloupce v nich nejen cestují, ale může jich být vždy i jiný počet. Kontroluji, zda obsahují povinné názvy a podle hlaviček nazvu sloupce v makru. 5. Tady to opradu nemá smysl. V knize píšou, že takový postup - načti oblast do proměnné, proveď výpočty a vrať, je velmi rychlý. Tak tedy zde postupy zkouším, protože mám i tabulku s cca 50 000 řádky.
Moje dotazy k Vašemu řešení, abych ho pochopil:
1. co znamená tečka v range(. ? Když mi to funguje i bez ní 1
2. Jak postup ví, (podle čeho), že má skončit s vylněním datumu na posledním řádku (tedy že poslední je čtvrtý) ?
Snad Vám moje otázky nevadí. Vím, že diskuze není o učení, ale mě nejde o to, aby někdo dělal za mě. Díkycitovat
icon #015435
eLCHa
Proměnné určitě používejte. Jenom musíte používat ty správné typy (chce to praxi). A pokud používáte Objekty, nejdříve se podívejte na vlastnosti (počet řádků v oblasti je Range.Rows.Count - takže nemusíte definovat pole)
Pokud nevím jaký typ proměnné použít, používám následující trik:
definuji proměnnou typu variant a jeden řádek za přiřazením hodnoty do proměnné kód zastavím a ve VBE v okně Locals se podívám na typ, jaký proměnná má. Je tam potom napsané např: Variant/Range a vím, že to proměnná má být typu Range
Je třeba jen pamatovat (on vás kód na to stejně upozorní), že když přiřazujete do proměnné objektovou hodnotu, musíte použít Set

1. Ta tečka souvisí s tím With
takže
With Sheets("Pracovni").Columns(1)
Range(.Cells(2, 1), .Cells(2, 1).End(xlDown)).Offset(0, 1).FormulaR1C1 = "=AVERAGEIF(S_KONTRAKT,RC[-1],S_DATKONEC)"
End With 'Sheets("Pracovni").Columns(1)


je podobné jako

Range(Sheets("Pracovni").Columns(1).Cells(2, 1), Sheets("Pracovni").Columns(1).Cells(2, 1).End(xlDown)).Offset(0, 1).FormulaR1C1 = "=AVERAGEIF(S_KONTRAKT,RC[-1],S_DATKONEC)"

Bez tečky by to sice mohlo fungovat - ale bude to špatně, protože se to bude vztahovat k aktivnímu listu
(zrovna tady je výjimka,kdy to funguje, protože pokud máte aktivní list 'Pracovni' tak z tečkou je to stejná buňka jako bez tečky - nicméně stačí se přepnout na jiný list a už to bude dělat neplechu)

2. To zařídí End(xlDown)
Vlastně jsem uělal toto
.Cells(2, 1) - umístil jsem kurzor na buňku A2
.Cells(2, 1).End(xlDown) - stiskl jsem Ctrl+Shift+šipka dolů
.Offset(0, 1) - vybranou oblast jsem posunul o jeden sloupec doprava
a vyplnil

Stačí takto?citovat
#015476
avatar
ElCHa: díky, rozumím. Pokoušel jsem se přijít na to, jak pozastavit makro.V knize píšou, že to nelze. Nicméně bych pozastavení uvítal, nejen abych se podíval do Locals (jsem netušil, že se tak jde podívat na proměnnou, dokonce i na její obsah). Co používám je buď debug.print nebo krokování. Ale možnost pozastavení na určitém místě procedury a poté pokračování bych potřeboval. Díkycitovat
#015477
Opičák
v místě kde se má běh makra zastavit, abys mohl krokovat dál stiskni F9 (vlevo bude hnědá značka) , a pak spustit F5 nebo krokovat F8. Odstranění značky opět F9. Jde do kodu napsat i obyčejně stop.citovat
#015500
avatar
Opičák:To je přesně ono.Včetně jednoduchého Stop. Vám i eLCHa děkuji nejen za pomoc s průměrem, ale i za ochotu mi osvětlit i postupy a funkce, které jsem neznal. S úctou k vašim vědomostem Vladimír Kristcitovat

Strana:  « předchozí  1 2

Uživatelské menu

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

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

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

Aktivní diskuse