Kopírování dat

programovani.png Často budete chtít kopírovat data nebo oblasti buněk s formátováním i bez něj. V tomto díle si ukážeme několik postupů, díky kterým můžete dosáhnout kýženého výsledku. Protože z minulých dílů již umíte kopírovat buňky, řádky a sloupce i celé listy, budeme se věnovat pouze kopírování buněk, zejména jejich obsahu.  

Kopírovat můžete více způsoby. První, který si ukážeme, je kopírování pomocí schránky, stejně jako při standardním kopírování v dokumentu.

Kopírování včetně formátu

Pro kopírování včetně formátů můžete použít postupy pro kopírování listů, řádků/sloupců a buněk. Posledním způsobem, jak kopírovat, je využít možností schránky. Schránka funguje na principu načtení obsahu a formátu a jejich vložení na určené místo.

Kopírování pomocí schránky

Zkuste si pomocí Záznamníku maker nahrát makro, při kterém zkopírujete data a vložíte je jinam. Takové makro může vypadat takto:

sub kopirovani
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "A1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "C1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
end sub

Všimněte si řádků s metodami Copy a Paste. První z nich vezme data z definované oblasti (zde z buňky A1) a zkopíruje je do schránky. Druhý naopak vloží obsah schránky, kam je mu programem určeno (C1).

Takto nahrané makro zkopíruje buňku tak, jak je, s veškerým formátováním. I zde můžete použít volbu Vložit jinak. Zrušte označení Vše a vynechte například objekty. Makro se změní:

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

Vidíte, že metoda Paste je zde vynechána a nahrazena metodou InsertContents. Zatímco Paste nevyžaduje žádné další specifikace (vkládá vše), při InsertContents už musíte specifikovat, co a jak požadujete vložit.

args3(0).Name = "Flags"
args3(0).Value = "SVDFNT"

Tento první příkaz je pro vás zřejmě nejdůležitější. Určuje, jaký druh hodnot máte vkládat.

S – String – vložit text

V – Value – vložit číslo

D – Date and Time – vložit datum a čas

F – Formula – vložit vzorce

N – Anotation – vložit poznámky

T – Attribution – vložit formáty

Poznámky a formáty nejsou označeny prvním písmenem, protože obě začínají na A a také proto, že písmeno A označuje All – tedy vložit vše. Další možnosti volby Vložit jinak většinou nevyužijete a v makru je můžete s klidem vynechat:

dim args3(O) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Flags"
args3(0).Value = "SVDFNT"
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args3())

Pokud ale zasahujete do počtu argumentů, nezapomeňte také změnit počet argumentů v jeho definici (dim args3(0) – původně args(5)). Pro kopírování dat je tento způsob dostačující, jen doporučuji nahradit definici zdrojových a cílových buněk ze záznamníku na klasické zadání adresy tak, jak je již znáte z dílu o buňkách.

Kopírování tímto způsobem můžete použít jak na jednotlivé buňky, tak na rozsahy buněk. Není možné ale takto kopírovat nesouvislé oblasti. K tomu je nutné využít jiný způsob.

V udání cíle je také možné použít adresu pouze jedné buňky i přesto, že zkopírovaná oblast byla větší. Program využije tuto buňku jako první buňku oblasti, do které se má obsah schránky vložit.

Metoda getTransferable() a insertTransferable()

Rychlejší metodou pro kopírování obsahu buněk je metoda getTransferable() a insertTransferable(). Tato metoda také způsobí kopírování obdobným způsobem jako prostřednictvím schránky. Nemůžete ale využít výhod voleb Vložit jinak.

Doc = thisComponent
zkopiruj = doc.Sheets(0).getCellRangeByName("A1:C3")
doc.CurrentController.select(zkopiruj)
obsah = doc.CurrentController.getTransferable()
vloz = doc.Sheets(0).getCellRangeByName("F1")
doc.CurrentController.select(vloz)
doc.CurrentController.insertTransferable(obsah)

Makro nejprve vybere oblast, kterou označí (doc.CurrentController.select(zkopiruj)) a zkopíruje ji do schránky (doc.CurrentController.getTransferable()) v proměnné obsah.

Následně vyberete buňku, do které má být vložen počátek zkopírovaných dat (může jít i o jiný sešit), buňku označíte a vložíte data (doc.CurrentController.insertTransferable(obsah)).

TIP: Tato metoda je rychlejší a nezatěžuje tolik systém jako kopírování prostřednictvím uno:Copy, uno:Paste a uno:InsertContents. Pokud makrem kopírujete často, využijte radši této metody.

Kopírování pouze obsahu buněk

Pokud chcete kopírovat pouze obsah buněk bez formátů (stejně jako Vložit jinak), nemusíte využívat schránku, ale stačí předávat hodnoty načtením do proměnných s následným adresováním jinam. Princip je shodný, ale provedení je rychlejší (není využívána schránka) a kopírování probíhá na „pozadí“ dokumentu. Není tedy vidět, jak a co se kopíruje. Formát můžete ovlivnit pouze částečně, a to druhem zobrazení proměnné (text, čísla, vzorce...).

Kopírování předáním proměnné

Pro kopírování stačí pouze načíst hodnotu buňky do proměnné (bunka1) a její vložení do jiné proměnné (bunka2)

bunka1 = thisComponent.sheets(0).getCellByPosition(0,0).value
bunka2 = thisComponent.sheets(0).getCellByPosition(1,0)
bunka2.value = bunka1

Takto jednoduše si předáte hodnotu buňky A1 do buňky B1. Měnit můžete i typ hodnoty (string – text, formula – vzorec...).

Metoda getDataArray a setDataArray

Nastane také situace, kdy budete potřebovat kopírovat data z více než jedné buňky. Podmínka této metody je, že oblast buněk musí být souvislá.

oblast_zdroj = list.getCellRangeByName("A1:C5").getDataArray ' načteme data
list.getCellRangeByName("A10:C15").setDataArray(oblast_zdroj) ' vložíme data

Tímto způsobem jste zkopírovali data z A1:C5 do A10:C15. Formátování cílové oblasti zůstane nezměněno, kopíruje se pouze obsah buněk.

UPOZORNĚNÍ: zdrojová i cílová oblast musí mít shodnou velikost, jinak makro skončí chybou. V příštím díle se začneme zabývat formátováním buněk.

(Jako ve škole) Průměr: 1.50 | Hodnotilo: 8
 

Komentáře

user avatar Roman Striš
Odpovědět
Kopírování dat
15. 10. 2013, 11:48:10
Pokouším se vytvořit makro, přestože je vůbec neovládám. Mám dotaz: Lze k těmto funkcím přidat další, která porovná kopírovanou část a v případě že nalezne shodu, kopírování přeskočí?

Jde o to, že mám tabulku, do které dopisuji stav výroby. Jednou týdně si vyexportuji novou tabulku a musím složitě vyhledávat, které zakázky přibyly a ty ručně kopírovat po řádcích. V původním dokumentu, i v novém, jsou všechny zakázky, ale kdybych použil tu novou verzi, nebudou v ní ony poznámky dopsané průběžně.

Takže hledám něco, co otevře dokument 1 a dokument 2, načte řádek jedna z dokumentu 2 a vyhledá dle jednoho pole, zda tento řádek již v dokumentu 1 figuruje. Jestliže ano, pokračuje řádkem 2. Jestliže nefiguruje, celý jej nakopíruje a vloží do dokumentu 1.
user avatar Daniel Sedláček
Odpovědět
Re:Kopírování dat
16. 10. 2013, 19:59:52
S makrem Vám pomůžeme na fóru, požadovaná funkce nebude až tak složitá, bude se tam řešit zejména rychlost provádění té kontroly.
Do fóra napište podrobněji jak konkrétně se mají hodnoty kontrolovat - to pole je například číslo zakázky? apod....
Určitě tam napište i kód který případně již máte napsaný.


;o)

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Daniel Sedláček

Daniel Sedláček

Amatérsky se věnuji programování maker od podzimu 2010.
Aktivní jsem na fóru od ledna 2011.
Od července 2011 spolupracuji i jako moderátor fóra.

Využívám pouze OpenOffice.org (LibreOffice nemám nainstalován).

 
 
 
woo jaw demo hz