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

#1 26. 8. 2022 08:36:59

barevnej
Člen
Registrace: 6. 8. 2015
Příspěvků: 154

Kopírování a vkládání pomocí makra (VYŘEŠENO)

Zkouším přijít na jednu věc. Kopírovat nějaký výsledek a ten poté vložit jako hodnotu čisla.
COPY.gif
_
Zkoušel jsem zaznamenat makro což nefunguje.

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$E$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$E$2:$E$11"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint"
args4(0).Value = "$A$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())


end sub

_
V praxi by to mělo sloužit ne jen kopírování hodnot ve stejném sešitě ale i napříč jinými sešity. Nechci linkovat na jiné sešity jelikož se pak otevírá i na jiných počítačích a data by se už nenačetla.

Editoval barevnej (27. 8. 2022 15:20:16)

Offline

#2 26. 8. 2022 09:40:36

barevnej
Člen
Registrace: 6. 8. 2015
Příspěvků: 154

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

Tak trochu jsem "studoval" a zdá se že to funguje. Ovšem to neznamená že to mám technicky správně.
_

sub COPY
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$E$2:$E$11"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint"
args4(0).Value = "$A$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(5) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Flags"
args5(0).Value = "V"
args5(1).Name = "FormulaCommand"
args5(1).Value = 0
args5(2).Name = "SkipEmptyCells"
args5(2).Value = false
args5(3).Name = "Transpose"
args5(3).Value = false
args5(4).Name = "AsLink"
args5(4).Value = false
args5(5).Name = "MoveMode"
args5(5).Value = 4
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args5())


end sub

Offline

#3 26. 8. 2022 10:33:14

barevnej
Člen
Registrace: 6. 8. 2015
Příspěvků: 154

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

Teď se snažím kopírovat data z jiného sešitu, ovšem není to tak snadné jak jsem si myslel.

dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "'file:///home/rrr-hlavni/Stažené/test2.ods'#$List1.$E$2:$E$11"

Offline

#4 26. 8. 2022 11:58:01

barevnej
Člen
Registrace: 6. 8. 2015
Příspěvků: 154

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

Tak tady jsem se zasekl, nemohu přijít na to jak se odkázat na jiný sešit.
_

rem ----------------------------------------------------------------------
dim args2(2) as new com.sun.star.beans.PropertyValue
args2(0).Name = "URL"
args2(0).Value = "file:///home/rrr-hlavni/Stažené/test2.ods"
args2(1).Name = "oSheet"
args2(1).Value = "List1"
args2(2).Name = "ToPoint"
args2(2).Value = "$E$2:$E$11"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

_
Toto samozřejmě nefunguje, stále kopíruji z aktuálního sešitu a ne z odkazovaného.

Offline

#5 27. 8. 2022 09:02:17

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

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

Otestujte následující kód :

Sub VlozitZexterniho

'Pouze LibreOffice, pro OpenOffice použití: Copy sheet to document. 
'Vložit všechny listy ze zdrojového dokumentu do cílového dokumentu.
util = createUnoService("org.universolibre.EasyDev")
source = createUnoStruct("org.universolibre.EasyDev.CellRangeAddress")
target = createUnoStruct("org.universolibre.EasyDev.CellRangeAddress")

doc = ThisComponent
source.Doc = doc

new_doc = util.newDoc("")
target.Doc = new_doc

util.sheetInsertFromDoc(source, target, -1, False)
End Sub

     Já jsem to ani nezkoušel, protože používám vlastní postupy. Tohle je ale poměrně snadné, pokud potřebujete tahat z externího sešitu do uno nahrávek. Ještě lepší by to asi bylo jako funkce která plní proměnnou. Tohle je ucelený kód i když vkládá list z volaného sešitu. To stačí pro nahrávku makra záznamníkem.
     Zavoláte vložení listu z externího a potom už je vše jen v rámci stejného (původního) sešitu, kde se dá použít nahrávání a potom list klidně smažte. Pokud je to vždy stejné místo a názvy (tak jak je to u Vás často), Tak na to ani nemusíte sahat a hned zůstane pouze výsledek.


     Doufám, že to nedopadne jako posledně, kdy jste testoval a ani nečetl, co jsem k tomu připsal. PS ... jinak byste na to přišel asi hned a nedivil se proč nemáte žádný obsah (když jste nevybíral úsek) když jste měl kurzor v prázdné buňce a podobně ty proměnné SC, SR, EC, ER u kterých je přiřazení například "SC = .startColumn" a podobně. Ani byste se potom nedivil proč nejdou hodnoty "hezky za sebou".
     Tohle už není přímo okamžitá potřeba specifikovaného problému, ale učení se - práce s makry. Tady už musíte najít sám souvislosti a ne se nejdřív bezhlavě pouštět do testování a pak se divit. Postup musí být opačný zanyslet se co kód reprezentuje a následně testovat zda je to pravda.



PS
     Radeji hned napovím jak makro upravit :
new_doc = util.newDoc("") sem patří do závorek adresa URL.
util.sheetInsertFromDoc(source, target, -1, False) sem místo -1 vložta číslo které zjistíte na libovolném místě v sešitě pomocí =SHEET(A1) kde může být libovolná buňka z listu ve kterém stojíte. List se vloží ma pozici, kterou má právě list ve kterém stojíte (váš list se posune). Pokud tam přidáte číslo o jednu větší, postaví se vložený list za ten ve kterém stojíte.
     Když tam ponecháte -1 bude na první pozici a to se také dobře hodí, ale ne když máte tolik listů, že na první list nevidíte, což by Vám při nahrávání trochu vadilo.


Přeji úspěch

Editoval neutr (27. 8. 2022 09:32:58)


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 27. 8. 2022 13:28:04

barevnej
Člen
Registrace: 6. 8. 2015
Příspěvků: 154

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

Všiml jsem si že jste mě minule nechal ať na to přijdu sám a jsem vlastně za to rád smile
_
Tady se snažím pochopit podstatu věci, opravdu musím kopírovat celý list abych následně z něho mohl zkopírovat data následně list mazat? Myslím že i kdyby se tak stalo tak to nebude fungovat jelikož danný list se vzorci odkazuje na mraky jiných listů které už tam v tu chvíli nebudou.

Offline

#7 27. 8. 2022 15:19:32

barevnej
Člen
Registrace: 6. 8. 2015
Příspěvků: 154

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

Tak jsem se když je víkend do toho ponořil a už to začínám "trošičku" chápat
_

sub Nahrat_z_jine_tabulky
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem -------------Kam budu kopírovat, bez toho by to vložilo tam kde jsem----------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem --------------Do prvního políčka A2 vložím odkaz na první buňku v jiném zavřeném sešitu----------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "='file:///home/rrr-hlavni/Stažené/test2.ods'#$List1.E2"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

rem ---------------Rozkopíruji vzorec na 10 řádků od A2 do A11 --------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "EndCell"
args3(0).Value = "$A$11"

dispatcher.executeDispatch(document, ".uno:AutoFill", "", 0, args3())


rem ---------Musím refrešnout odkazy jinak se bude stále načítat poslední známá hodnota--------
dispatcher.executeDispatch(document, ".uno:UpdateTableLinks", "", 0, Array())


rem ----------------Vše co jsem tam nakopíroval převedu vzorec na hodnotu----
dispatcher.executeDispatch(document, ".uno:ConvertFormulaToValue", "", 0, Array())

MsgBox "Aktualizováno"
end sub

_
Popsal jsem tam i za "rem" co proč dělám. Zvláště pak mi dalo zabrat najít jak pomocí UNO refrešnout odkazy jelikož ono to bere tak nějak z mězipaměti a pokud mu natvrdo nedám že to musí znova načíst tak to načte jak se mu zachce, tím předposledním příkazem jsem si to pojistil smile

Offline

#8 27. 8. 2022 17:34:02

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

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

Ano, to je správné - pochopil jste, že existují odkazy, které se automaticky, nebo manuálně aktualizují. Takže v mnoha případech nic tahat makrem z jiných sešitů nemusíte. Stačí zadat aktualizaci nejspíš ÚPRAVY > odkazy na externí soubory kde se dá nastavit dost věcí kolem odkazů.
     Potom vystačíte s makry v sešitu. I když je to šikovné, tak mnoho odkazů může značně zpomalit zejména načítání dokumentu - ale stojí to za to, pokud nepadá sešit.
     Někdy přece jenom makro budete potřebovat a jde Vám o to naučit se jak to vyřešit. Posílám vzorový příklad makra, které je postavené na UNO příkazech, ale ne vše je v UNO. Volaný sešit je ve StarBasicu i když v UNO odpovídající kód určitě existuje. Já jsem to nikdy nepotřeboval, tak to nemám a hledat na netu se mi nechce.

sub UNO_NactiZexterniho
'Tohle je psaný kód
oDoc = StarDesktop.loadComponentFromUrl("private:factory/scalc","_blank",0,Array())
oDoc.Title = "Můj název"
oSheet = oDoc.sheets.getbyIndex(0)
oSheet.getCellByPosition(1,0).setFormula(ROW() + 4)
oSheet.getCellRangeByPosition(0,0,1,6).FillAuto(com.sun.star.sheet.FillDirection.TO_BOTTOM,1)
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document1   = ThisComponent.CurrentController.Frame
document2   = oDoc.CurrentController.Frame 'TADY SPRÁVNĚ PŘEPSAT z ThisComponent na otevřený sešit - nyní  oDoc
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$B$5"
dispatcher.executeDispatch(document2, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document2, ".uno:Copy", "", 0, Array())
rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$'List1'.$B$278"
dispatcher.executeDispatch(document1, ".uno:GoToCell", "", 0, args3())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document1, ".uno:Paste", "", 0, Array())
end sub

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

#9 27. 8. 2022 17:52:48

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

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

pro import dat používám takovouhle dávku, třeba to pomůže:

Sub ImnportDat
	dim doc as object
	dim oList as object
		
 	doc = thisComponent
	oList = doc.Sheets.getByName("List1")
   	
   	file = PickFile()
   	
	dim secDoc as object, secList as object
   	dim argum(0) as new com.sun.star.beans.PropertyValue   	
   	argum(0).Name = "MacroExecutionMode"
	argum(0).Value = 4

	secDoc = starDeskTop.LoadComponentFromURL(file,,0,argum()) 
	secList = secDoc.Sheets(0)
	
	
	'kopie dat
	sloupec_copy = secList.GetCellRangeByPosition(0, 0, 0, 30).getDataArray
	oList.GetCellRangeByPosition(0, 0, 0, 30).setDataArray(sloupec_copy)
	
		
	'secDoc.store()
	secDoc.close(True) 'volitelně uzavření druhého souboru
	
	msgbox ("Překopírováno",0,"LO info")
		
End Sub

Function PickFile() as string
  Dim FilePicker As Object
  Dim FilePath() As String
  FilePicker=createUnoService("com.sun.star.ui.dialogs.FilePicker")
  FilePicker.execute
  FilePath()=FilePicker.GetFiles
  PickFile = FilePath(0)
End Function

pokud má být soubor otevřen jen skrytě stačí doplnit hodnotu hidden = true:

  dim secDoc as object, secList as object
  dim argum(1) as new com.sun.star.beans.PropertyValue
  argum(0).Name = "Hidden"
  argum(0).Value = True
  argum(1).Name = "MacroExecutionMode"
  argum(1).Value = 4

Editoval ludviktrnka (27. 8. 2022 18:05:18)


LibreOffice 6.2.

Offline

#10 1. 9. 2022 13:33:56

barevnej
Člen
Registrace: 6. 8. 2015
Příspěvků: 154

Re: Kopírování a vkládání pomocí makra (VYŘEŠENO)

Je technicky možné kopírovat data z online google tabulky?

Offline

Zápatí