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

#1 12. 3. 2013 16:43:04

mmichalcontasrocz
Člen
Registrace: 12. 3. 2013
Příspěvků: 6

Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Dobrý den. Řeším problém jak vložit hodnotu z jedné buňky do kterékoliv buňky ve stejném listu za pomocí makra. Pro tento účel jsem si pomocí záznamníku zaznamenal makro se syntaxí viz. níže, ale bohužel se mi hodnota z buňky K2, kde je vzorec =now() vkládá vždy do buňky A2. Potřebuji, aby to bylo možné do kterékoliv buňky ve stejném listu a ne pouze do A2. Můžete pomoct? Jsem úplný začátečník v Calcu, doteď jsem pracoval pouze s Excelem.

Syntaxe:

REM  *****  BASIC  *****

sub datumcas
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 = "$K$2"

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

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

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

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

rem ----------------------------------------------------------------------
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "D"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4

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

rem ----------------------------------------------------------------------
dim args5(5) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Flags"
args5(0).Value = "SVD"
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())

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

rem ----------------------------------------------------------------------
dim args7(1) as new com.sun.star.beans.PropertyValue
args7(0).Name = "By"
args7(0).Value = 1
args7(1).Name = "Sel"
args7(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args7())

end sub

Editoval mmichalcontasrocz (13. 3. 2013 14:28:17)

Offline

#2 12. 3. 2013 19:08:39

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

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Takhle jste makro nahrál. Cílová asresa je dána tímto :

dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$A$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

Výraz nahraďte za proměnnou kterou nastavíte z inputboxu. Nazvěte ji třeba "adresa". Inputbox postavte na začátek za deklarace.

Pak by to mělo vypadat nějak takto :

dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = adresa
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

Pozn: návod jsem netestoval, když by Vám to nechdilo podívám se na to.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 12. 3. 2013 20:49:37

mmichalcontasrocz
Člen
Registrace: 12. 3. 2013
Příspěvků: 6

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Dobrý den. Bohužel nemám ponětí co je inputbox a jak ho používat ani jak ho postavit na začátek deklarace, natož abych věděl, co znamená deklarace. Můžete mi to, prosím, vysvětli jako opravdovému laikovi? Nebo pokud možno napsat celý kód. S psaním kódu makra nemám opravdu zkušenost. Předem děkuji.

Offline

#4 12. 3. 2013 21:13:49

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

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Tohle by mělo stačit

sub datumcas
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")

dim adresa as string
adresa = InputBox ("Adresa buňky, kterou potřebujeme zadat","Zadej adresu buňky")

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

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

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

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = adresa

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

rem ----------------------------------------------------------------------
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "D"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4

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

rem ----------------------------------------------------------------------
dim args5(5) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Flags"
args5(0).Value = "SVD"
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())

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

rem ----------------------------------------------------------------------
dim args7(1) as new com.sun.star.beans.PropertyValue
args7(0).Name = "By"
args7(0).Value = 1
args7(1).Name = "Sel"
args7(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args7())

end sub

Editoval neutr (12. 3. 2013 21:15:47)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#5 12. 3. 2013 21:51:16

mmichalcontasrocz
Člen
Registrace: 12. 3. 2013
Příspěvků: 6

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Aha, tak už rozumím, co je inputbox. Ještě bych si troufnul požádat, aby vkládání té hodnoty probíhalo pokud možno bez inputboxu pouze spuštěním makra do sloupce A posloupně do dalšího a dalšího řádku, vždy když makro spustím. Např. kliknu do A2, spustím makro a vloží se mi hodnot, v mém případě datum. Stejný proces se zopakuje, pokud kliknu do A3, A4 atd. Děkuji.

Offline

#6 12. 3. 2013 22:43:54

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 803

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Dan Sedláček na tomto vebu píše už dost obsáhlý seriál věnovaný psaní maker.
Základní práce s buňkami

Offline

#7 13. 3. 2013 07:07:13

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

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

To je právě to co píše lp.
1. Určitě rádi poradíme, ale já a také asi nikdo jiný za Vás programovat nebudeme.
2. Když už se něco dělá přes fórum, tak jenom radou, nebo opravou chyby.
3. To co popisujete nyní mi připadá jako zbytečnost. Když to budete vkládat z paměti, tak to vyjde nastejno jako když zavoláte makro.
4. Když by jste potřeboval vkládat něco složitějšího, měla by se udělat buď funkce, která bude nazvána například "moje funkce" a pak se volá přímo z buňky kde se má pracovat - například =Mojefunkce(parametr), nebo bez parametru.  Podobně makro, ale spouštět například tlačítkem buď pomocí inputboxu, nebo na pozici kurzoru. Je také možné místo tlačítka přiřadit klávesovou zkratku a volat makro stisknutím kombinace kláves.


Variant je asi ještě více. Takže doporučuji více študovat a zkoušet. Pak také budete umět odhadnout, jestli problém raději řešit přímo vzorcem, nebo sérií manuálních úkonů, a nebo vynaložit práci a psát makro, či funkci.


Jo když něco naprogramujete a nebude to chodit jak má - ptejte se. Jakmile chcete něco udělat z gruntu, a ujal bych se toho,tak se nejprve ptám, k jakému účelu - a nyní mi ten Váš účel připadá nesmyslný.
Tedy spíš mi to připadá jako pohodlnost. Podle mne jste zjistil, že volání makra je stejně, ne - li víc náročné, než vykopírovat ručně. Je - li tomu tak, udělejte si tlačítko a makro k němu přiřeďte. Nebo si vytvořte klávesovou zkratku a tou makro spouštějte. Tyhle postupy popisuje Dan Sedláček a dá se to pochopit i z nápovědy.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#8 13. 3. 2013 09:48:41

mmichalcontasrocz
Člen
Registrace: 12. 3. 2013
Příspěvků: 6

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Dobrý den. Potřebuji pouze poradit, jak upravit cílovou oblast

dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$A$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

tak, aby se hodnota nevkládala pouze do buňky A2. Když kliknu do A3 a tlačítkem spustím makro, aby se hodnota vložila do A3, když kliknu do A4 tlačítkem spustím makro, aby se vložila do A4 atd. Vždy pouze ve sloupci A. Makro zaznamenané mám, přiřazené tlačítko mám. Jenom nevím, jak mám upravit tu cílovou oblast. V Calcu jsem úplný začátečník. Děkuji za radu, jak změnit syntaxi.

Editoval mmichalcontasrocz (13. 3. 2013 09:49:25)

Offline

#9 13. 3. 2013 10:06:18

mmichalcontasrocz
Člen
Registrace: 12. 3. 2013
Příspěvků: 6

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Finální sešit by měl vypadat tak, jako na obrázku.
http://oxygenium.rajce.idnes.cz/calc#Printscreen.jpg
S tím, že potřebuji vkládát hodnotu, jak jsem psal výše.

Offline

#10 13. 3. 2013 13:12:14

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

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Takže snad už si poradíte. Beru v potaz, že používáte OpenOffice ve firemním prostředí (a jen jako zaměstnanec managmentu), takže je to buhulibá činnost, která může přinést větší oblibu uživatelů. Jinak opravdu raději naštudujte sám.

Podívejte se na kód. Stačí Vám zkopírovat funkci a přepsat ten inputbox na "Pozice()"

Function Pozice()
DIM Adr as string
oCell = ThisComponent.CurrentController.getSelection() 
With oCell.RangeAddress 
SC = .StartColumn 
SR = .StartRow
End With 
Adr = Chr(SC+65)&SR+1
Pozice = Adr
End Function


sub datumcas
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")

dim adresa as string
adresa = Pozice()

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

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

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

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = adresa

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

rem ----------------------------------------------------------------------
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "D"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4

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

rem ----------------------------------------------------------------------
dim args5(5) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Flags"
args5(0).Value = "SVD"
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())

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

rem ----------------------------------------------------------------------
dim args7(1) as new com.sun.star.beans.PropertyValue
args7(0).Name = "By"
args7(0).Value = 1
args7(1).Name = "Sel"
args7(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args7())

end sub

Editoval neutr (13. 3. 2013 13:16:02)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#11 13. 3. 2013 14:29:45

mmichalcontasrocz
Člen
Registrace: 12. 3. 2013
Příspěvků: 6

Re: Calc makro kopírování hodnoty z buňky - VYŘEŠENO

Velice děkuji uživateli neutr za podporu. Sám bych to zatím dohromady nedal. Budu se těšit na další vyřešené problémy.

Offline

Zápatí