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

#1 4. 8. 2016 21:57:05

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Worksheets().Range() bug? - VYŘEŠENO

Dobrý den všem,

objevil jsem zajímavou chybu a už nevím jak ji opravit.
**************************************************
Chyba zní:
Basic runtime error.
Vyskytla se vyjímka
Type: com.sun.star.lang.IllegalArgumentException
Messege: arguments len differ!.
**************************************************
Místo:
ThisWorkbook.Worksheets(prohledavanyList.getName()).Range("B3").Select
Prakticky jsem zjistil, že ta chyba je přesně v .Range("B3")
*************************************************
Chyba se objeví vždy, když otevřu znovu openOffice Calc a spustím makro. Jako řešení chyby stačí cokoliv v makru přidat nebo pouze dát někam Enter nebo jen mezeru a najednou makro funguje... (asi tím zaručím, že se makro znovu zkompiluje?)
Napadá někoho nějaká možnost řešení? Kdyby to bylo makro pouze pro mě, tak to tak neřeším, ale bohužel je pro pár lidí, kteří tomu vůbec nerozumí a určitě nebudou spokojeni s tím, že při každém zapnutí programu budou muset něco ,,upravit" v kodu...
*************************************************
Děkuji za každou radu.

Editoval MrSawyer (5. 8. 2016 14:15:12)

Offline

#2 5. 8. 2016 05:01:47

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Asi víte co to hlášení "arguments len differ!." znamená. Je to oznámení, že se odlišuje délka ergumentu. To je poměrně dost široký objem možných chyb, ale často se to vztahuje k deklaraci úseku (range).


     To co ale vidím na první pohled je skutečnost, že je to něco převzatého z Excelu.
Typická deklarace pole ve Star Basic vypadá přibližně takto :
oSheet = ThisComponent.Sheets(číslo)
     alternativa : oSheet = oDoc.getSheets().getByName("List1")
oRange = oSheet.getCellRangeByPosition(SC,SR,EC,ER)
     Kde : SC - StartColumn, EC - EndColumn, SR - StartRow, ER - EndRow. Jsou to čísla která by měla být deklarována jako "Long".
     alternativa : oRange = oSheet.getCellRangeByName("Název") - typicky A1:R8, nebo název pro pojmenovaný úsek....



     Konkrétně ten Váš případ by měl, nebo mohl vypadat asi takto :
oRange = oSheet.getCellRangeByName("B3")
     Jde ale jen o jedinou buňku kde můžeme použít také deklaraci buňky :
oSheet = Doc.Sheets(0) 'nebo názvem "List1"
Cell = oSheet.getCellByPosition(1, 2) 'sloupec 1 = "B", řádek 2 = řádek 3 protože se počítá od nuly.


     Z toho mála nepoznáme co je podstatou chyby, ale vypadá to, že spouštíte v Calcu makra pro Excel - to znamená jednoznačně přepsat prakticky vše do našeho Basicu.

Editoval neutr (5. 8. 2016 05:05:37)


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 5. 8. 2016 07:20:43

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

Dobrý den,
mnohokrát děkuji za odpověď.
Ano máte pravdu příkazy jsem převzal a upravil pro mé potřeby přímo z fora na Excel. Myslel jsem, že pokud to funguje, tak to mohu používat. (což v mém případě nefunguje pouze při první kompilaci makra při druhé už jo)
           
    Worksheets(prohledavanyList.getName()).Range("B3").Select
    Selection.Copy
   
    Worksheets(list.getName()).Range("B" & radek).Select (kde proměnná ,,radek" je v cyklu inkrementována)           
           
    Selection.PasteSpecial Paste:=xlPasteFormats
    Selection.PasteSpecial Paste:=xlPasteValues   
           
Celý úsek kódu vypadá takto. Potřeboval jsem vložit formátovaný text z jednoho listu do druhého a přitom zachovat formátování.
           
Makro má 1000 řádků, tak případně můžu vložit další části, ale myslím, že tento excelovský kód bude ten problémový.

Offline

#4 5. 8. 2016 10:05:38

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Celkem to snad chápu. Moje rada zní nepřepisovat - nahrát si vlastní makra pomocí záznamníku.
Postup :
Povolte si v Calcu práci s makry NÁSTROJE > Libre Office(Apache open Office) MOŽNOSTI a dále 2 úkony
1. - Zvolte POKROČILÉ a zvolte možnost nahrávat makra - zaškrtněte aby tam byla fajfka.
2. - Zvolte ZABEZPEČENÍ - nabídka ZABEZPEČENÍ MAKER. Zde uděláte dvě volby.
2a) - karta ÚROVEŇ ZABEZPEČENÍ > doporučuji STŘEDNÍ,
2b) - karta DŮVĚRYHODNÉ ZDROJE - vyberete adresář kde lze makra spouštět. (Tl. Přidat - vybrat nějaký a potvrdit...)
      Nejprve uložit aby se náhodou volba neztratila a Calc (celý systém LO, AOO) vypnout. Po restartu zvolte nabídku NÁSTROJE > MAKRA > Hned první nabídka s červeným knoflíkem - ZAZNAMENAT MAKRO (do té doby by tam být neměla pokud jste tuto funkci nezvolil již před tím).



      Nahrajte si úsek který chcete kopírovat a vložte ho do nového umístění nejlépe s volbou v dialogu Text, čísla a formáty, popřípadě datumy. To by mělo být stejné jako ta operace Excelu kde se nejprve vloží vše a pak se do naformátovaných buněk vloží už jen čísla a text. Můžete to ale udělat stejně - vložit vše, načíst z toho samého místa a vložit jen Text + čísla.
      Předpokládám, že práce s makry jako je zápis, úpravy, ukládání a hledání jejich umístění znáte, tak to vynechávám. Přeji úspěch.


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

#5 5. 8. 2016 10:32:54

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

Děkuji za nápovědu. Vím jak nahrávat makra, ale můj problém to moc neřeší, protože já bych potřeboval nějak přímo v mém kódu vkládat formátovaný text.
   
Prakticky zadání zní asi takto: mám jeden list ,,Přehled" a do něho potřebuji z ostaních listů (je jich třeba 200) vytáhnout určité části dat, které jsou individuálně naformátované a pak s těma datama ještě pracovat dále... Pokud bych nahrál makro, tak to částečně vyřeší momentální problém vložení těchto pár buněk, ale neumožní mi to nějak zjednodušeně v pár cyklech pracovat s formátovaným textem. Chtěl jsem se vyhnout tomu abych tam měl nahrané makro (přejdi na list xy->přejdi na buňku->copy->přejdi zpět na Přehled->přejdi na buňku->vlož speciálně s nastavením xy->přejdi na list xyz->.....) ale dělal to nějak pomocí pár řádků, které mi umožní si data ukládat do proměnných atd. nejen otrocky fungovat pomocí mého naklikaného makra sad
               
Zeptám se líp. Jde nějak ta část:
           
    Worksheets(prohledavanyList.getName()).Range("B3").Select
    Selection.Copy
   
    Worksheets(list.getName()).Range("B" & radek).Select (kde proměnná ,,radek" je v cyklu inkrementována)           
           
    Selection.PasteSpecial Paste:=xlPasteFormats
    Selection.PasteSpecial Paste:=xlPasteValues   
           
přepsat do Star Basic (pokud správně rozumím, že je to odnož basicu pro OpenOffice). Nikde jsem moc nenašel návod jak se dá pomocí vlastního kódu spaciální vkládání dat aniž bych se vyhnul již zmíněného kodu z Excelu.
             
Navíc furt mě trápí, jak je možné, že to při druhém zkompilování kódu funguje bezchybně a je ta chyba pouze při prvním spuštění makra. (makro mám uložené přímo v daném dokumentu a je navázáno jako Event po kliknutí na tlačítko).
             
Děkuji za případné doplnění odpovědi.

Offline

#6 5. 8. 2016 13:15:24

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Potvrďte mi co chcete přepisovat :

     Uvedý kód dělá toto :
---------------------------------------------------------------------------
Worksheets(prohledavanyList.getName()).Range("B3").Select
Selection.Copy

     Vybere se buňka B3 a zkopíruje se do paměti.
---------------------------------------------------------------------------
Worksheets(list.getName()).Range("B" & radek).Select (kde proměnná ,,radek" je v cyklu inkrementována)          

     Zde se vybírá cílová buňka v jiném listu, stejném sloupci, ale jiném řádku nežli měl ten zdrojový. - To je pravděpodobně ten problém, který potřebujete řešit.

---------------------------------------------------------------------------           
Selection.PasteSpecial Paste:=xlPasteFormats
     Zde se vloží vzorec kopírovaný ze zdroje.
---------------------------------------------------------------------------
Selection.PasteSpecial Paste:=xlPasteValues
     Zde se vložený vzorec znovu vloží, ale již jen jako text, nebo čísla.
---------------------------------------------------------------------------
     Možná spolu ty poslední souvisí nepřímo - buď a nebo (zatím předpokládám, že jdou za sebou jak popisuji výše. Právě tohle by asi mohla být další potřeba. Přes to mi to připadá nějaké nedotažené, respektive nepopsané zcela.
     Viděl bych to na makro spouštěné klávesovou zkratkou (samozřejmě je možné tlačítko, ... cokoliv, ale zkratka je nejefektivnější) které načte vybraný úsek a ten vloží do jiného listu jako vzorec. (Ten může odkazovat například na externí dokumenty, do sítě, a něco udělá stejně, nebo přepočítá podle parametrů ze sloupce - nejspíš A. Typicky makro musí zjistit samo jaká buňka ve druhém listu - sloupec B se musí vyplnit. Tedy najít poslední zápis a za něj vložit kopírovaný vzorec.


     Takže funkce provede operace "bez skákání" které dělá nahrávané makro (to vadí při návratu do listu který kopírujeme). Proto uživatel skáče z buňky do buňky zdrojového listu(sešitu) a když chce kopírovat stiskne klávesovou zkratku a o nic víc se nestará.



     Něco podobného dělám dost často a bylo by to rychle. Mám totiž prakticky vše hotové jen musím něco málo upravit - spíš smazat nežli dopisovat a je hotovo. Jestli je to jinak napište jak.


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 5. 8. 2016 13:25:31

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

Selection.PasteSpecial Paste:=xlPasteFormats
     Zde se vloží formátování zdrojového textu (třeba pokud tam někdo napíše každé písmenko v jiné barvě, tak aby se to překopírovalo)
     
Prakticky mi hlavně jde o to, aby to zachovalo formátování toho textu (není to můj výmysl byl na to přímo požadavek z vyšších míst)
     
list.getCellRangeByName("B" & radek).string = prohledavanyList.getCellRangeByName("B3").string & Chr(13)
     
Takto jsem to dělal dřív, ale to bohužel nezachovalo formátování, protože jsem vytahoval pouze řetězec znaků.
     
Jestli existuje nějaké lepší řešení, jak překopírovat buňky a zachovat formát rád se ho naučím smile
     
Děkuji

Offline

#8 5. 8. 2016 13:37:02

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Takže nejde o vícenásobné operace přepisu? A jde jen o barvu písma?


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 5. 8. 2016 13:39:11

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

A abych upřesnil smysl toho všeho.
     
Prakticky je to něco jako malá databáze. Každý list představuje jednu osobu, která obsahuje tabulku s firmami a první list slouží jako list na zobrazování výsledků. Mám tu dropdownlist na výběr nějaké firmy a pak po kliknutí na tlačítko ,,vytvořit přehled" se vytvoří nová tabulka, která doplní všechny údaje o osobně (jméno, datum nar.....), ve které se vyskytuje záznam o dané firmě, do tabulky. Ty údaje těch osob se rozlišují barevně podle potřeb a je potřeba je ve výsledné tabulce mít naformátované.

Offline

#10 5. 8. 2016 13:59:12

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Mrkněte jestli je to ono :

Sub Kopiruji
'--------------------------------------------------------------Načtení zdrojové buňky
Dim obsah 
Dim barva
Dim pismo
oCellZdroj = ThisComponent.CurrentController.getSelection() 
With oCellZdroj.RangeAddress 
SH = .Sheet 
SC = .StartColumn 
SR = .StartRow
End With 
oSheet = ThisComponent.Sheets(SH) 
oCellZdroj = oSheet.GetCellbyPosition(SC,SR)
obsah = oCellZdroj.string
'barva = oCellZdroj.CellBackColor 'barva pozadí buňky
pismo = oCellZdroj.CharColor
'--------------------------------------------------------------Úprava cílové buňky
Dim oSheet1
Dim oDoc
oDoc = ThisComponent
oSheet1 = oDoc.getSheets().getByName("List3") 
oSheet1.getCellRangeByName("B3").String = obsah
oSheet1.getCellRangeByName("B3").CharColor = pismo
End Sub

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 5. 8. 2016 14:02:16

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

Děkuji jdu to zkusit přepsat do mého makra.
     
A jak se řeší, jestli je písmo tučné nebo kurzíva atd.?

Offline

#12 5. 8. 2016 14:14:21

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

Skvělé funguje to! smile) i ten bold jsem našel
   
https://www.openoffice.org/api/docs/com … rties.html
   
Ještě jednou děkuji moc! smile

Offline

#13 5. 8. 2016 14:16:43

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

Re: Worksheets().Range() bug? - VYŘEŠENO

To tam dopíšu až budete vědět jestli to funguje. Je to jenom jeden řádek podobný těm dvěma (třem) co tam jsou, jenom nevím jestli umí rozlišit stupně "bold" - je jich víc. Doufám, že to máte uloženo jako ODT.


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

#14 5. 8. 2016 14:27:48

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

sub copySpecial(col as Integer, row as Integer, destination as String, firstList as Object, secondList as Object) 
	Dim content 
	Dim color
	Dim weight
	
	oCellZdroj = ThisComponent.CurrentController.getSelection() 
	
	With oCellZdroj.RangeAddress 
		SC = col
		SR = row
	End With 

	oCellZdroj = firstList.GetCellbyPosition(SC,SR)
	content = oCellZdroj.string
	color = oCellZdroj.CharColor
	weight = oCellZdroj.CharWeight

	secondList.getCellRangeByName(destination).String = content
	secondList.getCellRangeByName(destination).CharColor = color
	secondList.getCellRangeByName(destination).CharWeight = weight
end sub

Call copySpecial(1, 2, "B" & radek, prohledavanyList, list) 'mé volání bude vypadat takto

Asi mi to bude stačit takto smile děkuji moc

Editoval MrSawyer (5. 8. 2016 14:30:08)

Offline

#15 5. 8. 2016 14:40:31

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

Tak vyskytl se takový menší problém, ale nevím zda vůbec lze vyřešit... Ono to sice kopíruje formátování textu, ale pouze nějaký celkový formát. Tzn. Pokud je tam dlouhé souvětí a tam někdo vyznačí tučně jedno slovo, tak se to překopíruje celé tučně. sad
   
Asi to nelze nějak obejít?

Offline

#16 5. 8. 2016 14:46:56

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Ano zde vidím že to má nějaký lepší scénář. A na ten bold se musí maličko jinak nežli jsem si myslel.
Musíme se dotázat zda je bold a když ano tak ho tam dát. Mělo by fungovat toto:

Sub kopiruji_2
Dim obsah 
Dim barva
Dim pismo
Dim tluste
oCellZdroj = ThisComponent.CurrentController.getSelection() 
With oCellZdroj.RangeAddress 
SH = .Sheet 
SC = .StartColumn 
SR = .StartRow
End With 
oSheet = ThisComponent.Sheets(SH) 
oCellZdroj = oSheet.GetCellbyPosition(SC,SR)
obsah = oCellZdroj.string
'barva = oCellZdroj.CellBackColor 'barva pozadí buňky
pismo = oCellZdroj.CharColor
'--------------------------------------------------------------Úprava cílové buňky
Dim oSheet1
Dim oDoc
oDoc = ThisComponent
oSheet1 = oDoc.getSheets().getByName("List3") 
oSheet1.getCellRangeByName("B3").String = obsah
oSheet1.getCellRangeByName("B3").CharColor = pismo
IF oCellZdroj.CharWeight = com.sun.star.awt.FontWeight.BOLD Then
oSheet1.getCellRangeByName("B3").CharWeight = com.sun.star.awt.FontWeight.BOLD
End If
End Sub

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

#17 5. 8. 2016 14:51:29

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

I bez podmínky mi to fungovalo, ale nelze nějak zařídit, aby se dalo zvýraznit pouze jedno slovo z celé zdrojové buňky?

Offline

#18 5. 8. 2016 15:14:01

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Ten problém s částí textu v jiném formátu by mohl jít řešit pomocí cyklu nad řetězcem a detekcí jiného formátu. (Těch formátů je docela dost mimo BOLD také ITALIC (kurzíva) typ fontu zarovnání - horizontálně a vertikálně, podtržení a nadtržení tloušťky čar, tečky, šrafování, barvy s podobně vícenásobné a v kombinaci.
     Vidím, že byste to mohl zvládnout :
Dim sVar, sVal as string
Dim obsah
Dim barva, barva1
Dim pismo, pismo1
Dim tluste, tluste1
vykopírovat text bez formátů = Text1
For i = 1 To LEN(string z buňky = Text)
Text = MID(text zdroje,i,1)
For j = 1 To 3 (3 druhy formátu)
Select Case j
Case 1
dotaz na barva ve zdroji
barva1 = barva
Case 2
dotaz na pismo ve zdroji
pismo1 = barva
Case 3
zkopírovat dotaz na tlusty
End Select
Text1 = MID(text cíle,i,1)
barva1 = barva
pismo1 = pismo
tlustý1 = tlusty
Next j
next i
     Tedy já to píšu z hlavy takže to není testované. Vím ale, že se musí každý znak extra formátovat. Například ve Writer by to mělo jít snadněji. Takže princip je zkopírování prostého textu do cílové buňky. Následně naformátovat znak po znaku. Pochybuji že cesta v Calcu vede jinudy, leda zase vše zkopírovat a vložit druhou kopii jako text a čísla.


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

#19 5. 8. 2016 15:19:36

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

Dobře děkuji moc, zkusím to tedy ten cyklus vytvořit, ale mám strach o časovou složitost... Jak se tam objeví více než 200 záznamů a každý bude mít 100 slov. Už teď to tvoření tabulky trvá sekundu a to tam mám zatím jen 15 listů.
     
Ale děkuji moc pak sem dám případné řešení.

Offline

#20 5. 8. 2016 15:47:08

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Nejprve otestujte kopírování schránkou - okopne vše, ale zatím jsem nepřišel jak z toho udělat text aby byl formát zachovaný. To sice nějak půjde ale nejspíš je cestou nahrané makro kopírovat - vložit jen text a čísla.

Sub Kopiruji_3
Sheets = ThisComponent.getSheets()
oCellZdroj = ThisComponent.CurrentController.getSelection() 
With oCellZdroj.RangeAddress 
SH = .Sheet 
SC = .StartColumn 
SR = .StartRow
End With 
'-----------------------------------------------------Kopírování obsahu schránkou
Doc = thisComponent
zkopiruj = doc.Sheets(SH).getCellRangeByName("B3") 'zdroj
doc.CurrentController.select(zkopiruj)
obsah = doc.CurrentController.getTransferable()
'-----------------------------------------------------Vložení schránky
vloz = doc.Sheets(0).getCellRangeByName("B3") 'cíl
doc.CurrentController.select(vloz)
doc.CurrentController.insertTransferable(obsah)
End Sub

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

#21 5. 8. 2016 16:00:57

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Teda já jsem se unáhlil. Zapoměl jsem udělat návrat. Takže takhle :

Global SH, SC, SR as Long 'Deklarace na začátku listu - zůstávají v paměti do vyplnutí Calcu.
Sub Kopiruji_4
oCellZdroj = ThisComponent.CurrentController.getSelection() 
With oCellZdroj.RangeAddress 
SH = .Sheet 
SC = .StartColumn 
SR = .StartRow
End With 
'-----------------------------------------------------Kopírování obsahu schránkou
Doc = thisComponent
zkopiruj = doc.Sheets(SH).getCellRangeByName("B3") 'zdroj
doc.CurrentController.select(zkopiruj)
obsah = doc.CurrentController.getTransferable()
'-----------------------------------------------------Vložení schránky
vloz = doc.Sheets(0).getCellRangeByName("B3") 'cíl
doc.CurrentController.select(vloz)
doc.CurrentController.insertTransferable(obsah)

vratse = doc.Sheets(SH).getCellRangeByName("B3") 'návrat na zdroj
doc.CurrentController.select(vratse)
End Sub

     Tohle makro to umí dost rychle. Jde tedy jen o to jak rychle ho budete krmit. Pokud jsou kopírované buňky předem dány jako konkrétní cíl, tak to lze udělat cyklem, respektive vyhledáváním s nahrazováním. Vytvoříte například tabulku předem jako vzor. Při prvním kopírování se nejprve zduplikuje korpus tabulky a tím se zjistí místo dalšího vložení. Nyní teprve můžeme vložit do původního vzoru kopírovanou buňku na správné místo a makro zuůstane dík proměnným deklarovaným jako Global připravené ke vložení dalšího korpusu a kopírovaného taxtu do 2. tabulky.

Editoval neutr (5. 8. 2016 16:12:32)


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

#22 5. 8. 2016 16:30:27

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

hned to vyzkouším smile Ano mám předpřipravenou šablonu a kopíruji jen data. A dělám to samozřejmě v cyklu smile Vámi přidaný kód kopíruje i formátování?

Offline

#23 5. 8. 2016 17:04:51

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

Re: Worksheets().Range() bug? - VYŘEŠENO

Ano kopíruje to vše. Je to kopírování schránkou které original skáče podobně jako nahrané makro, ale tím že můžeme zaznamenat původní buňku tak se na ní můžeme vrátit. (U nahraných maker - UNO - je návrat na původní pozici velice obtížný - musela by se stejně načíst adresa buňky ale jiným makrem). Když toho nebude moc tak ten skok ani vidět nebude. Jde to ale ještě eliminovat vypnutím obnovování obrazovky - což je značné urychlení maker obecně - cca o 10%, ale záleží vlastně na obrazovce monitoru o kolik se to zrychlí.


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

#24 5. 8. 2016 17:05:55

MrSawyer
Člen
Registrace: 4. 8. 2016
Příspěvků: 13

Re: Worksheets().Range() bug? - VYŘEŠENO

Super funguje to! smile už se tím nemusíte zabývat smile Mnohokrát děkuji!
     
Vyřešil jsem to kombinací kódu, který jste mi poradil + pro buňku u které je důležité formátovat každé slovo zvlášť jsem si nahrál a upravil podle svých potřeb makro, takže to na rychlosti nelze poznat. smile

Offline

Zápatí