Pole JMFSE(32) má indexy od 0 do 32, nie od 1 do 32 ako ich voláte v cykle.
To pole JMFSE() má určite názvy, ktoré zodpovedajú reálnym súborom ?
PL nepresahuje hodnotu 32 ?
Dajte si do Watches premennú "i", "PL", "ERR", "JMFSE(i)", "MVPT" a krokujte makro.
Mne pri zachovaní toho, že pole JMFSE() má korektné názvy a PL nepresiahne počet názvov a zároveň hodnotu 32, to ide OK.
Akurát by som vypol ScreenUpdate a odstránil Select
S = Sheets(M).Range("B4:U199")
prípadne si ešte skúste celý kód obalit do On Error Goto CHYBA
a v časti CHYBA si BrakePointnite napr MsgBox alebo čo, aby Vám to stoplo, a pozrite si hodnoty zainteresovaných premenných.
Skúste či je to OK. Doplnte si do grafu napr legendu a pod.
Neviem či som zle opísal ja Vaše čísla alebo čo, lebo mi dáva iný celkový priemer.
Skúste
ActiveX ComboBox ?
Na dvoch miestach je treba zmeniť absolútne adresovanie na relatívne. Som zvedavý či to nájdete. Teraz je to tak, že len pretiahnete bunky
Ako na to ? Ako píšem, možností je viac, MATCH/POZVYHLEDAT + INDEX, OFFSET/POSUN, INDIRECT/NEPŘÍMÝ_ODKAZ, CHOOSE/ZVOLIT, plnedynamický, polodynamický, statický, ...
Tento konkrétny príklad je polodynamický, teda napevno daný počet zoznamov, ale zoznamy môžu byť dynamicky dlhé.
-Je tam jeden vzorec v Definovaných názvoch, ktorý vyhľadá v prvom riadku listu Zoznam, na ktorom mieste sa nachádza zoznam podľa prvého výberu, a potom spočíta koľko je tam od druhého riadku po koniec zaplnených možností. A tieto potom číta druhý zoznam.
-Tieto zoznamy sú vložené cez Overenie dát
-Ako doplnok pre zvýraznenie, že sa v druhej bunke nachádza stále hodnota z predošlého zoznamu (pri zmene prvého zoznamu), je nastavené) Podmienené formátovanie.
Čo viac k tomu povedať. Ak nepotrebujete dynamický počet položiek, tak sa to dá nastaviť inak.
Viacero možností, napr. :
Pozrite sa na stránku Ron de Bruin
Každý deň sa Vám naťahajú do D7:E7 aktuálne info, ale tabuľku máte s dátami pre celý týždeň ? A odkiaľ má vzorec vedieť, ak je streda, koľko bolo vyrobeného v pondelok a v utorok, ak sa to nikde neznačí, aby to vedel neduplicitne správne spočítať ? Nemáte ani minulé požiadavky ani minulé reálne vyrobené, aby to aspoň podľa nejakého počiatočného stavu na začiatku týždňa vedel dopočítať podľa nich. Možno preto aby nešpatili graf. Neviem prísť na to, ako to má v tejto forme fungírovať :( Skúste ešte inak popísať.
-Prečo k skladu pripočítavate rozdiel medzi plánom a reálom ? Veď v minulom čase pripočítavate reálnu výrobu, a v budúcom čase ako prognózu zase plán, ale nie rozdiel medzi nimi. Ten vzorec by mohol byť skôr takto trošku upravený, vlastne jediný rozdiel je v hodnote aktuálneho dňa, a od toho sa ďalej odvádza (pri 23. to nieje 250 ale 300).
=IF(G$6<$G$5;NA();IF($G$5=G$6;$D7-$E7-G7+G9;F10-G7+G8))
=KDYŽ(G$6<$G$5;NEDEF();KDYŽ($G$5=G$6;$D7-$E7-G7+G9;F10-G7+G8))
-Odkiaľ sa berie počiatočný stav D7:E7 ?
-Ako sa mažú požiadavky, ručne či vzorcom ?
-Riadok KW sú dni mesiaca ? Ak áno, čo ostatné okrem tých 10? Ako sa posúvajú?
Môžete použiť aj následujúci postup:
1. na koniec makra pridajte
Sub VlozRadek(SH As String)
Dim H(), R As Long, i As Long, MIN As Date, DNES As Date
With Worksheets(SH)
R = .Cells(.Rows.Count, 7).End(xlUp).Row
If R > 1 Then
H = .Cells(2, 7).Resize(R - 1).Value
DNES = Date: MIN = DateSerial(9999, 9, 9)
For i = 1 To UBound(H, 1)
If H(i, 1) > DNES And H(i, 1) < MIN Then MIN = H(i, 1): R = i
Next i
If Year(MIN) <> 9999 Then
.Rows(R + 1).Insert
End If
End If
End With
End Sub
2. Na miestach v kóde, kde chcete vyvolať prehľadanie stĺpca G v práve aktívnom liste, a nájsť najbližší dátum väčší ako DNES a pred neho vložiť riadok (máte to tam tuším na 4 miestach), tak tam dajte
Call VlozRadek(ActiveSheet.Name) 'Meno listu na ktorom sa má vyhľadávať dátum a vkladať riadok
Ale ešte raz vravím, že implementácia čohokoľvek do takéhoto makra plného Selectov, kde nič nieje isté ani len názov listu, či pozícia dátumov, a nevieme o štruktúre nič, napr. či je to tabuľka alebo Tabuľka (ListObject), od ktorého po ktorý riadok sú dátumy, či má tabuľka hlavičky ... je obtiažne. Toto čo Vám popisujem funguje aj na nezotriedených dátumoch, a počíta to s hlavičkou tabuľky na 1. riadku, a s dátumami začínajúcimi na 2. riadku, a s tým, že pod tabuľkou s dátumami v stĺpci G nie sú ďalšie/iné dáta, a že dátumy sú vždy v stĺpci G.
Dosť veľké makro to teda je. A zbytočne. Žiaľ nemám na to čas, ani chuť (a ani by sa to bez reálneho súboru nedalo) Vám celých 1826 riadkov kódu prerobiť, tak iba upozorním na to, aby ste si v budúcnosti pozreli nejaké hotové projekty napr tu na fóre, a zistíte, že neustále .Select, .Activate, Selection, ActiveSheet nemusíte používať. Je to veľmi pomalé. Na list môžete pristupovať aj bez toho, aby ste si ho najskôr Selectli alebo Activovali...
Aby ste si to upravili, tak to Vás čaká naozaj hromada práce. Trošku si pozisťujte ako sa pristupuje na iný list. Každý si najskôr nahrá makro, a nevie si ho upraviť, ale časom sa do toho dostanete.
Tumad napsal/a:
... Potreboval bych automaticky dostat email, pokud by se v Office prekrocila dana hodnota.
...
Trpezlivosť je jedna vec, ale to že je to úplne zbytočné, je vec druhá. Ak totiž nechcete aby Vám to zisťovalo a vypísalo iba jedinečné hodnoty z celého zošitu, ale chcete si ich tam pridať sám aj kvôli tomu, aby tam boli aj hodnoty, ktoré sa možno nevyskytnú nikdy (napr. kvôli tomu aby bolo vidieť, ktoré sa nepoužili ... neviem), tak makro absolútne stráca zmysel. Ale aby ste nepovedal, že Vám nechcem popísať svoje makro, tak som Vám to popísal, najlepšie ako viem (najlepšie ako sa mi chce :) ), len preto aby ste zo zaujímavosti vedel ako funguje.
Zo začiatku som nechápal, prečo chcete aktualizovať iba niektorý list samostatne, ale teraz už viem, že ste len zle vyjadril to, že nechcete aby došlo k chybe ak tam niektorý list nebude.
Každopádne tu máte príklad na vzorcové riešenie, ktoré Vám odporúčal už eLCHa, len som ho trošku upravil. Zohľadňuje podmienku, že ak je v stĺpci G=9 tak sa nepočíta, a celé je to v INDIRECT/NEPŘÍMÝ.ODKAZ aby sa vzorec neprepísal na chybu #ODKAZ! keď mu bude chýbať list. A kvôli jednoduchosti zisťovania počtu riadkov si zmente tabuľky na Tabuľky. Pritom pri postupnom dopĺňaní mesiacov dbajte na to, aby vzorce odkazovali na správny názov Tabuľky. Ja som ich nazval
Tabulka01
Tabulka02
Tabulka03
....
A tak sú aj použité vo vzorcoch. Excel Vám ich tak pekne číslovať nebude.
Ďalej si dajte pozor na názvy stĺpcov, teraz sa Vám volajú "g" a "h", tak sa Vám ale v reále volať určite nebudú, a preto je nutné si podľa toho reálneho názvu upraviť vzorce v stĺpci B v Četnost
=IFERROR(COUNTIFS(INDIRECT("Tabulka01[[g]:[g]]");"<>9";INDIRECT("Tabulka01[[h]:[h]]");"*"&B$1&"*");"")
=CHYBHODN(COUNTIFS(NEPŘÍMÝ.ODKAZ("Tabulka01[[g]:[g]]");"<>9";NEPŘÍMÝ.ODKAZ("Tabulka01[[h]:[h]]");"*"&B$1&"*");"")
kde za
[g]:[g] a [h]:[h]
napíšte reálne názvy stĺpcov (hlavičky Tabuľky). Napr. :
[Kód]:[Kód] a [Šarže]:[Šarže]
POZOR: Tým, že je to v INDIRECT (vyššie spomenutý dôvod), tak Vám Excel žiadne automatické premenovanie Tabuliek či Hlavičiek vo vzorcoch neurobí !
Teda konečné odporúčanie:
(toto urobíte iba raz)
-Použite vzorcovú metódu, alias eLCHa.
-Nahodte si reálnu Tabuľku v listoch ktoré tam chcete mať (asi 01-05), s reálnym umiestnením a reálnymi Hlavičkami, reálnymi dátami.
-Zmente si vzorce v B2:B13 v liste Četnost.
(toto urobíte raz za rok)
- Vyplnte si možné hodnoty B1:XYZ1
- Roztiahnite si vzorce z B2:B13 potiahnutím na toľko stĺpcov doprava, koľko je pre daný rok hodnôt. Kludne si hodnotu doplnte ak treba, len si k nej pretiahnete vzorce zo všetkých riadkov.
(toto urobíte raz za mesiac)
- Vytvorte list, odznova, alebo kopírovaním
- Upravte v danom mesiaci, názov Tabuľky, aby korešpondoval s názvom Tabuľky vo vzorci v danom riadku podľa mesiaca. Teda ak vytvoríte Tabuľka14, zmente to na Tabulka06 (v prípade júna/června)
To je odo mňa všetko...
GeorgeK napsal/a:
"...výpočet proběhne JEN pro ten daný měsíc..."
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.