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

#1 7. 3. 2011 10:06:28

lukasresl
Člen
Registrace: 7. 3. 2011
Příspěvků: 9

Získání dat z více listů - VYŘEŠENO

Dobrý den,

nevěděl by někdo, jak elegantně získat data z více listů?

Mám sešit s 50 listy, v každém listu je na stejném místě tabulka s daty - 10 řádků a 5 sloupců(A1:E10).
Já potřebuji mít data z tabulek na jednom listu pod sebou tj. jednu tabulku s 500 řádků a 5 sloupců).

Díky za každý nápad.

Lukáš

Offline

#2 7. 3. 2011 14:54:17

j-pastierik
Člen
Registrace: 15. 11. 2004
Příspěvků: 761

Re: Získání dat z více listů - VYŘEŠENO

makrom

Offline

#3 8. 3. 2011 00:16:23

Lord killer
Člen
Registrace: 9. 12. 2007
Příspěvků: 43

Re: Získání dat z více listů - VYŘEŠENO

Elegantně a automaticky snad jedině tím makrem, ale trochu elegance by šlo vnést i do manuálního řešení.
1. jednapadesátý list otevřít v novém okně
2. klik do buňky a vložení "="
3. označení buňky A1 prvního listu v druhém okně a stisk enter
4. buňku rozkopírovat tažením myši


padesát není tak zas moc :-)

Offline

#4 9. 3. 2011 15:52:10

lukasresl
Člen
Registrace: 7. 3. 2011
Příspěvků: 9

Re: Získání dat z více listů - VYŘEŠENO

Díky moc za odpovědi. Já bych to vážně potřeboval :-)
Nechcete mi někdo to makro napsat? Já mám bohužel malé zkušenosti a to pouze s makry pro excel. Nevím, jak moc to může být složité, ale dal bych symbolickou odměnu člověku, který by mi to napsal (moje představa je 400 Kč + 200 Kč v případě dodání fungujícího produktu do 3dnů).
Tak kdyby to někdo chtěl zkusit, tak se na mě prosím obraťte (lukas.resl(zavinac)centrum.cz)

Zadání by bylo:
Sešit o 49 listech, 1 (výstupní data) + 3 + 45 listů.
Makro by udělalo tohle:
1. ze všech posledních 45 listů by zkopírovalo buňky A2:O200 pod sebe do prvního listu A2:O8956 jako "pouze hodnoty" (tj. ne vzorce).
2. v prvním listu by makro smazalo všechny řádky, které by ve sloupci G měly prázdnou hodnotu a seřadilo tabulku podle sloupce A.
Makro by mělo fungovat na libovolný sešit o 49 listech a i když se změní název listů (listy se ale nebudou přidávat nebo ubírat). Jednotlivé kroky v makru by měly být v makru popsány (pomocí "rem ---").

Díky všem

Offline

#5 9. 3. 2011 17:33:12

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Získání dat z více listů - VYŘEŠENO

Makro není až tak složité, je v následujícím souboru, který obsahuje i testovací data:
http://ooo.e-hanus.cz/makro-data-do-jed … stu.01.ods
Makro se jmenuje nacti_data_listu - soubor si musíte nejprve uložit na disk a otevřít z disku, jinak bude jen pro čtení a makro nebude moct do sešitu zapisovat.


Pokud se vám makro hodí, můžete mi poslat příspěvek na účet 3055620227/0100 :-)

Editoval hanus (10. 3. 2011 07:01:43)

Offline

#6 10. 3. 2011 07:01:51

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Získání dat z více listů - VYŘEŠENO

Pokud chcete makro spouštět v jiných sešitech, kde máte svá data, musíte si ho vložit do Moje makra a pak ho volat přes menu Nástroje->Makra->Spustit makro - tam Moje makra a vybrat odpovídající makro. Nějaké info k tomu najdete např. v článku http://www.openoffice.cz/navody/program … plitstring
Do menu si můžete vložit vlastní položku, která bude makro volat, taky už se to tu někde řešilo, jak na to (menu Zobrazit->Panely nástrojů->Přizpůsobit - záložka Nabídky, vyberete si kam a přidáte link na toto makro).


Makra umístěná v Moje makra nejsou pochopitelně dostupná jiným uživatelům (pokud tedy nepracujete na jednom společném účtu). Pro snazší distribuci na jiné počítače by se možná dala použít šablona - makro umístit do výchozí šablony OOo, resp. tu, ve které by bylo, nastavit jako výchozí.

Editoval hanus (10. 3. 2011 07:04:51)

Offline

#7 13. 3. 2011 00:27:32

lukasresl
Člen
Registrace: 7. 3. 2011
Příspěvků: 9

Re: Získání dat z více listů - VYŘEŠENO

Makro vypadá v pohodě, díky (plním co jsem slíbil) - bude předmětem mého dalšího samostudia :-). Vlastně jsem ho ještě nenechal doběhnout do konce na ostrých datech - těch 45 listů mu dává docela zabrat - nedalo by se ještě nějak zefektivnit?

Offline

#8 13. 3. 2011 20:32:47

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Získání dat z více listů - VYŘEŠENO

Která část trvá nejdéle? Předpokládám, že to promazávání prázdných řádků podle sl.G - tam by se to možná dalo zrychlit. To kopírování z listů do jednoho se asi rychleji udělat nedá a řazení taky nezrychlíme.

Offline

#9 14. 3. 2011 00:15:17

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

Re: Získání dat z více listů - VYŘEŠENO

hanus napsal(a)

Která část trvá nejdéle?

Tak si to změřím... (Třeba podle: Useful Macro Information For OpenOffice By Andrew Pitonyak)

Sub ExampleGetSystemTicks
  Dim lTick As Long, lMillisToWait As Long
  Dim lSecsToWait As Long, lTicksPerSec As Long
  lSecsToWait = 60
  lMillisToWait = lSecsToWait * 1000
  lTick = GetSystemTicks()
  wait(lMillisToWait)
  lTick = (GetSystemTicks() - lTick)
  lTicksPerSec = lTick / lSecsToWait
  MsgBox "Each second has about " & lTicksPerSec & " Ticks Per Second"
End Sub

hanus napsal(a)

To kopírování z listů do jednoho se asi rychleji udělat nedá.

Nemyslím si to - v makru se neustále přepíná mezi sešity, plní se schránka, ...

Něco jako:

...
Doc = ThisComponent
pocet_listu = Doc.Sheets.GetCount

SumSheet = Doc.Sheets(0)

oRange = SumSheet.getCellRangeByName(oblast_dat_v_listu)
pocet_radku = oRange.getRows.getCount
pocet_sloupcu = oRange.getColumns.getCount

' opravíme z normálního počítání na getCellRangeByPosition
radek_pro_vlozeni = prvni_radek-1

if pocet_listu >= prvni_list_dat then
  For poradi_listu = prvni_list_dat To pocet_listu
    data = Doc.Sheets.getByIndex(poradi_listu-1).getCellRangeByName(oblast_dat_v_listu).getDataArray
    oRange = SumSheet.getCellRangeByPosition(0,radek_pro_vlozeni,pocet_sloupcu-1,radek_pro_vlozeni + pocet_radku-1)
    oRange.setDataArray(data)
    radek_pro_vlozeni = radek_pro_vlozeni + pocet_radku
  Next poradi_listu

  ' vymazani radku bez udaju ve sloupci 
  ' mažeme od konce - proti původnímu to není o moc rychlejší, 
  ' přesněji je to stále pomalé, ale připadá mi to přehlednější 
  for radek = radek_pro_vlozeni - 1 to prvni_radek step -1
    if SumSheet.getCellbyPosition(kontrolni_sloupec,radek).String = "" then
      ' toto by šlo nahradit načtením sloupce do paměti pomocí getDataArray,  
      ' a testováním hodnot pole, případně hledáním ve sloupci pomocí vestavěných funkcí 
      ' zrychlení by bylo asi dost zajímavé
      SumSheet.Rows.removeByIndex(radek,1)
    end if
  next radek
end if

je o dost rychlejší

(u mne původní makro na zaslaném sešitu běží cca 5,6 sec, po úpravě 3,2 sec, oba časy včetně původního třídění)

potenciál pro zrychlení určitě není tímto vyčerpán

Offline

#10 14. 3. 2011 07:49:26

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Získání dat z více listů - VYŘEŠENO

To je pravda, pokud se z makra vypustí/předělají části, které pracují s GUI, pak se makro zrychlí, protože odpadne režie na překreslování.
Promazávání prázdných řádků by se dalo zrychlit např. tak, že se data seřadí nejprve podle sl.G a naráz se smaže blok prázdných buněk/řádků.

Offline

#11 14. 3. 2011 21:12:56

hanus
Člen
Místo Olomouc
Registrace: 29. 11. 2006
Příspěvků: 573
Web

Re: Získání dat z více listů - VYŘEŠENO

Tak jsem provedl výše popsané optimalizace na výkon, jsem zvědav, o kolik se vám to zrychlí na kompletních datech:
http://ooo.e-hanus.cz/makro-data-do-jed … stu.02.ods
(já jsem u toho původního napočítal do 5, u toho nového sotva do 2 - není to tak sofistikovaný poznatek jako od lp., ale pro představu to stačí :-) )


Před ostrým použitím v produkčním prostředí doporučuju pečlivě zkontrolovat, jestli se neztrácejí řádky - to laborování +1 tu -1 tam je takové ošidné.

Editoval hanus (14. 3. 2011 21:19:50)

Offline

Zápatí