Sie sind auf Seite 1von 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 MarkerForegroun