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

#1 11. 3. 2014 17:14:51

markoma
Člen
Registrace: 14. 5. 2011
Příspěvků: 14

Kopírovanie dat len z plných riadkov

Pozdravujem prosím o radu ako pomocou vzorca vyriešiť kopírovanie dát z jednej tabuľky do druhej tak, že data v prvej tabuľke v niektorých riadkoch nie sú. Preto to potrebujem vyriešiť  aby sa kopírované data v ďalšej tabuľke dopĺňali postupne v poradí od hora dole  teda vynechávali sa prázdne riadky. Programovanie cez makrá neovládam a pokus o záznam vlastného makra zlyhal. Ak som nahrával svoje makro s využitím štandardného filtra, všetky zmeny ktoré som zadal v nastavení filtra sa neuložili do makra.

Offline

#2 12. 3. 2014 08:18:25

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

Re: Kopírovanie dat len z plných riadkov

Rozdělím to na více kroků. Zejména kopírování a samostatně smazání + alternativy.
Udělejte si vzorec s IF podle následujících návorů, následně pomocný sloupec podle kterého setřídíme, nebo smažeme nepotřebné.


     Tabulka do které se kopíruje bude obsahovat odkaz na buňku první tabulky.
   - Například v Listu1 bude tabulka na úseku A1:C10. V Listu2 vytvoříte její kopii pomocí vzorce v každé buňce stejně. Pro buňku v Listu2 A1 to bude

=IF(List1.A1 = "";"";List1.A1)

   - V prázdných buňkách tabulky kopie nebude nic tak jako v první tabulce. Tam kde něco je, zkopíruje se to. Když budou tabulky na stejném listě postačí

=IF(A1 = "";"";A1)

   - Nevím co přesně myslíte tím postupně. Vzorce to udělají naráz. Pokud chcete makro, tak postačí nahrát vzorec do první buňky - to uděláte ještě před zapnutím záznamníku maker. Při nahrávání vstoupíte do buňky kde je vzorec. Pokud to uděláte nesprávně (bez entru) bude makro začínat vždy na místě okamžité pozice kurzoru. Jakmile budete v té buňce zapnete editační mód (nejlépe kliknutím do příkazové řádky kde je vidět vzorec) a stisknete INSERT. Pozor pak vlastně musíte "entrovat" a postavit se znovu do původní buňky, kterou pak dáte do paměti, vyberete pole, vykopírujete do něho vzorec. Následně můžete (ale nemusíte) načíst pole se vzorci do paměti a vložit zpět jen jako čísla a text. Ukončíte záznam makra.
   - Ovšem je to tak jednoduché, že makro není potřeba pokud tuto operaci neděláte alespoň 5x denně. Doporučuji otestovat si předem samostatně každý krok nahrávání. Tedy start v určité buňce, nahrání vzorce a vykopírování do určitého úseku + případně vložení jen hodnot a textu.


   - Makro může být postaveno i jako relativní - tedy takové, že nastartuje v jakékoliv buňce a jakéhokoliv sešitu a výsledek bude stejný. Jen by potom vzorec měl mít podobu absolutní adresy a podmínkou je, aby zdrojová tabulka byla vždy na stejném místě. Vzorec s absolutní adresou :

=IF($List1.$A$1 = "";"";$List1.$A$1)

Vzorec funguje stejně jako bez dolaru, ale umožňuje stejný výsledek ať už děláte se vzorcem cokoliv. Při kopírování dostanete vždy stejné výsledky. Když by tam dolar nebyl. Vzorce s dolarem proto nemusíte zpětně načítat a vkládat jako hodnoty (jde jen o to co si vyberete).


   - Problém nekopírovat prázdné řádky řešíme ručně, nebo i v rámci toho makra takto. Vedle tabulky postavíme nejlépe 2 pomocné sloupce. První pomocný sloupec bude obsahovat pořadí řádků a postačuje k tomu vzorec

=ROW()

. Vedle postavíme vzorec

=IF(A1="";1;"")

, nebo třeba alternativně podobný postup

=IF(A1="";ROW;"")

alternativa :-

=IF(A1="";"";ROW)

Vykopírujeme do sloupce nejlépe za tabulkou a s nějakým odstupem (prázdný sloupec). Vidíte, že někdy postačí jen jeden sloupec právě s tím vzorcem (ROW), ale ne vždy je to vhodné.
   - Pomocný sloupec, nebo oba musíme vždy načíst zpět a vložit jen hodnoty a čísla.
   - Nakonec musíme setřídit podle posledního sloupce a smazat ta data, která nepotřebujeme.
   - Když to budeme nahrávat do makra, doporučuji poslední kroky (hotový postup až k hodnotám pomocných sloupců) v pořadí : Ctrl+End, následně Ctrl+ŠipkaNahoru, potom CTRL+Shift+ŠipkaNahoru, a naposled najet CTRL+Shift+ŠipkaVlevo. Je vybrán celý úsek, který můžeme smazat. k tomu se hodí vzorec

=IF(A1="";ROW;"")

   - Vzhledem k tomu, že tam mohou být jen prázdné řádky, postačí jen setřídit - k tomu se hodí

=IF(A1="";"";ROW)

Editoval neutr (12. 3. 2014 08:34:18)


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

Offline

#3 12. 3. 2014 09:13:25

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

Re: Kopírovanie dat len z plných riadkov

Jiným případem řešení by bylo například opačně - nejprve načíst pomocný sloupec (například "A") s dotazem IF(A1="";"";"A"&ROW). Vykopírovat + vpložit jen čísla, text a setřídit. Dostaneme tak pořadí neprázdných řádků, které je nutné načíst. Kopie tabulky tedy začíná údajem o neprázdné buňce :- příklad : A1, A4, A12, A13, A16,....
     Vlastní vzorec s IF potom načítá data podle odkazu z prvního sloupce - údaje jsou hned pod sebou, takže pak už se s tím nic dělat nemusí.
     Existuje i možnost načítat přímo například pomocí SMALL(úsek;pořadí), nebo maticí. Takové konstrukce jsou sice "naráz - bez mezikroků", ale konstrukce je složitější. Navíc jsou omezeny počtem řádků. Většinou to funguje jen asi tak do 1000 řádků. Takže univerzálnějším a snadnějším řešením je rozdělení na více kvalitativních operací. Pak nás omezuje kapacita stroje jen opravdu málo.


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

Offline

#4 12. 3. 2014 19:33:45

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

Re: Kopírovanie dat len z plných riadkov

Vzoorec není asi nejlepší nápad, ale...

Třeba do C1:

=SMALL(IF(ISBLANK($A$1:A$101);101;ROW($A$1:A$100));ROW($A$1:A$100))

Vložte maticově, trojhmat ctrl-shift-enter, dá to čísla řádků s neprázdnými buňkami, 101 označí prázdný řádek.

Do D1:

=IF(C1>100;"";INDEX($A$1:$A$100;C1))
(normálně)

Zkopírujte podle potřeby

Dá to hodnoty na spočtených řádcích.

Offline

Zápatí