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