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

#1 Re: Calc » výpis a spočítání duplicitních údajů » 8. 11. 2019 15:31:58

pro kabi:
     Ano souhlasím - nabízel jsem to v příspěvku #2. Dokonce jsem měl chuť to řešit jenom kontingenční tabulkou, ale požadavek byl na vzorec. Také autofilter je dobrým řešením - byly by vidět pouze aktivní položky podle výběru - například větší než nula.
     Celkem mi vrtá hlavou nač je potřeba výpis unikátních položek do dalšího listu viz Do sloupce "A" na 1.listě budu psát pod sebe např jména. a ve sloupci třeba "B" na druhém listě se mi ta jména budou zobrazovat, ale jen jednou: Sloupec "A" první list   Sloupec "B" druhý list.
     Co by mělo být ve sloupci "A" druhého listu? makro není problém ale něco mi říká, že autor se vyjadřuje nepřesně a nakonec se vyvrbí něco úplně jiného. Makro by mělo cenu když by to byl veliký rozsah a složitá struktura. Ale takto to moc účelné není.


     Přemýšlel jsem oč asi jde a nakonec mne napadlo jen to, že autor si chce upravit vzorec na samostatnou stranu kde bude vidět jen souhrn. Takže jsem přidal vzorce které ani nežádal ale stejně to není ono. Ale faktem je, že zřejmě autor neví co umí kontingenční tabulka - že může vyexportovat výstup na jiný list ve formátu který požaduje od vzorců.
     Představoval jsem si, že by mohlo jít o požadavek vytvořit roletku "platnost dat" a na tuto naroubovat vzorce. To by bylo efektní. Když se jedná o skladové zásoby tak nechceme aby nám někdo přes rameno testoval co vše máme, nebo nemáme ve skladě. Když by se jednalo o souhrny počtů z různých skladů bylo by potřeba SUMIF stejně jako kdyby se jednalo o čerpání skladu - byla by to položka s počtem kusů a nikoliv jako jednice.


     Autor nejspíš zvažuje co by se dalo udělat, nebo vylepšit takže asi budeme čekat na upřesnění. Možná by bylo lepší zadat i širší vymezení jak by to mělo vypadat nebo k čemu by se chtěl dopracovat.

#2 Re: Calc » výpis a spočítání duplicitních údajů » 8. 11. 2019 12:04:08

Úprava je tady - snad se to dá pochopit. Použil jsem ten samý soubor - je úplně jedno zda se jedná o Milouše nebo stykače. petouf countif V2


     Tedy nejprve si zkopírujeme do listu 2 všechny 3 sloupce ale vložíme jen jako text a čísla volbou z dialogu VLOŽIT JINAK > VLOŽIT JINAK > ČÍSLA, TEXT DATUM A ČAS. Následně setřídíme podle sloupce "C" a zbytek smažeme.
     Následně vystříhneme z prvního listu vzorec buňky C1 a vložíme do C1 ve druhém listu. Zde uděláme úpravu která je ukázána názorně. Jde pouze o přepis buňky ze které s čte hledaný výraz - který se hledá v původním poli na listu 1 (tedy A1:A100).

#3 Re: Calc » Jak importovat text z calcu do writeru a zároveň ho naformátovat » 8. 11. 2019 08:21:24

pro kamlan:

kamlan napsal(a)

Ip.: Odkazovaný článek je perfektní a podařilo se mi do dokumentu vložit tabulku jako dle představ autora příspěvku a dát ten "tisk" - čili to vytvořilo dokument se všemi tabulkami. Příjemné je, že to Libre zpracuje docela rychle. Došlo však k jisté nevýhodě a to, že při tisku by to vytisklo každou tabulku na jednu stránku, tudíž spotřebovat na tom necelé tři balíky papíru (autor potřeboval přes 1000 tabulek) by rozhodně nebylo ono. Nicméně dá se to obejít docela snadno, já to zkusil přes html :-).

Výsledný dokument stačí dát uložit jako HTML, to pak otevřít ve Writeru a dát Zobrazit/ HTML zdroj. Objeví se html kód a v tom stačí vyhledat řádek který začíná na <table a v něm označit parametr style="page-break-before: always" (případně mi to někdy vytvořilo style="page-break-before: always; page-break-inside: avoid"), dát Ctrl+H a v nahrazujícím dialogu jen zmáčknout Nahradit vše. Nebo lze dát vyhledat jen to page-break-before: a nějak to zmršit, třeba to nahradit za ŘŘŘpage-break-before: -> když v html kódu je něco špatně tak to programy chytře ignorují :-) -> a zde jde o to se prostě zbavit toho zalamování tabulek na nové stránky jež je dáno oním parametrem.

Pak stačí zase dát Zobrazit/ HTML zdroj aby se to přeplo na vizuální zobrazení a poté přepnout Zobrazit/ Normální na klasické zobrazení a už to nebude rozestránkované :-).

Jistá nevýhoda převodu do html může být ale ta, že se může ztratit nějaké složitější formátování textu které se z odt do html prostě nepřevede.

     Zajímavý komentář. Zejména ty popisované úpravy na vhodnou podobu podle zadání. Víte to se má jinak. "lp." toho moc nenapovídá a tak se zapoměl zmínit, že když si vyberete z volby SOUBOR > NOVÝ > ŠTÍTKY tak si můžete na kartě MOŽNOSTI nastavit více štítků na stránce a tyto synchronizovat. Není potřeba se drbat pravou rukou za levým uchem přestože je to možné.
     Takové řešení je dobré ale musíme mít jistotu, že se tabulky budou držet ve stejné výšce, respektive šířce. Jinak se budou různě nafukovat podle obsahu a efekt je pryč. Právě proto jsem hledal řešení které by umožnilo tisk nerozdělených tabulek - ale vzdal jsem to. Štítky jsou také objekty a o to by se muselo více programovat. Z hlavy bych to nedal a musel bych pitvat zdroje.

kamlan napsal(a)

neutr: To klonování objektů přes pole nefunguje. Redim preserve udělá kopii pole pro normální vlastnosti jako string, integer apod., ale pro části objektů zanechá v těch částech reference místo aby zkopíroval hodnoty. Stačí v tom kódu co jste uvedl změnit nějakou vlastnost a změní se to u obou objektů.

     Ale v tom je to řešení právě výhodné. Já jenom nevím proč citujete ReDim Preserve. Toto je příkaz který značí změnu parametrů se zachováním stávajících. To co je v kódu vedeno ukazuje na další proměnnou která v ukázce není definovaná. Ukazuje jak se dynamicky přidávají například property - tedy třeba celé array.
     Můžete přeTYPovat array i pouhým "ReDim" - ale podle druhu přetypování se projeví například prázdná array. Přetypování může znamenat jak zvětšení tak zmenšení pole, nebo třeba přetypování z numerické na string, nebo variant. Jde také o tz. "pole polí" což je nejčastější právě u property objektů. Při tom totiž základní array nese "y" jednorozměrných array (x) a tato nemusí být stejné ve smyslu velikosti ani typu. Samozřejmě array může být i mnohorozměrná. Setkáme se asi nejčastěji s 2D, ale existují i vyšší řády - 3D, 4D.... Takže nějak nechápu Váš komentář jako celek. Originál objekty se tvoří jako instance tříd v Java. To jsou ale jak jistě víte knihovny DLL. TYP(ování) je dynamycká úprava a má dočasný charakter a ten rozdíl je zřejmý. Příkaz (nebo funkce - nevím) CreateObjekt je v podstatě klonování existujících objektů.
     To co jsem měl na mysli je skutečně dynamické provázání tabulky s odstavcem který končí prázdným řádkem. Celý "virtuálně myšleno" objekt je pak typem paragrafu (odstavce) a nikoliv tabulky i když by se asi muselo otestovat zda to má predikovaný efekt. Zabýval jsem se také funkcí která ale stále iteruje dokola parametry.
     Ještě více mne udivuje skutečnost že jste neznal výrazy setDataArray. Běžně se volá pomocí GetDataArray a vkládá (ukládá) SetDataArray. Jsou to typické případy práce v Calcu kde se načítají buď jako indexované pole, nebo pojmenované úseky. Já to používám také ale raději mám běžnou deklaraci a(x,y). Souvisí to s iteracemi v polích které jsou trošku nelogické. Mají ale výhodu že se načítají rychleji nežli pomocí jednotlivých buněk (tak jak jsem to udělal v těch tabulkách). Vývojové verze dělám "pomalé" a zrychluji až při optimalizaci a tak bych přešel z pomalejšího čtení na rychlejší - ale to je spíš můj zvyk nežli potřeba.

#4 Re: Calc » výpis a spočítání duplicitních údajů » 6. 11. 2019 16:21:21

Podobných příkladů je tady jistě více. Jedná se o použití vzorců SUMIF, COUNTIF podle toho zda ve sloupci "A" máte položky v základní poloze jednotek. Pokud je to tak jak popisujete potom například ze sloupce A (100 položek) :
Ukázka petouf - Countif
    Jak můžete vidět ani popis podle požadavku není potřebný. Lze to udělat pro odfiltrování stejných hodnot tak aby zbyly jen unikátní výrazy. To můžeme udělat například kontingenční tabulkou která tohle umí automaticky, nebo vybavit sloupce automatickým filtrem, nebo například pomocí vzorce najít jen unikátní výrazy. Možností je mnoho. Příklad uvádí přímo počty vedle správných výrazů - bez dalšího. Snad se Vám to hodí v této formě. Jinak si udělejte výběr podle Vaší představy a vzorec zařaďte do sloupce E jak možná potřebujete.

#5 Re: Calc » Jaký font je reálně použit místo chybějícího? » 6. 11. 2019 11:33:19

Toto je zřejmě nějaký nový problém. Používám velice osvědčený Japonský portál. Ten mne nyní ale zklamal. Podívejte se sem openoffice3.web.fc2.com/OOoBasic_General. Když se podíváte tak existuje kapitola i s obrázky které ukazují výstupy - ale kód k nim není. To je právě náznak, že se něco změnilo a původní kód nefunguje.
    Ještě je tady jedna berlička. Když dáte písmo z náhrady do určité buňky, nebo chcete nastavit vlastní substituci tak pomůže tento kód : CalcOOoCCFo01a a následující.
   

    Já mám stažené testy pro Writer které ale v Calcu nefungují. Dá se tam zjistit reálný font a stylování. Takže je zde možnost vykopírovat z Calcu do Writer a otestovat ve Writer. Nic moc ale snad to pomůže. někde by se to mělo najít a tak vyzkouším pohledat jinde.
    Dále uvedená makra si zkopírujte do basicu pro konkrétní testování. Není to úplně to správné používání a testování ale něco málo snad zvládne.

Sub FontPropInfo_TentoSesit()																	
Dim oDoc
oDoc = ThisComponent																
oprop1 = oDoc.CharFontStyleNameAsian													
oprop2 = oDoc.CharFontStyleName													
oprop3 = oDoc.CharFontStyleNameComplex													
msgbox(" CharFontStyleNameAsian  => " & oprop1 & Chr$(10) & _														
		" CharFontStyleName  => " & oprop2 & Chr$(10) & _
		" CharFontStyleNameComplex  => " & oprop3 ,0,"[ CharFontStyleName ]")
End Sub

Sub FontPropInfo_Sesit()
Dim oDoc
oDoc = ThisComponent
oprop1 = oDoc.CharFontName
msgbox(" CharFontName  = " & oprop1 ,0,"[ CharFontName ]")
End SUb

Sub DocCharFontNameComplex()
	Dim oDoc
	Dim OOo
	Dim SufOOo
	Dim oTempName
	Dim oDummy()
	Dim oArray(0)  As New com.sun.star.beans.PropertyValue
	Dim oProp
	oDoc = ThisComponent
		oProp = "CharFontNameComplex"											
				oS= oDoc.CharFontNameComplex													
					If NOT IsEmpty(oS) and NOT IsNull(oS) and oS<>"" then												
						oDisp = oDisp & "[  " & OOo & "  ] =  "& oS & Chr$(10) & "   "											
					End If												
				If n > 5 then Exit Sub													
		If oDisp = "<< " & oProp & " >>" & Chr$(10) & "   " then															
			oDisp = oDisp & Chr$(10) & "  "														
		End If															
		msgbox(oDisp, 0, oProp & " of PropertiesString" )															
End Sub	

#6 Re: Calc » Jak tisknout dlouhou tabulku do více sloupců výstupu? » 5. 11. 2019 22:05:33

Ano dá se to tak udělat. jenom nevím jestli si rozumíme v detailu. Ten tisk bude dělaný z Calcu, nebo to chcete dostat do Writer(u)?
    U Calcu jde o zadání "printarea" a tisk přizpůsobit šířce tiskové strany. Pokud by některý sloupec obsahoval více textu nežli druhý jsou možnosti dvě. Buď zmenšit (zvětšit) písmo v některém řádku. Řádek by měl být naformátovaný tak aby se automaticky přizpůsobil a zalamoval.
    Toto se nastavuje FORMÁT > BUŇKY > karta ZAROVNÁNÍ. Zde jsou volby možností jako zalamovat text, nebo přizpůsobit velikost písma. Problém je v tom, že z principu jsou řádky formátované pro oba sloupce stejně. Někdy by to možná vystačilo. Pokud nikoliv musí se udělat individuální úprava spočívající ve sloučení buněk jdoucích bezprostředně za sebou. Předpokládám že si rozumíme v tom jak to dělá Writer - prakticky při dvou sloupcích přetéká text mezi sloupci. Writer to umí ještě jinak pomocí sekcí respektive rámců. Tohle se musí v Calcu řešit jinak.


    Lze to řešit manuálně pomocí vzorců, které otestují délku řetězce mezi buňkami stejného řádku. Pokud budou řádky přibližně stejně "nabobtnané", lze to řešit přizpůsobeným řádkem který si zalomí text a zvětší se na potřebnou výšku. Pokud je ale jeden text značně delší nežli v druhém sloupci (a stejném řádku) je právě nutné sloupec posunout o buňku, nebo více vše dolů, sloučit buňky.
    Tím získáme určitou asynchronizaci která se musí na konci manuálně vyrovnat aby oba sloupce byly stejně dlouhé. Pokud by to byly tisíce řádků tak to už manuálně nedoporučuji přestože vzorce mohou testovat délku textu a určit kolik řádků se musí přidat (a sloupec posunout dolů).
    Ovšem vlastní sloučení buněk by se muselo dělat individuálně. Jelo by se pomocí Ctrl+šipka dolů až skončíme před první prázdnou buňou. Tam stačí podržet Shift a šipkou dolů vybrat text spolu s prázdnými buňkami > pomocí ikony sloučit buňky sloučíme a také musíme asi správně zarovnat protože po sloučení se text automaticky centruje.


    Vlastní vzorce na obsah textu musíme zjistit empiricky. Souvisí to zejména s velikostí a typem písma. Já osobně bych to řešil manuálně vzorci tak že každý sloupec bych řešil na jiném listu. Po úpravě bych oba sloupce vložil do stejného listu a popřípadě srovnal velikosti sloupců aby se moc nelišily. Takže například ve slopci A první sloupec, sloupec "B" bych udělal v nějakém rozměru aby bylo oddělení sloupců vidět. Druhý sloupec bych vložil do sloupce "C". Následně by se měla udělat grafika (prvky tabulek - nejspíš nějaká minimalizovaná forma).
    Vlastní tisk se musí zadat jako oblasti tisku pro tisk na reálné médium. Při tom je možné navolit opakující se záhlavía podobně. Ale já tuším co asi děláte a potřebujete to pro nějakou nápovědu. Pokud by to byla opakující se práce - je potřebné makro. Nic složitého to není a může se to spojit i s exportem ap.


    Jsme určitě schopni vytvořit optimální nástroj který může dělat mnoho různých věcí. Dokonce by to mohl být i výstup ve formátu XML respektive HTML. Jsem schopen udělat také návod jak to řešit rychle manuálním způsobem. Takový postup je pro jednorázové práce méně náročný nežli přizpůsobovat makro.
    Pokud poskytnete základní údaje nebo i přímo ostrá data tak to jistě uděláme (je nás víc kteří jsou tohoto schopni a tak se vyjadřuji v množném čísle).


PS : Napadlo mne, že pokud nejde o synchronizované řádky ve sloupcích tak se to řeší sndněji jako 1 dlouhý sloupec, který se upraví a nakonec rozdělí na poloviny. Představoval jsem spíš tabulku s paralelním originál anglickým textem a vedle česky. Tam by se muselo operovat se zarovnáním nebo i velikostí písma pokud by to bylo nehezké. Jenže potom žádné extra úpravy nepotřebujete - nanejvýš vložit oddělující čáry nebo prázdné řádky ap.

#7 Re: Calc » Jak importovat text z calcu do writeru a zároveň ho naformátovat » 5. 11. 2019 21:10:23

Tak bych doporučil nejdříve něco k tomu "TYPE". Asi nejlepší je vzor od klasika který možná udělal pro programování víc nežli Pythoniak - B. Marcelly. Konkrétně se podívejte přibližně do 3/4 příspěvku zde Hledejte B. Marcelly


     Já mám v poznámkách kousek kódu který ani nevím kde jsem nabral - ale dá se to určitě dohledat. Měl bych najít i další ale myslím že si poradíte. Já už nevím ani pod čím to hledat.

Type FieldPairType
fieldName As String
fieldValue As String
End Type


Type FieldsListType
fieldCnt As Integer
fieldsAllocated As Integer
fields As Variant
End Type

Sub main
  Dim x(2) As New FieldPairType
  x(0).fieldName = "bob"
  x(0).fieldValue = "joe"
 
  Dim y As New FieldsListType
  y.fields = x()
 
  MsgBox y.fields(0).fieldName
 
  Dim a() As Variant
  a() = y.fields

  ReDim Preserve a(3)
  y.fields = a()
 
  MsgBox UBound( y.fields() )
  MsgBox y.fields(0).fieldName

End Sub

    Je to jiné použití ale když si uvědomíte že se takto dá vytvořit nový objekt respektive si naklonovat nějaký existující tak je to ono. Teď ještě makro které chodí v těch tabulkách. Měl jsem tam fůru zakomentovaných řádků které jsem smazal. Takhle to chodí. Když jsem zjistil že je už zase večer tak jsem to zašlápl jako vajgla, zamkl a poslal. Dá se to značně urychlit, ale přepadl mne pocit (jak vidno správný) že to není k ničemu.

Sub TezbaCalcu
Dim oSheet as object
Dim oCell As Object
Dim oCursor As Object
oDoc = ThisComponent
oSheet = ThisComponent.Sheets.getByIndex(0)
oCell = oSheet.GetCellbyPosition(0, 0)
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(False)
LR = oCursor.RangeAddress.EndRow
sTimer = Timer()
Dim sVar(0 To 2,0 To LR) As variant
For i = 0 To LR
sVar(0,i) = oSheet.GetCellbyPosition(0, i).String
sVar(1,i) = oSheet.GetCellbyPosition(1, i).String
sVar(2,i) = oSheet.GetCellbyPosition(2, i).String
next i
WriterTable_CalcData(sVar, LR)
eTimer = Timer()-sTimer
MsgBox("Práce " & LR + 1 & " tabulek provedena za " & INT(eTimer/60) & " minut a " & eTimer MOD 60 & " sekund",64, "Konec práce")
End Sub

Sub WriterTable_CalcData(ByRef svar() as Variant, ByVal ER as long)									
	Dim oDoc									
  	Dim oTable									
  	Dim oCurs									
  	Dim oText									
  	Dim Dummy()									
  		oDoc = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Dummy())
  		oVCursor = oDoc.getCurrentController().getViewCursor()								
  		oText = oDoc.getText()
  		oVCursor.gotoEnd(True)							
For i = 0 To ER 
sVar1 = svar(0,i)
sVar2 = i + 1 &". " & svar(1,i)
sVar3 = svar(2,i)
  		oTable = oDoc.createInstance("com.sun.star.text.TextTable")	
		oTextCursor = oText.createTextCursor()
		oText = oDoc.getText()															
		oVCursor.gotoEnd(True)															
		with oTextCursor															
			.CharHeight = 12														
		End With						
  			oTable.initialize(3, 2)							
  			oCurs = oDoc.getCurrentController().getViewCursor()							
  			oText.insertTextContent(oCurs, oTable, False)							
  			oTable.setDataArray(Array(Array("",""), Array("",""), Array("",""))
  			'------------------------------------------	
  			oRows = oTable.getRows() 
			oRows.removeByIndex(0,1)
			'------------------------------------------						
  		Dim oTableCur as Object								
  			oTableCur =oTable.createCursorByCellName("A1")							
  			oTableCur.goDown(1,True)							
			oTableCur.mergeRange()
			'------------------------------------------							
  		Dim oTblColSeps 							
  			oTblColSeps = oTable.TableColumnSeparators							
  			oTblColSeps(0).Position = 2000	
  			oTable.TableColumnSeparators = oTblColSeps
  			'------------------------------------------
  		Dim oCell0, oCell1, oCell2 							
    		oCell0 = oTable.getCellByPosition(0, 0)
    		oCell0.string = svar1
    		oCell1 = oTable.getCellByPosition(1, 0)
    		oCell1.string = sVar2
    		oCell2 = oTable.getCellByPosition(1, 1)
    		oCell2.string = sVar3
    		'------------------------------------------
'Tady jsem vymýšlel úpravu stránky tak aby se nezalamovaly tabulky to jsem ale nedotáhl a vykašlal se na to.
  Dim MyString as String															
  Dim oSlections																	
  Dim oSelCount																	
  Dim oSel																	
  Dim oRange   																	
	oSelections = oDoc.getCurrentSelection()																
    oSelCount = oSelections.getCount()																	
    If oSelCount > 1 then																	
    	oSelCount = oSelCount-1																
    End If
'Tady jsem dodatečně vkládal řádek																	
    For j = 0 To oSelCount - 1																	
		oSel = oSelections.getByIndex(j)															
    	oRange = oSel.getEnd()															
  		oInsetText = Chr$(13) & ""															
  		oRange.setString(oInsetText)															
  	next j
next i
End Sub	

    Tam kde jsem "slepoval" je zakomentovaná čára (bez komentáře) - což je ten "hrubý steh". V podstatě jen zprovozněný a neoptimalizovaný kód.

#8 Re: Calc » Jak importovat text z calcu do writeru a zároveň ho naformátovat » 5. 11. 2019 07:47:24

Pro kamlan :
     Uvádíte, že Vám připadá nešikovné spouštět makro z Writeru. To je dáno jenom tím, že ve Writer se dá udělat tabulka mnohem lépe a rychleji nežli v (z) Calcu. Calc svoje tabulky má, takže cizí tabulky nepotřebuje až na detaily kdy se používají například v dialogu.
     Testoval jsem nahrávané tabulky. Makro je mnohem rychlejší ale musí se pouštět právě z Writeru. Vy jste ve svém řešení použil specifikované parametry tabulky. Při tom správně uvádíte, že je to typ objektu který má svého rodiče. Správným řešením by bylo nastavení parametrů pro objekt vlastní tabulky a tu potom pouze replikovat. To je technologie která se v Basicu moc nepoužívá – deklarovat objekt jako „TYPE". Potom se mění pouze název (inkrementací čísla) a obsah řádků. Vy ale vytváříte vždy novou tabulku stejně jako tu první. Při tom musíte nastavit plno parametrů.


     Můj kód je asi poloviční i když pro tabulky používám podobný postup. Abych nemusel nastavovat parametry pro text použil jsem tabulku se třemi řádky. Ten první je nadpis centrovaný a navíc tučný ze standardního implicitního objektu. Já jsem nic nepřepisoval – udělal jsem tabulku a smazal jsem první řádek. Následně sloučil první sloupec, dal mu šířku a nakrmil to z array. Skutečně jsem dodělával dodatečně ten řádek mezi tabulkami.
     Systém takový že nejprve načte array pro přenos dat (primitivně – trvá to pár vteřin). Následně tuto array předá makru které vytvoří Writer. Opakování tabulky je dáno jednoduše cyklem For – next. Je to opravdu sešité hrubým stehem. Takové prasárny zamykám už jen proto abych zakryl ty postupy. Navíc to nemusím popisovat - popisování mne dost štve. (tedy někdy zamykám i z jiných důvodů ale tohle není ten případ). Filozofii jsem popsal ale autor ani nežádal nic takového z čeho by chtěl vycházet. Takže řešení je jak stojí a leží – co autor chtěl – dostal i když měl asi jiné představy.


     Možná si představoval něco jako úpravu v Calcu která se vyvede do orámovaných a proložených tabulek. Ty se pak naráz vloží do Writer. To by celkem šlo dobře v podobě exportu do PDF i bez maker. Ale úprava tisícovky řádků je náročná zejména pro málo zkušeného uživatele. Než bych popsal postup jak proložit vzorcem řádky, vytvořit binární řadou vedle ve sloupcích formát tabulky s načtením obsahu (kopírováním 1 > 2 > 4 > 8 > 16 >> … >>1024 > 2042) a následným exportem tak jsem navrhl makro – kde také nemusím nic vysvětlovat nebo jen minimum. (A nebo jednorázově přímo tabulku vytvořit z ostrých dat které by autor musel poslat.)
    Výše popsaný postup patří spíš mezi exotické postupy které vyžadují znalost klávesových zkratek a také vychytávek typu „proložení" řádků. Pochybuji že by stačilo několik vět. Nejspíš bych to musel zdokumentovat jako návod nebo jako prezentační makro. To patří už do redaktorského zpracování jako „TIP" - konkrétně jak co udělat. Dají se prokládat řádky i sloupce jak v pravidelném rozložení tak v nepravidelném. Konkrétně například oddělit data nestejně velkých sloupců tak aby se například vytvořil scházející řádek (prázdný), nebo naopak eliminovat prázdné řádky tak aby byly počátky v konstantním intervalu nebo jen s konstantní mezerou (prázdným řádkem). Viděl jsem kdysi i nějaké rozšíření pro takovou potřebu ale velice omezené.


     Na jeden takový „TIP" narážíte ve svém příspěvku. Je to zase jenom vychytávka. Jde o vzorec CHAR(RANDBETWEEN(65;95)) & CHAR(RANDBETWEEN(65;95)) & CHAR(RANDBETWEEN(65;95)) & CHAR(RANDBETWEEN(65;95)). Popřípadě něco fixního před nebo za. Dělám tak často náhrady za jména a podobně. Původně jsem tyto náhrady stavěl do podobny Base64 ale pro většinu případů je to zbytečné. Velká písmena začínají CHAR(65) a je jich 28 (ASCII 7 bit). Malá písmena jsou o 32 větší takže A= Char(65) malé a = Char(97). Logicky jde o náhodná čísla cca 30^4 takže opakování čtveřice je nepravděpodobné. Na konci se jen sloupec načte do paměti a vloží už jen jako text. Těch 3x 5 tisíc výrazů jsem dělal nejvýš 3 minuty ale spíš méně. Na to se ani makro nehodí – postavit ho trvá déle a pro jednorázové použití je to zbytečné.


     Je celkem chvályhodné že máte zájem udělat něco pro ostatní. To co uvádíte o Pythoniakově „bibli" je pravda. On sleduje prakticky jedinou větev ukázky v každé kapitole takže nejde ani tak o ucelenou práci se všemi možnými případy. Zase se snaží konkrétní případ popsat zevrubně a tím motivovat. Je to jakási síť příkladů na které navíc rád navazuje i mezi kapitolami.
     Ale i když to vypadá nedostatečně je to velice rozsáhlé. Dělá to už hodně dlouho a stále jen upravuje to co se od doby poslední úpravy změnilo. Mimo toho to pomáhá upravit celkem široká komunita. Na to jediný člověk opravdu nemá. Tedy sepsat snad ano, ale posléze kontrolovat funkčnost a popřípadě opravit – to je nekonečná práce.


     Já jsem udělal jen určitou kapitolu (respektive kapitoly) které nechávám uležet abych se na ně podíval jinýma očima. Jedná se o Writer a jeho „pole". To ale navazuje například na formuláře a nebo na databáze. Takže jak se znám – vše překopu ještě nejméně 2x. Už třeba vím, že nemohu Pythoniaka stopovat do hloubky a musím se obejít bez některých detailů – respektive bez vysvětlení proč to tak je.


     Když byste si troufl udělat například seriál o programování nebo formu manuálu tak klobouk dolů. Podobných pokusů je na tomto portále více ale žádný nebyl úplně dotažen. Snad nejlepší seriál je od Dana Sedláčka i když obsahuje chyby dané vývojem.


     Kdysi dávno tady byla možnost jek něco podobného udělat tak aby to bylo pro uživatele tohoto portálu. Byla to Wiki kde se slibně začalo – ale záhy se skončilo. Nechce se mi dělat návody jako rozšíření které stále otravuje s aktualizací vždy když vyjde nová verze LO a podobně. Náš portál je celkem dost utlačovaný zejména po stránce finanční. Autoři kteří byli specializovaní například na Base, nebo Writer a podobně prostě přestali psát. Například Dan Sedláček je stále uváděný jako moderátor ale byl zde naposledy 23. 5. 2014 16:14:23 .
     To souviselo nejvíc asi  s ing. Pastierikem který dělal velmi dobrou práci. Plno lidí zanevřelo na LO dík separatizmu a já osobně kritizuji „firemní kulturu". U nás není jediný člověk oprávněný oficiálně školit nebo zavádět LO do praxe. Nejdříve se musí prokázat znalosti a praxe právě z oblastí které nikdo bez požehnání Document Foundation dělat nemůže. Ano stačí se zabývat on line kurzem v angličtině ale musíte mít už „firemní zásluhy" jako například opičárny kolem podstatných věcí jako je grafika nebo být známým protagonistou – kterého „komunita zná" - samozřejmě ta komunita která se schází po světě a žvaní o migracích nebo výhodách LO. Potom snad dostanete oprávnění certifikovaného školitele nebo jiného firemního potentáta. Já mám dojem že jde spíš o to nekonkurovat MSO dokud to velký Bill nedovolí.


     Zase celkem nepochybuji, že se „invaze" LO soustředí na komerční firmy typu Collabora které se věnují asi jen specializovaným sektorům. Nějaký Kamil Landa určitě nemá šanci projít sítem a nabídnout některé firmě nebo instituci svoje služby. Prostě oprávněný nikdo není a jestli bude tak nejspíš firma. Zasloužilý protagonista musí umět nejdříve panáčkovat a dupat ve firemním rytmu. Je celkem jedno co umí nebo spíš neumí.
     Víte kolik je vynikajících rozšíření která už nejsou k dispozici i když většinou fungují nebo stačí malá úprava? Opravdu mnoho ale podívejte se jak lidé shánějí rozšíření od pana Pastierika nebo od Tomáše Bílka. Portál nemá ani pořádně na výplaty a jak se zjistilo nešlo ani zaplatit nějakou darovací částku. To je snad opraveno ale ukazuje to na plno věcí. Nevím jak to bylo s platební bránou ale vše je směrováno na LibreOffice. Při tom dodnes jsou všechny důležité věci stále pod palcem Apache Open Office. Bez zdrojů z portálu AOO by nešlo ani programovat v basicu a Libre umí nejvýše roubovat Pythonem. Zato umí akceptovat VBA. Všechno je postavené na hlavu.

#9 Re: Base » SQL dotaz na prázdnou položku - VYŘEŠENO » 4. 11. 2019 15:20:56

Problém je asi v tom, že používáte Libre Office s motorem Firebird. Nemám s tím prakticky žádné zkušenosti, ale nápověda uvádí například toto Funkce je možné zadat také přímo do SQL dotazu. Syntaxe je: SELECT FUNKCE(sloupec) FROM tabulka..
     To by ve Vašem případě mělo být konkrétně SELECT ISNULL(odkaz) FROM tabulka. Klasický dotaz neumí vyhodnotit prázdné pole, ale SQL to umí ve verzi "IS NULL". Ovšem je k tomu podle všeho ještě podmínka, že to musíte filtrovat ze sloupce který je ALIAS(em) původního sloupce.


     Nevím jak to přímo souvisí s Firebirdem, ale dříve to šlo buď klasickým dotazem převést na SQL nebo to nešlo vůbec. To je podle mne správný postup. Tedy vytvořit alias na sloupec "odkaz" a nastavit SQL s ISNULL. Pokud se Vám to nepodaří pošlete mi vzor s několika málo údaji - ale tak aby všechna pole byla autentická ve smyslu formátu (včetně názvu kde hraje roli například velikost písma ap") a několik simulovaných případů. Pokusím se na to přijít, nebo udělat jiné řešení. Například místo "Empty" (=IS NULL) zadat skutečnou nulu což už je číslo které se dá vyhodnotit.


PS NOT IS NULL je funkce s významem "není prázdná", samotné "NULL" nic bez předpony neznamená. Správný dotaz je IS NULL tedy "je prázdné".

#10 Re: Calc » Jak importovat text z calcu do writeru a zároveň ho naformátovat » 4. 11. 2019 13:37:32

pro kamlan:
Na Váš dotaz odpovím jednoduše - ano.


     Já jsem tomu dal asi podstatně víc času, ale sledoval jsem různé systémy. Když jsem se v sobotu po obědě nedočkal upřesnění od autora udělal jsem to nejobyčejnější které žádné extra úpravy a optimalizaci neobsahuje. Mám zkušenost, že když autor komunikuje sporadicky, nebo vůbec - nemá cenu se jeho potřebou zabývat. Ve většině případů se ani neozve - to už máte také jistě ověřeno.


     Předpokládal bych, že to co bude skutečně v Calcu jako zdroj bude mít různě dlouhé řetězce. Někdy na více nežli 1 řádek. Když se zamyslím k čemu je to dobré - tak nejspíš k tisku štítků. V takovém případě lze očekávat že bude nutné eliminovat tabulky zalomené do dvou stránek.
     Pokud by šlo například o hřbety (třeba knih - odtud zkratka pochází "DeskTopPublishing") tak se dá čekat že kolonka "DTP" bude zarovnaná vertikálně - tedy kolmo k ostatním textům. Takže můj názor - autor nejspíš ani neví jak spustit makro - dělám zbytečnou práci. Pomůžu rád každému a nic nečekám, ale tenhle modus operandi převažuje. Pokud mne na tom něco zajímá, tak pouze možnosti různých řešení. Další záležitostí by byla optimalizace - pokud by taková práce k něčemu byla dobrá.


     Už jsem to psal. Zabýval jsem se možností vygenerovat systém tak jak jsem udělal, ale také systém kdy se spustí makro z Writeru a Calc se zavře. Jednoduše se do nového Writer(u) nahraje makro a předá se mu array s daty, předá se mu řízení a Calc se zavře. Ve finále je možné i makro smazat nebo z toho ".odt" udělat PDF.
     Prakticky bude zájem o jiný postup:
Z nadřazených maker spustit přímo Writer a tahat data z databáze - tou může být i Calc v registrované podobně, nebo tak jak je uložen. Pokud je to dáno tak jak je specifikováno zadání - bude se jednat o jednorázovou záležitost. Zde pak asi nehraje roli ani rychlost a podle všeho ani forma tabulek jako taková. Ovšem velikost písma bude důležitá v případě že se jedná skutečně o hřbet knih – čím větší tím lepší.
     V případě že se budou tisknout "hřbety" na samolepky je možné sestříhat i původně rozdělené tabulky. Původně jsem udělal tabulky bez mezi řádku, ale to by se špatně stříhalo. Samolepky jsou drahé takže bych si tipnul, že výstupní soubor bude upraven ve formátu stránky tak aby byl prostřih co nejmenší. Autor si také asi nechává pro sebe kolik řádků skutečně potřebuje.
     Neřešil jsem to a nechal na pokus - omyl řešení. Tedy spíš "spadne - nespadne". Stačí aby upravil počet řádků. Vadilo by mu sice vestavěné číslování - ale to může být řešeno jako lokální pořadí v jednotlivém sešitě. Za ním může být z Calcu skutečné absolutní pořadí. Spoléhám však na jeho tvrzení že jde o "přes tisíc řádků" - tedy méně nežli dva tisíce.

#11 Re: Calc » Jak importovat text z calcu do writeru a zároveň ho naformátovat » 2. 11. 2019 19:34:16

Otestujte verze1. Musíte mít zapnutá makra. Tedy povolení střední úrovně zabezpečení a důveryhodnou složku. Vytvořeno pro Libre Office.


     Soubor je vytvořen pro 5000 řádků (tabulek). Makro měří čas vytvoření - nic moc asi 20 minut na 5 tisíc tabulek. Použítí : Vezměte svoje data a vložte místo simulovaných dat. Spusťte nabídku "OVLÁDÁNÍ" > TĚŽBA DAT Z CALCU. Snad je to co potřebujete. Nic jste neupřesnil mimo výstupu. Takže když to nebude vyhovovat upřesněte lépe - co se má změnit.

#12 Re: Calc » Jak importovat text z calcu do writeru a zároveň ho naformátovat » 1. 11. 2019 18:00:02

Není problém. Jenom původně jste psal o dvou sloupcích a nyní vidím že se jedná o 3 sloupce. Ten první je podle všeho uveden v prvním sloupci který slučuje dva řádky jako "DTK".
    Podle toho co píšete se v prvním řádku druhého sloupce objevuje číselná řada kterou ale musím vytvořit nebo je již obsažena?


PS : Soudím, že první sloupec je sloupcem "A", druhý sloupec "B" a třetí sloupec "C" - samozřejmě v Calcu a na Listu1. Makro se bude spouštět z Calcu ale je možné vytvořit spuštění z Writeru. Číslování přidám - smazat to půjde vždy (pokud by to bylo řešeno v rámci Calcu a sloupce "B" - což je velice pravděpodobné).


Nevidím upřesnění velikosti písma - ponechám font 12 (Calc implicitně používá 10). Může to být i fatální - velikost rozhoduje o počtu stránek. Pokud by to Writer neuvezl budeme muset rozdělit na více souborů. To ale ukáže až Vaše zkušenost.

#13 Re: Calc » Jak importovat text z calcu do writeru a zároveň ho naformátovat » 31. 10. 2019 20:45:19

Tohle lze asi jen makrem. Nicméně je nutné vědět jak si to představujete. To znamená spíš ukázku nebo alespoň vysvětlení ve smyslu : 1. sloupec česky - 2. sloupec anglicky, nebo něco podobného. Určitě máte konkrétní představu což lze dovodit z tohoto :

AdamB84 napsal(a)

potřeboval bych dostat velké množství dat z Calcu do Writeru tak, aby se pro každý řádek z calcu (o 2 sloupcích dat) ve writeru vytvořila tabulka o 2 sloupcích (určitým způsobem naformátovaná) pro každý řádek zvlášť.

    To znamená pro každý jeden řádek Calcu samostatnou tabulku se dvěma sloupci - ale se záhlavím (nadpisem) - nebo bez? Co mezi tabulkami? - Nějaké pořadové číslo či heslo a nebo něco jiného - třeba specifikace nějaké podmnožiny ap.?


    Když jde o tisíce řádků tak se jedná o tisíce tabulek. Mají mít nějaký formát nebo alespoň nějakou specifickou úpravu? - Ve Writer se standardně uvažuje o fontu typ 12 bodů. Tisíce tabulek může být velice objemný soubor a měl by mít nějakou strukturu - tak aby se dal udělat například rejstřík a podobně. Dají se očekávat nějaké podmnožiny "zralé" na kapitoly?

#14 Re: Impress » Velké písmeno » 26. 10. 2019 06:17:48

Toto se týká automatických oprav. Dá se to vypnout v nastavení Libre Office NÁSTROJE > NASTAVENÍ AUTOMATICKÝCH OPRAV > karta MOŽNOSTI. Pro Apache OpenOffice je nastavení podobné - tedy v nabídce NÁSTROJE stejný nadpis jen asi třetí od konce. V obou případech odstraníme zaškrtnutí "první písmeno velké".


     Požadovaná vlastnost souvisí s odrážkami jen málo. Dá se do určité míry přelstít defaultní nastavení automatických oprav aniž by se tyto musely vypínat. Vypnutí totiž platí pro celý dokument. Není obvyklé aby nový odstavec začínal malým písmenkem na začátku věty ale je to možné. Dělá to například paragraf který ale nemá verzi "velkého písmene".
     Proto můžete udělat svůj VLASTNÍ STYL pro určitý stupeň osnovy kde nebude navolena žádná odrážka. Tam byste potom měla používat například pomlčku, nebo také klasické číslo (a podobně znaky které nemají malý a velký tvar). Také existuje možnost zadat pouze mezeru, ale to se musí zajistit také v opravách. Podstatné je aby za prvním znakem odstavce NEBYL ZNAK KTERÝ UKONČUJE VĚTU. Tedy tečka, středník a podobně.
     
     
     Nevím zda se potom musí nastavit dokument pouze pro čtení. U jinak nastaveného systému který jistě používá další uživatel by došlo zřejmě k "automatické opravě". Zase pokud by to bylo vyexportováno například jako PDF zůstane původní formát.
     
     
     Testoval jsem úspěšně takto s exportem do PDF i obyčejné nastavení - oprava z nabídky FORMÁT > TEXT > MALÁ PÍSMENA - bez toho aniž bych upravoval cokoliv jiného. Ale nedám za to ruku do ohně protože to platí možná jen do okamžiku nežli se soubor prezentace zavře. Ale i toto je řešení. Jde specificky o to aby se neaktivovalo nastavení "smazat PŘÍMÉ FORMÁTOVÁNÍ". Takže i když byste posílala soubor ve formátu ".odp" tak bych doporučoval formát jen pro čtení.
     
     
     Jinou cestou by bylo nastavení aktivních náhrad. Zde bych postup doporučoval jenom v případě, že se bude styl opakovat ve většině prací. Toho si ale musíte být stále vědoma. Za dva roky už nebudete možná vědět jak a kde se to nastavuje a budete přepisovat stejným způsobem "zpět na implicitní nastavení".

#15 Re: Writer » Problém s kurzorom... » 24. 10. 2019 08:30:49

1 - OpenOffice je dost nepřesný výraz. Jde o Apache OpenOffice (AOO), nebo Libre Office (LO)?
2 - O jakou verzi AOO, LO se jedná?
3 - Je to ta samá verze jako ta na které jste před tím pracoval?


     Vzpomínám si, že se tu něco podobného řešilo asi tak před rokem. Nešlo samozřejmě o MacBook - ale v tom asi problém nebude. Jde o verzi toho - kterého programu. Například u LO by to mohlo jít nastavit v rámci "Expertní volby" kterou AOO nemá.
     Takové nastavení by mělo být uloženo mezi "aplication data" (datapp) / Váš profil. Je možné že u Macu to chodí jinak. S tím ale má zkušenost jenom málo lidí - já osobně vůbec ne.


     Doporučil bych nainstalovat LO poslední "stable" verzi - pokud tuto již nemáte nainstalovanou, nebo se pokuste najít původní program který chodil na Windows a ve kterém jste pracoval bez problému.
     Celkem není problém zařídit pomocí makra aby to vždy skočilo na konec. Ale víc se možná dělat nedá. Záleží dost na tom co máte skutečně nainstalováno.

#16 Re: Calc » podmíněné formátování - VYŘEŠENO » 15. 10. 2019 10:45:16

Tohle by chtělo spíš ukázku, ale popíšu jak to funguje, (nebo alespoň mělo fungovat) :

     Pokud chceme podbarvovat s odkazem na hodnotu jediné buňky pro všechny buňky z tabulky musíme adresovat buňku jako zcela absolutní - například $A$1 (nebo ještě s listem pokud se jedná o hodnotu v jiném listu.
     Takovou podmínku nastavíme na první buňku tabulky (ve které bychom měli skutečně stát (ale u LO to být nemusí - vysvětlíme si proč). Například stojíme v buňce B2 (tabulka s rozsahem B2:Z50). Do podmínky zapíšeme $A$1 < 10.
     Tuto podmínku rozkopírujeme do celé tabulky (pod je to potřeba). Jiným případem je ale případ kdy jsou ve sloupcích, nebo řádcích (a nebo oba případy) různé hodnoty. Právě zde bychome měli zapsat buňku ve ketré stojíme tedy (B2) = B$1. Všechny buňky ve sloupci B jsou podchyceny zamraženou hodnotou z buňky B1. Buňky v dalších sloupcích se zkopírují také tak - podle vlastního aloupce.


     Podobně je tomu s přebíráním hned několika parametrů. Zadáme vzorec například

OR(B$1 > 2;$A2 < 10)

Podobně například

AND(A1 < 10; OR(B$1 > 2;$A2 > 3))

     Jednoduše musí to být jediný vzorec. Může mít ale vnořené jiné vzorce nebo podmínky. Případ OR(B$1 > 2;$A2 > 3) vyhodnotí každou buňku ve své souřadnici sloupec + řádek.
     Dříve se musel zadávat dotaz také na vlastní buňku a to také můžeme udělat jako dotaz B1 =, nebo B1 >, B1 < , ...  nežli vzorec. To obalíme do IF.

#17 Re: Calc » Vynechání určitých řádků při opisu do dalšího listu - VYŘEŠENO » 11. 10. 2019 06:56:55

Autor to nepopisuje, takže se mohu mýlit.
     Makro prohledává 10 (ale možná i více sloupců) z listu2. Co tam je nevím, ale podle toho že jde o nějaké adresy zřejmě bytového družstva. Můžeme si představit k čemu se to používá :


Nejspíš jde o kontrolu došlých plateb, nebo denník doručené pošty. Vypadá to, že uživatel je nějak pověřen družstvem aby odesílal sumačně v určité struktuře doklady k ověření nebo k archivaci.... Může to být ale také jakákoliv firemní evidence - například objednávky, nebo zálohové platby. Potom by šlo možná o 10 typických materiálů a podobně.


Takže když si to promítneme jako příklad struktury zdrojové tabulky, bude možná potřebné prohledat za každý měsíc například 20 datumů (například platby od 1 do 20.-ho každého měsíce). To bývá termín splatnosti a podobně.
     Jenže v tomto termínu budou chodit platby od různých subjektů v různých termínech "od-do", a nebo také po termínu, přijdou opravy, mimořádné doplatky nebo i různá oznámení a jiné podobné záležitosti. někdy se může stát, že byt je nějak vyřazen (nemá nájemníka), nebo se právě převádí a platby mohou chodit od dvou lidí na stejné konto. Takže nelze čekat že vždy bude v měsíci 10 dokladů. Může tam být například od 5 - do 20-ti položek....
     Takže když přijdou doklady i všechny různé od různých subjektů, je možné, že jsou seřazení podle toho jak přišly. Představou je tabulka s řídkými daty která má různé počty položek které nelze předem ani predikovat.
     Určitě si dovedu představit, že někdo začne tvrdit, že zaplatil například nedoplatek zvýšením předepsané platby. Družstvo musí dohledat zda se takové tvrzení zakládá na pravdě. Může jít o souběh bankovních převodů, platby složenkou, nebo i hotovostí do pokladny.
     Dá se čekat potřeba prověřit čísla účtů, variabilních symbolů a podobně. Prostě tykové prohledávání může být i za dobu 10 let (i více) zpět. Jenom za 10 let zpět by to bylo 12 x 20 x 10 = 2400 řádků za předpokladu že se vyhledává 100 měsíců s rozsahem 20 dnů/měsíc. Manuálně se to musí dohledat a například přefotit, nebo založit a skartovat.............


Nelze předpokládat že to bude jednoduché převedení z jedné uspořádané tabulky do jiné, která má jen jinou strukturu (k tomu svádí to, že se hledá v listu2 stejnýcm rozsahem zanořených cyklů. Ty mohou být záměrně zjednodušeny, a co víc také podmínka ElseIF (nebo jen Else) může skrývat další podobné filtry pro data která se prvním filtrům vymykají.


Ať už to má davef6 k jakémukoliv účelu - je to jistě velice důležité. Možná bude pracovat i několik dní. Pokud mu dochází čas nemůže se zabývat jalovými vstupy jako je uvedení skutečnosti, že je VYŘEŠENO.

#18 Re: Calc » Vynechání určitých řádků při opisu do dalšího listu - VYŘEŠENO » 10. 10. 2019 21:45:43

pro Ludvík Trnka :
     Takhle by to nešlo. Když byste si udělal tabulku podle vnořeného cyklu, tak byste si uvědomil že se jedná o tabulku X*Y, takže i tam musí být místo tvrdého čísla sloupce proměnná obecného typu. Podle ní se přiřazuje do sloupce Ale to je jenom jedna věc.


     Ty mezery nejsou vždy pravidelné. Váš kód by to posouval vždy jen na hodnotu o jednu menší "j". Takže mezery by byly i tak - jen někdy by se to povedlo. Skutečně je nutné aby měl každý sloupec svůj iterátor pořadí který zabírá jen když je sloupec aktivován.


     davef6 neuvádí co je v nadpisech, ale myslím že tam jsou specificky odfiltrované výrazy. Má empiricky zřejmě otestováno, že znaky "d, o, a" jsou typické podle pozice ve výrazu. Ty 3 písmenka pokrývají celou rozmanitost 10-ti přiřazovaných výrazů. Když by vystačil s jediným znakem, tak by bylo typické, že tento znak se nachází u všech výrazů - ale na jiné pozici.
     Protože ale s jedním znakem nevystačí musel vybrat takové znaky, které jsou unikátně obsažené v příslušných výrazech. To je celkem chytré řešení, ale dost pracné na vytvoření správného odfiltrování. Proto jsem se domníval, že v tom logickém řazení může být chyba. Například by stačilo, aby měl některý výraz hledaný znak na 11. pozici. Potom by prošel filtrem "Select". Když by měl jiné pořadí podmínky IF v pořadí OR tak by se stávalo, že se kladně vyhodnotí první "OR" a výraz půjde do jiného sloupce.


      Právě proto se davef6 bojí změnit uspořádání "selectu" a podmínky IF. Tuhle logickou strukturu nabourat by vedlo k tomu, že může celé makro vyhodit. U vašeho systému by se mohlo stát, že při správném přiřazení a následném potlačení inkrementace řádku + další správné přiřazení do stejného sloupce by přepsalo původní zápis - plno výsledků be se takto mohlo vytratit.


No nic - uvidíme jestli davef6 vyjádří že to funguje, nebo nikoliv. Nemá ve zvyku odpovídat záhy, ale až když opět něco potřebuje. Takže se dozvíme brzo jen když to fungovat nebude :-)

#19 Re: Calc » Vynechání určitých řádků při opisu do dalšího listu - VYŘEŠENO » 10. 10. 2019 11:10:58

Sub Start_2
    Dim sVar, sVal, svall, Old as string
    Dim iVar, C_, D_, P_, G_, K_, L_, M_, F_, N_, I_ as Long
    C_=1 : D_=1 : P_=1 : G_=1 : K_=1 : L_=1 : M_=1 : F_=1 : N_=1 : I_=1
    iVar = GetLastRow(1)
    oSheet1 = thisComponent.Sheets(1)
    oSheet2 = thisComponent.Sheets(2)
    oSheet3 = thisComponent.Sheets(3)
    iVal = iVar
    For j = 1 To iVar
    For i = 0 To 9
    If InStr(oSheet2.getCellByPosition(8,j).String, "d") > 0 OR _
    InStr(oSheet2.getCellByPosition(8,j).String, "o") > 0 OR _
    InStr(oSheet2.getCellByPosition(8,j).String, "a") > 0 Then
        Select Case i
            Case 0
            oSheet3.getCellByPosition(i,C_).Formula = "=$slouceni.C"&(j+1)
            C_= C_ + 1
            Case 1
            oSheet3.getCellByPosition(i,D_).Formula = "=$slouceni.D"&(j+1)
            D_= D_ + 1
            Case 2
            oSheet3.getCellByPosition(i,P_).Formula = "=$slouceni.P"&(j+1)
            P_= P_ + 1
            Case 3
            oSheet3.getCellByPosition(i,G_).Formula = "=$slouceni.G"&(j+1)
            G_= G_ + 1
            Case 4
            oSheet3.getCellByPosition(i,K_).Formula = "=$slouceni.K"&(j+1)
            K_= K_ + 1
            Case 5
            oSheet3.getCellByPosition(i,L_).Formula = "=$slouceni.L"&(j+1)
            L_= L_ + 1
            Case 6
            oSheet3.getCellByPosition(i,M_).Formula = "=$slouceni.M"&(j+1)
            M_= M_ + 1
            Case 7
            oSheet3.getCellByPosition(i,F_).Formula = "=$slouceni.F"&(j+1)
            oSheet3.getCellByPosition(i,F_).CellBackColor = RGB(238,238,238)
            F_= F_ + 1
            Case 8
            oSheet3.getCellByPosition(i,N_).Formula = "=$slouceni.N"&(j+1)
            N_= N_ + 1
            Case 9
            oSheet1.getCellByPosition(23,j).Formula = "=IF($udaje_pro_druzstvo.I"&(j+1)&"="&Chr(34)&"d"&Chr(34)&";1;0)"
            oSheet3.getCellByPosition(i,I_).Formula = "=$udaje_pro_druzstvo.I"&(j+1)
            I_= I_ + 1
        End Select
    Else
        '*****  něco  *****
    EndIf
    Next i
    Next j
end Sub

PS :
     Ještě jsem musel opravit start ve sloupcích - začínal jsem od nuly a pak jsem si uvědomil, že start je pod nadpisem na řádku makra 1 (sešit - řádek 2)

#20 Re: Calc » Vynechání určitých řádků při opisu do dalšího listu - VYŘEŠENO » 10. 10. 2019 10:51:52

To co jsem poslal je diagnostika která by měla určit proč se tak děje.
     Psal jsem to v příspěvku #3 PS: měl jsem ještě připsat, že některá podmínka posílá k vypsání a něco je špatně. Takže příliš široké zahrnutí do Selectu, nebo slabé podmínky v IF.


     Takže jestli jde jenom o řazení ve sloupcích pod sebe je potřebně pouze vytvořit proměnnou pro každý řádek samostatně - tedy 10 různých. Podívám se na to - mělo by to být za chvilku.

#21 Re: Calc » Vynechání určitých řádků při opisu do dalšího listu - VYŘEŠENO » 9. 10. 2019 20:51:34

Sub Start
    Dim sVar, sVal, svall, Old as string
    Dim iVar, iVal, iVall, iDelenec, iDelitel as Long
    'iVar = GetLastRow(1)
    oSheet1 = thisComponent.Sheets(1)
    oSheet2 = thisComponent.Sheets(2)
    oSheet3 = thisComponent.Sheets(3)
    oSheet4 = thisComponent.Sheets(4)
    iVal = iVar
    For j = 1 To 53 'iVar
    For i = 0 To 9
    If InStr(oSheet2.getCellByPosition(8,j).String, "d") > 0 OR _ 
       InStr(oSheet2.getCellByPosition(8,j).String, "o") > 0 OR _ 
       InStr(oSheet2.getCellByPosition(8,j).String, "a") > 0 Then
        Select Case i
            Case 0
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.C" &(j+1)&""";""$slouceni.C"&(j+1)&""")" '"=$slouceni.C"&(j+1)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 1
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.D" &(j+1)&""";""$slouceni.D"&(j+1)&""")" '"=$slouceni.D"&(j+1)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 2
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.P" &(j+1)&""";""$slouceni.P"&(j+1)&""")" '"=$slouceni.P"&(j+1)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 3
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.G" &(j+1)&""";""$slouceni.G"&(j+1)&""")" '"=$slouceni.G"&(j+1)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 4
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.K" &(j+1)&""";""$slouceni.K"&(j+1)&""")" '"=$slouceni.K"&(j+1)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 5
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.L" &(j+1)&""";""$slouceni.L"&(j+1)&""")" '"=$slouceni.L"&(j+1)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 6
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.N" &(j+1)&""";""$slouceni.M"&(j+1)&""")" '"=$slouceni.M"&(j+1)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 7
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.F" &(j+1)&""";""$slouceni.F"&(j+1)&""")" '"=$slouceni.F"&(j+1)
            oSheet3.getCellByPosition(i,j).CellBackColor = RGB(238,238,238)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 8
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.N" &(j+1)&""";""$slouceni.N"&(j+1)&""")" '"=$slouceni.N"&(j+1)
            oSheet4.getCellByPosition(i,j).string = oSheet2.getCellByPosition(8,j).String
            Case 9
            oSheet1.getCellByPosition(i,j).Formula = "=IF($udaje_pro_druzstvo.I"&(j+1)&"="&Chr(34)&"d"&Chr(34)&";1;0)" '23
            oSheet3.getCellByPosition(i,j).Formula = "=HYPERLINK(""#List2.I" &(j+1)&""";""$udaje_pro_druzstvo.I"&(j+1)&""")" '"=$udaje_pro_druzstvo.I"&(j+1)
            Case Else 'Filtrem Case přeskočené
            oSheet4.getCellByPosition(i+11,j).string = "Vyřazuje Case Else " & j & " " & oSheet2.getCellByPosition(8,j).String
        End Select
    Else
    oSheet4.getCellByPosition(i+22,j).string = "Vyřazuje Else IF " & j & " " & oSheet2.getCellByPosition(8,j).String
        '*****  něco  *****
    EndIf
    Next i
    Next j
end Sub

     Dejte pozor při testování. Udělejte si raději kopii. Testoval jsem to na jinak nazvaných listech. Princip je v tom, že nyní se do listu 4 zapisují testované hodnoty. Na listu jsou vypsány hodnoty odfiltrované - ale u mne Case Else nic neodfiltrovalo - měl jsem tam náhodné řetězce.
Dejte pozor přidal jsem "4" list do kterého se dělá test podle vyřazení. Do listu 3 se dělají hyperlinky které skáčou do listu 2 odkud se čte.
     Udělejte si list 4 jako nový a prázdný - musí být na 5. místě. Tam se nakopíruje vše. Hyperlinky je to co jste asi zamýšlel tím vzorcem - ale asi jinam. Takže raději list 3 také nový prázdný.

#22 Re: Calc » Vynechání určitých řádků při opisu do dalšího listu - VYŘEŠENO » 8. 10. 2019 16:56:26

Postavte buď jiné číslo pro uložení do každého CASE (máte tam tvrdé "i" z cyklu. Mělo by tam být něco jako iVar který se zvedne o + 1 až kdy poslední pozici obsadí příklad :

Case 0
            oSheet3.getCellByPosition(iVar,j).Formula = "=$slouceni.C"&(j+1)
            iVar = ivar + 1
Case 1

     Nebo jiný příklad pomocí CASE ELSE :

Case 9
            oSheet1.getCellByPosition(23,j).Formula = "=IF($udaje_pro_druzstvo.I"&(j+1)&"="&Chr(34)&"d"&Chr(34)&";1;0)"
            oSheet3.getCellByPosition(i,j).Formula = "=$udaje_pro_druzstvo.I"&(j+1)
CASE ELSE
    GoTo Endes
End Select
    Else
        *****  něco  *****
    EndIf
Endes:
Next i

     Existují mimo řešení pana Trnky jiná řešení například před spuštěním testu, nebo spíš potom když makro s uvedeným algoritmem skončí. Možností je docela dost :


Cyklem který iteruje od konce k začátku mazat prázdné řádky - to je celkem spolehlivé - zachovává pořadí, ale je to pomalé.


Vybavit použité řádky v pomocném sloupci pořadím [typ zápisu ROW()] - ale nesmí to být vzorec jenom číslo. A následně docela sprostě seřadit makrem a smazat pomocý sloupec.


Celkem bych řekl že to lze asi desítkou způsobů jinak. Upřednostnit by se měla rychlejší nebo spolehlivější metoda.


Ale je ještě hodně dalších možností. Například postupně odladit všechny přeskakované případy aby je vychytala vstupní podmínka Ladíme tak že zapisujeme ty které by se měly smazat - najdeme co to je za příčinu a zavedeme do podmínky.
     Podobným způsobem, ale opačně - Selectem chytit chyby a bezchybné pustit k zápisu jiným Selectem nebo Switchem ap.


PS: měl jsem ještě připsat, že některá podmínka posílá k vypsání a něco je špatně. Takže příliš široké zahrnutí do Selectu, nebo slabé podmínky v IF..

#23 Re: Calc » Jakou funkci použít » 2. 10. 2019 14:46:10

Tohle zadání by chtělo ukázku.
     Domnívám se že půjde o jeden list nového zboží do obchodu (možná i eshopu) kde první list bude zřejmě tím který je, nebo bude v nabídce. Vychází zřejmě z aktuálního stavu. Naproti tomu druhý a možná i další listy budou nabídky od dodavatelů (zdrojů - výrobců, velkoobchodů, samopěstitelů, drobných výrobců a podobně).


     Ten problém je ve skutečnosti, že v domácím sortimentu je například káva o stejné gramáži ale jiné ceně. Potom nesouhlasí například "Káva Jihlavanka 0,5 kg s obdobným sortimentem "Jemná káva Tchibo 0,5 kg". Tady je to alespoň celé slovo "káva", ale jindy bude jen velice obtížné stanovit markery pro hledání. Stačí například "karotka" místo "mrkev" a podobně.
     Dodavatelé kterých může být i 10 listů musí mít rozklad názvu ve kterém se musí hledat pomocí SEARCH, nebo Find. Respektive makrem na principu search descriptoru. Na tohle nezaberou ani regulární výrazy. Seznamy by vracely mnoho irelevantních nálezů.



     Správnou cestou je tedy rozklad a hledání počtu příznaků do pomocných sloupců. V případě nejistoty by vzorec měl vygenerovat hyperlink který skočí přímo na sporný výraz. (Makrem je to snadnější - nikam se skákat nemusí, ani nic rozkládat do pomocných sloupců - jen se klikne a dialog může zobrazit dávku kterou může nejen sloučit do sloupce podle relevance (který procházíme roletkou), ale může zobrazit obrázek který bývá k dispozici.


     Ještě detail. Zdroji bývají výstupy v různých formátech - nejčastěji v CSV. To ale může být problém. Čísla mají tečku místo čárky, rozhoduje kódování a podobné detaily (bylo to tady už moc krát).


     Takže jestli Vám budou kamlanovo vzorce stačit - budiž. Ale pokud jde o to co si myslím tak to bez maker asi snadno nepůjde.

#24 Re: Calc » Jak vyplnit tabulku dle kriteria v prvním sloupci dle druhé tabulky » 27. 9. 2019 17:53:11

pro kamlana
     S těmi formáty v libre máte pravdu. Je to jinak, ale jak jsem zjistil - respektují se navzájem, Tedy AOO jen do 3 podmínek. LO jich má omezeně ale mnoho - nevím.

     Pokud máte zájem se dostat do Libre systému podmíněných formátů, tak si je postavte na něčem jednoduchém - nejlépe jednotlivé buňky - ale v AOO. Potom přejděte na LO a otevřete nabídku podmíněných formátů úplně dole > "spravovat".
     Úseky se dají udělat docela dobře. Vezmete podmíněný formát jedné buňky a upravíte ho. Je celkem stupidní, že se nedají podmínky v úpravách přesouvat v prioritě. Konkrétně jde o pořadí, která podmínka první, a pak další....
     Jednotlivé buňky nevyhodí řetězec s chybnými údaji bez kterých se neobejdeme v okamžiku kdy není podmínka plněna. Takže z jedné buňky uděláme úsek takto :
Úpravy spočívají v rozšíření podmínky z jedné buňky na určitý úsek.
     Například podmínky pro sloupce celého úseku odkazujícího na buňku mimo úsek který se má vyplnit : buňka A1 bude stát na začátku úseku - který by se měl posouvat nejprve sloupec "A" podle A1, sloupec "B" podle B1...... To je příklad podmínky "svátků". Takže odkaz na buňky které řídí formát se volají z úseku pomocí "dolarů" takto IF(A1 = něčemu (například svátku) potom $A1. Když by se řídící buňky vyskytovaly v řádku tak IF(A$1 = "S") - tohle stačí. Po úpravě načteme buňku s tímto formátem a vykopírujeme ho do celého úseku. To je asi zřejmé.
     Nyní budeme potřebovat druhou podmínku. Takže AND($A1 = "S";A$1 = "R"). Zase musíme otestovat. v celém úseku. Ale můžeme do AND, nebo OR nacpat mnoho věcí. Jde jen o to, která podmínka (ze tří možných) má prioritu. Přebíjí ty které jsou v druhém a třetím pořadí.


     Takže i když AOO má jen tři úrovně priorit, lze s tím pokrýt všechny možné potřeby které přesahují počet 3. AOO má oproti LO zjednodušenější rozhraní, ale kdo s ním umí pracovat, tak mu stačí "téměř" na vše.
     LO má výhody které jsou ale tak vymakané že jsou až nepřehledné. Například například se nabízí možnost vytvořit si vlastní barvu - to u AOO nenajdete. Nabídne se Vám vlastní paleta ale musíte ji najít zkusmo. Další možností je RGB, HSB a CYMYK. Jenže zase nastavování čísla čísla poměrů. Něco takového nikdo nedá přesně. Ale existuje možnost celkem schůdná.


     Když otevřete NOVÝ STYL > DIALOG BUŇKY > KARTA POZADÍ > VOLBA BARVA > vyskočí dialog ve kterém se dá kouzlit. Můžete například zvolit VLASTNÍ BARVY. Pokud žádné nemáte tak si ji vyrobíte pomocí volby VYBRAT. Právě pod touto volbou je dialog který jsem popisoval. Tyhle věci ale vetšinou nejsou vhodné zejména když máte nastavit barvy podle původního vzoru.
     Existují dvě podobné cesty které usnadňují takové práce :
1) použít funkci BARVAPOZADI které by měla být tady někde v příspěvcích nejméně 3x.
     Podle této funkce zjistíte číslo barvy pozadí a písma. (Dala by se uzpůsobit i na další vlastnosti). No a potom už bez problému zadáváme do makra buňky nebo úseku Cell.BackColor = číslo. Originálně je tam RGB(červená, zelená, modrá). Ale tohle číslo podmíněný formát nevezme ačkoliv by to měl být CYMYK (nevím jistě). Takže používat do podmíněných formátů to nejde.

2)   Pro barvy podmíněného formátu fungují jen HTML formáty v hexadecimálním formátu. Takže vychytávka : Vykopírujeme barvy které potřebujeme, otevřeme nový prázdný sešit a do něj toto vložíme. Následně tento Calc uložíme jako HTML a zavřeme. Následně vstoupíme tam kde je uložený a otevřeme browserem. Následně zobrazíme zdrojový kód kde tu naši barvi rozpoznáme.
     Ovšem abychom poznali z čísla o co jde, musí být v této buňce něco napsáno. To se objeví v blízkosti čísla barvy. Barva písma (pokud to potřebujeme) tam také bude. Takto můžeme udělat i celou paletu naráz.
     Po zkopírování vložíme do kolonky HTML barvy která je už na základní kartě BARVA. Nenechte se odradit. Musíte začít od prvního místa a vkládat znak po znaku (schránkou to tam nedostanete a když začnete odjinud půjde Vám hlava kolem).
     Když je tato barva zobrazena (horní okénko tak ji můžete opsat jako formát RGB ale to už je celkem zbytečné. Následně zbývá poslední krok. Stisknout tlačítko PŘIDAT (do vlastních barev). Musíte barvu pojmenovat což je výhoda. Jméno se zobrazí nad barvou v paletě vlastních barev. Takže víte co s ní a i když by byly dvě nebo více podobných - nespletou se.


     Z jiného soudku. Přišla na návštěvu dcera a jestli se může podívat na "mejla". Šel jsem postavit na kafe a ona viděla že mám něco rozdělaného. Tak jí říkám "sraž to na linku". Ale mezi tím jí zaujal nadpis v levém rohu - "Nemocnice (tuším, že Jičín)". Přišla otázka co děláš? Tak jsem jí řekl ať si překlikne kartu. "Jé to je hezké" - můžu to ukázat v práci?
     Dostal jsem vzor z jiné a mnohem větší nemocnice. Už jsem včera poslal V1 verzi a dnes (když bych tady nepsal) by byla hotová a odeslaná V2.
     Jenže mezitím jsem přišel na další vychytávky a tak dodělám V2 a přejdu na zcela jiný systém. Ty děvčata to dělají hrozným způsobem. Až bude V2 hotové - postnu to zubrtomovi. Ty holky měly mnohem lepší systém. Nevím jestli to bude takto pokračovat - tak to bude na licenci. Pochopitelně makra už zamykám. Verze tohoto sešitu ještě plně akceptuje funkčnost vzorců - bez maker a vyhovuje až na malý detail i podmínkám vzorců AOO.


     Vím co jsem poslal za problém - donucuji lidi aby praxí přišli na to jak se to dá nastavit a podobně. O manuálech vím své a je to moje noční můra. Jsou ale ještě stupně obtížnosti. Někdy potřebuji angličtinu. Slovo anglicky neumím a tak řádím na Google - rekurzivní překlady - fuj.
     Právě návody mi trvají opravdu mnohem déle nežli vlastní kódování - ale jinak to nejde i když já jsem zrovna mezi přispěvateli grafomanský typ :-)

#25 Re: Calc » Řazení sloupců - VYŘEŠENO » 23. 9. 2019 17:32:05

Celý problém bude v téhle konstrukci :

SortRange = Sheet.getCellRangeByName("F2:F"&GetLastRow(1)+1)

Pravděpodobně se správně, nebo včas nevytvoří textový výraz pro array. Jsou dvě cesty :

     
A) Deklarovat
x as long
x = GetLastRow(1)

SortRange = oSheet.getCellRangeByPosition(0,0,3,x) '(StartCol,StartRow,EndCol,EndRow)

B) Před pole SortRange = Sheet.getCellRangeByName("F2:F"&GetLastRow(1)+1) nastavt

sVar = "F2:F"&GetLastRow(1)+1
print sVar

Když to bude v pohodě:

SortRange = Sheet.getCellRangeByName(sVar)

Zápatí

Používáme FluxBB