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

#126 Re: Calc » Funkce zpětně zapisuje do pole z kterého pouze čte - VYŘEŠENO » 8. 11. 2014 13:12:02

Jedná se makro ve smyčce 'For-Next' kde jsem načítal jednotlivé buňky dvourozměrného pole A(i,j),  zpracoval a výsledek zapisoval do pole B(i,j).

Toto je špatně - výsledek se zapíše i do pole A (vyzkoušeno):

Dim iVar As Integer
iVar = Funkce(A(i,j))
B(i,j) = iVar

Toto je dobře:

Dim iVar As Integer
iVar = A(i,j)
B(i,j) = Funkce(iVar)

Toto je taky dobře:

B(i,j) = Funkce(ByVal A(i,j))

#127 Calc » Funkce zpětně zapisuje do pole z kterého pouze čte - VYŘEŠENO » 8. 11. 2014 11:55:19

LADER
Odpovědí: 4

Teď jsem se od včerejška trápil s programem, kdy jsem četl jedno pole dat buňku po buňce, počítal a zapisoval výsledek do druhého pole. Bohužel se mi výpočet zapisoval i do pole ze kterého jsem četl.
Takhle vypadal zápis chybného volání funkce (zjednodušeno):

B(i,j) = Funkce(A(i,j))

a takhle vypadá správné volání přes dočasnou proměnou (nic se nezapisuje):

X = A(i,j)
B(i,j) = Funkce(X)

Pravděpodobně v prvém případě se předává pouze odkaz na proměnou. V druhé případě se předává hodnota. Chyba se projeví pouze u pole.
Nevím jestli je to normální vlastnost. No vzhledem k tomu, že program jsem měl dost složitý a o tomto jsem nevěděl, tak se to fakt blbě hledá.

#128 Re: Calc » Google Tabulky - vkládá uvozovky » 5. 11. 2014 17:32:36

Ano, je to tak jak píšete. Ale dělá mi to pouze v tom geditu
(něco jako poznámkový blok ve Windows). V "lepším" editoru se to vloží jinak, jako celá buňka. Ten gedit to asi neumí a tak, aby bylo vidět, že to patří k sobě, tak to pouze uzávorkuje a pak to vypadá docela mizerně (jako celek).

#129 Re: Calc » Google Tabulky - vkládá uvozovky » 5. 11. 2014 16:34:10

Zdravím,
otevřu Google Docs Spreadsheet, napíšu do buňky text. Označím jej Control+C a vložím jej do Libre Office Writer pomocí Control+V ➞ vloží se mi normální text.
Pokud označím celou buňku ➞ vloží se mi celá buňka i s textem (část tabulky).
Pokud místo textového editoru použiji jednoduchý editor, třeba gedit ➞ vloží se mi místo buňky text, který má na začátku a na konci uvozovky (neumí vkládat orámovanou buňku - část tabulky).
Pokud, ale neoznačím celou buňku, ale pouze text ➞ vloží se mi text bez uvozovek stejně jako u Writeru z LO.
Takhle se mi to chová a nepovažuji to za chybu.

#130 Re: Calc » Maticový vzorec - VYŘEŠENO » 30. 10. 2014 18:40:07

Takže vyřešeno,

je to tak, že se vzorec před Control+Shift+Enter musí změnit. Stačí přidat mezeru a zase ji smazat, pak to funguje pokaždé.

Já jsem to nejdřív napsal vzorec, pak označil všechna políčka, kde má být matice. Pak označil vzorec v zadávacím řádku, který se už nezměnil a nakonec stiskl Control+Shift+Enter, což nic neudělalo. Byl jsem tak zvyklý z dávné historie, kdy v Excelu se tak zadávala lineární regrese. No a Libre Office to dělá lépe. Tam se nemusí zadávat políčka, kde se zobrazí výsledek. On si je najde sám, což Excel neumí (nebo kdysi neuměl).

#131 Calc » Maticový vzorec - VYŘEŠENO » 29. 10. 2014 19:22:24

LADER
Odpovědí: 3

Jak se zadává maticový vzorec vím. Označí se buňky, které patří do maticového vzorce. Kurzor se položí na vzorec a stiskne se Control+Shift+Enter. Bohužel tato akce mi změní vzorec na maticový tak v jednom případu z 1000. Tak jsem se chtěl zeptat jestli nedělám něco špatně. To byla ta moje otázka.


Jinak jsem přišel na jiný způsob - udělám to úplně stejně jako předtím, ale nemačkám Control+Shift+Enter, ale ťuknu na symbol f(x) a zaškrtnu maticový vzorec. To funguje vždy.

#132 Re: Calc » Makro vrací chybu » 22. 10. 2014 17:09:34

Děkuji za odpověď.
Toto mě nenapadlo a funguje to. Udělal jsem si na to makro na tlačítko:

Sub Vypni_Iterace
    oDoc = ThisComponent
    oDoc.IsIterationEnabled = False
End Sub

Sub Zapni_Iterace(Pocet,Zmena)
    oDoc = ThisComponent
    oDoc.IsIterationEnabled = True
    oDoc.IterationCount = Pocet
    oDoc.IterationEpsilon = Zmena
End Sub

#133 Re: Calc » Makro vrací chybu » 21. 10. 2014 19:12:16

Děkuji za odpovědi,
bohužel teď jsem dlouhodobě vytížen, tak nemám čas se tím zabývat. Navíc jsem přeinstaloval počítač kvůli podezření na softwarový problém, který se nepotvrdil.

V současné době mám nainstalovaný VirtualBox, ve kterém mi běží Linux Mint 17 a 2x Ubuntu 14.04.1. V nich testuji LibreOffice (různé verze, i tu nejnovější). Tento iterační problém se sice částečně vyřešil, přesto se někdy stane, že tam vznikne chyba 523 (při větších tabulkách). Pokud vznikne tato chyba už není jiné cesty, než tabulku smazat a znovu ji pracně vytvořit.

V současné době řeším starý problém nelineárního řešitele, který nefunguje ani v té nejnovější verzi LibreOffice. Jsem docela zklamaný, připadá mi, že jej snad nikdo nepoužívá. Nelineární řešitel používám velmi často, bohužel chodí pouze ve starých verzích OpenOffice 3 nebo v libovolné Apache OpenOffice, kde zase nechodí iterace (ty zas nepoužívám tak často).

V poslední době je vývoj softwaru tak překotný, že vzniká spoustu nových chyb a staré nejsou opravovány. Viz třeba wxMaxima jejíž nové verze jsou toho důkazem. Některé chyby se daly vyřešit kompilací ze zdrojového kódu, ale u poslední verze Maximy mám ještě jeden problém s kterým nehnu.

Ještě jednou děkuji.

Ten tip na dvojitý výpočet v jednom kroku zkusím.

#134 Re: Calc » Makro vrací chybu » 16. 10. 2014 16:44:41

Vytáhl jsem notebook, kde mám Libre Office 4.2.6.3 a mohu potvrdit, že tam to chodí korektně.
Takže to bude nějaká chyba AOO.

#135 Re: Calc » Makro vrací chybu » 16. 10. 2014 16:35:53

Tak jsem udělal jednoduché makro:

Function Test(A)
	Test = 1
End Function

Tento kód by měl vždy vracet jedničku. Pokud čtená buňka obsahuje chybu, pak výsledkem je vždy chyba a ne jednička, jak bych předpokládal. A to bude asi zdroj problému. Pokud se kdekoliv v poli objeví chyba, pak se rychle namnoží a je pak všude.


Chyba se "namnoží" i pokud použiji místo makra funkci.

#136 Re: Calc » Makro vrací chybu » 16. 10. 2014 15:04:45

Zdravím,
tady jsem uložil funkční demonstrační program v Excelu (musí být zapnuté iterace):
http://uloz.to/xoQbbkxF/potencial-napeti-xls
V Excelu není problém sestavit i větší tabulku (pak počítá déle), nikdy nevznikne chyba.
Tato v Excelu funkční tabulka se v AOO načte jako chybná.


V OpenOffice (Apache) také není problém udělat tabulku, ale musí být malinká, pokud její rozměry překročí určitou mez (5 až 8 sloupečků), pak se nic nepočítá a rovnou se vrací chyba. Připadá mi, že Calc nějak inteligentně vyhodnotí, že tohle nejde počítat a rovnou vrátí chybu i když by makro, nebo případně funkce nemělo vrátit chybu.


Funkce by měla počítat pouze z číselných hodnot, pokud budou třeba pouze dvě číselné a ostatní jiné (chybová hodnota, text, prázdná buňka) - musí se ignorovat). Celé pole (v mém případě obdélník) je vyplněno touto funkcí.


Demonstrační program počítá rozložení elektrického potenciálu v obdélníkové odporové destičce o rozměrech 10x20 mm. Levá strana (světle modrá) o délce 10 mm je připojena na napětí 0 V. Pravá strana (růžová) (10 mm) a větší část spodní strany (19 mm) je připojena na napětí 12 V. Zeleně označené okraje (S) nejsou nikam připojeny.

#137 Calc » Makro vrací chybu » 15. 10. 2014 23:44:44

LADER
Odpovědí: 12

Zdravím,
v práci jsem si udělal makro na výpočet potenciálů v polích. Je to v Excelu a funguje bez jakéḱoliv chyby. Pokud jej spustím v OpenOffice tak každá buňka vrací chybu 523.
List vypadá takto: Je to obdélník a každá buňka počítá průměr sousedních buněk. Pro správnou funkci musí být zapnuté iterace. V OpenOffice mi to vrací chybu, proto jsem vytvořil makro, které by mělo počítat i když bude vycházet z chybných hodnot. Bohužel ani toto nefunguje.
Makro na výpočet průměru sousedních buněk vypadá takto:


Function Prum(A as Variant, B as Variant, C as Variant, D as Variant) as Double
    Dim E#, N#
    E = 0
    N = 0
    If Not IsError(A) And IsNumeric(A) Then
        E = E + A
        N = N + 1
    End If
    If Not IsError(B) And IsNumeric(B) Then
        E = E + B
        N = N + 1
    End If
    If Not IsError(C) And IsNumeric(C) Then
        E = E + C
        N = N + 1
    End If
    If Not IsError(D) And IsNumeric(D) Then
        E = E + D
        N = N + 1
    End If
    If N > 0 Then
        E = E / N
    End If   
    Prum = E
End Function


Představuju si to takto - makro bude počítat průměr pouze z hodnot, které jsou čísly a nejsou chybou, pokud nebude žádná vyhovující vrátí nulu. To makro nikdy nesmí vrátit chybu. Bohužel vždy vrací chybu, stejně jako Averagea(A;B;C;D) - za A,B,C,D se dosadí sousední buňky. V Excelu funguje jak ta moje funkce (bez ošetření na chyby) taḱ i zabudovaná Průměr().

#138 Re: Calc » Prosím o radu v calcu - automatické doplnění % - VYŘEŠENO » 10. 9. 2014 10:29:32

Tak zkus:
=IF(ISERROR(FIND(UPPER("autosedačka");UPPER(B1)));21%;15%)

Toto prohledá celý text a nevadí mu velikost písmen.
Ale neumí to rozlišit "autosedačka" od "autosedacka".

#139 Re: Calc » Nelineární řešitel a jeho volání makrem. » 19. 7. 2014 19:20:06

Zdravím,
tady jsem uložil soubor, který používá volání nelineárního solveru.

Váš příklad sice zavolá dialog, ale je nevyplněný. A já potřebuji, aby všechny parametry byly již zadané včetně podmínek. Jsem schopen všechno zadat mimo předání adresy cílové (minimalizované) buňky - to je ten řádek:

Solver.Objective = ObjectiveCell

kde vznikne chyba.

Pokud není nainstalován nelineární solver, lze jej stáhnout třeba zde (pro AOO).
Pro Libre office je v příslušném repozitáři linuxové distribuce (je to jiná verze).

#140 Calc » Nelineární řešitel a jeho volání makrem. » 19. 7. 2014 13:01:34

LADER
Odpovědí: 3

Zdravím,
používám Libre Office (4.2.4 64bit) a chtěl bych pro zautomatizování činnosti volat řešitele makrem. Urychlí to výpočet odstraněním složitého zadávaní parametrů a podmínek. Bohužel nepovedlo se mi jej zprovoznit. Ukončí se to chybou na řádku (předání adresy minimalizované buňky):

Solver.Objective = ObjectiveCell

Na internetu jsem se dočetl, že touto chybou jsou postiženy všechny verze Libre Office 4.
Imunní jsou staré verze 3.
Jediné řešení co jsem našel je odinstalovat Libre Office a místo něj nainstalovat Apache Open Office (všechny verze jsou prý v pořádku).
To jsem udělal a mohu potvrdit, že poslední 64 bitová verze 4.1.0, kterou jsem zkusil, chodí v pořádku.

Chtěl jsem se zeptat, jestli někdo nezná řešení zprovoznění nelineárního solveru i v Libre Office (myslím volání makrem, jinak je funkční). Děkuji.

#141 Re: Calc » Calc nepočíta. - VYŘEŠENO » 12. 6. 2014 18:17:52

Zdravím,
chvíli mi trvalo než jsem přišel na to jak to myslíte.


První způsob (takto jsem to původně pochopil, řádek se smaže, ale zůstane):
Smazat řádek - označím řádek, a stisknu klávesu backspace nebo delete. Chybu evidentně nedělá.


Druhý způsob (řádek se odstraní a tím vše na něm):
Odstranit řádek - označím řádek a stisknu klávesu control + [-]. Řádek se úplně odstraní a závislosti přeruší a tím se způsobí tato chyba.


Dočasné řešení by bylo - označit řádek, stisknout klávesu backspace (nebo delete) a následně control + [tlačítko mínus] na numerické klávesnici. Případně na to udělat makro.


Chyba se však tím nevyřeší, pouze obejde, měla by se oznámit a opravit.

#142 Re: Calc » Rovnice - Excel spočítá, Calc ne » 4. 4. 2013 18:42:32

Sice je to staré téma, ale poměrně zajímavé.
Také jsem se setkal s tím, že Excel řešil problém přestupu tepla pomocí iterace bez problému, ale v OpenOffice (LibreOffice) to byl oříšek hodný Sisyfa.
Jak tady bylo vzpomenuto řešitel bývá optimální volbou pro tyto problémy, pokud zrovna nezvolím Newtonovu metodu, která se hodí taktéž pro numerické řešení transcendentní rovnice.
Jenže tuto úlohu lze řešit i analyticky a to pomocí Lambertovy W funkce. Calc ji sice neobsahuje, ale můžeme si ji vytvořit aproximací pomocí Taylorova rozvoje. Protože výsledek nebude přesný, použiji Newtonovu metodu přiblížení, čímž dosáhneme vysoké přesnosti v poměrně širokém rozmezí vstupních hodnot.
Výsledný kód:

' Tato funkce vrací téměř přesnou hodnotu ve velkém rozmezí kladných vstupních hodnot x: [0 .. +9E+20]
Function Lambert_W(x as Double) as Double
	Dim w as Double, z as Double, p as Double
    If (x <= 0) Then	' Funkce není počítána pro hodnoty 0 a menší !
        w = 0
    ElseIf (x < 3) Then ' Přibližná aproximace pro rozmezí [0 .. 3]
        w = (8*x^2+6*x)/(5*x^2+14*x+6)
    Else ' Velmi přibližná aproximace pro rozmezí [3 .. nějaká vysoká hodnota (nezkoušeno)]
        w = log(x)-log(log(x))
    EndIf
    
    ' Přesné přiblížení Newtonovou metodou (povolená nepřesnost)
    While abs(w-z) > 0.0000000001 
        z = w
        p = exp(w)
        w = w-(w*p-x)/(w*p+p)   
    Wend  
    
    Lambert_W = w
End Function

Function SolveNikuradseEquation(a as double) as Double
	Dim x as Double, z as Double
	z = 10^(2/5)
	x = z * exp(Lambert_W(a*(log(10))/(2*z))) / a
	SolveNikuradseEquation = x
End Function

#143 Re: Calc » Převod většího čísla na binární formát (lepší DEC2BIN)? - VYŘEŠENO » 4. 4. 2013 13:02:34

Ještě kosmetická úprava výstupního formátu (zobrazuje vždy řetězec dlouhý 31 bitů):

Function fDec2Bin(X as Double) as String
	Dim S as String
	X = Int(Abs(X)) 
	While X > 0 
		S = CStr(X mod 2) + S
		X = Int(X / 2)	
	Wend
	fDec2Bin = Right(String(32,"0") + S, 31)
End Function

#144 Re: Calc » Převod většího čísla na binární formát (lepší DEC2BIN)? - VYŘEŠENO » 3. 4. 2013 21:59:31

Makro:

Function mDec2Bin(X as Double) as String
	Dim S as String 
	X = Int(Abs(X))
	While X > 0 
		S = CStr(X mod 2) + S
		X = Int(X / 2)
	Wend
	mDec2Bin = S
End Function

#145 Re: Calc » Převod většího čísla na binární formát (lepší DEC2BIN)? - VYŘEŠENO » 3. 4. 2013 15:40:48

=CONCATENATE(DEC2BIN(MOD(FLOOR(H5/16777216;1);256);8);DEC2BIN(MOD(FLOOR(H5/65536;1);256);8);DEC2BIN(MOD(FLOOR(H5/256;1);256);8);DEC2BIN(MOD(H5;256);8))

Převede decimální číslo uložené v buňce [H5] na binární v délce 32 bitů.
Pro jinou adresu buňky jak [H5] je potřeba přepsat (ve vzorci se vyskytuje 4x).

Zápatí

Používáme FluxBB