Vyskúšajte toto:
Function GETYEAR(T As String) As Variant
Dim i As Byte, Y As Variant
GETYEAR = vbNullString
If Len(T) >= 4 Then
For i = 0 To Len(T) - 4
Y = Mid(T, Len(T) - 4 - i + 1, 4)
If IsNumeric(Y) And Y > 1900 And Y < 2100 Then GETYEAR = Y: Exit Function
Next i
End If
End Function
Alebo použiť namiesto podmienok funkciu CHOOSE:
=IFERROR(CHOOSE(MATCH(B8;{"LDPE";"HDPE";"CPP";"BOPP";"MDPE";"BOPP antifog";"BOPP metal";"BOPP perleť";"PET"};0);0,92;0,953;0,9;0,91;0,935;0,91;0,91;0,7;1,4);"")
Zoznam listov v Rozbaľovacom Zozname by som asi urobil takto :
Private Sub Worksheet_Activate()
Dim S As String, sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
If IsError(Application.Match(sh.Name, Array("ABC"), 0)) Then S = S & sh.Name & ","
Next sh
S = Left(S, Len(S) - 1)
With Cells(8, 1).Validation
.Delete
.Add Type:=xlValidateList, Formula1:=S
End With
If IsError(Application.Match(CStr(Cells(8, 1)), Split(S, ","), 0)) Then Cells(8, 1) = Split(S, ",")(0)
End Sub
Pričom v tom ...Array("ABC")... majú byť čiarkami oddelené názvy listov, ktoré v zozname byť nemajú.
A ten posledný riadok zabezpečí, že pri aktualizácii, sa skontroluje, či hodnota, ktorá v zozname bola predtým, môže v zozname byť, ak nie tak sa vloží prvá zo zoznamu.
Tento kód by som dal do udalosti Activate toho listu, v ktorom je zoznam. Zabezpečí to aktualizáciu zoznamu listov pri každom aktivovaní listu.
Pozeral som Vám na to, a zistil som, že je tam niekoľko komplikácií, ak chcete aby to bolo aspoň trochu blbuvzdorné, ktoré zatiaľ neviem ako vyriešiť. Málo času aj chuti.
Ako príklad spomeniem:
-Tie kódy máte ako dátum, to tak pravdepodobne byť nemá. Má to byť asi text "1.1"...
-Kvôli "blbuvzdornosti" treba zaviesť kontrolu duplicity
-zoradenie A-Z (kvôli nepravideľnosti údajov). Buď sa to zoradí teraz, alebo potom sa zoradia listy.
-listy treba najskôr zmazať, a potom rozkopírovať šablónu iba na také názvy listov, aké sú zapísané (opäť kvôli blbuvzdornosti). A zle by sa kontrolovalo, ktorý list bol prepísaný, a ktorý tam je pozostatok z minulého spustenia.
-ten kód sa musí previesť pred zoradením na rovnaký zápis. Napr. 1.0, 1.1, 1.2, 2.0, 2.1... Alebo skôr 1.00, 1.10, 1.02, 2.00, 2.10 ... (1.0 je hlavné meno, 1.1 atď sú deti) Ak by bolo tých detí viac ako 9.
-Skúšal som aj maticové vzorce, aby som odľahčil potom množstvo roboty v makre, ale zatiaľ som neprišiel prečo mi vo Vašom zošite nefunguje maticový vzorec na radenie textov, ktorý normálne používam. Tak ma napadá previesť bodku na čiarku, aby bolo z toho číslo, a to snáď zoradí dobre, ale to zasa zmizne potrebná 0 na konci.
Proste takýchto "malých" na prvý pohľad neviditeľných problémov je tam veľa.
-Rozmýšľal som aj nad Podmieneným formátovaním pre duplicity, ale to nieje blbuvzdorné, stačí urobiť Copy-Paste, a oblasť formátovania sa poruší.
Idea je zatiaľ taká, že sa zoradia data podľa upraveného stĺpca s kódom. Tam kde je "1", zmením na 1.0/1.00. Zoradím, zistím, či sa niečo neopakuje. Ak je všetko OK, vymažem listy, pre každé použité číslo 1.0/1.00 vytvorím zo šablóny (skrytý list) nový list, premenujem na časť pred čiarkou, a začnem vkladať ďalšie údaje ktoré majú 1. na začiatku (keďže je to zoradené nieje problém). Vzniknú mi aj zoradené listy.
Asi takto, ale kedy a ako presne to prípadne urobím, netuším...
No ale ja Vám teraz nerozumiem. Ak chcete čítať na jednom liste údaje z iných listov na základe hodnôt v bunkách, ktoré zastupujú adresu údajov, tak potom vzorcom INDIRECT.
Ale ak chcete ukladať z jedného listu údaje na miesto určené premennými v bunkách, vzorec použiť nemôžete. Ak vložíte napr. na list "1" vzorec s odkazom na bunku s hodnotou v základnom liste, bude Vám to fungovať iba do chvíle kým túto hodnotu v základnom liste nezmeníte na inú, ktorú chcete z tejto bunky načítať cez vzorec v inom liste napr "2". V tom momente sa Vám zmení aj hodnota v liste "1", lebo odkazuje na tú istú bunku, vzorcom.
Toto čo chcete, ak to chápem správne, tak jedine makrom. Urobil som Vám tam featurku, ak sa prekliknete na list ABC, tak sa Vám načíta zoznam listov do Výberového Zoznamu v A8. Ak stlačíte tlačítko, tak sa Vám zapíšu hodnoty "Hodn 1" a "Hodn 2" do zvoleného listu, a to na prvý voľný riadok. Transponované, čiže stĺpec mení na riadok. To je len pre ukážku.
Takto ?
Takže v stĺpcoch 6-22 a 22-6, táto časť vzorca
OR($B5="";NOT(ISERROR(MATCH($B5;{"D";"N";"očr"};0))))
testuje, či je nejaká hodnota zadaná v stĺpci B, ak je prázdne vráti TRUE, druhá časť testne či v B je niektorá z hodnôt D, N, očr. To urobí MATCH (tá 0 na konci je prepínač pre presnú hodnotu). Ak MATCH nenájde hodnotu B v poli D,N,očr, vráti chybu, preto je tam ISERROR, ktorá vráti TRUE ak je chyba. Mi ale potrebujeme zistiť, či je B hodnota z poľa, apreto to celé negujeme s NOT. Čiže získame TRUE ak B je v poli D,N,očr. Tieto 2 podmienky sú obalené v OR (alebo) a pre naše IF je to dôležité, lebo ktorákoľvek podmienka v OR je TRUE, tak OR vracia TRUE.
IF(OR($B5="";NOT(ISERROR(MATCH($B5;{"D";"N";"očr"};0))));"";
Čiže naša IF urobí čo, ak dostane výsledok podmienok v OR TRUE ? No nič, a práve o to ide. Vloží "" do stĺpcov 6-22 a 22-6, ak nieje v B nič, alebo ak je v B D,N,očr.
Ďalšia časť, zase overuje či už samotná vyhľadávacia VLOOKUP nenájde hodnotu (to je TRUE z funkcie ISERR, pretože VLOOKUP pri nenájdení vracia chybu), alebo je nájdená hodnota 0. V oboch prípadoch bude v OR, ktorá ich obaľuje, testované TRUE, a ak bude aspoň jedna podmienka TRUE, opäť vráti OR hodnotu TRUE. To je testnuté v IF, a ak je z OR TRUE, tak neurobí zasa nič, čiže vloží "".
Poznámka, tieto dve dvojice podmienok, by možno šli dať do jedného OR, neskúšal som.
OR(ISERR(VLOOKUP($B5;List3!$A$2:$G$25;4));VLOOKUP($B5;List3!$A$2:$G$25;4)=0)
A až keď máme vylúčené všemožné varianty, prečo by sme nemali nič vypisovať, tak až potom sa vloží samotná vyhľadaná hodnota cez to posledné VLOOKUP
VLOOKUP($B5;List3!$A$2:$G$25;4)
VLOOKUP funguje tak, že sa jej zadá
1 čo chceme hľadať - stĺpec B
2 kde chceme hľadať - tabuľka musí byť tomu uspôsobená, prehľadávaný stĺpec musí byť prvý, a stĺpce z ktorých budeme z validného riadku čítať údaje, musia byť zadefinované v tomto 2 parametre. Použitý je absolútny odkaz (s tými dolármi), aby sa nám neposúval v každom riadku. Naopak vyhľadávaná hodnota je čiastočne absolútna aj relatívna, stĺpec B je nežiadúce posúvať (preto $), ale riadok je nevyhnutné posúvať (preto bez $).
3 určuje z ktorého stĺpca predošlej oblasti, sa má brať údaj. Pre 6-22 tu je 4, a pre 22-6 tu je 5.
Rovnako funguje aj vzorec v Stravenky a Cestovné.
Stĺpce Dovolená, Nemoc, a očr, fungujú veľmi podobne, len sa v prvej podmienky určí že v týchto stĺpcoch sa nebude nič vypisovať ak v B nieje adekvátny "kód". Teda pre Dovolená "D", pre Nemoc "N", pre očr "očr"
PS: Ešte by som ale doporučil vo všetkých VLOOKUP vo vzorcoch pridať na koniec parameter FALSE, ktorý určuje, že bude hľadať presnú zhodu. Neviem si totiž spomenúť či je to predvolená hodnota). Tak pre istotu. Tak ako v prílohe.
Prípadne vyskúšajte INDEX MATCH konštrukciu.
Ešte ma napadlo otočiť výpočet opačne:
=3227-(3227*10/100)
a vyjde z toho 0. To číslo 10 je tam iba pre pochopenie. Tú si zamente naspäť za 100, ako ste tam mal. To len aby ste vedeli o ktorom čísle hovorím. Tak to číslo 10 je to číslo 100 z predošlého Vášho vzorca. Ako to mám vysvetliť... Tie čísla vymente, prvá 100 je druhá, a druhá je prvá. Bez tej jednej zátvorky.
Už viem ako to vysvetliť:
Nový
=3227-(3227*bbb/aaa)
Starý
=(3227-((3227/aaa)*bbb))+0
Na pripočítaní tej 0 na konci vôbec nezáleží - nemá to vplyv.
Keď ukončíte Outlook, tak sa Vás opýta, že či chcete ukončiť a odoslať neskôr, lebo sa ešte odosiela. No a Vy dáte, že chcete Ukončiť a odoslať neskôr. Pri ďalšom štarte chodte hneď do Pošta na odoslanie, označte neodoslanú správu, a dajte hore tlačítko Odstrániť. Správa by sa mala zrušiť a máte ju v Odstránené položky.
Teda takto je to presne u mňa na Outlook 2013 Pro.
Inak posielať 160 MB cez e-mail, keď mailové servery podporujú ledva pár jednotiek MB ???
V Exceli nieje možné urobiť zoznam listov pomocou vzorcov. Ak nechcete alebo nemôžete použiť makrá, máte iba jedinú možnosť. Ručne si udržiavať menný zoznam listov. Ak chcete a/alebo môžete používať makro, tak Vám napíšem kód, ktorý Vám ten zoznam urobí. Napr. vytvorte si nový list, ktorý si nazvite napr. ZoznamListov.
1.a ) Do tohoto listu napíšte od bunky A1 dole zoznam všetkých listov na ktoré sa budete chcieť prepínať.
1.b ) Zoznam práve používaných listov Vám tam vloží makro.
2.a) Do listu, kde chcete mať to prepínanie si rozvrhnite, kde chcete mať výberový zoznam, a kde hyperlinkový odkaz. Označte bunku kde bude výberový zoznam, a na karte Údaje, kliknite na Overenie údajov, tam vyberte v poli Povoliť položku Zoznam. Do poľa Zdroj zadajte tento vzorec, ktorý Vám vypočíta zaplnenú oblasť s menami v liste ZoznamListov
=OFFSET(ZoznamListov!A1;;;COUNTA(ZoznamListov!A:A);)
COUNTA spočíta zaplnené bunky v stĺpci A, a OFFSET zväčší oblasť od A1 o tento počet.
2.b) Do toho listu, v ktorom budete prepínať, vložte do bunky, na ktorú budete klikať tento vzorec :
=HYPERLINK(MID(CELL("filename");SEARCH("[";CELL("filename")); SEARCH("]";CELL("filename"))-SEARCH("[";CELL("filename"))+1)&"'"&$C$1&"'!$A$1";"Prejdi na")
pričom "Prejdi na" si nahraďte za čo chcete, a $C$1 nahraďte za adresu bunky so zoznamom (z kroku 2.b)
3. Toto si nevšímajte, to zisťuje názov zošitu, potrebný pre fungovanie hyperlinku
MID(CELL("filename");SEARCH("[";CELL("filename")); SEARCH("]";CELL("filename"))-SEARCH("[";CELL("filename"))+1)
Neviem, aký iný návod chcete.
EDIT:
Upravil som prílohu, teraz tam máte ešte okrem Hypertextového odkazu v riadkoch (A1:A30), aj hypertextový odkaz B1, ktorý sa počíta pomocou výberového zoznamu C1. Teraz ten výberový zoznam berie mená z A1:A30, ale to si môžete kľudne schovať na nejaký list, a budú použité len 2 bunky B1 a C1 (alebo adekvátne)
Nechcete náhodou vypočítať číslo znížené o percentuálny úbytok ? Ak áno, tak zmente vzorec na toto.
Máte tam 2 varianty (% číslom a % vo formáte %), a ak je to tak ako si myslím, tak aj keď zadáte úbytok 100, dostanete 0, čo v predošlom prípade nedostanete. Úplne vpravo máte kontrolu nuly.
Ešte raz som si to prečítal (no dobre tak ešte 3x), a myslím, že som to pred tým pochopil zle. Pôvodne som si myslel, že ak je nejaký dátum v celej skupine <= prvému dátumu skupiny ( podľa čísla v A), tak do tohto "titulného" riadku skupiny dať OK, alebo opačne NOK. Ale teraz som to pochopil tak, že OK/NOK treba dať asi do každého riadka v skupine okrem titulného.
Nech sa páči riešenie (maticový vzorec, čiže Ctrl+Shit+Enter):
=IF(OR($A1<>"";$B1="");"";IF($B1<=INDEX($B$1:$B1;LARGE(IF($A$1:$A1<>"";ROW($A$1:$A1);0);1));"OK";"NOK"))
stačí iba nakopírovať na potrebný počet riadkov. V predošlom prípade bolo potrebné ešte vypočítať poslednú bunku, v tomto prípade nie.
Vyskúšajte toto. Každý list má svoj variant oblastí Sucet01...
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.