Академический Документы
Профессиональный Документы
Культура Документы
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 MarkerForegroundColor und MarkerBackgroundColor stehen fr die Farbe der Markierungsfllung und des Markierungsrands.
MarkerStyle
Marker...Color
193
7
Points, Point
Alle Datenpunkte einer Datenreihe stehen in der Auflistung Points. Ein einzelner Datenpunkt ist ein Objekt vom Typ Point. Zunchst muss mit Hilfe der Methode Points() des Objekts Series entschieden werden, welcher Datenpunkt gemeint ist. Diese Methode bekommt als Parameter die Nummer des Datenpunkts, beginnend bei 1, und liefert als Rckgabewert den entsprechenden Datenpunkt. Mit Border bestimmen Sie die Eigenschaften des Rahmens (bei Liniendiagrammen die Eigenschaften der eigentlichen Linie) des Datenpunkts. In diesem Beispiel wird die Farbe auf Blau gesetzt. Die Methode ApplyDataLabels() bestimmt ber die Beschriftung von Datenreihen oder Datenpunkten. Der wichtigste Parameter ist der Typ der Beschriftung. Erlaubte Werte sind u. a. xlShowValue (Wert), xlShowLabel (Kategorie), xlShowNone (keine Beschriftung). Das Aussehen der Markierung eines Datenpunkts lsst sich wie bei einer Datenreihe einstellen, siehe oben.
Hinweis
In den Versionen vor Excel 2007 lsst sich die Formatierung der Achsenbeschriftung nicht vollstndig einstellen. Die Eigenschaft NumberFormatLocal eines TickLabels kann nicht mit einem Datumsformat eingestellt werden.
7.2.2
hnlich Diagrammblatt
Das Programm zum ndern eines eingebetteten Diagramms ist ebenso aufgebaut wie das Programm zum ndern eines Diagrammblatts, also zweiteilig. Es folgt der Programmteil, der nur fr eingebettete Diagramme zutrifft:
Sub DiagrammEingebettetAendern() Dim CO As ChartObject Dim CH As Chart Set CO = ThisWorkbook.Worksheets("Tabelle1"). _ ChartObjects(1) CO.Left = 220 CO.Top = 30 CO.Width = 400 CO.Height = 300 Set CH = CO.Chart DiagrammAendern CH End Sub
194
Diagramm verwalten
7.3
Zur Erluterung:
Es wird eine Variable vom Typ ChartObject deklariert. Diese bekommt den ersten Diagrammrahmen des Tabellenblatts Tabelle1 dieser Arbeitsmappe zugewiesen. Anschlieend wird eine Variable vom Typ Chart deklariert. Ihr weisen wir das Diagramm dieses Diagrammrahmens zu. Bei einem eingebetteten Diagramm kann es sinnvoll sein, Position und Gre des Diagrammrahmens zu ndern. Hierzu knnen Sie die Eigenschaften Left, Top, Width und Height nutzen. Es wird die (bereits bekannte) Prozedur DiagrammAendern() aufgerufen; als Parameter wird der Chart bergeben.
ChartObject
Chart-Variable
Diagrammrahmen
7.3
Diagramm verwalten
Diagramme knnen unter anderem kopiert, gelscht oder als Bilddatei exportiert werden.
7.3.1
Diagrammblatt verwalten
Kopieren
Es folgen drei Programme zum Kopieren, Lschen bzw. Exportieren eines Diagrammblatts. Zunchst das Kopieren:
Sub DiagrammNeuesBlattKopieren() ThisWorkbook.Charts("Diagramm1").Copy _ After:=Worksheets("Tabelle3") ActiveChart.Name = "Diagramm1 Neu" End Sub
Zur Erluterung:
Ein Diagrammblatt wird genauso kopiert wird ein Tabellenblatt. Die Methode Copy() sorgt fr die Kopie. Mit Before bzw. After knnen Sie den Ort der Kopie angeben. Ohne Parameter wrde eine neue Arbeitsmappe mit dem Diagrammblatt als einzigem Blatt angelegt werden.
Copy(), After, Before
195
Das Ergebnis:
Zur Erluterung:
Delete()
Exportieren
Zur Erluterung:
Export()
Die Methode Export() dient zum Erzeugen einer Bilddatei. Es muss der Name der Bilddatei (gegebenenfalls mit Verzeichnisname) angegeben werden. Die Endung des Dateinamens bestimmt ber die Art der Konvertierung; es sind u. a. .jpg, .gif und .png erlaubt.
Das Ergebnis:
196
Diagramm verwalten
7.3
7.3.2
Parallel zum vorherigen Abschnitt folgen drei Programme zum Kopieren, Lschen bzw. Exportieren eines eingebetteten Diagramms. Zunchst das Kopieren:
Sub DiagrammEingebettetKopieren() With ThisWorkbook.Worksheets("Tabelle1") .ChartObjects(1).Copy .Paste .ChartObjects(2).Top = 250 .ChartObjects(2).Left = 200 End With End Sub
Das Ergebnis:
Zur Erluterung:
Es wird davon ausgegangen, dass im Tabellenblatt Tabelle1 nur ein Diagrammrahmen existiert. Dieser Rahmen hat die Nummer 1 in der ChartObjects-Auflistung. Die Methode Copy() kopiert den Diagrammrahmen (inklusive Diagramm) in die Zwischenablage. Die Methode Paste() fgt den Diagrammrahmen aus der Zwischenablage in das Tabellenblatt Tabelle1 ein. Damit wird er zu ChartObjects(2). Die Position dieses neuen Diagrammrahmens wird ber die Eigenschaften Top und Left festgelegt.
Copy()
Paste()
Diagrammrahmen
197
7
Lschen
Zur Erluterung:
Delete() Exportieren
Zur Erluterung:
Export()
Die Methode Export() dient zum Erzeugen einer Bilddatei, diesmal aus dem Diagramm eines Diagrammrahmens.
7.4
Beispieltabelle
Als weiteres Beispiel fr ein neu erstelltes, eingebettetes und formatiertes Diagramm soll nachfolgend ein Kreisdiagramm dienen. Sie knnen erkennen, dass dabei viele allgemeine Diagrammeigenschaften aus dem Liniendiagramm bernommen werden knnen. Andere Eigenschaften gibt es hingegen nur bei Kreisdiagrammen. Als Datenquelle dienen die folgenden Wahlergebnisse:
198
7.4
199
Zur Erluterung:
Add()
Wie bekannt wird mit ChartObject.Add() der Diagrammrahmen neu erstellt. Als Diagrammtyp dient xlPie, fr Kreisdiagramme (Kuchendiagramme). Diagramm- und Zeichnungsflche, Titel und Legende knnen wie beim Liniendiagramm formatiert werden. Bei den Datenreihen sieht es anders aus. Es gibt natrlich keine Markierungen, dafr aber z. B.
Typ xlPie
Beschriftung
Flche
200
Shapes
7.5
Im vorliegenden Fall werden mit dem Beschriftungstyp die Datenpunkte, deren Wert oberhalb einer Grenze (500.000 Stimmen) liegt, mit Kategorie und Prozentzahl beschriftet. Auerdem wird die innere Flche eines Datenpunkts in Wei dargestellt. Die Eigenschaft DataLabel bestimmt ber das Aussehen der Beschriftung. Hier wurde festgelegt, dass die Prozentzahl mit zwei Nachkommastellen dargestellt wird.
DataLabel
7.5
Shapes
Zeichnungsobjekte
Zeichnungsobjekte (Shapes) werden, wie eingebettete Diagramme, innerhalb eines Tabellenblatts angeordnet. Die Auflistung Shapes liegt daher auch in der Objekt-Hierarchie unterhalb von Worksheets und umfasst alle Zeichnungsobjekte. Wichtige Eigenschaften und Methoden der Auflistung Shapes sind:
Count: Anzahl der Zeichnungsobjekte AddShape(): Erzeugen der meisten Typen von Zeichnungsobjekten AddLine(): Erzeugen einer Linie AddConnector(): Erzeugen eines Verbinders BuildFreeform(): Erzeugen einer Freiform
AddShape()
Wie bei allen Auflistungen blich, sind die Shapes eines Tabellenblatts in der Reihenfolge der Erzeugung durchnummeriert (Shapes(1), Shapes(2), Shapes(3)...). Einige der zahlreichen Mglichkeiten von Shapes werden in diesem Abschnitt anhand von bekannten Autoformen, wie Rechteck, Oval, Linie, Verbinder und Freiform, erlutert. Zur besseren bersicht werden in Abschnitt 7.5.6 alle verschiedenen Formen von Shapes mithilfe eines VBA-Programms dargestellt.
7.5.1
Rechteck
Im folgenden Beispiel wird ein Rechteck, mit Fllung und Rahmenlinie, erzeugt und gedreht. Bei einem Rechteck handelt es sich um einen Shape des Typs msoShapeRectangle.
201
Sub Rechteck() Dim Sh As Shape ThisWorkbook.Worksheets("Tabelle3").Activate Set Sh = ActiveSheet.Shapes.AddShape _ (msoShapeRectangle, 30, 30, 50, 80) Sh.Fill.ForeColor.RGB = RGB(255, 0, 0) Sh.Line.ForeColor.RGB = RGB(255, 255, 0) Sh.Line.Weight = 3 Sh.Rotation = 20 End Sub
Das Ergebnis:
Abbildung 7.12
Rechteck
Zur Erluterung:
AddShape()
Die Methode AddShape() dient zur Erzeugung vieler verschiedener Typen von Zeichnungsobjekten. Sie hat fnf Parameter:
Typ
Type: Ein Wert aus der Aufzhlung msoAutoShapeType. Diese Aufzhlung hat weit ber 100 Elemente; jeder steht fr einen bestimmten Typ von Zeichnungsobjekt. Durch Angabe des Typs msoShapeRectangle erzeugen Sie ein Rechteck. Left und Top: Koordinaten des Rahmens um das neue Objekt,
Position
Width und Height: Breite und Hhe des Rahmens um das neue Objekt
Umgebendes Rechteck
Bei einem Rechteck stimmt der Rahmen mit dem Objekt selbst berein. Bei einem Oval ist der Rahmen das unsichtbare, umgebende Rechteck. Das umgebende Rechteck wird sichtbar, wenn Sie das Objekt markieren. Die Eigenschaft Fill eines Shapes dient zur Gestaltung der Fllung des Objekts. Hier wird die Untereigenschaft ForeColor.RGB genutzt, um die Fllfarbe des Objekts einzustellen.
Fill
202
Shapes
7.5
Line
Die Eigenschaft Line eines Shapes umfasst bei einem Zeichnungsobjekt vom Typ Linie die Eigenschaften der Linie selbst. Bei einem ausgedehnten Objekt (wie hier bei einem Rechteck) umfasst sie die Eigenschaften der Randlinie. Hier wird ebenfalls die Untereigenschaft ForeColor.RGB genutzt, um die Linienfarbe des Objekts einzustellen. Mit der Eigenschaft Weight knnen Sie die Dicke der Linie einstellen. Die Eigenschaft Rotation bestimmt die Drehung des Zeichnungsobjekts in Grad. Sie wird im Uhrzeigersinn gemessen.
Weight Rotation
Hinweis
Die Koordinaten des Objekts (Left und Top) verndern sich durch eine Drehung nicht, obwohl sich z. B. die linke obere Ecke verschiebt. Eine Aussage ber die wahre Lage ergibt sich also nur aus der Kombination der Angaben Left, Top und Rotation.
7.5.2
Oval
msoShapeOval
Der Typ msoShapeOval dient zur Erzeugung eines Ovals. Falls Breite und Hhe gleich sind, handelt es sich um einen Kreis. Viele Zeichnungsobjekte knnen Text enthalten; dies wird nachfolgend am Oval gezeigt:
Sub Oval() Dim Sh As Shape ThisWorkbook.Worksheets("Tabelle3").Activate Set Sh = ActiveSheet.Shapes.AddShape _ (msoShapeOval, 130, 30, 80, 50) Sh.Line.DashStyle = msoLineDash Sh.TextFrame.Characters.Text = "Hallo" Sh.TextFrame.Characters.Font.Color = vbYellow End Sub
Das Ergebnis:
203
Zur Erluterung:
Type DashStyle
Durch Angabe des Typs msoShapeOval erzeugen Sie ein Oval. Die Eigenschaft DashStyle einer Linie bestimmt die Art einer Linie. Werte stammen aus der Aufzhlung msoLineDashStyle. Der Wert msoLineDash bedeutet gestrichelte Linie. Mit der Eigenschaft TextFrame knnen Sie einige (aber nicht alle) Eigenschaften des Texts festlegen, denen Sie viele Shapes zuordnen knnen. Weitere Eigenschaften in diesem Zusammenhang sind TextFrame2 und TextEffect. Die Untereigenschaft TextFrame.Characters dient u. a. zur Zuweisung des eigentlichen Texts (Untereigenschaft Text) und zur Zuweisung von Schrifteigenschaften (Untereigenschaft Font).
Text...
Characters
7.5.3
AddLine()
Linie
Die Methode AddLine() erzeugt eine Linie. Rckgabewert ist aber wiederum ein Objekt des Typs Shape. Die Eigenschaft Line eines Shapes umfasst bei einer Linie die Eigenschaften der Linie selbst. Bei einem ausgedehnten Objekt (wie z. B. bei einem Rechteck) enthlt sie die Eigenschaften der Randlinie. Alle Objekte, so auch Zeichnungsobjekte, knnen Elemente von Datenfeldern sein. Im vorliegenden Beispiel wird ein Datenfeld von drei hnlichen Linien erzeugt.
Sub Linie() Dim Sh(1 To 3) As Shape Dim i As Integer ThisWorkbook.Worksheets("Tabelle3").Activate For i = 1 To 3 Set Sh(i) = ActiveSheet.Shapes.AddLine _ (240, 30, 280, 30) Sh(i).Line.ForeColor.RGB = RGB(255, 0, 0) Sh(i).Line.Weight = 3 Sh(i).Rotation = (i 1) * 30 Next i End Sub
204
Shapes
7.5
Das Ergebnis:
Zur Erluterung:
BeginX und BeginY fr die Koordinaten des Startpunkts. EndX und EndY fr die Koordinaten des Endpunkts.
Koordinaten
Innerhalb der Schleife werden Farbe und Dicke der Linie einheitlich festgelegt. Die Rotation wird fr jede Linie unterschiedlich bestimmt.
Rotation
7.5.4
Verbinder
Flexibel verbinden
Ein Verbinder stellt eine flexible Verbindung zwischen zwei Objekten dar. Bei einer Vernderung von einem Objekt oder beiden Objekten verndern sich auch die Eigenschaften des Verbinders. Die Verbindung kann von einem der verschiedenen mglichen Verbindungspunkte eines Objekts ausgehen. Meist ist es gewnscht, dass sich die Verbindungspunkte der beiden Objekte mglichst nahe liegen. Im folgenden Beispiel werden zunchst zwei Rechtecke erzeugt. Anschlieend werden diese beiden Objekte miteinander verbunden. Rechtecke haben vier mgliche Verbindungspunkte, die sich jeweils in der Mitte der vier Seiten des Rechtecks befinden.
Sub Verbinder() Dim Sh1 As Shape, Sh2 As Shape Dim Con As Shape ThisWorkbook.Worksheets("Tabelle3").Activate ' Objekte, die verbunden werden sollen Set Sh1 = ActiveSheet.Shapes.AddShape _ (msoShapeRectangle, 80, 130, 40, 30) Set Sh2 = ActiveSheet.Shapes.AddShape _ (msoShapeRectangle, 180, 100, 40, 30)
Verbindungspunkte
205
' Verbinder Set Con = ActiveSheet.Shapes.AddConnector _ (msoConnectorStraight, 1, 1, 1, 1) Con.Line.Weight = 3 Con.ConnectorFormat.BeginConnect Sh1, 1 Con.ConnectorFormat.EndConnect Sh2, 1 Con.RerouteConnections End Sub
Das Ergebnis:
Zur Erluterung:
AddConnector()
Die Methode AddConnector() erzeugt einen Verbinder. Rckgabewert ist ebenfalls ein Objekt des Typs Shape.
msoConnectorStraight
Der erste Parameter bestimmt die Art des Verbinders. Dies ist ein Wert aus der Aufzhlung msoConnectorType. Der Wert msoConnectorStraight bedeutet gerader Verbinder. Die weiteren vier Parameter dienen, wie bei einer Linie, zur Festlegung der Koordinaten des Startpunkts (BeginX, BeginY) und des Endpunkts (EndX, EndY). Wie bereits erlutert, richten sich diese Eigenschaften aber nach vollzogener Verbindung nach den Eigenschaften der verbundenen Objekte. Daher mssen jetzt lediglich Werte festgelegt werden, die ungleich Null sind.
Koordinaten unwichtig
Fr einen Verbinder knnen weitere Linieneigenschaften festgelegt werden, wie z. B. Weight fr die Liniendicke. Die eigentliche Verbindung wird ber die Methoden BeginConnect() und EndConnect() der ConnectorFormat-Eigenschaft hergestellt. Beide Methoden haben zwei Parameter:
Beginn, Ende
Objekt Verbindungspunkt
Im ersten Parameter wird das verbundene Objekt angegeben. Im zweiten Parameter wird die laufende Nummer des Verbindungspunkts angegeben. Wie bereits erlutert, ist es meist gewnscht, dass sich die Verbindungspunkte der beiden Objekte mglichst
206
Shapes
7.5
nahe liegen. Daher mssen jetzt lediglich Werte festgelegt werden, die ungleich Null sind.
Durch die Methode RerouteConnections() werden dann automatisch die optimalen Verbindungspunkte gewhlt.
RerouteConnections()
7.5.5
Freiform
Linienzug
Eine Freiform ist ein Zug aus geraden oder geschwungenen Linien. Diese Linien verbinden die Eckpunkte (= Knoten) der Freiform miteinander. Falls der letzte Knoten gleichzeitig der erste Knoten ist, ergibt sich eine geschlossene Freiform mit einer Innenflche. Die Methode BuildFreeform() erzeugt ein Objekt des Typs FreeformBuilder mit einem ersten Knoten. Mit der Methode AddNodes() werden weitere Knoten hinzugefgt. Als Letztes wird die Freiform mit der Methode ConvertToShape() in ein Objekt des Typs Shape umgewandelt. Es folgen zwei Beispiele: eine geschlossene Freiform und ein Linienzug als offene Freiform. Zunchst die geschlossene Freiform.
Sub FreiformGeschlossen() Dim FB As FreeformBuilder Dim Sh As Shape ThisWorkbook.Worksheets("Tabelle3").Activate ' Eigenschaften der Freiform Set FB = ActiveSheet.Shapes.BuildFreeform _ (msoEditingAuto, 330, 30) FB.AddNodes msoSegmentCurve, msoEditingAuto, FB.AddNodes msoSegmentCurve, msoEditingAuto, FB.AddNodes msoSegmentCurve, msoEditingAuto, FB.AddNodes msoSegmentCurve, msoEditingAuto, ' Zeichnen der Freiform als Shape Set Sh = FB.ConvertToShape Sh.Line.Weight = 3 End Sub
Erzeugen, umwandeln
Geschlossene Freiform
60 120 40 30
207
Das Ergebnis:
Abbildung 7.16
Freiform
Der EditingType gibt die Bearbeitungseigenschaft des ersten Knotens an. Es muss ein Wert der Aufzhlung msoEditingType angegeben werden. Der Wert msoEditingAuto legt fest, dass sich die Bearbeitungsart nach den verbundenen Segmenten richtet. Damit hat man die universelle Einstellung gewhlt. Die beiden Eigenschaften X1 und Y1 legen die Koordinaten des ersten Knotens der Freiform fest.
AddNodes()
Der Parameter SegmentType legt das Aussehen der Verbindung zu diesem neuen Knoten fest. Es muss ein Wert der Aufzhlung msoSegmentType angegeben werden. Mgliche Werte sind msoSegmentCurve (Kurve) und msoSegmentLine (Linie). Der zweite Parameter wurde bereits bei BuildFreeform() erlutert. Falls der zweite Parameter den Wert msoEditingAuto hat, dann legen die beiden Eigenschaften X1 und Y1 die Koordinaten des neuen Knotens fest.
ConvertToShape()
Die Methode ConvertToShape() wandelt die neu erzeugte Freiform in einen Shape um. Anschlieend knnen Sie mit den bekannten Eigenschaften und Methoden von Shapes arbeiten, wie z. B. Line. Weight fr die Liniendicke.
Offene Freiform
Es folgt ein Linienzug als offene Freiform. Die Koordinaten der Knoten werden dem Tabellenblatt entnommen (siehe Abbildung 7.17). Sptes-
208
Shapes
7.5
tens jetzt lsst sich die Verwandtschaft von Shapes und Diagrammen leicht erkennen.
Sub FreiformLinienzug() Dim FB As FreeformBuilder Dim Sh As Shape Dim i As Integer ThisWorkbook.Worksheets("Tabelle3").Activate ' Eigenschaften der Freiform Set FB = ActiveSheet.Shapes.BuildFreeform _ (msoEditingAuto, Cells(1, 9), Cells(1, 10)) For i = 2 To 10 FB.AddNodes msoSegmentLine, msoEditingAuto, _ Cells(i, 9), Cells(i, 10) Next i ' Zeichnen der Freiform als Shape Set Sh = FB.ConvertToShape Sh.Line.Weight = 3 End Sub
Das Ergebnis:
209
Zur Erluterung:
Die Koordinaten des ersten Knotens, der zur Erzeugung der Freiform bentigt wird, stehen in der ersten Zeile. Die Koordinaten der weiteren Knoten, die von der Methode AddNodes() genutzt werden, stehen in den Zeilen darunter. Als Verbin-
AddNodes()
7.5.6
Alle Shapes
Alle Formen
Zur besseren bersicht werden in diesem Abschnitt alle verschiedenen Formen von Shapes mithilfe des nachfolgenden VBA-Programms dargestellt:
Sub AlleFormen() Dim sh As Shape Dim i As Integer, lf As Integer, tp As Integer ' Tabellenblatt auswhlen ThisWorkbook.Worksheets("Tabelle4").Activate ' Kein Gitternetz ActiveWindow.DisplayGridlines = False ' Leeren For i = ActiveSheet.Shapes().Count To 1 Step -1 ActiveSheet.Shapes(i).Delete Next i ' Startwerte lf = 5 tp = 5 ' Alle verschiedenen Formen For i = 1 To 137 Set sh = ActiveSheet.Shapes(). _ AddShape(i, lf, tp, 30, 30) ' Formatieren sh.Line.Weight = 1 sh.Line.ForeColor.RGB = RGB(0, 0, 0) sh.Fill.ForeColor.RGB = RGB(255, 255, 255) With sh.TextFrame.Characters .Font.Color = vbBlack
210
Shapes
7.5
.Font.Size = 7 .Text = i End With ' Nchste Position lf = lf + 35 If i Mod 15 = 0 Then lf = 5 tp = tp + 35 End If Next i End Sub
Zur Erluterung:
Zunchst werden die Gitternetzlinien im Tabellenblatt zur deutlicheren Darstellung ausgeblendet. Alle evtl. bereits vorhandenen Zeichnungsobjekte werden gelscht. Das Lschen beginnt beim letzten Zeichnungsobjekt. Falls es beim ersten Zeichnungsobjekt beginnen wrde, dann wrde man nach kurzer Zeit auf einen nicht mehr existierenden Index zugreifen. Es werden Startwerte fr den Ort festgelegt, an dem das Zeichnungsobjekt gezeichnet wird. Innerhalb der Schleife werden alle 137 verschiedenen Zeichnungsobjekte mithilfe der Methode AddShape() erzeugt. Jedes Objekt wird in der Gre 30 mal 30 mit einer dnnen schwarzen Linie und einem weien Innenbereich gezeichnet. In jedem Objekt wird der Wert fr die Eigenschaft Type notiert. Zum Abschluss der Schleife wird die Position fr das nchste Zeichnungsobjekt festgelegt.
AddShape()
Type
211
Hinweis
In den Versionen vor Excel 2007 lassen sich die Eigenschaften Color und Size des Font-Objekts (zur Darstellung der laufenden Nummer in der Form) nicht einstellen.
7.6
Texteffekte
WordArt
Mit WordArt knnen Sie dekorative Texteffekte erzeugen, z. B. schattierten oder gespiegelten Text. Mithilfe eines VBA-Programms wird nachfolgend eine bersicht ber die insgesamt 30 verschiedenen Effektarten erzeugt. Dazu wird die Methode AddTextEffect() verwendet. Ergebnis ist wiederum ein Objekt der Klasse Shape.
Sub AlleWordArt() Dim sh As Shape Dim i As Integer, lf As Integer, tp As Integer ' Tabellenblatt auswhlen ThisWorkbook.Worksheets("Tabelle5").Activate ' Kein Gitternetz ActiveWindow.DisplayGridlines = False ' Leeren For i = ActiveSheet.Shapes().Count To 1 Step -1 ActiveSheet.Shapes(i).Delete Next i ' Startwerte lf = 5 tp = 5 ' Alle verschiedenen WordArt-Voreinstellungen For i = 0 To 29 Set sh = ActiveSheet.Shapes().AddTextEffect( _ i, i, "Arial", 48, False, False, lf, tp) sh.TextFrame.Characters.Font.Color = _ RGB(255, 0, 0) ' Nchste Position lf = lf + 70 If i Mod 6 = 5 Then
212
WordArt
7.6
Zur Erluterung:
Wie im vorherigen Programm werden die Gitternetzlinien ausgeblendet und alle evtl. bereits vorhandenen Shapes gelscht. Nach der Festlegung der Startposition wird in der Schleife die Methode AddTextEffect() aufgerufen. Sie hat acht Pflichtparameter:
AddTextEffect()
Typ des vordefinierten Texteffekts, dargestellter Text, Name der Schriftart, Gre der Schriftart, Fett ja/nein, Kursiv ja/nein, Positionsangabe links, Positionsangabe oben
Die Schriftfarbe, also die Farbe des im Textframe des Shapes dargestellten Texts, wird auf Rot festgelegt. Zum Abschluss der Schleife wird die Position fr das nchste Objekt festgelegt.
ber die Parameter kann der Texteffekt noch weiter variiert werden. In Abbildung 7.20 sehen Sie einen kleinen Ausschnitt.
213
Hinweis
In den Versionen vor Excel 2007 werden die WordArt-Formen anders gebildet. Daher lsst sich die Eigenschaft Color des Font-Objekts (zur Darstellung der laufenden Nummer in der Form) nicht einstellen. Auerdem sehen die WordArt-Formen anders aus.
7.7
Wertereihen
Bedingte Formatierungen
Bedingte Formatierungen knnen zur deutlicheren Darstellung der Unterschiede und Besonderheiten innerhalb einer zusammengehrigen Reihe von Werten verwendet werden. Zur Formatierung dienen Datenbalken, Farbskalen und Symbolstze. Diese Mglichkeit gibt es erst seit Excel 2007.
7.7.1
Datenbalken
Mithilfe des nachfolgenden Programms werden die Grenverhltnisse einer Reihe von Zahlen durch Datenbalken verdeutlicht:
Sub Datenbalken() Dim rg As Range ThisWorkbook.Worksheets("Tabelle6").Activate Set rg = Range("A2:A11") rg.FormatConditions.Delete ' Datenbalken erzeugen rg.FormatConditions.AddDatabar ' Datenbalken ndern rg.FormatConditions(1).BarColor.Color = vbRed End Sub
Zur Erluterung:
Die bedingten Formatierungen einer Zelle oder eines Zellbereichs werden in der Collection FormatConditions festgehalten. Die Methode Delete() lscht alle evtl. bereits vorhandenen bedingten Formatierungen. Mithilfe der Methode AddDatabar() wird ein Objekt der Klasse Databar erzeugt. Dies ist eine bedingte Formatierung in Form eines Daten-
AddDatabar()
balkens.
214
Bedingte Formatierungen
7.7
Dieser Datenbalken kann verndert werden. Da es sich dabei um die erste bedingte Formatierung handelt, wird sie ber den Index 1 angesprochen. Spter knnten der gleichen Zelle oder dem gleichen Zellbereich weitere bedingte Formatierungen zugeordnet werden. Die Farbe des Datenbalkens wird ber die Untereigenschaft Color der Eigenschaft BarColor gendert. Das Ergebnis sehen Sie in Abbildung 7.21.
BarColor
Abbildung 7.21
Datenbalken
7.7.2
Zweifarbige Farbskala
Es gibt die Mglichkeit, den Zellbereich mithilfe einer zweifarbigen oder dreifarbigen Skala zu formatieren. Zunchst ein Beispiel mit zwei Farben:
Sub ZweiFarbenSkala() Dim rg As Range ThisWorkbook.Worksheets("Tabelle6").Activate Set rg = Range("A2:A11") rg.FormatConditions.Delete ' ZweiFarbenSkala erzeugen rg.FormatConditions.AddColorScale 2 ' ZweiFarbenSkala ndern With rg.FormatConditions(1) .ColorScaleCriteria(1).Type = _ xlConditionValueLowestValue .ColorScaleCriteria(1).FormatColor.Color = _ vbYellow .ColorScaleCriteria(2).Type = _ xlConditionValueHighestValue
215
Zur Erluterung:
Zunchst werden wieder alle evtl. bereits vorhandenen bedingten Formatierungen gelscht. Mithilfe der Methode AddColorScale() wird ein Objekt der Klasse ColorScale erzeugt. Dies ist eine bedingte Formatierung in Form einer Farbskala. Der erste Parameter (ColorScaleType) legt fest, ob es sich um eine zweifarbige oder dreifarbige Farbskala handelt. Zur Vernderung knnen einer bedingten Formatierung vom Typ ColorScale weitere Formatierungskriterien hinzugefgt werden. Alle Formatierungskriterien stehen in der Auflistung ColorScaleCriteria des Objekts ColorScale. Innerhalb des ersten Kriteriums wird dem niedrigsten Wert die Farbe Gelb zugewiesen. Dazu bekommt die Eigenschaft Type des Kriteriums den Wert xlConditionValueLowestValue aus der Aufzhlung xlConditionValueTypes. Die Untereigenschaft Color der Eigenschaft FormatColor legt die Farbe fr den auf diese Weise ausgewhlten Wert fest. Innerhalb des zweiten Kriteriums wird dem hchsten Wert die Farbe Rot zugewiesen. Dazu wird das Auflistungselement xlConditionValueHighestValue bentigt.
AddColorScale()
ColorScaleCriteria
Type, FormatColor
Abbildung 7.22
Zweifarbige Skala
216
Bedingte Formatierungen
7.7
7.7.3
Dreifarbige Farbskala
Die Methode AddColorScale() wird mit dem Wert 3 fr den Parameter Type aufgerufen. Bei der nderung wird auch die Farbe fr das Auflistungselement xlConditionValuePercentile gendert. Beim Perzentil handelt es sich um einen bestimmten mittleren Wert aus der Statistik.
AddColorScale()
Perzentil
217
7.7.4
Symbolsatz
Statt mit Datenbalken oder Farben knnen die Grenverhltnisse einer Reihe von Zahlen auch durch unterschiedliche Symbole verdeutlicht werden, siehe nachfolgendes Programm:
Sub Symbolsatz() Dim rg As Range ThisWorkbook.Worksheets("Tabelle6").Activate Set rg = Range("A2:A11") rg.FormatConditions.Delete ' Symbolsatz erzeugen rg.FormatConditions.AddIconSetCondition ' Symbolsatz ndern With rg.FormatConditions(1) .IconSet = ActiveWorkbook.IconSets(1) .IconCriteria(2).Value = 45 .IconCriteria(3).Value = 90 End With End Sub
Zur Erluterung:
AddColorScale()
Mithilfe der Methode AddIconSetCondition() wird ein Objekt der Klasse IconSetCondition erzeugt. Dies ist eine bedingte Formatierung in Form eines Symbolsatzes. Der Typ des Symbolsatzes kann verndert werden. Dazu wird der Eigenschaft IconSet der betreffenden bedingten Formatierung ein Element der Auflistung IconSets der aktiven Arbeitsmappe zugewiesen.
IconSet
218
Bedingte Formatierungen
7.7
Es gibt Symbolstze mit 3, 4 oder 5 verschiedenen Symbolen. Im vorliegenden Beispiel handelt es sich um einen Symbolsatz mit drei Symbolen. Fr das zweite und das dritte Symbol werden neue Kriterien festgelegt. Dazu wird die Eigenschaft Value des Elements 2 bzw. 3 der Collection IconCriteria verndert. Falls eine Zelle einen Wert von mindestens 45 % des Maximalwertes der Reihe beinhaltet, dann wird das zweite Symbol verwendet, ab 90 % das dritte Symbol. Ohne besondere Festlegung gelten die Grenzwerte 34 % und 67 %.
IconCriteria
Excel 2007 hat bereits 17 verschiedene Symbolstze geboten. In Excel 2010 sind noch drei weitere hinzugekommen. Mithilfe des nachfolgenden Programms werden alle 20 Symbolstze bersichtlich dargestellt:
Sub AlleSymbolstze() Dim rg As Range Dim i As Integer ThisWorkbook.Worksheets("Tabelle7").Activate For i = 1 To 20 Range("A2:A11").Copy Cells(2, i) Cells(1, i).Value = "S " & i Set rg = Range(Cells(2, i), Cells(11, i)) rg.FormatConditions.Delete rg.FormatConditions.AddIconSetCondition rg.FormatConditions(1).IconSet = _ ActiveWorkbook.IconSets(i)
Alle Symbolstze
219
Zur Erluterung:
Die Werte der ersten Spalte werden in die restlichen Spalten kopiert. Es wird jeweils ein Bereich von 10 Zellen fr die bedingte Formatierung festgelegt. Die bedingte Formatierung wird erzeugt und ihr Typ wird auf einen der 20 mglichen Werte festgelegt.
7.8
Mini-Diagramme
Sparklines
Sparklines wurden mit Excel 2010 eingefhrt. Sie knnen eine Gruppe von Zahlenwerten schnell und platzsparend verdeutlichen. Es sind einfache Mini-Diagramme, die als Zellhintergrund gewhlt werden knnen. Zur Darstellung gibt es die Typen Linie, Spalte oder Gewinn/Verlust.
7.8.1
Linie
220
Sparklines
7.8
Zur Erluterung:
Die Methode Add() der Auflistung SparkLineGroups erzeugt in der Zielzelle (hier A10) ein Objekt der Klasse SparkLineGroup. Der erste Parameter (Type) ist das Element xlSparkLine der Auflistung xlSparkType. Damit wird eine Linie erzeugt. Die Werte fr diese Linie werden aus dem zweiten Parameter ermittelt, einer Zeichenkette mit einem Zellbereich.
Add()
xlSparkLine
Abbildung 7.26
7.8.2
Spalte
Zur Erluterung:
Diesmal wird das Element xlSparkColumn der Auflistung xlSparkType genutzt. Damit wird eine Reihe von Balken erzeugt.
xlSparkColumn
221
7.8.3
Gewinn/Verlust-Anzeige
Zu guter Letzt folgt eine Gewinn/Verlust -Anzeige in Form von Balken fr + oder -:
Sub SparkLineGewinnVerlust() ThisWorkbook.Worksheets("Tabelle8").Activate Range("A11").SparklineGroups.Add _ xlSparkColumnStacked100, "A1:A10" End Sub
Zur Erluterung:
xlSparkColumnStacked100
Das Element xlSparkColumnStacked100 der Auflistung xlSparkType sorgt fr die Unterscheidung von positiven und negativen Werten.
7.8.4
Formatierung
Bei einer Sparkline knnen bestimmte Werte besonders hervorgehoben werden. Auerdem knnen die Farben verndert werden. Ein Beispiel:
Sub SparkLineLinieFormatiert() ThisWorkbook.Worksheets("Tabelle8").Activate With Range("A11").SparklineGroups .Add xlSparkLine, "A1:A10" .Item(1).SeriesColor.ThemeColor = 2 .Item(1).Points.Markers.Visible = True .Item(1).Points.Markers.Color.ThemeColor = 10 .Item(1).Points.Negative.Visible = True .Item(1).Points.Negative.Color.ThemeColor = 9
222
Sparklines
7.8
Zur Erluterung:
Zunchst wird die Farbe der Linie verndert. Dies gelingt ber die Untereigenschaft ThemeColor der Eigenschaft SeriesColor des ersten Elements der Collection SparklineGroups. Die mglichen Farben werden im nachfolgenden Beispiel gezeigt. Die Datenpunkte bekommen eine sichtbare Markierung in einer bestimmten Farbe. Dazu werden Eigenschaften der Markierungen in der Collection Points.Markers eingestellt. Zunchst die Eigenschaft Visible, anschlieend die Untereigenschaft ThemeColor der Eigenschaft Color.
SeriesColor
Points
7.8.5
Alle Farben
Alle Farben
Eine bersicht aller Farben fr Balken (und Linien) bei Sparklines bietet das nachfolgende Programm:
Sub SparkLineFarben() Dim i As Integer ThisWorkbook.Worksheets("Tabelle8").Activate For i = 1 To 11 Cells(i + 13, 1).SparklineGroups.Add _ xlSparkColumn, "A1:A10" Cells(i + 13, 1).SparklineGroups.Item(1). _ SeriesColor.ThemeColor = i Next i Cells(14, 1).Interior.Color = vbBlack End Sub
223
Zur Erluterung:
Die Farben sind von 1 bis 11 nummeriert. Zur deutlicheren Darstellung hat die Zelle mit den weien Balken einen schwarzen Hintergrund.
7.9
SmartArt
Mit Hilfe von SmartArt-Grafiken lassen sich Beziehungen, Prozessablufe oder Hierarchien schnell und bersichtlich darstellen. Ein Beispiel sehen Sie in Abbildung 7.31.
Fr VBA ist eine SmartArt-Grafik eine Gruppe von Shapes. Die Eigenschaften der Shapes knnen allerdings nur gelesen, nicht verndert werden. Diese Mglichkeit gibt es erst seit Excel 2007.
224
SmartArt
7.9
Nachfolgend ein Programm, das die Position der einzelnen Blcke ausgibt:
Sub SmartArtLesen() Dim i As Integer Dim s As String Dim sh As Shape ' Erstes SmartArt-Objekt auswhlen Set sh = ThisWorkbook.Worksheets("Tabelle9").Shapes(1) ' Ort aller Elemente des SmartArt-Objekts For i = 1 To sh.GroupItems.Count s = s & Int(sh.GroupItems(i).Top) & _ " " & Int(sh.GroupItems(i).Left) & vbCrLf Next i MsgBox s End Sub
Zur Erluterung:
Die Collection GroupItems umfasst alle Elemente der Gruppe. Ein einzelnes Element der Gruppe kann ber einen Index angesprochen werden. Die Eigenschaften Top und Left der einzelnen Blcke werden gesammelt und ausgegeben, siehe Abbildung 7.32.
GroupItems
225
VBA und Excel bieten eine Vielzahl von vordefinierten Funktionen fr viele Anwendungsbereiche.
In diesem Kapitel dreht sich alles um Funktionen zunchst eine Zusammenstellung der verschiedenen Arten. Die ersten drei sind bereits bekannt:
Tabellenfunktionen:
Sie knnen (ohne VBA) in Excel statisch in Tabellenblttern eingetragen werden. Sie ermitteln Ergebnisse und schreiben diese in die Zellen. Sie knnen in VBA dynamisch der Eigenschaft Formula bzw. FormulaLocal eines Zellbereichs zugewiesen werden. Sie ermitteln Ergebnisse und schreiben diese in die Zellen, allerdings abhngig von VBA-Anwendungen.
Tabellenfunktionen
VBA-Funktionen:
VBA-Funktionen
Sie knnen in VBA eingesetzt werden. Sie ermitteln Ergebnisse, die innerhalb der VBA-Anwendungen genutzt werden knnen. Eine Zusammenstellung nach Kategorien findet sich in der Hilfe unter Visual Basic-Sprachverzeichnis im Eintrag Indizes und Listen.
Eigene Funktionen
Eigene Funktionen:
Sie knnen vom Entwickler in VBA programmiert werden. Anschlieend knnen sie zum Modularisieren der eigenen VBAProgramme und zum statischen Einsatz in Tabellenblttern (wie Tabellenfunktionen) genutzt werden.
WorksheetFunktionen
Worksheet-Funktionen:
Sie sind den Tabellenfunktionen der verschiedenen Kategorien (Finanzmathematik, Datum und Zeit, Statistik ...) sehr hnlich,
227
knnen aber, wie VBA-Funktionen, nur innerhalb der VBAAnwendungen genutzt werden.
Eine bersicht finden Sie fr Excel 2010 bzw. 2007 in der Hilfe unter Excel 2010- bzw. Excel 2007-Entwicklerreferenz. In der Objektmodellreferenz steht das Objekt WorksheetFunction mit seinen Elementen.
Kategorien
Die groe Menge der Tabellenfunktionen, VBA-Funktionen und Worksheet-Funktionen ist in Kategorien unterteilt. Einige sehen Sie in Tabelle 8.1.
Funktionskategorie Datenfelder Datentypen Datum und Zeit Datei-Eingabe und -Ausgabe Finanzmathematik Mathematik Verzeichnisse und Dateien Zeichenketten Beschreibung Erstellen, Initialisieren und Bearbeiten von Datenfeldern Festlegen, Konvertieren und berprfen von Datentypen Umwandeln und Verwenden von Datum/Zeit-Ausdrcken (siehe Abschnitt 8.4, Datum und Uhrzeit) Zugreifen, Lesen, Schreiben und Verwalten von Dateien (siehe Abschnitte 9.1, Textdateien, Import und Export, und 9.2, Arbeiten mit Dateien) Durchfhren von finanzmathematischen Berechnungen Durchfhren von trigonometrischen und weiteren mathematischen Berechnungen Steuern des Dateisystems und Verarbeiten von Dateien Verarbeiten von Zeichenketten (siehe Abschnitt 8.3, Zeichenketten)
8.1
Fehler des Benutzers
Die Zellen eines Tabellenblatts oder die Textfelder in einem Dialogfeld (siehe Abschnitt 10.2, Eigene Dialogfelder und Anwendungen) bieten die Mglichkeit, Eingaben des Benutzers entgegenzunehmen. Allerdings knnte der Benutzer auch an anderen, unerwnschten Stellen des Tabellenblatts oder des Dialogfelds arbeiten. Wenn Sie den Benutzer unbedingt zu einer Eingabe zu einem bestimmten Zeitpunkt veranlassen mchten, ihn also strker steuern mchten, dann knnen Sie mit einem Eingabe-Dialogfeld arbeiten. In VBA gibt es dazu zwei Funktionen:
Benutzer steuern
228
8.1
Die Funktion InputBox() zur Erzeugung einer einfachen Eingabe. Die Methode Application.InputBox() zur Erzeugung einer komfortablen, geprften Eingabe.
8.1.1
Funktion InputBox
Einfache Eingabe
Der Rckgabewert der Funktion InputBox() ist eine Zeichenkette. Das Eingabefeld kann mit einem Default-Wert vorbelegt werden. Dies kann zur Hilfestellung oder zur schnelleren Verarbeitung dienen. Damit der Benutzer wei, was und warum er etwas eingeben soll, knnen ein Titel und eine Eingabeaufforderung angezeigt werden. Ein Beispiel:
Sub EingabeEinfach() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1").Value = InputBox _ ("Bitte geben Sie Ihren Namen ein", _ "Ihr Name", "Maier") End Sub
Das Ergebnis:
Zur Erluterung:
Es erscheint ein Dialogfeld mit Text, Titel und einem Vorgabewert. Falls der Benutzer den Button OK bettigt, wird der Text zurckgegeben, der im Eingabefeld steht. Im vorliegenden Beispiel wird er in der Zelle A1 ausgegeben. Falls der Benutzer den Button Abbrechen bettigt, wird eine leere Zeichenkette zurckgegeben.
Abbruch
8.1.2
Methode Application.InputBox
Geprfte Eingabe
Der Rckgabewert der Methode Application.InputBox() hngt vom gewhlten Typ ab. Als Typ knnen Sie z. B. Zahl, Formel, Zellbezug, Text
229
oder Wahrheitswert whlen. Falls der Benutzer den Button Abbrechen bettigt, wird False zurckgegeben; dies knnen Sie zur weiteren Ablaufsteuerung nutzen. Hinweis
Excel-Versionen vor Excel 2007 reagieren auf den Aufruf dieser Methode nicht stabil. Sie melden sich nach dem Aufruf der Methode gelegentlich vllig ab, ohne dem Benutzer eine Eingabemglichkeit zu bieten.
Type:= ...
Wie beim einfachen Eingabefeld knnten Sie einen Default-Wert und einen Titel vorgeben. Der Typ der InputBox wird mit dem letzten Parameter festgelegt, daher wird in den Beispielen mit benannten Parametern gearbeitet. Eingabe einer Zahl
Zahl eingeben
Das Ergebnis:
Zur Erluterung:
Falls der Benutzer eine gltige Eingabe macht, dann wird diese im vorliegenden Beispiel in der Zelle A1 ausgegeben. Gltige Zahlen sind z. B. 5,7 oder 5e2 (= 5 mal 102 = 500) oder 0,57. Ungltige Zahlen sind z. B. 5a7 oder a57. Die Eingabe von 5.7 ist gltig und ergibt den 05. Juli des aktuellen Jahres. Falls der Benutzer keine gltige Eingabe macht, wird er darauf aufmerksam gemacht. Das Eingabefeld bleibt erhalten; er muss noch einmal eingeben:
Gltigkeit
Eingabe wiederholen
230
8.1
Eingabe einer Formel Ein Beispiel fr die Eingabe einer Formel (Typ 0):
Sub EingabeFormel() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1").Value = Application.InputBox _ (Prompt:="Formel:", Type:=0) End Sub
Formel eingeben
Das Ergebnis:
Zur Erluterung:
Der Benutzer hat die Mglichkeit, Formeln mit Zellbezgen einzugeben. Diese knnen auch nicht zusammenhngende Bereiche umfassen. Die Eingabe von =SUMME(B1:B3) fhrt dazu, dass diese Formel zum Inhalt der Zelle A1 wird und das erwartete Rechenergebnis in der Zelle A1 ausgegeben wird. Beginnt der Benutzer seine Eingabe mit =SUMME(, dann kann er den zu summierenden Zellbezug auch mit der Maus bzw. mit den Pfeiltasten auswhlen. Anschlieend muss er nur noch die Klammer schlieen.
Zellbezge
231
8
Gltigkeit
Eine ungltige Formel fhrt wie erwartet zur Ausgabe einer Fehlermeldung in der Zielzelle (#WERT? oder #NAME?).
Falls der Benutzer den in Abbildung 8.5 dargestellten Bereich mit der Maus eingibt
Zur Erluterung:
Objektvariable Eingabe per Maus
Es wird zunchst eine Objektvariable fr einen Range deklariert. Der Benutzer hat die Mglichkeit, Zellbereiche sowohl per Tastatur als auch per Maus einzugeben. Die Zellbereiche knnen auch nicht zusammenhngende Bereiche umfassen.
232
8.2
Der Zellbereich wird zurckgeliefert und in der Objektvariablen gespeichert. Anschlieend knnen weitere Aktionen fr diesen Zellbereich ausgefhrt werden, wie z. B. eine Formatierung oder eine Berechnung.
Hinweis
Fr den Parameter Type der Methode Application.InputBox() gibt es neben den erluterten Werten 1 (Zahl), 0 (Formel) und 8 (Zellbereich) zum Beispiel noch die Werte 2 (Text) und 4 (Wahrheitswert).
8.2
Zur Darstellung einfacher Anzeigen oder Warnungen sowie fr Benutzer-Abfragen muss kein aufwndiges Dialogfeld erzeugt und programmiert werden. Die Funktion MsgBox(), die wir in ihrer einfachen Version bereits kennengelernt haben, bietet eine Reihe von vorgefertigten Dialogfeldern, mit denen Sie bereits viele alltgliche Aufgaben erledigen knnen. Es folgt eine Reihe von typischen Szenarien.
8.2.1
Button OK
Button OK
Das Ergebnis:
Zur Erluterung:
Den ersten Parameter kennen wir schon; dabei handelt es sich um die eigentliche Nachricht des Ausgabedialogfelds.
233
8
vbOKOnly
Der zweite Parameter ist optional und wurde bisher noch nicht bentigt. Mit diesem Parameter wird das Aussehen und Verhalten des Dialogfelds gesteuert. Im vorliegenden Fall wird mit Hilfe der Konstanten vbOkOnly nur der Button OK dargestellt dies ist zugleich der Standard. Der dritte Parameter ist ebenfalls optional und dient zur Angabe des Dialogfeldtitels. Wird er nicht angegeben, so steht hier der Name der Anwendung.
Titel
8.2.2
Die weiteren Beispiele in diesem Abschnitt nutzen die Mglichkeiten fr das Aussehen und Verhalten des Dialogfelds, die in Tabelle 8.2 dargestellt werden.
Buttons Erluterung
Bild, das eine kritische Warnung visuell untersttzt Legt fest, welcher Button ausgefhrt wird, wenn der Benutzer nur die Taste (Enter) bettigt normalerweise ist dies der erste Button. Bild, das einen deutlichen Hinweis mit einem Ausrufezeichen visuell untersttzt Bild, das einen einfachen Hinweis mit einem Info-Zeichen visuell untersttzt Bild, das eine Frage mit einem Fragezeichen visuell untersttzt zwei Buttons: Wiederholen, Abbrechen Dialogfeld bleibt immer im Vordergrund, auch wenn der Benutzer die Anwendung wechselt. zwei Buttons: Ja, Nein drei Buttons: Ja, Nein, Abbrechen
Information
Question
RetryCancel SystemModal
YesNo YesNoCancel
Eine Button-Kombination kann durch den Operator Or mit einem Bild und einem DefaultButton-Verhalten verknpft werden. Ein Beispiel: AbortRetryIgnore wird mit Exclamation und DefaultButton2 verknpft. Statt des Operators Or knnen Sie auch den Operator + verwenden. Wenn mehr als ein Button eingeblendet wird, muss der Rckgabewert der Funktion MsgBox() (also die Antwort des Benutzers) mit Hilfe einer
Rckgabewert
234
8.2
Verzweigung ausgewertet werden. Der Rckgabewert ist eine ganze Zahl. Damit Sie sich nicht die Zahlen merken mssen, gibt es festgelegte Konstanten, die diese Zahlen reprsentieren. Ihre Namen sind selbsterklrend: vbAbort, vbCancel, vbIgnore, vbNo, vbOK, vbRetry und vbYes.
8.2.3
Zeichen Information
Zeichen Info
Zur Erluterung:
Ein Bild (hier der Buchstabe i fr Information) kann auch allein eingesetzt werden. In diesem Fall wird die einfache MsgBox mit dem Button OK dargestellt.
8.2.4
System-modal
Modal
235
Zur Erluterung:
vbSystemModal
Der Button OK und die Eigenschaft system-modal werden durch Or miteinander verknpft. Das Dialogfeld bleibt immer im Vordergrund, auch wenn der Benutzer die Anwendung wechselt.
8.2.5
Zur Erluterung:
Ja oder Nein
Die beiden Buttons Ja und Nein werden mit dem Fragezeichen verknpft. Der Benutzer muss die Frage beantworten. Die Antwort wird mit Hilfe einer Verzweigung ausgewertet. Im vorliegenden Programm werden lediglich zwei unterschiedliche Meldungen ausgegeben. Man knnte mit der Auswertung der beiden Antworten zwei unterschiedliche Ablufe einleiten.
Verzweigung
236
8.2
8.2.6
Ein Beispiel mit Buttons fr Ja, Nein und Abbrechen. Diesmal ist der zweite Button der Default-Button:
Zur Erluterung:
Die drei Buttons Ja, Nein und Abbrechen werden verknpft mit dem Verhalten DefaultButton2. Bettigt der Benutzer also die Taste (), so entspricht dies der Antwort Nein bzw. dem zweiten Button. Da der Benutzer drei Mglichkeiten hat, muss seine Antwort gespeichert werden.
DefaultButton
237
8
Mehrfache Verzweigung
Die Antwort wird anschlieend mit Hilfe einer mehrfachen Verzweigung ausgewertet.
8.2.7
Kritische Warnung
Ein Beispiel mit den Buttons Wiederholen und Abbrechen sowie dem Zeichen fr kritische Warnung:
Zur Erluterung:
Die beiden Buttons Wiederholen und Abbrechen werden mit dem Zeichen fr kritische Warnung verknpft.
8.2.8
Achtung
Abbildung 8.14 zeigt ein Beispiel mit den drei Buttons Abbrechen, Wiederholen und Ignorieren sowie dem Zeichen fr Achtung. Der zugehrige Code lautet:
Sub MsgBoxAbortRetryIgnore() Dim Antwort As Integer Antwort = MsgBox("Beim Sichern trat ein Fehler auf." _
238
Zeichenketten
8.3
& vbCrLf & "Wollen Sie den Vorgang abbrechen?" _ & vbCrLf & "Wollen Sie den Vorgang wiederholen?" _ & vbCrLf & "Wollen Sie die Info ignorieren?", _ vbAbortRetryIgnore Or vbExclamation, _ "Fehler bei Sicherung") If Antwort = vbAbort Then MsgBox "Sie wollen den Vorgang abbrechen" ElseIf Antwort = vbRetry Then MsgBox "Sie wollen den Vorgang wiederholen" Else MsgBox "Sie wollen die Info einfach ignorieren" End If End Sub
Zur Erluterung:
Die drei Buttons Abbrechen, Wiederholen und Ignorieren werden mit dem Zeichen fr einen deutlichen Hinweis verknpft.
8.3
Zeichenketten
Aus der Vielzahl der Zeichenkettenfunktionen sollen im nachfolgenden Beispiel stellvertretend einige VBA- und Worksheet-Funktionen erlutert werden. Es werden der Inhalt und die Position einer Teilzeichenkette ermittelt. Auerdem wird eine Teilzeichenkette durch eine andere ersetzt. Nehmen wir an, die beiden Zellen A1 und A2 haben folgenden Inhalt:
Sub Zeichenketten() Dim s As String Dim pos As Integer Dim such As String Dim lg As Integer
Teilzeichenkette
239
ThisWorkbook.Worksheets("Tabelle1").Activate s = Range("A1").Value such = Range("A2").Value lg = Len(such) ' VBA-Funktionen MsgBox "Erste drei Zeichen: " & Left(s, 3) MsgBox "Position von " & such & ": " & InStr(s, such) ' Worksheet-Funktionen pos = Application.WorksheetFunction.Search(such, s) MsgBox "Position von " & such & ": " & pos MsgBox Application.WorksheetFunction.Replace _ (s, pos, lg, "WELT") End Sub
Zur Erluterung:
In der Variablen s wird die zu untersuchende Zeichenkette aus der ersten Tabellenzelle gespeichert. In der Variablen such wird die gesuchte Teilzeichenkette aus der zweiten Tabellenzelle gespeichert. Die VBA-Funktion Len() ermittelt die Lnge einer Zeichenkette, inklusive aller Leerzeichen. Die VBA-Funktion Left() liefert eine Teilzeichenkette, beginnend mit dem ersten Zeichen. Die Lnge der Teilzeichenkette muss angegeben werden. Auf die gleiche Art und Weise knnen Sie mit den VBAFunktionen Right() und Mid() Teilzeichenketten vom Ende oder aus der Mitte extrahieren.
Len()
Abbildung 8.16
240
Zeichenketten
8.3
InStr()
Die VBA-Funktion InStr() ermittelt die Position einer gesuchten Teilzeichenkette. Das erste Zeichen hat die Position 1. Die Worksheet-Funktion Search() macht das Gleiche wie InStr(). Bei InStr() knnen Sie aber noch die Art des Vergleichs whlen.
Search()
Abbildung 8.17
Die Worksheet-Funktion Replace() dient zum Ersetzen einer Teilzeichenkette durch eine andere. Es werden folgende Parameter bentigt:
Original-Zeichenkette Position, ab der ersetzt werden soll Anzahl der Zeichen, die ersetzt werden sollen neue Teilzeichenkette, die anstelle der alten Teilzeichenkette eingesetzt werden soll
Abbildung 8.18
8.3.1
Zeichenketten umwandeln
Erkennen, umwandeln
In Tabellenzellen knnen bekanntlich Zeichenketten oder Zahlen stehen. Zahlen knnen auch als Datumsangaben formatiert sein. Die Zellinhalte knnen Sie in Variablen des passenden Datentyps umwandeln, wenn man Sie ihren Typ bzw. ihre Formatierung erkennen. Zur Erkennung knnen Sie die Funktionen IsNumeric() und IsDate() nutzen, zur Umwandlung die Funktionen CDbl() und CDate(). Ein Beispiel:
Sub Umwandeln() Dim x As Double Dim d As Date Dim s As String Dim i As Integer
241
ThisWorkbook.Worksheets("Tabelle1").Activate For i = 1 To 4 If IsNumeric(Cells(i, 2).Value) Then x = CDbl(Cells(i, 2).Value) Cells(i, 3).Value = "Zahl" ElseIf IsDate(Cells(i, 2).Value) Then d = CDate(Cells(i, 2).Value) Cells(i, 3).Value = "Datum" Else s = Cells(i, 2).Value Cells(i, 3).Value = "Zeichenkette" End If Next i End Sub
Das Ergebnis:
Zur Erluterung:
IsNumeric(), CDbl()
Falls die Funktion IsNumeric() feststellt, dass der Zellinhalt eine Zahl ist, dann wird er mit der Funktion CDbl() in eine Double-Variable umgewandelt. Wird mit Hilfe der Funktion IsDate() festgestellt, dass es sich um eine Datumsangabe handelt, dann wird der Zellinhalt mit der Funktion CDate() in eine Variable vom Typ Date umgewandelt. Ansonsten wird der Zellinhalt einer String-Variablen zugewiesen. Anschlieend kann die Anwendung mit den Variablen des korrekten Datentyps weiterarbeiten.
IsDate(), CDate()
8.3.2
Format()
Ausgabeformatierung
Die Eigenschaft NumberFormatLocal zur landesspezifischen Formatierung von Zahlen- und Datumsangaben in Tabellenzellen wurde bereits vorgestellt. Zahlen, Datumsangaben und Texte knnen mit der Zeichen-
242
Zeichenketten
8.3
kettenfunktion Format() auch fr Ausgaben in Dialogfeldern passend formatiert werden. Bisher ist als Dialogfeld nur die Funktion MsgBox() bekannt. Die nachfolgend vorgestellten Mglichkeiten gelten aber fr alle Arten von Dialogfeldern. Sie werden besonders fr die eigenen Dialogfelder (siehe Abschnitt 10.2, Eigene Dialogfelder und Anwendungen) hufig genutzt. Einige Beispiele:
Sub Formatieren() Dim x As Single, y As Single Dim d As Date ' Dezimalstellen x = 13 / 7 MsgBox Format(x, "0.00") ' Angaben in Prozent x = 1 / 7 MsgBox Format(x, "0.00
%")
' Texte, Tausenderpunkt x = 1399.95 y = 29.95 MsgBox Format(x, "#,##0.00 ") & _ vbCrLf & Format(y, "#,##0.00 ") ' Datumsangabe d = "12.4.2010" MsgBox d & vbCrLf & Format(d, "d.m.yy") & _ vbCrLf & Format(d, "dddd, dd.mm.") & _ vbCrLf & Format(d, "dd. mmmm yyyy") End Sub
Zur Erluterung:
Der zweite Parameter der Funktion Format() ist eine Zeichenkette. Darin wird das gewnschte Format in englischer Schreibweise angegeben. Das Zeichen 0 steht fr einzelne Ziffern. Die betreffende Ziffer wird immer dargestellt. Die Dezimalstellen werden durch einen Punkt abgetrennt. Es wird auf die angegebene Zahl von Dezimalstellen gerundet.
243
Das Prozentzeichen sorgt dafr, dass die Zahl durch 100 geteilt und mit einem Prozentzeichen dargestellt wird.
Das Zeichen # steht fr einzelne Ziffern, aber nur, falls die Zahl die entsprechende Gre hat. Das Komma sorgt fr die Darstellung des Tausenderpunkts. Text, z. B. Whrungsangaben, knnen zusammen mit der Zahl ausgegeben werden.
Rechtsbndig
Hinweis
Eine rechtsbndige Darstellung der Zahlen ist mglich. Da der Text in einer MsgBox allerdings in einer Proportionalschriftart ausgegeben wird (die Zeichen sind unterschiedlich breit), wrde dies nicht dazu fhren, dass die Kommata verschieden groer Zahlen genau untereinander stehen. Dies ist aber innerhalb von Steuerelementen in eigenen Dialogfeldern mglich (siehe Abschnitt 10.2, Eigene Dialogfelder und Anwendungen).
Das Standardausgabeformat fr Datumsangaben (ohne spezielle Angabe) ist dd.mm.yyyy, also zwei Ziffern fr den Tag, zwei Ziffern fr den Monat und vier Ziffern fr das Jahr. Das Format dddd fhrt zur
244
Zeichenketten
8.3
Ausgabe des Tagesnamens, mit Hilfe von yyyy knnen Sie den Monatsnamen ausgeben.
Abbildung 8.23
Datumsformatierung
8.3.3
Datenstze zusammenfgen
Join()
Fr einen Export von Daten ist es hufig notwendig, die Datenstze vorher zusammenzufgen. Dies bernimmt die Funktion Join(). Sie wandelt ein eindimensionales Datenfeld in eine Zeichenkette um. Die einzelnen Daten eines Datensatzes werden dabei durch definierte Zeichen getrennt. Ein Beispiel:
Sub DatensaetzeZusammenfuegen() Dim i As Integer Dim T(1 To 3) As String ThisWorkbook.Worksheets("Tabelle3").Activate For i = 1 To 3 T(i) = Cells(1, i).Value Next i Cells(2, 1).Value = Join(T, "#") End Sub
Das Ergebnis:
Zur Erluterung:
Es wird ein Datenfeld mit drei Elementen deklariert. Die Daten eines Datensatzes stehen im vorliegenden Beispiel in drei Zellen nebeneinander. Sie werden den einzelnen Feldelementen zugewiesen.
245
8
Datenfeld umwandeln Trennzeichen
Die Funktion Join() fgt die Elemente des Datenfelds zu einer Zeichenkette zusammen, getrennt von dem Zeichen #. Falls kein Trennzeichen angegeben wird, dann wird ein Leerzeichen zum Trennen verwendet.
8.3.4
Split()
Datenstze zerlegen
Fr einen Import von Daten ist es meist notwendig, die Datenstze vorher zu zerlegen. Die Funktion Split() kehrt dabei die Arbeitsweise der Funktion Join() um. Sie wandelt eine Zeichenkette in ein eindimensionales Datenfeld um. Die einzelnen Daten eines Datensatzes mssen zur Erkennung der Bestandteile durch ein definiertes Zeichen getrennt sein. Ein Beispiel:
Sub DatensaetzeZerlegen() Dim i As Integer Dim T() As String ThisWorkbook.Worksheets("Tabelle3").Activate T = Split(Cells(4, 1).Value, "#") For i = 0 To 2 Cells(5, i + 1).Value = T(i) Next i End Sub
Das Ergebnis:
Zur Erluterung:
Es wird ein dynamisches Datenfeld (mit variabler Gre) deklariert. Die Funktion Split() zerlegt die Zeichenkette und weist das Ergebnis dem Datenfeld zu. Als Trenner wird das Zeichen # genutzt. Das erste Element hat den Index 0. Falls Sie kein Trennzeichen angeben, wird ein Leerzeichen zum Erkennen verwendet. Anschlieend werden die einzelnen Feldelemente in drei Zellen nebeneinander geschrieben. Dabei ist darauf zu achten, dass das erste Element den Index 0 hat.
Zeichenkette zerlegen
Trennzeichen
246
8.4
8.4
Es gibt zahlreiche VBA- und Worksheet-Funktionen zum Rechnen mit Datum und Uhrzeit. Einige Funktionen werden nachfolgend erlutert.
8.4.1
Zeitintervall addieren
DateAdd()
Die VBA-Funktion DateAdd() rechnet zu einer Uhrzeit eine gegebene Anzahl an Minuten hinzu:
Sub UhrzeitAddieren() ThisWorkbook.Worksheets("Tabelle1").Activate Range("E3").Value = DateAdd("n", _ Range("E2").Value, Range("E1").Value) Range("E1,E3").NumberFormatLocal = "hh:mm" End Sub
Das Ergebnis:
Zur Erluterung:
Die Funktion DateAdd() dient zum Addieren eines Zeitintervalls (zweiter Parameter) zu einer Zeitangabe (dritter Parameter). Die Einheit des Zeitintervalls wird im ersten Parameter angegeben. Es gibt folgende Mglichkeiten:
yyyy: Jahr q: Quartal m: Monat y: Tag des Jahres d: Tag w: Wochentag ww: Woche h: Stunde n: Minute s: Sekunde
247
Im vorliegenden Beispiel wird zur Uhrzeit 15:38 Uhr ein Zeitintervall von 90 Minuten addiert, das Ergebnis ist 17:08 Uhr. Die beiden Zellen mit den Uhrzeitangaben werden zustzlich passend formatiert.
8.4.2
DateDiff()
Zeitdifferenz berechnen
Mit Hilfe der VBA-Funktion DateDiff() wird die Differenz von zwei Uhrzeiten berechnet:
Sub UhrzeitSubtrahieren() ThisWorkbook.Worksheets("Tabelle1").Activate Range("F3").Value = DateDiff("n", _ Range("F2").Value, Range("F1").Value) Range("F3").NumberFormatLocal = "0" End Sub
Das Ergebnis:
Zur Erluterung:
Zeitdifferenz berechnen Zeiteinheit
Die Funktion DateDiff() dient zum Berechnen der Differenz von zwei Zeitangaben (zweiter und dritter Parameter). Die Einheit der Zeitdifferenz wird im ersten Parameter angegeben. Dafr gibt es die gleichen Mglichkeiten wie bei DateAdd().
8.4.3
DateSerial()
Die Funktion DateSerial() dient zur Erstellung einer Datumsangabe, die Funktion Weekday() zur Feststellung des Wochentags einer Datumsangabe. Nachfolgend werden die beiden Funktionen genutzt, um die Tage des Wochenendes besonders hervorzuheben:
Sub WochenendeHervorheben() Dim i As Integer Dim Datum As Date ThisWorkbook.Worksheets("Tabelle1").Activate For i = 1 To 31
248
8.4
Datum = DateSerial(2010, 3, i) Cells(i, 7).Value = Datum Cells(i, 7).NumberFormatLocal = "TT.MM.JJ" If Weekday(Datum) = 7 Then Cells(i, 7).Interior.Color = vbYellow ElseIf Weekday(Datum) = 1 Then Cells(i, 7).Interior.Color = vbGreen Else Cells(i, 7).Interior.Pattern = xlNone End If Next i End Sub
Das Ergebnis:
Zur Erluterung:
Es werden alle Daten des Monats Mrz 2010 untereinander aufgelistet. Dazu wird eine Schleife von 1 bis 31 durchlaufen. Innerhalb der Schleife wird mit der Funktion DateSerial() jeweils ein Datum gebildet. Die drei Parameter der Funktion DateSerial() sind: Jahr, Monat und Tag. Das Datum wird mit der Eigenschaft NumberFormatLocal formatiert ausgegeben. Die Funktion Weekday() liefert einen der folgenden Werte: 1 = Sonntag, 2 = Montag usw. bis 7 = Samstag. Im Beispiel werden Samstage und Sonntage besonders hervorgehoben.
Datum bilden
Weekday()
8.4.4
Jahreskalender
Das vorherige Beispiel lsst sich leicht zu einem Jahreskalender erweitern. Es kommen zwei Funktionen hinzu:
249
8
Day() EoMonth()
die VBA-Funktion Day() zur Ermittlung des Tages eines Monats die Worksheet-Funktion EoMonth() zur Bestimmung des letzten Tages eines bestimmten Monats
Zur Erluterung:
Abbildung 8.29
250
8.4
ScreenUpdating
Der Aufbau des Jahreskalenders nimmt anschlieend einige Momente in Anspruch. Sie knnen den Ablauf etwas schneller gestalten, wenn Sie die Bildschirmaktualisierung ausschalten. Dies erreichen Sie ber Application.ScreenUpdating = False. Fr weitere Anwendungen mssen Sie am Ende die Bildschirmaktualisierung wieder einschalten (= True). Es wird eine neue Arbeitsmappe fr den Jahreskalender angelegt. Diese kann der Benutzer spter an der gewnschten Stelle speichern. Innerhalb der ueren Schleife werden alle zwlf Monate des Jahres durchlaufen. Fr jeden Monat wird mit Hilfe der Funktion DateSerial() das Datum des Monatsersten bestimmt. Dieses Datum wird von der Worksheet-Funktion EoMonth() bentigt, um das Datum des Monatsletzten zu bestimmen. Die Funktion Day() liefert nur den Tag eines Datums, hier den Tag des Monatsletzten. Damit wei man, wie viele Tage der betreffende Monat hat. Es gibt auch die Funktionen Month() und Year(), die nur den Monat bzw. das Jahr eines Datums liefern. Die innere Schleife durchluft jeden Tag des jeweiligen Monats. Mit der Funktion DateSerial() wird jedes einzelne Datum gebildet und in der zugehrigen Zelle formatiert ausgegeben. Wie im vorherigen Beispiel werden mit Hilfe der Funktion Weekday() die Wochenendtage besonders hervorgehoben.
EoMonth()
Weekday()
Das Ergebnis:
Da es die Funktion EoMonth() erst seit Excel 2007 gibt, sehen Sie im folgenden Code die wichtigen Zeilen der Prozedur Jahreskalender() in einer Version fr Excel-Versionen vor Excel 2007, mit einem Aufruf der eigenen Funktion Monatsende() aus Abschnitt 5.3.3:
Sub Jahreskalender() ...
251
Workbooks.Open ThisWorkbook.Path & "\Mappe5.xls" ... For Monat = 1 To 12 DatumErster = DateSerial(Jahr, Monat, 1) AnzahlTage = Application.Run _ ("Mappe5.xls!Modul1.Monatsende", Jahr, Monat) For Tag = 1 To AnzahlTage ...
Zur Erluterung:
Die Excel-Datei Mappe5.xls wird geffnet. Die Funktion Monatsende() aus Modul1 der Datei Mappe5.xls wird mit den Parametern Jahr und Monat aufgerufen und liefert die Anzahl der Tage des betreffenden Monats.
8.5
Weitere Funktionen
In diesem Abschnitt werden einige Funktionen erlutert, die nicht zu den obengenannten Gruppen gehren.
8.5.1
Timer()
Anwendung unterbrechen
Mit Hilfe der VBA-Funktion Timer() wird die Anzahl der Sekunden seit Mitternacht berechnet. Sie knnen diese Funktion dazu nutzen, eine Anwendung zu unterbrechen, siehe folgendes Beispiel:
Sub ZeitVerzoegerung() Dim start As Double MsgBox "Nach dem Drcken des Ok-Buttons luft die Zeit" start = Timer Do DoEvents Loop Until Timer > start + 5 MsgBox "Das waren 5 Sekunden" End Sub
Zur Erluterung:
Der aktuelle Zeitpunkt wird mit Hilfe der Funktion Timer() in der Variablen start gespeichert.
252
Weitere Funktionen
8.5
Programm wartet
Nach Besttigung der MsgBox luft die Zeit. Es wird eine Do-WhileSchleife gestartet, die so lange luft, bis mit der Funktion Timer() ein Zeitpunkt ermittelt wurde, der 5 Sekunden nach dem Beginn der Schleife liegt. Innerhalb der Schleife kann (muss aber nicht) die Funktion DoEvents() aufgerufen werden. Sie ermglicht andere Aktionen whrend der Zeit, in der die Schleife luft. Sie knnen die Funktion DoEvents() dazu verwenden, Berechnungen im Hintergrund auszufhren oder Aktionen des Benutzers (z. B. Tastendrucke) abzuwarten.
DoEvents()
8.5.2
Einheitenumrechnung
Convert()
Die Worksheet-Funktion Convert() bietet eine groe Anzahl an Umrechnungsmglichkeiten fr physikalische Einheiten. Es gibt sie erst seit Excel 2007. Dabei knnen Sie auch Einheiten mit Prfix nutzen, wie z. B. das k fr den Faktor 1.000 wie bei km. Die folgenden vier Zahlenwerte (Angaben fr Entfernung, Energie, Temperatur und Druck) werden in eine andere Einheit umgerechnet. Gleichzeitig werden sie zur deutlicheren Darstellung, zusammen mit den Ergebnissen der Umrechnung, formatiert:
Prfix
253
' Entfernung Range("A2").Value = Application.WorksheetFunction. _ Convert(Range("A1").Value, "km", "mi") Range("A1").NumberFormatLocal = "0,000 ""Km""" Range("A2").NumberFormatLocal = "0,000 ""Miles""" ' Energie Range("A5").Value = Application.WorksheetFunction. _ Convert(Range("A4").Value, "J", "cal") Range("A4").NumberFormatLocal = "0,00 ""J""" Range("A5").NumberFormatLocal = "0,000 ""cal""" ' Temperatur Range("A8").Value = Application.WorksheetFunction. _ Convert(Range("A7").Value, "C", "F") Range("A7").NumberFormatLocal = "0,0 ""Grad C""" Range("A8").NumberFormatLocal = "0,0 ""Grad F""" ' Druck Range("A11").Value = Application.WorksheetFunction. _ Convert(Range("A10").Value, "hPa", "mmHg") Range("A10").NumberFormatLocal = "0,000 ""hPa""" Range("A11").NumberFormatLocal = "0,000 ""mm HG""" End Sub
Zur Erluterung:
Meter zu Meile
Im ersten Fall wird eine Entfernungsangabe aus Metern in britische Meilen umgerechnet. Dazu sind die Angaben km und mi in Parameter 2 und 3 notwendig. Der Prfix k sorgt dafr, dass der Wert in Kilometern angenommen wird.
Meter zu Meile
Eine Energieangabe wird im zweiten Fall aus Joule in Kalorie umgerechnet. Dazu sind die Angaben J und cal in Parameter 2 und 3 notwendig.
254
Weitere Funktionen
8.5
Abbildung 8.33
Im dritten Fall wird eine Temperaturangabe aus Grad Celsius (C) in Grad Fahrenheit (F) umgerechnet.
Abbildung 8.34
Die letzte Umrechnung ermittelt eine (Luft-)Druckangabe in mm Quecksilbersule (mmHg) aus Hektopascal (hPa). Das h ist dabei der Prfix fr Hekto, also hundert.
Abbildung 8.35
Alle Zellen wurden passend formatiert. Zur Erinnerung: Eine Textangabe innerhalb eines Formats muss in zweifachen doppelten Anfhrungsstrichen stehen.
8.5.3
Zahlensystemumrechnung
Umrechnung
Insgesamt 12 verschiedene Worksheet-Funktionen helfen (seit Excel 2007) bei der Umrechnung zwischen den verschiedenen Zahlensystemen (dezimal, hexadezimal, binr, oktal). Ihre Funktionsweise soll am Beispiel der Funktionen Dec2Bin() und Dec2Hex() gezeigt werden.
Sub BinaerHexadezimal() Dim i As Integer ThisWorkbook.Worksheets("Tabelle2").Activate For i = 1 To 10 Cells(i, 3).Value = Application. _ WorksheetFunction.Dec2Bin(Cells(i, 2).Value)
255
Cells(i, 4).Value = Application. _ WorksheetFunction.Dec2Hex(Cells(i, 2).Value) Next i Range("D1:D10").NumberFormatLocal = "x@" Range("D1:D10").HorizontalAlignment = xlRight End Sub
Das Ergebnis:
Zur Erluterung:
Es werden die Dezimalzahlen 60 bis 69 in Spalte B umgerechnet. In einer Schleife werden die Ergebnisse der Umrechnungsfunktion Dec2Bin() in Spalte C, die Ergebnisse der Umrechnungsfunktion Dec2Hex() in Spalte D dargestellt. Die hexadezimalen Ziffern stellen fr Excel Text dar. Der Text wird zur deutlicheren Kennzeichnung als hexadezimale Zahl mit dem Prfix x versehen und rechtsbndig formatiert.
Dec2Bin(), Dec2Hex()
Prfix x
Formatierung @
Beim Einsatz der Eigenschaft NumberFormatLocal wird die Formatierung @ verwendet. Diese steht fr den Zellwert. In diesem Fall wird also ein x, gefolgt vom Zellwert, dargestellt.
8.5.4
Zelltyp zhlen
Zellen zhlen
Die beiden Worksheet-Funktionen Count() und CountBlank() sind ntzlich, falls Sie feststellen mchten, wie viele Zahlen oder leere Zellen sich in einem Zellbereich befinden.
256
Weitere Funktionen
8.5
Sub Zaehlen() ThisWorkbook.Worksheets("Tabelle2").Activate Range("E6").Value = Application. _ WorksheetFunction.Count(Range("E1:E5")) Range("E10").Value = Application. _ WorksheetFunction.CountBlank(Range("E1:E9")) End Sub
Das Ergebnis:
Zur Erluterung:
Die Funktion Count() ermittelt, wie viele Zellen des Bereichs E1 bis E5 Zahlen oder Datumsangaben enthalten. Im Beispiel trifft dies fr die Zellen E1 und E4 zu. Die Funktion CountBlank() zhlt die Anzahl der leeren Zellen im Bereich E1 bis E9. Im Beispiel trifft dies fr die Zellen E7 bis E9 zu.
Count()
CountBlank()
257
Der automatisierte Import und Export von Daten aus anderen Anwendungen ist eine besondere Strke von VBA.
Externe Daten
In diesem Kapitel erfahren Sie, wie Sie Daten aus anderen Programmen in Excel importieren bzw. aus Excel in andere Programme exportieren.
9.1
Das Lesen und Schreiben von Textdateien ist im Zusammenhang mit dem Import und Export von Daten aus anderen Anwendungen wichtig. Dazu mssen die Textdateien zu Beginn geffnet und nach dem Leseoder Schreibvorgang wieder geschlossen werden. Kann eine Datei nicht zum Lesen geffnet werden, z. B. wegen einer falschen Pfadangabe, dann tritt ein Laufzeitfehler auf. Das Gleiche passiert, falls eine Datei nicht zum Schreiben geffnet werden kann, z. B. aufgrund mangelnder Schreibrechte. Solche Laufzeitfehler sind in der Praxis hufig, daher werden sie in den nachfolgenden Beispielen abgefangen.
Fehler abfangen
9.1.1
Zunchst das einfache Lesen aller Zeilen aus einer Textdatei. Diese hat folgenden Inhalt:
259
Externe Daten
Sub ZeilenLesen() Dim Zeile As String Dim i As Integer ThisWorkbook.Worksheets("Tabelle1").Activate On Error GoTo Fehler ' Datei ffnen zum Lesen Open ThisWorkbook.Path & "\ein.txt" For Input As 1 i = 1 ' Solange bis Datei-Ende Do Until EOF(1) ' Zeile lesen Line Input #1, Zeile Cells(i, 1).Value = Zeile i = i + 1 Loop ' Datei schlieen Close 1 Exit Sub Fehler: MsgBox (Err.Description) End Sub
Das Ergebnis:
Zur Erluterung:
Open
Die Anweisung Open dient zum ffnen von Dateien. Im vorliegenden Beispiel wird die Datei ein.txt geffnet. Beide Dateien, also die ExcelDatei mit diesem Importprogramm und die Textdatei mit den Daten, befinden sich im gleichen Verzeichnis.
260
9.1
Input, Output, Append
Nach dem Dateinamen folgt der ffnungsmodus. Bei Textdateien gibt es u. a. Input (zum Lesen), Output (zum berschreiben) und Append (zum Anhngen). Nach dem Schlsselwort As folgt eine Dateinummer. Im weiteren Verlauf der Anwendung wird die geffnete Datei ber diese eindeutige Dateinummer reprsentiert. Es folgt eine Schleife, die so lange luft, bis die Funktion EOF() den Wert True ergibt. Die Vorgnge in der Schleife werden also so lange durchgefhrt, bis das Dateiende (End of File) erreicht ist. Mit der Anweisung Line Input wird eine Zeile aus der Datei 1 bis zum Zeilenende gelesen und in der Variablen Zeile gespeichert. Der Inhalt dieser Zeile wird anschlieend in eine Zelle ausgegeben. Dabei werden Zeichenketten, ganze Zahlen und Datumsangaben richtig erkannt. Bei Zahlen mit Nachkommastellen ist zu beachten:
As Dateinummer
EOF()
Line Input
Wird eine Zahl mit Punkt als Dezimalzeichen aus der Datei gelesen, so wird sie in Excel als Zahl erkannt und formatiert. Wird eine Zahl mit Komma als Dezimalzeichen aus der Datei gelesen, so wird sie in Excel auch als Zahl erkannt, aber als Text formatiert. In beiden Fllen kann mit der erkannten Zahl weitergerechnet werden, unabhngig vom Format.
Mit Hilfe der Laufvariablen i sorgen Sie dafr, dass die nchste Zeile in der Zelle darunter ausgegeben wird usw. Zu guter Letzt wird die Datei 1 durch die Anweisung Close wieder geschlossen.
Close
9.1.2
Sie knnen einfach aufgebaute Textdateien mit dem TextkonvertierungsAssistenten von Excel ffnen und die Daten in einem Tabellenblatt abspeichern. Falls allerdings noch weitere Programmlogik eingebaut werden muss, um z. B. eine spezielle Datenauswahl durchzufhren, dann kommen Sie nicht an einem eigenen Importprogramm vorbei. Das folgende Programm soll als Grundgerst fr ein solches Import-Programm dienen. Es liest sogenannte CSV-Dateien (CSV = Comma-separated Values). Das sind Textdateien, in denen ein Datensatz pro Zeile steht. Die Daten des Datensatzes sind durch festgelegte Zeichen (z. B. Semikolon) voneinander getrennt (siehe Abbildung 9.3).
CSV-Datei
261
Externe Daten
Die Textdatei kann die Dateiendung .txt haben. Hufig wird auch die Dateiendung .csv verwendet. Zum Einlesen der Zeilen kommt das Zerlegen der Zeilen in die einzelnen Daten hinzu. Dies wird mit der bereits bekannten Funktion Split() durchgefhrt. Anschlieend werden die Daten bersichtlich auf einem Tabellenblatt angeordnet:
Sub DatensaetzeLesen() Dim Zeile As String Dim T() As String Dim i As Integer, k As Integer ThisWorkbook.Worksheets("Tabelle2").Activate On Error GoTo Fehler ' Datei ffnen zum Lesen Open ThisWorkbook.Path & "\eindaten.txt" _ For Input As 1 i = 1 ' Solange bis Datei-Ende Do Until EOF(1) ' Zeile lesen Line Input #1, Zeile ' Zeile zerlegen T = Split(Zeile, ";") For k = 0 To UBound(T) Cells(i, k + 1).Value = T(k) Next k i = i + 1 Loop ' Datei schlieen Close 1 Range("A:E").Columns.AutoFit
262
9.1
Das Ergebnis:
Zur Erluterung:
Die Anwendung ist eine Erweiterung des vorherigen Beispiels Lesen aus Textdateien. An dieser Stelle werden nur die zustzlichen Komponenten erlutert. Es wird ein dynamisches Datenfeld deklariert. Dieses wird fr das Zerlegen der Zeilen bentigt. Nach dem Lesen einer Zeile wird die Zeile mit der Funktion Split() zerlegt und in dem dynamischen Datenfeld gespeichert. Alle Elemente des Datenfelds werden nebeneinander in einzelnen Zellen ausgegeben. Die Anzahl der Elemente eines Datensatzes und damit die Obergrenze des dynamischen Datenfelds werden mit der Funktion UBound() erkannt.
Programmerweiterung
Split()
UBound()
9.1.3
Schreiben in Textdateien
Excel-Daten schreiben
Es folgt zunchst das einfache Schreiben der in Abbildung 9.5 dargestelten Excel-Tabelleninhalte in eine Textdatei.
263
Externe Daten
Sub ZeilenSchreiben() Dim i As Integer ThisWorkbook.Worksheets("Tabelle1").Activate On Error GoTo Fehler ' Datei ffnen zum Schreiben Open ThisWorkbook.Path & "\aus.txt" _ For Output As 1 For i = 1 To 5 ' Zeile schreiben Print #1, Cells(i, 1).Value Next i ' Datei schlieen Close 1 Exit Sub Fehler: MsgBox (Err.Description) End Sub
Das Ergebnis:
Zur Erluterung:
Open
Die Datei aus.txt im gleichen Verzeichnis wird mit Hilfe von Open und Output zum Schreiben geffnet. Falls die Datei bereits existiert, wird sie ohne Vorwarnung berschrieben! Mit dem Dateimodus Append statt Output knnten Sie dafr sorgen, dass neue Inhalte ans Ende der Datei angehngt werden. Die Anweisung Print sorgt fr die Ausgabe einer Zeile in die Datei. Auch nach dem Schreiben muss die Datei mit Close wieder geschlossen werden.
berschreiben
Append
Print Close
264
9.1
9.1.4
Mit Excel ist auch das Abspeichern von Daten aus einem Tabellenblatt in einer Textdatei mglich. hnlich wie beim Import gilt allerdings: Falls weitere Programmlogik eingebaut werden muss, kommen Sie nicht an einem eigenen Exportprogramm vorbei. Das folgende Programm soll als Grundgerst fr ein solches Export-Programm dienen. Es schreibt sogenannte CSV-Dateien. Wie bereits erlutert: Das sind Dateien mit einem Datensatz pro Zeile. Die Daten des Datensatzes sind durch festgelegte Zeichen (z. B. Semikolon) voneinander getrennt. Das Schreiben von Datenstzen in Textdateien knnen Sie vereinfachen, indem Sie vorher die Daten zu einer Zeichenkette mit Trennzeichen zusammenfgen. Dazu nutzen Sie die bereits bekannte Funktion Join(). Zunchst die Tabelle:
CSV-Datei
Join()
Sub DatensaetzeSchreiben() Dim i As Integer, k As Integer Dim T(1 To 5) As String ThisWorkbook.Worksheets("Tabelle2").Activate On Error GoTo Fehler ' Datei ffnen zum Schreiben Open ThisWorkbook.Path & "\ausdaten.txt" _ For Output As 1 For i = 1 To 3 For k = 1 To 5 T(k) = Cells(i, k).Value Next k ' Zusammengefgte Zeile schreiben Print #1, Join(T, "#") Next i
265
Externe Daten
' Datei schlieen Close 1 Exit Sub Fehler: MsgBox (Err.Description) End Sub
Das Ergebnis:
Zur Erluterung:
In einer doppelten Schleife werden alle Daten der Tabelle gelesen. Nach jeder Zeile werden die Daten der betreffenden Zeile mit Hilfe der Funktion Join() und einem Trennzeichen (diesmal dem Zeichen #) zusammengefgt.
Join()
9.2
Dateifunktionen
Eine bersicht der Funktionen zum Arbeiten mit Dateien (und Verzeichnissen) findet sich in der Hilfe unter Visual Basic-Sprachverzeichnis/Indizes und Listen im Eintrag Verzeichnis und Datei. Einige wichtige Funktionen werden in diesem Abschnitt behandelt.
9.2.1
Dir()
Die Funktion Dir() ist sehr ntzlich zum Suchen von Dateien und zum Bearbeiten einer Liste von Dateien. In einer ersten Anwendung soll festgestellt werden, ob es in dem Verzeichnis, in dem sich die Anwendung befindet, eine Datei mit dem Namen text.txt gibt:
Sub DateiSuchen() ' Suche mit Suchmuster If Dir(ThisWorkbook.Path & "\test.txt") <> "" Then MsgBox "Datei test.txt gefunden" Else
266
9.2
Zur Erluterung:
Die Funktion Dir() liefert den Namen einer Datei, der dem angegebenen Suchmuster entspricht. Dabei knnen Sie auch Platzhalter fr einzelne Zeichen (?) oder mehrere Zeichen (*) verwenden. Im vorliegenden Beispiel wurde nach einem bestimmten Dateinamen, ohne Platzhalter, gesucht. Der Rckgabewert ist entweder der Name der Datei (falls sie existiert) oder eine leere Zeichenkette (falls die Datei nicht existiert).
Mit Hilfe der zweiten Anwendung wird eine Liste aller Dateien, die einem bestimmten Suchmuster entsprechen, ausgegeben:
Sub DateiListe() Dim DateiName As String Dim Ausgabe As String ' Suche mit Suchmuster DateiName = Dir(ThisWorkbook.Path & "\*.txt") Ausgabe = "" Do While DateiName <> "" Ausgabe = Ausgabe & " " & DateiName ' Suche mit ursprnglichem Suchmuster DateiName = Dir Loop MsgBox Ausgabe End Sub
267
Externe Daten
Zur Erluterung:
Mit Suchmuster
Zunchst wird die Funktion Dir() mit einem Parameter aufgerufen. Darin wird angegeben, dass nach Dateien mit der Dateiendung .txt gesucht wird. Der Name der ersten Datei, die dem Suchmuster entspricht, wird in der Variablen DateiName gespeichert (z. B. ein.txt). Anschlieend wird eine Schleife begonnen. Falls eine Datei gefunden wurde, dann ist die Variable DateiName nicht leer, also wird die Schleife durchlaufen. Der ermittelte Name wird in einer Ausgabevariablen gesammelt. Die Funktion Dir() wird innerhalb der Schleife erneut aufgerufen, diesmal ohne Parameter. Dies fhrt dazu, dass nach der nchsten Datei gesucht wird, die dem ursprnglichen Suchmuster entspricht. Auf diese Weise wird die Schleife so lange durchlaufen, bis alle Dateien, die dem gleichen Suchmuster entsprechen, erfasst wurden. Zu guter Letzt werden alle aufgesammelten Dateinamen ausgegeben.
9.2.2
Dateiinformationen
Es gibt eine Reihe von Funktionen, die Informationen ber Dateien ermitteln, z. B. nderungsdatum, Gre oder Dateiattribute. Diese kommen im nachfolgenden Programm zum Einsatz:
Sub DateiInformationen() Dim DateiName As String Dim DateiNameGanz As String Dim i As Integer ThisWorkbook.Worksheets("Tabelle1").Activate i = 1 ' Suche mit Suchmuster DateiName = Dir(ThisWorkbook.Path & "\*.txt") Do While DateiName <> "" DateiNameGanz = ThisWorkbook.Path & "\" & DateiName Cells(i, 1).Value = DateiName ' Letzte nderung Cells(i, 2).Value = FileDateTime(DateiNameGanz) Cells(i, 2).NumberFormatLocal = "TT.MM. hh:mm"
268
9.2
' Dateigre Cells(i, 3).Value = FileLen(DateiNameGanz) Cells(i, 3).NumberFormatLocal = "0 ""Byte""" ' Datei-Attribute If (GetAttr(DateiNameGanz) And vbReadOnly) > 0 Then Cells(i, 4).Value = "Ja" Else Cells(i, 4).Value = "Nein" End If i = i + 1 ' Suche mit ursprnglichem Suchmuster DateiName = Dir Loop End Sub
Das Ergebnis:
Zur Erluterung:
Wie im vorherigen Beispiel wird nach Dateien gesucht, die die Dateiendung .txt haben. Fr die nachfolgenden Funktionsaufrufe wird der vollstndige Name der Datei inklusive Pfad gespeichert. Die Funktion FileDateTime() liefert Datum und Uhrzeit der letzten nderung der Datei. Mit der Funktion FileLen() wird die Gre der Datei in Byte ermittelt. Die Funktion GetAttr() dient zur Ermittlung von Datei- und Verzeichnisattributen. Sie liefert eine Zahl, in der alle Attribute enthalten sind. Diese Zahl mssen Sie mit Hilfe des And-Operators bitweise mit dem gewnschten Attribut vergleichen. Das Ergebnis des Vergleichs ist grer als 0, falls das gewnschte Attribut vorliegt.
FileDateTime()
FileLen() GetAttr()
269
9
Dateiattribute
Externe Daten
Im vorliegenden Beispiel wird untersucht, ob die Datei (oder das Verzeichnis) schreibgeschtzt ist. Dazu wird mit der Konstanten vbReadOnly verglichen. Andere Konstanten dienen zur Ermittlung der folgenden Attribute:
vbHidden: Datei ist versteckt. vbSystem: Datei ist Systemdatei. vbDirectory: Es handelt sich um ein Verzeichnis. vbArchive: Datei wurde seit der letzten Sicherung gendert.
9.2.3
Dateioperationen
Von VBA aus knnen einige typische Dateioperationen mit Hilfe von Funktionen durchgefhrt werden. Dabei sollten Sie allerdings sehr umsichtig vorgehen, insbesondere beim Lschen von Dateien. Im folgenden Beispiel wird eine Datei kopiert, anschlieend umbenannt und zuletzt gelscht. Zwischen den einzelnen Schritten wird zur Kontrolle jeweils eine Liste der aktuell existierenden Dateien ausgegeben.
Sub DateiOperationen() Dim Pfad As String Pfad = ThisWorkbook.Path On Error GoTo Fehler DateiListe ' Datei kopieren FileCopy Pfad & "\ein.txt", Pfad & "\kopie.txt" DateiListe ' Datei umbenennen bzw. verschieben Name Pfad & "\kopie.txt" As Pfad & "\andere.txt" DateiListe ' Datei lschen Kill Pfad & "\andere.txt" DateiListe Exit Sub Fehler: MsgBox (Err.Description) End Sub
270
9.2
Zur Erluterung:
Zur Kontrolle der aktuell existierenden Dateien wird die eigene Prozedur DateiListe() verwendet, die in Abschnitt 9.2.1, Dateien suchen und auflisten, bereits erlutert wurde. Die Dateiliste zu Beginn:
Abbildung 9.11
Ausgangspunkt FileCopy()
Die Funktion FileCopy() kopiert eine Datei. Falls die Zieldatei bereits existiert, wird sie ohne Rckfrage berschrieben!
Abbildung 9.12
Die Funktion Name() dient zur Umbenennung bzw. zum Verschieben einer Datei.
Falls die Zieldatei bereits existiert, wird sie nicht berschrieben. Es kommt zu einem Laufzeitfehler. Falls sich die Zieldatei in einem anderen Verzeichnis befindet, wird die Datei verschoben und gegebenenfalls umbenannt.
Abbildung 9.13
Mit der Funktion Kill() werden eine oder mehrere Dateien, gegebenenfalls unter Benutzung eines Platzhalters, ohne Rckfrage gelscht!
271
Externe Daten
9.3
Eigene Konvertierung
Sie knnen Daten zwischen Excel und Word ber die Zwischenablage austauschen. Ebenso ist es mglich, Tabellen aus Excel in Word einzubetten usw. Wie bei einfachen Textdateien gilt allerdings: Falls noch weitere Programmlogik hinzugefgt werden muss, bietet sich ein VBA-Programm zum Datenaustausch an. In den folgenden Abschnitten wird zunchst kurz auf das Objektmodell von Word eingegangen. Anschlieend wird gezeigt, wie Sie Word aus Excel heraus starten und auf die Inhalte der Word-Dokumente zugreifen.
9.3.1
Es gibt Parallelen zwischen den hierarchischen Objektmodellen von Word und Excel:
Application CreateObject()
Das Hauptobjekt Application steht fr die Anwendung Word. Mit der Funktion CreateObject() knnen ActiveX-Objekte erstellt werden. Fr den Zugriff auf Word wird damit ein Objekt vom Typ Word.Application erstellt und ein Verweis auf dieses Objekt zurckgeliefert. ber diesen Verweis wird im weiteren Verlauf auf die Word-Anwendung zugegriffen. Am Ende muss die Word-Anwendung wieder beendet werden Eine Eigenschaft von Application ist die Auflistung Documents. Diese enthlt alle aktuell geffneten Dokumente in Word. Eine Eigenschaft eines einzelnen Dokuments ist die Auflistung Paragraphs. Sie enthlt alle Abstze eines Dokuments.
Documents
Paragraphs
Tables
Parallel dazu gibt es die Auflistung Tables, die alle Tabellen eines einzelnen Dokuments umfasst.
272
9.3
Cells
Eine Eigenschaft einer einzelnen Tabelle ist die Auflistung Cells, die alle Zellen der Tabelle enthlt. Eine einzelne Zelle kann, hnlich wie in Excel, ber ein Cell-Objekt erreicht werden. Mit Range wird auch in Word ein Bereich bezeichnet. Dieser kann einen oder mehrere Abstze ganz oder teilweise umfassen. Ebenso kann er Zellen einer Tabelle umfassen.
Range
Der Zugriff auf das Objektmodell fr Microsoft Word 2010 muss innerhalb der VBE von Excel zunchst eingerichtet werden. Im Men Extras Verweise muss dazu die Microsoft Word 14.0 Object Library eingebunden werden, siehe Abbildung 9.15. Im Fall von Word 2007 handelt es sich um die Microsoft Word 12.0 Object Library. Bei lteren Word-Versionen wird mit der Microsoft Word 10.0 Object Library gearbeitet, auerdem haben die Import- und ExportDateien die Endung .doc statt .docx.
Bibliothek einbinden
9.3.2
Im nchsten Beispiel werden die nachfolgenden Abstze eines WordDokuments gelesen und jeweils in einer Zelle eines Excel-Tabellenblatts gespeichert:
273
Externe Daten
Sub WordAbsatzImport() Dim appWord As Word.Application Dim i As Integer Dim tx As String ThisWorkbook.Worksheets("Tabelle1").Activate ' Anwendung Word starten Set appWord = CreateObject("Word.Application") ' Word sichtbar machen ' appWord.Visible = True ' Word-Dokument ffnen appWord.Documents.Open ThisWorkbook.Path & "\ein.docx" For i = 1 To 6 ' Text eines Absatzes inkl. Absatzende tx = appWord.ActiveDocument.Paragraphs(i).Range.Text ' Absatzende lschen, Text in Zelle schreiben Cells(i, 1).Value = Left(tx, Len(tx) 1) Next i ' Anwendung Word beenden appWord.Quit End Sub
274
9.3
Das Ergebnis:
Zur Erluterung:
Die Variable appWord wird als Objekt vom Typ Word.Application (Word-Anwendung) deklariert. Dieser Objekttyp (und alle anderen Word-spezifischen Objekttypen) stehen nur zur Verfgung, wenn die Word-Bibliothek eingebunden wurde, siehe vorheriger Abschnitt. Mit Hilfe der Funktion CreateObject() wird ein Objekt vom Typ Word.Application erstellt und ein Verweis auf dieses Objekt zurckgeliefert. ber diesen Verweis wird im weiteren Verlauf auf die Word-Anwendung zugegriffen. Man knnte die Anwendung Word sichtbar machen, indem man die Eigenschaft Visible auf True stellt. Das ist aber fr diesen Import nicht notwendig, daher wurden die Zeilen auskommentiert. Mit der Methode Open() des Documents-Objekts wird das angegebene Word-Dokument geffnet. Es wird damit zum aktiven Dokument. Innerhalb einer Schleife wird mit Hilfe von Paragraphs und Range jeweils auf den Text des gesamten Bereichs eines Absatzes des aktiven Dokuments (ActiveDocument) zugegriffen. Das Zeichen Absatzende ist Bestandteil dieses Texts. Es wird mit Hilfe der Zeichenkettenfunktionen Left() und Len() abgeschnitten. Der verbleibende Text wird in eine Excel-Tabellenzelle geschrieben. Die Anwendung Word wird mit der Methode Quit() wieder beendet.
Word.Application
CreateObject()
Visible
Open()
Paragraphs, Range
Absatzende
Quit()
9.3.3
Nachfolgend wird der gesamte Inhalt der nachfolgenden Word-Tabelle in einem Excel-Tabellenblatt gespeichert:
275
Externe Daten
Sub WordTabelleImport() Dim appWord As Word.Application Dim i As Integer, k As Integer Dim tb As Word.Table Dim tx As String ThisWorkbook.Worksheets("Tabelle2").Activate ' Anwendung Word starten Set appWord = CreateObject("Word.Application") ' Word-Dokument ffnen appWord.Documents.Open ThisWorkbook.Path _ & "\eindaten.docx" ' Erste Tabelle zuweisen Set tb = appWord.ActiveDocument.Tables(1) For i = 1 To tb.Rows.Count For k = 1 To tb.Columns.Count ' Text einer Tabellenzelle inkl. Zellenende tx = tb.Cell(i, k).Range.Text ' Zellenende lschen, Text in Zelle schreiben Cells(i, k).Value = Left(tx, Len(tx) 2) Next k Next i
276
9.3
Das Ergebnis:
Zur Erluterung:
Es wird ein Verweis auf ein Objekt vom Typ Word.Table deklariert. Der Verweis zeigt spter auf das erste Element der Auflistung Tables, also auf die erste Tabelle aus dem Word-Dokument. Die Eigenschaften Rows und Columns umfassen die Zeilen bzw. Spalten einer Tabelle. Die Eigenschaft Count liefert die jeweilige Anzahl und dient hier als Obergrenze fr die jeweilige Schleife. Es wird auf den Text des gesamten Bereichs einer Tabellenzelle zugegriffen. Eine einzelne Zelle wird mit Cell(Zeilennummer, Spaltennummer) identifiziert. Das Zeichen Zellenende ist Bestandteil dieses Texts. Es wird abgeschnitten. Der verbleibende Text wird in eine Excel-Tabellenzelle geschrieben.
Word.Table Tables
Rows, Columns
Cell
Zellenende
9.3.4
Die in Abbildung 9.20 dargestellten Inhalte eines Excel-Tabellenblatts sollen jeweils als Absatz in ein Word-Dokument geschrieben werden.
Sub WordAbsatzExport() Dim appWord As Word.Application Dim i As Integer ThisWorkbook.Worksheets("Tabelle1").Activate
277
Externe Daten
' Neues Word-Dokument erstellen appWord.Documents.Add For i = 1 To 5 ' Absatz hinzufgen appWord.ActiveDocument.Paragraphs.Add ' Absatz mit Text aus Excel-Zelle fllen appWord.ActiveDocument.Paragraphs(i). _ Range.Text = Cells(i, 1).Value Next i ' Word-Dokument speichern mit Dateiname appWord.ActiveDocument.SaveAs ThisWorkbook.Path _ & "\aus.docx" ' Anwendung Word beenden appWord.Quit End Sub
278
9.3
Zur Erluterung:
Die Methode Add() des Documents-Objekts ffnet ein neues WordDokument. Es wird damit zum aktiven Dokument. Innerhalb einer Schleife wird jeweils ein Absatz mit Hilfe der Methode Add() des Paragraphs-Objekts hinzugefgt. Jeder Absatz wird mit dem Inhalt einer Excel-Zelle gefllt. Das neue Word-Dokument wird mit der Methode SaveAs() unter dem Namen aus.docx im gleichen Verzeichnis wie die Excel-Arbeitsmappe, die diese Anwendung enthlt, gespeichert.
Documents.Add()
Paragraphs.Add()
9.3.5
Es sollen die Inhalte des nachfolgenden Excel-Tabellenblatts als Tabelle in ein Word-Dokument geschrieben werden:
Sub WordTabelleExport() Dim appWord As Word.Application Dim i As Integer, k As Integer Dim tb As Word.Table ThisWorkbook.Worksheets("Tabelle2").Activate ' Anwendung Word starten Set appWord = CreateObject("Word.Application") ' Neues Word-Dokument erstellen appWord.Documents.Add ' Neue Tabelle erstellen, mit Rahmen innen und auen Set tb = appWord.ActiveDocument.Tables.Add _ (appWord.ActiveDocument.Range(0), 3, 5) tb.Borders.InsideLineStyle = wdLineStyleSingle tb.Borders.OutsideLineStyle = wdLineStyleSingle
279
Externe Daten
For i = 1 To 3 For k = 1 To 5 ' Tabellenzelle mit Text aus Excel-Zelle fllen tb.Cell(i, k).Range.Text = Cells(i, k).Value Next k Next i ' Word-Dokument speichern mit Dateiname appWord.ActiveDocument.SaveAs ThisWorkbook.Path _ & "\ausdaten.docx" ' Anwendung Word beenden appWord.Quit End Sub
Das Ergebnis:
Zur Erluterung:
Es wird ein neues Word-Dokument geffnet. Dies ist nun das aktive Dokument. Mit Hilfe der Methode Add() der Auflistung Tables wird dem Dokument eine neue Tabelle in der gewnschten Gre hinzugefgt. Diese bentigt mindestens drei Parameter:
Tables.Add()
Range(0)
Ein Range-Objekt, das den Ort der neuen Tabelle bezeichnet. Mit Range(0) erreichen Sie den Anfang der Datei. Die nchsten beiden Parameter legen die Anzahl der Zeilen und die Anzahl der Spalten der neuen Tabelle fest.
280
9.4
Die Methode Add() liefert einen Verweis auf die neue Tabelle. Dieser Verweis wird nachfolgend fr den Zugriff auf die Tabelle genutzt. Die Eigenschaft Borders enthlt alle Rahmen fr die Tabelle. Die Eigenschaften, die mit Inside... bzw. mit Outside... beginnen, dienen zur Festlegung des Aussehens der inneren bzw. ueren Rahmenlinien. Im vorliegenden Fall stehen InsideLineStyle und OutsideLineStyle fr die Linienart und der Wert wdLineStyleSingle fr eine einfache Linie. Die Tabelle bekommt also einen einfachen Gitternetzrahmen. In einer doppelten Schleife werden alle Zellinhalte der Excel-Tabelle in die Zellen der Word-Tabelle bertragen. Dabei wird in der WordTabelle wiederum mit Cell(Zeilennummer, Spaltennummer) gearbeitet. Das neue Word-Dokument wird mit der Methode SaveAs() gespeichert, und die Anwendung Word wird beendet.
Tabellenrahmen
Cell
SaveAs()
9.4
Eine Arbeitsmappe kann direkt aus Excel heraus, ohne Programmierung, als Anhang einer E-Mail versendet werden. Zustzlich gibt es in VBA:
die Methode SendMail() zum einfachen Versenden einer Arbeitsmappe als Anhang einer E-Mail die Mglichkeit zum Aufruf des integrierten Dialogfelds zum Senden einer E-Mail mit Excel
Anhang senden
Darber hinaus bietet sich noch eine Reihe weiterer Mglichkeiten. Excel arbeitet naturgem am besten mit Outlook als E-Mail-Programm zusammen. In den folgenden Abschnitten wird auf einige Elemente des Objektmodells von Outlook eingegangen. Anschlieend wird gezeigt, wie Sie auf E-Mails, Kontakte und Termine von Outlook zugreifen bzw. Objekte dieser Art mit Hilfe von Excel erzeugen. In seltenen Fllen werden neu erzeugte Elemente vom Typ Kontakte oder Termine allerdings erst mit einer gewissen Zeitverzgerung gespeichert. Sie sollten also nicht erwarten, dass jedes dieser Elemente sofort nach der Erzeugung im entsprechenden Outlook-Verzeichnis erscheint.
Zusammenarbeit
281
Externe Daten
9.4.1
Das Hauptobjekt Application steht fr die Anwendung Outlook. hnlich wie bei Word wird mit Hilfe der Funktion CreateObject() fr den Zugriff auf Outlook ein Objekt vom Typ Outlook.Application erstellt und ein Verweis auf dieses Objekt zurckgeliefert. ber diesen Verweis wird im weiteren Verlauf auf die Outlook-Anwendung zugegriffen. Am Ende muss die Outlook-Anwendung wieder beendet werden. Die Methode CreateItem() des Application-Objekts dient zur Erzeugung von Elementen. Dies knnen z. B. E-Mails, Kontakte, Termine oder Terminserien sein. Je nach Typ des Elements stehen unterschiedliche Eigenschaften und Methoden zur Verfgung. Die Methode GetNameSpace() des Application-Objekts liefert einen Namensraum zurck. Dieser Namensraum wird zum Zugriff auf die Verzeichnisse von Outlook bentigt. Als einziger Namensraumtyp wird MAPI untersttzt. Die Methode GetDefaultFolder() des Namensraums MAPI liefert ein Objekt vom Typ Folder (= Verzeichnis) zurck. Dabei handelt es sich jeweils um das Standardverzeichnis fr den gewnschten Typ. Dies kann z. B. der Typ Posteingang (olFolderInbox) oder der Typ Kontakte (olFolderContacts) sein. Die Eigenschaft Items ist eine Auflistung der Elemente eines OutlookVerzeichnisses. Wie bei der Methode CreateItem() bereits erwhnt: Je nach Typ des Elements stehen unterschiedliche Eigenschaften und Methoden zur Verfgung.
CreateItem()
GetNameSpace()
GetDefaultFolder()
Items
Bibliothek einbinden
Der Zugriff auf das Objektmodell fr Microsoft Outlook 2010 muss innerhalb der VBE von Excel zunchst eingerichtet werden. Im Men Extras Verweise muss dazu die Microsoft Outlook 14.0 Object Library eingebunden werden, siehe Abbildung 9.24. Im Falle von Outlook 2007 handelt es sich um die Microsoft Outlook 12.0 Object Library, bei lteren Outlook-Versionen wird mit der Microsoft Outlook 10.0 Object Library gearbeitet. Die Objektbibliothek wird fr die Beispiele ab Abschnitt 9.4.4 bentigt.
282
9.4
9.4.2
Die Methode SendMail() dient zum einfachen Versenden einer Arbeitsmappe als Anhang einer E-Mail. Ein erstes Beispiel:
Sub EinfachesSenden1() ThisWorkbook.SendMail "max.muster@mailziel.de", "Test" End Sub
Nach dem Aufruf der Prozedur erscheint aus Sicherheitsgrnden automatisch ein Dialogfeld:
Externer Zugriff
Darin kann der Benutzer entscheiden, ob er die Erlaubnis zum Zugriff auf Outlook Erteilen oder Verweigern mchte. Dieses Dialogfeld erscheint auch bei vielen nachfolgenden Anwendungen, die auf Elemente von Outlook zugreifen mchten.
Zugriff erlauben
283
9
Postausgang
Externe Daten
Nachdem der Benutzer die Erlaubnis erteilt hat, wird eine Nachricht mit Anhang ins Postausgangsfach gelegt:
Das Ergebnis:
Die Methode SendMail() hat einen festen und zwei optionale Parameter. Im ersten Parameter wird der Empfnger hinterlegt. Dabei knnen angegeben werden:
Empfnger
eine einzelne Zeichenkette, falls es nur einen Empfnger gibt ein Datenfeld von Zeichenketten, falls es mehrere Empfnger gibt
Betreff Empfangsbesttigung
Im zweiten Parameter kann ein Betreff genannt werden. Falls Sie als dritten Parameter den Wert True angeben, wird eine Empfangsbesttigung angefordert. Dies hngt natrlich davon ab, ob das E-Mail-Programm des Empfngers diese Anforderung verarbeiten kann.
284
9.4
Anhang
Die erstellte E-Mail landet inklusive Anhang (dies ist die aktive Arbeitsmappe) im Ausgangskorb von Outlook. Je nach persnlicher Einstellung in Outlook wird sie direkt oder erst spter versendet.
9.4.3
Integriertes E-Mail-Dialogfeld
Elemente eingeben
Falls Sie dem Benutzer in jedem Fall ermglichen mchten, einer E-Mail weitere Elemente hinzuzufgen (z. B. Cc, Bcc oder einen Nachrichtentext), dann knnen Sie das integrierte E-Mail-Dialogfeld von Excel aufrufen:
Sub EMailDialogfeld() Dim Erfolg As Boolean Erfolg = Application.Dialogs(xlDialogSendMail). _ Show("max.muster@mailziel.de", "Test") If Erfolg Then MsgBox "E-Mail wurde gespeichert" Else MsgBox "E-Mail-Speicherung wurde abgebrochen" End If End Sub
Zur Erluterung:
Es wird die Methode Show() der Auflistung Dialogs aufgerufen. Diese Methode kann zahlreiche vorgefertigte Dialoge anzeigen, siehe Abschnitt 10.1, Integrierte Dialogfelder. Mit Hilfe der Konstanten xlDialogSendMail wird der E-Mail-Dialog aufgerufen. Es knnen wiederum ein Empfnger (oder mehrere in einem Datenfeld) und ein Betreff angegeben werden. Die aktive Arbeitsmappe bil-
285
Externe Daten
det den Anhang der E-Mail. Weitere Elemente ergnzt gegebenenfalls der Benutzer.
Rckgabewert
Der Rckgabewert vom Typ Boolean kann ausgewertet werden, um festzustellen, ob sich der Benutzer zum Speichern der E-Mail im Ausgangskorb entschlossen hat oder nicht. Falls er speichert, wird die E-Mail in den Postausgang gelegt:
Abbildung 9.29
9.4.4
Elemente erzeugen
Alle Elemente einer E-Mail knnen auch per VBA-Code erzeugt und zusammengestellt werden. Im folgenden Beispiel wird eine E-Mail mit Empfnger, Betreff, Inhalt und Anhang zusammengefgt und gesendet.
Sub EMailZusammensetzen() Dim appOutlook As Outlook.Application Dim MailItem As Outlook.MailItem ' Anwendung Outlook starten Set appOutlook = CreateObject("Outlook.Application") ' E-Mail erstellen Set MailItem = appOutlook.CreateItem(olMailItem) ' Eigenschaften hinzufgen MailItem.To = "max.muster@mailziel.de" MailItem.Subject = "Test" MailItem.Body = "Hallo" & vbCrLf & "Welt" ' Anhang hinzufgen On Error GoTo Fehler MailItem.Attachments.Add "C:\Temp\test1.jpg" ' E-Mail senden MailItem.Send ' Anwendung Outlook beenden appOutlook.Quit
286
9.4
Zur Erluterung:
Die Variable MailItem wird als Objekt des Typs Outlook.MailItem deklariert. Mit Hilfe der Funktion CreateObject() wird ein Objekt vom Typ Outlook.Application erstellt und ein Verweis auf dieses Objekt zurckgeliefert. ber diesen Verweis wird im weiteren Verlauf auf die Outlook-Anwendung zugegriffen. Die Methode CreateItem() des Application-Objekts erstellt Elemente. In diesem Falle handelt es sich um ein Element des Typs MailItem. Je nach Typ des Elements stehen unterschiedliche Eigenschaften und Methoden zur Verfgung. Die Eigenschaften To, Subject und Body dienen zur Zuweisung von Empfnger, Betreff und Inhalt der Mail. Mehrere Empfnger knnen in einer einzigen Zeichenkette mit Semikolon als Trennzeichen angegeben werden. Sie werden, im Unterschied zur Methode SendMail(), nicht als Datenfeld angegeben! Die Auflistung Attachments umfasst alle Anhnge einer E-Mail. Mit der Methode Add() knnen Elemente (Dateien) zu dieser Auflistung hinzugefgt werden. Es kann vorkommen, dass die betreffende Datei nicht existiert. Dieser Fehler sollte abgefangen werden, wie im vorliegenden Beispiel.
MailItem
CreateObject()
CreateItem()
Attachments. Add()
287
9
Send() Display()
Externe Daten
Die Methode Send() wird zum Absenden der E-Mail genutzt. Alternativ knnten Sie die Methode Display() verwenden. In diesem Fall wird die E-Mail zunchst angezeigt. Der Benutzer wird gefragt, ob sie gespeichert werden soll. Falls er zustimmt, wird die E-Mail im Outlook-Verzeichnis Entwrfe gespeichert und kann spter versendet werden. Am Ende wird die Outlook-Anwendung mit der Methode Quit() wieder beendet.
Quit()
9.4.5
Serien-E-Mail
Das vorherige Beispiel kann leicht abgewandelt werden, um eine SerienE-Mail an mehrere Adressen zu erstellen, die einem Excel-Tabellenblatt entnommen werden:
Das Programm:
Sub SerienEMail() Dim appOutlook As Outlook.Application Dim MailItem As Outlook.MailItem Dim i As Integer Dim Bcc As String ' Liste der Empfnger aus Tabellenblatt zusammensetzen ThisWorkbook.Worksheets("Tabelle3").Activate i = 1 Do While Cells(i, 3) <> "" Bcc = Bcc & Cells(i, 3).Value & ";" i = i + 1 Loop Bcc = Left(Bcc, Len(Bcc) 1) ' Anwendung Outlook starten, E-Mail erstellen Set appOutlook = CreateObject("Outlook.Application") Set MailItem = appOutlook.CreateItem(olMailItem)
288
9.4
' Eigenschaften hinzufgen und senden MailItem.To = "selbst@mailziel.de" MailItem.Bcc = Bcc MailItem.Subject = "Grillparty um 17:00 Uhr" MailItem.Send appOutlook.Quit End Sub
Das Ergebnis:
Zur Erluterung:
In einem Excel-Tabellenblatt sind Name, Vorname und E-MailAdresse einer Reihe von Personen gespeichert. Mit Hilfe einer Schleife wird eine Zeichenkette zusammengesetzt, die aus allen E-Mail-Adressen des Tabellenblatts besteht. Die Adressen werden durch Semikolons voneinander getrennt. Das letzte Semikolon wird mit den Funktionen Left() und Len() wieder abgeschnitten. Die E-Mail wird wie im vorherigen Beispiel erstellt. Sie bekommt die Eigenschaften To, Bcc und Subject. Der Eigenschaft Bcc wird die vorher zusammengesetzte Zeichenkette zugewiesen. Die E-Mail wird mit der Methode Send() versendet.
Empfngerliste
9.4.6
Falls nur ein Bereich einer Arbeitsmappe versendet werden soll, knnen Sie diesen Bereich vorher in eine neue Arbeitsmappe kopieren und diese anschlieend mailen:
Sub BereichMailen() Dim Rg As Range Dim appOutlook As Outlook.Application
289
Externe Daten
Dim MailItem As Outlook.MailItem ' Bereich ermitteln, in neue Datei kopieren Set Rg = Application.InputBox _ (Prompt:="Whlen Sie den Bereich aus," _ & " der gemailt werden soll", Type:=8) Rg.Copy Workbooks.Add ActiveSheet.Paste ActiveWorkbook.SaveAs ThisWorkbook.Path _ & "\Mappe9Anhang.xlsx" ActiveWorkbook.Close ' Anwendung Outlook starten, E-Mail erstellen Set appOutlook = CreateObject("Outlook.Application") Set MailItem = appOutlook.CreateItem(olMailItem) ' Eigenschaften hinzufgen MailItem.To = "max.muster@mailziel.de" MailItem.Subject = "Test" MailItem.Attachments.Add ThisWorkbook.Path _ & "\Mappe9Anhang.xlsx" MailItem.Send appOutlook.Quit End Sub
Zur Erluterung:
Bereich auswhlen
Mit Hilfe der Methode Application.InputBox() kann der Benutzer per Maus einen Bereich auswhlen, der versendet werden soll:
Die Methode Copy() wird genutzt, um diesen Bereich zu kopieren. Da kein Ziel per Parameter angegeben wurde, liegt der Bereich in der Zwischenablage.
290
9.4
Workbooks.Add()
Es wird mit Hilfe der Methode Workbooks.Add() eine neue Arbeitsmappe erstellt (hier: Mappe9Anhang.xlsx). Diese wird zur aktiven Arbeitsmappe. Der Inhalt der Zwischenablage wird mit Paste() in der neuen Arbeitsmappe eingefgt. Sie wird gespeichert. Die E-Mail wird mit CreateItem() erstellt. Sie bekommt die Eigenschaften To, Subject und Attachments. Als Anhang wird die soeben gespeicherte Datei verwendet. Die E-Mail wird ins Postausgangsfach gelegt:
Paste()
CreateItem()
Abbildung 9.34
Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur und in der Erluterung wie folgt lauten: Mappe9Anhang.xls.
9.4.7
Das folgende Programm ermittelt die Anzahl der Elemente des Verzeichnisses Gesendete Objekte (in einer Version fr Excel ab 2007). Auerdem liefert es einige Eigenschaften einer E-Mail in diesem Verzeichnis:
Sub ZugriffVerzeichnis() Dim appOutlook As Outlook.Application Dim Namensraum As Outlook.Namespace Dim Verzeichnis As Outlook.Folder Dim Element As Outlook.MailItem ' Anwendung Outlook starten Set appOutlook = CreateObject("Outlook.Application") ' Verzeichnis ermitteln Set Namensraum = appOutlook.GetNamespace("MAPI") Set Verzeichnis = Namensraum.GetDefaultFolder _ (olFolderSentMail)
291
Externe Daten
' Elemente zhlen MsgBox Verzeichnis.Items.Count _ & " Elemente im Verzeichnis 'Gesendete Objekte'" ' Eigenschaften eines Elements ermitteln Set Element = Verzeichnis.Items(1) MsgBox "Eigenschaften des ersten Elements:" & vbCrLf _ & "Betreff: " & Element.Subject & vbCrLf _ & "Empfnger: " & Element.To & vbCrLf _ & "Inhalt: " & Left(Element.Body, 50) & " ..." appOutlook.Quit End Sub
Zur Erluterung:
GetNameSpace()
Die Methode GetNameSpace() des Application-Objekts liefert einen Namensraum zurck. Dieser Namensraum wird zum Zugriff auf die Verzeichnisse von Outlook bentigt. Als einziger Namensraumtyp wird MAPI untersttzt. Die Methode GetDefaultFolder() des Namensraums MAPI liefert ein Objekt vom Typ Folder zurck. Dabei handelt es sich jeweils um das Standardverzeichnis fr den gewnschten Typ. In diesem Falle ist es das Verzeichnis Gesendete Objekte (olFolderSentMail). Die Eigenschaft Items ist eine Auflistung der Elemente eines OutlookVerzeichnisses. Die Anzahl der Elemente kann, wie bei einer Auflistung blich, mit der Eigenschaft Count ermittelt werden. Auf ein einzelnes Element der Auflistung Items kann ber einen Index zugegriffen werden. In diesem Falle werden die Eigenschaften Betreff (Subject), Empfnger (To) und Inhalt (Body) des Elements 1 aus dem Verzeichnis Gesendete Objekte ausgegeben.
GetDefaultFolder()
Items
Items(Index)
292
9.4
9.4.8
Nachfolgend ein Beispiel, in dem innerhalb des Verzeichnisses Gesendete Objekte ermittelt wird (in einer Version fr Excel ab Version 2007):
Wie viel Prozent aller E-Mails haben einen Anhang? Wie viele Anhnge hat eine solche E-Mail im Durchschnitt? Wann und an wen wurde eine bestimmte Datei als E-Mail-Anhang gesendet?
Anhang an wen?
Sub ZugriffMailAnhang() Dim appOutlook As Outlook.Application Dim Namensraum As Outlook.Namespace Dim Verzeichnis As Outlook.Folder Dim Element As Outlook.MailItem Dim Dim Dim Dim Dim Dim Anhang As Outlook.Attachment AnzahlMitAnhang As Integer AnteilMitAnhang As Single AnzahlAnhaenge As Integer AnhangProMail As Single Ausgabe As String
' Anwendung Outlook starten Set appOutlook = CreateObject("Outlook.Application") ' Verzeichnis ermitteln Set Namensraum = appOutlook.GetNamespace("MAPI") Set Verzeichnis = Namensraum.GetDefaultFolder _ (olFolderSentMail) ' Statistik zu Anhngen For Each Element In Verzeichnis.Items If Element.Attachments.Count > 0 Then AnzahlMitAnhang = AnzahlMitAnhang + 1 AnzahlAnhaenge = AnzahlAnhaenge _ + Element.Attachments.Count End If Next Element AnteilMitAnhang = AnzahlMitAnhang _ / Verzeichnis.Items.Count MsgBox Format(AnteilMitAnhang, "0.00 %") _ & " der Elemente im Verzeichnis " _ & "'Gesendete Objekte' haben einen Anhang"
293
Externe Daten
AnhangProMail = AnzahlAnhaenge / AnzahlMitAnhang MsgBox Format(AnhangProMail, "0.00") _ & " Anhnge hat jede E-Mail mit Anhang" ' Statistik zu bestimmtem Anhang For Each Element In Verzeichnis.Items For Each Anhang In Element.Attachments If Anhang.Filename = "Mappe9.xlsm" Then Ausgabe = Ausgabe & "An " & Element.To _ & " am " & Element.CreationTime & vbCrLf End If Next Anhang Next Element MsgBox Ausgabe appOutlook.Quit End Sub
Die ersten beiden Teile des Ergebnisses knnten wie in den Abbildungen 9.36 und 9.37 aussehen.
Zur Erluterung:
For Each <Element>
Mit Hilfe einer For-Each-Schleife werden alle Elemente des Verzeichnisses Gesendete Objekte untersucht. Falls die Anzahl der Anhnge einer E-Mail grer als 0 ist, wird diese E-Mail gezhlt. Auerdem wird die Anzahl der Anhnge gezhlt. Dies geschieht mit Hilfe der Eigenschaft Count der Auflistung Attachments.
294
9.4
Die ermittelten Werte werden ausgegeben. Mit Hilfe zweier geschachtelter For-Each-Schleifen werden anschlieend alle Anhnge aller Elemente des Verzeichnisses Gesendete Objekte untersucht. Ein einzelner Anhang ist vom Typ Outlook.Attachment. Falls einer der Anhnge einem bestimmten gesuchten Dateinamen entspricht, werden Empfnger und Erzeugungsdatum der zugehrigen E-Mail gespeichert. Die ermittelten Daten werden ausgegeben.
Anhnge durchsuchen
Dateiinformationen
9.4.9
Nachfolgend werden alle Kontakte aufgelistet, deren Nachname mit M beginnt (fr Excel ab Version 2007):
Sub ZugriffKontakte() Dim appOutlook As Outlook.Application Dim Namensraum As Outlook.Namespace Dim Verzeichnis As Outlook.Folder Dim Element As Outlook.ContactItem Dim Ausgabe As String ' Anwendung Outlook starten Set appOutlook = CreateObject("Outlook.Application") ' Verzeichnis ermitteln Set Namensraum = appOutlook.GetNamespace("MAPI") Set Verzeichnis = Namensraum.GetDefaultFolder _ (olFolderContacts) ' Bestimmte Kontakte ermitteln For Each Element In Verzeichnis.Items If Left(Element.LastName, 1) = "M" Then Ausgabe = Ausgabe & Element.LastName _ & ", " & Element.FirstName & " (" _ & Element.Email1Address & ")" & vbCrLf End If Next Element MsgBox Ausgabe appOutlook.Quit End Sub
295
Externe Daten
Zur Erluterung:
olFolderContacts
Es wird das Standardverzeichnis fr Kontakte (olFolderContacts) ermittelt. Die Elemente dieses Verzeichnisses sind vom Typ ContactItem und haben u. a. die Eigenschaften Nachname (LastName), Vorname (FirstName) und erste E-Mail-Adresse (Email1Address). Die Nachnamen werden untersucht. Mit Hilfe der Funktion Left() wird ermittelt, ob der erste Buchstabe ein M ist. Falls ja, werden die obengenannten Eigenschaften gespeichert und ausgegeben.
LastName
Neue Kontakte knnen hnlich wie neue E-Mails erzeugt werden. Dies zeigt das folgende Beispiel (fr Excel ab Version 2007):
Sub KontaktErzeugen() Dim appOutlook As Outlook.Application Dim Element As Outlook.ContactItem ' Anwendung Outlook starten Set appOutlook = CreateObject("Outlook.Application") ' Neuen Kontakt erzeugen Set Element = appOutlook.CreateItem(olContactItem) ' Eigenschaften zuweisen Element.LastName = "Muster" Element.FirstName = "Max" Element.Email1Address = "max.muster@mailziel.de" ' Kontakt speichern Element.Save appOutlook.Quit End Sub
296
9.4
Zur Erluterung:
Mit Hilfe der Methode CreateItem() und der Konstanten olContactItem wird ein neues Element des Typs ContactItem erzeugt.
CreateItem()
Den Eigenschaften LastName, FirstName und Email1Address des neuen Kontakts werden Werte zugewiesen. Anschlieend wird der neue Kontakt mit der Methode Save() gespeichert.
Save()
Hinweis
In seltenen Fllen erscheint der Kontakt erst zeitverzgert in Outlook.
Objekte des Typs MailItem. Nachfolgend wird dem persnlichen Terminkalender mit Hilfe von VBA ein neuer Termin hinzugefgt (fr Excel ab Version 2007):
Sub TerminErzeugen() Dim appOutlook As Outlook.Application Dim Element As Outlook.AppointmentItem ' Anwendung Outlook starten Set appOutlook = CreateObject("Outlook.Application") ' Neuen Termin erzeugen Set Element = appOutlook.CreateItem(olAppointmentItem) ' Eigenschaften zuweisen Element.Start = "30.03.2010 12:00" Element.Duration = 60
297
Externe Daten
Element.Subject = "Test" Element.Location = "hier" ' Termin speichern Element.Save appOutlook.Quit End Sub
Das Ergebnis:
Zur Erluterung:
CreateItem()
Mit der Methode CreateItem() und der Konstanten olAppointmentItem wird ein neues Element des Typs AppointmentItem erzeugt. Den folgenden Eigenschaften des neuen Termins werden Werte zugewiesen:
Start: Beginn des Termins mit Datum und Uhrzeit Duration: Dauer des Termins Subject: Betreff, also Thema des Termins Location: Ort, an dem der Termin stattfindet
Save()
Anschlieend wird der neue Termin mit der Methode Save() gespeichert.
Bei einer Terminserie kommt ein weiteres Objekt hinzu: Der Typ RecurrencePattern enthlt das Muster fr die Terminserie. Ein Beispiel (fr Excel ab Version 2007):
Sub TerminserieHinzufuegen() Dim appOutlook As Outlook.Application Dim Element As Outlook.AppointmentItem Dim Muster As Outlook.RecurrencePattern
298
9.4
' Anwendung Outlook starten Set appOutlook = CreateObject("Outlook.Application") ' Neuen Termin erzeugen Set Element = appOutlook.CreateItem(olAppointmentItem) ' Eigenschaften zuweisen Element.Start = "31.03.2010 12:00" Element.Duration = 45 Element.Subject = "Test" ' Muster fr Terminserie erzeugen Set Muster = Element.GetRecurrencePattern ' Eigenschaften zuweisen Muster.RecurrenceType = olRecursWeekly Muster.DayOfWeekMask = olWednesday Or olSaturday Muster.PatternStartDate = "31.03.2010" Muster.PatternEndDate = "17.04.2010" ' Terminserie speichern Element.Save appOutlook.Quit End Sub
299
Externe Daten
Zur Erluterung:
CreateItem()
Es wird mit Hilfe der Methode CreateItem() ein Element vom Typ AppointmentItem erzeugt. Anschlieend werden dessen Eigenschaften Werte zugewiesen. Die Methode GetRecurrencePattern() liefert ein Objekt vom Typ RecurrencePattern. Den folgenden Eigenschaften des neuen Musters werden Werte zugewiesen:
GetRecurrencePattern() RecurrencePattern
festgelegt werden. Gltige Werte sind u. a. olRecursDaily (tglich), olRecursWeekly (wchentlich) oder olRecursMonthly (monatlich).
DayofWeekMask: Maske fr die Wochentage, an denen der Termin stattfindet. Gltige Werte sind z. B. olMonday (montags) oder olTuesday (dienstags). PatternStartDate und PatternEndDate: Diese Termine legen den
Anschlieend wird die neue Terminserie mit der Methode Save() gespeichert.
9.5
Datenbankzugriff
Access ist ein Programm zur Erstellung und Verwaltung von relationalen Datenbanken. Die Mglichkeiten von Datenbank-Programmen gehen weit ber die Mglichkeiten von Excel-Datenbanken hinaus. An dieser Stelle soll kein Exkurs zu diesem Thema folgen, das wrde zu weit fhren. Es wird stattdessen erlutert, wie Sie auf eine vorgegebene BeispielDatenbank von Access zugreifen und diese gegebenenfalls verndern.
300
9.5
9.5.1
Beispiel-Datenbank: Aufbau
Struktur
Die Beispiel-Datenbank firma.mdb knnen Sie direkt von der beiliegenden CD kopieren. Sie enthlt die Tabelle personen zur Aufnahme von Personendaten. Die Tabelle personen hat folgende Struktur:
Auf dem Feld personalnummer ist der Primrschlssel (= eindeutiger Index) definiert. Es kann also keine zwei Datenstze mit der gleichen Personalnummer geben. Es gibt bereits drei Datenstze mit den folgenden Inhalten:
Datenstze
9.5.2
Der Zugriff auf eine Datenbank mit VBA besteht aus folgenden Schritten:
Verbindung aufnehmen zur Datenbank Absetzen eines SQL-Befehls an die Datenbank Auswerten des SQL-Befehls Verbindung zur Datenbank schlieen
ADO-Bibliothek
Fr den Zugriff wird die ADO-Bibliothek bentigt. Dazu muss als Erstes im Men Extras Verweise die Microsoft ActiveX Data Objects 2.8 Library (= Bibliothek) eingebunden werden. Fr Excel vor Version 2007 reicht auch eine ltere Version, z. B. 2.5.
301
Externe Daten
Die Verbindung zu einer Access-Datenbank wird mit Hilfe eines Objekts vom Typ ADODB.Connection aufgenommen. Die wichtigste Eigenschaft des Connection-Objekts ist ConnectionString. Darin werden mehrere Eigenschaften fr die Art der Verbindung vereinigt. Fr Access sind dies:
der Datenbank-Provider: Microsoft.Jet.OLEDB.4.0 die Datenquelle (Data Source): hier die Datei firma.mdb im gleichen Verzeichnis
Open(), Close()
Die Methoden Open() und Close() des Connection-Objekts dienen zum ffnen und Schlieen der Verbindung. Eine offene Verbindung sollte so schnell wie mglich wieder geschlossen werden.
9.5.3
SQL
SQL-Befehle
Die Abkrzung SQL steht fr Structured Query Language. SQL ist eine strukturierte Abfragesprache, also eine Sprache, mit deren Hilfe Datenbankabfragen ausgefhrt werden knnen. Es gibt grundstzlich zwei Typen von Abfragen:
Auswahl Aktion
Auswahlabfragen zur Sichtung von Daten mit dem SQL-Befehl SELECT Aktionsabfragen zur Vernderung von Daten mit den SQL-Befehlen UPDATE, DELETE und INSERT
302
9.5
Im weiteren Verlauf werden Grundlagen der Sprache SQL vermittelt, so dass einige typische Arbeiten mit Datenbanken durchgefhrt werden knnen. Fr Auswahlabfragen wird ein Objekt des Typs ADODB.Recordset bentigt. Darin wird das Ergebnis der Abfrage, eine Reihe von Datenstzen, gespeichert. Bei Aktionsabfragen sollten Sie feststellen, wie viele Datenstze von der nderung betroffen waren. Daran knnen Sie den Erfolg der Aktion bemessen.
Recordset
9.5.4
Beispiel-Datenbank: Auswahlabfrage
Alle Datenstze sehen
Als Beispiel fr eine Auswahlabfrage nehmen wir den einfachsten Fall wir mchten alle Datenstze einer Tabelle mit allen Feldern sehen:
Abbildung 9.46
Das Programm:
Sub Auswahlabfrage() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim i As Integer Dim SQLCommand As String ThisWorkbook.Worksheets("Tabelle4").Activate On Error GoTo Fehler Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ & ThisWorkbook.Path & "\firma.mdb;" cn.Open SQLCommand = "SELECT * FROM personen" ' MsgBox SQLCommand Set rs = cn.Execute(SQLCommand) i = 1 Do While Not rs.EOF Cells(i, 1) = rs!Name
303
Externe Daten
= = = =
Range("E:E").NumberFormatLocal = "TT.MM.JJ" Range("A:E").Columns.AutoFit Exit Sub Fehler: MsgBox (Err.Description) End Sub
Zur Erluterung:
Es werden zwei Verweise auf Objekte des Typs ADODB.Connection und ADODB.Recordset erzeugt. Da es beim Zugriff auf eine Datenbank erfahrungsgem zahlreiche Fehlerquellen gibt, sollten Fehler mit On Error abgefangen werden. hnlich wie beim Zugriff auf eine Datei kann es vorkommen, dass die Datenbank gar nicht am genannten Ort existiert. Auch Fehler bei der SQL-Syntax werden an VBA weitergemeldet. Die verschiedenen mglichen Fehlermeldungen helfen beim Fehlerfinden. Es wird ein neues Objekt des Typs ADODB.Connection erzeugt. Auf dieses Objekt wird mit dem oben erzeugten Verweis verwiesen. Der ConnectionString dieses Verbindungsobjekts wird mit den Informationen fr den Provider und die Datenquelle (Datei firma. mdb) gefllt. Mit Aufruf der Methode Open() des Verbindungsobjekts wird die Verbindung geffnet. Der SQL-Befehl SELECT * FROM personen besteht aus den folgenden Elementen:
Fehler finden
Connection
ConnectionString
Open()
SELECT
SELECT ... FROM ... : whle Felder ... von Tabelle ...
Es folgt eine Liste der gewnschten Felder im Abfrageergebnis, dabei steht der Stern (*) fr: alle Felder.
personen: Name der Tabelle, aus der ausgewhlt wird
304
9.5
Fehler in SQL finden
Der SQL-Befehl wird in einer Zeichenkette gespeichert. Dies ist vor allem bei lngeren SQL-Befehlen, die Benutzereingaben enthalten, ntzlich. Im Fehlerfall knnen Sie sich den SQL-Befehl per MsgBox ausgeben lassen. Mit Hilfe der Methode Execute() des Verbindungsobjekts wird der SQL-Befehl gesendet. Rckgabewert der Methode ist ein RecordsetObjekt. Auf dieses Objekt wird mit dem oben erzeugten Verweis verwiesen. Die Eigenschaft EOF signalisiert, ob das Ende des Recordsets (also der letzte Datensatz) erreicht wurde. Damit wird die Do-Loop-Schleife gesteuert. Innerhalb eines Datensatzes knnen die Werte der einzelnen Felder in der Form <Recordset>!<Feldname> angesprochen werden. Die Methode MoveNext() setzt den Datensatzzeiger auf den nchsten Datensatz des Abfrageergebnisses. Zu guter Letzt sollten noch das Recordset und die Verbindung wieder geschlossen werden, jeweils mit Close().
Execute()
EOF
Feldwerte
MoveNext()
Close()
9.5.5
Beispiel-Datenbank: Aktionsabfrage
Als Beispiel fr eine Aktionsabfrage soll Folgendes dienen: Alle Gehlter sollen um 5 % erhht werden. Anschlieend soll die Tabelle (nach einem erneuten Import aus Access) wie folgt aussehen:
Alle Datenstze ndern
Das Programm:
Sub Aktionsabfrage() Dim cn As New ADODB.Connection Dim SQLCommand As String Dim Anzahl As Integer On Error GoTo Fehler cn.ConnectionString = _
305
Externe Daten
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ & ThisWorkbook.Path & "\firma.mdb;" cn.Open SQLCommand = _ "UPDATE personen SET gehalt = gehalt * 1.05" ' MsgBox SQLCommand cn.Execute SQLCommand, Anzahl cn.Close MsgBox "Anzahl Datenstze gendert: " & Anzahl Exit Sub Fehler: MsgBox (Err.Description) End Sub
Zur Erluterung:
Connection Execute()
Wie bei einer Auswahlabfrage wird ein Connection-Objekt bentigt. Die Methode Execute() wird zum Ausfhren von Aktionsabfragen mit einem zweiten Parameter aufgerufen. Darin wird die Anzahl der Datenstze, die von der Aktionsabfrage betroffen waren, gespeichert. Der Rckgabewert der Methode wird nicht bentigt, da kein Recordset angefordert wurde. Der SQL-Befehl UPDATE personen SET gehalt = gehalt * 1.05 besteht aus:
UPDATE
UPDATE ... SET ... (aktualisiere Tabelle ... setze Werte ...) personen (Name der Tabelle, in der aktualisiert wird) gehalt = gehalt * 1.05 (eine oder mehrere Zuweisungen mit neuen Werten fr ein oder mehrere Felder)
306
9.5
9.5.6
In diesem und den folgenden Abschnitten werden die wichtigsten SQLBefehle behandelt. Sie werden anhand von einigen typischen Beispielen mit ihren Auswirkungen erlutert. Die Anweisung SELECT dient zur Auswahl von Datenstzen, damit diese angezeigt werden knnen. Ein erstes Beispiel wurde mit SELECT * FROM personen bereits gezeigt. Es folgen weitere Beispiele. Einzelne Felder
SQLCommand = "SELECT name, vorname FROM personen"
SELECT
Es werden nur die Werte der Felder name und vorname fr alle Datenstze angefordert. Das Abfrageergebnis ist kleiner, die Werte der anderen Felder sind nicht darin enthalten und knnen auch nicht in der Schleife ausgegeben werden:
Felder auswhlen
Auswahl einschrnken
SQLCommand = "SELECT * FROM personen WHERE gehalt > 3600"
WHERE Datenstze auswhlen
Innerhalb der WHERE-Klausel knnen Bedingungen angegeben werden, hnlich wie bei einer If-Verzweigung. Das Ergebnis enthlt nur die Datenstze, die der Bedingung gengen in diesem Fall die Datenstze, bei denen der Wert im Feld gehalt grer als 3.600 ist.
Hinweis
Die Ausgabe bezieht sich auf die Originalwerte der Tabelle, bevor sie um 5 % erhht wurden.
307
Externe Daten
Zeichenketten
SQLCommand = "SELECT * FROM personen WHERE name = 'Schmitz'"
Zeichenkette, Datum
Wird mit dem Wert einer Zeichenkette oder eines Datums verglichen, so muss dieser Wert in einfache Hochkommata (') gesetzt werden (nicht zu verwechseln mit dem doppelten Hochkomma fr Zeichenketten in VBA oder dem schrgen Akzentzeichen!).
9.5.7
Vergleichsoperatoren
SQL: Operatoren
Bei einer Bedingung knnen Sie die Vergleichsoperatoren aus Tabelle 9.1 verwenden.
Operator Erluterung
= <> > >= < <=
gleich ungleich grer als grer als oder gleich kleiner als kleiner als oder gleich
Die logischen Operatoren aus Tabelle 9.2 verbinden mehrere Bedingungen miteinander.
Operator Erluterung
NOT AND OR
Logisches Nicht. Der Wahrheitswert einer Bedingung wird umgekehrt. Logisches Und. Beide Bedingungen mssen zutreffen. Logisches Oder. Nur eine der Bedingungen muss zutreffen.
308
9.5
SQLCommand = "SELECT * FROM personen WHERE gehalt >= 3600 AND gehalt <= 3650"
Das Ergebnis enthlt nur die Datenstze, bei denen der Wert im Feld gehalt zwischen 3.600 und 3.650 liegt, einschlielich der Ober- und Untergrenze.
AND
Operator LIKE, Platzhalter Der Operator LIKE wird speziell fr die Suche nach Zeichenketten mit Hilfe von Platzhaltern verwendet. Der Platzhalter % (Prozentzeichen) steht in Access fr eine beliebige Anzahl von unbekannten Zeichen. Der Platzhalter _ (Unterstrich) steht in Access fr genau ein unbekanntes Zeichen.
SQLCommand = "SELECT * FROM personen WHERE name LIKE 'M%'"
LIKE % _
Das Ergebnis enthlt nur die Datenstze, bei denen der Wert im Feld name mit M beginnt. Danach drfen beliebig viele unbekannte Zeichen folgen.
Das Ergebnis umfasst nur die Datenstze, die im Wert des Felds name den Buchstaben i enthalten. Davor und danach drfen beliebig viele unbekannte Zeichen folgen.
Enthlt ...
309
Externe Daten
Das Ergebnis enthlt nur die Datenstze, deren erster Buchstabe ein M ist und bei denen der vierte Buchstabe ein e und der fnfte ein r ist. Es werden also alle Personen gefunden, die Maier, Meier, Mayer, Meyer usw. heien.
9.5.8
Ausgabe sortieren
Sortierung ist normalerweise aufsteigend. Falls Sie eine absteigende Sortierung wnschen, mssen Sie den Zusatz DESC verwenden.
SQLCommand = "SELECT name, gehalt FROM personen ORDER BY gehalt DESC"
ORDER BY
Die Datenstze sind absteigend nach Gehalt sortiert. Es werden nur die Werte der Felder name und gehalt angezeigt.
Die Datenstze sind nach name aufsteigend sortiert. Bei gleichem Namen sind sie nach vorname aufsteigend sortiert.
310
9.5
Hinweis
Zur Verdeutlichung wurde fr diese Abfrage kurzfristig ein Datensatz (Maier, Wolfgang) hinzugefgt.
9.5.9
Sucht der Benutzer nach bestimmten Datenstzen, so kann der eingegebene Suchbegriff in die SQL-Anweisung eingebaut werden:
SQLCommand = "SELECT * from personen WHERE name LIKE '" & Application.InputBox("Nach welchem Namen suchen Sie?") & "'"
Es werden alle Datenstze angezeigt, die den Wert im Feld name haben, den der Benutzer im Eingabefeld eingetragen hat. Nach der Benutzereingabe in Abbildung 9.58
Beachten Sie, dass sich die Zeichenkette, die den SQL-Befehl enthlt, aus mehreren Teilen zusammensetzt. Keinesfalls drfen Sie die einfachen Hochkommata vor und nach der Zeichenkette vergessen. Noch einen Schritt weiter gehen wir mit dieser Anweisung:
SQLCommand = "SELECT * FROM personen WHERE name LIKE '%" & Application.InputBox("Nach welcher Zeichenkette suchen Sie?") & "%'"
Es werden alle Datenstze angezeigt, die im Feld name einen Wert haben, in dem die Zeichenkette vorkommt, die der Benutzer im Eingabefeld eingetragen hat.
311
Externe Daten
Innerhalb des VBA-Programms ist es sinnvoll, sich zumindest whrend der Entwicklung den zusammengesetzten Befehl anzeigen zu lassen. Erfahrungsgem werden gerade beim Einfgen von Suchparametern hufig Fehler gemacht. Dazu knnen Sie die Anweisung MsgBox SQLCommand verwenden. Diese knnen Sie spter wieder auskommentieren. Abbildung 9.62 zeigt die Ausgabe des SQL-Befehls fr das letzte Beispiel.
Die Anweisung UPDATE dient zur nderung von Feldinhalten in einem oder mehreren Datenstzen in der Datenbanktabelle. Sie hnelt in ihrem Aufbau der Anweisung SELECT. Die Auswahlkriterien sollten sorgfltig gewhlt werden, da sonst eventuell nicht nur die gewnschten Datenstze verndert werden.
SQLCommand = "UPDATE personen SET gehalt = 3800"
312
9.5
Diese Anweisung wrde bei allen Datenstzen der Tabelle personen den Wert fr das Feld gehalt auf den Wert 3.800 setzen. Dies wre sicherlich nicht realistisch.
SQLCommand = "UPDATE personen SET gehalt = 3800 WHERE personalnummer = 2296"
WHERE
Abbildung 9.63 zeigt das Ergebnis der Aktionsabfrage, nach erneutem Import aller Daten.
Diese Anweisung setzt nur bei einem Datensatz den Wert fr das Feld gehalt neu. Es empfiehlt sich, in einer solchen Situation die Auswahl ber das Feld zu treffen, auf dem ein eindeutiger Index steht, also hier ber das Feld personalnummer. Versuchen Sie, nderungen vorzunehmen, die der Tabellenaufbau nicht zulsst, so wird eine Fehlermeldung zu VBA durchgeleitet. Es folgen einige mgliche Fehler mit den zugehrigen Fehlermeldungen. Die Meldungen erscheinen aufgrund der Fehlerbehandlung mit On Error in der Prozedur Aktionsabfrage(). Sie helfen bei der Suche nach der Ursache.
Fehler finden
Sie mchten einen leeren Wert in ein Feld eintragen, das in Access so definiert ist, dass kein leerer Wert eingetragen werden darf. Ein Beispiel: SQLCommand = "UPDATE personen SET name = '' WHERE personalnummer = 2296"
Leerer Wert
Abbildung 9.64
Es soll ein bereits vorkommender Wert in einem Feld, auf dem ein eindeutiger Index steht, eingetragen werden. Ein Beispiel: SQLCommand = "UPDATE personen SET personalnummer = 6714 WHERE personalnummer = 2296"
313
Externe Daten
Sie mchten ein ungltiges Datum oder eine ungltige Zahl eintragen. Hufig wird dabei der Datentyp nicht erkannt. Ein Beispiel: SQLCommand = "UPDATE personen SET geburtstag = '32.12.1980' WHERE personalnummer = 2296"
Abbildung 9.66
Damit wird ein neuer Datensatz in die Datenbanktabelle eingefgt. Abbildung 9.67 zeigt das Ergebnis nach erneutem Import aller Daten.
Die Feldnamen in Klammern geben die Anzahl und Reihenfolge der Werte vor, die nach VALUES in Klammern stehen. Es sind wiederum die einfachen Hochkommata bei Zeichenketten und Datumsangaben zu beachten. Beim Einfgen knnen die gleichen Fehler auftreten wie beim ndern.
314
9.5
Diese Anweisung wird man vermutlich nie einsetzen: Sie lscht alle (!) Datenstze der Tabelle personen.
SQLCommand = "DELETE FROM personen WHERE personalnummer = 4711"
Diese Anweisung lscht genau einen Datensatz, da die Auswahl ber das Feld getroffen wurde, auf dem ein eindeutiger Index steht, das Feld personalnummer.
315
Die Gestaltung einer komfortablen Schnittstelle zwischen Anwendung und Benutzer ist Thema dieses Kapitels.
10
Dialogfelder
Benutzerfhrung
Dialogfelder eignen sich besonders zur komfortablen und deutlichen Benutzerfhrung. Dem Benutzer werden nur noch die fr ihn relevanten Auswahlmglichkeiten zur Verfgung gestellt. Er kann schneller und fehlerfreier mit der Excel-Anwendung arbeiten. Es gibt folgende Arten von Dialogfeldern:
Die Funktionen InputBox() und MsgBox() fr einfache Ein- und Ausgabedialoge. Sie wurden bereits in Kapitel 8, VBA- und WorksheetFunktionen, erlutert. Integrierte Dialogfelder fr standardisierte Dialoge, z. B. zur Auswahl einer Datei oder einer Schriftformatierung. Diese Dialogfelder werden unmittelbar anschlieend beschrieben. Eigene, individuelle Dialogfelder, die mit Hilfe von zahlreichen verschiedenen Steuerelementen genau auf die Bedrfnisse der Anwendung abgestimmt werden knnen. Sie folgen im letzten Abschnitt dieses Kapitels.
Integrierte Dialogfelder
Eigene Dialogfelder
10.1
Integrierte Dialogfelder
Dialogs(...). Show()
Es gibt eine sehr groe Anzahl an integrierten Dialogfeldern. Sie sind bereits aus der Bedienung von Excel bekannt, knnen aber auch innerhalb von VBA-Anwendungen aufgerufen werden. Die Anzeige eines Dialogfelds erfolgt ber die Methode Application.Dialogs(<Konstante>).Show():
Die Konstante bestimmt den Typ des Dialogfelds. Dabei haben Sie die Auswahl aus ber 200 Mglichkeiten. Die Methode Show() hat, abhngig vom Typ, bis zu 30 benannte Parameter (= Argumente). Sie werden ber arg1, arg2, arg3 usw. ausgewhlt. Der Rckgabewert ist entweder True oder False. Dies hngt
Rckgabewert
317
10
Dialogfelder
Das integrierte Dialogfeld zum Senden einer E-Mail haben wir bereits in Abschnitt 9.4, Austausch mit Microsoft Outlook, kennengelernt. Dazu wurde die Konstante xlDialogSendMail bentigt. Einige weitere Beispiele folgen.
10.1.1
xlDialogOpen
Datei ffnen
Beim Dialog zum ffnen einer Datei kann u. a. ein Dateiname (auch mit Platzhalter) voreingestellt werden.
Sub DateiOeffnen() Dim Erfolg As Boolean Erfolg = Application.Dialogs(xlDialogOpen). _ Show(arg1:="M*.xlsx") If Not Erfolg Then _ MsgBox "Keine Datei ausgewhlt" End Sub
Das Ergebnis:
Zur Erluterung:
Die Konstante ist xlDialogOpen. Es werden nur die Dateien angezeigt, die mit M beginnen und die Dateiendung .xlsx haben. In den Versionen vor Excel 2007 muss die Dateiendung .xls lauten, daher wird in diesem Falle die Methode Show() in der Prozedur mit arg1:="M*.xls" aufgerufen. Natrlich kann der Benutzer diese Voreinstellung berschreiben. Nach Bettigung des Buttons ffnen werden die ausgewhlten Dateien geffnet. Nach Bettigung des Buttons Abbrechen wird eine Fehlermeldung angezeigt.
Button ffnen
318
Integrierte Dialogfelder
10.1
10.1.2
Beim Dialog zum Speichern einer Datei kann u. a. ein einzelner Dateiname voreingestellt werden.
Sub DateiSpeichernUnter() Dim Erfolg As Boolean Workbooks.Add Erfolg = Application.Dialogs(xlDialogSaveAs). _ Show(arg1:="Test.xlsx") If Not Erfolg Then _ MsgBox "Keine Datei ausgewhlt" End Sub
Zur Erluterung:
Die Konstante ist xlDialogSaveAs. Falls der Benutzer nur den Button Speichern bettigt, wird die neu erzeugte Datei unter dem Namen Test.xlsx gespeichert.
Button Speichern
Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur und in der Erluterung wie folgt lauten: Test.xls.
319
10
Dialogfelder
Zur Erluterung:
Button OK
Die Konstante ist xlDialogPatterns. Falls der Benutzer den Button OK bettigt, wird der ausgewhlte Zellbereich mit dem gewhlten Muster formatiert.
Die Konstante ist xlDialogFontProperties. Falls der Benutzer den Button OK bettigt, wird der ausgewhlte Zellbereich mit den gewhlten Schrifteigenschaften formatiert.
320
10.2
10.2
Eigene Dialogfelder knnen mit Hilfe von verschiedenen Steuerelementen genau auf die Bedrfnisse einer Anwendung abgestimmt werden.
10.2.1
Zur Erluterung:
Nach Bettigung des Buttons Hallo erscheint eine kurze Meldung. Nach Bettigung des Buttons Ende wird das Dialogfeld beendet.
Steuerelement Button
321
10
Dialogfelder
Sollte die Toolbox einmal nicht eingeblendet sein, dann aktivieren Sie das Formular zuerst durch einfachen Klick und whlen dann im Men Ansicht den Menpunkt Werkzeugsammlung aus. Steuerelemente knnen mit der Maus aus der Werkzeugsammlung auf das Dialogfeld gezogen werden. In unserem Falle sind dies zwei Buttons. Im Eigenschaften-Fenster sollten Sie nun einige Eigenschaften der Steuerelemente einstellen. Dazu whlen Sie das entsprechende Steuerelement durch einen einfachen Klick aus. Anschlieend notieren Sie den gewnschten Wert neben der Eigenschaft. Manche Eigenschaften knnen aus einer Liste ausgewhlt werden. Die wichtigste Eigenschaft eines Steuerelements ist sein Name. ber diesen Namen wird das Element im VBA-Code angesprochen, daher sollte er als Erstes eingestellt und mglichst nicht mehr verndert werden. Es gibt Konventionen fr die Namensgebung; sie erleichtern die Lesbarkeit des VBA-Codes. Der Name sollte sich aus drei Buchstaben fr den Typ des Steuerelements (frm fr Dialogfeld, cmd fr Button, txt fr Textfeld usw.) und einem selbsterklrenden Begriff zusammensetzen. Im vorliegenden Beispiel werden die Eigenschaften wie in Tabelle 10.1 gendert.
Erklrung Name des Dialogfelds Aufschrift des Dialogfelds Name des ersten Buttons Aufschrift des ersten Buttons Name des zweiten Buttons Aufschrift des zweiten Buttons Eigenschaft
(Name) Caption (Name) Caption (Name) Caption
Per Maus
EigenschaftenFenster
Eigenschaft Name
Wert
frmErstes Erstes Beispiel cmdHallo Hallo cmdEnde Ende
322
10.2
Eigenschaft einstellen
Viele Steuerelemente haben die Eigenschaft Caption. Damit wird der Titel bzw. der Text neben oder auf dem Steuerelement bezeichnet. Im Eigenschaftsfenster sehen die Eigenschaften des Dialogfelds (als Beispiel) wie in Abbildung 10.7 aus.
Prozedur fllen
Button Hallo
Eine Ereignisprozedur kann auch so erstellt werden wie fr ein Ereignis einer Arbeitsmappe oder eines Tabellenblatts:
Whlen Sie im Projekt-Explorer das Dialogfeld (=frmErstes) aus. Bettigen Sie den Menpunkt Code im Men Ansicht. Whlen Sie in der linken Liste oberhalb des Codefensters das Steuerelement aus. Aus der rechten Liste oberhalb des Codefensters whlen Sie das Ereignis.
Ansicht wechseln
Zwischen den beiden Ansichten Code und Objekt knnen Sie immer ber das Men Ansicht wechseln.
323
10
Button Ende
Dialogfelder
Zur Erluterung:
Unload Me
Mit der Anweisung Unload wird ein Objekt aus dem Speicher entladen. Alle lokalen oder modulweiten Variablen des Dialogfelds stehen anschlieend nicht mehr zur Verfgung. Durch Me wird das aktuelle Objekt, in diesem Falle das Dialogfeld, bezeichnet.
Zum Testen des Dialogfelds innerhalb des VBE muss nur die Taste (F5) bettigt werden. Falls das Dialogfeld aus dem Tabellenblatt heraus gestartet werden soll, wird eine weitere Prozedur bentigt. Diese wird in einem normalen Code-Modul gespeichert:
Sub DialogAnzeigen() frmErstes.Show MsgBox "Dialogfeld geschlossen" End Sub
Zur Erluterung:
Show()
Die Methode Show() ldt das Dialogfeld in den Speicher und zeigt es an.
Workbook_Open
Sie knnten zum Beispiel das Ereignis ffnen der Arbeitsmappe mit der Anzeige des Dialogfelds verbinden:
Private Sub Workbook_Open() frmErstes.Show End Sub
Hinweise
Modales Dialogfeld
Es handelt sich um ein gebundenes Dialogfeld (engl. modal). Das bedeutet, dass in Excel keine anderen Aktionen ausgefhrt werden knnen, solange das Dialogfeld angezeigt wird. Auch der weitere VBA-Code in der Prozedur DialogAnzeigen() wird erst ausgefhrt, wenn das Dialogfeld wieder geschlossen wurde. Diese Eigenschaft ist von groem Vorteil, denn der Benutzer wird deutlicher durch die Anwendung gefhrt.
324
10.2
vbModeless
Die Mglichkeit, ein Dialogfeld ungebunden aufzurufen, wird seltener genutzt. Dazu gibt es den optionalen Parameter vbModeless. In diesem Falle knnen trotz geffneten Dialogfelds weitere Aktionen im Tabellenblatt ausgefhrt werden. Das Dialogfeld Suchen und Ersetzen in Word oder Excel wird auf diese Weise aufgerufen.
Benutzerfhrung
Damit veranlassen Sie den Benutzer dazu, zunchst bestimmte Daten einzugeben und auszuwhlen, bevor er die Tabellenbltter der Arbeitsmappe nutzen kann. Exportieren und Importieren Ein UserForm-Modul mit einem Dialogfeld kann, genauso wie ein reines Code-Modul, exportiert und importiert werden. Der Vorgang wird ausfhrlich in Abschnitt 5.6, Module exportieren und importieren, erlutert. Der einzige Unterschied: Es werden zwei Dateien erzeugt, mit den Dateiendungen .frm und .frx, statt nur einer Datei mit der Dateiendung .bas.
UserForm exportieren
Abbildung 10.8
Width, Height
325
10
Left, Top
Dialogfelder
Left: Abstand zum linken Rand Top: Abstand zum oberen Rand
Umgekehrt knnen Gre und Ort durch die Eingabe von Werten im Eigenschaften-Fenster verndert werden.
Men Format
Eine einheitliche Gre oder Anordnung erreichen Sie ber die zahlreichen Menpunkte im Men Format erreichen. Vorher mssen Sie natrlich mindestens zwei Steuerelemente gleichzeitig mit der Maus und der Taste (Strg) auswhlen.
Steuerelemente knnen mit den bekannten Methoden (z. B. (Strg)+(C) und (Strg)+(V)) kopiert werden. Dadurch ersparen Sie sich einige Arbeit, falls Sie bereits eine Reihe von Eigenschaften eingestellt haben. Die Ermittlung des Werts eines Steuerelements (z. B. den Inhalt eines Textfelds) und eine anschlieende Reaktion knnen zu unterschiedlichen Zeitpunkten erfolgen:
Steuerelementwert
Bei Ereignis
Unmittelbar nachdem sich bei dem Steuerelement etwas ereignet hat, also zum Beispiel:
nach der nderung des Inhalts eines Textfelds nach dem Markieren eines Kontrollkstchens nach der Auswahl eines bestimmten Listeneintrags
Bei bernahme
Erst spter bei der bernahme der eingestellten bzw. ausgewhlten Werte in einen anderen Teil der Anwendung.
326
10.2
Die drei Bezeichnungsfelder bekommen die Namen lblZahl1, lblZahl2 und lblErgebnis. Die drei Textfelder heien entsprechend txtZahl1, txtZahl2 und txtErgebnis. Der Code der Ereignisprozedur des ersten Buttons:
Private Sub cmdTextfeld_Click() If Not IsNumeric(txtZahl1.Text) Or _ Not IsNumeric(txtZahl2.Text) Then MsgBox "Bitte Zahlen eingeben" Else txtErgebnis.Text = CDbl(txtZahl1.Text) _ + CDbl(txtZahl2.Text) End If End Sub
lbl, txt
327
10
Dialogfelder
Zur Erluterung:
Eigenschaft Text
Die Eigenschaft Text eines Textfelds enthlt die eingegebene Zeichenkette. Zunchst wird mit Hilfe der VBA-Funktion IsNumeric() geprft, ob in beiden Textfeldern eine Zeichenkette steht, die in eine Zahl umgewandelt werden kann. Ist dies der Fall, dann werden beide Zeichenketten mit der VBA-Funktion CDbl() in Zahlen umgewandelt. Anschlieend werden die beiden Zahlen addiert. Das Ergebnis wird im dritten Textfeld ausgegeben.
Prfen
Umwandeln
Ausgeben
Zur Ausgabe des Ergebnisses in einem Tabellenblatt dient die Ereignisprozedur des zweiten Buttons:
Private Sub cmdTabellenblatt_Click() If Not IsNumeric(txtZahl1.Text) Or _ Not IsNumeric(txtZahl2.Text) Then MsgBox "Bitte Zahlen eingeben" Else ThisWorkbook.Worksheets("Tabelle1"). _ Range("A1").Value = CDbl(txtZahl1.Text) _ + CDbl(txtZahl2.Text) End If End Sub
Zur Erluterung:
Die Textfelder werden wiederum geprft. Die Summe wird in die Zelle A1 des ersten Tabellenblatts bermittelt.
Hinweis
Bitte rufen Sie sich in Erinnerung, dass Werte aus Dialogfeldern nach dem Schlieen und Entladen des Dialogs nicht mehr zur Verfgung stehen. Sie mssen also vor dem Schlieen zum Tabellenblatt bermittelt werden.
Optionsschaltflchen (engl. radio buttons) bieten eine Auswahl aus mehreren Mglichkeiten an. Der Benutzer kann zwischen den Radio Buttons, die zu einer Gruppe gehren, hin und her schalten. Falls auf einem Dialogfeld mehrere unabhngige Gruppen von Radio Buttons bentigt werden, so sollten Sie mit Rahmen (engl. frames) arbeiten.
Frame
328
10.2
Kontrollkstchen
Ein Kontrollkstchen (engl. checkbox) dient zum Einstellen und Anzeigen von zwei mglichen Zustnden. Dabei kann es sich um die beiden Zustnde an oder aus handeln oder z. B. um die Zustnde farbig oder schwarz-wei. Im folgenden Beispiel werden zwei Frames dargestellt, die jeweils drei Radio Buttons enthalten, auerdem zwei Kontrollkstchen und zwei Buttons. Zur Erstellung empfiehlt sich die folgende Reihenfolge: 1. Einfgen des ersten Frames 2. Gre und Ort des Frames einstellen 3. Einfgen eines Radio Buttons in den Frame 4. Gre und Ort des Radio Buttons einstellen 5. Zweifaches Kopieren des Radio Buttons innerhalb des Frames
Erstellungsreihenfolge
Abbildung 10.11
6. Kopieren des gesamten Frames (inklusive der drei Radio Buttons) 7. Ort des zweiten Frames einstellen 8. Erstellen und Anordnen der restlichen Steuerelemente 9. Eigenschaftswerte 10. Eingabe der Eigenschaftswerte fr alle Steuerelemente (Name, Caption) Zur Erluterung:
Mit Hilfe des Dialogfelds sollen Eigenschaften einer Tabellenzelle eingestellt werden. In der ersten Gruppe wird die Schriftfarbe gewhlt. Die zweite Gruppe dient zur Einstellung der Schriftgre. Durch die beiden Kontrollkstchen entscheidet der Benutzer, ob die Zelle einen Rahmen (bzw. ein Muster) haben soll.
Farboptionen Grenoptionen Mit/ohne Rahmen
329
10
Dialogfelder
Innerhalb der beiden Gruppen von Radio Buttons sollte eine Option bereits voreingestellt sein. Damit vermeiden Sie einen undefinierten Zustand. Diese Voreinstellung knnen Sie entweder ber das Eigenschaftsfenster oder per Code vornehmen. Es empfiehlt sich, den gewnschten Anfangszustand synchron fr Tabellenzelle und Dialogfeld vorzunehmen. Dazu ist das Ereignis Initialisieren des Dialogfelds geeignet:
Option Explicit Dim Rg As Range Private Sub UserForm_Initialize() Set Rg = ThisWorkbook.Worksheets("Tabelle1"). _ Range("B2") Rg.Value = "Hallo" Rg.Font.Color = vbRed Rg.Font.Size = 13 Rg.Borders.LineStyle = xlDouble optRot.Value = True opt13.Value = True chkRahmen.Value = True End Sub
Synchronisieren
Ereignis initialisieren
Zur Erluterung:
330
10.2
UserForm_ Initialize()
Innerhalb der Ereignisprozedur UserForm_Initialize() wird der Variablen Rg die Zelle B2 zugewiesen. Diese Zelle bekommt einen Inhalt, eine Schriftfarbe und -gre sowie einen Rahmen. Anschlieend werden die entsprechenden Einstellungen fr die Steuerelemente vorgenommen. Sowohl bei Radio Buttons als auch bei Kontrollkstchen steht die Eigenschaft Value fr den Zustand (Wert True fr an, Wert False fr aus).
Eigenschaft Value
Der Code des Buttons bertragen dient zur bernahme der Auswahl des Benutzers und zum Einstellen der Eigenschaften der Tabellenzelle:
Private Sub cmdbertragen_Click() If optRot.Value Then Rg.Font.Color = vbRed ElseIf optGelb.Value Then Rg.Font.Color = vbYellow Else Rg.Font.Color = vbGreen End If If opt10.Value Then Rg.Font.Size = 10 ElseIf opt13.Value Then Rg.Font.Size = 13 Else Rg.Font.Size = 16 End If If chkRahmen.Value Then Rg.Borders.LineStyle = xlDouble Else Rg.Borders.LineStyle = xlLineStyleNone End If If chkMuster.Value Then Rg.Interior.Color = vbBlue
Button bertragen
331
10
Dialogfelder
Zur Erluterung:
Value True/False
Da der Wert der Eigenschaft Value der Radio Buttons und der Kontrollkstchen vom Typ Boolean ist, kann er unmittelbar fr die verschiedenen Verzweigungen genutzt werden. Er muss nicht mehr mit True verglichen werden. Bei den Gruppen von Radio Buttons wird die Schriftfarbe bzw. -gre per Mehrfachverzweigung eingestellt. Rahmen und Muster werden abhngig vom Wert des zugehrigen Kontrollkstchens in einer einfachen Verzweigung ausgewhlt.
Der Button Ende dient mit Hilfe des folgenden Codes wieder zum Schlieen des Dialogfelds:
Private Sub cmdEnde_Click() Unload Me End Sub
Ein Listenfeld bietet dem Benutzer die Mglichkeit, einen Eintrag aus einer Liste auszuwhlen. Ein Kombinationsfeld ist eine Kombination aus einem Listenfeld und einem Textfeld. Der Benutzer kann also nicht nur auswhlen, sondern auch eintragen. Falls Sie bei einem Kombinationsfeld die Eigenschaft Style auf den Wert 2 (= fmStyleDropDownList) stellen, dann handelt es sich um ein Listenfeld, wie Sie es von Microsoft Windows gewohnt sind: Es hat einen einfachen Pfeil, mit dem die Liste aufgeklappt werden kann.
ScrollBar, SpinButton
Sowohl Bildlaufleiste (ScrollBar) als auch Drehfeld (SpinButton) dienen zur Einstellung von Zahlenwerten innerhalb eines vorgegebenen Bereichs. Sie sind in ihrer Funktion hnlich, allerdings lsst sich eine Bildlaufleiste grer und deutlicher darstellen. Allen Steuerelementen in diesem Abschnitt ist eines gemeinsam: Das wichtigste Ereignis ist Change, d. h. Auswahl wurde gendert. Im folgenden Beispiel werden die drei genannten Steuerelemente vorgestellt.
Ereignis Change
332
10.2
Daneben steht jeweils ein Textfeld, in dem der ausgewhlte bzw. eingestellte Wert abgebildet wird.
Bei allen drei Textfeldern wurde die Eigenschaft Locked auf True gesetzt. Dadurch knnen sie nicht mehr direkt durch eine Eingabe des Benutzers verndert werden, nur noch durch die Anwendung. Zur optischen Hervorhebung wurde bei allen drei Textfeldern die Eigenschaft BackColor auf grau gestellt. Der Programmcode zum Dialogfeld:
Private Sub UserForm_Initialize() cmbStadt.AddItem "Berlin" cmbStadt.AddItem "Hamburg" cmbStadt.AddItem "Mnchen" cmbStadt.ListIndex = 0 End Sub Private Sub cmbStadt_Change() txtStadt.Text = cmbStadt.Text End Sub Private Sub scrZahl1_Change() txtZahl1.Text = scrZahl1.Value End Sub Private Sub spnZahl2_Change() txtZahl2.Text = spnZahl2.Value End Sub Private Sub cmdEnde_Click() Unload Me End Sub
Eigenschaft Locked
333
10
Dialogfelder
Die Eigenschaft Style des Kombinationsfelds wird zur Entwurfszeit im Eigenschaftsfenster manuell auf den Wert 2 (= fmStyleDropDownList) gestellt. Damit erzeugen Sie das Aussehen einer Liste, mit einem einfachen Pfeil zum Aufklappen. Beim Initialisieren des Dialogfelds wird die Liste mit Eintrgen gefllt. Dazu dient die Methode AddItem(). Die Eintrge in einem Listenfeld oder einem Kombinationsfeld sind (mit 0 beginnend) durchnummeriert. Einen bestimmten Eintrag erreicht man ber die Eigenschaft List(Nummer). Der erste Eintrag der Liste wird ausgewhlt. Dazu stellen Sie den Wert der Eigenschaft ListIndex auf 0. Diese Eigenschaft reprsentiert zu jedem Zeitpunkt die Nummer der aktuellen Auswahl innerhalb der Liste. Falls das Ereignis Change eintritt, wird die zugehrige Ereignisprozedur durchlaufen. Die Eigenschaft Text reprsentiert zu jedem Zeitpunkt den Text der aktuellen Auswahl innerhalb der Liste. Ihr Wert wird dem Textfeld zugewiesen.
AddItem()
List(Nummer)
ListIndex
Ereignis Change
Eigenschaft Text
Sie soll waagerecht liegen, zur Einstellung von Werten zwischen 1 und 100 dienen und zu Beginn bei 50 stehen. Ein Klick auf einen der beiden Pfeile soll den Wert um 1 verndern. Ein Klick auf den freien Bereich zwischen den beiden Pfeilen soll den Wert um 10 verndern.
334
10.2
Min, Max, Value
Falls das Ereignis Change eintritt, wird die zugehrige Ereignisprozedur durchlaufen. Die Eigenschaft Value reprsentiert zu jedem Zeitpunkt den aktuellen Wert. Er wird dem Textfeld zugewiesen.
Value
Eigenschaften und Ereignisprozeduren werden wie bei der Bildlaufleiste eingestellt. Es gibt allerdings nur die Eigenschaft SmallChange, nicht die Eigenschaft LargeChange, da das Drehfeld eine andere Darstellung hat. Auerdem soll es senkrecht stehen: Die Eigenschaft Orientation bekommt den Wert 0 (= fmOrientationVertical)
SmallChange
10.2.9 Ausgabeformatierung
Einige Mglichkeiten der Funktion Format() zur Ausgabeformatierung innerhalb von Nachrichten-Dialogfeldern wurden bereits vorgestellt (siehe Abschnitt 8.3.2, Ausgabeformatierung). Bei der Ausgabe in Steuerelementen von eigenen Dialogfeldern zeigt diese Funktion noch weiteren Nutzen. Nachfolgend ein Dialogfeld, in dem in einem Listenfeld und in einem Bezeichnungsfeld jeweils eine kleine Tabelle ausgegeben wird. Bei beiden Steuerelementen wird zunchst die Eigenschaft Font auf Courier New gestellt. Dabei handelt es sich um eine Nicht-Proportionalschriftart, das heit, jedes Zeichen nimmt die gleiche Breite ein. Dies ist fr die Formatierung in Tabellenform wichtig.
Format()
335
10
SpecialEffect
Dialogfelder
Auerdem wurde die Eigenschaft SpecialEffect des Bezeichnungsfelds auf den Wert 2 (= fmSpecialEffectSunken) gesetzt. Durch diese etwas vertiefte Darstellung wird das Feld deutlicher erkennbar. Zunchst die Anwendung:
Private Dim Dim Dim Dim Dim Sub UserForm_Initialize() Nr(1 To 3) As Integer Prod(1 To 3) As String Preis(1 To 3) As Single Zeile As String i As Integer
' Felder initialisieren Nr(1) = 5 Nr(2) = 11 Nr(3) = 346 Prod(1) = "Apfel" Prod(2) = "Banane" Prod(3) = "Kartoffel" Preis(1) = 2 Preis(2) = 1.95 Preis(3) = 2.5 ' Ausgabe lblTabelle.Caption = "" For i = 1 To 3 ' Formatierte Ausgabezeile zusammenstellen Zeile = Format(Nr(i), "@@@@") & _ " " & Format(Prod(i), "!@@@@@@@@@@@@") & _ Format(Format(Preis(i), "0.00"), "@@@@@@@") ' Zeile zu Listenfeld hinzufgen lstTabelle.AddItem Zeile ' Zeile zu Bezeichnungsfeld hinzufgen lblTabelle.Caption = _ lblTabelle.Caption & Zeile & vbCrLf Next i End Sub
336
10.2
Abbildung 10.18
Formatierte Ausgabe
Zur Erluterung:
Zunchst werden drei Datenfelder vom Typ Integer, String und Single deklariert und mit einigen Werten gefllt. Die drei zusammengehrigen Feldelemente werden zu einer formatierten Zeichenkette zusammengefgt. Diese Zeichenkette wird dem Listenfeld und dem Bezeichnungsfeld hinzugefgt. Die Formatierung @@@@ fhrt dazu, dass die Integer-Zahl einheitlich rechtsbndig mit der Breite 4 ausgegeben wird. Jedes @ steht fr ein Zeichen. Mit Hilfe des Ausrufezeichens knnen Sie eine linksbndige Ausgabe erzeugen. Im vorliegenden Fall wird mit der Formatierung !@@@@@@@@@@@@ die Zeichenkette einheitlich linksbndig mit der Breite 12 ausgegeben. Hier haben wir eine Schachtelung von zwei Aufrufen der Funktion Format(). Die innere Formatierung 0.00 ist bereits bekannt und ergibt eine Zeichenkette, die eine Zahl mit zwei Nachkommastellen und einem anschlieenden Eurozeichen beinhaltet. Die uere Formatierung sorgt dafr, dass diese Zeichenkette einheitlich rechtsbndig mit der Breite 7 ausgegeben wird.
Rechtsbndig
Linksbndig
Geschachteltes Format
337
10
Dialogfelder
Die Eingabe per Maus ist nur mglich, wenn der Cursor zunchst im RefEdit-Steuerelement steht. Beim anschlieenden Klick im Tabellenblatt verkleinert sich das gesamte Dialogfeld, so dass nur noch das RefEditSteuerelement sichtbar ist.
Ein Umschaltfeld (engl. toggle button) dient zur Umschaltung bzw. Anzeige von zwei mglichen Zustnden. Die wichtigste Eigenschaft ist Value; sie steht entweder auf True oder auf False. Im folgenden Beispiel werden die beiden Steuerelemente genutzt, um einen ausgewhlten Zellbereich mit oder ohne gelbe Farbe darzustellen:
338
10.2
Der Programmcode:
Private Sub tglFarbe_Click() If tglFarbe.Value Then tglFarbe.BackColor = vbYellow Else tglFarbe.BackColor = vbWhite End If End Sub Private Sub cmdbertragen_Click() On Error GoTo Fehler If tglFarbe.Value Then Range(rfeZellbereich.Value).Interior. _ Color = vbYellow Else Range(rfeZellbereich.Value).Interior. _ Pattern = xlNone End If Exit Sub Fehler: MsgBox "Es wurde kein Bereich ausgewhlt" End Sub Private Sub cmdEnde_Click() Unload Me End Sub
Zur Erluterung:
Beim Bettigen des Umschaltfelds wechselt der Wert der Eigenschaft Value von True auf False bzw. umgekehrt. Zur deutlicheren Darstellung wird gleichzeitig die Farbe des Umschaltfelds gewechselt. Falls es eingeschaltet ist, also vertieft dargestellt wird, dann ist es gelb, ansonsten wei. Beim Bettigen des Buttons bertragen wird der ausgewhlte Zellbereich entweder gelb eingefrbt oder ohne Muster dargestellt. Da es mglich ist, im RefEdit-Feld etwas einzutragen, was keinem Zellbereich entspricht, muss dies mit Hilfe von On Error abgefangen werden.
Umschaltfeld
Button bertragen
339
Ein umfangreiches Beispielprojekt verbindet zahlreiche Aspekte der VBA-Programmierung, die Sie in diesem Buch erlernt haben, miteinander.
11
Beispielprojekt
Kleine Beispielprogramme und bungen knnen die einzelnen Programmiertechniken vermitteln. Dies gilt besonders fr die Beispiele in den fortgeschrittenen Kapiteln, da hier die Grundlagen vorausgesetzt und bentigt werden. Bei einem Projekt kann man allerdings noch deutlicher die Zusammenarbeit der einzelnen Teile einer Anwendung darstellen. In dem Projekt Nordwind in diesem Abschnitt werden u. a. folgende Aspekte gemeinsam eingesetzt:
Zusammenarbeit
Zugriff auf Tabellen und Zellbereiche Einsatz von Datenfeldern und benutzerdefinierten Datentypen Dialogfelder, Steuerelemente und Ereignisprogrammierung eindeutige Benutzerfhrung zur Vermeidung von Fehlern Modularisierung, also die Unterteilung des Programms in bersichtliche Einzelteile, und der Aufruf der Module von verschiedenen Stellen aus
Neue Techniken
Einige Techniken, deren Einsatzzweck und Vorteile sich in einfachen Beispielen gar nicht verdeutlichen lassen, werden im Projekt sogar erstmals genutzt und erlutert. Auerdem kann der Entwickler die Anwendung individuell verbessern, erweitern und seinen Bedrfnissen anpassen.
Anpassen, erweitern
11.1
Bei der Datei Nordwind.mdb handelt es sich eigentlich um eine BeispielDatenbank, die zusammen mit Access ausgeliefert wird. Sie enthlt ein
341
11
Beispielprojekt
Die Nordwind-Datenbank wurde fr dieses Projekt als Vorlage genommen. Es wird gezeigt, dass mit einer Excel-Datei, einigen Dialogfeldern und den in diesem Buch vorgestellten Mitteln der VBA-Programmierung bereits einige wichtige Aspekte der Warenwirtschaft umgesetzt werden knnen. Das Projekt umfasst folgende Mglichkeiten:
Neuanlage, ndern und Lschen von Kundendaten Neuanlage, ndern und Lschen von Artikeldaten Neuanlage von Bestellungen, inklusive E-Mail-Versand einer Bestellbesttigung
Vorteile
Die Vorteile der Anwendung gegenber der reinen Speicherung der Tabellendaten:
Schutz
Der Benutzer hat keine Mglichkeit, direkt auf die Tabellendaten zuzugreifen. Er kann nderungen nur kontrolliert ber die Dialogfelder vornehmen. Daten und Struktur der Tabellen werden damit vor versehentlichen nderungen geschtzt. Dem Benutzer stehen Hilfen zur Eingabe und zum Suchen bestimmter Daten zur Verfgung. Den Kunden, Artikeln und Bestellungen werden eindeutige Nummern zugeordnet. Damit knnen die Zusammenhnge zwischen den verschiedenen Informationen eindeutig hergestellt werden und die Daten ohne Redundanz, das heit ohne Doppelinformation, gespeichert werden.
Hilfe
Eindeutigkeit
Hinweis
Fr den Leser, der sich bereits mit Datenbanken beschftigt hat: Durch die eindeutige Zuordnung wird es ermglicht, die sogenannten 1:n-Relationen aus der Datenbank in einfacher Form nachzubilden.
11.2
In diesem Abschnitt wird beschrieben, wie die Excel-Datei aus der Access-Datei vor dem eigentlichen Beginn des Projekts erstellt wurde.
342
11.2
11.2.1
Tabelle Kunden
Kunden exportieren
Die Tabelle Kunden der Nordwind.mdb wird inklusive Feldnamen als Excel-Tabelle exportiert.
In Excel werden alle Spalten (= Datenbankfelder) gelscht auer: Kunden-Code, Firma, Strae, PLZ, Ort und Land. Die Spalte Kunden-Code wird ans Ende verschoben und in Email umbenannt. Aus den Inhalten wird eine E-Mail-Adresse generiert. Ein Beispiel: aus dem Kunden-Code ALFKI wird info@alfki.biz. Die entsprechende Funktion, die in der Tabelle angewendet wird, lautet: =VERKETTEN("info@"; KLEIN(A2); ".biz"). Die Tabelle Kunden ist bereits nach dem Namen der Firma sortiert. Vor der Spalte Firma wird eine Spalte eingefgt. Sie bekommt den Namen Kundennummer. In dieser Spalte werden fortlaufende, eindeutige Kundennummern eingefgt (1, 2, 3...). Die erste Zeile mit den Spaltennamen wird in Fettschrift formatiert. Das Ergebnis ist in Abbildung 11.1 dargestellt.
Kundennummer
11.2.2
Tabelle Artikel
Artikel exportieren
Die Tabelle Artikel der Nordwind.mdb wird ebenfalls inklusive Feldnamen als Excel-Tabelle exportiert.
In Excel werden alle Spalten (= Datenbankfelder) gelscht auer: Artikel-Nr, Artikelname, Kategorie-Nr, Liefereinheit, Einzelpreis und Lagerbestand. Die Spalte Artikel-Nr wird umbenannt in Artikelnummer, die Spalte Kategorie-Nr in Kategorie. Beim Export aus Access sind automatisch anstelle der Kategorienummern die verknpften Kategorienamen exportiert worden. Die Tabelle Artikel wird nach der Spalte Artikelname sortiert.
Artikelnummer
343
11
Beispielprojekt
Die Spalte Einzelpreis wird mit dem Eurozeichen formatiert. Die erste Zeile mit den Spaltennamen wird in Fettschrift formatiert.
11.2.3
Restliche Vorbereitungen
Die beiden Tabellen Kunden und Artikel werden in eine neue Excel-Datei kopiert, die unter dem Namen Nordwind.xlsm (in Excel-Versionen vor 2007: Nordwind.xls) gespeichert wird. Es werden noch zwei weitere Tabellen hinzugefgt. Diese Tabellen enthalten zunchst keine Daten, sondern nur die nachfolgend genannten Spalten als berschriften in Zeile 1:
Bestellungen Bestelldetails
Tabelle Bestellungen: Bestellnummer, Kundennummer, Bestelldatum Tabelle Bestelldetails: Bestellnummer, Artikelnummer, Anzahl
Die jeweils erste Zeile mit den Spaltennamen wird in Fettschrift formatiert. Die Datei umfasst damit die in Abbildung 11.3 dargestellten Tabellen.
Der Anwendung wird ein Verweis auf die Outlook-Bibliothek hinzugefgt, siehe Abschnitt 9.4.1, Objektmodell von Outlook.
11.3
Zum besseren Verstndnis folgt eine Schilderung der Benutzung des Programms. Der VBA-Code wird in einem spteren Abschnitt beschrieben.
344
11.3
11.3.1
Hauptdialogfeld Nordwind
Nach dem Aufruf der Excel-Datei Nordwind.xlsm (in Excel-Versionen vor 2007: Nordwind.xls) erscheint automatisch das Hauptdialogfeld der Anwendung:
Nach Bettigung eines der oberen fnf Buttons verschwindet das Hauptdialogfeld, und es erscheint das entsprechende Unterdialogfeld. Mit Hilfe des Buttons Ende knnen Sie die Anwendung verlassen. Dabei wird automatisch gespeichert und die Datei geschlossen. Der Benutzer kann also nicht direkt auf die Tabellendaten zugreifen. Hinweis
Natrlich kann der Benutzer jedes Dialogfeld der Anwendung ber das Kreuz oben rechts schlieen und anschlieend direkt auf die Tabellendaten zugreifen. Auch dies knnten Sie verhindern. Da es sich hierbei allerdings um ein Beispielprojekt fr angehende Entwickler handelt, wurde der Zugriff nicht unterbunden.
Unterdialogfelder
Automatische Speicherung
11.3.2
Nach Bettigung des Buttons Kunden Neu erscheint das entsprechende Dialogfeld (siehe Abbildung 11.5).
345
11
Beispielprojekt
Hier knnen die Daten eines neuen Kunden eingegeben werden. Falls der Firmenname leer ist oder ein Firmenname eingegeben wurde, der bereits existiert, dann wird die Speicherung abgelehnt. Andernfalls werden die Daten der neuen Firma in der Tabelle Kunden eingefgt. Dabei bleibt die alphabetische Sortierung nach Firmenname erhalten. ber den Button Zurck kehren Sie zurck zum Hauptdialogfeld.
11.3.3
Nach Bettigung des Buttons Kunden ndern erscheint das in Abbildung 11.6 dargestellte Dialogfeld, in dem der Benutzer Daten ndern oder lschen kann.
346
11.3
Suchen Innerhalb des Rahmens Suchen kann nach einer bestimmten Firma gesucht werden. Sobald der Benutzer ein Zeichen im Textfeld eingibt, wird der Inhalt des Kombinationsfelds verndert. Es wird jeweils eine Liste der Firmen angezeigt, deren Name die eingegebene Zeichenfolge enthlt, egal an welcher Stelle, unabhngig von Gro- und Kleinschreibung. Ein Beispiel: Der Benutzer gibt ga ein. Es erscheint eine Liste mit den Eintrgen Galeria ..., Magazzini ... und Tortuga ... Die Daten des ersten Listeneintrags werden sofort in den Feldern des unteren Bereichs angezeigt. Hinweis
Bei diesem Kombinationsfeld (und einigen anderen Kombinationsfeldern des Projekts) wurde die Eigenschaft Style auf den Wert DropDownList gesetzt. Es hat also das Verhalten eines Listenfelds.
Sucht Zeichenfolge
Automatische Anzeige
Falls der Benutzer einen der Listeneintrge auswhlt, erscheinen dessen Daten in den Feldern des unteren Bereichs. Die Kundennummer wird von der Anwendung verwaltet und kann als einzige Angabe nicht vom Benutzer gendert werden.
Anzeige wechselt
Kundennummer geschtzt
347
11
Beispielprojekt
ndern, Lschen
nderung speichern
Der Benutzer kann nderungen an den Daten vornehmen. Falls der Firmenname leer ist oder ein Firmenname eingegeben wurde, der bereits existiert, dann wird die Speicherung abgelehnt. Falls der Benutzer den Button Lschen bettigt, wird der Datensatz nach einer Rckfrage gelscht. Hinweis
Es knnen Kunden gelscht werden, die aktuelle Bestellungen haben. Hier ergeben sich erste bungsmglichkeiten fr den angehenden Entwickler, nachdem er den gesamten Aufbau der Anwendung verstanden hat.
Kunde lschen
Hier knnen die Daten eines neuen Artikels eingegeben werden. Falls der Artikelname leer ist oder ein Artikelname eingegeben wurde, der bereits existiert, wird die Speicherung abgelehnt. Es kann eine von insgesamt acht Kategorien ausgewhlt werden. Der Einzelpreis wird getrennt nach Euro und Cent eingegeben, aber gemeinsam in einer Tabellenzelle gespeichert. Der Lagerbestand kann eingegeben oder ber die beiden Buttons bestimmt werden.
348
11.3
Rechtsbndige Zahlen
Bei den insgesamt drei Textfeldern fr Einzelpreis und Lagerbestand wurde die Eigenschaft TextAlign auf den Wert 3 (= fmTextAlignRight) gesetzt, so dass die Zahlen rechtsbndig angezeigt werden. Die Daten des neuen Artikels werden in der Tabelle Artikel eingefgt. Dabei bleibt die alphabetische Sortierung nach Artikelname erhalten. ber den Button Zurck kehren Sie zurck zum Hauptdialogfeld.
Sortierung bleibt
11.3.5
Nach Bettigung des Buttons Artikel ndern erscheint das in Abbildung 11.9 dargestellte Dialogfeld, in dem der Benutzer Daten ndern oder lschen kann.
Suchen Innerhalb des Rahmens Suchen kann nach einem bestimmten Artikel gesucht werden. In der Liste Artikelname werden nur die Artikel der ausgewhlten Kategorie angezeigt. Im unteren Bereich werden die Daten des ausgewhlten Artikels angezeigt. Sobald der Benutzer eine andere Kategorie auswhlt, wird die Liste Artikelname neu gefllt, und es ndert sich die Anzeige im unteren Bereich.
Automatische Anzeige
Anzeige wechselt
349
11
Beispielprojekt
Sobald der Benutzer einen anderen Artikel auswhlt, ndert sich die Anzeige ebenfalls. ndern, Lschen
Artikelnummer geschtzt
Die Artikelnummer wird von der Anwendung verwaltet und kann als einzige Angabe nicht vom Benutzer gendert werden. Der Benutzer kann nderungen an den Daten vornehmen. Falls er den Button Lschen bettigt, wird der Datensatz nach einer Rckfrage gelscht. Hinweis
Es knnen Artikel gelscht werden, die in aktuellen Bestellungen stehen. Dies sollte vom angehenden Entwickler noch verbessert werden.
Nach Bettigung des Buttons Bestellungen Neu kommt der Benutzer zum wesentlichen Einsatzzweck der Anwendung: zur Bestellung. Hier hat er die folgenden Mglichkeiten:
fr einen Kunden die gewnschte Anzahl verschiedener Artikel zusammenzustellen diese Bestellung zu speichern dem Kunden eine Bestellbesttigung per E-Mail zu senden
Datum einstellen, Suchen Schauen wir uns zunchst den oberen Teil des Dialogfelds an, in dem ein Kunde und ein Artikel ausgewhlt werden (siehe Abbildung 11.10).
Bestelldatum
Ganz oben erscheint als Bestelldatum zunchst automatisch das aktuelle Tagesdatum. Sobald der Benutzer in das Bezeichnungsfeld mit dem Bestelldatum klickt, erscheint ein Kalender-Steuerelement (siehe Abbildung 11.11). Das Kalender-Steuerelement verdeckt zwar einige andere Steuerelemente, ist aber nur temporr sichtbar. Sobald der Benutzer ein Datum per Doppelklick ausgewhlt hat, wird das Kalender-Steuerelement wieder ausgeblendet, und das ausgewhlte Bestelldatum wird fr das Bezeichnungsfeld bernommen.
Kalender einblenden
350
11.3
Suche bekannt
Innerhalb der beiden Rahmen Firma Suchen und Artikel Suchen knnen mit Hilfe der Techniken, die aus den vorherigen Abschnitten bereits bekannt sind, ein Kunde und ein Artikel ausgewhlt werden. Die Daten des Kunden und des Artikels werden jeweils unter den Rahmen angezeigt.
Hinzufgen, Speichern Nachdem der Benutzer einen Artikel ausgewhlt hat, kann er die gewnschte Anzahl eintragen oder ber die beiden Buttons einstellen. Abbildung 11.12 zeigt den unteren Teil des Dialogfelds.
Bestelltabelle
351
11
Beispielprojekt
Nach Bettigung des Buttons Hinzufgen wird der Liste der bestellten Artikel ein weiteres Element in einheitlicher Formatierung hinzugefgt. Dieses Element enthlt bezglich des hinzugefgten Artikels:
die Anzahl die eindeutige Artikelnummer den Artikelnamen den Einzelpreis den Gesamtpreis (Einzelpreis * Anzahl)
Schritt fr Schritt wird die Bestellung vervollstndigt, indem der Benutzer einen Artikel auswhlt, die Anzahl eintrgt und der Bestellung hinzufgt.
Button Speichern
wird die Bestellung in der Tabelle Bestellungen eingetragen. werden die bestellten Artikel inklusive Anzahl in der Tabelle Bestelldetails eingetragen. wird eine E-Mail als Bestellbesttigung an den Kunden gesandt.
352
11.4
11.4
11.4.1
Das VBA-Projekt
Abbildung 11.13 zeigt eine bersicht ber die verschiedenen Bestandteile des VBA-Projekts.
insgesamt sechs Dialogfelder (UserForms): das Hauptdialogfeld Nordwind und die fnf Unterdialogfelder, jeweils mit frm beginnend die Arbeitsmappe Mappe_Nordwind ein Code-Modul mit VBA-Code, das von allen Teilen der Anwendung benutzt wird (Modul_Gemeinsam) die vier Tabellen der Anwendung
Sechs Dialogfelder
Gemeinsamer Code
11.4.2
Die Arbeitsmappe
Anwendung starten
In der Arbeitsmappe Mappe_Nordwind steht die Prozedur zum automatischen Start der Anwendung:
Private Sub Workbook_Open() frmNordwind.Show End Sub
Zur Erluterung:
353
11
Workbook_Open
Beispielprojekt
Sobald das Ereignis Workbook_Open auftritt, der Benutzer also die Datei ffnet, wird das Hauptdialogfeld Nordwind angezeigt.
Ein Datenfeld von Zeichenketten, in dem die acht verschiedenen Kategorien gespeichert sind. Es ist wie folgt deklariert: Public Kategorie(1 To 8) As String. Die Prozedur ListeFirmaFuellen() zum Fllen der Firmenliste nach der Eingabe von einzelnen Zeichen. Erluterung dieser sowie der folgenden Funktion siehe Abschnitt 11.4.6, Unterdialogfeld Kunden ndern . Die Funktion ZeileFirmaSuchen() zum Suchen und Zurckliefern der Zeile des aktuellen Kunden. Die Prozedur ListeArtikelFuellen() zum Fllen der Artikelliste nach der Auswahl der Kategorie. Erluterung dieser Prozedur sowie der folgenden Funktion siehe Abschnitt 11.4.8, Unterdialogfeld Artikel ndern . Die Funktion ZeileArtikelSuchen() zum Suchen und Zurckliefern der Zeile des aktuellen Artikels. Die Prozeduren Kleiner() und Groesser() zum ndern der Artikelanzahl (Lagerbestand bzw. bestellte Artikel) mit Hilfe der beiden Buttons mit den Zeichen fr kleiner und grer: < und >. Erluterung siehe Abschnitt 11.4.7, Unterdialogfeld Artikel Neu .
Public
Das Datenfeld, die Prozeduren und die Funktionen sind ffentlich, also vom Typ Public. Damit knnen sie von jedem Modul der Anwendung aus erreicht werden.
354
11.4
= = = = = =
' Private Sub UserForm_QueryClose _ (Cancel As Integer, CloseMode As Integer) ' ThisWorkbook.Save ' ThisWorkbook.Close ' End Sub Private Sub cmdEnde_Click() ThisWorkbook.Save ThisWorkbook.Close End Sub
Zur Erluterung:
Die Prozedur UserForm_Initialize() wird nach dem Programmstart aufgerufen. Innerhalb der Prozedur wird das Datenfeld mit den acht Kategorienamen gefllt. Auf dieses Datenfeld wird in verschiedenen Unterdialogfeldern zugegriffen. Die Prozedur UserForm_QueryClose() wird in dem Moment aufgerufen, in dem das Hauptdialogfeld ber das Kreuz oben rechts geschlossen wird. Die Arbeitsmappe wird gesichert und geschlossen. Diese Prozedur ist allerdings deaktiviert, damit sich der angehende Entwickler leichter den VBA-Code ansehen kann. Die gleiche Prozedur muss auch bei den Unterdialogfeldern existieren, falls Sie den VBA-Code besser vor dem unberechtigten Zugriff eines Normalbenutzers schtzen mchten. Die Prozedur cmdEnde_Click() wird aufgerufen, wenn der Benutzer das Programm regulr, also durch Bettigung des Buttons Ende, verlsst. Die Arbeitsmappe wird gesichert und geschlossen.
UserForm_ Initialize()
UserForm_ QueryClose()
Speichern, beenden
355
11
Beispielprojekt
frmKundenNeu.Show End Sub Private Sub cmdKundenAendern_Click() Me.Hide frmKundenAendern.Show End Sub Private Sub cmdArtikelNeu_Click() Me.Hide frmArtikelNeu.Show End Sub Private Sub cmdArtikelAendern_Click() Me.Hide frmArtikelAendern.Show End Sub Private Sub cmdBestellungenNeu_Click() Me.Hide frmBestellungenNeu.Show End Sub
Zur Erluterung:
Dialogfeld verstecken
Die Prozeduren dienen zum Aufruf der jeweiligen Unterdialogfelder. Sie haben alle den gleichen Ablauf:
Das Hauptdialogfeld wird versteckt, also ausgeblendet. Das jeweilige Unterdialogfeld wird angezeigt.
Hide()
Mit dem Begriff Me wird das aktuelle Dialogfeld bezeichnet. Die Methode Hide() sorgt dafr, dass die Daten des Dialogfelds weiterhin zur Verfgung stehen, das Dialogfeld selbst aber nicht mehr sichtbar ist. Wrde das Hauptdialogfeld mit Unload Me entladen, dann wrden auch die Daten gelscht werden. Der Inhalt des Datenfelds mit den acht Kategorienamen wre dann nicht mehr vorhanden.
Unload Me
Die Unterdialogfelder Kunden Neu, Artikel Neu und Bestellungen Neu enthalten hnliche Ablufe. Sie sind in diesem Abschnitt ausfhrlich geschildert, in den Abschnitten 11.3.4 und 11.3.5 nur kurz.
356
11.4
Beginn, Ende Zunchst zwei Prozeduren dieses Dialogfelds, die zu Beginn und Ende wichtig sind:
Private Sub UserForm_Initialize() ' Zugehrige Tabelle aktivieren ThisWorkbook.Worksheets("Kunden").Activate End Sub Private Sub cmdZurueck_Click() ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
Zur Erluterung: In der Prozedur UserForm_Initialize() wird sichergestellt, dass bei den anschlieenden Tabellenzugriffen mit der richtigen Tabelle gearbeitet wird, unabhngig davon, welche Tabelle vorher aktiv war. Falls der Benutzer den Button Zurck bettigt, wird dieses Unterdialogfeld entladen und wiederum das Hauptdialogfeld Nordwind angezeigt. Bereits eingetragene, aber nicht gespeicherte Daten des Unterdialogfelds gehen beim Verlassen verloren. Dies soll aber so sein, damit beim nchsten Aufruf das Unterdialogfeld leer ist. Dies gilt fr alle Unterdialogfelder. Der Button Zurck ist in allen Unterdialogfeldern der Default-Button. Dies ist der Button, der den Fokus hat. Anders ausgedrckt: Falls der Benutzer nach Aufruf des Dialogfelds nur die Taste () bettigt, ist dies wie eine Bettigung des Default-Buttons. Dies dient einer besseren und einheitlichen Benutzerfhrung. Im Eigenschaftsfenster muss die Eigenschaft Default des Buttons den Wert True bekommen.
Tabelle auswhlen
Daten gelscht
Default-Button
Speichern Es folgt die etwas umfangreichere Prozedur fr den Button Speichern, also das Speichern eines neuen Kunden:
Private Dim Dim Dim Dim Sub cmdSpeichern_Click() Zeile As Integer LetzteZeile As Integer MaxKundennummer As Integer FirmaNeu As String
Button Speichern
357
11
Beispielprojekt
' Ablehnen, falls kein Name fr Firma angegeben If txtFirma.Text = "" Then MsgBox "Bitte einen Namen fr die Firma eintragen" Exit Sub End If ' In Grobuchstaben umwandeln FirmaNeu = StrConv(txtFirma.Text, vbUpperCase) ' Alle Firmennamen durchsuchen Zeile = 2 Do While Cells(Zeile, 2).Value <> "" ' Falls neuer Firmenname bereits vorhanden If StrConv(Cells(Zeile, 2).Value, vbUpperCase) = _ FirmaNeu Then MsgBox "Fehler: Es gibt bereits eine " & _ "Firma mit diesem Namen", vbCritical Exit Sub ' Zeile fr neue Firma ermitteln ElseIf StrConv(Cells(Zeile, 2).Value, _ vbUpperCase) > FirmaNeu Then Exit Do End If Zeile = Zeile + 1 Loop ' Letzte Zeile ermitteln LetzteZeile = ActiveSheet.UsedRange. _ SpecialCells(xlLastCell).Row ' Bisher grte Kundennummer ermitteln MaxKundennummer = WorksheetFunction.Max _ (Range(Cells(2, 1), Cells(LetzteZeile, 1))) ' Neue Zeile einfgen, falls notwendig If Zeile <= LetzteZeile Then Cells(Zeile, 1).EntireRow.Insert End If ' Erste Zeile unter berschrift ohne Fettdruck If Zeile = 2 Then Cells(Zeile, 1).EntireRow.Font.Bold = False End If
358
11.4
' Neue Firma Cells(Zeile, Cells(Zeile, Cells(Zeile, Cells(Zeile, Cells(Zeile, Cells(Zeile, Cells(Zeile,
' Info MsgBox "Neue Firma " & txtFirma.Text & _ " wurde eingetragen"
Zur Erluterung:
Falls der Benutzer keinen Firmennamen eingetragen hat, hat die Speicherung keinen Sinn. Sie wird daher abgelehnt, und die Prozedur wird verlassen. Der eingegebene Firmenname wird mit der Zeichenkettenfunktion StrConv() in Grobuchstaben umgewandelt. Diese Funktion hat zwei feste Parameter:
StrConv()
den Text, der umgewandelt werden soll die Form der Umwandlung
Umwandlung
Anschlieend wird die (nach Artikelnamen sortierte) Tabelle Zeile fr Zeile durchsucht. Falls der neu eingegebene Firmenname bereits vorhanden ist, wird die Speicherung abgelehnt und die Prozedur wird verlassen. Dabei ist es unerheblich, ob einer der beiden Firmennamen mit Kleinbuchstaben und/oder Grobuchstaben geschrieben wird, denn: Beide Firmennamen werden fr die Suche in Grobuchstaben umgewandelt.
359
11
Beispielprojekt
Falls bei der Suche ein Firmenname gefunden wird, der alphabetisch hinter dem neuen Firmennamen steht, dann haben Sie zwei Informationen ermittelt:
Es gibt den neuen Firmennamen noch nicht, die Firma kann also eingetragen werden. Sie haben die Stelle gefunden, an der die neue Firma eingefgt werden muss.
Einfgestelle
Letzte Zeile
Mit Hilfe von UsedRange, SpecialCells und der Eigenschaft Row wird die letzte Zeile der Tabelle ermittelt. Die Worksheet-Funktion Max()ermittelt die bisher grte Kundennummer. Diese Funktion bentigt als Parameter einen oder mehrere Zellbereiche, die nach dem grten vorkommenden Wert durchsucht werden. Falls die neue Firma inmitten der Tabelle eingesetzt werden muss, wird mit Hilfe von Insert() eine neue leere Zeile eingefgt. Falls es sich bei der neuen Zeile um die erste Zeile unter der berschrift handelte, muss der von der ersten Zeile bernommene Fettdruck zurckgesetzt werden. Die insgesamt sieben Informationen ber die neue Firma werden in der neu erzeugten Zeile eingetragen. Als Kundennummer wird die bisher grte Kundennummer, um 1 erhht, eingetragen. Dadurch wird gewhrleistet, dass die Kundennummer eine eindeutige Information ist, die nur einer Firma zugeordnet ist. Vor der Postleitzahl wird ein einzelner Apostroph eingefgt. Damit wird die Postleitzahl fr Excel zum Text, und fhrende Nullen knnen nicht verlorengehen. Nach einer Besttigung des Eintrags wird das Unterdialogfeld sofort verlassen, und das Hauptdialogfeld erscheint. Damit erreichen Sie, dass der Benutzer die neuen Daten nicht versehentlich zweimal speichert.
Max()
Zeile einfgen
Zeile eintragen
Die Unterdialogfelder Kunden ndern und Artikel ndern enthalten hnliche Ablufe. Sie sind in diesem Abschnitt ausfhrlich geschildert, in Abschnitt 11.4.8 nur kurz. Beginn, Ende Zunchst die beiden Prozeduren dieses Dialogfelds, die zu Beginn und Ende wichtig sind, wie bei Kunden Neu:
360
11.4
Private Sub UserForm_Initialize() ' Zugehrige Tabelle aktivieren ThisWorkbook.Worksheets("Kunden").Activate End Sub Private Sub cmdZurueck_Click() ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
Die Ablufe wurden bereits fr das Unterdialogfeld Kunden Neu erlutert. Suchen Es folgt die Prozedur, die aufgerufen wird, sobald der Benutzer Zeichen in das obere Textfeld eintrgt, um einen Kunden zu suchen:
Private Sub txtFirmaSuchen_Change() ' Liste mit Firmen fllen, die zu eingegebenem Text passen ListeFirmaFuellen Me End Sub
Dieser Vorgang wird auch im Unterdialogfeld Bestellungen Neu bentigt. Daher lohnt es sich, modular zu programmieren. Es wurde eine Prozedur ListeFirmaFuellen() im gemeinsamen Modul geschrieben. Diese Prozedur wird mit dem Parameter Me aufgerufen. Dieser Parameter kennzeichnet das Dialogfeld, von dem aus die Prozedur aufgerufen wurde. Es folgt die Prozedur aus dem gemeinsamen Modul:
' Liste mit Firmen fllen, die zu eingegebenem Text passen Public Sub ListeFirmaFuellen(frm As UserForm) Dim Zeile As Integer ' Zugehrige Tabelle aktivieren ThisWorkbook.Worksheets("Kunden").Activate ' Liste fllen frm.cmbFirmaSuchen.Clear Zeile = 2 Do While Cells(Zeile, 2).Value <> "" ' Falls eingegebene Zeichen in Firmenname vorkommen, ' dann diesen Firmenname der Liste hinzufgen If InStr(StrConv(Cells(Zeile, 2).Value, vbUpperCase), _ StrConv(frm.txtFirmaSuchen.Text, vbUpperCase)) _ > 0 Then
Modularitt
361
11
Beispielprojekt
frm.cmbFirmaSuchen.AddItem Cells(Zeile, 2).Value End If Zeile = Zeile + 1 Loop ' Falls Suchergebnis, ersten Eintrag anzeigen If frm.cmbFirmaSuchen.ListCount <> 0 Then frm.cmbFirmaSuchen.ListIndex = 0 End If End Sub
Zur Erluterung:
UserForm
Der Parameter der Funktion ist ein Objekt des Typs UserForm, mit dem Namen frm. An diesen Parameter wird Me bergeben; frm steht also fr das aufrufende Dialogfeld. Das Kombinationsfeld wird mit Hilfe der Methode Clear() vor dem Fllen vollstndig geleert. Die Kundentabelle wird Zeile fr Zeile durchsucht. Falls ein Firmenname den gesuchten Text an einer beliebigen Stelle enthlt, wird er dem Kombinationsfeld hinzugefgt. Dies gilt unabhngig von Klein- und Groschreibung, da die Funktion StrConv() eingesetzt wird. Die Funktion InStr() liefert einen Wert grer als 0, falls die zweite Zeichenkette in der ersten Zeichenkette enthalten ist. Die Steuerelemente des aufrufenden Dialogfelds werden ber die Objektbezeichnung frm.<Steuerelementname> erreicht. Falls das Kombinationsfeld mindestens einen Eintrag (Eigenschaft ListCount > 0) enthlt, dann wird der erste Eintrag ausgewhlt. Dies fhrt mit Hilfe der nachfolgend erluterten Prozedur dazu, dass alle Eintrge der Firma im unteren Teil des Dialogfelds angezeigt werden.
Zeile fr Zeile
InStr()
frm.Name
Suchergebnis anzeigen
Automatische Anzeige
Es folgt die Prozedur, die aufgerufen wird, sobald ein neuer Listeneintrag im Kombinationsfeld ausgewhlt wurde. Diese Auswahl kann durch das Programm (durch die obige Prozedur ListeFirmaFuellen()) oder durch den Benutzer stattfinden.
Private Sub cmbFirmaSuchen_Change() Dim Zeile As Integer
362
11.4
' Zeile mit ausgewhltem Kunden suchen Zeile = ZeileFirmaSuchen(Me) ' Daten der Firma in Dialogfeld kopieren lblKundennummer2.Caption = " " & Cells(Zeile, 1).Value txtFirma.Text = Cells(Zeile, 2).Value txtStrasse.Text = Cells(Zeile, 3).Value txtPLZ.Text = Cells(Zeile, 4).Value txtOrt.Text = Cells(Zeile, 5).Value txtLand.Text = Cells(Zeile, 6).Value txtEMail.Text = Cells(Zeile, 7).Value End Sub
Zur Erluterung:
Da dieser Vorgang auch im Unterdialogfeld Bestellungen Neu bentigt wird, wurde eine Funktion ZeileFirmaSuchen() im gemeinsamen Modul geschrieben. Nach erfolgreicher Suche werden die insgesamt sieben Informationen ber die Firma in die Textfelder im unteren Bereich des Dialogfelds geschrieben. Nur die Kundennummer wird in ein Bezeichnungsfeld geschrieben, damit der Benutzer diese wichtige Information zwar sehen, aber nicht versehentlich verndern kann.
Kundennummer geschtzt
363
11
Beispielprojekt
Zur Erluterung:
Die Kundentabelle wird Zeile fr Zeile durchsucht. Falls der Firmenname dem ausgewhlten Listeneintrag entspricht, wird die Suche abgebrochen. Die aktuelle Zeile wird als Wert der Funktion zurckgeliefert.
Speichern
Button Speichern
Es folgt die Prozedur fr den Button Speichern, also das Speichern eines Kunden, dessen Daten gegebenenfalls gendert wurden:
Private Sub cmdSpeichern_Click() Dim Zeile As Integer Dim LetzteZeile As Integer ' Falls kein Firmenname eingetragen If txtFirma.Text = "" Then MsgBox "Fehler: Bitte einen Namen " & _ "fr die Firma eintragen", vbCritical Exit Sub End If ' Zeile mit ausgewhlter Firma suchen Zeile = 2 Do While Cells(Zeile, 1).Value <> _ CInt(lblKundennummer2.Caption) Zeile = Zeile + 1 Loop ' Genderte Daten in Tabellenblatt bertragen Cells(Zeile, 2).Value = txtFirma.Text Cells(Zeile, 3).Value = txtStrasse.Text Cells(Zeile, 4).Value = "'" & txtPLZ.Text Cells(Zeile, 5).Value = txtOrt.Text Cells(Zeile, 6).Value = txtLand.Text Cells(Zeile, 7).Value = txtEMail.Text ' Tabelle neu sortieren LetzteZeile = ActiveSheet.UsedRange. _ SpecialCells(xlCellTypeLastCell).Row
364
11.4
ActiveSheet.UsedRange.Sort _ Key1:=Range(Cells(1, 2), Cells(LetzteZeile, 2)), _ Header:=xlYes ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
Zur Erluterung:
Falls der Benutzer den Firmennamen gelscht hat, hat die Speicherung keinen Sinn. Sie wird daher abgelehnt, und die Prozedur wird verlassen. Die Kundentabelle wird Zeile fr Zeile durchsucht. Falls die (fr den Benutzer unvernderliche) Kundennummer dem Inhalt des Bezeichnungsfelds entspricht, wird die Suche abgebrochen. Der Inhalt des Bezeichnungsfelds wird vor dem Vergleich mit dem Inhalt der Tabellenzelle mit der Funktion CInt() in eine ganze Zahl umgewandelt. Die insgesamt sieben, gegebenenfalls genderten Informationen ber die Firma werden in der gefundenen Zeile eingetragen. Die Tabelle wird mit Hilfe der Methode Sort() neu nach Firmenname sortiert. Dies ist notwendig, falls ein Firmenname gendert wurde.
Sucht Kundennummer
Sortieren
Lschen Es folgt die Prozedur fr den Button Lschen, also das Lschen eines ausgewhlten Kunden:
Private Sub cmdLoeschen_Click() Dim Zeile As Integer ' Falls kein Firmenname eingetragen If txtFirma.Text = "" Then MsgBox "Fehler: Bitte eine Firma auswhlen", _ vbCritical Exit Sub End If
Button Lschen
365
11
Beispielprojekt
' Sicherheitsabfrage vor dem Lschen If MsgBox("Wollen Sie diese Firma wirklich lschen?", _ vbYesNo Or vbQuestion) = vbNo Then Exit Sub End If ' Zeile mit ausgewhlter Firma suchen Zeile = 2 Do While Cells(Zeile, 1).Value <> _ CInt(lblKundennummer2.Caption) Zeile = Zeile + 1 Loop ' Ganze Zeile lschen Cells(Zeile, 1).EntireRow.Delete ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
Zur Erluterung:
Kein leerer Name
Falls der Benutzer den Firmennamen gelscht hat, so ist das Lschen nicht mglich. Es wird daher abgelehnt, und die Prozedur wird verlassen. Der Benutzer wird zur Sicherheit gefragt, ob er den Kunden wirklich lschen mchte. Falls er den Button Nein bettigt, wird die Prozedur verlassen. Die Kundentabelle wird Zeile fr Zeile durchsucht. Falls die Kundennummer dem Inhalt des Bezeichnungsfelds entspricht, wird die Suche abgebrochen. Die Zeile wird mit Hilfe der Methode Delete() vollstndig gelscht.
Sicherheitsabfrage
Sucht Kundennummer
Delete()
Das Unterdialogfeld Artikel Neu enthlt hnliche Ablufe wie das bereits beschriebene Unterdialogfeld Kunden Neu. In diesem Abschnitt werden nur die Unterschiede genauer erlutert. Beginn, Ende Zunchst zwei Prozeduren dieses Dialogfelds, die zu Beginn und Ende wichtig sind:
366
11.4
Private Sub UserForm_Initialize() Dim i As Integer ' Zugehrige Tabelle aktivieren ThisWorkbook.Worksheets("Artikel").Activate ' Kategorien hinzufgen, ersten Eintrag anzeigen cmbKategorie.Clear For i = 1 To 8 cmbKategorie.AddItem Kategorie(i) Next i cmbKategorie.ListIndex = 0 ' Preis und Anzahl vorbesetzen txtEinzelpreisEuro.Text = "0" txtEinzelpreisCent.Text = "00" txtAnzahl.Text = "0" End Sub Private Sub cmdZurueck_Click() ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
Zur Erluterung:
Das Kombinationsfeld, in dem die acht Kategorien aufgelistet werden, wird zu Beginn aus dem anwendungsweiten Datenfeld gefllt. Es wird der erste Listeneintrag ausgewhlt. Die insgesamt drei Textfelder fr Einzelpreis und Anzahl werden mit dem Startwert 0 bzw. 00 gefllt.
Kategorien auflisten
Zahlenfelder
Anzahl einstellen Es folgen die Prozeduren fr die beiden Buttons kleiner und grer: < und >. Mit diesen Buttons kann die Anzahl fr den Lagerbestand verndert werden.
Private Sub cmdKleiner_Click() Kleiner Me End Sub Private Sub cmdGroesser_Click() Groesser Me End Sub
Anzahl ndern
367
11
Beispielprojekt
Zur Erluterung:
Da diese beiden Vorgnge auch im Unterdialogfeld Bestellungen Neu bentigt werden, wurden die beiden Funktionen Kleiner() und Groesser() im gemeinsamen Modul geschrieben.
Falls das Textfeld, das mit den beiden Buttons gekoppelt ist, keine Zahl enthlt, dann wird eine 0 in das Textfeld geschrieben. Falls die Zahl in dem Textfeld grer als 0 ist, wird sie um 1 vermindert.
Vermindern
Falls das Textfeld keine Zahl enthlt, wird eine 1 in das Textfeld geschrieben, ansonsten wird die vorhandene Zahl um 1 erhht.
Speichern
Button Speichern
Es folgt die Prozedur fr den Button Speichern, also fr das Speichern eines neuen Artikels:
Private Dim Dim Dim Sub cmdSpeichern_Click() Zeile As Integer LetzteZeile As Integer MaxArtikelnummer As Integer
368
11.4
Dim ArtikelnameNeu As String Dim Einzelpreis As Single ' Ablehnen, falls kein Name fr Artikel angegeben If txtArtikelname.Text = "" Then MsgBox "Bitte einen Namen fr den Artikel eintragen" Exit Sub End If ' In Grobuchstaben umwandeln ArtikelnameNeu = StrConv(txtArtikelname.Text, _ vbUpperCase) ' Alle Artikelnamen durchsuchen Zeile = 2 Do While Cells(Zeile, 2).Value <> "" ' Falls neuer Artikelname bereits vorhanden If StrConv(Cells(Zeile, 2).Value, vbUpperCase) = _ ArtikelnameNeu Then MsgBox "Fehler: Es gibt bereits einen " & _ "Artikel mit diesem Namen", vbCritical Exit Sub ' Zeile fr neuen Artikel ermitteln ElseIf StrConv(Cells(Zeile, 2).Value, _ vbUpperCase) > ArtikelnameNeu Then Exit Do End If Zeile = Zeile + 1 Loop ' Letzte Zeile ermitteln LetzteZeile = ActiveSheet.UsedRange. _ SpecialCells(xlLastCell).Row ' Bisher grte Artikelnummer ermitteln MaxArtikelnummer = WorksheetFunction.Max _ (Range(Cells(2, 1), Cells(LetzteZeile, 1))) ' Neue Zeile einfgen, falls notwendig If Zeile <= LetzteZeile Then Cells(Zeile, 1).EntireRow.Insert End If ' Erste Zeile unter berschrift ohne Fettdruck If Zeile = 2 Then
369
11
Beispielprojekt
Cells(Zeile, 1).EntireRow.Font.Bold = False End If ' Neuen Artikelnamen eintragen Cells(Zeile, 1).Value = MaxArtikelnummer + 1 Cells(Zeile, 2).Value = txtArtikelname.Text Cells(Zeile, 3).Value = cmbKategorie.Text Cells(Zeile, 4).Value = txtLiefereinheit.Text Cells(Zeile, 6).Value = txtAnzahl.Text ' Einzelpreis zusammensetzen If txtEinzelpreisEuro.Text = "" Then Einzelpreis = 0 Else Einzelpreis = CInt(txtEinzelpreisEuro.Text) End If If txtEinzelpreisCent.Text <> "" Then Einzelpreis = Einzelpreis + _ CInt(txtEinzelpreisCent.Text) / 100 End If Cells(Zeile, 5).Value = Einzelpreis Cells(Zeile, 5).NumberFormatLocal = "0,00 " ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
Zur Erluterung:
Artikeldaten einfgen
Wie bei dem Namen fr einen neuen Kunden wird der neue Name fr den neuen Artikel geprft und in Grobuchstaben umgewandelt. Es wird die Zeile gesucht, vor der der neue Artikel eingetragen werden kann. Gegebenenfalls wird eine neue Zeile zum Eintragen eingefgt. Die Artikelnummer des neuen Artikels wird wie eine neue Kundennummer eindeutig ermittelt. Beim Eintragen der Artikelinformationen ist zu beachten, dass der der Inhalt der Textfelder fr Euro und Cent jeweils in eine Zahl umgewandelt wird. Anschlieend werden die beiden Zahlen zu einem Einzelpreis zusammengerechnet. Die Tabellenzelle wird auerdem passend formatiert.
Einzelpreis umwandeln
370
11.4
Zur Erluterung:
Die beiden Kombinationsfelder, in denen jeweils die acht Kategorien aufgelistet werden, werden zu Beginn aus dem anwendungsweiten Datenfeld gefllt. Es wird der erste Listeneintrag ausgewhlt.
Kategorien auflisten
Suchen Es folgt die Prozedur, die aufgerufen wird, sobald der Benutzer (oder das Programm) eine Kategorie aus der Liste auswhlt, um einen Artikel zu suchen:
Private Sub cmbKategorieSuchen_Change() ' Liste mit Artikeln fllen, ' die zu ausgewhlter Kategorie passen
371
11
Beispielprojekt
Da dieser Vorgang auch im Unterdialogfeld Bestellungen Neu bentigt wird, wurde eine Prozedur ListeArtikelFuellen() im gemeinsamen Modul geschrieben. Es folgt die Prozedur aus dem gemeinsamen Modul:
' Liste mit Artikeln fllen, ' die zu ausgewhlter Kategorie passen Public Sub ListeArtikelFuellen(frm As UserForm) Dim Zeile As Integer ' Zugehrige Tabelle aktivieren ThisWorkbook.Worksheets("Artikel").Activate
' Zeilen mit ausgewhlter Kategorie ' in 2. Liste eintragen frm.cmbArtikelnameSuchen.Clear Zeile = 2 Do While Cells(Zeile, 3).Value <> "" If Cells(Zeile, 3).Value = _ frm.cmbKategorieSuchen.Text Then frm.cmbArtikelnameSuchen.AddItem _ Cells(Zeile, 2).Value End If Zeile = Zeile + 1 Loop ' Ersten Eintrag anzeigen, falls Eintrge vorhanden If frm.cmbArtikelnameSuchen.ListCount > 0 Then frm.cmbArtikelnameSuchen.ListIndex = 0 End If End Sub
Zur Erluterung:
Das Kombinationsfeld fr die Artikel wird vor dem Fllen vollstndig geleert. Die Artikeltabelle wird Zeile fr Zeile durchsucht. Falls sich ein Artikel in der ausgewhlten Kategorie befindet, wird er dem Kombinationsfeld fr die Artikel hinzugefgt. Falls das Kombinationsfeld fr die Artikel mindestens einen Eintrag enthlt, wird der erste Eintrag ausgewhlt. Dies fhrt mit Hilfe der
Artikeltabelle filtern
372
11.4
nachfolgend erluterten Prozedur dazu, dass alle Eintrge des Artikels im unteren Teil des Dialogfelds angezeigt werden. Suchergebnis anzeigen Es folgt die Prozedur, die aufgerufen wird, sobald ein neuer Listeneintrag im Kombinationsfeld fr die Artikel ausgewhlt wurde. Diese Auswahl kann durch das Programm (durch die obige Prozedur ListeArtikelFuellen()) oder durch den Benutzer stattfinden.
Private Sub cmbArtikelnameSuchen_Change() Dim Zeile As Integer Dim Euro As Integer ' Zeilennummer des Artikels liefern, ' der aktuell in der Liste angezeigt wird Zeile = ZeileArtikelSuchen(Me) ' Daten des Artikels in Dialogfeld kopieren lblArtikelnummer2.Caption = " " & _ Cells(Zeile, 1).Value txtArtikelname.Text = Cells(Zeile, 2).Value cmbKategorie.ListIndex = _ cmbKategorieSuchen.ListIndex txtLiefereinheit.Text = Cells(Zeile, 4).Value txtAnzahl.Text = Cells(Zeile, 6).Value ' Einzelpreis in zwei Feldern ausgeben Euro = Int(Cells(Zeile, 5).Value) ' schneidet ab txtEinzelpreisEuro.Text = Euro txtEinzelpreisCent.Text = _ (Cells(Zeile, 5).Value Euro) * 100 End Sub
Automatische Anzeige
Zur Erluterung:
Da dieser Vorgang auch im Unterdialogfeld Bestellungen Neu bentigt wird, wurde eine Funktion ZeileArtikelSuchen() im gemeinsamen Modul geschrieben. Nach erfolgreicher Suche werden die Informationen ber den Artikel in die Felder im unteren Bereich des Dialogfelds geschrieben. Die Artikelnummer wird in ein Bezeichnungsfeld geschrieben. Das Kombinationsfeld fr die Kategorie wird mit dem Suchkombinationsfeld fr die Kategorie synchronisiert.
373
11
Einzelpreis zerlegen
Beispielprojekt
Die Werte fr die beiden Felder des Einzelpreises werden berechnet. Dabei wird die Funktion Int() benutzt, um den Eurobetrag zu ermitteln. Die Funktion Int() rundet nicht, wie die Funktion CInt(), sondern schneidet die Nachkommastellen ab.
Zur Erluterung:
Die Artikeltabelle wird Zeile fr Zeile durchsucht. Falls der Artikelname dem ausgewhlten Listeneintrag entspricht, wird die Suche abgebrochen. Die aktuelle Zeile wird als Wert der Funktion zurckgeliefert.
Zeile zurckliefern
Speichern
Button Speichern
Es folgt die Prozedur fr den Button Speichern, also das Speichern eines Artikels, dessen Daten gegebenenfalls gendert wurden:
Private Dim Dim Dim Sub cmdSpeichern_Click() Zeile As Integer Einzelpreis As Single LetzteZeile As Integer
374
11.4
' Falls kein Artikelname eingetragen If txtArtikelname.Text = "" Then MsgBox "Fehler: Bitte einen Namen " & _ "fr den Artikel eintragen", vbCritical Exit Sub End If ' Zeile mit ausgewhltem Artikel suchen Zeile = 2 Do While Cells(Zeile, 1).Value <> _ CInt(lblArtikelnummer2.Caption) Zeile = Zeile + 1 Loop ' Genderte Daten in Tabellenblatt bertragen Cells(Zeile, 2).Value = txtArtikelname.Text Cells(Zeile, 3).Value = cmbKategorie.Text Cells(Zeile, 4).Value = txtLiefereinheit.Text Cells(Zeile, 6).Value = txtAnzahl.Text ' Einzelpreis zusammensetzen If txtEinzelpreisEuro.Text = "" Then Einzelpreis = 0 Else Einzelpreis = Int(txtEinzelpreisEuro.Text) End If If txtEinzelpreisCent.Text <> "" Then Einzelpreis = Einzelpreis + _ Int(txtEinzelpreisCent.Text) / 100 End If Cells(Zeile, 5).Value = Einzelpreis ' Tabelle neu sortieren LetzteZeile = ActiveSheet.UsedRange. _ SpecialCells(xlCellTypeLastCell).Row ActiveSheet.UsedRange.Sort _ Key1:=Range(Cells(1, 2), Cells(LetzteZeile, 2)), _ Header:=xlYes ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
375
11
Beispielprojekt
Zur Erluterung:
Kein leerer Name
Falls der Benutzer den Artikelnamen gelscht hat, hat die Speicherung keinen Sinn. Sie wird daher abgelehnt, und die Prozedur wird verlassen. Die Artikeltabelle wird Zeile fr Zeile durchsucht. Falls die Artikelnummer dem Inhalt des Bezeichnungsfelds entspricht, wird die Suche abgebrochen. Die gegebenenfalls genderten Informationen ber den Artikel werden in der gefundenen Zeile eingetragen. Dabei muss der Einzelpreis wiederum aus den beiden Textfeldern ermittelt und zusammengerechnet werden. Die Tabelle wird mit Hilfe der Methode Sort() neu nach Artikelname sortiert. Dies ist notwendig, falls ein Artikelname gendert wurde.
Sucht Artikelnummer
Sortieren
Lschen
Button Lschen
Es folgt die Prozedur fr den Button Lschen, also das Lschen eines ausgewhlten Artikels:
Private Sub cmdLoeschen_Click() Dim Zeile As Integer ' Falls kein Artikelname eingetragen If txtArtikelname.Text = "" Then MsgBox "Fehler: Bitte einen Namen " & _ "fr den Artikel eintragen", vbCritical Exit Sub End If ' Sicherheitsabfrage vor dem Lschen If MsgBox("Wollen Sie den Artikel wirklich lschen?", _ vbYesNo Or vbQuestion) = vbNo Then Exit Sub End If ' Zeile mit ausgewhltem Artikel suchen Zeile = 2 Do While Cells(Zeile, 1).Value <> _ CInt(lblArtikelnummer2.Caption) Zeile = Zeile + 1 Loop
376
11.4
' Ganze Zeile lschen Cells(Zeile, 1).EntireRow.Delete ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
Zur Erluterung:
Der Artikel kann nur gelscht werden, wenn ein Artikelname eingetragen ist. Nach der Sicherheitsabfrage wird die Zeile mit dem Artikel gesucht und mit Hilfe der Methode Delete() vollstndig gelscht.
Sicherheitsabfrage, Delete()
377
11
Beispielprojekt
For i = 1 To 8 cmbKategorieSuchen.AddItem Kategorie(i) Next i cmbKategorieSuchen.ListIndex = 0 ' Bestelldatum "heute" eintragen lblBestelldatum2.Caption = " " & _ Format(Date, "dd.mm.yyyy") End Sub Private Sub cmdZurueck_Click() ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
Zur Erluterung:
Benutzerdefinierter Datentyp
Der benutzerdefinierte Datentyp BestelldetailTyp wird festgelegt. Eine Variable dieses Datentyps kann die Daten eines einzelnen Bestellpostens speichern. Dies sind: Artikelnummer, Anzahl, Einzelpreis, Artikelname und Gesamtpreis. Da der Datentyp nur in diesem Modul bentigt wird, wurde er hier definiert und kann nur den Gltigkeitsbereich Private haben. Eigene Datentypen mit dem Gltigkeitsbereich Public sind zwar in der gesamten Anwendung bekannt, knnen aber nicht in einem UserForm definiert werden. Fr die interne Speicherung und Zuordnung in der Tabelle Bestelldetails werden nur die Bestellnummer, Artikelnummer und Anzahl bentigt. Die Speicherung von Einzelpreis, Artikelname und Gesamtpreis erleichtert allerdings die Erstellung einer E-Mail als Bestellbesttigung. Das modulweite dynamische Datenfeld Bestelldetail() wird deklariert. Es dient zur Aufnahme einer (noch unbekannten) Menge an Bestellposten. Es ist vom soeben erluterten Datentyp BestelldetailTyp. Es wird die modulweite Variable MailBody deklariert. Whrend des Hinzufgens einzelner Bestellposten wird der Inhalt der E-Mail bereits parallel gespeichert, so dass sie bei der endgltigen Speicherung einer Bestellung zum grten Teil fertig ist. Das Kombinationsfeld fr die Kategorien wird gefllt. Es wird der erste Listeneintrag ausgewhlt.
Private, Public
E-Mail speichern
Dynamisches Datenfeld
Inhalt E-Mail
378
11.4
Aktuelles Bestelldatum
Das heutige Datum wird ermittelt und formatiert in dem Bezeichnungsfeld fr das Bestelldatum eingetragen. Dieses Datum kann spter gendert werden.
Bestelldatum einstellen Es folgen die beiden Ereignisprozeduren zur komfortablen nderung des Bestelldatums.
Private Sub lblBestelldatum2_Click() zusKalender.Visible = True End Sub Private Sub zusKalender_DblClick() lblBestelldatum2.Caption = " " & zusKalender.Value zusKalender.Visible = False End Sub
Bestelldatum ndern
Zur Erluterung:
Falls der Benutzer mit der Maus in das Bezeichnungsfeld fr das Bestelldatum klickt, wird das (zunchst unsichtbare) Kalender-Steuerelement angezeigt. Dazu wird die Eigenschaft Visible genutzt, die den Wert True oder False haben kann. Der Benutzer kann im Kalender-Steuerelement ein Datum auswhlen. Sobald er auf dem ausgewhlten Datum einen Doppelklick ausfhrt, wird das Kalender-Steuerelement wieder unsichtbar, und das Datum wird im Bezeichnungsfeld fr das Bestelldatum eingetragen.
Sichtbar machen
Auswhlen
Suchen Die folgenden vier Prozeduren sind in hnlicher Form bereits Bestandteil der anderen Unterdialogfelder. Sie dienen zur Auswahl eines Kunden und eines Artikels:
Private Sub txtFirmaSuchen_Change() ' Liste mit Firmen fllen, ' die zu eingegebenem Text passen ListeFirmaFuellen Me End Sub Private Sub cmbFirmaSuchen_Change() Dim Zeile As Integer ' Zeile mit ausgewhltem Kunden suchen Zeile = ZeileFirmaSuchen(Me)
hnliche Ablufe
379
11
Beispielprojekt
' Daten der Firma in Label anzeigen lblFirma.Caption = " KNr: " & _ Cells(Zeile, 1).Value & ", " & _ Cells(Zeile, 2).Value & " (" & _ Cells(Zeile, 7).Value & ")" & vbCrLf & _ " " & Cells(Zeile, 3).Value & _ ", " & Cells(Zeile, 4).Value & _ " " & Cells(Zeile, 5).Value _ & " (" & Cells(Zeile, 6).Value & ")" End Sub Private Sub cmbKategorieSuchen_Change() ' Liste mit Artikeln fllen, ' die zu ausgewhlter Kategorie passen ListeArtikelFuellen Me End Sub Private Sub cmbArtikelnameSuchen_Change() Dim Zeile As Integer ' Zeilennummer des Artikels liefern, ' der aktuell in der Liste angezeigt wird Zeile = ZeileArtikelSuchen(Me) ' Daten des Artikels in Label anzeigen lblArtikel.Caption = " ANr: " & _ Cells(Zeile, 1).Value & ", " & _ Cells(Zeile, 2).Value & " (" & _ Cells(Zeile, 3).Value & ")" & vbCrLf & _ " " & Cells(Zeile, 4).Value & _ ", EP: " & Format(Cells(Zeile, 5).Value, "0.00") & _ " , Bestand: " & Cells(Zeile, 6).Value End Sub
Die Daten des ausgewhlten Kunden und des ausgewhlten Artikels werden jeweils in kompakter Form in ein Bezeichnungsfeld geschrieben. Somit kann sich der Benutzer sicher sein, die richtige Auswahl getroffen zu haben.
380
11.4
Private Sub cmdKleiner_Click() Kleiner Me End Sub Private Sub cmdGroesser_Click() Groesser Me End Sub
Zur Erluterung:
Mit Hilfe der bereits bekannten Prozeduren Kleiner() und Groesser() wird in diesem Dialogfeld die bestellte Anzahl eines Artikels eingestellt. In den anderen Dialogfeldern wurde damit der Lagerbestand eines Artikels eingestellt.
Bestellte Anzahl
Bestellposten hinzufgen Nach der Auswahl eines Artikels kann dieser Artikel ber den Button Hinzufgen den Bestelldetails hinzugefgt werden. Dieser Vorgang bereitet die endgltige Bestellung vor. Erst die sptere Speicherung fhrt zur tatschlichen Bestellung. Zum Hinzufgen dient die folgende Prozedur:
' Artikel zur Bestellung hinzufgen Private Sub cmdHinzufgen_Click() Dim Zeile As Integer Dim Gesamtpreis As Single Dim PNr As Integer Dim AusgabeZeile As String ' Ablehnen, falls bestellte Anzahl = 0 If txtAnzahl.Text = "" Then MsgBox "Bitte eine Anzahl > 0 eintragen" Exit Sub ElseIf txtAnzahl.Text = 0 Then MsgBox "Bitte eine Anzahl > 0 eintragen" Exit Sub End If ' Dynamisches Feld um ein Element vergrern On Error GoTo Fehler PNr = UBound(Bestelldetail) PNr = PNr + 1 ReDim Preserve Bestelldetail(1 To PNr)
Button Hinzufgen
381
11
Beispielprojekt
' Zeile mit ausgewhltem Artikel suchen Zeile = ZeileArtikelSuchen(Me) ' Gesamtpreis ermitteln Gesamtpreis = Cells(Zeile, 5).Value * txtAnzahl.Text ' Ausgabezeile erzeugen, ' der Liste und der Mail hinzufgen AusgabeZeile = _ Format(txtAnzahl.Text, "@@@") & " " & _ Format(Cells(Zeile, 1).Value, "@@@") & _ " " & _ Format(Left(Cells(Zeile, 2).Value, 24), _ "!@@@@@@@@@@@@@@@@@@@@@@@@") & " " & _ Format(Format(Cells(Zeile, 5).Value, _ "#,##0.00"), "@@@@@@@@@") & " " & _ Format(Format(Gesamtpreis, "#,##0.00"), _ "@@@@@@@@@@") lstBestelldetails.AddItem AusgabeZeile MailBody = MailBody & vbCrLf & AusgabeZeile ' Daten in dynamischem Feld speichern Bestelldetail(PNr).Anzahl = txtAnzahl.Text Bestelldetail(PNr).Artikelnummer = _ Cells(Zeile, 1).Value ' Ausstieg vor Fehlerbehandlung Exit Sub Fehler: ' Falls das dynamische Feld noch ' keine Gre hat, dann ist PNr = 0 PNr = 0 Resume Next End Sub
Zur Erluterung:
Anzahl nicht leer
Zunchst wird geprft, ob eine Anzahl fr den hinzuzufgenden Artikel eingestellt wurde. Falls nicht, wird das Hinzufgen abgelehnt. Mit der Funktion UBound() wird die bisherige Gre des dynamischen Feldes festgestellt, also die aktuelle Anzahl an Bestellposten. Falls es noch keine Bestellposten gibt, fhrt dieser Aufruf zu einem Fehler. Dieser Fehler wird mit Hilfe von On Error abgefangen. Die Gre wird dann mit 0 angegeben, und die Prozedur wird mit der nchsten Anweisung fortgesetzt.
Gre feststellen
382
11.4
ReDim
Das dynamische Datenfeld wird durch ReDim um ein Element vergrert. In der Tabelle Artikel wird die Zeile mit den Daten des Artikels ermittelt. Der Gesamtpreis des Bestellpostens wird aus dem Einzelpreis und der bestellten Anzahl errechnet. Es wird eine Ausgabezeile zusammengestellt, die folgende Informationen enthlt: Anzahl, Artikelnummer, Artikelname, Einzelpreis und Gesamtpreis. Die Zeile wird mit Hilfe der Funktion Format() einheitlich formatiert. Die Ausgabezeile wird dem Listenfeld hinzugefgt. Die einheitliche Formatierung fhrt dazu, dass die einzelnen Bestellposten bersichtlich, wie in einer Tabelle, aufgelistet werden. Es ist notwendig, die Eigenschaft Font des Listenfelds auf eine Nichtproportionalschriftart, hier Courier New, zu stellen. Damit erreichen Sie, dass alle Zeichen die gleiche Breite einnehmen. Die gleiche Ausgabezeile wird bereits dem Inhalt der E-Mail hinzugefgt. Beim Speichern der Bestellung werden spter noch Empfnger, Betreff und der Kopf der Bestellung erzeugt. Zwei Informationen ber den Bestellposten (Artikelnummer und Anzahl) werden dem dynamischen Feld zur spteren Speicherung hinzugefgt.
Gesamtpreis
Ausgabezeile in Liste
Ausgabezeile in E-Mail
Daten in Datenfeld
Bestellung speichern Die folgende Prozedur fr den Button Speichern dient zur endgltigen Speicherung der Bestellung und zum Absenden der E-Mail:
' Zusammengestellte Bestellung speichern Private Sub cmdSpeichern_Click() Dim MaxPNr As Integer Dim LetzteZeile As Integer Dim Zeile As Integer Dim MaxBestellnummer As Integer Dim KundenZeile As Integer Dim KNr As Integer Dim EMailAdresse As String Dim PNr As Integer Dim appOutlook As Outlook.Application Dim MailItem As Outlook.MailItem
Button Speichern
383
11
Beispielprojekt
' Ablehnen, falls keine Firma ausgewhlt wurde If cmbFirmaSuchen.ListCount = 0 Then MsgBox "Bitte eine Firma auswhlen" Exit Sub End If ' Ablehnen, falls keine Bestelldetails vorhanden On Error GoTo Fehler MaxPNr = UBound(Bestelldetail) If MaxPNr = 0 Then MsgBox "Bitte Bestelldetails auswhlen" Exit Sub End If ' Zeile fr Eintrag der neuen Bestellung ermitteln ThisWorkbook.Worksheets("Bestellungen").Activate LetzteZeile = ActiveSheet.UsedRange. _ SpecialCells(xlLastCell).Row Zeile = LetzteZeile + 1 ' Neue Bestellnummer ermitteln und eintragen If LetzteZeile = 1 Then MaxBestellnummer = 0 Else MaxBestellnummer = WorksheetFunction.Max _ (Range(Cells(2, 1), Cells(LetzteZeile, 1))) End If Cells(Zeile, 1).Value = MaxBestellnummer + 1 ' Kundennummer und E-Mail-Adresse aus der Tabelle ' Kunden ermitteln und speichern ThisWorkbook.Worksheets("Kunden").Activate KundenZeile = ZeileFirmaSuchen(Me) KNr = Cells(KundenZeile, 1).Value EMailAdresse = Cells(KundenZeile, 7).Value ThisWorkbook.Worksheets("Bestellungen").Activate Cells(Zeile, 2).Value = KNr ' Bestelldatum eintragen Cells(Zeile, 3).Value = lblBestelldatum2.Caption ' Bestelldetails eintragen ThisWorkbook.Worksheets("Bestelldetails").Activate Zeile = ActiveSheet.UsedRange. _ SpecialCells(xlLastCell).Row + 1
384
11.4
For PNr = 1 To UBound(Bestelldetail) Cells(Zeile, 1).Value = MaxBestellnummer + 1 Cells(Zeile, 2).Value = _ Bestelldetail(PNr).Artikelnummer Cells(Zeile, 3).Value = _ Bestelldetail(PNr).Anzahl Zeile = Zeile + 1 Next PNr ' Mail erzeugen und absenden Set appOutlook = CreateObject("Outlook.Application") Set MailItem = appOutlook.CreateItem(olMailItem) MailItem.To = EMailAdresse MailItem.Subject = "Ihre Bestellung vom " & _ Trim(lblBestelldatum2.Caption) MailItem.Body = "Bestellnummer: " & _ MaxBestellnummer + 1 & vbCrLf & _ "Kundennummer: " & KNr & vbCrLf & _ "Bestelldatum: " & _ Trim(lblBestelldatum2.Caption) & vbCrLf & _ "Anz ANr Artikelname " & _ "E-Preis G-Preis" & MailBody MailItem.Send appOutlook.Quit ' Zurck zum Hauptmen Unload Me frmNordwind.Show ' Ausstieg vor Fehlerbehandlung Exit Sub Fehler: ' Falls das dynamische Feld noch ' keine Gre hat, dann ist PNr = 0 PNr = 0 Resume Next End Sub
Zur Erluterung:
Falls kein Kunde ausgewhlt wurde oder keine Bestelldetails eingetragen wurden, ist eine Bestellung nicht sinnvoll und wird abgelehnt. Mit Hilfe von UsedRange und SpecialCells wird die erste freie Zeile der Tabelle Bestellungen ermittelt, fr den Eintrag der neuen Bestellung.
385
11
Neue Bestellnummer
Beispielprojekt
Die Tabellenfunktion Max()ermittelt, hnlich wie fr eine neue Kunden- oder Artikelnummer, eine neue Bestellnummer. Sie wird in der Tabelle Bestellungen eingetragen. Das Programm wechselt kurz zur Tabelle Kunden, ermittelt Kundennummer und E-Mail-Adresse und kehrt wieder zur Tabelle Bestellungen zurck. Kundennummer und Bestelldatum werden ebenfalls in der Tabelle Bestellungen eingetragen. Es wird zur Tabelle Bestelldetails gewechselt. Mit Hilfe von UsedRange und SpecialCells wird die erste freie Zeile der Tabelle ermittelt, fr den Eintrag der neuen Bestellposten. Die Daten der einzelnen Bestellposten werden aus dem dynamischen Feld geholt und der Reihe nach in der Tabelle Bestelldetails eingetragen. In jeder Zeile wird auch die Bestellnummer eingetragen, damit der Zusammenhang zur Tabelle Bestellungen besteht. Es wird ein neues Element vom Typ MailItem erzeugt. Die Eigenschaften Empfngeradresse, Betreff und Inhalt werden gefllt. Der Inhalt umfasste bereits die Daten der einzelnen Bestellposten, es mssen nur noch die Kopfdaten hinzugefgt werden. Zu den Kopfdaten gehrt auch das Bestelldatum, das mit fhrenden Leerzeichen eingetragen war. Diese fhrenden Leerzeichen werden mit Trim() entfernt. Die E-Mail wird gesendet.
Kundendaten holen
Bestelldetails eintragen
E-Mail senden
386
Lsungen
Die Lsungen zu den bungsaufgaben finden Sie auch in den Arbeitsmappen zu den jeweiligen Kapiteln auf der Buch-CD, getrennt fr die Excel-Versionen ab 2007 und Excel-Versionen vor 2007.
zu 1 A bis 1 H in Mappe1.xlsm bzw. Mappe1.xls, Modul2 zu 3 A bis 3 J in Mappe3.xlsm bzw. Mappe3.xls, Modul2 zu 5 A bis 5 D in Mappe5.xlsm bzw. Mappe5.xls, Modul3
Lsung zu bung 1 A
Sub KopieE3E5() Range("E3").Select Selection.Copy Range("E5").Select ActiveSheet.Paste End Sub
Lsung zu bung 1 G
Sub KopieE3E5Neu() Range("E3:G3").Select Selection.Copy Range("E5").Select ActiveSheet.Paste Range("E10").Select ActiveSheet.Paste End Sub
Lsung zu bung 1 H
Sub RelKopie() Selection.Copy ActiveCell.Offset(2, 0).Range("A1:C1").Select ActiveSheet.Paste ActiveCell.Offset(5, 0).Range("A1:C1").Select ActiveSheet.Paste End Sub
387
Lsungen
Lsung zu bung 3 A
Sub KopieE3E5Neu() Range("E3:G3").Select Selection.Copy ' Range("E5").Select ' ActiveSheet.Paste Range("E10").Select ActiveSheet.Paste MsgBox "Fertig" End Sub
Lsung zu bung 3 B
Sub Uebung3B() Dim Nachname As String Dim Vorname As String Dim Adresse As String Dim Geburtsdatum As Date Dim Alter As Integer Nachname = "Mustermann" Vorname = "Max" Adresse = "Holzweg 7, 53776 Rheinhausen" Geburtsdatum = "20.07.1978" Alter = 30 MsgBox Vorname & " " & Nachname & vbCrLf & Adresse _ & vbCrLf & "geb.: " & Geburtsdatum & vbCrLf _ & "Alter: " & Alter End Sub
Lsung zu bung 3 C
Sub Uebung3C() Dim Ergebnis As Boolean Ergebnis = (12 3 >= 4 * 2.5) MsgBox Ergebnis Ergebnis = ("Maier" Like "M??er") MsgBox Ergebnis End Sub
388
Lsungen
Lsung zu bung 3 D
Sub Uebung3D() Dim Ergebnis As Boolean Ergebnis = (4 > 3 And 4 > 3) MsgBox Ergebnis Ergebnis = (4 > 3 Or 4 > 3) MsgBox Ergebnis End Sub
Lsung zu bung 3 E
Nr. Werte 1 2 3 4 5 6 7 8
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
Lsung zu bung 3 F
Sub Uebung3F() Dim Gehalt As Single Dim Steuerbetrag As Single ThisWorkbook.Worksheets("Tabelle1").Activate Range("A10:A11").NumberFormatLocal = "#.##0,00 " Gehalt = Range("A10").Value If Gehalt <= 12000 Then Steuerbetrag = Gehalt * ElseIf Gehalt <= 20000 Then Steuerbetrag = Gehalt * ElseIf Gehalt <= 30000 Then Steuerbetrag = Gehalt * Else Steuerbetrag = Gehalt * End If
389
Lsungen
Lsung zu bung 3 G
Sub Uebung3G() Dim Gehalt As Single Dim Steuerbetrag As Single ThisWorkbook.Worksheets("Tabelle1").Activate Range("A10:A11").NumberFormatLocal = "#.##0,00 " Gehalt = Range("A10").Value Select Case Gehalt Case Is <= 12000 Steuerbetrag Case Is <= 20000 Steuerbetrag Case Is <= 30000 Steuerbetrag Case Else Steuerbetrag End Select
Lsung zu bung 3 H
Sub Uebung3H() Dim x As Single Dim i As Integer ThisWorkbook.Worksheets("Tabelle2").Activate i = 1 For x = 35 To 20 Step 2.5 Cells(i, 4).Value = x Cells(i, 4).NumberFormatLocal = "0,0" i = i + 1 Next x End Sub
390
Lsungen
Lsung zu bung 3 I
Sub Uebung3I() Dim x As Single Dim i As Integer ThisWorkbook.Worksheets("Tabelle2").Activate x = Cells(1, 5).Value Cells(1, 5).NumberFormatLocal = "0,0000" i = 2 Do x = x / 2 Cells(i, 5).Value = x Cells(i, 5).NumberFormatLocal = "0,0000" i = i + 1 Loop Until x < 0.001 End Sub
Lsung zu bung 3 J
Sub Uebung3J() Dim Gehalt As Single Dim Steuersatz As Single Dim Steuerbetrag As Single Dim GehaltMinusSteuerbetrag As Single Dim i As Integer ThisWorkbook.Worksheets("Tabelle3").Activate i = 1 For Gehalt = 9000 To 33000 Step 3000 If Gehalt <= 12000 Then Steuersatz = 0.12 ElseIf Gehalt <= 20000 Then Steuersatz = 0.15 ElseIf Gehalt <= 30000 Then Steuersatz = 0.2 Else Steuersatz = 0.25 End If Steuerbetrag = Gehalt * Steuersatz GehaltMinusSteuerbetrag = Gehalt Steuerbetrag
391
Lsungen
Cells(i, 1).Value = Gehalt Cells(i, 1).NumberFormatLocal = "#.##0,00 " Cells(i, 2).Value = Steuersatz Cells(i, 2).NumberFormatLocal = "0,0
%"
Cells(i, 3).Value = Steuerbetrag Cells(i, 3).NumberFormatLocal = "#.##0,00 " Cells(i, 4).Value = GehaltMinusSteuerbetrag Cells(i, 4).NumberFormatLocal = "#.##0,00 " i = i + 1 Next Gehalt End Sub
Lsung zu bung 5 A
Sub Uebung5A() Dim T(1 To 10) As Integer Dim Minimum As Integer Dim i As Integer ThisWorkbook.Worksheets("Tabelle1").Activate Randomize For i = 1 To 10 T(i) = Rnd * 5 + 30 If i = 1 Then Minimum = T(i) Else If T(i) < Minimum Then Minimum = T(i) End If Cells(i, 9).Value = T(i) Next i For i = 1 To 10 If T(i) = Minimum Then Cells(i, 9).Borders.LineStyle = xlContinuous Else Cells(i, 9).Borders.LineStyle = xlLineStyleNone End If Next i End Sub
392
Lsungen
Lsung zu bung 5 B
Sub Uebung5B() Dim T(1 To 10, 1 To 2) As Integer Dim Minimum As Integer Dim i As Integer, k As Integer ThisWorkbook.Worksheets("Tabelle1").Activate Randomize For i = 1 To 10 For k = 1 To 2 T(i, k) = Rnd * 5 + 130 If i = 1 And k = 1 Then Minimum = T(i, k) Else If T(i, k) < Minimum Then Minimum = T(i, k) End If Cells(i, 9 + k).Value = T(i, k) Next k Next i For i = 1 To 10 For k = 1 To 2 If T(i, k) = Minimum Then Cells(i, 9 + k).Interior.Color = vbYellow Else Cells(i, 9 + k).Interior.Pattern = xlNone End If Next k Next i End Sub
Lsung zu bung 5 C
Sub Uebung5C() Dim a As Double, b As Double a = 5.5 b = 11.5 PMittelwert a, b End Sub Sub PMittelwert(x As Double, y As Double) Dim z As Double
393
Lsungen
Lsung zu bung 5 D
Sub Uebung5D() Dim a As Double, b As Double, c As Double a = 5.5 b = 11.5 c = FMittelwert(a, b) MsgBox c End Sub Function FMittelwert(x As Double, y As Double) As Double FMittelwert = (x + y) / 2 End Function
394
Index
(minus) 103 ! (Ausrufezeichen) 337 % (Prozentzeichen) in SQL 309 & (Verkettung) 41, 109 * (Multiplikation) 103 * (Platzhalter) 107, 267 + (plus) 103, 234 . (Punkt) 94 / (Division) 103 < (kleiner) 106 in SQL 308 <= (kleiner oder gleich) 106 in SQL 308 <> (ungleich) 106 in SQL 308 = (benannter Parameter) 56 = (gleich) 106 in SQL 308 > (grer) 106 in SQL 308 >= (grer oder gleich) 106 in SQL 308 ? (Fragezeichen) 107, 267 @ Formatierung 256, 337 \ (Ganzzahldivision) 103 ^ (hoch) 104 _ (Unterstrich) 60, 95 in SQL 309 Activate(), Worksheets 58 ActiveCell 32, 62 Address 65 ActiveChart 187 ActiveDocument (Word) 275 ActiveSheet 22, 32, 55 UsedRange 80 ActiveWindow 59 DisplayGridlines 60 DisplayHeadings 60 ActiveWorkbook 32, 50 ActiveX-Objekt erstellen (Word) 275 Add() Attachments (Outlook) 287 ChartObjects 189 Charts 187 Collection 178 Documents (Word) 279 Paragraphs (Word) 279 SortFields 88 SparklineGroups 221 Tables (Word) 280 Workbooks 47 Worksheets 55 AddColorScale(), FormatConditions 216, 217 AddConnector(), Shapes 201, 206 AddDatabar(), FormatConditions 214 AddIconSetCondition(), FormatConditions 218 AddItem(), ComboBox 334 Addition 103 AddLine(), Shapes 201, 204 AddNodes(), FreeformBuilder 208 Address, Zellbereich 65 AddShape(), 211 Shapes 201, 202 AddTextEffect() 212 ADO-Bibliothek, Access 301 ADODB Connection (Access) 302, 304 Recordset (Access) 303, 304 After Diagrammblatt 187 Tabellenblatt 56
A
Abfrage Aktions- (SQL) 302 Auswahl- (SQL) 302 Ergebnis filtern (SQL) 307 Ergebnis sortieren (SQL) 310 Abfrage (SQL) 302 Abfrageergebnis filtern (SQL) 307 AbortRetryIgnore 234 Absatz erzeugen (Word) 279 Access ADO-Bibliothek 301 Datenaustausch 300 Verbindung herstellen 301
395
Index
Aktionsabfrage (SQL) 302, 305, 312, 314, 315 Aktivieren und selektieren 33 Aktualisierungsabfrage (SQL) 312 Alle Zellen 59, 65 Alt + F11 28 And 108, 269 AND (SQL) 308 Anfhrungszeichen, doppelte 71 Anweisung in mehreren Zeilen 95 Anwendung unterbrechen 252 Anzeigefenster 59 Apostroph 22, 31 Append 264 Application 46, 179 Dialogs 285, 317 Documents (Word) 275 GetNameSpace() (Outlook) 292 InputBox() 229 OnTime() 180 Outlook 287 Path 179 Quit() 181 Quit() (Outlook) 288 Quit() (Word) 275 Run() 164 ScreenUpdating 251 Visible (Word) 275 Word 275 Apply() Sort 88 ApplyDataLabels() Point 194, 200 Series 194 AppointmentItem (Outlook) Duration 298 GetRecurrencePattern() 300 Location 298 Outlook 298 Save() 298 Start 298 Subject 298 Arbeitsmappe 46 aktive 50 aktivieren 51 Anzahl 47 diese 46 erzeugen 47 ist gesichert 52 laufende Nummer 52
Arbeitsmappe (Forts.) Name 49, 52 ffnen 48 Pfad 53 schlieen 48 speichern 51 wird geffnet 89 wird geschlossen 89 Array() 142 As 99, 149, 161, 172 Dateinummer 261 New 174, 179 ASC (SQL) 310 Attachment (Outlook) 295 Attachments Add() (Outlook) 287 Count (Outlook) 294 MailItem (Outlook) 287 Auflistung 46, 55 durchlaufen 176 eigene 178 Aufruf, zeitverzgert 180 Aufzeichnung beenden 19 beginnen 19 relativ 34 Ausgabe formatieren 242, 383 Ausgabedialog 233 Auskommentieren 94 Auswahlabfrage (SQL) 302, 303, 307 Auswertungsreihenfolge 106, 110 AutoFilter(), Range 181 AutoFit, Columns/Rows 80 Axes 193 Axes(), Chart 193 Axis 193 AxisTitle 193 HasTitle 193 MaximumScale 193 MinimumScale 193 TickLabels 193 AxisTitle 193
B
BackColor, TextBox 333 Balkendiagramm 188 BarColor, FormatConditions 215 bas 165
396
Index
Bcc, MailItem (Outlook) 289 Bearbeitungsmodus 34 Bedingte Formatierung 214 Bedingung 111 Before Diagrammblatt 187 Tabellenblatt 56 BeginConnect(), ConnectorFormat 206 Benannter Parameter 56, 154 Benutzer 16 -definierter Datentyp 159, 378 -eingaben 228 -fhrung 317, 341, 342 Bereich auswhlen 32 Bezeichnungsfeld 327 Beziehung darstellen 224 Bildlaufleiste 332 Eigenschaften 335 Bildschirmaktualisierung ein/aus 251 Bin2...() 255 Binr 255 Blatt, Tabelle und Diagramm 186 Blau 102 Body, MailItem (Outlook) 287 Bold, Font 74 Boolean 97, 106 Border Legend 192 Point 194 Series 193 Borders Color 76 InsideLineStyle (Word) 281 LineStyle 76 OutsideLineStyle (Word) 281 Range 76 Table (Word) 281 Weight 76 Breakpoint 132 BuildFreeform(), Shapes 201, 208 Button _Click() 323 Abbrechen 234 Default 357 erzeugen 33, 322 Ignorieren 234 Ja 234 Nein 234 OK 234
C
Cancel 91 Caption, Steuerelement 323 Carriage Return 41 Case Else 115 CDate() 242 CDbl() 242 Cell Table (Word) 277 Cells 59, 65 Delete 80 CenterFooter 62 CenterHeader 62 CenterHorizontally 62 CenterVertically 62 Characters Range 75 TextFrame 204 Chart 187, 188 Axes() 193 ChartArea 192 ChartTitle 192 ChartType 187, 189 HasLegend 192 HasTitle 192 Legend 192 Name 187 PlotArea 192 SeriesCollection() 193 SetSourceData() 187, 189 ChartArea Chart 192 Interior 192 ChartObject 188 Copy() 197 Delete() 198 Export() 198 Height 195 Left 195 Top 195 Width 195 ChartObjects 188 Add() 189
397
Index
Charts 186 (Index) 190 Add() 187 Copy() 195 Delete() 196 Export() 196 ChartTitle Chart 192 Text 192 ChartType Chart 187, 189 CheckBox 329 Value 331 CInt() 365 Clear() ComboBox 362 Range 68 SortFields 88 ClearContents(), Range 68 ClearFormats(), Range 68 Close Datei 261 Close() Connection (Access) 302, 305 Recordset (Access) 305 Workbooks 48 Code -ansicht 323 exportieren 165, 325 -fenster 30 importieren 166, 325 -modul 30 selbst schreiben 38 Codefenster 88 Collection 178 Color Borders 76 Font 74 Interior 77 ColorScale 216 ColorScaleCriteria 216 ColorScaleType 216 Column, Range 83 Columns AutoFit 80 Count (Word) 277 Table (Word) 277 Columns, Range 80 ColumnWidth, Range 79 ComboBox 332 _Change() 334
ComboBox (Forts.) AddItem() 334 Clear() 362 List(Index) 334 ListCount 362 ListIndex 334 Style 334 Text 334 Connection (Access) ADODB 302, 304 Close() 302, 305 ConnectionString 302, 304 Execute() 305, 306 Open() 302, 304 ConnectionString Connection (Access) 302, 304 ConnectorFormat BeginConnect() 206 EndConnect() 206 Shapes 206 ContactItem (Outlook) 296 Email1Address 296 FirstName 296 LastName 296 Save() 297 Convert(), WorksheetFunction 253 ConvertToShape(), FreeformBuilder 208 Copy() ChartObject 197 Charts 195 Range 32, 66 Worksheets 56 Count Attachments (Outlook) 294 Collection 178 Columns (Word) 277 Items (Outlook) 292 Range 81 Rows (Word) 277 Shapes 201 Workbooks 47 Count(), WorksheetFunction 256 CountBlank(), WorksheetFunction 256 CreateItem() (Outlook) AppointmentItem 298 ContactItem 297 MailItem 287 CreateObject() Outlook 287
398
Index
CreateObject() (Forts.) Word 275 Critical 234 CSV-Datei 261, 265 Cut(), Range 22, 32, 66
D
DashStyle, Line 204 Databar 214 DataLabel NumberFormatLocal 201 Point 201 Date 97 DateAdd() 247 DateDiff() 248 Datei nderungsdatum 269 -attribut 269 -ende 261 Funktionen 266 Import, Export 259 Information ber 268 kopieren 271 Lnge 269 lschen 271 Men 23 ffnen 260 ffnen-Dialog 318 -operationen 270 schlieen 261 schreiben 263, 265 Speichern-Dialog 319 suchen 266 umbenennen 271 Zeile lesen 261 Zeile schreiben 264 Dateiendung bas 165 csv 262 frm 165, 325 frx 165, 325 gif 196 jpg 196 png 196 xlsb 37 xlsm 24 xlsx 23 Dateityp ndern 43
Datenaustausch Outlook 281 Textdatei 259 Word 272 Datenbalken, bedingte Formatierung 214 Datenbank, relational 300 Datenfeld 135 als Parameter 158 dynamisch 140, 383 eindimensional 136 lschen 142 mehrdimensional 138 modulweites 378 Obergrenze 157, 158 Public 354 statisch 135 umwandeln 245 Untergrenze 158 von Objekten 204 Datenquelle fr Diagramm 187, 189 Datensatz Access 303 aus Datei lesen 261 Datentyp 96, 97 benutzerdefiniert 159, 378 einer Funktion 149 erkennen 100 DateSerial() 248 Datum Datentyp 97 Datum und Zeit Datumsangabe erstellen 248 erkennen 242 Jahr ermitteln 251 letzter Tag im Monat 250 Monat ermitteln 251 Tag im Monat ermitteln 250 umwandeln 242 Wochentag ermitteln 248 Zeit addieren 247 Zeitdifferenz berechnen 248 Datumsfilter 184 Day() 250 DayofWeekMask, RecurrencePattern (Outlook) 300 Debug 127, 130 Debug.Print 41 Dec2...() 255 Default-Button 234, 357
399
Index
Deklaration 96 erforderlich 28, 97 DELETE (SQL) 315 Delete() Cells 80 ChartObject 198 Charts 196 EntireRow/EntireColumn 79, 366 FormatConditions 214 Range 79 Worksheets 58 DESC (SQL) 310 Description Err 129 Destination Range 66 Dezimal 255 Dezimalpunkt 99 Diagramm 185 Achse 193 als Blatt erstellen 186 ndern 190 Datenpunkt 194 Datenquelle 187, 189 Datenreihe 193, 194 Datenreihenbeschriftung 200 Datenreihenbeschriftungsformat 201 Diagrammflche 192 Diagrammtyp 200 eingebettet 188 ndern 194 exportieren 198 kopieren 197 lschen 198 erstellen 186 hat Legende 192 hat Titel 192 Legende 192 nach Spalten/Zeilen 188 Titel 192 Typ 189 Zeichnungsflche 192 Diagrammblatt 186 ndern 190 benennen 187 exportieren 196 kopieren 195 lschen 196 Diagrammrahmen 188 Gre 195 neu erzeugen 189
Diagrammrahmen (Forts.) Position 195 Dialogfeld 317, 341 anzeigen 324 ausblenden 356 eigenes 30, 321 einfaches 233 erzeugen 321 initialisieren 330 integriertes 317 Makro 21 Makro aufzeichnen 36 modales 324 schlieen 324, 355, 356 Speichern unter 23 Start aus Tabellenblatt 324 Dialogs Application 285, 317 Show() 285, 317 DieseArbeitsmappe, Modul 30 Dim 99 Dir() 266 Direktfenster 41, 131 Display(), MailItem (Outlook) 288 DisplayGridlines, ActiveWindow 60 DisplayHeadings, ActiveWindow 60 Division 103 durch 0 127 Rest 104 Do Until 120 While 120 doc 273 Documents (Word) Add() 279 Application 275 Open() 275 Paragraphs 275 SaveAs() 279 Tables 277 docx 273 DoEvents() 253 Dokument (Word) erzeugen 279 speichern 279 Double 97 Drehfeld 332 Drucken, Seiteneinrichtung 60
400
Index
E
Eigenschaft 45 Eigenschaften-Fenster 29, 322, 326 Einfgeabfrage (SQL) 314 Eingaben des Benutzers 228 Einheit umrechnen 253 Einrckung 94 Einzelschrittverfahren 130 Else 112 ElseIf 113 E-Mail (Outlook) Anhang 287, 295 Anhang, Anzahl 294 anzeigen 288 Betreff 287 Dialogfeld anzeigen 285 einfaches Senden 283 Empfnger 284, 287 erzeugen 286, 287 Inhalt 287 Kopieempfnger 289 senden 288 Serie erzeugen 288 Zellbereich senden 289 Email1Address, ContactItem 296 Empty 175 End If 113 End Select 115 End Sub 22, 32, 145 End Type 160 End With 170 EndConnect(), ConnectorFormat 206 Endung doc 273 docx 273 xls 41 xlsm 24 xlsx 23 EntireColumn Insert() 78 Range 78, 79, 366 EntireRow Font 360 Insert() 78, 360 Range 78, 79, 360, 366
Entwickler 16 Entwicklungsumgebung 28 EOF() 261 EOF, Recordset (Access) 305 EoMonth(), WorksheetFunction 250 Erase 142 Ereignis 45, 88 Ereignisprozedur 88, 323 Err 129 Excel Datei 46 eigene Funktion 144, 149 schlieen 181 vor 2007 41 Excel-Optionen 25 Exclamation 234 Execute(), Connection (Access) 305, 306 Exit Do 120, 123 Exit For 117 Exit Function 149 Exit Sub 129, 145 Export in Datei 263, 265 Word 277, 279 Export() ChartObject 198 Charts 196
F
F1 93, 173 F2 167 F5 31, 132, 324 F8 130 F9 132 False 97, 106 Farbe 74, 102 Farbskala, bedingte Formatierung 215, 217 Fehler -behandlung 125 logischer 130 -objekt 129 vermindern 29 Feld von Variablen 135 FileCopy() 271 FileDateTime() 269 FileLen() 269
401
Index
Fill ForeColor 202 Shape 202 Filter mehrere Kategorien 183 mit Platzhalter 184 mit Vergleich 182 ber zwei Spalten 183 verknpft 183 Filtern 181 FirstName, ContactItem (Outlook) 296 FitToPagesTall, PageSetup 62 FitToPagesWide, PageSetup 62 fmOrientationHorizontal 335 fmOrientationVertical 335 fmSpecialEffectSunken 336 fmStyleDropDownList 334 fmTextAlignRight 349 Folder (Outlook) 292 Items 292 Font Bold 74 Color 74 EntireRow 360 Italic 74 Name 74 Range 73 Size 74 Subscript 75 Superscript 75 Underline 74 For Each 176 For Next 116, 137 ForeColor Fill 202 Line 203 Format() 243, 335, 383 FormatColor, ColorScaleCriteria 216 FormatConditions 214 Formatierung 242 bedingt 214 schachteln 337 Formel, Eingabe 231 FormulaLocal, Range 69, 227 Frame 328 FreeformBuilder AddNodes() 208 ConvertToShape() 208 Freiform 201, 207
frm 165, 325 frx 165, 325 Function 149 Funktion 144, 149, 227 aufrufen 149 aufrufen in anderer Datei 162
G
Ganze Zahl 97 Ganzzahldivision 103 Gelb 102 Geschachteltes With 171 Gesendete Objekte, Outlook 291 GetAttr() 269 GetDefaultFolder(), Namespace (Outlook) 292 GetNameSpace(), Application (Outlook) 292 GetRecurrencePattern(), AppointmentItem (Outlook) 300 gif 196 Gleich 106 SQL 308 Gleitkommazahl 97 GoTo 129 Grer als 106 SQL 308 GroupItems, Shape 225 Grn 102 Gltigkeitsbereich 96, 133, 146 benutzerdefinierter Datentyp 162 Prozeduren/Funktionen 163
H
Haltepunkt 132 HasLegend, Chart 192 HasTitle Axis 193 Chart 192 Height ChartObject 195 Steuerelement 325 Hex2...() 255 Hexadezimal 255 Hierarchie darstellen 224 Hilfe 93, 168 Hochformat 61
402
Index
I
IconCriteria, FormatConditions 219 IconSet, FormatConditions 218 IconSetCondition 218 If Block 112 einzeilig 112 Import aus Datei 259, 261 Word 273, 275 In 176 Index Charts 190 Datenfeld 136 eindeutiger (Access) 301 Items (Outlook) 292 Points 194 SeriesCollection 193 Shapes 201 Workbooks 52 Worksheets 55 Information 234 Innenbereich 77 Input, Datei lesen 261 InputBox() Application 229 einfache 229 INSERT (SQL) 302, 314 Insert() EntireRow 360 EntireRow/EntireColumn 78 Range 77 InsideLineStyle Borders (Word) 281 InStr() 241 Int() 374 Integer 97 Integriert Dialogfeld 317 Konstante 101 Interior ChartArea 192 Color 77 Legend 192 PlotArea 192
Interior (Forts.) Range 77 Is 114 IsDate() 242 IsNumeric() 242 Italic, Font 74 Items (Outlook) (Index) 292 Count 292 Folder 292
J
Jahreskalender 249 Join() 245, 265 jpg 196
K
Key1, Sortierschlssel 86 Kill() 271 Klammerausdruck 106, 111 Klassenmodul 30, 88 Kleiner als 106 SQL 308 Kombinationsfeld 332 aktuelles Element 334 Anzahl Elemente 362 Auswahl wechselt 334 Elementnummer 334 fllen 334 lschen 362 Text des aktuellen Elements 334 Kommentar 22, 31, 94 Kompatibilittsprfung 43 Komponente 159 Konstante 101 Konstante, integrierte 101 Kontakt erzeugen (Outlook) 296 speichern (Outlook) 297 Kontrollausgabe 38 Kontrollkstchen 329 Kontrollstruktur 111, 116 Korrektur, automatisch 93 Kreisdiagramm 188
403
Index
L
Label 327 SpecialEffect 336 LargeChange, ScrollBar 335 LastName, ContactItem (Outlook) 296 Laufzeitfehler 126, 259 lbl 327 LBound() 158 Leerzeile 93 Left ChartObject 195 Steuerelement 326 Left() 240 LeftFooter, PageSetup 62 LeftHeader, PageSetup 62 Legend Border 192 Chart 192 Interior 192 Len() 240 Like 107 LIKE (SQL) 309 Line DashStyle 204 ForeColor 203 Shape 203 TextFrame 204 Weight 203 Line Feed 41 Line Input 261 LineStyle, Borders 76 Linie 201, 204 Liniendiagramm 188 Linksbndig 337 List(Index), ComboBox 334 ListBox 332 ListCount, ComboBox 362 Listenfeld 332 aktuelles Element 334 Anzahl Elemente 362 Auswahl wechselt 334 Elementnummer 334 fllen 334 lschen 362 Text des aktuellen Elements 334 ListIndex, ComboBox 334 Location, AppointmentItem (Outlook) 298
Locked, TextBox 333 Logischer Fehler 130 Logischer Operator 108 Lokale Variable 133 Long 97 Loop 120, 123 Loop Until 120, 123 Loop While 120, 122 Lschabfrage (SQL) 315
M
Magenta 102 MailItem (Outlook) 287 Attachments 287 Bcc 289 Body 287 Display() 288 Send() 288 Subject 287 To 287 Makro 15 aktivieren 25 ansehen, vor 2007 42 aufzeichnen 18 aufzeichnen, Diagramm 190 aufzeichnen, vor 2007 42 ausfhren 21 ausfhren nicht mglich 24 ausfhren per Button 33 ausfhren, vor 2007 42 deaktivieren 24 geht verloren 23 Name 19, 21 Sicherheit, vor 2007 43 speichern 23 speichern, vor 2007 43 berall benutzen 36 Verzeichnis aktivieren 26 zuweisen 33 Makrocode ansehen 21 verndern 31 verstehen 31 Makrosicherheit 24 Button 26 MarkerBackgroundColor Point 194 Series 193
404
Index
MarkerForegroundColor Point 194 Series 193 MarkerStyle Point 194 Series 193 Max(), Worksheetfunction 360 Max, ScrollBar 335 MaximumScale, Axis 193 Me 324, 356, 361 Mehrfachauswahl 114 MergeCells, Range 73 Methode 45, 144 Mid() 240 Min, ScrollBar 335 Mini-Diagramme 220 MinimumScale, Axis 193 Mod 104 Modales Dialogfeld 324 Modul DieseArbeitsmappe 30 einfgen 30 exportieren 165, 325 importieren 166, 325 lschen 166 Tabelle1 30 Modularisierung 144, 162, 341 Modulo 104 Modulweit Datenfeld 378 Variable 133 Month() 251 Move(), Worksheets 57 MoveNext(), Recordset (Access) 305 MsgBox() 40, 233 msoAutoShapeType 202 msoConnectorStraight 206 msoConnectorType 206 msoEditingAuto 208 msoEditingType 208 msoLineDash 204 msoLineDashStyle 204 msoSegmentCurve 208 msoSegmentLine 208 msoSegmentType 208 msoShapeOval 203 msoShapeRectangle 202 Multiplikation 103 Mustervergleich 107
N
Nachrichtenbox 40 Name Chart 187 Font 74 von Variablen 96 Workbook 49 Name(), Datei umbenennen 271 Namensraum, Outlook 292 Namespace, GetDefaultFolder() (Outlook) 292 New 174 Next 116, 176 Nicht logisches 108 logisches (SQL) 308 Nordwind.mdb 181, 341 Not 108 NOT (SQL) 308 Nothing 173 Now() 180 NumberFormatLocal 256 DataLabel 201 Range 70 TickLabels 193
O
Object 97, 172 Objekt allgemein 167 -ansicht 323 Grundlagen 45 Haupt- 46 kurzer Zugriff 170 neu erzeugen 174, 179 referenzieren 169 Typ ermitteln 174 Verweis 171 Objektbibliothek Access 301 Outlook 282 Word 273 Objekthierarchie 46, 59, 169, 179 Outlook 282 Word 272 Objektkatalog 167 Objektmodellreferenz 168
405
Index
Objektorientierung 45 Objektvariable 171 Oct2...() 255 Oder logisches 108 logisches (SQL) 308 Office-Schaltflche 23 Offset 35 Range 83 Oktal 255 olContactItem 297 olFolderContacts 296 olFolderSentMail 292 olMonday 300 olRecursDaily 300 olRecursWeekly 300 olTuesday 300 On Error 126, 129 OnTime(), Application 180 Open() Connection (Access) 302, 304 Documents (Word) 275 Workbooks 48 Open, Datei 260, 264 Operator 102 arithmetisch 103 logisch 108 Operator (SQL) 308 Operatorenrangfolge 151 Option Explicit 29, 97 Optional 152 Optionsschaltflche 328 voreinstellen 330 Or 108, 234 OR (SQL) 308 ORDER BY (SQL) 310 Order1, Sortierrichtung 86 Orientation PageSetup 61 Range 73 ScrollBar 335 SpinButton 335 Outlook Application 287 AppointmentItem 298 Attachment 295 ContactItem 296 CreateItem() (AppointmentItem) 298 CreateItem() (ContactItem) 297
Outlook (Forts.) CreateItem() (MailItem) 287 Datenaustausch 281 E-Mail erzeugen 286 Folder 292 Gesendete Objekte 291 Kontakt erzeugen 296 Kontakteigenschaften 296 MailItem 287 Namensraum 292 Objektbibliothek 282 Objekthierarchie 282 RecurrencePattern 300 starten 287 Termin erzeugen 297 Termineigenschaften 298 Terminserie erzeugen 298 Terminwiederholung 300 Verzeichnis ermitteln 292 Verzeichniseintrag 292 Zugriff erlauben/verweigern 283 Output, Datei schreiben 264 OutsideLineStyle, Borders (Word) 281 Oval 203
P
PageSetup CenterHorizontally 62 CenterVertically 62 FitToPagesTall 62 FitToPagesWide 62 Header, Footer 62 Orientation 61 PrintGridlines 61 PrintHeadings 61 Worksheets 60 Zoom 61 Paragraphs (Word) Add() 279 Documents 275 Range 275 Parallele Aktionen 253 ParamArray 156 Parameter 144 beliebig viele 156 benannt 56, 154 ist Datenfeld 158 optional 152
406
Index
Parameter (Forts.) bergabe 147 Paste() 22, 32 PasteSpecial(), Range 67 Path Application 179 Workbook 53 PatternEndDate, RecurrencePattern (Outlook) 300 PatternStartDate, RecurrencePattern (Outlook) 300 Pause 252 personal.xlsb 37 personl.xls 44 Persnliche Makroarbeitsmappe 36, 47 vor 2007 44 Perzentil 217 Pfad, Installation 179 Platzhalter Dateiname 267 Zeichenkette 107 Platzhalter (SQL) 309 PlotArea Chart 192 Interior 192 png 196 Point 194 ApplyDataLabels() 194, 200 Border 194 DataLabel 201 MarkerBackgroundColor 194 MarkerForegroundColor 194 MarkerStyle 194 Points 194 (Index) 194 SparklineGroups 223 Points(), Series 194 Potenzierung 104 Preserve 140, 383 Primrschlssel Tabelle (Access) 301 Print, Dateizeile schreiben 264 PrintGridlines, PageSetup 61 PrintHeadings, PageSetup 61 Prioritt der Operatoren 110 Private Function 163 Private Sub 163 Private Type 162, 378
Programm anhalten 132 unterbrechen 252 Programmabbruch 126 Programmierstil 93 Programmzeile in mehreren Zeilen 95 Projekt, Vorteile 341 Projekt-Explorer 29 Projektweite Variable 133 Prozedur 38, 144 aufrufen 145 aufrufen in anderer Datei 162 Name 39 Prozess darstellen 224 Public 133 Datenfeld 354 Public Function 354 Public Sub 354 Public Type 162, 378 Punkt nach Objektname 94
Q
Querformat 61 Question 234 Quit() Application 181 Application (Outlook) 288
R
RadioButton 328 Value 331 Rahmen 328 Liniendicke 76 Linienfarbe 76 Linienstil 76 Randomize 121 Range 22, 32, 46, 63 Borders 76 Cells 65 Characters 75 Clear() 68 ClearContents() 68 ClearFormats() 68 Column 83 Columns 80 ColumnWidth 79 Copy() 66
407
Index
Range (Forts.) Count 81 Cut() 66 Delete() 79 EntireColumn 78, 79, 366 EntireRow 78, 79, 360, 366 Font 73 FormulaLocal 69, 227 HorizontalAlignment 72 Insert() 77 Interior 77 MergeCells 73 NumberFormatLocal 70 Offset 83 Orientation 73 Paragraphs (Word) 275 PasteSpecial() 67 Row 83, 360 RowHeight 79 Rows 80 Select() 64 Sort 85 Sort() 365 SpecialCells 81, 360 Value 39, 65, 69 VerticalAlignment 72 WrapText 73 Rangfolge 151 Rangfolge der Operatoren 110 Rechteck 201 Rechtsbndig 337 Recordset (Access) ADODB 303, 304 Close() 305 EOF 305 Feld erreichen 305 MoveNext() 305 RecurrencePattern (Outlook) 300 DayofWeekMask 300 PatternEndDate 300 PatternStartDate 300 RecurrenceType 300 RecurrenceType 300 ReDim 140, 383 RefEdit 337 Referenz, bergabe per 147 Referenzierung, Objekt 169 Registerkarte Ansicht 18
Registerkarte (Forts.) Entwicklertools 25, 26 Relationale Datenbank 300 Relative Aufzeichnung 34 Remove(), Collection 178 Replace(), WorksheetFunction 241 RerouteConnections(), Shapes 207 Resume Next 129 RetryCancel 234 RGB() 74, 102 Right() 240 RightFooter, PageSetup 62 RightHeader, PageSetup 62 Ringtausch 149 Rnd() 121 Rot 102 Rotation, Shape 203 Row, Range 83, 360 RowHeight, Range 79 Rows AutoFit 80 Count (Word) 277 Range 80 Table (Word) 277 Rckgabewert 144, 149 Run(), Application 164
S
Sulendiagramm 188 Save() (Outlook) AppointmentItem 298 ContactItem 297 SaveAs(), Documents (Word) 279 Schdlicher VBA-Code 24 Schaltflche 33 Schaltjahr 151 Schattierung 212 Schleife 116, 176 bedingungsgesteuert 120 geschachtelt 139 kopf-/fugesteuert 120 zhlergesteuert 116 Schriftart, Eigenschaften 73 Schrittweite 116 negativ 119 Schwarz 102 ScreenUpdating, Application 251
408
Index
ScrollBar 332 Change() 335 Eigenschaften 335 Search(), WorksheetFunction 241 SELECT (SQL) 302, 304, 307 Select 22, 32 Range 64 Select Case 114 Selection 22, 32 Send(), MailItem (Outlook) 288 SendMail(), Workbook 284 Series 193 ApplyDataLables() 194 Border 193 MarkerBackgroundColor 193 MarkerForegroundColor 193 MarkerStyle 193 Points() 194 SeriesCollection 193 SeriesCollection(), Chart 193 SeriesColor, SparkLineGroups 223 Set 172 SetRange(), Sort 88 SetSourceData(), Chart 187, 189 Shape 201 Fill 202 Line 203 Rotation 203 Shapes 201 AddConnector() 201, 206 AddLine() 201, 204 AddShape() 201, 202 alle 210 BuildFreeform() 201, 208 ConnectFormat 206 Count 201 RerouteConnections() 207 Sheets 186 Shift + F2 99, 147 Shift, Zellen verschieben 77, 79 Show() Dialogs 285, 317 UserForm 324 Sicherheitscenter 27 Sicherheitswarnung 24 Single 97 Size, Font 74 SmallChange ScrollBar 335
SmallChange (Forts.) SpinButton 335 SmartArt 224 Sort Objekt 87 Range 85 SortFields, Sort 88 Sortierschlssel 87, 171 Spaltennummer 65 Sparkline formatieren 222 Gewinn/Verlust 222 Linie 220 Spalte 221 SparkLineGroups 221 Sparklines 220 alle Farben 223 SpecialCells, Range 81, 360 SpecialEffect, Label 336 Speicherbedarf 96, 97 Spiegelung 212 SpinButton 332 Eigenschaften 335 Split() 246, 262 SQL 302 Fehlersuche 312 SQL-Befehl, senden 305, 306 Start, AppointmentItem (Outlook) 298 Statusleiste 20 Step 116 Steuerelement Abstand links 326 Abstand oben 326 Bezeichnungsfeld 327 Bildlaufleiste 332 Breite 325 Drehfeld 332 erzeugen 322 Farbe 333 formatieren 326 Hhe 325 Kombinationsfeld 332 Kontrollkstchen 329 kopieren 326 Listenfeld 332 Name 322 Optionsschaltflche 328 Rahmen 328
409
Index
Steuerelement (Forts.) RefEdit 337 -sammlung 33 sichtbar/unsichtbar 379 Textfeld 327 Titel 323 ToggleButton 338 Wert ermitteln 326 Zahl formatieren 335 StrConv() 359 Strg 90 Strg + Shift + F2 99, 147 String 97 Structured Query Language 302 Style, ComboBox 334 Sub 22, 32, 145 Sub/UserForm ausfhren 31 Subject AppointmentItem (Outlook) 298 MailItem (Outlook) 287 Sub-Prozedur 38 Subscript, Font 75 Subtraktion 103 Suchmuster, Dateiname 267 Superscript, Font 75 Symbol Aufzeichnung beenden 20 Aufzeichnung beginnen 20 Auskommentierung aufheben 94 Block auskommentieren 94 grner Pfeil 31 Symbolleiste bearbeiten 28 Visual Basic 44 Voreinstellung 28 Symbolsatz alle 219 bedingte Formatierung 218 Syntaxfehler 125 SystemModal 234
T
Tabelle erzeugen (Word) 280 Rahmen (Word) 281 Tabelle1, Modul 30 Tabellenblatt 46, 55 aktiv 55
Tabellenblatt (Forts.) aktivieren 58 alle Zellen 59, 65 Druck skalieren 61 Druck zentrieren 62 Druckformat 61 Druckgre anpassen 62 Druckinformationen 62 erzeugen 55 Gitternetzlinien 59, 61 Kopf-/Fuzeile 62 kopieren 56 laufende Nummer 55 lschen 58 Name 55 Seiteneinrichtung 60 sperren 345 strukturieren 77 berschriften Zeile/Spalte 59, 61 verschieben 57 wird aktiviert 90 wurde neu berechnet 91 Tabellenfunktion 227 Tabellenstruktur, Access 301 Table (Word) 277 Borders 281 Cell 277 Columns 277 Rows 277 Tables (Word) Add() 280 Documents 277 Tabulator 94 Target 90, 91 Taste Alt + F11 28 F1 93, 173 F2 167 F5 31, 132, 324 F8 130 F9 132 Shift + F2 99, 147 Strg 90 Strg + Shift + F2 99, 147 Tab 94 Termin erzeugen (Outlook) 297 speichern (Outlook) 298 Termineigenschaften (Outlook) 298
410
Index
Terminserie erzeugen (Outlook) 298 Terminwiederholung (Outlook) 300 Text AxisTitle 193 ChartTitle 192 ComboBox 334 TextBox 328 TextAlign, TextBox 349 TextBox 327 BackColor 333 Locked 333 Text 328 TextAlign 349 Textdatei Datenaustausch 259 lesen 259 Texteffekte 212 Textfeld 327 sperren 333 Textfilter 183 TextFrame Characters 204 Line 204 Then 112 ThisWorkbook 46 TickLabels Axis 193 NumberFormatLocal 193 Tiefstellen 75 Timer() 252 TimeValue() 180 Titel, Steuerelement 323 To 114, 116, 136 MailItem (Outlook) 287 ToggleButton 338 Value 339 Toolbox 321 Top ChartObject 195 Steuerelement 326 Trim() 386 True 97, 106 txt 327 Type 160, 378 AddShape() 211 ColorScaleCriteria 216 TypeName() 100, 174
U
bergabe von Parametern 147 UBound() 157, 158 Uhrzeit aktuell 180 -angabe 180 Umschaltfeld 338 Und logisches 108 logisches (SQL) 308 Underline, Font 74 Ungleich 106 SQL 308 Unload 324, 356 UPDATE (SQL) 302, 306, 312 UsedRange, Worksheet 80, 360 UserForm 30 _Initialize() 330 _QueryClose() 355 als Parameter 361 erzeugen 321 Hide() 356 Me 324, 356, 361 Objekttyp 362 Show() 324
V
Value CheckBox 331 RadioButton 331 Range 39, 65, 69 ScrollBar 335 ToggleButton 339 Variable 96 ausblenden 134 Datenfeld 135 Deklaration erforderlich 28, 97 Gltigkeitsbereich 133 lokale 133 modulweite 133 Objekt- 171 projektweite 133 Variant 99, 142 VBA 15 vbAbort 235 VBA-Funktion 227 vbArchive 270
411
Index
vbBlack 102 vbBlue 102 vbCancel 235 vbCrLf 40 vbCyan 102 vbDirectory 270 VBE 28 vbGreen 102 vbHidden 270 vbIgnore 235 vbLowerCase 359 vbMagenta 102 vbModeless 325 vbNo 235 vbOK 235 vbOkOnly 234 vbReadOnly 270 vbRed 102 vbRetry 235 vbSystem 270 vbUpperCase 359 vbWhite 102 vbYellow 102 vbYes 235 Verbinder 201, 205 Verbindung, Datenbank (Access) 301 Verbindungspunkt 205 Vergleichsoperator 106, 112 Verkettungsoperator 109 Versatz 35 VerticalAlignment, Range 72 Vertrauenscenter 27 Vertrauenswrdige Speicherorte 27 Verweis auf Objekt 97, 171 Verzeichnis -attribut 269 -eintrag (Outlook) 292 ermitteln (Outlook) 292 -funktionen 266 Verzweigung 106, 111 Visible Application (Word) 275 Steuerelement 379 Visual Basic Editor 28 Visual Basic for Applications 15
W
Wagenrcklauf 41 Warenwirtschaft 342 wdLineStyleSingle, Word 281 Weekday() 248 Weight Borders 76 Line 203 Wei 102 Werkzeugsammlung 321 Wertebereich 97 auerhalb 99 WHERE (SQL) 307 Width ChartObject 195 Steuerelement 325 Wiederholung 116 With 170 geschachtelt 171 Wochentag ermitteln 248 Word Absatz 275 Application 275 beenden 275 Datenaustausch 272 Dokument ffnen 275 Export 277, 279 Import 273, 275 Objektbibliothek 273 Objekthierarchie 272 starten 275 Table 277 WordArt 212 Workbook 46 _BeforeClose() 89 _Open() 89, 325, 354 Activate() 51 Codefenster 88 Name 49 Path 53 Save() 51 SaveAs() 51 Saved 52 SendMail() 284 Workbooks 46 (Index) 52 Add() 47 Close() 48
412
Index
Workbooks (Forts.) Count 47 FullName 49 Open() 48 Worksheet _Activate() 90 _BeforeDoubleClick() 91 _Calculate() 91 _SelectionChange() 90 Codefenster 88 UsedRange 80, 360 WorksheetFunction Convert() 253 Count() 256 CountBlank() 256 EoMonth() 250 Max() 360 Replace() 241 Search() 241 Worksheet-Funktion 227 Worksheets 46, 55 (Index) 55 Activate() 58 Add() 55 Copy() 56 Delete() 58 Move() 57 PageSetup 60 WrapText, Range 73
X
xlAnd 183 xlAscending 86 xlBarClustered 188 xlBottom 73 xlCategory 193 xlCellTypeBlanks 83 xlCellTypeFormulas 82 xlCellTypeLastCell 83 xlCenter 72 xlColumnClustered 188 xlColumns 188 xlConditionValueTypes 216 xlContinuous 76 xlDescending 86 xlDialogFontProperties 320 xlDialogOpen 318 xlDialogPatterns 320
xlDialogSaveAs 319 xlDialogSendMail 285 xlDot 76 xlDouble 76 xlEdgeBottom 76 xlEdgeLeft 76 xlEdgeRight 76 xlEdgeTop 76 xlFilterValues 184 xlGuess 86 xlHairline 76 xlInsideHorizontal 76 xlInsideVertical 76 xlJustify 72 xlLandscape 61 xlLeft 72 xlLine 188 xlMarkerStyleCircle 193 xlMarkerStyleNone 193 xlMarkerStyleSquare 193 xlMedium 76 xlNo 86 xlPasteFormats 67 xlPasteValues 67 xlPie 188 xlPortrait 61 xlRight 72 xlRows 188 xls 41 xlsb 37 xlShiftDown 77 xlShiftToLeft 79 xlShiftToRight 77 xlShiftUp 79 xlShowLabel 194 xlShowNone 194 xlShowValue 194 xlsm 24 xlSparkColumn 221 xlSparkColumnStacked100 222 xlSparkLine 221 XLStart 37 xlsx 23 xlThick 76 xlThin 76 xlTop 73 xlValue 193 xlVertical 73
413
Index
Y
Year() 251 YesNo 234 YesNoCancel 234
Z
Zahl Eingabe 230 erkennen 242 ganze 97 umrechnen 255 umwandeln 242, 365, 374 Zahlenfilter 182 Zeichen einzeln formatieren 74 Zeichenkette 97 Funktionen 239 Lnge 240 Leerzeichen lschen 386 Teilzeichenkette ermitteln 240 Teilzeichenkette ersetzen 241 Teilzeichenkette suchen 241 umwandeln 241, 359 verketten 109 zerlegen 246 Zeichnungsobjekt 201 Anzahl 201 Drehung 203 Form 201, 202 Freiform 201, 208 Freiform, Knoten hinzufgen 208 Freiform, umwandeln 208 Fllfarbe 202 Fllung 202 Lage 203 Linie 201, 203, 204 Linienart 204 Liniendicke 203 Linienfarbe 203 Text 204 Textrahmen 204 Typ 202, 203 Verbinder 201, 206 Verbindung Anfang/Ende 206 Verbindung herstellen 207
Zeichnungsobjekt (Forts.) Verbindungsart 206 Zeile zerlegen 60 Zeilenmarke 129 Zeilennummer 65 Zeilenvorschub 41 Zellbereich 46, 62 Adresse 65 ausschneiden 32 Auswahl wird gewechselt 90 auswhlen 64 benutzter Bereich 360 besondere Zellen 80 einfgen 77 einfgen ganze Zeile/Spalte 78, 360 Eingabe 232 ermitteln 337 formatieren ganze Zeile/Spalte 360 Formel eintragen 227 hat Formel 82 Innenbereich 77 Innenfarbe 77 leere Zellen ermitteln 83 leere Zellen zhlen 256 letzte Zelle ermitteln 83 lschen 78 lschen ganze Zeile/Spalte 79, 366 Muster 76 Nachbarzelle verschieben 77 per E-Mail senden (Outlook) 289 Rahmen 75 sortieren 85, 365 Spaltenbreite 79 spezielle Zellen 81, 360 unsichtbare Benutzung 80 Versatz 83 verwendeter Bereich 80 Zahlen zhlen 256 Zeile/Spalte optimal 80 Zeilenhhe 79 Zellen zhlen 81 zusammenhngend 63 Zelle 62 Spaltennummer 83 wird doppelt geklickt 91 Zeilennummer 83, 360 Zellhintergrund, Sparklines 220 Zellinhalt ausrichten 72
414
Index
Zellinhalt (Forts.) ein-/mehrzeilig 73 einzelne Zeichen 74 Formel eintragen 69 kopieren 66 lschen 68 Muster-Dialog 319 nur Format kopieren 67 nur Format lschen 68 nur Wert kopieren 67 nur Wert lschen 68 Schrift-Dialog 320 Schrifteigenschaften 73
Zellinhalt (Forts.) bereinander 73 verbinden 73 verschieben 66 Wert eintragen 69 Zoom, PageSetup 61 Zufallszahlengenerator 121 Zuweisung 96 benutzerdefinierter Datentyp 161 Objekt 172 ber Objekthierarchie 173 Zwischenablage 22, 32 Zyan 102
415