LibreOffice Basic - Inleiding

Uit De Vliegende Brigade
Versie door Jeroen Strompf (overleg | bijdragen) op 5 nov 2019 om 17:00 (→‎Bronnen)
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

Rondom OpenOffice en LibreOffice, lijken macro's en basic synoniem te zijn. Ik gebruik deze termen door elkaar. Om het nog verwarrender te maken, heb ik het vaak over LibreOffice Basic of LO-Basic. Allemaal één pot nat, ook al gebruik ik de laatste jaren alleen nog LibreOffice. Desalniettemin lijkt de documentatie van OpenOffice vaak beter te zijn - Qua documentatie gebruik ik beiden.

Dit artikel is vermoedelijk begonnen in de tijd van LibreOffice 3. Ik geloof da LibreOffice 6 van de week is uitgekomen. Het kan zijn dat dingen zijn veranderd. Life goes on.

Interface

  • In Microsoft Office-producten, heb je macro's en VBA (Visual Basic for Applications). In LibreOffice heb alleen deze laatste: LibreOffice Basic (LO-Basic), maar het wordt vaak macro's genoemd
  • LO-Basic is te bereiken via Tools » Macros » Organise macros » LibreOffice Basic
  • De shortcut is dezelfde als in Microsoft-producten: ALT-F11
  • Je kunt code opslaan in een geopend document, in een standaard-bibliotheek, of in een nieuwe bibliotheek. In dat laatste geval weet ik niet waar dat opgeslagen wordt
  • Eigen routines kun je vervolgens aanroepen in functies in Calc en vanuit de programmeer-omgeving
  • Als je met code aan de slag gaat, kan het handig zijn om het beveiligingsniveau te verlagen: Tools » Options » Security » Macro security.
ALT-F11: LibreOffice Basic Macros: Macro's vind je op drie locaties: (1) Dit document (2) LibreOffice Macro's (3) Eigen macro's

Line wrapping

Line wrapping gaat op dezelfde manier als in VBA, en kent dus z'n beperkingen.

Simpel voorbeeld

function get_number_of_sheets()
'
' ======================================================
' Line wrapping: <spatie><underscore>
' ======================================================	
'
print ThisComponent. _
		sheets. _
		count

end function

Realistischer

' Dit werkt, maar de underscores maken het er niet mooier op
'
ThisComponent.sheets(0).copyRange _
( _
	Cell_dest.CellAddress, _
	Cell_org.RangeAddress _
)

' Dit ook: Weer: De underscores helpen weinig
'
ThisComponent.sheets(0).copyRange _
( _
 _
	Cell_dest.CellAddress, _
	Cell_org.RangeAddress _
)

' Misschien is dit de beste optie, als ik de input-argumenten graag onder elkaar wil afbeelden:
'
ThisComponent.sheets(0).copyRange( _
	Cell_dest.CellAddress, _
	Cell_org.RangeAddress _
)

Commentaar-regels

De apostrophe (') zorgt voor commentaarregels

Functie-aanroepen

Functies kunnen andere functies aanroepen. Voorbeeld:

function call_another_function()

	call get_number_of_rows()
	call get_number_of_rows()

end function		

Immediate Windows & interactie

  • Er is geen Immediate Windows zoals in VBA
  • Wel kun je functies direct uitvoeren (F5) of via Alt-F11
  • Output gaat naar een dialoogvenster, met het commando print.

API: Copy & paste cell ranges - copyRange

De copyRange-method lijkt de meest voor de hand liggende manier te zijn om een range van cellen te kopiëren - Werkt super!

Voorbeeld: 1 cel kopiëren

Cell_org = ThisComponent.sheets(0).getCellByPosition(0,0)
Cell_dest = ThisComponent.sheets(0).getCellByPosition(0,1)
ThisComponent.sheets(0).copyRange(Cell_dest.CellAddress,Cell_org.RangeAddress)

Wat dit voorbeeld aangeeft tav. de syntaxis van copyRange

copyRange(   destination cell address                         , source cell range address                           )
copyRange(   <cel-object>.CellAddress                         , <cel-object>.RangeAddress                           )
copyRange(   ThisComponent.sheets(0).<cel-object>.CellAddress , ThisComponent.sheets(0).<cel-object>.RangeAddress   )

Wat dit voorbeeld verder aangeeft

  • Cell_org en Cell_dest zijn cel-objecten
  • copyRange heeft van het cell_org-object de .RangeAddress-eigenschap nodig
  • copyRange heeft van het cell_dest-object de .CellAddress-eigenschap nodig

Voorbeeld 2: Range kopiëren

Spreekt voor zich:

function copy_and_paste_copyrange_3()
'
' ===============================================================================================================
' copyRange + Range - Dit is 'm!
' ===============================================================================================================

cell_org=ThisComponent.sheets(0).getCellRangeByPosition(0,0,0,2)
cell_dest=ThisComponent.sheets(0).getCellByPosition(0,3)

ThisComponent.sheets(0).copyRange _
( _
	cell_dest.CellAddress, _
	cell_org.RangeAddress _
)	

end function

API: Copy & paste cell ranges - getDataArray & setDataArray

Kopiëren en plakken van cell ranges kan op verschillende manieren, waaronder met getDataArray en setDataArray:

  • getDataArray en setDatArray zijn allebei methodes van een sheet- of cell-range-object
  • Ze schijnen hier thuis te horen: :: com :: sun :: star :: sheet :: - interface XCellRangeData
  • getDataArray vult een array met de aangegeven waardes, die worden opgeslagen als double of als string.

Voorbeeld

source_array=ThisComponent.Sheets(0).getCellRangeByName("A1:C1").getDataArray()
ThisComponent.Sheets(0).getCellRangeByName("A3:C3").setDataArray(source_array)

getDataArray is hier een methode van sheets.getCellRangeByName:

ThisComponent.Sheets(0).getCellRangeByName("A1:C1")

Dit object bevat behalve de waardes van de cellen, tevens zaken zoals cel-opmaak. Vandaar de getDataArra-methode.

API: Export naar TSV-bestand

Dit werkt prima:

function export_csv()

Dim Propval(1) as New com.sun.star.beans.PropertyValue
Propval(0).Name = "FilterName"
Propval(0).Value = "Text - txt - csv (StarCalc)"
Propval(1).Name = "FilterOptions"
Propval(1).Value ="9,34,0,1,1" ' Eerste & tweede veld zijn ASCII-codes
FileName = "/var/export/calc.tsv"  'Change to whatever file name you want
FileURL = convertToURL(FileName)
ThisComponent.StoreAsURL(FileURL, Propval())

end function

FilterOptions

Deze instellingen worden (deels?) opgeslagen in de FilterOptions-string
  • Eerste getal: Scheidingsteken tussen velden (ASCII-code)
  • Tweede getal: Omsluitingsteken voor tekstvelden (ASCII-code). Op het moment dat tab wordt gebruikt als scheidingsteken, lijkt dit veld niet meer te worden gebruikt
  • Derde getal: ?
  • Vierde getal: ?
  • Vijfde getal: ?

ASCII-codes voor FilterOptions

<tab> -  9
"     - 34 
;     - 59

Zie ook

Bronnen

Algemeen

Debugging

Code

Copy & paste cell ranges