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

#1 11. 1. 2016 22:21:54

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

makro na řazení

ahoj,

mám makro ve tvaru:

REM  *****  BASIC  *****

sub seradit
dim tridpodle(4) as New com.sun.star.util.SortField
dim serad(4) as New com.sun.star.beans.PropertyValue
doc = thisComponent
oblast = doc.sheets(0).getCellRangeByName("A4:U33")
tridpodle(0).Field = 5
tridpodle(0).SortAscending = True
tridpodle(1).Field = 4
tridpodle(1).SortAscending = True
tridpodle(2).Field = 10
tridpodle(2).SortAscending = False
tridpodle(3).Field = 8
tridpodle(3).SortAscending = False
serad(0).Name = "SortFields"
serad(0).Value = tridpodle()
oblast.sort(serad())
end sub

a nefunguje mi řazení podle field 8 - ostatní proběhne ok, 8 nebere -nevíte prosím kde hledat chybu? ps. je to moje první makro v životě, tak jestli je tam nějaká blbost, tak se omlouvam

Offline

#2 11. 1. 2016 23:22:52

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

Re: makro na řazení

Co používáte?

Offline

#3 12. 1. 2016 07:07:04

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

Libre Office 5.0.4.2 - stejně se to chová na windows i linuxu

Offline

#4 12. 1. 2016 08:48:56

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

Re: makro na řazení

dim tridpodle(4) as New com.sun.star.util.SortField
dim serad(4) as New com.sun.star.beans.PropertyValue
----------------------------------------------------
tridpodle(0).Field = 5
tridpodle(0).SortAscending = True
tridpodle(1).Field = 4
tridpodle(1).SortAscending = True
tridpodle(2).Field = 10
tridpodle(2).SortAscending = False
tridpodle(3).Field = 8
tridpodle(3).SortAscending = False - nemá tady být TRUE?
tridpodle(4).Field = Kdepak je tohle
tridpodle(4).SortAscending = True (nebo False?)

-----------------------------------------------------------------
Deklarujete 5 parametrů od 0 do 4 (0,1,2,3,4) a vypisujete jen 4 (0,1,2,3). Takže jste něco špatně pochopil, nebo opsal zřejmě z nahraného makra. Nepotřebné parametry se neuvádí a tím pádem ani nedeklarují ap.


     To je také v tomto případě nejlepší postup pro kontrolu. Nahrajte si to třídění záznamníkem a pak se podívejte na rozdíl. Samozřejmě místo "tridpodle" tam bude arg0 a podobně, ale jinak byste měl najít chybu. Já se domnívám, že si pletete pojem .SortAscending = True(False).
     Pokud je tam TRUE - tak se řadí vzestupně, ale když je tam FALSE tak je to sestupně. Ono totiž neexistuje něco jako výraz .SortDescending = True(False). Takže je pravděpodobné, že to třídí správně :-)
     Ještě někdy vzniká problém s tříděním alfabetickým a numerickým. To ale asi znáte :
numericky setříděno : 1,2,3,4,5,6,7,8,9,10,11,12,
alfabeticky (lexikálně) setříděno : 1,10,11,12,2,3,4,5,6,7,8,9,


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

#5 12. 1. 2016 09:55:53

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

Re: makro na řazení

Co znamená nefunguje řazení? Můžete poslat ukázku dat?

Offline

#6 12. 1. 2016 10:33:16

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

ukázka je tady: http://uloz.to/xzTQ8D1f/tabulka-2017-s-makry-ods heslo je lobo2 (zkusil jsem trochu upravit podle příspěvku výše, ale nic

nefunguje ve smyslu, že seřadí podle prvních tří pravidel, čtvrté ignoruje

Offline

#7 12. 1. 2016 10:35:20

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

pardon - chybí mi tam nějaké tečky - chtěl jsem napsat: (zkusil jsem trochu upravit podle příspěvku výše, ale nic).
Nefunguje ve smyslu, že seřadí podle prvních tří pravidel, čtvrté ignoruje

Offline

#8 12. 1. 2016 11:33:43

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

Re: makro na řazení

LO (5.0.2...) makra nějak blbnou .

Fungovat to začalo až při explicitní deklaraci rozsahu polí.
To nastavení hlavičky není nezbytné, ale nějak mi to chybělo. Obdobně by bylo vhodné nastavit i ostatní atributy - spoléhání na std. nastavení se často nevyplácí.

sub seradit
dim tridpodle(0 to 3) as New com.sun.star.util.SortField
dim serad(0 to 1) as New com.sun.star.beans.PropertyValue
doc = thisComponent
oblast = doc.sheets(0).getCellRangeByName("A4:U13")
tridpodle(0).Field = 5
tridpodle(0).SortAscending = True
tridpodle(1).Field = 4
tridpodle(1).SortAscending = True
tridpodle(2).Field = 10
tridpodle(2).SortAscending = False
tridpodle(3).Field = 8
tridpodle(3).SortAscending = False

serad(0).Name = "SortFields"
serad(0).Value = tridpodle()
serad(1).Name = "ContainsHeader"
serad(1).Value = False
oblast.sort(serad())
end sub

Offline

#9 12. 1. 2016 11:43:00

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

díky moc - nemůžu to teď otestovat, večer na to kouknu.

Offline

#10 12. 1. 2016 17:42:44

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

bohužel - u mě to nefunguje - čtvrtý sloupec to neseřadí - jakou používáš verzi prosím? + jsem někde četl (nemůžu ten odkaz teď najít) že je tohle řazení omezené na 3 sloupce a pak se mají makra řetězit - tak nevím

Offline

#11 12. 1. 2016 18:47:10

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

Re: makro na řazení

Počet podmínek - 3 je dán pro AOO. LibreOffice jich má "neomezeně". To je z manuálního zavolání funkce třídit. Je tam ale dost podmínek a řádků málo. Netroufal bych si tvrdit že to nechodí. Jednoduše nadřazené podmínky asi vyčerpají všechny alternativy a na tu 4. už nic k řezení nezbyde.
     Zadejte si řekněme 300 vzorů s různými hodnotami. Pak máte šanci postavit počet možností tak aby se všechny variace mohli projevit. Vezměte v úvahu, že limitní (konečný) počet je 4^4 (=256) a pak se teprve může něco opakovat.


PS
Můžete to otestovat i menším počtem. Vytvořte třeba 4x stejný řádek, ale ve čtvrtém parametru to změňte. Pak to projeďte makrem. Přiklad
a,b,c,1
a,b,c,6
a,b,c,3
a,b,c,8
Samozřejmě a,b,c zadejte z reálného řádku. Měňte jen poslední parametry.

Editoval neutr (12. 1. 2016 18:55:23)


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

#12 12. 1. 2016 18:57:30

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

zkusil jsem vyplnit další hodnoty a určitě je tam na 4. sloupek něco k řazení. nevím co je špatně. jinak jste měl pravdu - u té 4. podmínky mělo být True, ale ani s ním to neřadí ...

Offline

#13 12. 1. 2016 19:06:36

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

Re: makro na řazení

Otestoval jste ten vzor který jsem uvedl jako PostScriptum? Jakmile totiž zafunguje nadřazená podmínka - tu poslední si můžete naložit :-)
     4. Podmínka zabere skutečně jen u takových případů, které jsou v těch předchozích podmínkách shodné.


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

#14 12. 1. 2016 19:29:16

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

jj, zkusil - fakt se to liší jen ve 4. sloupku. i jsem to nastavil na celá čísla kdyby byl zmatek v zaoukrouhlování ... . jdu hledat dál

Offline

#15 12. 1. 2016 19:38:35

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

Re: makro na řazení

A zkoušel jste to makro nahrát záznamníkem? - Já jsem koukal na to co udělal "lp." a to mi připadalo dobré. Jestli nefunguje makro ze záznamníku pak je to chyba LO.
     Možná byste mohl nainstalovat AOO a otestovat to tam. V LO může něco blbnout. Nevím jestli má na tyto výpočty vliv Open CL (GL). Pokud to máte zapnuté zkuste to vypnout. je to na 3 místech.


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

#16 12. 1. 2016 19:47:48

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

prosím navedte - kde je záznamník? s makry fakt pracuju poprve. ale z logiky tam chybu nevidím - bud je tam nějaká kravina, nebo bug ..

ale ruční filtry fungujou ok - seřadí přesně jak má všechny 4 sloupce a na rovinu - bude to řadit 100 závodníků v X kategoriiích na 20ti boulderech - potřebuju najít něco co bude spolehlivě fungovat (klidně to budu filtrovat ručně), ale potřebuju na to mít spoleh...

Editoval marek-j (12. 1. 2016 19:50:22)

Offline

#17 12. 1. 2016 20:22:58

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

Re: makro na řazení

Makra musíte nejprve povolit :-
1. - NÁSTROJE > MOŽNOSTI > LIBRE OFFICE > POKROČILÉ - zaškrtnout "Povolit záznam maker - omezená funkčnost".
2. - NÁSTROJE > MOŽNOSTI > LIBRE OFFICE > ZABEZPEČENÍ > ZABEZPEČENÍ MAKER
     A) - KARTA ZABEZPEČENÍ > povolte střední
     B) - KARTA DŮVERYHODNÉ ZDROJE > DŮVĚRYHODNÉ UMÍSTĚNÍ - to musíte určit. Nedoporučuji povolit adresář kam stahujete. Spíš si udělejte nejaký extra pro tyto účely.
----------------------------------------------
     Následně raději zrestartujte LO a podívejte se do nabídky :
NÁSTROJE > MAKRA - měla by se zde objevit položka s červeným puntíkem "zaznamenat makro".
     Pak stačí najprve zapnout nahrávání (uvidíte panýlek kterým se záznam vypíná). Zvolte úsek a normálně navolte to ruční třídění jak jste zvyklý. Po setřídění musíte vypnout záznam,
     Pozor musíte správně uložit makro. Nabídne Vám to implicitní název knihovny (Enter) plus mázev makra "Main". Problém je v tom, že byste to měl uložit do maker otevřeného sešitu. Tam to pak musíte najít a spustit. Ono to nabízí "moje makra Standard" - také to bude chodit, ale v sešitě to nebude. Ale tuto orientaci už asi znáte.

Editoval neutr (12. 1. 2016 20:28:17)


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

#18 12. 1. 2016 23:05:05

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

Re: makro na řazení

Ten záznamník vytváří makra pro uno, osobně ho vůbec nepoužívám. Výsledný kód je dost pomalý.

Vyber pole A4:U13, vyber seřadit a podívej se, co je nastaveno. Před a po spuštění makra.
Testoval jsem v LO 5.0.2

ps. problém může být v některých dalších parametrech, které nejsou v makru nastaveny (typ pole např.)

Editoval lp. (12. 1. 2016 23:06:11)

Offline

#19 14. 1. 2016 09:10:57

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

asi nějaká magie ... - když dám ruční řazení a vrátím to pak zpátky, tak to makro začne fungovat ....

Offline

#20 14. 1. 2016 09:16:15

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

tak ověřeno - otevřu dokument - makro nefunguje - dám řadit - data se nějak srovnají - makro začne fungovat ...

Offline

#21 14. 1. 2016 10:00:09

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

Re: makro na řazení

O jakém makru to píšete? Teoreticky by to mohly být 3 různá makra :-
1. To původně Vaše + úprava
2. Makro od "lp."
3. Makro nahrané záznamníkem.
     Makro nahrané záznamníkem bývá funkční a nestkal jsem se s tím, že by po nahrání dělalo něco jiného nežli bylo nahráno. Samozřejmě někdy to není výhodné, ale jindy ano. To je i tento současný případ. I když tam bude 100 řádků, tak jen těžko postřehnete že je relativně "pomalejší". Já bych pro tento případ doporučil nahrané makro.


     Jestli ale máte makro nahrané a stále se vyskytuje Výše popisovaná chyba příspěvku #20, pak bude problém jinde. Upřesněte prosím.


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

#22 14. 1. 2016 10:23:12

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

Re: makro na řazení

Dodatek :
     Možná je podstatou drobnost, kterou Vaše makro, ani makro od "lp." neobsahuje. Jedná se o o příkaz "select", kterou ovšem nahrávané makro obsahuje. U mne to makro od "lp." chodilo i bez toho selectu, ale to co popisujete skutečně vypadá, že u Vás to bude potřebné.
     Problém může být v tom, že reálnou tabulku provozujete na jiném listu nežli je deklarovaný. K tomu stačí abyste měl nějaký list skrytý, nebo dodatečně přejmenovaný, přemístěný ap.
     Když tam bude "select", tříděná oblast bude viditelně vybraná (vymodřená). Pak máte jistoto, že to makro chodí nad správným úsekem. Stačí maličkost a je to jinde nežli si myslíte. LIST NA KTERÉM MAKRO SPOUŠTÍTE MUSÍ BÝT PRVNÍM V POŘADÍ.

Editoval neutr (14. 1. 2016 10:26:39)


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

#23 14. 1. 2016 11:54:46

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

díky moc za vyčerpávající informace - zkusím odpovědět:
zkusil jsem makro 1 a 2 - k nahrání jsem se zatím nedostal, protože jsem "odhalil" to chování které jsem popisoval - jdu to teď zkusit nahrát
příkaz select bude někde vložený v makru?
tabulka má pouze jeden list a řadí se pouze v něm

Offline

#24 14. 1. 2016 11:59:01

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

Re: makro na řazení

Tak nahrávka UNO se chová stejně jako makro. Po načtení souboru a spuštění makra jsou pro třídění aktivní pouze 3 pole.

Doplnil jsem explicitně počet tříděných polí, žádný efekt.

Tak tedy to zkuste po staru (mělo by to fungovat i ve starších verzích):

sub seradit
dim tridpodleI(0 to 0) as New com.sun.star.util.SortField
dim tridpodle(0 to 2) as New com.sun.star.util.SortField
dim serad(0 to 2) as New com.sun.star.beans.PropertyValue

doc = thisComponent
oblast = doc.sheets(0).getCellRangeByName("A4:U13")

tridpodle(0).Field = 8
tridpodle(0).SortAscending = False

tridpodle(0).Field = 5
tridpodle(0).SortAscending = True
tridpodle(1).Field = 4
tridpodle(1).SortAscending = True
tridpodle(2).Field = 10
tridpodle(2).SortAscending = False
'tridpodle(3).Field = 8
'tridpodle(3).SortAscending = true

doc = thisComponent
oblast = doc.sheets(0).getCellRangeByName("A4:U13")

serad(0).Name = "SortFields"
serad(0).Value = tridpodleI()
serad(1).Name = "ContainsHeader"
serad(1).Value = False
serad(2).Name = "MaxFieldCount"
serad(2).Value = 1

oblast.sort(serad())


serad(0).Name = "SortFields"
serad(0).Value = tridpodle()
serad(1).Name = "ContainsHeader"
serad(1).Value = False
serad(2).Name = "MaxFieldCount"
serad(2).Value = 3

oblast.sort(serad())
end sub
sub seraditPuv
dim tridpodle(0 to 3) as New com.sun.star.util.SortField
dim serad(0 to 2) as New com.sun.star.beans.PropertyValue
doc = thisComponent
oblast = doc.sheets(0).getCellRangeByName("A4:U13")
tridpodle(0).Field = 5
tridpodle(0).SortAscending = True
tridpodle(1).Field = 4
tridpodle(1).SortAscending = True
tridpodle(2).Field = 10
tridpodle(2).SortAscending = False
tridpodle(3).Field = 8
tridpodle(3).SortAscending = true

serad(0).Name = "SortFields"
serad(0).Value = tridpodle()
serad(1).Name = "ContainsHeader"
serad(1).Value = False
serad(2).Name = "MaxFieldCount"
serad(2).Value = 4
oblast.sort(serad())
end sub

Řadí podle prvního sloupce (aby bylo lépe vidět)

sub seraditA
dim tridpodle(0) as New com.sun.star.util.SortField
dim serad(0 to 2) as New com.sun.star.beans.PropertyValue
doc = thisComponent
oblast = doc.sheets(0).getCellRangeByName("A4:U13")
tridpodle(0).Field = 0
tridpodle(0).SortAscending = True

serad(0).Name = "SortFields"
serad(0).Value = tridpodle()
serad(1).Name = "ContainsHeader"
serad(1).Value = False
serad(2).Name = "MaxFieldCount"
serad(2).Value = 1
oblast.sort(serad())
end sub

Offline

#25 14. 1. 2016 12:06:54

marek-j
Člen
Registrace: 13. 1. 2014
Příspěvků: 17

Re: makro na řazení

tak nahrané makro funguje stejně jako 1 a 2 - po ručním seřazení běhá, pokud tabulku jen otevřu a změním data, tak ne. dám ručně řadit a začne fungovat

Offline

Zápatí