Obwohl MS-Office mit seinen Applikationen Word, Excel, Access, PowerPoint und last but not least Outlook sehr erprobt ist und das integrierte VBA (Visual Basic for Application) intuitiv und leicht zu programmieren ist, ist die Lizenz recht teuer und durch das Cloud auch problematisch im Datenschutz
Dazu gibt es Alternativen, darunter 2 Schwestern: Apache OpenOffice - Official Download LibreOffice Download
Beide sind sehr umfangreich und gleichen sich in fast allen Punkte. Ich habe mich für OpenOffice entschieden. Wieso? Weil ich diesen auf einer Linux-DVD gefunden hatte 😁.
OpenOffice
So viel ich weiss kann alles was man zu OO (OpenOffice) sagt auch für LibreOffice verwenden, ich hab es nicht ausprobiert und glaube das jetzt einfach. Somit sollte alles was ich zu OO sage auch für LibreOffice gelten .... hoffentlich!
Wie MS-Office ist auch OO in Modulen unterteilt.
OpenOffice Name
MS-Office
Beschreibung
OpenOffice Writer
MS-Word
Textverarbeitung
OpenOffice Calc
MS-Excell
Tabellenkalkulation
OpenOffice Base
MS-Access
Datenbank
OpenOffice Impress
MS-PowerPoint
Präsentations Tool
OpenOffice Draw
??
Vektorgrafik erstellen
OpenOffice Math
??
Mathematische Formeln zeichnen
--
MS-Outlook
E-Mail Verwaltung
Ich werde mich hier aber erstmals nur mit OO-Calc abgeben, und da auch nur mit dem Basic (wie VBA nur ekelhafter zu beherrschen)
Vielleicht werde ich mich später mit den anderen möglichen Makrosprachen in OO abgeben, JS und Python interessieren mich...
OpenOffice-Calc
Entweder man startet das Modul direkt mit "scalc.exe" im OO-Programmverzeichnis, oder über das Hauptmodul -> Tabellendokument.
Für die ganz Aufmerksamen: Ich habe das Sprachpaket "Deutsch" geladen, was mögliche Unterschiede zu deiner Version erklärt. (Beispiel in den Formeln)
Ich habe Calc geöffnet und mit dem Namen "Makro-Test.ods" abgespeichert.
Nun interessiert mich aber wie man das OO-Basic nutzt... das verbiergt sich unter:
-> Extra -> Makros -> Makros verwalten -> OpenOffice Basic...
PS: Ich empfehle bei öfteren Basic gebrauch über "Extra" -> "Anpassen..." -> Tab "Symbolleisten" den Basic-Knopf auf die Menüleiste zu legen
OpenOffice-Basic
Was ich hier mache ist Spielerei, eine sehr gute Referenz hat Andrew Pitonyak zusammengestellt und sie wurde von Volker Lenhardt übersetzt und bearbeitet und mit Beiträgen von Andreas Heier und und eigenen ergänzt. Unbedingt lesen!
Die Referenz BASIC-Makros für OpenOffice und LibreOffice findet man überall im Netz, ich biete hier 3 Möglichkeiten an: Seite des Autors Andrew Pitonyak WP-Seite des Nachfolgers von Volker, Andreas Heier OpenOffice.info
So gelangt man zum OpenOffice-Basic-Explorer: Meine Makros: Man kann sein Makro im allgemeinen Teil eröffnen, was ich nur empfehle, wenn man eine sauber programmierte Makro-Funktion hat, die man in vielen Tabellen nutzen kann. Aber solche Funktionen werden meistens schon standardmässig angeboten. OpenOffice Makros: Sammlung der Makros für OpenOffice. Als Spiel kann man da versuchen zu verstehen, was programmiert wurde. Dateinamen "Makro-Test.ods": Da kann man die Sammlung eigener Makros ablegen.
Weiter:
Im OpenOffice-Basic-Explorer klick auf "Neu" danach gibt man einen sinnvollen Namen für das eigene Modul (in meinem Fall "ArbeitsModul") -> OK
... und schon ist man im Makro-Editor wo auch schon die Sub-Routine "Main" auf uns wartet.
Wenige Worte zum Editor:
Neben den üblichen und intuitiv zu bedienenden Elemente und Menüs erkennt man: Editor: Schreibblatt Explorer: Drei unterschiedliche Explorer werden angeboten, wobei ich eigentlich nur das Zahnrad nutze. Starten: Damit kann man den Programmablauf steuern. Entweder Einzelschritt, Modulschritt oder den Programmstart. Beim Klick auf den grünen Pfeil startet OpenOffice-Basic die Subroutine "Main"
Exkurs in die Makrosicherheit
Damit man ein Makro überhaupt starten kann, empfehle ich die "Makro Sicherheit" so einzustellen:
Danach starte OpenOffice neu und beantworte die Sicherheitsfrage positiv
Solltes du trotzdem (beim Starten eines Makros) folgende (oder ähnliche) Warnung erhalten...
... dann hast du etwas falsch gemacht. So überprüfe deine Makro-Sicherheit und schliesse OpenOffice komplett (alle Fenster... zur Not starte das ganze System neu) bevor du OpenOffice wieder startest.
Erste OpenOffice-Basic Subroutine
Schreibe (oder kopiere) den folgenden Text unterhalb von "Sub Main End Sub"
SubZeigeTextMsgBox"Hallo!"End Sub
Danach starte das Makro mit Klick auf dem Starter ... uuund nichts passiert. Wieso?
OpenOffice-Basic (im Gegansatz zu VBA, das fragt, was gestartet werden soll) startet die Subroutine "Main". Darum muss man unsere Routine in Main aufrufen.
Wenn man das Makro wieder startet popt ein Fensterchen mit dem Text "Hallo" auf. Juhuii! ... und wenn nicht: Prüfe deine Eingaben. Gänsefüsschen treten immer paarweise auf (sie begrenzen einen String). Zwar ist Gross-Kleinschreibung nicht relevant, doch ist es besser immer die gleiche schreibweise für das selbe Element zu verwenden. Toi, toi, toi!
OpenOffice-Basic Subroutine mit Parameter
Diese erste Routine hat einfach einen fixen Text ausgegeben... man kann aber auch unterschiedliche Werte der Subroutine übergeben, somit die zweite Subroutine:
SubZeigeDenText(wert)MsgBoxwertEnd Sub
Dann muss der Aufruf in Main eingetragen werden (ich kommentiere die alten Aufrufe aus)
SubMain
' ZeigeText
ZeigeDenText("Heute ist " & Format(date, "DDDD")) ' format(date,"DDDD DD.MM.YYYY") um Format(time, "hh:mm:ss"))
End Sub
Diese Routine zeigt in einem Popup den aktuellen Wochentag.
byRef vs. byVal
Parameter (wenn es Variablen sind) werden in OO-Basic als Referenz "byRef" übergeben, da heisst sie können in der Subroutine verändert werden. Wenn man das nicht will, muss der erwartete Parameter der Routine mit "ByVal" angegeben werden
Ich versuche das mit 2 (fast) gleiche Subroutinen darzustellen.
SubMain
' ZeigeText
' ZeigeDenText("Heute ist " & Format(date, "DDDD")) ' format(date,"DDDD DD.MM.YYYY") um Format(time, "hh:mm:ss"))
Dima as integera = 10msgbox"Startwert von a : " & arechnebyVal(a)
msgbox"byVal, neuer Wert von a : " & arechnebyRef(a)
msgbox"byRef, neuer Wert von a : " & aEnd SubSubrechnebyVal(byValzahl) ' byVal Angabe ist nötig
zahl = Zahl * 2End SubSubrechnebyRef( zahl) ' byRef kann weggelassen werden, da Standard
zahl = Zahl * 2End Sub
1. Popup -> Startwert von a : 10
2. Popup -> byVal, neuer Wert von a : 10 ... Der Wert der mitgegebenen Variable wurde nicht verändert, da "nur" deren Wert der Parameter ist
3. Popup -> byRef, neuer Wert von a : 20 ... Der Wert der mitgegebenen Variable wurde verändert, da der Zeiger auf sie der Parameter ist
Parameter Deklaration mit Datentyp
OpenOffice-Basic verträgt das unterlassen der Deklaration der Variablen ziemlich gut, auch bringt es OpenOffice-Basic fertig Datentypen implizit umzuwandeln "123" einer Integervariable zuzuordnen macht 123 daraus
Trotzdem ist es ratsam sei es die Variablen, wie auch die zu erwartenden Parameter mit Datentypen zu deklarieren. Um dich dazu zu zwingen ist die Anweisung Option Explicit (am Anfang des Skripts plaziert) perfekt
Diese zwei aufrufe in Main ...
rechne(3.54)
rechne(" 87")
... haben unterschiedliche Auswirkung, wenn der erwartete Parameter der Funktion einem Datentyp zugeordnet ist oder nicht.
Mit Deklaration
subrechne(zahlas integer )
msgbox Zahl * 2end sub
1. Ausgabe: 8 (Wandelt und rundet die Floatzahl in ein Integer und berechnet das Resultat)
2. Ausgabe: 174 (Erkennt einen Wert und berechnet das Resultat, wenn keine Zahl erkannt wird,
ist der Wert Null)
Ohne Deklaration
subrechne(zahl)
msgbox Zahl * 2end sub
1. Ausgabe: 7.08 (Berechnet das Resultat mit der Floatzahl)
2. Ausgabe: FEHLER (OpenOffice-Basic kann nicht mit einem String rechnen)
Optionale Parameter
Wie andere Sprachen können auch mit OpenOffice-Basic optionale Parameter verwendet werden, mit dem Haken, dass sie nicht bei der Deklaration initialisiert werden können.
Für das Beispiel passe ich die Subroutine rechne() an
Diese zwei aufrufe in Main
rechne(3.54, 8)
rechne(" 87")
Bitte achte auf die Abfrage IsMissing()
Optionaler Parameter 'freiwillig'
subrechne(zahlas integer, Optional ByVal freiwilligAs integer )
ifIsMissing(freiwillig)Thenfreiwillig = 2 msgbox Zahl * freiwilligend sub
1. Ausgabe: 32 (Da der Parameter 8 mitgegeben wurde wird dieser als Multiplikator genutzt)
2. Ausgabe: 174 (Ohne den zweiten Parameter wird der Defaultmultiplikator '2' genutzt)
OpenOffice-Basic Funktion
Eigentlich ist eine Funktion nichts anderes als eine Subroutine mit Rückgabewert
subMain msgbox BSsub,0 , "BSsub" msgbox BSfunction,0 , "BSfunction"end subsubBSsubas stringBSsub = "Rückgabewert aus der Subroutine"end subfunctionBSfunctionas stringBSfunction = "Rückgabewert aus der Funktion"end function
1. Ausgabe: Rückgabewert aus der Subroutine (Boxtitel: BSsub)
2. Ausgabe: Rückgabewert aus der Funktion (Boxtitel: BSfunction)
Wieso man Funktionen mit Function NAME(PARAMETER) as DATENTYP nutzen sollte statt Sub NAME(PARAMETER) as DATENTYP, entzieht siche meinen Kenntnisse... ich sehe absolut keinen Unterschied... ausser Sub (als Funktion missbraucht) braucht eine Dateitypen-Deklaration während Funktion den Datentyp durch den Rückgabewert selber bestimmt
So habe ich für mich entschieden, alle Routinen, die ich auf dem Datenblatt nutzen will, deklariere ich mit Function und solche, die ich zur Makroprogrammierung nutze mit Sub
Duck.ai hat sich nach langem Chat mit folgener Definition verabschiedet: Nimm Function, weil sie Werte als Schnittstelle liefert; Sub ist für Aktionen gedacht. So bleibt das Verhalten konsistent und der Code ist für Menschen sofort verständlich.
Erste Funktion auf einem Tabellen Blatt
Die oben angegebene Funktion kann (und sollte) auf der Tabelle "genutzt" werden.
Wie jede andere Formel in OO-Calc steht das Gleichzeichen gefolgt von einer Formel (hier nur der Funktionsnamen) und (auch wenn keine Parameter verlangt sind) leere Klammern. Gross-Kleinschrift ist egal, OO-Calc wandelt und nutzt alle Formeln in Grossschrift.
Die Tabelleneingaben stelle ich in einer solchen Tabelle dar und nur in Ausnahmefälle wie oben einen Screenshot
/
A
B
C
D
E
1
="makro-test"
2
3
=BSFUNCTION()
4
5
6
Anzeige
Zelle A1 = makro-test
Zelle B3 = Rückgabewert aus der Funktion
Funktion Ruckwärts (RUECKWAERTS(was,wie))
Ich habe eine kleine Funktion geschrieben, die verschiedene Auswirkungen bei der Benutzung auf dem Tabellenblatt zeigen kann.
Diese Funktion (function rueckwaerts(Text as string, Optional wie as string ) ) dreht einen Text um und gibt ihn je nach Schlüsselwort 'wie' (klein,gross,normal) wieder.
Um Programmabbrüche abzufangen, habe ich auch noch eine Fehlerbehandlung benutzt.
functionrueckwaerts(testoas string, Optionalwieas string )
' Teilt "wie" einen Wert zu, wenn der Parameter fehlt
ifIsMissing(wie)Thenwie = "NORMAL"
' Variablen werden initialisiert
dimlas integerdimcas stringdimtas stringdimias integer
' Schaltet die Fehlerbehandlung ein
on error gotofehler
' Verzweigt das Programm je nach Wert von "wie" (Grossschrift)
Select case ucase(wie)case"GROSS"testo = ucase(testo)case"KLEIN"testo = lcase(testo)case"NORMAL"testo = lcase(testo)case elserueckwaerts = "Zweites Argument '" & wie & "' kann ich nicht verarbeiten"
' Schaltet die Fehlerbehandlung aus (wäre nicht nötig vor dem Prozedur Ende)
on error goto0exit function end Selectl = len(testo)t = ""
' dreht den Text "testo" um
fori = lto1step- 1c = mid(testo,i,1)
t = t & c nextrueckwaerts = t
' Variablen werden gelöscht um Fehler in weiteren Zellen zu vermeiden
t = ""wie = ""
' Schaltet die Fehlerbehandlung aus
on error goto0
' Das Funktionsende muss erzwungen werden, damit die Fehlerbehandlung im OK-Fall nicht durchlaufen wird
exit function
' Label der Sprungmarke der Fehlerbehandlung
fehler:rueckwaerts = "Fehler " & Err & ": " & Error$ & " In Zeile : " & Erl '
' Die Fehlerbehandlung läuft einfach durch
end function
/
A
B
C
D
E
1
="Makro-Test"
=RUECKWAERTS("ALLES GROSS";"KLEIN")
2
=RUECKWAERTS($A$1)
=RUECKWAERTS($A$1;"GrOsS")
3
=RUECKWAERTS($A$1;B3)
gross
=RUECKWAERTS(123456)
4
=RUECKWAERTS($A$1;B4)
velo
=RUECKWAERTS()
5
=RUECKWAERTS($A$1;B5)
KLEIN
=RUECKWAERTS
6
Anzeige
Zelle A1 = Makro-Test
Zelle A2 = tset-orkam
Zelle A3 = TSET-ORKAM
Zelle A4 = Zweites Argument 'velo' kann ich nicht verarbeiten
Zelle A5 = tset-orkam
Zelle B3 = gross
Zelle B4 = velo
Zelle B5 = KLEIN
Zelle D1 = ssorg sella
Zelle D2 = TSET-ORKAM
Zelle D3 = 654321
Zelle D4 = Fehler 449: Argument ist nicht optional. In Zeile : xx
Zelle D5 = #NAME?
Das Ziel dieses Abschnittes ist schon im Titel beschrieben... der Weg dahin ist aber ziemlich Steinig
Erstaunlich, dass das Dateihandling einfacher als die gezielte Ausgabe auf einem Tabellenblatt auszugeben
Somit fange ich damit an, Dateien zu bewirtschaften (DOS), danach Dateien nach unterschiedlichen Modi zu schreiben und lesen.
Wenn ich das hinter mir habe werde ich mich mit der Ausgabe auf einem Tabellenblatt befassen.
Wie Mau sagte: auch der längste Marsch beginnt mit dem ersten Schritt
DOS mit OpenOffice-Basic
Befehle, die ich durcharbeiten will
Dateiverwaltung: dir, copy, del/erase, ren/rename, type
Verzeichnisse: cd/chdir, mkdir, rmdir
Prozesse/Task: start, tasklist, taskkill
System: ver, whoami, systeminfo
Umleitung/Dateisystem-Zeug: echo, set, call, exit
Netz: ping, ipconfig, netstat
Kennzeichnet eine Subroutine: Sub NAME[(PARAMETER...)] ...ANWEISUNGEN... End Sub Kennzeichnet eine Funktion: Function NAME[(PARAMETER...)] ...ANWEISUNGEN... NAME = Rückgabewert End Function
Programmsteuerung je nach Bedingung. Schlüsselwörter: Select, Case, Else und End. Select Case (Bedingung) - End Select umschliessen eine Gruppe von mögliche Resultate der Bedingung, die in Case Aktivitäte ausführen. Trifft kein Resultat auf die Bedingung kann mit Case Else dies abgefangen werden, sonst läuft das Programm einfach durch.
mid(String, vonPosition, anzahlZeichen) Gibt einen Teilstring einer Zeichenkette zurück. Left(String, anzahlZeichen) Gibt einen Teilstring einer Zeichenkette zurück.(die linken #n Zeichen). Right(String, anzahlZeichen) Gibt einen Teilstring einer Zeichenkette zurück.(die rechten #n Zeichen)
Brich den Programmablauf ab. Exit Function, Exit Sub Die Prozedur wird abgebrochen. Exit Do Springt aus einer Do...Loop Schleife auf die dem Loop folgende Zeile. Exit For Springt aus einer For...Next Schleife auf die dem Next folgende Zeile