Prozeduren und Funktionen sind grundlegende Bestandteile eines Programmes. Mit Hilfe 
von 
Prozeduren und Funktionen werden bestimmte Aufgaben in sich abgeschlossen 
Unterprogrammen gekapselt. Mit der Hilfe von Prozeduren und Funktionen kann man sich 
einen eigenen Befehlsvorrat für ständig wiederkehrende Aufgaben anlegen. Bei Prozeduren 
dienen zum Ausführen weiterer Aufgaben, aber man erhält kein direktes Ergebnis zurück.Bei  
Funktion wird zum Schluß ein Ergebnis zurückgegeben. An beide kann man Parameter 
übergeben.
Aufbau von Prozeduren
Prozeduren werden mit "Sub Prozedurname" eingeleitet und mit "End Sub" 
beendet. 
Dazwischen kommt der Programmcode.
Hier ein Beispiel:
Sub TestProzedur
    msgbox "Heute ist der " & Date 
End Sub
Diese Prozedur zeigt in einer MessageBox das aktuelle Datum an. Das ist natürlich 
nicht der 
Idealfall für eine Prozedur, da hier eigentlich außer einer Programmzeile ( msgbox "Heute ist 
der " & Date) drei Zeilen werden. Prozeduren sind dann sinnvoll wenn Aufgaben im Programm 
mehrfach aufgerufen werden oder wenn man durch Prozeduren das Programm in übersichtliche 
Teilaufgaben zerlegen kann. Das Hauptprogramm ruft dann nur nach einander die Prozeduren 
auf oder wiederholt bei Bedarf wieder den Aufruf. 
Sie wollen zum Beispiel eine Datei speichern und müssen dazu erst den Dateinamen und 
dann 
der Speicherort abfragen. Das ist ja eindeutig eine Aufgabe die öfter vorkommen soll. Also 
erstes wird nach dem Dateinamen gefragt, danach nach dem Speicherort und zum Schluß wird 
die Datei gespeichert.
Hier der Code als Aufgabenbeschreibung:
Sub Speichern
     Abfrage des Dateiname
     Abfrage des Speicherortes
     Zusammensetzen des Dateinamens und Speicherortes
     Speichern der Datei
     Bestätigung des Speicherns
End Sub
Als StarBasiccode
Sub Speichern
   Dateiname = InputBox ("Geben Sie bitte den Dateinamen ein:")
   Speicherort = InputBox ("Geben Sie bitte ein Verzeichnis ein:")
   mydoc = ThisComponent
   myUrl=  Speicherort + Dateiname
   mydoc.storeasurl(myurl,args())  
   msgbox "Ihre Datei wurde gespeichert"
End Sub
     
So jetzt haben wir eine Prozedur von sechs Zeilen die man jederzeit mit einer Zeile 
( 
"Speichern") im Programm aufrufen kann. Bitte jetzt nicht nach den Details zu Speichern 
fragen, dazu komme ich weiter hinten im Buch. Und selbstverständlich gibt es für Speichern ja 
den Menüpunkt "Speichern", der eigentlich auch eine Prozedur ist, aber ich wollte ein Beispiel 
das man sofort nachvollziehen kann.
Diese Prozedur wollen wir jetzt noch ein wenig ergänzen. Zum Beispiel liegt der Speicherort 
schon fest. Das heißt diesen müssen sie nicht abfragen. Jetzt haben sie zwei Möglichkeiten. 
Sie können den Speicherort in der Prozedur festlegen. Statt der Abfrage "  Speicherort = 
InputBox ("Geben Sie bitte den Dateinamen ein:")" kommt dann zum Beispiel "Speicherort 
= 
"C:\". Dann müssen sie aber für jeden neuen Speicherort eine neue Prozedur schreiben ( 
SpeichernC, SpeichernD etc). Die zweite Möglichkeit ist, das sie den Speicherort der Prozedur 
als Paramter übergeben. Sie können an Prozeduren Parameter nach folgendem Syntax 
übergeben: Sub Prozedurname (Paramater1 as Typ, Parameter2 as Typ,....). In unserem 
Beispiel übergeben wir den Speicherort als String:
Sub Speichern ( Speicherort as String)
   Dateiname = InputBox ("Geben Sie bitte den Dateinamen ein:")
   mydoc = ThisComponent
   myUrl=  Speicherort + Dateiname
   mydoc.storeasurl(myurl,args())  
   msgbox "Ihre Datei wurde gespeichert"
End Sub
Jetzt können Sie diese Prozedure beliebig oft mit verschiedenen Speicherorten aufrufen. 
Z.B. 
speichern ( "C:\"), speichern("C:\MeineDaten"), etc.
Beim Aufrufen von Prozeduren mit Paramtern müssen Sie nur darauf achten das sie die 
gleiche 
Anzahl an Parametern und die gleichen Typen übergeben, wie Sie in der Deklaration angeben 
haben. In unserem Beispiel kann ich zum Beispiel als Speicherort keine Zahl übergeben ( 
Speichern( 12) ), da eine Zahl kein String ist.
Was sind nun Funktionen? Eigentlich auch Prozeduren, nur das diese ein Ergebnis zurück 
liefern. Eine Procedure führt etwas aus. Eine Funktion führt etwas aus und erzeugt ein 
Ergebnis. Um dieses Ergebnis richtig zuordnen zu können muss die Art des Ergebnisses 
vorher festgelegt werden. Daher hat eine Funtion folgenden Aufbau:
Function Name ( Parameter1, Paramater2,...) as Typ
  Name=Ergebnis
End Function
Sie sieht also der Prozedur sehr ähnlich, nur das statt sub function steht und das 
der Typ noch 
festgelegt wird. Und das innerhalb der Funktion das Ergebnis übergeben werden muß.
Machen wir hierzu auch ein Beispiel.
Nehmen wir an wir brauchen für unsere Programm eine bestimmte Berechnung mehrmals. 
Zum 
Beispiel die Mehrwertsteuer eines Bruttobetrages abhängig vom Mehrwertsteuersatz.
( Bruttobetrag 116,- Eur Nettobetrag 100,- Eur, Mehrwersteuer 16,- Eur, 16% Mwst). 
Ein Weg zum Ergebnis:
  
  Bruttobetrag - Nettobetrag = Mehrwertsteuer 
  Nettobetrag = Bruttobetrag / (1+ 1/100 Zinsatz)
Bei der Funhtion müssen wir als Parameter den Bruttobetrag und den Zinsatz übergeben, 
als 
Ergebnis erhalten wie eine Zahl mit Kommastellen.
Function Mehrwertsteuer ( Brutto as Double, Zinssatz as double) as double
Dim Zinsfaktor as double
Zinsfaktor = 1 +  Zinssatz / 100
Netto = Brutto / Zinsfaktor
Mehrwertsteuer = Brutto - Netto
End Function
Diese Funktion wird dann im Programnm mit "variable = mehrwertsteuer (Bruttobetrag, 
Zinssatz)" aufgerufen. Zum Beispiel:
steuer = mehrwertsteuer( 1234, 16)
Dann bekommt steuer den Wert 170,206..... 
Jetzt können Sie jeder Zeit mit einer Programmzeile die Mehrwertsteuer eines Betrages 
ausrechnen lassen.
Funktion können zum Beispiel für mathematische Aufgaben, Textverarbeitungen und  für 
Wahrheitsprüfungen verwendet werden. Bei eine Wahrheits- Boolschen Funktion wird der 
Zustand Wahr oder Falsch ( true oder false) zurückgeben. 
Jetzt kommen noch zusätzliche Eigenschaften beim Aufruf von Prozeduren und Funktionen 
hinzu. Diese betreffen die Parameter.
a. Optional 
Parameter mit der Beigabe "Optional" müssen beim Aufruf nicht übergeben 
werden. Diese 
werden, wenn sie nicht gefüllt sind automatisch mit einem Leerwert versehen. Ob der 
Parameter gefüllt worden ist kann man mit der Funtkion "ismissing" testen. Dieses verhalten 
gilt sowohl für Prozeduren, wie auch Funktionen.
if IsMissing(mytext2) then
    myText2 = "Keine Text"
end if
Ist der Parameter jetzt nicht gefüllt wird der Text "Kein Text" eingetragen. 
Umgekehrt kann man 
mit "not IsMissing()" auch die positive Fragen stellen.
b. ByVal
Paramater die mit dem Vorsatz "ByVal" übergeben werden, können keinen neuen 
Wert 
annehmen. Was bedeutet das?
Normalerweise werden die Parameter an Funktionen als Referenz übergeben. Man könnte 
es 
als ausleihen beschreiben. Blöderweise kann aber die Prozedur oder Funktion den geliehenen 
Parameter auch ändern. Auf diese Weise kann man zum Beispiel auch eine Prozedur als 
Funktion verwenden.
Diese  Prozedur 
Sub NeuerWert( Zahl as Integer)
  Zahl = Zahl*100
End Sub
führt genauso zu einem neuen Wert von "Zahl" wie diese Funktion
Function funcNeuerWert(Zahl as Integer)
funcNeuerWert=Zahl*100
End Function
Wenn man diese beiden "Funktionen" ein Programm einbindet:
Sub TestNeuerWert
   MyWert=10
   NeuerWert(MyWert)
   ErsteZahl=MyWertl
   MyWert=fNeuerWert(myWert)
   ZweiteZahl=MyZahl
   MsgBox "Erste Zahl: " +ErsteZahl+" Zweite Zahl: "+ZweiteZahl
end sub   
kommt die vielleicht gar nicht gewollte Vervielfachung des Ausgangswertes heraus.
Dies kann man durch zwei Wege verhindern. Der erste ist, wie es sich gehört für einen 
guten 
Programmierer, ordentlich programmieren und niemals Parameter einer Prozedur oder Funktion 
mit neuen Werten belegen, wenn es nicht die Absicht der Prozedur 
ist. Eine Funktion sollte 
nie einen Parameter als versteckte Rückgabe ändern. Eine Funktion gibt ein Ergebnis zurück 
und sollte ansonsten auch nichts ändern. 
Der zweite Weg ist der Parameter ByVal. Mit diesem wird der Parameter als Wert übergeben 
und nach dem durchlaufen der Prozedur oder Funktion, wird der alte Wert wieder gesetzt. 
Wenn man also sicher sein will das sich der Parameter nicht ändern kann, setzt man ByVal 
davor. Dies ist auch sinnvoll wenn man eine Funktion oder Prozedur schreibt die man in 
mehreren Programmen verwenden will.
Verwendet man in unserem Beispiel in der Prozedur jetzt ByVal
Sub NeuerWert(ByVal Zahl as Integer)
  Zahl = Zahl*100
End Sub
Kommen zum Schluß weniger große Zahl heraus.