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

#1 10. 1. 2016 22:20:19

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

chyba v makru - VYŘEŠENO

Dobrý den. Udělal jsem takové malé makro na kopírování listu (vadí mi poměrně složité kopírování listu přes klik, zaškrtnutí políčka, vyhledání umístění ...). Makro funguje bezvadně až na jednu vadu, při zavření a násldném otevření LO zahlásí někde nějakou chybu. Snažil jsem se ledasco upravit, umístění chyby se mění, ale furt mu něco vadí. Teď naposled hlásí toto: "Při běhu Basic skriptu vnd.sun.star.script:Standard.Module1.kopiruj_aktualni_list_vedle?language=Basic&location=application došlo k chybě skriptovacího rozhraní." A to vždy při rozjedu LO, pak už to funguje správně a chyba se neobjevuje.
jako chybné řádky se objevovaly: listy = thisComponent.Sheets a když jsem to zrušil tak zase že to nezná metodu getCurrentController no a nakonec to co uvádím výše (po přesunu makra do modulu2). Nechápu co mu může vadit ...

Sub kopiruj_aktualni_list_vedle
dim doc as object, list as object, control as object', listy as object,
dim nazev as string, jmeno as string
dim pocet as integer, poradi as integer

doc = thisComponent
'listy = doc.Sheets
control = doc.getCurrentController
list = control.ActiveSheet

on error goto konec

nazev = list.name 
pocet = doc.Sheets.getCount
for i = 0 to pocet - 1
	if doc.Sheets.getByIndex(i).Name = nazev then
		poradi = i
	end if
next i

zadanijmena:

jmeno = InputBox("Zadej jméno nového listu" & chr(13) & "Při zanechání přednastavené hodnoty vytvoří nový list s příslušným indexem", "Kopírování aktuálního listu na vedlejší pozici", nazev)

if jmeno = nazev Then
	goto vytvorlist
endif

If doc.Sheets.hasByName( jmeno ) Then
   zadani = Msgbox("Jméno: " & jmeno & " již existuje! Chceš to ještě zkoušet?" & chr(13) & "  Přerušit = ukončení"  & chr(13) & "  Znovu = nové zadání"  & chr(13) & "  Ignorovat = nový list se pojmenuje po starém s indexem", 2 , "Takhle to nepůjde")
   select case zadani
    case 3
    	exit sub
    case 4
    	goto zadanijmena
    case 5 
   	   goto vytvorlist
   end select
end if

vytvorlist:

doc.Sheets.CopyByName(nazev, jmeno ,poradi + 1)

konec:

list = doc.Sheets.getByIndex(poradi + 1)
control.setActiveSheet(list)

End Sub

Editoval ludviktrnka (21. 1. 2016 14:20:26)


LibreOffice 5.4.

Offline

#2 11. 1. 2016 08:53:16

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

Re: chyba v makru - VYŘEŠENO

Co tohle :

Sub VlozList
oDoc = ThisComponent
Dim SesCis as integer
   SesCis = oDoc.getSheets().getCount() 
   oDoc.getSheets().insertNewByName( "List" & SesCis+1, SesCis+1 ) 
End Sub

     Lze to snadno upravit pomocí input boxu aby šlo zvolit jiný název, nebo větvením pomocí MsgBoxu (Chcete automatické číslování > ANO, Chcete vlastní název > zvolte NE).
     Podobně lze načíst název aktivního listu a přidělit mu například číslo +1 (inkrementace). To pro Vás ale jistě problém nebude stejně jako ošetření případné chyby "ON ERROR GOTO".

     Mimochodem u mne to Vaše makro chodí bez chybových hlášek.

Editoval neutr (11. 1. 2016 08:54:14)


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

Offline

#3 11. 1. 2016 09:07:13

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

Re: chyba v makru - VYŘEŠENO

No jo, jenže já nechci vklad nového listu ale kopii aktuálního. Nutně tedy potřebuji CurrentController, kde to zrovna zase už hází chybu (ne při běhu makra, to běží bez chyby, ale při otevření LO). Makro mám nahrané ve složce "Moje makra a dialogová okna" tedy přístupné pro všechny sešity.


LibreOffice 5.4.

Offline

#4 11. 1. 2016 10:45:50

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

Re: chyba v makru - VYŘEŠENO

Neuvedl jste verzi. Zkusil jsem to v LO 5.0.2.... a nic z uvedeného jsem nepozoroval.
(Byly jiné problémy s ladícím prostředím - fungovalo mírně řečeno chaoticky - místo jmen listů to vracelo jména modulů, instalace byla čislá, podívám se na to později.)

Podobné problémy v minulosti obvykle znamenaly nějaký problém v knihovnách - neaktuální, porušení, pozdě se zaváděly... skoro vždy při souběžném běhu více verzí. 

Tj. problémy bych hledal:
Lokální instalace, případně souběh verzí
Chyba instalátoru LO
Chyba LO

Možná by tedy stálo za zvážení odinstalovat a znovu nainstalovat. Možná zkusit jinou verzi, třeba i LO 4...

Offline

#5 11. 1. 2016 11:48:04

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

Re: chyba v makru - VYŘEŠENO

Já jsem myslel, že to postačuje ve formě nového listu, protože makro zkopírovat celý aktuální list napíšete velice snadno a připojíte ho k tomu novému listu. Jde to i nahrát záznamníkem.
     Za tím účelem jsem psal

Podobně lze načíst název aktivního listu a přidělit mu například číslo +1 (inkrementace).

     Pokud znáte název nového listu (protože jste ho definoval dříve) není problém do něj kopii původního listu vložit.
     Když se ale dívám na Vámi postnutý kód tak vlastně nic jiného nežli nový list neřešíte. Takže zaměnit generující makra by mohlo pomoci od popisovaného neduhu.


     Možná byste se měl zamyslet co znamená výraz CurentControler (je to vlastně "ředitel činnosti") ale pokud není aktivní otevřený sešit nemůže být nic zaměřeno. Když to tedy spustíte nad sešitem který nemá aktivní list (v každém listu je někde kurzor) tak musí plivnout chybu.
     Domnívám se, že makro musíte spouštět z aktivního listu - pak voláte knihovnu "Moje Standard" a ta by měla obsahovat makro (funkci) deklarované jako veřejné. Volat makrem z knihovny neurčitý sešit je blbost že? Takže makro v nadřazené knihovně musí být asi PUBLIC, nebo GLOBAL - nevím jistě, ale přijdete na to. Podobně jsou deklarována makra v Makrech LibreOffice a ta se provozují nad okny.


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

Offline

#6 11. 1. 2016 11:57:10

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

Re: chyba v makru - VYŘEŠENO

Jo a ještě něco mne napadlo.
     Kdysi jsem se potýkal s podobnou hláškou. Hlásila chybu makra které bylo původně v moje makra Standard. Tak jsem makro smazal, ale hláška mi vyskakovala stále a nepomohla ani oprava, ani přeinstalování.
     Pomohlo až smazání složky v Document and settings. Je to možná totéž. Vyzkoušejte opsat celé chybové hlášení.


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

Offline

#7 21. 1. 2016 14:15:49

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

Re: chyba v makru - VYŘEŠENO

Přeji hezký den, chybu jsem odstranil tím že jsem přestal deklarovat proměnou control, ale příkaz doc.getCurrentController.getActiveSheet nebo setActiveSheet jsem prostě použil celý kde bylo potřeba. Proč mu to proměná vadila nevím, ale už to konečně šlape. Resp. při startu LO to už neháže chybu. Asi ty makra čte nějaký opravovač při startu systému trochu jinak než při běhu makra.

Sub kopiruj_aktualni_list_vedle

dim doc as object, list as object
dim nazev as string, jmeno as string
dim pocet as integer, poradi as integer

doc = thisComponent

on error goto konec

nazev = doc.getCurrentController.getActiveSheet.Name
pocet = doc.Sheets.getCount
for i = 0 to pocet - 1
	if doc.Sheets.getByIndex(i).Name = nazev then
		poradi = i
	end if
next i

zadanijmena:

jmeno = InputBox("Zadej jméno nového listu" & chr(13) & "Při zanechání přednastavené hodnoty vytvoří nový list s příslušným indexem", "Kopírování aktuálního listu na vedlejší pozici", nazev)

if jmeno = nazev Then
	goto vytvorlist
endif

If doc.Sheets.hasByName( jmeno ) Then
   zadani = Msgbox("Jméno: " & jmeno & " již existuje! Chceš to ještě zkoušet?" & chr(13) & "  Přerušit = ukončení"  & chr(13) & "  Znovu = nové zadání"  & chr(13) & "  Ignorovat = nový list se pojmenuje po starém s indexem", 2 , "Takhle to nepůjde")
   select case zadani
    case 3
    	exit sub
    case 4
    	goto zadanijmena
    case 5 
   	   goto vytvorlist
   end select
end if

vytvorlist:

doc.Sheets.CopyByName(nazev, jmeno ,poradi + 1)

konec:

list = doc.Sheets.getByIndex(poradi + 1)
doc.getCurrentController.setActiveSheet(list)

End Sub

LibreOffice 5.4.

Offline

Zápatí