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

#1 26. 7. 2019 12:21:58

davef8
Člen
Registrace: 22. 11. 2018
Příspěvků: 20

Rozbalovací seznam pomocí makra

Zdravím, poprosím o drobnou radu, je možné nějak jednoduše vytvořit rozbalovací seznam do buňky pomocí makra se 3 danými hodnotami (ano, ne, nevím)? Něco jako:

thisComponent.Sheets(1).getCellByPosition(i,j).něco = jednoduchý kód pro seznam

díky

Offline

#2 26. 7. 2019 12:55:16

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

Re: Rozbalovací seznam pomocí makra

Ano je to možné a dokonce více způsoby. Může to být jen kliknutí do buňky, která neobsahuje žádnou roletku. Obvyklejší je vytvořit ovládací prvek ListBox, nebo Combo Box.
     Často se použije spuštění makra pomocí Hypertextového odkazu který může spustit například dialog s mnoha zaškrtávacími tlačítky, ListBoxy a podobně. Osobně bych doporučil Hypertextový odkaz který zavolá MsgBox - dialog se třemi možnostmi - Například nabídka Zobrazí se tlačítka Zrušit, Opakovat a Ignorovat, nebo se zobrazí tlačítka Ano, Ne, Zrušit.
     Hyperlinkem lze oébecně spustit cokoliv - například i klasický dialog s listboxem, nebo tlačítky, obrázky a plno jiných skopičin.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 26. 7. 2019 13:08:52

davef8
Člen
Registrace: 22. 11. 2018
Příspěvků: 20

Re: Rozbalovací seznam pomocí makra

Jde mi spíš o následující problém: kopíruji a různě skládám data z jednoho listu do druhého. Jeden sloupec mám s buňkami, kde by měl být v každé buňce select s možnostmi. Chtěl bych jen spustit makro a ve druhém listu se mi provedou připravené akce + vytvoření sloupce se selecty, které nemají na ničem závislost. Jde jen čistě o vytvoření sloupce selectů bez toho abych musel někam klikat, jen v makru.

Offline

#4 26. 7. 2019 13:21:56

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 560

Re: Rozbalovací seznam pomocí makra

Zkuste malá makra openoffice vždy jako první volbu před dotazem :-) (Já to aspoň tak dělám)
https://www.openoffice.cz/doplnky/nasta … dat-makrem


LibreOffice 6.2.

Offline

#5 26. 7. 2019 13:37:49

davef8
Člen
Registrace: 22. 11. 2018
Příspěvků: 20

Re: Rozbalovací seznam pomocí makra

Možná je to tím horkem, ale já v tom řešení mého problému nevidím smile

Offline

#6 26. 7. 2019 15:45:56

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 82

Re: Rozbalovací seznam pomocí makra

Myslíte rozbalovací seznam jako z menu Data/Platnost? Procedura vlozitSeznam do buněk A1,B1,C1 vloží nějaké ty rozbalovací seznamy.

Sub vlozitSeznam 'vloží do buňek A1,B1,C1 rozbalovací seznam jako z menu Data/Platnost
	dim bunka, oSheet
	oSheet=thisComponent.sheets(0) 'první list sešitu
	
	rem musí se určit buňka a do ní vkládat fcí vlozPlatnost()
	bunka=oSheet.getCellByPosition(0,0) 'např. buňka A1
	vlozPlatnost(bunka, array("Ano","Ne","Nevím") ) 'vloží do buňky rozbalovací seznam
	bunka.cellBackColor=RGB(234,251,211) 'obarvit pozadí buňky když třeba nezadávám výchozí text
	
	bunka=oSheet.getCellByPosition(1,0) 'B1
	vlozPlatnost(bunka, array("Jedna","Dva","Tři"), "nevybráno" ) 'vloží do buňky rozbalovací seznam i s textem před vybráním hodnoty
	
	dim pole()
	pole=array("ABC","DEF","XYZ") 'položky seznamu
	bunka=oSheet.getCellByPosition(2,0) 'buňka C1
	vlozPlatnost(bunka, pole(), pole(0) ) 'do buňky s textem první položky
End Sub

Sub vlozPlatnost(oCell as object, pole(), optional sVychozi$) 'vloží do buňky rozbalovací seznam jako z menu Data/Platnost; při zadání sVychozi nastaví i výchozí text v buňce
	dim oValid, s$, i%, sUv$
	if NOT isMissing(sVychozi) then oCell.string=sVychozi 'výchozí hláška do dané buňky
	rem vytvoření řetězce s položkami seznamu
	sUv=chr(34) 'znak uvozovky "
	s=sUv 'řetězec s položkami do seznamu s první otevírací uvozovkou; musí jít o řetězec ve formátu: "možn1";"možn2";"možn3" atd.
	for i=lbound(pole()) to ubound(pole()) 'prochází položky seznamu
		s=s & pole(i) & sUv 'přidá položku s uzavírací uvozovkou
		if i<>ubound(pole()) then s=s & ";" & sUv 'když nejde o poslední položku tak ještě vloží středník a otevírací uvozovku pro další položku
	next i
	rem nastavit seznam do buňky
	oValid=oCell.Validation 'výchozí Data/Platnost v buňce
	with oValid
		.Type=com.sun.star.sheet.ValidationType.LIST 'jakožto seznam
		.setFormula1(s) 'položky seznamu
		.IgnoreBlankCells=true 'ignorovat prázdné buňky
		.ShowList=1 'zobrazení vybírátka (šedý čtverček s černým trojúhelníkem pro výběr hodnot)
	end with
	oCell.Validation=oValid 'nastavit do buňky daný seznam
End Sub

Offline

#7 26. 7. 2019 16:17:40

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

Re: Rozbalovací seznam pomocí makra

davef8 napsal(a)

Jde mi spíš o následující problém: kopíruji a různě skládám data z jednoho listu do druhého. Jeden sloupec mám s buňkami, kde by měl být v každé buňce select s možnostmi. Chtěl bych jen spustit makro a ve druhém listu se mi provedou připravené akce + vytvoření sloupce se selecty, které nemají na ničem závislost. Jde jen čistě o vytvoření sloupce selectů bez toho abych musel někam klikat, jen v makru.

Musím dát za pravdu v jednom směru davef8. Kód od Dana Sedláčka obsahuje chyby. Jde o to, že tam jsou asi 2x spojeny dva až tři různé řádky do jednoho.

kontrola.InputMessage = "Vložte hodnotu z výběru"kontrola.showInputMessage = Truekontrola.ErrorTitle = "POZOR – CHYBA"

'Správně jde o tři řádky
kontrola.InputMessage = "Vložte hodnotu z výběru"
kontrola.showInputMessage = True
kontrola.ErrorTitle = "POZOR – CHYBA"
'Celkem nechápu jak se to mohlo stát ale normální to není - Dan by takovou chybu nepustil.
'K chybě došlo zásahem do článku a to by uživatelé chytili a reklamovali.
'Nechci být paranoický ale tohle bylo uděláno záměrně jako sabotáž.

     Nicméně je to řešení které dle mne davef8 požaduje. Aby bylo jasno funkční kód je tady :

Sub Validace_Roletka()
Dim oCel As Object
Dim oValidation As Object
Dim oSheet
Sheets = ThisComponent.getSheets()
oSheet = thisComponent.Sheets(0)
'oSheet = Sheets.getByName("List1")
oSheet1 = thisComponent.Sheets(1) 'List podle poředí od leva pro nasměrování
oSheet2 = thisComponent.Sheets(2) 'List podle poředí od leva pro nasměrování
'n = oSheet.getCellByPosition(48,1).Value
'oSheet.getCellByPosition(48,1).Value = 1
oCel = ThisComponent.getCurrentController.getActiveSheet.getCellByPosition(0,0) 'Buňka podle pozice
'oCel = ThisComponent.getCurrentController.getActiveSheet.getCellRangeByName("A1") ' Buňka podle jména
oValidation = oCel.getPropertyValue("Validation")
   With oValidation
  .Type = com.sun.star.sheet.ValidationType.LIST
  .setFormula1 ( """První volba"";""Druhá volba"";""Třetí volba""" )
  '.ShowList = com.sun.star.sheet.TableValidationVisibility.SORTEDASCENDING 'Řadí - to často nechceme
  .ShowErrorMessage = True
  .ErrorAlertStyle = com.sun.star.sheet.ValidationAlertStyle.STOP
  .ErrorTitle = "Chybná data"
  '.ErrorMessage = "Nevalidní zadání" 'Obsah nápovědy - stačí nadpis
   End With
   oCel.setPropertyValue("Validation", oValidation)
oCell1 = oSheet.getCellByPosition(0,0) 
End Sub

     Já ale pochybuji, že by to bylo řešení které davef8 hledá. Je to složitější nežli jsem nabízel. Takže i když tohle pustíte makrem do sešitu musí něco navazovat. Pochybuji že by stačil výběr v buňce. většinou se navazuje dalším makrem - které se musí postavit na událost. Tohle makro tam pustí roletku a ta čeká až ji něco přečte a pak se pustí makro je - li tam nějaké napojeno.
     To Dan popisuje také jako možnost spolu s různými vlastnostmi jako je načtení seznamu do výběru, nebo navázání sekundárního makra (volání makra) které ovšem musí existovat. Takže ve výsledku jde o více kroků nežli si davef8 představuje.


     Vlastní roletka nic neřeší je to určitě složitější. Do buňky se musí kliknout a následně vybrat. Teprve poté je možné uvažovat, že se spustí makro je-li nějaké připraveno. Při tom stačí kliknbout na hyperlink, nebo jen do správné buňky či řádku a už to může frčet. Když s roletkou tak s roletkou - Dan uvádí co dělat když vyžadujeme napojení makra na roletku takže tam si to nejděte.

Editoval neutr (26. 7. 2019 16:22:29)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#8 27. 7. 2019 09:41:43

davef8
Člen
Registrace: 22. 11. 2018
Příspěvků: 20

Re: Rozbalovací seznam pomocí makra

pánové díky za váš čas, šlo mi prakticky čistě jen o tu funkci:

Function vlozPlatnost(oCell as object, pole(), optional sVychozi$) 'vloží do buňky rozbalovací seznam jako z menu Data/Platnost; při zadání sVychozi nastaví i výchozí text v buňce
	dim oValid, s$, i%, sUv$
	if NOT isMissing(sVychozi) then oCell.string=sVychozi 'výchozí hláška do dané buňky
	rem vytvoření řetězce s položkami seznamu
	sUv=chr(34) 'znak uvozovky "
	s=sUv 'řetězec s položkami do seznamu s první otevírací uvozovkou; musí jít o řetězec ve formátu: "možn1";"možn2";"možn3" atd.
	for i=lbound(pole()) to ubound(pole()) 'prochází položky seznamu
		s=s & pole(i) & sUv 'přidá položku s uzavírací uvozovkou
		if i<>ubound(pole()) then s=s & ";" & sUv 'když nejde o poslední položku tak ještě vloží středník a otevírací uvozovku pro další položku
	next i
	rem nastavit seznam do buňky
	oValid=oCell.Validation 'výchozí Data/Platnost v buňce
	with oValid
		.Type=com.sun.star.sheet.ValidationType.LIST 'jakožto seznam
		.setFormula1(s) 'položky seznamu
		.IgnoreBlankCells=true 'ignorovat prázdné buňky
		.ShowList=1 'zobrazení vybírátka (šedý čtverček s černým trojúhelníkem pro výběr hodnot)
	end with
	oCell.Validation=oValid 'nastavit do buňky daný seznam
End Function

Offline

Zápatí