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