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

#2 Re: Další součásti » Doplněk TypoJTB » 2. 3. 2022 12:32:51

Z důvodů že je pro mě již bolestivé ovládat zastaralý redakční systém tohoto fóra; z důvodu nemožnosti uploadovat soubory přímo na toto fórum ale jedině na servery třetích stran; a z důvodů přítomnosti reklam na tomto webu jsem dobrovolně ukončil svou dobrovolnou podporu tohoto portálu. Ke dni 3.3.2022 bych mohl být k zastižení na https://ask.libreoffice.org, jak tomu bude dále skutečně nevím.
Kamil Landa - "kamlan"

#3 Re: Chyba v programu » Calc - zamrznutí pohybu pomocí šipek » 19. 2. 2022 11:33:50

Zkoušel jsem a funguje mi bez problémů Libre 7.3.1.1. Win10 https://dev-builds.libreoffice.org/pre- … in/x86_64/. Šipkami se dá pohybovat ihned po výběru položek v Automatickém filtru, stejně tak po zrušení filtru, žádné mrznutí.

#4 Re: Calc » funkce EDATE "VYŘEŠENO" » 17. 2. 2022 09:35:57

Tohle je jednodušší Basicem a fcí DateAdd. Ale ukázka i pro volání funkce Calcu.

Sub pridatKdatumu	
	const s="22.3.2022" 'datum
	const i=1 'kolik měsíců přidat
	rem čistě Basicem
	msgbox DateAdd("m", 1, s) 'přidat k datu hodnotu, parametry fce najdete v Nápovědě
	rem přes funkci Calcu
	dim oFunction as object, vysledek
	oFunction=createUnoService("com.sun.star.sheet.FunctionAccess")
	vysledek=oFunction.callFunction("EDATE", array(s, i))
	msgbox CDate(vysledek)
End Sub

#5 Re: Calc » Filtr pomocí makra VYŘEŠENO » 15. 2. 2022 19:25:07

Jen pro informaci, následující makro vypíše NumberFormat pro jednu vybranou buňku.

Sub vypisNumberFormat
	dim oDoc as object, oSel as object
	oDoc=ThisComponent
	oSel=oDoc.CurrentController.Selection
	if oSel.supportsService("com.sun.star.sheet.SheetCell") then 'vybrána 1 buňka
		msgbox("NumberFormat=" & oSel.NumberFormat)
	else
		msgbox("Vyber jen jednu buňku", 48)
	end if
End Sub

#6 Re: Calc » Jak zkonvertovat ceník s cenami v řádcích do sloupců? - VYŘEŠENO » 15. 2. 2022 19:23:22

Pro € se tam dá nastavit víc hodnot (slovenské euro, německé, italské atd.), slovenské bylo myslím 109. Nejsnažší je nastavit si požadovaný typ na jednu buňku a spustit následující makro které vypíše NumberFormat pro tu jednu buňku. V Nápovědě ty hodnoty myslím nejsou.

Sub vypisNumberFormat
	dim oDoc as object, oSel as object
	oDoc=ThisComponent
	oSel=oDoc.CurrentController.Selection
	if oSel.supportsService("com.sun.star.sheet.SheetCell") then 'vybrána 1 buňka
		msgbox("NumberFormat=" & oSel.NumberFormat)
	else
		msgbox("Vyber jen jednu buňku", 48)
	end if
End Sub

#7 Re: Calc » Jak zkonvertovat ceník s cenami v řádcích do sloupců? - VYŘEŠENO » 15. 2. 2022 17:11:00

takhle :-)

Sub kopirujCenyDoSloupcu
	const sList1="List1" 'zdrojový list
	const sList2="sloupce" 'název cílového listu
	const iParu=10 'počet párů Qty&Cena
	const iZac=3 'index sloupce kde je první Qty (indexy jsou od nuly, A=0, D=3)
	dim oDoc as object, oList1 as object, oRange1 as object, oList2 as object, sZahlavi$, iList2&, data as object, oRange2 as object, oCur1 as object, p1(), oRangeP as object, _
		iRadkuP&, i&, j&, k&, oRangeP2 as object, oSloupec as object
	oDoc=ThisComponent
	oList1=oDoc.Sheets.getByName(sList1)
	if oDoc.Sheets.hasByName(sList2) then 'když cílový list existuje
'		if 6=msgbox(sList2 & chr(13) &  "List již existuje, smazat?", 4) then 'dotaz zda-li smazat existující cílový list
			oDoc.Sheets.removeByName(sList2) 'tak jej smazat
'		else
'			exit sub
'		end if
	end if
	iList2=oList1.RangeAddress.Sheet+1 'index (pozice) cílového listu
	oDoc.Sheets.insertNewByName(sList2, iList2) 'vložit cílový list za výchozí list
	oList2=oDoc.Sheets(iList2)
	sZahlavi="A1:E1" 'adresa záhlaví tabulky
	oRange1=oList1.getCellRangeByName(sZahlavi) 'buňky záhlaví
	oDoc.CurrentController.Select(oRange1)
	data=oDoc.CurrentController.getTransferable 'kopírovat záhlaví
	oRange2=oList2.getCellRangeByName(sZahlavi) 'buňky záhlaví v cílovém listu
	oDoc.CurrentController.Select(oRange2)
	oDoc.CurrentController.insertTransferable(data) 'vložit záhlaví
	createUnoService("com.sun.star.frame.DispatchHelper").executeDispatch(oDoc.CurrentController.Frame, ".uno:Deselect", "", 0, array()) 'provést
	oCur1=oList1.createCursor()
	oCur1.goToEndOfUsedArea(false) 'v proměné je adresa posledního použitého řádku a sloupce
	oRangeP=oList1.getCellRangeByPosition(oRange1.RangeAddress.StartColumn, oRange1.RangeAddress.StartRow+1, oCur1.RangeAddress.StartColumn, oCur1.RangeAddress.StartRow)
	p1=oRangeP.getDataArray() 'data z výchozího listu
	iRadkuP=CLng((oCur1.RangeAddress.EndColumn-oRange1.RangeAddress.EndColumn+2)/2) 'maximum řádků z jednoho sloupce
	dim p2((ubound(p1)+1)*iRadkuP) 'pole pro setDataArray do cílového rozsahu
	for i=lbound(p1) to ubound(p1) 'projíždět data z výchozího listu po řádku
		if p1(i)(0)="" AND p1(i)(1)="" AND p1(i)(2)="" then 
			'sloupce Materiál, Jednotka, Rate jsou prázdné
		else 'nějaké údaje o materiálu jsou tak zapsat
			for k=iZac to iZac+iParu step 2 'další řádky dle toho jak jsou vyplněné dvojice Qty&Cena atd., projíždí všechny sloupce takže nějaké údaje mohou chybět (např. může chybět Qty5Cena5 ale je-li vyplněné Qty6Cena6 atd. tak už to zapíše)
				if p1(i)(k)<>"" OR p1(i)(k+1)<>"" then 'alespoň 1 hodnota z Qty&Cena je, tak zapsat
					p2(j)=array( p1(i)(0), p1(i)(1), p1(i)(2), p1(i)(k), p1(i)(k+1) )
					j=j+1
				end if
			next k
		end if
	next i
	redim preserve p2(j-1) 'cílové pole jen pro tolik řádků kolik bylo vytvořeno
	oRangeP2=oList2.getCellRangeByPosition(oRange2.RangeAddress.StartColumn, oRange2.RangeAddress.StartRow+1, oRange2.RangeAddress.StartColumn+ubound(p2(0)), oRange2.RangeAddress.StartRow+j ) 'cílový rozsah
	oRangeP2.setDataArray(p2) 'vložit data do cílového rozsahu
	oSloupec=oList2.getCellRangeByPosition(oRange2.RangeAddress.EndColumn, oRange2.RangeAddress.StartRow+1, oRange2.RangeAddress.EndColumn,  oRange2.RangeAddress.StartRow+j)
	oSloupec.NumberFormat=102 '102=měna 1234,50 Kč; 2=číslo typu 1234,00
	rem setřídit data
	dim oDesc as object, aSortFields(1) as new com.sun.star.table.TableSortField
	oDesc=oRangeP2.createSortDescriptor
	oDesc(1).Value=false 'rozsah je bez hlavičky
	aSortFields(0).Field=0 'sloupec A jako první vzor pro třídění
	aSortFields(0).IsAscending=true
	aSortFields(1).Field=3 'sloupec D jako druhý vzor pro třídění
	aSortFields(1).IsAscending=true
	oDesc(3).Value=aSortFields()
	oRangeP2.sort(oDesc) 'setřídit	
End Sub

#8 Re: Calc » Jak zkonvertovat ceník s cenami v řádcích do sloupců? - VYŘEŠENO » 15. 2. 2022 16:54:36

Tak můžete zkusit tohle makro, hlavičku to zkopíruje zformátovanou, data vkládá neformátovaně - udělá to najednou přes setDataArray -> algoritmus prostě pracuje s celým polem dat z výchozího listu.
Prázdné řádky nezapíše (resp. kontrola je na prázdné první tři slouce čili Materiál, Jednotka, Rate -> když budou tyto prázdné tak řádek vynechá). V řádku kontroluje všechny dvojice QtyX&CenaX, ale prázdné nezapíše. Na konci nastaví akorát na sloupec C typ buňky Měna, kdyžtak si změňte řádek oSloupec.NumberFormat=102.

zjednodušeno v dalším příspěvku

#9 Re: Calc » Jak zkonvertovat ceník s cenami v řádcích do sloupců? - VYŘEŠENO » 15. 2. 2022 12:27:43

Potřebujete při kopírování dat zachovat formátování (tučnost, barvu písma atd.) nebo stačí jen zkopírovat hodnoty?


A chápu-li to správně tak výsledek v novém listu má být:

mater_1   ks       1       10    16,00
mater_1   ks       1       30    15,00
mater_1   ks       1       100   14,0
mater_1   ks       1       1000  8,00
mater_2   ks       1000       50    335,00
mater_2   ks       1000       500   95,00
mater_3   ks       10       100   1,00

#10 Re: Calc » Filtr pomocí makra VYŘEŠENO » 13. 2. 2022 11:08:29

Pozor, to číslování slopců v příkazu podminka(0).Field=11 jde od nuly, takže sloupec A=0, B=1, C=2 atd. -> pro hodnotu 11 kterou tam máte to vychází na sloupec L. Takže po zadání správného sloupce mi to vaše makro funguje v pohodě a vyfiltruje datumy >=.


Co se týká toho datumu do buňky, tak nastavujete 2 vlastnosti buňky, do Value dáte hodnotu datumu jako typ Date, a do NumberFormat o jakou kategorii formátu jde, 37 je DD.MM.YYYY.

Když si ve Formát buněk/ Čísl/ Kategorie nastavíte nějakou hodnotu, tak ta se ukládá právě do vlastnosti NumberFormat, takže třeba přes XRay pak snadno zjistíte potřebné číslo pro nastavenou hodnotu.

Jinak kdybyste datum v buňce nastavoval přes String="12.2.2023" a nikoliv Value, tak si Libre z mně neznámého důvodu před řetězec přidá znak ' a pak to nefunguje pořádně.

Sub datumDoBunky
	dim bunka as object
    bunka=ThisComponent.Sheets(0).getCellRangeByName("D2")
    with bunka
		.Value=CDate("12.2.2023") 'bacha musí být právě konverze na typ proměnné Date
		.NumberFormat=37 'formát buňky DD.MM.YYYY
	end with
End Sub

#11 Re: Calc » Vložení dat do seznamu v dialogu » 4. 2. 2022 20:19:28

Libre si očividně nějak špatně ukládá cestu pro obrázek v Dialogu. Když si v Basic editoru otevřu dialog dlg_EditDeleteRow a kliknu doprostřed abych vybral ten obrázek, tak v levé části obrazovky v Katalogu objektů se objeví info o tom vybraném objektu. A pro ten obrázek se mi v položce Obrázek zobrazuje prapodivná cesta k obrázku Pictures/100075580000297200002972DBAFD601017E8F60.svg. Když kliknu na ikonku ... a vyberu soubor obrázku, tak ta cesta zmizí a nově vybraná se neobjeví, ale v dialogu se obrázek objeví a Central/ Start_DialogEDR jej též v dialogu zobrazí. Ovšem po uložení ODS a následném znovuspuštění dialogu je to opět bez obrázku a po otevření dialogu je tam zase ta prapodivná cesta.


Ale dá se to vyřešit tak, že se holt ta cesta k obrázku zadá do dialogu až ve vyvolávacím makru.

Sub Start_DialogEDR
	DialogLibraries.LoadLibrary("Standard")
	oDlg10 = CreateUnoDialog(DialogLibraries.Standard.dlg_EditDeleteRow)
	dim oImg as object
	oImg=oDlg10.getControl("ImageControl1") 'jméno objektu obrázku
	oImg.Model.ImageUrl=ConvertToUrl("d:\question_button.svg") 'cesta k obrázku
	beep		'Zvukové upozornění na vyskočení dialogu
	oDlg10.Execute()
End Sub

Jinak doporučuji optimalizovat SVG obrázky pomocí SVGO-GUI https://github.com/svg/svgo-gui -> uděláte si zástupce toho programu na Ploše a pak v něčem (klidně v Průzkumníku) vyberete SVG soubory a přetáhnete je na tu ikonku -> a poté jsou ta SVG mnohdy o více jak polovinu menší :-).


A pro zajímavost: vyřešil jsem pomocí vaší ukázky jednu podivnost která už mi nějakou dobu neštymovala :-). Když jsem klikl v listu Inventura na tlačítko Aktualizace inventury, vypsalo mi to chybové hlášení No sheet with the name: Sheet1. Vyřešilo to že jsem připsal dim Sheets do vaší fce Inventura. Tohle už se mi párkrát stalo že mi Libre vypsalo podivnou chybu a vyřešila to deklarace proměnné pomocí dim. A ejhle, po nějakém tom resetu uživatelského profilu a postupném napokírovávání jeho adresářů zpět jsem přišel na to, že v knihovně Standard která se načítá automaticky (a s ní i všechny funkce v ní), tak že se mi tam jedna funkce jmenuje Sheets stejně jako vaše nedeklarovaná proměnná Sheets :-). Takže díky nenadeklarované proměnné Libre logicky napřed zkoušelo volat stejnojmennou funkci když jí mělo k dispozici. No a v této fci bylo ono chybové hlášení. Díky obdobné nejanosti jsem začal před časem vše psát v módu option explicit, ale až z vaší ukázky jsem odhalil v čem to - a zcela logicky - vězelo :-).

#13 Re: Calc » Podivný export do PDF, spěchá to VYŘEŠENO » 28. 1. 2022 14:41:59

Tak zkuste vyresetovat uživatelský profil, c:\Users\uživatel\AppData\Roaming\LibreOffice\4\user -> zazálohujte si ten adresář user a pak smažte jeho obsah. Libre si vytvoří nový čistý uživatelský profil a uvidíte. Kdyby to bylo tím, tak někde v tom svém profilu máte chybu.
Pak se dá ručně zkoušet přikopírovávat adresář po adresáři ze zazálohovaného user do čistého a tak zkoušet kde to hází chybu.

#14 Re: Calc » Vložení dat do seznamu v dialogu » 25. 1. 2022 18:59:40

Co se týká problému 1 (již v předešlém příspěvku jsem použil číslování z listu Nefunkční věci z posledního ukázkového souboru) tak tam jste měl chybu v tom jak získat ten rozsah buněk, není tam .getCellByPosition, to je pouze pro jednu buňku. Pro rozsah buněk je .getCellRangeByPosition. A vaše proměnná oblast musí být objekt, nikoliv vlastnost objektu .RangeAddress kterou jste použil. Také trochu bordel v tom že rozsah .getCellRangeByPosition bere pozice buněk od nuly, čili A1=0,0 atd. Nicméně snadno si lze označit vybraný rozsah pomocí ThisComponent.CurrentController.Select(oblast), takže pak vidíte s čím pracujete.

Makro pro třídění Standard/NovyZaznam/DialogNZ_Sdata stačí upravit třeba takto.

Pro třídění v listu Inventura si to jistě zvládnete upravit sám.

dim tridpodle(0) as new com.sun.star.util.SortField
dim serad(0) as new com.sun.star.beans.PropertyValue
oblast=list.getCellRangeByPosition(0,3,7,Target) 'bacha číslování pro Position je od nuly -> A1=0,0; A2=0,1; B1=1,0; B2=1,1 atd.
ThisComponent.CurrentController.Select(oblast) 'můžete si pro kontrolu označit oblast která je vybrána
msgbox "vybráno je toto"
tridpodle(0).Field=4
tridpodle(0).SortAscending=True
serad(0).Name="SortFields"
serad(0).Value=tridpodle()
oblast.sort(serad())

No a co se týká problému 4 tak tam vám hapruje především funkce UnionArrays. Dvě neznámé pole spolehlivě spojíte jen přes třetí pole.

Function UnionArrays(p1(), p2()) as array 'sloučení dvou polí pomocí třetího pomocného pole
	dim p3(ubound(p1)-lbound(p1)+ubound(p2)-lbound(p2)+1) 'velikost 3. pole se získá z údajů o počátku a konci obou polí
	dim i&, j&
	for i=lbound(p1) to ubound(p1) 'naplnění první části třetího pole prvním polem
		p3(i-lbound(p1))=p1(i)
	next i
	for j=lbound(p2) to ubound(p2) 'naplnění druhé části třetího pole druhým polem
		p3(j+i-lbound(p2))=p2(j)
	next j
	UnionArrays=p3 'vrátit třetí pole
End Function

Když máte jistotu že pole je indexováno od nuly a není zadefinováno jako nějaký konkrétní typ, tak si vystačíte s ubound a klidně i ReDim Preserve. Ale pole mohou být definovány i od vyššího číslování než od nuly a pak se musí brát v potaz i lbound. A když je pole definováno jako nějaký konkrétní typ a nikoliv Variant, pak ho Redim Preserve vynuluje. 

Sub testUnion
	dim p1(2 to 5) as string, p2(1 to 2) as string
	p1=array("a", "b", "c", "d")
	p2=array("E", "F")
	xray UnionArrays(p1, p2) 'sloučená pole
	redim preserve p1(6) as string 'pole bylo ale definováno jak typ string, takže ho to vynuluje
	xray p1 'pole bude vynulované
	dim p4(2 to 5) 'pole jako typ Variant
	p4=array("A", "B", "C", "D")
	redim preserve p4(6) 'typ Variant to zachová
	xray p4
End Sub

No a další problém máte s .getDataArray, které vždycky vrací matici (pole polí), tedy array( array(...) ). Správně jste upravil ve fci Vydej/ Start_DialogVE matici MyArray na pole ARd, ale to samé musíte udělat i s druhou maticí MyArray2, než to vženete do fce UnionArrays. A pak už by bylo lepší mít na to samostatnou funkci. Ale jelikož MyArray2 je jednoprvková matice, tak tam můžete dát MyArray2(0). Takže řádek 151 v modulu Vydej můžete zakomentovat a ř.156 může být i takto:

aControl.Model.StringItemList=UnionArrays (MyArray2(0), ARd)

Po těchto dvou úpravách (jinak fce UnionArrays + jinak její použití v ř.156) už se vám ten editační dialog spustí a bude i předvyplněn, takže další postupy jistě zvládnete sám.

Ono to nebude ideální neboť jestli chcete slučovat dvě pole, tak by bylo záhodno mít v tom výsledném poli jen unikáty čili vyházet z toho duplicity. Ale k tomu a asi i jiným věcem se jistě ještě dostanete :-).

#15 Re: Calc » Vložení dat do seznamu v dialogu » 23. 1. 2022 19:16:09

Problém 2 a 3 vyřešíte tím, že ten sloupce A označíte a dáte pravou myší Formát buněk a z karty Číslo vyberete Datum + 31.12.1999. Tím budou mít buňky formát datumu pro ruční zadání.

No a makrem musíte buňce nastavit vlastnost .NumberFormat též na datum. Nejdřív možno zapsat .String a pak nastavit .NumberFormat; nebo nastavit .NumberFormat a pak zapsat .Value=DateValue().

Např. pro makro Vydej/DialogV_Sdata mi fungovaly pro zapsání datumu oba příklady.

aControl = oDlg3.getControl("d_VDatum")
dim oBunka as object, s$
oBunka=list.getCellByPosition(0,Target)
s=aControl.getText()
with oBunka
	.String=s
	.NumberFormat=37 'DD.MM.YYYY
end with
list2.getCellByPosition(1,Target2).String=s
aControl = oDlg3.getControl("d_VDatum")
dim oBunka as object, s$
oBunka=list.getCellByPosition(0,Target)
s=aControl.getText()
with oBunka
	.NumberFormat=37 'DD.MM.YYYY
	.Value=DateValue(s)
end with
list2.getCellByPosition(1,Target2).String=s

K 1 a 4 se dnes již nedostanu, už mám dnes z programování hlavu zatemněnou :-(. Uvidím jak mi co půjde v týdnu.

#17 Chyba v programu » Chyba v makru: při CoreReflection pro pole vzniklé Split() a předělané » 20. 1. 2022 13:41:14

kamlan
Odpovědí: 0

Jedna chyba ke které jsem se dostal až teď a která vznikla někde asi v časnějších verzích 7. Funguje třeba v 7.0.4.2 ale někde dál už ne.


Když se vytvoří pole pomocí Split() a pak předělá na Array ( Array() ) tak nefunguje CoreReflection tudíž nelze tohle pole zobrazit v XRay ani MRI které pro zobrazení používají právě CoreReflection. I když v Kukátku Basicu se v pohodě objeví.


Mám dojem že v nějakých verzích byla s takovým polem ještě větší pakárna a nefungovalo ho předělat ve smyčce ani na to Array(Array()). Někde jsem to myslím zmiňoval že stačilo použít druhé pole p2=array(p(i)) a s tím to šlo, ale třeba v 7.3.0.1 už funguje předělávka na Array(Array()) v tom samém poli, takže to již někde bylo opraveno.


Nahlášeno zde https://bugs.documentfoundation.org/sho … ?id=146873

#18 Re: Calc » Graf - Uspořádat - Na pozadí » 18. 1. 2022 13:31:13

Nebo F5 či menu Zobrazit/ Navigátor -> v tom Objekty OLE, dvojklik na daný objekt (graf) a tím se označí. Pak lze pravou myší kliknout na oranžový bod kterým je možné roztáhnout graf do větší vrelikosti a přesunout zase do popředí.
8SmN.jpg

#19 Re: Writer » Jak vložit komentář pomocí klávesové zkratky? » 13. 1. 2022 16:47:30

Ctrl+Alt+C je očividně zkratka operačního systému, mě to pod Win vkládá & v každém programu. Ale zkuste si to s jinými klávesami, Ctrl+Alt+klávesa vkládá ty samé anglické znaky české klávesnice které jdou vložit i přes PravýAlt+klávesa. Nevím jestli to jde někde ve Windows vypnout.

#20 Re: Calc » Podivný export do PDF, spěchá to VYŘEŠENO » 13. 1. 2022 11:11:04

Asi nejjednodušší by pro vás bylo zkusit portable (přenosnou) verzi, tu rozbalíte klidně na flash disk nebo do adresáře na Plochu. Akorát nevím která verze je vydána jako portable.


V 7.2.4.1 mi to funguje v pohodě přes Exportovat do PDF. Ale mám pocit že ta verze dělá nějakou chybu v Calcu když edituju text v buňce - nějak prapodivně se mi tam rozhazoval v nějakém případě text, ale neměl jsem čas se tomu víc věnovat. Nižší 7.2.3.2 jsem neměl tak dlouho takže netuším jestli nemá nějaké jiné nepříjemnosti. Vyšší 7.2.5 má chybu co se týká maker a fce .setDataArray - https://bugs.documentfoundation.org/sho … ?id=146454 která je opravena zatím čerstvě a měla by být brzy přístupna v denních buildech - ovšem z diskuze vyplývá že zachybované je to asi i jinde v kódu a na to se ještě nejspíš nepřišlo. Nebo možná zkusit nějakou poslední 7.1.x.

#21 Re: Calc » Rozložení textu z buňky do více buněk » 10. 1. 2022 19:29:31

Já používám LibreOffice a v AOO vám to nemohu odzkoušet. Ale možná by vám tam chodil tenhle vzorec založený tedy na makru.

Function VRATSUBREGULARY(s$, ii&) 'ii-tý subregulár z řetězce s, regulár je zadán v .searchString
	dim pole(2), oHledani, oHledaniParam, oNalez, oStart, oEnd, pocet%, i%, a()
	oHledani=CreateUnoService("com.sun.star.util.TextSearch") 'textové hledání proto, abych dostal subReguláry
	oHledaniParam=CreateUnoStruct("com.sun.star.util.SearchOptions")
	With oHledaniParam
	  .algorithmType=com.sun.star.util.SearchAlgorithms.REGEXP 'regulárem
	  .searchString="^(\d{6}.?)\s+(.+?)\s+([^ ]{4})\s+(\d+,-)\s*(\d*)$" 'celý regulár který nalézám
	End With
	oHledani.setOptions(oHledaniParam)
	oNalez=oHledani.searchForward(s,0,len(s)) 'prohledávat nalezený řetězec od začátku do konce
	oStart=oNalez.startOffset() 'pole se začátky pozic subRegulárů
	oEnd=oNalez.endOffset() 'pole s konci pozic subRegulárů
	rem nahrazování subRegulárů za potřebné znaky
	pocet=oNalez.subRegExpressions()-1
	if pocet=-1 then exit function
	redim a(pocet-1) 'pole pro subreguláry
	for i=1 to pocet 'projíždí nalezené subvýrazy
		a(i-1)=Mid(s,oStart(i)+1,oEnd(i)-oStart(i)) 'znaky ze subReguláru
	next i
	VRATSUBREGULARY=a(ii-1)
End Function

Použití:
=VRATSUBREGULARY(A1;1)
=VRATSUBREGULARY(A1;2)
=VRATSUBREGULARY(A1;3)
=VRATSUBREGULARY(A1;4)
=VRATSUBREGULARY(A1;5)


Krom REGEX mě napadá použít MID a pozice podvýrazů získávat funkcí SEARCH, do níž lze též vložit reguláry. Ale je potřeba je zapnout v Nástroje/ Možnosti/ LibreOffice Calc/ Výpočty

=LEFT(A1;FIND(" ";A1)-1)
=MID(A1;1+FIND(" ";A1);SEARCH("\s+.{4}\s+\d+,-";A1)-FIND(" ";A1))
=MID(A1;1+SEARCH("\s.{4}\s+\d+,-";A1);5)
=MID(A1;SEARCH("\d+,-";A1);SEARCH(",-";A1)-SEARCH("\d+,-";A1))
=TRIM(MID(A1;2+SEARCH(",-";A1);LEN(A1)))


Kdybyste přešel na LibreOffice, tak to lze tedy rozkouskovat docela snadno REGEXem: \s+ je kdyby tam bylo víc mezer za sebou či tabulátor apod.

=REGEX(A1;"^(\d{6}.?)\s+(.+?)\s+([^ ]{4})\s+(\d+,-)\s*(\d*)$";"$1")
=REGEX(A1;"^(\d{6}.?)\s+(.+?)\s+([^ ]{4})\s+(\d+,-)\s*(\d*)$";"$2")
=REGEX(A1;"^(\d{6}.?)\s+(.+?)\s+([^ ]{4})\s+(\d+,-)\s*(\d*)$";"$3")
=REGEX(A1;"^(\d{6}.?)\s+(.+?)\s+([^ ]{4})\s+(\d+,-)\s*(\d*)$";"$4")
=REGEX(A1;"^(\d{6}.?)\s+(.+?)\s+([^ ]{4})\s+(\d+,-)\s*(\d*)$";"$5")

#22 Re: Calc » Rozložení textu z buňky do více buněk » 10. 1. 2022 15:50:04

Tím REGEXem mi to přijde jednodušší ale ani tak to není žádné terno. Syntaxi regulárních výrazů je v Nápovědě. REGEX má to výhodu že může vracet hodnotu třeba od třetí mezery atd. Na těch pozicích u kraje si s MID aspol. vystačíte, ale v těch prostředcích je ten REGEX snažší.


vypsat vše od znaků ",-" doleva, může být včetně znaků

=TRIM(MID(A1;1;FIND(",-";A1)+1))

tedy od prvního znaku až do znaku ",-"




od první mezery zezadu vypsat vše doprava

=REGEX(A1;" [^ ]+$")

výraz který vrátí vše od mezery po níž následují až do konce jiné znaky než mezera, tedy od poslední mezery do konce




od první mezery zezadu vypsat vše doleva

=REGEX(A1;"(^.+) [^ ]+$";"$1")

řetězec brát jako část od začátku k poslední mezeře (^.+) a k tomu poslední mezera až nemezerovéZnakyDoKonce [^ ]+$; a jako náhradu celého výrazu dát jen tu první část čili $1




V tom dalším v té ukázce co kouskujete z podvýrazů se nevyznám, ale na to by vám ukázky výše mohly stačit. Ale ještě jinak. Pokud potřebujete třeba něco od druhý mezery po třetí mezeru, tak

=REGEX(A1;"( [^ ]+)";;2)

Tohle najde druhej výskyt výrazu: mezera a po ní NěcoJinýhoNežMezera+vícekrát



A třeba od třetí mezery do pátý mezery - byť to už není tak přehledné.

=REGEX(A1;"[^ ]+ [^ ]+ [^ ]+ ([^ ]+ [^ ]+ ).+";"$1")

Zase kombinace nemezerovýchZnakůVícekrát a k tomu mezera; a pak v závorkách () část kterou potřebujete vrátit.



Podobně můžete dostat jednotlivý část řetězce třeba po jednom

=REGEX(A1;"(^[^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) (.+$)";"$1")
=REGEX(A1;"(^[^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) (.+$)";"$2")
...
=REGEX(A1;"(^[^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) (.+$)";"$7")

Anebo si třeba dvě různý části z toho spojit

=REGEX(A1;"(^[^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) (.+$)";"$1@$2")
=REGEX(A1;"(^[^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) (.+$)";"$1&$5")
=REGEX(A1;"(^[^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) (.+$)";"$3+++$7")

#23 Re: Calc » Vložení dat do seznamu v dialogu » 3. 1. 2022 22:18:42

U těch ComboBoxů se aktuální položka nastavuje vlastností .Text. Když daný Text v tom seznamu je, tak ho to na něj nastaví.

o.Model.StringItemList=p 'data z pole do listboxu
o.Model.Text=p(0) 'první položka bude aktivní

.Text lze nastavit třeba i na nějakou neznámou hodnotu a ta pak bude dána na začátek a brána též jako výchozí. A zmizí když si něco ze seznamu vyberete.

Pro ukázku jiná syntaxe s neznámou položkou.

with o.Model
	.StringItemList=p 'data z pole do listboxu
	.Text="-------" 'čárky nejsou v seznamu takže budou dány jako výchozí první položka seznamu
end with

Jinak třeba pro příště :-). Vzhledem k tomu že jde již o komplikovanější Sešit a že tam nemáte čistý LibreBasic ale je to z VBA, tak lepší by bylo napsat ještě postup jak se k chybě člověk dostane, u vás např.: Dejte list "Výdej materiálu", pak klik na tlačítko "Výdej dialog" a pak rozbalte "Název materiálu". Tam je problém.

Případně ještě dodat: je to dialog Standard/ Vydej, a obsluhuje to makro VBAProject/ Moduly/ Module3/ Prvky.

Sice jsem se k tomu po chvíli proklikal, ale být ten soubor o něco složitější, tak už bych se na to vykašlal a musel vám napsat dotaz jak se k tomu dostat. Ale máte to pěkně barevný, to se mi líbilo :-).

#24 Re: Calc » Vložení dat do seznamu v dialogu » 30. 12. 2021 16:23:14

@neutr: to byla čistá reakce na autora dotazu, ne na vás :-)

#25 Re: Calc » Vložení dat do seznamu v dialogu » 30. 12. 2021 12:31:53

Nepřiložil jste ukázkový soubor s vaším dialogem, takže jen "zpaměti" bez možnosti odzkoušení :-)

vstupni_pole=list.getCellRangeByName("A2:A4").getDataArray() 'matice s řetězci z dané oblasti

dim p(ubound(vstupni_pole)), i&
for i=lbound(vstupni_pole) to ubound(vstupni_pole) 'z matice jen jednorozměrné pole
	p(i)=vstupni_pole(i)(0)
next i

dim o as object
o=dlg.getControl("d_seznam") 'listbox
o.Model.StringItemList=p 'data z pole do listboxu

Z mé zkušenosti je použití StringItemList pro naplnění Listboxu mnohem rychlejší oproti metodám addItem/removeItem -> to kdybyste tam dával třeba desítky či stovky položek, nebo třeba potřeboval dynamicky měnit položky druhého listboxu v závislosti na tom co se vybere v prvním listboxu (pro každou položku z listboxu1 by byly jiné položky v listboxu2).

Zápatí

Používáme FluxBB