Stránky dotazů a odpovědí české a slovenské komunity uživatelů kancelářského balíku LibreOffice (více informací)

Zeptejte se
0

makro copy paste v calcu

otázka položena 2018-10-12 13:34:32 +0200

gravatar pro MilanUhrak

Zdravíčko, narazil jsem na podivný problém.

Před léty jsem psal pro kolegyni makro na automatické načtení dvou sešitů ( každý z jiného souboru ) do jednoho sešitu .. a pak nějaké operace s tím. Pracovala na stařičkém PC s XP. Teď má novou mašinku, a makro nefunguje. Dlouhým bádáním jsem zjistil, že volání uno:paste tiše selže.

Procházel jsem web, hledal na googlu, žádné řešení jsem nenašel. Máte někdo s tím zkušenost? Jak to znovu rozchodit ?

Makro má tuto funkci, která v kroku paste nedělá nic ( jak jsem zjistil - poslední verze,. kde ještě funguje je LOO 5.2.0 ) :

sub import_first_sheet(byref oSrcBook, byref oTarBook, byref oSheet)
  dim Dummy()
  oTarBook.getCurrentController.Select(osheet)
  oSrcBook.getCurrentController.select(oSrcBook.Sheets.getByIndex(0))
  dispatchURL(oSrcBook,".uno:SelectAll")
  dispatchURL(oSrcBook,".uno:Copy")
  oTargetCell = oSheet.getCellByPosition(0,0)
  oTarBook.getCurrentController.Select(TargetCell)
  dispatchURL(oTarBook,".uno:Paste")
  oSrcBook.Close(True)  
end sub

tuto funkci jsem obšlehl někde na netu kdysi dávno, byla součástí makra kopírujícího celý list do jiného sešitu, nevím jak funguje ale tehdy to fungovalo

Sub dispatchURL(document, aURL)
  Dim noProps()
  Dim URL as new com.sun.star.util.URL
  frame = document.getCurrentController().getFrame()
  URL.Complete = aURL
  transf = createUnoService("com.sun.star.util.URLTransformer")
  transf.parseStrict(URL)
  disp = frame.queryDispatch(URL, "", com.sun.star.frame.FrameSearchFlag.SELF OR com.sun.star.frame.FrameSearchFlag.CHILDREN)
  disp.dispatch(URL, noProps())
End Sub

Díky za každé popostrčení. Milan

editovat změnit štítky označit porušení pravidel uzavřít spojit smazat

Komentáře

Připravte prosím jednoduchý soubor, kde se to dá otestovat a vložte jej zde. V případě, že se jedná o regresi by mělo být poměrně snadné zjistit, který commit to způsobil (https://wiki.documentfoundation.org/Q...)

gravatar pro raalraal ( 2018-10-12 15:48:45 +0200 )editovat
0

otázka zodpovězena 2018-10-17 16:28:31 +0200

gravatar pro raal

Dobrý den, změna chování LO nastala po commitu https://cgit.freedesktop.org/libreoff...

author Eike Rathke erack@redhat.com 2016-07-28 18:51:01 +0200 committer Eike Rathke erack@redhat.com 2016-07-28 19:04:08 +0200 commit 984b0d1599ff1672cb0d28019bd652d58d6bdefa (patch) tree 2ecbcf72013f22886d3e85a9d92e13d003492b0e parent 4e85daeb78e9d9f290e49518b11efc2285f86713 (diff) Resolves: tdf#60021 disallow Paste when entire sheet is selected ... which exhausts memory unless you have 100GB or more of free RAM.

který opravoval bug https://bugs.documentfoundation.org/s... a v případě vybrání všech buněk je vložení zakázáno, aby se předešlo případnému vyčerpání paměti a pádu aplikace. Bude potřeba upravit makro - na řádku 226 nahradit výběr všech buněk výběrem oblasti buněk s daty.

editovat označit porušení pravidel smazat odkaz další

Komentáře

děkuji, skvělá zpráva ... mohl ten bug opravit kontrolou potřebné paměti a chybovou hláškou, no ale co už.

gravatar pro MilanUhrakMilanUhrak ( 2018-10-18 09:45:18 +0200 )editovat
0

otázka zodpovězena 2018-10-15 10:45:23 +0200

gravatar pro MilanUhrak

updated 2018-10-18 14:01:14 +0200

V mém případě porovnávám 2 soubory xls (importem do sešitu calcu ) proto přidám do komentáře 3 soubory( pracovní + 2 datové ). musí být ve stejné složce. Makro funguje max do verze 5.2.0 LibreOffice (zkoušel jsem jen české verze na českých Win7 (32 i 64) ). Fungovalo i na Linuxu, ale na tom mám nyní problém stahovat staré verze do nového systému. Na linuxu toto makro již také nefunguje.

C:\fakepath\porovnani_seznamu_orig.ods

C:\fakepath\příjem 13921.xls

C:\fakepath\výdej 13921.xls

To makrování je vytvořeno dost narychlo, takže trošku bordel, snad vám to ale pomůže nahlásit chybu správně.

Mimochodem, zkoušel jsem makro přepsat ( ten import ) do klasického executeDispatch .. ale chová se to stejně.

Po skončení běhu makra, kdy se objeví 2 prázdné listy je ve schránce obsah druhého dokumentu, stačí ctrl+v a druhý list se objeví v prázdném listu ( před spuštěním makra jsem do schránky vložil nějaký náhodný řetězec )

Přiložený soubor opraven na správný

Díky za pomoc Milan

Ještě doplním opravu problematické funkce : ( vyhnutí se selectAll )

sub import_first_sheet(byref oSrcBook, byref oTarBook, byref oTarSheet)
DIM Dummy()
DIM args1(0) as new com.sun.star.beans.PropertyValue
dim dispatcher as object
dim oSrcSheet, oSrcCtrl, oTarCtrl as Object

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

oSrcCtrl = oSrcBook.getCurrentController
oTarCtrl = oTarBook.getCurrentController

oSrcSheet = oSrcBook.Sheets.getByIndex(0)

oSrcCtrl.select(oSrcSheet)
oTarCtrl.select(oTarsheet)

numRows = get_num_rows( oSrcSheet )

args1(0).Name = "ToPoint"
args1(0).Value = "A1:K"+numRows
dispatcher.executeDispatch(oSrcCtrl.Frame, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(oSrcCtrl.Frame, ".uno:Copy", "", 0, array())
args1(0).Name = "ToPoint"
args1(0).Value = "A1"
dispatcher.executeDispatch(oTarCtrl.Frame, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(oTarCtrl.Frame, ".uno:Paste", "", 0, array())
end sub
editovat označit porušení pravidel smazat odkaz další

Komentáře

Ten první soubor se špatně vložil: C:\fakepath\porovnani_seznamu_orig.ods -> stáhne se mi xls soubor. Vložte soubor znovu.

gravatar pro raalraal ( 2018-10-16 11:53:42 +0200 )editovat
Přihlásit/Zaregistrovat se pro zadání odpovědi
Pokud odpověď řeší váš dotaz, označte ji jako správnou (ikona zaškrtnutí nalevo), odpovědnu tím značně zpřehledníte.

Nástroje pro otázky

2 sledující

Statistika

Otázka položena: 2018-10-12 13:34:32 +0200

Přečtena: 54 krát

Naposledy aktualizována: Oct 18 '18