Macro's in OpenOffice.org Ynte Jan Kuindersma (BIRD Automation) Nationale Officedag Ede - Sessie B2 6 maart 2008 1 van 22
Doel Kennismaken met macro's en OO Basic Laten zien dat vrijwel alles wat in MS Office kan qua programmeren ook in OpenOffice kan 2 van 22
Vergelijking met MS Office Er wordt ook gewerkt met sjablonen die code en dialoogvensters kunnen bevatten (werkgroepsjablonen) Je kunt eigen addon's maken die in alle documenten werken Je kunt ook eigen werkbalken en menu's maken Het is wel lastiger Geen intellisense meer objecten, fragmentarischer Code wordt in ieder document opgeslagen 3 van 22
Gemeente Heerenveen VBA-code Huisstijl opnieuw gemaakt Addon-on nagemaakt 4 van 22
Programmeertalen Voor macro's binnen OpenOffice Javascript Python Beanshell OpenOffice Basic Dit wordt gebruikt tijdens deze sessie Ergens tussen Wordbasic en VisualBasic for Applications in Van buiten af Iedere willekeurige taal Met name Java, maar Visual Basic of Delphi kan ook 5 van 22
Macro opnemen - I Eerst handeling opnemen, dan pas macro naam geven Je kunt macro opslaan in Document = documentgebonden Mijn Macro's = gebruiker gebonden OpenOffice Macro's = computer gebonden Uitvoeren via Extra -> Macro uitvoeren Beheren, aanpassen en testen Extra -> Macro's beheren -> OpenOffice.org Basic Alt-F11, F5, F8, F9 6 van 22
Macro opnemen - II sub Main 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 args1(0).name = "Text" args1(0).value = "ynte jan kuindersma" dispatcher.executedispatch(document, ".uno:inserttext", "", 0, args1()) dispatcher.executedispatch(document, ".uno:insertpara", "", 0, Array()) dim args3(0) as new com.sun.star.beans.propertyvalue args3(0).name = "Text" args3(0).value = "bird automation" dispatcher.executedispatch(document, ".uno:inserttext", "", 0, args3()) end sub 7 van 22
Code zelf schrijven Invoegen en hernoemen modules Invoegen procedures Alleen de bovenste kan worden gestart Voorbeelden Msgbox Inputbox Werken met variabelen For i = 1 to 3 - Next 8 van 22
Briefsjabloon - demo Nieuw sjabloon met bookmarks Dialoogvenster met tekstvakken Code om dialoog te tonen Code om gegevens uit het dialoogvenster in brief te zetten en venster te sluiten (Ok en Cancel knoppen) Dialoog tonen bij openen van document 9 van 22
De brief zelf Opslaan als OpenDocument Text sjabloon (Bestand -> opslaan als) Invoegen -> Bladwijzer bmkaan en bmkonderwerp 10 van 22
De code achter de brief - I Alt-F11 om naar editor te gaan Nieuwe codemodule toevoegen of in bibliotheek Standard gebruiken Toevoegen locale kopie van LoadDialogs() functie uit globale bibliotheek Tools (voor de zekerheid) Dialoogvenster dlgbrief maken 11 van 22
Dialoogvenster maken Maken dialoogvenster (Rechts klikken op tabblad -> invoegen BASIC-dialog) 2 labels 2 tekstvakken (bmkaan, bmkonderwerp) Commandknoppen (cmdok en cmdannuleren) Rechts klikken op control voor instellen eigenschappen Naam dialoogvenster dlgbrief 12 van 22
Dialoogvenster - II 13 van 22
De code achter de brief - II Module variable dim olibdlg as object Procedure Main voor tonen van dialoogvenster Sub Main olibdlg = LoadDialog("Standard", "dlgbrief") olibdlg.execute() End Sub 14 van 22
De code achter de brief - III Klik-procedure achter OK-knop Variant 1 Koppelen aan knop via Eigenschappen -> Tabblad Gebeurtenissen -> Bij het oproepen Bookmarks één voor één vullen private sub cmdok_click dim textbox as object textbox =olibdlg.getmodel.getbyname("bmkaan") odok = ThisComponent obm = odok.getbookmarks().getbyname("bmkaan") obm.anchor.string = textbox.text REM Etc. etc. olibdlg.endexecute() End sub 15 van 22
De code achter de brief - III Klik-procedure achter OK-knop Variant 2 Bookmarks één voor één vullen met functie private sub cmdok_click dim textbox as object textbox =olibdlg.getmodel.getbyname("bmkaan") SetFieldResult("bmkAan", textbox.text) REM Etc. etc. olibdlg.endexecute() End sub private function SetFieldResult(strName, strcontent) odok = ThisComponent obm = odok.getbookmarks().getbyname(strname) obm.anchor.string = strcontent end function 16 van 22
De code achter de brief - IV Klik-procedure achter OK-knop Variant 3 Bookmarks één voor één vullen met loop private sub cmdok_click odok = ThisComponent obms = odok.getbookmarks() on error resume next for i = 0 to obms.count() - 1 obm = obms.getbyindex(i) textbox = olibdlg.getmodel.getbyname(obm.name) obm.anchor.string = textbox.text next i on error goto 0 olibdlg.endexecute() End sub 17 van 22
De code achter de brief - V Annuleren knop Private Sub cmdannuleren_click() olibdlg.endexecute() End Sub Koppelen aan knop via Eigenschappen -> Tabblad Gebeurtenissen -> Bij het oproepen 18 van 22
Dialoog tonen bij nieuw document Code voor het tonen van dialoogvenster koppelen aan maken nieuw document In Writer: Extra -> Aanpassen - > Tabblad Gebeurtenissen - > Document maken - > knop Macro -> Macro kiezen. 19 van 22
Dialoog tonen bij nieuw document 20 van 22
Knop op knoppenbalk Code in algemene bibliotheek of pakket Private Sub Briefede() odoc = StarDesktop.loadComponentFromURL( ConvertToURL("file:///C:/demo/briefede.ott"), "_blank", 0,_ Array(MakePropertyValue("MacroExecutionMode", com.sun.star.document.macroexecmode.always_exe CUTE_NO_WARN))) End Sub Code koppelen aan werkbalk via: Extra -> Aanpassen -> Werkbalken -> Toevoegen 21 van 22
Naslag Macro help http://www.oooforum.org http://www.ooomacros.org/ Uno-documentatie / dispatcher http://www.openshortcut.org/ooo/function-uno.php Andrew Pitonyak's Macro Document (300 pagina's): http://www.pitonyak.org/oo.php Downloaden Open Office: http://nl.openoffice.org Website converteren VBA naar Calc-basic: http://www.business-spreadsheets.com/vba2oo.asp 22 van 22