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

#1 14. 2. 2018 09:51:45

LukeSVK
Člen
Registrace: 14. 2. 2018
Příspěvků: 4

Save and exit macro [Vyriešené]

Ahojte,

Chcel by som do svojho Open Office calc spreadsheetu spravit makro, ktore by sa spustilo po stlaceni tlacitka.
Po makre chcem aby ukladalo spreadsheet do definovaneho priecnika (napr.: C:\Users\Username\Desktop) a aby nazov suboru, bol cerpany z bunky (P2), ktora sa nachadza v dokumente v sheete2 a ktora sa dynamicky meni na zakldane nejakeho inputu v sheete1. Cize vzdy po stalceni tlacitka by ju ulozilo do pricenika pod inym nazvom. Nasiel som celkom schopnu prirucku: http://www.pitonyak.org/oo.php ,ktora sa s casti venuje aj tomuto problemu, ale som zaciatocnik a potreboval by som poradit ako pospajat prikazy do jedneho makra tak aby to robilo co potrebujem.

Toto je kod z prirucky:

Dim args(0) As New com.sun.star.beans.PropertyValue
Dim sUrl As String
sUrl = "file:///c:/My%20Documents/test_file.sxw"
args(0).Name = "Overwrite"  'This property is defined in Table 107
args(0).Value = False       'Do not overwrite an existing document.
ThisComponent.storeAsURL(sUrl, args())

v riadku sUrl je definovana cesta, ale aj s nazvom suboru. Ja by som potreboval aby nazov suboru bol cerpany z bunky ako som spominal vyssie.

Zaroven by som chcel aby sa po stalceni tlacitka v sheete1, dialogove okno spytalo ci chcem naozaj ulozit a zavriet spreadsheet s moznostami (yes) a (no).

Budem velmi vdacny za akukolvek pomoc.

Editoval LukeSVK (16. 2. 2018 13:50:47)

Offline

#2 14. 2. 2018 15:52:18

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

Re: Save and exit macro [Vyriešené]

LukeSVK napsal(a)

Ahojte,

Chcel by som do svojho Open Office calc spreadsheetu spravit makro, ktore by sa spustilo po stlaceni tlacitka.
Po makre chcem aby ukladalo spreadsheet do definovaneho priecnika (napr.: C:\Users\Username\Desktop) a aby nazov suboru, bol cerpany z bunky (P2), ktora sa nachadza v dokumente v sheete2 a ktora sa dynamicky meni na zakldane nejakeho inputu v sheete1. Cize vzdy po stalceni tlacitka by ju ulozilo do pricenika pod inym nazvom. Nasiel som celkom schopnu prirucku: http://www.pitonyak.org...Toto je kod z prirucky:


Dim args(0) As New com.sun.star.beans.PropertyValue
Dim sUrl As String
sUrl = "file:///c:/My%20Documents/test_file.sxw"
args(0).Name = "Overwrite"  'This property is defined in Table 107
args(0).Value = False       'Do not overwrite an existing document.
ThisComponent.storeAsURL(sUrl, args())


v riadku sUrl je definovana cesta, ale aj s nazvom suboru. Ja by som potreboval aby nazov suboru bol cerpany z bunky ako som spominal vyssie.


Zaroven by som chcel aby sa po stalceni tlacitka v sheete1, dialogove okno spytalo ci chcem naozaj ulozit a zavriet spreadsheet s moznostami (yes) a (no).

Budem velmi vdacny za akukolvek pomoc.

     To bude hodně stará verze příručky. Koncovky .sxw se používaly myslím jen v první verzi OOo - v době kdy vyšla první verze po StarOffice předloze. Nicméně v AOO (Apache Open Office) by to mělo chodit ještě dnes bez problémů. Horší by to bylo as v LO (Libre Office), ale vím že i když už neměly být tyto staré formáty podporovány - fungovaly nevím jak dnes. Postavil jsem v Libre office to co potřebujete, ale Overwrite tam nefunguje. Jsou tam 2 podobná makra.
     Jedno je postaveno na True a druhé na false. Výsledky jsou u obou stejné. Zůstáváte po uložení v novém sešitě. To Vás nesmí překvapit. Stačí to ale k opakovanému ukládání. Jen po tom posledním musíte sešit vypnout. Následně znovu otevřít ten původní.


     Makra plní různým způsobem totéž a ještě nejsou použity zdaleka všechny možnosti ukázka . Pozor funkce Overwrite nefunguje jak má - ale možná Vám to bude stačit takto.


PS já jsem neuvedl, že při stisknutí tlačítka "HopDoKódu" se někdy otevře ihned okno Basicu, ale většinou se otevře jen na liště. Pak stačí toto okno "zvednout". Podívejte se dobře kde je to napsané. Jde o knihovnu Standard ve vlastním sešitě. Existuje ještě podobná nad celým systémem - Moje makra Standard.
     Přepište si to do těch sešitů jak potřebujete. Můžete pomocí názvu buňky, nebo podle č. sloupce, řádku, - počítá se od nuly. Sešity také tak - index nebo jménem.

Editoval neutr (14. 2. 2018 16:25:43)


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 15. 2. 2018 13:33:50

LukeSVK
Člen
Registrace: 14. 2. 2018
Příspěvků: 4

Re: Save and exit macro [Vyriešené]

neutr napsal(a)
LukeSVK napsal(a)

Ahojte,

Chcel by som do svojho Open Office calc spreadsheetu spravit makro, ktore by sa spustilo po stlaceni tlacitka.
Po makre chcem aby ukladalo spreadsheet do definovaneho priecnika (napr.: C:\Users\Username\Desktop) a aby nazov suboru, bol cerpany z bunky (P2), ktora sa nachadza v dokumente v sheete2 a ktora sa dynamicky meni na zakldane nejakeho inputu v sheete1. Cize vzdy po stalceni tlacitka by ju ulozilo do pricenika pod inym nazvom. Nasiel som celkom schopnu prirucku: http://www.pitonyak.org...Toto je kod z prirucky:


Dim args(0) As New com.sun.star.beans.PropertyValue
Dim sUrl As String
sUrl = "file:///c:/My%20Documents/test_file.sxw"
args(0).Name = "Overwrite"  'This property is defined in Table 107
args(0).Value = False       'Do not overwrite an existing document.
ThisComponent.storeAsURL(sUrl, args())


v riadku sUrl je definovana cesta, ale aj s nazvom suboru. Ja by som potreboval aby nazov suboru bol cerpany z bunky ako som spominal vyssie.


Zaroven by som chcel aby sa po stalceni tlacitka v sheete1, dialogove okno spytalo ci chcem naozaj ulozit a zavriet spreadsheet s moznostami (yes) a (no).

Budem velmi vdacny za akukolvek pomoc.

     To bude hodně stará verze příručky. Koncovky .sxw se používaly myslím jen v první verzi OOo - v době kdy vyšla první verze po StarOffice předloze. Nicméně v AOO (Apache Open Office) by to mělo chodit ještě dnes bez problémů. Horší by to bylo as v LO (Libre Office), ale vím že i když už neměly být tyto staré formáty podporovány - fungovaly nevím jak dnes. Postavil jsem v Libre office to co potřebujete, ale Overwrite tam nefunguje. Jsou tam 2 podobná makra.
     Jedno je postaveno na True a druhé na false. Výsledky jsou u obou stejné. Zůstáváte po uložení v novém sešitě. To Vás nesmí překvapit. Stačí to ale k opakovanému ukládání. Jen po tom posledním musíte sešit vypnout. Následně znovu otevřít ten původní.


     Makra plní různým způsobem totéž a ještě nejsou použity zdaleka všechny možnosti ukázka . Pozor funkce Overwrite nefunguje jak má - ale možná Vám to bude stačit takto.


PS já jsem neuvedl, že při stisknutí tlačítka "HopDoKódu" se někdy otevře ihned okno Basicu, ale většinou se otevře jen na liště. Pak stačí toto okno "zvednout". Podívejte se dobře kde je to napsané. Jde o knihovnu Standard ve vlastním sešitě. Existuje ještě podobná nad celým systémem - Moje makra Standard.
     Přepište si to do těch sešitů jak potřebujete. Můžete pomocí názvu buňky, nebo podle č. sloupce, řádku, - počítá se od nuly. Sešity také tak - index nebo jménem.


Super!!! Klobuk dole, velmi pekne dakujem za pomoc smile V podstate to funguje presne ako som chcel, len by som sa chcel spytat este na jeden detail. Mozno je to zalezitost len jedneho riadku. Chcel by som aby sa po stlaceni tlacitka, a po odkliknuti (Ano naozaj ulozit), cely dokument vypol. Bolo by zlozite nieco take do toho implementovat?

Offline

#4 15. 2. 2018 13:59:58

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

Re: Save and exit macro [Vyriešené]

Ne nebylo. Stačí připsat na konec - před End Sub

MsgBox("Hotovo uloženo jako " & sVar,0,"ULOŽENO")
Doc.Close(True) 'nebo také ThisComponent.Close() - True se rozumí samo sebou, ale je možné
' tuto proměnnou měnit na False dokud nebudeme chtít skončit až po nějaké události. 
End Sub

 'Příklad proměnné
'Dim iVar as integer
'Dim lVar as boolean
'IF iVar > 5 Then 
'lVar = True
'Else
'lVar = False
'End If
'......
'Doc.Close(lVar)

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

#5 15. 2. 2018 16:38:52

LukeSVK
Člen
Registrace: 14. 2. 2018
Příspěvků: 4

Re: Save and exit macro [Vyriešené]

neutr napsal(a)

Ne nebylo. Stačí připsat na konec - před End Sub

MsgBox("Hotovo uloženo jako " & sVar,0,"ULOŽENO")
Doc.Close(True) 'nebo také ThisComponent.Close() - True se rozumí samo sebou, ale je možné
' tuto proměnnou měnit na False dokud nebudeme chtít skončit až po nějaké události. 
End Sub

 'Příklad proměnné
'Dim iVar as integer
'Dim lVar as boolean
'IF iVar > 5 Then 
'lVar = True
'Else
'lVar = False
'End If
'......
'Doc.Close(lVar)

Super, funguje, este som si ale uvedomil jednu vec. Ze sa neuklada zdrojova tabulka. Viem ze StoreToURL je v podstate cisto len Save ze? Viem to zakomponovat do toho kodu tak aby sa ulozila aj zdrojova tabulka, ktora by mala nemenny nazov suboru?

EDIT: kedze ten overwrite nefunguje, mozem ho teda vymazat z toho kodu, bez toho aby stratil funkcnost?

Sub SaveAs
	Dim Doc As Object
	Dim Sheet As Object
	Dim Cell As Object
	Dim sVar as string
	Dim iVar as integer
 		Doc = ThisComponent
 		Sheet = Doc. Sheets (0) ' 1. list v sešitě (lze deklarovat jménem
 		Cell = Sheet. getCellRangeByName("R2") 'Lze deklarovat číslem Sloupec, řádek
		sVar = Cell.string
'--------------------------upravený kód od Pythoniaka deklarace
	Dim args(0) As New com.sun.star.beans.PropertyValue
	Dim sUrl As String
		sUrl = ConvertToUrl(sVar)
		args(0).Name = "Overwrite"  'This property is defined in Table 107
		args(0).Value = True       'Do not overwrite an existing document.
'--------------------------Vsuvka pro tlačítko s dotazem
		iVar = MsgBox("Naozaj chcete pokladničnú knihu vypnúť?",4,"Uložiť a zavrieť")
	If iVar = 7 Then
	Exit Sub
	Else
	ThisComponent.storeAsURL(sUrl, args())

<<< staci vlozit sem ThisComponent.storeToURL (args())   ???>>>

	End IF
Doc.Close(True)
End Sub

Editoval LukeSVK (15. 2. 2018 17:10:17)

Offline

#6 16. 2. 2018 08:17:15

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

Re: Save and exit macro [Vyriešené]

Já Vám rozumím. Zdrojový sešit se musí uložit na začátku této rutiny.

Sub SaveAs
	Dim Doc As Object
	Dim Sheet As Object
	Dim Cell As Object
	Dim sVar as string
	Dim iVar as integer
 		Doc = ThisComponent
                ThisComponent.store()  ' Uložit už můžete tady nebo kdekoliv před storeAsURL
 		Sheet = Doc. Sheets (0) ' 1. list v sešitě (lze deklarovat jménem
 		Cell = Sheet. getCellRangeByName("R2") 'Lze deklarovat číslem Sloupec, řádek
		sVar = Cell.string
'--------------------------upravený kód od Pythoniaka deklarace
	Dim args(0) As New com.sun.star.beans.PropertyValue
	Dim sUrl As String
		sUrl = ConvertToUrl(sVar)
		args(0).Name = "Overwrite"  'This property is defined in Table 107
		args(0).Value = True       'Do not overwrite an existing document.
'--------------------------Vsuvka pro tlačítko s dotazem
		iVar = MsgBox("Naozaj chcete pokladničnú knihu vypnúť?",4,"Uložiť a zavrieť")
	If iVar = 7 Then
	Exit Sub
	Else
        ThisComponent.store() 'až sem - tady můžete ještě uložit původní dokument
	ThisComponent.storeAsURL(sUrl, args()) 'Tady už dostane dokument jiné jméno a polohu
	End IF
Doc.Close(True)
End Sub

     Je to jen jednoduché store bez argumentů - ale musí se někdy ukládat s návratem do původního sešitu. To je maličko složitější. Já nyní nejsem doma a tak to nemohu otestovat. Je to ale nějak takto :

Sub SaveAs
	Dim Doc As Object
	Dim Sheet As Object
	Dim Cell As Object
	Dim sVar, s Val as string
	Dim iVar as integer
 		Doc = ThisComponent
                sVal = Doc.URL
 		Sheet = Doc. Sheets (0) ' 1. list v sešitě (lze deklarovat jménem
 		Cell = Sheet. getCellRangeByName("R2") 'Lze deklarovat číslem Sloupec, řádek
		sVar = Cell.string
'--------------------------upravený kód od Pythoniaka deklarace
	Dim args(0) As New com.sun.star.beans.PropertyValue
	Dim sUrl As String
		sUrl = ConvertToUrl(sVar)
		args(0).Name = "Overwrite"  'This property is defined in Table 107
		args(0).Value = True       'Do not overwrite an existing document.
'--------------------------Vsuvka pro tlačítko s dotazem
		iVar = MsgBox("Naozaj chcete pokladničnú knihu vypnúť?",4,"Uložiť a zavrieť")
	If iVar = 7 Then
	Exit Sub
	Else
	ThisComponent.storeAsURL(sURL, args())
'-------------------------
	ThisComponent.storeAsURL(sVal, args()) 'Tady se to uloží zpět pod původním jménem
	End IF
Doc.Close(True) 'Když tohle vynecháte budete stále v původním dokumentu
End Sub 

     Jde o to, že uživatel je pak zmatený. Takže když to uložíte do původního místa, můžete vynechat Doc.Close a jste pořád jakoby v tom původně otevřeném sešitě. Ale tohle dělám z paměti - bez testu takže nevím jestli tam není něco špatně.


     Argumenty se dají vynechat, ale kvůli čitelnosti kódu by se mělo místo deklarace "args, arg a podobně" použít slovo Dumy - to se musí deklarovat jako array tedy Dim Dumy(). To se pak dosadí místo args. Když půjde někdo do kódu po Vás tak bude zběsile hledat kde jsou "args" deklarované. Takhle zběhlejší programátor ví že nic hledat nemá.

Editoval neutr (16. 2. 2018 08:28:00)


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 16. 2. 2018 13:49:30

LukeSVK
Člen
Registrace: 14. 2. 2018
Příspěvků: 4

Re: Save and exit macro [Vyriešené]

neutr napsal(a)

Já Vám rozumím. Zdrojový sešit se musí uložit na začátku této rutiny.

Sub SaveAs
	Dim Doc As Object
	Dim Sheet As Object
	Dim Cell As Object
	Dim sVar as string
	Dim iVar as integer
 		Doc = ThisComponent
                ThisComponent.store()  ' Uložit už můžete tady nebo kdekoliv před storeAsURL
 		Sheet = Doc. Sheets (0) ' 1. list v sešitě (lze deklarovat jménem
 		Cell = Sheet. getCellRangeByName("R2") 'Lze deklarovat číslem Sloupec, řádek
		sVar = Cell.string
'--------------------------upravený kód od Pythoniaka deklarace
	Dim args(0) As New com.sun.star.beans.PropertyValue
	Dim sUrl As String
		sUrl = ConvertToUrl(sVar)
		args(0).Name = "Overwrite"  'This property is defined in Table 107
		args(0).Value = True       'Do not overwrite an existing document.
'--------------------------Vsuvka pro tlačítko s dotazem
		iVar = MsgBox("Naozaj chcete pokladničnú knihu vypnúť?",4,"Uložiť a zavrieť")
	If iVar = 7 Then
	Exit Sub
	Else
        ThisComponent.store() 'až sem - tady můžete ještě uložit původní dokument
	ThisComponent.storeAsURL(sUrl, args()) 'Tady už dostane dokument jiné jméno a polohu
	End IF
Doc.Close(True)
End Sub

     Je to jen jednoduché store bez argumentů - ale musí se někdy ukládat s návratem do původního sešitu. To je maličko složitější. Já nyní nejsem doma a tak to nemohu otestovat. Je to ale nějak takto :

Sub SaveAs
	Dim Doc As Object
	Dim Sheet As Object
	Dim Cell As Object
	Dim sVar, s Val as string
	Dim iVar as integer
 		Doc = ThisComponent
                sVal = Doc.URL
 		Sheet = Doc. Sheets (0) ' 1. list v sešitě (lze deklarovat jménem
 		Cell = Sheet. getCellRangeByName("R2") 'Lze deklarovat číslem Sloupec, řádek
		sVar = Cell.string
'--------------------------upravený kód od Pythoniaka deklarace
	Dim args(0) As New com.sun.star.beans.PropertyValue
	Dim sUrl As String
		sUrl = ConvertToUrl(sVar)
		args(0).Name = "Overwrite"  'This property is defined in Table 107
		args(0).Value = True       'Do not overwrite an existing document.
'--------------------------Vsuvka pro tlačítko s dotazem
		iVar = MsgBox("Naozaj chcete pokladničnú knihu vypnúť?",4,"Uložiť a zavrieť")
	If iVar = 7 Then
	Exit Sub
	Else
	ThisComponent.storeAsURL(sURL, args())
'-------------------------
	ThisComponent.storeAsURL(sVal, args()) 'Tady se to uloží zpět pod původním jménem
	End IF
Doc.Close(True) 'Když tohle vynecháte budete stále v původním dokumentu
End Sub 

     Jde o to, že uživatel je pak zmatený. Takže když to uložíte do původního místa, můžete vynechat Doc.Close a jste pořád jakoby v tom původně otevřeném sešitě. Ale tohle dělám z paměti - bez testu takže nevím jestli tam není něco špatně.


     Argumenty se dají vynechat, ale kvůli čitelnosti kódu by se mělo místo deklarace "args, arg a podobně" použít slovo Dumy - to se musí deklarovat jako array tedy Dim Dumy(). To se pak dosadí místo args. Když půjde někdo do kódu po Vás tak bude zběsile hledat kde jsou "args" deklarované. Takhle zběhlejší programátor ví že nic hledat nemá.

Funguje... Teraz mi dokument ulozi (archivuje) aj do priecinka kam chcem s nazvom ktory cerpa z bunky, a aj do zdrojoveho dokumentu ktoremu meno ostava.

Moc moc dakujem, ste velky borec smile

Offline

#8 17. 2. 2018 11:12:59

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

Re: Save and exit macro [Vyriešené]

Díky jen jsem si uvědomil jeden malý detail. Dumy se píše Dummy - i když je to jedno a asi by to bylo pochopeno správně ale je to chyba byť nepsané konvence. Ve skutečnosti tam může být jakýkoliv parametr jako prázdná array(). Podobně lze zapsat i paramatrickou array i bez argumentů. Například
Dim args(0)
args = array("Overwrite", True)
     Z toho ale nikdo není moudrý protože většinou jde o povinné argumenty a takto to vypadá jako "optional" - tedy volitelné.


Například :
Dim Args(0)
ThisComponent.storeAsURL(sURL, args("Overwrite", True))
    To jenom pro úplnost - ještě jednou děkuji za pochvalu :-)


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

Zápatí