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