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

#1 21. 9. 2010 11:19:05

alfonz_mucha
Člen
Registrace: 6. 9. 2010
Příspěvků: 19

Makro pro kopírování dat do prázdné buňky

Dobrý den,

nyní mám makro pro kopírování dat z jednoho listu do druhého, na přesně zadaná místa. Data se načítají stále ze stejné pozice a vkládají se na list. Jakmile se vloží jednou aktualizují se a vloží se znovu pod první zadání. Avšak lokace do které se zapisují data mám exaktně tedy do buňky A1, poté v druhém makru do buňky A5 atd.

Jak můžu vytvořit makro, které bude sledovat sloupec A od 1 do.... a jakmile nalezne prázdnou buňku vloží data o buňku níže?

Předpokládám, že tedy nejdříve makro zkopíruje data, poté se přepne na list pro vkládání. Nyní nastává čas pro funkci, které bude testovat buňky sloupce A od shora dolu jestli jsou prázdné. A jakmile jí najde poskočí o buňku níže a vloží data.

V té funkci si právě nejsem moc jistý jak jí vytvořit, takže doufám, že někdo zde ví jak na to.

Offline

#2 21. 9. 2010 13:39:24

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

Re: Makro pro kopírování dat do prázdné buňky

Potrebujete cyklus, v ktorom budete testovať, či je bunka prázdna. Ak áno, potom tam vložíte údaj a cyklus ukončíte. Ak nie, zvýšite hodnotu riadku a cyklus opakujete.

Offline

#3 21. 9. 2010 22:09:06

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

Re: Makro pro kopírování dat do prázdné buňky

Pokud zde nakopírujete základ, co už máte, pomůžeme vám se zbytkem. Z popisu mi ale není 100% jasné, co a jak máte a co chcete.

j-pastierik naznačil, že pomocí cyklu bez známého počtu opakování (Do ... Loop nebo While ... Wend) půjdete od 1.řádku dál a budete testovat, jestli v buňce A1, A2, ... něco je a když narazíte na prázdnou, tak tam budete vkládat. Tento postup bude tím pomalejší, čím více řádků bude zaplněno.

Já bych se přikláněl k řešení, kdy do pomocné buňky si budete ukládat číslo řádku, kam se naposledy kopírovalo (nebo který je první prázdný); na začátku makra si to číslo přečtete a na konci makra ho zvětšíte o jednu.

Editoval hanus (21. 9. 2010 22:09:30)

Offline

#4 22. 9. 2010 05:40:00

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

Re: Makro pro kopírování dat do prázdné buňky

Dá sa to aj pomocou bunky alebo pomocou pracovného súboru, v ktorom si makro zapamätá poslednú polohu.

Offline

#5 22. 9. 2010 10:39:23

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

Re: Makro pro kopírování dat do prázdné buňky

Celá úloha se dá řešit pomocí vzorců (skoro jistě pro většinu lidí nepochopitelné).

Pro začátečníka je cyklus zřejmě nejsrozumitelnější. Pro pár desítek - stovek položek nebude zpomalení příliš významné. Pokud ano, technik na zrychlení je celá řada.

Lze zrychlit vyhledávání. Optimalizací cyklu (např. měníme krok), načtením dat z listu do pole a cyklem v poli, lze použít běžné vzorce listu ke zjištění pozice (v makru třeba pomocí funkce counta můžeme zjistit počet neprázdných buněk a tím i adresu další buňky), lze umístit vzorec pro výpočet pozice do dohodnuté buňky (třeba i makrem aby ho nikdo nesmazal), lze použít např. funkce pro hledání v listu (sloupci).

Zapamatování poslední pozice je další možností. Kromě již zmíněných míst je možné pozici zapamatovat třeba ve jméně. Výhodou je stabilní rychlost (ne vždy větší, pozice uložená v souboru makro moc nezrychlí), nevýhodou je potřeba zachování synchrohizace (zapamatovanou pozici je třeba chránit před smazáním)

Závěr - použijte cyklus a případné zrychlení řešte následně až to bude nutné.

Offline

#6 22. 9. 2010 11:31:28

alfonz_mucha
Člen
Registrace: 6. 9. 2010
Příspěvků: 19

Re: Makro pro kopírování dat do prázdné buňky

Takže dnes jsem zapracoval na části, kterou navrhl hanus, zda se mi naprosto idealní, jelikož je jednoduše přizpůsobitelná pro další možnosti. Jenže se mi nedaří, aby se na místo určené proměnou Cell vkládal celý blok dat r tedy F10:G20 a v nejlepším případě jako text a číslo pouze. Zatím mi to funguje pouze s textem.


Sub zapisovac
Dim Sheet, Cell, bunka
Dim c as Integer, r as Integer

Sheet = thisComponent.sheets.getByName("List1")
bunka =sheet.getCellRangeByName("E1")

r = bunka.value
c = 0

Cell = Sheet.getCellByPosition(c, r)
Cell.string = "Ahoj"

r = r+10
bunka.value = r

End Sub

Editoval alfonz_mucha (22. 9. 2010 11:31:48)

Offline

#7 22. 9. 2010 13:07:43

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

Re: Makro pro kopírování dat do prázdné buňky

Dim c as long, r as long     ' integer je chyba, jeho rozsah nepokrývá rozsah listu - zkuste do e1 napsat 40000

Cell.value = "Ahoj"          ' string sebere vše jako text, value je lepší
Cell.value = 123

Cell.formula = 123           ' Také lze použít

Celý blok vkládá metoda setDataArray, její použití je trochu komplikované. Tuším, že kopírování celého bloku jste nechtěl, použijte tedy ofset v cyklu přes kopírované pole

for i = 0 to 9
  Cell.Offset(0, i).Value =  CellZdroj.Offset(0, i).Value
next i


Pokud potřebujete přeci jen vkládat pole, je tu malá komlikace s vytvořením tohoto pole. Pro mne nejjednodušší je pole vytvořit metodou getdataarrray.

...

Sheet = thisComponent.sheets.getByName("List1")
SheetZdroj = thisComponent.sheets.getByName("List2")
bunka =sheet.getCellRangeByName("E1")

r = bunka.value
Cell = Sheet.getCellRangeByName("A" & r & ":A" & (r+9))
CellZdroj = SheetZdroj.getCellRangeByName("A1:A10")


' Načtu pole hodnot z listu do proměnné Cisla
Cisla = CellZdroj.getDataArray

' toto lze vynechat
for i = 0 to 9
    Cisla(i)(0) = Cisla(i)(0)   ' pokud je třeba něco opravit, musí se adresovat takto
    next i

' Vložím obsah proměnné Cisla do listu
Cell.setDataArray(Cisla)

....

Pokud nechcete nic upravovat jen zkopírovat hodnoty:

Cell.setDataArray(CellZdroj.getDataArray)

Nebo vzorce

Cell.setFormulaArray(CellZdroj.getFormulaArray)

Offline

#8 22. 9. 2010 16:08:33

alfonz_mucha
Člen
Registrace: 6. 9. 2010
Příspěvků: 19

Re: Makro pro kopírování dat do prázdné buňky

Děkuji za skvělé info o metodě setDataArray

Ale přesto asi něco dělám špatně. Pokaždé mi metoda setDataArray vyhodí runtime exception a skončí na Cell.setDataArray(Cisla). Hledal jsem na netu a je tam toho spoustu o této chybě. Přiznám se, že ale nevím co, v několik fórech jsem nerazil na to, že je zřejmě problém s velikostí pole.

Offline

#9 22. 9. 2010 16:45:24

alfonz_mucha
Člen
Registrace: 6. 9. 2010
Příspěvků: 19

Re: Makro pro kopírování dat do prázdné buňky

Jo tak už jsem na problém přišel, jakmile je kontrolní buňka prázdná, bývají s tím trošku problémy, nyní už to funguje wink

Offline

Zápatí