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

#1 29. 3. 2013 15:12:35

marekkoc
Člen
Registrace: 29. 3. 2013
Příspěvků: 7

Spolupráce mezi dvěma sešity - VYŘEŠENO

Ahoj, potřeboval bych poradit s následujícím. Mám naprosto dvě stejné tabulky např. tab1.ods a tab2.ods. Chtěl bych, aby se mi po zapsání čísla do tab1 zapsaly do tab2 a potom, když je vymažu z tab1, aby zůstaly v tab2 zachovány. Při dalším zápisu do tab1 by se čísla z tab1 přičetly k již existujícím číslům v tab2 a po smazání z tab1 by zůstaly opět v tab2 zachovány znovu to samé dokola.
Dále pak by se mi hodilo, kdyby na tomto mohlo pracovat takto více lidí a měli možnost zapsat čísla do tab1 pouze jednou, ale to už by byla jen třešnička na dortu.

Děkuju za pomoc . Marek

______________________________________________
Značím jako vyřešené

;o)

Editoval sedlacekdan (9. 4. 2013 19:03:32)

Offline

#2 29. 3. 2013 15:33:57

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

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Tabulka 1 je jiný sešit, neř tabulka 2? Takže někde na síti leží sešit do kterého se přihlašují třeba naráz 2 uživatelé? Nebo jde o to, že přistupují postupně k jednomu stroji? Tabulky jsou dost obecný pojem. Nemáte na mysli třeba jen jiní listy stejného sešitu?
Tohle počítané přistupování - jednou a dost jde asi jenom makrem, stejně jako připočítávání do druhé tabulky.


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 29. 3. 2013 15:43:00

marekkoc
Člen
Registrace: 29. 3. 2013
Příspěvků: 7

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Přesně tak tab1 je jiný sešit než tab2, jsou to dva soubory. Dejme tomu, že jeden leží v adresáři New a druhý Old, ale jsou na stejném stroji. Ano můžou se tam přihlásit dva uživatelé. Děkuju za info

Offline

#4 29. 3. 2013 17:56:52

marekkoc
Člen
Registrace: 29. 3. 2013
Příspěvků: 7

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Nemáte někdo nápad na makro? Děkuju. Marek

Offline

#5 29. 3. 2013 21:25:17

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Možné makro zde:

sub zkopiruj_otevri_vloz

dim document1 as object
dim document2 as object
dim dispatcher1 as object
dim dispatcher2 as object
dim args1(0) as new com.sun.star.beans.PropertyValue
dim args2(1) as new com.sun.star.beans.PropertyValue
dim args3(0) as new com.sun.star.beans.PropertyValue
rem ----------------------------------------------------------------
document1 = ThisComponent.CurrentController.Frame
dispatcher1 = createUnoService("com.sun.star.frame.DispatchHelper")
' zde definujte první buňku v cílovém dokumentu kam se bude vkládat obsah
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1" 
' Kopírujeme vše s operací Přidat (viz volba Vložit jinak)
args2(0).Name = "Flags"
args2(0).Value = "A"
args2(1).Name = "FormulaCommand"
args2(1).Value = 1
' zdrojová oblast v zadávacím dokumentu
args3(0).Name = "ToPoint"
args3(0).Value = "$A$1:$F$10"

adresa = convertToURL("ZDE VLOŽTE ADRESU CÍLOVÉHO SOUBORU")

rem ----------------------------------------------------------------
' označíme zdrojovu oblast - args3
dispatcher1.executeDispatch(document1, ".uno:GoToCell", "", 0, args3())
' a zkopírujeme ji
dispatcher1.executeDispatch(document1, ".uno:Copy", "", 0, array())
' document uložíme (změny) a zavřeme)
ThisComponent.store
ThisComponent.close(True)
' načteme cílový soubor (otevřeme)
StarDesktop.loadComponentFromUrl(adresa,"_blank",0,array())
document2 = ThisComponent.CurrentController.Frame
dispatcher2 = createUnoService("com.sun.star.frame.DispatchHelper")
' přeskočíme do první buňky kam budeme vkládat zkopírovaná data - args1
dispatcher2.executeDispatch(document2, ".uno:GoToCell", "", 0, args1())
' Vložíme obsah schránky (jako všechny hodnoty s volbou přidat) - args2
dispatcher2.executeDispatch(document2, ".uno:InsertContents", "", 0, args2())
' dokument uložíme
ThisComponent.store
msgbox "Údaje byly aktualizovány",0,"PŘENOS PROVEDEN "
end sub

I ten přístup (pouze jednou) by zřejmě šel nějak nastavit, ale to už je trochu komplikovanější. Navíc jak by pak probíhala například oprava chyb?


;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
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

#6 29. 3. 2013 22:06:08

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

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Ten přístup lze zajistit, ale vstupní sešit musí být vybavený seznamem osob a popřípadě hesel. Na to by měl stačit 2x inputbox + sešit se zamykacím makrem. Teda nevím jak by to vypadalo, když by se to editovalo pomocí vzdáleného přístupu například dvěma učastníky naráz. Ale šlo by to asi bloknout a po odhlášení uvolnít přístup, nebo dát možnost vstupu dvěma stejnými vstupními sešity "New".


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

#7 29. 3. 2013 23:45:54

Schinagl
Člen
Registrace: 14. 2. 2007
Příspěvků: 36

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Problém bude v přístupu více uživatelů na ráz, to calc neumí, to už by byla úloha pro server. Šlo by, ale pro každého uživatele vytvořit jeho soubor s tab1 a po ukončení zadávání provést sběr dat do tab2.

Offline

#8 30. 3. 2013 04:28:35

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

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Nene, vstup heslem lze udělat přímo v sešitě, tak jak to popisuju. Sloupec jmen, vedle sloupec hesel a ještě vedle (3. sloupec) kontrola vzorcem, zda bylo již ten den editováno. Normálně může být vše mimo prvního listu skryto a zamčeno. Na to je makro, a bylo tuším i tady na fóru.


   Sešit má buď aktivní funkci na prvním listu, nebo tlačítko. Znamená to, že po otevření může automaticky vyskořit inputbox s dotazem na jméno, pokud ho najde ve sloupci jmen, tak vyskočí inputbox s dotazem na heslo, ale jen v případě, že ten den uživatel už needitoval (šlo by to postavit i na kratší časový úsek).
   Druhou volbou je tlačítko. Samozřejmě podle okolností by se to mohlo i samo zavírat, například když by někdo otevřel a bloknul tak zápisy.
   Následně by se měl sešit uvolnit pro editaci. Po editaci na entr by se spustilo třeba Danovo makro a sešit by se vybavit blokem času aktuálního dne, následně zablokoval zcela a sám se zavřel.


   Takže ono to opravdu jde. Dělal jsem kdysi něco podobného pro wiki. Tam jsem ještě blokoval klavesy. Ovšem to je z principu špatně - protože existuje ustanovení licencí GNU - GPL, a jiné které vždy říkají něco o přístupnosti ke kódu. Takže blokovat jako ochranu lze, ale pokud to dostane legálně a snad i bez souhlasu majitele třetí osoba, může si stěžovat na porušení licencí.   
   Lze to udělat například jako "komerční", kde se to tak nebere, ale hrozí žaloby například pro poškození stroje, nebo musí být něco jako upozornění na prvním listu ap.

Editoval neutr (30. 3. 2013 04:32:17)


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

#9 2. 4. 2013 14:20:04

marekkoc
Člen
Registrace: 29. 3. 2013
Příspěvků: 7

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Děkuju za pomoc. Už jsem to zkoušel a je to fajne. Jen mám ještě jednu věc a to, aby se dokument tab2 neotvíral, jde o to, že žádný úživatel nesmí vidět zapsané hodnoty do tab2. Děkuju.

Offline

#10 2. 4. 2013 16:15:09

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

marekkoc napsal(a)

Jen mám ještě jednu věc a to, aby se dokument tab2 neotvíral, jde o to, že žádný úživatel nesmí vidět zapsané hodnoty do tab2.

Tak zde už si s nahráním makra nepomůžeme

sub uloz_do_skryteho
Dim arg(0) As New com.sun.star.beans.PropertyValue
arg(0).Name = "Hidden" ' otevřeme jako skrytý
arg(0).Value = True
adresa = convertToURL("ADRESA CÍLOVÉHO DOKUMENTU")
zdrojovy_dok = thisComponent
list_1 = zdrojovy_dok.sheets(0) ' první list zdrojového dokumentu
' lze upravit na
' list_1 = zdrojovy_dok.sheets().getByName("List1")
cilovy_dok = stardesktop.loadComponentFromUrl(adresa,"_blank",0,arg())
list_cile = cilovy_dok.sheets(0)
' projdeme všechny buňky oblasti A1:F10
for i = 0 to 5 ' řádky A - F - číslování začíná 0 (A=0, B=1...F=5) 
 for j = 0 to 9 ' sloupce 1 - 10 - číslování opět 0 (1=0......10=9)
  bunka_zdroj = list_1.getCellByPosition(i, j) ' buňka po buňce
  bunka_cil = list_cile.getCellByPosition(i, j)
  bunka_cil.value = bunka_zdroj.value + bunka_cil.value ' nasčítání a zápis hodnot
 next j
next i
' pro oblast D5:H15 změňte hodnoty i a j na i=3 to 7 a j=4 to 14
cilovy_dok.store()
cilovy_dok.close(True)'uložíme a zavřeme skrytý dokument
zdrojovy_dok.store()
zdrojovy_dok.dispose() ' uložíme a zavřeme zdroj
msgbox "Všechny změny byly provedeny ",0,"PŘENOS PROVEDEN "
end sub

Budete si muset upravit hodnoty i a j - čísla sloupců a řádků na Vámi požadované hodnoty. Při této variantě (6 sloupců a 10 řádků) trvá celá operace cca 1 sekundu. Čím více sloupců a řádků tím delší průběh makra (více buněk k procházení a více zápisů).


;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
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 2. 4. 2013 18:24:20

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

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Rychlost 60 buněk / sec mi připadá dost nízká. Zkuste použít getDataArray/setDataArray, bude to podle velikosti oblasti cca 100 - 10000x rychlejší (větší počet buněk = větší rychlost).

ukázka např.:

http://forum.openoffice.cz/viewtopic.php?pid=8442#p8442

Bylo by to možná vhodné doplnit např. automatickou zálohou/verzí staré sumy, případně odečtením sešitu pro případ potřeby opravit chybu. Podobná řešení přinášejí prakticky vždy problémy - pokud to jinak nejde, jako minimum bych někam poznamenal značku pro aktualizaci - jméno souboru nebo datum/čas poslední aktualizace nebo datum a čas posleního uložení vkládaného souboru včetně kontroly a zákazem aktualizace, pokud nedošlo ke změně.

Offline

#12 3. 4. 2013 13:51:14

marekkoc
Člen
Registrace: 29. 3. 2013
Příspěvků: 7

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Klobouk dolů je to super. Sám bych si s tím nevěděl rady. A poslední troufalá žádost jak zajistit, aby tam mohl editovat člověk pouze jednou, kolega nahoře uvedel " Ten přístup lze zajistit, ale vstupní sešit musí být vybavený seznamem osob a popřípadě hesel. Na to by měl stačit 2x inputbox + sešit se zamykacím makrem. Teda nevím jak by to vypadalo, když by se to editovalo pomocí vzdáleného přístupu například dvěma učastníky naráz. Ale šlo by to asi bloknout a po odhlášení uvolnít přístup, nebo dát možnost vstupu dvěma stejnými vstupními sešity "New"" , ale bohužel moje  programátorské schopnosti jsou nulové. Děkuju. Pokud nikdo nebude vědět tak to považuju za vyřešené a všem moc děkuju. Marek

Offline

#13 3. 4. 2013 14:00:24

marekkoc
Člen
Registrace: 29. 3. 2013
Příspěvků: 7

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

sedlacekdan napsal(a)
marekkoc napsal(a)

Jen mám ještě jednu věc a to, aby se dokument tab2 neotvíral, jde o to, že žádný úživatel nesmí vidět zapsané hodnoty do tab2.

Tak zde už si s nahráním makra nepomůžeme

sub uloz_do_skryteho
Dim arg(0) As New com.sun.star.beans.PropertyValue
arg(0).Name = "Hidden" ' otevřeme jako skrytý
arg(0).Value = True
adresa = convertToURL("ADRESA CÍLOVÉHO DOKUMENTU")
zdrojovy_dok = thisComponent
list_1 = zdrojovy_dok.sheets(0) ' první list zdrojového dokumentu
' lze upravit na
' list_1 = zdrojovy_dok.sheets().getByName("List1")
cilovy_dok = stardesktop.loadComponentFromUrl(adresa,"_blank",0,arg())
list_cile = cilovy_dok.sheets(0)
' projdeme všechny buňky oblasti A1:F10
for i = 0 to 5 ' řádky A - F - číslování začíná 0 (A=0, B=1...F=5) 
 for j = 0 to 9 ' sloupce 1 - 10 - číslování opět 0 (1=0......10=9)
  bunka_zdroj = list_1.getCellByPosition(i, j) ' buňka po buňce
  bunka_cil = list_cile.getCellByPosition(i, j)
  bunka_cil.value = bunka_zdroj.value + bunka_cil.value ' nasčítání a zápis hodnot
 next j
next i
' pro oblast D5:H15 změňte hodnoty i a j na i=3 to 7 a j=4 to 14
cilovy_dok.store()
cilovy_dok.close(True)'uložíme a zavřeme skrytý dokument
zdrojovy_dok.store()
zdrojovy_dok.dispose() ' uložíme a zavřeme zdroj
msgbox "Všechny změny byly provedeny ",0,"PŘENOS PROVEDEN "
end sub

Budete si muset upravit hodnoty i a j - čísla sloupců a řádků na Vámi požadované hodnoty. Při této variantě (6 sloupců a 10 řádků) trvá celá operace cca 1 sekundu. Čím více sloupců a řádků tím delší průběh makra (více buněk k procházení a více zápisů).


;o)

Prosím ještě o úpravu, aby se uplně nakonec data z tab1 vymazaly. Děkuju

Offline

#14 4. 4. 2013 18:40:05

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

marekkoc napsal(a)

Prosím ještě o úpravu, aby se uplně nakonec data z tab1 vymazaly. Děkuju

Podívejte se na můj seriál Malá makra konkrétně na díl Základní práce s buňkami.


Tam najdete postup k mazání obsahu buněk.


;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
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

#15 6. 4. 2013 16:57:40

sedlacekdan
Moderátor
Místo Nehvizdy
Registrace: 21. 6. 2010
Příspěvků: 617

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

S použitím rady lp. a se změnou zadávání oblasti kopírování (pro jednodušší provádění změn oblasti) a i s požadavkem na promazání původní oblasti buněk.

sub uloz_do_skryteho_2
Dim arg(0) As New com.sun.star.beans.PropertyValue
arg(0).Name = "Hidden" ' otevřeme jako skrytý
arg(0).Value = True
adresa = convertToURL("/home/daniel/Dokumenty/111.ods")
zdrojovy_dok = thisComponent
list_1 = zdrojovy_dok.sheets(0) ' první list zdrojového dokumentu
oblast_zdroj = list_1.getCellRangeByName("A1:F10")
data_zdroj = oblast_zdroj.getDataArray
cilovy_dok = stardesktop.loadComponentFromUrl(adresa,"_blank",0,arg())
list_cile = cilovy_dok.sheets(0)
data_cile = list_cile.getCellRangeByName("A1:F10").getDataArray
konec_radku = oblast_zdroj.rows.count - 1
konec_sloupce = oblast_zdroj.columns.count - 1
for radek = 0 to konec_radku
 for sloupec = 0 to konec_sloupce
  data_cile(radek)(sloupec) = data_zdroj(radek)(sloupec) + data_cile(radek)(sloupec)
 next sloupec
next radek
list_cile.getCellRangeByName("A1:F10").setDataArray(data_cile)
cilovy_dok.store()
cilovy_dok.close(True)'uložíme a zavřeme skrytý dokument	
with com.sun.star.sheet.CellFlags
oblast_zdroj.clearContents(.VALUE or .DATETIME or .STRING)
end with
zdrojovy_dok.store()
'zdrojovy_dok.dispose() ' uložíme a zavřeme zdroj
msgbox "Všechny změny byly provedeny ",0,"PŘENOS PROVEDEN "
end sub

;o)


Linux Mint 16 Petra - Apache OpenOffice 4.0.1
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

#16 7. 4. 2013 08:04:13

marekkoc
Člen
Registrace: 29. 3. 2013
Příspěvků: 7

Re: Spolupráce mezi dvěma sešity - VYŘEŠENO

Spolupráce mezi dvěma sešity - VYŘEŠENO

Editoval marekkoc (8. 4. 2013 14:13:54)

Offline

Zápatí