Sub Statistiky 'otevřít statistiky
dim document as object, dokument as object, list as object
dim bunka_slozka as object, bunka_soubor as object
dim Nastav_Prepocet as boolean
document= ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dokument=stardesktop.currentcomponent
list=dokument.sheets(0)
bunka1=list.GetCellByPosition(0,0)'I36
bunka2=list.GetCellByPosition(0,1)'J3
Nastav_Prepocet = thisComponent.IsAutomaticCalculationEnabled
thisComponent.enableAutomaticCalculation(True)
thisComponent.enableAutomaticCalculation(Nastav_Prepocet)
bunka2.Value = bunka1.Value*4
print "konec"
End Sub
problém je v té deklarované hodnotě - false nezakazuje - ale povoluje :-)
Správně je to takto :
thisComponent.enableAutomaticCalculation(True)
PS Na konci byste měl přepočet zase povolit například takto :
deklarace ZASTAVIT PŘEPOČET - do prostoru deklarací - na začátek
Zastav_Prepocet = thisComponent.IsAutomaticCalculationEnabled
thisComponent.enableAutomaticCalculation(True)
deklarace ZASTAVIT PŘEPOČET - konec deklarace
thisComponent.enableAutomaticCalculation(Zastav_Prepocet) 'Tohle do kódu
....je zasteveno přepočítávání
kód...
....povolit přepočítávání
deklarace POVOLIT PŘEPOČET - do prostoru deklarací - na začátek
Povolit_Prepocet = thisComponent.IsAutomaticCalculationEnabled 'Tady možná patří Disabled
thisComponent.enableAutomaticCalculation(False)
deklarace POVOLIT PŘEPOČET - konec deklarace
thisComponent.enableAutomaticCalculation(Povolit_Prepocet) 'tohle do kódu
Sub Statistiky 'otevřít statistiky
dim document as object, dokument as object, list as object
dim bunka_slozka as object, bunka_soubor as object
dim Nastav_Prepocet as boolean
passw
if Cerbpas=Cerbpasin then
'panfce="faktura"
'endif
'if panfce="faktura" then
'passw
'passctrl
document= ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dokument=stardesktop.currentcomponent
list=dokument.sheets(0)
bunka_slozka=list.GetCellByPosition(8,35)'I36
Dcesta=trim(bunka_slozka.string)
bunka_soubor=list.GetCellByPosition(9,2)'J3
Dsoubor=trim(bunka_soubor.string)
ovladani.otevri (""+Dcesta+""+Dsoubor+"")
Nastav_Prepocet = thisComponent.IsAutomaticCalculationEnabled
thisComponent.enableAutomaticCalculation(False)
ovladani.LinkAktu (Dcesta+"databáze/kontakty.ods","odběratelé","odběratelé")
ovladani.LinkAktu (Dcesta+"databáze/zboží.ods","zboží","data")
ovladani.LinkAktu (Dcesta+"databáze/faktury.ods","data","data")
'wait 2000
thisComponent.enableAutomaticCalculation(Nastav_Prepocet)
ovladani.vyberlb ("data","B2")
goto konec
end if
msgbox("Zadejte heslo pro "+Fakt,0,"CHYBNÉ PŘIHLÁŠENÍ")
konec:
End Sub
http://forum.openoffice.cz/viewtopic.php?id=3669
Jiným způsobem mi aktualizace linků nefungovaly pokud jsem otvíral sešity makrem. Pochopitelně v sešitě se statistikou prodejů se sbíhají tři cesty a tudíž je makro voláno třikrát. Nejschůdnější se mi tedy jeví zakázání přepočtu během aktualizace.
]]>=SUM((data.$G$2:$G$500>=$FV$1)*(data.$G$2:$G$500<=$FV$2)*(data.O$2:O$500=$A1)*data.P$2:P$500)
lze přepsat na rychlejší
=SUMIFS(data.P$2:P$500;data.$G$2:$G$500;">="&$FV$1;data.$G$2:$G$500;"<="&$FV$2;data.O$2:O$500;$A1)
ale kt je ještě o dost rychlejší.
Dále:
Přepisy maticových vzorců pomocí SUMPRODUCT jsou skoro stejne pomalé jako původní maticový vzorec.
Pokud používáš větší úpravu sešitu makrem, tak zakaž automatickou aktualizaci, případně zakaž aktualizaci obrazovky. Např.:
myDoc = ThisComponent
myDoc.lockControllers() ' zablokuje aktualizaci obrazovky
myDoc.addActionLock() ' zablokuje aktualizaci interních objektů
' kód
myDoc.removeActionLock()
myDoc.unlockControllers()
případně jen přepočet se nastavuje
Dim bNastaveniPrepoctu as boolean
bNastaveniPrepoctu = thisComponent.IsAutomaticCalculationEnabled
thisComponent.enableAutomaticCalculation(False)
' kód
thisComponent.enableAutomaticCalculation(bNastaveniPrepoctu) ' obnové původní nastavení přepočtu
Nakonec ještě jeden tip mimo dotaz, mohl by se hodit:
Pokud máš kt s datumem v poli řádků, vyber (v kt) některý datum a aplikuj data/seskupení souhrn/seskupit.
@neutr - poznámky k použití kt vycházejí pro mne poněkud netypického způsobu použití. Lze i
jinak. Tvrzení že po automatizaci kt nepotřebujeme je pravdivé jen pokud nám nevadí řádově delší odezva při použití vzorců. Automatizace kt makrem je možná.
Také mne napadlo, že si možná neuvědomujete celý potenciál vzorců typu SUMIF, nebo SUMIFS a podobně. Představte si, že to děláte právě proto, že existuje více řádků splňujících stejná kriteria. Vzorec se nemusí použít na všechny takto 'shodné' případy.
Stačí, aby byl výsledek sečten jen pro jeden každý kvalitativní druh podmínky. Při tom může existovat problém neprázdného průniku množin s různými podmínkami.
Pokud se tedy podmínky nepřekrývají (nemají společný -správně-nemají-neprázdný-, nebo mají-jen-prázdný průnik), lze vybrat tak, aby všechny různé dávaly součet za celý soubor 1:1. Tedy součet za soubor se 'rozpadá' na jednotlivé podmínky asi jako když vytvoříme kontingenční tabulku. To je řekněme ideální stav.
Existují ale chyby, nebo i potřeby kdy se kriteria překrývají potom součet různých podmínek, je větší, nežli prostý součet položek seznamu. Pokud je součet menší, tak je to evidentně jen chyba.
Píšete že systém je používán nad fakturami. Tam se může každá maličkost vymstít. Když do každého řádku vložíte vzorec na skupinový součet a tento sloupec sečtete, tak to bude fungovat jen jako detekce chyby. Konkrétně pokud součet skupinových součtů je větší nežli prostý součet, je mezi položkami nejspíš duplicita - chyba a podobně. Tohle by potřeboval analytik FÚ.
Jestli to chcete použít k jiným účelům tak se bez kontroly konzistence neobejdete. Lze to ale udělat poměrně snadno. Spustíte nejprve COUNTIF na podmínky - zjistíte kolik je různých, nebo otestujete pomocí LOOKUP, VLOOKUP, zdvojených dotazů typu IF ap. Tak můžete získat odkazy na první stejnou kvalitativní položku. Do té pak vložíte ten SUMIFS a podobně. Pak už prostý součet souhlasí s tím součtem kvalitativních kategorií.
Pravdu má také 'lp.'. Jenomže aby toto kontingenční tabulka splnila stejně se jí musí zadat kriteria s podobou nějakého vzorce, který to vyhodnotí. Na to se užívá pomocný sloupec. Takže je to zřejmě dobré řešení, ale nedá se dobře automatizovat, respektive jakmile to zautomatizujeme, tak vlastně Kontingenční tabulku nepotřebujeme.
Překontrolovat bychom měli vždy když nás nezajímá 'jenom některá položka'. Pokud se jedná o podvojné účetnictví a neděláte kontrolu na obsahy - nazdar hodiny. Ona ale stačí i nedostatečná kontrola pro jednoduché účetnictví. Tedy faktem je, že si účetní musí poradit vždy a tak informativní kontrola letmým způsobem (nezávazně) takto dělána být samozřejmě může.
]]>Sub DejVzorec
Dim oCell As Object
oCell = ThisComponent.CurrentController.getSelection()
With oCell.RangeAddress
SH = .Sheet
SC = .StartColumn
SR = .StartRow
End With
oSheet = ThisComponent.Sheets(SH)
oCell = oSheet.GetCellbyPosition(SC, SR)
oCell.Formula = "=Address(ROW();COLUMN();4)"
End Sub
Sub DejMatici
Dim oCell As Object
oCell = ThisComponent.CurrentController.getSelection()
With oCell.RangeAddress
SH = .Sheet
SC = .StartColumn
SR = .StartRow
End With
oSheet = ThisComponent.Sheets(SH)
Dim sText as string
sText = "=SUM(G2:G500*H2:H500)"
oRange = oSheet.getCellRangeByPosition(SC, SR, SC, SR)
oRange.setArrayFormula(sText)
End Sub