Makro copy paste v calcu

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

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/QA/Bibisect)

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.

porovnani_seznamu_orig.ods

příjem 13921.xls

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

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

Dobrý den, změna chování LO nastala po commitu libreoffice/core - main, development code repository

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/show_bug.cgi?id=60021 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.

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