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

#1 12. 5. 2011 06:46:34

Gooorila
Člen
Registrace: 4. 10. 2009
Příspěvků: 48

Přebírání hodnot form. prvků z pův. listu při kopír. - VYŘEŠENO MAKRO

Řeším situaci, kdy mám vytvořen formulář v OO Calc, kde jsou prvky jako checkbutton a podobně. Zaškrtáním příslušných voleb si vytvořím list ke konkrétní položce zakázky a v případě, kdy má zakázka více položek (prakticky téměř vždy), kopíruji list s formulářem. Bohužel, narazil jsem na problém, kdy po nakopírování si berou prvky formuláře hodnoty z původního, prvního listu. V excelu jsem tento problém neměl a nenapadlo mě nic jiného, než si vytvořit šablonu již s několika stránkami dopředu (což je nesmysl, položek bývá někdy i několik desítek a samozřejmě, jakákoli úprava vzorce by znamenala měnit to po jednom), nebo ukládat každou položku zvlášť (což je také nesmysl kvůli následné práci a tisku). Nejde to nějak elegantně vyřešit? Děkuji

Offline

#2 27. 7. 2011 12:48:57

Gooorila
Člen
Registrace: 4. 10. 2009
Příspěvků: 48

Re: Přebírání hodnot form. prvků z pův. listu při kopír. - VYŘEŠENO MAKRO

Nikdo neví? Omlouvám se za topování, ale mám s tím docela problém yikes/

Offline

#3 28. 7. 2011 06:48:38

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

Re: Přebírání hodnot form. prvků z pův. listu při kopír. - VYŘEŠENO MAKRO

Popisujete poměrně složitý problém, nikomu se asi nechce ztrácet čas vytvářením nějakého příkladu a hledáním/simulací problému ještě před tím, než ho začne řešit. Můžete sem umístit link na problémový soubor?

Je to originál vytvořený v OOo nebo je původně z Excelu? Pokud z OOo, tak z jaké verze?

Offline

#4 28. 7. 2011 07:47:11

Gooorila
Člen
Registrace: 4. 10. 2009
Příspěvků: 48

Re: Přebírání hodnot form. prvků z pův. listu při kopír. - VYŘEŠENO MAKRO

Děkuji za reakci. Přikládám testovací soubor (vytvořen v OO 3.2.1.)
Soubor obsahuje 1 list, na kterém jsou umístěny dva checkboxy a pole do něhož se vypisuje výsledek dle zaškrtnutí volby (Zaškrtnutím checkboxu "hodnota 1" se v poli A1 zobrazí hodnota "1", zaškrtnutím "hodnota 2" se v poli A1 zobrazí hodnota "2"). V tuto chvíli vše funguje. Udělám-li kopii tohoto listu na "list 2", nebude v tomto novém listu možné s checkboxy procovat, protože v poli "A1" bude zůstávat hodnota z původního "list 1" a naopak, zaškrtnutím jiného checkboxu v "list 1" se změní hodnota v poli "A1" ve všech kopírovaných listech.

V excelu tento problém není, ale excel jsme ve firmě zrušili. Tyto checkboxy používám ve formulářích, které mi dle údajů vytvářejí nářezové listy materiálů, takže prakticky každá zakázka má několik položek a tím pádem několik listů. V tuto chvíli se pokouším obcházet toto omezení rozbalovacím menu (data > kontrola vstupních dat), kde vypisuji možnosti a hodnoty měním dle obsahu buňek. Druhá možnost je nepracovat s jedním sešitem, trvat na checkboxech a ukládat každý soubor zvlášť k jedné položce. Ani jeden způsob mi nevyhovuje, takže hledám , jestli není nějaká možnost dělat to postaru :o).

Za případné rady děkuji.

Testovací soubor: Test.ods

Offline

#5 31. 7. 2011 22:41:37

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

Re: Přebírání hodnot form. prvků z pův. listu při kopír. - VYŘEŠENO MAKRO

Jestli to dobře chápu, pracujete s listem 1 pak ho zkopírujete do listu 2 a pracujete v listu 2 a tak dokola.
A zkoušel jste to obráceně? Zkuste tedy měnit vždy pouze první list a pak jej jako hotový kopírovat do ostatních? Navíc můžete kopírovat i bez vložení formulářových prvků (vložit jako (CTRL SHIFT V) - odznačit objekty).

Co se týká kopírování hodnot formulářových prvků, přes to zřejmě vlak nepojede. Při kopírování těchto prvků se totiž do spojené buňky vkládá označení listů a protože formulářové prvky nejsou součástí listu, ale pracují "nad ním" nemění se jejich hodnota při změně.
Bylo by možné tyto prvky nahradit vhodným dialogem, který by po té vkládal do buněk hodnoty - ovládání je makrem, a šlo by tak zautomatizovat i kopírování do nových listů. Ve výsledném dokumentu, by ale formulářové prvky obsaženy nebyly.


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 2. 8. 2011 20:51:11

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

Re: Přebírání hodnot form. prvků z pův. listu při kopír. - VYŘEŠENO MAKRO

To chování formulářových prvků při kopírování je opravdu hloupé - nejprve je tam link na spojenou buňku jako A1 a po zkopírování listu je v tom nově vytvořeném link na List1.A1, místo aby tam zůstalo A1. Nejde to ani zafixovat pomocí $A$1, vrátí se tam A1. Tudy cesta nevede, dokud tohle chování programátoři neopraví/nezmění.


Budete muset vymyslet nějaké jiné řešení a asi se nevyhnete makrům, třeba jak navrhuje sedlacekdan; makro by po stisknutí tlačítka např. nakopírovalo hodnoty do nového listu.

Offline

#7 4. 8. 2011 19:00:19

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

Re: Přebírání hodnot form. prvků z pův. listu při kopír. - VYŘEŠENO MAKRO

Možné makro zde:

sub kopiruj_bez_objektu


dim document   as object, doc as object, listy as object 
dim dispatcher as object


document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
doc = ThisComponent
listy = doc.sheets()


prvni_list = listy(0) ' list1
nazev = prvni_list.getCellRangeByName("A1") ' podle buňky A1 bude pojmenován nový list


If listy.hasByName(nazev.string) then
 nazev.string = nazev.string & "_" & 1
 novy_list = listy.insertNewByName(nazev.string, listy.count)' pokud již existuje přejmenujeme
ElseIf nazev.string = "" then
 nazev.string = "Nepojmenovaný"
 novy_list = listy.insertNewByName(nazev.string, listy.count) ' není vyplněno A1 - pojmenujeme
Else
novy_list = listy.insertNewByName(nazev.string, listy.count) ' vložíme nový list na poslední pozici
endif


REM podmínky kopírování
dim args4(0) as new com.sun.star.beans.PropertyValue ' na jaký list kopírujeme
args4(0).Name = "Nr"
args4(0).Value = listy.count ' poslední list 
dim args6(0) as new com.sun.star.beans.PropertyValue ' na jakou první buňku budeme vkládat
args6(0).Name = "ToPoint"
args6(0).Value = "$A$1" ' začneme v A1
dim args7(0) as new com.sun.star.beans.PropertyValue ' podmínky kopírování
args7(0).Name = "Flags"
args7(0).Value = "SVDFNT" ' text, čísla, data, vzorce, komentáře a formáty


doc.CurrentController.Select(nazev)
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array()) ' označíme vše
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array()) '  zkopírujeme do schránky
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args4()) ' přejdeme na list
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args6()) ' do určené buňky
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args7()) ' vkládáme 
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args6()) ' skočíme do A1


Msgbox "Byl zkopírován list s názvem " + nazev.string, 0, "Zpráva "


end sub

Makro vytvoří nový list s názvem podle hodnoty v buňce A1, zkopíruje data ze vstupního (prvního) listu a vloží do nově vytvořeného - přitom nekopíruje objekty. Výsledný list je tedy bez formulářových prvků. Snad je dostatečně okomentované a bude k užitku.
;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

#8 26. 8. 2011 22:07:48

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

Re: Přebírání hodnot form. prvků z pův. listu při kopír. - VYŘEŠENO MAKRO

Tak jsem trochu pátral a našel způsob jak ovlivnit formulářové prvky. Bohužel stále přetrvává nemožnost změnit spojenou buňku. Tu bych v tomto případě vůbec nevyužíval a hodnoty předával makrem.


Makro je pro zaškrtávací políčko a pracuje vždy v aktivním listě po změně stavu položky (zaškrtnutí). Makrem určujete hodnotu a umístění. Takže je to nakonec variabilnější než přes spojenou buňku a referenční hodnotu.


Sub zjisti_form_prvek

 
oDoc = ThisComponent  
jmeno_listu = oDoc.CurrentController.getActiveSheet.name ' v právě aktivním listě
list = oDoc.Sheets.getByName(jmeno_listu)
prvky = list.Drawpage.Forms 'zpřístupníme všechny formul.prvky


for i = 0 to prvky.count - 1 
 prvek = prvky.getByIndex(i) ' projdeme prvky po jednom
  if prvek.hasByName("Políčko") then ' pokud je prvek pojmenován Políčko
   objekt = prvek.getByName("Políčko") ' tak s ním budeme pracovat
  endif
next i


volba = objekt.state ' zjistíme hodnotu - zda je vybráno či ne
 
 
if volba = 1 then ' je vybráno - vrací hodnotu 1
 list.getCellByPosition(1,1).string = "VYBRÁNO" ' do buňky B2 zadáme VYBRÁNO
else ' není vybráno - vrací hodnotu 0
 list.getCellByPosition(1,1).string = "NEVYBRÁNO" ' B2 NEVYBRÁNO
end if 
end sub 

Zde vzorový soubor ke stažení a odzkoušení:
Ovládací prvky - soubor


K dalšímu zkoumání doporučuji navštívit:
Working With Forms - BASIC Guide
;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

Zápatí