Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 27. 12. 2018 23:43:50

dech
Člen
Registrace: 1. 10. 2008
Příspěvků: 150

vlastní funkce - VYŘEŠENO

Ahojte,
zkusil by mi někdo pomoct vytvořit vlastní funkci? Vím, že se to má dělat v tom BASICu...makra nějak zvládám...ale jak naprogramovat tuto funkci nevím:

A1=1 B1=2 C1=5 D1=2

např. A3= 8

výsledkem fce by mělo být označení sloupce (číslem /písmenem/adresou..to je jedno) ve kterém platí že: SUM(A1:X1)<=A3  tedy SUM(A1:X1)<=8  ...hledám to "X"
v tomto příkladě je výsledek: "C" / 3.sloupec / C1

zkoušel jsem to normálně jako vzorec ale nejde mi to.problém bude asi v tom, že to může být n-té řešení
...a vím že v makru jsem už zkoušel něco jako proměnou která nabývala hodnot např. "i from 1 to 100"
tedy že by počítač zkoušel varianty SUM(A1:A1) SUM(A1:B1) SUM(A1:C1) ...atd..až by narazil na odpovidajici vysledek

kdybych mohl udělat pomocné bunky tak to  pujde snadno...udelal bych si kumulativni součty...jenze nemuzu...tak proto hledám způsob jak to vypočíst v "jedné bunce"

...no snad je to trochu pochopitelné

diky za tipy!

LO 6.1.2.1. (x64)

Editoval dech (21. 1. 2019 14:03:27)


LO 6.1.2.1. (x64)  WIn 8 64bit  16GB RAM

Offline

#2 28. 12. 2018 08:40:54

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,954

Re: vlastní funkce - VYŘEŠENO

dech napsal(a)

..... výsledkem fce by mělo být označení sloupce (číslem /písmenem/adresou..to je jedno) ve kterém platí že:
SUM(A1:X1)<=A3  tedy SUM(A1:X1)<=8 
...hledám to "X" ..ad 1

zkoušel jsem to normálně jako vzorec ale nejde mi to.problém bude asi v tom, že to může být n-té řešení ..ad 2
...a vím že v makru jsem už zkoušel něco jako proměnou která nabývala hodnot např. "i from 1 to 100"
tedy že by počítač zkoušel varianty SUM(A1:A1) SUM(A1:B1) SUM(A1:C1) ...atd..až by narazil na odpovidajici vysledek ..ad 3

kdybych mohl udělat pomocné bunky tak to  pujde snadno...udelal bych si kumulativni součty...jenze nemuzu...tak proto hledám způsob jak to vypočíst v "jedné bunce" ..ad 4

AD 1 :
V této interpretaci je řešení vzorcem celkem jednoduché, ale musí být splněno několik jednoduchých podmínek. Rozsah A1:X1 (X je myšlen relativní konec "posloupnosti buněk" - tedy například až A1:AMJ1 což je 1024 buněk. Vzorec takové množství "jednoduchých" dotazů skutečně "neuveze". Skutečný vzorec je limitovaný počtem bajtů, takže například v 10. řádku už vzorec nevezme to co v řádcích 1.-9.
     Jde tedy o reálné omezení maximálního počtu testovaných buněk. Podle popisu se lze domnívat, že pokud je zadaná cílová hodnota v buňce A3 tak jde pouze o jediný řádek? Co když bude skutečnost nějak navazovat (řetězit) operace na další vzorce (Ano/Ne)?
     Problém je v tom, že by mohlo jít o cyklické uzavření, které by se muselo řešit zabudovanými iteracemi systému. Zde by mohl pomoci řešitel, ale ze zadání nic podobného nelze dovodit. Lze se naproti tomu domnívat, že to bude jen část problému a řešení dle takto zjednodušené potřeby nebude v komplexu konstrukcí fungovat (například dík iteracím cyklických řešení).


AD 2 :
Problém n-tého řešení to není pokud je dán konečný počet buněk a podmínka součtu vždy od A1. Raději popíšu názorně :
A1:A1, A1:B1, A1:C1, A1:D1,......, A1:AA1,....
     Řešením je vzorec =IFS(Test;Výsledek;Test;Výsledek;Test;Výsledek;..;..;..;..). Konkrétně se musí začínat od KONCE!!! Tedy například takto v úseku A1:Z1 :

=IFS(SUM(A1:Z1)<=A3;"Z1";SUM(A1:Y1)<=A3;"Y1";SUM(A1:X1)<=A3;"X1";.;.;A1<=A3;"A1";A1>A3;"Žádný součet nevyhovuje")

     Opět musím zopakovat, že velikost vzorce je omezena - proto nemusí výše uvedené řešení vyhovět uvedenému zadání. Naproti tomu ukazuji, že řešení může vyhovovat bez pomocných buněk pokud vzorec nepřeteče (to je také k bodu AD 3).


AD 3 a 4 :
     Na takto označený problém jsem sice odpověděl v bodu 2, ale obávám se, že problém není popsán dost korektně. Uvedená podmínka SUM()<=A3 zahrnuje jak správně uvedeno KUMULATIVNÍ součty. To ale předpokládá například to, že pole A1:AX je seřazeno vzestupně.
     Další problém vidím v tom, že by se měla primárně řešit pouze jedna podmínka "=". Z toho plyne skutečnost, která říká, že vzorec IFS() pobere pouze polovinu množství, protože se musí testovat nejprve na čistou podmínku "=" a následně "řetězením" IFS(), nebo "vnořením" sekundární podmínky "<" dosáhnout kýženého výsledku.
     Dokonce mne napadá, že možná zadání vůbec nevystihuje skutečnou potřebu. Uvedu příklad jako primitivní zadání A3=5, A1=4, B1=5. Buňka B1 sama zcela vyhovuje podmínce B1=A3, ale vzorec najde jako správnou odpověď A1<=A3(=4) protože A1+B1 = (4+5 = 9) > 5.
     Tento problém hrozí zejména tehdy, když nejsou hodnoty v úseku setříděny vzestupně. Potom by bylo velmi nesprávné hledat kumulativní součty podle popisu. Takže pokud se hledá obecné úplné řešení problému, musí se předpokládat, že je třeba hledat nejprve podmínku "=" pro všechny různé jednice, následně dvojice buněk, trojice a tak dál. Teprve když žádná z možností "=" nevyhoví, je nutné testovat podmínku "<". Tento problém lze popsat jako náročnost dle Pascalova trojúhelníku, kde n = počet různých buněk. Správně tedy počet jednotlivých testů je dán 2^n a navíc ještě 2x (=,<).
     Zde se pak může vyskytovat i více správných řešení a musí se buď vypsat všechny správné z podmínky "=" (z podmínky "<" je výpis správných výsledků nesmyslný), nebo určit která podmínka má přednost - například tehdy když je jeden člen přímo roven podmínce ap.


NA ZÁVĚR :
Už jsem se jednou s podobným problémem setkal. Jednalo se hledání součtů v rámci peněžních deníků, respektive bankovních výpisů, kde se vyskytlo na jedné straně tvrzení, že lhůta pro splacení dodávek byla splněna (tedy přípustný postup dle tehdy platné účetní osnovy), zatímco dodavatel dával zboži pravidelně proti telefonickým objednávkám. Odběratel platil "kolik stačil" - v podstatě bral "na dluh". Komplikace byla v tom, že při odběru se zaplatila část dodávky "hotovostí" a zbytek šel fakturou která měla splatnost tuším 3 týdny. Dodavatel pak tvrdil, že domluvená lhůta nebyla dodržena a žádal smluvní penále - a nešlo o "drobné". Vše se muselo skončit k roční uzávěrce. Odběratel tvrdil, že vše řádně splnil a dodavatel trval na tom, že nedostal "penále". Problém šel k soudu, ale přes to dodavatel s odběratelem dál obchodoval - a účetní byla z problému "na odpis" :-(

Editoval neutr (28. 12. 2018 08:59:27)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 28. 12. 2018 11:37:58

dech
Člen
Registrace: 1. 10. 2008
Příspěvků: 150

Re: vlastní funkce - VYŘEŠENO

Ahoj Neutr(one?),

děkuji Ti za odborně a detailně popsané možnosti řešení/komentáře a zároveň se Ti už musím teď omluvit, jelikož vidím že Ti nemůžu být adekvátním diskutérem jelikož většině věcí co jsi napsal prostě nerozumím.

Ano, zadání asi není popsáno dostatečně-snažil jsem se to popsat co nejjednodušeji...což může být i na škodu k vyřešení problému.

V podstatě bych si mohl vystačit s řešením v AD2- "IFS" ...což je dost "neelegantní" řešení ale asi bude stačit.

Pokud bych měl jít ale tomu štěstíčku,pro nalezení elegantního řešení, více naproti tak Ti problematiku přiblížím více takto:

Já jsem plánováč výroby v naší firmě(cnc obrábění) a v plánu je od např. 1.1. do 30.4. 50různých dílců k vyrobení. Každý z nich trvá vyrobit různě dlouho(někdy 1 den, nekdy i 2 týdny).
Musím mít přehled o tom kdy bude jaký dílec vyroben(potvrzování objednávek apod.).
Proto mám tabulku kde jsou dílce pod sebou. U každého dílce je uveden datum startu a konce - pomocí vzorečků - dílec na řádku 10 se "dívá" kdy končí předchozí dílec na ř. 9. a zase dílec na ř. 9 se dívá na to kdy skončí dílec na ř.8 atd Jelikož víme jak dlouho jaký dílec trvá tak dokážeme spočítat i to kdy skončí.
Plán se často mění -dílce se prohazují v čase - proto to mám přes vzorečky aby se to v případě změny samo propočítalo - kdy co bude hotovo.

Jenže - je tu "problém" směnnosti- máme týden kdy je denně 1 směna a druhý týden kdy jedou 2 směny (A1=1směna/den 1.ledna ; B1=2směny 2.ledna atd. ...C1=5směn 3.ledna  je samozřejmě nesmysl aby bylo denně 5 směn..to bylo jen tak pro vzorový příklad).
S tou směnností ty moje vzorečky taky počítají - podle toho je vypočteno kdy bude jaký dílec hotový.
Problém je ten že tu směnnost pro daný týden už píšu RUČNĚ - není to vzorcem - a to je to co chci tímto celým mým dotazem změnit.
Chci aby když nějaký dílec přesunu z např.polovičky dubna (kde je průměrná směnnost za den 1 směna) na začátek března (kde je např. pruměrná smennost 1,5) tak chci aby se tak i nastavila automaticky směnnost - podle toho v jakém "období" se dílec vyrábí.
Dílec který trvá vyrobit 3 směny bude v dubnu trvat vyrobit 3 dny, kdežto v březnu 2dny

Ano-primitivně by to šlo tak,že vím že se vyrábí v 13. kalendářním týdnu a vlookupem se podívám do nějaké tabulky kde budu mít pro každý týden napsanou směnnost.
Jenže mnohdy jsou dílce vyráběny v týdnech s různou směnností (výroba trvá déle než týden)...takže 1/3 délky času je např. v týdnu s 1směnností a 2/3 času s 1,5 směnností.

Mým cílem je naučit vzoreček poznat kdy práce skončí když ví, že začíná např. 1.1. ,trvá 3 směny a dle směnnosti: v A1(1.1. 1směna) B1(2.1. 2směny) by měl zjistit kdy ta práce skončí.

No tod můj problém...NECHCI samozřejmě at nad tím bádáte a ztrácíte čas nad tímto problémem....napsal jsem to jen v naději, že někoho v mžiku něco napadne - nějaký tip...a třeba mi to pomůže.


LO 6.1.2.1. (x64)  WIn 8 64bit  16GB RAM

Offline

#4 28. 12. 2018 14:15:44

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,954

Re: vlastní funkce - VYŘEŠENO

Ano tomu rozumím docela dobře. Dovedu si to živě představit. Přijatou objednávku je nutné potvrdit a to jak cenou, tak datem expedice. Potom je Vaší starostí zahrnout všechny alternativy od logistických až po personální reality a nečekané stavy - výpadky dodávek, poruchy stroje (linky) a to jsou mantinely do kterých se musíte za každou cenu strefit. Takže potvrdíte objednávku s nějakou minimální rezervou a ta Vás potom limituje v rozhodování.
     Největší problém je zřejmě právě s tím, že nemůžete používat jednoduchý časový rámec stejných pracovních dní. To rozdělení 1 až 2 směny za den je dost divné, ale jde asi o více strojů, nebo linek protože i zde musí být rezerva pro výpadky. To vypadá jako 3 pracovní skupiny na dvě linky a při výpadku jedné linky se pokryje druhá tří-směnným provozem.


     No nic jiného neplyne, než to, že základ musí být proveden pomocí normočasů (nejspíš v hodinách). Pracovní kalendář potom určuje konkrétní termíny ve smyslu datumů - to je referenční časová osa. Šachování nastává když se něčeho nedostává - a pak jde o improvizaci. To vypadá sice "dobře", ale zpětně je nutné dovodit datumy dodávek materiálu aby byl včas na "stole".
     Zde platí spíš zkušenost jak to opravdu chodí, ale teoreticky by se mělo každý den aktualizovat (dohotovení konkrétní zakázky), zadat objednávku materiálu aby se provoz nezastavil. V tomto smyslu se jedná o typ programu PROJECT, ale základní vazby lze nasimulovat zpětnými odkazy na referenční časovou osu a konkrétní akce. Z toho potom vychází kdy co objednat, položit na stůl a zpracovat, popřípadě nařídit mimořádnou směnu když se něco nevydaří v rámci plánu.


     Je to něco jako nářezový plán času. Zásah do pořadí může mít nepříznivé dopady stejně jako příliš velké rezervy, ale někdy se tomu asi nedá zabránit. Když například v den s jednou směnou akce skončí ve 13.30 hod tak je nutné rozhodnout jestli navézt materiál na další akci, nebo uklidit a poslat lidi domů. Takže pak začínají šachy jestli je možné to či ono. Ale základní provoz lze vyladit tak aby se každý den vědělo co se dá očekávat a co se musí ten den splnit a zkontrolovat. Určitě je to řešitelné celkem jednoduchými vzorci. Horší by to bylo pokud by jelo více linek naráz a existovaly varianty rozložení postupů do série (na jeden stroj - linku), nebo parlelně na více linek a řešit práce s více akcemi každý den.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#5 28. 12. 2018 19:24:30

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 98

Re: vlastní funkce - VYŘEŠENO

Zdravím,
pokud jsem to dobře pochopil, tak by mělo fungovat toto: Test-1.ods.

Offline

#6 28. 12. 2018 22:23:43

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,954

Re: vlastní funkce - VYŘEŠENO

pro LADER : Ano tak by to sedělo. Ale skutečný provoz bude mít od teorie odchylky. Když by byl takový "rastr" v relaci hodin tak potom by se to dalo řešit pomocí modulo 8. Jenže se zásobama může být problém - možná musí vše co zbyde dát do sběru a proto může nastat potřeba - když se začne akce XY, tak se tato akce musí ihned skončit - nelze ji rozpracovat a přerušit - to jsou předpisy EU respektive důsledky které lze různě řešit a možná i obejít.
    Problém rezerv je ekonomicky nevýhodný. Pracovat by se mělo bez "skladu, nebo meziskladu" - co přivezeme hned se zpracuje - a žádné skladování. Tento problém padá na hlavu přípravy výroby, respektive logistiky. Když se něco nevydaří - musí upřednostnit jinou akci a pak "šturmovat" aby u přerušené objednávky stíhal termíny expedice.


    Autor chtěl standardní vzorce. Vy tam máte psané funkce což je jistě někdy výhodnější ale tohle autor právě nechtěl. Jeho představa vychází z lineární časové náročnosti, kterou občas musí zpřeházet a následně promítnout na referenční skutečnost pracovního rozvrhu.
    Popsal jste správně ideální stav ale nevím jestli není směnové plánování dostatečné. Dokonce bych řekl, že i hodinové rozvrhy můžou být nedostatečné. Stroje (linky) jsou většinou poloautomatické a problém efektivnosti se bude odehrávat na úrovni minut. Problém "plánovače výroby - tedy autora dotazu" je využití kapacity strojních linek na co nejvyšší míru. Obsluhy pak potřebují poletovat podle toho co potřebuje stroj aby se nazastavil a on to musí vědět dost dopředu včetně alternativ větvení "co když". Nemůže ani dávat "dostatečné" rezervy - ani přešponované termíny.


     Jeho úspěch znamená dobré výdělky a živobytí možná pro hodně lidí. Ale jak to chodí nemůžeme upřesnit. Podle všeho autor zná skutečnost, že aktivně se pracuje s 50-ti zakázkami ale termíny které určí musí splnit za každou cenu. Využitelsnost více strojů (linek) s různými parametry může být velký problém. Když bychom navrhli řešení pomocí modulo 8 tak se dostaneme na využitelnost lidského potenciálu, ale to je organizační (sekundární) problém.
     Je naznačeno, že IFS() by mohlo stačit, ale zřejmě na spodní hranici skutečných potřeb. Určitě máte představu že určení nejvýhodnějších postupů se komplikuje sério-paralelními variantami rozvržení práce. Nejsnadnější je plánování jednoho stroje. Tam by asi směnové rozvržení stačilo.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#7 10. 1. 2019 16:18:44

dech
Člen
Registrace: 1. 10. 2008
Příspěvků: 150

Re: vlastní funkce - VYŘEŠENO

Ahojte pánové,

děkuji oběma za své příspěvky.

To co zaslal LADER se zdá být funkční! děkuji!

...každopádně...(omlouvám se že není ještě pro mě dostatečné)...během začlenění vzorce do mé tabulky jsem přišel na to,  že potřebuji TAKY I fci. která by fungovala naopak:

nyní vzorec ("NAJDIS") zjišťuje kolikátá buňka v oblasti ZLEVA(směrem doprava) odpovídá kritériu.
zjištuji, že bych potřeboval i fci. která by zjištovala..ZPRAVA(směrem doleva)

Pokouším se už asi 4. hodinu upravit LADERovu fci...ale neúspěšně :-/

Myslíte, že byste to někdo zvládnul? diky

LADERe - poslal jsem ti soukromou zprávu skrz toto forum, třeba spadla do spamu...


LO 6.1.2.1. (x64)  WIn 8 64bit  16GB RAM

Offline

#8 10. 1. 2019 18:49:00

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,954

Re: vlastní funkce - VYŘEŠENO

Pokud LADER dovolí :

Function NajdiSr(Kolik, Pole As Variant)
	Dim Delka, Index, Suma
	' Data jsou ve sloupcích:
	Delka = UBound(Pole,2)	
	Suma = 0
 	For Index= Delka To 1 step -1
 		Suma=Suma+Pole(1,Index)
 		If Suma>=Kolik Then
 			' Hotovo je to tento den
 			NajdiSr = Index
 			Exit Function 
 		EndIf 
 	Next 
 	' není to hotový ... (vracím záporné číslo)
 	' nebo můžu vrátit poslední sloupec: NajdiS = Delka
 	NajdiSr = -1
End Function

Testoval jsem to na původním souboru který postnul LADER a funguje to od konce. Jenom jsem otočil iteraci součtů od konce k začátku. Proto jsem funkci přejmenoval na NajdiSr, kde "r" na konci znamená rekurze.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#9 10. 1. 2019 19:15:48

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,954

Re: vlastní funkce - VYŘEŠENO

Přes to si myslím že by to nemělo být ve směnách, ale v hodinách. Celkem by i funkce od LADERa vyhověla bez úprav. Jenom by se muselo vše zadávat v hodinách (jak pole, tak hledaný součet).
     Ale to je zřejmě jen na Vaší úvaze, respektive potřebě. Celkem bez problémů by to bylo v případě zleva do prava, kdy stačí sečíst celé směny před dnem "D" a dopočítat rozdíl. Tak se můžete dopracovat třeba k tomu, že zakázka by měla být hotová v den "D" - kupříkladu v 11.00 (tedy 5. pracovní hodina).
     Když by se počítalo zprava bylo by to mírně složitější o to že den "D" může mít 16 hodin a řekněme těch 5 hodin by se muselo odečíst tedy 22-5 = 17 z toho plyne "Start v den D" v 17.00 hod.


     Taková úprava nevyžaduje moc programátorských znalostí. Přes to by se musel definovat den před dnem "D" nejlépe jako proměnna (příklad Index2) Index2 = Index - 1. Potom "Hodina ukončení" = kolik-Index2, respektiva zprava doleva hodD - (kolik-Index2).

Editoval neutr (10. 1. 2019 19:17:18)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#10 21. 1. 2019 14:00:44

dech
Člen
Registrace: 1. 10. 2008
Příspěvků: 150

Re: vlastní funkce - VYŘEŠENO

jo! funguje to! děkuji pánové oběma za tu funkci!


LO 6.1.2.1. (x64)  WIn 8 64bit  16GB RAM

Offline

Zápatí