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

#1 15. 5. 2015 14:10:21

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

formátování čísel makrem

Dobrý den

tohle je opsané z "Malých maker", ale nefunguje to:

Dim jazyk as new com.sun.star.lang.Locale
format_cisla = "1 - 00000"
existuje_format = doc.NumberFormats.queryKey(format_cisla, jazyk, false)
if existuje_format = - 1 then ' neexistuje
existuje_format = doc.getNumberFormats().addNew( format_cisla, jazyk)
endif
bunka.NumberFormat = existuje_format          rem na tomhle řádku Basic hlásí "Chyba syntaxe"
prosím o radu, co je špatně

potřeboval bych se naučit naformátovat číslo podle běžné šablony "# ##0,00", která v calcu existuje, domnívám se, že test na existenci a přidání do seznamu formátů je zbytečný.
Děkuju

Offline

#2 15. 5. 2015 14:57:47

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

Re: formátování čísel makrem

nemá být tady true? .NumberFormats.queryKey( format_cisla, jazyk, true )


LibreOffice 6.2.

Offline

#3 15. 5. 2015 15:05:26

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

Re: formátování čísel makrem

Sub NumberFormat()
	Dim oDoc as Object
	Dim oSheet as Object
	Dim NumberFormats As Object
	Dim NumberFormatString As String
	Dim NumberFormatId As Long
	Dim LocalSettings As New com.sun.star.lang.Locale
		oDoc=ThisComponent
		oSheet=oDoc.getSheets().getByName("List1")
		oCell=oSheet.getCellByPosition(1,1)	'B1
		NumberFormats = oDoc.NumberFormats
		NumberFormatString = "#,##0.#"
 		NumberFormatId = NumberFormats.queryKey(NumberFormatString, LocalSettings, True)
		If NumberFormatId = -1 Then
   		  NumberFormatId = NumberFormats.addNew(NumberFormatString, LocalSettings)
		End If
		oCell.NumberFormat = NumberFormatId
		msgbox "šlus jako hotovo - buňka B1 má naformátováno"
End Sub

     Samozřejmě formátů je hodně a tak jsem si dovolil poslat všechny standardní. Sebral jsem to na Japonském serveru a snad jsem to přepsal dobře Japan. Mimochodem nejlepší zdroj maker jaký znám. Jen ty klikyháky kdyby se odnaučili :-(
'F_o_r_m_á_t_y
'číslo
'1)    Standard    = 0
'2)    0            = 1
'3)    0.00        = 2
'4)    #,##0        = 3
'5)    #,##0.00    = 4
'6)    #,###.00    = 5
'procento
'7)    0%            = 10
'8)    0.00%        = 11
'Měna
'9)    [$Kč-405]#,##0;-[$Kč-405]#,##0                    = 101
'10)    [$Kč-405]#,##0.00;-[$Kč-405]#,##0.00        = 103
'11)    [$Kč-405]#,##0;[RED]-[$Kč-405]#,##0            = 103
'12)    [$Kč-405]#,##0.00;[RED]-$Kč-405]#,##0.00    = 104
'13)    [$€-407]#,##0.--;[RED]-[$€-407]#,##0.--        = 105
'14)    #,##0 [$CZK];[RED]-#,##0 [$CZK]                = 110
'15)    Kč#,##0;-Kč#,##0                            = 111
'16)    Kč#,##0.00;-Kč#,##0.00                        = 20
'17)    Kč#,##0;[RED]-Kč#,##0                        = 21
'18)    Kč#,##0.00;[RED]-Kč#,##0.00                    = 22
'19)    #,##0 CCC                                    = 24
'20)    Kč#,##0.--;[RED]-Kč#,##0.--                    = 25
'Datum a čas
'21)    YY/M/D                = 30
'22)    YYYYMMDD(AAAA)        = 38
'23)    YY/MM/DD            = 37
'24)    YYYY/MM/DD            = 36
'25)    YYMD                = 39
'26)    YYYYMD                = 75
'27)    GGGEMD                = 80
'28)    YYYYMD                = 76
'29)    GGGEMD(AAAA)        = 81
'30)    YYMD(AAA)            = 77
'31)    GGGEMD(AAA)        = 31
'32)    YYYYMD(AAA)        = 78
'33)    YYYYMD(AAAA)        = 79
'34)    MM.DD                = 82
'35)    GE.M.D                = 83
'36)    YYYY-MM-DD            = 84
'37)    YY/MM                = 32
'38)    MD                    = 33
'39)    M                    = 34
'40)    YY QQ                = 35
'41)    WW                    = 85
'42)    YY/MM/DD HH:MM        = 50
'43)    YYYY/M/D H:MM        = 51
'44)    H:MM                = 40
'45)    HH:MM:SS            = 41
'46)    AM/PM H:MM            = 42
'47)    AM/PM H:MM:SS        = 43
'48)    [HH]:MM:SS            = 44
'49)    MM:SS.00            = 45
'50)    [HH]:MM:SS.00        = 46
'51)    YY/MM/DD HH:MM        = 50
'52)    YYYY/M/D H:MM        = 51
'Vědecký
'53)    0.00E+000            = 60
'54)    0.00E+00            = 61
'zlomek
'55)    # ?/?                = 70
'56)    # ??/??                = 71
'Logický
'57)    BOOLEAN                = 99
'Text
'58)    @                    = 100


PS : - Formát se zadává také číslem - to je to na pravé straně. Makro pro formát číslem je na tom servru hned pod tím opsaným makrem (jsou tam celkem 3 makra na formát).

Editoval neutr (15. 5. 2015 15:08:28)


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 15. 5. 2015 15:36:04

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: formátování čísel makrem

Holt jednou rozsypali pytel s čajem a vod tý doby to tak maj. Pokusím se rozluštit, kde je v tom prvním makru ze seriálu chyba (naivně se domnívám, že když je to jako tutorial, tak je to odzkoušený...-:) . V hodnotě TRUE/FALSE to nebude, když to hlásí syntax. Možná to bude tím, že v tom seriálu je to dělaný bez úvodních deklarací, takže neználek trochu tápe, co a jak deklarovat, pokud to chce použít, zvláště pokud už jde o trochu "Vyšší dívčí".
každopádně díky
Martin

Offline

#5 15. 5. 2015 15:59:27

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: formátování čísel makrem

proč je toto deklarováno jako LONG? není to vždy v celých číslech?

Dim NumberFormatId As Long

M

Offline

#6 15. 5. 2015 16:14:13

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

Re: formátování čísel makrem

Já nevím přesně o jaký díl jde. Asi bych to i snadno našel. On tam zřejmě místo deklarace buňky deklaruje úsek jako array. Tím naformátuje mnoho buněk naráz. Tady to makro formátuje jedinou buňku ale je možné to spouštět v cyklu For ..Next kde je mezi tím volání NumberFormat(Col,Row). Je to maličko pomalejší nežli úsek naráz ale pro většinu aplikací to stačí. Tipnu si že tak stovku buněk za sekundu nebo i víc. Cyklus vypadá v makru asi takto :
----------------------------------
Sub Cyklus
For i = ColStart To ColEnd
For j = RowStart To RowEnd
NumberFormat(i, j)
Next j
Next i
End Sub
---------------------------------
Makro pak je stejné jen se předělá název a volání buňky vše ostatní zůstává.
Název přepíšeme z NumberFormat() na NumberFormat(ByVal Col as long, ByVal Row as long)) dál už přepíšeme jenom oCell=oSheet.getCellByPosition(Col, Row)

Editoval neutr (15. 5. 2015 16:24:46)


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 15. 5. 2015 16:23:04

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

Re: formátování čísel makrem

Ty deklarace LONG jsou většinou povinné. Jde o to že obsah buňky může být sice až DOUBLE - to se v sešitě udělá samo, ale buňky v sešitě - těch je v jednom sloupci přes milion. Proto jsou všechny deklarace povinně jednotně LONG (obor čísel N).
     Někdy to nemusí být potřeba, ale rozdíl mezi INTEGER < LONG (integer) není velký a výpočty probíhají stejně rychle. Bylo by to poznat jen při velikých objemech výpočtů.

Editoval neutr (15. 5. 2015 16:27:01)


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 15. 5. 2015 19:54:45

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: formátování čísel makrem

Ještě jednou prosím o konzultaci
Pokud to začlením do procedury nebo zadávám masku přímo ve FUNCTION, funguje to. Ale když se pokouším předat formátovací masku jako argument funkci nebo proceduře, křičí na mě a nechce o tom ani slyšet. Nechce to převzít ani jako řetězec z buňky. Možná v tom bude nějaká banální chyba, ale já jí nevidím.

sub ...
    Fondy = thisComponent
    Strana_1 = Fondy.sheets(1)
    Strana_3 = Fondy.sheets(3)
...
...
rem varianta 1
        Dim Num_form as object
    Num_form = Strana_3.getcellbyposition(14,4)
        Num_form.string = "# ##0,0000"
        cell = Strana_1.getcellbyposition(1,1)
        Numer_Format(cell)

rem varianta 2
        Dim Num_form as string
    Num_form = "# ##0,0000"
    cell = Strana_1.getcellbyposition(1,1)
    Numer_Format(cell,Num_form)
end sub           

+ varianta 1
Function Numer_Format(cell)
    Fondy = thisComponent
    Strana_3 = Fondy.sheets(3)
    Dim NumberFormats As Object
    Dim NumberFormatId As Long
        dim NumberFormatString as string
    Dim LocalSettings As New com.sun.star.lang.Locale
        NumberFormatString = Strana_3.getcellbyposition(14,4).string rem předání hodnoty buňkou
          rem oSheet=fondy.getSheets().getByName("List1")
          rem oCell=oSheet.getCellByPosition(1,1)    'B1
        NumberFormats = Fondy.NumberFormats
        NumberFormatId = NumberFormats.queryKey(NumberFormatString,LocalSettings,true)
        If NumberFormatId = -1 Then
           NumberFormatId = NumberFormats.addNew(NumberFormatString,LocalSettings)
        End If
        Cell.NumberFormat = NumberFormatId
        msgbox "šlus jako hotovo - buňka B1 má naformátováno"
End function

+ varianta 2
Function Numer_Format(cell,NumberFormatString) rem předání hodnoty argumentem
    Fondy = thisComponent
    Strana_3 = Fondy.sheets(3)
    Dim NumberFormats As Object
    Dim NumberFormatId As Long
         dim NumberFormatString as string  rem nevím, jestli deklarace není nadbytečná
     Dim LocalSettings As New com.sun.star.lang.Locale
                  rem oSheet=fondy.getSheets().getByName("List1")
          rem oCell=oSheet.getCellByPosition(1,1)    'B1
        NumberFormats = Fondy.NumberFormats
        NumberFormatId = NumberFormats.queryKey(NumberFormatString,LocalSettings,true)
        If NumberFormatId = -1 Then
           NumberFormatId = NumberFormats.addNew(NumberFormatString,LocalSettings) rem zde Basic urputně hlásí "Vyskytla se výjimka Type:com.sun.star.uno.RuntimeExcepcion Mesage:."
        End If
        Cell.NumberFormat = NumberFormatId
        msgbox "šlus jako hotovo - buňka B1 má naformátováno"
End function

Už se tím trápím asi 3 hodiny, ale nemůžu to přelomit. Vzhledem k tomu, že to chci používat na více místech a třeba bych rád měl variabilní masku, uvítal bych to jako funkci nebo samostanou proceduru. Pokud to nepůjde, je varianta formátovat bloky buněk přes nějaký cyklus - ale to už se mi tak nelíbí.
Díky za trpělivost
Martin

Offline

#9 15. 5. 2015 20:34:01

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

Re: formátování čísel makrem

Koukám na to ale vidím špatné předávání parametrů. Předávají se parametry jako proměnné. Já tam vidím předávání objektu (cell) bez ničeho. Když předáváte proměnnou objekt tak tam musí být (Byval Cell as object). Ale ani sémanticky nějak nerozumím proč to předáváte takhle (účel). Mám dojem, že jste chtěl předávat jen formát. Ten by se předával jako string. Například
sVar = "# ##0,0000". Pak voláte fukci Numer_Format(sVar).
Funkce má v názvu Function Numer_Format(ByVal sVar as string)
     Potom je nastavení formátu ve funkci dáno Cell.NumberFormat = sVar
Ale když dáte do deklarace jinou proměnnou nežli do proměnné funkce nic se nestane ale musí to být stejnž typ proměnné. Takže Function Numer_Format(ByVal sStr as string) přečte její volání Numer_Format(sVar).
     Už je večer a tak to nechám na ráno.


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

#10 15. 5. 2015 23:42:07

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: formátování čísel makrem

Myslím, že celý problém je někde úplně jinde
Tahle sekvence nefunguje
        NumberFormatId = NumberFormats.queryKey(NumberFormatString, LocalSettings, True)
        If NumberFormatId = -1 Then
             NumberFormatId = NumberFormats.addNew(NumberFormatString, LocalSettings)
        End If
mělo by to dělat tohle
1 - v prvním řádku zjisti, jestli existuje definovaný formát (NumberFormatId by mělo být nějaké pořadí nebo identifikátor formátu)
2 - v druhém řádku otestuj hodnotu identifikátoru - je-li -1, tedy formát neexistuje, potom ř.3
3 - zapiš formát jako nový a přiděl mu identifikátor

jenže pokud to vylepšíte takto:
NumberFormatId = NumberFormats.queryKey(NumberFormatString, LocalSettings, True)
                 msgbox NumberFormatId
        If NumberFormatId = -1 Then
             NumberFormatId = NumberFormats.addNew(NumberFormatString, LocalSettings)
        End If

zjistíte, že to funguje při prvním spuštění, kdy formát opravdu neexistuje, ovšem při dalším spuštění to spadne, protože hodnota NumberFormatId se v třetím řádku NEZMĚNÍ - je pořád -1 , IF nepřeskočí na větev ELSE (ENDIF) a program se snaží zapsat na totéž místo tentýž formát a zkolabuje. Věřím, že chyba je v třetím řádku
NumberFormatId = NumberFormats.addNew(NumberFormatString, LocalSettings)
ale neumím říct proč a jak by to mělo vypadat.

Ověřil jsem si to tak, že jsem ručně vymazal příslušný formát ze seznamu. Jednou to proběhlo bez chyby, podruhé to zhavarovalo. Dělal jsem to několikrát, výsledek byl pokaždé stejný. Dělat dokazovací video je pakárna, ale jestli mi neuvěříte, tak celý postup natočím - ale odhaduji to alespoň na 15 minut.
Martin

Offline

#11 15. 5. 2015 23:44:49

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: formátování čísel makrem

a ještě jsem eliminoval přenos proměnných mezi procedurami - všechno jsem pro testování nastavil natvrdo, takže ani chybným přenosem hodnot to nemůže být
M

Offline

#12 16. 5. 2015 06:05:28

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

Re: formátování čísel makrem

Tak jsem otevřel comp a vidím co hledáte. Nic jsem ještě netestoval, ale ta podmínka je jasná. Skutečně testuje implicitní hodnotu formátu. Ta je dána jako -1. Pokud tam je implicitní nastavení, tak formát přepíše, pokud ne spadne do chyby. Ve Vašem případě by měla být podmínka postavena asi takto :

If NumberFormatId = 5 Then
Exit Function
Else
NumberFormatId = NumberFormats.addNew(NumberFormatString, LocalSettings)
End If

     Také to jde ošetřit pomocí On Error GoTo, nebo nejprve otestovat NumberFormatId. Mělo by to jít asi takto :
------------------
NumberFormatId = NumberFormats.queryKey(NumberFormatString, LocalSettings, True)
Dim iVar as long
Cell = Sheet.........
iVar = Cell.NumberFormatId
------------------
Takže získáte číslo Vašeho formátu a v případě, že tam už je tak buňku přeskočíte. Pokud tam není tak tam spustíte funkci třeba bez přenářeného parametru.

Editoval neutr (16. 5. 2015 06:09:42)


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

#13 16. 5. 2015 13:47:32

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: formátování čísel makrem

Jo, tímhle směrem jsem už taky uvažoval - ještě jsem našel řešení A. Pytonyaka - předpokládám, že to jméno znáte - http://www.pitonyak.org/oo.php -

5.14.  Create Number Format Style
If you want a particular number format, then you can see if you have it and create it if you do not. For more information on valid formats, see the help contents on topic "number formats; formats". They can be very complex.
Listing 5.38: Create a number format style.
'Author: Andrew Pitonyak
'email:   andrew@pitonyak.org
Function FindCreateNumberFormatStyle (_
  sFormat As String, Optional doc, Optional locale)
  Dim oDoc As Object
  Dim aLocale As New com.sun.star.lang.Locale
  Dim oFormats As Object
  Dim formatNum As Integer
  oDoc = IIf(IsMissing(doc), ThisComponent, doc)
  oFormats = oDoc.getNumberFormats()
  'If you choose to query on types, you need to use the type
  'com.sun.star.util.NumberFormat.DATE
  'I could set the locale from values stored at
  'http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt
  'http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html
  'I use a NULL locale and let it use what ever it likes.
  'First, see if the number format exists
  If ( Not IsMissing(locale)) Then
    aLocale = locale
  End If
  formatNum = oFormats.queryKey (sFormat, aLocale, TRUE)
  MsgBox "Current Format number is" & formatNum
  'If the number format does not exist then add it
  If (formatNum = -1) Then
    formatNum = oFormats.addNew(sFormat, aLocale)
    If (formatNum = -1) Then formatNum = 0 rem - tady řeší problém s implicitní hodnotou
    MsgBox "new Format number is " & formatNum
  End If
  FindCreateNumberFormatStyle = formatNum
End Function

M

Offline

#14 16. 5. 2015 18:23:07

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: formátování čísel makrem

A
Najednou to přestalo bláznit a umoudřilo se to - ani nevím, co jsem vlastně provedl. Několikrát jsem ručně promazal nějaké pro mne nadbytečné formáty v calcu a začalo to chodit.
Tohle je konečná verze -
    Dim NumberFormatId As long
    Dim NumberFormatString As string
    NumberFormatString = "# ##0,0000"
    cell = Strana_1.getcellbyposition(1,1)
    Numer_Format(NumberFormatString,NumberFormatId)
    Cell.NumberFormat = NumberFormatId
end sub           

sub Numer_Format (NumberFormatString,NumberFormatId)
    Fondy = thisComponent
    Dim NumberFormats As Object
    Dim LocalSettings As New com.sun.star.lang.Locale
        NumberFormats = Fondy.getNumberFormats()
        NumberFormatId = Fondy.NumberFormats.queryKey(NumberFormatString,LocalSettings,false)
        If NumberFormatId = -1 Then
            NumberFormatId = NumberFormats.addNew(NumberFormatString,LocalSettings)
        End If
End sub

B
Znovu jsem testoval předávání objektu jako argumentu funkce nebo procedury, dovolí mi to zcela zprostě zapsat buňku do volání procedury. Způsobů jak to předat je určitě víc:
- předat buňku jako celek a string a pracovat buňku funkcí - to jsem volil jako první
- předat parametry (tam string, zpátky formát), zpracovat je a vrátit do hlavní procedury a buňku zpracovat až tam

cell = ...
lumpárna (cell) rem volám funkci

function lumpárna (cell)rem proveď nějakou lumpárnu s buňkou
... lumpárna...
cell.lumpárna = ...
end function

funguje to jako z praku - bude to asi tím, že jsem nevěděl, že to nejde (to je jako s malejma dětma)
Asi vyřešeno - díky
M

Offline

Zápatí