Alternative zu MS-Office

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 NameMS-OfficeBeschreibung
OpenOffice WriterMS-WordTextverarbeitung
OpenOffice CalcMS-ExcellTabellenkalkulation
OpenOffice BaseMS-AccessDatenbank
OpenOffice ImpressMS-PowerPointPräsentations Tool
OpenOffice Draw??Vektorgrafik erstellen
OpenOffice Math??Mathematische Formeln zeichnen
--MS-OutlookE-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"
Sub ZeigeText
MsgBox "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:
Sub ZeigeDenText(wert)
MsgBox wert
End Sub

Dann muss der Aufruf in Main eingetragen werden (ich kommentiere die alten Aufrufe aus)
Sub Main
' 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.
Sub Main
' ZeigeText
' ZeigeDenText("Heute ist " & Format(date, "DDDD")) ' format(date,"DDDD DD.MM.YYYY") um Format(time, "hh:mm:ss"))

Dim a as integer
a = 10
msgbox "Startwert von a : " & a
rechnebyVal(a)
msgbox "byVal, neuer Wert von a : " & a
rechnebyRef(a)
msgbox "byRef, neuer Wert von a : " & a
End Sub

Sub rechnebyVal(byVal zahl) ' byVal Angabe ist nötig
zahl = Zahl * 2
End Sub

Sub rechnebyRef( zahl) ' byRef kann weggelassen werden, da Standard
zahl = Zahl * 2
End 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

sub rechne(zahl as integer ) msgbox Zahl * 2 end 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

sub rechne(zahl) msgbox Zahl * 2 end 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'

sub rechne(zahl as integer, Optional ByVal freiwillig As integer ) if IsMissing(freiwillig) Then freiwillig = 2 msgbox Zahl * freiwillig end 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
sub Main
 msgbox BSsub,0 , "BSsub"
 msgbox BSfunction,0 , "BSfunction"
end sub

sub BSsub as string 
BSsub  = "Rückgabewert aus der Subroutine"
end sub


function BSfunction as string 
BSfunction  = "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
/ABCDE
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.
function rueckwaerts(testo as string, Optional wie as string ) 
  ' Teilt "wie" einen Wert zu, wenn der Parameter fehlt
 if IsMissing(wie) Then wie = "NORMAL"
 ' Variablen werden initialisiert
 dim l as integer
 dim c as string
 dim t as string
 dim i as integer
 ' Schaltet die Fehlerbehandlung ein
 on error goto fehler
 
 ' 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 else
		rueckwaerts =  "Zweites Argument '" & wie & "' kann ich nicht verarbeiten"
 		' Schaltet die Fehlerbehandlung aus (wäre nicht nötig vor dem Prozedur Ende)
		on error goto 0 
		exit  function 
  end Select

  l = len(testo)
  t = ""
  ' dreht den Text "testo" um
  for i = l to 1 step - 1
  	c = mid(testo,i,1)
	t = t & c 
  next
  rueckwaerts =  t 
  ' Variablen werden gelöscht um Fehler in weiteren Zellen zu vermeiden
  t = ""
  wie = ""
  ' Schaltet die Fehlerbehandlung aus
  on error goto 0 
  ' 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

/ABCDE
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?

Mein ArbeitsModul für den Vorhergegangenen Abschnitt

Mit OpenOffice-Basic Datei einlesen und anzeigen

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



















Übersicht der im Text erwähnten Anweisungen

StichwortKurzbeschreibungErstes Auftreten
OO-BasicSteht für OpenOffice-BasicOpenOffice-Basic
Makro-Sicherheitin OpenOffice gibt es 4 verschiedene Sicherheitsstufen. Ich bevorzuge die zweittiefste, bei der man beim OpenOffice Start die Makros aktivieren kannExkurs in die Makrosicherheit
Sub
Function
Kennzeichnet eine Subroutine: Sub NAME[(PARAMETER...)] ...ANWEISUNGEN... End Sub
Kennzeichnet eine Funktion: Function NAME[(PARAMETER...)] ...ANWEISUNGEN... NAME = Rückgabewert End Function
Erste OpenOffice-Basic Subroutine OpenOffice-Basic Funktion
MsgBoxZeigt ein Popupfensterchen mit Text
MsgBox im Code
FormatFormatiert einen String nach gewünschten Vorgaben
Format im Code
date
time
date liefert das aktuelle Datum (ohne Zeitangabe)
time liefert die aktuelle Zeit
date & time im Code
DimSchlüsselwort um Variablen mit Datentypen zu deklarieren
Dim im Code
byRef / byValBestimmt wie Parameter genutzt werdenbyRef vs. byVal
If, Then
Else, Else If
Ens If
Alternative Iif
Programmsteuerung nach gestellter Bedingung. Schlüsselwörter If, Then, Else, End If, Boolische Operatoren, Vergleichsoperatoren
If im Code
IsMissing()Ist true oder false je nach dem ob ein optionaler Parameter mitgegeben wurdeOptionale Parameter
On Error goto
Resume
Err, Error$, Erl
On Error goto Sprungmarke, Resume Next oder 0, Resume Sprungmarke oder Next, Fehlernummer, Fehlertext, Fehlerhafte Zeile
Error im Code
Select caseProgrammsteuerung 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.
Select Case im Code
Len(Länge) Len(Zeichenkette) gibt die Anzahl der Zeichen, aus denen die Zeichenkette besteht, zurück Len im Code
Mid, Left, Rightmid(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) Mid im Code
ExitBrich 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 Exit im Code
For, to, Step
Next
Definiert zwischen 'For' und 'Next' eine Schleife in der ein Zähler soweit in Schritten 'Step' gezählt wird bis 'To' erreicht oder überschritten wird.
For im Code
StichwortKurzbeschreibungErstes Auftreten
StichwortKurzbeschreibungErstes Auftreten
StichwortKurzbeschreibungErstes Auftreten
StichwortKurzbeschreibungErstes Auftreten
StichwortKurzbeschreibungErstes Auftreten

If, Then, Else, oder Iif

Beschreibung anhand dreier Beispiele mit je 3 unterschiedlicher Werte 0, 1, 2 in einer For/Next-Schleife

for wert = 0 to 2
	MsgBox "wert = " & wert,64 ,"Schleifenstart"
	
	Beispiel = "1) If auf einer Zeile"
	' Auf einer Zeile braucht es kein End If
	If wert = 0 then MsgBox "Wert ist Null",0,"Eine Zeile" : else MsgBox "Wert ist nicht Null",0,"Eine Zeile" 
	
	Beispiel = "2) Iif"
	' Aber da ist Iif besser
	 MsgBox Iif(wert = 0, "Wert ist Null" , "Wert ist nicht Null")  , 0,"Mit 'Iif'" 
	
	Beispiel = "3) Normalfall"
	' Mit If / End if gruppiert ists besser lesbar
	If wert = 0 then
		MsgBox "Wert ist Null",0,"mit 'If / End if' gruppiert" 
  	elseif wert = 1 then
		MsgBox "Wert ist eins!",0,"mit 'If / End if' gruppiert" 	 
  	else
		MsgBox "Wert ist nicht Null",0,"mit 'If / End if' gruppiert" 
	end If

Next wert

Erster Durchlauf wert = 0 
Ausgabe 1) : Im Textfeld Wert ist Null,  Popup-Titel: Eine Zeile
Ausgabe 2) : Im Textfeld Wert ist Null,  Popup-Titel: Mit 'Iif'
Ausgabe 3) : Im Textfeld Wert ist Null,  Popup-Titel: mit 'If / End if' gruppiert

Zweiter Durchlauf wert = 1
Ausgabe 1) : Im Textfeld Wert ist nicht Null,  Popup-Titel: Eine Zeile
Ausgabe 2) : Im Textfeld Wert ist nicht Null,  Popup-Titel: Mit 'Iif'
Ausgabe 3) : Im Textfeld Wert ist eins!,  Popup-Titel: mit 'If / End if' gruppiert

Zweiter Durchlauf wert = 2
Ausgabe 1) : Im Textfeld Wert ist nicht Null,  Popup-Titel: Eine Zeile
Ausgabe 2) : Im Textfeld Wert ist nicht Null,  Popup-Titel: Mit 'Iif'
Ausgabe 3) : Im Textfeld Wert ist nicht Null,  Popup-Titel: mit 'If / End if' gruppiert

Beispiel 1) If auf einer Zeile
Unterschiedliche Anweisungen können in Basic auf einer Zeile stehen wenn sie mit Doppelpunkt : werden. In diesem Fall braucht es keinen "End If".
Beschreibung: Ist die Bedingung WAHR wird die erste Anweisung ausgeführt, sonst wird die Anweisung nach Else ausgeführt.
Ist kein Else angegeben und ist die Bedingung FALSCH wird diese Zeile einfach ignoriert


Beispiel 1) If auf einer Zeile
Unterschiedliche Anweisungen können in Basic auf einer Zeile stehen wenn sie mit Doppelpunkt : werden. In diesem Fall braucht es keinen "End If".
Beschreibung: Ist die Bedingung WAHR wird die erste Anweisung ausgeführt, sonst wird die Anweisung nach Else ausgeführt.
Ist kein Else angegeben und ist die Bedingung FALSCH wird diese Zeile einfach ignoriert

Beispiel 2) Iif
Iif(Bedingung,wenn WAHR,wenn FALSCH) ist eine Funktion mit 3 Parameter. 
Sie liefert, wenn der erste Parameter WAHR ist, den zweiten Parameter, sonst den dritten Parameter zurück

Beispiel 3) Normalfall
Iif() ist in einfachen Fälle sehr gut, sonst wenn man eine If Then Else ist das Beispiel 1 nur bedingt ratsam. 
Es ist OK wenn man kein Else benutzen will, aber sunst rate ich zm "Normalfall" der sich noch mit ElseIf anreichern kann 
(es können verschiedene ElseIf verwendet werden)

Alle Operatoren

Vergleichsoperatoren
Gleich (=)
Kleiner als (<)
Grösser als (>)
Kleiner gleich (< =)
Grösser gleich (> =)
Ungleich (< >)

Einzelne Vergleiche können mit boolische Operatoren verkettet werden
boolische Operatoren
OR-Operator	_ a OR b _ ODER _ Ist WAHR wenn a, b oder a und b WAHR sind 
AND-Operator	_ a AND b _ UND _ Ist WAHR wenn a und b WAHR sind 
XOR-Operator	_ a XOR b _ ExklusivODER _ Ist WAHR wenn a oder b WAHR sind, aber nicht beide
NOT-Operator	_ NOT a _ Nicht _ Ist WAHR wenn a FALSCH ist und FALSCH wenn a WAHR ist
EQV-Operator	_ a EQV b _ Equivalent _ Ist WAHR wenn beide FALSCH oder beide WAHR sind 	
IMP-Operator 	_ a IMP b _ Impliziert _ Ist nur FALSCH wenn a WAHR UND b FALSCH ist, sonst immer WAHR

Quelle aus:Eigene

For...Next-Anweisung

Syntax:

For Zaehler=Anfang To Ende [Step Schritt] Befehlsblock [Exit For] Befehlsblock Next [Zaehler] ' Die freiwillige Angabe von 'Zaehler' hilft der Lesbarkeit

Variablen/Werte:

Zaehler: Schleifenzähler, dem zunächst der Wert rechts neben dem Gleichheitszeichen (Anfang) zugewiesen wird. Es sind nur numerische Variablen zulässig. Der Schleifenzähler wird entsprechend der Variable "Schritt" erhöht oder verringert, bis der Wert "Ende" durchlaufen wurde. Anfang: Numerische Variable, die den Anfangswert zu Beginn der Schleife festlegt. Ende: Numerische Variable, die den Endwert zum Schluss der Schleife festlegt. Schritt: Legt den Wert fest, um den der Schleifenzähler bei jedem Durchlauf erhöht oder verringert werden soll. Wird "Schritt" nicht angegeben, so wird der Schleifenzähler um 1 erhöht. In diesem Fall muss "Ende" größer sein als "Anfang". Wenn Sie "Zaehler" herunterzählen möchten, muss "Ende" kleiner als "Anfang" sein und "Schritt" muss ein negativer Wert zugewiesen werden. Die For...Next-Schleife wiederholt alle Anweisungen innerhalb der Schleife so oft, wie es in den Parametern angegeben ist. Bei jeder Veränderung der Zählervariable prüft OpenOffice Basic, ob der Endwert erreicht ist. Sobald der Zähler den Endwert durchläuft, wird die Schleife automatisch beendet. Sie können For...Next-Anweisungen verschachteln. Wenn Sie nach der Next-Anweisung keine Variable angeben, bezieht sich Next automatisch auf die letzte vorhergehende For-Anweisung. Bestimmen Sie eine Schrittweite von 0, dann werden die Anweisungen zwischen For und Next endlos ausgeführt. Beim Hoch- bzw. Herunterzählen der Zählervariablen prüft OpenOffice Basic auf Überlauf und Unterlauf (Underflow). Die Schleife wird beendet, wenn "Zaehler" größer als "Ende" (positiver Schrittwert) bzw. kleiner als "Ende" (negativer Schrittwert) ist. Um die Schleife bedingungslos zu verlassen, verwenden Sie die Anweisung Exit For. Diese Anweisung muss in einer For...Next-Schleife stehen (siehe 'Exit'). Verwenden Sie die If...Then-Anweisung, um die Ausstiegsbedingung zu prüfen: If Bedingung = True Then Exit For Hinweis für die Verschachtelung von For...Next-Schleifen: Beim unbedingten Verlassen einer Schleife durch Exit For wird grundsätzlich nur eine Schleife beendet. Continue: Gibt es im Openoffice-Basic nicht und muss wie in der Steinzeit mit Goto behandelt werden Beispiel: Mit dem Ziel; Es werden nur gerade Zahlen dargestellt Anfang = 5 Ende = -100 Schritt = -1 For Zaehler = Anfang to Ende Step Schritt if Zaehler = -5 then MsgBox "Ich mache nur bis -5 mit!", 16, "Zuviele Beispiele" exit for end if if( abs ( Zaehler mod 2 ) = 1) then goto weiter MsgBox Zaehler, 48, "Gerade Zahlen" weiter: Next Zaehler

Quelle aus:OpenOffice-Hilfe

Fehlerbehandlungs Befehle

On Error GoTo bzw. Resume

Verzweigt nach dem Auftreten eines Fehlers während der Programmausführung in eine Fehlerbehandlungsroutine oder setzt die Programmausführung fort. Die eingeschaltene Fehlerbehandlung ist nur Lokal gültig und endet mit dem Beenden der Prozedur. Syntax: On Error GoTo Labelname | GoTo 0 | Resume Next GoTo Labelname: Beim Auftreten eines Fehlers wird die Fehlerbehandlungsroutine aufgerufen, die an der Zeile "Labelname" in der selben Prozedur beginnt. Ein Label oder Sprungmarke ist eine Bezeichnung am Zeilenanfang mit Doppelpunkt am Ende, Beispiel: "Label:" Resume Next: Beim Auftreten eines Fehlers wird die Programmausführung mit derjenigen Anweisung fortgesetzt, die auf die Anweisung folgt, in der der Fehler aufgetreten ist. GoTo 0: Beendet die Fehlerbehandlung in der akuellen Prozedur

Resume

Man kann eine Fehlerbearbeitungsroutine am Ende der Prozedur legen, so wird sie mit der Prozedur beendet. Hat es danch aber weitere Programmzeilen, die jedoch bei Fehler nicht bearbeitet werden dürfen, dann muss die Prozedur mit Exit function bzw. sub beendet werden. Oder man nimmt nach der Fehlerbehandlung den Programmablauf mit Resume wieder auf. Syntax: Resume Nichts / Next / Label Resume: setzt die Ausführung an der fehlerhaften Zeile fort (die betroffene Operation wird erneut versucht). Resume Next: setzt die Ausführung mit der nächsten Zeile fort (also nach der fehlerverursachenden Zeile). Resume Label: setzt die Ausführung an der angegebenen Sprungmarke (Label) fort.

Fehlerinformationen

Error$, Err, Erl liefern Informationen (Text oder Integerzahl), die erlauben entweder den aufgetretene Fehler manuell oder Automatisch anzuzeigen oder zu beheben Error$ : Fehlertext des letzten aufgetretenen Fehlers Error$(er) : Fehlertext, der dem Integer 'er' entspricht Err : Fehlerzahl des letzten aufgetretenen Fehlers Erl : Zeilennummer in der der Fehler aufgetreten ist

Quelle aus:OpenOffice-Hilfe

Kurzes Beispiel

Sub Main
 msgbox  b_testen , 64 , "Zurück in 'Sub Main'"
End Sub

function  b_testen
 ON ERROR GOTO Fehler
 A = "generiert einen Fehler" * 5
 b_testen = "Resume, mit Fehlermeldung: " & ERR & " = " & ERROR$ & ", auf Zeile: " & ERL  
 exit function
Fehler:
 msgbox "Fehler: " & ERR & " = " & ERROR$ & ", auf Zeile: " & ERL , 48 ,"Fehlerbehandlung"
 ON ERROR GOTO 0
 RESUME NEXT
End function 

Fehler-Codes

1 An exception occurred
2 Syntax error
3 Return without Gosub
4 Incorrect entry; please retry
5 Invalid procedure call
6 Overflow
7 Nicht genug Speicher
8 Bereits dimensioniertes Feld
9 Index außerhalb des definierten Bereichs
10 Doppelt vorhandene Definition
11 Division durch Null
12 Variable nicht definiert
13 Datentyp unverträglich
14 Ungültiger Parameter
18 Der Ablauf wurde durch den Benutzer unterbrochen
20 Resume ohne Fehler
28 Nicht genügend Stapelspeicher
35 Sub- oder Function-Prozedur nicht definiert
48 Error loading DLL file
49 Wrong DLL call convention
51 Interner Fehler
52 Dateiname oder Dateinummer falsch
53 Datei nicht gefunden
54 Dateimodus falsch
55 Datei bereits geöffnet
57 Geräte-E/A-Fehler
58 Datei bereits vorhanden
59 Falsche Datensatzlänge
61 Datenträger voll
62 Zugriff hinter das Dateiende (EOF)
63 Datensatznummer falsch
67 Zu viele Dateien
68 Gerät nicht verfügbar
70 Zugriff verweigert
71 Datenträger nicht bereit
73 Nicht implementiert
74 Umbenennen auf verschiedenen Laufwerken nicht möglich
75 Pfad/Datei-Zugriffsfehler
76 Pfad nicht gefunden
91 Objektvariable nicht gesetzt
93 Zeichenfolgemuster unzulässig
94 Verwendung von Null nicht erlaubt
250 DDE-Fehler
280 Warte auf Antwort der DDE Verbindung
281 Keine DDE-Kanäle verfügbar
282 Keine Anwendung hat auf den DDE-Verbindungsaufbau geantwortet
283 Zu viele Anwendungen haben auf den DDE-Verbindungsaufbau geantwortet
284 DDE Kanal ist blockiert
285 Externe Anwendung kann DDE-Operation nicht ausführen
286 Zeitüberschreitung beim Warten auf die DDE-Antwort
287 Der Benutzer hat ESC während der DDE-Operation gedrückt
288 Externe Anwendung ist beschäftigt
289 DDE-Operation ohne Daten
290 Ungültiges Datenformat
291 Externe Anwendung wurde beendet
292 DDE-Verbindung wurde unterbrochen oder verändert
293 Aufruf einer DDE-Methode ohne offenen Kanal
294 Ungültiges DDE-Link Format
295 DDE-Nachricht ging verloren
296 Link einfügen wurde bereits ausgeführt
297 Verknüpfungsmodus konnte wegen ungültigem link topic nicht gesetzt werden
298 DDE benötigt die Datei DDEML.DDL
323 Modul kann nicht geladen werden; ungültiges Format
341 Ungültiger Objektindex
366 Objekt nicht verfügbar
380 Falscher Wert für Eigenschaft
382 Eigenschaft ist schreibgeschützt
394 Eigenschaft ist lesegeschützt
420 Ungültige Objektreferenz
423 Eigenschaft oder Methode nicht gefunden
424 Objekt erforderlich
425 Falsche Verwendung eines Objekts
430 OLE-Automatisierung wird von diesem Objekt nicht unterstützt
438 Eigenschaft oder Methode wird vom Objekt nicht unterstützt
440 Fehler bei OLE-Automatisierung
445 Diese Aktion wird vom angegebenen Objekt nicht unterstützt
446 Benannte Argumente werden vom angegebenen Objekt nicht unterstützt
447 Das aktuelle Gebietsschema wird vom angegebenen Objekt nicht unterstützt
448 Benanntes Argument nicht gefunden
449 Argument ist nicht wählbar
450 Falsche Anzahl an Argumenten
451 Objekt ist keine Auflistung
452 Ordnungszahl ungültig
453 Angegebene DLL-Funktion nicht gefunden
460 Ungültiges Zwischenablagen-Format
951 Unerwartetes Zeichen:
952 Erwartet:
953 Zeichen erwartet
954 Variable erwartet
955 Sprungmarke erwartet
956 Wert kann nicht zugewiesen werden
957 Variable bereits definiert
958 Sub- oder Function-Prozedur bereits definiert
959 Sprungmarke bereits definiert
960 Variable nicht gefunden
961 Array oder Prozedur nicht gefunden
962 Prozedur nicht gefunden
963 Sprungmarke nicht definiert
964 Unbekannter Datentyp
965 Exit erwartet
966 Befehlsblock nicht geschlossen: es fehlt/fehlen
967 Klammern stimmen nicht
968 Symbol bereits anders definiert
969 Parameter entsprechen nicht der Prozedur
970 Nummer enthält ungültige Zeichen
971 Array must be dimensioned
972 Else/Endif without If
973 … innerhalb einer Prozedur nicht zulässig
974 … außerhalb einer Prozedur nicht zulässig
975 Dimensionsangaben stimmen nicht überein
976 Unbekannte Option:
977 Konstante erneut definiert
978 Programm ist zu groß
979 Strings oder Arrays nicht zulässig
1000 Objekt hat diese Eigenschaft nicht
1001 Objekt hat diese Methode nicht
1002 Benötigtes Argument fehlt
1003 Falsche Anzahl an Argumenten
1004 Fehler bei Ausführung einer Methode
1005 Eigenschaft kann nicht gesetzt werden
1006 Eigenschaft kann nicht bestimmt werden

Datentypen

Datentyp Beschreibung Beispielwert
Numerische Datentypen
Integer Ganze Zahlen (32-Bit) Bereich: -2.147.483.648 bis 2.147.483.647
Long Lange ganze Zahlen (64-Bit) Bereich: -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807
Single Gleitkommazahl mit einfacher Genauigkeit (32-Bit) Bereich: -3,4E38 bis 3,4E38
Double Gleitkommazahl mit doppelter Genauigkeit (64-Bit) Bereich: -1,7E308 bis 1,7E308
Zeichenketten (Strings)
String Zeichenkette (Text) mit variabler Länge Maximale Länge: 2.147.483.647 Zeichen
Boolesche Werte
Boolean Wahrheitswert (True oder False) true false
Datum und Uhrzeit
Date Datum und/oder Uhrzeit Format: YYYY-MM-DD HH:MM:SS Datum = #2026-08-03#
Variant (Allzweck-Datentyp)
Variant Kann jeden der oben genannten Datentypen speichern Dim v As Variant
Benutzerdefinierte Datentypen (ähnlich wie Strukturen in anderen Sprachen)
Type NAME
.
.
.
End Type
Type Person
Name As String
Alter As Integer
IstAktiv As Boolean
End Type
Dim p As Person
p.Name = "Max Mustermann"
p.Alter = 30
p.IstAktiv = True
Arrays
DimArray ... anschauen
sArr = Array("Hallo","Velo","!")
dim pArr(anzahlElemente) as string ' Startindex (0)
' Mehrdimensional
dim mArr(von to bis , anzahlElemente) as integer ' Startindex (von,0)
Arrays können mit verschiedenen Datentypen erstellt werden:dim mArr(1 to 5 , 3) as string
mArr(1,0) = "Startindex"
mArr(5,2) = "Endindex"
Objekt-Datentypen
Dim Datei As Object
Dim Tabelle As Object
Datei = ThisComponent
' Verweist auf das aktuelle Dokument
OpenOffice Basic kann auch Objekte (z. B. aus der OpenOffice-API) speichern:Tabelle = Datei.CurrentController.ActiveSheet
Wichtige Hinweise:
Automatische Typumwandlung: OpenOffice Basic versucht, Datentypen automatisch umzuwandeln (z. B. "123"  123). Dies kann zu Fehlern führen, wenn die Umwandlung nicht möglich ist.
Dim-Anweisung:Variablen sollten mit Dim deklariert werden, bevor sie verwendet werden, um Tatentypensalat zu vermeiden.Dim x As Integer
x = 10
Option Explicit Mit Option Explicit am Anfang des Moduls müssen alle Variablen explizit deklariert werden. Dies hilft, Tippfehler zu vermeiden.

aus: Duck.ai

Format-Funktion

Wandelt eine Zahl in eine Zeichenkette um und formatiert diese dann entsprechend dem von Ihnen angegebenen Format.

Syntax:

Format (Zahl [, Format As String])

Rückgabe:

String

Parameter:

Zahl: Ein beliebiger numerischer Ausdruck, den Sie in eine formatierte Zeichenkette konvertieren möchten. Format: Zeichenkette, die den Formatcode für die Zahl festlegt. Wird Format nicht angegeben, so verhält sich die Funktion Format so wie die Funktion Str.

Einige Formatcodes

Zahlen Formatzeichen # Eine Ziffer der Zahl 0 Führende oder folgende Nullen Beispiel: format(1001.1,"#'###,00") Entspricht: 1'001,10 Datum Formatzeichen Auf englisch denken! YY bzw. YYYY = Jahr 26 bzw. 2026 M bzw. MM bzw. MMM bzw. MMMM = Monat 6 bzw. 06 bzw. Jun bzw. Juni D bzw. DD und DDD bzw. DDDD = Tag im Monat 6 bzw. 06 und Wochentag So bzw. Sonntag h bzw. hh = Stunde 9 bzw. 09 m bzw. mm = Minute 9 bzw. 09 s bzw. ss = Sekunde 9 bzw. 09 Beispiel: format(date,"DDDD DD.MM.YYYY") & " um " & format(time,"hh:mm:ss")

Vordefinierte Formate

General Number: Zahlen werden so angezeigt, wie sie eingegeben wurden. Currency: Fügt vor der Zahl ein Dollarzeichen ein und setzt negative Zahlen in Klammern. Fixed: Zeigt vor dem Dezimaltrenner mindestens eine Ziffer an. Standard: Zeigt Zahlen mit Tausendertrenner an. Percent: Multipliziert die Zahl mit 100 und hängt ihr ein Prozentzeichen an. Scientific: Zeigt die Zahl im wissenschaftlichen Format an (z. B. 1,00E+03 für 1000). Der Formatcode kann in drei durch Strichpunkte getrennte Abschnitte unterteilt werden. Der erste Teil definiert das Format für positive Werte, der zweite das für negative Werte und der dritte das Format für den Wert 0. Wenn Sie nur einen einzigen Formatcode angeben, wird dieser für alle Zahlen verwendet.

aus:OpenOffice-Hilfe

MsgBox-Funktion

Zeigt einen Dialog mit einer Meldung an und gibt einen Wert zurück.

Syntax:

MsgBox (Text As String [,Typ As Integer [,Dialogtitel As String]])

Rückgabe:

Integer

Parameter:

Text: Zeichenkettenausdruck, der im Dialog als Meldung angezeigt wird. Zeilenumbrüche können Sie mit Chr$(13) einfügen. Dialogtitel: Zeichenkettenausdruck, der in der Titelleiste des Dialogs angezeigt wird. Wird dieser Parameter übergangen, so wird der Name der jeweiligen Anwendung angezeigt. Typ: Ein beliebiger Integer-Ausdruck, der den Dialogtyp angibt und Anzahl und Art der angezeigten Schaltflächen oder Symbole festlegt. Typ stellt eine Kombination von Bitmustern dar. Die Dialogelemente werden durch Addition ihrer jeweiligen Werte definiert: Werte für den Typ 0 : Nur OK-Schaltfläche wird dargestellt. 1 : OK- und Abbrechen-Schaltfläche werden dargestellt. 2 : Schaltflächen "Abbrechen", "Wiederholen" und "Ignorieren" anzeigen. 3 : Ja-, Nein- und Abbrechen-Schaltfläche werden dargestellt. 4 : Ja- und Nein-Schaltfläche werden dargestellt. 5 : Wiederholen- und Abbrechen-Schaltfläche werden dargestellt. 16 : Das Stop-Symbol wird mit in den Dialog aufgenommen. 32 : Das Fragezeichen-Symbol wird mit in den Dialog aufgenommen. 48 : Das Ausrufezeichen-Symbol wird in den Dialog aufgenommen. 64 : Das Informations-Symbol wird mit in den Dialog aufgenommen. 128 : Erste Schaltfläche im Dialog ist Standardschaltfläche. 256 : Zweite Schaltfläche des Dialogs ist voreingestellt. 512 : Dritte Schaltfläche des Dialogs ist voreingestellt. Rückgabewert: 1 : OK 2 : Abbrechen 3 : Abbruch 4 : Wiederholen 5 : Ignorieren 6 : Ja 7 : Nein

aus:OpenOffice-Hilfe