LibreOffice Basic - Inleiding
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.
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
enCell_dest
zijn cel-objectencopyRange
heeft van het cell_org-object de .RangeAddress-eigenschap nodigcopyRange
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
- 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
- http://www.pitonyak.org/oo.php
- https://documentation.libreoffice.org/assets/Uploads/Documentation/en/GS5.1/HTML/GS5113-GettingStartedWithMacros.html
Debugging
- http://www.debugpoint.com/libreoffice-basic-macro-tutorial-index/ - Hoopvol
- https://wiki.documentfoundation.org/Development/How_to_debug - Geen Immediate Windows zoals in VBA
Code
- LibreOffice 3.4 Basic Programmer's Guide, p. 106 [1]
- http://openoffice3.web.fc2.com/OOoBasic_Calc.html#OOoCCA01a - Diverse voorbeelden. Ook goed voor je Japans
- http://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangeMovement.html#copyRange - XCellRangeMovement API-calls
- https://www.prahladyeri.com/blog/2016/02/ten-libreoffice-macro-recipes.html
Copy & paste cell ranges
- https://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/XCellRangeData.html - getDataArray & setDataArray
- https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Data_Array
- https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Cell_Ranges
- http://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/SheetCellRange.html
- https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=33756 - copyRange, voorbeeld-code
- https://forum.openoffice.org/en/forum/viewtopic.php?f=25&t=16413