Programmieren von Formularen mit VBA
Inhalt der Seite
Was ist VBA?
VBA (Visual Basic for Applications) ist eine Programmiersprache für Microsoft-Office-Produkte. Zwar ist VBA keine eigenständige Programmiersprache wie Visual Basic, aber Funktionsweise und Umfang sind durchaus vergleichbar. Etwas verereinfacht gesagt, bildet VBA eine Teilmenge von Visual Basic.
Man kann also keine lauffähigen eigenen Programme schreiben, aber man kann mit VBA Access, Word, Excel (kurz: alle Microsoft Office-Programme) steuern.
Wir beschäftigen uns mit VBA, um modellhaft die objekt- und ereignisorientierte Programmierung von Datenbanken kennen zu lernen.
Wozu überhaupt programmieren?
Fast eine müßige Frage: Wir programmieren fast ständig, sei es die Uhr, der Videorecorder, die Microwelle, der Taschenrechner. Wir drücken irgendwelche Tasten und Knöpfe, damit irgendetwas passiert, was wir wollen.
Wir wechseln nur die Seiten: Wir sind die, die selbst bestimmen, was passiert, wenn jemand etwas drückt oder anklickt, und wir stellen die Sachen zum Drücken und Anklicken zur Verfügung.
Nebenbei bekommen wir einen Einblick, wie ein großer Teil der Welt um uns herum funktioniert. Allerdings nur modellhaft. Für alle Details haben wir keine Zeit.
Wichtige Begriffe
Beim Programmieren werden immer wieder Begriffe gebraucht, deren Bedeutung sich Programmierneulinge erst aneignen müssen. Beachten Sie bitte, dass Programmiersprachen normalerweise nicht mehr nationalisiert (also übersetzt) werden - Standardelemente der Sprache bleiben englisch.
Objekte - Objects
Anwendungen bestehen aus Hierarchien von Objekten. So ist eine Datenbank selbst ein Objekt, die in ihr enthaltenen Tabellen, Abfragen, Formulare usw. sind wiederum Objekte, die ihrerseits wieder Objekte wie Spalten, Felder, Steuerelemente usw. enthalten.
Für die Datenbankprogrammierung sind die Objekte Forms (=Formulare), Reports (=Berichte) und Controls (=Steuerelemente auf Formularen und Berichten) besonders interessant.
Eigenschaften - Properties
Alle Objekte haben bestimmte Eigenschaften, auch Attribute genannt. So hat ein Formular einen Hintergrund mit einer bestimmten Farbe, ein Textfeld eine bestimmte Breite und Höhe, eine Befehlsschaltfläche eine bestimmte Beschriftung.
Man unterscheidet zwischen Format-, Daten-, Ereignis- und anderen Eigenschaften.
Nicht alle Objekte haben die gleichen Eigenschaften. So hat eine Befehlsschaltfläche keine Datenquelle wie zum Beispiel ein gebundenes Textfeld.
Die Eigenschaften von Objekten können zur Entwurfszeit im Eigenschaftenfenster oder zur Laufzeit im Quellcode festgelegt werden.
Ereignisse - Events
Ereignisse bilden die eigentliche interaktive Schnittstelle zwischen dem Benutzer und dem Programm. Mit Ereignissen empfangen die Objekte quasi Nachrichten, die irgendwelche Aktionen auslösen können.
Man unterscheidet Fenster- und Fokusereignissen (ein Fenster wird geöffnet oder aktiviert), Tastatur- und Mausereignissen (eine Taste wird gedrückt oder mit der Maus auf eine Schaltfläche geklickt) und Daten und Filterereignissen (Daten werden geladen oder gefiltert).
Die Art und Anzahl möglicher Ereignisse hängt von den Eigenschaften der Objekte ab. So kennen Formulare zum Beispiel das Ereignis Beim Laden, ein Textfeld auf dem Formular kennt dieses Ereignis hingegen nicht. Welche Ereignisse für ein bestimmtes Objekt zur Verfügung stehen, können Sie im Eigenschaftenfenster im Register Ereignis sehen.
Das Schreiben von Ereignisbehandlungsroutinen ( = Event Handler) ist die eigentliche Hauptarbeit eines Programmierers.
Methoden - Methods
Bestimmte Objekte stellen eine Reihe von Methoden zur Verfügung, wobei es - verglichen mit den Ereignissen - relativ wenige Methoden gibt.
Als Beispiel seien hier die Methoden Recalc, Refresh, und Requery genannt, die Daten neuberechnen bzw. erneut abfragen und für Formulare, Berichte, Kombinationsfelder usw. zur Verfügung stehen.
Wo steht der Code?
Als Anwender vor dem Computer sieht man meist keinen Code. Das ist auch gut so. Aber wo ist er, wenn man ihn schreiben will?
Den Code zeigt der Visual Basic Editor an. Das ist so zu sagen das Schreibprogramm für den Code. Man spricht auch vereinfacht vom Code-Fenster. Sehen Sie sich bitte die folgenden Abbildung an.
- Im VB-Editor sieht man standardmäßig drei Fenster: Den Projekt-Explorer mit allen Code-Objekten des aktuellen Projekts, das Eigenschaftenfenster mit den Eigenschaften des gerade gewählten Code-Objekts und das Code-Fenster des gerade gewählten Code-Objekts. Per Doppelklick auf die Code-Objekte im Projekt-Explorer kann man sich den Code der einzelnen Code-Objekte (Formulare, Berichte, Module) anzeigen lassen.
Den Code zeigt also der VB-EDitor an. Gespeichert wird der Code hingegen in Modulen. Dabei unterscheidet man zwischen Formularcode und "freien" Modulen. Der Code eines Formulars ist an das Formular gebunden (Code behind Forms), während ein freies Modul der ganzen Anwendung zur Verfügung steht.
Formularcode kann man nur über das entsprechende Formular aufrufen (Formular - Entwurfsansicht - Codeansicht). Freie Module findet man direkt im Datenbankfenster unter Module.
Module - Prozeduren - Funktionen
Module
In der Abbildung weiter oben sehen Sie das Modul Form_frmInterpreten, das Code zum Formular frmInterpreten enthält.
Ein Modul besteht aus einem Deklarationbereich und verschiedenen Subs (kurz für Subroutine) und Funktionen (ohne Abbildung).
Die im Deklarationsbereich des Moduls enthaltenen Deklarationen gelten für das gesamte Modul. In der Abbildung sehen Sie die Deklarationen Option Compare Database (bei Zeichenkettenvergleichen wird nicht zwischen Groß- und Kleinschreibung unterschieden) und Option Explicit (alle im Modul verwendeten Variablen müssen vor ihrer Verwendung explizit mit Datentyp deklariert werden), die modulweit gelten.
Sub-Prozeduren
Sub-Prozeduren sind Unterroutinen eines Moduls. Man unterscheidet vordefinierte Ereignis-Subs - in der Beispielabbildung Sub Form_Current und Sub Interpret_DblClick und selbst definierte Subs.
Für vordefinierte Subs werden Anfang und Ende vom VB-EDitor "vorgeschrieben".
Subs können als Private oder Public deklariert werden, was sich auf den Gültigkeitsbereich des Subs bezieht. Private gilt nur im Bereich des Subs, Public geht darüber hinaus.
In den Klammern hinter dem Namen eines Subs können Parameter übergeben werden.
Ein Sub endet formal mit der Angabe End Sub.
Zwischen Anfang und Ende eines Subs stehen natürlich Anweisungen, die vom Programm ausgeführt werden sollen.
Funktionen
Funktionen sind Unterroutinen eines Moduls. Man unterscheidet vordefinierte (mathematische, statistische, finanzmathematische usw.) und selbst definierte Funktionen.
Funktionen haben im Gegensatz zu Subs einen Rückgabewert - sie liefern irgendein ermitteltes/berechnetes Ergebnis. Deshalb sollte der Datentyp der Funktion angegeben werden.
Das Ergebnis muss der Funktion innerhalb ihres Aufrufs zugewiesen werden.
Beispielfunktion - die Anzahl der Zeichen einer Zeichenkette wird ermittelt
Private Function Anzahl_Zeichen(strZeichenkette as String) As Integer
Anzahl_Zeichen = Len(strZeichenkette)
End Function
An die Funktion wird mit Hilfe der Variablen strZeichenkette eine Zeichenkette als Parameter übergeben und die Anzahl der Zeichen mit der Funktion Len (= Length) ermittelt.
Der Aufruf der Funktion könnte so aussehen:
Private Sub Form_Current()
Dim strZeichenkette As String
Me.Caption = Me.Interpret
strZeichenkette = Me.Interpret
MsgBox "Der Name des aktuellen Interpreten besteht aus " & Anzahl_Zeichen(strZeichenkette) & " Zeichen."
End Sub
Beim Anzeigen eines Datensatzes auf den Formular frmInterpreten würde also eine Messagebox ausgegeben, die meldet, aus wie vielen Zeichen der Name des aktuellen Interpreten besteht. Das könnte zum Beispiel so aussehen:
- Die Funktion liefert das Ergebnis 15 in der Messagebox.
Zugegeben: Diese Funktion macht nicht viel Sinn, es geht aber nur darum zu zeigen wie eine Funktion aufgerufen wird.
Hier finden Sie weitere Beispiele für Zeichenkettefunktionen.
Variablen
Wie in der Mathematik verwendet man in der Programmierung auch Variablen.
Variablen werden vor ihrem Einsatz deklariert - also dem Programm bekannt gemacht.
Je nach dem Ort der Deklaration der Variable (in einer Prozedur, in einer Funktion, in einem Modul) haben Variablen einen unterschiedlichen Gültigkeitsbereich und eine unterschiedliche Lebensdauer.
Die Deklarationsanweisung beginnt mit dem Wort Dim.
Jede Variable besitzt einen bestimmten Datentyp (Byte, Boolean, Integer, Long, Single, Double, Currency, Date, String, Variant, Object). Entsprechend dem Datentyp wird Speicher für die Variable reserviert. Details zum Speicherbedarf der einzelnen Datentypen finden Sie in der Online-Hilfe von Access.
Die richtige Wahl des Datentyps beeinflusst die Leistung der Datenbank und mögliche Fehlerbehandlungen.
Beispiele für Variablendeklarationen:
Dim i as Integer, intCounter as Integer, strNachname as String, dtGeburtstag as Date, varMeldung
Wie Sie sehen, bestehen die Namen der Variablen aus einem Präfix, der auf den Datentyp verweist. Die letzte Variable varMeldung erhält automatisch den Datentyp Variant, da kein Datentyp angegeben ist.
Verwenden Sie beim Benennen von Variablen bitte sprechende Namen. Man muss zwar mehr schreiben, aber man kann den Code besser lesen.
Namen von Variablen dürfen nicht mit einer Zahl beginnen, keine Leer- oder Sonderzeichen oder Punkte enthalten.
Namen von Variablen müssen innerhalb ihres Geltungsbereiches eindeutig sein.
Namen von Objekten der Datenbank bzw. reservierte Begriffe wie Name oder Date dürfen nicht verwendet werden. Solche Fehler kann man von vornherein dadurch vermeiden, indem man nur Variablennamen mit Präfixen für den Datentyp verwendet, also strName oder dtDate.
Der Wert einer Variablen wird mit einem Gleichheitszeichen zugewiesen.
strNachname = Me.Nachname
dtGeburtstag = Now
Im Beispiel erhält die Variable strNachname ihren Wert aus dem Feld Nachname des aktuellen Formulars, die Variable dtGeburtstag erhält ihren Wert aus der Funktion Now, die das aktuelle Datum liefert.
Konstanten
Für Konstanten gilt sinngemäß das Gleiche wie für Variablen.
Beispiele für Konstanten sind der Promedio pase an der Schule oder der Mehrwertsteuersatz.
Beispiele für die Konstantendeklaration:
Public Const PromPase as Single = 7.9
Public Const MWSt as Single = 0.16
Die Verwendung einer Variablen als Konstante hat den Vorteil, dass man sie nur an einer Stelle deklariert und dementsprechend nur einmal ändern muss, falls sich der Wert der Konstante ändert.
Kontrollstrukturen
Wichtige Hilfsmittel beim Programmieren sind so genannte Kontrollstrukturen. Sie ermöglichen variables Reagieren auf Programmzustände.
Bedingungsprüfung
Wie der Name schon sagt, werden mit dieser Struktur Bedingungen geprüft - ob eine Zahl einen bestimmten Wert hat, ob ein Benutzer entsprechende Rechte hat, ob eine Diskette im Laufwerk liegt, ob eine bestimmte Datei vorhanden ist usw. usw.
Dazu gibt es zwei Konstrukte: If ... Then und Select Case. Beide funktionieren ähnlich.
Beispiel für If ... Then
If [Bedingung] Then
[Anweisung]
ElseIf [Bedingung] Then
[Anweisung]
...
Else
[Anweisung]
End If
Beispiel für Select Case - der Zustand einer Variablen Zahl i wird ausgewertet
Select Case i
Case i = 1
[Anweisung]
Select Case i = 2 To 10
[Anweisung]
...
Case Else
[Anweisung]
End Select
Schleifen
Schleifen benutzt man, um Code immer wieder ablaufen zu lassen, bis ein bestimmter Zustand erreicht ist.
Für verschieden Zwecke gibt es unterschiedliche Schleifen
Do...Loop: Ausführen der Schleife, wenn (oder solange bis) eine Bedingung dem Wert True entspricht.
For...Next: Verwenden eines Zählers, um Anweisungen mit einer festgelegten Anzahl an Wiederholungen auszuführen.
For Each...Next: Wiederholen einer Gruppe von Anweisungen für jedes Element/Objekt in einer Auflistung.
Beispiele und Erläuterungen folgen nächste Woche.