fredag den 21. oktober 2016

Datoer i Calc med makroer

I makroen hvor vi importerede CSV-filen ved at indlæse linje for linje, anvendte vi the_cell.Value = [datoværdi]. Lad os kige lidt mere på, hvordan datoer håndteres i LibreOffice i makroer.

Vi skal se dato-format problemet i to perspektiver:
1) Datoformatet i variable i makroen
2) Datoen, når den indsættes i eller læses fra en celle.

Det er vigtigt at skelne tydeligt mellem de to perspektiver, da resultatet ellers kan vise sig overraskende (forkert).

Denne artikel omhandler andet punkt, nemlig håndtering af datoer i regnearkets celler.

I eksemplet importerede vi datoen fra en CSV-fil, og derfor var udgangspuntket en tekststreng, som vi så behandlerede således:
t= split(s, "-", 3)
s=DateSerial(t(2), t(1), t(0))


Og vi indsatte så resultatet i cellen sådan:
my_cell.String=s

Det betyder at resultatet er en tekststreng (.String).

Vi burde have gjort det anderledes, nemlig med
my_cell.Value=s
Problemet er dog at resultatet vises i regnearket som datoværdier, f.eks. 42659

Det håndterer vi ved at formatere cellen således:
my_cell.Value=s
my_cell.NumberFormat=36   


Tallet .NumberFormat=36 viser datoen som 09-10-2016, hvilket er præcist som ønsket. Tallet 36 fandt jeg frem til ved at formatere en celle manuelt, og så aflæse tallet
Print my_cell.NumberFormat

Her er en makro som demonstrerer det meste:

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

Sub Main
Dim my_date As Date

my_doc = ThisComponent
my_sheets = my_doc.Sheets
antal=my_sheets.count

If NOT my_sheets.hasbyName("Dato") Then

my_sheets.insertNewByName("Dato", antal)

End If

the_sheet = my_sheets.getByName("Dato")
the_sheet.TabColor= RGB(0, 0, 100)

rem --------------------
my_date = DateValue("20 Jan 2016")
my_cell = the_sheet.getCellbyPosition(1,1)
my_cell.Value = my_date
my_cell.NumberFormat=36   

Print my_cell.Value
Print CDate(my_cell.Value)
Print IsDate(my_cell.Value)

End Sub