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

#1 15. 10. 2014 23:44:44

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

Makro vrací chybu

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().

Offline

#2 16. 10. 2014 05:18:39

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

Re: Makro vrací chybu

Na posouzení tohoto makra bych asi potřeboval vidět případ s daty, který jste použil. Mělo by to jít jednoduše vzorcem.
    Příklad :
Data jsou v buňkách A1, B1, C1 a D1. Vzorec je v E1 : -

=(IF(ISERROR(A1)=1;0;A1)+IF(ISERROR(B1)=1;0;B1)+IF(ISERROR(C1)=1;0;C1))/Count(A1:D1)

- Vzorec COUNT(A1:D1) spočítá počet číselných parametrů (buněk). Text a chybové hlášení přeskočí bez toho aby vyhodil chybu.
- Vzorce typu IF(ISERROR(A1)=1;0;A1) jednoduše započítají do součtu to, co je číslo. Mají schopnost udělat totéž pro AVERAGE a jiné statistické funkce. Někdy by to možná chtělo variantu IF(ISERROR(A1)=1;"";A1)


     Podobně by to bylo s makrem. Avšak to co popisujete u makra může mít jinou podstatu. Vaše funkce s deklarací "Variant" se vkládá do sešitu jako vzorec. Udělejte to jinak.
     Možná je chyba v té části programu kde načítáte z buněk. Zásadně by se do proměnné mělo načítat například takto A = Cell_1.Value. Chyba by se měla vyskytnout už u toho makra, které aktivuje funkci Prum(), nebo po správném ošetření pomocí ON ERROR GoTO vrátí hlášení o chybném obsahu buňky a třeba ji vybarví aj.
     Zadeklarujte do proměnné přímo buňky s názvem, nebo pomocí Inputboxu. Také je možné funkci Prum() spouštět z jiné funkce, která nejdříve načte a prověří obsah testovaných buněk. Pak by bylo možné volat funkci ze sešitu bez zadávání parametrů - takto =Prum().


     Samozřejmě lze tušit také jiný typ chyby - nejsou čísla ve formátu textu? To by elegantně vysvětlovalo proč nefungují ani vzorce ani makro.

Editoval neutr (16. 10. 2014 05:59:04)


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 16. 10. 2014 15:04:45

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

Re: Makro vrací chybu

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.

Offline

#4 16. 10. 2014 15:53:14

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

Re: Makro vrací chybu

Otevřel jsem to v LO 4.3.2.2 a vše funguje jak má. Měnil jsem parametry ve sloupci C a CG jak mne napdlo - a normálně to chodí bez chyby. Ani nevidím kde by mohla chyba vzniknout - a hlavně jak?

Editoval neutr (16. 10. 2014 15:53:40)


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 16. 10. 2014 16:35:53

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

Re: Makro vrací chybu

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.

Offline

#6 16. 10. 2014 16:44:41

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

Re: Makro vrací chybu

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.

Offline

#7 16. 10. 2014 17:56:18

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

Re: Makro vrací chybu

Nemusí to být chyba. Calc LO má jiné jádro - je rychlejší ap. Calc AOO asi jen nestíhá.


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

#8 18. 10. 2014 13:09:54

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

Re: Makro vrací chybu

Tak jsem ještě koukal na tu koncepci a problematiku. Pak mi to došlo. Nechtěl byste udělat také tabulku pro větší desky? Tohle umi Eagle ve verzi zdarma. K tomu byste ale potřeboval také výpočet proudů, odporů a kapacit. Bylo by to zajímavé rozšíření pro OpenOffice. Daly by se asi dělat plošňáky sakum prásk.
     Problém té iterace vzorců bych Vám udělal jako makro bez omezení počtu průsečíků. Stejně asi musíte pro návrh z té Vaší matice některé uzly vymazat - podobně jako na univerzální desce. Makro by Vám umožnilo pracovat neomezenými výpočty a iteracemi. Mám dokonce jeden takový iterátor připravený. Byl navržen jako univerzální pro práci s dokumenty, ale také pro vědecké výpočty. Obsahuje před, mezi a za cykly 9 maker - celkem 5x9. k tomu stačí jen udělat načítací makro pro vzorce - libovolné v matici x,y. Ty se upraví a mohou se vkládat do uzlů předem rozložených. Iterace jsou neomezené (lze je opakovaně spouštet vnitřními makry, takže přírůstky hodnot mohou být opravdu malé.
     Já mám sice práce nad hlavu, ale tohle bych asi udělal poměrně rychle. I když jsem už dost věcí slíbil a nesplnil.


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 19. 10. 2014 14:34:31

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 791

Re: Makro vrací chybu

Pokud máte nastaveny iterace, nastavujete také podmínky ukončení.

Jsou to "Minimální změna" a "Kroky"
Pokud výpočet není ukončem podmínkou "Minimální změna", tak po vyčerpání povoleného počtu kroků calc (v obou variantách) vypíše Chyba 523.

A to se také děje. Obecně řešením je zvýšit počet kroků nebo zvětšit hodnotu minimální chyby.
Calc (obě varianty), pokud má nastaven max povolený počet kroků na 1000.
Zkusil jsem soubor přepočítat v excelu. Ten při min. chybě 0,0001 potřeboval přes 3000 kroků

Vaši tabulku tak Calc celkem spolehlivě přepočítá bez chyby při nastavené min. chybě 0,01. Výpočet v tomto případě sice skončí bez chyby, ale není správný. Lze se přesvědčit dalším přepočtem (ctrl-shift-F9). Ovšem, protože nanastala chyba, lze výpočet spustit znovu.

V uvedené tabulce lze také začít výpočet s malým počtem vzorců (několik řádků) a postupě další řádky přidávat (již spočtené řádky mají své počáteční hodnoty a výpočet po přidání přiměřeného počtu vzorců může konvergovat). Je to ale dost pracné a výsledek stejně nemusí být uspokojivý.

Uvažoval jsem o nějaké simulaci v makrech. Nakonec bych doporučil následující:

Nastavit max. povolený počet kroků (1000). Nastavit min chybu na 0,01 (pokud by se při nějakém dalším výpočtu měly opět objevit chyba 523 tak tuto hodnotu vhodně zvýšit. Výpočet spouštět následujícím makrem:

Sub Prepocist()
dim i as integer
    for i = 1 to 1000
	ThisComponent.calculateAll()
	doevents
    next
End Sub

Makro si připojte na lištu nebo k nějakému objektu do listu aby se snadno spouštělo.

Makro po každém přepočtu zobrazí výsledek, můžete tak, pokud Vás to bude bavit, sledovat průběh výpočtu. Počet iterací (nastavil jsem 1000) lze samozřejmě měnit.

Do makra se dá snadno doplnit např. zkopírování spočítaných hodnot někam vedle a pak simulovat ukončení pomocí vlastní min. chyby. Makro bude pomalejší, ale výpočet může být spolehlivější.

Offline

#10 19. 10. 2014 16:41:54

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 791

Re: Makro vrací chybu

Ještě malé doplnění.

Pokud nastačí počet iterací je možně se pokusit o úpravu výpočtu tak, aby rychleji konvergoval.
V uvedeném případě se nabízí možnost předělat výpočet tak, aby v jednom kroku spočítal kroky dva.

Konkrétně:
Buňka F5: =AVERAGE(F5;F5;F5;F5;E4;E6;G4;G6;E4;E6;G4;G6;F3;D5;F7;H5)

Vzorec lze rozkopírovat do pole F5:CE42.
Obdobně lze upravit krajní řádky a sloupce.

Přepočet trvá déle, ale prochází bez chyby s min. přesností 0,0001 (AOO)
Opět je nutné přepočet několikrát opakovat.

Offline

#11 21. 10. 2014 19:12:16

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

Re: Makro vrací chybu

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.

Offline

#12 21. 10. 2014 22:30:40

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 791

Re: Makro vrací chybu

LADER napsal(a)

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.

Zkuste iterace zakázet, upravit přesnost a/nebo počet kroků a iterace zase povolit.

Offline

#13 22. 10. 2014 17:09:34

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

Re: Makro vrací chybu

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

Offline

Zápatí