Richtig einsteigen: Access 2013 VBA

Werbung
Lorenz Hölscher
Richtig einsteigen:
Access 2013 VBA-Programmierung
Von den Grundlagen bis zur professionellen Entwicklung
Lorenz Hölscher
Richtig einsteigen:
Access 2013 VBA-Programmierung
Von den Grundlagen bis zur professionellen Entwicklung
Lorenz Hölscher: Access 2013 VBA-Programmierung
Copyright © 2013 O’Reilly Verlag GmbH & Co. KG
Das in diesem Buch enthaltene Programmmaterial ist mit keiner Verpflichtung oder Garantie irgendeiner
Art verbunden. Autor, Übersetzer und der Verlag übernehmen folglich keine Verantwortung und werden
keine daraus folgende oder sonstige Haftung übernehmen, die auf irgendeine Art aus der Benutzung
dieses Programmmaterials oder Teilen davon entsteht. Die in diesem Buch erwähnten Software- und
Hardwarebezeichnungen sind in den meisten Fällen auch eingetragene Marken und unterliegen als
solche den gesetzlichen Bestimmungen. Der Verlag richtet sich im Wesentlichen nach den Schreibweisen
der Hersteller.
Das Werk einschließlich aller Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen
Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlags unzulässig und strafbar. Das gilt
insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und
Verarbeitung in elektronischen Systemen.
Die in den Beispielen verwendeten Namen von Firmen, Organisationen, Produkten, Domänen, Personen,
Orten, Ereignissen sowie E-Mail-Adressen und Logos sind frei erfunden, soweit nichts anderes angegeben
ist. Jede Ähnlichkeit mit tatsächlichen Firmen, Organisationen, Produkten, Domänen, Personen, Orten,
Ereignissen, E-Mail-Adressen und Logos ist rein zufällig.
Kommentare und Fragen können Sie gerne an uns richten:
Microsoft Press Deutschland
Konrad-Zuse-Straße 1
85716 Unterschleißheim
E-Mail: [email protected]
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
15 14 13
Druck-ISBN 978-3-86645-2251
PDF-ISBN 978-3-8483-30249
EPUB-ISBN 978-3-8483-01577
MOBI-ISBN 978-3-8483-11606
© 2013 O’Reilly Verlag GmbH & Co. KG
Balthasarstr. 81, 50670 Köln
Alle Rechte vorbehalten
Korrektorat: Karin Baeyens, Siegen
Lektorat: René Majer, [email protected]
Layout: Helmut Kraus, www.exclam.de
Satz: Gerhard Alfes, mediaService, Siegen (www.mediaservice.tv)
Umschlaggestaltung: Helmut Kraus, www.exclam.de
Gesamtherstellung: Kösel, Krugzell (www.KoeselBuch.de)
Inhaltsverzeichnis
Teil I: Erste Schritte
1
Einleitung 11
1.1
Die Themenschwerpunkte dieses Buchs Visual Basic for Applications Die Beispieldatenbank Wie Sie am besten mit diesem Buch arbeiten Aufbau des Buchs Die Icons Unterstützung für dieses Buch Genug der Vorrede und hinein ins Vergnügen 11
11
12
15
15
16
16
17
1.2
Teil II: Grundlagen von VBA
2
Die ersten VBA-Prozeduren erstellen 19
2.1
2.3
Die Programm-Oberfläche Wichtige Komponenten des VBA-Editors Das »klassische« erste Programm erstellen »Hello world!« unter der Lupe Weitere Parameter nutzen Eigene Prozeduren aufrufen Funktion mit Parametern Funktionen auch außerhalb von VBA aufrufen Properties Prozeduren verlassen Kommentare Übungen zu diesem Kapitel 19
19
21
23
24
26
32
39
40
44
45
45
3
Datentypen und Variablen 47
3.1
Datentypen im Überblick Die Speicherung von Daten im Computer Sonstige Datentypen Namen für Variablen Groß- und Kleinschreibung von Namen Ungarische Notation 47
47
52
54
54
55
2.2
3.2
6
3.3
3.4
Inhaltsverzeichnis
3.5
Deklaration von Variablen Gültigkeitsbereiche Lokale Gültigkeit Modul-öffentliche Gültigkeit Datei-öffentliche Gültigkeit Private Prozeduren und Module Übungen zu diesem Kapitel 56
64
65
66
69
75
78
4
Datentyp-Sammlungen 79
4.1
4.2
4.3
Spezielle Variablen im Überblick Eigene Datentypen Typ-Definitionen für API-Aufrufe Bessere Listenauswahl mit Enumerationen Arrays Mehrdimensionale Arrays Variant als Pseudo-Array Collection Übungen zu diesem Kapitel 79
79
83
85
89
93
93
95
96
5
Operatoren, Entscheidungen und Schleifen 97
5.1
5.2
Vergleichsoperatoren Logische Operatoren Nutzung von VBA-Konstanten in SQL Verzweigungen Bedingung überprüfen Die Select-Anweisung Schleifen For/Next-Schleifen For Each/Next-Schleifen Do/Loop While/Wend-Schleife Übungen zu diesem Kapitel 97
98
109
112
112
119
123
124
129
134
142
143
6
Fehler und Ausnahmen behandeln 145
6.1
Fehlerfreie Programme Fehler provozieren Fehlerbehandlung ankündigen Fehler beheben Fehler ignorieren Zentrale Fehlerbehandlung 145
146
147
150
151
153
4.4
4.5
4.6
4.7
5.3
5.4
5.5
Inhaltsverzeichnis
6.2
6.3
Programmablauf verfolgen Code zeilenweise ausführen Code anhalten Überwachungen hinzufügen Übungen zu diesem Kapitel 7
156
156
156
157
158
7
Klassen 159
7.1
7.2
Einführung in Klassenkonzepte Grundgerüst einer Klasse Eine erste Mini-Klasse Initialisieren und Terminieren Entwurf der Stoppuhr-Klasse Funktionalität ergänzen Bessere Funktionalität Aufgaben unterschiedlich lösen Gleiche Schale – anderer Kern Implements als »Klassen-Aufsicht« Klassen mit Unterobjekten Objekte von Objektauflistungen Klassen mit Oberfläche Übungen zu diesem Kapitel 159
159
160
161
163
164
165
170
173
176
180
181
185
188
7.3
7.4
7.5
7.6
7.7
7.8
7.9
7.10
Teil III: Datenzugriff
8
Domänen-Funktionen 189
8.1
8.2
Zugriff auf Daten per Methode Einfacher Zugriff Langsamer Zugriff Weitere Einschränkungen Übungen zu diesem Kapitel 189
191
192
193
194
9
Recordsets 195
9.1
9.2
Zugriff auf Tabellen und Abfragen Datensatzwechsel Prüfung auf vorhandene Datensätze Zugriff auf viele Datensätze Zugriff auf verschachtelte Datensätze Datensatz-Typen Datenquelle filtern Daten zusammenfassen Suchen und Finden 195
199
200
201
203
206
208
210
217
9.3
9.4
9.5
9.6
8
9.7
Inhaltsverzeichnis
Daten schreiben Datensätze anfügen Datensätze verändern SQL und VBA gemeinsam SQL-Aktionen ohne Warnmeldung Gespeicherte Aktionsabfragen ohne Warnmeldung Transaktionen Zugriff auf andere Programme Excel schreibt in Access-Tabellen Access schreibt in Word-Dokumente Übungen zu diesem Kapitel 224
225
230
231
231
232
233
236
236
239
241
10
Formulare 243
10.1
10.3
10.4
10.5
Programmierte Formulare Ereignisse Kontrollelemente per VBA ansprechen Andere Formulare steuern Unterformulare Weitere Formular-Steuerungen Benutzeranmeldung Haupt- und Unterformulare Dynamische Formulare Übungen zu diesem Kapitel 243
244
247
254
254
260
264
272
287
327
11
Berichte 329
11.1
Programmierte Berichte Berichte mit gemeinsamen Titeln Berichte mit dynamischen Inhalten Programmiertes Wasserzeichen Übungen zu diesem Kapitel 329
329
332
334
338
9.8
9.9
9.10
9.11
10.2
11.2
Teil IV: Anwendungen erstellen
12
Start-Einstellungen 339
12.1
AutoStart-Methoden Das Makro AutoExec Start-Dialog Start-Makros umgehen Notausstieg Start-Logo Übungen zu diesem Kapitel 339
339
340
341
342
343
344
12.2
12.3
12.4
Inhaltsverzeichnis
9
13
Menüband anpassen 345
13.1
Eigene Register Konzept eigener Register Access-Optionen Gruppen hinzufügen Callback-Prozeduren Kontrollelemente dynamisch aktivieren Besser als Menüs: Listen Menüband-Variable wiederherstellen Übungen zu diesem Kapitel 345
346
346
351
356
361
366
375
378
14
Sonstige Optimierungen 379
14.1
14.5
14.6
Weitere Verbesserungen SQL-gerechtes Datum Listen programmieren Listen mit Callback-Technik Callback-Funktion schreiben Fiktive Daten anzeigen Listen mit Mehrfachauswahl Aktualisierungsmeldungen Textmeldung in der Statuszeile Fortschrittsbalken in der Statuszeile Formular-Status ermitteln Parameterabfragen kapseln Abfragen mit Funktionen Externe Berichte einbinden Übungen zu diesem Kapitel 379
379
380
380
383
387
389
390
390
391
393
394
397
401
407
15
Lösungen zu allen Übungen 409
16
Stichwortverzeichnis 433
13.2
14.2
14.3
14.4
Die Themenschwerpunkte dieses Buchs
Herzlich willkommen bei »Access 2013 VBA-Programmierung«. Dieses Buch erläutert
den Einsatz von VBA in Access 2013 und zeigt, wie Sie damit professionelle DatenbankProgramme erstellen. Mit dieser Zielformulierung sind die drei Themenschwerpunkte
beschrieben, die in diesem Buch besprochen und in den nächsten Abschnitten kurz vorgestellt werden.
Visual Basic for Applications
Access 2013 selbst ist ein relationales Datenbank-Management-System, mit dem Sie eine
komplette Datenbank von der Speicherung der Daten in Tabellen bis zur Ausgabe in Berichten erstellen können. Zusätzlich enthält Access mit VBA (Visual Basic for Applications) noch
eine sehr mächtige Programmiersprache, die allen Wünschen und Anforderungen an ein
modernes Programm gewachsen ist. Damit können Sie Access 2013 um praktisch jede beliebige Funktionalität erweitern. Ein paar der Highlights finden Sie in der folgenden Aufstellung:
zzAusgefeilter Code-Editor mit Code-Farbgebung, der beispielsweise Schlüsselwörter
farbig hervorhebt und Syntaxfehler markiert
zzIntelliSense-Auswahllisten, die sich öffnen, während Sie Code eintippen, und sinnvolle
Vorschläge zur automatischen Vervollständigung des Programmcodes machen
zzIntegrierter Debugger, der Sie beim Erkennen und Beheben von Fehlern in Ihren Pro-
grammen unterstützt
zzUmfangreiche, kontextsensitive Hilfe, die gerade bei den ersten Schritten und den ersten
Programmierprojekten sehr hilfreich ist
Alle diese Bestandteile von VBA in Access 2013 werden Sie im Laufe dieses Buchs
kennenlernen.
Die Datenbank-Beispiele sind so gewählt, dass sie mit möglichst wenigen Dateien durchgeführt werden können. Das erspart Ihnen das Abtippen immer neuer Beispiele und zeigt
sehr gut das sinnvolle Zusammenspiel verschiedener Prozeduren. Die Informationen sind
dabei selbstverständlich immer so aufbereitet, dass sie in einem konkreten Bezug zu dem
jeweiligen Projekt oder der aktuellen Aufgabe stehen, um die Praxisnähe der vermittelten
Kenntnisse zu gewährleisten.
1.1
I – Erste Schritte
Einleitung
12
Kapitel 1: Einleitung
Recht typisch ist es dabei für Access, dass zu einem Thema auch Techniken aus verschiedenen Bereichen eingesetzt werden müssen. Ich werde also immer wieder auf bereits besprochene Themen zurückgreifen, diese für eine neue Aufgabe noch einmal vertiefen und dabei
so abwandeln, dass Sie wieder einen neuen Aspekt oder eine Verbesserung darin entdecken.
Gelegentlich wird es sich auch nicht vermeiden lassen, Themen anzureißen, deren detaillierte
Erläuterung erst in einem späteren Kapitel folgt. Dafür sehen Sie in einem solchen Zusammenhang dann schon vorausschauend viel besser, wofür die jeweilige Technik geeignet ist.
Auch und gerade bei der VBA-Programmierung zeichnet sich eine gute Lösung gelegentlich
sogar dadurch aus, dass bewusst auf den Einsatz von VBA verzichtet und stattdessen auf
bereits eingebaute Access-Fähigkeiten zurückgegriffen wird. Schließlich möchte ich Ihnen
nicht Programmierung um ihrer selbst willen zeigen, sondern als Werkzeug für effektive
Lösungen. Gerade das zeigt aber die Leistungsfähigkeit von Access, indem es für alle Aufgabenstellungen immer auch eine Lösung gibt, meistens sogar eine leichtere als Sie denken.
Dieses Buch wird Ihnen helfen, solche Lösungen zu finden.
Dieses Buch geht davon aus, dass Sie sich mit der Datenmodellierung und der grundsätz­
lichen Bedienung von Access 2013 auskennen.
Ausführliche Informationen zu diesen Themen finden Sie im Buch »Desktop- und WebDatenbanken entwickeln mit Access 2013«, das ebenfalls bei Microsoft Press erschienen ist.
Als kleine Leseprobe steht Ihnen das Kapitel »Grundlagen des Datenbankdesigns« kostenlos
als Download zur Verfügung.
Die Datei finden Sie unter
www.microsoft-press.de/support/9783866452251
oder
msp.oreilly.de/support/2359/787
Die Beispieldatenbank
Für fast alle Beispiele in diesem Buch werde ich auf zwei Datenbanken (Grundlagen.accdb
und Umbuchung.accdb) zurückgreifen, die Sie selbstverständlich auch downloaden können.
Sie sind so angelegt, dass möglichst wenig Schreibarbeit notwendig ist, auch wenn sich
eine gewisse Komplexität natürlich nicht vermeiden lässt. Schließlich ist die VBA-Programmierung ja gerade dann nötig, wenn Sie über die normalen Möglichkeiten einer Access
2013-Datenbank hinausgehen wollen.
Die Beispieldatenbank – und alle anderen Beispielprojekte – finden Sie unter
www.microsoft-press.de/support/9783866452251
und
msp.oreilly.de/support/2359/787
Die hier eingesetzte Datenbank Umbuchung.accdb steht für einen fiktiven Online-Shop
namens »Umbuchung«, in dem gebrauchte und insbesondere antiquarische Bücher gehandelt werden können. Dabei tritt nicht nur der Shop-Betreiber als Verkäufer auf, sondern die
Käufer können sich ebenso selbst als Verkäufer eintragen und eigene Bücher anbieten.
Das Konzept hat durchaus Ähnlichkeiten mit Teilen von Amazon.de oder eBay, allerdings
geht es hier gerade nicht um die Internet-Anbindung des Beispiels. Natürlich wäre das
technisch möglich, aber ich möchte Ihnen ja die Access-Möglichkeiten zeigen. Nehmen wir
also an, dass ein Verbund aus Buchhändlern und interessierten Fachleuten etwa aus dem
Universitätsbereich direkten Zugriff auf diese Datenbank hat.
Beschreibung der Datenbank
Die Aufgaben des Systems lassen sich recht einfach beschreiben:
zzEinzelne Benutzer müssen sich eintragen können und ihre Stammdaten als Käufer und/
oder Verkäufer hinterlegen können
zzZu jedem Benutzer müssen mehrere Adressen gespeichert werden, weil sich Rech-
nungs- und Lieferadresse unterscheiden können. Auch die Angabe weiterer Adressen für
Geschenklieferungen ist damit möglich.
zzAuf einer Bestellung (im Internet meistens als Warenkorb bezeichnet) werden beliebig
viele Artikel gesammelt, bestätigt und deren Lieferstatus verfolgt
zzBenutzer ohne vollständige Verkäufer-Daten dürfen keine Artikel zum Verkauf anbieten.
Benutzer ohne Käufer-Daten dürfen zwar Artikel auf einer Bestellung sammeln, aber
noch nicht bestätigen. Daher ist es wichtig, den Status zu unterscheiden.
zzDa bei Remittenden (an den Verlag zurückgelieferte Bücher) für den Verkäufer die
Möglichkeit besteht, weitere Exemplare nachzuordern, kann hier ein Mindestbestand
angegeben werden, ab dem nachbestellt wird
zzFür jede Bestellung muss die Datenbank prüfen, ob die vorhandene Lagermenge aus-
reicht oder nötigenfalls weniger Exemplare geliefert werden
zzAuch Bücher verkaufen sich besser mit Fotos. Damit diese die Datenbank nicht unnötig
aufblähen, sollen sie in einem Verzeichnis abgelegt und bei Bedarf nachgeladen werden,
sodass auch mehrere Angebote das gleiche Foto benutzen können. Falls kein Foto
vorhanden ist, soll wenigstens ein Standardbild erscheinen.
zzAlle Formulare sollen sinnvoll untereinander verknüpft sein, damit ein Benutzer beispiels-
weise vom Artikelformular direkt zu den Stammdaten genau dieses Verkäufers gelangt
Natürlich ist manches davon mit den umfangreichen Fähigkeiten von Access 2013 bereits
ohne Programmierung lösbar. Aber VBA wird die Leistungsfähigkeit und Bedienungsfreundlichkeit einer solchen Datenbank erheblich verbessern und an manchen Stellen überhaupt
erst sicherstellen.
I – Erste Schritte
1.1 Die Themenschwerpunkte dieses Buchs13
14
Kapitel 1: Einleitung
Datenbank-Modell
Das Datenbank-Modell des Beispiels sieht aus wie in Abbildung 1.1. Dabei enthalten alle
Feldnamen in leichter Abwandlung der Ungarischen Notation (siehe Kapitel 3) ein dreibuchstabiges Präfix für ihren jeweiligen Tabellennamen. Dadurch sind sie datenbankweit
eindeutig und unproblematisch zu benutzen.
Wenn Sie wie hier die Master-Tabellen (die 1er-Seiten der 1:n-Beziehungen) höher als die
Detail-Tabellen (die n-Seiten) anordnen, werden die problematischen Tabellen schnell deutlich. Je tiefer eine Tabelle in diesem Modell ist, desto mehr Daten enthält sie. Daher müssen
Sie sich dort viel intensiver mit Zugriffsgeschwindigkeiten und Platzverbrauch beschäftigen.
Abbildung 1.1: Das
Tabellen-Modell der
Beispieldatenbank
Umbuchung.accdb
Das Modell ist sicherlich einfacher zu verstehen, wenn wir es einmal gemeinsam betrachten:
zzDie Tabelle tblKunden enthält die Liste aller Käufer und Verkäufer, allerdings nur mit
minimalem Dateninhalt. Zu der eindeutigen ID gibt es ein paar Angaben über Konto und
E-Mail, die im wirklichen Leben sicherlich ausführlicher gestaltet wären. Außerdem kann
jeder Kunde verschiedene Funktionen annehmen: als (nicht komplett angemeldeter)
Interessent, nur Käufer, nur Verkäufer oder beides.
zzDie Adresse ist ausdrücklich nicht Bestandteil eines Kunden-Datensatzes, weil dieser ja
mehrere Adressen nennen darf. In tblTypen stehen verschiedene Arten von Adressen wie
Lieferadresse oder Rechnungsadresse.
zzDie Tabelle tblAdressen enthält alle Adressen mit jeweils dem Verweis auf die eindeutige
Kennung kndID des Kunden und typID des Adressen-Typs
zzNicht vom Kunden, sondern erst von einer (Liefer-)Adresse ausgehend kann eine Bestel-
lung in tblBestellungen angelegt werden. Damit ist wegen der Beziehungen sowohl deren
Zieladresse als eben auch deren Empfänger klar. Ebenfalls zur Bestellung gehört die
Rechnungsadresse, die identisch sein kann, aber nicht muss.
zzUm den Fortschritt der Bestellung und der späteren Lieferung verfolgen zu können,
enthält die Tabelle tblBestellungen mehrere Datumsfelder für die verschiedenen Stadien,
1.2 Wie Sie am besten mit diesem Buch arbeiten15
I – Erste Schritte
die eine Bestellung durchlaufen kann. Um das Datenmodell einfach zu halten, wird die
Bestellung grundsätzlich nur als Ganzes abgewickelt, Teillieferungen oder die Rückgabe
einzelner Artikel sollen hier nicht abgebildet werden.
zzJede Bestellung enthält in tblBestellungenDetails eine beliebige Anzahl zu liefernder
Artikel mit einer Bestellmenge und (wenn nicht ausreichend Exemplare lieferbar waren)
einer davon eventuell abweichenden Liefermenge
zzDie Auswahl für diese Bestell-Details basiert auf tblArtikel mit den Angaben zu den
Büchern. Dort stehen sowohl konkrete Informationen zu den angebotenen Exemplaren
als auch der Verweis auf den Verkäufer. Dieser wiederum kommt aus der Tabelle
tblKunden.
Diese Hinweise sollten für ein erstes Verständnis der Beispieldatenbank ausreichen. Konkretere Angaben werde ich nachreichen, wenn es für den jeweiligen Programmcode notwendig
ist.
Sollte Ihnen jetzt der Kopf rauchen, dann machen Sie sich keine Sorgen. Access 2013 bleibt
trotz aller Komplexität auch für schwierigste Aufgaben ein einfach und übersichtlich zu
bedienendes Programm.
Wie Sie am besten mit diesem Buch arbeiten
Dieses Buch macht Sie mit der Entwicklung von VBA in einer Access 2013-Datenbank vertraut
– Das geht leichter, als Sie denken. In kurzer Zeit werden Sie über das nötige Know-how
verfügen, um ansprechende Ergebnisse zu erzielen. Zugleich erwerben Sie das entsprechende Know-why, das heißt, Sie erfahren immer auch, warum etwas in einer bestimmten
Weise funktioniert.
Aufbau des Buchs
Ein VBA-Programm versucht, genau wie eine Datenbank, einen Ausschnitt der Wirklichkeit
abzubilden. Dabei muss es natürlich vereinfachen und abstrahieren, aber genau das hilft
oftmals, ein Problem klarer zu formulieren. Sobald Sie die Frage richtig stellen, liegt die
Antwort meistens schon bereit, denn der schwierigste Teil besteht darin, die Frage, also das
Problem, zu präzisieren.
Im Laufe des Buchs zeige ich Ihnen Methoden und Techniken, mit denen Sie die richtigen Fragen zu stellen lernen und damit die meisten Klippen einer Code-Entwicklung schon umschifft
haben. Das ist schließlich keine Geheimwissenschaft, sondern ein ganz solides Handwerk,
welches sich mit ein wenig Unterstützung lernen lässt.
Diesem Ansatz folgend ist das Buch in vier Teile untergliedert, die Sie am besten von vorne
nach hinten lesen und durcharbeiten, da die Informationen der einzelnen Kapitel aufeinander
aufbauen.
1.2
16
Kapitel 1: Einleitung
Teil I »Erste Schritte« enthält diese Einleitung mit der Erläuterung der Beispieldatenbank und
zeigt Ihnen vor allem, welche Möglichkeiten Access-VBA bietet.
Teil II »Grundlagen der VBA-Programmierung« stellt Ihnen an vielen praktischen Beispielen
die grundlegenden Sprachelemente und Konzepte von VBA vor. Sie werden hier bestimmt
auch dann Neues entdecken, wenn Sie schon in einer anderen Sprache programmiert haben.
Teil III »Datenzugriff« beschäftigt sich mit dem Lesen und Schreiben von Daten in Datenbanken. Hier werde ich Ihnen verschiedene Alternativen des Datenzugriffs vorstellen, damit Sie
sehen, wie Sie zu Ihrer Aufgabe die passende Prozedur erstellen. Dabei geht es nicht nur um
den Zugriff auf die Tabellen und Abfragen einer Datenbank, sondern auch auf die Daten in
Formularen oder Berichten.
Teil IV »Anwendungen erstellen« nennt schließlich Optimierungen für Ihre Datenbank, die
bei den vorherigen Themen noch nicht zur Sprache kamen. Das umfasst sowohl Anpassungen des Menübands und eigene Tastenkürzel als auch die Nutzung externer Funktionen, um
die Leistungsfähigkeit Ihrer Datenbank zu verbessern.
Alle Adressen oder Namen von Personen, Buchtiteln und Firmen sind selbstverständlich
völlig frei erfunden.
Die Icons
Hin und wieder empfiehlt es sich, bestimmte Informationen in eigenen Absätzen
auszuzeichnen.
Wichtig
Der Textmarker weist Sie auf etwas hin, worauf Sie unbedingt
achten sollten.
Tipp
Hier erfahren Sie, wie Sie etwas besonders einfach und elegant
erledigen können.
Hintergrund
Absätze mit diesem Icon geben Ihnen wichtige Hintergrundinformationen und erklären, warum etwas in einer bestimmten
Weise funktioniert.
Unterstützung für dieses Buch
Der Verlag hat auch von seiner Seite alles unternommen, um die Richtigkeit des Buchinhalts
und des Bonusmaterials sicherzustellen. Etwaige Korrekturen und Änderungen finden Sie
unter folgender Adresse:
http://www.microsoft-press.de/support.asp
Tragen Sie dazu in das untere der beiden Eingabefelder für die ISBN-Nummer die Ziffern 225
ein und klicken Sie dann auf Suchen.
1.2 Wie Sie am besten mit diesem Buch arbeiten17
[email protected]
oder per Post an
Microsoft Press
Konrad-Zuse-Str. 1
85716 Unterschleißheim
Beachten Sie, dass Microsoft Press unter diesen Adressen keinen Support für Software­
produkte leistet.
Genug der Vorrede und hinein ins Vergnügen
Viel Spaß beim Entwickeln Ihrer Datenbanken wünscht Ihnen
Lorenz Hölscher
I – Erste Schritte
Wenn Sie Kommentare, Fragen oder Anregungen zum Inhalt dieses Buchs oder des Begleitmaterials haben, senden Sie eine E-Mail an folgende Adresse bei Microsoft Press:
Die ersten VBA-Prozeduren erstellen
Die Programm-Oberfläche
2.1
�I – G��n�la��� v�� ��A
Access 2013 ist ein Datenbank-Management-System, also ein Programm, das es Ihnen
erlaubt, effektiv mit Datenbanken zu arbeiten. Zusätzlich enthält es eine integrierte
Programmier-Umgebung für VBA (Visual Basic for Applications), mit der die Datenbank
gesteuert werden kann. Um diesen VBA-Editor und seine Inhalte geht es bei der Programmierung mit VBA.
Wichtige Komponenten des VBA-Editors
Während die Programm-Oberfläche von Access 2013 gegenüber früheren Versionen u. a.
durch die Menübänder erheblich verändert wurde, wird der VBA-Editor zur Eingabe der
Prozeduren weiterhin mit herkömmlichen Menüs bedient.
Wenn Sie mit dem VBA-Editor noch nicht vertraut sind, schauen Sie sich ihn am besten zuerst
einmal gründlich an:
a Starten Sie Access 2013 und erstellen Sie eine neue, leere Datenbank namens Grundlagen.accdb. Die darin automatisch angelegte leere Tabelle Tabelle1 können Sie löschen,
denn Sie beginnen zunächst einmal ohne Daten.
Abbildung 2.1: Eine
neue, leere Datenbank
anlegen
20
Kapitel 2: Die ersten VBA-Prozeduren erstellen
b Gehen Sie in der Registerkarte ERSTELLEN in die Gruppe Makros und Code und klicken
darin auf Modul.
Abbildung 2.2: Fügen
Sie ein neues Modul
hinzu
c Sie befinden sich nun im VBA-Editor und sehen links den Projekt-Explorer mit dem
Überblick über alle in der Datenbank enthaltenen Module und rechts im großen Fenster
die Code-Ansicht. Unten links ist das Eigenschaftenfenster zu sehen.
Abbildung 2.3: Der VBAEditor mit einem leeren
Modul
Dieser VBA-Editor besteht aus vielen Komponenten, die Sie möglicherweise von anderen
Windows-Anwendungen her schon kennen:
zzMenüleiste: In der Menüleiste finden Sie alle Befehle, die Sie für das Erstellen, das
Ausführen und die Fehlersuche in Ihren Prozeduren benötigen.
zzSymbolleiste: Unterhalb der Menüleiste sehen Sie links die Standardsymbolleiste mit
zahlreichen Schaltflächen (wie Speichern, Rückgängig, Wiederholen, usw.), die Ihnen
sicherlich von anderen Anwendungen her bekannt sind. Wie gewohnt können Sie andere
Symbolleisten manuell sichtbar machen: Klicken Sie dazu eine sichtbare Symbolleiste mit
der rechten Maustaste an und wählen Sie den Namen der Symbolleiste aus, welche Sie
ein- oder ausblenden wollen. Für die bequeme Arbeit kann ich Ihnen hier vor allem die (im
Bild rechts schon sichtbare) Symbolleiste Bearbeiten empfehlen, da diese die Symbole zum
Kommentieren von Code enthält (rechts neben der Hand).
zzProjekt-Explorer: Links im Fenster zeigt der Projekt-Explorer auf der obersten Ebene
alle geöffneten Datenbanken an. Hier sehen Sie natürlich die von Ihnen geöffnete Datenbank Grundlagen.accdb. Dort können aber auch noch weitere Dateien erscheinen, nämlich die (Abfrage-, Formular- oder Berichts-)Assistenten, die in Wirklichkeit versteckte
Datenbanken sind. Dann finden Sie im Projekt-Explorer beispielsweise zusätzlich eine
Datei acwzmain.accde, welche die wesentlichen Assistenten (acwzmain = Access Wizard
Main) enthält.
2.2 Das »klassische« erste Programm erstellen
21
Unterhalb der Dateiebene listet Access im Projekt-Explorer Kategorien wie Module sowie
zukünftig noch Klassenmodule und Microsoft Office Access Klassenobjekte auf, sobald sie
in der Datenbank enthalten sind. Bei Letzteren handelt es sich übrigens um den VBACode ganz normaler Access-Formulare und -Berichte.
Sie können diese gruppierte Darstellung durch Klick auf das Ordnersymbol im ProjektExplorer umschalten, ich werde hier allerdings aus Gründen der besseren Übersichtlichkeit die gruppierte Darstellung beibehalten.
zzCodefenster: Den größten Teil der Ansicht nimmt rechts das Codefenster in Anspruch.
In ihm findet die eigentliche Programmierung statt, daher verhält es sich weitgehend wie
ein spezieller Text-Editor. Sie finden dort schon die Codezeile Option Compare Database
eingetragen. Auch wenn im Folgenden der Code ganzer Module abgedruckt wird, werde
ich diese Zeile nicht jedes Mal wiederholen.
Das »klassische« erste Programm erstellen
2.2
Es ist gute Tradition, dass das erste Programm, das man in einer neuen Programmiersprache
erstellt, einfach nur den Text »Hello World« auf dem Bildschirm ausgibt. Wenn das klappt,
haben Sie alle notwendigen Handgriffe für ein komplettes Programm korrekt durchgeführt.
Ich möchte mich dieser Tradition anschließen, da der Quellcode extrem kurz ist und trotzdem
alle wichtigen Elemente enthält. Sein Verständnis ist ein gutes Fundament für das Erstellen
weiterer Programme.
a Klicken Sie unterhalb von Option Compare Database in das Codefenster und fügen nach
Wunsch mit der Eingabetaste noch ein paar Leerzeilen hinzu.
b Schreiben Sie dort Sub Hallo an den Anfang einer Zeile.
c Beenden Sie diese Zeile mit der Eingabetaste, sodass der VBA-Editor automatisch ein
Paar runde Klammern und zwei Zeilen tiefer ein End Sub ergänzt. Damit ist der sogenannte
Prozedurrumpf fertig, es fehlt nur noch eine auszuführende Anweisung darin.
Abbildung 2.5: Eine
erste, noch leere
Prozedur
�I – G��n�la��� v�� ��A
Abbildung 2.4: Der
Projekt-Explorer
mit Beispielen aller
Kategorien
22
Kapitel 2: Die ersten VBA-Prozeduren erstellen
d Die Einfügemarke blinkt nun in der mittleren leeren Zeile. Wegen der besseren Übersichtlichkeit rücken Sie dort bitte mit der Tabulatortaste ein und schreiben msgbox dahinter.
e Sobald Sie danach ein Leerzeichen eingeben, erscheint automatisch ein sogenanntes QuickInfo. Dabei handelt es sich um ein kleines gelbes Fenster mit Informationen zur Benutzung
dieses Befehls. Das bedeutet vor allem, dass es den Befehl msgbox tatsächlich gibt.
Abbildung 2.6: Das
QuickInfo zum Befehl
MsgBox
f Das QuickInfo zeigt fett markiert dasjenige Argument an, dessen Eingabe jetzt erforderlich ist. Die weiteren Argumente wären durch Komma getrennt und würden dann
entsprechend im QuickInfo fett erscheinen. Das Argument Prompt ist ein Text- oder
Zeichenketten-Datentyp (was hier aber nirgends ersichtlich ist) und muss angegeben
werden. Alle übrigen Argumente dieser Prozedur sind optional und stehen deswegen in
eckigen Klammern.
g Geben Sie nun bitte ”Hello world!” mit den Anführungszeichen ein und verlassen Sie
die Zeile mit der PfeilUnten-Taste. Benutzen Sie dazu nicht die Eingabetaste, denn dann
erzeugen Sie nur unnötige Leerzeilen.
Abbildung 2.7: Die
fertige Prozedur
h Der VBA-Editor nimmt nun automatisch eine Prüfung auf korrekte Benutzung aller
Befehle (die sogenannte Syntaxprüfung) vor und ändert die Kleinschreibung von msgbox in
die vorgegebene MsgBox-Schreibweise.
i Sollte Ihnen hier ein Fehler unterlaufen, meldet sich der Editor sofort beim Verlassen der
Zeile, färbt diese rot und markiert den vermutlich fehlerhaften Teil. Außerdem erscheint
eine Meldung mit einer Erläuterung zum Fehler.
Abbildung 2.8: Ein
provozierter Fehler,
denn der Punkt gehört
nicht in die Zeile
2.2 Das »klassische« erste Programm erstellen
23
j Wenn alles in Ordnung ist, können Sie dieses Programm oder besser diese Prozedur
starten. Dazu klicken Sie irgendwo zwischen Sub und End Sub in den Code und drücken die
Taste F5. Die so markierte Prozedur Hallo wird gestartet und Sie sehen das Ergebnis des
MsgBox-Befehls.
Abbildung 2.9: Das vom
MsgBox-Befehl erzeugte
Meldungsfenster
k Das Meldungsfenster bleibt so lange stehen, bis Sie es durch einen Klick auf OK schlie-
�I – G��n�la��� v�� ��A
ßen. Erst dann läuft auch der Code weiter, selbst wenn – wie in diesem Beispiel – keine
Anweisungen mehr folgen.
»Hello world!« unter der Lupe
Auch wenn dieses kleine Programm nicht viel macht, so sind darin doch viele wesentliche
Konzepte der VBA-Programmierung enthalten:
zzDamit eine Prozedur überhaupt erstellt werden kann, braucht sie einen Namen. Dieser
muss (innerhalb eines Moduls) eindeutig sein und darf nicht mit einem reservierten
Schlüsselwort oder einem schon vorhandenen VBA-Befehl identisch sein.
zzDie Prozedur hat einen sogenannten Rumpf, also die Konstruktion aus Sub ... End Sub,
welche die Grenzen der von diesem Namen bezeichneten Prozedur angibt
zzInnerhalb des Prozedurrumpfs dürfen beliebig viele Zeilen mit je einem Befehl stehen,
auch wenn das eben noch nicht zu sehen war
zzEine Prozedur kann durch Markieren des Codes und Drücken der F5-Taste gestartet
werden
zzAlternativ können Sie eine Prozedur auch mit dem Menübefehl Ausführen Sub/Userform
ausführen starten. Wenn keine ausführbare Prozedur markiert war, erscheint sowieso der
Dialog aus Abbildung 2.10 mit all diesen Prozeduren zur Auswahl.
Abbildung 2.10: Der
Dialog zur Auswahl
einer Prozedur
24
Kapitel 2: Die ersten VBA-Prozeduren erstellen
Damit haben Sie eine eigene Prozedur erstellt und auch erfolgreich aufgerufen. Grundsätzlich wird dieser Ablauf so bleiben, auch wenn es natürlich noch eine Vielzahl an Veränderungen in Details geben wird.
Denken Sie jetzt bitte noch daran, das Modul mit dem Befehl Datei/Grundlagen speichern zu
sichern. Der wenig sprechende Name Modul1 ist hier im Moment ausreichend. Das Modul
ist Teil der Grundlagen.accdb-Datenbank und daher auch in der Access 2013-Oberfläche im
Navigationsbereich zu sehen.
Abbildung 2.11: Der
Navigationsbereich der
Datenbank zeigt das
Modul an
Weitere Parameter nutzen
Wie Sie vielleicht anhand des QuickInfos schon bemerkt hatten, kennt der MsgBox-Befehl
noch weitere Parameter. Manchmal werden diese übrigens auch als Argumente bezeichnet,
was dasselbe bedeutet. Die folgenden Parameter des MsgBox-Befehls sind jedoch optional,
können also bei Bedarf weggelassen werden.
a Erstellen Sie bitte im gleichen Modul eine neue Prozedur HalloMitIcon, indem Sie in einer
neuen Zeile Sub HalloMitIcon schreiben und mit der Eingabetaste bestätigen.
b In der Prozedur rücken Sie ebenfalls mit der Tabulatortaste ein und schreiben MsgBox
”Hello world!”. Bis dahin ist außer dem Namen alles genauso wie im ersten Beispiel.
c Nun folgt dem ersten Argument aber ein Komma, woraufhin sofort eine Liste der sogenannten IntelliSense-Technik ausklappt. Diese Technik sorgt dafür, dass in der bereitgestellten Liste nur die Parameter (oder bei Bedarf auch Prozeduren, Methoden oder
Eigenschaften) angezeigt werden, die an dieser Stelle überhaupt sinnvoll nutzbar sind.
d Beginnen Sie, die Buchstaben vbi zu tippen. Die Auswahl springt in der Liste an die
nächste Position, die zu diesem Wortanfang passt.
Abbildung 2.12: Die
IntelliSense-Liste für
das zweite Argument
2.2 Das »klassische« erste Programm erstellen
25
e Das so bereits markierte Wort vbInformation wählen Sie nun mit der Tabulatortaste (nicht
mit der Eingabetaste, sonst fügen Sie wieder eine ungewollte Leerzeile ein!) aus. Alternativ hätten Sie auch mit der Maus auf den Eintrag doppelklicken können, aber die Tastatur
ist in diesem Zusammenhang sicherlich effektiver.
Abbildung 2.13: Das
Meldungsfenster hat
diesmal ein Symbol
Vordefinierte Konstanten
Hinter dem Wort vbInformation steckt in Wahrheit eine Zahl, nämlich 64. Diese ist in VBA
vordefiniert, aber eigentlich müssen Sie deren Wert gar nicht kennen. Denn eine solche Konstante, wie dies technisch heißt und später noch ausführlich besprochen werden wird, dient
gerade der besseren Lesbarkeit des Codes.
Auch wenn niemand wüsste, welchen Wert die Konstante vbInformation tatsächlich hat, kann
doch jeder sehen, dass in dieser Zeile das Info-Symbol aufgerufen wird. Sie sollten solche
vorhandenen Konstanten benutzen, wann immer es möglich ist. Praktischerweise bietet
die IntelliSense-Technik diese auch ganz selbstverständlich an, und zwar sogar für selbst
definierte Konstanten, wie Sie später noch sehen werden.
Es gibt übrigens verschiedene Arten vordefinierter Konstanten:
zzKonstanten, die allgemein gelten und auch in anderen VBA-Versionen (etwa in Word oder
Excel) benutzt werden können, beginnen mit vb als Abkürzung für Visual Basic
zzAndere Konstanten sind nur in Access definiert und am Präfix ac zu erkennen
Schaltflächen angeben
Sie haben sich möglicherweise gewundert, dass das QuickInfo für den hier benutzten zweiten Parameter die Bezeichnung Buttons, also Schaltflächen, angibt, obwohl damit doch ein
Symbol erzeugt wurde. Tatsächlich ist das zwar nur ein einziges Argument, welches jedoch
trotzdem mehrere Informationen enthalten kann.
a Erweitern Sie bitte die Prozedur HalloMitIcon so, dass Sie nach der Konstanten vbInformation ein Plus-Zeichen (+) eingeben. Jetzt klappt erneut die IntelliSense-Liste aus und
bietet die gleichen Konstanten wie eben an.
�I – G��n�la��� v�� ��A
Jetzt ist der Code komplett und Sie können ihn mit der F5-Taste starten. Diesmal enthält das
Meldungsfenster ein weißes »i« im blauen Kreis als Symbol. Solche kleinen Symbole werden
auch als Icons bezeichnet.
26
Kapitel 2: Die ersten VBA-Prozeduren erstellen
b Geben Sie nach dem +-Zeichen nun als zweite Konstante vbYesNo an.
c Führen Sie die Prozedur nun mit F5 aus. Sie sehen, dass tatsächlich Schaltflächen verändert wurden. Während bisher nur die OK-Schaltfläche zu sehen war, erscheinen jetzt
stattdessen die beiden Schaltflächen Ja und Nein.
Abbildung 2.14: Das
Meldungsfenster zeigt
jetzt zwei Schaltflächen
an
Es ist übrigens egal, welche der beiden Schaltflächen Sie anklicken, um den Meldungsdialog zu schließen. Da die Prozedur noch keine Auswertung vornimmt, passiert ohnehin
nichts.
d Sie können das Argument sogar mit einem weiteren +-Zeichen und beispielsweise der
Konstanten vbDefaultButton2 ergänzen, sodass der Code nunmehr wie folgt aussieht:
Sub HalloMitIcon()
MsgBox “Hello world!”, vbInformation + vbYesNo + vbDefaultButton2
End Sub
Durch diese Änderung wird im angezeigten Meldungsfenster der Fokus der StandardSchaltfläche von bisher Ja auf Nein verschoben. Sie sehen das an der punktierten Linie
am Rande der Schaltfläche. Das hat zur Folge, dass ein Bestätigen mit der Eingabetaste
nicht mehr die Ja-,
-, sondern nun die Nein-Schaltfläche auslöst.
Abbildung 2.15: Der
Fokus für die StandardSchaltfläche liegt nun
auf Nein
Wie Sie sehen, hat dieses Argument doch mit Schaltflächen zu tun. Der mathematische Trick,
mit dem hier offensichtlich drei Werte in einer einzigen Zahl übergeben werden können, heißt
übrigens »Binärcodierung« und ist wesentlicher Bestandteil dessen, wie ein Computer arbeitet.
Wir werden uns daher bei Gelegenheit (nämlich in Kapitel 3) noch damit beschäftigen.
Auch die Auswertung der Schaltflächen muss noch ein wenig warten. Bis dahin sollen Sie erst
einmal weitere eigene Prozeduren erstellen und vor allem auch nutzen.
Eigene Prozeduren aufrufen
Innerhalb Ihrer eigenen Prozedur namens Hallo haben Sie einen vorhandenen VBA-Befehl
MsgBox aufgerufen. Sie können selbstverständlich auch selbst erstellte Prozeduren statt der
2.2 Das »klassische« erste Programm erstellen
27
VBA-Befehle nutzen. Wenn Sie beispielsweise an vielen Stellen in Ihrer Datenbank immer
wieder eine Meldung zur Version machen wollen, wäre es wenig sinnvoll, dies jedes Mal
erneut in aller Ausführlichkeit zu schreiben.
a Stattdessen erstellen Sie zunächst eine Prozedur MeldeVersion nach dem bisherigen
Muster mit folgendem Code:
Sub MeldeVersion()
MsgBox “Version 1.0 von Lorenz Hölscher”, vbInformation
End Sub
b Sie können diese Prozedur gerne direkt (nach dem Speichern!) mit der F5-Taste testen
Abbildung 2.16: Der
Meldungsdialog von
MeldeVersion
Soweit war es gegenüber den vorherigen Prozeduren nichts Neues. Jetzt soll diese selbstgeschriebene Prozedur aber in anderen Prozeduren aufgerufen werden. Das kann sogar in
einem anderen Modul sein, damit es nicht gar zu einfach wird.
a Schließen Sie das aktuelle Modul Modul1. Wenn sich dessen Codefenster im Vollbild
befindet, liegt das X-Symbol zum Schließen unterhalb des roten Schließsymbols oben
rechts vom VBA-Editor selbst.
b Wählen Sie den Befehl Einfügen/Modul, damit Sie ein neues Modul erhalten. Dort steht
nun schon Option Compare Database als erste Zeile drin.
c Geben Sie dort mit Sub TesteMeldungen eine neue Prozedur ein und bestätigen Sie die
Zeile mit der Eingabetaste, damit der Prozedurrumpf vervollständigt wird.
d Innerhalb der Prozedur rücken Sie wie immer mit der Tabulatortaste ein.
e Beginnen Sie nun den Namen Ihrer eigenen Prozedur zu schreiben, also mel, und
drücken Strg+Leertaste. Wenn es mehrere ähnlich beginnende Prozedurnamen gäbe,
erschiene nun die IntelliSense-Liste zur Auswahl. Da jedoch bereits der Wortanfang
eindeutig war, vervollständigt der VBA-Editor sofort zu MeldeVersion.
Abbildung 2.17: Der
Code der Prozedur
TesteMeldungen
�I – G��n�la��� v�� ��A
und erhalten dann den folgenden Meldungsdialog.
28
Kapitel 2: Die ersten VBA-Prozeduren erstellen
Das war eigentlich schon alles. Sie rufen eigene Prozeduren genauso auf wie vorhandene
VBA-Prozeduren, indem Sie nämlich deren Namen nennen. Wenn diese noch Parameter
hätten, würden diese folgen.
f Jetzt können Sie mit der Eingabetaste noch weitere Zeilen anfügen und dort jeweils in
einer eigenen Zeile einmal den Befehl Beep und dann wieder MeldeVersion einfügen.
Abbildung 2.18: Der
erweiterte Code
der Prozedur
TesteMeldungen
g Wenn Sie nun TesteMeldungen mit der F5-Taste starten, sehen Sie zuerst Ihre Versionsmeldung, hören Ihren Computer piepsen und sehen dann ein zweites Mal die Versionsmeldung. Möglicherweise ist das Piepsen nur sehr leise oder ganz abgeschaltet, denn das ist
von der verwendeten Hardware abhängig und inzwischen oftmals deaktiviert.
Sie haben Recht, dass dieser Code noch keinen wirklichen Nutzen hat, denn er soll ja erst
einmal nur die grundsätzlichen Prinzipien zeigen. Aber damit haben Sie auch den zweiten
Schritt gemacht: Sie haben nicht nur eine eigene Prozedur geschrieben, sondern auch an
beliebiger Stelle aufgerufen.
Einrückung
Ich empfehle Ihnen dringend, den VBA-Code immer sauber einzurücken, wie das hier
bereits geschehen ist. Dadurch lassen sich Fehlerquellen wie vergessene End-Anweisungen
oder falsch geschachtelte If-Blöcke sofort erkennen.
Dabei wird in jedem Block eingerückt, also in allen Strukturen, die typischerweise mit
einem End-Befehl schließen: Sub/End Sub, Function/End Function, If/End If, Select/End
Select oder With/End With. Es gibt noch weitere Blöcke, die das Schlüsselwort End zwar
nicht benutzen, aber ebenso eingerückt werden sollten: For/Next und Do/Loop.
Prozedurnamen finden
Eben war es ja noch ganz einfach, den Namen der selbst geschriebenen Prozedur zu finden,
denn Sie hatten diese kaum zehn Minuten früher erfunden. Bei größeren Projekten wird aber
ganz schnell der Fall auftreten, dass Sie Hunderte von Prozeduren in vielen Modulen haben.
Dann reicht es zu wissen, in welchem Modul sich eine gesuchte Prozedur befindet.
a Daher sollten Sie die Prozeduren nicht wie hier wahllos hintereinander in ein Modul
schreiben, sondern besser thematisch sortieren. Dann wird es Module für den Datenzugriff, solche für die Dateibearbeitung oder welche für Berechnungen oder MenübandBefehle geben.
2.2 Das »klassische« erste Programm erstellen
29
Abbildung 2.19: Die
Auswahl eines
Prozedurnamens
anhand einer ModulIntelliSense-Liste
b Dann schreiben Sie wie in der obigen Abbildung in einem anderen Modul zuerst den
�I – G��n�la��� v�� ��A
Namen des Moduls mit der gesuchten Funktion sowie den folgenden Punkt. Dann klappt
auch für Ihre eigenen Prozeduren die IntelliSense-Liste aus und Sie können bequem unter
allen Namen auswählen.
c Wenn Sie wenigstens den Anfang des Namens wissen, drücken Sie alternativ auch
ohne vorangestellten Modulnamen Strg+Leertaste. Daraufhin wird der Name komplett
ergänzt, falls er bereits eindeutig ist, oder es erscheint die IntelliSense-Liste zur genaueren Auswahl.
Selbst bei kurzen Prozedur- oder Variablennamen empfehle ich diese Technik damit Sie
sicher sind, dass sie richtig geschrieben sind.
Funktion statt Sub-Prozedur
Während die bisher beispielhaft geschriebene Sub-Prozedur zwar etwas macht, aber nie
etwas an den aufrufenden Code zurückmelden kann, ist das bei Funktionen anders. Statt Sub
heißt dort das Schlüsselwort Function und über den eigenen Prozedurnamen lässt sich ein
Wert an den Aufrufer zurückgeben.
Die MsgBox() darf übrigens ebenso als Sub-Prozedur wie auch als Funktion aufgerufen werden
und liefert dann auch eine Rückmeldung über die angeklickte Schaltfläche. Dabei ändert sich
zwingend die Schreibweise.
Eine aufgerufene Sub-Prozedur mit Argument schreibt sich mit einem Leerzeichen nach dem
Prozedurnamen:
MsgBox “Hallo”
Eine Funktion hingegen muss nicht nur runde Klammern um alle Argumente haben, sondern
vor allem den Rückgabewert in einer Variablen oder Ähnlichem speichern können:
varErgebnis = MsgBox(“Klappt das?”)
Das ist ein wichtiger Unterschied beim Aufruf einer Prozedur: nach Sub-Namen folgt ein
Leerzeichen, nach Function-Namen immer direkt eine runde Klammer!
Unterschiedliche
Schreibweise
30
Kapitel 2: Die ersten VBA-Prozeduren erstellen
Dabei ist varErgebnis eine derzeit ziemlich beliebige Variable. Das mag jetzt zwar syntaktisch
völlig in Ordnung sein, aber Sie sehen den Inhalt der Variablen immer noch nicht. Daher
sollten Sie in der vollständigen Prozedur deren Wert anschließend zu Prüfzwecken anzeigen:
Sub FrageMitAntwort()
varErgebnis = MsgBox(“Klappt das?”, vbQuestion + vbYesNo)
MsgBox “Ausgewählt: “ & varErgebnis
End Sub
Bitte beachten Sie, dass in der ersten Codezeile eine MsgBox()-Funktion aufgerufen wurde,
deren Rückgabewert in der Variablen varErgebnis zwischengespeichert wird. In der zweiten
Zeile hingegen wird MsgBox als Sub-Prozedur ohne Rückgabewert benutzt.
Durch den Verkettungs-Operator & werden die beiden Teile, nämlich der Text »Ausgewählt:«
sowie der Inhalt der Variablen varErgebnis zu einem gemeinsamen Text zusammengefügt
und dann angezeigt.
Abbildung 2.20: Die
beiden durch
FrageMitAntwort
erzeugten Meldungen,
wenn Ja angeklickt
wurde
Wie Sie ausprobieren können, gibt ein Klick auf Ja den Wert 6 und auf Nein den Wert 7 zurück.
Sie mögen überrascht sein, dass nicht die Beschriftungen der Schaltflächen oder Ähnliches
als Rückgabewert benutzt werden.
Diese Version ist aber sprachunabhängig und damit einfacher zu benutzen. Denn erstens
steht trotz der eingesetzten Konstanten vbYesNo tatsächlich nicht Yes und No auf den
Schaltflächen, sondern in einem deutschsprachigen Windows auch deutschsprachige
Bezeichnungen. Zweitens wäre es mehr als lästig, im Code später darauf zu reagieren, dass
ein Benutzer Ja, Yes oder Oui angeklickt hat, wenn Sie diese Worte als Texte bekämen. Da ist
eine sprachneutrale Zahl als Rückgabewert viel einfacher zu handhaben.
Eigene Funktionen
So wie Sie eine eigene Sub-Prozedur schreiben können, geht das auch mit einer selbst
definierten Funktion, nur eben mit Function als Schlüsselwort statt mit Sub. Der wesentliche
Unterschied besteht ja darin, dass eine Funktion einen Rückgabewert an das aufrufende
Programm zurückliefert und die Sub-Prozedur nicht. Im folgenden Beispiel wird das morgige
Datum als Ergebnis ausgegeben:
Function Morgen()
Morgen = Date + 1
End Function
Herunterladen