Entdecken Sie eBooks
Kategorien
Entdecken Sie Hörbücher
Kategorien
Entdecken Sie Zeitschriften
Kategorien
Entdecken Sie Dokumente
Kategorien
Fehlerbehandlung ................................................................ 125 Mehr ber die Programmierung mit VBA ............................ 133 Mehr ber Objekte .............................................................. 167 Diagramme und Grafiken .................................................... 185 VBA- und Worksheet-Funktionen ....................................... 227 Externe Daten ...................................................................... 259
Der Name Galileo Press geht auf den italienischen Mathematiker und Philosophen Galileo Galilei (15641642) zurck. Er gilt als Grndungsfigur der neuzeitlichen Wissenschaft und wurde berhmt als Verfechter des modernen, heliozentrischen Weltbilds. Legendr ist sein Ausspruch Eppur se muove (Und sie bewegt sich doch). Das Emblem von Galileo Press ist der Jupiter, umkreist von den vier Galileischen Monden. Galilei entdeckte die nach ihm benannten Monde 1610. Lektorat Christine Siedle Fachgutachten Alois Eckl Korrektorat Bettina Mosbach Cover Barbara Thoben, Kln Typografie und Layout Vera Brauner Herstellung Norbert Englert Satz Typographie & Computer, Krefeld Druck und Bindung Bercker Graphischer Betrieb, Kevelaer Dieses Buch wurde gesetzt aus der Linotype Syntax Serif (9,25/13,25 pt) in FrameMaker. Gerne stehen wir Ihnen mit Rat und Tat zur Seite: christine.siedle@galileo-press.de bei Fragen und Anmerkungen zum Inhalt des Buches service@galileo-press.de fr versandkostenfreie Bestellungen und Reklamationen britta.behrens@galileo-press.de fr Rezensions- und Schulungsexemplare
Bibliografische Information der Deutschen Nationalbibliothek Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet ber http://dnb.ddb.de abrufbar. ISBN 978-3-8362-1665-4
Inhalt
Geleitwort des Fachgutachters ...................................................................... 13
Einfhrung ..........................................................................................
1.1 1.2 Was wird besser durch Makros und VBA? .................................... Arbeiten mit Makros .................................................................... 1.2.1 Makro aufzeichnen ....................................................... 1.2.2 Makro ausfhren ........................................................... 1.2.3 Makro ansehen ............................................................. 1.2.4 Makro speichern ........................................................... 1.2.5 Makrosicherheit ndern ................................................ 1.2.6 Registerkarte Entwicklertools ..................................... 1.2.7 Makrosicherheit dauerhaft ndern ................................ Entwicklungsumgebung Visual Basic Editor ............................... 1.3.1 Menleiste und Symbolleiste ........................................ 1.3.2 Projekt-Explorer und Eigenschaften-Fenster .................. 1.3.3 Codefenster .................................................................. Makrocode verstehen und ndern ............................................... Makro per Schaltflche ausfhren ................................................ Relative Aufzeichnung ................................................................. Persnliche Makroarbeitsmappe .................................................. Code schreiben, einfache Ausgabe ............................................... 1.8.1 Eigene Sub-Prozedur ..................................................... 1.8.2 Ausgabe in Zelle ............................................................ 1.8.3 Ausgabe in Nachrichtenbox ........................................... 1.8.4 Ausgabe im Direktfenster des VBE ................................ Arbeiten mit Excel vor der Version 2007 ...................................... 1.9.1 Makro aufzeichnen ....................................................... 1.9.2 Makro ausfhren ........................................................... 1.9.3 Makro ansehen ............................................................. 1.9.4 Makro speichern ........................................................... 1.9.5 Makrosicherheit ............................................................ 1.9.6 Symbolleiste Visual Basic ........................................... 1.9.7 Entwicklungsumgebung Visual Basic Editor ................... 1.9.8 Persnliche Makroarbeitsmappe ...................................
15 15 17 18 21 21 23 24 25 26 28 28 29 30 31 33 34 36 38 38 39 40 41 41 42 42 42 43 43 44 44 44
1.3
1.9
Inhalt
45 45 46 47 47 48 48 49 50 51 51 52 53 55 55 56 57 58 58 59 59 60 62 63 65 66 67 68 69 70 72 73 74 75 76 77 78 79 80 81
2.3
2.4
Inhalt
2.5
2.4.18 Versatz mit Offset ......................................................... 2.4.19 Zellbereich sortieren ..................................................... Ereignisprozeduren ...................................................................... 2.5.1 Arbeitsmappe wird geffnet .......................................... 2.5.2 Arbeitsmappe wird geschlossen .................................... 2.5.3 Tabellenblatt wird aktiviert ........................................... 2.5.4 Zellauswahl wechselt .................................................... 2.5.5 Doppelklick auf Zelle .................................................... 2.5.6 Tabellenblatt wurde neu berechnet ...............................
83 85 88 89 89 90 90 91 91
93 93 94 95 96 96 96 97 101 102 103 106 108 109 110 111 112 112 114 116 116 120
3.2
3.3
3.4
3.5
Inhalt
4.3
Logische Fehler und Debugging ................................................... 130 4.3.1 Einzelschrittverfahren .................................................... 130 4.3.2 Haltepunkte .................................................................. 132
5.3
5.4 5.5
5.6
6.5 6.6
Inhalt
6.7
6.8
Hauptobjekt Application ........................................................... 6.7.1 Anwendungspfad ausgeben ........................................... 6.7.2 Prozedur zeitverzgert aufrufen ..................................... 6.7.3 Anwendung Microsoft Excel schlieen .......................... Filtern ..........................................................................................
7.2
7.3
7.4 7.5
7.6 7.7
7.8
7.9
Inhalt
8.2
8.3
8.4
8.5
9.2
10
Inhalt
9.3
9.4
9.5
Austausch mit Microsoft Word .................................................... 9.3.1 Objektmodell von Word ............................................... 9.3.2 Import von Abstzen aus Word ..................................... 9.3.3 Import von Tabellen aus Word ...................................... 9.3.4 Export zu Word, Erstellen von Abstzen ........................ 9.3.5 Export zu Word, Erstellen von Tabellen ......................... Austausch mit Microsoft Outlook ................................................ 9.4.1 Objektmodell von Outlook ........................................... 9.4.2 Einfaches Versenden einer Arbeitsmappe ...................... 9.4.3 Integriertes E-Mail-Dialogfeld ....................................... 9.4.4 Zusammensetzen einer E-Mail ....................................... 9.4.5 Erstellen einer Serien-E-Mail ......................................... 9.4.6 Bestimmten Bereich in E-Mail versenden ...................... 9.4.7 Zugriff auf Outlook-Verzeichnis ..................................... 9.4.8 Zugriff auf E-Mail-Anhnge ........................................... 9.4.9 Zugriff auf Kontakte ...................................................... 9.4.10 Kontakt erzeugen .......................................................... 9.4.11 Termin erzeugen ........................................................... 9.4.12 Terminserie erzeugen .................................................... Austausch mit Microsoft Access ................................................... 9.5.1 Beispiel-Datenbank: Aufbau .......................................... 9.5.2 Beispiel-Datenbank: Verbindung herstellen ................... 9.5.3 SQL-Befehle .................................................................. 9.5.4 Beispiel-Datenbank: Auswahlabfrage ............................ 9.5.5 Beispiel-Datenbank: Aktionsabfrage .............................. 9.5.6 SQL: Auswahlabfragen mit SELECT ................................ 9.5.7 SQL: Operatoren ........................................................... 9.5.8 SQL: Abfrageergebnis sortieren ..................................... 9.5.9 SQL: Auswahlabfragen zur Suche nach Eingabe ............. 9.5.10 SQL: Aktionsabfrage zum ndern mit UPDATE ............. 9.5.11 SQL: Aktionsabfrage zum Einfgen mit INSERT ............. 9.5.12 SQL: Aktionsabfrage zum Lschen mit DELETE ..............
272 272 273 275 277 279 281 282 283 285 286 288 289 291 293 295 296 297 298 300 301 301 302 303 305 307 308 310 311 312 314 315
11
Inhalt
10.2
Eigene Dialogfelder und Anwendungen ....................................... 10.2.1 Ein erstes Beispiel ......................................................... 10.2.2 Erstes Beispiel: Gestaltung ............................................. 10.2.3 Erstes Beispiel: Code ..................................................... 10.2.4 Erstes Beispiel: Starten .................................................. 10.2.5 Arbeiten mit Steuerelementen ...................................... 10.2.6 Textfeld und Bezeichnungsfeld ...................................... 10.2.7 Optionsschaltflchen und Kontrollkstchen ................... 10.2.8 Liste, Bildlaufleiste und Drehfeld ................................... 10.2.9 Ausgabeformatierung .................................................... 10.2.10 RefEdit und Umschaltfeld ..............................................
321 321 321 323 324 325 327 328 332 335 337
11.3
11.4
12
Seit der Version 95, welche im August 1995 erschienen ist, bietet Microsoft Excel Anwendern die Mglichkeit in VBA (Visual Basic for Applications) zu programmieren und es auf diese Weise ihren Bedrfnissen anzupassen. Um die ersten, wichtigen Schritte beruhigt gehen zu knnen, ist eine gute Wegbegleitung dabei unverzichtbar. Die VBA-gesttzte Steuerung und Erweiterung gewhrleistet grtmgliche Flexibilitt und optimale Anpassungsfhigkeit. Durch die Verwendung von Visual Basic for Applications neben den bereits in Excel integrierten Funktionen erschlieen sich vllig neue Anwendungsbereiche und Mglichkeiten. Excel-Tabellen lassen sich dynamisieren und automatisieren, eigene Funktionen knnen erstellt werden und stehen damit uneingeschrnkt zur Verfgung. Die Liste der Mglichkeiten knnte an dieser Stelle beliebig weitergefhrt werden. Zum Einstieg in VBA bietet Excel den sogenannten Makro-Rekorder, mit dessen Hilfe sich schnell und fast ohne jegliche Programmierkenntnisse schon respektable Ergebnisse erzielen lassen. Wenn es allerdings darum geht, eigene benutzerdefinierte Eingabemglichkeiten wie die einfache Abfrage eines Wertes oder gar eigene Dialogfenster mit mehreren Eingabe- und Auswahlmglichkeiten zu erstellen, dann kommen Sie ohne VBA und entsprechend tiefgreifendere Programmierkenntnisse nicht weiter. Wichtig in diesem Zusammenhang ist ein umfangreiches Wissen ber das Objektmodell von Excel und ber grundlegende Programmierlogiken wie beispielsweise If-Abfragen, Programmverzweigungen und Schleifen. Darber hinaus muss der VBA-Programmierer berblicken, welchen Befehlssatz Microsoft Office und insbesondere Microsoft Excel zur Verfgung stellt und wie dieser angesprochen werden kann. Genau hier setzt nun das vorliegende Buch von Thomas Theis an, indem es ganz speziell auf die Bedrfnisse von VBA-Einsteigern eingeht. Dieses Buch fhrt Sie Schritt fr Schritt an die VBA-Programmierung heran. Beginnend mit grundlegenden Themen wie dem Umgang mit dem VBAEditor bis hin zur Programmierung von eigenen Dialogfenstern werden die Mglichkeiten von VBA sehr klar und bersichtlich dargestellt. In diesem Buch ist der schwierige Spagat zwischen verstndlicher Schreib-
13
weise, klarer Themenstruktur und detaillierter Erluterung sehr gut gelungen. Darber hinaus wird Gelerntes in bungsaufgaben vertieft und damit gefestigt. Aber auch fortgeschrittene Anwender und VBA-Entwickler knnen von diesem Werk profitieren. Durch den konsequent objektorientierten Aufbau des Buches lsst sich dieses auch sehr schn als Praxis-Nachschlagewerk verwenden. Alle relevanten Stichwrter und VBA-Befehle befinden sich jeweils am Seitenrand, wodurch ein schneller Zugriff auf smtliche Themen ermglicht wird. An diesem Buch gefllt mir besonders gut, dass sich mit Hilfe der beschriebenen Programmierbeispiele die Theorie schnell und verstndlich in die Praxis umsetzen lsst. Neben der verstndlichen Darstellung von theoretischen Zusammenhngen geht Herr Theis den Weg, anhand von einzelnen kleineren Praxisbeispielen alle relevanten VBA-Befehle zu erklren und deren Funktionsweise zu erlutern. So lernt der Einsteiger Step by Step die Mglichkeiten von VBA kennen und anzuwenden. Zu guter Letzt bleibt mir nur zu sagen, dass ich dieses Buch als ein rundum gelungenes Werk all denen empfehlen kann, die sich nher mit der Thematik VBA rund um Microsoft Excel auseinander setzen mchten und schnell und unkompliziert in diese Materie eintauchen wollen.
Alois Eckl Eckl-IT-Consulting Controller, Consultant und VBA-Entwickler
14
In diesem Kapitel lernen Sie erste VBA-Makros kennen. Sie erfahren, wie sie aufgebaut sind und wie man sie verndern kann. Auerdem wird die Entwicklungsumgebung fr VBA erlutert.
Einfhrung
VBA
Die Abkrzung VBA steht fr Visual Basic for Applications. Es handelt sich dabei um die Programmiersprache Visual Basic, mit speziellen Ergnzungen fr die verschiedenen Anwendungen in Microsoft Office. Mit Microsoft Excel knnen sehr viele alltgliche Aufgaben im beruflichen und privaten Bereich bereits gut bewltigt werden. Es gibt jedoch:
Aufgaben, die man nur durch zustzliche Programmierung mit VBA lsen kann Probleme, die durch zustzliche Programmierung mit VBA schneller gelst werden knnen
In diesem Buch werden Sie anhand von leicht verstndlichen Beispielen erlernen, wie man VBA als Ergnzung zu Excel sinnvoll einsetzt. Eigene bungen (mit den Lsungen im Anhang) dienen dazu, Ihren Wissensstand zu testen. Fr die Hilfe bei der Erstellung dieses Buchs bedanke ich mich bei Alois Eckl, Petra Biedermann und dem ganzen Team von Galileo, ganz besonders bei Christine Siedle.
1.1
Ein einfaches Makro ist nur eine Reihe von Anweisungen, die nacheinander ausgefhrt werden. Durch eine solche Anweisung wird in Excel ein bestimmter Vorgang ausgefhrt, z. B. eine Zahl in eine Tabellenzelle geschrieben. Die Anweisungen sind in der Sprache VBA geschrieben. VBA-Programme knnen weit ber einfache Makros hinausgehen und komplexe Ablufe steuern.
15
Einfhrung
In der Praxis sieht es hufig so aus, dass es zwei Gruppen von Anwendern gibt:
Entwickler
Entwickler, also erfahrene Excel-Anwender, die sich mit der Entwicklung von komplexen Excel-Anwendungen befassen Benutzer, also Einsteiger in Excel, die sich nur mit einfachen Themen, z. B. der Dateneingabe und dem Aufruf der Excel-Anwendungen befassen
Benutzer
Die Entwickler sind die Auftragnehmer der Benutzer. Die Entwicklung kann in einer anderen Abteilung des gleichen Unternehmens stattfinden. Es kann sich aber auch um externe, eingekaufte Excel-Anwendungen handeln.
Schneller
der Entwickler durch die Programmierung mit VBA schneller mit der Entwicklung seiner Excel-Anwendung fertig sein kann. die Ergebnisse fr den Benutzer schneller berechnet werden knnen.
Es folgen einige typische Szenarien, die Ihnen zeigen sollen, wozu man VBA nutzen kann und welche Vorteile sich daraus ergeben:
Groe Datenmengen
Es sollen groe Mengen an Daten aus einer Textdatei eingelesen werden. Nur der Aufbau der Daten ist bekannt, nicht aber die Menge. Auerdem sollen abhngig vom aktuellen Inhalt der Textdatei nur bestimmte Daten gelesen werden. Nach dem Einlesen sollen die Daten verarbeitet, formatiert, zusammengefasst und zur Verdeutlichung grafisch dargestellt werden. Es soll ein Diagramm aus einer Tabelle erstellt werden. Die aktuelle Gre und der Inhalt der Tabelle sollen die Art des Diagramms und seine Darstellung bestimmen. Der Benutzer soll nach Aufruf der Excel-Anwendung ein Dialogfeld vor sich haben. Darin nimmt er, abhngig von der aktuellen Situation, bestimmte Einstellungen vor, trifft die gewnschte Auswahl der Daten und startet dann deren weitere Verarbeitung. Es ergeben sich regelmig (z. B. jede Woche oder jeden Monat) Daten, die auf hnliche (nicht identische) Art und Weise weiterverarbeitet werden mssen. Die Verarbeitung bestimmter Daten ist komplex und muss in mehreren Schritten erfolgen. Mit VBA kann man die Koordination und die Durchfhrung der einzelnen Schritte vereinfachen.
Diagramme
Dialogfelder
Wiederkehrende Daten
Schrittweise Bearbeitung
16
1.2
Excel anpassen
Dem Benutzer sollen nach Aufruf von Excel nur bestimmte Funktionalitten zur Verfgung stehen. Sein Excel kann durch VBA gleichzeitig:
eingeschrnkt werden, wodurch es im Idealfall zu weniger Fehlbedienungen kommt. erweitert werden; dadurch stehen ihm spezielle Funktionen und Ablufe zur Verfgung, die ber Excel hinausgehen.
Anwendungen erweitern
Es sollen bereits vorhandene (von anderen Entwicklern im Unternehmen erstellte oder eingekaufte) Excel-Anwendungen gendert werden. Diese werden zur Bewltigung der laufenden Geschftsprozesse bereits regelmig eingesetzt. Da sich diese Prozesse gendert haben, mssen auch die Excel-Anwendungen erweitert und angepasst werden.
In diesem Buch sollen verschiedene Mglichkeiten zur Problemlsung mit VBA anhand von Beispielen aus der Praxis gezeigt werden. Es erhebt nicht den Anspruch, alle Bestandteile von VBA (also alle Objekte der Objektbibliothek mit all ihren Eigenschaften und Methoden) aufzulisten und zu erlutern. Dazu gibt es zu viele, und Sie wrden schnell den berblick verlieren. Es wird jedoch eine umfangreiche Auswahl getroffen, die es Ihnen ermglicht, selbstndig mit VBA zu arbeiten. Bei den Beispielen im Buch wird eher Wert auf Verstndlichkeit als auf Komplexitt gelegt. Sie sollen schnell den aktuell neuen Aspekt der Programmierung verstehen und nicht durch umfangreiche, komplizierte Beispiele, in denen sich nur eine kleine Neuigkeit verbirgt, verwirrt werden.
Verstndliche Beispiele
1.2
Zu Beginn erstellen wir ein einfaches Makro. Dieses Makro soll anschlieend ausgefhrt werden. Anschlieend betrachten wir den Code, um einen ersten Blick auf VBA werfen zu knnen. Das Thema Makrosicherheit, also die Sicherheit vor fremden Makros, die schdlichen Code enthalten knnen, spielt eine groe Rolle. Diese Thematik wird in Abschnitt 1.2.5, Makrosicherheit ndern, erlutert. Excel-Dateien knnen in Excel 2010 (und auch schon in Excel 2007) sowohl mit als auch ohne Makros gespeichert werden. Darauf wird in Abschnitt 1.2.4, Makro speichern, eingegangen. Die in diesem Kapitel erluterte Bedienung gilt fr Excel 2010. Unter Excel 2007 gibt es leichte Abweichungen in der Bedienung, darauf wird
Schdliche Makros
17
Einfhrung
an den entsprechenden Stellen jeweils gesondert hingewiesen. In den Excel-Versionen vor Excel 2007 gibt es grere Abweichungen in der Bedienung, die in einem eigenen Abschnitt (1.9) erlutert werden. Die weitaus meisten Beispiele in diesem Buch laufen auch unter Excel 2007 und unter lteren Versionen. Falls einzelne Beispiele des Buchs anders oder gar nicht laufen, wird dies an der betreffenden Stelle erlutert. Smtliche Beispiele finden Sie getrennt fr die Versionen vor und ab 2007 auch auf der Buch-CD.
1.2.1
Makro aufzeichnen
Mit Hilfe der folgenden Beschreibung erstellen Sie ein Makro, um den Inhalt der Zelle A1 in die Zelle C1 zu verschieben. Dazu bentigt man natrlich kein VBA, es dient aber zur ersten Verdeutlichung der Ablufe.
Makro erstellen
Nun geht es los: 1. Starten Sie Excel 2010. 2. Sie haben eine leere Arbeitsmappe (Mappe1) vor sich. 3. Tragen Sie in der Zelle A1 einen beliebigen Inhalt (Zahl oder Text) ein (siehe Abbildung 1.1).
Abbildung 1.1
4. Klappen Sie das Men ber den nach unten weisenden Pfeil am Button Makros in der Registerkarte Ansicht auf. 5. Whlen Sie den Menpunkt Makro aufzeichnen. 6. Es erscheint das Dialogfeld Makro aufzeichnen (siehe Abbildung 1.2).
18
1.2
Abbildung 1.2
7. Der vorgeschlagene Makroname ist Makro1, dieser kann beibehalten werden. 8. Bettigen Sie den Button OK. 9. Ab jetzt werden alle Aktionen, die Sie ausfhren, aufgezeichnet. 10. Whlen Sie die Zelle A1 aus. 11. Schneiden Sie die Zelle A1 aus. 12. Whlen Sie die Zelle C1 aus. 13. Fgen Sie die Zelle A1 ein. 14. Der Inhalt der Zelle A1 wurde nach C1 verschoben (siehe Abbildung 1.3). 15. Klappen Sie wiederum das Men ber den Pfeil am Button Makros in der Registerkarte Ansicht auf. 16. Whlen Sie den Menpunkt Aufzeichnung beenden. 17. Damit wird die Aufzeichnung Ihrer Aktionen beendet. 18. Hinweis: Speichern Sie die Datei an dieser Stelle noch nicht. Sie haben damit soeben Ihr erstes Makro erfolgreich erstellt.
Aufzeichnung beginnt
19
Einfhrung
Das Aufzeichnen geht etwas schneller, wenn Sie in der Excel-Oberflche das entsprechende Symbol in der Statusleiste bettigen (siehe Abbildung 1.4).
Nach Beginn der Aufzeichnung erscheint an der gleichen Stelle das Symbol zum Beenden der Aufzeichnung in der Statusleiste.
bung 1 A
Tragen Sie eine Zahl oder einen Text in die Zelle E3 ein. Zeichnen Sie ein Makro auf, das den Inhalt der Zelle E3 in die Zelle E5 kopiert. Nennen Sie das Makro KopieE3E5.
20
1.2
1.2.2
Makro ausfhren
Makro starten
Das soeben erstellte Makro soll nun ausgefhrt werden. Gehen Sie dazu wie folgt vor:
Tragen Sie in der Zelle A1 einen beliebigen Inhalt ein (Zahl oder Text). Klappen Sie das Men ber den Pfeil unten am Button Makros auf der Registerkarte Ansicht auf. Whlen Sie den Menpunkt Makros anzeigen. Es erscheint das Dialogfeld Makro mit einer Liste der bisher erstellten Makros. Whlen Sie in der Liste das Makro Makro1 aus. Bettigen Sie den Button Ausfhren. Der Inhalt der Zelle A1 wurde wiederum nach C1 verschoben.
Damit haben Sie Ihr erstes Makro dann auch erfolgreich ausgefhrt. bung 1 B
Tragen Sie einen neuen Inhalt in die Zelle E3 ein. Fhren Sie das Makro KopieE3E5 aus, und berprfen Sie das Ergebnis auf Richtigkeit.
Name des Makros
Hinweis
Ein Makro sollte einen mglichst sprechenden Namen haben, der etwas ber seine Arbeitsweise aussagt. Es kann dann beim Aufruf leichter aus der Liste der Makros ausgewhlt werden.
1.2.3
Makro ansehen
VBA-Code
Sie knnen sich den VBA-Code des soeben erstellten Makros ansehen, um einen ersten Eindruck von typischem VBA zu bekommen. Gehen Sie dazu wie folgt vor:
Klappen Sie das Men ber den Pfeil am Button Makros in der Registerkarte Ansicht auf. Whlen Sie den Menpunkt Makros anzeigen. Es erscheint das Dialogfeld Makro mit einer Liste der bisher erstellten Makros. Whlen Sie in der Liste das Makro Makro1 aus. Bettigen Sie den Button Bearbeiten.
21
1
Visual Basic Editor
Einfhrung
Es erscheint der Visual Basic Editor (VBE), die eigentliche Entwicklungsumgebung. Auf seine einzelnen Elemente wird in Abschnitt 1.3, Entwicklungsumgebung Visual Basic Editor, eingegangen. Zunchst ist im rechten Fenster der Code des Makros zu sehen (Abbildung 1.6).
Es folgt eine kurze Erluterung der einzelnen Zeilen. Es macht nichts, wenn Sie noch nicht alles genau verstehen, die einzelnen Code-Elemente werden spter noch ausfhrlicher erlutert.
Sub ... End Sub
Der Code des Makros Makro1 ist innerhalb einer Sub-Prozedur zwischen Sub und End Sub notiert. Ein Apostroph dient dazu, eine ganze Zeile bzw. den Rest einer Zeile zu einem Kommentar zu machen. Der Text hinter einem Apostroph dient nur zur Erluterung des VBA-Codes. Er wird nicht ausgefhrt.
Range("A1").Select bedeutet: Es wird die Zelle A1 ausgewhlt. Selection.Cut bedeutet: Der Inhalt der aktuellen Auswahl, also der Inhalt der Zelle A1, wird ausgeschnitten und befindet sich anschlieend in der Zwischenablage. Range("C1").Select bedeutet: Die Zelle C1 wird ausgewhlt, siehe
Kommentar
Cut
oben.
Paste
das aktuell aktive Tabellenblatt eingefgt. Der Inhalt der Zelle A1 wurde nach C1 verschoben.
22
1.2
bung 1 C
Interpretieren Sie den VBA-Code des Makros KopieE3E5:
Sub KopieE3E5() Range("E3").Select Selection.Copy Range("E5").Select ActiveSheet.Paste End Sub
Schlieen Sie den Visual Basic Editor ber das Men Datei Schliessen und zurck zu Microsoft Excel. Es erscheint die Excel-Oberflche.
1.2.4
Makro speichern
Excel-Dateien knnen seit Excel 2007 mit Makros oder ohne Makros gespeichert werden. Rufen Sie in Excel 2010 das Men Datei (unter Excel 2007 die Schaltflche Office) auf und darin den Menpunkt Speichern. Es erscheint das Dialogfeld Speichern unter. Als Dateityp ist Excel-Arbeitsmappe mit der Dateiendung .xlsx angegeben (siehe Abbildung 1.7).
Dateiendung xlsx
Falls Sie nun den Button Speichern bettigen, erscheint der Hinweis, dass die in dieser Datei enthaltenen Makros bei diesem Dateityp nicht mitgespeichert werden. Sie wrden also verlorengehen.
23
1
Dateiendung xlsm
Einfhrung
Zur Speicherung mit Makros sollten Sie daher den Button Nein bettigen, im Dialogfeld Speichern unter als Dateityp die Option ExcelArbeitsmappe mit Makros mit der Dateiendung .xlsm auswhlen und anschlieend mit dem gewnschten Namen im gewnschten Verzeichnis speichern, z. B. C:\Temp\Mappe1.xlsm.
Nachdem die Datei erfolgreich mit Makros gespeichert wurde, knnen Sie Excel jetzt schlieen.
1.2.5
Makrosicherheit ndern
Starten Sie Excel erneut. Falls Sie nun die soeben gespeicherte Datei erneut ffnen, stoen Sie unweigerlich auf das Thema Makrosicherheit. Was bedeutet das?
Sicherheitswarnung
Excel 2010 (wie auch die Vorgngerversionen) mchte Sie davor bewahren, mglicherweise schdlichen VBA-Code auszufhren. Unterhalb der Multifunktionsleiste erscheint daher eine Sicherheitswarnung mit dem Hinweis, dass die in dieser Datei enthaltenen Makros deaktiviert wurden (siehe Abbildung 1.10).
Diese Reaktion erfolgt aufgrund der folgenden Standardeinstellung fr die Makrosicherheit in Excel: Alle Makros mit Benachrichtigung deaktivieren. Falls Sie versuchen, ein Makro auszufhren, erscheint die Information, dass dies nicht mglich ist.
24
1.2
Sie haben die Mglichkeit, die in dieser Datei enthaltenen Makros zu aktivieren. Damit wird unter Excel 2010 die Datei in die Liste der vertrauenswrdigen Dokumente aufgenommen, unter Excel 2007 werden die Makros in dieser Datei einmalig aktiviert. Dazu fhren Sie Folgendes durch: 1. Schlieen Sie die Datei. 2. ffnen Sie sie erneut. 3a. Unter Excel 2010 bettigen Sie den Button Inhalt aktivieren (neben der Sicherheitswarnung, siehe Abbildung 1.10). 3b. Unter Excel 2007 bettigen Sie den Button Optionen und whlen anschlieend die Option Diesen Inhalt aktivieren. Anschlieend verschwindet die Sicherheitswarnung, und Sie knnen Makros ausfhren. Unter Excel 2007 erscheint die Sicherheitswarnung allerdings beim nchsten ffnen der Datei wieder. Man kann auch alle Excel-Dateien in einem Verzeichnis fr dauerhaft vertrauenswrdig erklren, siehe Abschnitt 1.2.7.
1.2.6
Registerkarte Entwicklertools
Excel-Optionen
Die Registerkarte Entwicklertools bietet weitergehende Mglichkeiten zur Erstellung und Verwaltung von Makros. Daher sollten Sie sie dauerhaft in Excel einblenden. Unter Excel 2010 rufen Sie dazu das Men Datei auf und bettigen die Schaltflche Optionen. Im Dialogfeld Excel-Optionen bettigen Sie die Schaltflche Menband anpassen. Auf der rechten Seite markieren Sie die Hauptregisterkarte Entwicklertools (siehe Abbildung 1.12 fr Excel 2010). Unter Excel 2007 bettigen Sie die Schaltflche Office und dort den Button Excel-Optionen. In der Kategorie Hufig verwendet aktivieren Sie Entwicklerregisterkarte in der Multifunktionsleiste anzeigen.
25
Einfhrung
Anschlieend ist die Registerkarte dauerhaft aktiviert (siehe Abbildung 1.13 fr Excel 2007).
1.2.7
Vertrauenscenter
Klicken Sie auf der Registerkarte Entwicklertools den Button Makrosicherheit an (siehe Abbildung 1.14 fr Excel 2010).
26
1.2
Sicherheitscenter
Unter Excel 2010 ffnet sich das Dialogfeld Sicherheitscenter, unter Excel 2007 das Dialogfeld Vertrauenscenter. Nach dem Drcken des Buttons (bzw. nach der Auswahl der Kategorie) Einstellungen fr Makros sehen Sie die Standardeinstellung: Alle Makros mit Benachrichtigung deaktivieren (siehe Abbildung 1.15 fr Excel 2010).
Die folgende Mglichkeit ist allerdings besser geeignet: Nach Drcken des Buttons (bzw. nach der Auswahl der Kategorie) Vertrauenswrdige Speicherorte (siehe Abbildung 1.15 fr Excel 2010) sehen Sie eine Liste der vertrauenswrdigen Verzeichnisse. Die Makros in den hier gelisteten Verzeichnissen knnen immer ausgefhrt werden. Falls Sie also in Zukunft alle Ihre Excel-Dateien mit Makros in einem bestimmten Verzeichnis (gegebenenfalls inklusive dessen Unterverzeichnisse) speichern, dann knnen Sie dieses Verzeichnis zu der Liste hinzufgen. Dazu bettigen Sie den Button Neuen Speicherort hinzufgen. Es erscheint ein Dialogfeld, in dem Sie die gewnschten Eingaben vornehmen knnen.
Vertrauenswrdiger Speicherort
Eigener Speicherort
Anschlieend ist die Liste der vertrauenswrdigen Speicherorte um ein Element ergnzt.
27
Einfhrung
1.3
Tasten Alt + F11
Es gibt mehrere Wege, den Visual Basic Editor (VBE), die Entwicklungsumgebung, aufzurufen, in der man den VBA-Code schreibt. Wie bereits erlutert, gelangen Sie ber den Button Makros auf der Registerkarte Ansicht oder der Registerkarte Entwicklertools dorthin. Auerdem knnen Sie den VBE von der Excel-Oberflche mit der Tastenkombination (Alt)+(F11) aufrufen. Mit der gleichen Tastenkombination knnen Sie auch wieder vom VBE zur Excel-Oberflche zurckwechseln. Dies wird in der Praxis hufig durchgefhrt.
1.3.1
Symbolleiste Bearbeiten
Im oberen Teil des VBE befinden sich eine Menleiste und die Symbolleiste Voreinstellung. Ntzlich fr die Programmierung ist auch die Symbolleiste Bearbeiten, die Sie ber das Men Ansicht Symbolleisten einblenden knnen.
Nehmen Sie zu Beginn bitte eine Voreinstellung vor, die fr die VBA-Programmierung wichtig ist: Im Men Extras Optionen Registerkarte Editor setzen Sie ein Hkchen bei Variablendeklaration erforderlich.
28
1.3
Option Explicit
Dies sorgt ab dem nchsten ffnen von Excel dafr, dass in jedem Modul oberhalb des VBA-Codes die Zeile Option Explicit steht und alle Variablen deklariert werden mssen.
Damit wird in Ihrem VBA-Code automatisch darauf geachtet, dass Sie alle Variablen explizit deklarieren. Dies kann zur Verminderung von Fehlern und zur Verbesserung der Performance Ihrer Programme beitragen. Variablen dienen zur Speicherung von Zahlen, Daten und Texten, die im spteren Verlauf eines Programms noch bentigt werden. Dazu mehr in Kapitel 3, Grundlagen der Programmierung mit VBA.
1.3.2
Auf der linken Seite des VBE befinden sich der Projekt-Explorer und das Eigenschaften-Fenster.
29
1
Projekt-Explorer
Einfhrung
Im Projekt-Explorer werden die Elemente der aktuell geffneten Dateien angezeigt, in denen man mit VBA programmieren kann. Dies sind:
Modul
Eigene Code-Module, wie z. B. das Modul1, das durch die Aufzeichnung eines Makros automatisch erzeugt wurde. Ein eigenes, leeres Modul kann auch ber das Men Einfgen Modul erzeugt werden. Vorhandene Klassenmodule, wie DieseArbeitsmappe und Tabelle1 bis Tabelle3, also die gesamte Arbeitsmappe und die aktuell vorhandenen Tabellen. Hier kann VBA-Code notiert werden, der bei Eintritt bestimmter Ereignisse, wie zum Beispiel ffnen einer Arbeitsmappe, automatisch ausgefhrt wird. Eigene Klassenmodule zur objektorientierten Programmierung, die Sie ber das Men Einfgen Klassenmodul erzeugen knnen. UserForms, also eigene Dialogfelder zur komfortablen Programmsteuerung, die sich ber das Men Einfgen UserForm erzeugen lassen.
Klassenmodul
UserForm
Fr uns sind zunchst nur die eigenen Code-Module wichtig. Die VBABeispiele in diesem Buch werden in Code-Modulen gespeichert, falls kein anderslautender Hinweis erfolgt. Falls Code in UserForms oder eigenen Klassenmodulen gespeichert wird, so ist dies explizit angegeben. Der VBA-Code in Klassenmodulen bezieht sich normalerweise nur auf das jeweilige Klassenmodul. Per Doppelklick auf ein Element im ProjektExplorer wird der VBA-Code des betreffenden Moduls eingeblendet. bung 1 D
Blenden Sie den VBA-Code der verschiedenen Elemente ein.
Eigenschaften und Werte
Im Eigenschaften-Fenster werden die Eigenschaften des aktuell ausgewhlten Moduls bzw. die Eigenschaften des ausgewhlten Steuerelements eines eigenen Dialogfelds aufgelistet. Die Werte dieser Eigenschaften knnen verndert werden. Ein Modul wird durch einen einfachen Klick im Projekt-Explorer ausgewhlt. Zunchst ist das EigenschaftenFenster fr uns nicht wichtig.
1.3.3
Code ausfhren
Codefenster
Auf der rechten Seite des VBE befindet sich das bereits bekannte Codefenster mit dem VBA-Code. Sie knnen eines der Makros von hier aus direkt ausfhren. Setzen Sie dazu den Cursor in die betreffende Prozedur. Anschlieend knnen Sie entweder
30
1.4
im Men Ausfhren den Menpunkt Sub/UserForm ausfhren aufrufen oder die Taste (F5) bettigen oder in der Symbolleiste Voreinstellung das Symbol mit dem grnen Pfeil, der nach rechts weist, bettigen.
Taste F5
bung 1 E
Testen Sie auf diese Weise die beiden vorhandenen Makros. Das Ergebnis sehen Sie natrlich nur in der Excel-Oberflche. Sie mssen also (z. B. mithilfe der Tastenkombination (Alt) + (F11)) zwischen Excel-Oberflche und VBE hin und her wechseln.
Zur Erinnerung
Ein Apostroph im VBA-Code dient dazu, eine ganze Zeile bzw. den Rest einer Zeile hinter dem Apostroph zu einem Kommentar zu machen.
bung 1 F
Fgen Sie Ihren beiden Makros jeweils eine Kommentarzeile hinzu mit dem Text: Dieses Makro wurde von [Ihr Name] erstellt. Testen Sie Ihre Makros erneut.
1.4
Im nchsten Schritt sollen die eigenen Makros verndert werden. Dazu mssen wir ihren Code etwas nher betrachten, zunchst am Beispiel von Makro1:
Sub Makro1() Range("A1").Select Selection.Cut Range("C1").Select ActiveSheet.Paste End Sub
31
Einfhrung
Zur Erluterung:
Sub ... End Sub
Der Code der Makros ist jeweils innerhalb einer Sub-Prozedur zwischen Sub und End Sub notiert. Die einzelnen Zeilen werden der Reihe nach durchlaufen und ausgefhrt.
Range("A1").Select bedeutet:
Range
Fr einen (Zell-)Bereich (engl. range) wird etwas durchgefhrt. In diesem Falle wird der Bereich ausgewhlt (engl. select). Der Bereich umfasst hier nur die Zelle A1. Er kann auch mehrere Zellen umfassen. Fr die vorher getroffene Auswahl (engl. selection) wird etwas durchgefhrt. In diesem Falle wird die Auswahl ausgeschnitten (engl. cut). Es wurde also der Inhalt der Zelle A1 ausgeschnitten. Dieser Inhalt befindet sich nun in der Zwischenablage. Im anderen Makro (KopieE3E5) wird auf hnliche Art und Weise mit Selection.Copy die vorher getroffene Auswahl in die Zwischenablage kopiert.
Cut
Selection.Cut bedeutet:
Paste
Fr das aktuell aktive Tabellenblatt (engl. sheet) wird etwas durchgefhrt. In diesem Falle wird der Inhalt der Zwischenablage eingefgt (engl. paste ). Dies wird an der vorher ausgewhlten Stelle (Zelle C1) vorgenommen.
Hinweis
Active...
Mit dem Prfix Active wird immer das aktuell aktive Element bezeichnet, wie z. B. ActiveCell (Zelle), ActiveSheet (Tabellenblatt) oder ActiveWorkbook (Arbeitsmappe).
Durch den Eintrag von D1 statt C1 als Zielzelle knnen Sie den Code leicht verndern. Anschlieend wird der Inhalt der Zelle A1 zur Zelle D1 verschoben. bung 1 G
Verndern Sie das Makro KopieE3E5 aus bung 1 A (siehe Abschnitt 1.2.1). Es soll der Inhalt der Zellen E3 bis G3 sowohl in die Zellen E5 bis G5 als auch in die Zellen E10 bis G10 kopiert werden.
32
1.5
Hinweise dazu:
Ein Zellbereich aus mehreren Zellen wird genau wie in Excel notiert, also z. B. E3:G3. Fr eine Zielangabe reicht die Angabe einer einzelnen Zelle aus; die weiteren Zellen des kopierten Bereichs werden, wie aus Excel gewohnt, in die Nachbarzellen eingefgt. Aus der Zwischenablage knnen beliebig viele Kopien eingefgt werden.
Hinweis
In den genannten Beispielen werden Quellbereiche selektiert und Zielbereiche aktiviert. Dadurch bekommt man als VBA-Neuling einen leicht verstndlichen Einstieg, weil der Code die gleichen Schritte ausfhrt wie der Benutzer in der Excel-Oberflche. Es wird aber mehr Code als notwendig erzeugt. Die Wartung solchen Codes dauert lnger, und die Ausfhrung ist langsamer. Im weiteren Verlauf dieses Buchs werden Sie lernen, wie man besseren Code erstellt.
Aktivieren und selektieren
1.5
Sie knnen als Entwickler dem Benutzer das Starten eines Makros erleichtern, indem Sie ihm eine Schaltflche (engl. button) zur Verfgung stellen. So knnen Sie ein bersichtlich zu bedienendes Tabellenblatt mit Daten, Formeln und Programmen zur Verfgung stellen. Zur Erzeugung eines Buttons gehen Sie wie folgt vor: 1. Auf der Registerkarte Entwicklertools bettigen Sie den Button Einfgen. 2. Es erscheint eine Sammlung von Steuerelementen; darin whlen Sie das Symbol links oben: Schaltflche (Formular-Steuerelement). 3. Platzieren Sie den Mauscursor an der gewnschten Stelle auf dem Tabellenblatt. Es erscheint ein kleines Kreuz. Drcken Sie die linke Maustaste, halten Sie sie gedrckt, und ziehen Sie die Schaltflche in der gewnschten Gre auf. 4. Es erscheint das Dialogfeld Makro zuweisen. Suchen Sie das gewnschte Makro heraus, und besttigen Sie mit OK.
33
Einfhrung
Anschlieend erscheint der Button im Bearbeitungsmodus. Klicken Sie einmal neben den Button; anschlieend knnen Sie durch Klick auf den Button das Makro ausfhren.
Hinweis
Button bearbeiten
Sie knnen einen Button nachtrglich bearbeiten. Dazu klicken Sie mit der rechten Maustaste auf den Button, dann sind Sie wieder im Bearbeitungsmodus. Sie knnen nun Gre und Ort verndern. ber das Kontextmen (wiederum Rechtsklick) knnen Sie ein anderes Makro zuweisen oder den Text auf dem Button verndern.
1.6
Relative Aufzeichnung
Beim Aufzeichnen der Makros ist Ihnen sicherlich schon der Begriff Relative Aufzeichnung aufgefallen. Dabei handelt es sich um einen Schalter, den Sie an zwei Stellen bettigen knnen:
in dem Men, das ber den Button Makros auf der Registerkarte Ansicht erreicht werden kann auf der Registerkarte Entwicklertools
Schalter
Falls dieser Schalter eingeschaltet wird, dann werden nachfolgende Makros relativ aufgezeichnet. Bei den bisher erstellten Makros war dieser Schalter nicht eingeschaltet, diese Makros wurden daher absolut aufgezeichnet.
34
Relative Aufzeichnung
1.6
Absolut aufzeichnen
Absolute Aufzeichnung bedeutet, dass im Makrocode absolute Zellangaben stehen (Beispiel: A1, C1). Bei der Ausfhrung eines solchen Makros ist es egal, welche Zelle in Excel aktiv ist, es wird immer mit den Zellen A1 und C1 gearbeitet. Relative Aufzeichnung bedeutet, dass im Makrocode relative Zellangaben stehen. Bei der Ausfhrung eines solchen Makros werden die Aktionen relativ zu der Zelle ausgefhrt, die in Excel aktiv ist.
Relativ aufzeichnen
Zur Verdeutlichung soll ein Makro aufgezeichnet werden, in dem das Gleiche gemacht wird wie im ersten Beispielmakro: Der Inhalt der Zelle A1 wird nach C1 verschoben. Allerdings wird das Makro relativ aufgezeichnet. Fhren Sie folgende Schritte durch: 1. Aktivieren Sie in Excel die relative Aufzeichnung. 2. Tragen Sie in der Zelle A1 einen beliebigen Inhalt ein (Zahl oder Text). 3. Whlen Sie die Zelle A1 aus. 4. Beginnen Sie mit der Aufzeichnung des Makros (Name Makro2). 5. Schneiden Sie den Inhalt der Zelle A1 aus. 6. Fgen Sie den Inhalt der Zwischenablage in der Zelle C1 ein. 7. Der Inhalt der Zelle A1 wurde nach C1 verschoben. 8. Beenden Sie die Makroaufzeichnung. Soweit ist noch kein sichtbarer Unterschied aufgetreten. Falls Sie nun allerdings das Makro ausfhren, so wird jeweils der Inhalt der aktuell ausgewhlten Zelle um zwei Zellen nach rechts verschoben (z. B. von D10 nach F10) und nicht immer der Inhalt der Zelle A1 nach C1. Die aktive Zelle ist nun der Ausgangspunkt. Betrachten wir den Code:
Relative Verschiebung
Cut
zeichnung, also der Inhalt der aktiven Zelle wird ausgeschnitten. Er liegt nun in der Zwischenablage.
ActiveCell.Offset(0, 2).Range("A1").Select:
Ausgehend von der aktiven Zelle wird ein Offset (also ein Versatz) ausgewhlt. Die Angaben in Klammern stehen fr Zeile und Spalte des Versatzes. Es wird also eine Zelle in der gleichen Zeile (OffsetZeile 0) und zwei Spalten weiter rechts (Offset-Spalte 2) ausgewhlt. Falls die aktive Zelle D10 ist, dann wird demnach die Zelle F10 ausgewhlt.
Offset
35
Einfhrung
Zu diesem Versatz wird der Bereich A1 ausgewhlt. Dies ist nicht die absolute Zelle A1 des Tabellenblatts, sondern die oberste linke Zelle des Versatzes. Diese Zelle (gleiche Zeile, zwei Zellen nach rechts) wird ausgewhlt.
Paste
Aufzeichnung, also der Inhalt der Zwischenablage wird eingefgt. Dieses Makro zeigt ein ganz anderes Verhalten als das Makro, das absolut aufgezeichnet wurde. Beide Makroaufzeichnungsarten haben ihre Vorteile, je nach Situation. Hinweis
Nach dem Schlieen und erneuten ffnen von Excel steht der Schalter immer auf absolute Aufzeichnung. Sie knnen whrend einer Aufzeichnung ber den Schalter zwischen relativer und absoluter Aufzeichnung wechseln, falls dies notwendig sein sollte.
bung 1 H
Erstellen Sie ein Makro, das den Inhalt von drei nebeneinanderliegenden, markierten Zellen um zwei Zeilen bzw. um sieben Zeilen nach unten kopiert. Es entspricht dem Makro aus der bung 1 G (siehe Seite 33), allerdings mit relativer Aufzeichnung. Nennen Sie das Makro RelKopie. Testen Sie es, und interpretieren Sie den VBA-Code.
1.7
Makros berall benutzen
Persnliche Makroarbeitsmappe
Die bisher aufgezeichneten Makros wurden in der aktuell aktiven Arbeitsmappe gespeichert. Daher stehen sie nur dort zur Verfgung. Falls Sie bestimmte Makros fr den universellen Einsatz immer zur Verfgung haben mchten, so sollten Sie sie in der Persnlichen Makroarbeitsmappe speichern. Dabei handelt es sich um eine Arbeitsmappe, die immer zusammen mit Excel geffnet wird, sobald sie existiert. Zum Speichern eines Makros in der Persnlichen Makroarbeitsmappe muss beim Aufzeichnen eines Makros im Dialogfeld Makro aufzeichnen der entsprechende Eintrag in der Liste Makro speichern in ausgewhlt werden.
36
Persnliche Makroarbeitsmappe
1.7
Nach der Aufzeichnung erscheint ein weiterer Eintrag im Projekt-Explorer des VBE, die Datei personal.xlsb. Ihr Standardspeicherort unter Windows 7 und Vista ist das Verzeichnis C:\Benutzer\[ Benutzername ]\AppData\ Roaming\Microsoft\Excel\XLStart und unter XP C:\Dokumente und Einstellungen\[ Benutzername ]\Anwendungsdaten\Microsoft\Excel\XLStart.
Datei personal.xlsb
Falls diese Datei verndert wurde, indem z. B. ein Makro hinzugefgt oder gendert wurde, werden Sie bei jedem Schlieen von Excel gefragt, ob Sie diese nderungen speichern mchten. Nach jedem ffnen von Excel stehen die Makros in dieser Datei zur Verfgung. bung 1 I
Erstellen Sie das gleiche Makro wie in der letzten bung, 1 H, speichern Sie es aber diesmal in der Persnlichen Makroarbeitsmappe. Schlieen Sie Excel. Testen Sie das Makro nach dem erneuten ffnen von Excel in einer beliebigen Arbeitsmappe.
37
Einfhrung
1.8
Selbst programmieren
In diesem Abschnitt wird erstmalig VBA-Code nicht durch eine Makroaufzeichnung, sondern durch Schreiben des Codes in einer eigenen SubProzedur erstellt. Es entsteht also das erste richtige VBA-Programm. Auerdem werden drei Mglichkeiten zur Ausgabe von Ergebnissen oder Kontrollwerten genannt, die hufig in der VBA-Programmierung benutzt werden:
Ausgabe in einer Zelle Ausgabe in einer Nachrichtenbox Ausgabe im Direktfenster des VBE
1.8.1
Eigene Sub-Prozedur
Zunchst zur Erstellung einer eigenen Sub-Prozedur. Wechseln Sie mit den Tasten (Alt) + (F11) zum VBE. Schreiben Sie unterhalb des letzten Makros die folgende Zeile:
Sub AusgabeZelle
Untersttzung durch Editor
Sobald Sie mit der Taste () die Zeile wechseln, stellen Sie fest, dass der Editor Sie bei der VBA-Programmierung untersttzt:
Am Ende der Zeile werden Klammern angefgt. Es wird die Zeile mit End Sub erzeugt. Der Cursor steht in der Zeile dazwischen, bereit zur Eingabe Ihres VBA-Codes. Es wird eine Trennzeile zwischen den einzelnen Makros erzeugt.
Der Editor bietet dem Programmierer noch umfangreiche weitere Untersttzung, aber dazu spter.
Prozedurname (...)
Hinter dem Namen einer Sub-Prozedur (oder kurz: Prozedur) stehen immer Klammern, wie auch bei Ihren bisherigen Makros. Diese Klammern sind zunchst leer. Spter werden wir sehen, dass man innerhalb
38
1.8
der Klammern Aufrufparameter notieren kann, die eine Prozedur flexibler machen knnen.
1.8.2
Ausgabe in Zelle
Bei Ausfhrung dieser Prozedur, zum Beispiel mit Hilfe der Taste (F5), wird der Text Hallo in der Zelle A1 ausgegeben.
Sie haben bereits gesehen, dass Sie einen Bereich, der eine oder mehrere Zellen umfasst, ber Range ansprechen knnen. Wir hatten bereits die Methode Select aufgerufen, um diesen Bereich auszuwhlen. Diesmal wird die Eigenschaft Value mit einem Eigenschaftswert versehen, dem Text Hallo. ber Value bekommt die Zelle einen Wert. Hinweis
Eine Prozedur sollte einen mglichst sprechenden Namen haben, der etwas ber ihre Arbeitsweise aussagt. Auerdem muss der Name innerhalb der Anwendung eindeutig sein. Es darf also kein Prozedurname doppelt vorkommen.
Eigenschaft Value
39
Einfhrung
1.8.3
Ausgabe in Nachrichtenbox
Nach dem Aufruf erscheint eine kleine Nachrichtenbox mit dem Text Hallo.
Kontrollausgabe whrend der Programmierung Information des Benutzers bei einem Fehler Information des Benutzers am Ende eines Programms
Bei MsgBox handelt es sich um eine vorgefertigte Funktion, bei der Sie eine Zeichenkette, z. B. einen Text in Anfhrungsstrichen, als AufrufParameter notieren mssen. Die Funktion MsgBox kann allerdings wesentlich mehr, wie Sie in Abschnitt 8.2, Einfacher Dialog mit dem Benutzer, sehen werden.
vbCrLf
Bei lngeren Ausgaben wird hufig ein Zeilenumbruch bentigt. Dieser wird ber die Konstante vbCrLf bereitgestellt. Ein Beispiel:
Sub AusgabeBoxZeilenumbruch() MsgBox "Hallo" & vbCrLf & "Welt" End Sub
40
1.9
Den Namen dieser Konstanten kann man sich leicht merken, denn es handelt sich dabei um ein Relikt aus der Urzeit: In vbCrLf steht das Cr fr Carriage Return, den Wagenrcklauf der Schreibmaschine zum Zeilenanfang. Das Lf steht fr Line Feed, den Zeilenvorschub. Hinweis
Der Operator & dient zur Verkettung von Zeichenfolgen. Er wird hufig bentigt, um Ergebnisse anschaulich zusammen mit Text darzustellen.
Operator &
1.8.4
Nach dem Aufruf erscheint zunchst gar nichts, da das Direktfenster des VBE nicht eingeblendet ist. Zeigen Sie es im VBE an ber das Men Ansicht Direktfenster. Anschlieend sehen Sie die soeben erzeugte Ausgabe (siehe Abbildung 1.30).
Debug.Print
Das Direktfenster (= Direktbereich) knnen Sie ebenfalls zur Kontrollausgabe whrend der Programmierung nutzen.
1.9
Zunchst das Wichtigste: Excel-Dateien werden in den Versionen vor Excel 2007 einheitlich mit der Dateiendung .xls gespeichert, unabhngig davon, ob sie Makros enthalten oder nicht. Die weitaus meisten Beispiele in diesem Buch laufen auch unter Versionen vor Excel 2007. Auf dem Datentrger, der diesem Buch beiliegt, ste-
41
Einfhrung
hen die Dateien zustzlich im xls-Format fr Versionen vor Excel 2007 zur Verfgung. Als Beispiel fr die Arbeit mit den Versionen vor Excel 2007 (genauer: Excel 97 bis Excel 2003) soll in diesem Abschnitt Excel 2002 dienen. Es werden nur die Unterschiede zu Excel 2010 erlutert, in Anlehnung an die Reihenfolge der bisherigen Abschnitte.
1.9.1
Makro aufzeichnen
Zum Starten einer Aufzeichnung whlen Sie im Men Extras das Untermen Makro, darin den Menpunkt Aufzeichnen. Zum Beenden der Aufzeichnung whlen Sie im Men Extras das Untermen Makro, darin den Menpunkt Aufzeichnung beenden. Nach dem Start einer Aufzeichnung erscheint die kleine Symbolleiste Aufzeichnung beenden. Sollte sie nicht von selber erscheinen, so kann sie auf die bliche Art eingeblendet werden: rechte Maustaste im Bereich der Symbolleisten, Hkchen vor der betreffenden Symbolleiste setzen. Sie beinhaltet zwei Symbole:
Mit Bettigung des linken Symbols knnen Sie die Aufzeichnung ebenfalls beenden. Mit Bettigung des rechten Symbols knnen Sie auf relative Aufzeichnung umschalten. Diese Einstellung gilt auch fr nachfolgende Makro-Aufzeichnungen.
1.9.2
Makro ausfhren
Zum Ausfhren des Makros whlen Sie im Men Extras das Untermen Makro und darin den Menpunkt Makros. Whlen Sie im Dialogfeld Makro das gewnschte Makro aus und klicken Sie auf den Button Ausfhren.
1.9.3
Makro ansehen
Zum Ansehen des Makros whlen Sie im Men Extras das Untermen Makro und darin den Menpunkt Makros. Whlen Sie im Dialogfeld Makro das gewnschte Makro aus und klicken Sie auf den Button Bearbeiten.
42
1.9
Es erscheint der Visual Basic Editor. Sie knnen ihn ber den Menpunkt Schlieen und zurck zu Microsoft Excel im Men Datei wieder schlieen.
1.9.4
Makro speichern
Wie bereits erwhnt, werden Excel-Dateien in diesen Versionen einheitlich gespeichert, unabhngig davon, ob sie Makros enthalten oder nicht. Zum Speichern der Datei whlen Sie im Men Datei den Menpunkt Speichern. Es erscheint das Dialogfeld Speichern unter. Als Dateityp ist Excel-Arbeitsmappe mit der Dateiendung .xls angegeben. Sie whlen den gewnschten Dateinamen und das gewnschte Verzeichnis aus und klicken auf den Button Speichern. Falls Sie an einem externen PC Excel 2010 zur Verfgung haben und eine dort erstellte Excel-Datei auf Ihrem PC unter einer Version vor 2007 haben wollen, dann rufen sie auf dem externen PC das Dialogfeld Speichern unter auf und whlen den Dateityp Excel-97-2003-Arbeitsmappe mit der Dateiendung .xls. Falls sich in der Datei VBA-Code befindet, der nicht unter lteren ExcelVersionen ausgefhrt werden kann, so erscheint das Dialogfeld Kompatibilittsprfung. Darin wird das Problem genauer erlutert.
Dateityp ndern
Kompatibilittsprfung
1.9.5
Makrosicherheit
Beim ffnen einer Datei, die ein Makro beinhaltet, kommt es darauf an, welche Sicherheitsstufe in Excel eingestellt ist:
Hoch: Die Ausfhrung von nicht signierten Makros wird abgelehnt. Mittel: Es wird Ihnen die Mglichkeit gegeben, die Makros in dieser Datei einmalig zu aktivieren oder zu deaktivieren. Niedrig: Die Ausfhrung von nicht signierten Makros wird generell erlaubt.
Zum ndern der Sicherheitsstufe whlen Sie im Men Extras das Untermen Makro und darin den Menpunkt Sicherheit. Es erscheinen die drei genannten Mglichkeiten. Eine nderung wird erst beim nchsten ffnen einer Excel-Datei wirksam.
43
Einfhrung
1.9.6
Nach Einblenden der Symbolleiste Visual Basic haben Sie schnelleren Zugriff auf die wichtigsten Befehle im Zusammenhang mit Makros und der Entwicklung mit Visual Basic.
1.9.7
Zum Aufruf des VBE whlen Sie im Men Extras das Untermen Makro, darin den Menpunkt Visual Basic-Editor oder die Tastenkombination (Alt) + (F11). Das Symbol zum Starten eines Makros aus dem Codefenster heraus ist ein grner Pfeil. Alternativ kann das Men Ausfhren (Menpunkt Sub/ UserForm ausfhren) oder die Funktionstaste (F5) genutzt werden.
1.9.8
Persnliche Makroarbeitsmappe
Die persnliche Makroarbeitsmappe heit personl.xls und ihr Standardspeicherort unter Windows 7 und Vista ist das Verzeichnis C:\Benutzer\ [Benutzername]\AppData\Roaming\Microsoft\Excel\XLStart und unter XP C:\Dokumente und Einstellungen\[Benutzername]\Anwendungsdaten\ Microsoft\Excel\XLStart.
44
In diesem Kapitel lernen Sie den Umgang mit den Objekten Arbeitsmappe, Tabellenblatt und Zellbereich mit ihren jeweiligen Eigenschaften, Methoden und Ereignissen kennen.
VBA ist eine objektorientierte Sprache, das heit, es wird mit Objekten gearbeitet. Objekte verfgen ber Eigenschaften, Methoden und Ereignisse.
Eigenschaften (Attribute) bestimmen das Aussehen eines Objekts. Ein Tabellenblatt verfgt z. B. ber die Eigenschaft Name. Der Wert dieser Eigenschaft ist die Bezeichnung des Tabellenblatts (z. B. Tabelle1). Methoden bestimmen die Fhigkeiten eines Objekts. Ein Tabellenblatt verfgt z. B. ber die Methode Copy(), das heit, es kann kopiert werden. Ereignisse bestimmen, was mit dem Objekt passiert. Bei einem Tabellenblatt kann z. B. das Ereignis Aktivierung stattfinden. Ereignisse knnen mit VBA-Code verbunden werden, so dass automatisch weitere Aktionen folgen knnen.
Eigenschaft
Methode
Ereignis
In diesem Kapitel werden Ihnen zahlreiche Mglichkeiten von VBA vorgestellt, ohne in die Programmierung mit Variablen, Verzweigungen und Schleifen einsteigen zu mssen. Im folgenden Kapitel werden dann diese wichtigen Elemente der Programmierung erlutert, die die automatisierte Bearbeitung von Excel erheblich verbessern.
2.1
Wie bereits erwhnt, verfgen Objekte ber Eigenschaften. Eine Eigenschaft eines Objekts kann wiederum ein Unterobjekt sein, mit eigenen Eigenschaften, Methoden und Ereignissen. Setzt man diese berlegung
45
weiter fort, so erhlt man eine Hierarchie von Objekten, ausgehend von einem Hauptobjekt.
Application
Das Hauptobjekt bei Office-Anwendungen ist Application (engl. fr Anwendung). In unserem Fall wird damit das Programm Excel selbst bezeichnet.
Workbooks
Eine Eigenschaft des Objekts Application ist die Auflistung Workbooks. Darin befinden sich alle geffneten Arbeitsmappen, also Excel-Dateien. Eine Eigenschaft einer einzelnen Arbeitsmappe ist die Auflistung Worksheets. Darin befinden sich alle Tabellenbltter einer Arbeitsmappe. Eine Eigenschaft eines einzelnen Tabellenblatts ist das Objekt Range. Darin befinden sich Zellen und Zellbereiche eines Tabellenblatts.
Worksheets
Range
Auflistung mit s
In Excel wird hufig mit Auflistungen gearbeitet, wie z. B. Workbooks oder Worksheets. Es handelt sich dabei um Sammlungen gleichartiger Objekte. Sie sind leicht an der Mehrzahlschreibweise (mit einem s am Ende) erkennbar.
2.2
Workbooks
Arbeitsmappen
Das Objekt Workbooks ist eine Auflistung. In dieser Auflistung befinden sich alle geffneten Arbeitsmappen, also alle offenen Excel-Dateien. Das Objekt Workbook (ohne ein s am Ende) steht fr eine einzelne Arbeitsmappe. Zur Bearbeitung einer bestimmten Arbeitsmappe gibt es verschiedene Mglichkeiten:
Workbook
ThisWorkbook
Anfhrungszeichen)
46
Arbeitsmappen
2.2
2.2.1
Mit folgender Prozedur wird die Anzahl der geffneten Arbeitsmappen ermittelt:
Sub MappenZaehlen() MsgBox "Anzahl Mappen: " & Workbooks.Count End Sub
Zur Erluterung:
Es wird der Wert der Eigenschaft Count des Objekts Workbooks ermittelt und ausgegeben. Zu beachten ist, dass dabei die Persnliche Makroarbeitsmappe mitgezhlt wird, falls sie vorhanden ist. Im Visual Basic Editor (VBE) knnen Sie sehen, ob es diese Mappe gibt.
Count
2.2.2
Mit folgender Prozedur wird eine neue Mappe erzeugt und geffnet. Zur Kontrolle wird die Anzahl der geffneten Mappen vor und nach dem Erzeugen ausgegeben:
Sub NeueMappe() MsgBox Workbooks.Count Workbooks.Add MsgBox Workbooks.Count End Sub
Zur Erluterung:
Es wird die Methode Add() des Workbooks-Objekts aufgerufen. Dadurch wird eine neue, leere Arbeitsmappe in Excel geffnet. Diese ist dann die aktive Arbeitsmappe. Gleichzeitig wird der Auflistung Workbooks ein weiteres Element hinzugefgt, wie man an den beiden Ausgaben der Eigenschaft Count (vorher, nachher) erkennen kann.
Add()
47
2.2.3
Mappe ffnen
Zur Erluterung:
Open()
Es wird die Methode Open() des Workbooks-Objekts aufgerufen. Dadurch wird die Arbeitsmappe mit dem angegebenen Namen im genannten Verzeichnis geffnet. Diese ist dann die aktive Arbeitsmappe. Der Auflistung Workbooks wird ein weiteres Element hinzugefgt. Im Beispiel wurde eine Datei ber eine absolute Pfadangabe angesprochen. Man kann auch Dateien mit relativen Pfadangaben und Dateien im gleichen Verzeichnis erreichen, siehe Abschnitt 2.2.10, Pfad einer Arbeitsmappe ermitteln. Falls die Arbeitsmappe (= Datei) nicht existiert, wird das Programm mit einer Fehlermeldung abgebrochen. Es kommt zu einem sogenannten Laufzeitfehler. In Kapitel 4, Fehlerbehandlung, werden Sie lernen, wie Sie solche Abbrche vermeiden.
Programmabbruch
Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe3.xls.
2.2.4
Mappen schlieen
48
Arbeitsmappen
2.2
Zur Erluterung:
Es wird die Methode Close() des Objekts Workbooks aufgerufen. Sie schliet alle geffneten Arbeitsmappen, aber nicht den VBE oder die Excel-Hilfe. Die Anwendung Excel bleibt weiterhin geffnet. Falls eine Arbeitsmappe gendert wurde, dann wird der Benutzer gefragt, ob er sie speichern mchte.
Close()
2.2.5
Mit folgender Prozedur wird der Name einer Arbeitsmappe auf zwei Arten ermittelt:
Sub MappenName() MsgBox "Name: " & ThisWorkbook.Name MsgBox "Name mit Pfad: " & ThisWorkbook.FullName End Sub
Zur Erluterung:
zedur steht.
Es wird der Wert der Eigenschaft Name ermittelt und ausgegeben, dies ist der Dateiname der Arbeitsmappe. Zustzlich wird der Wert der Eigenschaft FullName ermittelt und ausgegeben, dies ist der Dateiname der Arbeitsmappe inklusive vollstndiger Pfadangabe.
49
2.2.6
Aktive Mappe
Aktive Arbeitsmappe
Mit folgender Prozedur wird in zwei verschiedenen Situationen der Name der aktiven Arbeitsmappe ermittelt:
Sub AktiveMappe() Workbooks.Open "C:\Temp\Mappe3.xlsm" MsgBox "Aktiv nach ffnen: " & ActiveWorkbook.Name ActiveWorkbook.Close MsgBox "Aktiv nach Schlieen: " & ActiveWorkbook.Name End Sub
Zur Erluterung:
Zunchst wird eine weitere Arbeitsmappe geffnet. Es wird in diesem Beispiel davon ausgegangen, dass die angegebene Datei existiert.
ActiveWorkbook verweist immer auf die aktuell aktive Arbeitsmappe. Eine Arbeitsmappe ist immer dann aktiv, wenn der Benutzer sie ausgewhlt oder der Entwickler sie per Programm aktiviert hat. Eine Arbeitsmappe, die soeben geffnet wurde, ist automatisch aktiv.
ActiveWorkbook
50
Arbeitsmappen
2.2
Es wird die Methode Close() des Objekts Workbook aufgerufen. Dadurch wird eine einzelne Arbeitsmappe, in diesem Falle die aktive Arbeitsmappe, geschlossen. Danach ist wieder die Arbeitsmappe aktiv, die vor dem ffnen aktiv war. Zur Kontrolle wird wiederum der Name der nun aktiven Arbeitsmappe ausgegeben.
Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe3.xls.
2.2.7
Arbeitsmappe aktivieren
Mappe aktivieren
Mit folgender Prozedur wird eine bereits geffnete Arbeitsmappe aktiviert. Dies ist dann sinnvoll, wenn mehrere Arbeitsmappen geffnet sind und man sicher sein mchte, anschlieend in einer bestimmten Arbeitsmappe weiterzuarbeiten.
Sub MappeAktivieren() ThisWorkbook.Activate MsgBox ActiveWorkbook.Name End Sub
Zur Erluterung:
Es wird die Methode Activate() des Objekts Workbook aufgerufen. Dadurch wird die angesprochene Arbeitsmappe, in diesem Falle diese Arbeitsmappe, aktiviert. Zur Kontrolle wird der Name der aktiven Arbeitsmappe ausgegeben.
Activate()
2.2.8
Arbeitsmappe speichern
Mappe speichern
Mit folgender Prozedur wird diese Arbeitsmappe auf zwei verschiedene Arten gespeichert:
51
Sub MappeSichern() ThisWorkbook.Save ThisWorkbook.SaveAs "C:\Temp\Mappe2.xlsm" MsgBox "Gesichert: " & ThisWorkbook.Saved End Sub
Zur Erluterung:
Save()
Es wird die Methode Save() des Objekts Workbook aufgerufen. Dadurch wird diese Arbeitsmappe gespeichert. Zustzlich wird die Methode SaveAs() des Objekts Workbook aufgerufen. Dadurch wird diese Arbeitsmappe noch einmal gespeichert, und zwar im Verzeichnis C:\Temp unter dem Namen Mappe2.xlsm. Anschlieend arbeiten Sie innerhalb der soeben angelegten Kopie der Mappe! Zur Kontrolle wird der Wert der Eigenschaft Saved ermittelt und ausgegeben. Dabei handelt es sich um einen sogenannten Wahrheitswert, also False (falsch) oder True (wahr). Da die Arbeitsmappe soeben gespeichert wurde, ist der Wert aktuell True. Nach einer nderung in der Arbeitsmappe htte die Eigenschaft den Wert False.
SaveAs()
Saved
Hinweis
Sie knnen den Wert der Eigenschaft Saved in einer Verzweigung nutzen. Je nach Wert der Eigenschaft (wahr oder falsch) kann bzw. sollte gespeichert werden.
Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur und in der Erluterung wie folgt lauten: Mappe2.xls.
2.2.9
Mappe auswhlen
Mit folgender Prozedur werden bereits geffnete Arbeitsmappen nacheinander mit zwei verschiedenen Techniken aktiviert:
52
Arbeitsmappen
2.2
Sub MappeAusListe() Workbooks(1).Activate MsgBox ActiveWorkbook.Name Workbooks("Mappe2.xlsm").Activate MsgBox ActiveWorkbook.Name End Sub
Zur Erluterung:
Zunchst wird eine bereits geffnete Arbeitsmappe ber den Index ausgewhlt. Der Index ist die laufende Nummer der Arbeitsmappe innerhalb der Workbooks-Auflistung, von 1 bis Anzahl (Eigenschaft Count). Falls zwei Arbeitsmappen geffnet sind, knnen nur die Indizes 1 oder 2 benutzt werden. Wenn Sie einen anderen Index whlen, erfolgt ein Abbruch mit einer Fehlermeldung. Wie bereits erwhnt, werden Sie in Kapitel 4, Fehlerbehandlung, lernen, wie Sie solche Abbrche vermeiden. Es ist nicht immer einfach, festzustellen, welches gerade die Arbeitsmappe Nummer 1, 2 usw. ist. Daher ist die folgende Methode vorzuziehen: Eine bereits geffnete Arbeitsmappe wird ber ihren Namen (in Anfhrungszeichen) ausgewhlt. Dabei handelt es sich um den reinen Dateinamen, ohne Pfad. Da man in Excel nicht zwei Dateien mit dem gleichen Namen ffnen kann, auch wenn sie in unterschiedlichen Verzeichnissen stehen, ist der Name eindeutig.
Workbooks (Index)
Workbooks ("Name")
Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe2.xls.
53
MsgBox "Diese Mappe ist in " & ThisWorkbook.Path Workbooks.Open ThisWorkbook.Path & "\Mappe1.xlsm" Workbooks.Open ThisWorkbook.Path & "\Zusatz\Test.xlsx" MsgBox "Test ist in " & ActiveWorkbook.Path End Sub
Zur Erluterung:
Zunchst wird die Arbeitsmappe C:\Temp\Mappe3.xlsm geffnet. Dies ist jetzt die aktive Arbeitsmappe.
Anschlieend wird mit Hilfe der Eigenschaft Path der Pfad zu dieser Arbeitsmappe ausgegeben, in der sich die oben angegebene Prozedur PfadErmitteln() befindet.
Abbildung 2.10
Es wird die Arbeitsmappe Mappe1.xlsm geffnet. Diese steht im gleichen Verzeichnis wie diese Arbeitsmappe, in der sich die oben angegebene Prozedur PfadErmitteln() befindet. Dies wird hufig bentigt, um sicher zu sein, dass eine Datei im gleichen Verzeichnis geffnet wird. Zuletzt wird die Arbeitsmappe Test.xlsx geffnet. Diese steht im Unterverzeichnis Zusatz des Verzeichnisses dieser Arbeitsmappe. Die soeben geffnete Arbeitsmappe ist jetzt aktiv.
Hinweis
In den Versionen vor Excel 2007 mssen die Dateibezeichnungen in den entsprechenden Zeilen der Prozedur und in der Erluterung wie folgt lauten: Mappe3.xls, Mappe1.xls und Test.xls.
54
Tabellenbltter
2.3
2.3
Tabellenbltter
Worksheets
Das Objekt Worksheets ist eine Auflistung, in der sich alle Tabellenbltter der jeweiligen Arbeitsmappe befinden. Zur Bearbeitung eines einzelnen Tabellenblatts gibt es verschiedene Mglichkeiten:
ActiveSheet: das aktuell aktive Arbeitsblatt Worksheets(Index): Index ist die laufende Nummer des Tabellenblatts
Worksheets ("Name")
2.3.1
Tabellenblatt erzeugen
Neues Blatt
Mit folgender Prozedur wird in dieser Arbeitsmappe ein neues Tabellenblatt erzeugt:
Sub NeuesBlatt() ThisWorkbook.Activate MsgBox Worksheets.Count Worksheets.Add ActiveSheet.Name = "Neu" MsgBox Worksheets.Count End Sub
Zur Erluterung:
55
Zunchst wird zur Kontrolle die Anzahl der Tabellenbltter dieser Arbeitsmappe (der Wert der Eigenschaft Count des Objekts Worksheets) ermittelt und ausgegeben. Es wird die Methode Add() des Objekts Worksheets aufgerufen. Dadurch wird ein neues Tabellenblatt vor dem aktiven Tabellenblatt erzeugt und eingefgt. Das neue Tabellenblatt wird dann automatisch zum aktiven Tabellenblatt. Durch die Angabe von Parametern knnten Sie genau bestimmen, an welcher Stelle das neue Tabellenblatt eingefgt werden soll, siehe nchster Abschnitt (Tabellenblatt kopieren).
ActiveSheet bezeichnet das aktuell aktive Tabellenblatt. Der Name
Add()
ActiveSheet
Es wird wiederum zur Kontrolle die Anzahl der Tabellenbltter ausgegeben. Sie hat sich erwartungsgem um 1 erhht.
2.3.2
Blatt kopieren
Tabellenblatt kopieren
Zur Erluterung:
Copy()
Es wird die Methode Copy() des Objekts Worksheets aufgerufen. Dadurch wird ein Tabellenblatt kopiert. Es wird hinter einem Tabellenblatt in der gleichen Arbeitsmappe eingefgt, und es wird zum aktiven Tabellenblatt. Beide Tabellenbltter werden ber ihren Namen angesprochen. Bei After handelt es sich um einen benannten Parameter; diese knnen mit Hilfe des Operators := (Doppelpunkt Gleichheitszeichen) angegeben werden. Statt After ist auch Before mglich, dann wird
After, Before
56
Tabellenbltter
2.3
das Tabellenblatt vor einem anderen Tabellenblatt in der gleichen Arbeitsmappe eingefgt.
Falls gar kein Parameter angegeben wird, wird eine neue Arbeitsmappe erzeugt, die die Kopie enthlt. Zum Abschluss wird noch der Name des Tabellenblatts gendert.
Hinweis
Falls eine Methode mehrere Parameter hat, werden hufig benannte Parameter verwendet, siehe Abschnitt 5.3.5. Diese Vorgehensweise bietet folgende Vorteile:
der Parameter kann eindeutig angesprochen werden, nicht alle Parameter, die mglich sind, mssen genannt werden und das Programm wird lesbarer.
2.3.3
Tabellenblatt verschieben
Blatt verschieben
Mit folgender Prozedur wird ein Tabellenblatt dieser Arbeitsmappe verschoben. Die zugehrige Methode Move() arbeitet sehr hnlich wie die Methode Copy():
Sub BlattVerschieben() ThisWorkbook.Activate Worksheets("Tab1Kopie").Move _ Before:=Worksheets("Tabelle1") End Sub
Zur Erluterung:
Es wird die Methode Move() des Objekts Worksheets zum Verschieben eines Tabellenblatts aufgerufen. Es wird hinter einem Tabellenblatt in der gleichen Arbeitsmappe eingefgt, und es wird zum aktiven Tabellenblatt. Statt mit Before htten wir auch mit After oder ganz ohne Parameter arbeiten knnen, wie bei Copy().
Move()
After, Before
57
2.3.4
Blatt lschen
Tabellenblatt lschen
Zur Erluterung:
Delete()
Es wird die Methode Delete() des Objekts Worksheets zum Lschen eines Tabellenblatts aufgerufen. Es erscheint jeweils eine Warnung, dass sich darin Daten befinden knnten. Beide Tabellenbltter werden ber ihren Namen angesprochen.
2.3.5
Blatt aktivieren
Tabellenblatt aktivieren
Mit folgender Prozedur werden nacheinander zwei Tabellenbltter dieser Arbeitsmappe aktiviert:
Sub BlattAktivieren() ThisWorkbook.Activate Worksheets("Tabelle3").Activate MsgBox ActiveSheet.Name Worksheets("Tabelle1").Activate MsgBox ActiveSheet.Name End Sub
58
Tabellenbltter
2.3
Zur Erluterung:
Es wird die Methode Activate() des Objekts Worksheets zum Aktivieren eines Tabellenblatt aufgerufen. Dies ist dann sinnvoll, wenn Sie sicher sein mchten, anschlieend in einem bestimmten Tabellenblatt weiterzuarbeiten. Aktionen in Zellen oder Bereichen beziehen sich anschlieend auf dieses Tabellenblatt. Zur Kontrolle wird in der Prozedur der Name des jeweils aktiven Tabellenblatts ausgegeben.
Activate()
2.3.6
Tabellenblatt formatieren
Cells
Die Eigenschaft Cells eines Tabellenblatts bietet die Mglichkeit, alle Zellen eines Tabellenblatts zu formatieren. Es knnen natrlich auch einzelne Zellen oder Zellbereiche formatiert werden, dazu mehr ab Abschnitt 2.4.7. Nachfolgend werden alle Zellen des Tabellenblatts Tabelle3 mit der Schriftart Arial, Schriftgre 10 formatiert.
Sub BlattFormatieren() ThisWorkbook.Activate Worksheets("Tabelle3").Cells.Font.Name = "Arial" Worksheets("Tabelle3").Cells.Font.Size = 10 End Sub
Alle Zellen
Zur Erluterung:
Die Eigenschaft Cells bietet Zugriff auf alle Zellen eines Tabellenblatts. Die Eigenschaft Font einer Zelle bestimmt die Schriftarteigenschaften. Die Untereigenschaften Name und Size dienen zur Festlegung von Name und Gre der Schriftart. Weitere Formatierungsmglichkeiten erlutert Abschnitt 2.4.9, Zellformat Schrift . An dieser Stelle lsst sich wiederum gut die Objekthierarchie erkennen. Es wird die Untereigenschaft Name der Untereigenschaft Font der Eigenschaft Cells des Tabellenblatts gendert.
Font
2.3.7
Sowohl Gitternetzlinien als auch Zeilen- und Spaltenberschriften knnen ein- oder ausgeblendet werden. Dies sind eigentlich Eigenschaften des Anzeigefensters und nicht des Tabellenblatts. Sie sollen dennoch an dieser Stelle aufgefhrt werden, da sie thematisch hierher gehren.
59
Zur Erluterung:
Zunchst wird das gewnschte Tabellenblatt aktiviert. Das aktive Fenster (ActiveWindow) enthlt nunmehr dieses Tabellenblatt. Die Eigenschaft DisplayGridlines bestimmt den Zustand: Gitternetzlinien ein/aus. Die Eigenschaft DisplayHeadings bestimmt den Zustand: Zeilen- und Spaltenberschriften ein/aus.
ActiveWindow
DisplayGridlines
DisplayHeadings
2.3.8
PageSetup
Seiteneinrichtung
Vorbereitungen fr einen Ausdruck trifft man bei der Seiteneinrichtung. Fr ein vorhandenes Tabellenblatt werden Sie die Seiteneinrichtung vom Tabellenblatt aus ausfhren. Fr ein neues Tabellenblatt, das erst von einer VBA-Anwendung mit Daten gefllt wird, knnen Sie dazu die Eigenschaft PageSetup nutzen. In der folgenden Prozedur wird eine kleine Auswahl der zahlreichen Mglichkeiten getroffen. Hinweis
Zeichen _ (Unterstrich)
Einige Anweisungen dieser Prozedur, aber auch noch vieler weiterer Prozeduren, sind sehr lang. Zeilen lassen sich mit Hilfe des Zeichens _ (Unterstrich) in mehrere bersichtliche Programmzeilen zerlegen, siehe Abschnitt 3.1.2, Zeilen zerlegen.
60
Tabellenbltter
2.3
Sub BlattSeiteneinrichtung() ThisWorkbook.Activate ' Druckformat Worksheets("Tabelle3").PageSetup.Orientation = _ xlLandscape ' Gitternetz, Zeilen- und Spaltenberschrift Worksheets("Tabelle3").PageSetup.PrintGridlines = True Worksheets("Tabelle3").PageSetup.PrintHeadings = True ' Grennderung Worksheets("Tabelle3").PageSetup.Zoom = False Worksheets("Tabelle3").PageSetup.FitToPagesWide = 1 Worksheets("Tabelle3").PageSetup.FitToPagesTall = 99 ' Horizontale Zentrierung Worksheets("Tabelle3").PageSetup.CenterHorizontally = _ True ' Kopf- und Fuzeile Worksheets("Tabelle3").PageSetup.LeftHeader = _ "Das ist die Kopfzeile" Worksheets("Tabelle3").PageSetup.CenterFooter = _ "Seite &P von &N" End Sub
Zur Erluterung:
Die Eigenschaft Orientation bestimmt das Druckformat. Es gibt die Mglichkeiten xlLandscape (Querformat) und xlPortrait (Hochformat). hnlich wie beim Einrichten des Anzeigefensters wird mit den Eigenschaften PrintGridlines und PrintHeadings festgelegt, ob die Gitternetzlinien und die Zeilen- und Spaltenberschriften ausgedruckt werden sollen oder nicht (True oder False). Mit der Eigenschaft Zoom bestimmen Sie den Prozentsatz zur Vergrerung oder Verkleinerung des Tabellenblatts fr den Ausdruck. Falls dabei eine Zahl ber 100 angegeben wird, wird das Tabellenblatt vergrert gedruckt. Bei einer Zahl kleiner als 100 wird es verkleinert gedruckt. Der Wert False dient als Vorbereitung fr eine Skalierung, die abhngig von der Seitenzahl ist.
Orientation
Druckeigenschaften
Zoom
61
2
FitToPages...
Falls die Skalierung abhngig von der Seitenzahl ist, wird mit den Eigenschaften FitToPagesWide und FitToPagesTall jeweils eine Seitenanzahl festgelegt. Damit wird angegeben, auf wie vielen Seiten das Tabellenblatt in der Breite (Wide) und in der Hhe (Tall) ausgedruckt wird. Das Arbeitsblatt kann fr den Ausdruck horizontal zentriert (CenterHorizontally = True), aber auch vertikal zentriert (CenterVertically = True) werden.
Center...
Header, Footer
Den Text und die Anordnung von Kopf- und Fuzeile bestimmen die Eigenschaften ...Header und ...Footer. Es gibt jeweils die Prfixe Left..., Right... und Center... fr die verschiedenen Bereiche. Im vorliegenden Beispiel wurden eine Kopfzeile links und eine Fuzeile zentriert angeordnet. Innerhalb des Texts, der als Zeichenkette zugewiesen wird, knnen bestimmte Variablen eingesetzt werden. Dabei gibt es u. a. die folgenden Mglichkeiten:
Seitennummer: &P Seitenanzahl: &N Druckdatum: &D Druckuhrzeit: &T Pfad zum Verzeichnis der Datei: &Z Dateiname: &F Tabellenblattname: &A
2.4
Range, Cells
Mit Hilfe von Range bzw. Cells haben Sie zahlreiche Mglichkeiten, auf einzelne Zellen oder ganze Zellbereiche eines Tabellenblatts zuzugreifen. Range wurde bereits in Abschnitt 1.2, Arbeiten mit Makros, in den Beispielen zur Makroprogrammierung vorgestellt. Die aktuell aktive Zelle zur Bearbeitung wird mit ActiveCell bezeichnet. Hinweis
In den folgenden Beispielen fr den Einsatz von Range und Cells wird jeweils ein bestimmtes Tabellenblatt in dieser Arbeitsmappe aktiviert. Dies dient der eindeutigen Zuordnung fr den Fall, dass vorher eine andere Arbeitsmappe oder ein anderes Tabellenblatt aktiviert sein sollte.
62
2.4
2.4.1
Mit Hilfe von Range knnen sowohl zusammenhngende als auch nicht zusammenhngende Zellbereiche ausgewhlt werden. Dabei werden ein Buchstabe fr die Spalte und eine Nummer fr die Zeile angegeben. Einige Mglichkeiten sehen Sie in Tabelle 2.1.
Range
Range("A3").Select Range("A3:F7").Select Range("A3, C5, E2").Select Range("A8, B2:C4, E2").Select
Beschreibung einzelne Zelle zusammenhngender Zellbereich mehrere nicht zusammenhngende Zellen mehrere nicht zusammenhngende Zellen bzw. Zellbereiche
Bei den Zellbereichen kann es sich auch um ganze Spalten oder Zeilen handeln, wie Tabelle 2.2 zeigt.
Range
Range("A:A").Select Range("C:E").Select Range("B:D, F:F, H:I").Select
Beschreibung ganze Spalte mehrere zusammenhngende Spalten mehrere nicht zusammenhngende Spalten ganze Zeile mehrere zusammenhngende Zeilen mehrere nicht zusammenhngende Zeilen eine Mischung aus mehreren Mglichkeiten, siehe Abbildung 2.17
Beachten Sie, dass auch die beiden letzten Ausdrcke mit Range jeweils in eine Zeile gehren.
63
Im letzten Beispiel wurden insgesamt vier nicht zusammenhngende Bereiche ausgewhlt: zwei rechteckige Bereiche (A2:B4 und G2:H4), zwei ganze Spalten (D und E) und zwei ganze Zeilen (7 und 8). Die aktive Zelle (erkennbar am Rahmen) ist die erste ausgewhlte Zelle (A2). Mit folgender Prozedur werden Zellbereiche eines ausgewhlten Tabellenblatts selektiert. Anschlieend wird jeweils die Adresse der aktiven Zelle ausgegeben:
Sub ZellenMitRange() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A2").Select MsgBox ActiveCell.Address Range("C4:G7").Select MsgBox ActiveCell.Address Range("A5, C3:G7").Select MsgBox ActiveCell.Address Range("C3:G7, A5").Select MsgBox ActiveCell.Address Range("C:D").Select MsgBox ActiveCell.Address End Sub
Zur Erluterung:
Das Tabellenblatt Tabelle1 dieser Arbeitsmappe wird aktiviert. Aktionen in Zellen oder Bereichen beziehen sich anschlieend auf dieses Tabellenblatt. Es wird die Methode Select() des Objekts Range zum Auswhlen von Zellen aufgerufen.
Select()
64
2.4
ActiveCell
Eine der ausgewhlten Zellen ist die aktive Zelle. Diese kann mit ActiveCell angesprochen werden. Falls mehrere Zellen ausgewhlt wurden, ist die obere linke Zelle des ersten angegebenen Bereichs aktiv. Allgemein ist Address die Adresse eines Zellbereichs. Hier geht es nur um die Adresse der aktiven Zelle. Nacheinander werden in diesem Beispiel ausgegeben: $A$2, $C$4, $A$5, $C$3, $C$1. Beachten Sie, dass im dritten und vierten Schritt die gleichen Zellen ausgewhlt sind, aber sich die aktive Zelle aufgrund der Reihenfolge unterscheidet.
Address
Reihenfolge
2.4.2
Cells bietet nicht nur die Mglichkeit, alle Zellen eines Tabellenblatts zu
erreichen, sondern auch einzelne Zellen oder Zellbereiche auszuwhlen. Dabei werden eine Nummer fr die Zeilen und eine Nummer fr die Spalte angegeben. Das Arbeiten mit Cells bietet gegenber dem Arbeiten mit Range Vorteile bei der Programmierung. Sowohl Zeilennummer als auch Spaltennummer knnen dann mit Hilfe von Variablen gebildet werden. Mit folgender Prozedur werden Zellbereiche eines ausgewhlten Tabellenblatts mit einem Wert versehen:
Sub ZellenMitCells() ThisWorkbook.Worksheets("Tabelle1").Activate Cells(1, 5).Value = "abc" Range(Cells(3, 5), Cells(4, 7)).Value = "xyz" End Sub
Zur Erluterung:
Die Zelle 1, 5 bekommt mit Hilfe der Eigenschaft Value den Wert abc. Sie steht in Zeile 1, Spalte 5, ist also die Zelle E1. In Verbindung mit Range knnen auch Zellbereiche ausgewhlt werden. Hier ist dies der Bereich von Zelle 3, 5 (= E3) bis Zelle 4, 7 (= G4).
Range mit Cells
65
2.4.3
die Inhalte eines Zellbereichs verschoben die Inhalte eines anderen Zellbereichs kopiert
Besserer Code
Beides haben Sie bereits im ersten Abschnitt mit Makros durchgefhrt. Die hier vorgestellte Methoden umfassen weniger Codezeilen, sind besser zu warten und schneller im Ablauf:
Sub ZellinhalteVerschiebenKopieren() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1:A2").Cut Destination:=Range("C1") Range("A5:A6").Copy Destination:=Range("C5") End Sub
Zur Erluterung:
Cut()
Es wird die Methode Cut() des Objekts Range zum Ausschneiden von Zellen aufgerufen.
Destination
Falls ein Ziel mit dem optionalen Parameter Destination angegeben ist, dann werden die Zellen dorthin verschoben. Falls kein Ziel angegeben ist, dann werden die Zellen in die Zwischenablage verschoben und knnen an anderer Stelle wieder eingefgt werden.
Copy()
Es wird die Methode Copy() des Objekts Range zum Kopieren von Zellen aufgerufen. Wie bei der Methode Cut() kann ein Ziel angegeben werden, ansonsten liegt die Kopie in der Zwischenablage und kann an anderer Stelle wieder eingefgt werden.
66
2.4
2.4.4
Im vorherigen Abschnitt wurde bereits darauf hingewiesen, dass Zellinhalte auch in die Zwischenablage kopiert werden knnen. Dies ist von Vorteil, falls Sie nur ausgewhlte Teile des Zellinhalts kopieren mchten, z. B. nur die Werte oder nur die Formate. Dies zeigt das folgende Beispiel:
Sub TeileKopieren() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1:A2").Copy Range("C1").PasteSpecial xlPasteValues Range("A5:A6").Copy Range("C5").PasteSpecial xlPasteFormats End Sub
Zur Erluterung:
Es wird zweimal die Methode Copy() zum Kopieren eines Bereiches in die Zwischenablage aufgerufen. In beiden Fllen wird die Methode PasteSpecial() zum Einfgen spezieller Teile von Zellinhalten aufgerufen. Beim ersten Mal werden nur die Werte eingefgt, beim zweiten Mal nur die Formate.
PasteSpecial()
67
2.4.5
Lschen
Zellinhalt lschen
Zur Erluterung:
Clear()
Die Methode Clear() des Objekts Range dient zum Lschen von Zellinhalten, inklusive Formatierung und Kommentaren. Mit Hilfe der Methode ClearContents() werden nur die Inhalte gelscht. Formate und Kommentare bleiben erhalten. Die Methode ClearFormats() wird zum Lschen der Formate genutzt. Inhalte und Kommentare bleiben erhalten.
ClearContents()
ClearFormats()
68
2.4
2.4.6
Mit folgender Prozedur werden Zahlen, Datumsangaben, Prozentzahlen und Formeln in Zellen eingetragen:
Sub WerteFormeln() ThisWorkbook.Worksheets("Tabelle2").Activate ' Zahl Range("A1").Value = 5.8 Range("A2").Value = 1629.9 Range("A3").FormulaLocal = "=SUMME(A1:A2)" ' Datum Range("A4").Value = "2010/03/31" Range("A5").Value = "2009/11/10" Range("A6").FormulaLocal = "=A4-A5" ' Zahl Range("A7").Value = 0.125 End Sub
69
Zur Erluterung:
Value
Mit Hilfe der bereits bekannten Eigenschaft Value bekommen die Zellen A1 und A2 jeweils einen Zahlenwert zugewiesen. Bei Zahlen mit Nachkommastellen ist ein Punkt statt eines Kommas einzutragen. Die Formel =SUMME(A1:A2) wird als Wert der Eigenschaft FormulaLocal in der von Excel gewohnten Form (in Deutsch) eingetragen. In der Bearbeitungszeile ist erkennbar, dass der Inhalt der Zelle A3 nach wie vor eine Formel ist. Bei Datumsangaben drfen die Anfhrungsstriche nicht fehlen. Es empfiehlt sich, die amerikanische Schreibweise zu benutzen, dann werden die Werte direkt als Datumsangaben erkannt und formatiert (fhrende Nullen). Die Formel =A4-A5 dient zur Berechnung der Tagesdifferenz zwischen den beiden Datumsangaben. Der Inhalt der Zelle A7 ist wiederum ein Zahlenwert.
Datum
2.4.7
Format eintragen
Zellformat Zahlen
Mit folgender Prozedur werden die Formate fr Zahlen, Datumsangaben und Prozentzahlen in Zellen eingetragen:
Sub ZellformatZahlen() ThisWorkbook.Worksheets("Tabelle2").Activate ' Zahl Range("A1:A3").NumberFormatLocal = "#.##0,00 " ' Datum Range("A4:A5").NumberFormatLocal = _ "TTTT, ""den"" TT. MMMM JJ" Range("A6").NumberFormatLocal = "0 ""Tage""" ' Prozent Range("A7").NumberFormatLocal = "0,00 End Sub
%"
70
2.4
Abbildung 2.26
Zellformat Zahlen
Zur Erluterung:
Mit Hilfe der Eigenschaft NumberFormatLocal knnen Formate in der von Excel gewohnten Form (in Deutsch) eingetragen werden. Bei Zahlen, Whrungs- oder Prozentangaben werden im Beispiel die folgende Zeichen verwendet:
NumberFormatLocal Formatierungszeichen
#: Ziffer nur anzeigen, falls vorhanden 0: Ziffer immer anzeigen , (Komma): Abtrennung der Nachkommastellen . (Punkt): Tausenderpunkt (Euro): Whrungszeichen % (Prozent): Zahl wird durch 100 geteilt und mit einem Prozentzeichen dargestellt
Datumsformat
TTTT: Wochentagsname in Deutsch, ausgeschrieben TT: zwei Ziffern fr den Tag im Monat MMMM: Monatsname in Deutsch, ausgeschrieben JJ: zwei Ziffern fr das Jahr
Text im Format
Eine Besonderheit ist zu beachten: Falls Text (z. B. die Wrter den oder Tage) in das Format integriert wird, so ist dieser bekanntlich in Excel in doppelten Anfhrungsstrichen zu notieren. So kann kein Konflikt mit den festen Formatangaben auftreten. Da der Wert der Eigenschaft NumberFormatLocal schon in doppelten Anfhrungszeichen steht, muss dieser Formatierungstext in zweifachen doppelten Anfhrungsstrichen stehen.
71
2.4.8
Ausrichten
Zellformat Ausrichtung
Mit folgender Prozedur werden Zellen auf verschiedene Art und Weise ausgerichtet:
Sub ZellformatAusrichtung() ThisWorkbook.Worksheets("Tabelle2").Activate Range("C1").Value = "Hallo" Range("C1").HorizontalAlignment = xlCenter Range("C1").VerticalAlignment = xlTop Range("C2").Value = "Das ist ein lngerer Text" Range("C2").WrapText = True Range("C3").Value = "Hallo" Range("C3:C7").MergeCells = True Range("C3:C7").Orientation = xlVertical Range("C8").Value = "Hallo" Range("C8").Orientation = 45 End Sub
Zur Erluterung:
...Alignment
Text wird mit Hilfe der Eigenschaft HorizontalAlignment und VerticalAlignment ausgerichtet. Zulssige Konstanten fr
die horizontale Ausrichtung sind z. B. xlLeft (linksbndig), xlRight (rechtsbndig), xlCenter (zentriert) und xlJustify (Blocksatz);
72
2.4
die vertikale Ausrichtung sind z. B. xlBottom (am unteren Rand), xlCenter (vertikal zentriert) und xlTop (am oberen Rand).
WrapText
Falls WrapText den Wert True hat, wird der Text innerhalb der Zelle ber mehrere Zeilen verteilt. Falls WrapText den Wert False hat, wird der Text nur in einer Zeile geschrieben, die gegebenenfalls ber den rechten Rand der Zelle hinausgeht.
MergeCells
Wenn MergeCells den Wert True hat, werden die Zellen des genannten Bereichs miteinander verbunden dargestellt. Wenn MergeCells den Wert False hat, werden die Zellen des genannten Bereichs einzeln dargestellt.
Orientation
Die einzelnen Zeichen eines Zellinhalts knnen mit Hilfe der Eigenschaft Orientation
bereinander geschrieben werden, mit dem Wert xlVertical; in einem schrgen Winkel geschrieben werden, mit einem Zahlenwert zwischen 90 Grad und +90 Grad. Der Normalwert ist 0 Grad.
2.4.9
Zellformat Schrift
Schrift
Das Ergebnis:
73
Zur Erluterung:
Font
Die Eigenschaft Font steht fr die Formatierung der Schriftart in der Zelle. Sie hat zahlreiche Untereigenschaften, zum Beispiel:
Name fr den Namen der Schriftart Bold fr fett (True oder False) Italic fr kursiv (True oder False) Underline fr unterstrichen (True oder False) Size fr die Gre der Schrift Color fr die Farbe der Schrift
Farbe
Farben knnen auf verschiedene Art und Weise angegeben werden, zum Beispiel:
Speziell fr die Grundfarben mit Hilfe von Farbkonstanten, siehe Abschnitt 3.2.4, Konstanten. Allgemein mit der Funktion RGB(). Diese Funktion hat drei Parameter, die fr Rot-, Grn- und Blau-Werte der Farbe stehen, jeweils zwischen 0 und 255. Im vorliegenden Beispiel htte also die folgende Anweisung dasselbe bewirkt: Range("C1").Font.
Color = RGB(255, 0, 0)
RGB()
Mit folgender Prozedur werden einzelne Zeichen innerhalb einer Zeichenkette formatiert:
Sub EinzelneZeichen() ThisWorkbook.Worksheets("Tabelle2").Activate Range("E3").Value = "x2" Range("E3").Characters(2, 1).Font.Superscript = True Range("E4:E6").Value = "a38 + a39" Range("E4:E6").Characters(2, 2).Font.Subscript = True Range("E4:E6").Characters(8, 2).Font.Subscript = True End Sub
Das Ergebnis:
74
2.4
Zur Erluterung:
Die Eigenschaft Characters liefert Teile einer Zeichenfolge. Diese knnen anschlieend separat formatiert werden. Es mssen zwei Werte festgelegt werden:
Characters
Die erste Ziffer bestimmt die Stelle, an der die Teilzeichenfolge beginnt. Das erste Zeichen einer Zeichenfolge hat die Nummer 1. Die zweite Ziffer bestimmt die Lnge der Teilzeichenfolge.
Superscript
Im ersten Beispiel wird die Zeichenfolge 2 geliefert. Mit Hilfe der Untereigenschaft Superscript der Font-Eigenschaft des Textes wird dieses Zeichen hochgestellt. Im zweiten Beispiel werden fr insgesamt drei Zellen jeweils die beiden Zeichenfolgen 38 und 39 geliefert. Mit Hilfe der Untereigenschaft Subscript der Font-Eigenschaft des Textes wird dieses Zeichen tiefgestellt.
Subscript
2.4.11
Zellformat Rahmen
Rahmen
75
Das Ergebnis:
Zur Erluterung:
Borders
Falls nach Borders keine weitere Angabe in Klammern erfolgt, werden Eigenschaften fr den gesamten Rahmen eingestellt. Es knnen aber auch die Eigenschaften einzelner Teile des Rahmens bestimmt werden. Zulssige Konstanten sind z. B.: xlEdgeLeft (linker Rahmen), xlEdgeRight (rechter Rahmen), xlEdgeTop (oberer Rahmen), xlEdgeBottom (unterer Rahmen), xlInsideHorizontal (innere horizontale Zwischenlinien), xlInsideVertical (innere vertikale Zwischenlinien).
Rahmenteile
LineStyle
Mit der Eigenschaft LineStyle wird die Linienart fr den Rahmen festgelegt. Zulssige Konstanten sind z. B.: xlContinuous (durchgehende Linie), xlDot (gepunktete Linie) und xlDouble (doppelte Linie). Die Eigenschaft Weight bestimmt die Dicke des Rahmens. Zulssige Konstanten sind: xlHairline (ganz dnne Linie), xlThin (dnne Linie), xlMedium (mitteldicke Linie) und xlThick (dicke Linie). Durch die Eigenschaft Color wird die Rahmenfarbe bestimmt. Wie bei allen Farbangaben kann mit den Farbkonstanten oder mit der Funktion RGB() gearbeitet werden.
Weight
Color
Mit folgender Prozedur wird das Hintergrundmuster der zwei Zellen E3 und E6 gestaltet:
Sub ZellformatMuster() ThisWorkbook.Worksheets("Tabelle2").Activate Range("E3, E6").Interior.Color = vbYellow End Sub
76
2.4
Das Ergebnis:
Abbildung 2.31
Zellformat Muster
Zur Erluterung:
Die Eigenschaft Interior dient zur Bearbeitung des Innenbereichs einer Zelle. Sie hat verschiedene Untereigenschaften, u. a. Color fr die Innenfarbe.
Interior
Zur Erluterung:
Es wird die Methode Insert() des Objekts Range zum Einfgen von Zellen aufgerufen. Mit Hilfe des optionalen Parameters Shift entscheiden Sie, was mit den Nachbarzellen passieren soll. Falls dieser Parameter weggelassen wird, entscheidet Excel anhand der Bereichsform. Im ersten Fall werden die unteren Nachbarzellen nach unten verschoben. Dazu dient die Konstante xlShiftDown. Die Konstante xlShiftToRight htte die rechten Nachbarzellen nach rechts verschoben. Im zweiten Fall sind ganze Zeilen ausgewhlt. Es kann nur eine Verschiebung nach unten stattfinden, daher macht die Angabe des Parameters Shift keinen Sinn.
Insert()
Shift
77
Abbildung 2.32
Hinweis
EntireRow, EntireColumn
Die Anweisung Range("A2:A3").EntireRow.Insert wrde zwei ganze neue Zeilen vor den Zeilen des angegebenen Bereichs einfgen, hier also vor den Zeilen 2 und 3. Entsprechend wrde durch die Anweisung Range("A2:A3"). EntireColumn.Insert eine ganze neue Spalte vor der Spalte A eingefgt.
78
2.4
Zur Erluterung:
Es wird die Methode Delete() des Objekts Range zum Lschen von Zellen aufgerufen. Auch hier gibt es einen optionalen Parameter Shift, mit dem Sie entscheiden, was mit den Nachbarzellen passieren soll. Falls dieser Parameter weggelassen wird, entscheidet Excel wiederum aufgrund der Bereichsform. Im ersten Fall sind ganze Zeilen ausgewhlt. Es kann nur eine Verschiebung (aller Zeilen darunter) nach oben stattfinden, daher ergibt die Angabe des Parameters Shift keinen Sinn. Im zweiten Fall werden die unteren Nachbarzellen nach oben verschoben. Dazu dient die Konstante xlShiftUp. Die Konstante xlShiftToLeft htte die rechten Nachbarzellen nach links verschoben.
Delete()
Shift
Im vorliegenden Beispiel wird durch das Lschen von Zellen und Zeilen das vorherige Einfgen von Zellen und Zeilen rckgngig gemacht. Hinweis
Die Anweisung Range("A2:A3").EntireRow.Delete wrde die gesamten Zeilen des angegebenen Bereichs lschen, hier also die Zeilen 2 und 3. Entsprechend wrde durch die Anweisung Range("A2:A3").EntireColumn. Delete die gesamte Spalte A gelscht.
EntireRow, EntireColumn
Als Zellbereich werden die Zeilen 1 und 2 sowie die Spalten B und D ausgewhlt. Die Eigenschaft RowHeight verndert die Zeilenhhe. Die Eigenschaft ColumnWidth bestimmt die Spaltenbreite.
RowHeight ColumnWidth
79
Hinweis
AutoFit, Columns, Rows
Die optimale Einstellung der Zeilenhhe und der Spaltenbreite lsst sich ber die Methode AutoFit() des Unterobjekts Columns bzw. Rows erreichen. Ein Beispiel: Range("G:G").Columns.AutoFit stellt die Breite der Spalte G optimal ein. Range("1:2").Rows.AutoFit stellt die Hhe der Zeilen 1 und 2 optimal ein.
Eine ntzliche Eigenschaft eines Tabellenblatts ist der benutzte Bereich (UsedRange). Damit ist der kleinste zusammenhngende rechteckige Zellbereich gemeint, der alle nicht leeren Zellen umfasst. Das Problem ist nur: nicht alle Inhalte einer Zelle kann man sehen. Auch die Formatierung einer Zelle kann einen Inhalt darstellen. Falls ein Datum in eine Zelle geschrieben wurde und anschlieend wieder gelscht wurde, dann ist die Zelle nach wie vor mit dem Datumsformat formatiert. Somit wird sie in den UsedRange einbezogen. Um hier sicher zu gehen, knnte man (je nach Anwendung) vor dem Einfgen neuer Daten alle Zellen der Tabelle lschen (mit Cells.Delete). Mit folgender Prozedur werden alle Zellen des benutzten Bereichs durch einen roten Rahmen hervorgehoben und gezhlt:
Sub BenutzterBereich() ThisWorkbook.Worksheets("Tabelle1").Activate ActiveSheet.UsedRange.Borders.Color = vbRed ActiveSheet.UsedRange.Interior.Color = vbYellow MsgBox "Anzahl: " & ActiveSheet.UsedRange.Count End Sub
80
2.4
Abbildung 2.36
Benutzter Bereich
Zur Erluterung:
Mit ActiveSheet.UsedRange werden alle benutzten Zellen des aktiven Tabellenblatts erfasst. Die Eigenschaft Count ergibt fr einen Range, wie bei Arbeitsmappen oder Tabellenblttern, eine Anzahl. In diesem Falle betrgt die Anzahl 10 Zellen.
UsedRange
SpecialCells
alle Zellen eines Bereichs, die eine Formel enthalten alle Zellen eines Bereichs, die leer sind die letzte Zelle eines Bereichs, in diesem Falles des benutzten Bereichs
81
'Zellen mit Formeln Range("A1:A8").SpecialCells(xlCellTypeFormulas). _ Interior.Color = vbYellow MsgBox "Formeln: " & Range("A1:A9"). _ SpecialCells(xlCellTypeFormulas).Count 'Leere Zellen Range("A1:A8").SpecialCells(xlCellTypeBlanks). _ Interior.Color = vbCyan MsgBox "Leer: " & Range("A1:A8").SpecialCells _ (xlCellTypeBlanks).Count 'Letzte benutzte Zelle ActiveSheet.UsedRange.SpecialCells _ (xlCellTypeLastCell).Interior.Color = vbGreen MsgBox "Letzte Zeile: " & ActiveSheet.UsedRange. _ SpecialCells(xlCellTypeLastCell).Row MsgBox "Letzte Spalte: " & ActiveSheet.UsedRange. _ SpecialCells(xlCellTypeLastCell).Column End Sub
Zur Erluterung:
SpecialCells
Die Methode SpecialCells bekommt einen bestimmten Zelltyp in Form einer Konstante bergeben. Der Typ xlCellTypeFormulas liefert Zellen, die Formeln enthalten. Hier sind dies die Zellen A3 und A6.
82
2.4
Leere Zelle
Der Typ xlCellTypeBlanks liefert Zellen, die leer sind, hier die Zelle A8. Der Typ xlCellTypeLastCell liefert die letzte Zelle eines Bereichs. In diesem Falle ist es der benutzte Bereich (UsedRange), es handelt sich um die Zelle E8. Mit Hilfe der Eigenschaften Row und Column knnen Sie sich die Zeilennummer und die Spaltennummer einer Zelle angeben lassen. In diesem Falle ist es die Zeile und die Spalte der letzten Zelle des benutzten Bereichs.
Letzte Zelle
Hinweis
Bei einem Zellbereich wird mit den Eigenschaften Row bzw. Column die Nummer der Zeile bzw. der Spalte der aktiven Zelle ausgegeben. Ein Beispiel: Range("A3:B5").Row ergibt 3, Range("A3:B5").Column ergibt 1.
' Offset eines Bereichs Range("C6:D8,E9").Value = "Ber 2" Range("C6:D8,E9").Offset(4, 0).Value = "Off(4,0)" ' Offset-relative Zellen Cells(4, 3).Offset(0, 2).Range("A2").Value Cells(4, 3).Offset(0, 2).Range("A3").Value Cells(4, 3).Offset(0, 2).Range("B1").Value Cells(4, 3).Offset(0, 2).Range("B2").Value
= = = =
83
Offset berechnen:
Ausgangszelle ist die Zelle (4, 3) oder anders bezeichnet: C4. Bei einem Offset wird zuerst der Versatz fr die Zeile, dann fr die Spalte angegeben. Falls der Ursprungsbereich mit Cells angegeben ist, knnen Sie den versetzten Bereich leicht ermitteln, indem Sie die Zahlen fr die Zeile und die Spalte jeweils addieren. Ein Offset kann auch negativ sein, dann handelt es sich um Zeilen oberhalb oder um Spalten links vom Ursprungsbereich. Die drei Offsetangaben fr den ersten Bereich ergeben:
Zeile, Spalte
Negativer Offset
Zelle 4,3 + Offset 0,2 = Zelle 4,5 = Zelle E4 Zelle 4,3 + Offset 3,1 = Zelle 1,4 = Zelle D1 Zelle 4,3 + Offset 2,1 = Zelle 2,2 = Zelle B2
Das Ergebnis:
Abbildung 2.38
Offset berechnen
Abbildung 2.39
84
2.4
Die Offsetangabe fr den nicht zusammenhngenden Zellbereich ergibt einen gleichartigen Bereich, der um vier Zeilen (Offset(4, 0)) nach unten verschoben ist.
Die erste Zelle eines Offsets, egal ob einzelne Zelle oder Zellbereich, wird relativ mit A1 bezeichnet. So knnen Sie jede Zelle im Offset eindeutig erreichen. Im Beispiel sind die Zellen A2, A3, B1, B2 und B3 des Offsets besonders hervorgehoben.
Offset-relative Bezeichnung
Das Ergebnis:
Abbildung 2.41
Die oberste Zeile soll als berschrift erkannt werden, so dass sie nicht einsortiert wird.
85
Abbildung 2.42
Zur Erluterung:
Es wird der angegebene Bereich (A1:C4) sortiert. Die Methode Sort() hat zahlreiche Parameter, daher werden die Parameter beim Aufruf benannt. Der Parameter Key1 gibt den Bereich an, in dem der Sortierschlssel steht. Hier ist dies die dritte Spalte mit der Nummer, also C1:C4. Der Parameter Order1 bestimmt darber, ob aufsteigend (xlAscending) oder absteigend (xlDescending) sortiert wird. Da aufsteigende Sortierung der Standard ist, muss der Parameter nicht angegeben werden. ber den Parameter Header legen Sie fest, ob die oberste Zeile des Bereichs als berschrift erkannt werden soll. Der Standard ist xlNo, daher wird hier xlYes angegeben. Falls der Wert xlGuess angegeben wird, entscheidet Excel, ob eine berschrift vorhanden ist, und reagiert entsprechend.
Sort()
Key1
Order1
Header
86
2.4
Zur Erluterung:
Der Parameter Key2 gibt den Bereich an, in dem der zweite Sortierschlssel steht. Es wird also zunchst nach der ersten Spalte mit den Nachnamen sortiert, bei gleichem Nachnamen nach der zweiten Spalte mit den Vornamen. Es knnen bis zu drei Sortierschlssel (Key1 bis Key3) angegeben werden. Auf- bzw. absteigende Sortierung wird ber die Parameter Order1 bis Order3 bestimmt.
Key2
Mehr als drei Sortierschlssel Falls man mehr als drei Sortierschlssel bentigt, dann kann das Objekt Sort des Tabellenblatts verwendet werden. Im nachfolgenden Beispiel werden insgesamt 5 Sortierschlssel eingesetzt. Der gewnschte Bereich wird zunchst nach dem ersten Schlssel sortiert. Falls dabei gleiche Eintrge vorliegen, wird nach dem zweiten Schlssel sortiert und so weiter. Diese Mglichkeit gibt es erst seit Excel 2007.
Sub SortierenVieleSchlssel() ThisWorkbook.Worksheets("Tabelle4").Activate ' Alte Sortiereinstellungen lschen ActiveSheet.Sort.SortFields.Clear ' Insgesamt 5 Sortierschlssel einstellen ActiveSheet.Sort.SortFields.Add Range("A1:A6") ActiveSheet.Sort.SortFields.Add Range("B1:B6") ActiveSheet.Sort.SortFields.Add Range("C1:C6") ActiveSheet.Sort.SortFields.Add Range("D1:D6") ActiveSheet.Sort.SortFields.Add Range("E1:E6") ' Bereich, der sortiert werden soll ActiveSheet.Sort.SetRange Range("A1:E6")
Mehr Sortierschlssel
87
Zur Erluterung:
SortFields
Zunchst werden mithilfe der Methode Clear() evtl. vorhandene alte Sortiereinstellungen aus der Auflistung SortFields der Sortierschlssel gelscht. Die Methode Add()dient zum Hinzufgen der Bereiche, in denen die Sortierschlssel stehen, zu der Auflistung SortFields. Im vorliegenden Beispiel wird zunchst nach den Eintrgen im Bereich A1 bis A6 sortiert. Falls es Daten gibt, die in diesem Bereich bereinstimmen, so werden diese Daten nach den Eintrgen im Bereich B1 bis B6 sortiert usw. Mithilfe der Methode SetRange() wird der Bereich festgelegt, der sortiert werden soll. Die Methode Apply() dient zur Ausfhrung der Sortierung.
Add()
Sort()
Apply()
2.5
Ereignis passiert
Ereignisprozeduren
Ereignisse sagen etwas darber aus, was gerade mit einem Objekt passiert. Es knnen Ereignisse bezglich Arbeitsmappen, Tabellenblttern oder Zellbereichen stattfinden. Diese knnen mit VBA-Code verbunden werden, so dass automatisch weitere Aktionen folgen. Der VBA-Code von Ereignissen muss in den bereits vorhandenen Klassenmodulen eingetragen werden. Nach Erzeugen einer neuen Arbeitsmappe gibt es bereits die Klassenmodule DieseArbeitsmappe und Tabelle1 bis Tabelle3. Ein Doppelklick auf eines der Klassenmodule im Projekt-Explorer fhrt dazu, dass das betreffende Codefenster angezeigt wird. Oberhalb des Codefensters whlen Sie in der linken Liste das Objekt (Workbook oder Worksheet), in der rechten Liste anschlieend das Ereignis aus. Es wird ein leerer Prozedurrahmen angezeigt, in dem die Ereignisprozedur geschrieben werden kann. Noch umfangreicher sind die Mglichkeiten der Ereignisprogrammierung bei eigenen Dialogfeldern. Diese werden in Kapitel 10, Dialogfelder, beschrieben.
Klassenmodul
Ereignis auswhlen
88
Ereignisprozeduren
2.5
2.5.1
Mit folgender Prozedur wird beim ffnen der Arbeitsmappe gleichzeitig eine zweite Arbeitsmappe geffnet:
Private Sub Workbook_Open() MsgBox ActiveWorkbook.Name Workbooks.Open "C:\Temp\Mappe3.xlsm" End Sub
Zur Erluterung:
Es wird die Ereignisprozedur Workbook_Open() durchlaufen. Nach einer Kontrollausgabe wird eine zweite Arbeitsmappe geffnet.
Workbook_ Open()
Testen Sie die Prozedur, indem Sie Excel vollstndig schlieen und anschlieend die Arbeitsmappe, die die oben angegebene Prozedur enthlt, ffnen. Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe3.xls.
2.5.2
Mit folgender Prozedur im Klassenmodul DieseArbeitsmappe wird eine Arbeitsmappe vor dem Schlieen ohne weitere Nachfrage automatisch gespeichert:
Private Sub Workbook_BeforeClose(Cancel As Boolean) ThisWorkbook.Save End Sub
Zur Erluterung:
Es wird die Ereignisprozedur Workbook_BeforeClose() durchlaufen. Verhalten ohne diese Prozedur: Falls der Benutzer die Arbeitsmappe ndert und schliet, wird er gefragt, ob er die Arbeitsmappe speichern mchte. Diese Prozedur umgeht das, weil das Ereignis BeforeClose vor der Nachfrage auftritt. Innerhalb der Prozedur wird die Arbeitsmappe mit Hilfe der Methode Save() gespeichert.
Workbook_ BeforeClose
Testen Sie die Prozedur, indem Sie eine nderung vornehmen und die Arbeitsmappe schlieen.
89
2.5.3
Blatt aktivieren
Mit folgender Prozedur in einem Klassenmodul wird nach dem Aktivieren des betreffenden Tabellenblatts (durch den Benutzer oder durch VBA-Code) eine Zelle ausgewhlt:
Private Sub Worksheet_Activate() MsgBox ActiveSheet.Name Range("C5").Select End Sub
Zur Erluterung:
Worksheet_ Activate()
Es wird die Ereignisprozedur Worksheet_Activate() zu einem Tabellenblatt durchlaufen. Nach einer Kontrollausgabe wird eine Zelle ausgewhlt.
Testen Sie die Prozedur, indem Sie zwischen den verschiedenen Tabellenblttern der Arbeitsmappe hin und her wechseln. Das Ereignis tritt nur ein, falls die Tabelle, in deren Codefenster dieser VBA-Code steht, nicht bereits das aktivierte Tabellenblatt ist.
2.5.4
Zelle wechselt
Zellauswahl wechselt
Mit folgender Prozedur in einem Klassenmodul wird nach der Auswahl eines Zellbereichs in der betreffenden Tabelle die Adresse dieses Zellbereichs ausgegeben:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox Target.Address End Sub
Zur Erluterung:
SelectionChange()
Es wird die Ereignisprozedur Worksheet_SelectionChange() zu einem Tabellenblatt durchlaufen. Die Prozedur liefert den ausgewhlten Zellbereich als Range ber die Objektvariable Target. Weitere Einzelheiten zu Objektvariablen in Abschnitt 6.4, Arbeiten mit Objektvariablen. Fr den ausgewhlten Zellbereich wird die Eigenschaft Address ausgegeben. Dabei handelt es sich um die absolute Bezeichnung der Zelladresse.
Target
Testen Sie die Prozedur, indem Sie verschiedene zusammenhngende bzw. nicht zusammenhngende Zellbereiche (mit Hilfe der Taste (Strg)) auswhlen.
90
Ereignisprozeduren
2.5
2.5.5
Mit folgender Prozedur in einem Klassenmodul wird bei einem Doppelklick auf eine Zelle die betreffende Zelle formatiert:
Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Target.Interior.Color = vbGreen Target.Borders.LineStyle = xlContinuous Target.Borders.Weight = xlThick Cancel = True End Sub
Zur Erluterung:
Die Ereignisprozedur Worksheet_BeforeDoubleClick() zu einem Tabellenblatt wird durchlaufen. Mit Target wird die Zelle bezeichnet, auf der der Mauszeiger beim Doppelklick steht. Muster und Rahmen der Zelle werden eingestellt. ber die logische Variable Cancel knnen Sie bestimmen, ob das eigentliche Ereignis, hier der Doppelklick, stattfinden soll. Mit Cancel = True wird die weitere Verarbeitung abgebrochen, es findet nur die Formatierung statt. Mit Cancel = False oder einfach ganz ohne diese Anweisung wird weiter fortgesetzt, also der Cursor zur Bearbeitung in die Zelle gesetzt. Logische Variablen werden in Abschnitt 3.2.3, Datentypen, noch genauer erlutert.
BeforeDoubleClick
Cancel
2.5.6
Mit folgender Prozedur in einem Klassenmodul wird eine Spaltenbreite optimal eingestellt, falls im Tabellenblatt eine Neuberechnung an irgendeiner Stelle stattfand:
Private Sub Worksheet_Calculate() Range("G:G").Columns.AutoFit End Sub
Zur Erluterung:
Es wird die Ereignisprozedur Worksheet_Calculate() zu einem Tabellenblatt durchlaufen. Dieses Ereignis tritt ein, falls z. B. eine Zelle einen neuen Wert bekommen hat, die in der Berechnungsformel fr den Wert einer anderen Zelle vorkommt.
Worksheet_ Calculate()
91
Beispiel: In der Zelle G3 steht die Formel =G1+G2. Sobald sich G1 oder G2 ndert, tritt das Ereignis Calculate auf. Die Spaltenbreite wird in diesem Falle optimal auf die neuen Werte eingestellt.
92
Inhalt dieses Kapitels sind Variablen, Datentypen, Operatoren und Kontrollstrukturen im Zusammenspiel mit Excel und seinen Objekten.
Im Folgenden lernen Sie die wichtigsten grundlegenden Elemente und Techniken kennen, die Sie zum Schreiben von VBA-Programmen bentigen.
3.1
Allgemeines
Programmierstil
Ein Entwickler, ob in VBA oder in einer anderen Programmiersprache, sollte sich um einen guten Programmierstil bemhen. Er erleichtert sich und anderen damit die Arbeit. Durch eine bersichtliche Schreibweise und eine ausreichende Kommentierung kann der Code durch ihn und andere besser gelesen und gewartet werden. Zu einer bersichtlichen Schreibweise gehren z. B. Einrckungen und Leerzeilen. Die Entwicklungsumgebung VBE untersttzt Sie als Entwickler mit zahlreichen Hilfestellungen. Einige dieser Hilfestellungen kennen Sie vermutlich schon:
Leerzeilen
Markieren Sie ein Schlsselwort (z. B. Loop) oder den Namen einer Objektklasse (z. B. Workbooks) und bettigen Sie anschlieend die Taste (F1), dann wird die Hilfe mit der entsprechenden Erluterung eingeblendet. Falls der Begriff nicht eindeutig zugeordnet werden kann, wird eine Liste mit den mglichen Zuordnungen angezeigt, aus denen Sie auswhlen knnen. Sobald Sie eine Zeile beendet haben und zur nchsten Zeile wechseln, werden Korrekturen an Schlsselwrtern und Namen von bekannten Variablen, Funktionen, Objekten usw. vorgenommen. Ein Beispiel:
Taste F1
Automatische Korrektur
93
Sie schreiben: msgbox activesheet.name eventuell sogar mit mehreren unntigen Leerzeichen. Im Editor wird dies beim Zeilenwechsel gendert zu: MsgBox ActiveSheet.Name. Alle Leerzeichenfolgen werden auerdem redu-
ziert zu einem Leerzeichen. Sie knnen dadurch schnell erkennen, ob die Anweisung korrekt ist.
Einrckungen
Bei einem Wechsel von einer eingerckten Zeile zur nchsten Zeile bleibt die Einrckung erhalten. Dadurch sind Programmstrukturen, wie Prozeduren, Verzweigungen und Schleifen, leichter erkennbar. Sie knnen mehrere Zeilen auf einmal einrcken, indem Sie sie vollstndig markieren und anschlieend die Taste () bettigen. Einrckungen machen Sie mit der Tastenkombination () + () wieder rckgngig. Sobald Sie den Punkt hinter den Namen eines Objekts, z. B. ActiveWorkbook, gesetzt haben, erscheint eine Liste der Eigenschaften und
Taste Tab
Methoden dieses Objekts zur Auswahl. Geben Sie einen oder mehrere Anfangsbuchstaben ein, dann wird das passende Element in der Liste ausgewhlt. Mit der Taste () setzen Sie dass das betreffende Listenelement in den Code ein. Anschlieend knnen Sie mit der Eingabe unmittelbar fortfahren.
3.1.1
Auskommentieren
Codeblcke auskommentieren
Sie knnen ganze Code-Blcke auskommentieren, damit der betreffende Code kurzfristig nicht durchlaufen wird. Dies knnen z. B. Zeilen mit Kontrollausgaben (MsgBox, Debug.Print) sein, die in der Endfassung des Programms nicht mehr bentigt werden. Die Auskommentierung lsst sich durch das Symbol Block auskommentieren in der Symbolleiste Bearbeiten leicht durchfhren. Rechts daneben steht das Symbol Auskommentierung des Blocks aufheben, mit dem Sie den VBA-Code wieder aktivieren knnen.
Symbole
94
Allgemeines
3.1
bung 3 A
Verndern Sie das Makro KopieE3E5Neu aus bung 1 G (siehe Seite 33). Kommentieren Sie einzelne Zeilen aus, so dass die drei Zellen E3 bis G3 nur noch in die Zellen E10 bis G10 kopiert werden, aber nicht mehr in die Zeilen E5 bis G5. Geben Sie am Ende den Text Fertig in einer Nachrichtenbox aus. Testen Sie das vernderte Makro.
3.1.2
Zeilen zerlegen
Zeichen _ (Unterstrich)
Lange Programmzeilen lassen sich mit Hilfe des Zeichens _ (Unterstrich) in mehrere bersichtliche Programmzeilen zerlegen. Dies wurde nachfolgend mit der bereits bekannten Prozedur zum Kopieren eines Tabellenblatts durchgefhrt, zugegeben in etwas bertriebener Form:
Sub BlattKopieren() ThisWorkbook.Activate Worksheets _ ("Tabelle1"). _ Copy _ After:=Worksheets("Tabelle3") ActiveSheet.Name = "Tab1Kopie" End Sub
Zur Erluterung:
Am Ende einiger Zeilen steht ein Unterstrich. Dies bedeutet, dass die Anweisung in der nchsten Zeile fortgesetzt wird. Eine Anweisung kann sich also ber zwei oder mehr Zeilen erstrecken. Eine bliche Trennstelle ist das Leerzeichen zwischen Copy und After oder zwischen Parametern einer Funktion. Dabei bleibt auch noch die Lesbarkeit erhalten. Hier wurden als Trennstelle auch noch das Ende des Wortes Worksheets und der Punkt vor Copy genutzt. Dies ist sicherlich etwas berTrennstelle
trieben. In VBA kommen allerdings bei der Referenzierung von Objekten (siehe Abschnitt 6.2) bisweilen sehr lange Objektnamen vor. Das Beispiel soll zeigen, wie ein solcher Name zerlegt werden kann.
95
3.2
3.2.1
Daten speichern
Variablen dienen zur vorbergehenden Speicherung von Daten, die sich zur Laufzeit eines Programms ndern knnen. Eine Variable besitzt einen eindeutigen Namen, unter dem sie angesprochen werden kann. Fr die Namen von Variablen gelten in VBA die folgenden Regeln:
Variablennamen
Sie beginnen mit einem Buchstaben. Sie knnen nur aus Buchstaben, Zahlen und einigen wenigen Sonderzeichen (z. B. dem Unterstrich _ ) bestehen.
Innerhalb eines Gltigkeitsbereichs darf es keine zwei Variablen mit dem gleichen Namen geben (siehe Abschnitt 5.1, Gltigkeitsbereiche). Gltige Namen sind demnach Temperatur, Summe_Werte oder X12. Ungltige Namen sind z. B. 5Tage oder Tag#12.
Zuweisung
Variablen erhalten ihre Werte durch Zuweisung per Gleichheitszeichen. Einer Variablen sollte vor ihrer ersten Benutzung ein Wert zugewiesen werden, z. B. Temperatur = 25. Dadurch werden Programme eindeutiger, lesbarer und fehlerfreier.
3.2.2
Datentyp
Deklarationen
Neben dem Namen besitzt jede Variable einen Datentyp, der die Art der gespeicherten Information bestimmt. Der Entwickler whlt den Datentyp danach aus, ob er Text, Zahlen ohne Nachkommastellen, Zahlen mit Nachkommastellen oder z. B. Datumsangaben speichern mchte. Auerdem muss er sich Gedanken ber die Gre des Zahlenbereichs machen, den eine Zahl annehmen knnte. Er sollte versuchen, den Datentyp mit dem geringsten Speicherbedarf zu verwenden; dieser gewhrleistet gleichzeitig auch eine schnellere Verarbeitung. Im folgenden Abschnitt finden Sie eine Liste der Datentypen mit Name, Speicherbedarf und Wertebereich. Variablen sollten in Visual Basic immer deklariert werden. Dies beugt Fehlern und unntig hohem Speicherbedarf vor.
Speicherbedarf
Deklaration erzwingen
Sie haben in Kapitel 1, Einfhrung, eine Voreinstellung vorgenommen, die fr die VBA-Programmierung wichtig ist: im Men Extras Optio-
96
3.2
nen haben Sie in der Registerkarte Editor ein Hkchen bei Variablendeklaration erforderlich gesetzt. Dies sorgt ab dem nchsten ffnen von Excel dafr, dass oberhalb des VBA-Codes die Zeile Option Explicit steht und alle Variablen deklariert werden mssen.
Option Explicit
3.2.3
Datentypen
Wertebereich
Tabelle 3.1 enthlt die wichtigsten von VBA untersttzten Datentypen sowie deren Speicherbedarf und Wertebereich:
Datentyp
Boolean Byte Integer Long Single
Wertebereich, Bedeutung
True oder False (wahr oder falsch)
ganze Zahl, von 0 bis 255 ganze Zahl, von 32.768 bis +32.767 lange ganze Zahl, von 2,1 * 109 bis +2,1 * 109 Gleitkommazahl mit einfacher Genauigkeit. Von ca. 3,4 * 10+38 bis ca. 1,4 * 1045 fr negative Werte. Von ca. +1,4 * 1045 bis ca. +3,4 * 10+38 fr positive Werte Gleitkommazahl mit doppelter Genauigkeit. Von ca. 1,8 * 10+308 bis ca. 4,9 * 10324 fr negative Werte. Von ca. +4,9 * 10324 bis +1,9 * 10+308 fr positive Werte Datumsangabe, vom 1. Januar 100 bis zum 31. Dezember 9999 Verweis auf ein Objekt, siehe Abschnitt 6.4, Arbeiten mit Objektvariablen (+) plus Zeichenfolgenlnge. Zeichenkette mit variabler Lnge Datentyp nicht explizit festgelegt (nicht zu empfehlen)
Double
8 Byte
Date
Object
String
Variant
Mit folgender Prozedur werden einige Variablen der obengenannten Typen deklariert, mit Werten versehen und in Zellen angezeigt:
Sub Variablen() Dim By As Byte Dim Bo As Boolean Dim It As Integer, Lg As Long
97
Dim Sg As Single, Db As Double Dim Dt As Date Dim St As String By Bo It Lg Sg Db Dt = = = = = = = 200 True 20000 200000 1 / 7.1 1 / 7.1 "15.03.2010"
Range("A5").NumberFormatLocal = _ "0,00000000000000000000" Range("A5").Value = Sg Range("A6").NumberFormatLocal = _ "0,00000000000000000000" Range("A6").Value = Db Range("A7").Value = Dt Range("A8").Value = St Range("A:A").Columns.AutoFit End Sub
Abbildung 3.2
Verschiedene Datentypen
98
3.2
Zur Erluterung: Variablen werden mit Dim deklariert. Mit As wird ihnen ein definierter Datentyp zugewiesen.
Ein Beispiel fr einen hufigen Fehler in diesem Zusammenhang: Dim a, b As Integer. Dabei wird aus a eine Variable vom Datentyp Variant! Es heit richtig: Dim a As Integer, b As Integer
Auerhalb Wertebereich Single, Double
Bei den Datentypen fr Zahlen fhrt eine ber- oder Unterschreitung des Wertebereichs zu einem Abbruch. Werte fr Zahlen mit Nachkommastellen werden im VBA-Code mit einem Dezimalpunkt eingegeben. Die Datentypen Single und Double fr solche Zahlen unterscheiden sich in ihrer Genauigkeit. Im Beispiel wurde die Anzahl der in den Zellen angezeigten Nachkommastellen mit Hilfe der Eigenschaft NumberFormatLocal auf den Wert 20 gestellt. Der Wert der Single-Variablen ist mathematisch ungenauer als der Wert der Double-Variablen. Werte fr Zeichenketten und Datumsangaben mssen in doppelten Anfhrungszeichen angegeben werden. Bei Datumsangaben ist die Schreibweise TT.MM.JJJJ zu bevorzugen. Eine passende Formatierung: Zeilenhhe und Spaltenbreite lassen sich optimal einstellen ber die Methode AutoFit() des Objekts Columns bzw. Rows, siehe auch Abschnitt 2.4.15, Zeilenhhe und Spaltenbreite.
Anfhrungszeichen
Einige Hinweise
Falls einer Variablen kein definierter Datentyp (mit As) zugewiesen wird, dann ist diese Variable vom Typ Variant. Dieser Datentyp sollte mglichst nicht verwendet werden, da Variablen dieses Datentyps einen hheren Speicherbedarf haben, langsamer zu verarbeiten und schwieriger zu kontrollieren sind. Mit () + (F2) auf dem Namen einer Variablen springen Sie zu der Stelle, an der die Variable deklariert wurde. Mit (Strg) + () + (F2) kommen Sie wieder zurck.
Tastenkombination Shift + F2
99
bung 3 B
Variant
Schreiben Sie eine Prozedur, in der Ihr Nachname, Vorname, Ihre Adresse, Ihr Geburtsdatum und Ihr Alter jeweils in Variablen eines geeigneten Datentyps gespeichert und anschlieend wie folgt ausgegeben werden:
Abbildung 3.3
Funktion TypeName()
TypeName()
Die Funktion TypeName() erweist sich als sehr ntzlich, falls Sie den Datentyp einer Variablen, eines Zellinhalts oder eines Objekts nicht kennen. Sie liefert den Datentyp als Zeichenkette. Ein Beispiel:
Sub TypErkennen() ThisWorkbook.Worksheets("Tabelle1").Activate Range("B2").Value = TypeName(Range("A2").Value) Range("B5").Value = TypeName(Range("A5").Value) Range("B7").Value = TypeName(Range("A7").Value) Range("B8").Value = TypeName(Range("A8").Value) End Sub
Zur Erluterung:
Es werden die Datentypen der Inhalte der vier genannten Zellen ausgegeben.
100
3.2
3.2.4
Konstanten
Unvernderlich
Konstanten sind vordefinierte Werte, die whrend der Laufzeit nicht verndert werden knnen. Man gibt Konstanten im Allgemeinen aussagekrftige Namen; dadurch sind sie leichter zu behalten als die Werte, die sie reprsentieren. Im Vergleich zu Variablen kann das Programm auf Konstanten schneller zugreifen. Sie sollten also immer Konstanten verwenden, falls der Wert feststeht und sich whrend des Programmablaufs niemals ndert. Es gibt:
Eigene Konstanten: Sie werden vom Entwickler an einer zentralen Stelle definiert und knnen an verschiedenen Stellen des Programms genutzt werden. Somit muss eine eventuelle nderung einer Konstanten zur Entwurfszeit nur an einer Stelle erfolgen. Der Gltigkeitsbereich von Konstanten ist analog zum Gltigkeitsbereich von Variablen (siehe Abschnitt 5.1, Gltigkeitsbereiche). Integrierte Konstanten: Sie sind bereits vordefiniert und knnen vom Entwickler nicht verndert werden.
Integrierte Konstanten
Beim Einfgen von Zellen hatten Sie bereits die integrierten Konstanten xlShiftDown und xlShiftToRight benutzt. Sie reprsentieren die Zahlen 4.121 bzw. 4.161, die natrlich nicht so einprgsam sind wie die Namen der Konstanten. Eine andere hufig genutzte Konstante ist vbCrLf fr den Zeilenumbruch in einer Nachrichtenbox (MsgBox).
Im folgenden Beispiel wird mit einer Konstanten und einer Variablen gearbeitet:
Sub Konstanten() Const MaxWert As Integer = 55 Dim MinWert As Integer MinWert = 15 MsgBox MaxWert MinWert MinWert = 35 MsgBox MaxWert MinWert End Sub
101
Zur Erluterung:
Die Konstante MaxWert wird festgelegt. Sie kann nicht mehr verndert werden. Die Variable MinWert kann innerhalb der Prozedur ihren Wert verndern.
Farbkonstanten
Farbkonstanten
vbBlack: Schwarz vbRed: Rot vbGreen: Grn vbYellow: Gelb vbBlue: Blau vbMagenta: Magenta vbCyan: Zyan vbWhite: Wei
Beliebige Farben knnen mit der Funktion RGB() erzeugt werden. Diese Funktion hat drei Parameter; diese stehen fr Rot-, Grn- und BlauWerte der Farbe, jeweils zwischen 0 und 255.
3.3
Operatoren
Zum Zusammensetzen von Ausdrcken werden sowohl in den Zellen der Excel-Tabellenbltter als auch in VBA Operatoren verwendet. Sie haben schon den Operator = fr Zuweisungen von Werten kennengelernt. In VBA gibt es mehr Operatoren als in Excel, auerdem arbeiten manche Operatoren anders als in Excel.
Rangfolge
Operatoren knnen in verschiedene Kategorien eingeteilt werden. Die Rangfolge der Operatoren (Prioritt) ist fr die Reihenfolge der Abarbeitung zustndig, falls mehrere Operatoren innerhalb eines Ausdrucks verwendet werden. Diese Rangfolge ist in Abschnitt 3.3.5 angegeben. Falls Sie sich bei der Verwendung dieser Regeln nicht sicher sind, so empfiehlt es sich, durch eigene Klammersetzung die Reihenfolge der Abarbeitung explizit festzulegen.
102
Operatoren
3.3
3.3.1
Arithmetische Operatoren
Rechenoperatoren
Arithmetische Operatoren dienen zur Durchfhrung von Berechnungen. Tabelle 3.2 listet die arithmetischen Operatoren auf.
Operator
+ * / \ Mod ^
Beschreibung Addition Subtraktion oder Negation Multiplikation Division Ganzzahldivision, siehe unten Modulo, siehe unten Potenzierung, siehe unten
Division Die Division mit dem Operator / ergibt das gewohnte Ergebnis. Es ist allerdings darauf zu achten, welchen Datentyp die Variable hat, in der das Ergebnis abgespeichert wird. Die beiden nachfolgenden Prozeduren geben 2,6 bzw. 3 aus. Im zweiten Fall wird bei der Speicherung in der Integer-Variablen gerundet. Erstes Beispiel:
Sub DivisionOhneRunden() Dim x As Double x = 13 / 5 MsgBox x End Sub
Zweites Beispiel:
Sub DivisionMitRunden() Dim x As Integer x = 13 / 5 MsgBox x End Sub
Ganzzahldivision Die Ganzzahldivision wird in zwei Schritten durchgefhrt. Im ersten Schritt werden Dividend und Divisor einzeln gerundet. Im zweiten Schritt werden die beiden verbliebenen Zahlen geteilt, anschlieend
103
werden die Ziffern nach dem Komma abgeschnitten. Zu diesem Operator gibt es in Excel keine direkte Entsprechung. Tabelle 3.3 zeigt einige Beispiele.
Ausdruck
19 / 4 19 \ 4 19 \ 4.6 19.5 \ 4.2
Ergebnis 4,75 4 3 5
Modulo-Operator
Mod
Der Modulo-Operator Mod berechnet den Rest einer Division. Diese Berechnung wird ebenfalls in zwei Schritten durchgefhrt. Im ersten Schritt werden Dividend und Divisor einzeln gerundet. Im zweiten Schritt wird der Rest der Ganzzahldivision ermittelt. Einige Beispiele sehen Sie in Tabelle 3.4.
Ausdruck
19 Mod 4 19.5 Mod 3.2
Ergebnis 3 2
Es gibt in Excel die Funktion REST(); sie berechnet allerdings den Rest, ohne vorher zu runden. Die Berechnung des zweiten Beispiels mit REST(19,5; 3,2) ergibt also 0,3 statt 2. Potenzierung
Operator ^
Zur Potenzierung einer Zahl dient der Operator ^ (hoch). Diesen Operator gibt es auch in Excel, auerdem gibt es die Funktion POTENZ(). Mit beiden ermittelt man dieselben Ergebnisse wie mit dem VBA-Operator (Beispiele siehe Tabelle 3.5).
Ausdruck
2^5 3^2^3
Ergebnis 32 729
104
Operatoren
3.3
Ausdruck
2 ^ 5.4 2 ^ 5
Ergebnis 42,2242531447326 32
Eine Beispiel-Prozedur, in der eine Reihe von arithmetischen Operatoren eingesetzt wird:
Sub ArithmetischeOperatoren() ThisWorkbook.Worksheets("Tabelle1").Activate ' Grundrechenarten Range("C1").Value = 5 * 3 6 / 3 Range("C2").Value = 5 * (3 6) / 3 ' Ganzzahl-Division Range("C4").Value = Range("C5").Value = Range("C6").Value = Range("C7").Value =
19 / 19 \ 19 \ 19.5
4 4 4.6 \ 4.2
' Modulo-Operator Range("D1").Value = 19 Mod 4 Range("D2").Value = 19.5 Mod 3.2 ' Potenzieren Range("D4").Value Range("D5").Value Range("D6").Value Range("D7").Value End Sub
= = = =
2 ^ 5 3 ^ 2 ^ 3 2 ^ 5.4 2 ^ 5
Das Ergebnis:
105
3
Auswertungsreihenfolge
Multiplikation und Division innerhalb eines Ausdrucks sind gleichrangig und werden von links nach rechts in der Reihenfolge ihres Auftretens ausgewertet. Dasselbe gilt fr Additionen und Subtraktionen, die zusammen in einem Ausdruck auftreten. Mit Klammern kann diese Rangfolge auer Kraft gesetzt werden, damit bestimmte Teilausdrcke vor anderen Teilausdrcken ausgewertet werden. In Klammern gesetzte Operationen haben grundstzlich Vorrang. Innerhalb der Klammern gilt jedoch wieder die normale Rangfolge der Operatoren.
Klammern
3.3.2
Operatoren fr Bedingungen
Vergleichsoperatoren
Vergleichsoperatoren werden in Bedingungen bentigt. Diese wiederum nutzt man fr Verzweigungen und Schleifen, die zur Ablaufsteuerung von Programmen dienen. Verzweigungen arbeiten nach dem gleichen Prinzip wie die Funktion WENN() in Excel. Das Ergebnis einer Bedingung ist einer der beiden Werte, die fr eine Variable vom Typ Boolean verwendet werden drfen, also True (wahr) oder False (falsch). Tabelle 3.6 fhrt die Vergleichsoperatoren auf.
Operator
< <= > >= = <>
True, False
Beschreibung kleiner als kleiner als oder gleich grer als grer als oder gleich gleich ungleich
106
Operatoren
3.3
Like
Darber hinaus gibt es noch den Operator Like, der zum Mustervergleich dient. Dabei knnen Sie unter anderem die Platzhalter * (Stern = eines oder mehrere Zeichen) und ? (Fragezeichen = genau ein Zeichen) einsetzen. Tabelle 3.8 zeigt einige Beispiele.
Ausdruck
"abxba" Like "a*a" "abxba" Like "a?a" "aba" Like "a?a"
Mit Hilfe von Like knnen Sie noch wesentlich komplexere Mustervergleiche durchfhren als in den hier genannten Beispielen. Eine Beispielprozedur:
Sub VergleichsOperatoren() ThisWorkbook.Worksheets("Tabelle1").Activate Range("E1").Value = (5 > 3) Range("E2").Value = (3 = 3.2) Range("E3").Value = (5 + 3 * 2 >= 12) Range("F1").Value Range("F2").Value Range("F3").Value Range("F4").Value End Sub = = = = ("abxba" Like "a*a") ("abxba" Like "a?a") ("aba" Like "a?a") ("asdlfigc" Like "a?d?f*c")
Hinweis
Die Klammern um die Ausdrcke mit den Vergleichsoperatoren sind fr die richtige Auswertung nicht notwendig, sie wurden nur zur besseren Lesbarkeit gesetzt.
Das Ergebnis:
Abbildung 3.6
107
bung 3 C
Ermitteln Sie das Ergebnis der beiden folgenden Ausdrcke, speichern Sie es in einer Variablen eines geeigneten Datentyps, und zeigen Sie es an:
12 3 >= 4 * 2.5 "Maier" Like "M??er"
3.3.3
Not, And, Or
Logische Operatoren
Logische Operatoren dienen dazu, mehrere Bedingungen zusammenzufassen. Die wichtigsten logischen Operatoren listet Tabelle 3.9 auf.
Operator
Not And Or Xor
Das Ergebnis ist wahr, wenn der Ausdruck falsch ist. beide Ausdrcke wahr sind. mindestens ein Ausdruck wahr ist. genau ein Ausdruck wahr ist.
Es seien die Variablen A = 1, B = 3 und C = 5 gesetzt. Beachten Sie die Ausdrcke in Tabelle 3.10.
Ausdruck
Not (A < B)
Ergebnis falsch
falsch
Die Funktionsweise der logischen Operatoren knnen Sie auch aus Tabelle 3.11 entnehmen.
Ausdruck 1 wahr wahr falsch falsch Ausdruck 2 wahr falsch wahr falsch Not falsch falsch wahr wahr And wahr falsch falsch falsch Or wahr wahr wahr falsch Xor falsch wahr wahr falsch
108
Operatoren
3.3
Eine Beispiel-Prozedur:
Sub LogischeOperatoren() Dim a As Integer, b As Integer, c As Integer a = 1 b = 3 c = 5 ThisWorkbook.Worksheets("Tabelle1").Activate Range("G1").Value = Not (a < b) Range("G2").Value = (b > a) And (c > b) Range("G3").Value = (b < a) Or (c < b) Range("G4").Value = (b < a) Xor (c > b) End Sub
Das Ergebnis:
bung 3 D
Ermitteln Sie das Ergebnis der beiden folgenden Ausdrcke, speichern Sie es in einer Variablen eines geeigneten Datentyps, und zeigen Sie es an:
4 > 3 And 4 > 3 4 > 3 Or 4 > 3
3.3.4
Verkettungsoperator
Operator &
Der Operator & dient zur Verkettung von Zeichenketten. Er wird hufig bentigt, um Ergebnisse anschaulich zusammen mit Text darzustellen. Ist einer der Ausdrcke keine Zeichenfolge, sondern eine Zahl oder Datumsangabe, so wird er in eine Zeichenfolge verwandelt. Das Gesamtergebnis ist dann wiederum eine Zeichenfolge. Beispiel:
Sub VerkettungsOperator() Dim a As String Dim s As Single Dim d As Date d = "12.03.2010" s = 4.6
109
a = "Temperatur " & s & " Grad am " & d MsgBox a End Sub
Das Ergebnis:
Abbildung 3.8
3.3.5
Rangfolge
Enthlt ein Ausdruck mehrere Operationen, so werden die einzelnen Teilausdrcke in einer bestimmten Reihenfolge ausgewertet und aufgelst, die als Rangfolge bzw. Prioritt der Operatoren bezeichnet wird. Es gilt die Rangfolge in Tabelle 3.12.
Operator
^ *, / \ Mod +, & =, <>, <, >, <=, >=, Like Not And Or Xor
Beschreibung Potenzierung (Exponentialoperator) negatives Vorzeichen Multiplikation, Division Ganzzahldivision Modulo Addition, Subtraktion Verkettung Vergleichsoperatoren (das Zeichen = steht fr den Vergleich, nicht fr die Zuweisung) logisches Nicht logisches Und logisches Oder logisches Oder (exklusiv)
Die Operatoren, die in Tabelle 3.12 stehen, haben die hchste Prioritt. Ausdrcke mit Operatoren der gleichen Prioritt werden von links nach rechts ausgewertet.
110
Verzweigungen
3.4
Klammern
Wie schon bei den arithmetischen Operatoren erwhnt: Mit Klammern kann diese Rangfolge auer Kraft gesetzt werden, damit bestimmte Teilausdrcke vor anderen Teilausdrcken ausgewertet werden. In Klammern gesetzte Operationen haben grundstzlich Vorrang. Innerhalb der Klammern gilt jedoch wieder die normale Rangfolge der Operatoren. bung 3 E
Sind die Bedingungen in Tabelle 3.13 wahr oder falsch? Lsen Sie die Aufgabe mglichst auf dem Papier, ohne VBA.
Nr. 1 2 3 4 5 6 7 8 Werte
a=5 b=10 a=5 b=10 z=10 w=100 z=10 w=100 x=1.0 y=5.7 x=1.0 y=5.7 n1=1 n2=17 n1=1 n2=17
Bedingung
a>0 And b<>10 a>0 Or b<>10 z<>0 Or z>w Or w-z=90 z=11 And z>w Or w-z=90 x>=.9 And y<=5.8 x>=.9 And Not(y<=5.8) n1>0 And n2>0 Or n1>n2 And n2<>17 n1>0 And (n2>0 Or n1>n2) And n2<>17
3.4
Verzweigungen
Kontrollstruktur
Der Programmcode wurde bisher rein sequentiell abgearbeitet, d. h. eine Anweisung nach der anderen. Kontrollstrukturen ermglichen eine Steuerung dieser Reihenfolge. Die Kontrollstrukturen unterteilen sich in Verzweigungen und Schleifen. Verzweigungen gestatten dem Programm, in verschiedene alternative Anweisungsblcke zu verzweigen. Es gibt die beiden Verzweigungsstrukturen If ... Then ... Else und Select Case ... Diese Auswahlmglichkeiten bergeben aufgrund von Bedingungen die Programmausfhrung an einen bestimmten Anweisungsblock. Bedingungen werden mit Hilfe der bereits vorgestellten Vergleichsoperatoren erstellt. Verzweigungen arbeiten nach dem gleichen Prinzip wie die Funktion WENN() in Excel. Bekanntlich kann die Funktion WENN() verschachtelt
Alternativen
WENN-Funktion
111
werden, falls es mehr als zwei Mglichkeiten gibt. Dies trifft auch fr die Verzweigungen in VBA zu.
3.4.1
Bedingungen werden mit Vergleichsoperatoren gebildet. Sie werden ausgewertet und sind entweder wahr oder falsch. Ist das Ergebnis der Auswertung wahr, so wird der Then-Teil mit den Anweisungen1 ausgefhrt. Ist das Ergebnis der Auswertung falsch und gibt es einen Else-Teil, so wird der Else-Teil mit den Anweisungen2 ausgefhrt. In der folgenden Prozedur wird das einzeilige If in zwei verschiedenen Beispielen genutzt. Beim zweiten Beispiel ist zu beachten, dass die Zeile fr den Druck in diesem Buch zu lang ist. Es handelt sich aber dennoch um eine einzeilige If-Verzweigung.
Sub EinzeilenIf() ThisWorkbook.Worksheets("Tabelle1").Activate If Range("A1").Value > 100 Then MsgBox "Gro" If Range("A1").Value < 10 Then MsgBox "Klein" Else _ MsgBox "Nicht klein" End Sub
Einzeiliges If
Zur Erluterung:
Else
Beim ersten Beispiel wird nur etwas angezeigt, falls der Wert in der Zelle grer als 100 ist. Anderenfalls (Else) wird nichts ausgefhrt. Beim zweiten Beispiel wird in jedem Falle etwas angezeigt.
3.4.2
Block-If
If-Then-Else-Block
Bei einfachen Entscheidungen und einzelnen Anweisungen ist das einzeilige If geeignet. Sobald mehrere Anweisungen auszufhren sind, wird der Programmcode schnell unbersichtlich. Fr diese Zwecke ist ein If-Then-Else-Block wesentlich besser geeignet. Der Block hat folgenden Aufbau:
If Bedingung1 Then Anweisungen1 [ ElseIf Bedingung2 Anweisungen2 ] ...
112
Verzweigungen
3.4
Das Programm verzweigt zu den Anweisungen hinter der ersten zutreffenden Bedingung (ElseIf). Falls keine Bedingung zutrifft, werden die Anweisungen hinter dem Else ausgefhrt, sofern es diesen Else-Zweig gibt. Andernfalls wird keine Anweisung durchgefhrt. Ein If-Then-ElseBlock endet immer mit einem End If. In der folgenden Prozedur werden zwei verschiedene Flle geprft. Trifft keiner dieser Flle zu, so wird der Else-Zweig ausgefhrt:
Sub BlockIf() ThisWorkbook.Worksheets("Tabelle1").Activate If Range("C1").Value > 100 Then Range("C1").Font.Size = 14 Range("C1").Font.Italic = True Range("C1").Font.Underline = True ElseIf Range("C1").Value < 10 Then Range("C1").Font.Size = 11 Range("C1").Font.Italic = False Range("C1").Font.Underline = False Else Range("C1").Font.Size = 17 Range("C1").Font.Italic = False Range("C1").Font.Underline = True End If End Sub
If, ElseIf
Else
Das Ergebnis:
Abbildung 3.9
Zur Erluterung:
Je nach Wert der Zelle werden die Schrifteigenschaften Gre, kursiv und unterstrichen eingestellt. Im vorliegenden Fall ist der Wert weder grer als 100 noch kleiner als 10, also trifft der dritte Fall (Else) zu.
113
bung 3 F
Schreiben Sie ein Programm, das zu einem Gehaltsbetrag, der in der Zelle A10 notiert wird, den Steuerbetrag berechnet und in der Zelle darunter ausgibt. Formatieren Sie beide Zellen wie unten gezeigt.
In Tabelle 3.14 sind die Steuerstze angegeben. Verwenden Sie fr die Verzweigung einen If-Then-Else-Block.
Gehalt bis einschl. 12.000 grer als 12.000 bis einschl. 20.000 grer als 20.000 bis einschl. 30.000 grer als 30.000
Tabelle 3.14 Zu bung 3 F
Steuersatz 12 % 15 % 20 % 25 %
3.4.3
Mehrfachauswahl
Select Case
Die Anweisung Select Case ... kann als Alternative zum If-Then-ElseBlock gelten. Sie vereinfacht eine Mehrfachauswahl, wenn nur ein Wert untersucht werden muss, und ist wie folgt aufgebaut:
Select Case Testausdruck [ Case Ausdrucksliste1 Anweisungen1 ] [ Case Ausdrucksliste2 Anweisungen2 ] ... [ Case Else AnweisungenX ] End Select
Testausdruck
Die Anweisung Select Case ... verwendet nur einen Testausdruck, der am Beginn der Struktur ausgewertet wird. Sein Wert wird anschlieend der Reihe nach mit den Werten der Ausdruckslisten verglichen. Eine Ausdrucksliste kann aus mehreren Ausdrcken oder einer Bereichsangabe mit dem Schlsselwort To bestehen. Ein Ausdruck kann aus einem Wert oder einer Bedingung mit dem Schlsselwort Is bestehen.
To, Is
114
Verzweigungen
3.4
Bei der ersten bereinstimmung wird der zugehrige Anweisungsblock ausgefhrt und dann mit der nchsten Anweisung hinter dem End Select fortgefahren. Der optionale Anweisungsblock hinter dem Case Else wird ausgefhrt, falls vorher keine bereinstimmung gefunden wurde. In der folgenden Prozedur werden verschiedene Flle geprft. Trifft keiner dieser Flle zu, wird der Case Else-Zweig ausgefhrt:
Sub SelectCase() ThisWorkbook.Worksheets("Tabelle1").Activate Select Case Range("F1").Value Case 20, 30, 40 Range("C1").Interior.Color Case Is < 10, Is > 100 Range("C1").Interior.Color Case 12 To 17 Range("C1").Interior.Color Case Else Range("C1").Interior.Color End Select End Sub
Case Else
Das Ergebnis:
Zur Erluterung:
Case 20, 30, 40 bedeutet: falls der Wert 20, 30 oder 40 ist. Case Is < 10, Is > 100 bedeutet: falls der Wert kleiner als 10 oder gr-
Case 12 To 17 bedeutet: falls der Wert grer oder gleich 12 und klei-
ner oder gleich 17 ist. Dies ist hier der erste zutreffende Fall.
115
bung 3 G
Schreiben Sie das Programm aus der vorherigen bung 3 F. Benutzen Sie fr die Verzweigung Select Case.
3.5
Wiederholung
Schleifen
Schleifen werden in Programmen hufig bentigt. Sie ermglichen den mehrfachen Durchlauf von Anweisungen. Darin liegt eine besondere Strke der Programmierung allgemein: die schnelle wiederholte Bearbeitung hnlicher Vorgnge. Es gibt die folgenden Schleifenstrukturen:
Do ... Loop For ... Next For Each ... In ... Next
Mit Hilfe der ersten beiden Strukturen steuert man die Wiederholungen eines Anweisungsblocks, also die Durchlufe der Schleife. Dabei wird der Wahrheitswert eines Ausdrucks (der Schleifenbedingung) oder der Wert eines numerischen Ausdrucks (Wert des Schleifenzhlers) bentigt. Die Schleife For Each ... In ... Next wird im Zusammenhang mit Auflistungen oder Feldern eingesetzt. Nheres dazu in Abschnitt 6.5, ForEach-Schleife.
3.5.1
For ... Next
For-Next-Schleife
Falls die Anzahl der Schleifendurchlufe bekannt oder vor Beginn der Schleife berechenbar ist, sollten Sie die For-Next-Schleife verwenden. Ihr Aufbau sieht wie folgt aus:
For Zhler = Anfang To Ende [ Step = Schritt ] [ Anweisungen ] [ Exit For ] [ Anweisungen ] Next [ Zhler ]
Zhler
Die Zahlen-Variable Zhler wird zunchst auf den Wert von Anfang gesetzt. Nach jedem Durchlauf wird sie um den Wert von Schritt verndert, also vergrert oder verkleinert. Falls Step = Schritt nicht angege-
116
Schleifen
3.5
ben wurde, wird die Variable um 1 vergrert. Der neue Wert von Zhler wird mit dem Wert von Ende verglichen.
Falls die Schrittweite positiv ist und der Wert von Zhler nicht grer als der Wert von Ende ist, wird die Schleife nochmals durchlaufen. Falls die Schrittweite negativ ist und der Wert von Zhler nicht kleiner als der Wert von Ende ist, wird die Schleife ebenfalls erneut durchlaufen. Falls die Schrittweite positiv ist und der Wert von Zhler grer als der Wert von Ende ist, wird die Schleife beendet. Das Gleiche passiert, falls die Schrittweite negativ ist und der Wert von Zhler kleiner als der Wert von Ende ist.
Schrittweite
Die Anweisung Exit For kann eingesetzt werden, um die Schleife aufgrund einer speziellen Bedingung sofort zu verlassen. In den folgenden Prozeduren werden drei unterschiedliche Schleifen durchlaufen. Das erste Beispiel:
Sub ForNext1() Dim i As Integer ThisWorkbook.Worksheets("Tabelle2").Activate Range("B1:B10").Clear For i = 3 To 7 Cells(i, 2).Value = Cells(i, 1).Value * 2 Next i End Sub
Exit For
Abbildung 3.12
117
Zur Erluterung:
Die Zahlen 1 bis 10 in der Spalte A waren bereits vorhanden. Als Zhlervariable dient i. Der Zielbereich wird vorher mit der Methode Clear() gelscht, da auch die nachfolgenden Ergebnisse hier notiert werden. Die Schleife wird erstmalig mit i = 3 und letztmalig mit i = 7 durchlaufen. Es ist keine Schrittweite angegeben, also ist die Schrittweite 1.
Schrittweite 1
Zur Erluterung:
Schrittweite 2
Als Schrittweite ist 2 angegeben, daher wird nur jede zweite Zelle bearbeitet.
118
Schleifen
3.5
Dim Ergebnis As Integer ThisWorkbook.Worksheets("Tabelle2").Activate Range("B1:B10").Clear For i = 9 To 2 Step 2 Ergebnis = Cells(i, 1).Value * 2 If Ergebnis < 10 Then Exit For Cells(i, 2).Value = Ergebnis Next i End Sub
Zur Erluterung:
Die Schleife wird, beginnend mit dem grten Wert, mit negativer Schrittweite durchlaufen. Das Rechenergebnis wird zur deutlicheren Darstellung zwischengespeichert, in der Variablen Ergebnis. Falls dieses Ergebnis eine besondere Bedingung erfllt, wird die Schleife vorzeitig verlassen, mit Hilfe von Exit For. Im vorliegenden Beispiel tritt dieser Fall ein, sobald der Wert von Ergebnis kleiner als 10 ist.
Negative Schrittweite
bung 3 H
Schreiben Sie eine Prozedur mit einer einfachen Schleife, die die folgenden Zahlen wie gezeigt untereinander in den Zellen einer Spalte ausgibt: 35; 32,5; 30; 27,5; 25; 22,5; 20.
119
3.5.2
Do-Loop-Schleife
Ist die Anzahl der Schleifendurchlufe nicht bekannt bzw. vor Beginn der Schleife nicht berechenbar, so sollte man die Do-Loop-Schleife verwenden. Es gibt sie in fnf verschiedenen Varianten:
While
Do While ... Loop: Prft die Bedingung zum Weiterlaufen der Schleife
Do ... Loop While: Prft die Bedingung zum Weiterlaufen der Schleife
Do Until ... Loop: Prft die Bedingung zum Abbruch der Schleife am Anfang der Schleife. Do ... Loop Until: Prft die Bedingung zum Abbruch der Schleife am
Do ... Loop: Die Bedingung zum Weiterlaufen oder zum Abbruch der
Schleife wird nicht geprft, daher sind eine Verzweigung in der Schleife und ein Exit Do zur Beendigung der Schleife notwendig. Ansonsten wrde die Schleife endlos weiterlaufen.
Fugesteuert
Die Schleifen mit Do ... Loop While und Do ... Loop Until nennt man auch fugesteuert: Die Bedingung wird erst am Fu der Schleife geprft. Eine solche Schleife wird mindestens einmal durchlaufen. Im Gegensatz dazu gibt es die kopfgesteuerten Schleifen mit Do While
... Loop und Do Until ... Loop: Die Bedingung wird bereits im Kopf der
Kopfgesteuert
Schleife geprft. Dabei kann es vorkommen, dass diese Schleife niemals durchlaufen wird. Der allgemeine Aufbau sieht wie folgt aus:
Do { While | Until } Bedingung [ Anweisungen ]
120
Schleifen
3.5
oder
Do [ [ [ Loop Anweisungen ] Exit Do ] Anweisungen ] { While | Until } Bedingung
Zufallszahlengenerator
In den folgenden Prozeduren werden drei der fnf Mglichkeiten genutzt. Es sollen jeweils so lange Zahlen addiert werden, bis die Summe der Zahlen 5 erreicht. Da die Zahlen durch einen Zufallszahlengenerator erzeugt werden, ist die Anzahl der Schleifendurchlufe nicht vorhersagbar. Hinweis
Der Zufallszahlengenerator wird mit Hilfe der Funktion Rnd() realisiert. Diese liefert quasizufllige Zahlen zwischen 0 und 1. Der Zufallszahlengenerator muss mit Hilfe der Anweisung Randomize vor der Benutzung initialisiert werden. Ansonsten knnte es vorkommen, dass immer die gleichen Zahlen geliefert werden, die dann eben nicht mehr zufllig sind.
Rnd(), Randomize
121
Der Zielbereich wird zu Beginn mit der Methode Clear() gelscht, da die Ergebnisse aller drei Schleifen hier notiert werden. Der Zufallszahlengenerator wird initialisiert. Die Variable i fr die Zeilennummer der Ausgabezelle wird auf 1 gesetzt. Die Variable Summe wird zunchst mit dem Wert 0 initialisiert. Dies ist in VBA eigentlich nicht ntig, gehrt aber zum guten Programmierstil, da man auf diese Weise den Startwert der Summe verdeutlichen kann. Der Wert der Variablen Summe wird um eine Zufallszahl zwischen 0 und 1 erhht. Die Summe wird ausgegeben. Die Variable i fr die Zeilennummer der Ausgabezelle wird um 1 erhht, damit der nchste Wert von Summe in der nchsten Zeile ausgegeben wird. Mit Hilfe von While Summe < 5 wird geprft, ob die Summe der Zahlen kleiner als 5 ist. Sobald dies nicht mehr zutrifft, luft die Prozedur hinter der Anweisung Loop weiter. Es wird die Ausgabe Fertig erzeugt.
Summe, Startwert
LoopWhile
Abbildung 3.16
122
Schleifen
3.5
Do Summe = Summe + Rnd Cells(i, 3).NumberFormatLocal = "0,000" Cells(i, 3).Value = Summe i = i + 1 Loop Until Summe >= 5 Cells(i, 3).Value = "Fertig" End Sub
Der Anfang dieser Prozedur unterscheidet sich nicht vom Anfang der vorherigen Prozedur, daher wird er hier nicht aufgefhrt. Zur Steuerung der Schleife wird diesmal mit Loop Until geprft, ob die Summe den Wert von 5 erreicht oder berschritten hat. In diesem Fall wird die Schleife nicht nochmals durchlaufen.
Loop Until
Zur Steuerung der Schleife wird diesmal innerhalb der Schleife geprft, ob die Summe den Wert von 5 erreicht oder berschritten hat. In diesem Fall erfolgt ein unmittelbares Verlassen der Schleife mit Exit Do.
Exit Do
123
bung 3 I
Schreiben Sie eine Prozedur, mit deren Hilfe eine Zahl, die in der obersten Zelle einer Spalte steht, wiederholt halbiert wird. Alle Zahlen sollen, wie in Abbildung 3.17 dargestellt, nacheinander unter der ursprnglichen Zahl ausgegeben werden. Die Prozedur soll beendet werden, wenn das Ergebnis der Halbierung kleiner als 0,001 ist.
Abbildung 3.17 Ergebnis von bung 3 I (Beispiel mit der Zahl 3,0)
bung 3 J
Erweitern Sie die Lsung aus bung 3 F (siehe Seite 114). Schreiben Sie eine Prozedur, die zu einer Reihe von Gehltern u. a. den Steuerbetrag berechnet und ausgibt. In Tabelle 3.15 sind die Steuerstze angegeben.
Gehalt bis einschl. 12.000 grer als 12.000 bis einschl. 20.000 grer als 20.000 bis einschl. 30.000 grer als 30.000
Tabelle 3.15 Steuertabelle Zu bung 3 J
Steuersatz 12 % 15 % 20 % 25 %
Es sollen, wie dargestellt, fr jedes Gehalt von 9.000 bis 33.000 in Schritten von 3.000 folgende vier Werte ausgegeben werden: Gehalt, Steuersatz, Steuerbetrag, Gehalt abzglich Steuerbetrag. Jedes Gehalt soll mit den zugehrigen Werten in einer eigenen Zeile ausgegeben werden.
Abbildung 3.18
124
Wer programmiert, macht Fehler. In diesem Kapitel lernen Sie, wie man Programmierfehler erkennt und wie man mit ihnen umgeht.
Fehlerbehandlung
Fehlerarten
Whrend man ein Programm entwickelt und testet, treten normalerweise noch hufig Fehler auf. Diese Fehler lassen sich in drei Gruppen untergliedern: Syntaxfehler, Laufzeitfehler und logische Fehler. Syntaxfehler knnen mit Hilfe des Editors vermieden werden. Laufzeitfehler, also Fehler zur Laufzeit des Programms, die einen Programmabsturz zur Folge haben, knnen mit der On Error-Anweisung behandelt werden. Logische Fehler sind erfahrungsgem am schwersten zu finden. Hier bietet das Debugging eine gute Hilfestellung.
Vermeidung
4.1
Syntaxfehler
Warnung, Hinweis
Syntaxfehler treten zur Entwicklungszeit des Programms auf und haben ihre Ursache in falsch oder unvollstndig geschriebenem Programmcode. Bereits beim Schreiben des Codes, sptestens aber beim Starten einer Prozedur macht VBA auf Syntaxfehler aufmerksam. Der Programmierer erhlt eine Warnmeldung und gegebenenfalls einen Hinweis auf die richtige Vorgehensweise. Wird der Fehler nicht behoben, so wird eine Ausfhrung des Programms abgelehnt. Der Editor bietet einige Hilfestellungen zur Vermeidung von Fehlern, die bereits in Abschnitt 3.1, Grundlagen der Programmierung mit VBA Allgemeines, erlutert wurden. Abbildung 4.1 zeigt ein Beispiel fr einen Syntaxfehler. Der Fehler wird whrend des Schreibens, genauer gesagt beim Zeilenwechsel, bemerkt. Die Fehlerstelle wird markiert, und es wird ein Hinweis auf die richtige Schreibweise gegeben.
Fehler markiert
125
Fehlerbehandlung
Abbildung 4.1
Syntaxfehler
4.2
On Error
Laufzeitfehler
Die On Error-Anweisung dient zum Abfangen von Laufzeitfehlern. Diese treten auf, wenn das Programm versucht, eine unzulssige Operation durchzufhren, beispielsweise eine Division durch Null oder das ffnen einer nicht vorhandenen Datei. Es ist natrlich besser, Laufzeitfehler von Anfang an zu unterbinden. Dies ist allerdings unmglich, da es Vorgnge gibt, auf die der Entwickler keinen Einfluss hat, etwa die fehlerhafte Eingabe eines Benutzers oder ein beim Druckvorgang ausgeschalteter Drucker.
Unvermeidbare Fehler
4.2.1
Beispiel mit Fehler
In der folgenden Prozedur wird ein Laufzeitfehler hervorgerufen. Der Inhalt der Zelle A1 wird durch den Inhalt der Zelle A2 geteilt. Das Ergebnis der Division soll in der Zelle A3 ausgegeben werden.
Sub LaufzeitFehler() Dim x As Integer, y As Integer, z As Integer ThisWorkbook.Worksheets("Tabelle1").Activate x = Range("A1").Value y = Range("A2").Value z = x / y Range("A3").Value = z End Sub
Falls in den beiden Zellen die Zahlen 12 und 3 stehen, sieht das Ergebnis erwartungsgem wie in Abbildung 4.2 aus.
126
Laufzeitfehler
4.2
Abbildung 4.2
Falls jedoch die Zahlen 12 und 0 in den Zellen stehen, bricht das Programm mit einem Laufzeitfehler ab. Es erscheint ein Dialogfeld mit einer Fehlermeldung (siehe Abbildung 4.3).
Sie knnen nun entweder den Button Beenden oder den Button Debuggen bettigen. Klicken Sie den Button Debuggen, so wird die Zeile, die den Laufzeitfehler erzeugt hat, gelb markiert. Dies ist in diesem Falle die Zeile z = x / y, da die Division in dieser Zeile vorgenommen werden sollte. Dadurch bekommen Sie einen weiteren Hinweis zur Fehlerbehebung.
Falls dagegen die Zahl 12 und der Text abc in den Zellen stehen, bricht das Programm mit einer anderen Fehlermeldung ab:
127
Fehlerbehandlung
Bettigen Sie den Button Debuggen, dann wird die Zeile y = Range("A2").Value gelb markiert. In dieser Zeile sollte der Inhalt der Zelle (der Text abc) der Integer-Variablen y zugewiesen werden. Dies erwies sich als unvertrglich.
Abbildung 4.6
4.2.2
On Error
Die Prozedur wird nun zum Abfangen des Laufzeitfehlers wie folgt verbessert:
Sub OnErrorAnweisung() Dim x As Integer, y As Integer, z As Integer ThisWorkbook.Worksheets("Tabelle1").Activate On Error GoTo Fehler x = Range("A1").Value y = Range("A2").Value z = x / y Range("A3").Value = z Exit Sub Fehler: MsgBox Err.Description Resume Next End Sub
128
Laufzeitfehler
4.2
Abbildung 4.8
Zur Erluterung:
Die Anweisung On Error GoTo Fehler bedeutet, dass im Falle eines Laufzeitfehlers innerhalb dieser Prozedur zu der Zeile mit der Zeilenmarke Fehler gesprungen wird. Die Zeilenmarke wird gesetzt mit: Fehler:, also allgemein mit Name der Zeilenmarke und einem Doppelpunkt. Beim Auftreten eines Laufzeitfehlers wird das Fehlerobjekt Err mit Daten versorgt. Sie knnen z. B. den Wert der Eigenschaft Description ausgeben und erhalten die Beschreibung des Fehlers. Im Unterschied zum vorherigen Beispiel kann das Programm weiterlaufen, es bricht nicht ab. Mit Exit Sub (hnlich Exit For oder Exit Do fr eine Schleife) kann eine Prozedur vorzeitig verlassen werden. Falls diese Anweisung in der vorliegenden Prozedur weggelassen wurde, wrden die Anweisungen nach der Zeilenmarke Fehler in jedem Falle durchlaufen, auch wenn die Zahlen in den Zellen korrekt sind. Dies soll natrlich nicht sein. Die Anweisung Resume Next bedeutet, dass der Programmlauf mit der Anweisung fortsetzt, die nach der Anweisung steht, in der der Laufzeitfehler auftrat.
GoTo Zeile
Objekt Err
Exit Sub
Resume Next
129
Fehlerbehandlung
4.3
Falsche Logik
Logische Fehler treten auf, wenn eine Anwendung zwar ohne Syntaxfehler bersetzt und ohne Laufzeitfehler ausgefhrt wird, aber nicht das geplante Ergebnis liefert. Dies liegt daran, dass die Programmlogik falsch aufgebaut wurde. Die Ursache logischer Fehler zu finden, ist oft schwierig und kann nur durch intensives Testen und Analysieren der Ablufe und Ergebnisse durchgefhrt werden. VBA stellt im Zusammenhang mit dem Debugging einige wertvolle Hilfen zur Verfgung.
Debugging
4.3.1
Schritt fr Schritt
Einzelschrittverfahren
Sie knnen ein Programm im Einzelschrittverfahren ablaufen lassen, um sich dann bei jedem einzelnen Schritt die aktuellen Inhalte von Variablen und Steuerelementen anzuschauen. Als Beispiel dient die bereits bekannte Prozedur OnErrorAnweisung(). Fr den ersten Durchlauf in Einzelschritten sollen die Zahlen 12 und 3 in den Zellen stehen. Sie beginnen im VBE mit dem Menpunkt Debuggen Einzelschritt (Taste (F8)). Ein gelber Pfeil vor einer gelb markierten Zeile kennzeichnet den Punkt, an dem die Prozedur gerade angehalten wurde und auf die Reaktion des Entwicklers wartet. Nach einigen weiteren Einzelschritten (wiederum Taste (F8)) stehen Sie auf der folgenden Zeile:
Taste F8
Platzieren Sie nun den Cursor ber einer Variablen (z. B. ber der Variablen x), so sehen Sie den aktuellen Wert (hier der Wert 12 fr x). Sie erkennen auch, dass die Variable z noch den Wert 0 hat, da die aktuell markierte Anweisung noch nicht ausgefhrt wurde. Bereits nach dem nchsten Einzelschritt hat die Variable z den Wert 4 bekommen.
130
4.3
Direktfenster
Die aktuellen Variablenwerte knnen Sie sich auch im Direktfenster ansehen. Sie erreichen es ber das Men Ansicht Direktfenster. Nach der Eingabe von ?<Variablenname> erscheint der jeweilige Wert:
Parallel zu den Variablen knnen Sie auch nach jedem Einzelschritt die Inhalte der Zellen des Tabellenblatts betrachten. Diese verndern sich erst, nachdem die entsprechende Prozedurzeile durchlaufen wurde. Dieses einfache Beispiel zeigt, dass Sie mit dem Einzelschrittverfahren den Ablauf eines Programms stckweise verfolgen und so den Ursprung eines logischen Fehlers leichter lokalisieren knnen. Fr den zweiten Durchlauf in Einzelschritten sollen die Zahl 12 und der Text abc in den Zellen stehen. Whrend des Durchlaufs in Einzelschritten sehen Sie zweimal deutlich den Sprung zur Fehlermarke und die anschlieende Fortsetzung der Prozedur:
Fehlerursache finden
bei der Zuweisung des Textes abc an die Zahlenvariable y bei der Durchfhrung der Division
131
Fehlerbehandlung
Abbildung 4.11
4.3.2
Breakpoint
Haltepunkte
Dauert das Einzelschrittverfahren bei einem bestimmten Programm zu lange, knnen Sie auch mit Haltepunkten (engl. breakpoints) arbeiten. Das Programm durchluft dann alle Anweisungen bis zu einem solchen Haltepunkt. Setzen Sie einen Haltepunkt in die Nhe der Stelle, an der Sie den Ursprung eines Fehlers vermuten. Das Setzen eines Haltepunkts geschieht ber den Menpunkt Debuggen Haltepunkt setzen (Taste (F9)). Es wird ein Haltepunkt in der Zeile gesetzt, in der sich der Cursor befindet. Im Beispiel bietet sich hierfr die Zeile an, in der z = x / y berechnet wird.
Taste F9
Gesetzter Haltepunkt
Das Programm wird nun ber die Taste (F5) gestartet. Es unterbricht vor der Ausfhrung der Zeile mit dem Haltepunkt. Ab diesem Punkt knnen Sie das Programm wiederum im Einzelschrittverfahren ablaufen lassen und die Werte der Variablen wie oben beschrieben kontrollieren. Es knnen auch mehrere Haltepunkte gesetzt werden. Ein Haltepunkt wird wieder entfernt, indem Sie den Cursor in die betreffende Zeile setzen und wiederum die Taste (F9) bettigen. ber das Men Debuggen knnen Sie auch alle Haltepunkte auf einmal entfernen.
Mehrere Haltepunkte
132
In diesem Kapitel erfahren Sie etwas ber die Gltigkeitsbereiche von Variablen, ber Datenfelder und ber die Modularisierung von Programmen mit Prozeduren und Funktionen.
In Kapitel 3 haben Sie bereits die Grundlagen der VBA-Programmierung kennengelernt. Im Folgenden werden Sie mit weiteren Elementen und Techniken vertraut gemacht.
5.1
Gltigkeitsbereiche
Unabhngige Variablen
Variablen sollten mglichst lokal, d. h. innerhalb einer Prozedur, deklariert werden. Damit kann jede Prozedur mglichst unabhngig von anderen Prozeduren arbeiten. Es gibt allerdings auch Situationen, in denen Variablen fr andere Gltigkeitsbereiche deklariert werden mssen. Es gibt folgende Gltigkeitsbereiche:
Variablen, die innerhalb einer Prozedur deklariert wurden, sind nur innerhalb der Prozedur lokal gltig. Auerhalb der Prozedur sind sowohl Name als auch Wert der Variablen unbekannt. Sobald die Prozedur abgearbeitet wurde, steht der Wert auch nicht mehr zur Verfgung. Beim nchsten Aufruf der gleichen Prozedur werden diese Variablen neu deklariert und erhalten neue Werte. Variablen, die im Deklarationsteil eines Moduls (oberhalb der ersten Prozedur) mit Dim deklariert werden, sind modulweit gltig. Ihr Wert kann in jeder Prozedur dieses Moduls gesetzt oder abgerufen werden und bleibt whrend der Projektlaufzeit erhalten. Variablen, die im Deklarationsteil eines Moduls (oberhalb der ersten Prozedur) mit Public deklariert werden, sind projektweit gltig. Der Begriff projektweit bedeutet, dass ihr Wert in jeder Prozedur der verschiedenen Module des Projekts bekannt ist und gesetzt oder abgeru-
Lokal
Modulweit
Public, ffentlich
133
fen werden kann. Auerdem bleibt ihr Wert whrend der Projektlaufzeit erhalten.
Gleiche Namen
Gibt es mehrere Variablen mit dem gleichen Namen, gelten folgende Regeln:
Lokale Variablen mit gleichem Namen in der gleichen Prozedur sind nicht zulssig. Eine modulweite Variable wird innerhalb einer Prozedur von einer lokalen Variablen mit dem gleichen Namen ausgeblendet. Eine projektweite Variable wird innerhalb eines Moduls von einer modulweiten oder lokalen Variablen mit dem gleichen Namen ausgeblendet.
Ausblenden
Im folgenden Beispiel werden zum besseren Verstndnis lokale, modulweite und projektweite Variablen deklariert, in verschiedenen Prozeduren verndert und ausgegeben. Zunchst der Inhalt von Modul1:
Option Explicit Dim Mx As Integer Public Px As Integer Sub Gueltigkeit1() Dim Lx As Integer Mx = 10 Px = 20 Lx = 30 MsgBox Mx MsgBox Px MsgBox Lx End Sub Sub Gueltigkeit2() MsgBox Mx End Sub Sub Gueltigkeit3() Dim Mx As Integer MsgBox Mx End Sub
134
Datenfelder
5.2
Zur Erluterung:
Die Variable Mx ist im Modul1 modulweit gltig, in Modul2 unbekannt. In der Prozedur Gueltigkeit1() wird ihr ein Wert zugewiesen, anschlieend wird sie ausgegeben. In der Prozedur Gueltigkeit2() wird sie nur ausgegeben. Der Wert hngt dabei davon ab, ob die Prozedur Gueltigkeit1() vorher durchlaufen wurde oder nicht. In der Prozedur Gueltigkeit3() wird die modulweite Variable Mx von einer lokalen Variablen mit dem gleichen Namen ausgeblendet. Die Variable Px ist projektweit gltig. In der Prozedur Gueltigkeit1() wird ihr ein Wert zugewiesen, anschlieend wird sie ausgegeben. In der Prozedur Gueltigkeit4() im Modul2 wird sie nur ausgegeben. Der Wert hngt dabei davon ab, ob die Prozedur Gueltigkeit1() vorher durchlaufen wurde oder nicht. Die Variable Lx ist nur in der Prozedur Gueltigkeit1() lokal gltig, auerhalb ist sie unbekannt. In der Prozedur wird ihr ein Wert zugewiesen, anschlieend wird sie ausgegeben.
5.2
Datenfelder
Viele Daten speichern
Man verwendet Datenfelder, um eine grere Menge zusammengehriger Daten des gleichen Datentyps mit dem gleichen Variablennamen anzusprechen und zu speichern. Datenfelder knnen in VBA
eindimensional oder mehrdimensional sein, statisch (mit festgelegter Gre) oder dynamisch (mit variabler Gre) sein.
Eine Verarbeitung groer Datenmengen (z. B. Eingangsdaten) kann in einem Datenfeld schneller vorgenommen werden als in den Zellen eines Tabellenblatts. Im Zusammenhang mit Datenfeldern werden hufig Schleifen eingesetzt. Diese ermglichen es, alle Elemente eines Datenfelds anzusprechen.
135
5.2.1
Eindimensionale Datenfelder
In der folgenden Prozedur werden sieben Werte aus einer Reihe von Temperaturmessungen in einem eindimensionalen, statischen Datenfeld vom Typ Integer gespeichert. Zur besseren Darstellung werden sie anschlieend in Zellen ausgegeben:
Sub DatenfeldEindimensional() Dim T(1 To 7) As Integer Dim i As Integer ThisWorkbook.Worksheets("Tabelle1").Activate Randomize For i = 1 To 7 T(i) = Rnd() * 10 + 20 Cells(i, 1).Value = T(i) Next i End Sub
Zur Erluterung:
Randomize
Die Werte sollen per Zufallszahlengenerator ermittelt werden; dieser wird zunchst mit der Anweisung Randomize initialisiert. Mit der Anweisung Dim T(1 To 7) As Integer wird ein eindimensionales Feld mit sieben Elementen deklariert. Jedes einzelne Element entspricht einer einzelnen Integer-Variablen. Es knnen Felder aller bekannten Datentypen deklariert werden. Die einzelnen Elemente werden durch eine laufende Nummer, den sogenannten Index, voneinander unterschieden. Der Index beginnt fr dieses Feld bei 1 und geht bis 7. Das erste Element des Felds hat die Bezeichnung T(1), das nchste T(2) usw. bis T(7).
Index
136
Datenfelder
5.2
Schleife und Datenfeld
Innerhalb einer For-Schleife wird jedem Element des Felds ein zuflliger Wert zugewiesen. Innerhalb der Schleife wird das aktuelle Element mit T(i) angesprochen, da die Schleifenvariable i die Werte von 1 bis 7 durchluft, die als Index bentigt werden. Der Wert fr das Feldelement wird per Zufallsgenerator ermittelt. Dieser liefert Zahlen (mit Nachkommastellen) zwischen 0 und 1. Multipliziert man diese mit 10, so ergeben sich Zahlen zwischen 0 und 10. Addiert man 20, erhlt man Zahlen zwischen 20 und 30. Da diese Zahlen einer Integer-Variablen zugewiesen werden, werden die Nachkommastellen abgeschnitten, und es ergeben sich ganze Zahlen zwischen 20 und 30. Die Elemente des Datenfelds werden in den Zellen untereinander angezeigt.
Zwei Hinweise
Die Anweisung Dim T(7) As Integer htte ein eindimensionales Feld mit acht (!) Elementen deklariert. Die Elemente htten die Bezeichnungen T(0) bis T(7). Fr die Darstellung innerhalb von Zellen eines Tabellenblatts bietet es sich allerdings an, den Index bei 1 beginnen zu lassen. Falls man auf Modulebene, also oberhalb der Prozeduren und Funktionen, die Anweisung Option Base 1 einfgt, dann gilt der Wert 1 (statt des Werts 0) automatisch als Untergrenze der Felder in dem betreffenden Modul. Dann wrde die Anweisung Dim T(7) As Integer ein eindimensionales Feld mit sieben Elementen deklarieren.
bung 5 A
Schreiben Sie ein Programm, in dem den Elementen eines eindimensionalen Felds, das 10 Integer-Werte enthlt, zufllige Werte zwischen 30 und 35 zugewiesen werden. Anschlieend sollen alle Zellen, die den kleinsten Wert des Felds enthalten, wie gezeigt besonders hervorgehoben werden.
137
5.2.2
Zweidimensional
Mehrdimensionale Datenfelder
Haben Sie nicht nur sieben Temperaturwerte, die Sie speichern mchten, sondern wurden die Temperaturwerte darber hinaus an drei verschiedenen Orten aufgenommen, so bietet sich ein zweidimensionales Feld an. Die Elemente eines solchen Felds werden ber zwei Indizes angesprochen. Der erste Index steht fr die laufende Nummer der Messung, der zweite Index fr den Ort, an dem die Messung durchgefhrt wurde. Die folgende Prozedur, bei der die Werte eines Orts jeweils in einer Spalte angezeigt werden, veranschaulicht dies:
Sub DatenfeldMehrdimensional() Dim T(1 To 7, 1 To 3) As Integer Dim i As Integer, k As Integer ThisWorkbook.Worksheets("Tabelle1").Activate Randomize For i = 1 To 7 For k = 1 To 3 T(i, k) = Rnd() * 10 + 20 Cells(i, k).Value = T(i, k) Next k Next i End Sub
Zwei Indizes
Zur Erluterung:
Dim ...(..., ...) As ...
Es wird mit Dim T(1 To 7, 1 To 3) ein zweidimensionales Feld der Gre 7 mal 3 Elemente vom Datentyp Integer deklariert. Der Index beginnt in jeder Dimension bei 1.
138
Datenfelder
5.2
Geschachtelte Schleife
Es folgen zwei geschachtelte For-Schleifen. Geschachtelte Schleifen bestehen aus einer ueren und einer inneren Schleife. Die uere Schleife arbeitet mit der Schleifenvariablen i, die von 1 bis 7 luft. Die innere Schleife arbeitet mit der Schleifenvariablen k, die von 1 bis 3 luft. Eine solche geschachtelte Schleife hat folgenden Ablauf: i erhlt den Wert 1, k durchluft dann die Werte 1 bis 3; dann erhlt i den Wert 2, und k erhlt wieder die Werte von 1 bis 3 usw. Auf diese Weise werden alle 21 Elemente des zweidimensionalen Felds erreicht. Das jeweils aktuelle Element T(i,k) erhlt seinen Wert wieder ber den Zufallsgenerator. Das zweidimensionale Feld wird damit vollstndig erzeugt und im Tabellenblatt ausgegeben.
Ein zweidimensionales Feld lsst sich noch anschaulich innerhalb eines Tabellenblatts darstellen. Allerdings gibt es auch Situationen, in denen Datenfelder mehr als zwei Dimensionen haben knnen:
Mehr Dimensionen
Haben wir nicht nur sieben Messungen pro Tag an drei verschiedenen Orten, sondern diese auch noch ber einen ganzen Monat an 31 Tagen, so bentigen wir eine dritte Dimension. Die Deklaration she dann wie folgt aus: Dim T(1 To 7, 1 To 3, 1 To 31) As Integer (oder besser: As Single). Es ergben sich also 7 mal 3 mal 31 Elemente. Dieses Beispiel lsst sich leicht erweitern: Wie bisher haben wir sieben Messungen an drei Orten an 31 Tagen. Es wird aber jeweils nicht nur die Temperatur, sondern auch die Windrichtung, die Windgeschwindigkeit und die Luftfeuchtigkeit gemessen. Dazu bentigen wir ein vierdimensionales Feld, das wie folgt deklariert wrde: Dim T(1 To 7, 1 To 3, 1 To 31, 1 To 4) As Single.
Drei Dimensionen
Vier Dimensionen
Sie sehen, dass Datenfelder nahezu unbegrenzte Mglichkeiten zur Speicherung und Verarbeitung grerer Datenmengen bieten. Der Begriff Speicherung ist hier natrlich nur temporr zu verstehen: fr die Speicherung whrend der Verarbeitung. Fr eine dauerhafte Speicherung auf Festplatte bentigen Sie Dateien (siehe Abschnitt 9.1, Textdateien, Import und Export) oder besser noch Datenbanken (siehe Abschnitt 9.5, Austausch mit Microsoft Access).
Dauerhafte Speicherung
139
bung 5 B
Schreiben Sie ein Programm, in dem den Elementen eines zweidimensionalen Felds, das 10 mal 2 Integer-Werte enthlt, zufllige Werte zwischen 130 und 135 zugewiesen werden. Anschlieend sollen alle Zellen, die den kleinsten Wert des Felds enthalten, besonders hervorgehoben werden.
5.2.3
Variable Gre
Dynamische Datenfelder
Steht zum Zeitpunkt des Programmstarts noch nicht fest, wie viele Variablen in einem Feld gespeichert werden sollen, so knnen Sie auch mit dynamischen Feldern arbeiten. Dabei lsst sich die Gre eines Datenfelds zur Laufzeit verndern. Dies ist sehr ntzlich, falls z. B. eine grere, unbekannte Menge an Daten aus einer Textdatei eingelesen, verarbeitet und anschlieend in einem Tabellenblatt dargestellt werden soll. Die Grenvernderung (Redimensionierung, Schlsselwort ReDim) kann mehrmals geschehen. Mit Hilfe von Preserve vereinbart man, dass eventuell bereits vorhandene Werte erhalten bleiben sollen. Im folgenden Beispiel wird ein dynamisches Datenfeld deklariert. Seine Gre wird dreimal unterschiedlich festgelegt, mit bzw. ohne Preserve:
Sub DatenfeldDynamisch() Dim T() As Integer Dim i As Integer ThisWorkbook.Worksheets("Tabelle1").Activate Randomize ' Feld zu Beginn ReDim T(1 To 3) For i = 1 To 3 T(i) = Rnd() * 10 + 20 Cells(i, 5).Value = T(i) Next i
ReDim, Preserve
140
Datenfelder
5.2
' Feld vergrert, ohne Preserve ReDim T(1 To 6) For i = 4 To 6 T(i) = Rnd() * 10 + 20 Next i For i = 1 To 6 Cells(i, 6).Value = T(i) Next i ' Feld vergrert, mit Preserve ReDim Preserve T(1 To 9) For i = 7 To 9 T(i) = Rnd() * 10 + 20 Next i For i = 1 To 9 Cells(i, 7).Value = T(i) Next i End Sub
Das Ergebnis:
Zur Erluterung:
Das Feld T wird zunchst ohne Grenangabe deklariert. Mit der ReDim-Anweisung wird es auf die Gre 3 festgelegt. Die drei Elemente werden mit zuflligen Werten gefllt und ausgegeben. Anschlieend wird das Feld auf die Gre 6 vergrert, ohne Preserve. Die neu hinzugekommenen Elemente 4 bis 6 werden mit zuflReDim
ligen Werten gefllt. Das gesamte Feld wird ausgegeben. Man erkennt, dass die Elemente 1 bis 3 ihren Wert verloren haben, sie haben wieder den Wert 0.
141
5
Preserve
Zuletzt wird das Feld auf die Gre 9 vergrert, mit Preserve. Die neu hinzugekommenen Elemente 7 bis 9 werden mit zuflligen Werten gefllt. Das gesamte Feld wird ausgegeben. Man erkennt, dass die Elemente 4 bis 6 ihren Wert behalten haben, wegen Preserve.
VBA-Funktion Array()
Array()
Mithilfe der Funktion Array() knnen eine Reihe von Werten beliebigen Datentyps und beliebige Objekte in einem eindimensionalen Datenfeld vom Typ Variant zusammengefasst werden. In der nachfolgenden Prozedur wird ein Datenfeld mit zwei Ganzzahlen, einer Zahl mit Nachkommastellen, einer Zeichenkette und einem Objekt vom Typ Range erzeugt. Es wird 3.5 ausgegeben, der Wert des dritten Feldelements.
Sub FunktionArray() Dim T() As Variant T = Array(2, -14, 3.5, "abc", Range("A2")) MsgBox T(2) End Sub
5.2.4
Erase
zum Lschen aller Inhalte eines statischen Datenfelds; das Datenfeld selbst ist noch vorhanden und beansprucht noch Speicherplatz; zur Freigabe des gesamten Speicherplatzes eines dynamischen Datenfelds; dieser Speicherplatz steht anschlieend anderen Variablen oder Datenfeldern wieder zur Verfgung.
Zur Erluterung:
142
Datenfelder
5.2
Das erste Element wird gefllt und ausgegeben. Nach dem Lschen des Felds mit der Anweisung Erase wird das Element erneut ausgegeben. Es hat wieder den Startwert 0.
Hinweis
Die Elemente von Feldern von Zeichenketten werden auf den Wert "" (= leere Zeichenkette) gesetzt.
Zur Erluterung:
Das dynamische Datenfeld T wird deklariert. Es wird mit Hilfe von ReDim auf die Gre 5 gesetzt. Das erste Element wird gefllt und ausgegeben. Nach dem Freigeben des Speicherplatzes mit der Anweisung Erase wird das Element erneut ausgegeben. Es tritt ein Laufzeitfehler auf (der abgefangen wird), da das Element nicht mehr existiert. Im weiteren Verlauf der Prozedur kann das Datenfeld erneut mit ReDim genutzt werden.
143
5.3
Sie haben bereits zahlreiche Prozeduren kennengelernt und entwickelt. Diese werden entweder als Makro von Excel aus aufgerufen oder direkt vom VBE aus gestartet. Darber hinaus knnen Sie Prozeduren und Funktionen schreiben, die von anderen Prozeduren bzw. Funktionen aufgerufen werden. Funktionen knnen auerdem direkt in Tabellenbltter eingebaut werden. Dies hat folgende Vorteile:
hnliche Vorgnge Modularisierung
Gleiche oder hnliche Vorgnge mssen nur einmal programmiert werden und knnen dann beliebig oft ausgefhrt werden. Umfangreiche Programme knnen modularisiert werden, das heit, sie werden in kleinere Bestandteile zerlegt, die bersichtlicher sind und einfacher gewartet werden knnen. Eigene Funktionen knnen Mglichkeiten bieten, die ber die integrierten Excel-Funktionen hinausgehen. Sie knnen im Tabellenblatt in gewohnter Weise in den Zellen eingetragen werden, mit Hilfe von =FUNKTIONSNAME(). Sie stehen in der Kategorie Benutzerdefiniert zur Verfgung.
Eigene ExcelFunktionen
Ergebnis zurckgeben
Im Wesentlichen unterscheiden sich Funktionen von Prozeduren dadurch, dass sie nicht nur eine Reihe von Anweisungen ausfhren, sondern auch einen Funktionswert, beispielsweise das Ergebnis einer Berechnung, zurckliefern knnen. An eine Prozedur (oder Funktion) knnen Parameter bergeben werden. Dadurch wird sie flexibler. Bezglich der Handhabung von Parametern (bergabe per Referenz, bergabe per Kopie, optionale Parameter, beliebig viele Parameter) unterscheiden sich Funktionen und Prozeduren nicht. Zur bergabe von Parametern siehe Abschnitt 5.3.2. Hinweis
Parameter
Methode
Im Zusammenhang mit den Objekten von Excel wurde bereits hufig der Begriff der Methode verwendet. Methoden sind ebenfalls Funktionen, die allerdings auf ein bestimmtes Objekt bezogen sind.
5.3.1
Prozeduren
In einer Prozedur sind Anweisungen zusammengefasst, die als logische Einheit zusammen ausgefhrt werden sollen. Durch eine klare Aufgaben-
144
5.3
teilung dieser Prozeduren wird der Programmcode eines Moduls bersichtlicher und kann einfacher gewartet werden. Wir haben bereits allgemeine Prozeduren und Ereignisprozeduren kennengelernt. Allgemeine Prozeduren sind nicht mit Ereignissen verbunden und haben folgenden (vereinfachten) Aufbau:
Sub Prozedurname (Parameterliste) [ Anweisungsblock ] [ Exit Sub ] [ Anweisungsblock ] End Sub
Sub ... End Sub
Besteht die Parameterliste aus mehreren Parametern, so werden diese durch Kommata voneinander getrennt. Die Anweisung Exit Sub kann eingesetzt werden, um die Prozedur aufgrund einer besonderen Bedingung sofort und nicht erst am Ende zu verlassen. Dies wurde z. B. im Abschnitt ber die Fehlerbehandlung im Zusammenhang mit der On Error-Abweisung genutzt. Der Aufruf einer Prozedur:
Prozedurname Parameterliste
Parameterliste
Exit Sub
Prozedur aufrufen
Im nachfolgenden Beispiel wird die Prozedur ZeigeMaximum() von zwei verschiedenen Stellen aus aufgerufen. Sie berechnet jeweils das Maximum der beiden bergebenen Parameter und gibt dieses aus:
Sub Prozedur1() Dim a As Double, b As Double a = 4.5 b = 7.2 ZeigeMaximum a, b End Sub Sub Prozedur2() Dim c As Double c = 23.9 ZeigeMaximum c, 5.6 End Sub Sub ZeigeMaximum(x As Double, y As Double) If x > y Then MsgBox x Else MsgBox y
145
Zur Erluterung:
Anzahl und Typ gleich
Die Prozedur ZeigeMaximum() hat zwei Parameter, die beiden DoubleVariablen x und y. Folglich muss die Prozedur auch mit zwei (mglichst Double-)Variablen aufgerufen werden, denn sie erwartet dies. In Prozedur1() wird die Prozedur ZeigeMaximum() mit den Variablen a und b, in Prozedur2() mit den Variablen c und dem Wert 5.6 aufgerufen. In beiden Fllen werden also zwei Zahlenwerte an x und y bergeben. Innerhalb der Prozedur ZeigeMaximum() wird mit Hilfe einer Verzweigung das Maximum dieser beiden Zahlen ermittelt und ausgegeben. Anschlieend endet die Prozedur ZeigeMaximum(), und der Programmablauf kehrt zur aufrufenden Stelle zurck. Es knnen also Variablen oder Werte an eine Prozedur bergeben werden. Falls es sich um Variablen handelt, mssen sie nicht den gleichen Namen haben wie die Variablen in der Prozedur. Prozeduren werden im Allgemeinen von beliebigen Stellen des Programms aus mit unterschiedlichen Parametern wiederholt aufgerufen. Wichtig ist hierbei, dass Anzahl, Reihenfolge und Datentyp der Parameter bereinstimmen.
Gltigkeitsbereich
An dieser Stelle soll noch einmal das Thema Gltigkeitsbereich von Variablen verdeutlicht werden:
Die beiden lokalen Variablen a und b sind nur innerhalb von Prozedur1() bekannt und gltig. Bezogen auf Prozedur2() trifft dies fr die lokale Variable c zu. Ebenso gilt dies fr die beiden Parameter x und y, bezogen auf die Prozedur ZeigeMaximum().
146
5.3
Eindeutigkeit
Somit kann es nicht zu Verwechslungen kommen. Selbst wenn einzelne Variablennamen in mehr als einer Prozedur vorkommen, ist die Eindeutigkeit aufgrund des Gltigkeitsbereichs gegeben.
Hinweis
Mit ()+(F2) auf dem Namen einer Prozedur oder Funktion springen Sie zu der Stelle, an der die Prozedur oder Funktion definiert wurde. Mit (Strg)+()+(F2) kommen Sie wieder zurck. Zur Erinnerung: Mit ()+(F2) auf dem Namen einer Variablen springen Sie zu der Stelle, an der die Variable deklariert wurde.
Tastenkombination Shift + F2
bung 5 C
Schreiben Sie eine Prozedur, in der zwei Double-Variablen beliebige Werte zugewiesen werden. Anschlieend soll eine zweite Prozedur aufgerufen werden, der genau zwei Variablen bergeben werden knnen. Innerhalb der zweiten Prozedur wird der Mittelwert der beiden Zahlen berechnet und wie in dargestellt ausgegeben.
Abbildung 5.7
5.3.2
Parameter werden in VBA per Referenz bergeben. Dies bedeutet, dass eine Vernderung der Parameter in der Prozedur (oder Funktion) eine Rckwirkung auf die Originalvariable hat. Wenn Sie allerdings nicht wnschen, dass es solche Rckwirkungen gibt, dann mssen Sie vor der betreffenden Variablen das Schlsselwort ByVal einfgen. Dies bedeutet, dass die Variable per Kopie an die Prozedur (oder Funktion) bergeben wird. Eine Vernderung der Kopie hat keine Auswirkung auf die Originalvariable. Im folgenden Programm werden beide Mglichkeiten einander gegenbergestellt.
Sub Uebergabe() Dim x As Integer, y As Integer ThisWorkbook.Worksheets("Tabelle2").Activate
147
x = 5 y = 12 Cells(1, 1).Value = x Cells(1, 2).Value = y TauscheKopie x, y Cells(2, 1).Value = x Cells(2, 2).Value = y TauscheReferenz x, y Cells(3, 1).Value = x Cells(3, 2).Value = y End Sub Sub TauscheKopie(ByVal a As Integer, ByVal b As Integer) Dim c As Integer c = a a = b b = c End Sub Sub TauscheReferenz(ByRef a As Integer, ByRef b As Integer) Dim c As Integer c = a a = b b = c End Sub
Das Ergebnis:
Abbildung 5.8
Zur Erluterung:
In der Prozedur Uebergabe() werden zwei Integer-Variablen mit Startwerten belegt. Anschlieend werden die Prozeduren TauscheKopie() und TauscheReferenz() aufgerufen. Schlielich werden die neuen Werte der beiden Variablen ausgegeben.
148
5.3
Ringtausch
In den beiden aufgerufenen Prozeduren werden jeweils die beiden bergebenen Variablen mit Hilfe einer dritten Variablen vertauscht (Ringtausch). Im Fall der Prozedur TauscheKopie() wurde ByVal verwendet. Die neuen Werte stimmen jedoch mit den Startwerten berein, denn der Tausch hat nur intern in der Prozedur TauscheKopie() stattgefunden, er hat keine Wirkung nach auen. In der Prozedur TauscheReferenz() wurde ByRef verwendet. Dies ist der Standard, Sie knnen also ByRef auch weglassen. Die neuen Werte stimmen nicht mehr mit den Startwerten berein, der Tausch hat eine dauerhafte Auswirkung auf die beiden Originalvariablen.
ByVal
ByRef
5.3.3
Funktionen
Function ... (...) As ...
Jede Funktion besitzt wie eine Variable einen bestimmten Datentyp, der hinter As angegeben wird. Funktionen werden im Allgemeinen dazu verwendet, einen Wert zu berechnen. Sie liefern diesen Rckgabewert in ihrem Namen zurck, nachdem er ihnen innerhalb der Prozedur zugewiesen wurde. Die Anweisung Exit Function kann eingesetzt werden, um die Funktion aufgrund einer speziellen Bedingung sofort und nicht erst am Ende zu verlassen. Der Aufruf einer Funktion:
Variable = Funktionsname(Parameterliste)
Exit Function
Hinweis
Eigene Funktionen knnen sowohl innerhalb von VBA-Anwendungen als auch auf dem Tabellenblatt mit Hilfe von =FUNKTIONSNAME() genutzt werden. Sie stehen innerhalb der jeweiligen Excel-Datei in der Kategorie Benutzerdefiniert zur Verfgung.
Eigene ExcelFunktionen
149
Im folgenden Beispiel wird die Funktion MaxWert() aufgerufen. Sie berechnet das Maximum der beiden bergebenen Parameter und gibt es an die aufrufende Stelle zurck.
Sub Funktionen() Dim a As Integer, b As Integer, c As Integer a = 12 b = 17 c = MaxWert(a, b) MsgBox c End Sub Function MaxWert(x As Integer, y As Integer) As Integer If x > y Then MaxWert = x Else MaxWert = y End If End Function
Das Ergebnis:
Abbildung 5.9
Zur Erluterung:
Ergebnisrckgabe
Die Funktion MaxWert() wird aufgerufen, dabei werden zwei Zahlenwerte an die Funktion bergeben. Innerhalb der Funktion wird mit Hilfe einer Verzweigung das Maximum dieser beiden Zahlen ermittelt und als Rckgabewert der Funktion gespeichert. Die Funktion endet, und der Programmablauf kehrt zu der Zeile mit dem Aufruf zurck. Dort wird der ermittelte Wert ber die Zuweisung der Variablen c bergeben. Diese Variable wird anschlieend ausgegeben.
Hufiger Fehler
Htte die Anweisung nur MaxWert(a, b) gelautet, so htten alle diese Schritte stattgefunden, auer der bergabe an c. Der Funktionsaufruf
150
5.3
wre in diesem Fall vergeblich gewesen ein hufiger Fehler bei Programmiereinsteigern. Die Funktion MaxWert() kann innerhalb dieser Arbeitsmappe auch im Tabellenblatt benutzt werden. Geben Sie z. B. in einer Zelle ein: =MaxWert(A1;B1), dann erscheint das erwartete Ergebnis. bung 5 D
Schreiben Sie eine Prozedur, in der Sie zwei Double-Variablen beliebige Werte zuweisen. Anschlieend soll eine Funktion aufgerufen werden, der genau zwei Variablen bergeben werden knnen. Innerhalb der Funktion wird der Mittelwert der beiden Zahlen berechnet und als Ergebnis zurckgegeben. Die Ausgabe soll in der aufrufenden Prozedur erfolgen.
Es folgt ein weiteres Beispiel zur Arbeit mit Funktionen, Parametern und Rckgabewerten. Gleichzeitig wird die Rangfolge der Operatoren, siehe Abschnitt 3.3.5, noch einmal verdeutlicht. In der nachfolgenden Funktion Monatsende() wird der letzte Tag des Monats eines bestimmten Jahres berechnet. Dabei ergibt sich bekanntlich je nach Monat der Wert 30 oder 31. Fr den Monat Februar ergibt sich in Schaltjahren der Wert 29, ansonsten der Wert 28. Zunchst eine Testprozedur, mit der die Funktion Monatsende() aufgerufen wird:
Sub MonatsendeTesten() ThisWorkbook.Worksheets("Tabelle2").Activate Range("D3").Value = _ Monatsende(Range("D1").Value, Range("D2").Value) End Sub
Schaltjahr
Zur Erluterung:
Die Funktion Monatsende() wird mit zwei Parametern aufgerufen. In dieser Testprozedur sind die zwei Werte aus einem Tabellenblatt die fr Jahr und Monat.
151
Zur Erluterung:
Die beiden Werte fr Jahr und Monat werden beim Aufruf der Funktion an die Parameter J und M bergeben. Falls es sich um den Monat Februar handelt, dann wird mit Hilfe des Operators Mod untersucht, ob das Jahr ein Schaltjahr ist, also ob sich die Jahreszahl:
Mod
durch 4, aber nicht durch 100 ohne Rest teilen lsst oder durch 400 ohne Rest teilen lsst
In dem Ausdruck J Mod 4 = 0 And J Mod 100 <> 0 Or J Mod 400 = 0 gilt folgende Rangfolge der Operatoren, beginnend mit der hchsten Prioritt:
Arithmetischer Operator Mod Vergleichsoperatoren = bzw. <> Logischer Operator And Logischer Operator Or
5.3.4
Optionale Parameter
Normalerweise mssen Zahl und Reihenfolge der Parameter in Aufruf und Deklaration einer Prozedur (oder Funktion) bereinstimmen. Sie knnen allerdings auch optionale Parameter verwenden. Diese mssen beim Aufruf nicht angegeben werden.
Optional
Die Parameter werden in der Parameterliste durch das Schlsselwort Optional gekennzeichnet, mssen immer am Ende der Parameterliste stehen und knnen mit einem Wert initialisiert werden. Im folgenden Beispiel wird die Funktion Addiere() insgesamt dreimal aufgerufen, einmal mit zwei Parametern, einmal mit drei Parametern
152
5.3
und einmal mit vier Parametern. Sie berechnet jeweils die Summe der bergebenen Parameter und liefert diese zurck.
Sub OptionaleParameter() Dim a As Double, b As Double, c As Double, d As Double a = 4 b = 7.5 c = 10.5 d = 9 MsgBox Addiere(a, b, c, d) MsgBox Addiere(a, b, c) MsgBox Addiere(a, b) ' MsgBox Addiere(a) End Sub Function Addiere(x As Double, y As Double, _ Optional z As Double = 0, Optional q _ As Double = 0) As Double Addiere = x + y + z + q End Function
153
Zur Erluterung:
Initialisierung
Die Funktion Addiere() erwartet insgesamt vier Parameter vom Datentyp Double. Die beiden letzten Parameter sind optional. Man kann optionale Parameter mit einem Standardwert initialisieren. Werden die beiden letzten Parameter bei einem Aufruf der Funktion nicht angegeben, so haben sie den Standardwert 0. Da innerhalb der Funktion eine Addition der vier Parameter stattfindet, ist dies der geeignete Wert; das Ergebnis der Funktion wird nicht verflscht. Bei Prozeduren oder Funktionen mit optionalen Parametern, die andere Aufgaben zu erfllen haben, knnen andere Werte zur Initialisierung sinnvoll sein. In der Prozedur OptionaleParameter() wird die Funktion Addiere() mit vier, drei oder zwei Parametern aufgerufen. In allen Fllen fhrt dies erfolgreich zur Addition und Ausgabe der Werte. Ein Aufruf mit nur einem Parameter htte zu einer Fehlermeldung gefhrt, da der Parameter y nicht optional ist.
5.3.5
Parameter benennen
Benannte Parameter
Im Zusammenhang mit optionalen Parametern sollte man sich auch mit den benannten Parametern befassen. Die bergabe von Werten kann bei vielen Objekt-Methoden auf drei Arten erfolgen:
man bergibt alle Parameter in der richtigen Reihenfolge man bergibt nur die ersten Parameter, in der richtigen Reihenfolge man bergibt nur die gewnschten Parameter, mit Benennung des jeweiligen Parameters, in beliebiger Reihenfolge
In diesem Abschnitt wird gezeigt, wie man eigene Prozeduren schreibt, die ber benannte Parameter aufgerufen werden knnen.
154
5.3
Vorteile
der Parameter kann eindeutig angesprochen werden, nicht alle Parameter, die mglich sind, mssen genannt werden und das Programm wird lesbarer.
Im folgenden Beispiel wird die Prozedur Adresse() insgesamt fnfmal aufgerufen, mit unterschiedlichen Parametern. Abhngig von den gelieferten Parametern setzt sie einen Text zusammen und gibt diesen Text aus.
Sub BenannteParameter() Adresse "Maier", Ort:="Hamburg" Adresse "Maier", Ort:="Hamburg", PLZ:="80445" Adresse "Maier", Vorname:="Ernst", Ort:="Hamburg", _ PLZ:="80445" Adresse "Maier", PLZ:="80445", Vorname:="Ernst" Adresse "Maier" End Sub Sub Adresse(Name As String, Optional Vorname As String, _ Optional PLZ As String, Optional Ort As String) Dim Ausgabe As String If Vorname <> "" Then Ausgabe = Name & ", " & Vorname Else Ausgabe = Name End If If PLZ <> "" Then If Ort <> "" Then Ausgabe = Ausgabe & vbCrLf & PLZ & " " & Ort Else Ausgabe = Ausgabe & vbCrLf & PLZ End If Else If Ort <> "" Then Ausgabe = Ausgabe & vbCrLf & Ort End If End If MsgBox Ausgabe End Sub
155
Zur Erluterung:
Die Prozedur Addiere() erwartet insgesamt vier Parameter vom Datentyp String. Die drei letzten Parameter sind optional, nur der erste Parameter muss angegeben werden. Die restlichen Parameter knnen mit Hilfe ihres Namens in beliebiger Reihenfolge angegeben werden.
5.3.6
ParamArray
Mit Hilfe des Schlsselwortes ParamArray knnen Sie eine Prozedur (oder Funktion) formulieren, an die beliebig viele Parameter bergeben werden knnen. ParamArray vertrgt sich nicht mit Optional, Sie mssen sich also fr eine der beiden Lsungen entscheiden. Im folgenden Beispiel wird die Funktion Mittelwert() insgesamt dreimal aufgerufen, einmal ohne Parameter, einmal mit zwei Parametern und einmal mit vier Parametern. Sie berechnet jeweils den Mittelwert der bergebenen Parameter und liefert diesen zurck.
Sub BeliebigVieleParameter() Dim a As Double, b As Double, c As Double, d As Double a = 4 b = 7.5 c = 10.5 d = 9 MsgBox Mittelwert() MsgBox Mittelwert(a, b) MsgBox Mittelwert(a, b, c, d) End Sub Function Mittelwert(ParamArray x() As Variant) As Double Dim i As Integer
156
5.3
Dim Summe As Double Dim Anzahl As Double For i = 0 To UBound(x) Summe = Summe + x(i) Next Anzahl = UBound(x) + 1 If Anzahl > 0 Then Mittelwert = Summe / Anzahl End Function
Zur Erluterung:
Die Funktion Mittelwert() wird mit unterschiedlichen Anzahlen von Parametern aufgerufen (0, 2 und 4). Zur Aufnahme der Parameter steht das Parameterdatenfeld (ParamArray) x zur Verfgung. Dabei handelt es sich um ein Datenfeld, dessen Gre nicht festgelegt ist. Dieses Datenfeld muss vom Datentyp Variant sein. Innerhalb der Funktion werden die Parameter mit Hilfe einer Schleife summiert. Die Obergrenze fr die Schleife (also der hchste Wert fr den Index) wird ber die Funktion UBound() ermittelt. Es muss zunchst festgestellt werden, wie viele Elemente das Parameterdatenfeld hat. Der Mittelwert einer Reihe von Zahlen ist bekanntlich die Summe der Zahlen geteilt durch ihre Anzahl. Wird die Funktion ohne Parameter aufgerufen, so ergibt UBound() den Wert 1. Es wrde dann eine Division durch 0 durchgefhrt. Dies gilt es zu vermeiden. Konnte innerhalb einer Funktion kein Wert fr die Funktion ermittelt werden, so gilt wie bei Variablen auch hier der Startwert 0. Im Sinne eines sauberen Programmierstils sollten Sie dies ebenfalls vermeiden. Eine Funktion sollte whrend ihres Verlaufs immer explizit einen Wert erhalten.
Variable Anzahl
Datentyp Variant
UBound()
157
Hinweis
LBound()
Es gibt auch die Funktion LBound(), mit der Sie die Untergrenze, also den niedrigsten Wert, fr den Index eines Feldes ermitteln knnen. Die Funktionen UBound() und LBound() sind in der Lage, diese Indizes fr alle Dimensionen eines ein- oder mehrdimensionalen Datenfelds zu ermitteln. Sie haben einen optionalen zweiten Parameter, die Nummer der Dimension (1, 2, 3 ...). Falls er nicht angegeben wird, dann wird die Grenze fr die erste Dimension ermittelt, wie in der oben angegebenen Funktion Mittelwert().
5.3.7
Flexible bergabe
Datenfelder knnen auch an Prozeduren (oder Funktionen) in der Parameterliste bergeben werden. Dabei muss weder Anzahl noch Gre der Dimensionen angegeben werden. Dadurch ist die Prozedur (oder Funktion) flexibler und kann unterschiedliche Felder verarbeiten. Das folgende Beispiel veranschaulicht eine solche bergabe:
Sub DatenfeldUebergeben() Dim x(1 To 5, 1 To 3) As Integer DatenfeldFuellen x() DatenfeldAusgeben x() End Sub Sub DatenfeldFuellen(z() As Integer) Dim i As Integer, k As Integer For i = LBound(z, 1) To UBound(z, 1) For k = LBound(z, 2) To UBound(z, 2) z(i, k) = i * k Next k Next i End Sub Sub DatenfeldAusgeben(z() As Integer) Dim i As Integer, k As Integer ThisWorkbook.Worksheets("Tabelle3").Activate For i = LBound(z, 1) To UBound(z, 1) For k = LBound(z, 2) To UBound(z, 2) Cells(i, k).Value = z(i, k) Next k Next i End Sub
158
Benutzerdefinierter Datentyp
5.4
Zur Erluterung:
In der Prozedur DatenfeldUebergeben() wird ein Feld mit 5 mal 3 Elementen deklariert. Das leere Feld wird an die Prozedur DatenfeldFuellen() bergeben. In dieser Prozedur wird es mit Werten gefllt. Da die bergabe per Referenz erfolgt, bleiben die Werte erhalten. Das gefllte Feld wird an die Prozedur DatenfeldAusgeben() bergeben. In dieser Prozedur werden die Werte in einem Tabellenblatt ausgegeben. In beiden Prozeduren werden mit den Funktionen LBound() und UBound() jeweils die Unter- und Obergrenzen der beiden Dimensionen ermittelt. Dadurch ist gewhrleistet, dass alle Feldelemente erreicht werden knnen.
LBound(), UBound() bergabe per Referenz
5.4
Benutzerdefinierter Datentyp
Logisch zusammenhngende Daten Komponenten
Ein benutzerdefinierter Datentyp dient zur Verbindung von zusammengehrigen Daten unterschiedlichen Datentyps. Der Entwickler verdeutlicht damit den logischen Zusammenhang zwischen bestimmten Daten. Die einzelnen Komponenten des neuen Datentyps knnen Datenfelder sein. Ebenso knnen Sie Datenfelder des neuen Datentyps bilden. Einzelne Variablen (und auch Datenfelder) des neuen Datentyps knnen an Prozeduren oder Funktionen bergeben werden. Ein Beispiel:
Option Explicit Type Person Name As String PNummer As Integer Telefon() As String Telefax(1 To 2) As String
159
Gehalt As Single End Type Sub Benutzerdefiniert() ' Einzelne Variable und Datenfeld deklarieren Dim S As Person Dim T(1 To 5) As Person ' Werte an Variable zuweisen S.Name = "Maier" S.PNummer = 17 S.Telefax(1) = "0965-347767" S.Telefax(2) = "0975-227134" S.Gehalt = 2652.5 ' Komponente Telefon dimensionieren ReDim S.Telefon(1 To 3) S.Telefon(1) = "0965-347766" S.Telefon(2) = "0189-938439" S.Telefon(3) = "0975-227133" ' Variable an Datenfeld-Element bergeben T(5) = S ' Datenfeld-Element ausgeben ' MsgBox T(5) MsgBox T(5).Name & " " & _ T(5).Telefon(3) & " " & T(5).Telefax(2) ' Variable an Prozedur bergeben BDTypAusgabe T(5) ' Ausgabe ohne Zuweisung und Dimensionierung ' MsgBox T(1).Name ' MsgBox T(1).Telefon(1) End Sub Sub BDTypAusgabe(X As Person) MsgBox X.Name & " " & X.Telefon(3) & " " & X.Telefax(2) End Sub
Zur Erluterung:
Type ... End Type
Benutzerdefinierte Datentypen werden zwischen Type und End Type definiert. Dies kann nur auf Modulebene durchgefhrt werden, nicht innerhalb von Prozeduren oder Funktionen.
160
Benutzerdefinierter Datentyp
5.4
eine Zeichenkette eine ganze Zahl ein Datenfeld variabler Gre mit Zeichenketten ein Datenfeld fester Gre mit zwei Zeichenketten und eine Zahl mit Nachkommastellen
Editor-Hilfe
Innerhalb der Prozedur Benutzerdefiniert() werden eine einzelne Variable und ein Datenfeld des neuen Datentyps definiert. Dabei bietet der Editor bereits Untersttzung: Nach der Eingabe des As erscheint der Name des neuen Datentyps schon in der Liste der mglichen Typen. Den Komponenten der einzelnen Variablen werden Werte zugewiesen. Nach Eingabe des Punkts hinter dem Variablennamen erscheint eine Liste der Komponenten als Hilfestellung. Die Komponente Telefon ist ein Datenfeld variabler Gre. Diesem Datenfeld muss eine Gre gegeben werden, bevor den Elementen dieses Datenfelds Werte zugewiesen werden knnen. Eine Variable eines benutzerdefinierten Datentyps kann einer anderen Variablen (oder dem Element eines Datenfelds) des gleichen Datentyps zugewiesen werden. Dabei werden automatisch alle Werte der einzelnen Komponenten zugewiesen. Falls es sich bei einer Komponente um ein Datenfeld variabler Gre handelt, so wird dieses unmittelbar entsprechend dimensioniert.
Vollstndige Zuweisung
Eine Variable eines benutzerdefinierten Datentyps kann nicht als Ganzes ausgegeben werden. Stattdessen mssen die gewnschten Komponenten bzw. deren Elemente explizit angegeben werden. Eine Variable eines benutzerdefinierten Datentyps kann an eine Prozedur (oder Funktion) bergeben werden. In der Parameterliste dieser Prozedur muss eine Variable des entsprechenden Datentyps deklariert werden. Falls eine Komponente ausgegeben wird, der noch kein Wert zugewiesen wurde, dann hat sie den Wert 0 oder "" (leere Zeichenkette). Falls es sich bei der Komponente um ein Datenfeld variabler Gre handelt, so muss es zunchst dimensioniert werden, ansonsten tritt ein Fehler auf.
Einzeln ausgeben
Vollstndig bergeben
Komponente dimensionieren
161
Hinweis
Public, Private
Ein benutzerdefinierter Datentyp hat ohne weitere Angaben einen projektweiten Gltigkeitsbereich (Public Type ...). Er ist also nicht nur in dem Modul bekannt, in dem er definiert wurde. Sie knnen die Gltigkeit durch die Angabe von Private Type ... einschrnken, so dass der Datentyp nur innerhalb des Moduls bekannt ist, in dem er definiert wurde.
5.5
Besser wartbar
Modular programmieren
Prozeduren und Funktionen bieten die Mglichkeit zur modularen Programmierung. Programme werden in kleinere Bestandteile zerlegt, die bersichtlicher sind und einfacher gewartet werden knnen. Hufig vorkommende Ablufe mssen nur einmal programmiert werden und knnen dann beliebig oft ausgefhrt werden. Im vorherigen Abschnitt wurden bereits Prozeduren und Funktionen aufgerufen, die sich im gleichen Modul befinden. Wie sieht es aus, wenn sich die Prozeduren oder Funktionen in anderen Modulen, in Klassenmodulen oder in anderen Dateien befinden? In den folgenden Beispielen werden aufgerufen:
eine Prozedur, die als Parameter zwei ganze Zahlen erwartet, die Summe berechnet und ausgibt sowie eine Funktion, die ebenfalls als Parameter zwei ganze Zahlen erwartet, die Summe berechnet und an die aufrufende Stelle zurckliefert.
5.5.1
Gleiche Datei
Zunchst ein Beispiel fr Prozeduren und Funktionen in der gleichen Datei. Der Code im Code-Modul Modul1:
Sub ModularGleicheDatei() ' Anderes Modul Summe1 3, 5 MsgBox "Summe2: " & Summe2(3, 5) ' Klassenmodul Tabelle1.Summe3 3, 5 MsgBox "Summe4: " & Tabelle1.Summe4(3, 5) End Sub
162
Modular programmieren
5.5
Sub Summe1(a As Integer, b As Integer) MsgBox "Summe1: " & (a + b) End Sub Function Summe2(a As Integer, b As Integer) As Integer Summe2 = a + b End Function
Zur Erluterung:
Prozeduren und Funktionen in Code-Modulen sind vom Typ Public, falls sie nicht explizit mit Private Sub bzw. Private Function definiert werden. Daher knnen die Prozedur Summe1() und die Funktion Summe2() aus Modul2 direkt aufgerufen werden. Prozeduren und Funktionen in Klassenmodulen sind vom Typ Private. Daher knnen die Prozedur Summe3() und die Funktion Summe4() aus dem Klassenmodul zu Objekt Tabelle1 nur aufgerufen werden, wenn man sie inklusive des Namens des Klassenmoduls aufruft, also: <Klassenmodulname>.<Prozedurname>
Public
Private
5.5.2
Es folgt ein Beispiel fr Prozeduren und Funktionen in einer anderen Datei. Diese muss in Excel geffnet sein, damit der Code genutzt werden kann. Zunchst der Code im Code-Modul Modul1 in dieser Datei:
Sub ModularAndereDatei() Workbooks.Open ThisWorkbook.Path & "\Mappe5Mod.xlsm" ' Aufruf in and. Datei, mit Modulangabe und Parametern Application.Run "Mappe5Mod.xlsm!Modul1.Summe5", 3, 5 MsgBox "Summe6: " & Application.Run _ ("Mappe5Mod.xlsm!Modul1.Summe6", 3, 5) Application.Run "Mappe5Mod.xlsm!Tabelle1.Summe7", 3, 5 MsgBox "Summe8: " & Application.Run _ ("Mappe5Mod.xlsm!Tabelle1.Summe8", 3, 5) End Sub
163
Es folgt der Code im Code-Modul Modul1 der anderen Datei Mappe5Mod. xlsm:
Sub Summe5(a As Integer, b As Integer) MsgBox "Summe5: " & (a + b) End Sub Function Summe6(a As Integer, b As Integer) As Integer Summe6 = a + b End Function
Zuletzt der Code im Klassenmodul zum Objekt Tabelle1 der anderen Datei Mappe5Mod.xlsm:
Sub Summe7(a As Integer, b As Integer) MsgBox "Summe7: " & (a + b) End Sub Function Summe8(a As Integer, b As Integer) As Integer Summe8 = a + b End Function
Zur Erluterung:
Datei geffnet
Prozeduren und Funktionen in Code-Modulen anderer Dateien knnen nur aufgerufen werden, wenn die betreffende Datei in Excel geffnet ist. Daher wird sie zunchst geffnet. Sollte sie bereits geffnet sein, so ist dies kein Problem, falls nicht zwischenzeitlich der Code der anderen Datei gendert wurde. Im vorliegenden Beispiel wird angenommen, dass die Datei im gleichen Verzeichnis liegt. Daher wird das Verzeichnis dieser Datei ermittelt und zum Vervollstndigen des Namens der anderen Datei genutzt. Die Methode Run() des Application-Objekts wird bentigt, um Prozeduren und Funktionen in anderen Dateien aufzurufen. Als ersten Parameter bekommt sie eine Zeichenkette, darin enthalten sind nacheinander:
Application.Run()
der Name der Datei ein Ausrufezeichen der Name des Moduls ein Punkt der Name der Prozedur bzw. Funktion
Anschlieend folgen die weiteren Parameter. Der Aufruf einer Prozedur sieht also wie folgt aus:
164
5.6
Von einer Funktion im Klassenmodul einer anderen Datei, wie der Funktion Summe8(), kann nichts zurckgeliefert werden.
Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in den Prozeduren und Funktionen und in der Erluterung wie folgt lauten: Mappe5Mod. xls.
5.6
Falls Sie Prozeduren und Funktionen in einer anderen Arbeitsmappe einsetzen mchten, haben Sie mehrere Mglichkeiten:
in ein Modul der gewnschten Arbeitsmappe; dann steht er Ihnen innerhalb dieser Arbeitsmappe zur Verfgung; in die persnliche Makroarbeitsmappe; dann steht er Ihnen jederzeit zur Verfgung.
Datei personal.xlsb Export, Import
Sie exportieren ein ganzes Modul. Anschlieend importieren Sie es in eine andere Arbeitsmappe oder in die persnliche Makroarbeitsmappe. Dieser Vorgang wird nachfolgend erlutert.
5.6.1
Sie whlen im Projekt-Explorer das gewnschte Modul aus, egal ob Code-Modul oder UserForm-Modul (siehe Abschnitt 10.2, Eigene Dialogfelder und Anwendungen). Anschlieend whlen Sie im Men Datei den Menpunkt Datei exportieren. Es erscheint das Dialogfeld Datei exportieren. Sie erreichen das Dialogfeld auch ber das Kontextmen: rechte Maustaste im Projekt-Explorer auf dem zu exportierenden Modul. Whlen Sie den Speicherort aus; als Dateiendung steht fr Code-Module .bas und fr UserForm-Module .frm zur Verfgung. Bei UserFormModulen wird automatisch im gleichen Verzeichnis noch eine Datei mit der Dateiendung .frx gespeichert.
165
Falls Sie ein Modul lschen wollen, finden Sie im gleichen Men den Menpunkt Entfernen von. Zum Schutz vor einem unbeabsichtigten Lschen werden Sie gefragt, ob Sie das Modul vorher exportieren wollen. Falls Sie zustimmen, landen Sie ebenso in dem Dialogfeld Datei exportieren.
5.6.2
Datei importieren
Sie whlen im Projekt-Explorer die gewnschte Arbeitsmappe aus. Anschlieend whlen Sie im Men Datei den Menpunkt Datei importieren. Es erscheint das Dialogfeld Datei importieren. Sie erreichen das Dialogfeld auch ber das Kontextmen: rechte Maustaste im ProjektExplorer auf der Arbeitsmappe, in die importiert werden soll.
Whlen Sie das Verzeichnis und das zu importierende Modul aus. CodeModule erkennen Sie an der Dateiendung .bas, UserForm-Module an der Dateiendung .frm.
166
In diesem Kapitel erfahren Sie mehr ber den Umgang mit Objekten. Das Verstndnis von Objekten hilft Ihnen beim Erstellen effektiverer Programme.
Die Grundlagen von Objekten haben Sie bereits in Kapitel 2 kennengelernt. Im Folgenden erhalten Sie weiterfhrende Informationen zu diesem Thema.
6.1
Objektkatalog
Taste F2
Im VBE knnen Sie mit der Taste (F2) den Objektkatalog einblenden. Dort sind alle Klassen, deren Eigenschaften und Methoden zu finden. Whlen Sie eine der Klassen durch Doppelklick aus (hier am Beispiel Worksheets), dann erscheint rechts eine Liste der Eigenschaften, Methoden und Ereignisse dieser Klasse.
167
6
Objektmodellreferenz
Eine weitere Hilfestellung wird ber das Men ? im VBE, Menpunkt Microsoft Visual Basic for Applications-Hilfe angeboten. Im anschlieend erscheinenden Inhaltsverzeichnis steht als erster Punkt Excel 2010-Entwicklerreferenz, darin der Punkt Excel-Objektmodellreferenz.
6.2
Der Zugriff auf einzelne Objekte sollte mglichst direkt, ohne viele Zwischenschritte erfolgen. In vielen VBA-Anwendungen wird jedoch leider wie folgt auf Objekte zugegriffen:
Eine Arbeitsmappe wird aktiviert. Ein Tabellenblatt wird aktiviert. Ein Bereich wird selektiert. Eigenschaften des selektierten Bereichs werden verndert bzw. es werden Methoden auf den selektierten Bereich angewandt.
Nicht zu empfehlen
Diese Vorgehensweise des Aktivierens und Selektierens ist zwar einfach zu verstehen, aber langsamer und fehlertrchtiger. Nachfolgend ein Beispiel:
Sub AktivierenUndSelektieren() ThisWorkbook.Activate Worksheets("Tabelle1").Activate Range("A7:A9").Select Selection.Interior.Color = vbYellow End Sub
168
6.2
Referenzierung
Durch die Referenzierung erstellen Sie Anwendungen, die schneller ablaufen und besser zu warten sind:
Sub Referenzieren() ThisWorkbook.Worksheets("Tabelle1"). _ Range("A10:A12").Interior.Color = vbYellow End Sub
Der VBA-Code wirkt zunchst etwas unbersichtlicher. Man geht aber einfach nach der Objekthierarchie vor: Arbeitsmappe, Tabellenblatt, Zellbereich, Eigenschaft. Es ergeben sich meist lngere Anweisungen, diese knnen aber auf mehrere Zeilen verteilt werden, wie im obigen Beispiel geschehen.
Schneller, direkter
6.2.1
Im allerersten Makro dieses Buchs wurde mit einem aufgezeichneten Makro der Inhalt einer Zelle in eine andere Zelle verschoben:
Sub Makro1() Range("A1").Select Selection.Cut Range("C1").Select ActiveSheet.Paste End Sub
Es sind mehrere Schritte erforderlich, bei denen sich Fehler einschleichen knnen. Es ist nicht klar, in welcher Arbeitsmappe und auf welchem Tabellenblatt die Verschiebung stattfindet. Die Anwendung ist langsamer.
Eindeutige Lsung
Mit Referenzierung lsen Sie ein solches Problem eindeutig und schneller:
Sub Verschieben() ThisWorkbook.Worksheets("Tabelle1"). _ Range("A7:A9").Cut Destination:=ThisWorkbook. _ Worksheets("Tabelle1").Range("B7") End Sub
169
6.3
With ... End With
Mit Hilfe von With fhren Sie eine Reihe von Anweisungen fr ein einzelnes Objekt durch. Dabei wird der einmal erstellte Bezug zum Objekt mehrfach verwendet. Bei einem lngeren Objektnamen ist dies bersichtlicher. Der Aufbau sieht wie folgt aus:
With Objekt [ Anweisungen ] End With
Das Ergebnis:
Zur Erluterung:
Die Eigenschaften der Zelle A1 werden mit Hilfe von With gendert. Inhalt, Zahlenformat, Schriftgre und Rahmendicke werden gesetzt. Dabei muss zu Beginn der Anweisung jeweils nur ein Punkt angegeben werden. Da der Programmablauf sich innerhalb des With-Blocks befindet, ist auch mit dieser Kurzschreibweise klar, auf welches Objekt sich die nderungen beziehen.
Im With-Block: Punkt
170
6.4
Geschachteltes With Mit With knnen auch geschachtelte Strukturen erzeugt werden. Zur Verdeutlichung wurde das Beispiel mit den fnf Sortierschlsseln (erst ab Excel 2007) aus Abschnitt 2.4.19 umgeschrieben.
Sub WithGeschachtelt() ThisWorkbook.Worksheets("Tabelle4").Activate With ActiveSheet.Sort With .SortFields .Clear .Add Range("A1:A5") .Add Range("B1:B5") .Add Range("C1:C5") .Add Range("D1:D5") .Add Range("E1:E5") End With .SetRange Range("A1:E6") .Apply End With End Sub
Schachteln
Zur Erluterung:
Innerhalb des ueren With wird mit dem Objekt Sort des aktiven Tabellenblatts gearbeitet. Dies betrifft die Auflistung SortFields und die Methoden SetRange() und Apply(). Innerhalb des inneren With wird mit der Auflistung SortFields des Objekts Sort des aktiven Tabellenblatts gearbeitet. Dies betrifft die Methoden Clear() und Add().
SortFields
6.4
Sie haben bereits Variablen der verschiedenen elementaren Datentypen, wie Integer, Double usw., kennengelernt. Die sogenannten Objektvariablen speichern keine Zahlen oder Texte, sondern Verweise auf Objekte. Bei einem lngeren Objektnamen ist diese Vorgehensweise ntzlich. Nachfolgend ein Beispiel:
Sub ObjektVariable() Dim Rg As Range
171
Set Rg = ThisWorkbook.Worksheets("Tabelle1"). _ Range("B1:B3") Rg.Value = 18.2 Rg.NumberFormatLocal = "0,000" Rg.Font.Size = 24 Einrahmen Rg End Sub Sub Einrahmen(x As Range) x.Borders.Weight = xlThick End Sub
Das Ergebnis:
Zur Erluterung:
Dim ... As Objekttyp
Die Variable rg wird mit Hilfe von As als Verweis auf ein Objekt des Typs Range deklariert. Man htte sie auch als Verweis auf ein Objekt des allgemeinen Typs Object deklarieren knnen (Dim rg As Object). Der Verweis auf ein Objekt des passenden Typs ist allerdings eindeutiger und schneller. Eine Objektvariable bekommt ihren Wert mit Hilfe von Set. In diesem Falle wird der Variablen rg ein Zellbereich zugewiesen. Damit ist es mglich, mit rg auf diesen Zellbereich zuzugreifen. Inhalt, Zahlenformat und Schriftgre werden gesetzt. Eine Objektvariable kann auch als Parameter an eine Prozedur (oder Funktion) bergeben werden. In diesem Falle wird in der aufgerufenen Prozedur noch die Rahmendicke gesetzt. Der Parameter x ist wiederum vom Typ Range.
bergabe
172
6.4
Sie knnen die Verbindung zwischen einem Objekt und einer Objektvariablen wie folgt wieder aufheben: Set <Objektvariable> = Nothing Nach erfolgter Zuweisung fr rg erleichtert die Entwicklungsumgebung dem Entwickler die Arbeit: Sobald er den Punkt hinter rg eingibt, erscheint eine Liste der Eigenschaften und Methoden des betreffenden Objekts. Dies ist nach der Eingabe des Punkts hinter Range("B1:B3") nicht der Fall. Mit der Taste (F1) wird automatisch die Hilfe fr die Eigenschaft oder Methode des passenden Objekttyps aufgerufen.
Taste F1
6.4.1
Sie knnen Objektvariablen auch stufenweise (ber die Objekthierarchie) ihren Wert zuweisen. Dies macht den Code bersichtlicher, falls auf mehrere Objekte in unterschiedlichen Ebenen der Hierarchie zugegriffen wird. Ein Beispiel:
Sub ObjektVariableHierarchisch() Dim WS As Worksheet Dim Rg1 As Range, Rg2 As Range Set WS = ThisWorkbook.Worksheets("Tabelle1") Set Rg1 = WS.Range("C1:C2") Set Rg2 = WS.Range("D1:D2") Rg1.Value = 1.7 Rg2.Value = 3.4 End Sub
Das Ergebnis:
173
Zur Erluterung:
Stufe 1 Stufe 2
Zunchst wird WS als Verweis auf das Tabellenblatt Tabelle1 genutzt. Anschlieend werden Rg1 und Rg2 als Verweise auf verschiedene Bereiche dieses Tabellenblatts eingesetzt.
6.4.2
Dim ... As New ...
Viele Objekte in VBA-Anwendungen sind Objekte, die man sehen kann (Range, Worksheet usw.). Es gibt aber auch unsichtbare Hilfsobjekte. Dies kann z. B. eine Verbindung zu einer Datenbank (siehe Abschnitt 9.5.2, Beispiel-Datenbank: Verbindung herstellen) oder eine Auflistung (Collection, siehe Abschnitt 6.6, Collections) sein. Solche Objekte werden mit Hilfe des Schlsselworts New neu erzeugt. Gleichzeitig oder anschlieend wird ein Verweis auf das Objekt eingerichtet. Ein Beispiel mit beiden Varianten:
Sub NeuesObjekt() Dim C1 As New Collection Dim C2 As Collection Set C2 = New Collection End Sub
Zur Erluterung:
Mit Dim C1 As New Collection wird eine neue, leere Auflistung erstellt. C1 wird gleichzeitig als Verweis auf diese Auflistung eingerichtet. Im Gegensatz dazu wird C2 durch Dim C2 As Collection als Verweis auf eine noch nicht existierende Auflistung erzeugt. Erst anschlieend wird mit Set C2 = New Collection eine neue, leere Auflistung erzeugt und C2 als Verweis auf diese neue Auflistung eingerichtet.
6.4.3
TypeName()
Objekttyp ermitteln
Es ist von Vorteil, eine Objektvariable mit dem passenden Typ zu deklarieren. Bei vielen Objekten ist der Typ allerdings nicht offensichtlich erkennbar. Hier erweist sich die Funktion TypeName() als ntzlich. Sie wurde bereits verwendet, um den Datentyp einer Variablen zu bestimmen.
174
6.4
Sie ist aber auch in der Lage, Datenfelder und Objekttypen zu erkennen. Falls der geprfte Begriff den Datentyp Variant hat, wird Empty zurckgeliefert. Nachfolgend ein Beispiel mit einer Reihe von Variablen und Objekten:
Sub ObjektTyp() Dim i As Integer Dim a(1 To 5) As Double Dim b Dim c As Variant Dim Ws1 As Worksheet Set Ws1 = ThisWorkbook.Worksheets("Tabelle1") ThisWorkbook.Worksheets("Tabelle2").Activate Range("A1").Value = TypeName(i) Range("A2").Value = TypeName(a) Range("A3").Value = TypeName(b) Range("A4").Value = TypeName(c) Range("A5").Value = TypeName(ThisWorkbook) Range("A6").Value = TypeName(ThisWorkbook.Name) Range("A7").Value = TypeName(Ws1) Range("A8").Value = TypeName(Ws1.Range("A1:A5")) Range("A9").Value = TypeName(Ws1.Range("A1:A5"). _ Borders) Range("A10").Value = TypeName(Ws1.Range("A1:A5"). _ Font) End Sub
Der Typ der einzelnen Variablen i und des Datenfelds a wird erkannt. Eine Variable, fr die kein Datentyp angegeben wird, hat den Datentyp Variant, so als ob der Datentyp Variant explizit angegeben wird. Die Funktion TypeName() liefert in diesem Falle Empty zurck.
Name ist eine Eigenschaft mit dem Datentyp String, also eine ZeichenVariant: Empty
kette.
Borders und Font sind Unterobjekte des Objekttyps Borders bzw. Font.
175
6.5
Auflistung
For-Each-Schleife
Die Schleife For Each ... In ... Next wird bei Auflistungen oder Datenfeldern eingesetzt. In der Objekthierarchie von Excel gibt es zahlreiche Auflistungen, z. B. Workbooks und Worksheets. Nachfolgend ein Beispiel mit der Auflistung Workbooks, also der Liste aller geffneten ExcelDateien:
Sub ForEachWorkbook() Dim WB As Workbook Dim Ausgabe As String Ausgabe = "Workbooks: " For Each WB In Workbooks Ausgabe = Ausgabe & WB.Name & " " Next WB MsgBox Ausgabe End Sub
Das Ergebnis:
176
For-Each-Schleife
6.5
Zur Erluterung:
Zunchst wird die Variable WB als Verweis auf ein Objekt vom Typ Workbook deklariert. Die Zeile For Each WB In Workbooks leitet die Schleife ein. Jedes Element der Auflistung Workbooks wird nun durchlaufen. Innerhalb der For-Each-Schleife wird das jeweils aktuelle Element automatisch mit WB bezeichnet. Die Elemente mssen nicht einzeln mit Set WB = zugewiesen werden. In diesem Fall wird nur der Name des jeweils aktuellen Elements einer Ausgabeliste hinzugefgt. Nach dem Next wird zur deutlicheren Darstellung WB geschrieben, dies knnte auch weggelassen werden.
Next ...
Ein weiteres Beispiel mit der Auflistung Worksheets, also der Liste aller Tabellenbltter:
Sub ForEachWorksheet() Dim WS As Worksheet Dim Ausgabe As String Ausgabe = "Worksheets: " For Each WS In ThisWorkbook.Worksheets Ausgabe = Ausgabe & WS.Name & " " Next WS MsgBox Ausgabe End Sub
Das Ergebnis:
Zur Erluterung:
Die Variable WS wird als Verweis auf ein Objekt vom Typ Worksheet deklariert.
177
Die Auflistung Worksheets dieser Arbeitsmappe wird durchlaufen. Innerhalb der Schleife wird das jeweils aktuelle Element mit WS bezeichnet.
6.6
Verbund
Collections
Wir haben bereits einige Auflistungen (Worksheets, Workbooks) kennengelernt. Die Elemente dieser Auflistungen waren festgelegt. Es gibt aber auch die Mglichkeit, eigene Auflistungen zu erschaffen. Damit knnen Sie Elemente gleichen Typs oder unterschiedlichen Typs, die eine thematische Verwandtschaft haben, zu einem Verbund zusammenfgen. Dazu wird der Objekttyp Collection verwendet. Collection-Objekte haben folgende Eigenschaften und Methoden:
Add()
Methode Add(): Hinzufgen eines Elements Eigenschaft Count: Anzahl der Elemente Methode Remove(): Lschen eines Elements
For Each
Die Elemente einer Collection knnen mit Hilfe einer For-Each-Schleife oder ber einen Index erreicht werden. Im folgenden Beispiel werden eine Zeichenkette, eine Zahl und ein Range-Objekt zu einer Collection zusammengestellt:
Sub Collections() Dim C As New Collection Dim CItem As Variant Dim Rg As Range ' Elemente hinzufgen C.Add "Peter" C.Add 43 Set Rg = ThisWorkbook.Worksheets("Tabelle3"). _ Range("A1:A2") C.Add Rg ' Anzahl der Elemente MsgBox C.Count ' Alle Elemente durchlaufen For Each CItem In C MsgBox TypeName(CItem) Next CItem
178
Hauptobjekt Application
6.7
' Elemente entfernen C.Remove (2) ' Elemente ber Index erreichen MsgBox C(1) MsgBox C(2).Address End Sub
Zur Erluterung:
Mit Dim C As New Collection wird ein neues Collection-Objekt erzeugt und ein Verweis auf das Objekt eingerichtet. Die einzelnen Elemente einer Collection knnen einen beliebigen Typ haben. Falls Sie die Elemente mit Hilfe einer For-Each-Schleife durchlaufen mchten, wird also eine Variable vom Datentyp Variant bentigt. Mit der Methode Add() werden nacheinander eine Zeichenkette (Element 1), eine Zahl (Element 2) und ein Range-Objekt (Element 3) der Collection hinzugefgt. Die Eigenschaft Count liefert fr die Anzahl der Elemente den Wert 3. Mit Hilfe der For-Each-Schleife und der Funktion TypeName() werden die Typen aller Elemente ausgegeben. Das zweite Element (die Zahl) wird mit der Methode Remove() entfernt. Die beiden verbliebenen Elemente werden ber den Index erreicht. Da es sich bei Element 2 um ein Range-Objekt handelt, knnen Sie z. B. die Adresse ausgeben.
New Collection
Variant
Add()
Count
Remove()
6.7
Hauptobjekt Application
Anwendung Excel
Das Objekt Application ist das Hauptobjekt. Es steht am oberen Ende der Objekthierarchie fr die Anwendung Excel selbst. Einige Eigenschaften und Methoden werden nachfolgend erlutert.
6.7.1
Anwendungspfad ausgeben
Pfad
Mit folgender Prozedur wird der Pfad ausgegeben, in dem Excel installiert ist:
179
Zur Erluterung:
Path
Es wird der Wert der Eigenschaft Path des Application-Objekts ermittelt und ausgegeben. Dabei handelt es sich um das Verzeichnis auf dem PC, in dem die Anwendung Excel installiert wurde. Die Ausgabe bei einer Standardinstallation:
6.7.2
Startzeitverzgert
Mit folgender Prozedur wird der Aufruf einer anderen Prozedur in der Zukunft gestartet:
Sub AufrufInZukunft() Application.OnTime Now + TimeValue("00:00:05"), _ "AnwendungsPfad" End Sub
Zur Erluterung:
OnTime()
Es wird die Methode OnTime() des Application-Objekts aufgerufen. Sie dient dazu, Prozeduren in der Zukunft auszufhren. Sie wird mit einer Zeitangabe und einem Prozedurnamen in Anfhrungsstrichen aufgerufen. Die Zeitangabe kann entweder absolut sein (z. B. Aufruf um 17:35:30 Uhr) oder relativ (z. B. Aufruf in 5 Sekunden, wie oben). Falls die Zeitangabe relativ ist, muss zunchst die aktuelle Uhrzeit ermittelt werden, mit der vorgefertigten Funktion Now(). Zu dieser Uhrzeit wird eine Zeitangabe hinzugerechnet. Diese wird von der vorgefertigten Funktion TimeValue() geliefert.
Now(), TimeValue()
180
Filtern
6.8
6.7.3
Zur Erluterung:
Es wird die Methode Quit() des Objekts Application aufgerufen. Sie schliet Excel einschlielich aller geffneten Arbeitsmappen, den VBE und die Excel-Hilfe. Falls eine Arbeitsmappe gendert wurde, wird der Benutzer gefragt, ob er sie speichern mchte.
Quit()
Sicherheitsrckfrage
6.8
Filtern
AutoFilter()
Grere Datenmengen knnen Sie in Excel mithilfe von Filtern untersuchen. Dabei legen Sie fest, welcher Teil der Daten angezeigt werden soll. Dies lsst sich in VBA mithilfe der Methode AutoFilter() auch automatisieren. Als anschauliche Basis fr den Einsatz von Filtern wird die Tabelle der Artikel aus der Datenbank Nordwind.mdb verwendet. Die Datenbank wird zusammen mit Microsoft Access ausgeliefert, siehe auch Kapitel 11, Beispielprojekt. Die Tabelle umfasst insgesamt 78 Datenstze mit jeweils sechs Spalten. Zur Verdeutlichung eines Datumsfilters wird noch eine siebte Spalte mit Datumsangaben hinzugefgt. Die zuflligen Werte fr diese Spalte werden mit der nachfolgenden Prozedur erzeugt.
Sub SpalteDatum() Dim i As Integer Randomize ThisWorkbook.Worksheets("Tabelle5").Activate
Zustzliche Spalte
181
For i = 2 To 78 Cells(i, 7).Value = Int(Rnd() * 30) + 40200 Next i Range("G2:G78").NumberFormatLocal = "TT.MM.JJJJ" End Sub
Zur Erluterung:
Die Funktion Rnd() liefert bekanntlich quasizufllige Werte zwischen 0 und 1, siehe auch Abschnitt 3.5.2. Die Multiplikation mit 30 ergibt Werte zwischen 0 und 30. Die Addition mit 40200 ergibt Werte zwischen 40200 und 40230. Diese Werte ergeben, passend formatiert, die Datumsangaben vom 22.01.2010 bis zum 20.02.2010.
Zahlenfilter
Es folgen einige kurze Prozeduren, in denen die Methode AutoFilter() angewandt wird. Zunchst ein einfacher Zahlenfilter:
Sub ZahlenfilterGleich() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter 6, "0" End Sub
Der Aufruf der Methode AutoFilter() ohne Parameter lscht den bisher geltenden Filter. Anschlieend werden die Daten vollstndig und ungefiltert dargestellt. Der Aufruf der Methode AutoFilter() mit den Parametern 6 und 0 fhrt dazu, dass die Spalte 6 (Lagerbestand) gefiltert wird. Es werden nur noch die Datenstze angezeigt, deren Wert in dieser Spalte gleich 0 ist. Der erste Parameter entspricht also der Spalte, die gefiltert wird, der zweite Parameter dem Filterkriterium.
Filter mit Vergleich
Nun werden nur noch die Datenstze angezeigt, deren Wert in der Spalte 5 (Einzelpreis) grer als 20 ist. Es gibt die Vergleichsoperatoren <, >, <=, >= und <>. Der Operator = entspricht in seiner Wirkung dem vorherigen Beispiel.
182
Filtern
6.8
Filter verknpft
Es folgt ein Filter mit zwei Bedingungen (bezglich einer Spalte), die miteinander verknpft sind:
Sub ZahlenfilterZwischen() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter 6, ">20", xlAnd, "<40" End Sub
Nun werden nur noch die Datenstze angezeigt, deren Wert in der Spalte 6 (Lagerbestand) grer als 20 und kleiner als 40 ist. Die integrierte Konstante xlAnd stellt die Verknpfung her. Es knnen auch zwei Bedingungen in unterschiedlichen Spalten miteinander verknpft werden:
Sub DoppelFilter() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter 5, ">20" ActiveSheet.UsedRange.AutoFilter 6, ">40" End Sub
Filter ber zwei Spalten
Nun werden nur noch die Datenstze angezeigt, deren Wert in der Spalte 5 (Einzelpreis) grer als 20 ist und deren Wert in der Spalte 6 (Lagerbestand) grer als 40 ist. Beide Filter werden nacheinander angewandt, wodurch sich die Filterung verstrkt. Mithilfe von Textfiltern knnen Spalten mit textlichen Inhalten gefiltert werden. Zunchst ein einfaches Beispiel:
Sub TextfilterGleich() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter 3, "Getrnke" End Sub
Textfilter
Nun werden nur noch die Datenstze aus der Kategorie Getrnke angezeigt. Falls Sie die Artikel mehrerer Kategorien sehen mchten, geht das folgendermaen:
Sub TextfilterMehrereGleich() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter 3, _
Mehrere Kategorien
183
Die integrierte Konstante xlOr sorgt dafr, dass das eine oder das andere Kriterium zutreffen muss.
Mit Platzhalter
Nun werden nur noch die Datenstze angezeigt, deren Wert in Spalte 2 (Artikelname) mit M beginnt. Falls nur ein Teil des Textes bekannt ist, kann der Platzhalter auch doppelt angewandt werden:
Sub TextfilterEnthlt() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter 2, "*ed*" End Sub
Nun werden nur noch die Datenstze angezeigt, deren Wert in Spalte 2 (Artikelname) an irgendeiner Stelle die Zeichenfolge ed enthlt.
Datumsfilter
Als Letztes wird der Datumsfilter gezeigt. Dabei sollte die amerikanische Schreibweise fr Daten verwendet werden (JJJJ/M/T):
Sub Datumsfilter() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter _ 7, ">=2010/1/22", xlAnd, "<=2010/1/28" End Sub
Es werden nur noch die Datenstze angezeigt, deren Wert in der Spalte 7 (letzter Einkauf) zwischen dem 22.01.2010 und dem 28.01.2010 liegt, einschlielich des Anfangs- und Enddatums.
184
Die Automatisierung des Aufbaus von Diagrammen und Shapes hilft Ihnen beim Aufbau professioneller Anwendungen.
In diesem Kapitel lernen Sie diverse Mglichkeiten zur Programmierung verschiedener Arten von Grafiken kennen:
Diagramme Shapes WordArt (seit Excel 2007) bedingte Formatierungen (seit Excel 2007) Sparklines (seit Excel 2010) SmartArt (seit Excel 2007)
Diagramme knnen in Excel per Knopfdruck schnell erzeugt werden. In diesem Kapitel lernen Sie, wie Sie Diagramme per VBA-Programmcode erstellen und verndern. Damit haben Sie die Mglichkeit, zusammen mit Ihren Programmierfhigkeiten, spezielle Diagramme zu erstellen. Dabei kann es sich beispielsweise um ein Diagramm mit besonderer Datenauswahl oder spezieller Diagrammform handeln, das automatisch aus einer Textdatei, abhngig von aktuellen Bedingungen erstellt wird. In Abschnitt 7.5 werden einige Mglichkeiten von Shapes erlutert. Shapes sind Zeichnungsobjekte, z. B. die Autoformen. Sie teilen zahlreiche Eigenschaften mit Diagrammen. Zellen knnen, in Abhngigkeit von Bedingungen, mithilfe von Datenbalken, Farbskalen und Symbolstzen unterschiedlich formatiert werden. Mehr zu diesen bedingten Formatierungen lesen Sie in Abschnitt 7.7. In Excel 2010 wurden die Mglichkeiten der bedingten Formatierungen erweitert. In Abschnitt 7.8 wird die Erzeugung von Sparklines beschrieben. Dies sind kleine Diagramme, die als Zellhintergrund eingebettet werden. Sie
Automatisierung
Zeichnungsobjekte
Bedingte Formatierung
Sparklines
185
sollen kurz und prgnant Zahlenverlufe verdeutlichen. Sparklines wurden mit Excel 2010 eingefhrt.
SmartArts
Mithilfe von SmartArts knnen seit Excel 2007 Beziehungen, Prozessablufe oder Hierarchien schnell und bersichtlich dargestellt werden. SmartArts sind besondere Gruppen von Shapes. Sie knnen mithilfe von VBA allerdings nicht verndert werden. Ihre Eigenschaften knnen nur ausgelesen werden, siehe Abschnitt 7.9.
7.1
Beispieltabelle
Diagramm erstellen
Bekanntlich knnen Diagramme sowohl auf eigenen Blttern in einer Arbeitsmappe als auch eingebettet in einem Tabellenblatt erstellt werden. Beide Methoden werden in diesem Abschnitt vorgestellt. Ausgangspunkt soll in beiden Fllen eine Tabelle mit Temperaturwerten sein:
7.1.1
Hierarchie
Diagrammblatt erstellen
Diagramme auf eigenen Blttern (Diagrammbltter) stehen in der Objekthierarchie auf der gleichen Ebene wie Tabellenbltter. Es gibt verschiedene Auflistungen innerhalb einer Arbeitsmappe:
Sheets
Sheets enthlt alle Tabellenbltter und Diagrammbltter. Worksheets enthlt nur die Tabellenbltter (wie bekannt). Charts enthlt nur die Diagrammbltter.
Charts
Mit der folgenden Prozedur wird ein einfaches Liniendiagramm als Diagrammblatt in der Arbeitsmappe erstellt:
Sub DiagrammNeuesBlattErstellen() ThisWorkbook.Charts.Add After:=Worksheets("Tabelle1") With ActiveChart
186
Diagramm erstellen
7.1
.ChartType = xlLine .SetSourceData Worksheets("Tabelle1").Range("A1:C8") .Name = "Diagramm1" End With End Sub
Zur Erluterung:
Die Methode Add() des Objekts Charts erstellt ein Diagrammblatt und fgt es der Charts-Auflistung der aktiven Arbeitsmappe hinzu. hnlich wie beim Kopieren oder Verschieben von Tabellenblttern knnen Sie mit Hilfe von Before und After den Ort des neuen Blatts festlegen. Ohne Angabe wird das neue Blatt vor dem aktuell aktiven Blatt eingefgt. Das neue Diagrammblatt ist vom Typ Chart. Es wird zum aktiven Diagrammblatt. Daher kann es mit ActiveChart angesprochen werden. Die Eigenschaft ChartType legt den Typ des Diagramms fest, hier xlLine fr ein Liniendiagramm. Einige wichtige Diagrammtypen werden weiter unten aufgelistet. Die Methode SetSourceData() legt die Datenquelle fr das Diagramm fest. In diesem Falle ist das der Bereich A1 bis C8 des Tabellenblatts Tabelle1 (mit den Temperaturdaten). Mit Hilfe der Eigenschaft Name knnen Sie dem Diagramm einen Namen geben.
Add()
ActiveChart
ChartType
SetSourceData()
Eigenschaft Name
187
Hinweis
Die Methode SetSourceData() hat noch einen zweiten, optionalen Parameter. Damit legen Sie fest, ob das Diagramm die Tabelle nach Spalten (xlColumns) oder (xlRows) darstellt. Der erste Wert ist der Standard.
Diagrammtypen
Eigenschaft ChartType
xlColumnClustered xlBarClustered xlLine xlPie
7.1.2
ChartObjects
Eingebettete Diagramme stehen in der Objekthierarchie unterhalb der Tabellenbltter. Die Auflistung Worksheets enthlt die Unterauflistung ChartObjects, also alle Diagrammrahmen des Tabellenblatts. Ein ChartObject ist Element dieser Auflistung ChartObjects, also ein einzelner Diagrammrahmen. Ein einzelnes Diagramm ist ein Objekt vom Typ Chart und stellt den Wert der Eigenschaft Chart eines Diagrammrahmens dar. Bis auf diese Einordnung gleichen sich beide Diagrammformen. Mit der folgenden Prozedur wird ein einfaches Liniendiagramm in das Tabellenblatt Tabelle1 eingebettet:
Sub DiagrammEingebettetErstellen() Dim CO As ChartObject Dim CH As Chart Set CO = ThisWorkbook.Worksheets("Tabelle1"). _ ChartObjects.Add(200, 10, 300, 150) Set CH = CO.Chart CH.ChartType = xlLine CH.SetSourceData Worksheets("Tabelle1"). _ Range("A1:C8") End Sub
188
Diagramm erstellen
7.1
Das Ergebnis:
Zur Erluterung:
Zunchst wird eine Variable vom Typ ChartObject deklariert. Sie verweist spter auf den neu erstellten Diagrammrahmen. Anschlieend wird eine Variable vom Typ Chart deklariert. Sie verweist spter auf das Diagramm des neu erstellten Diagrammrahmens. Die Auflistung ChartObjects enthlt alle Rahmen der eingebetteten Diagramme auf einem Tabellenblatt. Die Methode Add() erstellt einen neuen Diagrammrahmen an einem bestimmten Ort in einer bestimmten Gre. Sie liefert einen Verweis auf das neu erstellte Objekt zurck. Die vier Parameter von Add() stehen fr:
ChartObject
Chart-Variable
Add()
Abstand des Rahmens zum linken Rand des Tabellenblatts Abstand des Rahmens zum oberen Rand des Tabellenblatts Breite des Rahmens Hhe des Rahmens
Eigenschaft Chart ChartType
Die Eigenschaft Chart des ChartObjects stellt das eigentliche Diagramm innerhalb des Rahmens dar. Die Eigenschaft ChartType ist bereits bekannt; sie legt den Typ des Diagramms fest. Die Methode SetSourceData() ist ebenfalls bereits bekannt. Sie legt die Datenquelle fr das Diagramm fest. In diesem Falle ist das der Bereich A1 bis C8 des aktiven Tabellenblatts.
SetSourceData()
189
7.2
Elemente ndern
Diagramm ndern
Diagramme haben viele Elemente mit zahlreichen Eigenschaften, die natrlich auch im Nachhinein gendert werden knnen. Die Elemente stehen in der Objekthierarchie unterhalb der Diagramme. Sie unterscheiden sich je nach Diagrammtyp. Am Beispiel des soeben erstellten Liniendiagramms sollen stellvertretend einige wichtige Eigenschaften (und Methoden) erlutert werden. Seit Excel 2010 knnen Sie nicht nur die Erstellung eines Diagramms, sondern auch die nderungen an einem Diagramm mithilfe eines Makros aufzeichnen. Dies kann eine Hilfe zur Nutzung der Objekthierarchie sein, deren Vielfalt hier nicht komplett beschrieben werden kann.
7.2.1
Diagrammblatt ndern
Das Programm ist zweigeteilt. Zunchst der Programmteil, der nur fr Diagrammbltter zutrifft:
Chart-Variable
Es wird eine Variable vom Typ Chart deklariert. Diese bekommt das erste Diagrammblatt dieser Arbeitsmappe zugewiesen. Es wird die Prozedur DiagrammAendern() aufgerufen, als Parameter wird das erste Diagrammblatt Charts(1) bergeben.
Charts(Index)
Es folgt der Programmteil, der sowohl fr Diagrammbltter als auch fr eingebettete Diagramme zutrifft:
Sub DiagrammAendern(CH As Chart) ' Diagrammflche CH.ChartArea.Interior.Color = vbCyan ' Zeichnungsflche CH.PlotArea.Interior.Color = vbYellow ' Titel CH.HasTitle = True CH.ChartTitle.Text = "Temperatur"
190
Diagramm ndern
7.2
' Legende CH.HasLegend = True With CH.Legend .Interior.Color = vbYellow .Border.Color = vbBlue .Border.Weight = xlThick End With ' Achse Kategorien With CH.Axes(xlCategory) .HasTitle = True .AxisTitle.Text = "Datum" .TickLabels.NumberFormatLocal = "TT.MM." End With ' Achse Werte With CH.Axes(xlValue) .HasTitle = True .AxisTitle.Text = "Grad" .MinimumScale = 5 .MaximumScale = 35 End With ' Datenreihe With CH.SeriesCollection(1) .Border.Color = vbRed .MarkerStyle = xlMarkerStyleCircle .MarkerForegroundColor = vbRed .MarkerBackgroundColor = vbRed End With 'Datenpunkt With CH.SeriesCollection(1).Points(3) .Border.Color = vbBlue .ApplyDataLabels xlShowValue .MarkerStyle = xlMarkerStyleSquare .MarkerForegroundColor = vbBlue .MarkerBackgroundColor = vbBlue End With End Sub
191
Zur Erluterung:
ChartArea
Die Eigenschaft ChartArea steht fr die Diagrammflche des Diagramms. Diese umfasst z. B. Zeichnungsflche, Titel und Legende. Sie hat u. a. die Eigenschaft Interior, die fr (wie bei einer Zelle) das Innere des Objekts steht. Dieses Innere hat wiederum eine Farbe, die in diesem Beispiel auf Cyan gesetzt wird. Die Eigenschaft PlotArea steht fr die Zeichnungsflche des Diagramms. Sie hat ebenfalls u. a. die Eigenschaft Interior, deren Farbe in diesem Beispiel auf Gelb gesetzt wird. Diagramme knnen einen Titel haben. Darber bestimmt die Eigenschaft HasTitle. Wird sie auf True gesetzt, dann hat das Diagramm einen Titel; bei False hat es keinen Titel. Das Aussehen des Titels wird ber die Eigenschaft ChartTitle festgelegt. Die Eigenschaft Text enthlt den Text des Titels. Diagramme knnen eine Legende haben. Darber bestimmt die Eigenschaft HasLegend. Auch sie kann auf True oder False gesetzt werden. Das Aussehen der Legende wird ber die Eigenschaft Legend festgelegt. hnlich wie eine Zelle hat eine Legende die Eigenschaften Inte-
PlotArea
HasTitle
ChartTitle
HasLegend
Legend
192
Diagramm ndern
7.2
rior und Border. Damit knnen Sie ber die Farbe des Inneren bzw.
Alle Achsen eines Diagramms stehen in der Auflistung Axes. Eine einzelne Achse ist ein Objekt vom Typ Axis. Zunchst muss mit Hilfe der Methode Axes() des Objekts Chart entschieden werden, welche Achse gemeint ist. Es gibt die Parameter:
Axes, Axis
xlCategory fr die horizontale Achse, die Kategorie-Achse xlValue fr die vertikale Achse, die Wert-Achse
AxisTitle
Fr jede der beiden Achsen wird im Beispiel festgelegt, dass sie einen Achsentitel haben (HasTitle = True). Anschlieend wird der Text des Achsentitels zugewiesen (AxisTitle.Text = ...). Bei der Kategorienachse wird die Formatierung der Achsenbeschriftung (TickLabels) bestimmt. Hier stehen im Beispiel Datumsangaben; sie werden mit Hilfe von NumberFormatLocal (wie Zellen) formatiert. Bei der Wertachse wird die Skalierung bestimmt. Dabei knnen unterster Wert (MinimumScale) und oberster Wert (MaximumScale) gesetzt werden. Alle Datenreihen eines Diagramms stehen in der Auflistung SeriesCollection. Eine einzelne Datenreihe ist ein Objekt vom Typ Series. Zunchst muss mit Hilfe der Methode SeriesCollection()des Objekts Chart entschieden werden, welche Datenreihe gemeint ist. Diese Methode bekommt als Parameter die Nummer der Datenreihe, beginnend bei 1, und liefert als Rckgabewert die entsprechende Datenreihe. Mit Border knnen die Eigenschaften des Rahmens (bei Liniendiagrammen die Eigenschaften der eigentlichen Linie) der Datenreihe bestimmt werden. In diesem Beispiel wird die Farbe auf Rot gesetzt. Mit MarkerStyle, MarkerForegroundColor, MarkerBackgroundColor entscheiden Sie ber das Aussehen der Markierungspunkte auf der Linie.
TickLabels
...Scale
SeriesCollection, Series
Border
Fr MarkerStyle ist eine Reihe von Konstanten erlaubt, z. B. xlMarkerStyleCircle (Kreis), xlMarkerStyleSquare (Quadrat), xlMarkerStyleNone (keine Markierung). Die Eigenschaften MarkerForegroun