Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
VBA-Code in VBA-Projekten von Office-Anwendungen landet zuerst einmal in Modulen. Darunter gibt es einige weitere Strukturen, auf welche die Anweisungen aufgeteilt werden. Während Deklarationen von Variablen auch direkt in einem Modul angelegt werden können, müssen ausführbare Codezeilen zwingend in Konstrukten untergebracht werden, die je nach Anwendung Makros oder Prozeduren genannt werden. Außerdem gibt es noch Funktionen. Was es mit all diesen Begriffen auf sich hat und wieso diese nicht einheitlich definiert sind, erläutern wir in diesem Artikel.
Makros vs. Prozeduren
Wer erstmal mit VBA unter Excel, Word oder PowerPoint in Kontakt kommt, erledigt dies in der Regel über das Aufzeichnen von Makros – mehr dazu im Artikel VBA: Makros aufzeichnen (www.access-im-unternehmen.de/324). Bei der Aufzeichnung kommt ein sogenanntes Makro heraus. Schaut man sich das im VBA-Editor an, findet man jedoch eine Sub-Prozedur vor. Wir könnten nun einfach die Begriffe Makro und Sub-Prozedur synonym verwenden, wenn da nicht noch Access wäre: Hier gibt es nämlich neben VBA noch einen eigenen Objekttyp zum Erstellen von Automatisierungen, der wiederum Makro heißt.
Allerdings hat das Makro unter Access nichts mit VBA zu tun, sondern es handelt sich dabei eher um eine Möglichkeit zum “Zusammenklicken” von Automatisierungen. Microsoft hat also den Begriff Makro in verschiedenen Office-Anwendungen für unterschiedliche Techniken verwendet, was bei Benutzern und Programmierern für Verwirrung sorgt.
Allerdings ist das nicht nur dort problematisch, sondern auch für unser Magazin Visual Basic Entwickler.Wir wollen hier ja über den Einsatz von Visual Basic for Applications (VBA) und verwandten Sprachen wie Visual Basic.NET oder twinBASIC berichten, und zwar für alle Office-Anwendungen.
Um Verwechslungen auszuschließen, werden wir also den Begriff “Makro” nur noch dort verwenden, wo wir tatsächlich die Funktion zum Aufzeichnen von Makros nutzen. An allen anderen Stellen bezeichnen wir alle Code-Konstrukte, die in der ersten Zeile das Schlüsselwort Sub tragen, als Prozedur.
Prozeduren und Funktionen
Neben den Prozeduren gibt es noch zwei weitere Konstrukte, die zur Ausführung bestimmte Codezeilen aufnehmen können. Das erste ist die sogenannte Funktion, das zweite sind die Property…-Methoden. Diese treten allerdings erst in Zusammenhang mit der objektorientierten Programmierung von Klassenmodulen auf, sodass wir in diesem Artikel nicht darauf eingehen wollen.
Eigentlich sind die Bezeichnungen “Prozedur” und “Funktion” auch wieder nicht ganz konsequent, denn eigentlich sind beide Prozeduren – eine mit dem Schlüsselwort Sub und eine mit dem Schlüsselwort Function. Die korrekteren Bezeichnungen sind wohl Sub-Prozedur und Function-Prozedur. Allerdings denke ich, dass auch die Bezeichnungen Prozedur und Funktion verständlich sind, solange sie konsequent verwendet werden.
Prozeduren und Funktionen führen beide eine oder mehrere Anweisungen aus. Der wichtigste Unterschied zwischen beiden ist, dass die Funktionen ein Funktionsergebnis direkt zurückgeben können. Dazu zwei Beispiele. Eine Prozedur sieht im einfachsten Fall wie folgt aus:
Sub Meldung() MsgBox "Meldung per Prozedur" End Sub
Eine sehr einfache Funktion sieht so aus:
Function Eingabe() Eingabe = InputBox("Funktionswert eingeben:") End Function
Wir sehen schon, dass die Prozedur lediglich eine Meldung anzeigt. Die Funktion hingegen ruft eine InputBox auf und weist das Ergebnis einer Variablen namens Eingabe zu.
Aber was soll das denn nun? Wir haben doch im Artikel VBA-Basics: Variablen (www.access-im-unternehmen.de/319) geschrieben, dass Variablen ein Präfix wie zum Beispiel str für eine String-Variable enthalten sollen? Und überhaupt – es ist nirgends eine Variable namens Eingabe deklariert?
Und das ist der Punkt: Der Name einer Funktion ist gleichzeitig der Name der Variablen, der wir den Rückgabewert der Funktion zuweisen. Es ist also erstens kein Präfix erforderlich, außer Du möchtest diesen bei Funktionen verwenden. Zweitens ist aber auch kein Datentyp angegeben, obwohl wir das im oben genannten Artikel ebenfalls empfohlen haben, weil sonst der Datentyp Variant verwendet wird, der mehr Speicherplatz als ein explizit angegebener Datentyp benötigt.
Und wir haben geschrieben, dass die obigen Beispiele sehr einfache Beispiele sind. Dementsprechend haben wir auch nicht explizit einen Gültigkeitsbereich für die Prozedur und die Funktion angegeben.
Genau wie bei Variablen gilt hier: Wenn kein Schlüsselwort wie Public oder Private angegeben wurde, ist das Element öffentlich erreichbar. Explizit müssten wir die Prozedur also wie folgt definieren, wenn diese im kompletten VBA-Projekt erreichbar sein soll:
Public Sub Meldung() MsgBox "Meldung per Prozedur" End Sub
Für die Funktion gilt das Gleiche – und hier geben wir nun auch noch den Datentyp für den Rückgabewert Eingabe an, der nicht nur Funktionsname, sondern auch noch Variable ist:
Public Function Eingabe() As String Eingabe = InputBox("Funktionswert eingeben:") End Function
Routine als Synonym für Prozeduren und Funktionen
Wir werden im folgenden und auch in weiteren Artikeln Grundlagen und Techniken vorstellen, die für Prozeduren und Funktionen identisch sind. An diesen Stellen erwähnen wir nicht immer “Prozeduren und Funktionen”, sondern nutzen gelegentlich den Begriff Routine als Synonym für beide.
Aufruf per Direktbereich
Die Prozedur und die Funktion können wir beide über den Direktbereich des VBA-Editors aufrufen. Dazu aktivieren wir diesen, sofern noch nicht eingeblendet, mit Strg + G. Wenn er schon eingeblendet ist, kannst Du ihn mit dieser Tastenkombination aktivieren.
Dort gibst Du einfach den Namen der Prozedur ein und schließt den Aufruf mit der Eingabetaste ab. Das Ergebnis sieht wie in Bild 1 aus.
Bild 1: Aufruf einer Prozedur
Die Funktion können wir auf die gleiche Weise aufrufen. Das zeigt die InputBox an, aber die Eingabe wird nicht ausgewertet. Um den Inhalt der InputBox auszugeben, können wir beispielsweise die folgende Anweisung nutzen: