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

#1 14. 4. 2013 15:53:41

LIT
Člen
Místo Liberec
Registrace: 8. 12. 2012
Příspěvků: 51

kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

Zdravím,
potřebuji kopírovat seznam položek ze skladu .Protože počet položek je různý od 1 až třeba 1000 chtěl jsem použít metodu  getDataArray - setDataArray.Mám to napsané takto:

k=19+j
l=11+j
odkud =list_F.getCellByPosition(1,19,1,k).getDataArray   ' k=B20+počet položek (vždy bude začínat na B20)
kam = List_A.getCellByPosition(i,11,i,l).setDataArray ' i=první volný sloupec,l=pvs11+počet položek(vždy bude začínat na řádku 12)

Po spuštění se označí řádek kam a vyskočí chybové hlášení:

Vyskytla se výjimka
Type: com.sun.star.lang.illegal argument exception
Mesage:Arguments len differ

Trápím se s tím od pátku ale nemohu na to přijít.

Editoval LIT (14. 4. 2013 20:26:19)


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É
Windows 10, Libre Office, Lenovo Ideapad

Offline

#2 14. 4. 2013 17:38:42

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

Re: kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

Zřejmě chybné deklarace.

Sub CopyDataArray
dim k, l, j, i as integer 'double - je správnější
i = 0   'zřetelně sloupec v cílovém souboru
j = 20
k=19+j
l=11+j  'správně asi počet údajů ze zdroje - tedy k-19
Sheet1 = ThisComponent.Sheets.getByName("List_F")
Sheet2 = ThisComponent.Sheets.getByName("List_A")
odkud = Sheet1.getCellRangeByPosition(1,19,1,k).getDataArray
kam = Sheet2.getCellRangeByPosition(i,11,i,l).setDataArray(odkud)
End Sub

Samozřejmě místo těch proměnných (já je deklaroval jako normální čísla) uvažujete o cyklech. To se ale dělá běžně pomocí Lbound a Ubound, nebo pomocí function.COUNT a podobně.
Takhle to chodí takže zbytek je na Vás.
Také by asi bylo možné kopírovat vše ze zdroje od ř.19 do řádku milion - do cílového úseku počínaje řádkem 1. Jde to rychle i schránkou (makro bez UNA) a pod.


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 14. 4. 2013 17:42:29

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

Re: kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

Chyba bude tady:

LIT napsal(a)

odkud =list_F.getCellByPosition(1,19,1,k).getDataArray
kam = List_A.getCellByPosition(i,11,i,l).setDataArray

Máte chybně určený rozsah buněk getCellByPosition vrací adresu jedné buňky. Použijte getCellRangeByPosition - čímž jsem našel chybu ve svém seriálu o makrech, kde mám toto chybně uvedeno. Pokud jste vycházel z něj, tak se omlouvám. Pošlu žádost o opravu.


setDataArray vyžaduje argument co vkládáme tedy setDataArray(odkud).


Upravte kód na

odkud = list_F.getCellRangeByPosition(1.19.1,k).getDataArray
kam = List_A.getCellRangeByPosition(i,11,i,l).setDataArray(odkud)

;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

#4 14. 4. 2013 20:04:26

LIT
Člen
Místo Liberec
Registrace: 8. 12. 2012
Příspěvků: 51

Re: kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

Díky za pomoc.Ten kód jsem opravdu vzal ze seriálu o makrech.Upravil jsem makro a pro změnu mi to teď píše :
Objekt není přístupný
Neplatné použití objektu
Přito makro kopíruje data jak má.
Tady je celý kód:

sub Uloz_BF
doc = thisComponent
list_F = doc.sheets.getByName("Formulář")
list_A = doc.sheets.getByName("Archiv")
oblast = list_A.getCellRangeByName("A2:CZ2")
i=oblast.computeFunction(com.sun.star.sheet.GeneralFunction.COUNT)
pocet_NA = list_F.getCellRangeByName("B20:B100")
j =pocet_NA.computeFunction(com.sun.star.sheet.GeneralFunction.COUNT)
k= 19+j
l= 11+j
odkud = list_F.getCellRangeByName("G2")
kam = list_A.getCellByPosition(i,1)
kam.value = odkud.value
odkud = list_F.getCellRangeByName("G3")
kam = list_A.getCellByPosition(i,2)
kam.value = odkud.value
odkud = list_F.getCellRangeByName("G4")
kam = list_A.getCellByPosition(i,3)
kam.value = odkud.value
odkud = list_F.getCellRangeByName("G5")
kam = list_A.getCellByPosition(i,4)
kam.value = odkud.value
odkud = list_F.getCellRangeByName("G6")
kam = list_A.getCellByPosition(i,5)
kam.value = odkud.value
odkud = list_F.getCellRangeByName("G7")
kam = list_A.getCellByPosition(i,6)
kam.value = odkud.value
odkud = list_F.getCellRangeByName("A9")
kam = list_A.getCellByPosition(i,7)
kam.string = odkud.string
odkud = list_F.getCellRangeByName("C15")
kam = list_A.getCellByPosition(i,8)
kam.string = odkud.string
odkud = list_F.getCellRangeByName("C16")
kam = list_A.getCellByPosition(i,9)
kam.string = odkud.string
odkud = list_F.getCellRangeByName("C17")
kam = list_A.getCellByPosition(i,10)
kam.string = odkud.string
odkud = list_F.getCellRangeByPosition(1,19,1,k).getDataArray
kam = List_A.getCellRangeByPosition(i,11,i,l).setDataArray(odkud)
end sub

Všechny proměnné mám deklarované jako veřejné,protože je používám i v jiných makrech  v modulu.


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É
Windows 10, Libre Office, Lenovo Ideapad

Offline

#5 14. 4. 2013 20:14:51

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

Re: kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

LIT napsal(a)
kam = List_A.getCellRangeByPosition(i,11,i,l).setDataArray(odkud)

Upravte na:

List_A.getCellRangeByPosition(i,11,i,l).setDataArray(odkud)

proměnná kam je specifikována jako objekt (buňky) při zápisu kam = List_A.getCellRangeByPosition(i,11,i,l).setDataArray(oblast) ale objektem není, proto ta chyba


;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 14. 4. 2013 20:24:54

LIT
Člen
Místo Liberec
Registrace: 8. 12. 2012
Příspěvků: 51

Re: kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

Díky za pomoc,teď to maká jak má.


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É
Windows 10, Libre Office, Lenovo Ideapad

Offline

#7 15. 4. 2013 08:38:44

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

Re: kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

Je mi jasné, že kopírujete z listu_F celkem 4 různé sloupce do jediného sloupce v Listu_A. Ale je mi dost divné, že ze sloupců G,A,C kopírujete buňku po buňce a sloupec B už jako array. Bylo by asi logičtější zkopírovat array ze sloupce G, pak tu jednu buňku ze sloupce A - tak jak to děláte nyní, a pak zase array ze sloupce C a následně array ve sloupci B (tak jak to děláte).
   Jestli to děláte stále stejně pro pár řádků, tak to asi nevadí, ale když by jich bylo více, bude to dost času navíc. Také kód by byl mnohem kratší. (Pro pouhé zkrácení kódu by stačilo také uzavřít pole do cyklu For.)

Editoval neutr (15. 4. 2013 08:40:36)


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

#8 15. 4. 2013 17:53:37

LIT
Člen
Místo Liberec
Registrace: 8. 12. 2012
Příspěvků: 51

Re: kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

To je tím že kopírovat Array mi nešlo, tak jsem těch pár buněk nakopíroval jednu po druhé,ale sloupec B (nejen on)je nejobsáhlejší a to by bylo šíleně pracné.V současné době je kód zkrácen tak, kde jsou souvislé oblasti tak je kopíruju společně.


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É
Windows 10, Libre Office, Lenovo Ideapad

Offline

#9 12. 4. 2014 09:21:29

ludviktrnka
Člen
Registrace: 9. 7. 2009
Příspěvků: 697

Re: kopírování pomocí getDataArray-setDataArray - VYŘEŠENO

Dobrý den, také jsem ten co se nechal svést návodem na internetu (ale jinak díky za něj a tady jsem našel pak opravu). Chci se ale ještě zeptat jak tedy deklarovat proměnou "odkud" (proměnou "kam" jsem vypustil, ta není dle vašeho návodu potřeba). Funguje mi to když napíšu jen dim odkud bez další specifikace, ale nevím zda je to tak správně, zda to není pak moc paměťově náročné. Kopíruji pouze kladná čísla s max dvěma desetinými místy a do výše 99 tisíc a navíc jsou to z 80% nuly. Díky moc za vaše články a příspěvky.

sedlacekdan napsal(a)
LIT napsal(a)
kam = List_A.getCellRangeByPosition(i,11,i,l).setDataArray(odkud)

Upravte na:

List_A.getCellRangeByPosition(i,11,i,l).setDataArray(odkud)

proměnná kam je specifikována jako objekt (buňky) při zápisu kam = List_A.getCellRangeByPosition(i,11,i,l).setDataArray(oblast) ale objektem není, proto ta chyba


;o)


LibreOffice 5.4.

Offline

Zápatí