Вы находитесь на странице: 1из 416

Thomas Theis

Einstieg in VBA mit Excel

Liebe Leserin, lieber Leser,


Microsoft Excel kann viel, aber bei Weitem nicht alles, was Sie im beruflichen Alltag bentigen diese Erfahrung haben Sie wahrscheinlich schon gemacht, wenn Sie beschlossen haben, Visual Basic for Applications, oder kurz VBA, zu lernen. Viele Dinge werden mit VBA erst mglich und noch mehr lassen sich erheblich beschleunigen. Auf Dauer zahlt es sich also aus zu lernen, wie man Excel neue Funktionen beibringt. Vielleicht haben Sie bislang jedoch den Aufwand gescheut, sich mit VBA auseinanderzusetzen? Dieses Buch wurde daher extra so konzipiert, dass Sie bereits nach kurzer Zeit Erfolge erzielen werden. Es wurde speziell fr Leser geschrieben, die bislang noch keine Erfahrung im Programmieren haben. Schritt fr Schritt zeigt Ihnen unser Autor Thomas Theis alles, was Sie wissen mssen, um Ihre eigenen VBA-Skripte entwickeln zu knnen. Das Hauptziel des Buchs ist dabei nicht, Ihnen smtliche VBA-Konstrukte zu vermitteln, sondern Sie vor allen Dingen schnell in die Lage zu versetzen, Excel an Ihre Bedrfnisse anzupassen. Die Theorie ist daher auf das absolut Notwendige reduziert im Zentrum stehen die vielen Praxisbeispiele, anhand derer Sie den Stoff problemlos nachvollziehen knnen. Ihre neu gewonnenen Kenntnisse knnen Sie anschlieend an bungsaufgaben austesten, so dass der letzte Schritt zu Ihren eigenen VBA-Skripten kein Problem mehr fr Sie darstellen wird. Dieses Buch wurde mit groer Sorgfalt geschrieben, geprft und produziert. Sollte dennoch einmal etwas nicht so funktionieren, wie Sie es erwarten, freue ich mich, wenn Sie sich mit mir in Verbindung setzen. Ihre Kritik und konstruktiven Anregungen sind uns jederzeit herzlich willkommen! Doch nun viel Spa bei der Lektre und viel Erfolg mit VBA wnscht Ihnen

Ihre Christine Siedle Lektorat Galileo Computing

christine.siedle@galileo-press.de www.galileocomputing.de Galileo Press Rheinwerkallee 4 53227 Bonn

Auf einen Blick


1 2 3 4 5 6 7 8 9 Einfhrung ........................................................................... Grundlagen von Objekten und Ereignissen ......................... Grundlagen der Programmierung mit VBA ......................... 15 45 93

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

10 Dialogfelder ......................................................................... 317 11 Beispielprojekt .................................................................... 341 Lsungen ............................................................................. 387

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

Galileo Press, Bonn 2010 2., aktualisierte Auflage 2010


Das vorliegende Werk ist in all seinen Teilen urheberrechtlich geschtzt. Alle Rechte vorbehalten, insbesondere das Recht der bersetzung, des Vortrags, der Reproduktion, der Vervielfltigung auf fotomechanischem oder anderen Wegen und der Speicherung in elektronischen Medien. Ungeachtet der Sorgfalt, die auf die Erstellung von Text, Abbildungen und Programmen verwendet wurde, knnen weder Verlag noch Autor, Herausgeber oder bersetzer fr mgliche Fehler und deren Folgen eine juristische Verantwortung oder irgendeine Haftung bernehmen. Die in diesem Werk wiedergegebenen Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. knnen auch ohne besondere Kennzeichnung Marken sein und als solche den gesetzlichen Bestimmungen unterliegen.

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.4 1.5 1.6 1.7 1.8

1.9

Inhalt

Grundlagen von Objekten und Ereignissen .................................


2.1 2.2 Objekthierarchie und Auflistungen ............................................... Arbeitsmappen ............................................................................ 2.2.1 Anzahl Arbeitsmappen ermitteln ................................... 2.2.2 Neue Arbeitsmappe erzeugen ....................................... 2.2.3 Vorhandene Arbeitsmappe ffnen ................................. 2.2.4 Alle Arbeitsmappen schlieen ....................................... 2.2.5 Name einer Arbeitsmappe ermitteln ............................. 2.2.6 Aktive Arbeitsmappe ..................................................... 2.2.7 Arbeitsmappe aktivieren ............................................... 2.2.8 Arbeitsmappe speichern ................................................ 2.2.9 Arbeitsmappe ber Index oder Name auswhlen ........... 2.2.10 Pfad einer Arbeitsmappe ermitteln ................................ Tabellenbltter ............................................................................ 2.3.1 Tabellenblatt erzeugen .................................................. 2.3.2 Tabellenblatt kopieren .................................................. 2.3.3 Tabellenblatt verschieben .............................................. 2.3.4 Tabellenblatt lschen .................................................... 2.3.5 Tabellenblatt aktivieren ................................................. 2.3.6 Tabellenblatt formatieren .............................................. 2.3.7 Gitternetz, Zeilen- und Spaltenberschrift ..................... 2.3.8 Seiteneinrichtung .......................................................... Zellen und Zellbereiche ................................................................ 2.4.1 Zellen ber Range auswhlen ..................................... 2.4.2 Zellen ber Cells auswhlen ....................................... 2.4.3 Zellinhalte verschieben oder kopieren ........................... 2.4.4 Teile von Zellinhalten kopieren ..................................... 2.4.5 Zellinhalt lschen .......................................................... 2.4.6 Werte und Formeln eintragen ....................................... 2.4.7 Zellformat Zahlen ....................................................... 2.4.8 Zellformat Ausrichtung ............................................... 2.4.9 Zellformat Schrift ....................................................... 2.4.10 Einzelne Zeichen formatieren ........................................ 2.4.11 Zellformat Rahmen .................................................... 2.4.12 Zellformat Muster ...................................................... 2.4.13 Zellen einfgen ............................................................. 2.4.14 Zellen lschen ............................................................... 2.4.15 Zeilenhhe und Spaltenbreite ....................................... 2.4.16 Benutzten Zellbereich erkennen .................................... 2.4.17 Spezielle Zellen erkennen ..............................................

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

Grundlagen der Programmierung mit VBA ..................................


3.1 Allgemeines ................................................................................. 3.1.1 Codeblcke auskommentieren ...................................... 3.1.2 Zeilen zerlegen .............................................................. Variablen und Datentypen ........................................................... 3.2.1 Namen, Werte ................................................................ 3.2.2 Deklarationen ............................................................... 3.2.3 Datentypen ................................................................... 3.2.4 Konstanten ................................................................... Operatoren .................................................................................. 3.3.1 Arithmetische Operatoren ............................................. 3.3.2 Vergleichsoperatoren .................................................... 3.3.3 Logische Operatoren ..................................................... 3.3.4 Verkettungsoperator ..................................................... 3.3.5 Rangfolge der Operatoren ............................................. Verzweigungen ............................................................................ 3.4.1 Einzeiliges If Then Else ......................................... 3.4.2 If-Then-Else-Block ......................................................... 3.4.3 Select Case .................................................................... Schleifen ...................................................................................... 3.5.1 For-Next-Schleife .......................................................... 3.5.2 Do-Loop-Schleife ..........................................................

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

Fehlerbehandlung ............................................................................. 125


4.1 4.2 Syntaxfehler ................................................................................. Laufzeitfehler ............................................................................... 4.2.1 Programm mit Laufzeitfehlern ....................................... 4.2.2 Abfangen mit On Error .................................................. 125 126 126 128

Inhalt

4.3

Logische Fehler und Debugging ................................................... 130 4.3.1 Einzelschrittverfahren .................................................... 130 4.3.2 Haltepunkte .................................................................. 132

Mehr ber die Programmierung mit VBA .................................... 133


5.1 5.2 Gltigkeitsbereiche ...................................................................... Datenfelder ................................................................................. 5.2.1 Eindimensionale Datenfelder ......................................... 5.2.2 Mehrdimensionale Datenfelder ..................................... 5.2.3 Dynamische Datenfelder ............................................... 5.2.4 Datenfelder lschen oder freigeben ............................... Prozeduren und Funktionen ......................................................... 5.3.1 Prozeduren ................................................................... 5.3.2 bergabe von Parametern ............................................. 5.3.3 Funktionen ................................................................... 5.3.4 Optionale Parameter ..................................................... 5.3.5 Benannte Parameter ...................................................... 5.3.6 Beliebig viele Parameter ................................................ 5.3.7 Datenfelder als Parameter ............................................. Benutzerdefinierter Datentyp ....................................................... Modular programmieren .............................................................. 5.5.1 Code in der gleichen Datei ............................................ 5.5.2 Code in einer anderen Datei ......................................... Module exportieren und importieren ........................................... 5.6.1 Export eines Moduls ..................................................... 5.6.2 Import eines Moduls ..................................................... 133 135 136 138 140 142 144 144 147 149 152 154 156 158 159 162 162 163 165 165 166

5.3

5.4 5.5

5.6

Mehr ber Objekte ........................................................................... 167


6.1 6.2 6.3 6.4 Objektkatalog .............................................................................. Referenzierung von Objekten ....................................................... 6.2.1 Beispiel Zellen verschieben ........................................ Objektzugriff mit With ................................................................. Arbeiten mit Objektvariablen ....................................................... 6.4.1 Objektvariablen hierarchisch zuweisen .......................... 6.4.2 Neue Objekte erzeugen ................................................ 6.4.3 Objekttyp ermitteln ...................................................... For-Each-Schleife ......................................................................... Collections ................................................................................... 167 168 169 170 171 173 174 174 176 178

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 ..........................................................................................

179 179 180 181 181

Diagramme und Grafiken ................................................................ 185


7.1 Diagramm erstellen ...................................................................... 7.1.1 Diagrammblatt erstellen ................................................ 7.1.2 Eingebettetes Diagramm erstellen ................................. Diagramm ndern ........................................................................ 7.2.1 Diagrammblatt ndern .................................................. 7.2.2 Eingebettetes Diagramm ndern ................................... Diagramm verwalten .................................................................... 7.3.1 Diagrammblatt verwalten .............................................. 7.3.2 Eingebettetes Diagramm verwalten ............................... Beispiel: Formatiertes Kreisdiagramm .......................................... Shapes ......................................................................................... 7.5.1 Rechteck ....................................................................... 7.5.2 Oval .............................................................................. 7.5.3 Linie ............................................................................. 7.5.4 Verbinder ...................................................................... 7.5.5 Freiform ........................................................................ 7.5.6 Alle Formen .................................................................. WordArt ...................................................................................... Bedingte Formatierungen ............................................................ 7.7.1 Datenbalken ................................................................. 7.7.2 Zweifarbige Farbskala .................................................... 7.7.3 Dreifarbige Farbskala ..................................................... 7.7.4 Symbolsatz .................................................................... Sparklines .................................................................................... 7.8.1 Linie ............................................................................. 7.8.2 Spalte ........................................................................... 7.8.3 Gewinn/Verlust-Anzeige ............................................... 7.8.4 Formatierung ................................................................ 7.8.5 Alle Farben ................................................................... SmartArt ...................................................................................... 186 186 188 190 190 194 195 195 197 198 201 201 203 204 205 207 210 212 214 214 215 217 218 220 220 221 222 222 223 224

7.2

7.3

7.4 7.5

7.6 7.7

7.8

7.9

Inhalt

VBA- und Worksheet-Funktionen ................................................ 227


8.1 Eingaben des Benutzers ............................................................... 8.1.1 Funktion InputBox ..................................................... 8.1.2 Methode Application.InputBox .................................. Einfacher Dialog mit dem Benutzer .............................................. 8.2.1 Button OK ................................................................. 8.2.2 Buttons eine bersicht ............................................... 8.2.3 Zeichen Information ................................................... 8.2.4 System-modal ............................................................... 8.2.5 Buttons Ja und Nein ............................................... 8.2.6 Drei Buttons, Default-Button ........................................ 8.2.7 Buttons Wiederholen und Abbrechen ..................... 8.2.8 Buttons Abbrechen, Wiederholen und Ignorieren .................................................................. Zeichenketten .............................................................................. 8.3.1 Zeichenketten umwandeln ............................................ 8.3.2 Ausgabeformatierung .................................................... 8.3.3 Datenstze zusammenfgen .......................................... 8.3.4 Datenstze zerlegen ...................................................... Datum und Uhrzeit ...................................................................... 8.4.1 Zeitintervall addieren .................................................... 8.4.2 Zeitdifferenz berechnen ................................................ 8.4.3 Datumsangaben erstellen, Wochentage markieren ........ 8.4.4 Jahreskalender .............................................................. Weitere Funktionen ..................................................................... 8.5.1 Anwendung unterbrechen ............................................. 8.5.2 Einheitenumrechnung ................................................... 8.5.3 Zahlensystemumrechnung ............................................. 8.5.4 Zellen zhlen ................................................................. 228 229 229 233 233 234 235 235 236 237 238 238 239 241 242 245 246 247 247 248 248 249 252 252 253 255 256

8.2

8.3

8.4

8.5

Externe Daten .................................................................................... 259


9.1 Textdateien, Import und Export ................................................... 9.1.1 Lesen aus Textdateien ................................................... 9.1.2 Import von Datenstzen ................................................ 9.1.3 Schreiben in Textdateien ............................................... 9.1.4 Export von Datenstzen ................................................ Arbeiten mit Dateien ................................................................... 9.2.1 Dateien suchen und auflisten ........................................ 9.2.2 Informationen ber Dateien .......................................... 9.2.3 Operationen mit Dateien .............................................. 259 259 261 263 265 266 266 268 270

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

10 Dialogfelder ........................................................................................ 317


10.1 Integrierte Dialogfelder ................................................................ 10.1.1 Datei ffnen .................................................................. 10.1.2 Datei speichern unter .................................................... 10.1.3 Muster fr Zellbereich auswhlen .................................. 10.1.4 Schriftformatierung fr Zellbereich auswhlen ............... 317 318 319 319 320

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 Beispielprojekt .................................................................................. 341


11.1 11.2 Was ist Nordwind? ...................................................................... Vorbereitungen fr das Projekt .................................................... 11.2.1 Tabelle Kunden .......................................................... 11.2.2 Tabelle Artikel ........................................................... 11.2.3 Restliche Vorbereitungen .............................................. Benutzung des Programms ........................................................... 11.3.1 Hauptdialogfeld Nordwind ......................................... 11.3.2 Unterdialogfeld Kunden Neu ..................................... 11.3.3 Unterdialogfeld Kunden ndern ................................ 11.3.4 Unterdialogfeld Artikel Neu ....................................... 11.3.5 Unterdialogfeld Artikel ndern .................................. 11.3.6 Unterdialogfeld Bestellungen Neu .............................. Entwicklung des Programms ........................................................ 11.4.1 Das VBA-Projekt ........................................................... 11.4.2 Die Arbeitsmappe ......................................................... 11.4.3 Das gemeinsame Modul ................................................ 11.4.4 Hauptdialogfeld Nordwind ......................................... 11.4.5 Unterdialogfeld Kunden Neu ..................................... 11.4.6 Unterdialogfeld Kunden ndern ................................ 11.4.7 Unterdialogfeld Artikel Neu ....................................... 11.4.8 Unterdialogfeld Artikel ndern .................................. 11.4.9 Unterdialogfeld Bestellungen Neu .............................. 341 342 343 343 344 344 345 345 346 348 349 350 353 353 353 354 354 356 360 366 371 377

11.3

11.4

Lsungen ................................................................................................... 387


Index ............................................................................................................ 395

12

Geleitwort des Fachgutachters

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

Geleitwort des Fachgutachters

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

Was wird besser durch Makros und VBA?


Makro

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

Eine schnellere Problemlsung durch VBA ergibt sich, weil:

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

Arbeiten mit Makros

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

Arbeiten mit Makros

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

Zelle, deren Inhalt verschoben werden soll

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

Arbeiten mit Makros

1.2

Abbildung 1.2

Makro mit dem Namen Makro1

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

Abbildung 1.3 Zellen nach der Verschiebung Symbol zum Aufzeichnen

Das Aufzeichnen geht etwas schneller, wenn Sie in der Excel-Oberflche das entsprechende Symbol in der Statusleiste bettigen (siehe Abbildung 1.4).

Abbildung 1.4 Symbol zum Starten einer Makro-Aufzeichnung

Nach Beginn der Aufzeichnung erscheint an der gleichen Stelle das Symbol zum Beenden der Aufzeichnung in der Statusleiste.

Abbildung 1.5 Symbol zum Beenden einer Makro-Aufzeichnung

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

Arbeiten mit Makros

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).

Abbildung 1.6 VBA-Code des Makros Makro1

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

ActiveSheet.Paste bedeutet: Der Inhalt der Zwischenablage wird in

das aktuell aktive Tabellenblatt eingefgt. Der Inhalt der Zelle A1 wurde nach C1 verschoben.

22

Arbeiten mit Makros

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

Abbildung 1.7 Speichern als Arbeitsmappe ohne Makros

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.

Abbildung 1.8 Warnung, dass enthaltene Makros nicht mitgespeichert werden

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.

Abbildung 1.9 Speichern als Arbeitsmappe mit Makros

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).

Abbildung 1.10 Sicherheitswarnung Makros wurden deaktiviert. Makros deaktiviert

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

Arbeiten mit Makros

1.2

Abbildung 1.11 Hinweis: Makro-Ausfhrung nicht mglich

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.

Aktivieren von Makros

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

Abbildung 1.12 Entwicklertools

Registerkarte Entwicklertools einblenden

Anschlieend ist die Registerkarte dauerhaft aktiviert (siehe Abbildung 1.13 fr Excel 2007).

Abbildung 1.13 Registerkarte Entwicklertools

1.2.7
Vertrauenscenter

Makrosicherheit dauerhaft ndern

Klicken Sie auf der Registerkarte Entwicklertools den Button Makrosicherheit an (siehe Abbildung 1.14 fr Excel 2010).

Abbildung 1.14 Button Makrosicherheit

26

Arbeiten mit Makros

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).

Abbildung 1.15 Sicherheitscenter

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

Abbildung 1.16 Vertrauenswrdiges Verzeichnis

Anschlieend ist die Liste der vertrauenswrdigen Speicherorte um ein Element ergnzt.

27

Einfhrung

Abbildung 1.17 Liste der vertrauenswrdigen Verzeichnisse

1.3
Tasten Alt + F11

Entwicklungsumgebung Visual Basic Editor

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

Menleiste und Symbolleiste

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.

Abbildung 1.18 Symbolleisten Voreinstellung und Bearbeiten Deklaration erzwingen

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

Entwicklungsumgebung Visual Basic Editor

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.

Abbildung 1.19 Einstellung Variablendeklaration erforderlich

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.

Verbesserung des Programms

1.3.2

Projekt-Explorer und Eigenschaften-Fenster

Auf der linken Seite des VBE befinden sich der Projekt-Explorer und das Eigenschaften-Fenster.

Abbildung 1.20 Projekt-Explorer und 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

Makrocode verstehen und ndern

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

Abbildung 1.21 Symbol Sub/UserForm ausfhren (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

Makrocode verstehen und ndern

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:

Range("C1").Select erklrt sich nun von selbst. ActiveSheet.Paste 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

Makro per Schaltflche ausfhren

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

Makro per Schaltflche ausfhren


Button einfgen

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.

Makro und Button verbinden

33

Einfhrung

Abbildung 1.22 Makro einem Button zuordnen

Anschlieend erscheint der Button im Bearbeitungsmodus. Klicken Sie einmal neben den Button; anschlieend knnen Sie durch Klick auf den Button das Makro ausfhren.

Abbildung 1.23 Neu eingefgter Button

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

Selection.Cut: Es geschieht das Gleiche wie bei der absoluten Auf-

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

ActiveSheet.Paste: Es geschieht das Gleiche wie bei der absoluten

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

Abbildung 1.24 Speichern in Persnlicher Makroarbeitsmappe

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

Abbildung 1.25 Persnliche Makroarbeitsmappe im Projekt-Explorer

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.

Makros immer verfgbar

37

Einfhrung

1.8
Selbst programmieren

Code schreiben, einfache Ausgabe

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.

Abbildung 1.26 Neue eigene Sub-Prozedur

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

Code schreiben, einfache Ausgabe

1.8

der Klammern Aufrufparameter notieren kann, die eine Prozedur flexibler machen knnen.

1.8.2

Ausgabe in Zelle

Geben Sie in der Prozedur AusgabeZelle() folgende Codezeile ein:


Range("A1").Value = "Hallo"

Damit sieht Ihre Prozedur wie folgt aus:


Sub AusgabeZelle() Range("A1").Value = "Hallo" End Sub

Bei Ausfhrung dieser Prozedur, zum Beispiel mit Hilfe der Taste (F5), wird der Text Hallo in der Zelle A1 ausgegeben.

Abbildung 1.27 Ergebnis der eigenen Sub-Prozedur

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

Schreiben Sie eine weitere Prozedur mit folgendem Code:


Sub AusgabeBox() MsgBox "Hallo" End Sub

Nach dem Aufruf erscheint eine kleine Nachrichtenbox mit dem Text Hallo.

Abbildung 1.28 Ausgabe in Nachrichtenbox MsgBox

Eine solche Nachrichtenbox knnen Sie u. a. benutzen zur:


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

Die Ausgabe lautet:

Abbildung 1.29 Ausgabe mit Zeilenumbruch

40

Arbeiten mit Excel vor der Version 2007

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

Ausgabe im Direktfenster des VBE

Schreiben Sie eine weitere Prozedur mit folgendem Code:


Sub AusgabeKontrolle() Debug.Print "Hallo" End Sub

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

Abbildung 1.30 Ausgabe im Direktfenster

Das Direktfenster (= Direktbereich) knnen Sie ebenfalls zur Kontrollausgabe whrend der Programmierung nutzen.

1.9

Arbeiten mit Excel vor der Version 2007

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

Arbeiten mit Excel vor der Version 2007

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

Symbolleiste Visual Basic

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

Entwicklungsumgebung Visual Basic Editor

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.

Grundlagen von Objekten und Ereignissen


Objekte

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

Objekthierarchie und Auflistungen


Hierarchie

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

Grundlagen von Objekten und Ereignissen

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

ThisWorkbook: Die Arbeitsmappe mit dem aktuell ausgefhrten VBA-

Code; sie wird im Folgenden auch als diese Arbeitsmappe bezeichnet.

ActiveWorkbook: Die aktuell aktive Arbeitsmappe. Dies muss nicht

diese Arbeitsmappe sein.

Workbooks(Index): Index ist die laufende Nummer der Arbeitsmappe

innerhalb der Workbooks-Auflistung, von 1 bis Anzahl (Eigenschaft Count).


Workbooks ("Name")

Workbooks("Name"): Der Name der Arbeitsmappe als Zeichenkette (in

Anfhrungszeichen)

46

Arbeitsmappen

2.2

2.2.1

Anzahl Arbeitsmappen ermitteln


Zhlen

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

Abbildung 2.1 Eigenschaft Count

2.2.2

Neue Arbeitsmappe erzeugen


Neue Mappe

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

Grundlagen von Objekten und Ereignissen

2.2.3
Mappe ffnen

Vorhandene Arbeitsmappe ffnen

Mit folgender Prozedur wird eine vorhandene Mappe geffnet:


Sub VorhandeneMappe() Workbooks.Open "C:\Temp\Mappe3.xlsm" End Sub

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

Abbildung 2.2 Programmabbruch durch Laufzeitfehler

Hinweis
In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedur wie folgt lauten: Mappe3.xls.

2.2.4
Mappen schlieen

Alle Arbeitsmappen schlieen

Mit folgender Prozedur werden alle geffneten Arbeitsmappen geschlossen:

48

Arbeitsmappen

2.2

Sub AlleMappenSchliessen() Workbooks.Close End Sub

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()

Abbildung 2.3 Nachfrage bei genderter Datei

2.2.5

Name einer Arbeitsmappe ermitteln


Name der Mappe

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:

ThisWorkbook verweist immer auf die Arbeitsmappe, in der diese Pro-

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.

Eigenschaft Name FullName

49

Grundlagen von Objekten und Ereignissen

Abbildung 2.4 Eigenschaft Name

Abbildung 2.5 Eigenschaft FullName

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

Zur Kontrolle wird der Name der aktiven Arbeitsmappe ausgegeben.

Abbildung 2.6 Aktive Arbeitsmappe nach dem ffnen

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.

Abbildung 2.7 Wieder aktiv: diese Arbeitsmappe

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

Grundlagen von Objekten und Ereignissen

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

Abbildung 2.8 Eigenschaft 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

Arbeitsmappe ber Index oder Name 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.

2.2.10 Pfad einer Arbeitsmappe ermitteln


Hufig ist der Zugriff auf Arbeitsmappen im gleichen Verzeichnis oder einem Unterverzeichnis erforderlich. Dazu muss zunchst der Pfad dieser Arbeitsmappe (die den VBA-Code enthlt) oder der Pfad der aktuellen Arbeitsmappe ermittelt werden. Ein Beispiel, in dem der Pfad von drei verschiedenen Arbeitsmappen ermittelt wird:
Sub PfadErmitteln() Workbooks.Open "C:\Temp\Mappe3.xlsm" MsgBox "Mappe3 ist in " & ActiveWorkbook.Path
Pfad der Mappe

53

Grundlagen von Objekten und Ereignissen

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.

Abbildung 2.9 Path

Pfad der Mappe Mappe3

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

Pfad von dieser Mappe

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

Abbildung 2.11 Pfad der Mappe Test

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

innerhalb der Worksheets-Auflistung, von 1 bis Anzahl (Count).

Worksheets("Name"): der Name des Tabellenblatts als Zeichenkette

(in Anfhrungszeichen) Hinweis


In den folgenden Beispielen fr den Einsatz von Worksheets wird jeweils vorher diese Arbeitsmappe aktiviert. Dies dient der eindeutigen Zuordnung fr den Fall, dass mehrere Arbeitsmappen geffnet sein sollten.

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

Grundlagen von Objekten und Ereignissen

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

eines Tabellenblatts kann ermittelt bzw. gendert werden.

Es wird wiederum zur Kontrolle die Anzahl der Tabellenbltter ausgegeben. Sie hat sich erwartungsgem um 1 erhht.

Abbildung 2.12 Neu erzeugtes und eingefgtes Tabellenblatt

2.3.2
Blatt kopieren

Tabellenblatt kopieren

Mit folgender Prozedur wird ein Tabellenblatt dieser Arbeitsmappe kopiert:


Sub BlattKopieren() ThisWorkbook.Activate Worksheets("Tabelle1").Copy After:=Worksheets("Tabelle3") ActiveSheet.Name = "Tab1Kopie" End Sub

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.

Abbildung 2.13 Kopiertes Tabellenblatt

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

Grundlagen von Objekten und Ereignissen

Abbildung 2.14 Verschobenes Tabellenblatt

2.3.4
Blatt lschen

Tabellenblatt lschen

Mit folgender Prozedur werden zwei Tabellenbltter dieser Arbeitsmappe gelscht:


Sub BlattLoeschen() ThisWorkbook.Activate Worksheets("Neu").Delete Worksheets("Tab1Kopie").Delete End Sub

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.

Abbildung 2.15 Warnung beim Lschen eines Tabellenblatts

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

Gitternetz, Zeilen- und Spaltenberschrift


Anzeigefenster gestalten

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

Grundlagen von Objekten und Ereignissen

Eine Prozedur zum Ausblenden der genannten Objekte:


Sub BlattGitternetz() ThisWorkbook.Activate Worksheets("Tabelle3").Activate ActiveWindow.DisplayGridlines = False ActiveWindow.DisplayHeadings = False End Sub

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

Abbildung 2.16 Tabellenblatt ohne Gitternetz und berschriften

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...

Grundlagen von Objekten und Ereignissen

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

Zellen und Zellbereiche

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

Zellen und Zellbereiche

2.4

2.4.1

Zellen ber Range auswhlen


Zellbereich

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

Tabelle 2.1 Range, 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

Ganze Zeile oder Spalte

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

Range("3:3").Select Range("3:5").Select Range("3:5, 8:9, 12:12").Select Range("A2:B4, 7:8, D:E, G2:H4").Select

Tabelle 2.2 Range, ganze Spalten, ganze Zeilen

Beachten Sie, dass auch die beiden letzten Ausdrcke mit Range jeweils in eine Zeile gehren.

63

Grundlagen von Objekten und Ereignissen

Abbildung 2.17 Range("A2:B4, 7:8, D:E, G2:H4").Select Nicht zusammenhngender Bereich

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

Zellen und Zellbereiche

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

Zellen ber Cells auswhlen


Eine Zelle

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

Abbildung 2.18 Arbeiten mit Cells

65

Grundlagen von Objekten und Ereignissen

2.4.3

Zellinhalte verschieben oder kopieren

Mit folgender Prozedur werden in einem ausgewhlten Tabellenblatt:


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.

Vor dem Ablauf der Prozedur:

Abbildung 2.19 Originalinhalte

Nach dem Ablauf der Prozedur:

66

Zellen und Zellbereiche

2.4

Abbildung 2.20 Nach dem Verschieben und Kopieren

2.4.4

Teile von Zellinhalten kopieren


Zwischenablage

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()

Vor dem Ablauf der Prozedur:

Abbildung 2.21 Originalinhalte und -formate

67

Grundlagen von Objekten und Ereignissen

Nach dem Ablauf der Prozedur:

Abbildung 2.22 Nach dem Kopieren von Werten bzw. Formaten

2.4.5
Lschen

Zellinhalt lschen

Mit folgender Prozedur werden bestimmte Zellinhalte gelscht:


Sub ZellinhaltLoeschen() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1:A2").Clear Range("A3:A4").ClearContents Range("A5:A6").ClearFormats End Sub

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()

Vor dem Ablauf der Prozedur:

Abbildung 2.23 Originalinhalte und -formate

68

Zellen und Zellbereiche

2.4

Nach dem Ablauf der Prozedur:

Abbildung 2.24 Nach dem Lschen von Werten und Formaten

2.4.6

Werte und Formeln eintragen


Zellinhalte eintragen

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

Abbildung 2.25 zeigt das Ergebnis.

Abbildung 2.25 Werte und Formeln eintragen

69

Grundlagen von Objekten und Ereignissen

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.

Punkt statt Komma FormulaLocal

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

%"

Das Ergebnis sehen Sie in Abbildung 2.26.

70

Zellen und Zellbereiche

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

Bei Datumsangaben werden im Beispiel die folgenden Zeichen verwendet:


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

Grundlagen von Objekten und Ereignissen

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

Das Ergebnis ist in Abbildung 2.27 dargestellt.

Abbildung 2.27 Zellformat Ausrichtung

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

Zellen und Zellbereiche

2.4

die vertikale Ausrichtung sind z. B. xlBottom (am unteren Rand), xlCenter (vertikal zentriert) und xlTop (am oberen Rand).
WrapText

Die Eigenschaft WrapText bestimmt die Anordnung lngerer Texte:

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

Die Eigenschaft MergeCells bestimmt darber, ob Zellen verbunden werden knnen:

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

Mit folgender Prozedur werden die Schrifteigenschaften von Zellen bestimmt:


Sub ZellformatSchrift() ThisWorkbook.Worksheets("Tabelle2").Activate Range("C1").Font.Name = "Tahoma" Range("C1").Font.Bold = True Range("C1").Font.Italic = True Range("C1").Font.Underline = True Range("C1").Font.Size = 20 Range("C1").Font.Color = vbRed End Sub

Das Ergebnis:

Abbildung 2.28 Zellformat Schrift

73

Grundlagen von Objekten und Ereignissen

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()

2.4.10 Einzelne Zeichen formatieren


Zeichenformatierung

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

Zellen und Zellbereiche

2.4

Abbildung 2.29 Einzelne Zeichen formatieren

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

Mit folgender Prozedur werden Zellen ganz oder teilweise eingerahmt:


Sub ZellformatRahmen() ThisWorkbook.Worksheets("Tabelle2").Activate Range("E3").Borders.LineStyle = xlDouble Range("E3").Borders.Weight = xlThick Range("E3").Borders.Color = vbGreen Range("E4:E6").Borders(xlEdgeLeft).Weight = xlThin Range("E4:E6").Borders(xlEdgeRight).Weight = xlThin Range("E4:E6").Borders(xlInsideHorizontal).Weight = _ xlHairline End Sub

75

Grundlagen von Objekten und Ereignissen

Das Ergebnis:

Abbildung 2.30 Zellformat Rahmen

Zur Erluterung:
Borders

Die Eigenschaft Borders dient zur Bearbeitung des Rahmens.

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

2.4.12 Zellformat Muster


Muster

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

Zellen und Zellbereiche

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

2.4.13 Zellen einfgen


Mit folgender Prozedur werden Zellbereiche in einem ausgewhlten Tabellenblatt eingefgt:
Sub ZelleEinfuegen() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A2:A3").Insert Shift:=xlShiftDown Range("6:7").Insert End Sub
Zellbereiche einfgen

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

Grundlagen von Objekten und Ereignissen

Vor dem Ablauf der Prozedur:

Abbildung 2.32

Original-Struktur der Tabelle

Nach dem Ablauf der Prozedur:

Abbildung 2.33 Nach dem Einfgen von Zellen und Zeilen

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.

2.4.14 Zellen lschen


Lschen

Mit folgender Prozedur werden Zellbereiche eines ausgewhlten Tabellenblatts gelscht:


Sub ZelleLoeschen() ThisWorkbook.Worksheets("Tabelle1").Activate Range("6:7").Delete Range("A2:A3").Delete Shift:=xlShiftUp End Sub

78

Zellen und Zellbereiche

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

2.4.15 Zeilenhhe und Spaltenbreite


Mit folgender Prozedur werden die Hhe bestimmter Zeilen und die Breite bestimmter Spalten eingestellt:
Sub HoeheBreite() ThisWorkbook.Worksheets("Tabelle2").Activate Range("1:2").RowHeight = 55 Range("B:B,D:D").ColumnWidth = 3 End Sub
Hhe, Breite

Das Ergebnis ist in Abbildung 2.34 dargestellt. Zur Erluterung:

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

Grundlagen von Objekten und Ereignissen

Abbildung 2.34 Zeilenhhe und Spaltenbreite

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.

2.4.16 Benutzten Zellbereich erkennen


Benutzter Bereich

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

Nicht leere Zelle

Nehmen wir an, folgende Zellen wurden benutzt:

80

Zellen und Zellbereiche

2.4

Abbildung 2.35 Zellen mit Inhalt

Der benutzte Bereich ergibt sich dann wie folgt:

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

2.4.17 Spezielle Zellen erkennen


Die Methode SpecialCells ist in der Lage, spezielle Zellen zu erkennen. Anschlieend knnen diese Zellen besonders bearbeitet bzw. hervorgehoben werden. Im folgenden Beispiel werden farblich hervorgehoben bzw. gezhlt:

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

Sub SpezielleZellen() ThisWorkbook.Worksheets("Tabelle2").Activate

81

Grundlagen von Objekten und Ereignissen

'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

Abbildung 2.37 zeigt das Ergebnis.

Abbildung 2.37 Spezielle Zellen

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.

Zelle mit Formel

82

Zellen und Zellbereiche

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.

2.4.18 Versatz mit Offset


Mit dem Offset fr einen Zellbereich bezeichnet man einen zweiten Zellbereich, der gegenber dem Ursprungsbereich versetzt ist. Dieser Bereich ist wiederum ein Range-Objekt. Dieser Versatz kann sowohl in Bezug auf einzelne Zellen als auch in Bezug auf zusammenhngende oder nicht zusammenhngende Zellbereiche angewendet werden. Hier ein Beispiel:
Sub ZellOffset() ThisWorkbook.Worksheets("Tabelle3").Activate ' Offset Cells(4, Cells(4, Cells(4, Cells(4, berechnen 3).Value = "Ber 1" 3).Offset(0, 2).Value = "Off(0,2)" 3).Offset(-3, 1).Value = "Off(-3,1)" 3).Offset(-2, 1).Value = "Off(-2,-1)"
Offset

' 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

= = = =

"A2" "A3" "B1" "B2"

83

Grundlagen von Objekten und Ereignissen

Cells(4, 3).Offset(0, 2).Range("B3").Value = "B3" End Sub

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

Offset eines Bereichs:

Abbildung 2.39

Offset eines Bereichs

84

Zellen und Zellbereiche

2.4

Die Offsetangabe fr den nicht zusammenhngenden Zellbereich ergibt einen gleichartigen Bereich, der um vier Zeilen (Offset(4, 0)) nach unten verschoben ist.

Abbildung 2.39 zeigt das Ergebnis. Offset-relative Zellen:

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.40 Offset-relative Zellen

2.4.19 Zellbereich sortieren


Die Methode Sort() des Range-Objekts bietet zahlreiche Mglichkeiten, Zellbereiche zu sortieren. Ausgangspunkt soll die folgende Tabelle sein:
Sortieren

Abbildung 2.41

Tabelle, die sortiert werden soll

Diese Tabelle soll auf zwei Arten sortiert werden:


nach Nummer nach Nachname und Vorname

Die oberste Zeile soll als berschrift erkannt werden, so dass sie nicht einsortiert wird.

85

Grundlagen von Objekten und Ereignissen

Zunchst die Prozedur fr die Sortierung nach Nummer:


Sub SortierenNummer() ThisWorkbook.Worksheets("Tabelle4").Activate Range("A1:C4").Sort Key1:=Range("C1:C4"), Header:=xlYes End Sub

Das Ergebnis sehen Sie in Abbildung 2.42.

Abbildung 2.42

Sortierung nach Nummer

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

Es folgt die Prozedur fr die Sortierung nach Nachname und Vorname:


Sub SortierenName() ThisWorkbook.Worksheets("Tabelle4").Activate Range("A1:C4").Sort Key1:=Range("A1:A4"), _ Key2:=Range("B1:B4"), Header:=xlYes End Sub

Abbildung 2.43 zeigt das Ergebnis.

86

Zellen und Zellbereiche

2.4

Abbildung 2.43 Sortierung nach Nachname und Vorname

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

Grundlagen von Objekten und Ereignissen

' Sortierung anwenden = durchfhren ActiveSheet.Sort.Apply End Sub

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

Arbeitsmappe wird geffnet


Mappe ffnen

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

Arbeitsmappe wird geschlossen


Mappe schlieen

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

Grundlagen von Objekten und Ereignissen

2.5.3
Blatt aktivieren

Tabellenblatt wird aktiviert

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

Doppelklick auf Zelle


Doppelklick

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

Tabellenblatt wurde neu berechnet


Berechnung

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

Grundlagen von Objekten und Ereignissen

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.

Grundlagen der Programmierung mit VBA

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

Grundlagen der Programmierung mit VBA

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

Punkt nach Objektname

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

Abbildung 3.1 Block auskommentieren und wieder aufheben

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

Grundlagen der Programmierung mit VBA

3.2
3.2.1
Daten speichern

Variablen und Datentypen


Namen, Werte

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

Variablen und Datentypen

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

Speicherbedarf 2 Byte 1 Byte 2 Byte 4 Byte 4 Byte

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

8 Byte 4 Byte 10 Byte (+) >= 16 Byte

Object

String

Variant

Tabelle 3.1 Datentypen

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

Grundlagen der Programmierung mit VBA

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"

St = "Zeichenkette" ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1").Value Range("A2").Value Range("A3").Value Range("A4").Value = = = = By Bo It Lg

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 zeigt das Ergebnis.

Abbildung 3.2

Verschiedene Datentypen

98

Variablen und Datentypen

3.2

Zur Erluterung: Variablen werden mit Dim deklariert. Mit As wird ihnen ein definierter Datentyp zugewiesen.

Dim ... As ...

Es knnen auch mehrere Variablen in einer Zeile deklariert werden.

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

Grundlagen der Programmierung mit VBA

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

Ausgabe von bung 3 B

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.

Das Ergebnis ist in Abbildung 3.4 dargestellt.

Abbildung 3.4 Datentypen

100

Variablen und Datentypen

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

Grundlagen der Programmierung mit VBA

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

Es gibt folgende vordefinierte 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

Tabelle 3.2 Arithmetische Operatoren

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

Grundlagen der Programmierung mit VBA

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

Tabelle 3.3 Ganzzahldivision

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

Tabelle 3.4 Modulo-Operator

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

Tabelle 3.5 Operator ^ (hoch)

104

Operatoren

3.3

Ausdruck
2 ^ 5.4 2 ^ 5

Ergebnis 42,2242531447326 32

Tabelle 3.5 Operator ^ (hoch) (Forts.)

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:

Abbildung 3.5 Ergebnis der Berechnungen

105

3
Auswertungsreihenfolge

Grundlagen der Programmierung mit VBA

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

Tabelle 3.6 Vergleichsoperatoren

Einige Beispiele sehen Sie in Tabelle 3.7.


Ausdruck
5>3 3 = 3.2 5 + 3 * 2 >= 12

Ergebnis wahr falsch falsch

Tabelle 3.7 Ausdrcke mit Vergleichsoperatoren

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"

Ergebnis wahr falsch wahr

"asdlfigc" Like "a?d?f*c" wahr

Tabelle 3.8 Operator Like

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

Ergebnis der Vergleiche

107

Grundlagen der Programmierung mit VBA

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

Beschreibung Nicht Und Inklusives Oder Exklusives Oder

Das Ergebnis ist wahr, wenn der Ausdruck falsch ist. beide Ausdrcke wahr sind. mindestens ein Ausdruck wahr ist. genau ein Ausdruck wahr ist.

Tabelle 3.9 Logische Operatoren

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

(B > A) And (C > B) wahr (B < A) Or (C < B)

falsch

(B < A) Xor (C > B) wahr

Tabelle 3.10 Wahrheitstabelle

Ausdrcke mit logischen Operatoren

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

Tabelle 3.11 Wahrheitstabelle (NOT bzgl. Ausdruck 1)

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:

Abbildung 3.7 Ergebnis der Vergleiche mit logischen Operatoren

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

Grundlagen der Programmierung mit VBA

a = "Temperatur " & s & " Grad am " & d MsgBox a End Sub

Das Ergebnis:

Abbildung 3.8

Verkettung verschiedener Daten

3.3.5
Rangfolge

Rangfolge der Operatoren

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)

Tabelle 3.12 Rangfolge der Operatoren

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

Tabelle 3.13 Zu bung 3 E

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

Grundlagen der Programmierung mit VBA

werden, falls es mehr als zwei Mglichkeiten gibt. Dies trifft auch fr die Verzweigungen in VBA zu.

3.4.1

Einzeiliges If Then Else

Das einzeilige If ...Then ... Else hat folgenden Aufbau:


If Bedingung Then Anweisungen1 [ Else Anweisungen2 ]
Vergleichsoperator

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

[ Else AnweisungenX ] End If

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

Der dritte Fall trifft zu.

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

Grundlagen der Programmierung mit VBA

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 %

Abbildung 3.10 Ein Beispielwert und das Ergebnis

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

= vbRed = vbGreen = vbBlue = vbYellow

Das Ergebnis:

Abbildung 3.11 Der dritte Fall trifft zu.

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-

er als 100 ist.

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.

Case Else steht fr die restlichen Flle.

115

Grundlagen der Programmierung mit VBA

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

Bedingung oder Zhler

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 zeigt das Ergebnis.

Abbildung 3.12

Schleife von 3 bis 7

117

Grundlagen der Programmierung mit VBA

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

Ein weiteres Beispiel:


Sub ForNext2() Dim i As Integer ThisWorkbook.Worksheets("Tabelle2").Activate Range("B1:B10").Clear For i = 3 To 7 Step 2 Cells(i, 2).Value = Cells(i, 1).Value * 2 Next i End Sub

Das Ergebnis sehen Sie in Abbildung 3.13.

Abbildung 3.13 Schleife von 3 bis 7, Schrittweite 2

Zur Erluterung:
Schrittweite 2

Als Schrittweite ist 2 angegeben, daher wird nur jede zweite Zelle bearbeitet.

Ein letztes Beispiel:


Sub ForNext3() Dim i As Integer

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

Das Ergebnis ist in Abbildung 3.14 dargestellt.

Abbildung 3.14 Schleife von 9 bis 2, Schrittweite 2, mit Exit For

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

Grundlagen der Programmierung mit VBA

Abbildung 3.15 Ergebnis von bung 3 H

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

am Anfang der Schleife.

Do ... Loop While: Prft die Bedingung zum Weiterlaufen der Schleife

am Ende der Schleife.


Until

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

Ende der Schleife.


Exit Do

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

[ Exit Do ] [ Anweisungen ] Loop

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

Das erste Beispiel:


Sub DoLoop1() Dim i As Integer Dim Summe As Single ThisWorkbook.Worksheets("Tabelle2").Activate Range("C1:C20").Clear Randomize i = 1 Summe = 0 Do Summe = Summe + Rnd Cells(i, 3).NumberFormatLocal = "0,000" Cells(i, 3).Value = Summe i = i + 1 Loop While Summe < 5 Cells(i, 3).Value = "Fertig" End Sub

121

Grundlagen der Programmierung mit VBA

Abbildung 3.16 zeigt ein mgliches Ergebnis. Zur Erluterung:

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

Addition zuflliger Zahlen, Grenze 5

Ein weiteres Beispiel:


Sub DoLoop2() .....

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

Zur Erluterung der zweiten Prozedur:

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

Das letzte Beispiel:


Sub DoLoop3() ..... Do Summe = Summe + Rnd Cells(i, 3).NumberFormatLocal = "0,000" Cells(i, 3).Value = Summe i = i + 1 If Summe >= 5 Then Exit Do Loop Cells(i, 3).Value = "Fertig" End Sub

Zur Erluterung der dritten Prozedur:

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

Grundlagen der Programmierung mit VBA

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

Ergebnis von bung 3 J

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

Programm mit Laufzeitfehlern

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

Berechnung ohne Laufzeitfehler Division durch 0

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).

Abbildung 4.3 Mathematisch nicht erlaubt

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.

Fehler wird markiert

Abbildung 4.4 Programmzeile mit Division

Falls dagegen die Zahl 12 und der Text abc in den Zellen stehen, bricht das Programm mit einer anderen Fehlermeldung ab:

127

Fehlerbehandlung

Abbildung 4.5 Falscher Datentyp

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

Programmzeile mit Zuweisung

4.2.2
On Error

Abfangen mit 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

Die Ausgabe sieht im Falle von 12 und 0 wie folgt aus:

Abbildung 4.7 Fehler wird angezeigt.

Abbildung 4.8

Es gibt keinen Programmabbruch.

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 und Debugging

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

Abbildung 4.9 Werte prfen

Nach einigen Einzelschritten

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

Logische Fehler und Debugging

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:

Abbildung 4.10 Variablenwerte im Direktfenster

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

Sprung zur Fehlermarke

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

Abbildung 4.12 Programm hlt an

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.

Mehr ber die Programmierung mit VBA

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

Mehr ber die Programmierung mit VBA

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

Es folgt der Inhalt von Modul2:


Sub Gueltigkeit4() MsgBox Px End Sub

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.

Dimension Statisch, dynamisch

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

Mehr ber die Programmierung mit VBA

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

Abbildung 5.1 zeigt ein mgliches Ergebnis.

Abbildung 5.1 Datenfeld mit 7 Elementen

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).

Dim ...(...) As ...

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.

Abbildung 5.2 Kleinster Wert durch Rahmen hervorgehoben

137

Mehr ber die Programmierung mit VBA

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

Ein mgliches Ergebnis sehen Sie in Abbildung 5.3.

Abbildung 5.3 Datenfeld mit 7 mal 3 Elementen

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

Mehr ber die Programmierung mit VBA

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.

Abbildung 5.4 Kleinster Wert durch Rahmen hervorgehoben

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:

Abbildung 5.5 Dynamisches Datenfeld, zweimal verndert

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

Mehr ber die Programmierung mit VBA

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

Datenfelder lschen oder freigeben

Die Anweisung Erase dient

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.

Ein Beispiel fr ein statisches Datenfeld:


Sub DatenfeldLschen() Dim T(1 To 5) As Integer T(1) = 10 MsgBox T(1) Erase T MsgBox T(1) End Sub

Zur Erluterung:

Das statische Datenfeld T hat fnf Elemente.

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.

Ein Beispiel fr ein dynamisches Datenfeld:


Sub DatenfeldFreigeben() Dim T() As Integer On Error GoTo Fehler ReDim T(1 To 5) T(1) = 10 MsgBox T(1) Erase T MsgBox T(1) ReDim T(1 To 5) T(1) = 10 MsgBox T(1) Exit Sub Fehler: MsgBox Err.Description Resume Next End Sub

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

Mehr ber die Programmierung mit VBA

5.3

Prozeduren und Funktionen

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

Prozeduren und Funktionen

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

Mehr ber die Programmierung mit VBA

End If End Sub

Das Ergebnis fr Prozedur2()zeigt Abbildung 5.6.

Abbildung 5.6 Prozedur2() ruft ZeigeMaximum() auf.

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.

Zur Aufrufstelle zurck

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

Prozeduren und Funktionen

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

Ergebnis von bung 5 C (Beispiel fr die Zahlen 5,5 und 11,5)

5.3.2

bergabe von Parametern


bergabe per Referenz

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

bergabe per Kopie

147

Mehr ber die Programmierung mit VBA

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

bergabe per Wert, bergabe per Referenz

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

Prozeduren und Funktionen

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 ...

Funktionen haben folgenden (vereinfachten) Aufbau:


Function Funktionsname (Parameterliste) As Typ [ Anweisungsblock ] [ Exit Function ] [ Anweisungsblock ] End Function

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)

Datentyp einer Funktion

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

Mehr ber die Programmierung mit VBA

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

Funktionen() bekommt ein Ergebnis zurck.

Zur Erluterung:
Ergebnisrckgabe

Durch die Anweisung c = MaxWert(a, b) passiert nacheinander Folgendes:

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

Prozeduren und Funktionen

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

Rangfolge der Operatoren

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.

Es folgt die Funktion Monatsende():


Function Monatsende(J As Integer, M As Integer) If M = 2 Then If J Mod 4 = 0 And J Mod 100 <> 0 _ Or J Mod 400 = 0 Then Monatsende = 29 Else Monatsende = 28

151

Mehr ber die Programmierung mit VBA

End If ElseIf M = 4 Or M = 6 Or M = 9 Or M = 11 Then Monatsende = 30 Else Monatsende = 31 End If End Function

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

Ansonsten ergibt sich der Wert 30 oder 31, je nach Monat.

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

Es mssen an keiner Stelle Klammern gesetzt werden.

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

Prozeduren und Funktionen

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

Das Ergebnis der ersten Addition:

Abbildung 5.10 Addition: 31 = 4 + 7,5 + 10,5 + 9

Das zweite Ergebnis:

Abbildung 5.11 Addition: 22 = 4 + 7,5 + 10,5

153

Mehr ber die Programmierung mit VBA

Das letzte Ergebnis:

Abbildung 5.12 Addition: 11,5 = 4 + 7,5

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

Prozeduren und Funktionen

5.3
Vorteile

Die Verwendung bietet folgende 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

Mehr ber die Programmierung mit VBA

Das Ergebnis des dritten Aufrufs der Prozedur Adresse():

Abbildung 5.13 Mit allen optionalen Parametern

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

Beliebig viele Parameter

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

Prozeduren und Funktionen

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

Abbildung 5.14 zeigt das Ergebnis fr den letzten Aufruf.

Abbildung 5.14 Datenfeld x() mit vier Elementen

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()

Funktion sollte Wert haben

157

Mehr ber die Programmierung mit VBA

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 als Parameter

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

Das Ergebnis sehen Sie in Abbildung 5.15.

158

Benutzerdefinierter Datentyp

5.4

Abbildung 5.15 bergabe eines zweidimensionalen Feldes

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

Mehr ber die Programmierung mit VBA

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

Der Datentyp Person hat fnf Komponenten:


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.

Punkt nach Variable

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

Mehr ber die Programmierung mit VBA

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:

Zugriff auf andere Module

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

Code in der gleichen 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

Es folgt der Code im Code-Modul Modul2:

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

Zuletzt der Code im Klassenmodul zum Objekt Tabelle1:


Sub Summe3(a As Integer, b As Integer) MsgBox "Summe3: " & (a + b) End Sub Function Summe4(a As Integer, b As Integer) As Integer Summe4 = 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

Code in einer anderen Datei


Andere Datei

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

Mehr ber die Programmierung mit VBA

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:

Application.Run "<Dateiname>!<Modulname>.<Prozedurname>", _ Parameter1, Parameter2, ...

164

Module exportieren und importieren

5.6

Der Aufruf einer Funktion:

Ergebnis = Application.Run("<Dateiname>!<Modulname>. _ <Funktionsname>", Parameter1, Parameter2, ...)

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

Module exportieren und importieren

Falls Sie Prozeduren und Funktionen in einer anderen Arbeitsmappe einsetzen mchten, haben Sie mehrere Mglichkeiten:

Sie kopieren oder verschieben den Code im VBE

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

Export eines Moduls


Datei exportieren

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.

Dateiendung bas, frm

165

Mehr ber die Programmierung mit VBA

Abbildung 5.16 Modul lschen

Datei mit VBA-Code exportieren

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

Import eines Moduls

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.

Abbildung 5.17 Datei mit VBA-Code importieren

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.

Mehr ber Objekte

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.

Abbildung 6.1 Objektkatalog

167

6
Objektmodellreferenz

Mehr ber Objekte

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.

Abbildung 6.2 Excel-Objektmodellreferenz

6.2

Referenzierung von Objekten

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

Referenzierung von Objekten

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

Beispiel Zellen verschieben

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

Nachteile dieser Vorgehensweise:

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

Mehr ber Objekte

6.3
With ... End With

Objektzugriff mit 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

Nachfolgend ein Beispiel:


Sub WithAnweisung() With ThisWorkbook.Worksheets("Tabelle1").Range("A1:A3") .Value = 12.8 .NumberFormatLocal = "0,000" .Font.Size = 24 .Borders.Weight = xlThick End With End Sub

Das Ergebnis:

Abbildung 6.3 Objektzugriff mit With

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

Arbeiten mit Objektvariablen

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

Arbeiten mit Objektvariablen


Verweis auf Objekt

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

Mehr ber Objekte

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:

Abbildung 6.4 Arbeiten mit Objektvariablen

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.

Set ... = ...

bergabe

172

Arbeiten mit Objektvariablen

6.4

Einige wichtige Hinweise


Nothing

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.

Liste nach Punkt

Taste F1

6.4.1

Objektvariablen hierarchisch zuweisen


Stufenweise zuweisen

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:

Abbildung 6.5 Objektvariablen hierarchisch zuweisen

173

Mehr ber Objekte

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 ...

Neue Objekte erzeugen

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

Arbeiten mit Objektvariablen

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

Das Ergebnis sehen Sie in Abbildung 6.6. Zur Erluterung:


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

Mehr ber Objekte

Abbildung 6.6 Ergebnis der Funktion TypeName()

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:

Abbildung 6.7 Liste der geffneten Workbooks

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.

Dim ... As Objekttyp For Each ... In ...

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:

Abbildung 6.8 Liste der Worksheets

Zur Erluterung:

Die Variable WS wird als Verweis auf ein Objekt vom Typ Worksheet deklariert.

177

Mehr ber Objekte

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

Mehr ber Objekte

Sub AnwendungsPfad() MsgBox Application.Path End Sub

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:

Abbildung 6.9 Application.Path

6.7.2
Startzeitverzgert

Prozedur zeitverzgert aufrufen

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

Anwendung Microsoft Excel schlieen

Mit folgender Prozedur wird die gesamte Anwendung Excel geschlossen:


Sub AnwendungSchliessen() Application.Quit End Sub

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

Abbildung 6.10 Application.Quit(), Frage zu Speicherung

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

Mehr ber Objekte

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

Es folgt ein Filter mit einem Vergleichsoperator:


Sub ZahlenfilterVergleich() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter 5, ">20" End Sub

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

Mehr ber Objekte

"Getrnke", xlOr, "Gewrze" End Sub

Die integrierte Konstante xlOr sorgt dafr, dass das eine oder das andere Kriterium zutreffen muss.
Mit Platzhalter

Bei Textfiltern knnen Sie auch mit Platzhaltern arbeiten:


Sub TextfilterBeginntMit() ThisWorkbook.Worksheets("Tabelle5").Activate ActiveSheet.UsedRange.AutoFilter ActiveSheet.UsedRange.AutoFilter 2, "M*" End Sub

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.

Diagramme und Grafiken

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

Diagramme und Grafiken

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:

Abbildung 7.1 Beispieldaten fr Diagramme

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

Das Ergebnis zeigt Abbildung 7.2.

Abbildung 7.2 Diagramm auf neuem Blatt

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

Diagramme und Grafiken

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

Tabelle 7.1 stellt einige Diagrammtypen dar.


Diagrammtyp gruppiertes Sulendiagramm gruppiertes Balkendiagramm Liniendiagramm Kreisdiagramm
Tabelle 7.1 Diagrammtypen

Eigenschaft ChartType
xlColumnClustered xlBarClustered xlLine xlPie

7.1.2
ChartObjects

Eingebettetes Diagramm erstellen

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:

Abbildung 7.3 Eingebettetes Diagramm

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

Diagramme und Grafiken

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

Zunchst das Programm:


Sub DiagrammNeuesBlattAendern() Dim CH As Chart Set CH = ThisWorkbook.Charts(1) DiagrammAendern CH End Sub

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

Die Abbildungen 7.4 und 7.5 zeigen einige Bildausschnitte dazu:

191

Diagramme und Grafiken

Abbildung 7.4 Gendert: Flchenfarben, Legende und Datenreihe

Abbildung 7.5 Gendert: Achse, Datenpunkt

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.

ber Rahmenfarbe und -dicke bestimmen.

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

Diagramme und Grafiken

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

Eingebettetes Diagramm ndern

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

Diagramme und Grafiken

Das Ergebnis:

Abbildung 7.6 Kopiertes Diagrammblatt Lschen

Es folgt das Lschen:


Sub DiagrammNeuesBlattLoeschen() ThisWorkbook.Charts("Diagramm1 Neu").Delete End Sub

Zur Erluterung:
Delete()

Die Methode Delete() lscht das angegebene Diagrammblatt, mit Rckfrage.

Exportieren

Zuletzt das Exportieren:


Sub DiagrammNeuesBlattExport() ThisWorkbook.Charts("Diagramm1").Export _ "C:\Temp\Mrz.png" End Sub

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:

Abbildung 7.7 Export-Ergebnis

196

Diagramm verwalten

7.3

7.3.2

Eingebettetes Diagramm verwalten


Kopieren

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:

Abbildung 7.8 Kopiertes, eingebettetes Diagramm

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

Diagramme und Grafiken

Es folgt das Lschen:


Sub DiagrammEingebettetLoeschen() ThisWorkbook.Worksheets("Tabelle1"). _ ChartObjects(2).Delete End Sub

Zur Erluterung:
Delete() Exportieren

Die Methode Delete() lscht den Diagrammrahmen ohne Rckfrage.

Zuletzt das Exportieren:


Sub DiagrammEingebettetExport() ThisWorkbook.Worksheets("Tabelle1"). _ ChartObjects(1).Chart.Export _ "C:\Temp\Mrz.jpg" End Sub

Zur Erluterung:
Export()

Die Methode Export() dient zum Erzeugen einer Bilddatei, diesmal aus dem Diagramm eines Diagrammrahmens.

7.4
Beispieltabelle

Beispiel: Formatiertes Kreisdiagramm

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:

Abbildung 7.9 Basisdaten fr Kreisdiagramm

198

Beispiel: Formatiertes Kreisdiagramm

7.4

Zunchst der Code:


Sub DiagrammKreis() Dim CO As ChartObject Dim CH As Chart Dim i As Integer Set CO = ThisWorkbook.Worksheets("Tabelle2"). _ ChartObjects.Add(200, 10, 400, 350) Set CH = CO.Chart ' Diagrammtyp und Datenquelle CH.ChartType = xlPie CH.SetSourceData Range("A1:B13") ' Diagramm- und Zeichnungsflche CH.ChartArea.Interior.Color = vbCyan CH.PlotArea.Interior.Color = vbYellow ' Titel CH.HasTitle = True CH.ChartTitle.Text = "Spanien 2004" ' Legende CH.HasLegend = True With CH.Legend .Interior.Color = vbYellow .Border.Color = vbBlue .Border.Weight = xlThick End With 'Datenpunkte CH.SeriesCollection(1).Points(1). _ Interior.Color = vbWhite For i = 1 To CH.SeriesCollection(1).Points.Count If Cells(i + 1, 2) > 500000 Then With CH.SeriesCollection(1).Points(i) .ApplyDataLabels _ xlDataLabelsShowLabelAndPercent .DataLabel.NumberFormat = "0.00 %" End With End If Next i End Sub

199

Diagramme und Grafiken

Zwei Bildausschnitte zum Ergebnis (Abbildungen 7.10 und 7.11).

Abbildung 7.10 Formatiert: Flchen, Datenreihe, Titel

Abbildung 7.11 Formatiert: Legende

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

mit xlDataLabelsShowLabelAndPercent einen speziellen Beschriftungstyp und eine innere Flche.

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

Diagramme und Grafiken

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

gemessen von der oberen linken Ecke des Tabellenblatts


Gre

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:

Abbildung 7.13 Oval

203

Diagramme und Grafiken

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:

Abbildung 7.14 Linie

Zur Erluterung:

Bei der Methode AddLine() mssen vier Parameter angegeben werden:


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

Diagramme und Grafiken

' 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:

Abbildung 7.15 Zwei Objekte, Verbinder, Verbindungspunkte

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

390, 390, 430, 330,

60 120 40 30

207

Diagramme und Grafiken

Das Ergebnis:

Abbildung 7.16

Freiform

Zur Erluterung der geschlossenen Freiform:


BuildFreeform()

Die Methode BuildFreeform() bentigt drei Parameter:

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()

Die Methode AddNodes() bentigt mindestens vier Parameter:

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.

Abbildung 7.17 Koordinaten der Knoten fr den Linienzug

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:

Abbildung 7.18 Freiform-Linienzug

209

Diagramme und Grafiken

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()

dung wird jeweils der Typ Linie festgelegt.

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

In Abbildung 7.19 sehen Sie einen kleinen Ausschnitt:

Abbildung 7.19 Formen 1-6, 16-21 und 31-36

211

Diagramme und Grafiken

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

lf = 10 tp = tp + 70 End If Next i End Sub

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.

Abbildung 7.20 Formen 0-2, 6-8 und 12-14

213

Diagramme und Grafiken

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

Diagramme und Grafiken

.ColorScaleCriteria(2).FormatColor.Color = _ vbRed End With End Sub

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

Das Ergebnis sehen Sie in Abbildung 7.22.

Abbildung 7.22

Zweifarbige Skala

216

Bedingte Formatierungen

7.7

7.7.3

Dreifarbige Farbskala

Es folgt ein Beispiel mit drei Farben:


Sub DreiFarbenSkala() Dim rg As Range ThisWorkbook.Worksheets("Tabelle6").Activate Set rg = Range("A2:A11") rg.FormatConditions.Delete ' DreiFarbenSkala erzeugen rg.FormatConditions.AddColorScale 3 ' DreiFarbenSkala ndern With rg.FormatConditions(1) .ColorScaleCriteria(1).Type = _ xlConditionValueLowestValue .ColorScaleCriteria(1).FormatColor.Color = _ vbGreen .ColorScaleCriteria(2).Type = _ xlConditionValuePercentile .ColorScaleCriteria(2).FormatColor.Color = _ vbYellow .ColorScaleCriteria(3).Type = _ xlConditionValueHighestValue .ColorScaleCriteria(3).FormatColor.Color = _ vbRed End With End Sub

Zur Erluterung der Unterschiede zur zweifarbigen 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

Das Ergebnis sehen Sie in Abbildung 7.23.

217

Diagramme und Grafiken

Abbildung 7.23 Dreifarbige Skala

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

Das Ergebnis sehen Sie in Abbildung 7.24.

Abbildung 7.24 Symbolsatz

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

Diagramme und Grafiken

Next i End Sub

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.

In Abbildung 7.25 sehen Sie einen kleinen Ausschnitt.

Abbildung 7.25 Symbolstze 16-20

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

Das nachfolgende Programm erzeugt eine Sparkline vom Typ Linie:


Sub SparkLineLinie() ThisWorkbook.Worksheets("Tabelle8").Activate Range("A11").SparklineGroups.Add xlSparkLine, "A1:A10" End Sub

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

Das Ergebnis sehen Sie in Abbildung 7.26.

Abbildung 7.26

Sparkline, Typ Linie

7.8.2

Spalte

Eine Sparkline vom Typ Spalte wird hnlich erzeugt:


Sub SparkLineSpalte() ThisWorkbook.Worksheets("Tabelle8").Activate Range("A11").SparklineGroups.Add xlSparkColumn, "A1:A10" End Sub

Zur Erluterung:

Diesmal wird das Element xlSparkColumn der Auflistung xlSparkType genutzt. Damit wird eine Reihe von Balken erzeugt.

xlSparkColumn

Das Ergebnis sehen Sie in Abbildung 7.27.

Abbildung 7.27 Sparkline, Typ Spalte

221

Diagramme und Grafiken

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.

Das Ergebnis sehen sie in Abbildung 7.28.

Abbildung 7.28 Sparkline, Typ Gewinn/Verlust

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

End With End Sub

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

Das Ergebnis sehen Sie, etwas vergrert, in Abbildung 7.29.

Abbildung 7.29 Sparkline, formatiert

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

Diagramme und Grafiken

Zur Erluterung:

Die Farben sind von 1 bis 11 nummeriert. Zur deutlicheren Darstellung hat die Zelle mit den weien Balken einen schwarzen Hintergrund.

Das Ergebnis sehen Sie in Abbildung 7.30.

Abbildung 7.30 Sparkline, alle Farben

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.

Abbildung 7.31 Einfache Blockliste

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

Abbildung 7.32 Ausgabe der Positionen

225

VBA und Excel bieten eine Vielzahl von vordefinierten Funktionen fr viele Anwendungsbereiche.

VBA- und Worksheet-Funktionen

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

VBA- und Worksheet-Funktionen

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)

Tabelle 8.1 Einige Kategorien der Funktionen

8.1
Fehler des Benutzers

Eingaben 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

Eingaben des Benutzers

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:

Abbildung 8.1 Einfache InputBox

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

VBA- und Worksheet-Funktionen

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

Ein Beispiel fr die Eingabe einer Zahl (Typ 1):


Sub EingabeZahl() ThisWorkbook.Worksheets("Tabelle1").Activate Range("A1").Value = Application.InputBox _ (Prompt:="Zahl:", Type:=1) End Sub

Das Ergebnis:

Abbildung 8.2 Eingabe einer Zahl

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

Eingaben des Benutzers

8.1

Abbildung 8.3 Ungltige Zahl

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:

Abbildung 8.4 Bereich mit der Maus ausgewhlt

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

Eingabe per Maus

231

8
Gltigkeit

VBA- und Worksheet-Funktionen

Eine ungltige Formel fhrt wie erwartet zur Ausgabe einer Fehlermeldung in der Zielzelle (#WERT? oder #NAME?).

Eingabe eines Zellbereichs


Zellbereich eingeben

Ein Beispiel fr die Eingabe eines Zellbereichs (Typ 8):


Sub EingabeZellbereich() Dim RG As Range ThisWorkbook.Worksheets("Tabelle1").Activate Set RG = Application.InputBox _ (Prompt:="Zellbereich:", Type:=8) RG.Borders.LineStyle = xlContinuous End Sub

Falls der Benutzer den in Abbildung 8.5 dargestellten Bereich mit der Maus eingibt

Abbildung 8.5 Ausgewhlter Bereich

wird der in Abbildung 8.6 dargestellte Rahmen erzeugt.

Abbildung 8.6 Rahmen fr ausgewhlten Bereich

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

Einfacher Dialog mit dem Benutzer

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

Einfacher Dialog mit dem Benutzer


MsgBox()

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

Zunchst der Code:


Sub MsgBoxOkOnly() MsgBox "Gelesen? Dann bitte Ok drcken", vbOKOnly, "Ok" End Sub

Das Ergebnis:

Abbildung 8.7 OK-Button

Zur Erluterung:

Den ersten Parameter kennen wir schon; dabei handelt es sich um die eigentliche Nachricht des Ausgabedialogfelds.

233

8
vbOKOnly

VBA- und Worksheet-Funktionen

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

Buttons eine bersicht

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

AbortRetryIgnore drei Buttons: Abbrechen, Wiederholen, Ignorieren Critical DefaultButton1

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

(oder ...2 oder ...3)


Exclamation

Information

Question

RetryCancel SystemModal

YesNo YesNoCancel

Tabelle 8.2 Einige Mglichkeiten fr Buttons Operatoren Or, +

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

Einfacher Dialog mit dem Benutzer

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

Das folgende Beispiel zeigt die Ausgabe mit dem Info-Zeichen.

Abbildung 8.8 Info-Zeichen

Der zugehrige Code lautet:


Sub MsgBoxInformation() MsgBox "Das ist eine Information", vbInformation, "Info" End Sub

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

Ein Beispiel mit einem system-modalen Ausgabefeld:

Abbildung 8.9 System-modales Ausgabefeld liegt vor Anwendung Word.

235

VBA- und Worksheet-Funktionen

Der zugehrige Code lautet:


Sub MsgBoxSystemModal() MsgBox "Das mssen Sie unbedingt lesen", _ vbOKOnly Or vbSystemModal, "Ganz vorne" End Sub

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

Buttons Ja und Nein

Ein Beispiel mit den Buttons Ja und Nein:

Abbildung 8.10 Fragezeichen, Buttons Ja und Nein

Der zugehrige Code lautet:


Sub MsgBoxYesNo() If MsgBox("Soll die Datei gesichert werden?", _ vbYesNo Or vbQuestion, "Sicherung") = vbYes Then MsgBox "Sie wollen die Datei sichern" Else MsgBox "Sie wollen die Datei nicht sichern" End If End Sub

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

Einfacher Dialog mit dem Benutzer

8.2

Eine mgliche Antwort:

Abbildung 8.11 Button Nein bettigt

8.2.6

Drei Buttons, Default-Button

Ein Beispiel mit Buttons fr Ja, Nein und Abbrechen. Diesmal ist der zweite Button der Default-Button:

Abbildung 8.12 Drei Buttons, Default: Nein

Der zugehrige Code:


Sub MsgBoxYesNoCancel() Dim Antwort As Integer Antwort = MsgBox("Soll die Datei gesichert werden?", _ vbYesNoCancel Or vbDefaultButton2, "Sicherung") If Antwort = vbYes Then MsgBox "Sie wollen die Datei sichern" ElseIf Antwort = vbNo Then MsgBox "Sie wollen die Datei nicht sichern" Else MsgBox "Sie wollen den Vorgang abbrechen" End If End Sub

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

VBA- und Worksheet-Funktionen

Die Antwort wird anschlieend mit Hilfe einer mehrfachen Verzweigung ausgewertet.

8.2.7
Kritische Warnung

Buttons Wiederholen und Abbrechen

Ein Beispiel mit den Buttons Wiederholen und Abbrechen sowie dem Zeichen fr kritische Warnung:

Abbildung 8.13 Zwei Buttons, Warnung

Der zugehrige Code lautet:


Sub MsgBoxRetryCancel() If MsgBox("Beim Sichern der Datei trat ein Fehler auf." _ & vbCrLf & "Wollen Sie es noch einmal probieren?" _ & vbCrLf & "Wollen Sie den Vorgang abbrechen?", _ vbRetryCancel Or vbCritical, _ "Fehler bei Sicherung") = vbRetry Then MsgBox "Sie wollen es noch einmal probieren" Else MsgBox "Sie wollen den Vorgang abbrechen" End If End Sub

Zur Erluterung:

Die beiden Buttons Wiederholen und Abbrechen werden mit dem Zeichen fr kritische Warnung verknpft.

8.2.8
Achtung

Buttons Abbrechen, Wiederholen und Ignorieren

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

Abbildung 8.14 Drei Buttons, Achtung

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

VBA- und Worksheet-Funktionen

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

Abbildung 8.15 Zwei Zeichenketten

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()

Left(), Right(), Mid()

Abbildung 8.16

Ergebnis von Left()

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

Ergebnis von InStr() bzw. Search() Replace()

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

Ergebnis von Replace()

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

VBA- und Worksheet-Funktionen

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:

Abbildung 8.19 Datentypen feststellen und umwandeln

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

VBA- und Worksheet-Funktionen

Abbildung 8.20 Prozentzeichen

Zahl mit zwei Nachkommastellen

Das Prozentzeichen sorgt dafr, dass die Zahl durch 100 geteilt und mit einem Prozentzeichen dargestellt wird.

Abbildung 8.21 Ziffer eventuell darstellen

Der Wert 1/7 als Prozentzahl

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).

Abbildung 8.22 Tausenderpunkt, Text Datum formatieren

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:

Abbildung 8.24 Datenfeld in Zeichenkette umwandeln

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

VBA- und Worksheet-Funktionen

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:

Abbildung 8.25 Zeichenkette in Datenfeld umwandeln

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

Datum und Uhrzeit

8.4

8.4

Datum und Uhrzeit

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:

Abbildung 8.26 Addition eines Zeitintervalls

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:

Zeitintervall addieren Zeiteinheit

yyyy: Jahr q: Quartal m: Monat y: Tag des Jahres d: Tag w: Wochentag ww: Woche h: Stunde n: Minute s: Sekunde

247

VBA- und Worksheet-Funktionen

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:

Abbildung 8.27 Zeitdifferenz berechnen

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()

Datumsangaben erstellen, Wochentage markieren

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

Datum und Uhrzeit

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:

Abbildung 8.28 Samstag und Sonntag markieren

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()

VBA- und Worksheet-Funktionen

die VBA-Funktion Day() zur Ermittlung des Tages eines Monats die Worksheet-Funktion EoMonth() zur Bestimmung des letzten Tages eines bestimmten Monats

Der Code fr den Jahreskalender:


Sub Jahreskalender() Dim Tag As Integer, Monat As Integer, Jahr As Integer Dim Datum As Date, DatumErster As Date Dim AnzahlTage As Integer Jahr = Application.InputBox("Bitte ein Jahr eingeben:" _ , Type:=1) ' Application.ScreenUpdating = False Workbooks.add For Monat = 1 To 12 DatumErster = DateSerial(Jahr, Monat, 1) AnzahlTage = Day(Application.WorksheetFunction. _ EoMonth(DatumErster, 0)) For Tag = 1 To AnzahlTage Datum = DateSerial(Jahr, Monat, Tag) Cells(Tag, Monat).Value = Datum Cells(Tag, Monat).NumberFormatLocal = "TT.MM.JJ" If Weekday(Datum) = 7 Then Cells(Tag, Monat).Interior.Color = vbYellow ElseIf Weekday(Datum) = 1 Then Cells(Tag, Monat).Interior.Color = vbGreen End If Next Tag Next Monat ' Application.ScreenUpdating = True End Sub

Zur Erluterung:

Als Erstes soll der Benutzer eine Jahreszahl eingeben:

Abbildung 8.29

Eingabe der Jahreszahl

250

Datum und Uhrzeit

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()

Day(), Month(), Year()

Weekday()

Das Ergebnis:

Abbildung 8.30 Beginn des Jahreskalenders

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

VBA- und Worksheet-Funktionen

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

Abbildung 8.31 Unformatierte Zahlenwerte fr Einheitenumrechnung

Sub Umrechnungen() ThisWorkbook.Worksheets("Tabelle2").Activate

253

VBA- und Worksheet-Funktionen

' 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.

Abbildung 8.32 Joule zu Kalorie

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

Joule zu Kalorie Celsius zu Fahrenheit

Im dritten Fall wird eine Temperaturangabe aus Grad Celsius (C) in Grad Fahrenheit (F) umgerechnet.

Abbildung 8.34

Celsius zu Fahrenheit Luftdruck

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

Pascal zu Millimeter Quecksilbersule Text im Format

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

VBA- und Worksheet-Funktionen

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:

Abbildung 8.36 Dezimal, dual, hexadezimal

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:

Abbildung 8.37 Zellen mit Zahlen, leere Zellen

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

Textdateien, Import und Export


ffnen, schlieen

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

Lesen aus Textdateien


Alle Zeilen lesen

Zunchst das einfache Lesen aller Zeilen aus einer Textdatei. Diese hat folgenden Inhalt:

Abbildung 9.1 Textdatei mit Zahlen, Daten, Texten

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:

Abbildung 9.2 Importierte Zeilen

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

Textdateien, Import und Export

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

Import von Datenstzen


Eigenes Importprogramm

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

Abbildung 9.3 Textdatei mit CSV-Datenstzen Split()

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

Textdateien, Import und Export

9.1

Exit Sub Fehler: MsgBox (Err.Description) End Sub

Das Ergebnis:

Abbildung 9.4 Importierte Datenstze

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.

Abbildung 9.5 Daten, die exportiert werden sollen

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:

Abbildung 9.6 Exportierte Daten

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

Textdateien, Import und Export

9.1

9.1.4

Export von Datenstzen


Eigenes Exportprogramm

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()

Abbildung 9.7 Tabelle, die exportiert werden soll

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:

Abbildung 9.8 Exportierte Tabelle als CSV-Datenstze

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

Arbeiten mit Dateien

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()

Dateien suchen und auflisten

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

Arbeiten mit Dateien

9.2

MsgBox "Datei test.txt nicht gefunden" End If End Sub

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).

Suche mit Platzhalter

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

Abbildung 9.9 zeigt das Ergebnis.

Abbildung 9.9 Liste der gefundenen Dateien

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.

Ohne Suchmuster = altes Suchmuster

9.2.2
Dateiinformationen

Informationen ber Dateien

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

Arbeiten mit Dateien

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:

Abbildung 9.10 Liste mit Dateiinformationen

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

Operationen mit Dateien

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

Arbeiten mit Dateien

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

Nach der Kopie einer Datei Name()

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

Nach dem Umbenennen einer Datei Kill()

Mit der Funktion Kill() werden eine oder mehrere Dateien, gegebenenfalls unter Benutzung eines Platzhalters, ohne Rckfrage gelscht!

271

Externe Daten

Abbildung 9.14 Nach dem Lschen einer Datei

9.3
Eigene Konvertierung

Austausch mit Microsoft Word

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

Objektmodell von Word

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

Austausch mit Microsoft Word

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

Abbildung 9.15 Word-Objektbibliothek einbinden

9.3.2

Import von Abstzen aus Word


Abstze importieren

Im nchsten Beispiel werden die nachfolgenden Abstze eines WordDokuments gelesen und jeweils in einer Zelle eines Excel-Tabellenblatts gespeichert:

273

Externe Daten

Abbildung 9.16 Word-Datei mit einigen Abstzen

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

Austausch mit Microsoft Word

9.3

Das Ergebnis:

Abbildung 9.17 Importierte Zeilen

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

Import von Tabellen aus Word


Tabelle importieren

Nachfolgend wird der gesamte Inhalt der nachfolgenden Word-Tabelle in einem Excel-Tabellenblatt gespeichert:

275

Externe Daten

Abbildung 9.18 Word-Tabelle, die importiert werden soll

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

Austausch mit Microsoft Word

9.3

' Anwendung Word beenden appWord.Quit End Sub

Das Ergebnis:

Abbildung 9.19 Ergebnis des Imports

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

Export zu Word, Erstellen von Abstzen


Daten exportieren

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

' Anwendung Word starten Set appWord = CreateObject("Word.Application")

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

Abbildung 9.20 Excel-Daten, die exportiert werden sollen

Das Ergebnis des Codes:

Abbildung 9.21 Word-Datei mit Daten aus Excel

278

Austausch mit Microsoft Word

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

Export zu Word, Erstellen von Tabellen


Word-Tabelle schreiben

Es sollen die Inhalte des nachfolgenden Excel-Tabellenblatts als Tabelle in ein Word-Dokument geschrieben werden:

Abbildung 9.22 Excel-Tabelle, die exportiert werden soll

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:

Abbildung 9.23 Word-Tabelle mit Daten aus Excel

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

Austausch mit Microsoft Outlook

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

Austausch mit Microsoft Outlook


E-Mail senden

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

Objektmodell von Outlook

Einige wichtige Elemente des hierarchischen Objektmodells von Outlook:


Application CreateObject()

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

Austausch mit Microsoft Outlook

9.4

Abbildung 9.24 Outlook-Objektbibliothek einbinden

9.4.2

Einfaches Versenden einer Arbeitsmappe


SendMail()

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

Abbildung 9.25 Dialogfeld aus Sicherheitsgrnden

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:

Abbildung 9.26 Nachricht per SendMail()

Ein weiteres Beispiel:


Sub EinfachesSenden2() Dim Empf(1 To 2) As String Empf(1) = "max.muster@mailziel.de" Empf(2) = "monika.muster@mailziel.de" ThisWorkbook.SendMail Empf, "Test" End Sub

Das Ergebnis:

Abbildung 9.27 Nachricht an zwei Empfnger

Zur Erluterung beider Programme:


SendMail()

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

Austausch mit Microsoft Outlook

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

Das Ergebnis sehen Sie in Abbildung 9.28.

Abbildung 9.28 E-Mail-Dialogfeld zum weiteren Ausfllen

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-

Show() Dialogfeld benutzen

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

Nach dem Speichern

9.4.4
Elemente erzeugen

Zusammensetzen einer E-Mail

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

Austausch mit Microsoft Outlook

9.4

Exit Sub Fehler: MsgBox Err.Description appOutlook.Quit End Sub

Abbildung 9.30 zeigt das Ergebnis.

Abbildung 9.30 Ergebnis des Zusammensetzens einer E-Mail

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()

To, Subject, Body

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

Erstellen einer 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:

Abbildung 9.31 Empfnger-Adressen

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

Austausch mit Microsoft Outlook

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:

Abbildung 9.32 Zusammensetzen einer Serien-E-Mail

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

To, Bcc, Subject

9.4.6

Bestimmten Bereich in E-Mail versenden


Bereich senden

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:

Abbildung 9.33 Copy()

E-Mail mit ausgewhltem Bereich in Dateianhang

Die Methode Copy() wird genutzt, um diesen Bereich zu kopieren. Da kein Ziel per Parameter angegeben wurde, liegt der Bereich in der Zwischenablage.

290

Austausch mit Microsoft Outlook

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

E-Mail mit ausgewhltem Bereich in Dateianhang

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

Zugriff auf Outlook-Verzeichnis

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

Der erste Teil des Ergebnisses knnte wie folgt aussehen:

Abbildung 9.35 Zugriff auf Verzeichnis Gesendete Objekte

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)

Subject, To, Body

292

Austausch mit Microsoft Outlook

9.4

9.4.8

Zugriff auf E-Mail-Anhnge

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.

Abbildung 9.36 Statistik zu Anhngen, Teil 1

Abbildung 9.37 Statistik zu Anhngen, Teil 2

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

Austausch mit Microsoft Outlook

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

Zugriff auf Kontakte

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

9.4.10 Kontakt erzeugen


Neuer Kontakt

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

Das Ergebnis sehen Sie in Abbildung 9.38.

296

Austausch mit Microsoft Outlook

9.4

Abbildung 9.38 Neu erzeugter Kontakt

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.

9.4.11 Termin erzeugen


Elemente des Verzeichnisses Kalender sind Objekte des Typs AppointmentItem. Diese Elemente haben wiederum andere Eigenschaften als
AppointmentItem

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:

Abbildung 9.39 Neu hinzugefgter Termin

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.

9.4.12 Terminserie erzeugen


RecurrencePattern

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

Austausch mit Microsoft Outlook

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

Informationen zu der erstellten Terminserie:

Abbildung 9.40 Uhrzeit und Dauer

Abbildung 9.41 Wiederholungsmuster

299

Externe Daten

Abbildung 9.42 Beginn und Ende

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

RecurrenceType: Wiederholrate. Diese Eigenschaft muss zuerst

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

Zeitraum fest, in dem die Termine der Serie stattfinden.


Save()

Anschlieend wird die neue Terminserie mit der Methode Save() gespeichert.

9.5
Datenbankzugriff

Austausch mit Microsoft Access

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

Austausch mit Microsoft Access

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:

Abbildung 9.43 Tabelle personen, Entwurfsansicht

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

Abbildung 9.44 Tabelle personen, Datenblattansicht

9.5.2

Beispiel-Datenbank: Verbindung herstellen


Ablauf des Zugriffs

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

Abbildung 9.45 ADO-Objektbibliothek einbinden

hnliche Bibliotheken gibt es fr die Verbindung zu anderen DatenbankTypen bzw. zu Datenbank-Servern.


ConnectionString

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

Austausch mit Microsoft Access

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

Import der Tabellendaten aus Access

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

Cells(i, 2) Cells(i, 3) Cells(i, 4) Cells(i, 5) rs.MoveNext i = i + 1 Loop rs.Close cn.Close

= = = =

rs!vorname rs!personalnummer rs!gehalt rs!geburtstag

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

Austausch mit Microsoft Access

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

Abbildung 9.47 Genderte Datenstze

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)

Zur Kontrolle wird die Anzahl der genderten Datenstze angezeigt.

Abbildung 9.48 Anzahl der betroffenen Datenstze

306

Austausch mit Microsoft Access

9.5

9.5.6

SQL: Auswahlabfragen mit SELECT


SQL

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

Abbildung 9.49 Nur Felder name, vorname

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.

Abbildung 9.50 Nur bestimmte Datenstze

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!).

Abbildung 9.51 Auswahl ber eine Zeichenkette

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

Tabelle 9.1 SQL, Vergleichsoperatoren Logische Operatoren

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.

Tabelle 9.2 SQL, logische Operatoren

Mit diesen Operatoren knnen Sie z. B. folgende Abfrage formulieren:

308

Austausch mit Microsoft Access

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

Abbildung 9.52 Auswahl mit Hilfe von Operatoren

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.

Beginnt mit ...

Abbildung 9.53 Auswahl mit Hilfe von LIKE

SQLCommand = "SELECT * FROM personen WHERE name LIKE '%i%'"

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 ...

Abbildung 9.54 Auswahl mit vielen beliebigen Zeichen

309

Externe Daten

SQLCommand = "SELECT * FROM personen WHERE name LIKE 'M__er'"

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.

Abbildung 9.55 Auswahl mit einem beliebigen Zeichen

9.5.8
Ausgabe sortieren

SQL: Abfrageergebnis sortieren

Die Reihenfolge der Datenstze im Abfrageergebnis lsst sich mit ORDER


BY beeinflussen. Man gibt einen oder mehrere Sortierschlssel an. Die

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.

Abbildung 9.56 Ausgabe mit fallender Sortierung

SQLCommand = "SELECT * FROM personen ORDER BY name, vorname"

Die Datenstze sind nach name aufsteigend sortiert. Bei gleichem Namen sind sie nach vorname aufsteigend sortiert.

Abbildung 9.57 Ausgabe mit doppeltem Sortierschlssel

310

Austausch mit Microsoft Access

9.5

Hinweis
Zur Verdeutlichung wurde fr diese Abfrage kurzfristig ein Datensatz (Maier, Wolfgang) hinzugefgt.

9.5.9

SQL: Auswahlabfragen zur Suche nach Eingabe


Suche mit Suchbegriff

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

Abbildung 9.58 Suche nach Name

wird das in Abbildung 9.59 dargestellte Ergebnis angezeigt.

Abbildung 9.59 Ergebnis der Suche nach Name

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.

Suche mit Teilbegriff

311

Externe Daten

Nach einer Eingabe wie in Abbildung 9.60

Abbildung 9.60 Suche nach Zeichenkette

werden die in Abbildung 9.61 dargestellten Datenstze angezeigt.

Abbildung 9.61 Ergebnis der Suche nach Zeichenkette SQL kontrollieren

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.

Abbildung 9.62 Suche nach einem Namen, der er enthlt

9.5.10 SQL: Aktionsabfrage zum ndern mit UPDATE


UPDATE ... SET

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

Austausch mit Microsoft Access

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.

Abbildung 9.63 Ein Datensatz wurde gendert

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.

Auswahl ber Index

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

Fehlermeldung zu leerem Wert Doppelter Wert

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

Abbildung 9.65 Ungltiger Wert

Fehlermeldung zu doppeltem Wert

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

Fehlermeldung zu ungltigem Wert

9.5.11 SQL: Aktionsabfrage zum Einfgen mit INSERT


INSERT INTO

Die Anweisung INSERT wird zum Einfgen neuer Datenstze genutzt.


SQLCommand = "INSERT INTO personen (name, vorname, personalnummer, gehalt, geburtstag) VALUES('Mller', 'Gerd', 4711, 2900, '12.08.1976')"

Damit wird ein neuer Datensatz in die Datenbanktabelle eingefgt. Abbildung 9.67 zeigt das Ergebnis nach erneutem Import aller Daten.

Abbildung 9.67 Tabelle mit neuem Datensatz VALUES

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

Austausch mit Microsoft Access

9.5

9.5.12 SQL: Aktionsabfrage zum Lschen mit DELETE


Die Anweisung DELETE dient zum Lschen von Datenstzen in der Datenbanktabelle. Sie hnelt ebenfalls der Anweisung SELECT. Die Auswahlkriterien sollten sorgfltig gewhlt werden, da sonst eventuell nicht nur die gewnschten Datenstze gelscht werden.
SQLCommand = "DELETE FROM personen"
DELETE

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.

Auswahl ber Index

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

davon ab, ob das Dialogfeld ordnungsgem beendet oder abgebrochen wurde.


xlDialogSendMail

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:

Abbildung 10.1 Dialogfeld Datei ffnen

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

Datei speichern unter


xlDialogSaveAs

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

Das Ergebnis sehen Sie in Abbildung 10.2.

Abbildung 10.2 Dialogfeld Speichern unter

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.

10.1.3 Muster fr Zellbereich auswhlen


Nach Auswahl eines Zellbereichs, durch die Anwendung oder durch den Benutzer, kann ein Muster bzw. eine Zellhintergrundfarbe gewhlt werden:
Sub AuswahlMuster() Dim Erfolg As Boolean ThisWorkbook.Worksheets("Tabelle1"). _ Range("A1:C3").Select Erfolg = Application.Dialogs(xlDialogPatterns).Show
xlDialogPatterns

319

10

Dialogfelder

If Not Erfolg Then _ MsgBox "Kein Muster ausgewhlt" End Sub

Abbildung 10.3 zeigt das Ergebnis.

Abbildung 10.3 Dialogfeld Zellen formatieren (Ausfllen)

Zur Erluterung:
Button OK

Die Konstante ist xlDialogPatterns. Falls der Benutzer den Button OK bettigt, wird der ausgewhlte Zellbereich mit dem gewhlten Muster formatiert.

10.1.4 Schriftformatierung fr Zellbereich auswhlen


xlDialogFontProperties

hnlich wie ein Muster kann eine Schriftformatierung ausgewhlt werden:


Sub AuswahlSchriftformatierung() Dim Erfolg As Boolean ThisWorkbook.Worksheets("Tabelle1"). _ Range("A1:C3").Select Erfolg = Application.Dialogs _ (xlDialogFontProperties).Show If Not Erfolg Then _ MsgBox "Keine Schriftformatierung ausgewhlt" End Sub

Das Ergebnis ist in Abbildung 10.4 dargestellt. Zur Erluterung:


Button OK

Die Konstante ist xlDialogFontProperties. Falls der Benutzer den Button OK bettigt, wird der ausgewhlte Zellbereich mit den gewhlten Schrifteigenschaften formatiert.

320

Eigene Dialogfelder und Anwendungen

10.2

Abbildung 10.4 Dialogfeld Zellen formatieren (Schrift)

10.2

Eigene Dialogfelder und Anwendungen


Steuerelemente

Eigene Dialogfelder knnen mit Hilfe von verschiedenen Steuerelementen genau auf die Bedrfnisse einer Anwendung abgestimmt werden.

10.2.1

Ein erstes Beispiel

Zu Beginn ein einfaches Beispiel mit zwei Buttons:

Abbildung 10.5 Erstes eigenes Dialogfeld

Zur Erluterung:

Nach Bettigung des Buttons Hallo erscheint eine kurze Meldung. Nach Bettigung des Buttons Ende wird das Dialogfeld beendet.

Steuerelement Button

10.2.2 Erstes Beispiel: Gestaltung


In diesem Abschnitt geht es um die reine Gestaltung des Beispiels. Zur Erstellung eines Dialogfelds whlen Sie im VBE im Men Einfgen den Menpunkt UserForm. Es erscheint ein leeres Dialogfeld in Standardgre. Auerdem wird ein kleines Dialogfeld mit einer Reihe von Steuerelementen, die Werkzeugsammlung (Toolbox), eingeblendet.
UserForm

321

10

Dialogfelder

Abbildung 10.6 Toolbox Werkzeugsammlung

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

frm, cmd, txt

Wert
frmErstes Erstes Beispiel cmdHallo Hallo cmdEnde Ende

Tabelle 10.1 Eigenschaften und Werte der Steuerelemente

322

Eigene Dialogfelder und Anwendungen

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.

Abbildung 10.7 Eigenschaften des Dialogfelds

10.2.3 Erstes Beispiel: Code


Das kleine Beispiel aus dem vorherigen Abschnitt muss noch mit Code versehen werden. Was passiert, wenn der Benutzer einen der Buttons bettigt? Dazu mssen zwei Ereignisprozeduren erstellt werden. Zum Erstellen doppelklicken Sie auf dem entsprechenden Button. Es erscheint eine leere Ereignisprozedur, deren Name sich aus dem Steuerelement und dem Ereignis zusammensetzt. In dieser Prozedur wird der Code zu dem Ereignis Click des jeweiligen Buttons gespeichert. Im Falle des Buttons Hallo ist der Name also cmdHallo_Click. Diese leere Prozedur wird nun mit VBA-Code gefllt:
Private Sub cmdHallo_Click() MsgBox "Hallo" End Sub
Ereignisprozedur

Prozedur fllen

Button Hallo

Eine Ereignisprozedur kann auch so erstellt werden wie fr ein Ereignis einer Arbeitsmappe oder eines Tabellenblatts:

Steuerelement und Ereignis auswhlen

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

Die Prozedur fr den Button Ende:


Private Sub cmdEnde_Click() Unload Me End Sub

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.

10.2.4 Erstes Beispiel: Starten


Taste F5

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

Eigene Dialogfelder und Anwendungen

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

Dialogfeld Datei exportieren

10.2.5 Arbeiten mit Steuerelementen


Gre und Ort von Steuerelementen knnen mit der Maus leicht eingestellt werden. Dadurch ndern sich folgende Eigenschaften:

Width: Breite Height: Hhe

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.

Abbildung 10.9 Steuerelement kopieren

Zwei gleichzeitig ausgewhlte Steuerelemente

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.

Dies hngt vom Einsatzzweck der Anwendung ab.

326

Eigene Dialogfelder und Anwendungen

10.2

10.2.6 Textfeld und Bezeichnungsfeld


Textfelder (engl. textbox) dienen zur Eingabe von Texten oder Zahlen. Bezeichnungsfelder (engl. label) enthalten Bezeichnungen. Dies sind im Allgemeinen Texte und Zahlen, die dem Benutzer nur angezeigt werden, die er aber nicht verndern kann. Im folgenden Beispiel gibt es drei Bezeichnungsfelder, drei Textfelder und zwei Buttons. In den ersten beiden Textfeldern kann der Benutzer zwei Zahlen eingeben. Die Summe der beiden Zahlen wird im dritten Textfeld angezeigt, sobald man den ersten Button bettigt. Bei Bettigung des zweiten Buttons wird die gleiche Summe in einem Tabellenblatt angezeigt.
Eingabe, Anzeige

Abbildung 10.10 Addition von zwei Zahlen

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.

bermittlung zum Tabellenblatt

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.

10.2.7 Optionsschaltflchen und Kontrollkstchen


Optionsschaltflche

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

Eigene Dialogfelder und Anwendungen

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

Erster Frame mit Radio Buttons

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

Abbildung 10.12 Gesamtes Dialogfeld, Startzustand Option voreinstellen

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:

Die Variable Rg vom Typ Range wird modulweit deklariert.

330

Eigene Dialogfelder und Anwendungen

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

Abbildung 10.13 Tabellenblatt, Startzustand

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

Else Rg.Interior.Color = xlColorIndexNone End If End Sub

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.

Mehrfachverzweigung Einfache Verzweigung Button Ende

Der Button Ende dient mit Hilfe des folgenden Codes wieder zum Schlieen des Dialogfelds:
Private Sub cmdEnde_Click() Unload Me End Sub

10.2.8 Liste, Bildlaufleiste und Drehfeld


Listenfeld, Kombifeld

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

Eigene Dialogfelder und Anwendungen

10.2

Daneben steht jeweils ein Textfeld, in dem der ausgewhlte bzw. eingestellte Wert abgebildet wird.

Abbildung 10.14 Auswahl per Liste, Bildlaufleiste, Drehfeld

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

Abbildung 10.15 Liste und zugehriges Textfeld

Zur Erluterung der Liste:


Eigenschaft Style

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

Abbildung 10.16 Bildlaufleiste und zugehriges Textfeld

Zur Erluterung der Bildlaufleiste:


Eigenschaften

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

Eigene Dialogfelder und Anwendungen

10.2
Min, Max, Value

Daher werden zur Entwurfszeit die folgenden Eigenschaften eingestellt:


Orientation: 1 (= fmOrientationHorizontal) Min: 1 Max: 100 Value: 50 SmallChange: 1 LargeChange: 10


Ereignis Change

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

Abbildung 10.17 Drehfeld und zugehriges Textfeld

Zur Erluterung des Drehfelds:

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()

Zeichen gleich breit

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

Das Ergebnis sehen Sie in Abbildung 10.18.

336

Eigene Dialogfelder und Anwendungen

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

10.2.10 RefEdit und Umschaltfeld


Das RefEdit-Steuerelement wird genutzt, um Zellbereiche eines Tabellenblatts zu ermitteln. Es arbeitet hnlich wie die Funktion Application.InputBox(). Allerdings steht es nicht allein, sondern wird mit weiteren Steuerelementen auf einem Dialogfeld kombiniert. Zellbereiche knnen per Tastatur oder per Maus eingegeben werden.
Zellbereich eingeben

337

10

Dialogfelder

Abbildung 10.19 Eingabe per Maus

Dialogfeld mit RefEdit-Steuerelement, Startzustand

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.

Abbildung 10.20 RefEdit, nach Auswahl eines Zellbereichs Umschaltfeld

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:

Abbildung 10.21 Nach Umschalten auf Farbe und bertragen

338

Eigene Dialogfelder und Anwendungen

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

Was ist Nordwind?


Warenwirtschaft

Bei der Datei Nordwind.mdb handelt es sich eigentlich um eine BeispielDatenbank, die zusammen mit Access ausgeliefert wird. Sie enthlt ein

341

11

Beispielprojekt

Warenwirtschaftsprogramm mit Kunden- und Artikelverwaltung sowie Bestell- und Rechnungswesen.


Vorlage fr Projekt

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

Vorbereitungen fr das Projekt

In diesem Abschnitt wird beschrieben, wie die Excel-Datei aus der Access-Datei vor dem eigentlichen Beginn des Projekts erstellt wurde.

342

Vorbereitungen fr das Projekt

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

Abbildung 11.1 Excel-Tabelle Kunden

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.

Abbildung 11.2 zeigt das Ergebnis.

Abbildung 11.2 Excel-Tabelle Artikel

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.

Abbildung 11.3 Tabellen Outlook

Der Anwendung wird ein Verweis auf die Outlook-Bibliothek hinzugefgt, siehe Abschnitt 9.4.1, Objektmodell von Outlook.

11.3

Benutzung des Programms

Zum besseren Verstndnis folgt eine Schilderung der Benutzung des Programms. Der VBA-Code wird in einem spteren Abschnitt beschrieben.

344

Benutzung des Programms

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:

Abbildung 11.4 Hauptdialogfeld der Anwendung Nordwind

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

Unterdialogfeld Kunden Neu

Nach Bettigung des Buttons Kunden Neu erscheint das entsprechende Dialogfeld (siehe Abbildung 11.5).

345

11

Beispielprojekt

Abbildung 11.5 Dialogfeld Kunden Neu Kein leerer Name

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.

Sortierung bleibt erhalten

11.3.3

Unterdialogfeld Kunden ndern

Nach Bettigung des Buttons Kunden ndern erscheint das in Abbildung 11.6 dargestellte Dialogfeld, in dem der Benutzer Daten ndern oder lschen kann.

Abbildung 11.6 Dialogfeld Kunden ndern

346

Benutzung des Programms

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

Abbildung 11.7 Nach Eingabe und Auswahl

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

ber den Button Zurck kehren Sie zurck zum Hauptdialogfeld.

11.3.4 Unterdialogfeld Artikel Neu


Nach Bettigung des Buttons Artikel Neu hat man die Mglichkeit, neue Artikel einzugeben (siehe Abbildung 11.8).

Abbildung 11.8 Dialogfeld Artikel Neu Kein leerer Name

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

Benutzung des Programms

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

Unterdialogfeld Artikel ndern

Nach Bettigung des Buttons Artikel ndern erscheint das in Abbildung 11.9 dargestellte Dialogfeld, in dem der Benutzer Daten ndern oder lschen kann.

Abbildung 11.9 Dialogfeld Artikel ndern

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.

ber den Button Zurck kehren Sie zurck zum Hauptdialogfeld.

11.3.6 Unterdialogfeld Bestellungen Neu


Bestellung erzeugen

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

Benutzung des Programms

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.

Abbildung 11.10 Dialogfeld Bestellungen Neu, oberer Teil

Abbildung 11.11 Bestelldatum einstellen

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

Abbildung 11.12 Liste der bestellten Artikel Button Hinzufgen

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

Nach Bettigung des Buttons 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.

E-Mail

Die neu eingetragene Zeile in der Tabelle Bestellungen enthlt:


die eindeutige Bestellnummer die eindeutige Kundennummer das Bestelldatum

ber den Button Zurck kehren Sie zurck zum Hauptdialogfeld.

352

Entwicklung des Programms

11.4

11.4

Entwicklung des Programms

In diesem Abschnitt werden alle Programmelemente der Anwendung Nordwind erlutert.

11.4.1

Das VBA-Projekt

Abbildung 11.13 zeigt eine bersicht ber die verschiedenen Bestandteile des VBA-Projekts.

Abbildung 11.13 Projekt-Bestandteile

Sie erkennen folgende Objekte:

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.

11.4.3 Das gemeinsame Modul


Das Modul Modul_Gemeinsam enthlt VBA-Code, der von verschiedenen Teilen der Anwendung genutzt wird. Es handelt sich dabei um:
Datenfeld

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.

11.4.4 Hauptdialogfeld Nordwind


Beginn, Ende Zunchst zwei Prozeduren des Dialogfelds Nordwind, die zu Beginn und Ende des Programms wichtig sind:
Private Sub UserForm_Initialize() Kategorie(1) = "Fleischprodukte" Kategorie(2) = "Getrnke"

354

Entwicklung des Programms

11.4

Kategorie(3) Kategorie(4) Kategorie(5) Kategorie(6) Kategorie(7) Kategorie(8) End Sub

= = = = = =

"Getreideprodukte" "Gewrze" "Meeresfrchte" "Milchprodukte" "Naturprodukte" "Swaren"

' 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

Aufruf der Unterdialogfelder

Es folgen fnf kurze Prozeduren fr den Aufruf der Unterdialogfelder:

Private Sub cmdKundenNeu_Click() Me.Hide

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

11.4.5 Unterdialogfeld Kunden Neu


hnliche Ablufe

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

Entwicklung des Programms

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

Zurck zum Start

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

Entwicklung des Programms

11.4

' Neue Firma Cells(Zeile, Cells(Zeile, Cells(Zeile, Cells(Zeile, Cells(Zeile, Cells(Zeile, Cells(Zeile,

eintragen 1).Value = 2).Value = 3).Value = 4).Value = 5).Value = 6).Value = 7).Value =

MaxKundennummer + 1 txtFirma.Text txtStrasse.Text "'" & txtPLZ.Text txtOrt.Text txtLand.Text txtEMail.Text

' Info MsgBox "Neue Firma " & txtFirma.Text & _ " wurde eingetragen"

' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub

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:

Kein leerer Name

StrConv()

den Text, der umgewandelt werden soll die Form der Umwandlung
Umwandlung

Die zwei gngigsten Werte fr die Umwandlungsform sind:


vbUpperCase zur Umwandlung in Grobuchstaben vbLowerCase zur Umwandlung in Kleinbuchstaben


Name vorhanden?

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

Zurck zum Start

11.4.6 Unterdialogfeld Kunden ndern


hnliche Ablufe

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

Entwicklung des Programms

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

Entwicklung des Programms

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

Es folgt die Funktion aus dem gemeinsamen Modul:


' Zeilennummer der Firma liefern, ' die aktuell in der Liste angezeigt wird Public Function ZeileFirmaSuchen(frm As UserForm) _ As Integer Dim Zeile As Integer ' Zugehrige Tabelle aktivieren ThisWorkbook.Worksheets("Kunden").Activate ' Zeile mit ausgewhlter Firma suchen Zeile = 2 Do While Cells(Zeile, 2).Value <> "" If Cells(Zeile, 2).Value = _ frm.cmbFirmaSuchen.Text Then Exit Do End If Zeile = Zeile + 1 Loop

363

11

Beispielprojekt

' Zeile zurckliefern ZeileFirmaSuchen = Zeile End Function

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.

Zeile wird geliefert

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

Entwicklung des Programms

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.

Kein leerer Name

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()

11.4.7 Unterdialogfeld Artikel Neu


hnliche Ablufe

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

Entwicklung des Programms

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.

Es folgen die beiden Funktionen aus dem gemeinsamen Modul:


' Textfeld "Anzahl" ber Button "Kleiner" steuern Public Sub Kleiner(frm As UserForm) If Not IsNumeric(frm.txtAnzahl.Text) Then frm.txtAnzahl.Text = 0 ElseIf frm.txtAnzahl.Text > 0 Then frm.txtAnzahl.Text = frm.txtAnzahl.Text 1 End If End Sub ' Textfeld "Anzahl" ber Button "Groesser" steuern Public Sub Groesser(frm As UserForm) If Not IsNumeric(frm.txtAnzahl.Text) Then frm.txtAnzahl.Text = 1 Else frm.txtAnzahl.Text = CInt(frm.txtAnzahl.Text) + 1 End If End Sub

Zur Erluterung der Funktion Kleiner():


Keine Zahl?

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

Zur Erluterung der (sehr hnlichen) Funktion Groesser():


Erhhen

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

Entwicklung des Programms

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

Entwicklung des Programms

11.4

11.4.8 Unterdialogfeld Artikel ndern


Das Unterdialogfeld Artikel ndern enthlt hnliche Ablufe wie das bereits beschriebene Unterdialogfeld Kunden ndern. In diesem Abschnitt werden nur die Unterschiede genauer erlutert. Beginn, Ende Zunchst die beiden Prozeduren dieses Dialogfelds, die zu Beginn und Ende wichtig sind:
Private Sub UserForm_Initialize() Dim i As Integer ' Zugehrige Tabelle aktivieren ThisWorkbook.Worksheets("Artikel").Activate ' Kategorien hinzufgen, ersten Eintrag anzeigen cmbKategorie.Clear cmbKategorieSuchen.Clear For i = 1 To 8 cmbKategorie.AddItem Kategorie(i) cmbKategorieSuchen.AddItem Kategorie(i) Next i cmbKategorieSuchen.ListIndex = 0 End Sub Private Sub cmdZurueck_Click() ' Zurck zum Hauptmen Unload Me frmNordwind.Show End Sub
hnliche Ablufe

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

ListeArtikelFuellen Me End Sub


Artikel auflisten

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

Entwicklung des Programms

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.

Es folgt die Funktion aus dem gemeinsamen Modul:


' Zeilennummer des Artikels liefern, ' der aktuell in der Liste angezeigt wird Public Function ZeileArtikelSuchen _ (frm As UserForm) As Integer Dim Zeile As Integer ' Zugehrige Tabelle aktivieren ThisWorkbook.Worksheets("Artikel").Activate ' Zeile mit ausgewhltem Artikel suchen Zeile = 2 Do While Cells(Zeile, 2).Value <> "" If Cells(Zeile, 2).Value = _ frm.cmbArtikelnameSuchen.Text Then Exit Do End If Zeile = Zeile + 1 Loop ' Zeile zurckliefern ZeileArtikelSuchen = Zeile End Function

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

Entwicklung des Programms

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

Entwicklung des Programms

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.

Kein leerer Name

Sicherheitsabfrage, Delete()

11.4.9 Unterdialogfeld Bestellungen Neu


Das Unterdialogfeld Bestellungen Neu beinhaltet enthlt Ablufe wie die bereits beschriebenen Unterdialogfelder Kunden ndern und Artikel ndern. In diesem Abschnitt werden nur die Unterschiede genauer erlutert. Beginn, Ende Zunchst die modulweiten Variablen und zwei Prozeduren dieses Dialogfelds, die zu Beginn und Ende wichtig sind:
Option Explicit Private Type BestelldetailTyp Artikelnummer As Integer Artikelname As String Einzelpreis As Single Anzahl As Integer Gesamtpreis As Single End Type Dim Bestelldetail() As BestelldetailTyp Dim MailBody As String Private Sub UserForm_Initialize() Dim i As Integer ' Kategorien hinzufgen, ersten Eintrag anzeigen cmbKategorieSuchen.Clear
hnliche Ablufe

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

Entwicklung des Programms

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

Zur Erluterung der Unterschiede:


Kontrollausgabe

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.

Anzahl einstellen Die Prozeduren Kleiner() und Groesser():

380

Entwicklung des Programms

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

Entwicklung des Programms

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

Entwicklung des Programms

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.

Keine leeren Daten

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 falsch wahr wahr wahr wahr falsch wahr falsch

Tabelle 1 Zur Lsung der bung 3 E

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

0.12 0.15 0.2 0.25

389

Lsungen

Range("A11").Value = Steuerbetrag End Sub

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

= Gehalt * 0.12 = Gehalt * 0.15 = Gehalt * 0.2 = Gehalt * 0.25

Range("A11").Value = Steuerbetrag End Sub

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

z = (x + y) / 2 MsgBox z End Sub

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

Button (Forts.) Wiederholen 234 ByRef 149 ByVal 147

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

Duration, AppointmentItem (Outlook) 298

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

Hochstellen 75 HorizontalAlignment, Range 72

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

xlYes 86 Xor 108

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

Вам также может понравиться