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