mandag den 3. oktober 2016

Mere makro i Calc

I sidste måned skrev jeg lidt om makroer i regneark. Det kan du læse mere om her: https://libreofficedk.blogspot.dk/2016/09/programmering-af-makroer.html

I denne artikel vil jeg forsøge at komme lidt videre med makroer i vores regneark. Først skal vi lære lidt grundlæggende regnearksprogrammering.

Først skal vi have fat i vores dokument sådan:
my_doc = ThisComponent

Vi vil gerne vide noget om hvor mange ark der er i dokumentet, og måske også hvad de hedde. Først skal vi have fat i alle ark:
my_sheets = my_doc.Sheets

Hvor mange ark er der i dokumentet?
sheet_count = my_sheets.Count

Vi kan få fat i de enkelte ark på flere måder. Een måde er at tælle os frem, for vi ved jo hvor mange der er. Her tager vi fat i det første ark:
the_sheet = my_doc.Sheets(0)

En anden mulighed er at bruge arknavnet:
the_sheet= my_sheets.getByName("Ark1")

Så langt så godt. Nu vil vi gerne helt ned på celleniveau. Igen er der to måder, nemlig at tælle sig frem (husk at vi altid starter ved 0 når vi tæller, så 0,0 er A1) eller at hente ved hjælp af navnet:
my_cell = the_sheet.getCellByPosition(1,2)
my_cell = the_sheet.getCellRangeByName("Ark1.B3")


Nu har vi fået fat i cellen, men hvad så?
Det første vi gerne vil vide er cellens adresse:
cell_adress = my_cell.AbsoluteName

Hvis vi skal aflæse hvad der står i cellen, bliver det lidt kompliceret. Vi ved nemlig ikke på forhånd, hvad det er for en slags celle. Der er fire forskellige slags:
com.sun.star.table.CellContentType.VALUE   'Talværdi
com.sun.star.table.CellContentType.TEXT    'Tekst
com.sun.star.table.CellContentType.EMPTY    'Tom celle
com.sun.star.table.CellContentType.FORMULA    'Formel


Vi skal bruge en lille select-case krølle:
Select Case my_cell.Type
Case com.sun.star.table.CellContentType.VALUE
cell_value = my_cell.Value
Case com.sun.star.table.CellContentType.TEXT
cell_value = my_cell.String
End Select


På den måde får vi tekst ud, hvis indholdet er tekst, og tal, når indholdet er en talværdi.

Hvad nu hvis vi gerne vil skrive en ny værdi i cellen?
my_cell.Value = 8888

Eller hvis vi vil skrive en tekst i cellen:
my_cell.String = "Hej verden!"

Indtil nu har vi arbejdet med celler, hvor vi kender positionen på forhånd. Vi kan også få at vide hvilken celle der er markeret:
active_cell = my_doc.getCurrentSelection()

Et fungerende eksempel, hvor vi indsætter dags dato som tekst i den markerede celle:
Sub Main
    Today =  Date
    ActiveCell = ThisComponent.getCurrentSelection()
    ActiveCell.String = Today
End Sub


Og hvis du hellere vil have datoen formateret anderledes (her indsættes datoen som en værdi):
Sub DateNow
Dim here As Object
here=ThisComponent.CurrentSelection
here.String(DateValue(Now))
here.NumberFormat=75
End sub


Herunder er der to makroer som samlet demonstrerer det hele:


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

sub Main

my_doc = ThisComponent
my_sheets = my_doc.Sheets
sheet_count = my_sheets.Count

'the_sheet = my_doc.Sheets(0)
the_sheet= my_sheets.getByName("Ark1")

'my_cell = the_sheet.getCellByPosition(1,2)
my_cell = the_sheet.getCellRangeByName("Ark1.B3")

    Print my_cell.String
    Print my_cell.Value
    Print my_cell.AbsoluteName

Select Case my_cell.Type
 Case com.sun.star.table.CellContentType.VALUE
   cell_value = my_cell.Value
 Case com.sun.star.table.CellContentType.TEXT
   cell_value = my_cell.String
End Select

Print cell_value

my_cell.Value = 8888

end sub



sub Test
oActiveCell = ThisComponent.getCurrentSelection()
Print oActiveCell.AbsoluteName
End sub

onsdag den 28. september 2016

LibreOffice bliver seks år

Tænk at det allerede er 6 år siden at LibreOffice så dagens lys.

Der er løbet meget vand i åen og mange versioner er langet over skranken i årenes løb.

Jeg glæder mig allerede til de næste seks år.

Blog (engelsk): https://blog.documentfoundation.org/blog/2016/09/28/happy-6th-birthday-libreoffice/

mandag den 26. september 2016

Programmering af makroer

Rigtig mange har prøvet at lave makroer i f.eks. Excel, og det er også tilsvarende muligt at programmere makroer i LibreOffice.

Makroer hører til et af tre steder:
  1. I LibreOffice (installeret sammen med programmet)
  2. På din pc (installeret af dig selv eller vha. en udvidelse)
  3. I det aktuelle dokument
Du kan finde mere information om de forskellige måder i hjælpen (tryk på F1).

Her vil jeg starte forsigtigt med at beskrive hvordan du kan indsætte en tekstværdi et bestemt sted i dit regneark:

Trin 1: Opret makroen
Åbn Calc og gem dit dokument.
Vælg Funktioner - Makroer - Administrer makroer - LibreOffice Basic

Her kan du i venstre side af vinduet se de tre hovedgrupper: Mine makroer, LibreOffice makroer, dit dokument. Det er netop her du vælger placeringen af din makro. Vælg dit dokument ved at klikke på pilen til venstre. Klik på knappen Opret. Klik OK i dialogen (accepter modulnavnet Module1).

Trin 2: Programmering
Du står nu i den indbyggede makroeditor, hvor du i det store vindue i højre side kan se din makrokode. Lige nu er det forholdsvis tomt. Ret Linjen Sub Main til Sub Hej_Verden. Det betyder bare at subrutinen Main nu hedder Hej_Verden:

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

Sub Hej_Verden

End Sub


Det vi skal kigge på nu er koden som skal tilføjes mellem Sub Hej_Verden og End Sub.

Først skal vi deklarere to vigtige variable:

dim document as object
dim dispatcher as object


Vi går straks videre og putter noget indhold i de to variable:

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


ThisComponent refererer til det aktuelle dokument. Alt hvad du gør i LibreOffice, f.eks type, farve, indsætte, overvåges af en 'controller'. Controlleren sender derefter ændringerne til dokumentvinduet, altså hovedområdet i Calc. Variablen document dækker med andre ord over dokumentet i Calc.

createUnoService opretter en instans af DispatchHelper. Denne service vil hjælpe os med at afsende de opgaver fra makroen til vinduet. Næsten alle LibreOffice makro-opgaver kan udføres ved hjælp af en dispatcher.

Vores formål er at indsætte "Hej verden" i den første celle. Derfor skal vi bruge to egenskaber, nemlig "ToPoint" og "StringName":

args1(0).Name = "ToPoint"
args1(0).Value = "$A$1"


ToPoint er cellen du ønsker at gøre noget med.

args2(0).Name = "StringName"
args2(0).Value = "Hej verden!"


StringName er den tekst du skal indsætte senere.

Disse to parametre skal vi nu bruge en ad gangen, og få LibreOffice til at udføre to handlinger i rækkefølge:

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())


I dette tilfælde indsætter vi en tekststreng "Hej verden" i cellen. Hvis vi ville, kunne vi indsætte en talværdi, f.eks. "12345", som vil blive indsat i cellen. Men hvis cellen er formateret som tal, vil værdien blive omdannet til tallet 12345.

Trin 3: Afprøv
Øverst i din makroeditor kan du eksekvere (udføre) makroen.

Den komplette makro ser sådan ud:

REM  *****  BASIC  *****
sub Hej_Verden

    dim document   as object
    dim dispatcher as object

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

    dim args1(0) as new com.sun.star.beans.PropertyValue
    dim args2(0) as new com.sun.star.beans.PropertyValue

    args1(0).Name = "ToPoint"
    args1(0).Value = "$A$1"
    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

    args2(0).Name = "StringName"
    args2(0).Value = "Hej verden!"
    dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

end sub



LibreOffice vinder Bossie Award


Hvert år vælger InfoWorlds redaktører og journalister det bedste open source program i forskellige kategorier. LibreOffice er valgt som bedste open source program i kategorien forretningssoftware, samarbejde og middleware.

Kilde: http://www.infoworld.com/article/3122000/open-source-tools/bossie-awards-2016-the-best-open-source-applications.html#slide2

fredag den 23. september 2016

LibreOffice Calc er det sikre valg for videnskabelige artikler

Medier over hele verden har på det seneste omtalt resultatet af en australsk undersøgelse af en lang række videnskabelige artikler, som påstår at regnearksprogrammer fejlagtigt konverterer f.eks. navne på gener til datoer og flydende tal. Undersøgelsen er baseret på resultater fra Microsoft Excel men det påstås at det også gør sig gældende I LibreOffice Calc.

Før vi dykker ned I problemets detaljer, er det vigtigt at understrege at regneark som program ikke er egnet til at håndtere rådata, men derimod er beregnet til at foretage beregninger. Problemets kerne er i virkeligheden, at regneark anvendes til noget som regneark ikke er beregnet til, og de pågældende brugere i stedet burde anvende et mere passende program.

Data som importeres fra fremmede kilder bør håndteres I et databasesystem (som navnet antyder). Regneark er beregnet til at håndtere tal og foretage matematiske beregninger, og reagerer ofte på tekst ved at forsøge at fortolke teksten som tal.

For at gøre en lang historie kort, så konverterer LibreOffice Calc ikke MARCH1 eller SEPT2 til datoer, og det hverken på engelsk eller dansk. Uheldigvis påstår den australske undersøgelse at det modsatte gør sig gældende, og frembringer derved usandfærdige oplysninger.

LibreOffice har indtil version 4.2.4 (april 2014) konverteret MARCH1 til dato, men ikke  SEPT2. Fejlen er rettet i version 4.2.5 (juni 2014).

Omvendt konverterer LibreOffice Calc tallet 2310009E13 korrekt til 2.310009E+019 og ikke til 2.31E+13 som det påstås i undersøgelsen. Denne talgenkendelse er ikke bare forventet men påkrævet af et regnearksprogram, når tallet importeres som rådata.

I tilfælde hvor alle data i et datasæt skal betragtes som ren tekst, bør brugeren anvende LibreOffices specielle typografi-funktioner og oprette en skabelon, hvor alle celler på forhånd er formateret som tekst.

Alternativt kan brugeren anvende en af følgende metoder til korrekt import af rådata:
  1. Tilknytte tekstformat til alle anvendte celler
  2. Indsætte alle data som uformateret tekst i stedet for som HTML (eller hvilket format rådata kommer fra), og anvende tekstformat som kolonnetype i importdialogen.
  3. Anvende et passende dataformat til tabuleret tekst, f.eks. CSV eller TSV, og også her vælge tekstformat som kolonnetype i importdialogen.
Kort fortalt vil LibreOffice Calc, hvis programmet anvendes korrekt, have undgået de fejl som er omtalt i den australske undersøgelse.

tirsdag den 20. september 2016

Konferencen i Brno


Konferencen i Brno er overstået, og denne gang har jeg desværre ikke haft mulighed for at deltage. Jeg kan selvsagt heller ikke referere fra konferencen.

Til gengæld kan du læse alt om konferencen her: http://conference.libreoffice.org/
Du kan se udvalgte billeder her: https://blog.documentfoundation.org/pictures/

Jeg forventer at der kommer video fra alle sessioner inden for de kommende måneder.

mandag den 19. september 2016

Nyt i 5.3: Tabeller

Tabeller i Writer kan formateres på forskellige måder, blandt andet ved at definere kanter, afstande og baggrundsfarve. Det er også muligt at benytte Autoformat.

Det er også muligt at oprette sine egne autoformater, men det er lidt besværligt. F.eks. er det ikke muligt at finpudse enkelte parametre, da et nyt Autofomat altid oprettes ud fra en eksisterende tabel.

Fre version 5.3 bliver det muligt at håndtere tabeller ved hjælp af en ny type typografier; Tabeltypografier.
Vi kan altså se frem til at håndtering af tabellers udseende bliver lettere at arbejde med, og det bliver lettere at lave konsistens udseende af sine tabeller.

LibreOffice 5.3 er planlagt til at blive frigivet i februar 2017.