1: 9 - 5 = 4
2: 13 - 9 = 4
3: 21 - 17 = 4
4: 25 - 21 = 4
5: 29 - 25 = 4
6: 33 - 29 = 4
7: 37 - 33 = 4
8: 41 - 37 = 4
kludne to moze cyklit aj do 100 ale urobi to len pri poslednom
Nemůžete počítat 9 - 5 = 4,
ale 9 - 4 = 5 (9 je poslední zobrazený, -4 je poslední skrytý) - nevím jak to srozumitelně vyjádřit - musíte si to vyzkoušet sám ;)
proto jsem tam psal to počítání na prstech
Range(Cells(1, (x * 4) + 5), Cells(1, (x * 4) + 9)) =>
Cells(1, (x * 4) + 5)
Cells(1, (x * 4) + 6)
Cells(1, (x * 4) + 7)
Cells(1, (x * 4) + 8)
Cells(1, (x * 4) + 9) -- tato už tam nepatří
tedy 5 buněk
ono se to necyklí - prostě vždy v jednom kroku provedete s tím pátým sloupcem jednu operaci a v dalším kroku je tentýž sloupec jako 1. a provádíte s ním další - mno a ve výsledku je to vidět až na konci ;)
@Opičák
Aha, tohle. Tak to vás nemusí trápit. Za 10 let jsem to použil poprvé a to jen ze zvědavosti. Je opravdu málo věcí z excel4 makro, které se dají využít a nejsou ve VBA.
http://excelplus.net/news.php?readmore=90
@AL
Já vím. A v podstatě všechny ty národy můžou jen závidět ;)
@Opičák
A co přesně nebere ;)
To je jednoduché. Protože mu říkáte, aby to udělal
Pro x=7 je totiž
Range(Cells(1, (x * 4) + 5), Cells(1, (x * 4) + 9)).Columns.Address
rovno
$AG$1:$AK$1
ked tam ma jasne definovane ze kolko stlpcov ma hidnut
ano, máte - 5 sloupců ;)
když budu počítat na prstech tak +5, +6, +7, +8, +9 ;))
Už jsem si všiml, že máte tendenci, řešit věci složitěji, než je třeba
Když už to nechcete dělat najednou a pomocí proměnných, tak to zjednodušte třeba takto
Private Sub lbKlienti_Change()
If Not mbEvents Then
For x = 0 To lbKlienti.ListCount - 1
Range("E:H").Offset(0, x * 4).EntireColumn.Hidden = Not lbKlienti.Selected(x)
Next
End If
End Sub
Takže jsem měl chvilku času a tohle mně zajímalo, taxem si s tím trochu hrál.
Pro slováky - jestli jsem to dobře pochopil - se nic nemění, protože ti nemají lokalizované názvy fcí.
Takže můžou v klidu použít
Function MY_EVALUATE(Formula As String)
MY_EVALUATE = Evaluate(Formula)
End Function
Výsledek bude shodný s Excel4 makrem (tedy použitím názvu)
Pro čechy a další postižené národy (pro Palooo - nejsme jediní http://www.tutoria.pl/blog/381-funkcje-excela-po-polsku-angielsku-i-niemiecku) se dá využít lokalizované fce EVALUATE (tedy pro nás VYHODNOTIT) - ta totiž naopak od VBA pracuje pouze s lokalizovanými názvy fcí (takže SUM nezná, ale SUMA ano)
Takže buď v názvu, jaxte psali výše, nebo na Listu maker Excel 4.
To má výhodu, že lze využít dalších příkazů - tedy využít např. IF-ELSE-END.IF (KDYŽ-JINAK-KONEC.KDYŽ) a ošetřit tak různé další záležitosti.
Nevýhodou je naopak, že nelze vyhodnotit "SUMA(A1:A4)" ale musí být zadáno s názvem listu "SUMA(List1!A1:A4)". Je to logické a při použití názvu je to vlastně taky, jenže tam se to doplní samo, takže na to nemusíte myslet.
Mimochodem - po deseti letech práce s excelem jsem dnes napsal své první excel4 makro a byl to boj ;)))
Pokud máte soubor .csv, není ho již třeba přizpůsobovat.
Jestliže jste nastavení nezměnil (nebo neinstaloval program, který to udělal za vás), pak je .csv asociovaný s MS Excel a otevře se přímo v něm. Pokud ne, dejte otevřít v excelu.
Takže neukládat do .txt, ale ponechat jako .csv
Mno a jelikož už jste použili makro - sešit se vás tím pádem bude ptát na povolení maker
pak mi přijde lepší
Function MY_EVALUATE(Formula As String)
MY_EVALUATE = Evaluate(Formula)
End Function
Takže se jedná o tutéž Evaluate ;)
Btw:
něco dělám špatně, pže mi to nefunguje (ale teď nemám moc času se tím zabývat)
Opičák napsal/a:
Vůbec tomu nerozumím a protože tu není odpověď, obávám se, že tomu nerozumí nikdo.
Navrhovaný ostup mi připadá krkolomně složitý, "tahání" vzorců z nějakých buněk.
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?
Jinak, když tak rychle koukám do Nápovědy
tak fce
FileDateTime
Returns a Variant (Date) that indicates the date and time when a file was created or last modified.
Ten kód jsem nestudoval, ale proč nepoužíváte možnost
Vždy vytvořit záložní kopii
=IFERROR(SVYHLEDAT(List2!A3;List1!A3:C7;2;0);"error")
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
kde bude pozice první nenulové hodnoty ve sloupci variabilní.
pokud by bylo jisté, že začíná na 1.řádku, tak
=SUMA(Data*(COUNTIF(POSUN(Data;0;0;ŘÁDEK(Data);1);"<>0")<=G1))/G1
Já bych si těmi volatilními-nevolatilními nekomplikoval život ;))
@Opičák, @AL
Pokud oblast nezačíná na řádku 1, tak to vypadá, že vám to nepočítá dobře
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
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.