Einstieg Mit VBA in Excel

416

Transcript of Einstieg Mit VBA in Excel

Page 1: Einstieg Mit VBA in Excel
Page 2: Einstieg Mit VBA in Excel

Thomas Theis

Einstieg in VBA mit Excel

Page 3: Einstieg Mit VBA in Excel

Liebe Leserin, lieber Leser,

Microsoft Excel kann viel, aber bei Weitem nicht alles, was Sie im beruflichen All-tag benötigen – diese Erfahrung haben Sie wahrscheinlich schon gemacht, wennSie beschlossen haben, Visual Basic for Applications, oder kurz VBA, zu lernen.Viele Dinge werden mit VBA erst möglich und noch mehr lassen sich erheblichbeschleunigen. Auf Dauer zahlt es sich also aus zu lernen, wie man Excel neueFunktionen beibringt.

Vielleicht haben Sie bislang jedoch den Aufwand gescheut, sich mit VBA auseinan-derzusetzen? Dieses Buch wurde daher extra so konzipiert, dass Sie bereits nachkurzer Zeit Erfolge erzielen werden. Es wurde speziell für Leser geschrieben, diebislang noch keine Erfahrung im Programmieren haben. Schritt für Schritt zeigtIhnen unser Autor Thomas Theis alles, was Sie wissen müssen, um Ihre eigenenVBA-Skripte entwickeln zu können. Das Hauptziel des Buchs ist dabei nicht, Ihnensämtliche VBA-Konstrukte zu vermitteln, sondern Sie vor allen Dingen schnell indie Lage zu versetzen, Excel an Ihre Bedürfnisse anzupassen.

Die Theorie ist daher auf das absolut Notwendige reduziert – im Zentrum stehendie vielen Praxisbeispiele, anhand derer Sie den Stoff problemlos nachvollziehenkönnen. Ihre neu gewonnenen Kenntnisse können Sie anschließend an Übungsauf-gaben austesten, so dass der letzte Schritt zu Ihren eigenen VBA-Skripten kein Pro-blem mehr für Sie darstellen wird.

Dieses Buch wurde mit großer Sorgfalt geschrieben, geprüft und produziert. Solltedennoch einmal etwas nicht so funktionieren, wie Sie es erwarten, freue ich mich,wenn Sie sich mit mir in Verbindung setzen. Ihre Kritik und konstruktiven Anre-gungen sind uns jederzeit herzlich willkommen!

Doch nun viel Spaß bei der Lektüre und viel Erfolg mit VBA wünscht Ihnen

Ihre Christine SiedleLektorat Galileo Computing

[email protected] Press · Rheinwerkallee 4 · 53227 Bonn

Page 4: Einstieg Mit VBA in Excel

3

Auf einen Blick

1 Einführung ........................................................................... 15

2 Grundlagen von Objekten und Ereignissen ......................... 45

3 Grundlagen der Programmierung mit VBA ......................... 93

4 Fehlerbehandlung ................................................................ 125

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

6 Mehr über Objekte .............................................................. 167

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

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

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

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

11 Beispielprojekt .................................................................... 341

Lösungen ............................................................................. 387

Page 5: Einstieg Mit VBA in Excel

Der Name Galileo Press geht auf den italienischen Mathematiker und Philosophen GalileoGalilei (1564–1642) zurück. Er gilt als Gründungsfigur der neuzeitlichen Wissenschaft undwurde berühmt als Verfechter des modernen, heliozentrischen Weltbilds. Legendär ist seinAusspruch Eppur se muove (Und sie bewegt sich doch). Das Emblem von Galileo Press ist derJupiter, umkreist von den vier Galileischen Monden. Galilei entdeckte die nach ihm benanntenMonde 1610.

Lektorat Christine SiedleFachgutachten Alois EcklKorrektorat Bettina MosbachCover Barbara Thoben, KölnTypografie und Layout Vera BraunerHerstellung Norbert EnglertSatz Typographie & Computer, KrefeldDruck 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:[email protected] bei Fragen und Anmerkungen zum Inhalt des [email protected] für versandkostenfreie Bestellungen und [email protected] für Rezensions- und Schulungsexemplare

Bibliografische Information der Deutschen NationalbibliothekDie Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen National-bibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar.

ISBN 978-3-8362-1665-4

© Galileo Press, Bonn 20102., aktualisierte Auflage 2010

Das vorliegende Werk ist in all seinen Teilen urheberrechtlich geschützt. Alle Rechte vorbehalten, insbesondere das Recht

der Übersetzung, des Vortrags, der Reproduktion, der Vervielfältigung auf fotomechanischem oder anderen Wegen und der

Speicherung in elektronischen Medien. Ungeachtet der Sorgfalt, die auf die Erstellung von Text, Abbildungen und Program-

men verwendet wurde, können weder Verlag noch Autor, Herausgeber oder Übersetzer für mögliche Fehler und deren Fol-

gen eine juristische Verantwortung oder irgendeine Haftung übernehmen. Die in diesem Werk wiedergegebenen Gebrauchs-

namen, Handelsnamen, Warenbezeichnungen usw. können auch ohne besondere Kennzeichnung Marken sein und als

solche den gesetzlichen Bestimmungen unterliegen.

Page 6: Einstieg Mit VBA in Excel

5

Inhalt

Geleitwort des Fachgutachters ...................................................................... 13

1 Einführung .......................................................................................... 15

1.1 Was wird besser durch Makros und VBA? .................................... 151.2 Arbeiten mit Makros .................................................................... 17

1.2.1 Makro aufzeichnen ....................................................... 181.2.2 Makro ausführen ........................................................... 211.2.3 Makro ansehen ............................................................. 211.2.4 Makro speichern ........................................................... 231.2.5 Makrosicherheit ändern ................................................ 241.2.6 Registerkarte »Entwicklertools« ..................................... 251.2.7 Makrosicherheit dauerhaft ändern ................................ 26

1.3 Entwicklungsumgebung »Visual Basic Editor« ............................... 281.3.1 Menüleiste und Symbolleiste ........................................ 281.3.2 Projekt-Explorer und Eigenschaften-Fenster .................. 291.3.3 Codefenster .................................................................. 30

1.4 Makrocode verstehen und ändern ............................................... 311.5 Makro per Schaltfläche ausführen ................................................ 331.6 Relative Aufzeichnung ................................................................. 341.7 Persönliche Makroarbeitsmappe .................................................. 361.8 Code schreiben, einfache Ausgabe ............................................... 38

1.8.1 Eigene Sub-Prozedur ..................................................... 381.8.2 Ausgabe in Zelle ............................................................ 391.8.3 Ausgabe in Nachrichtenbox ........................................... 401.8.4 Ausgabe im Direktfenster des VBE ................................ 41

1.9 Arbeiten mit Excel vor der Version 2007 ...................................... 411.9.1 Makro aufzeichnen ....................................................... 421.9.2 Makro ausführen ........................................................... 421.9.3 Makro ansehen ............................................................. 421.9.4 Makro speichern ........................................................... 431.9.5 Makrosicherheit ............................................................ 431.9.6 Symbolleiste »Visual Basic« ........................................... 441.9.7 Entwicklungsumgebung Visual Basic Editor ................... 441.9.8 Persönliche Makroarbeitsmappe ................................... 44

Page 7: Einstieg Mit VBA in Excel

Inhalt

6

2 Grundlagen von Objekten und Ereignissen ................................. 45

2.1 Objekthierarchie und Auflistungen ............................................... 452.2 Arbeitsmappen ............................................................................ 46

2.2.1 Anzahl Arbeitsmappen ermitteln ................................... 472.2.2 Neue Arbeitsmappe erzeugen ....................................... 472.2.3 Vorhandene Arbeitsmappe öffnen ................................. 482.2.4 Alle Arbeitsmappen schließen ....................................... 482.2.5 Name einer Arbeitsmappe ermitteln ............................. 492.2.6 Aktive Arbeitsmappe ..................................................... 502.2.7 Arbeitsmappe aktivieren ............................................... 512.2.8 Arbeitsmappe speichern ................................................ 512.2.9 Arbeitsmappe über Index oder Name auswählen ........... 522.2.10 Pfad einer Arbeitsmappe ermitteln ................................ 53

2.3 Tabellenblätter ............................................................................ 552.3.1 Tabellenblatt erzeugen .................................................. 552.3.2 Tabellenblatt kopieren .................................................. 562.3.3 Tabellenblatt verschieben .............................................. 572.3.4 Tabellenblatt löschen .................................................... 582.3.5 Tabellenblatt aktivieren ................................................. 582.3.6 Tabellenblatt formatieren .............................................. 592.3.7 Gitternetz, Zeilen- und Spaltenüberschrift ..................... 592.3.8 Seiteneinrichtung .......................................................... 60

2.4 Zellen und Zellbereiche ................................................................ 622.4.1 Zellen über »Range« auswählen ..................................... 632.4.2 Zellen über »Cells« auswählen ....................................... 652.4.3 Zellinhalte verschieben oder kopieren ........................... 662.4.4 Teile von Zellinhalten kopieren ..................................... 672.4.5 Zellinhalt löschen .......................................................... 682.4.6 Werte und Formeln eintragen ....................................... 692.4.7 Zellformat »Zahlen« ....................................................... 702.4.8 Zellformat »Ausrichtung« ............................................... 722.4.9 Zellformat »Schrift« ....................................................... 732.4.10 Einzelne Zeichen formatieren ........................................ 742.4.11 Zellformat »Rahmen« .................................................... 752.4.12 Zellformat »Muster« ...................................................... 762.4.13 Zellen einfügen ............................................................. 772.4.14 Zellen löschen ............................................................... 782.4.15 Zeilenhöhe und Spaltenbreite ....................................... 792.4.16 Benutzten Zellbereich erkennen .................................... 802.4.17 Spezielle Zellen erkennen .............................................. 81

Page 8: Einstieg Mit VBA in Excel

Inhalt

7

2.4.18 Versatz mit Offset ......................................................... 832.4.19 Zellbereich sortieren ..................................................... 85

2.5 Ereignisprozeduren ...................................................................... 882.5.1 Arbeitsmappe wird geöffnet .......................................... 892.5.2 Arbeitsmappe wird geschlossen .................................... 892.5.3 Tabellenblatt wird aktiviert ........................................... 902.5.4 Zellauswahl wechselt .................................................... 902.5.5 Doppelklick auf Zelle .................................................... 912.5.6 Tabellenblatt wurde neu berechnet ............................... 91

3 Grundlagen der Programmierung mit VBA .................................. 93

3.1 Allgemeines ................................................................................. 933.1.1 Codeblöcke auskommentieren ...................................... 943.1.2 Zeilen zerlegen .............................................................. 95

3.2 Variablen und Datentypen ........................................................... 963.2.1 Namen, Werte ................................................................ 963.2.2 Deklarationen ............................................................... 963.2.3 Datentypen ................................................................... 973.2.4 Konstanten ................................................................... 101

3.3 Operatoren .................................................................................. 1023.3.1 Arithmetische Operatoren ............................................. 1033.3.2 Vergleichsoperatoren .................................................... 1063.3.3 Logische Operatoren ..................................................... 1083.3.4 Verkettungsoperator ..................................................... 1093.3.5 Rangfolge der Operatoren ............................................. 110

3.4 Verzweigungen ............................................................................ 1113.4.1 Einzeiliges If … Then … Else ......................................... 1123.4.2 If-Then-Else-Block ......................................................... 1123.4.3 Select Case .................................................................... 114

3.5 Schleifen ...................................................................................... 1163.5.1 For-Next-Schleife .......................................................... 1163.5.2 Do-Loop-Schleife .......................................................... 120

4 Fehlerbehandlung ............................................................................. 125

4.1 Syntaxfehler ................................................................................. 1254.2 Laufzeitfehler ............................................................................... 126

4.2.1 Programm mit Laufzeitfehlern ....................................... 1264.2.2 Abfangen mit On Error .................................................. 128

Page 9: Einstieg Mit VBA in Excel

Inhalt

8

4.3 Logische Fehler und Debugging ................................................... 1304.3.1 Einzelschrittverfahren .................................................... 1304.3.2 Haltepunkte .................................................................. 132

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

5.1 Gültigkeitsbereiche ...................................................................... 1335.2 Datenfelder ................................................................................. 135

5.2.1 Eindimensionale Datenfelder ......................................... 1365.2.2 Mehrdimensionale Datenfelder ..................................... 1385.2.3 Dynamische Datenfelder ............................................... 1405.2.4 Datenfelder löschen oder freigeben ............................... 142

5.3 Prozeduren und Funktionen ......................................................... 1445.3.1 Prozeduren ................................................................... 1445.3.2 Übergabe von Parametern ............................................. 1475.3.3 Funktionen ................................................................... 1495.3.4 Optionale Parameter ..................................................... 1525.3.5 Benannte Parameter ...................................................... 1545.3.6 Beliebig viele Parameter ................................................ 1565.3.7 Datenfelder als Parameter ............................................. 158

5.4 Benutzerdefinierter Datentyp ....................................................... 1595.5 Modular programmieren .............................................................. 162

5.5.1 Code in der gleichen Datei ............................................ 1625.5.2 Code in einer anderen Datei ......................................... 163

5.6 Module exportieren und importieren ........................................... 1655.6.1 Export eines Moduls ..................................................... 1655.6.2 Import eines Moduls ..................................................... 166

6 Mehr über Objekte ........................................................................... 167

6.1 Objektkatalog .............................................................................. 1676.2 Referenzierung von Objekten ....................................................... 168

6.2.1 Beispiel »Zellen verschieben« ........................................ 1696.3 Objektzugriff mit With ................................................................. 1706.4 Arbeiten mit Objektvariablen ....................................................... 171

6.4.1 Objektvariablen hierarchisch zuweisen .......................... 1736.4.2 Neue Objekte erzeugen ................................................ 1746.4.3 Objekttyp ermitteln ...................................................... 174

6.5 For-Each-Schleife ......................................................................... 1766.6 Collections ................................................................................... 178

Page 10: Einstieg Mit VBA in Excel

Inhalt

9

6.7 Hauptobjekt »Application« ........................................................... 1796.7.1 Anwendungspfad ausgeben ........................................... 1796.7.2 Prozedur zeitverzögert aufrufen ..................................... 1806.7.3 Anwendung Microsoft Excel schließen .......................... 181

6.8 Filtern .......................................................................................... 181

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

7.1 Diagramm erstellen ...................................................................... 1867.1.1 Diagrammblatt erstellen ................................................ 1867.1.2 Eingebettetes Diagramm erstellen ................................. 188

7.2 Diagramm ändern ........................................................................ 1907.2.1 Diagrammblatt ändern .................................................. 1907.2.2 Eingebettetes Diagramm ändern ................................... 194

7.3 Diagramm verwalten .................................................................... 1957.3.1 Diagrammblatt verwalten .............................................. 1957.3.2 Eingebettetes Diagramm verwalten ............................... 197

7.4 Beispiel: Formatiertes Kreisdiagramm .......................................... 1987.5 Shapes ......................................................................................... 201

7.5.1 Rechteck ....................................................................... 2017.5.2 Oval .............................................................................. 2037.5.3 Linie ............................................................................. 2047.5.4 Verbinder ...................................................................... 2057.5.5 Freiform ........................................................................ 2077.5.6 Alle Formen .................................................................. 210

7.6 WordArt ...................................................................................... 2127.7 Bedingte Formatierungen ............................................................ 214

7.7.1 Datenbalken ................................................................. 2147.7.2 Zweifarbige Farbskala .................................................... 2157.7.3 Dreifarbige Farbskala ..................................................... 2177.7.4 Symbolsatz .................................................................... 218

7.8 Sparklines .................................................................................... 2207.8.1 Linie ............................................................................. 2207.8.2 Spalte ........................................................................... 2217.8.3 Gewinn/Verlust-Anzeige ............................................... 2227.8.4 Formatierung ................................................................ 2227.8.5 Alle Farben ................................................................... 223

7.9 SmartArt ...................................................................................... 224

Page 11: Einstieg Mit VBA in Excel

Inhalt

10

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

8.1 Eingaben des Benutzers ............................................................... 2288.1.1 Funktion »InputBox« ..................................................... 2298.1.2 Methode »Application.InputBox« .................................. 229

8.2 Einfacher Dialog mit dem Benutzer .............................................. 2338.2.1 Button »OK« ................................................................. 2338.2.2 Buttons – eine Übersicht ............................................... 2348.2.3 Zeichen »Information« ................................................... 2358.2.4 System-modal ............................................................... 2358.2.5 Buttons »Ja« und »Nein« ............................................... 2368.2.6 Drei Buttons, Default-Button ........................................ 2378.2.7 Buttons »Wiederholen« und »Abbrechen« ..................... 2388.2.8 Buttons »Abbrechen«, »Wiederholen« und

»Ignorieren« .................................................................. 2388.3 Zeichenketten .............................................................................. 239

8.3.1 Zeichenketten umwandeln ............................................ 2418.3.2 Ausgabeformatierung .................................................... 2428.3.3 Datensätze zusammenfügen .......................................... 2458.3.4 Datensätze zerlegen ...................................................... 246

8.4 Datum und Uhrzeit ...................................................................... 2478.4.1 Zeitintervall addieren .................................................... 2478.4.2 Zeitdifferenz berechnen ................................................ 2488.4.3 Datumsangaben erstellen, Wochentage markieren ........ 2488.4.4 Jahreskalender .............................................................. 249

8.5 Weitere Funktionen ..................................................................... 2528.5.1 Anwendung unterbrechen ............................................. 2528.5.2 Einheitenumrechnung ................................................... 2538.5.3 Zahlensystemumrechnung ............................................. 2558.5.4 Zellen zählen ................................................................. 256

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

9.1 Textdateien, Import und Export ................................................... 2599.1.1 Lesen aus Textdateien ................................................... 2599.1.2 Import von Datensätzen ................................................ 2619.1.3 Schreiben in Textdateien ............................................... 2639.1.4 Export von Datensätzen ................................................ 265

9.2 Arbeiten mit Dateien ................................................................... 2669.2.1 Dateien suchen und auflisten ........................................ 2669.2.2 Informationen über Dateien .......................................... 2689.2.3 Operationen mit Dateien .............................................. 270

Page 12: Einstieg Mit VBA in Excel

Inhalt

11

9.3 Austausch mit Microsoft Word .................................................... 2729.3.1 Objektmodell von Word ............................................... 2729.3.2 Import von Absätzen aus Word ..................................... 2739.3.3 Import von Tabellen aus Word ...................................... 2759.3.4 Export zu Word, Erstellen von Absätzen ........................ 2779.3.5 Export zu Word, Erstellen von Tabellen ......................... 279

9.4 Austausch mit Microsoft Outlook ................................................ 2819.4.1 Objektmodell von Outlook ........................................... 2829.4.2 Einfaches Versenden einer Arbeitsmappe ...................... 2839.4.3 Integriertes E-Mail-Dialogfeld ....................................... 2859.4.4 Zusammensetzen einer E-Mail ....................................... 2869.4.5 Erstellen einer Serien-E-Mail ......................................... 2889.4.6 Bestimmten Bereich in E-Mail versenden ...................... 2899.4.7 Zugriff auf Outlook-Verzeichnis ..................................... 2919.4.8 Zugriff auf E-Mail-Anhänge ........................................... 2939.4.9 Zugriff auf Kontakte ...................................................... 2959.4.10 Kontakt erzeugen .......................................................... 2969.4.11 Termin erzeugen ........................................................... 2979.4.12 Terminserie erzeugen .................................................... 298

9.5 Austausch mit Microsoft Access ................................................... 3009.5.1 Beispiel-Datenbank: Aufbau .......................................... 3019.5.2 Beispiel-Datenbank: Verbindung herstellen ................... 3019.5.3 SQL-Befehle .................................................................. 3029.5.4 Beispiel-Datenbank: Auswahlabfrage ............................ 3039.5.5 Beispiel-Datenbank: Aktionsabfrage .............................. 3059.5.6 SQL: Auswahlabfragen mit SELECT ................................ 3079.5.7 SQL: Operatoren ........................................................... 3089.5.8 SQL: Abfrageergebnis sortieren ..................................... 3109.5.9 SQL: Auswahlabfragen zur Suche nach Eingabe ............. 3119.5.10 SQL: Aktionsabfrage zum Ändern mit UPDATE ............. 3129.5.11 SQL: Aktionsabfrage zum Einfügen mit INSERT ............. 3149.5.12 SQL: Aktionsabfrage zum Löschen mit DELETE .............. 315

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

10.1 Integrierte Dialogfelder ................................................................ 31710.1.1 Datei öffnen .................................................................. 31810.1.2 Datei speichern unter .................................................... 31910.1.3 Muster für Zellbereich auswählen .................................. 31910.1.4 Schriftformatierung für Zellbereich auswählen ............... 320

Page 13: Einstieg Mit VBA in Excel

Inhalt

12

10.2 Eigene Dialogfelder und Anwendungen ....................................... 32110.2.1 Ein erstes Beispiel ......................................................... 32110.2.2 Erstes Beispiel: Gestaltung ............................................. 32110.2.3 Erstes Beispiel: Code ..................................................... 32310.2.4 Erstes Beispiel: Starten .................................................. 32410.2.5 Arbeiten mit Steuerelementen ...................................... 32510.2.6 Textfeld und Bezeichnungsfeld ...................................... 32710.2.7 Optionsschaltflächen und Kontrollkästchen ................... 32810.2.8 Liste, Bildlaufleiste und Drehfeld ................................... 33210.2.9 Ausgabeformatierung .................................................... 33510.2.10 RefEdit und Umschaltfeld .............................................. 337

11 Beispielprojekt .................................................................................. 341

11.1 Was ist Nordwind? ...................................................................... 34111.2 Vorbereitungen für das Projekt .................................................... 342

11.2.1 Tabelle »Kunden« .......................................................... 34311.2.2 Tabelle »Artikel« ........................................................... 34311.2.3 Restliche Vorbereitungen .............................................. 344

11.3 Benutzung des Programms ........................................................... 34411.3.1 Hauptdialogfeld »Nordwind« ......................................... 34511.3.2 Unterdialogfeld »Kunden Neu« ..................................... 34511.3.3 Unterdialogfeld »Kunden Ändern« ................................ 34611.3.4 Unterdialogfeld »Artikel Neu« ....................................... 34811.3.5 Unterdialogfeld »Artikel Ändern« .................................. 34911.3.6 Unterdialogfeld »Bestellungen Neu« .............................. 350

11.4 Entwicklung des Programms ........................................................ 35311.4.1 Das VBA-Projekt ........................................................... 35311.4.2 Die Arbeitsmappe ......................................................... 35311.4.3 Das gemeinsame Modul ................................................ 35411.4.4 Hauptdialogfeld »Nordwind« ......................................... 35411.4.5 Unterdialogfeld »Kunden Neu« ..................................... 35611.4.6 Unterdialogfeld »Kunden Ändern« ................................ 36011.4.7 Unterdialogfeld »Artikel Neu« ....................................... 36611.4.8 Unterdialogfeld »Artikel Ändern« .................................. 37111.4.9 Unterdialogfeld »Bestellungen Neu« .............................. 377

Lösungen ................................................................................................... 387

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

Page 14: Einstieg Mit VBA in Excel

13

Geleitwort des Fachgutachters

Seit der Version 95, welche im August 1995 erschienen ist, bietet Micro-soft Excel Anwendern die Möglichkeit in VBA (Visual Basic for Applica-tions) zu programmieren und es auf diese Weise ihren Bedürfnissenanzupassen. Um die ersten, wichtigen Schritte beruhigt gehen zu kön-nen, ist eine gute Wegbegleitung dabei unverzichtbar.

Die VBA-gestützte Steuerung und Erweiterung gewährleistet größtmögli-che Flexibilität und optimale Anpassungsfähigkeit. Durch die Verwen-dung von Visual Basic for Applications neben den bereits in Excel inte-grierten Funktionen erschließen sich völlig neue Anwendungsbereicheund Möglichkeiten. Excel-Tabellen lassen sich dynamisieren und auto-matisieren, eigene Funktionen können erstellt werden und stehen damituneingeschränkt zur Verfügung. Die Liste der Möglichkeiten könnte andieser Stelle beliebig weitergeführt werden.

Zum Einstieg in VBA bietet Excel den sogenannten Makro-Rekorder, mitdessen Hilfe sich schnell und fast ohne jegliche Programmierkenntnisseschon respektable Ergebnisse erzielen lassen. Wenn es allerdings darumgeht, eigene benutzerdefinierte Eingabemöglichkeiten wie die einfacheAbfrage eines Wertes oder gar eigene Dialogfenster mit mehreren Ein-gabe- und Auswahlmöglichkeiten zu erstellen, dann kommen Sie ohneVBA und entsprechend tiefgreifendere Programmierkenntnisse nichtweiter. Wichtig in diesem Zusammenhang ist ein umfangreiches Wissenüber das Objektmodell von Excel und über grundlegende Programmier-logiken wie beispielsweise If-Abfragen, Programmverzweigungen undSchleifen. Darüber hinaus muss der VBA-Programmierer überblicken,welchen Befehlssatz Microsoft Office und insbesondere Microsoft Excelzur Verfügung stellt und wie dieser angesprochen werden kann.

Genau hier setzt nun das vorliegende Buch von Thomas Theis an, indemes ganz speziell auf die Bedürfnisse von VBA-Einsteigern eingeht. DiesesBuch führt Sie Schritt für Schritt an die VBA-Programmierung heran.Beginnend mit grundlegenden Themen wie dem Umgang mit dem VBA-Editor bis hin zur Programmierung von eigenen Dialogfenstern werdendie Möglichkeiten von VBA sehr klar und übersichtlich dargestellt. Indiesem Buch ist der schwierige Spagat zwischen verständlicher Schreib-

Page 15: Einstieg Mit VBA in Excel

14

Geleitwort des Fachgutachters

weise, klarer Themenstruktur und detaillierter Erläuterung sehr gutgelungen. Darüber hinaus wird Gelerntes in Übungsaufgaben vertieftund damit gefestigt.

Aber auch fortgeschrittene Anwender und VBA-Entwickler können vondiesem Werk profitieren. Durch den konsequent objektorientierten Auf-bau des Buches lässt sich dieses auch sehr schön als Praxis-Nachschlage-werk verwenden. Alle relevanten Stichwörter und VBA-Befehle befindensich jeweils am Seitenrand, wodurch ein schneller Zugriff auf sämtlicheThemen ermöglicht wird.

An diesem Buch gefällt mir besonders gut, dass sich mit Hilfe derbeschriebenen Programmierbeispiele die Theorie schnell und verständ-lich in die Praxis umsetzen lässt. Neben der verständlichen Darstellungvon theoretischen Zusammenhängen geht Herr Theis den Weg, anhandvon einzelnen kleineren Praxisbeispielen alle relevanten VBA-Befehle zuerklären und deren Funktionsweise zu erläutern. So lernt der EinsteigerStep by Step die Möglichkeiten von VBA kennen und anzuwenden.

Zu guter Letzt bleibt mir nur zu sagen, dass ich dieses Buch als einrundum gelungenes Werk all denen empfehlen kann, die sich näher mitder Thematik VBA rund um Microsoft Excel auseinander setzen möchtenund schnell und unkompliziert in diese Materie eintauchen wollen.

Alois EcklEckl-IT-ConsultingController, Consultant und VBA-Entwickler

Page 16: Einstieg Mit VBA in Excel

15

In diesem Kapitel lernen Sie erste VBA-Makros kennen. Sie erfahren, wie sie aufgebaut sind und wie man sie verändern kann. Außerdem wird die Entwicklungsumgebung für VBA erläutert.

1 Einführung

VBADie Abkürzung VBA steht für Visual Basic for Applications. Es handelt sichdabei um die Programmiersprache Visual Basic, mit speziellen Ergänzun-gen für die verschiedenen Anwendungen in Microsoft Office.

Mit Microsoft Excel können sehr viele alltägliche Aufgaben im beruf-lichen und privaten Bereich bereits gut bewältigt werden. Es gibt jedoch:

� Aufgaben, die man nur durch zusätzliche Programmierung mit VBAlösen kann

� Probleme, die durch zusätzliche Programmierung mit VBA schnellergelöst werden können

In diesem Buch werden Sie anhand von leicht verständlichen Beispielenerlernen, wie man VBA als Ergänzung zu Excel sinnvoll einsetzt. EigeneÜbungen (mit den Lösungen im Anhang) dienen dazu, Ihren Wissens-stand zu testen.

Für die Hilfe bei der Erstellung dieses Buchs bedanke ich mich bei AloisEckl, Petra Biedermann und dem ganzen Team von Galileo, ganz beson-ders bei Christine Siedle.

1.1 Was wird besser durch Makros und VBA?

MakroEin einfaches Makro ist nur eine Reihe von Anweisungen, die nacheinan-der ausgeführt werden. Durch eine solche Anweisung wird in Excel einbestimmter Vorgang ausgeführt, z. B. eine Zahl in eine Tabellenzellegeschrieben. Die Anweisungen sind in der Sprache VBA geschrieben.VBA-Programme können weit über einfache Makros hinausgehen undkomplexe Abläufe steuern.

Page 17: Einstieg Mit VBA in Excel

16

Einführung1

In der Praxis sieht es häufig so aus, dass es zwei Gruppen von Anwen-dern gibt:

Entwickler � Entwickler, also erfahrene Excel-Anwender, die sich mit der Entwick-lung von komplexen Excel-Anwendungen befassen

Benutzer � Benutzer, also Einsteiger in Excel, die sich nur mit einfachen Themen,z. B. der Dateneingabe und dem Aufruf der Excel-Anwendungenbefassen

Die Entwickler sind die Auftragnehmer der Benutzer. Die Entwicklungkann in einer anderen Abteilung des gleichen Unternehmens stattfinden.Es kann sich aber auch um externe, eingekaufte Excel-Anwendungenhandeln.

Schneller Eine schnellere Problemlösung durch VBA ergibt sich, weil:

� der Entwickler durch die Programmierung mit VBA schneller mit derEntwicklung seiner Excel-Anwendung fertig sein kann.

� die Ergebnisse für den Benutzer schneller berechnet werden können.

Es folgen einige typische Szenarien, die Ihnen zeigen sollen, wozu manVBA nutzen kann und welche Vorteile sich daraus ergeben:

GroßeDatenmengen

� Es sollen große Mengen an Daten aus einer Textdatei eingelesen wer-den. Nur der Aufbau der Daten ist bekannt, nicht aber die Menge.Außerdem sollen abhängig vom aktuellen Inhalt der Textdatei nurbestimmte Daten gelesen werden. Nach dem Einlesen sollen dieDaten verarbeitet, formatiert, zusammengefasst und zur Verdeutli-chung grafisch dargestellt werden.

Diagramme � Es soll ein Diagramm aus einer Tabelle erstellt werden. Die aktuelleGröße und der Inhalt der Tabelle sollen die Art des Diagramms undseine Darstellung bestimmen.

Dialogfelder � Der Benutzer soll nach Aufruf der Excel-Anwendung ein Dialogfeldvor sich haben. Darin nimmt er, abhängig von der aktuellen Situation,bestimmte Einstellungen vor, trifft die gewünschte Auswahl derDaten und startet dann deren weitere Verarbeitung.

WiederkehrendeDaten

� Es ergeben sich regelmäßig (z. B. jede Woche oder jeden Monat)Daten, die auf ähnliche (nicht identische) Art und Weise weiterverar-beitet werden müssen.

SchrittweiseBearbeitung

� Die Verarbeitung bestimmter Daten ist komplex und muss in mehre-ren Schritten erfolgen. Mit VBA kann man die Koordination und dieDurchführung der einzelnen Schritte vereinfachen.

Page 18: Einstieg Mit VBA in Excel

17

Arbeiten mit Makros 1.2

Excel anpassen� Dem Benutzer sollen nach Aufruf von Excel nur bestimmte Funktio-nalitäten zur Verfügung stehen. Sein Excel kann durch VBA gleichzeitig:

� eingeschränkt werden, wodurch es im Idealfall zu weniger Fehlbe-dienungen kommt.

� erweitert werden; dadurch stehen ihm spezielle Funktionen undAbläufe zur Verfügung, die über Excel hinausgehen.

Anwendungen erweitern

� Es sollen bereits vorhandene (von anderen Entwicklern im Unterneh-men erstellte oder eingekaufte) Excel-Anwendungen geändert werden.Diese werden zur Bewältigung der laufenden Geschäftsprozesse bereitsregelmäßig eingesetzt. Da sich diese Prozesse geändert haben, müssenauch die Excel-Anwendungen erweitert und angepasst werden.

In diesem Buch sollen verschiedene Möglichkeiten zur Problemlösungmit VBA anhand von Beispielen aus der Praxis gezeigt werden. Es erhebtnicht den Anspruch, alle Bestandteile von VBA (also alle Objekte derObjektbibliothek mit all ihren Eigenschaften und Methoden) aufzulistenund zu erläutern. Dazu gibt es zu viele, und Sie würden schnell den Über-blick verlieren. Es wird jedoch eine umfangreiche Auswahl getroffen, diees Ihnen ermöglicht, selbständig mit VBA zu arbeiten.

Verständliche Beispiele

Bei den Beispielen im Buch wird eher Wert auf Verständlichkeit als aufKomplexität gelegt. Sie sollen schnell den aktuell neuen Aspekt der Pro-grammierung verstehen und nicht durch umfangreiche, komplizierte Bei-spiele, in denen sich nur eine kleine Neuigkeit verbirgt, verwirrt werden.

1.2 Arbeiten mit Makros

Zu Beginn erstellen wir ein einfaches Makro. Dieses Makro soll anschlie-ßend ausgeführt werden. Anschließend betrachten wir den Code, umeinen ersten Blick auf VBA werfen zu können.

Schädliche MakrosDas Thema Makrosicherheit, also die Sicherheit vor fremden Makros, dieschädlichen Code enthalten können, spielt eine große Rolle. Diese The-matik wird in Abschnitt 1.2.5, »Makrosicherheit ändern«, erläutert.

Excel-Dateien können in Excel 2010 (und auch schon in Excel 2007)sowohl mit als auch ohne Makros gespeichert werden. Darauf wird inAbschnitt 1.2.4, »Makro speichern«, eingegangen.

Die in diesem Kapitel erläuterte Bedienung gilt für Excel 2010. UnterExcel 2007 gibt es leichte Abweichungen in der Bedienung, darauf wird

Page 19: Einstieg Mit VBA in Excel

18

Einführung1

an den entsprechenden Stellen jeweils gesondert hingewiesen. In denExcel-Versionen vor Excel 2007 gibt es größere Abweichungen in derBedienung, die in einem eigenen Abschnitt (1.9) erläutert werden.

Die weitaus meisten Beispiele in diesem Buch laufen auch unter Excel2007 und unter älteren Versionen. Falls einzelne Beispiele des Buchsanders oder gar nicht laufen, wird dies an der betreffenden Stelle erläu-tert. Sämtliche Beispiele finden Sie – getrennt für die Versionen vor undab 2007 – auch auf der Buch-CD.

1.2.1 Makro aufzeichnen

Mit Hilfe der folgenden Beschreibung erstellen Sie ein Makro, um denInhalt der Zelle A1 in die Zelle C1 zu verschieben. Dazu benötigt mannatürlich kein VBA, es dient aber zur ersten Verdeutlichung der Abläufe.

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 But-ton Makros in der Registerkarte Ansicht auf.

5. Wählen Sie den Menüpunkt Makro aufzeichnen.

6. Es erscheint das Dialogfeld Makro aufzeichnen (siehe Abbildung1.2).

Page 20: Einstieg Mit VBA in Excel

19

Arbeiten mit Makros 1.2

Abbildung 1.2 Makro mit dem Namen »Makro1«

7. Der vorgeschlagene Makroname ist Makro1, dieser kann beibehaltenwerden.

8. Betätigen Sie den Button OK.

9. Ab jetzt werden alle Aktionen, die Sie ausführen, aufgezeichnet.

10. Wählen Sie die Zelle A1 aus.

11. Schneiden Sie die Zelle A1 aus.

12. Wählen Sie die Zelle C1 aus.

13. Fügen Sie die Zelle A1 ein.

Aufzeichnung beginnt

14. Der Inhalt der Zelle A1 wurde nach C1 verschoben (siehe Abbildung1.3).

15. Klappen Sie wiederum das Menü über den Pfeil am Button Makros

in der Registerkarte Ansicht auf.

16. Wählen Sie den Menüpunkt 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.

Page 21: Einstieg Mit VBA in Excel

20

Einführung1

Abbildung 1.3 Zellen nach der Verschiebung

Symbol zumAufzeichnen

Das Aufzeichnen geht etwas schneller, wenn Sie in der Excel-Oberflächedas entsprechende Symbol in der Statusleiste betätigen (siehe Abbildung1.4).

Abbildung 1.4 Symbol zum Starten einer Makro-Aufzeichnung

Nach Beginn der Aufzeichnung erscheint an der gleichen Stelle das Sym-bol 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 einMakro auf, das den Inhalt der Zelle E3 in die Zelle E5 kopiert. Nennen Siedas Makro KopieE3E5.

Page 22: Einstieg Mit VBA in Excel

21

Arbeiten mit Makros 1.2

1.2.2 Makro ausführen

Makro startenDas soeben erstellte Makro soll nun ausgeführt werden. Gehen Sie dazuwie 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 aufder Registerkarte Ansicht auf.

� Wählen Sie den Menüpunkt Makros anzeigen.

� Es erscheint das Dialogfeld Makro mit einer Liste der bisher erstell-ten Makros.

� Wählen Sie in der Liste das Makro Makro1 aus.

� Betätigen Sie den Button Ausführen.

� Der Inhalt der Zelle A1 wurde wiederum nach C1 verschoben.

Damit haben Sie Ihr erstes Makro dann auch erfolgreich ausgeführt.

Name des Makros

1.2.3 Makro ansehen

VBA-CodeSie können sich den VBA-Code des soeben erstellten Makros ansehen,um einen ersten Eindruck von typischem VBA zu bekommen. Gehen Siedazu wie folgt vor:

� Klappen Sie das Menü über den Pfeil am Button Makros in der Regis-terkarte Ansicht auf.

� Wählen Sie den Menüpunkt Makros anzeigen.

� Es erscheint das Dialogfeld Makro mit einer Liste der bisher erstell-ten Makros.

� Wählen Sie in der Liste das Makro Makro1 aus.

� Betätigen Sie den Button Bearbeiten.

Übung 1 B

Tragen Sie einen neuen Inhalt in die Zelle E3 ein. Führen Sie das MakroKopieE3E5 aus, und überprüfen Sie das Ergebnis auf Richtigkeit.

Hinweis

Ein Makro sollte einen möglichst sprechenden Namen haben, der etwasüber seine Arbeitsweise aussagt. Es kann dann beim Aufruf leichter aus derListe der Makros ausgewählt werden.

Page 23: Einstieg Mit VBA in Excel

22

Einführung1

Visual Basic Editor Es erscheint der Visual Basic Editor (VBE), die eigentliche Entwicklungs-umgebung. Auf seine einzelnen Elemente wird in Abschnitt 1.3, »Ent-wicklungsumgebung ›Visual Basic Editor‹«, eingegangen. Zunächst ist imrechten Fenster der Code des Makros zu sehen (Abbildung 1.6).

Abbildung 1.6 VBA-Code des Makros »Makro1«

Es folgt eine kurze Erläuterung der einzelnen Zeilen. Es macht nichts,wenn Sie noch nicht alles genau verstehen, die einzelnen Code-Elementewerden später noch ausführlicher erläutert.

Sub ... End Sub � Der Code des Makros Makro1 ist innerhalb einer Sub-Prozedur zwi-schen Sub und End Sub notiert.

Kommentar � Ein Apostroph dient dazu, eine ganze Zeile bzw. den Rest einer Zeilezu einem Kommentar zu machen. Der Text hinter einem Apostrophdient nur zur Erläuterung des VBA-Codes. Er wird nicht ausgeführt.

� Range("A1").Select bedeutet: Es wird die Zelle A1 ausgewählt.

Cut � Selection.Cut bedeutet: Der Inhalt der aktuellen Auswahl, also derInhalt der Zelle A1, wird ausgeschnitten und befindet sich anschlie-ßend in der Zwischenablage.

� Range("C1").Select bedeutet: Die Zelle C1 wird ausgewählt, sieheoben.

Paste � ActiveSheet.Paste bedeutet: Der Inhalt der Zwischenablage wird indas aktuell aktive Tabellenblatt eingefügt.

Der Inhalt der Zelle A1 wurde nach C1 verschoben.

Page 24: Einstieg Mit VBA in Excel

23

Arbeiten mit Makros 1.2

Schließen Sie den Visual Basic Editor über das Menü Datei � Schliessen

und zurück zu Microsoft Excel. Es erscheint die Excel-Oberfläche.

1.2.4 Makro speichern

Excel-Dateien können seit Excel 2007 mit Makros oder ohne Makrosgespeichert werden.

Dateiendung xlsxRufen Sie in Excel 2010 das Menü Datei (unter Excel 2007 die Schaltflä-che Office) auf und darin den Menüpunkt Speichern. Es erscheint dasDialogfeld Speichern unter. Als Dateityp ist Excel-Arbeitsmappe mit derDateiendung .xlsx angegeben (siehe Abbildung 1.7).

Abbildung 1.7 Speichern als Arbeitsmappe ohne Makros

Falls Sie nun den Button Speichern betätigen, erscheint der Hinweis,dass die in dieser Datei enthaltenen Makros bei diesem Dateityp nichtmitgespeichert werden. Sie würden also verlorengehen.

Abbildung 1.8 Warnung, dass enthaltene Makros nicht mitgespeichert werden

Übung 1 C

Interpretieren Sie den VBA-Code des Makros KopieE3E5:

Sub KopieE3E5()Range("E3").SelectSelection.CopyRange("E5").SelectActiveSheet.Paste

End Sub

Page 25: Einstieg Mit VBA in Excel

24

Einführung1

Dateiendung xlsm Zur Speicherung mit Makros sollten Sie daher den Button Nein betäti-gen, im Dialogfeld Speichern unter als Dateityp die Option Excel-Arbeitsmappe mit Makros mit der Dateiendung .xlsm auswählen undanschließend mit dem gewünschten Namen im gewünschten Verzeichnisspeichern, z. B. C:\Temp\Mappe1.xlsm.

Abbildung 1.9 Speichern als Arbeitsmappe mit Makros

Nachdem die Datei erfolgreich mit Makros gespeichert wurde, könnenSie Excel jetzt schließen.

1.2.5 Makrosicherheit ändern

Starten Sie Excel erneut. Falls Sie nun die soeben gespeicherte Dateierneut öffnen, stoßen Sie unweigerlich auf das Thema Makrosicherheit.Was bedeutet das?

Sicherheits-warnung

Excel 2010 (wie auch die Vorgängerversionen) möchte Sie davor bewah-ren, möglicherweise schädlichen VBA-Code auszuführen. Unterhalb derMultifunktionsleiste erscheint daher eine Sicherheitswarnung mit demHinweis, dass die in dieser Datei enthaltenen Makros deaktiviert wurden(siehe Abbildung 1.10).

Abbildung 1.10 Sicherheitswarnung »Makros wurden deaktiviert.«

Makrosdeaktiviert

Diese Reaktion erfolgt aufgrund der folgenden Standardeinstellung fürdie Makrosicherheit in Excel: Alle Makros mit Benachrichtigung deakti-vieren. Falls Sie versuchen, ein Makro auszuführen, erscheint die Infor-mation, dass dies nicht möglich ist.

Page 26: Einstieg Mit VBA in Excel

25

Arbeiten mit Makros 1.2

Abbildung 1.11 Hinweis: Makro-Ausführung nicht möglich

Aktivieren von Makros

Sie haben die Möglichkeit, die in dieser Datei enthaltenen Makros zuaktivieren. Damit wird unter Excel 2010 die Datei in die Liste der ver-trauenswürdigen Dokumente aufgenommen, unter Excel 2007 werdendie Makros in dieser Datei einmalig aktiviert. Dazu führen Sie Folgendesdurch:

1. Schließen Sie die Datei.

2. Öffnen Sie sie erneut.

3a. Unter Excel 2010 betätigen Sie den Button Inhalt aktivieren (nebender Sicherheitswarnung, siehe Abbildung 1.10).

3b. Unter Excel 2007 betätigen Sie den Button Optionen und wählenanschließend die Option Diesen Inhalt aktivieren.

Anschließend verschwindet die Sicherheitswarnung, und Sie könnenMakros ausführen. Unter Excel 2007 erscheint die Sicherheitswarnungallerdings beim nächsten Öffnen der Datei wieder. Man kann auch alleExcel-Dateien in einem Verzeichnis für dauerhaft vertrauenswürdigerklären, siehe Abschnitt 1.2.7.

1.2.6 Registerkarte »Entwicklertools«

Excel-OptionenDie Registerkarte Entwicklertools bietet weitergehende Möglichkeitenzur Erstellung und Verwaltung von Makros. Daher sollten Sie sie dauer-haft in Excel einblenden.

Unter Excel 2010 rufen Sie dazu das Menü Datei auf und betätigen dieSchaltfläche Optionen. Im Dialogfeld Excel-Optionen betätigen Sie dieSchaltfläche Menüband anpassen. Auf der rechten Seite markieren Siedie Hauptregisterkarte Entwicklertools (siehe Abbildung 1.12 für Excel2010).

Unter Excel 2007 betätigen Sie die Schaltfläche Office und dort den But-ton Excel-Optionen. In der Kategorie Häufig verwendet aktivieren SieEntwicklerregisterkarte in der Multifunktionsleiste anzeigen.

Page 27: Einstieg Mit VBA in Excel

26

Einführung1

Abbildung 1.12 Registerkarte »Entwicklertools« einblenden

Entwicklertools Anschließend ist die Registerkarte dauerhaft aktiviert (siehe Abbildung1.13 für Excel 2007).

Abbildung 1.13 Registerkarte »Entwicklertools«

1.2.7 Makrosicherheit dauerhaft ändern

Vertrauenscenter Klicken Sie auf der Registerkarte Entwicklertools den Button Makro-

sicherheit an (siehe Abbildung 1.14 für Excel 2010).

Abbildung 1.14 Button Makrosicherheit

Page 28: Einstieg Mit VBA in Excel

27

Arbeiten mit Makros 1.2

SicherheitscenterUnter Excel 2010 öffnet sich das Dialogfeld Sicherheitscenter, unterExcel 2007 das Dialogfeld Vertrauenscenter. Nach dem Drücken desButtons (bzw. nach der Auswahl der Kategorie) Einstellungen für

Makros sehen Sie die Standardeinstellung: Alle Makros mit Benachrichti-gung deaktivieren (siehe Abbildung 1.15 für Excel 2010).

Abbildung 1.15 Sicherheitscenter

Vertrauens-würdiger Speicherort

Die folgende Möglichkeit ist allerdings besser geeignet: Nach Drückendes Buttons (bzw. nach der Auswahl der Kategorie) Vertrauenswürdige

Speicherorte (siehe Abbildung 1.15 für Excel 2010) sehen Sie eine Listeder vertrauenswürdigen Verzeichnisse. Die Makros in den hier gelistetenVerzeichnissen können immer ausgeführt werden.

Eigener Speicherort

Falls Sie also in Zukunft alle Ihre Excel-Dateien mit Makros in einembestimmten Verzeichnis (gegebenenfalls inklusive dessen Unterverzeich-nisse) speichern, dann können Sie dieses Verzeichnis zu der Liste hinzu-fügen. Dazu betätigen Sie den Button Neuen Speicherort hinzufügen.Es erscheint ein Dialogfeld, in dem Sie die gewünschten Eingaben vor-nehmen können.

Abbildung 1.16 Vertrauenswürdiges Verzeichnis

Anschließend ist die Liste der vertrauenswürdigen Speicherorte um einElement ergänzt.

Page 29: Einstieg Mit VBA in Excel

28

Einführung1

Abbildung 1.17 Liste der vertrauenswürdigen Verzeichnisse

1.3 Entwicklungsumgebung »Visual Basic Editor«

Tasten Alt + F11 Es gibt mehrere Wege, den Visual Basic Editor (VBE), die Entwicklungs-umgebung, aufzurufen, in der man den VBA-Code schreibt. Wie bereitserläutert, gelangen Sie über den Button Makros auf der RegisterkarteAnsicht oder der Registerkarte Entwicklertools dorthin. Außerdemkönnen Sie den VBE von der Excel-Oberfläche mit der Tastenkombina-tion (Alt)+(F11) aufrufen.

Mit der gleichen Tastenkombination können Sie auch wieder vom VBEzur Excel-Oberfläche zurückwechseln. Dies wird in der Praxis häufigdurchgeführt.

1.3.1 Menüleiste und Symbolleiste

Symbolleiste»Bearbeiten«

Im oberen Teil des VBE befinden sich eine Menüleiste und die Symbol-leiste Voreinstellung. Nützlich für die Programmierung ist auch dieSymbolleiste Bearbeiten, die Sie über das Menü Ansicht � Symbolleis-

ten einblenden können.

Abbildung 1.18 Symbolleisten »Voreinstellung« und »Bearbeiten«

Deklarationerzwingen

Nehmen Sie zu Beginn bitte eine Voreinstellung vor, die für die VBA-Pro-grammierung wichtig ist: Im Menü Extras � Optionen � RegisterkarteEditor setzen Sie ein Häkchen bei Variablendeklaration erforderlich.

Page 30: Einstieg Mit VBA in Excel

29

Entwicklungsumgebung »Visual Basic Editor« 1.3

Option ExplicitDies sorgt ab dem nächsten Öffnen von Excel dafür, dass in jedem Moduloberhalb des VBA-Codes die Zeile Option Explicit steht und alle Variab-len deklariert werden müssen.

Abbildung 1.19 Einstellung »Variablendeklaration erforderlich«

Verbesserung des Programms

Damit wird in Ihrem VBA-Code automatisch darauf geachtet, dass Sie alleVariablen explizit deklarieren. Dies kann zur Verminderung von Fehlernund zur Verbesserung der Performance Ihrer Programme beitragen.Variablen dienen zur Speicherung von Zahlen, Daten und Texten, die imspäteren Verlauf eines Programms noch benötigt werden. Dazu mehr inKapitel 3, »Grundlagen der Programmierung mit VBA«.

1.3.2 Projekt-Explorer und Eigenschaften-Fenster

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

Abbildung 1.20 Projekt-Explorer und Eigenschaften-Fenster

Page 31: Einstieg Mit VBA in Excel

30

Einführung1

Projekt-Explorer Im Projekt-Explorer werden die Elemente der aktuell geöffneten Dateienangezeigt, in denen man mit VBA programmieren kann. Dies sind:

Modul � Eigene Code-Module, wie z. B. das Modul1, das durch die Aufzeich-nung eines Makros automatisch erzeugt wurde. Ein eigenes, leeresModul kann auch über das Menü Einfügen � Modul erzeugt werden.

Klassenmodul � Vorhandene Klassenmodule, wie DieseArbeitsmappe und Tabelle1 bisTabelle3, also die gesamte Arbeitsmappe und die aktuell vorhandenenTabellen. Hier kann VBA-Code notiert werden, der bei Eintrittbestimmter Ereignisse, wie zum Beispiel Öffnen einer Arbeitsmappe,automatisch ausgeführt wird.

� Eigene Klassenmodule zur objektorientierten Programmierung, dieSie über das Menü Einfügen � Klassenmodul erzeugen können.

UserForm � UserForms, also eigene Dialogfelder zur komfortablen Programmsteu-erung, die sich über das Menü Einfügen � UserForm erzeugen lassen.

Für uns sind zunächst nur die eigenen Code-Module wichtig. Die VBA-Beispiele in diesem Buch werden in Code-Modulen gespeichert, fallskein anderslautender Hinweis erfolgt. Falls Code in UserForms oder eige-nen Klassenmodulen gespeichert wird, so ist dies explizit angegeben. DerVBA-Code in Klassenmodulen bezieht sich normalerweise nur auf dasjeweilige Klassenmodul. Per Doppelklick auf ein Element im Projekt-Explorer wird der VBA-Code des betreffenden Moduls eingeblendet.

Eigenschaftenund Werte

Im Eigenschaften-Fenster werden die Eigenschaften des aktuell ausge-wählten Moduls bzw. die Eigenschaften des ausgewählten Steuerele-ments eines eigenen Dialogfelds aufgelistet. Die Werte dieser Eigenschaf-ten können verändert werden. Ein Modul wird durch einen einfachenKlick im Projekt-Explorer ausgewählt. Zunächst ist das Eigenschaften-Fenster für uns nicht wichtig.

1.3.3 Codefenster

Code ausführen Auf der rechten Seite des VBE befindet sich das bereits bekannte Code-fenster mit dem VBA-Code. Sie können eines der Makros von hier ausdirekt ausführen. Setzen Sie dazu den Cursor in die betreffende Proze-dur. Anschließend können Sie entweder

Übung 1 D

Blenden Sie den VBA-Code der verschiedenen Elemente ein.

Page 32: Einstieg Mit VBA in Excel

31

Makrocode verstehen und ändern 1.4

� im Menü Ausführen den Menüpunkt Sub/UserForm ausführen auf-rufen oder

Taste F5� die Taste (F5) betätigen oder

� in der Symbolleiste Voreinstellung das Symbol mit dem grünenPfeil, der nach rechts weist, betätigen.

Abbildung 1.21 Symbol »Sub/UserForm ausführen« (Taste F5)

1.4 Makrocode verstehen und ändern

Im nächsten Schritt sollen die eigenen Makros verändert werden. Dazumüssen wir ihren Code etwas näher betrachten, zunächst am Beispielvon Makro1:

Sub Makro1()Range("A1").SelectSelection.CutRange("C1").SelectActiveSheet.Paste

End Sub

Übung 1 E

Testen Sie auf diese Weise die beiden vorhandenen Makros. Das Ergebnissehen Sie natürlich nur in der Excel-Oberfläche. Sie müssen also (z. B. mit-hilfe der Tastenkombination (Alt) + (F11)) zwischen Excel-Oberfläche undVBE hin und her wechseln.

Zur Erinnerung

Ein Apostroph im VBA-Code dient dazu, eine ganze Zeile bzw. den Resteiner Zeile hinter dem Apostroph zu einem Kommentar zu machen.

Übung 1 F

Fügen Sie Ihren beiden Makros jeweils eine Kommentarzeile hinzu mit demText: Dieses Makro wurde von [Ihr Name] erstellt. Testen Sie Ihre Makroserneut.

Page 33: Einstieg Mit VBA in Excel

32

Einführung1

Zur Erläuterung:

Sub ... End Sub � Der Code der Makros ist jeweils innerhalb einer Sub-Prozedur zwi-schen Sub und End Sub notiert. Die einzelnen Zeilen werden der Reihenach durchlaufen und ausgeführt.

Range � Range("A1").Select bedeutet:

� Für einen (Zell-)Bereich (engl. range) wird etwas durchgeführt. Indiesem Falle wird der Bereich ausgewählt (engl. select). DerBereich umfasst hier nur die Zelle A1. Er kann auch mehrere Zellenumfassen.

Cut � Selection.Cut bedeutet:

� Für die vorher getroffene Auswahl (engl. selection) wird etwasdurchgeführt. In diesem Falle wird die Auswahl ausgeschnitten(engl. cut).

� Es wurde also der Inhalt der Zelle A1 ausgeschnitten. Dieser Inhaltbefindet sich nun in der Zwischenablage.

� Im anderen Makro (KopieE3E5) wird auf ähnliche Art und Weisemit Selection.Copy die vorher getroffene Auswahl in die Zwi-schenablage kopiert.

� Range("C1").Select erklärt sich nun von selbst.

Paste � ActiveSheet.Paste bedeutet:

� Für das aktuell aktive Tabellenblatt (engl. sheet) wird etwas durch-geführt. In diesem Falle wird der Inhalt der Zwischenablage einge-fügt (engl. paste). Dies wird an der vorher ausgewählten Stelle(Zelle C1) vorgenommen.

Active...

Durch den Eintrag von D1 statt C1 als Zielzelle können Sie den Code leichtverändern. Anschließend wird der Inhalt der Zelle A1 zur Zelle D1 ver-schoben.

Hinweis

Mit dem Präfix »Active« wird immer das aktuell aktive Element bezeichnet,wie z. B. ActiveCell (Zelle), ActiveSheet (Tabellenblatt) oder ActiveWork-book (Arbeitsmappe).

Übung 1 G

Verändern 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 auchin die Zellen E10 bis G10 kopiert werden.

Page 34: Einstieg Mit VBA in Excel

33

Makro per Schaltfläche ausführen 1.5

Aktivieren und selektieren

1.5 Makro per Schaltfläche ausführen

Button einfügenSie können als Entwickler dem Benutzer das Starten eines Makroserleichtern, indem Sie ihm eine Schaltfläche (engl. button) zur Verfügungstellen. So können Sie ein übersichtlich zu bedienendes Tabellenblatt mitDaten, Formeln und Programmen zur Verfügung stellen.

Zur Erzeugung eines Buttons gehen Sie wie folgt vor:

1. Auf der Registerkarte Entwicklertools betätigen Sie den Button Ein-

fügen.

2. Es erscheint eine Sammlung von Steuerelementen; darin wählen Siedas Symbol links oben: Schaltfläche (Formular-Steuerelement).

3. Platzieren Sie den Mauscursor an der gewünschten Stelle auf demTabellenblatt. Es erscheint ein kleines Kreuz. Drücken Sie die linkeMaustaste, halten Sie sie gedrückt, und ziehen Sie die Schaltfläche inder gewünschten Größe auf.

Makro und Button verbinden

4. Es erscheint das Dialogfeld Makro zuweisen. Suchen Sie dasgewünschte Makro heraus, und bestätigen Sie mit OK.

Hinweise dazu:

� Ein Zellbereich aus mehreren Zellen wird genau wie in Excel notiert, alsoz. B. E3:G3.

� Für eine Zielangabe reicht die Angabe einer einzelnen Zelle aus; die wei-teren Zellen des kopierten Bereichs werden, wie aus Excel gewohnt, indie Nachbarzellen eingefügt.

� Aus der Zwischenablage können beliebig viele Kopien eingefügt werden.

Hinweis

In den genannten Beispielen werden Quellbereiche selektiert und Zielberei-che aktiviert. Dadurch bekommt man als VBA-Neuling einen leicht verständ-lichen Einstieg, weil der Code die gleichen Schritte ausführt wie der Benutzerin der Excel-Oberfläche.

Es wird aber mehr Code als notwendig erzeugt. Die Wartung solchen Codesdauert länger, und die Ausführung ist langsamer. Im weiteren Verlauf diesesBuchs werden Sie lernen, wie man besseren Code erstellt.

Page 35: Einstieg Mit VBA in Excel

34

Einführung1

Abbildung 1.22 Makro einem Button zuordnen

Anschließend erscheint der Button im Bearbeitungsmodus. Klicken Sieeinmal neben den Button; anschließend können Sie durch Klick auf denButton das Makro ausführen.

Abbildung 1.23 Neu eingefügter Button

Button bearbeiten

1.6 Relative Aufzeichnung

Beim Aufzeichnen der Makros ist Ihnen sicherlich schon der BegriffRelative Aufzeichnung aufgefallen. Dabei handelt es sich um einenSchalter, den Sie an zwei Stellen betätigen können:

� in dem Menü, das über den Button Makros auf der RegisterkarteAnsicht erreicht werden kann

� auf der Registerkarte Entwicklertools

Schalter Falls dieser Schalter eingeschaltet wird, dann werden nachfolgendeMakros relativ aufgezeichnet. Bei den bisher erstellten Makros war die-ser Schalter nicht eingeschaltet, diese Makros wurden daher absolut auf-gezeichnet.

Hinweis

Sie können einen Button nachträglich bearbeiten. Dazu klicken Sie mit derrechten Maustaste auf den Button, dann sind Sie wieder im Bearbeitungs-modus. Sie können nun Größe und Ort verändern. Über das Kontextmenü(wiederum Rechtsklick) können Sie ein anderes Makro zuweisen oder denText auf dem Button verändern.

Page 36: Einstieg Mit VBA in Excel

35

Relative Aufzeichnung 1.6

Absolut aufzeichnen

� Absolute Aufzeichnung bedeutet, dass im Makrocode absolute Zellan-gaben stehen (Beispiel: A1, C1). Bei der Ausführung eines solchenMakros ist es egal, welche Zelle in Excel aktiv ist, es wird immer mitden Zellen A1 und C1 gearbeitet.

Relativ aufzeichnen

� Relative Aufzeichnung bedeutet, dass im Makrocode relative Zellan-gaben stehen. Bei der Ausführung eines solchen Makros werden dieAktionen relativ zu der Zelle ausgeführt, die in Excel aktiv ist.

Zur Verdeutlichung soll ein Makro aufgezeichnet werden, in dem dasGleiche gemacht wird wie im ersten Beispielmakro: Der Inhalt der ZelleA1 wird nach C1 verschoben. Allerdings wird das Makro relativ aufge-zeichnet. Führen 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. Wählen 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. Fügen 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.

Relative Verschiebung

Soweit ist noch kein sichtbarer Unterschied aufgetreten. Falls Sie nunallerdings das Makro ausführen, so wird jeweils der Inhalt der aktuellausgewählten Zelle um zwei Zellen nach rechts verschoben (z. B. vonD10 nach F10) und nicht immer der Inhalt der Zelle A1 nach C1.

Die aktive Zelle ist nun der Ausgangspunkt. Betrachten wir den Code:

Cut� Selection.Cut: Es geschieht das Gleiche wie bei der absoluten Auf-zeichnung, also der Inhalt der aktiven Zelle wird ausgeschnitten. Erliegt nun in der Zwischenablage.

� ActiveCell.Offset(0, 2).Range("A1").Select:

Offset� Ausgehend von der aktiven Zelle wird ein Offset (also ein Versatz)ausgewählt. Die Angaben in Klammern stehen für Zeile und Spaltedes Versatzes. Es wird also eine Zelle in der gleichen Zeile (Offset-Zeile 0) und zwei Spalten weiter rechts (Offset-Spalte 2) ausge-wählt. Falls die aktive Zelle D10 ist, dann wird demnach die ZelleF10 ausgewählt.

Page 37: Einstieg Mit VBA in Excel

36

Einführung1

� Zu diesem Versatz wird der Bereich A1 ausgewählt. Dies ist nichtdie absolute Zelle A1 des Tabellenblatts, sondern die oberste linkeZelle des Versatzes.

� Diese Zelle (gleiche Zeile, zwei Zellen nach rechts) wird ausge-wählt.

Paste � ActiveSheet.Paste: Es geschieht das Gleiche wie bei der absolutenAufzeichnung, also der Inhalt der Zwischenablage wird eingefügt.

Dieses Makro zeigt ein ganz anderes Verhalten als das Makro, das absolutaufgezeichnet wurde. Beide Makroaufzeichnungsarten haben ihre Vor-teile, je nach Situation.

1.7 Persönliche Makroarbeitsmappe

Makros überallbenutzen

Die bisher aufgezeichneten Makros wurden in der aktuell aktivenArbeitsmappe gespeichert. Daher stehen sie nur dort zur Verfügung.Falls Sie bestimmte Makros für den universellen Einsatz immer zur Ver-fügung haben möchten, so sollten Sie sie in der Persönlichen Makro-arbeitsmappe speichern. Dabei handelt es sich um eine Arbeitsmappe, dieimmer zusammen mit Excel geöffnet wird, sobald sie existiert.

Zum Speichern eines Makros in der Persönlichen Makroarbeitsmappemuss beim Aufzeichnen eines Makros im Dialogfeld Makro aufzeich-

nen der entsprechende Eintrag in der Liste Makro speichern in ausge-wählt werden.

Hinweis

Nach dem Schließen und erneuten Öffnen von Excel steht der Schalterimmer auf absolute Aufzeichnung. Sie können während 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 mitrelativer Aufzeichnung. Nennen Sie das Makro RelKopie. Testen Sie es, undinterpretieren Sie den VBA-Code.

Page 38: Einstieg Mit VBA in Excel

37

Persönliche Makroarbeitsmappe 1.7

Abbildung 1.24 Speichern in Persönlicher Makroarbeitsmappe

Datei personal.xlsb

Nach der Aufzeichnung erscheint ein weiterer Eintrag im Projekt-Explorerdes VBE, die Datei personal.xlsb. Ihr Standardspeicherort unter Windows7 und Vista ist das Verzeichnis C:\Benutzer\[ Benutzername ]\AppData\Roaming\Microsoft\Excel\XLStart und unter XP C:\Dokumente und Ein-stellungen\[ Benutzername ]\Anwendungsdaten\Microsoft\Excel\XLStart.

Abbildung 1.25 Persönliche Makroarbeitsmappe im Projekt-Explorer

Makros immerverfügbar

Falls diese Datei verändert wurde, indem z. B. ein Makro hinzugefügtoder geändert wurde, werden Sie bei jedem Schließen von Excel gefragt,ob Sie diese Änderungen speichern möchten. Nach jedem Öffnen vonExcel stehen die Makros in dieser Datei zur Verfügung.

Übung 1 I

Erstellen Sie das gleiche Makro wie in der letzten Übung, 1 H, speichern Siees aber diesmal in der Persönlichen Makroarbeitsmappe. Schließen Sie Excel.Testen Sie das Makro nach dem erneuten Öffnen von Excel in einer beliebi-gen Arbeitsmappe.

Page 39: Einstieg Mit VBA in Excel

38

Einführung1

1.8 Code schreiben, einfache Ausgabe

Selbstprogrammieren

In diesem Abschnitt wird erstmalig VBA-Code nicht durch eine Makro-aufzeichnung, sondern durch Schreiben des Codes in einer eigenen Sub-Prozedur erstellt. Es entsteht also das erste richtige VBA-Programm.Außerdem werden drei Möglichkeiten zur Ausgabe von Ergebnissenoder Kontrollwerten genannt, die häufig in der VBA-Programmierungbenutzt werden:

� Ausgabe in einer Zelle

� Ausgabe in einer Nachrichtenbox

� Ausgabe im Direktfenster des VBE

1.8.1 Eigene Sub-Prozedur

Zunächst zur Erstellung einer eigenen Sub-Prozedur. Wechseln Sie mitden Tasten (Alt) + (F11) zum VBE. Schreiben Sie unterhalb des letztenMakros die folgende Zeile:

Sub AusgabeZelle

Unterstützungdurch Editor

Sobald Sie mit der Taste (¢) die Zeile wechseln, stellen Sie fest, dass derEditor Sie bei der VBA-Programmierung unterstützt:

� Am Ende der Zeile werden Klammern angefügt.

� Es wird die Zeile mit End Sub erzeugt.

� Der Cursor steht in der Zeile dazwischen, bereit zur Eingabe IhresVBA-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 Unter-stützung, aber dazu später.

Prozedurname (...) Hinter dem Namen einer Sub-Prozedur (oder kurz: Prozedur) stehenimmer Klammern, wie auch bei Ihren bisherigen Makros. Diese Klam-mern sind zunächst leer. Später werden wir sehen, dass man innerhalb

Page 40: Einstieg Mit VBA in Excel

39

Code schreiben, einfache Ausgabe 1.8

der Klammern Aufrufparameter notieren kann, die eine Prozedur flexib-ler machen können.

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 Ausführung 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

Eigenschaft »Value«

Sie haben bereits gesehen, dass Sie einen Bereich, der eine oder mehrereZellen umfasst, über Range ansprechen können. Wir hatten bereits dieMethode Select aufgerufen, um diesen Bereich auszuwählen. Diesmalwird die Eigenschaft Value mit einem Eigenschaftswert versehen, demText Hallo. Über Value bekommt die Zelle einen Wert.

Hinweis

Eine Prozedur sollte einen möglichst sprechenden Namen haben, der etwasüber ihre Arbeitsweise aussagt. Außerdem muss der Name innerhalb derAnwendung eindeutig sein. Es darf also kein Prozedurname doppelt vor-kommen.

Page 41: Einstieg Mit VBA in Excel

40

Einführung1

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

Abbildung 1.28 Ausgabe in Nachrichtenbox

MsgBox Eine solche Nachrichtenbox können Sie u. a. benutzen zur:

� Kontrollausgabe während 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 Sieeine Zeichenkette, z. B. einen Text in Anführungsstrichen, als Aufruf-Parameter notieren müssen. Die Funktion MsgBox kann allerdingswesentlich mehr, wie Sie in Abschnitt 8.2, »Einfacher Dialog mit demBenutzer«, sehen werden.

vbCrLf Bei längeren Ausgaben wird häufig ein Zeilenumbruch benötigt. Dieserwird über die Konstante vbCrLf bereitgestellt. Ein Beispiel:

Sub AusgabeBoxZeilenumbruch()MsgBox "Hallo" & vbCrLf & "Welt"

End Sub

Die Ausgabe lautet:

Abbildung 1.29 Ausgabe mit Zeilenumbruch

Page 42: Einstieg Mit VBA in Excel

41

Arbeiten mit Excel vor der Version 2007 1.9

Den Namen dieser Konstanten kann man sich leicht merken, denn eshandelt sich dabei um ein Relikt aus der Urzeit: In vbCrLf steht das Cr fürCarriage Return, den Wagenrücklauf der Schreibmaschine zum Zeilenan-fang. Das Lf steht für Line Feed, den Zeilenvorschub.

Operator &

1.8.4 Ausgabe im Direktfenster des VBE

Schreiben Sie eine weitere Prozedur mit folgendem Code:

Sub AusgabeKontrolle()Debug.Print "Hallo"

End Sub

Debug.PrintNach dem Aufruf erscheint zunächst gar nichts, da das Direktfenster desVBE nicht eingeblendet ist. Zeigen Sie es im VBE an über das MenüAnsicht � Direktfenster. Anschließend sehen Sie die soeben erzeugteAusgabe (siehe Abbildung 1.30).

Abbildung 1.30 Ausgabe im Direktfenster

Das Direktfenster (= Direktbereich) können Sie ebenfalls zur Kontroll-ausgabe während der Programmierung nutzen.

1.9 Arbeiten mit Excel vor der Version 2007

Zunächst das Wichtigste: Excel-Dateien werden in den Versionen vorExcel 2007 einheitlich mit der Dateiendung .xls gespeichert, unabhängigdavon, ob sie Makros enthalten oder nicht.

Die weitaus meisten Beispiele in diesem Buch laufen auch unter Versio-nen vor Excel 2007. Auf dem Datenträger, der diesem Buch beiliegt, ste-

Hinweis

Der Operator & dient zur Verkettung von Zeichenfolgen. Er wird häufigbenötigt, um Ergebnisse anschaulich zusammen mit Text darzustellen.

Page 43: Einstieg Mit VBA in Excel

42

Einführung1

hen die Dateien zusätzlich im xls-Format für Versionen vor Excel 2007zur Verfügung.

Als Beispiel für die Arbeit mit den Versionen vor Excel 2007 (genauer:Excel 97 bis Excel 2003) soll in diesem Abschnitt Excel 2002 dienen. Eswerden nur die Unterschiede zu Excel 2010 erläutert, in Anlehnung andie Reihenfolge der bisherigen Abschnitte.

1.9.1 Makro aufzeichnen

Zum Starten einer Aufzeichnung wählen Sie im Menü Extras das Unter-menü Makro, darin den Menüpunkt Aufzeichnen. Zum Beenden derAufzeichnung wählen Sie im Menü Extras das Untermenü Makro, darinden Menüpunkt Aufzeichnung beenden.

Nach dem Start einer Aufzeichnung erscheint die kleine SymbolleisteAufzeichnung beenden. Sollte sie nicht von selber erscheinen, so kannsie auf die übliche Art eingeblendet werden: rechte Maustaste im Bereichder Symbolleisten, Häkchen vor der betreffenden Symbolleiste setzen.

Sie beinhaltet zwei Symbole:

� Mit Betätigung des linken Symbols können Sie die Aufzeichnungebenfalls beenden.

� Mit Betätigung des rechten Symbols können Sie auf relative Aufzeich-nung umschalten. Diese Einstellung gilt auch für nachfolgendeMakro-Aufzeichnungen.

1.9.2 Makro ausführen

Zum Ausführen des Makros wählen Sie im Menü Extras das UntermenüMakro und darin den Menüpunkt Makros. Wählen Sie im DialogfeldMakro das gewünschte Makro aus und klicken Sie auf den Button Aus-

führen.

1.9.3 Makro ansehen

Zum Ansehen des Makros wählen Sie im Menü Extras das UntermenüMakro und darin den Menüpunkt Makros.

Wählen Sie im Dialogfeld Makro das gewünschte Makro aus und klickenSie auf den Button Bearbeiten.

Page 44: Einstieg Mit VBA in Excel

43

Arbeiten mit Excel vor der Version 2007 1.9

Es erscheint der Visual Basic Editor. Sie können ihn über den MenüpunktSchließen und zurück zu Microsoft Excel im Menü Datei wiederschließen.

1.9.4 Makro speichern

Wie bereits erwähnt, werden Excel-Dateien in diesen Versionen einheit-lich gespeichert, unabhängig davon, ob sie Makros enthalten oder nicht.

Zum Speichern der Datei wählen Sie im Menü Datei den MenüpunktSpeichern. Es erscheint das Dialogfeld Speichern unter. Als Dateityp istExcel-Arbeitsmappe mit der Dateiendung .xls angegeben.

Sie wählen den gewünschten Dateinamen und das gewünschte Verzeich-nis aus und klicken auf den Button Speichern.

Dateityp ändernFalls Sie an einem externen PC Excel 2010 zur Verfügung haben und einedort erstellte Excel-Datei auf Ihrem PC unter einer Version vor 2007haben wollen, dann rufen sie auf dem externen PC das Dialogfeld Spei-

chern unter auf und wählen den Dateityp Excel-97-2003-Arbeitsmappe

mit der Dateiendung .xls.

Kompatibilitäts-prüfung

Falls sich in der Datei VBA-Code befindet, der nicht unter älteren Excel-Versionen ausgeführt werden kann, so erscheint das Dialogfeld Kompa-

tibilitätsprüfung. Darin wird das Problem genauer erläutert.

1.9.5 Makrosicherheit

Beim Öffnen einer Datei, die ein Makro beinhaltet, kommt es darauf an,welche Sicherheitsstufe in Excel eingestellt ist:

� Hoch: Die Ausführung von nicht signierten Makros wird abgelehnt.

� Mittel: Es wird Ihnen die Möglichkeit gegeben, die Makros in dieserDatei einmalig zu aktivieren oder zu deaktivieren.

� Niedrig: Die Ausführung von nicht signierten Makros wird generellerlaubt.

Zum Ändern der Sicherheitsstufe wählen Sie im Menü Extras das Unter-menü Makro und darin den Menüpunkt Sicherheit. Es erscheinen diedrei genannten Möglichkeiten. Eine Änderung wird erst beim nächstenÖffnen einer Excel-Datei wirksam.

Page 45: Einstieg Mit VBA in Excel

44

Einführung1

1.9.6 Symbolleiste »Visual Basic«

Nach Einblenden der Symbolleiste Visual Basic haben Sie schnellerenZugriff auf die wichtigsten Befehle im Zusammenhang mit Makros undder Entwicklung mit Visual Basic.

1.9.7 Entwicklungsumgebung Visual Basic Editor

Zum Aufruf des VBE wählen Sie im Menü Extras das UntermenüMakro, darin den Menüpunkt Visual Basic-Editor oder die Tastenkom-bination (Alt) + (F11).

Das Symbol zum Starten eines Makros aus dem Codefenster heraus ist eingrüner Pfeil. Alternativ kann das Menü Ausführen (Menüpunkt Sub/

UserForm ausführen) oder die Funktionstaste (F5) genutzt werden.

1.9.8 Persönliche Makroarbeitsmappe

Die persönliche Makroarbeitsmappe heißt personl.xls und ihr Standard-speicherort unter Windows 7 und Vista ist das Verzeichnis C:\Benutzer\[Benutzername]\AppData\Roaming\Microsoft\Excel\XLStart und unterXP C:\Dokumente und Einstellungen\[Benutzername]\Anwendungsdaten\Microsoft\Excel\XLStart.

Page 46: Einstieg Mit VBA in Excel

45

In diesem Kapitel lernen Sie den Umgang mit den Objekten »Arbeitsmappe«, »Tabellenblatt« und »Zellbereich« mit ihren jeweiligen Eigenschaften, Methoden und Ereignissen kennen.

2 Grundlagen von Objekten und Ereignissen

ObjekteVBA ist eine objektorientierte Sprache, das heißt, es wird mit Objektengearbeitet. Objekte verfügen über Eigenschaften, Methoden und Ereig-nisse.

Eigenschaft� Eigenschaften (Attribute) bestimmen das Aussehen eines Objekts. EinTabellenblatt verfügt z. B. über die Eigenschaft Name. Der Wert dieserEigenschaft ist die Bezeichnung des Tabellenblatts (z. B. Tabelle1).

Methode� Methoden bestimmen die Fähigkeiten eines Objekts. Ein Tabellen-blatt verfügt z. B. über die Methode Copy(), das heißt, es kann kopiertwerden.

Ereignis� Ereignisse bestimmen, was mit dem Objekt passiert. Bei einem Tabel-lenblatt kann z. B. das Ereignis Aktivierung stattfinden. Ereignisse kön-nen mit VBA-Code verbunden werden, so dass automatisch weitereAktionen folgen können.

In diesem Kapitel werden Ihnen zahlreiche Möglichkeiten von VBA vor-gestellt, ohne in die Programmierung mit Variablen, Verzweigungen undSchleifen einsteigen zu müssen. Im folgenden Kapitel werden dann diesewichtigen Elemente der Programmierung erläutert, die die automati-sierte Bearbeitung von Excel erheblich verbessern.

2.1 Objekthierarchie und Auflistungen

HierarchieWie bereits erwähnt, verfügen Objekte über Eigenschaften. Eine Eigen-schaft eines Objekts kann wiederum ein Unterobjekt sein, mit eigenenEigenschaften, Methoden und Ereignissen. Setzt man diese Überlegung

Page 47: Einstieg Mit VBA in Excel

46

Grundlagen von Objekten und Ereignissen2

weiter fort, so erhält man eine Hierarchie von Objekten, ausgehend voneinem Hauptobjekt.

Application Das Hauptobjekt bei Office-Anwendungen ist Application (engl. fürAnwendung). In unserem Fall wird damit das Programm Excel selbstbezeichnet.

Workbooks � Eine Eigenschaft des Objekts Application ist die Auflistung Workbooks.Darin befinden sich alle geöffneten Arbeitsmappen, also Excel-Dateien.

Worksheets � Eine Eigenschaft einer einzelnen Arbeitsmappe ist die AuflistungWorksheets. Darin befinden sich alle Tabellenblätter einer Arbeits-mappe.

Range � Eine Eigenschaft eines einzelnen Tabellenblatts ist das Objekt Range.Darin befinden sich Zellen und Zellbereiche eines Tabellenblatts.

Auflistung mit »s« In Excel wird häufig mit Auflistungen gearbeitet, wie z. B. Workbooksoder Worksheets. Es handelt sich dabei um Sammlungen gleichartigerObjekte. Sie sind leicht an der Mehrzahlschreibweise (mit einem s amEnde) erkennbar.

2.2 Arbeitsmappen

Workbooks Das Objekt Workbooks ist eine Auflistung. In dieser Auflistung befindensich alle geöffneten Arbeitsmappen, also alle offenen Excel-Dateien.

Workbook Das Objekt Workbook (ohne ein s am Ende) steht für eine einzelneArbeitsmappe. Zur Bearbeitung einer bestimmten Arbeitsmappe gibt esverschiedene Möglichkeiten:

ThisWorkbook � ThisWorkbook: Die Arbeitsmappe mit dem aktuell ausgeführten VBA-Code; sie wird im Folgenden auch als diese Arbeitsmappe bezeichnet.

� ActiveWorkbook: Die aktuell aktive Arbeitsmappe. Dies muss nichtdiese Arbeitsmappe sein.

� Workbooks(Index): Index ist die laufende Nummer der Arbeitsmappeinnerhalb der Workbooks-Auflistung, von 1 bis Anzahl (EigenschaftCount).

Workbooks("Name")

� Workbooks("Name"): Der Name der Arbeitsmappe als Zeichenkette (inAnführungszeichen)

Page 48: Einstieg Mit VBA in Excel

47

Arbeitsmappen 2.2

2.2.1 Anzahl Arbeitsmappen ermitteln

ZählenMit folgender Prozedur wird die Anzahl der geöffneten Arbeitsmappenermittelt:

Sub MappenZaehlen()MsgBox "Anzahl Mappen: " & Workbooks.Count

End Sub

Zur Erläuterung:

Count� Es wird der Wert der Eigenschaft Count des Objekts Workbooks ermit-telt und ausgegeben.

� Zu beachten ist, dass dabei die Persönliche Makroarbeitsmappe mitge-zählt wird, falls sie vorhanden ist. Im Visual Basic Editor (VBE) könnenSie sehen, ob es diese Mappe gibt.

Abbildung 2.1 Eigenschaft »Count«

2.2.2 Neue Arbeitsmappe erzeugen

Neue MappeMit folgender Prozedur wird eine neue Mappe erzeugt und geöffnet. ZurKontrolle wird die Anzahl der geöffneten Mappen vor und nach demErzeugen ausgegeben:

Sub NeueMappe()MsgBox Workbooks.CountWorkbooks.AddMsgBox Workbooks.Count

End Sub

Zur Erläuterung:

Add()� Es wird die Methode Add() des Workbooks-Objekts aufgerufen.

� Dadurch wird eine neue, leere Arbeitsmappe in Excel geöffnet. Dieseist dann die aktive Arbeitsmappe.

� Gleichzeitig wird der Auflistung Workbooks ein weiteres Element hin-zugefügt, wie man an den beiden Ausgaben der Eigenschaft Count(vorher, nachher) erkennen kann.

Page 49: Einstieg Mit VBA in Excel

48

Grundlagen von Objekten und Ereignissen2

2.2.3 Vorhandene Arbeitsmappe öffnen

Mappe öffnen Mit folgender Prozedur wird eine vorhandene Mappe geöffnet:

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

End Sub

Zur Erläuterung:

Open() � Es wird die Methode Open() des Workbooks-Objekts aufgerufen.Dadurch wird die Arbeitsmappe mit dem angegebenen Namen imgenannten Verzeichnis geöffnet. Diese ist dann die aktive Arbeits-mappe.

� Der Auflistung Workbooks wird ein weiteres Element hinzugefügt.

� Im Beispiel wurde eine Datei über eine absolute Pfadangabe ange-sprochen. Man kann auch Dateien mit relativen Pfadangaben undDateien im gleichen Verzeichnis erreichen, siehe Abschnitt 2.2.10,»Pfad einer Arbeitsmappe ermitteln«.

Programmabbruch � Falls die Arbeitsmappe (= Datei) nicht existiert, wird das Programmmit einer Fehlermeldung abgebrochen. Es kommt zu einem soge-nannten Laufzeitfehler. In Kapitel 4, »Fehlerbehandlung«, werden Sielernen, wie Sie solche Abbrüche vermeiden.

Abbildung 2.2 Programmabbruch durch Laufzeitfehler

2.2.4 Alle Arbeitsmappen schließen

Mappen schließen Mit folgender Prozedur werden alle geöffneten Arbeitsmappen geschlos-sen:

Hinweis

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

Page 50: Einstieg Mit VBA in Excel

49

Arbeitsmappen 2.2

Sub AlleMappenSchliessen()Workbooks.Close

End Sub

Zur Erläuterung:

Close()� Es wird die Methode Close() des Objekts Workbooks aufgerufen. Sieschließt alle geöffneten Arbeitsmappen, aber nicht den VBE oder dieExcel-Hilfe.

� Die Anwendung Excel bleibt weiterhin geöffnet.

� Falls eine Arbeitsmappe geändert wurde, dann wird der Benutzergefragt, ob er sie speichern möchte.

Abbildung 2.3 Nachfrage bei geänderter Datei

2.2.5 Name einer Arbeitsmappe ermitteln

Name der MappeMit folgender Prozedur wird der Name einer Arbeitsmappe auf zweiArten ermittelt:

Sub MappenName()MsgBox "Name: " & ThisWorkbook.NameMsgBox "Name mit Pfad: " & ThisWorkbook.FullName

End Sub

Zur Erläuterung:

� ThisWorkbook verweist immer auf die Arbeitsmappe, in der diese Pro-zedur steht.

Eigenschaft »Name«

� Es wird der Wert der Eigenschaft Name ermittelt und ausgegeben, diesist der Dateiname der Arbeitsmappe.

FullName� Zusätzlich wird der Wert der Eigenschaft FullName ermittelt und aus-gegeben, dies ist der Dateiname der Arbeitsmappe inklusive vollstän-diger Pfadangabe.

Page 51: Einstieg Mit VBA in Excel

50

Grundlagen von Objekten und Ereignissen2

Abbildung 2.4 Eigenschaft »Name«

Abbildung 2.5 Eigenschaft »FullName«

2.2.6 Aktive Arbeitsmappe

Aktive Mappe Mit folgender Prozedur wird in zwei verschiedenen Situationen derName der aktiven Arbeitsmappe ermittelt:

Sub AktiveMappe()Workbooks.Open "C:\Temp\Mappe3.xlsm"MsgBox "Aktiv nach Öffnen: " & ActiveWorkbook.NameActiveWorkbook.CloseMsgBox "Aktiv nach Schließen: " & ActiveWorkbook.Name

End Sub

Zur Erläuterung:

� Zunächst wird eine weitere Arbeitsmappe geöffnet. Es wird in diesemBeispiel davon ausgegangen, dass die angegebene Datei existiert.

ActiveWorkbook � ActiveWorkbook verweist immer auf die aktuell aktive Arbeitsmappe.Eine Arbeitsmappe ist immer dann aktiv, wenn der Benutzer sie aus-gewählt oder der Entwickler sie per Programm aktiviert hat. EineArbeitsmappe, die soeben geöffnet wurde, ist automatisch aktiv.

� Zur Kontrolle wird der Name der aktiven Arbeitsmappe ausgegeben.

Abbildung 2.6 Aktive Arbeitsmappe nach dem Öffnen

Page 52: Einstieg Mit VBA in Excel

51

Arbeitsmappen 2.2

� Es wird die Methode Close() des Objekts Workbook aufgerufen.Dadurch wird eine einzelne Arbeitsmappe, in diesem Falle die aktiveArbeitsmappe, geschlossen. Danach ist wieder die Arbeitsmappeaktiv, die vor dem Öffnen aktiv war.

� Zur Kontrolle wird wiederum der Name der nun aktiven Arbeits-mappe ausgegeben.

Abbildung 2.7 Wieder aktiv: »diese« Arbeitsmappe

2.2.7 Arbeitsmappe aktivieren

Mappe aktivierenMit folgender Prozedur wird eine bereits geöffnete Arbeitsmappe akti-viert. Dies ist dann sinnvoll, wenn mehrere Arbeitsmappen geöffnet sindund man sicher sein möchte, anschließend in einer bestimmten Arbeits-mappe weiterzuarbeiten.

Sub MappeAktivieren()ThisWorkbook.ActivateMsgBox ActiveWorkbook.Name

End Sub

Zur Erläuterung:

Activate()� Es wird die Methode Activate() des Objekts Workbook aufgerufen.Dadurch wird die angesprochene Arbeitsmappe, in diesem Falle dieseArbeitsmappe, aktiviert.

� Zur Kontrolle wird der Name der aktiven Arbeitsmappe ausgegeben.

2.2.8 Arbeitsmappe speichern

Mappe speichernMit folgender Prozedur wird diese Arbeitsmappe auf zwei verschiedeneArten gespeichert:

Hinweis

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

Page 53: Einstieg Mit VBA in Excel

52

Grundlagen von Objekten und Ereignissen2

Sub MappeSichern()ThisWorkbook.SaveThisWorkbook.SaveAs "C:\Temp\Mappe2.xlsm"MsgBox "Gesichert: " & ThisWorkbook.Saved

End Sub

Zur Erläuterung:

Save() � Es wird die Methode Save() des Objekts Workbook aufgerufen.Dadurch wird diese Arbeitsmappe gespeichert.

SaveAs() � Zusätzlich wird die Methode SaveAs() des Objekts Workbook aufgeru-fen. Dadurch wird diese Arbeitsmappe noch einmal gespeichert, undzwar im Verzeichnis C:\Temp unter dem Namen Mappe2.xlsm.Anschließend arbeiten Sie innerhalb der soeben angelegten Kopie derMappe!

Saved � Zur Kontrolle wird der Wert der Eigenschaft Saved ermittelt und aus-gegeben. Dabei handelt es sich um einen sogenannten Wahrheits-wert, also False (falsch) oder True (wahr). Da die Arbeitsmappe so-eben gespeichert wurde, ist der Wert aktuell True. Nach einerÄnderung in der Arbeitsmappe hätte die Eigenschaft den Wert False.

Abbildung 2.8 Eigenschaft »Saved«

2.2.9 Arbeitsmappe über Index oder Name auswählen

Mappe auswählen Mit folgender Prozedur werden bereits geöffnete Arbeitsmappen nach-einander mit zwei verschiedenen Techniken aktiviert:

Hinweis

Sie können den Wert der Eigenschaft Saved in einer Verzweigung nutzen. Jenach Wert der Eigenschaft (wahr oder falsch) kann bzw. sollte gespeichertwerden.

Hinweis

In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedurund in der Erläuterung wie folgt lauten: Mappe2.xls.

Page 54: Einstieg Mit VBA in Excel

53

Arbeitsmappen 2.2

Sub MappeAusListe()Workbooks(1).ActivateMsgBox ActiveWorkbook.NameWorkbooks("Mappe2.xlsm").ActivateMsgBox ActiveWorkbook.Name

End Sub

Zur Erläuterung:

Workbooks(Index)

� Zunächst wird eine bereits geöffnete Arbeitsmappe über den Indexausgewählt. Der Index ist die laufende Nummer der Arbeitsmappeinnerhalb der Workbooks-Auflistung, von 1 bis Anzahl (EigenschaftCount).

� Falls zwei Arbeitsmappen geöffnet sind, können nur die Indizes 1oder 2 benutzt werden. Wenn Sie einen anderen Index wählen,erfolgt ein Abbruch mit einer Fehlermeldung. Wie bereits erwähnt,werden Sie in Kapitel 4, »Fehlerbehandlung«, lernen, wie Sie solcheAbbrüche vermeiden.

� Es ist nicht immer einfach, festzustellen, welches gerade die Arbeits-mappe Nummer 1, 2 usw. ist. Daher ist die folgende Methode vorzu-ziehen:

Workbooks("Name")

� Eine bereits geöffnete Arbeitsmappe wird über ihren Namen (inAnführungszeichen) ausgewählt. Dabei handelt es sich um den reinenDateinamen, ohne Pfad. Da man in Excel nicht zwei Dateien mit demgleichen Namen öffnen kann, auch wenn sie in unterschiedlichenVerzeichnissen stehen, ist der Name eindeutig.

2.2.10 Pfad einer Arbeitsmappe ermitteln

Pfad der MappeHäufig ist der Zugriff auf Arbeitsmappen im gleichen Verzeichnis odereinem Unterverzeichnis erforderlich. Dazu muss zunächst der Pfad die-ser Arbeitsmappe (die den VBA-Code enthält) oder der Pfad der aktuellenArbeitsmappe ermittelt werden. Ein Beispiel, in dem der Pfad von dreiverschiedenen Arbeitsmappen ermittelt wird:

Sub PfadErmitteln()Workbooks.Open "C:\Temp\Mappe3.xlsm"MsgBox "Mappe3 ist in " & ActiveWorkbook.Path

Hinweis

In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedurwie folgt lauten: Mappe2.xls.

Page 55: Einstieg Mit VBA in Excel

54

Grundlagen von Objekten und Ereignissen2

MsgBox "Diese Mappe ist in " & ThisWorkbook.PathWorkbooks.Open ThisWorkbook.Path & "\Mappe1.xlsm"

Workbooks.Open ThisWorkbook.Path & "\Zusatz\Test.xlsx"MsgBox "Test ist in " & ActiveWorkbook.Path

End Sub

Zur Erläuterung:

� Zunächst wird die Arbeitsmappe C:\Temp\Mappe3.xlsm geöffnet.Dies ist jetzt die aktive Arbeitsmappe.

Abbildung 2.9 Pfad der Mappe »Mappe3«

Path � Anschließend wird mit Hilfe der Eigenschaft Path der Pfad zu dieserArbeitsmappe ausgegeben, in der sich die oben angegebene ProzedurPfadErmitteln() befindet.

Abbildung 2.10 Pfad von »dieser« Mappe

� Es wird die Arbeitsmappe Mappe1.xlsm geöffnet. Diese steht im glei-chen Verzeichnis wie diese Arbeitsmappe, in der sich die oben ange-gebene Prozedur PfadErmitteln() befindet. Dies wird häufig benö-tigt, um sicher zu sein, dass eine Datei im gleichen Verzeichnisgeöffnet wird.

� Zuletzt wird die Arbeitsmappe Test.xlsx geöffnet. Diese steht imUnterverzeichnis Zusatz des Verzeichnisses dieser Arbeitsmappe. Diesoeben geöffnete Arbeitsmappe ist jetzt aktiv.

Hinweis

In den Versionen vor Excel 2007 müssen die Dateibezeichnungen in denentsprechenden Zeilen der Prozedur und in der Erläuterung wie folgt lauten:Mappe3.xls, Mappe1.xls und Test.xls.

Page 56: Einstieg Mit VBA in Excel

55

Tabellenblätter 2.3

Abbildung 2.11 Pfad der Mappe »Test«

2.3 Tabellenblätter

WorksheetsDas Objekt Worksheets ist eine Auflistung, in der sich alle Tabellenblät-ter der jeweiligen Arbeitsmappe befinden.

Zur Bearbeitung eines einzelnen Tabellenblatts gibt es verschiedeneMöglichkeiten:

� ActiveSheet: das aktuell aktive Arbeitsblatt

� Worksheets(Index): Index ist die laufende Nummer des Tabellenblattsinnerhalb der Worksheets-Auflistung, von 1 bis Anzahl (Count).

Worksheets("Name")

� Worksheets("Name"): der Name des Tabellenblatts als Zeichenkette(in Anführungszeichen)

2.3.1 Tabellenblatt erzeugen

Neues BlattMit folgender Prozedur wird in dieser Arbeitsmappe ein neues Tabellen-blatt erzeugt:

Sub NeuesBlatt()ThisWorkbook.ActivateMsgBox Worksheets.CountWorksheets.AddActiveSheet.Name = "Neu"MsgBox Worksheets.Count

End Sub

Zur Erläuterung:

Hinweis

In den folgenden Beispielen für den Einsatz von Worksheets wird jeweils vor-her diese Arbeitsmappe aktiviert. Dies dient der eindeutigen Zuordnung fürden Fall, dass mehrere Arbeitsmappen geöffnet sein sollten.

Page 57: Einstieg Mit VBA in Excel

56

Grundlagen von Objekten und Ereignissen2

� Zunächst wird zur Kontrolle die Anzahl der Tabellenblätter dieserArbeitsmappe (der Wert der Eigenschaft Count des Objekts Work-sheets) ermittelt und ausgegeben.

Add() � Es wird die Methode Add() des Objekts Worksheets aufgerufen.Dadurch wird ein neues Tabellenblatt vor dem aktiven Tabellenblatterzeugt und eingefügt. Das neue Tabellenblatt wird dann automatischzum aktiven Tabellenblatt.

� Durch die Angabe von Parametern könnten Sie genau bestimmen, anwelcher Stelle das neue Tabellenblatt eingefügt werden soll, siehenächster Abschnitt (»Tabellenblatt kopieren«).

ActiveSheet � ActiveSheet bezeichnet das aktuell aktive Tabellenblatt. Der Nameeines Tabellenblatts kann ermittelt bzw. geändert werden.

� Es wird wiederum zur Kontrolle die Anzahl der Tabellenblätter ausge-geben. Sie hat sich erwartungsgemäß um 1 erhöht.

Abbildung 2.12 Neu erzeugtes und eingefügtes Tabellenblatt

2.3.2 Tabellenblatt kopieren

Blatt kopieren Mit folgender Prozedur wird ein Tabellenblatt dieser Arbeitsmappekopiert:

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

End Sub

Zur Erläuterung:

Copy() � Es wird die Methode Copy() des Objekts Worksheets aufgerufen.Dadurch wird ein Tabellenblatt kopiert. Es wird hinter einem Tabel-lenblatt in der gleichen Arbeitsmappe eingefügt, und es wird zumaktiven Tabellenblatt. Beide Tabellenblätter werden über ihrenNamen angesprochen.

After, Before � Bei After handelt es sich um einen benannten Parameter; diese kön-nen mit Hilfe des Operators := (Doppelpunkt Gleichheitszeichen)angegeben werden. Statt After ist auch Before möglich, dann wird

Page 58: Einstieg Mit VBA in Excel

57

Tabellenblätter 2.3

das Tabellenblatt vor einem anderen Tabellenblatt in der gleichenArbeitsmappe eingefügt.

� Falls gar kein Parameter angegeben wird, wird eine neue Arbeits-mappe erzeugt, die die Kopie enthält.

� Zum Abschluss wird noch der Name des Tabellenblatts geändert.

Abbildung 2.13 Kopiertes Tabellenblatt

2.3.3 Tabellenblatt verschieben

Blatt verschiebenMit folgender Prozedur wird ein Tabellenblatt dieser Arbeitsmappe ver-schoben. Die zugehörige Methode Move() arbeitet sehr ähnlich wie dieMethode Copy():

Sub BlattVerschieben()ThisWorkbook.ActivateWorksheets("Tab1Kopie").Move _

Before:=Worksheets("Tabelle1")End Sub

Zur Erläuterung:

Move()� Es wird die Methode Move() des Objekts Worksheets zum Verschie-ben eines Tabellenblatts aufgerufen. Es wird hinter einem Tabellen-blatt in der gleichen Arbeitsmappe eingefügt, und es wird zum akti-ven Tabellenblatt.

After, Before� Statt mit Before hätten wir auch mit After oder ganz ohne Parameterarbeiten können, wie bei Copy().

Hinweis

Falls eine Methode mehrere Parameter hat, werden häufig benannte Para-meter verwendet, siehe Abschnitt 5.3.5. Diese Vorgehensweise bietet fol-gende Vorteile:

� der Parameter kann eindeutig angesprochen werden,

� nicht alle Parameter, die möglich sind, müssen genannt werden und

� das Programm wird lesbarer.

Page 59: Einstieg Mit VBA in Excel

58

Grundlagen von Objekten und Ereignissen2

Abbildung 2.14 Verschobenes Tabellenblatt

2.3.4 Tabellenblatt löschen

Blatt löschen Mit folgender Prozedur werden zwei Tabellenblätter dieser Arbeits-mappe gelöscht:

Sub BlattLoeschen()ThisWorkbook.ActivateWorksheets("Neu").DeleteWorksheets("Tab1Kopie").Delete

End Sub

Zur Erläuterung:

Delete() � Es wird die Methode Delete() des Objekts Worksheets zum Löscheneines Tabellenblatts aufgerufen. Es erscheint jeweils eine Warnung,dass sich darin Daten befinden könnten.

� Beide Tabellenblätter werden über ihren Namen angesprochen.

Abbildung 2.15 Warnung beim Löschen eines Tabellenblatts

2.3.5 Tabellenblatt aktivieren

Blatt aktivieren Mit folgender Prozedur werden nacheinander zwei Tabellenblätter die-ser Arbeitsmappe aktiviert:

Sub BlattAktivieren()ThisWorkbook.ActivateWorksheets("Tabelle3").ActivateMsgBox ActiveSheet.NameWorksheets("Tabelle1").ActivateMsgBox ActiveSheet.Name

End Sub

Page 60: Einstieg Mit VBA in Excel

59

Tabellenblätter 2.3

Zur Erläuterung:

Activate()� Es wird die Methode Activate() des Objekts Worksheets zum Akti-vieren eines Tabellenblatt aufgerufen. Dies ist dann sinnvoll, wennSie sicher sein möchten, anschließend in einem bestimmten Tabellen-blatt weiterzuarbeiten. Aktionen in Zellen oder Bereichen beziehensich anschließend auf dieses Tabellenblatt.

� Zur Kontrolle wird in der Prozedur der Name des jeweils aktivenTabellenblatts ausgegeben.

2.3.6 Tabellenblatt formatieren

CellsDie Eigenschaft Cells eines Tabellenblatts bietet die Möglichkeit, alle Zel-len eines Tabellenblatts zu formatieren. Es können natürlich auch einzelneZellen oder Zellbereiche formatiert werden, dazu mehr ab Abschnitt 2.4.7.

Alle ZellenNachfolgend werden alle Zellen des Tabellenblatts Tabelle3 mit derSchriftart Arial, Schriftgröße 10 formatiert.

Sub BlattFormatieren()ThisWorkbook.ActivateWorksheets("Tabelle3").Cells.Font.Name = "Arial"Worksheets("Tabelle3").Cells.Font.Size = 10

End Sub

Zur Erläuterung:

� Die Eigenschaft Cells bietet Zugriff auf alle Zellen eines Tabellen-blatts.

Font� Die Eigenschaft Font einer Zelle bestimmt die Schriftarteigenschaften.

� Die Untereigenschaften Name und Size dienen zur Festlegung vonName und Größe der Schriftart. Weitere Formatierungsmöglichkeitenerläutert Abschnitt 2.4.9, »Zellformat ›Schrift‹ «.

� An dieser Stelle lässt sich wiederum gut die Objekthierarchie erken-nen. Es wird die Untereigenschaft Name der Untereigenschaft Font derEigenschaft Cells des Tabellenblatts geändert.

2.3.7 Gitternetz, Zeilen- und Spaltenüberschrift

Anzeigefenster gestalten

Sowohl Gitternetzlinien als auch Zeilen- und Spaltenüberschriften kön-nen ein- oder ausgeblendet werden. Dies sind eigentlich Eigenschaftendes Anzeigefensters und nicht des Tabellenblatts. Sie sollen dennoch andieser Stelle aufgeführt werden, da sie thematisch hierher gehören.

Page 61: Einstieg Mit VBA in Excel

60

Grundlagen von Objekten und Ereignissen2

Eine Prozedur zum Ausblenden der genannten Objekte:

Sub BlattGitternetz()ThisWorkbook.ActivateWorksheets("Tabelle3").ActivateActiveWindow.DisplayGridlines = FalseActiveWindow.DisplayHeadings = False

End Sub

Zur Erläuterung:

� Zunächst wird das gewünschte Tabellenblatt aktiviert.

ActiveWindow � Das aktive Fenster (ActiveWindow) enthält nunmehr dieses Tabellen-blatt.

DisplayGridlines � Die Eigenschaft DisplayGridlines bestimmt den Zustand: Gitternetz-linien ein/aus.

DisplayHeadings � Die Eigenschaft DisplayHeadings bestimmt den Zustand: Zeilen- undSpaltenüberschriften ein/aus.

Abbildung 2.16 Tabellenblatt ohne Gitternetz und Überschriften

2.3.8 Seiteneinrichtung

PageSetup Vorbereitungen für einen Ausdruck trifft man bei der Seiteneinrichtung.Für ein vorhandenes Tabellenblatt werden Sie die Seiteneinrichtung vomTabellenblatt aus ausführen. Für ein neues Tabellenblatt, das erst voneiner VBA-Anwendung mit Daten gefüllt wird, können Sie dazu dieEigenschaft PageSetup nutzen. In der folgenden Prozedur wird einekleine Auswahl der zahlreichen Möglichkeiten getroffen.

Zeichen _(Unterstrich)

Hinweis

Einige Anweisungen dieser Prozedur, aber auch noch vieler weiterer Proze-duren, sind sehr lang. Zeilen lassen sich mit Hilfe des Zeichens _ (Unterstrich)in mehrere übersichtliche Programmzeilen zerlegen, siehe Abschnitt 3.1.2,»Zeilen zerlegen«.

Page 62: Einstieg Mit VBA in Excel

61

Tabellenblätter 2.3

Sub BlattSeiteneinrichtung()ThisWorkbook.Activate

' DruckformatWorksheets("Tabelle3").PageSetup.Orientation = _

xlLandscape

' Gitternetz, Zeilen- und SpaltenüberschriftWorksheets("Tabelle3").PageSetup.PrintGridlines = TrueWorksheets("Tabelle3").PageSetup.PrintHeadings = True

' GrößenänderungWorksheets("Tabelle3").PageSetup.Zoom = FalseWorksheets("Tabelle3").PageSetup.FitToPagesWide = 1Worksheets("Tabelle3").PageSetup.FitToPagesTall = 99

' Horizontale ZentrierungWorksheets("Tabelle3").PageSetup.CenterHorizontally = _

True

' Kopf- und FußzeileWorksheets("Tabelle3").PageSetup.LeftHeader = _

"Das ist die Kopfzeile"Worksheets("Tabelle3").PageSetup.CenterFooter = _

"Seite &P von &N"End Sub

Zur Erläuterung:

Orientation� Die Eigenschaft Orientation bestimmt das Druckformat. Es gibt dieMöglichkeiten xlLandscape (Querformat) und xlPortrait (Hochfor-mat).

Druckeigen-schaften

� Ähnlich wie beim Einrichten des Anzeigefensters wird mit den Eigen-schaften PrintGridlines und PrintHeadings festgelegt, ob die Git-ternetzlinien und die Zeilen- und Spaltenüberschriften ausgedrucktwerden sollen oder nicht (True oder False).

Zoom� Mit der Eigenschaft Zoom bestimmen Sie den Prozentsatz zur Vergrö-ßerung oder Verkleinerung des Tabellenblatts für den Ausdruck. Fallsdabei eine Zahl über 100 angegeben wird, wird das Tabellenblatt ver-größert gedruckt. Bei einer Zahl kleiner als 100 wird es verkleinertgedruckt. Der Wert False dient als Vorbereitung für eine Skalierung,die abhängig von der Seitenzahl ist.

Page 63: Einstieg Mit VBA in Excel

62

Grundlagen von Objekten und Ereignissen2

FitToPages... � Falls die Skalierung abhängig von der Seitenzahl ist, wird mit denEigenschaften FitToPagesWide und FitToPagesTall jeweils eine Sei-tenanzahl festgelegt. Damit wird angegeben, auf wie vielen Seiten dasTabellenblatt in der Breite (Wide) und in der Höhe (Tall) ausgedrucktwird.

Center... � Das Arbeitsblatt kann für den Ausdruck horizontal zentriert (Center-Horizontally = True), aber auch vertikal zentriert (CenterVerti-cally = True) werden.

Header, Footer � Den Text und die Anordnung von Kopf- und Fußzeile bestimmen dieEigenschaften ...Header und ...Footer. Es gibt jeweils die PräfixeLeft..., Right... und Center... für die verschiedenen Bereiche. Imvorliegenden Beispiel wurden eine Kopfzeile links und eine Fußzeilezentriert angeordnet. Innerhalb des Texts, der als Zeichenkette zuge-wiesen wird, können bestimmte Variablen eingesetzt werden. Dabeigibt es u. a. die folgenden Möglichkeiten:

� Seitennummer: &P

� Seitenanzahl: &N

� Druckdatum: &D

� Druckuhrzeit: &T

� Pfad zum Verzeichnis der Datei: &Z

� Dateiname: &F

� Tabellenblattname: &A

2.4 Zellen und Zellbereiche

Range, Cells Mit Hilfe von Range bzw. Cells haben Sie zahlreiche Möglichkeiten, aufeinzelne Zellen oder ganze Zellbereiche eines Tabellenblatts zuzugreifen.Range wurde bereits in Abschnitt 1.2, »Arbeiten mit Makros«, in den Bei-spielen zur Makroprogrammierung vorgestellt. Die aktuell aktive Zellezur Bearbeitung wird mit ActiveCell bezeichnet.

Hinweis

In den folgenden Beispielen für den Einsatz von Range und Cells wirdjeweils ein bestimmtes Tabellenblatt in dieser Arbeitsmappe aktiviert. Diesdient der eindeutigen Zuordnung für den Fall, dass vorher eine andereArbeitsmappe oder ein anderes Tabellenblatt aktiviert sein sollte.

Page 64: Einstieg Mit VBA in Excel

63

Zellen und Zellbereiche 2.4

2.4.1 Zellen über »Range« auswählen

ZellbereichMit Hilfe von Range können sowohl zusammenhängende als auch nichtzusammenhängende Zellbereiche ausgewählt werden. Dabei werden einBuchstabe für die Spalte und eine Nummer für die Zeile angegeben.Einige Möglichkeiten sehen Sie in Tabelle 2.1.

Ganze Zeile oder Spalte

Bei den Zellbereichen kann es sich auch um ganze Spalten oder Zeilenhandeln, wie Tabelle 2.2 zeigt.

Beachten Sie, dass auch die beiden letzten Ausdrücke mit Range jeweilsin eine Zeile gehören.

Range Beschreibung

Range("A3").Select einzelne Zelle

Range("A3:F7").Select zusammenhängender Zellbereich

Range("A3, C5, E2").Select mehrere nicht zusammenhängende Zellen

Range("A8, B2:C4, E2").Select mehrere nicht zusammenhängende Zellen bzw. Zellbereiche

Tabelle 2.1 Range, Zellbereiche

Range Beschreibung

Range("A:A").Select ganze Spalte

Range("C:E").Select mehrere zusammenhängende Spalten

Range("B:D, F:F, H:I").Select mehrere nicht zusammenhängende Spalten

Range("3:3").Select ganze Zeile

Range("3:5").Select mehrere zusammenhängende Zeilen

Range("3:5, 8:9, 12:12").Select mehrere nicht zusammenhängende Zeilen

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

eine Mischung aus mehreren Möglich-keiten, siehe Abbildung 2.17

Tabelle 2.2 Range, ganze Spalten, ganze Zeilen

Page 65: Einstieg Mit VBA in Excel

64

Grundlagen von Objekten und Ereignissen2

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

Nicht zusammen-hängender Bereich

Im letzten Beispiel wurden insgesamt vier nicht zusammenhängendeBereiche ausgewählt: zwei rechteckige Bereiche (A2:B4 und G2:H4), zweiganze Spalten (D und E) und zwei ganze Zeilen (7 und 8). Die aktive Zelle(erkennbar am Rahmen) ist die erste ausgewählte Zelle (A2).

Mit folgender Prozedur werden Zellbereiche eines ausgewählten Tabel-lenblatts selektiert. Anschließend wird jeweils die Adresse der aktivenZelle ausgegeben:

Sub ZellenMitRange()ThisWorkbook.Worksheets("Tabelle1").Activate

Range("A2").SelectMsgBox ActiveCell.AddressRange("C4:G7").SelectMsgBox ActiveCell.AddressRange("A5, C3:G7").SelectMsgBox ActiveCell.AddressRange("C3:G7, A5").SelectMsgBox ActiveCell.AddressRange("C:D").SelectMsgBox ActiveCell.Address

End Sub

Zur Erläuterung:

� Das Tabellenblatt Tabelle1 dieser Arbeitsmappe wird aktiviert. Aktio-nen in Zellen oder Bereichen beziehen sich anschließend auf diesesTabellenblatt.

Select() � Es wird die Methode Select() des Objekts Range zum Auswählenvon Zellen aufgerufen.

Page 66: Einstieg Mit VBA in Excel

65

Zellen und Zellbereiche 2.4

ActiveCell� Eine der ausgewählten Zellen ist die aktive Zelle. Diese kann mitActiveCell angesprochen werden. Falls mehrere Zellen ausgewähltwurden, ist die obere linke Zelle des ersten angegebenen Bereichs aktiv.

Address� Allgemein ist Address die Adresse eines Zellbereichs. Hier geht es nurum die Adresse der aktiven Zelle.

Reihenfolge� Nacheinander werden in diesem Beispiel ausgegeben: $A$2, $C$4,$A$5, $C$3, $C$1. Beachten Sie, dass im dritten und vierten Schrittdie gleichen Zellen ausgewählt sind, aber sich die aktive Zelle auf-grund der Reihenfolge unterscheidet.

2.4.2 Zellen über »Cells« auswählen

Eine ZelleCells bietet nicht nur die Möglichkeit, alle Zellen eines Tabellenblatts zuerreichen, sondern auch einzelne Zellen oder Zellbereiche auszuwählen.Dabei werden eine Nummer für die Zeilen und eine Nummer für dieSpalte angegeben.

Das Arbeiten mit Cells bietet gegenüber dem Arbeiten mit Range Vor-teile bei der Programmierung. Sowohl Zeilennummer als auch Spalten-nummer können dann mit Hilfe von Variablen gebildet werden.

Mit folgender Prozedur werden Zellbereiche eines ausgewählten Tabel-lenblatts mit einem Wert versehen:

Sub ZellenMitCells()ThisWorkbook.Worksheets("Tabelle1").ActivateCells(1, 5).Value = "abc"Range(Cells(3, 5), Cells(4, 7)).Value = "xyz"

End Sub

Zur Erläuterung:

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

Range mit Cells� In Verbindung mit Range können auch Zellbereiche ausgewählt wer-den. Hier ist dies der Bereich von Zelle 3, 5 (= E3) bis Zelle 4, 7 (= G4).

Abbildung 2.18 Arbeiten mit »Cells«

Page 67: Einstieg Mit VBA in Excel

66

Grundlagen von Objekten und Ereignissen2

2.4.3 Zellinhalte verschieben oder kopieren

Mit folgender Prozedur werden in einem ausgewählten Tabellenblatt:

� die Inhalte eines Zellbereichs verschoben

� die Inhalte eines anderen Zellbereichs kopiert

Besserer Code Beides haben Sie bereits im ersten Abschnitt mit Makros durchgeführt.Die hier vorgestellte Methoden umfassen weniger Codezeilen, sind bes-ser zu warten und schneller im Ablauf:

Sub ZellinhalteVerschiebenKopieren()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A1:A2").Cut Destination:=Range("C1")Range("A5:A6").Copy Destination:=Range("C5")

End Sub

Zur Erläuterung:

Cut() � Es wird die Methode Cut() des Objekts Range zum Ausschneiden vonZellen aufgerufen.

Destination � Falls ein Ziel mit dem optionalen Parameter Destination angege-ben ist, dann werden die Zellen dorthin verschoben.

� Falls kein Ziel angegeben ist, dann werden die Zellen in die Zwi-schenablage verschoben und können an anderer Stelle wieder ein-gefügt werden.

Copy() � Es wird die Methode Copy() des Objekts Range zum Kopieren vonZellen aufgerufen. Wie bei der Methode Cut() kann ein Ziel angege-ben werden, ansonsten liegt die Kopie in der Zwischenablage undkann an anderer Stelle wieder eingefügt werden.

Vor dem Ablauf der Prozedur:

Abbildung 2.19 Originalinhalte

Nach dem Ablauf der Prozedur:

Page 68: Einstieg Mit VBA in Excel

67

Zellen und Zellbereiche 2.4

Abbildung 2.20 Nach dem Verschieben und Kopieren

2.4.4 Teile von Zellinhalten kopieren

ZwischenablageIm vorherigen Abschnitt wurde bereits darauf hingewiesen, dass Zell-inhalte auch in die Zwischenablage kopiert werden können. Dies ist vonVorteil, falls Sie nur ausgewählte Teile des Zellinhalts kopieren möchten,z. B. nur die Werte oder nur die Formate. Dies zeigt das folgende Bei-spiel:

Sub TeileKopieren()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A1:A2").CopyRange("C1").PasteSpecial xlPasteValuesRange("A5:A6").CopyRange("C5").PasteSpecial xlPasteFormats

End Sub

Zur Erläuterung:

� Es wird zweimal die Methode Copy() zum Kopieren eines Bereichesin die Zwischenablage aufgerufen.

PasteSpecial()� In beiden Fällen wird die Methode PasteSpecial() zum Einfügenspezieller Teile von Zellinhalten aufgerufen. Beim ersten Mal werdennur die Werte eingefügt, beim zweiten Mal nur die Formate.

Vor dem Ablauf der Prozedur:

Abbildung 2.21 Originalinhalte und -formate

Page 69: Einstieg Mit VBA in Excel

68

Grundlagen von Objekten und Ereignissen2

Nach dem Ablauf der Prozedur:

Abbildung 2.22 Nach dem Kopieren von Werten bzw. Formaten

2.4.5 Zellinhalt löschen

Löschen Mit folgender Prozedur werden bestimmte Zellinhalte gelöscht:

Sub ZellinhaltLoeschen()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A1:A2").ClearRange("A3:A4").ClearContentsRange("A5:A6").ClearFormats

End Sub

Zur Erläuterung:

Clear() � Die Methode Clear() des Objekts Range dient zum Löschen von Zell-inhalten, inklusive Formatierung und Kommentaren.

ClearContents() � Mit Hilfe der Methode ClearContents() werden nur die Inhaltegelöscht. Formate und Kommentare bleiben erhalten.

ClearFormats() � Die Methode ClearFormats() wird zum Löschen der Formategenutzt. Inhalte und Kommentare bleiben erhalten.

Vor dem Ablauf der Prozedur:

Abbildung 2.23 Originalinhalte und -formate

Page 70: Einstieg Mit VBA in Excel

69

Zellen und Zellbereiche 2.4

Nach dem Ablauf der Prozedur:

Abbildung 2.24 Nach dem Löschen von Werten und Formaten

2.4.6 Werte und Formeln eintragen

Zellinhalte eintragen

Mit folgender Prozedur werden Zahlen, Datumsangaben, Prozentzahlenund Formeln in Zellen eingetragen:

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

' ZahlRange("A1").Value = 5.8Range("A2").Value = 1629.9Range("A3").FormulaLocal = "=SUMME(A1:A2)"

' DatumRange("A4").Value = "2010/03/31"Range("A5").Value = "2009/11/10"Range("A6").FormulaLocal = "=A4-A5"

' ZahlRange("A7").Value = 0.125

End Sub

Abbildung 2.25 zeigt das Ergebnis.

Abbildung 2.25 Werte und Formeln eintragen

Page 71: Einstieg Mit VBA in Excel

70

Grundlagen von Objekten und Ereignissen2

Zur Erläuterung:

Value � Mit Hilfe der bereits bekannten Eigenschaft Value bekommen die Zel-len A1 und A2 jeweils einen Zahlenwert zugewiesen.

Punkt stattKomma

� Bei Zahlen mit Nachkommastellen ist ein Punkt statt eines Kommaseinzutragen.

FormulaLocal � Die Formel =SUMME(A1:A2) wird als Wert der Eigenschaft Formula-Local in der von Excel gewohnten Form (in Deutsch) eingetragen. Inder Bearbeitungszeile ist erkennbar, dass der Inhalt der Zelle A3 nachwie vor eine Formel ist.

Datum � Bei Datumsangaben dürfen die Anführungsstriche nicht fehlen. Esempfiehlt sich, die amerikanische Schreibweise zu benutzen, dannwerden die Werte direkt als Datumsangaben erkannt und formatiert(führende Nullen).

� Die Formel =A4-A5 dient zur Berechnung der Tagesdifferenz zwischenden beiden Datumsangaben.

� Der Inhalt der Zelle A7 ist wiederum ein Zahlenwert.

2.4.7 Zellformat »Zahlen«

Format eintragen Mit folgender Prozedur werden die Formate für Zahlen, Datumsangabenund Prozentzahlen in Zellen eingetragen:

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

' ZahlRange("A1:A3").NumberFormatLocal = "#.##0,00 €"

' DatumRange("A4:A5").NumberFormatLocal = _

"TTTT, ""den"" TT. MMMM JJ"Range("A6").NumberFormatLocal = "0 ""Tage"""

' ProzentRange("A7").NumberFormatLocal = "0,00 %"

End Sub

Das Ergebnis sehen Sie in Abbildung 2.26.

Page 72: Einstieg Mit VBA in Excel

71

Zellen und Zellbereiche 2.4

Abbildung 2.26 Zellformat Zahlen

Zur Erläuterung:

NumberFormat-Local

� Mit Hilfe der Eigenschaft NumberFormatLocal können Formate in dervon Excel gewohnten Form (in Deutsch) eingetragen werden.

Formatierungs-zeichen

� Bei Zahlen, Währungs- oder Prozentangaben werden im Beispiel diefolgende Zeichen verwendet:

� #: Ziffer nur anzeigen, falls vorhanden

� 0: Ziffer immer anzeigen

� , (Komma): Abtrennung der Nachkommastellen

� . (Punkt): Tausenderpunkt

� € (Euro): Währungszeichen

� % (Prozent): Zahl wird durch 100 geteilt und mit einem Prozentzei-chen dargestellt

Datumsformat� Bei Datumsangaben werden im Beispiel die folgenden Zeichen ver-wendet:

� TTTT: Wochentagsname in Deutsch, ausgeschrieben

� TT: zwei Ziffern für den Tag im Monat

� MMMM: Monatsname in Deutsch, ausgeschrieben

� JJ: zwei Ziffern für das Jahr

Text im Format� Eine Besonderheit ist zu beachten: Falls Text (z. B. die Wörter denoder Tage) in das Format integriert wird, so ist dieser bekanntlich inExcel in doppelten Anführungsstrichen zu notieren. So kann keinKonflikt mit den festen Formatangaben auftreten. Da der Wert derEigenschaft NumberFormatLocal schon in doppelten Anführungszei-chen steht, muss dieser Formatierungstext in zweifachen doppeltenAnführungsstrichen stehen.

Page 73: Einstieg Mit VBA in Excel

72

Grundlagen von Objekten und Ereignissen2

2.4.8 Zellformat »Ausrichtung«

Ausrichten Mit folgender Prozedur werden Zellen auf verschiedene Art und Weiseausgerichtet:

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

Range("C1").Value = "Hallo"Range("C1").HorizontalAlignment = xlCenterRange("C1").VerticalAlignment = xlTop

Range("C2").Value = "Das ist ein längerer Text"Range("C2").WrapText = True

Range("C3").Value = "Hallo"Range("C3:C7").MergeCells = TrueRange("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 Erläuterung:

...Alignment � Text wird mit Hilfe der Eigenschaft HorizontalAlignment und Ver-ticalAlignment ausgerichtet. Zulässige Konstanten für

� die horizontale Ausrichtung sind z. B. xlLeft (linksbündig),xlRight (rechtsbündig), xlCenter (zentriert) und xlJustify

(Blocksatz);

Page 74: Einstieg Mit VBA in Excel

73

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 längerer Texte:

� Falls WrapText den Wert True hat, wird der Text innerhalb derZelle über mehrere Zeilen verteilt.

� Falls WrapText den Wert False hat, wird der Text nur in einer Zeilegeschrieben, die gegebenenfalls über den rechten Rand der Zellehinausgeht.

MergeCells� Die Eigenschaft MergeCells bestimmt darüber, ob Zellen verbundenwerden können:

� Wenn MergeCells den Wert True hat, werden die Zellen desgenannten Bereichs miteinander verbunden dargestellt.

� Wenn MergeCells den Wert False hat, werden die Zellen desgenannten Bereichs einzeln dargestellt.

Orientation� Die einzelnen Zeichen eines Zellinhalts können mit Hilfe der Eigen-schaft Orientation

� übereinander geschrieben werden, mit dem Wert xlVertical;

� in einem schrägen Winkel geschrieben werden, mit einem Zahlen-wert zwischen –90 Grad und +90 Grad. Der Normalwert ist 0 Grad.

2.4.9 Zellformat »Schrift«

SchriftMit folgender Prozedur werden die Schrifteigenschaften von Zellenbestimmt:

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

End Sub

Das Ergebnis:

Abbildung 2.28 Zellformat »Schrift«

Page 75: Einstieg Mit VBA in Excel

74

Grundlagen von Objekten und Ereignissen2

Zur Erläuterung:

Font � Die Eigenschaft Font steht für die Formatierung der Schriftart in derZelle. Sie hat zahlreiche Untereigenschaften, zum Beispiel:

� Name für den Namen der Schriftart

� Bold für fett (True oder False)

� Italic für kursiv (True oder False)

� Underline für unterstrichen (True oder False)

� Size für die Größe der Schrift

� Color für die Farbe der Schrift

Farbe � Farben können auf verschiedene Art und Weise angegeben werden,zum Beispiel:

� Speziell für die Grundfarben mit Hilfe von Farbkonstanten, sieheAbschnitt 3.2.4, »Konstanten«.

RGB() � Allgemein mit der Funktion RGB(). Diese Funktion hat drei Para-meter, die für Rot-, Grün- und Blau-Werte der Farbe stehen,jeweils zwischen 0 und 255. Im vorliegenden Beispiel hätte alsodie folgende Anweisung dasselbe bewirkt: Range("C1").Font.Color = RGB(255, 0, 0)

2.4.10 Einzelne Zeichen formatieren

Zeichen-formatierung

Mit folgender Prozedur werden einzelne Zeichen innerhalb einer Zei-chenkette 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 = TrueRange("E4:E6").Characters(8, 2).Font.Subscript = True

End Sub

Das Ergebnis:

Page 76: Einstieg Mit VBA in Excel

75

Zellen und Zellbereiche 2.4

Abbildung 2.29 Einzelne Zeichen formatieren

Zur Erläuterung:

Characters� Die Eigenschaft Characters liefert Teile einer Zeichenfolge. Diesekönnen anschließend separat formatiert werden. Es müssen zweiWerte festgelegt werden:

� Die erste Ziffer bestimmt die Stelle, an der die Teilzeichenfolgebeginnt. Das erste Zeichen einer Zeichenfolge hat die Nummer 1.

� Die zweite Ziffer bestimmt die Länge der Teilzeichenfolge.

Superscript� Im ersten Beispiel wird die Zeichenfolge 2 geliefert. Mit Hilfe derUntereigenschaft Superscript der Font-Eigenschaft des Textes wirddieses Zeichen hochgestellt.

Subscript� Im zweiten Beispiel werden für insgesamt drei Zellen jeweils die bei-den Zeichenfolgen 38 und 39 geliefert. Mit Hilfe der UntereigenschaftSubscript der Font-Eigenschaft des Textes wird dieses Zeichen tief-gestellt.

2.4.11 Zellformat »Rahmen«

RahmenMit folgender Prozedur werden Zellen ganz oder teilweise eingerahmt:

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

Range("E3").Borders.LineStyle = xlDoubleRange("E3").Borders.Weight = xlThickRange("E3").Borders.Color = vbGreen

Range("E4:E6").Borders(xlEdgeLeft).Weight = xlThinRange("E4:E6").Borders(xlEdgeRight).Weight = xlThinRange("E4:E6").Borders(xlInsideHorizontal).Weight = _

xlHairlineEnd Sub

Page 77: Einstieg Mit VBA in Excel

76

Grundlagen von Objekten und Ereignissen2

Das Ergebnis:

Abbildung 2.30 Zellformat »Rahmen«

Zur Erläuterung:

Borders � Die Eigenschaft Borders dient zur Bearbeitung des Rahmens.

� Falls nach Borders keine weitere Angabe in Klammern erfolgt,werden Eigenschaften für den gesamten Rahmen eingestellt.

Rahmenteile � Es können aber auch die Eigenschaften einzelner Teile des Rah-mens bestimmt werden. Zulässige Konstanten sind z. B.: xlEdge-Left (linker Rahmen), xlEdgeRight (rechter Rahmen), xlEdgeTop(oberer Rahmen), xlEdgeBottom (unterer Rahmen), xlInsideHo-rizontal (innere horizontale Zwischenlinien), xlInsideVertical(innere vertikale Zwischenlinien).

LineStyle � Mit der Eigenschaft LineStyle wird die Linienart für den Rahmenfestgelegt. Zulässige Konstanten sind z. B.: xlContinuous (durchge-hende Linie), xlDot (gepunktete Linie) und xlDouble (doppelte Linie).

Weight � Die Eigenschaft Weight bestimmt die Dicke des Rahmens. ZulässigeKonstanten sind: xlHairline (ganz dünne Linie), xlThin (dünneLinie), xlMedium (mitteldicke Linie) und xlThick (dicke Linie).

Color � Durch die Eigenschaft Color wird die Rahmenfarbe bestimmt. Wiebei allen Farbangaben kann mit den Farbkonstanten oder mit derFunktion RGB() gearbeitet werden.

2.4.12 Zellformat »Muster«

Muster Mit folgender Prozedur wird das Hintergrundmuster der zwei Zellen E3und E6 gestaltet:

Sub ZellformatMuster()ThisWorkbook.Worksheets("Tabelle2").ActivateRange("E3, E6").Interior.Color = vbYellow

End Sub

Page 78: Einstieg Mit VBA in Excel

77

Zellen und Zellbereiche 2.4

Das Ergebnis:

Abbildung 2.31 Zellformat »Muster«

Zur Erläuterung:

Interior� Die Eigenschaft Interior dient zur Bearbeitung des Innenbereichseiner Zelle.

� Sie hat verschiedene Untereigenschaften, u. a. Color für die Innen-farbe.

2.4.13 Zellen einfügen

Zellbereiche einfügen

Mit folgender Prozedur werden Zellbereiche in einem ausgewähltenTabellenblatt eingefügt:

Sub ZelleEinfuegen()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A2:A3").Insert Shift:=xlShiftDownRange("6:7").Insert

End Sub

Zur Erläuterung:

Insert()� Es wird die Methode Insert() des Objekts Range zum Einfügen vonZellen aufgerufen.

Shift� Mit Hilfe des optionalen Parameters Shift entscheiden Sie, was mitden Nachbarzellen passieren soll. Falls dieser Parameter weggelassenwird, entscheidet Excel anhand der Bereichsform.

� Im ersten Fall werden die unteren Nachbarzellen nach unten verscho-ben. Dazu dient die Konstante xlShiftDown. Die Konstante xlShift-ToRight hätte die rechten Nachbarzellen nach rechts verschoben.

� Im zweiten Fall sind ganze Zeilen ausgewählt. Es kann nur eine Ver-schiebung nach unten stattfinden, daher macht die Angabe des Para-meters Shift keinen Sinn.

Page 79: Einstieg Mit VBA in Excel

78

Grundlagen von Objekten und Ereignissen2

Vor dem Ablauf der Prozedur:

Abbildung 2.32 Original-Struktur der Tabelle

Nach dem Ablauf der Prozedur:

Abbildung 2.33 Nach dem Einfügen von Zellen und Zeilen

EntireRow,EntireColumn

2.4.14 Zellen löschen

Löschen Mit folgender Prozedur werden Zellbereiche eines ausgewählten Tabel-lenblatts gelöscht:

Sub ZelleLoeschen()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("6:7").DeleteRange("A2:A3").Delete Shift:=xlShiftUp

End Sub

Hinweis

Die Anweisung Range("A2:A3").EntireRow.Insert würde zwei ganze neueZeilen vor den Zeilen des angegebenen Bereichs einfügen, hier also vor denZeilen 2 und 3. Entsprechend würde durch die Anweisung Range("A2:A3").EntireColumn.Insert eine ganze neue Spalte vor der Spalte A eingefügt.

Page 80: Einstieg Mit VBA in Excel

79

Zellen und Zellbereiche 2.4

Zur Erläuterung:

Delete()� Es wird die Methode Delete() des Objekts Range zum Löschen vonZellen aufgerufen.

Shift� Auch hier gibt es einen optionalen Parameter Shift, mit dem Sie ent-scheiden, was mit den Nachbarzellen passieren soll. Falls dieser Para-meter weggelassen wird, entscheidet Excel wiederum aufgrund derBereichsform.

� Im ersten Fall sind ganze Zeilen ausgewählt. Es kann nur eine Ver-schiebung (aller Zeilen darunter) nach oben stattfinden, daher ergibtdie Angabe des Parameters Shift keinen Sinn.

� Im zweiten Fall werden die unteren Nachbarzellen nach oben ver-schoben. Dazu dient die Konstante xlShiftUp. Die Konstante xl-ShiftToLeft hätte die rechten Nachbarzellen nach links verschoben.

Im vorliegenden Beispiel wird durch das Löschen von Zellen und Zeilendas vorherige Einfügen von Zellen und Zeilen rückgängig gemacht.

EntireRow, EntireColumn

2.4.15 Zeilenhöhe und Spaltenbreite

Höhe, BreiteMit folgender Prozedur werden die Höhe bestimmter Zeilen und dieBreite bestimmter Spalten eingestellt:

Sub HoeheBreite()ThisWorkbook.Worksheets("Tabelle2").ActivateRange("1:2").RowHeight = 55Range("B:B,D:D").ColumnWidth = 3

End Sub

Das Ergebnis ist in Abbildung 2.34 dargestellt.

Zur Erläuterung:

� Als Zellbereich werden die Zeilen 1 und 2 sowie die Spalten B und Dausgewählt.

RowHeight� Die Eigenschaft RowHeight verändert die Zeilenhöhe.

ColumnWidth� Die Eigenschaft ColumnWidth bestimmt die Spaltenbreite.

Hinweis

Die Anweisung Range("A2:A3").EntireRow.Delete würde die gesamtenZeilen des angegebenen Bereichs löschen, hier also die Zeilen 2 und 3. Ent-sprechend würde durch die Anweisung Range("A2:A3").EntireColumn.Delete die gesamte Spalte A gelöscht.

Page 81: Einstieg Mit VBA in Excel

80

Grundlagen von Objekten und Ereignissen2

Abbildung 2.34 Zeilenhöhe und Spaltenbreite

AutoFit, Columns,Rows

2.4.16 Benutzten Zellbereich erkennen

Benutzter Bereich Eine nützliche Eigenschaft eines Tabellenblatts ist der benutzte Bereich(UsedRange). Damit ist der kleinste zusammenhängende rechteckige Zell-bereich gemeint, der alle nicht leeren Zellen umfasst.

Nicht leere Zelle Das Problem ist nur: nicht alle Inhalte einer Zelle kann man sehen. Auchdie Formatierung einer Zelle kann einen Inhalt darstellen. Falls einDatum in eine Zelle geschrieben wurde und anschließend wiedergelöscht wurde, dann ist die Zelle nach wie vor mit dem Datumsformatformatiert. Somit wird sie in den UsedRange einbezogen. Um hier sicherzu gehen, könnte man (je nach Anwendung) vor dem Einfügen neuerDaten alle Zellen der Tabelle löschen (mit Cells.Delete).

Mit folgender Prozedur werden alle Zellen des benutzten Bereichs durcheinen roten Rahmen hervorgehoben und gezählt:

Sub BenutzterBereich()ThisWorkbook.Worksheets("Tabelle1").ActivateActiveSheet.UsedRange.Borders.Color = vbRedActiveSheet.UsedRange.Interior.Color = vbYellowMsgBox "Anzahl: " & ActiveSheet.UsedRange.Count

End Sub

Nehmen wir an, folgende Zellen wurden benutzt:

Hinweis

Die optimale Einstellung der Zeilenhöhe und der Spaltenbreite lässt sichüber die Methode AutoFit() des Unterobjekts Columns bzw. Rows erreichen.Ein Beispiel: Range("G:G").Columns.AutoFit stellt die Breite der Spalte Goptimal ein. Range("1:2").Rows.AutoFit stellt die Höhe der Zeilen 1 und 2optimal ein.

Page 82: Einstieg Mit VBA in Excel

81

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 Erläuterung:

UsedRange� Mit ActiveSheet.UsedRange werden alle benutzten Zellen des akti-ven Tabellenblatts erfasst.

� Die Eigenschaft Count ergibt für einen Range, wie bei Arbeitsmappenoder Tabellenblättern, eine Anzahl. In diesem Falle beträgt die Anzahl10 Zellen.

2.4.17 Spezielle Zellen erkennen

SpecialCellsDie Methode SpecialCells ist in der Lage, spezielle Zellen zu erkennen.Anschließend können diese Zellen besonders bearbeitet bzw. hervorge-hoben werden. Im folgenden Beispiel werden farblich hervorgehobenbzw. gezählt:

� 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

Page 83: Einstieg Mit VBA in Excel

82

Grundlagen von Objekten und Ereignissen2

'Zellen mit FormelnRange("A1:A8").SpecialCells(xlCellTypeFormulas). _

Interior.Color = vbYellowMsgBox "Formeln: " & Range("A1:A9"). _

SpecialCells(xlCellTypeFormulas).Count

'Leere ZellenRange("A1:A8").SpecialCells(xlCellTypeBlanks). _

Interior.Color = vbCyanMsgBox "Leer: " & Range("A1:A8").SpecialCells _

(xlCellTypeBlanks).Count'Letzte benutzte ZelleActiveSheet.UsedRange.SpecialCells _

(xlCellTypeLastCell).Interior.Color = vbGreenMsgBox "Letzte Zeile: " & ActiveSheet.UsedRange. _

SpecialCells(xlCellTypeLastCell).RowMsgBox "Letzte Spalte: " & ActiveSheet.UsedRange. _

SpecialCells(xlCellTypeLastCell).ColumnEnd Sub

Abbildung 2.37 zeigt das Ergebnis.

Abbildung 2.37 Spezielle Zellen

Zur Erläuterung:

SpecialCells � Die Methode SpecialCells bekommt einen bestimmten Zelltyp inForm einer Konstante übergeben.

Zelle mit Formel � Der Typ xlCellTypeFormulas liefert Zellen, die Formeln enthalten.Hier sind dies die Zellen A3 und A6.

Page 84: Einstieg Mit VBA in Excel

83

Zellen und Zellbereiche 2.4

Leere Zelle� Der Typ xlCellTypeBlanks liefert Zellen, die leer sind, hier die ZelleA8.

Letzte Zelle� Der Typ xlCellTypeLastCell liefert die letzte Zelle eines Bereichs. Indiesem Falle ist es der benutzte Bereich (UsedRange), es handelt sichum die Zelle E8.

� Mit Hilfe der Eigenschaften Row und Column können Sie sich die Zei-lennummer und die Spaltennummer einer Zelle angeben lassen. Indiesem Falle ist es die Zeile und die Spalte der letzten Zelle des benutz-ten Bereichs.

2.4.18 Versatz mit Offset

OffsetMit dem Offset für einen Zellbereich bezeichnet man einen zweiten Zell-bereich, der gegenüber dem Ursprungsbereich versetzt ist. DieserBereich ist wiederum ein Range-Objekt. Dieser Versatz kann sowohl inBezug auf einzelne Zellen als auch in Bezug auf zusammenhängende odernicht zusammenhängende Zellbereiche angewendet werden. Hier einBeispiel:

Sub ZellOffset()ThisWorkbook.Worksheets("Tabelle3").Activate

' Offset berechnenCells(4, 3).Value = "Ber 1"Cells(4, 3).Offset(0, 2).Value = "Off(0,2)"Cells(4, 3).Offset(-3, 1).Value = "Off(-3,1)"Cells(4, 3).Offset(-2, –1).Value = "Off(-2,-1)"

' Offset eines BereichsRange("C6:D8,E9").Value = "Ber 2"Range("C6:D8,E9").Offset(4, 0).Value = "Off(4,0)"

' Offset-relative ZellenCells(4, 3).Offset(0, 2).Range("A2").Value = "A2"Cells(4, 3).Offset(0, 2).Range("A3").Value = "A3"Cells(4, 3).Offset(0, 2).Range("B1").Value = "B1"Cells(4, 3).Offset(0, 2).Range("B2").Value = "B2"

Hinweis

Bei einem Zellbereich wird mit den Eigenschaften Row bzw. Column die Num-mer der Zeile bzw. der Spalte der aktiven Zelle ausgegeben. Ein Beispiel:Range("A3:B5").Row ergibt 3, Range("A3:B5").Column ergibt 1.

Page 85: Einstieg Mit VBA in Excel

84

Grundlagen von Objekten und Ereignissen2

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

Offset berechnen:

� Ausgangszelle ist die Zelle (4, 3) oder anders bezeichnet: C4.

Zeile, Spalte � Bei einem Offset wird zuerst der Versatz für die Zeile, dann für dieSpalte angegeben.

� Falls der Ursprungsbereich mit Cells angegeben ist, können Sie denversetzten Bereich leicht ermitteln, indem Sie die Zahlen für die Zeileund die Spalte jeweils addieren.

Negativer Offset � Ein Offset kann auch negativ sein, dann handelt es sich um Zeilenoberhalb oder um Spalten links vom Ursprungsbereich.

� Die drei Offsetangaben für den ersten Bereich ergeben:

� 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

Page 86: Einstieg Mit VBA in Excel

85

Zellen und Zellbereiche 2.4

� Die Offsetangabe für den nicht zusammenhängenden Zellbereichergibt einen gleichartigen Bereich, der um vier Zeilen (Offset(4, 0))nach unten verschoben ist.

Abbildung 2.39 zeigt das Ergebnis.

Offset-relative Zellen:

Offset-relative Bezeichnung

� Die erste Zelle eines Offsets, egal ob einzelne Zelle oder Zellbereich,wird relativ mit A1 bezeichnet. So können Sie jede Zelle im Offset ein-deutig erreichen.

� Im Beispiel sind die Zellen A2, A3, B1, B2 und B3 des Offsets beson-ders hervorgehoben.

Das Ergebnis:

Abbildung 2.40 Offset-relative Zellen

2.4.19 Zellbereich sortieren

SortierenDie Methode Sort() des Range-Objekts bietet zahlreiche Möglichkeiten,Zellbereiche zu sortieren. Ausgangspunkt soll die folgende Tabelle sein:

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

Page 87: Einstieg Mit VBA in Excel

86

Grundlagen von Objekten und Ereignissen2

Zunächst die Prozedur für die Sortierung nach Nummer:

Sub SortierenNummer()ThisWorkbook.Worksheets("Tabelle4").ActivateRange("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 Erläuterung:

� Es wird der angegebene Bereich (A1:C4) sortiert.

Sort() � Die Methode Sort() hat zahlreiche Parameter, daher werden dieParameter beim Aufruf benannt.

Key1 � Der Parameter Key1 gibt den Bereich an, in dem der Sortierschlüsselsteht. Hier ist dies die dritte Spalte mit der Nummer, also C1:C4.

Order1 � Der Parameter Order1 bestimmt darüber, ob aufsteigend (xlAscen-ding) oder absteigend (xlDescending) sortiert wird. Da aufsteigendeSortierung der Standard ist, muss der Parameter nicht angegeben wer-den.

Header � Über den Parameter Header legen Sie fest, ob die oberste Zeile desBereichs als Überschrift erkannt werden soll. Der Standard ist xlNo,daher wird hier xlYes angegeben. Falls der Wert xlGuess angegebenwird, entscheidet Excel, ob eine Überschrift vorhanden ist, und rea-giert entsprechend.

Es folgt die Prozedur für die Sortierung nach Nachname und Vorname:

Sub SortierenName()ThisWorkbook.Worksheets("Tabelle4").ActivateRange("A1:C4").Sort Key1:=Range("A1:A4"), _

Key2:=Range("B1:B4"), Header:=xlYesEnd Sub

Abbildung 2.43 zeigt das Ergebnis.

Page 88: Einstieg Mit VBA in Excel

87

Zellen und Zellbereiche 2.4

Abbildung 2.43 Sortierung nach Nachname und Vorname

Zur Erläuterung:

Key2� Der Parameter Key2 gibt den Bereich an, in dem der zweite Sortier-schlüssel steht. Es wird also zunächst nach der ersten Spalte mit denNachnamen sortiert, bei gleichem Nachnamen nach der zweitenSpalte mit den Vornamen.

� Es können bis zu drei Sortierschlüssel (Key1 bis Key3) angegeben wer-den. Auf- bzw. absteigende Sortierung wird über die ParameterOrder1 bis Order3 bestimmt.

Mehr als drei Sortierschlüssel

Mehr Sortier-schlüssel

Falls man mehr als drei Sortierschlüssel benötigt, dann kann das ObjektSort des Tabellenblatts verwendet werden. Im nachfolgenden Beispielwerden insgesamt 5 Sortierschlüssel eingesetzt. Der gewünschte Bereichwird zunächst nach dem ersten Schlüssel sortiert. Falls dabei gleiche Ein-träge vorliegen, wird nach dem zweiten Schlüssel sortiert und so weiter.Diese Möglichkeit gibt es erst seit Excel 2007.

Sub SortierenVieleSchlüssel()ThisWorkbook.Worksheets("Tabelle4").Activate

' Alte Sortiereinstellungen löschenActiveSheet.Sort.SortFields.Clear

' Insgesamt 5 Sortierschlüssel einstellenActiveSheet.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 sollActiveSheet.Sort.SetRange Range("A1:E6")

Page 89: Einstieg Mit VBA in Excel

88

Grundlagen von Objekten und Ereignissen2

' Sortierung anwenden = durchführenActiveSheet.Sort.Apply

End Sub

Zur Erläuterung:

SortFields � Zunächst werden mithilfe der Methode Clear() evtl. vorhandene alteSortiereinstellungen aus der Auflistung SortFields der Sortierschlüs-sel gelöscht.

Add() � Die Methode Add()dient zum Hinzufügen der Bereiche, in denen dieSortierschlüssel stehen, zu der Auflistung SortFields.

� Im vorliegenden Beispiel wird zunächst nach den Einträgen imBereich A1 bis A6 sortiert. Falls es Daten gibt, die in diesem Bereichübereinstimmen, so werden diese Daten nach den Einträgen imBereich B1 bis B6 sortiert usw.

Sort() � Mithilfe der Methode SetRange() wird der Bereich festgelegt, dersortiert werden soll.

Apply() � Die Methode Apply() dient zur Ausführung der Sortierung.

2.5 Ereignisprozeduren

Ereignis passiert Ereignisse sagen etwas darüber aus, was gerade mit einem Objekt pas-siert. Es können Ereignisse bezüglich Arbeitsmappen, Tabellenblätternoder Zellbereichen stattfinden. Diese können mit VBA-Code verbundenwerden, so dass automatisch weitere Aktionen folgen.

Klassenmodul Der VBA-Code von Ereignissen muss in den bereits vorhandenen Klas-senmodulen eingetragen werden. Nach Erzeugen einer neuen Arbeits-mappe gibt es bereits die Klassenmodule DieseArbeitsmappe undTabelle1 bis Tabelle3. Ein Doppelklick auf eines der Klassenmodule imProjekt-Explorer führt dazu, dass das betreffende Codefenster angezeigtwird.

Ereignisauswählen

Oberhalb des Codefensters wählen Sie in der linken Liste das Objekt(Workbook oder Worksheet), in der rechten Liste anschließend das Ereig-nis aus. Es wird ein leerer Prozedurrahmen angezeigt, in dem die Ereig-nisprozedur geschrieben werden kann.

Noch umfangreicher sind die Möglichkeiten der Ereignisprogrammie-rung bei eigenen Dialogfeldern. Diese werden in Kapitel 10, »Dialogfel-der«, beschrieben.

Page 90: Einstieg Mit VBA in Excel

89

Ereignisprozeduren 2.5

2.5.1 Arbeitsmappe wird geöffnet

Mappe öffnenMit folgender Prozedur wird beim Öffnen der Arbeitsmappe gleichzeitigeine zweite Arbeitsmappe geöffnet:

Private Sub Workbook_Open()MsgBox ActiveWorkbook.NameWorkbooks.Open "C:\Temp\Mappe3.xlsm"

End Sub

Zur Erläuterung:

Workbook_Open()

� Es wird die Ereignisprozedur Workbook_Open() durchlaufen.

� Nach einer Kontrollausgabe wird eine zweite Arbeitsmappe geöffnet.

Testen Sie die Prozedur, indem Sie Excel vollständig schließen undanschließend die Arbeitsmappe, die die oben angegebene Prozedur ent-hält, öffnen.

2.5.2 Arbeitsmappe wird geschlossen

Mappe schließenMit folgender Prozedur im Klassenmodul DieseArbeitsmappe wird eineArbeitsmappe vor dem Schließen ohne weitere Nachfrage automatischgespeichert:

Private Sub Workbook_BeforeClose(Cancel As Boolean)ThisWorkbook.Save

End Sub

Zur Erläuterung:

Workbook_BeforeClose

� Es wird die Ereignisprozedur Workbook_BeforeClose() durchlaufen.

� Verhalten ohne diese Prozedur: Falls der Benutzer die Arbeitsmappeändert und schließt, wird er gefragt, ob er die Arbeitsmappe spei-chern möchte. Diese Prozedur umgeht das, weil das Ereignis Before-Close vor der Nachfrage auftritt.

� Innerhalb der Prozedur wird die Arbeitsmappe mit Hilfe der MethodeSave() gespeichert.

Testen Sie die Prozedur, indem Sie eine Änderung vornehmen und dieArbeitsmappe schließen.

Hinweis

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

Page 91: Einstieg Mit VBA in Excel

90

Grundlagen von Objekten und Ereignissen2

2.5.3 Tabellenblatt wird aktiviert

Blatt aktivieren Mit folgender Prozedur in einem Klassenmodul wird nach dem Aktivie-ren des betreffenden Tabellenblatts (durch den Benutzer oder durchVBA-Code) eine Zelle ausgewählt:

Private Sub Worksheet_Activate()MsgBox ActiveSheet.NameRange("C5").Select

End Sub

Zur Erläuterung:

Worksheet_Activate()

� Es wird die Ereignisprozedur Worksheet_Activate() zu einem Tabel-lenblatt durchlaufen.

� Nach einer Kontrollausgabe wird eine Zelle ausgewählt.

Testen Sie die Prozedur, indem Sie zwischen den verschiedenen Tabel-lenblättern der Arbeitsmappe hin und her wechseln. Das Ereignis trittnur ein, falls die Tabelle, in deren Codefenster dieser VBA-Code steht,nicht bereits das aktivierte Tabellenblatt ist.

2.5.4 Zellauswahl wechselt

Zelle wechselt Mit folgender Prozedur in einem Klassenmodul wird nach der Auswahleines Zellbereichs in der betreffenden Tabelle die Adresse dieses Zellbe-reichs ausgegeben:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)MsgBox Target.Address

End Sub

Zur Erläuterung:

SelectionChange() � Es wird die Ereignisprozedur Worksheet_SelectionChange() zueinem Tabellenblatt durchlaufen.

Target � Die Prozedur liefert den ausgewählten Zellbereich als Range über dieObjektvariable Target. Weitere Einzelheiten zu Objektvariablen inAbschnitt 6.4, »Arbeiten mit Objektvariablen«.

� Für den ausgewählten Zellbereich wird die Eigenschaft Address aus-gegeben. Dabei handelt es sich um die absolute Bezeichnung der Zell-adresse.

Testen Sie die Prozedur, indem Sie verschiedene zusammenhängendebzw. nicht zusammenhängende Zellbereiche (mit Hilfe der Taste (Strg))auswählen.

Page 92: Einstieg Mit VBA in Excel

91

Ereignisprozeduren 2.5

2.5.5 Doppelklick auf Zelle

DoppelklickMit folgender Prozedur in einem Klassenmodul wird bei einem Dop-pelklick auf eine Zelle die betreffende Zelle formatiert:

Private Sub Worksheet_BeforeDoubleClick _(ByVal Target As Range, Cancel As Boolean)

Target.Interior.Color = vbGreenTarget.Borders.LineStyle = xlContinuousTarget.Borders.Weight = xlThickCancel = True

End Sub

Zur Erläuterung:

BeforeDouble-Click

� Die Ereignisprozedur Worksheet_BeforeDoubleClick() zu einemTabellenblatt wird durchlaufen. Mit Target wird die Zelle bezeichnet,auf der der Mauszeiger beim Doppelklick steht.

� Muster und Rahmen der Zelle werden eingestellt.

Cancel� Über die logische Variable Cancel können Sie bestimmen, ob daseigentliche Ereignis, hier der Doppelklick, stattfinden soll. Mit Cancel= True wird die weitere Verarbeitung abgebrochen, es findet nur dieFormatierung statt. Mit Cancel = False oder einfach ganz ohne dieseAnweisung wird weiter fortgesetzt, also der Cursor zur Bearbeitung indie Zelle gesetzt. Logische Variablen werden in Abschnitt 3.2.3,»Datentypen«, noch genauer erläutert.

2.5.6 Tabellenblatt wurde neu berechnet

BerechnungMit folgender Prozedur in einem Klassenmodul wird eine Spaltenbreiteoptimal eingestellt, falls im Tabellenblatt eine Neuberechnung anirgendeiner Stelle stattfand:

Private Sub Worksheet_Calculate()Range("G:G").Columns.AutoFit

End Sub

Zur Erläuterung:

Worksheet_Calculate()

� Es wird die Ereignisprozedur Worksheet_Calculate() zu einemTabellenblatt durchlaufen. Dieses Ereignis tritt ein, falls z. B. eineZelle einen neuen Wert bekommen hat, die in der Berechnungsformelfür den Wert einer anderen Zelle vorkommt.

Page 93: Einstieg Mit VBA in Excel

92

Grundlagen von Objekten und Ereignissen2

� Beispiel: In der Zelle G3 steht die Formel =G1+G2. Sobald sich G1 oderG2 ändert, tritt das Ereignis Calculate auf.

� Die Spaltenbreite wird in diesem Falle optimal auf die neuen Werteeingestellt.

Page 94: Einstieg Mit VBA in Excel

93

Inhalt dieses Kapitels sind Variablen, Datentypen, Operatoren und Kontrollstrukturen im Zusammenspiel mit Excel und seinen Objekten.

3 Grundlagen der Programmierung mit VBA

Im Folgenden lernen Sie die wichtigsten grundlegenden Elemente undTechniken kennen, die Sie zum Schreiben von VBA-Programmen benöti-gen.

3.1 Allgemeines

ProgrammierstilEin Entwickler, ob in VBA oder in einer anderen Programmiersprache,sollte sich um einen guten Programmierstil bemühen. Er erleichtert sichund anderen damit die Arbeit. Durch eine übersichtliche Schreibweiseund eine ausreichende Kommentierung kann der Code durch ihn undandere besser gelesen und gewartet werden.

LeerzeilenZu einer übersichtlichen Schreibweise gehören z. B. Einrückungen undLeerzeilen. Die Entwicklungsumgebung VBE unterstützt Sie als Entwick-ler mit zahlreichen Hilfestellungen.

Einige dieser Hilfestellungen kennen Sie vermutlich schon:

Taste F1� Markieren Sie ein Schlüsselwort (z. B. Loop) oder den Namen einerObjektklasse (z. B. Workbooks) und betätigen Sie anschließend dieTaste (F1), dann wird die Hilfe mit der entsprechenden Erläuterungeingeblendet. Falls der Begriff nicht eindeutig zugeordnet werdenkann, wird eine Liste mit den möglichen Zuordnungen angezeigt, ausdenen Sie auswählen können.

Automatische Korrektur

� Sobald Sie eine Zeile beendet haben und zur nächsten Zeile wechseln,werden Korrekturen an Schlüsselwörtern und Namen von bekanntenVariablen, Funktionen, Objekten usw. vorgenommen. Ein Beispiel:

Page 95: Einstieg Mit VBA in Excel

94

Grundlagen der Programmierung mit VBA3

� Sie schreiben: msgbox activesheet.name eventuell sogar mit meh-reren unnötigen Leerzeichen.

� Im Editor wird dies beim Zeilenwechsel geändert zu: MsgBox Ac-tiveSheet.Name. Alle Leerzeichenfolgen werden außerdem redu-ziert zu einem Leerzeichen. Sie können dadurch schnell erkennen,ob die Anweisung korrekt ist.

Einrückungen � Bei einem Wechsel von einer eingerückten Zeile zur nächsten Zeilebleibt die Einrückung erhalten. Dadurch sind Programmstrukturen,wie Prozeduren, Verzweigungen und Schleifen, leichter erkennbar.

Taste Tab � Sie können mehrere Zeilen auf einmal einrücken, indem Sie sie voll-ständig markieren und anschließend die Taste (ÿ) betätigen. Einrü-ckungen machen Sie mit der Tastenkombination (ª) + (ÿ) wiederrückgängig.

Punkt nachObjektname

� Sobald Sie den Punkt hinter den Namen eines Objekts, z. B. Active-Workbook, gesetzt haben, erscheint eine Liste der Eigenschaften undMethoden dieses Objekts zur Auswahl. Geben Sie einen oder mehrereAnfangsbuchstaben ein, dann wird das passende Element in der Listeausgewählt. Mit der Taste (ÿ) setzen Sie dass das betreffende Listen-element in den Code ein. Anschließend können Sie mit der Eingabeunmittelbar fortfahren.

3.1.1 Codeblöcke auskommentieren

Auskommentieren Sie können ganze Code-Blöcke auskommentieren, damit der betreffendeCode kurzfristig nicht durchlaufen wird. Dies können z. B. Zeilen mitKontrollausgaben (MsgBox, Debug.Print) sein, die in der Endfassung desProgramms nicht mehr benötigt werden.

Symbole Die Auskommentierung lässt sich durch das Symbol Block auskommen-

tieren in der Symbolleiste Bearbeiten leicht durchführen. Rechts dane-ben steht das Symbol Auskommentierung des Blocks aufheben, mitdem Sie den VBA-Code wieder aktivieren können.

Abbildung 3.1 Block auskommentieren und wieder aufheben

Page 96: Einstieg Mit VBA in Excel

95

Allgemeines 3.1

3.1.2 Zeilen zerlegen

Zeichen _(Unterstrich)

Lange Programmzeilen lassen sich mit Hilfe des Zeichens _ (Unterstrich)in mehrere übersichtliche Programmzeilen zerlegen. Dies wurde nachfol-gend mit der bereits bekannten Prozedur zum Kopieren eines Tabellen-blatts durchgeführt, zugegeben in etwas übertriebener Form:

Sub BlattKopieren()ThisWorkbook.ActivateWorksheets _

("Tabelle1"). _Copy _After:=Worksheets("Tabelle3")

ActiveSheet.Name = "Tab1Kopie"End Sub

Zur Erläuterung:

� Am Ende einiger Zeilen steht ein Unterstrich. Dies bedeutet, dass dieAnweisung in der nächsten Zeile fortgesetzt wird. Eine Anweisungkann sich also über zwei oder mehr Zeilen erstrecken.

Trennstelle� Eine übliche Trennstelle ist das Leerzeichen zwischen Copy und Afteroder zwischen Parametern einer Funktion. Dabei bleibt auch noch dieLesbarkeit erhalten.

� Hier wurden als Trennstelle auch noch das Ende des Wortes Work-sheets und der Punkt vor Copy genutzt. Dies ist sicherlich etwas über-trieben. In VBA kommen allerdings bei der Referenzierung von Objek-ten (siehe Abschnitt 6.2) bisweilen sehr lange Objektnamen vor. DasBeispiel soll zeigen, wie ein solcher Name zerlegt werden kann.

Übung 3 A

Verändern Sie das Makro KopieE3E5Neu aus Übung 1 G (siehe Seite 33).Kommentieren Sie einzelne Zeilen aus, so dass die drei Zellen E3 bis G3 nurnoch in die Zellen E10 bis G10 kopiert werden, aber nicht mehr in die ZeilenE5 bis G5. Geben Sie am Ende den Text »Fertig« in einer Nachrichtenbox aus.Testen Sie das veränderte Makro.

Page 97: Einstieg Mit VBA in Excel

96

Grundlagen der Programmierung mit VBA3

3.2 Variablen und Datentypen

3.2.1 Namen, Werte

Daten speichern Variablen dienen zur vorübergehenden Speicherung von Daten, die sichzur Laufzeit eines Programms ändern können. Eine Variable besitzteinen eindeutigen Namen, unter dem sie angesprochen werden kann.

Variablennamen Für die Namen von Variablen gelten in VBA die folgenden Regeln:

� Sie beginnen mit einem Buchstaben.

� Sie können nur aus Buchstaben, Zahlen und einigen wenigen Sonder-zeichen (z. B. dem Unterstrich _ ) bestehen.

Innerhalb eines Gültigkeitsbereichs darf es keine zwei Variablen mit demgleichen Namen geben (siehe Abschnitt 5.1, »Gültigkeitsbereiche«).

Gültige Namen sind demnach Temperatur, Summe_Werte oder X12.Ungültige 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 zugewiesenwerden, z. B. Temperatur = 25. Dadurch werden Programme eindeutiger,lesbarer und fehlerfreier.

3.2.2 Deklarationen

Datentyp Neben dem Namen besitzt jede Variable einen Datentyp, der die Art dergespeicherten Information bestimmt. Der Entwickler wählt den Daten-typ danach aus, ob er Text, Zahlen ohne Nachkommastellen, Zahlen mitNachkommastellen oder z. B. Datumsangaben speichern möchte.

Speicherbedarf Außerdem muss er sich Gedanken über die Größe des Zahlenbereichsmachen, den eine Zahl annehmen könnte. Er sollte versuchen, denDatentyp mit dem geringsten Speicherbedarf zu verwenden; diesergewährleistet gleichzeitig auch eine schnellere Verarbeitung. Im folgen-den Abschnitt finden Sie eine Liste der Datentypen mit Name, Speicher-bedarf und Wertebereich.

Variablen sollten in Visual Basic immer deklariert werden. Dies beugtFehlern und unnötig hohem Speicherbedarf vor.

Deklarationerzwingen

Sie haben in Kapitel 1, »Einführung«, eine Voreinstellung vorgenommen,die für die VBA-Programmierung wichtig ist: im Menü Extras � Optio-

Page 98: Einstieg Mit VBA in Excel

97

Variablen und Datentypen 3.2

nen haben Sie in der Registerkarte Editor ein Häkchen bei Variablende-

klaration erforderlich gesetzt.

Option ExplicitDies sorgt ab dem nächsten Öffnen von Excel dafür, dass oberhalb desVBA-Codes die Zeile Option Explicit steht und alle Variablen deklariertwerden müssen.

3.2.3 Datentypen

WertebereichTabelle 3.1 enthält die wichtigsten von VBA unterstützten Datentypensowie deren Speicherbedarf und Wertebereich:

Mit folgender Prozedur werden einige Variablen der obengenanntenTypen deklariert, mit Werten versehen und in Zellen angezeigt:

Sub Variablen()Dim By As ByteDim Bo As BooleanDim It As Integer, Lg As Long

Datentyp Speicherbedarf Wertebereich, Bedeutung

Boolean 2 Byte True oder False (wahr oder falsch)

Byte 1 Byte ganze Zahl, von 0 bis 255

Integer 2 Byte ganze Zahl, von –32.768 bis +32.767

Long 4 Byte lange ganze Zahl, von –2,1 * 109 bis +2,1 * 109

Single 4 Byte Gleitkommazahl mit einfacher Genauigkeit. Von ca. –3,4 * 10+38 bis ca. –1,4 * 10–45 für negative Werte. Von ca. +1,4 * 10–45 bis ca. +3,4 * 10+38 für positive Werte

Double 8 Byte Gleitkommazahl mit doppelter Genauigkeit. Von ca. –1,8 * 10+308 bis ca. –4,9 * 10–324 für negative Werte. Von ca. +4,9 * 10–324 bis +1,9 * 10+308 für positive Werte

Date 8 Byte Datumsangabe, vom 1. Januar 100 bis zum 31. Dezember 9999

Object 4 Byte Verweis auf ein Objekt, siehe Abschnitt 6.4, »Arbeiten mit Objektvariablen«

String 10 Byte (+) (+) plus Zeichenfolgenlänge. Zeichenkette mit vari-abler Länge

Variant >= 16 Byte Datentyp nicht explizit festgelegt (nicht zu empfeh-len)

Tabelle 3.1 Datentypen

Page 99: Einstieg Mit VBA in Excel

98

Grundlagen der Programmierung mit VBA3

Dim Sg As Single, Db As DoubleDim Dt As DateDim St As String

By = 200Bo = TrueIt = 20000Lg = 200000Sg = 1 / 7.1Db = 1 / 7.1Dt = "15.03.2010"

St = "Zeichenkette"

ThisWorkbook.Worksheets("Tabelle1").Activate

Range("A1").Value = ByRange("A2").Value = BoRange("A3").Value = ItRange("A4").Value = Lg

Range("A5").NumberFormatLocal = _"0,00000000000000000000"

Range("A5").Value = SgRange("A6").NumberFormatLocal = _

"0,00000000000000000000"

Range("A6").Value = DbRange("A7").Value = DtRange("A8").Value = St

Range("A:A").Columns.AutoFitEnd Sub

Abbildung 3.2 zeigt das Ergebnis.

Abbildung 3.2 Verschiedene Datentypen

Page 100: Einstieg Mit VBA in Excel

99

Variablen und Datentypen 3.2

Zur Erläuterung:

Dim ... As ...Variablen werden mit Dim deklariert. Mit As wird ihnen ein definierterDatentyp zugewiesen.

� Es können auch mehrere Variablen in einer Zeile deklariert werden.

� Ein Beispiel für einen häufigen Fehler in diesem Zusammenhang:Dim a, b As Integer. Dabei wird aus a eine Variable vom DatentypVariant!

� Es heißt richtig: Dim a As Integer, b As Integer

Außerhalb Wertebereich

� Bei den Datentypen für Zahlen führt eine Über- oder Unterschreitungdes Wertebereichs zu einem Abbruch.

Single, Double� Werte für Zahlen mit Nachkommastellen werden im VBA-Code miteinem Dezimalpunkt eingegeben. Die Datentypen Single und Doublefür solche Zahlen unterscheiden sich in ihrer Genauigkeit. Im Beispielwurde die Anzahl der in den Zellen angezeigten Nachkommastellenmit Hilfe der Eigenschaft NumberFormatLocal auf den Wert 20gestellt. Der Wert der Single-Variablen ist mathematisch ungenauerals der Wert der Double-Variablen.

Anführungs-zeichen

� Werte für Zeichenketten und Datumsangaben müssen in doppeltenAnführungszeichen angegeben werden. Bei Datumsangaben ist dieSchreibweise TT.MM.JJJJ zu bevorzugen.

� Eine passende Formatierung: Zeilenhöhe und Spaltenbreite lassensich optimal einstellen über die Methode AutoFit() des ObjektsColumns bzw. Rows, siehe auch Abschnitt 2.4.15, »Zeilenhöhe undSpaltenbreite«.

Tastenkombi-nation Shift + F2

Einige Hinweise

� Falls einer Variablen kein definierter Datentyp (mit As) zugewiesen wird,dann ist diese Variable vom Typ Variant. Dieser Datentyp sollte mög-lichst nicht verwendet werden, da Variablen dieses Datentyps einenhöheren Speicherbedarf haben, langsamer zu verarbeiten und schwieri-ger 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 Siewieder zurück.

Page 101: Einstieg Mit VBA in Excel

100

Grundlagen der Programmierung mit VBA3

Variant

Funktion »TypeName()«

TypeName() Die Funktion TypeName() erweist sich als sehr nützlich, falls Sie denDatentyp einer Variablen, eines Zellinhalts oder eines Objekts nicht ken-nen. Sie liefert den Datentyp als Zeichenkette. Ein Beispiel:

Sub TypErkennen()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("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 Erläuterung:

� Es werden die Datentypen der Inhalte der vier genannten Zellen aus-gegeben.

Das Ergebnis ist in Abbildung 3.4 dargestellt.

Abbildung 3.4 Datentypen

Übung 3 B

Schreiben Sie eine Prozedur, in der Ihr Nachname, Vorname, Ihre Adresse,Ihr Geburtsdatum und Ihr Alter jeweils in Variablen eines geeigneten Daten-typs gespeichert und anschließend wie folgt ausgegeben werden:

Abbildung 3.3 Ausgabe von Übung 3 B

Page 102: Einstieg Mit VBA in Excel

101

Variablen und Datentypen 3.2

3.2.4 Konstanten

UnveränderlichKonstanten sind vordefinierte Werte, die während der Laufzeit nicht ver-ändert werden können. Man gibt Konstanten im Allgemeinen aussage-kräftige Namen; dadurch sind sie leichter zu behalten als die Werte, diesie repräsentieren.

Im Vergleich zu Variablen kann das Programm auf Konstanten schnellerzugreifen. Sie sollten also immer Konstanten verwenden, falls der Wertfeststeht und sich während des Programmablaufs niemals ändert.

Es gibt:

� Eigene Konstanten: Sie werden vom Entwickler an einer zentralenStelle definiert und können an verschiedenen Stellen des Programmsgenutzt werden. Somit muss eine eventuelle Änderung einer Konstan-ten zur Entwurfszeit nur an einer Stelle erfolgen. Der Gültigkeitsbe-reich von Konstanten ist analog zum Gültigkeitsbereich von Variablen(siehe Abschnitt 5.1, »Gültigkeitsbereiche«).

Integrierte Konstanten

� Integrierte Konstanten: Sie sind bereits vordefiniert und können vomEntwickler nicht verändert werden.

� Beim Einfügen von Zellen hatten Sie bereits die integrierten Kon-stanten xlShiftDown und xlShiftToRight benutzt. Sie repräsen-tieren die Zahlen 4.121 bzw. 4.161, die natürlich nicht so einpräg-sam sind wie die Namen der Konstanten.

� Eine andere häufig genutzte Konstante ist vbCrLf für den Zeilen-umbruch in einer Nachrichtenbox (MsgBox).

Im folgenden Beispiel wird mit einer Konstanten und einer Variablengearbeitet:

Sub Konstanten()Const MaxWert As Integer = 55Dim MinWert As IntegerMinWert = 15MsgBox MaxWert – MinWertMinWert = 35MsgBox MaxWert – MinWert

End Sub

Page 103: Einstieg Mit VBA in Excel

102

Grundlagen der Programmierung mit VBA3

Zur Erläuterung:

� Die Konstante MaxWert wird festgelegt. Sie kann nicht mehr verändertwerden.

� Die Variable MinWert kann innerhalb der Prozedur ihren Wert verän-dern.

Farbkonstanten

Farbkonstanten Es gibt folgende vordefinierte Farbkonstanten:

� vbBlack: Schwarz

� vbRed: Rot

� vbGreen: Grün

� vbYellow: Gelb

� vbBlue: Blau

� vbMagenta: Magenta

� vbCyan: Zyan

� vbWhite: Weiß

Beliebige Farben können mit der Funktion RGB() erzeugt werden. DieseFunktion hat drei Parameter; diese stehen für Rot-, Grün- und Blau-Werte der Farbe, jeweils zwischen 0 und 255.

3.3 Operatoren

Zum Zusammensetzen von Ausdrücken werden sowohl in den Zellen derExcel-Tabellenblätter als auch in VBA Operatoren verwendet. Sie habenschon den Operator = für Zuweisungen von Werten kennengelernt.

In VBA gibt es mehr Operatoren als in Excel, außerdem arbeiten mancheOperatoren anders als in Excel.

Rangfolge Operatoren können in verschiedene Kategorien eingeteilt werden. DieRangfolge der Operatoren (Priorität) ist für die Reihenfolge der Abarbei-tung zuständig, falls mehrere Operatoren innerhalb eines Ausdrucks ver-wendet werden. Diese Rangfolge ist in Abschnitt 3.3.5 angegeben. FallsSie sich bei der Verwendung dieser Regeln nicht sicher sind, so empfiehltes sich, durch eigene Klammersetzung die Reihenfolge der Abarbeitungexplizit festzulegen.

Page 104: Einstieg Mit VBA in Excel

103

Operatoren 3.3

3.3.1 Arithmetische Operatoren

RechenoperatorenArithmetische Operatoren dienen zur Durchführung von Berechnungen.Tabelle 3.2 listet die arithmetischen Operatoren auf.

Division

Die Division mit dem Operator / ergibt das gewohnte Ergebnis. Es istallerdings darauf zu achten, welchen Datentyp die Variable hat, in derdas Ergebnis abgespeichert wird. Die beiden nachfolgenden Prozedurengeben 2,6 bzw. 3 aus. Im zweiten Fall wird bei der Speicherung in derInteger-Variablen gerundet.

Erstes Beispiel:

Sub DivisionOhneRunden()Dim x As Doublex = 13 / 5MsgBox x

End Sub

Zweites Beispiel:

Sub DivisionMitRunden()Dim x As Integerx = 13 / 5MsgBox x

End Sub

Ganzzahldivision

Die Ganzzahldivision wird in zwei Schritten durchgeführt. Im erstenSchritt werden Dividend und Divisor einzeln gerundet. Im zweitenSchritt werden die beiden verbliebenen Zahlen geteilt, anschließend

Operator Beschreibung

+ Addition

- Subtraktion oder Negation

* Multiplikation

/ Division

\ Ganzzahldivision, siehe unten

Mod Modulo, siehe unten

^ Potenzierung, siehe unten

Tabelle 3.2 Arithmetische Operatoren

Page 105: Einstieg Mit VBA in Excel

104

Grundlagen der Programmierung mit VBA3

werden die Ziffern nach dem Komma abgeschnitten. Zu diesem Operatorgibt es in Excel keine direkte Entsprechung. Tabelle 3.3 zeigt einige Bei-spiele.

Modulo-Operator

Mod Der Modulo-Operator Mod berechnet den Rest einer Division. DieseBerechnung wird ebenfalls in zwei Schritten durchgeführt. Im erstenSchritt werden Dividend und Divisor einzeln gerundet. Im zweitenSchritt wird der Rest der Ganzzahldivision ermittelt. Einige Beispielesehen Sie in Tabelle 3.4.

Es gibt in Excel die Funktion REST(); sie berechnet allerdings den Rest,ohne vorher zu runden. Die Berechnung des zweiten Beispiels mitREST(19,5; 3,2) ergibt also 0,3 statt 2.

Potenzierung

Operator ^ Zur Potenzierung einer Zahl dient der Operator ^ (hoch). Diesen Opera-tor gibt es auch in Excel, außerdem gibt es die Funktion POTENZ(). Mitbeiden ermittelt man dieselben Ergebnisse wie mit dem VBA-Operator(Beispiele siehe Tabelle 3.5).

Ausdruck Ergebnis

19 / 4 4,75

19 \ 4 4

19 \ 4.6 3

19.5 \ 4.2 5

Tabelle 3.3 Ganzzahldivision

Ausdruck Ergebnis

19 Mod 4 3

19.5 Mod 3.2 2

Tabelle 3.4 Modulo-Operator

Ausdruck Ergebnis

2 ^ 5 32

3 ^ 2 ^ 3 729

Tabelle 3.5 Operator ^ (hoch)

Page 106: Einstieg Mit VBA in Excel

105

Operatoren 3.3

Eine Beispiel-Prozedur, in der eine Reihe von arithmetischen Operatoreneingesetzt wird:

Sub ArithmetischeOperatoren()ThisWorkbook.Worksheets("Tabelle1").Activate

' GrundrechenartenRange("C1").Value = 5 * 3 – 6 / 3Range("C2").Value = 5 * (3 – 6) / 3

' Ganzzahl-DivisionRange("C4").Value = 19 / 4Range("C5").Value = 19 \ 4Range("C6").Value = 19 \ 4.6Range("C7").Value = 19.5 \ 4.2

' Modulo-OperatorRange("D1").Value = 19 Mod 4Range("D2").Value = 19.5 Mod 3.2

' PotenzierenRange("D4").Value = 2 ^ 5Range("D5").Value = 3 ^ 2 ^ 3Range("D6").Value = 2 ^ 5.4Range("D7").Value = –2 ^ 5

End Sub

Das Ergebnis:

Abbildung 3.5 Ergebnis der Berechnungen

2 ^ 5.4 42,2242531447326

–2 ^ 5 32

Ausdruck Ergebnis

Tabelle 3.5 Operator ^ (hoch) (Forts.)

Page 107: Einstieg Mit VBA in Excel

106

Grundlagen der Programmierung mit VBA3

Auswertungs-reihenfolge

Multiplikation und Division innerhalb eines Ausdrucks sind gleichrangigund werden von links nach rechts in der Reihenfolge ihres Auftretensausgewertet. Dasselbe gilt für Additionen und Subtraktionen, die zusam-men in einem Ausdruck auftreten.

Klammern Mit Klammern kann diese Rangfolge außer Kraft gesetzt werden, damitbestimmte Teilausdrücke vor anderen Teilausdrücken ausgewertet wer-den. In Klammern gesetzte Operationen haben grundsätzlich Vorrang.Innerhalb der Klammern gilt jedoch wieder die normale Rangfolge derOperatoren.

3.3.2 Vergleichsoperatoren

Operatoren fürBedingungen

Vergleichsoperatoren werden in Bedingungen benötigt. Diese wiederumnutzt man für Verzweigungen und Schleifen, die zur Ablaufsteuerungvon Programmen dienen. Verzweigungen arbeiten nach dem gleichenPrinzip wie die Funktion WENN() in Excel.

True, False Das Ergebnis einer Bedingung ist einer der beiden Werte, die für eineVariable vom Typ Boolean verwendet werden dürfen, also True (wahr)oder False (falsch). Tabelle 3.6 führt die Vergleichsoperatoren auf.

Einige Beispiele sehen Sie in Tabelle 3.7.

Operator Beschreibung

< kleiner als

<= kleiner als oder gleich

> größer als

>= größer als oder gleich

= gleich

<> ungleich

Tabelle 3.6 Vergleichsoperatoren

Ausdruck Ergebnis

5 > 3 wahr

3 = 3.2 falsch

5 + 3 * 2 >= 12 falsch

Tabelle 3.7 Ausdrücke mit Vergleichsoperatoren

Page 108: Einstieg Mit VBA in Excel

107

Operatoren 3.3

LikeDarüber hinaus gibt es noch den Operator Like, der zum Musterver-gleich dient. Dabei können Sie unter anderem die Platzhalter * (Stern =eines oder mehrere Zeichen) und ? (Fragezeichen = genau ein Zeichen)einsetzen. Tabelle 3.8 zeigt einige Beispiele.

Mit Hilfe von Like können Sie noch wesentlich komplexere Musterver-gleiche durchführen 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 = ("abxba" Like "a*a")Range("F2").Value = ("abxba" Like "a?a")Range("F3").Value = ("aba" Like "a?a")Range("F4").Value = ("asdlfigc" Like "a?d?f*c")

End Sub

Das Ergebnis:

Abbildung 3.6 Ergebnis der Vergleiche

Ausdruck Ergebnis

"abxba" Like "a*a" wahr

"abxba" Like "a?a" falsch

"aba" Like "a?a" wahr

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

Tabelle 3.8 Operator »Like«

Hinweis

Die Klammern um die Ausdrücke mit den Vergleichsoperatoren sind für dierichtige Auswertung nicht notwendig, sie wurden nur zur besseren Lesbar-keit gesetzt.

Page 109: Einstieg Mit VBA in Excel

108

Grundlagen der Programmierung mit VBA3

3.3.3 Logische Operatoren

Not, And, Or Logische Operatoren dienen dazu, mehrere Bedingungen zusammenzu-fassen. Die wichtigsten logischen Operatoren listet Tabelle 3.9 auf.

Es seien die Variablen A = 1, B = 3 und C = 5 gesetzt. Beachten Sie dieAusdrücke in Tabelle 3.10.

Wahrheitstabelle Die Funktionsweise der logischen Operatoren können Sie auch ausTabelle 3.11 entnehmen.

Übung 3 C

Ermitteln Sie das Ergebnis der beiden folgenden Ausdrücke, speichern Sie esin einer Variablen eines geeigneten Datentyps, und zeigen Sie es an:

12 – 3 >= 4 * 2.5"Maier" Like "M??er"

Operator Beschreibung Das Ergebnis ist wahr, wenn …

Not Nicht … der Ausdruck falsch ist.

And Und … beide Ausdrücke wahr sind.

Or Inklusives Oder … mindestens ein Ausdruck wahr ist.

Xor Exklusives Oder … genau ein Ausdruck wahr ist.

Tabelle 3.9 Logische Operatoren

Ausdruck Ergebnis

Not (A < B) falsch

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

(B < A) Or (C < B) falsch

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

Tabelle 3.10 Ausdrücke mit logischen Operatoren

Ausdruck 1 Ausdruck 2 Not And Or Xor

wahr wahr falsch wahr wahr falsch

wahr falsch falsch falsch wahr wahr

falsch wahr wahr falsch wahr wahr

falsch falsch wahr falsch falsch falsch

Tabelle 3.11 Wahrheitstabelle (»NOT« bzgl. Ausdruck 1)

Page 110: Einstieg Mit VBA in Excel

109

Operatoren 3.3

Eine Beispiel-Prozedur:

Sub LogischeOperatoren()Dim a As Integer, b As Integer, c As Integera = 1b = 3c = 5

ThisWorkbook.Worksheets("Tabelle1").ActivateRange("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

3.3.4 Verkettungsoperator

Operator &Der Operator & dient zur Verkettung von Zeichenketten. Er wird häufigbenötigt, um Ergebnisse anschaulich zusammen mit Text darzustellen. Isteiner der Ausdrücke keine Zeichenfolge, sondern eine Zahl oder Datum-sangabe, so wird er in eine Zeichenfolge verwandelt. Das Gesamtergeb-nis ist dann wiederum eine Zeichenfolge. Beispiel:

Sub VerkettungsOperator()Dim a As StringDim s As SingleDim d As Dated = "12.03.2010"s = 4.6

Übung 3 D

Ermitteln Sie das Ergebnis der beiden folgenden Ausdrücke, speichern Sie esin einer Variablen eines geeigneten Datentyps, und zeigen Sie es an:

4 > 3 And –4 > –34 > 3 Or –4 > –3

Page 111: Einstieg Mit VBA in Excel

110

Grundlagen der Programmierung mit VBA3

a = "Temperatur " & s & " Grad am " & dMsgBox a

End Sub

Das Ergebnis:

Abbildung 3.8 Verkettung verschiedener Daten

3.3.5 Rangfolge der Operatoren

Rangfolge Enthält ein Ausdruck mehrere Operationen, so werden die einzelnenTeilausdrücke in einer bestimmten Reihenfolge ausgewertet und aufge-löst, die als Rangfolge bzw. Priorität der Operatoren bezeichnet wird. Esgilt die Rangfolge in Tabelle 3.12.

Die Operatoren, die in Tabelle 3.12 stehen, haben die höchste Priorität.Ausdrücke mit Operatoren der gleichen Priorität werden von links nachrechts ausgewertet.

Operator Beschreibung

^ Potenzierung (Exponentialoperator)

- negatives Vorzeichen

*, / Multiplikation, Division

\ Ganzzahldivision

Mod Modulo

+, - Addition, Subtraktion

& Verkettung

=, <>, <, >,<=, >=, Like

Vergleichsoperatoren (das Zeichen = steht für den Vergleich, nicht für die Zuweisung)

Not logisches Nicht

And logisches Und

Or logisches Oder

Xor logisches Oder (exklusiv)

Tabelle 3.12 Rangfolge der Operatoren

Page 112: Einstieg Mit VBA in Excel

111

Verzweigungen 3.4

KlammernWie schon bei den arithmetischen Operatoren erwähnt: Mit Klammernkann diese Rangfolge außer Kraft gesetzt werden, damit bestimmte Teil-ausdrücke vor anderen Teilausdrücken ausgewertet werden. In Klam-mern gesetzte Operationen haben grundsätzlich Vorrang. Innerhalb derKlammern gilt jedoch wieder die normale Rangfolge der Operatoren.

3.4 Verzweigungen

KontrollstrukturDer Programmcode wurde bisher rein sequentiell abgearbeitet, d. h. eineAnweisung nach der anderen. Kontrollstrukturen ermöglichen eine Steu-erung dieser Reihenfolge. Die Kontrollstrukturen unterteilen sich in Ver-zweigungen und Schleifen.

AlternativenVerzweigungen gestatten dem Programm, in verschiedene alternativeAnweisungsblöcke zu verzweigen. Es gibt die beiden Verzweigungs-strukturen If ... Then ... Else und Select Case ... Diese Auswahl-möglichkeiten übergeben aufgrund von Bedingungen die Programmaus-führung an einen bestimmten Anweisungsblock. Bedingungen werdenmit Hilfe der bereits vorgestellten Vergleichsoperatoren erstellt.

WENN-FunktionVerzweigungen arbeiten nach dem gleichen Prinzip wie die FunktionWENN() in Excel. Bekanntlich kann die Funktion WENN() verschachtelt

Übung 3 E

Sind die Bedingungen in Tabelle 3.13 wahr oder falsch? Lösen Sie die Auf-gabe möglichst auf dem Papier, ohne VBA.

Nr. Werte Bedingung

1 a=5 b=10 a>0 And b<>10

2 a=5 b=10 a>0 Or b<>10

3 z=10 w=100 z<>0 Or z>w Or w-z=90

4 z=10 w=100 z=11 And z>w Or w-z=90

5 x=1.0 y=5.7 x>=.9 And y<=5.8

6 x=1.0 y=5.7 x>=.9 And Not(y<=5.8)

7 n1=1 n2=17 n1>0 And n2>0 Or n1>n2 And n2<>17

8 n1=1 n2=17 n1>0 And (n2>0 Or n1>n2) And n2<>17

Tabelle 3.13 Zu Übung 3 E

Page 113: Einstieg Mit VBA in Excel

112

Grundlagen der Programmierung mit VBA3

werden, falls es mehr als zwei Möglichkeiten gibt. Dies trifft auch für dieVerzweigungen in VBA zu.

3.4.1 Einzeiliges If … Then … Else

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

If Bedingung Then Anweisungen1 [ Else Anweisungen2 ]

Vergleichs-operator

Bedingungen werden mit Vergleichsoperatoren gebildet. Sie werden aus-gewertet und sind entweder wahr oder falsch. Ist das Ergebnis der Aus-wertung wahr, so wird der Then-Teil mit den Anweisungen1 ausgeführt.Ist das Ergebnis der Auswertung falsch und gibt es einen Else-Teil, sowird der Else-Teil mit den Anweisungen2 ausgeführt.

Einzeiliges If In der folgenden Prozedur wird das einzeilige If in zwei verschiedenenBeispielen genutzt. Beim zweiten Beispiel ist zu beachten, dass die Zeilefür den Druck in diesem Buch zu lang ist. Es handelt sich aber dennochum eine einzeilige If-Verzweigung.

Sub EinzeilenIf()ThisWorkbook.Worksheets("Tabelle1").ActivateIf Range("A1").Value > 100 Then MsgBox "Groß"If Range("A1").Value < 10 Then MsgBox "Klein" Else _

MsgBox "Nicht klein"End Sub

Zur Erläuterung:

Else � Beim ersten Beispiel wird nur etwas angezeigt, falls der Wert in derZelle größer als 100 ist. Anderenfalls (Else) wird nichts ausgeführt.

� Beim zweiten Beispiel wird in jedem Falle etwas angezeigt.

3.4.2 If-Then-Else-Block

Block-If Bei einfachen Entscheidungen und einzelnen Anweisungen ist das ein-zeilige If geeignet. Sobald mehrere Anweisungen auszuführen sind,wird der Programmcode schnell unübersichtlich. Für diese Zwecke istein If-Then-Else-Block wesentlich besser geeignet. Der Block hat folgen-den Aufbau:

If Bedingung1 ThenAnweisungen1

[ ElseIf Bedingung2Anweisungen2 ] ...

Page 114: Einstieg Mit VBA in Excel

113

Verzweigungen 3.4

[ ElseAnweisungenX ]

End If

If, ElseIfDas Programm verzweigt zu den Anweisungen hinter der ersten zutref-fenden Bedingung (ElseIf). Falls keine Bedingung zutrifft, werden dieAnweisungen hinter dem Else ausgeführt, sofern es diesen Else-Zweiggibt. Andernfalls wird keine Anweisung durchgeführt. Ein If-Then-Else-Block endet immer mit einem End If.

ElseIn der folgenden Prozedur werden zwei verschiedene Fälle geprüft. Trifftkeiner dieser Fälle zu, so wird der Else-Zweig ausgeführt:

Sub BlockIf()ThisWorkbook.Worksheets("Tabelle1").Activate

If Range("C1").Value > 100 ThenRange("C1").Font.Size = 14Range("C1").Font.Italic = TrueRange("C1").Font.Underline = True

ElseIf Range("C1").Value < 10 ThenRange("C1").Font.Size = 11Range("C1").Font.Italic = FalseRange("C1").Font.Underline = False

ElseRange("C1").Font.Size = 17Range("C1").Font.Italic = FalseRange("C1").Font.Underline = True

End IfEnd Sub

Das Ergebnis:

Abbildung 3.9 Der dritte Fall trifft zu.

Zur Erläuterung:

� Je nach Wert der Zelle werden die Schrifteigenschaften Größe, kursivund unterstrichen eingestellt.

� Im vorliegenden Fall ist der Wert weder größer als 100 noch kleinerals 10, also trifft der dritte Fall (Else) zu.

Page 115: Einstieg Mit VBA in Excel

114

Grundlagen der Programmierung mit VBA3

In Tabelle 3.14 sind die Steuersätze angegeben. Verwenden Sie für dieVerzweigung einen If-Then-Else-Block.

Abbildung 3.10 Ein Beispielwert und das Ergebnis

3.4.3 Select Case

Mehrfachauswahl Die Anweisung Select Case ... kann als Alternative zum If-Then-Else-Block gelten. Sie vereinfacht eine Mehrfachauswahl, wenn nur ein Wertuntersucht 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, deram Beginn der Struktur ausgewertet wird. Sein Wert wird anschließendder Reihe nach mit den Werten der Ausdruckslisten verglichen.

To, Is Eine Ausdrucksliste kann aus mehreren Ausdrücken oder einer Bereichs-angabe mit dem Schlüsselwort To bestehen. Ein Ausdruck kann auseinem Wert oder einer Bedingung mit dem Schlüsselwort Is bestehen.

Übung 3 F

Schreiben Sie ein Programm, das zu einem Gehaltsbetrag, der in der ZelleA10 notiert wird, den Steuerbetrag berechnet und in der Zelle darunter aus-gibt. Formatieren Sie beide Zellen wie unten gezeigt.

Gehalt Steuersatz

bis einschl. 12.000 € 12 %

größer als 12.000 bis einschl. 20.000 € 15 %

größer als 20.000 bis einschl. 30.000 € 20 %

größer als 30.000 € 25 %

Tabelle 3.14 Zu Übung 3 F

Page 116: Einstieg Mit VBA in Excel

115

Verzweigungen 3.4

Bei der ersten Übereinstimmung wird der zugehörige Anweisungsblockausgeführt und dann mit der nächsten Anweisung hinter dem EndSelect fortgefahren.

Case ElseDer optionale Anweisungsblock hinter dem Case Else wird ausgeführt,falls vorher keine Übereinstimmung gefunden wurde.

In der folgenden Prozedur werden verschiedene Fälle geprüft. Trifft kei-ner dieser Fälle zu, wird der Case Else-Zweig ausgeführt:

Sub SelectCase()ThisWorkbook.Worksheets("Tabelle1").Activate

Select Case Range("F1").ValueCase 20, 30, 40

Range("C1").Interior.Color = vbRedCase Is < 10, Is > 100

Range("C1").Interior.Color = vbGreenCase 12 To 17

Range("C1").Interior.Color = vbBlueCase Else

Range("C1").Interior.Color = vbYellowEnd Select

End Sub

Das Ergebnis:

Abbildung 3.11 Der dritte Fall trifft zu.

Zur Erläuterung:

� 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 größer oder gleich 12 und klei-ner oder gleich 17 ist. Dies ist hier der erste zutreffende Fall.

� Case Else steht für die restlichen Fälle.

Page 117: Einstieg Mit VBA in Excel

116

Grundlagen der Programmierung mit VBA3

3.5 Schleifen

Wiederholung Schleifen werden in Programmen häufig benötigt. Sie ermöglichen denmehrfachen Durchlauf von Anweisungen. Darin liegt eine besondereStärke der Programmierung allgemein: die schnelle wiederholte Bearbei-tung ähnlicher Vorgänge.

Es gibt die folgenden Schleifenstrukturen:

� Do ... Loop

� For ... Next

� For Each ... In ... Next

Bedingung oderZähler

Mit Hilfe der ersten beiden Strukturen steuert man die Wiederholungeneines Anweisungsblocks, also die Durchläufe der Schleife. Dabei wirdder Wahrheitswert eines Ausdrucks (der Schleifenbedingung) oder derWert eines numerischen Ausdrucks (Wert des Schleifenzählers) benötigt.

Die Schleife For Each ... In ... Next wird im Zusammenhang mit Auf-listungen oder Feldern eingesetzt. Näheres dazu in Abschnitt 6.5, »For-Each-Schleife«.

3.5.1 For-Next-Schleife

For ... Next Falls die Anzahl der Schleifendurchläufe bekannt oder vor Beginn derSchleife berechenbar ist, sollten Sie die For-Next-Schleife verwenden. IhrAufbau sieht wie folgt aus:

For Zähler = Anfang To Ende [ Step = Schritt ][ Anweisungen ][ Exit For ][ Anweisungen ]

Next [ Zähler ]

Zähler Die Zahlen-Variable Zähler wird zunächst auf den Wert von Anfanggesetzt. Nach jedem Durchlauf wird sie um den Wert von Schritt verän-dert, also vergrößert oder verkleinert. Falls Step = Schritt nicht angege-

Übung 3 G

Schreiben Sie das Programm aus der vorherigen Übung 3 F. Benutzen Sie fürdie Verzweigung Select Case.

Page 118: Einstieg Mit VBA in Excel

117

Schleifen 3.5

ben wurde, wird die Variable um 1 vergrößert. Der neue Wert von Zäh-ler wird mit dem Wert von Ende verglichen.

Schrittweite� Falls die Schrittweite positiv ist und der Wert von Zähler nicht größerals der Wert von Ende ist, wird die Schleife nochmals durchlaufen.

� Falls die Schrittweite negativ ist und der Wert von Zähler nicht klei-ner als der Wert von Ende ist, wird die Schleife ebenfalls erneut durch-laufen.

� Falls die Schrittweite positiv ist und der Wert von Zähler größer alsder Wert von Ende ist, wird die Schleife beendet. Das Gleiche passiert,falls die Schrittweite negativ ist und der Wert von Zähler kleiner alsder Wert von Ende ist.

Exit ForDie Anweisung Exit For kann eingesetzt werden, um die Schleife auf-grund einer speziellen Bedingung sofort zu verlassen. In den folgendenProzeduren werden drei unterschiedliche Schleifen durchlaufen. Daserste Beispiel:

Sub ForNext1()Dim i As IntegerThisWorkbook.Worksheets("Tabelle2").ActivateRange("B1:B10").Clear

For i = 3 To 7Cells(i, 2).Value = Cells(i, 1).Value * 2

Next iEnd Sub

Abbildung 3.12 zeigt das Ergebnis.

Abbildung 3.12 Schleife von 3 bis 7

Page 119: Einstieg Mit VBA in Excel

118

Grundlagen der Programmierung mit VBA3

Zur Erläuterung:

� Die Zahlen 1 bis 10 in der Spalte A waren bereits vorhanden.

� Als Zählervariable dient i.

� Der Zielbereich wird vorher mit der Methode Clear() gelöscht, daauch die nachfolgenden Ergebnisse hier notiert werden.

� Die Schleife wird erstmalig mit i = 3 und letztmalig mit i = 7 durch-laufen.

Schrittweite 1 � Es ist keine Schrittweite angegeben, also ist die Schrittweite 1.

Ein weiteres Beispiel:

Sub ForNext2()Dim i As IntegerThisWorkbook.Worksheets("Tabelle2").ActivateRange("B1:B10").Clear

For i = 3 To 7 Step 2Cells(i, 2).Value = Cells(i, 1).Value * 2

Next iEnd Sub

Das Ergebnis sehen Sie in Abbildung 3.13.

Abbildung 3.13 Schleife von 3 bis 7, Schrittweite 2

Zur Erläuterung:

Schrittweite 2 � Als Schrittweite ist 2 angegeben, daher wird nur jede zweite Zellebearbeitet.

Ein letztes Beispiel:

Sub ForNext3()Dim i As Integer

Page 120: Einstieg Mit VBA in Excel

119

Schleifen 3.5

Dim Ergebnis As IntegerThisWorkbook.Worksheets("Tabelle2").ActivateRange("B1:B10").Clear

For i = 9 To 2 Step –2Ergebnis = Cells(i, 1).Value * 2If Ergebnis < 10 Then Exit ForCells(i, 2).Value = Ergebnis

Next iEnd Sub

Das Ergebnis ist in Abbildung 3.14 dargestellt.

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

Zur Erläuterung:

Negative Schrittweite

� Die Schleife wird, beginnend mit dem größten Wert, mit negativerSchrittweite durchlaufen.

� Das Rechenergebnis wird zur deutlicheren Darstellung zwischenge-speichert, in der Variablen Ergebnis.

� Falls dieses Ergebnis eine besondere Bedingung erfüllt, wird dieSchleife vorzeitig verlassen, mit Hilfe von Exit For. Im vorliegendenBeispiel tritt dieser Fall ein, sobald der Wert von Ergebnis kleiner als10 ist.

Übung 3 H

Schreiben Sie eine Prozedur mit einer einfachen Schleife, die die folgendenZahlen wie gezeigt untereinander in den Zellen einer Spalte ausgibt: 35;32,5; 30; 27,5; 25; 22,5; 20.

Page 121: Einstieg Mit VBA in Excel

120

Grundlagen der Programmierung mit VBA3

Abbildung 3.15 Ergebnis von Übung 3 H

3.5.2 Do-Loop-Schleife

Ist die Anzahl der Schleifendurchläufe nicht bekannt bzw. vor Beginn derSchleife nicht berechenbar, so sollte man die Do-Loop-Schleife verwen-den. Es gibt sie in fünf verschiedenen Varianten:

While � Do While ... Loop: Prüft die Bedingung zum Weiterlaufen der Schleifeam Anfang der Schleife.

� Do ... Loop While: Prüft die Bedingung zum Weiterlaufen der Schleifeam Ende der Schleife.

Until � Do Until ... Loop: Prüft die Bedingung zum Abbruch der Schleife amAnfang der Schleife.

� Do ... Loop Until: Prüft die Bedingung zum Abbruch der Schleife amEnde der Schleife.

Exit Do � Do ... Loop: Die Bedingung zum Weiterlaufen oder zum Abbruch derSchleife wird nicht geprüft, daher sind eine Verzweigung in derSchleife und ein Exit Do zur Beendigung der Schleife notwendig.Ansonsten würde die Schleife endlos weiterlaufen.

Fußgesteuert Die Schleifen mit Do ... Loop While und Do ... Loop Until nennt manauch fußgesteuert: Die Bedingung wird erst am Fuß der Schleife geprüft.Eine solche Schleife wird mindestens einmal durchlaufen.

Kopfgesteuert Im Gegensatz dazu gibt es die kopfgesteuerten Schleifen mit Do While... Loop und Do Until ... Loop: Die Bedingung wird bereits im Kopf derSchleife geprüft. Dabei kann es vorkommen, dass diese Schleife niemalsdurchlaufen wird.

Der allgemeine Aufbau sieht wie folgt aus:

Do { While | Until } Bedingung[ Anweisungen ]

Page 122: Einstieg Mit VBA in Excel

121

Schleifen 3.5

[ Exit Do ][ Anweisungen ]

Loop

oder

Do[ Anweisungen ][ Exit Do ][ Anweisungen ]

Loop { While | Until } Bedingung

Zufallszahlen-generator

In den folgenden Prozeduren werden drei der fünf Möglichkeitengenutzt. Es sollen jeweils so lange Zahlen addiert werden, bis die Summeder Zahlen 5 erreicht. Da die Zahlen durch einen Zufallszahlengeneratorerzeugt werden, ist die Anzahl der Schleifendurchläufe nicht vorhersag-bar.

Rnd(), Randomize

Das erste Beispiel:

Sub DoLoop1()Dim i As IntegerDim Summe As Single

ThisWorkbook.Worksheets("Tabelle2").ActivateRange("C1:C20").ClearRandomize

i = 1Summe = 0Do

Summe = Summe + RndCells(i, 3).NumberFormatLocal = "0,000"Cells(i, 3).Value = Summei = i + 1

Loop While Summe < 5

Cells(i, 3).Value = "Fertig"End Sub

Hinweis

Der Zufallszahlengenerator wird mit Hilfe der Funktion Rnd() realisiert.Diese liefert quasizufällige Zahlen zwischen 0 und 1. Der Zufallszahlengene-rator muss mit Hilfe der Anweisung Randomize vor der Benutzung initialisiertwerden. Ansonsten könnte es vorkommen, dass immer die gleichen Zahlengeliefert werden, die dann eben nicht mehr zufällig sind.

Page 123: Einstieg Mit VBA in Excel

122

Grundlagen der Programmierung mit VBA3

Abbildung 3.16 zeigt ein mögliches Ergebnis.

Zur Erläuterung:

� Der Zielbereich wird zu Beginn mit der Methode Clear() gelöscht, dadie Ergebnisse aller drei Schleifen hier notiert werden.

� Der Zufallszahlengenerator wird initialisiert.

� Die Variable i für die Zeilennummer der Ausgabezelle wird auf 1gesetzt.

Summe, Startwert � Die Variable Summe wird zunächst mit dem Wert 0 initialisiert. Dies istin VBA eigentlich nicht nötig, gehört aber zum guten Programmier-stil, da man auf diese Weise den Startwert der Summe verdeutlichenkann.

� Der Wert der Variablen Summe wird um eine Zufallszahl zwischen 0und 1 erhöht. Die Summe wird ausgegeben.

� Die Variable i für die Zeilennummer der Ausgabezelle wird um 1erhöht, damit der nächste Wert von Summe in der nächsten Zeile aus-gegeben wird.

LoopWhile � Mit Hilfe von While Summe < 5 wird geprüft, ob die Summe der Zahlenkleiner als 5 ist. Sobald dies nicht mehr zutrifft, läuft die Prozedur hin-ter der Anweisung Loop weiter.

� Es wird die Ausgabe »Fertig« erzeugt.

Abbildung 3.16 Addition zufälliger Zahlen, Grenze 5

Ein weiteres Beispiel:

Sub DoLoop2().....

Page 124: Einstieg Mit VBA in Excel

123

Schleifen 3.5

DoSumme = Summe + RndCells(i, 3).NumberFormatLocal = "0,000"Cells(i, 3).Value = Summei = i + 1

Loop Until Summe >= 5

Cells(i, 3).Value = "Fertig"End Sub

Zur Erläuterung der zweiten Prozedur:

� Der Anfang dieser Prozedur unterscheidet sich nicht vom Anfang dervorherigen Prozedur, daher wird er hier nicht aufgeführt.

Loop Until� Zur Steuerung der Schleife wird diesmal mit Loop Until geprüft, obdie Summe den Wert von 5 erreicht oder überschritten hat. In diesemFall wird die Schleife nicht nochmals durchlaufen.

Das letzte Beispiel:

Sub DoLoop3().....Do

Summe = Summe + RndCells(i, 3).NumberFormatLocal = "0,000"Cells(i, 3).Value = Summei = i + 1If Summe >= 5 Then Exit Do

Loop

Cells(i, 3).Value = "Fertig"End Sub

Zur Erläuterung der dritten Prozedur:

Exit Do� Zur Steuerung der Schleife wird diesmal innerhalb der Schleifegeprüft, ob die Summe den Wert von 5 erreicht oder überschrittenhat. In diesem Fall erfolgt ein unmittelbares Verlassen der Schleife mitExit Do.

Page 125: Einstieg Mit VBA in Excel

124

Grundlagen der Programmierung mit VBA3

Steuertabelle

Übung 3 I

Schreiben Sie eine Prozedur, mitderen Hilfe eine Zahl, die in derobersten Zelle einer Spalte steht,wiederholt halbiert wird. Alle Zah-len sollen, wie in Abbildung 3.17dargestellt, nacheinander unter derursprünglichen Zahl ausgegebenwerden. Die Prozedur soll beendetwerden, wenn das Ergebnis derHalbierung 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 Lösung aus Übung 3 F (siehe Seite 114). Schreiben Sie eineProzedur, die zu einer Reihe von Gehältern u. a. den Steuerbetrag berechnetund ausgibt. In Tabelle 3.15 sind die Steuersätze angegeben.

Gehalt Steuersatz

bis einschl. 12.000 € 12 %

größer als 12.000 bis einschl. 20.000 € 15 %

größer als 20.000 bis einschl. 30.000 € 20 %

größer als 30.000 € 25 %

Tabelle 3.15 Zu Übung 3 J

Es sollen, wie dargestellt, für jedes Gehalt von 9.000 € bis 33.000 € in Schrit-ten von 3.000 € folgende vier Werte ausgegeben werden: Gehalt, Steuer-satz, Steuerbetrag, Gehalt abzüglich Steuerbetrag. Jedes Gehalt soll mit denzugehörigen Werten in einer eigenen Zeile ausgegeben werden.

Abbildung 3.18 Ergebnis von Übung 3 J

Page 126: Einstieg Mit VBA in Excel

125

Wer programmiert, macht Fehler. In diesem Kapitel lernen Sie, wie man Programmierfehler erkennt und wie man mit ihnen umgeht.

4 Fehlerbehandlung

FehlerartenWährend man ein Programm entwickelt und testet, treten normaler-weise noch häufig Fehler auf. Diese Fehler lassen sich in drei Gruppenuntergliedern: Syntaxfehler, Laufzeitfehler und logische Fehler.

VermeidungSyntaxfehler können mit Hilfe des Editors vermieden werden. Laufzeit-fehler, also Fehler zur Laufzeit des Programms, die einen Programmab-sturz zur Folge haben, können mit der On Error-Anweisung behandeltwerden. Logische Fehler sind erfahrungsgemäß am schwersten zu fin-den. Hier bietet das Debugging eine gute Hilfestellung.

4.1 Syntaxfehler

Warnung, HinweisSyntaxfehler treten zur Entwicklungszeit des Programms auf und habenihre Ursache in falsch oder unvollständig geschriebenem Programmcode.Bereits beim Schreiben des Codes, spätestens aber beim Starten einerProzedur macht VBA auf Syntaxfehler aufmerksam. Der Programmierererhält eine Warnmeldung und gegebenenfalls einen Hinweis auf die rich-tige Vorgehensweise. Wird der Fehler nicht behoben, so wird eine Aus-führung des Programms abgelehnt.

Der Editor bietet einige Hilfestellungen zur Vermeidung von Fehlern, diebereits in Abschnitt 3.1, »Grundlagen der Programmierung mit VBA –Allgemeines«, erläutert wurden.

Fehler markiertAbbildung 4.1 zeigt ein Beispiel für einen Syntaxfehler. Der Fehler wirdwährend des Schreibens, genauer gesagt beim Zeilenwechsel, bemerkt.Die Fehlerstelle wird markiert, und es wird ein Hinweis auf die richtigeSchreibweise gegeben.

Page 127: Einstieg Mit VBA in Excel

126

Fehlerbehandlung4

Abbildung 4.1 Syntaxfehler

4.2 Laufzeitfehler

On Error Die On Error-Anweisung dient zum Abfangen von Laufzeitfehlern. Diesetreten auf, wenn das Programm versucht, eine unzulässige Operationdurchzuführen, beispielsweise eine Division durch Null oder das Öffneneiner nicht vorhandenen Datei.

UnvermeidbareFehler

Es ist natürlich besser, Laufzeitfehler von Anfang an zu unterbinden.Dies ist allerdings unmöglich, da es Vorgänge gibt, auf die der Entwicklerkeinen Einfluss hat, etwa die fehlerhafte Eingabe eines Benutzers oderein beim Druckvorgang ausgeschalteter Drucker.

4.2.1 Programm mit Laufzeitfehlern

Beispiel mit Fehler In der folgenden Prozedur wird ein Laufzeitfehler hervorgerufen. DerInhalt der Zelle A1 wird durch den Inhalt der Zelle A2 geteilt. Das Ergeb-nis der Division soll in der Zelle A3 ausgegeben werden.

Sub LaufzeitFehler()Dim x As Integer, y As Integer, z As IntegerThisWorkbook.Worksheets("Tabelle1").Activate

x = Range("A1").Valuey = Range("A2").Valuez = x / yRange("A3").Value = z

End Sub

Falls in den beiden Zellen die Zahlen 12 und 3 stehen, sieht das Ergebniserwartungsgemäß wie in Abbildung 4.2 aus.

Page 128: Einstieg Mit VBA in Excel

127

Laufzeitfehler 4.2

Abbildung 4.2 Berechnung ohne Laufzeitfehler

Division durch 0Falls jedoch die Zahlen 12 und 0 in den Zellen stehen, bricht das Pro-gramm mit einem Laufzeitfehler ab. Es erscheint ein Dialogfeld mit einerFehlermeldung (siehe Abbildung 4.3).

Abbildung 4.3 Mathematisch nicht erlaubt

Fehler wird markiert

Sie können nun entweder den Button Beenden oder den Button Debuggen

betätigen. Klicken Sie den Button Debuggen, so wird die Zeile, die denLaufzeitfehler erzeugt hat, gelb markiert. Dies ist in diesem Falle die Zeilez = x / y, da die Division in dieser Zeile vorgenommen werden sollte.Dadurch bekommen Sie einen weiteren Hinweis zur Fehlerbehebung.

Abbildung 4.4 Programmzeile mit Division

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

Page 129: Einstieg Mit VBA in Excel

128

Fehlerbehandlung4

Abbildung 4.5 Falscher Datentyp

Betätigen Sie den Button Debuggen, dann wird die Zeile y =

Range("A2").Value gelb markiert. In dieser Zeile sollte der Inhalt derZelle (der Text abc) der Integer-Variablen y zugewiesen werden. Dieserwies sich als unverträglich.

Abbildung 4.6 Programmzeile mit Zuweisung

4.2.2 Abfangen mit On Error

On Error Die Prozedur wird nun zum Abfangen des Laufzeitfehlers wie folgt ver-bessert:

Sub OnErrorAnweisung()Dim x As Integer, y As Integer, z As IntegerThisWorkbook.Worksheets("Tabelle1").Activate

On Error GoTo Fehler

x = Range("A1").Valuey = Range("A2").Valuez = x / yRange("A3").Value = zExit Sub

Fehler:MsgBox Err.DescriptionResume Next

End Sub

Page 130: Einstieg Mit VBA in Excel

129

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 Erläuterung:

GoTo Zeile� Die Anweisung On Error GoTo Fehler bedeutet, dass im Falle einesLaufzeitfehlers innerhalb dieser Prozedur zu der Zeile mit der Zeilen-marke Fehler gesprungen wird.

� Die Zeilenmarke wird gesetzt mit: Fehler:, also allgemein mit Nameder Zeilenmarke und einem Doppelpunkt.

Objekt »Err«� Beim Auftreten eines Laufzeitfehlers wird das Fehlerobjekt Err mitDaten versorgt. Sie können z. B. den Wert der Eigenschaft Descrip-tion ausgeben und erhalten die Beschreibung des Fehlers.

� Im Unterschied zum vorherigen Beispiel kann das Programm weiter-laufen, es bricht nicht ab.

Exit Sub� Mit Exit Sub (ähnlich Exit For oder Exit Do für eine Schleife) kanneine Prozedur vorzeitig verlassen werden. Falls diese Anweisung inder vorliegenden Prozedur weggelassen wurde, würden die Anwei-sungen nach der Zeilenmarke Fehler in jedem Falle durchlaufen, auchwenn die Zahlen in den Zellen korrekt sind. Dies soll natürlich nichtsein.

Resume Next� Die Anweisung Resume Next bedeutet, dass der Programmlauf mit derAnweisung fortsetzt, die nach der Anweisung steht, in der der Lauf-zeitfehler auftrat.

Page 131: Einstieg Mit VBA in Excel

130

Fehlerbehandlung4

4.3 Logische Fehler und Debugging

Falsche Logik Logische Fehler treten auf, wenn eine Anwendung zwar ohne Syntaxfeh-ler übersetzt und ohne Laufzeitfehler ausgeführt wird, aber nicht dasgeplante Ergebnis liefert. Dies liegt daran, dass die Programmlogik falschaufgebaut wurde.

Debugging Die Ursache logischer Fehler zu finden, ist oft schwierig und kann nurdurch intensives Testen und Analysieren der Abläufe und Ergebnissedurchgeführt werden. VBA stellt im Zusammenhang mit dem Debuggingeinige wertvolle Hilfen zur Verfügung.

4.3.1 Einzelschrittverfahren

Schritt für Schritt Sie können ein Programm im Einzelschrittverfahren ablaufen lassen, umsich dann bei jedem einzelnen Schritt die aktuellen Inhalte von Variablenund Steuerelementen anzuschauen. Als Beispiel dient die bereitsbekannte Prozedur OnErrorAnweisung(). Für den ersten Durchlauf inEinzelschritten sollen die Zahlen 12 und 3 in den Zellen stehen.

Taste F8 Sie beginnen im VBE mit dem Menüpunkt Debuggen � Einzelschritt

(Taste (F8)). Ein gelber Pfeil vor einer gelb markierten Zeile kennzeichnetden Punkt, an dem die Prozedur gerade angehalten wurde und auf dieReaktion des Entwicklers wartet. Nach einigen weiteren Einzelschritten(wiederum Taste (F8)) stehen Sie auf der folgenden Zeile:

Abbildung 4.9 Nach einigen Einzelschritten

Werte prüfen Platzieren Sie nun den Cursor über einer Variablen (z. B. über der Variab-len x), so sehen Sie den aktuellen Wert (hier der Wert 12 für x). Sieerkennen auch, dass die Variable z noch den Wert 0 hat, da die aktuellmarkierte Anweisung noch nicht ausgeführt wurde. Bereits nach demnächsten Einzelschritt hat die Variable z den Wert 4 bekommen.

Page 132: Einstieg Mit VBA in Excel

131

Logische Fehler und Debugging 4.3

DirektfensterDie aktuellen Variablenwerte können Sie sich auch im Direktfenster anse-hen. Sie erreichen es über das Menü Ansicht � Direktfenster. Nach derEingabe von ?<Variablenname> erscheint der jeweilige Wert:

Abbildung 4.10 Variablenwerte im Direktfenster

Parallel zu den Variablen können Sie auch nach jedem Einzelschritt dieInhalte der Zellen des Tabellenblatts betrachten. Diese verändern sicherst, nachdem die entsprechende Prozedurzeile durchlaufen wurde.

Fehlerursache finden

Dieses einfache Beispiel zeigt, dass Sie mit dem Einzelschrittverfahrenden Ablauf eines Programms stückweise verfolgen und so den Ursprungeines logischen Fehlers leichter lokalisieren können.

Für den zweiten Durchlauf in Einzelschritten sollen die Zahl 12 und derText abc in den Zellen stehen. Während des Durchlaufs in Einzelschrit-ten sehen Sie zweimal deutlich den Sprung zur Fehlermarke und dieanschließende Fortsetzung der Prozedur:

� bei der Zuweisung des Textes abc an die Zahlenvariable y

� bei der Durchführung der Division

Page 133: Einstieg Mit VBA in Excel

132

Fehlerbehandlung4

Abbildung 4.11 Sprung zur Fehlermarke

4.3.2 Haltepunkte

Breakpoint Dauert das Einzelschrittverfahren bei einem bestimmten Programm zulange, können Sie auch mit Haltepunkten (engl. breakpoints) arbeiten.Das Programm durchläuft dann alle Anweisungen bis zu einem solchenHaltepunkt. Setzen Sie einen Haltepunkt in die Nähe der Stelle, an der Sieden Ursprung eines Fehlers vermuten.

Taste F9 Das Setzen eines Haltepunkts geschieht über den Menüpunkt Debuggen

� Haltepunkt setzen (Taste (F9)). Es wird ein Haltepunkt in der Zeilegesetzt, in der sich der Cursor befindet. Im Beispiel bietet sich hierfür dieZeile an, in der z = x / y berechnet wird.

Abbildung 4.12 Gesetzter Haltepunkt

Programm hält an Das Programm wird nun über die Taste (F5) gestartet. Es unterbricht vorder Ausführung der Zeile mit dem Haltepunkt. Ab diesem Punkt könnenSie das Programm wiederum im Einzelschrittverfahren ablaufen lassenund die Werte der Variablen wie oben beschrieben kontrollieren.

MehrereHaltepunkte

Es können auch mehrere Haltepunkte gesetzt werden. Ein Haltepunktwird wieder entfernt, indem Sie den Cursor in die betreffende Zeile set-zen und wiederum die Taste (F9) betätigen. Über das Menü Debuggen

können Sie auch alle Haltepunkte auf einmal entfernen.

Page 134: Einstieg Mit VBA in Excel

133

In diesem Kapitel erfahren Sie etwas über die Gültigkeitsberei-che von Variablen, über Datenfelder und über die Modularisie-rung von Programmen mit Prozeduren und Funktionen.

5 Mehr über die Programmierung mit VBA

In Kapitel 3 haben Sie bereits die Grundlagen der VBA-Programmierungkennengelernt. Im Folgenden werden Sie mit weiteren Elementen undTechniken vertraut gemacht.

5.1 Gültigkeitsbereiche

Unabhängige Variablen

Variablen sollten möglichst lokal, d. h. innerhalb einer Prozedur, dekla-riert werden. Damit kann jede Prozedur möglichst unabhängig von ande-ren Prozeduren arbeiten. Es gibt allerdings auch Situationen, in denenVariablen für andere Gültigkeitsbereiche deklariert werden müssen.

Es gibt folgende Gültigkeitsbereiche:

Lokal� Variablen, die innerhalb einer Prozedur deklariert wurden, sind nurinnerhalb der Prozedur lokal gültig. Außerhalb der Prozedur sindsowohl Name als auch Wert der Variablen unbekannt. Sobald die Pro-zedur abgearbeitet wurde, steht der Wert auch nicht mehr zur Verfü-gung. Beim nächsten Aufruf der gleichen Prozedur werden diese Vari-ablen neu deklariert und erhalten neue Werte.

Modulweit� Variablen, die im Deklarationsteil eines Moduls (oberhalb der erstenProzedur) mit Dim deklariert werden, sind modulweit gültig. Ihr Wertkann in jeder Prozedur dieses Moduls gesetzt oder abgerufen werdenund bleibt während der Projektlaufzeit erhalten.

Public, öffentlich� Variablen, die im Deklarationsteil eines Moduls (oberhalb der erstenProzedur) mit Public deklariert werden, sind projektweit gültig. DerBegriff projektweit bedeutet, dass ihr Wert in jeder Prozedur der ver-schiedenen Module des Projekts bekannt ist und gesetzt oder abgeru-

Page 135: Einstieg Mit VBA in Excel

134

Mehr über die Programmierung mit VBA5

fen werden kann. Außerdem bleibt ihr Wert während der Projektlauf-zeit erhalten.

Gleiche Namen Gibt es mehrere Variablen mit dem gleichen Namen, gelten folgendeRegeln:

� Lokale Variablen mit gleichem Namen in der gleichen Prozedur sindnicht zulässig.

� Eine modulweite Variable wird innerhalb einer Prozedur von einerlokalen Variablen mit dem gleichen Namen ausgeblendet.

Ausblenden � Eine projektweite Variable wird innerhalb eines Moduls von einermodulweiten oder lokalen Variablen mit dem gleichen Namen ausge-blendet.

Im folgenden Beispiel werden zum besseren Verständnis lokale, modul-weite und projektweite Variablen deklariert, in verschiedenen Prozedu-ren verändert und ausgegeben.

Zunächst der Inhalt von Modul1:

Option ExplicitDim Mx As IntegerPublic Px As Integer

Sub Gueltigkeit1()Dim Lx As IntegerMx = 10Px = 20Lx = 30MsgBox MxMsgBox PxMsgBox Lx

End Sub

Sub Gueltigkeit2()MsgBox Mx

End Sub

Sub Gueltigkeit3()Dim Mx As IntegerMsgBox Mx

End Sub

Page 136: Einstieg Mit VBA in Excel

135

Datenfelder 5.2

Es folgt der Inhalt von Modul2:

Sub Gueltigkeit4()MsgBox Px

End Sub

Zur Erläuterung:

� Die Variable Mx ist im Modul1 modulweit gültig, in Modul2 unbekannt.In der Prozedur Gueltigkeit1() wird ihr ein Wert zugewiesen,anschließend wird sie ausgegeben. In der Prozedur Gueltigkeit2()wird sie nur ausgegeben. Der Wert hängt dabei davon ab, ob die Pro-zedur Gueltigkeit1() vorher durchlaufen wurde oder nicht.

� In der Prozedur Gueltigkeit3() wird die modulweite Variable Mxvon einer lokalen Variablen mit dem gleichen Namen ausgeblendet.

� Die Variable Px ist projektweit gültig. In der Prozedur Gueltig-keit1() wird ihr ein Wert zugewiesen, anschließend wird sie ausge-geben. In der Prozedur Gueltigkeit4() im Modul2 wird sie nurausgegeben. Der Wert hängt dabei davon ab, ob die Prozedur Gueltig-keit1() vorher durchlaufen wurde oder nicht.

� Die Variable Lx ist nur in der Prozedur Gueltigkeit1() lokal gültig,außerhalb ist sie unbekannt. In der Prozedur wird ihr ein Wert zuge-wiesen, anschließend wird sie ausgegeben.

5.2 Datenfelder

Viele Daten speichern

Man verwendet Datenfelder, um eine größere Menge zusammengehöri-ger Daten des gleichen Datentyps mit dem gleichen Variablennamenanzusprechen und zu speichern. Datenfelder können in VBA

Dimension� eindimensional oder mehrdimensional sein,

Statisch, dynamisch

� statisch (mit festgelegter Größe) oder dynamisch (mit variablerGröße) sein.

Eine Verarbeitung großer Datenmengen (z. B. Eingangsdaten) kann ineinem Datenfeld schneller vorgenommen werden als in den Zellen einesTabellenblatts. Im Zusammenhang mit Datenfeldern werden häufigSchleifen eingesetzt. Diese ermöglichen es, alle Elemente eines Daten-felds anzusprechen.

Page 137: Einstieg Mit VBA in Excel

136

Mehr über die Programmierung mit VBA5

5.2.1 Eindimensionale Datenfelder

In der folgenden Prozedur werden sieben Werte aus einer Reihe vonTemperaturmessungen in einem eindimensionalen, statischen Datenfeldvom Typ Integer gespeichert. Zur besseren Darstellung werden sieanschließend in Zellen ausgegeben:

Sub DatenfeldEindimensional()Dim T(1 To 7) As IntegerDim i As Integer

ThisWorkbook.Worksheets("Tabelle1").ActivateRandomize

For i = 1 To 7T(i) = Rnd() * 10 + 20Cells(i, 1).Value = T(i)

Next iEnd Sub

Abbildung 5.1 zeigt ein mögliches Ergebnis.

Abbildung 5.1 Datenfeld mit 7 Elementen

Zur Erläuterung:

Randomize � Die Werte sollen per Zufallszahlengenerator ermittelt werden; dieserwird zunächst mit der Anweisung Randomize initialisiert.

Dim ...(...) As ... � Mit der Anweisung Dim T(1 To 7) As Integer wird ein eindimensio-nales Feld mit sieben Elementen deklariert. Jedes einzelne Elemententspricht einer einzelnen Integer-Variablen. Es können Felder allerbekannten Datentypen deklariert werden.

Index � Die einzelnen Elemente werden durch eine laufende Nummer, densogenannten Index, voneinander unterschieden. Der Index beginntfür dieses Feld bei 1 und geht bis 7. Das erste Element des Felds hatdie Bezeichnung T(1), das nächste T(2) usw. bis T(7).

Page 138: Einstieg Mit VBA in Excel

137

Datenfelder 5.2

Schleife und Datenfeld

� Innerhalb einer For-Schleife wird jedem Element des Felds ein zufäl-liger Wert zugewiesen. Innerhalb der Schleife wird das aktuelle Ele-ment mit T(i) angesprochen, da die Schleifenvariable i die Wertevon 1 bis 7 durchläuft, die als Index benötigt werden.

� Der Wert für das Feldelement wird per Zufallsgenerator ermittelt.Dieser liefert Zahlen (mit Nachkommastellen) zwischen 0 und 1. Mul-tipliziert man diese mit 10, so ergeben sich Zahlen zwischen 0 und 10.Addiert man 20, erhält man Zahlen zwischen 20 und 30. Da diese Zah-len einer Integer-Variablen zugewiesen werden, werden die Nach-kommastellen abgeschnitten, und es ergeben sich ganze Zahlen zwi-schen 20 und 30.

� Die Elemente des Datenfelds werden in den Zellen untereinanderangezeigt.

Zwei Hinweise

� Die Anweisung Dim T(7) As Integer hätte ein eindimensionales Feld mitacht (!) Elementen deklariert. Die Elemente hätten die BezeichnungenT(0) bis T(7). Für die Darstellung innerhalb von Zellen eines Tabellen-blatts bietet es sich allerdings an, den Index bei 1 beginnen zu lassen.

� Falls man auf Modulebene, also oberhalb der Prozeduren und Funktio-nen, die Anweisung Option Base 1 einfügt, dann gilt der Wert 1 (statt desWerts 0) automatisch als Untergrenze der Felder in dem betreffendenModul. Dann würde die Anweisung Dim T(7) As Integer ein eindimen-sionales Feld mit sieben Elementen deklarieren.

Übung 5 A

Schreiben Sie ein Programm, in dem denElementen eines eindimensionalen Felds,das 10 Integer-Werte enthält, zufälligeWerte zwischen 30 und 35 zugewiesenwerden. Anschließend sollen alle Zellen,die den kleinsten Wert des Felds enthal-ten, wie gezeigt besonders hervorgeho-ben werden.

Abbildung 5.2 Kleinster Wert durch Rahmen hervorgehoben

Page 139: Einstieg Mit VBA in Excel

138

Mehr über die Programmierung mit VBA5

5.2.2 Mehrdimensionale Datenfelder

Zweidimensional Haben Sie nicht nur sieben Temperaturwerte, die Sie speichern möchten,sondern wurden die Temperaturwerte darüber hinaus an drei verschie-denen Orten aufgenommen, so bietet sich ein zweidimensionales Feldan.

Zwei Indizes Die Elemente eines solchen Felds werden über zwei Indizes angespro-chen. Der erste Index steht für die laufende Nummer der Messung, derzweite Index für den Ort, an dem die Messung durchgeführt wurde. Diefolgende Prozedur, bei der die Werte eines Orts jeweils in einer Spalteangezeigt werden, veranschaulicht dies:

Sub DatenfeldMehrdimensional()Dim T(1 To 7, 1 To 3) As IntegerDim i As Integer, k As Integer

ThisWorkbook.Worksheets("Tabelle1").ActivateRandomize

For i = 1 To 7For k = 1 To 3

T(i, k) = Rnd() * 10 + 20Cells(i, k).Value = T(i, k)

Next kNext i

End Sub

Ein mögliches Ergebnis sehen Sie in Abbildung 5.3.

Abbildung 5.3 Datenfeld mit 7 mal 3 Elementen

Zur Erläuterung:

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

� Es wird mit Dim T(1 To 7, 1 To 3) ein zweidimensionales Feld derGröße 7 mal 3 Elemente vom Datentyp Integer deklariert. Der Indexbeginnt in jeder Dimension bei 1.

Page 140: Einstieg Mit VBA in Excel

139

Datenfelder 5.2

Geschachtelte Schleife

� Es folgen zwei geschachtelte For-Schleifen. Geschachtelte Schleifenbestehen aus einer äußeren und einer inneren Schleife. Die äußereSchleife arbeitet mit der Schleifenvariablen i, die von 1 bis 7 läuft. Dieinnere Schleife arbeitet mit der Schleifenvariablen k, die von 1 bis 3läuft.

� Eine solche geschachtelte Schleife hat folgenden Ablauf: i erhält denWert 1, k durchläuft dann die Werte 1 bis 3; dann erhält i den Wert2, und k erhält wieder die Werte von 1 bis 3 usw.

� Auf diese Weise werden alle 21 Elemente des zweidimensionalenFelds erreicht. Das jeweils aktuelle Element T(i,k) erhält seinen Wertwieder über den Zufallsgenerator.

� Das zweidimensionale Feld wird damit vollständig erzeugt und imTabellenblatt ausgegeben.

Mehr Dimensionen

Ein zweidimensionales Feld lässt sich noch anschaulich innerhalb einesTabellenblatts darstellen. Allerdings gibt es auch Situationen, in denenDatenfelder mehr als zwei Dimensionen haben können:

Drei Dimensionen� Haben wir nicht nur sieben Messungen pro Tag an drei verschiedenenOrten, sondern diese auch noch über einen ganzen Monat an 31Tagen, so benötigen wir eine dritte Dimension. Die Deklaration sähedann wie folgt aus: Dim T(1 To 7, 1 To 3, 1 To 31) As Integer (oderbesser: As Single). Es ergäben sich also 7 mal 3 mal 31 Elemente.

Vier Dimensionen� Dieses Beispiel lässt sich leicht erweitern: Wie bisher haben wir sie-ben Messungen an drei Orten an 31 Tagen. Es wird aber jeweils nichtnur die Temperatur, sondern auch die Windrichtung, die Windge-schwindigkeit und die Luftfeuchtigkeit gemessen. Dazu benötigen wirein vierdimensionales Feld, das wie folgt deklariert würde: Dim T(1 To7, 1 To 3, 1 To 31, 1 To 4) As Single.

Sie sehen, dass Datenfelder nahezu unbegrenzte Möglichkeiten zur Spei-cherung und Verarbeitung größerer Datenmengen bieten. Der BegriffSpeicherung ist hier natürlich nur temporär zu verstehen: für die Speiche-rung während der Verarbeitung.

Dauerhafte Speicherung

Für eine dauerhafte Speicherung auf Festplatte benötigen Sie Dateien(siehe Abschnitt 9.1, »Textdateien, Import und Export«) oder besser nochDatenbanken (siehe Abschnitt 9.5, »Austausch mit Microsoft Access«).

Page 141: Einstieg Mit VBA in Excel

140

Mehr über die Programmierung mit VBA5

5.2.3 Dynamische Datenfelder

Variable Größe Steht zum Zeitpunkt des Programmstarts noch nicht fest, wie viele Vari-ablen in einem Feld gespeichert werden sollen, so können Sie auch mitdynamischen Feldern arbeiten. Dabei lässt sich die Größe eines Daten-felds zur Laufzeit verändern. Dies ist sehr nützlich, falls z. B. eine grö-ßere, unbekannte Menge an Daten aus einer Textdatei eingelesen, verar-beitet und anschließend in einem Tabellenblatt dargestellt werden soll.

ReDim, Preserve Die Größenveränderung (Redimensionierung, Schlüsselwort ReDim)kann mehrmals geschehen. Mit Hilfe von Preserve vereinbart man, dasseventuell bereits vorhandene Werte erhalten bleiben sollen. Im folgen-den Beispiel wird ein dynamisches Datenfeld deklariert. Seine Größewird dreimal unterschiedlich festgelegt, mit bzw. ohne Preserve:

Sub DatenfeldDynamisch()Dim T() As IntegerDim i As Integer

ThisWorkbook.Worksheets("Tabelle1").ActivateRandomize

' Feld zu BeginnReDim T(1 To 3)For i = 1 To 3

T(i) = Rnd() * 10 + 20Cells(i, 5).Value = T(i)

Next i

Übung 5 B

Schreiben Sie ein Programm, in dem denElementen eines zweidimensionalenFelds, das 10 mal 2 Integer-Werte ent-hält, zufällige Werte zwischen 130 und135 zugewiesen werden. Anschließendsollen alle Zellen, die den kleinsten Wertdes Felds enthalten, besonders hervorge-hoben werden.

Abbildung 5.4 Kleinster Wert durch Rahmen hervorgehoben

Page 142: Einstieg Mit VBA in Excel

141

Datenfelder 5.2

' Feld vergrößert, ohne PreserveReDim T(1 To 6)For i = 4 To 6

T(i) = Rnd() * 10 + 20Next iFor i = 1 To 6

Cells(i, 6).Value = T(i)Next i

' Feld vergrößert, mit PreserveReDim Preserve T(1 To 9)For i = 7 To 9

T(i) = Rnd() * 10 + 20Next iFor i = 1 To 9

Cells(i, 7).Value = T(i)Next i

End Sub

Das Ergebnis:

Abbildung 5.5 Dynamisches Datenfeld, zweimal verändert

Zur Erläuterung:

� Das Feld T wird zunächst ohne Größenangabe deklariert.

ReDim� Mit der ReDim-Anweisung wird es auf die Größe 3 festgelegt. Die dreiElemente werden mit zufälligen Werten gefüllt und ausgegeben.

� Anschließend wird das Feld auf die Größe 6 vergrößert, ohne Pre-serve. Die neu hinzugekommenen Elemente 4 bis 6 werden mit zufäl-ligen Werten gefüllt. Das gesamte Feld wird ausgegeben. Manerkennt, dass die Elemente 1 bis 3 ihren Wert verloren haben, siehaben wieder den Wert 0.

Page 143: Einstieg Mit VBA in Excel

142

Mehr über die Programmierung mit VBA5

Preserve � Zuletzt wird das Feld auf die Größe 9 vergrößert, mit Preserve. Dieneu hinzugekommenen Elemente 7 bis 9 werden mit zufälligen Wer-ten gefüllt. Das gesamte Feld wird ausgegeben. Man erkennt, dass dieElemente 4 bis 6 ihren Wert behalten haben, wegen Preserve.

VBA-Funktion Array()

Array() Mithilfe der Funktion Array() können eine Reihe von Werten beliebi-gen Datentyps und beliebige Objekte in einem eindimensionalen Daten-feld vom Typ Variant zusammengefasst werden. In der nachfolgendenProzedur wird ein Datenfeld mit zwei Ganzzahlen, einer Zahl mit Nach-kommastellen, einer Zeichenkette und einem Objekt vom Typ Rangeerzeugt. Es wird 3.5 ausgegeben, der Wert des dritten Feldelements.

Sub FunktionArray()Dim T() As VariantT = Array(2, -14, 3.5, "abc", Range("A2"))MsgBox T(2)

End Sub

5.2.4 Datenfelder löschen oder freigeben

Erase Die Anweisung Erase dient

� zum Löschen aller Inhalte eines statischen Datenfelds; das Datenfeldselbst ist noch vorhanden und beansprucht noch Speicherplatz;

� zur Freigabe des gesamten Speicherplatzes eines dynamischen Daten-felds; dieser Speicherplatz steht anschließend anderen Variablen oderDatenfeldern wieder zur Verfügung.

Ein Beispiel für ein statisches Datenfeld:

Sub DatenfeldLöschen()Dim T(1 To 5) As IntegerT(1) = 10MsgBox T(1)Erase TMsgBox T(1)

End Sub

Zur Erläuterung:

� Das statische Datenfeld T hat fünf Elemente.

Page 144: Einstieg Mit VBA in Excel

143

Datenfelder 5.2

� Das erste Element wird gefüllt und ausgegeben.

� Nach dem Löschen des Felds mit der Anweisung Erase wird das Ele-ment erneut ausgegeben. Es hat wieder den Startwert 0.

Ein Beispiel für ein dynamisches Datenfeld:

Sub DatenfeldFreigeben()Dim T() As IntegerOn Error GoTo Fehler

ReDim T(1 To 5)T(1) = 10MsgBox T(1)

Erase TMsgBox T(1)

ReDim T(1 To 5)T(1) = 10MsgBox T(1)

Exit SubFehler:

MsgBox Err.DescriptionResume Next

End Sub

Zur Erläuterung:

� Das dynamische Datenfeld T wird deklariert.

� Es wird mit Hilfe von ReDim auf die Größe 5 gesetzt.

� Das erste Element wird gefüllt und ausgegeben.

� Nach dem Freigeben des Speicherplatzes mit der Anweisung Erasewird 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 mitReDim genutzt werden.

Hinweis

Die Elemente von Feldern von Zeichenketten werden auf den Wert "" (= leereZeichenkette) gesetzt.

Page 145: Einstieg Mit VBA in Excel

144

Mehr über die Programmierung mit VBA5

5.3 Prozeduren und Funktionen

Sie haben bereits zahlreiche Prozeduren kennengelernt und entwickelt.Diese werden entweder als Makro von Excel aus aufgerufen oder direktvom VBE aus gestartet.

Darüber hinaus können Sie Prozeduren und Funktionen schreiben, dievon anderen Prozeduren bzw. Funktionen aufgerufen werden. Funktio-nen können außerdem direkt in Tabellenblätter eingebaut werden. Dieshat folgende Vorteile:

ÄhnlicheVorgänge

� Gleiche oder ähnliche Vorgänge müssen nur einmal programmiertwerden und können dann beliebig oft ausgeführt werden.

Modularisierung � Umfangreiche Programme können modularisiert werden, das heißt,sie werden in kleinere Bestandteile zerlegt, die übersichtlicher sindund einfacher gewartet werden können.

Eigene Excel-Funktionen

� Eigene Funktionen können Möglichkeiten bieten, die über die inte-grierten Excel-Funktionen hinausgehen. Sie können im Tabellenblattin gewohnter Weise in den Zellen eingetragen werden, mit Hilfe von=FUNKTIONSNAME(). Sie stehen in der Kategorie Benutzerdefiniert

zur Verfügung.

Ergebniszurückgeben

Im Wesentlichen unterscheiden sich Funktionen von Prozedurendadurch, dass sie nicht nur eine Reihe von Anweisungen ausführen, son-dern auch einen Funktionswert, beispielsweise das Ergebnis einerBerechnung, zurückliefern können.

Parameter An eine Prozedur (oder Funktion) können Parameter übergeben werden.Dadurch wird sie flexibler. Bezüglich der Handhabung von Parametern(Übergabe per Referenz, Übergabe per Kopie, optionale Parameter, belie-big viele Parameter) unterscheiden sich Funktionen und Prozedurennicht. Zur Übergabe von Parametern siehe Abschnitt 5.3.2.

Methode

5.3.1 Prozeduren

In einer Prozedur sind Anweisungen zusammengefasst, die als logischeEinheit zusammen ausgeführt werden sollen. Durch eine klare Aufgaben-

Hinweis

Im Zusammenhang mit den Objekten von Excel wurde bereits häufig derBegriff der Methode verwendet. Methoden sind ebenfalls Funktionen, dieallerdings auf ein bestimmtes Objekt bezogen sind.

Page 146: Einstieg Mit VBA in Excel

145

Prozeduren und Funktionen 5.3

teilung dieser Prozeduren wird der Programmcode eines Moduls über-sichtlicher und kann einfacher gewartet werden. Wir haben bereits allge-meine Prozeduren und Ereignisprozeduren kennengelernt.

Sub ... End SubAllgemeine Prozeduren sind nicht mit Ereignissen verbunden und habenfolgenden (vereinfachten) Aufbau:

Sub Prozedurname (Parameterliste)[ Anweisungsblock ][ Exit Sub ][ Anweisungsblock ]

End Sub

ParameterlisteBesteht die Parameterliste aus mehreren Parametern, so werden diesedurch Kommata voneinander getrennt.

Exit SubDie Anweisung Exit Sub kann eingesetzt werden, um die Prozedur auf-grund einer besonderen Bedingung sofort und nicht erst am Ende zu ver-lassen. Dies wurde z. B. im Abschnitt über die Fehlerbehandlung imZusammenhang mit der On Error-Abweisung genutzt.

Prozedur aufrufenDer Aufruf einer Prozedur:

Prozedurname Parameterliste

Im nachfolgenden Beispiel wird die Prozedur ZeigeMaximum() von zweiverschiedenen Stellen aus aufgerufen. Sie berechnet jeweils das Maxi-mum der beiden übergebenen Parameter und gibt dieses aus:

Sub Prozedur1()Dim a As Double, b As Doublea = 4.5b = 7.2ZeigeMaximum a, b

End Sub

Sub Prozedur2()Dim c As Doublec = 23.9ZeigeMaximum c, 5.6

End Sub

Sub ZeigeMaximum(x As Double, y As Double)If x > y Then

MsgBox xElse

MsgBox y

Page 147: Einstieg Mit VBA in Excel

146

Mehr über die Programmierung mit VBA5

End IfEnd Sub

Das Ergebnis für Prozedur2()zeigt Abbildung 5.6.

Abbildung 5.6 Prozedur2() ruft ZeigeMaximum() auf.

Zur Erläuterung:

Anzahl und Typgleich

� Die Prozedur ZeigeMaximum() hat zwei Parameter, die beiden Double-Variablen x und y. Folglich muss die Prozedur auch mit zwei (mög-lichst Double-)Variablen aufgerufen werden, denn sie erwartet dies.

� In Prozedur1() wird die Prozedur ZeigeMaximum() mit den Variablena und b, in Prozedur2() mit den Variablen c und dem Wert 5.6 auf-gerufen.

Zur Aufrufstellezurück

� In beiden Fällen werden also zwei Zahlenwerte an x und y übergeben.Innerhalb der Prozedur ZeigeMaximum() wird mit Hilfe einer Ver-zweigung das Maximum dieser beiden Zahlen ermittelt und ausgege-ben. Anschließend endet die Prozedur ZeigeMaximum(), und der Pro-grammablauf kehrt zur aufrufenden Stelle zurück.

� Es können also Variablen oder Werte an eine Prozedur übergebenwerden. Falls es sich um Variablen handelt, müssen sie nicht den glei-chen Namen haben wie die Variablen in der Prozedur. Prozedurenwerden im Allgemeinen von beliebigen Stellen des Programms ausmit unterschiedlichen Parametern wiederholt aufgerufen.

� Wichtig ist hierbei, dass Anzahl, Reihenfolge und Datentyp der Para-meter übereinstimmen.

Gültigkeitsbereich An dieser Stelle soll noch einmal das Thema Gültigkeitsbereich von Variab-len verdeutlicht werden:

� Die beiden lokalen Variablen a und b sind nur innerhalb vonProzedur1() bekannt und gültig. Bezogen auf Prozedur2() trifft diesfür die lokale Variable c zu.

� Ebenso gilt dies für die beiden Parameter x und y, bezogen auf dieProzedur ZeigeMaximum().

Page 148: Einstieg Mit VBA in Excel

147

Prozeduren und Funktionen 5.3

Eindeutigkeit� Somit kann es nicht zu Verwechslungen kommen. Selbst wenn ein-zelne Variablennamen in mehr als einer Prozedur vorkommen, ist dieEindeutigkeit aufgrund des Gültigkeitsbereichs gegeben.

Tastenkombi-nation Shift + F2

5.3.2 Übergabe von Parametern

Übergabe per Referenz

Parameter werden in VBA per Referenz übergeben. Dies bedeutet, dasseine Veränderung der Parameter in der Prozedur (oder Funktion) eineRückwirkung auf die Originalvariable hat.

Übergabe per Kopie

Wenn Sie allerdings nicht wünschen, dass es solche Rückwirkungen gibt,dann müssen Sie vor der betreffenden Variablen das Schlüsselwort ByValeinfügen. Dies bedeutet, dass die Variable per Kopie an die Prozedur(oder Funktion) übergeben wird. Eine Veränderung der Kopie hat keineAuswirkung auf die Originalvariable.

Im folgenden Programm werden beide Möglichkeiten einander gegenü-bergestellt.

Sub Uebergabe()Dim x As Integer, y As IntegerThisWorkbook.Worksheets("Tabelle2").Activate

Hinweis

Mit (ª)+(F2) auf dem Namen einer Prozedur oder Funktion springen Sie zuder Stelle, an der die Prozedur oder Funktion definiert wurde. Mit(Strg)+(ª)+(F2) kommen Sie wieder zurück.

Zur Erinnerung: Mit (ª)+(F2) auf dem Namen einer Variablen springen Siezu der Stelle, an der die Variable deklariert wurde.

Übung 5 C

Schreiben Sie eine Prozedur, in der zwei Double-Variablen beliebige Wertezugewiesen werden. Anschließend soll eine zweite Prozedur aufgerufen wer-den, der genau zwei Variablen übergeben werden können. Innerhalb derzweiten Prozedur wird der Mittelwert der beiden Zahlen berechnet und wiein dargestellt ausgegeben.

Abbildung 5.7 Ergebnis von Übung 5 C (Beispiel für die Zahlen 5,5 und 11,5)

Page 149: Einstieg Mit VBA in Excel

148

Mehr über die Programmierung mit VBA5

x = 5y = 12Cells(1, 1).Value = xCells(1, 2).Value = y

TauscheKopie x, yCells(2, 1).Value = xCells(2, 2).Value = y

TauscheReferenz x, yCells(3, 1).Value = xCells(3, 2).Value = y

End Sub

Sub TauscheKopie(ByVal a As Integer, ByVal b As Integer)Dim c As Integerc = aa = bb = c

End Sub

Sub TauscheReferenz(ByRef a As Integer, ByRef b As Integer)Dim c As Integerc = aa = bb = c

End Sub

Das Ergebnis:

Abbildung 5.8 Übergabe per Wert, Übergabe per Referenz

Zur Erläuterung:

� In der Prozedur Uebergabe() werden zwei Integer-Variablen mitStartwerten belegt. Anschließend werden die Prozeduren Tausche-Kopie() und TauscheReferenz() aufgerufen. Schließlich werden dieneuen Werte der beiden Variablen ausgegeben.

Page 150: Einstieg Mit VBA in Excel

149

Prozeduren und Funktionen 5.3

Ringtausch� In den beiden aufgerufenen Prozeduren werden jeweils die beidenübergebenen Variablen mit Hilfe einer dritten Variablen vertauscht(Ringtausch).

ByVal� Im Fall der Prozedur TauscheKopie() wurde ByVal verwendet. Dieneuen Werte stimmen jedoch mit den Startwerten überein, denn derTausch hat nur intern in der Prozedur TauscheKopie() stattgefunden,er hat keine Wirkung nach außen.

ByRef� In der Prozedur TauscheReferenz() wurde ByRef verwendet. Dies istder Standard, Sie können also ByRef auch weglassen. Die neuenWerte stimmen nicht mehr mit den Startwerten überein, der Tauschhat eine dauerhafte Auswirkung auf die beiden Originalvariablen.

5.3.3 Funktionen

Function ... (...)As ...

Funktionen haben folgenden (vereinfachten) Aufbau:

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

End Function

Datentyp einer Funktion

Jede Funktion besitzt wie eine Variable einen bestimmten Datentyp, derhinter As angegeben wird. Funktionen werden im Allgemeinen dazu ver-wendet, einen Wert zu berechnen. Sie liefern diesen Rückgabewert inihrem Namen zurück, nachdem er ihnen innerhalb der Prozedur zuge-wiesen wurde.

Exit FunctionDie Anweisung Exit Function kann eingesetzt werden, um die Funktionaufgrund einer speziellen Bedingung sofort und nicht erst am Ende zuverlassen.

Der Aufruf einer Funktion:

Variable = Funktionsname(Parameterliste)

Eigene Excel-Funktionen

Hinweis

Eigene Funktionen können sowohl innerhalb von VBA-Anwendungen alsauch auf dem Tabellenblatt mit Hilfe von =FUNKTIONSNAME() genutzt wer-den. Sie stehen innerhalb der jeweiligen Excel-Datei in der Kategorie Benut-

zerdefiniert zur Verfügung.

Page 151: Einstieg Mit VBA in Excel

150

Mehr über die Programmierung mit VBA5

Im folgenden Beispiel wird die Funktion MaxWert() aufgerufen. Sieberechnet das Maximum der beiden übergebenen Parameter und gibt esan die aufrufende Stelle zurück.

Sub Funktionen()Dim a As Integer, b As Integer, c As Integera = 12b = 17c = MaxWert(a, b)MsgBox c

End Sub

Function MaxWert(x As Integer, y As Integer) As IntegerIf x > y Then

MaxWert = xElse

MaxWert = yEnd If

End Function

Das Ergebnis:

Abbildung 5.9 Funktionen() bekommt ein Ergebnis zurück.

Zur Erläuterung:

Ergebnisrückgabe � Durch die Anweisung c = MaxWert(a, b) passiert nacheinander Fol-gendes:

� Die Funktion MaxWert() wird aufgerufen, dabei werden zwei Zah-lenwerte an die Funktion übergeben.

� Innerhalb der Funktion wird mit Hilfe einer Verzweigung dasMaximum dieser beiden Zahlen ermittelt und als Rückgabewertder Funktion gespeichert. Die Funktion endet, und der Programm-ablauf kehrt zu der Zeile mit dem Aufruf zurück.

� Dort wird der ermittelte Wert über die Zuweisung der Variablen cübergeben. Diese Variable wird anschließend ausgegeben.

Häufiger Fehler � Hätte die Anweisung nur MaxWert(a, b) gelautet, so hätten alle dieseSchritte stattgefunden, außer der Übergabe an c. Der Funktionsaufruf

Page 152: Einstieg Mit VBA in Excel

151

Prozeduren und Funktionen 5.3

wäre in diesem Fall vergeblich gewesen – ein häufiger Fehler bei Pro-grammiereinsteigern.

Die Funktion MaxWert() kann innerhalb dieser Arbeitsmappe auch imTabellenblatt benutzt werden. Geben Sie z. B. in einer Zelle ein: =Max-Wert(A1;B1), dann erscheint das erwartete Ergebnis.

Rangfolge der Operatoren

Es folgt ein weiteres Beispiel zur Arbeit mit Funktionen, Parametern undRückgabewerten. Gleichzeitig wird die Rangfolge der Operatoren, sieheAbschnitt 3.3.5, noch einmal verdeutlicht.

SchaltjahrIn der nachfolgenden Funktion Monatsende() wird der letzte Tag desMonats eines bestimmten Jahres berechnet. Dabei ergibt sich bekannt-lich je nach Monat der Wert 30 oder 31. Für den Monat Februar ergibtsich in Schaltjahren der Wert 29, ansonsten der Wert 28. Zunächst eineTestprozedur, mit der die Funktion Monatsende() aufgerufen wird:

Sub MonatsendeTesten()ThisWorkbook.Worksheets("Tabelle2").ActivateRange("D3").Value = _

Monatsende(Range("D1").Value, Range("D2").Value)End Sub

Zur Erläuterung:

� Die Funktion Monatsende() wird mit zwei Parametern aufgerufen. Indieser Testprozedur sind die zwei Werte aus einem Tabellenblatt diefür 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 = 29Else

Monatsende = 28

Übung 5 D

Schreiben Sie eine Prozedur, in der Sie zwei Double-Variablen beliebigeWerte zuweisen. Anschließend soll eine Funktion aufgerufen werden, dergenau zwei Variablen übergeben werden können. Innerhalb der Funktionwird der Mittelwert der beiden Zahlen berechnet und als Ergebnis zurückge-geben. Die Ausgabe soll in der aufrufenden Prozedur erfolgen.

Page 153: Einstieg Mit VBA in Excel

152

Mehr über die Programmierung mit VBA5

End IfElseIf M = 4 Or M = 6 Or M = 9 Or M = 11 Then

Monatsende = 30Else

Monatsende = 31End If

End Function

Zur Erläuterung:

� Die beiden Werte für Jahr und Monat werden beim Aufruf der Funk-tion an die Parameter J und M übergeben.

Mod � Falls es sich um den Monat Februar handelt, dann wird mit Hilfe desOperators Mod untersucht, ob das Jahr ein Schaltjahr ist, also ob sichdie Jahreszahl:

� durch 4, aber nicht durch 100 ohne Rest teilen lässt

� oder durch 400 ohne Rest teilen lässt

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 giltfolgende Rangfolge der Operatoren, beginnend mit der höchsten Pri-orität:

� Arithmetischer Operator Mod

� Vergleichsoperatoren = bzw. <>

� Logischer Operator And

� Logischer Operator Or

Es müssen an keiner Stelle Klammern gesetzt werden.

5.3.4 Optionale Parameter

Normalerweise müssen Zahl und Reihenfolge der Parameter in Aufrufund Deklaration einer Prozedur (oder Funktion) übereinstimmen. Siekönnen allerdings auch optionale Parameter verwenden. Diese müssenbeim Aufruf nicht angegeben werden.

Optional Die Parameter werden in der Parameterliste durch das SchlüsselwortOptional gekennzeichnet, müssen immer am Ende der Parameterlistestehen und können mit einem Wert initialisiert werden.

Im folgenden Beispiel wird die Funktion Addiere() insgesamt dreimalaufgerufen, einmal mit zwei Parametern, einmal mit drei Parametern

Page 154: Einstieg Mit VBA in Excel

153

Prozeduren und Funktionen 5.3

und einmal mit vier Parametern. Sie berechnet jeweils die Summe derübergebenen Parameter und liefert diese zurück.

Sub OptionaleParameter()Dim a As Double, b As Double, c As Double, d As Doublea = 4b = 7.5c = 10.5d = 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 + qEnd 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

Page 155: Einstieg Mit VBA in Excel

154

Mehr über die Programmierung mit VBA5

Das letzte Ergebnis:

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

Zur Erläuterung:

Initialisierung � Die Funktion Addiere() erwartet insgesamt vier Parameter vomDatentyp Double. Die beiden letzten Parameter sind optional. Mankann optionale Parameter mit einem Standardwert initialisieren.

� Werden die beiden letzten Parameter bei einem Aufruf der Funktionnicht angegeben, so haben sie den Standardwert 0. Da innerhalb derFunktion eine Addition der vier Parameter stattfindet, ist dies dergeeignete Wert; das Ergebnis der Funktion wird nicht verfälscht.

� Bei Prozeduren oder Funktionen mit optionalen Parametern, dieandere Aufgaben zu erfüllen haben, können andere Werte zur Initia-lisierung sinnvoll sein.

� In der Prozedur OptionaleParameter() wird die Funktion Addiere()mit vier, drei oder zwei Parametern aufgerufen. In allen Fällen führtdies erfolgreich zur Addition und Ausgabe der Werte.

� Ein Aufruf mit nur einem Parameter hätte zu einer Fehlermeldunggeführt, da der Parameter y nicht optional ist.

5.3.5 Benannte Parameter

Parameterbenennen

Im Zusammenhang mit optionalen Parametern sollte man sich auch mitden benannten Parametern befassen. Die Übergabe von Werten kann beivielen 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 gewünschten Parameter, mit Benennung desjeweiligen Parameters, in beliebiger Reihenfolge

In diesem Abschnitt wird gezeigt, wie man eigene Prozeduren schreibt,die über benannte Parameter aufgerufen werden können.

Page 156: Einstieg Mit VBA in Excel

155

Prozeduren und Funktionen 5.3

VorteileDie Verwendung bietet folgende Vorteile:

� der Parameter kann eindeutig angesprochen werden,

� nicht alle Parameter, die möglich sind, müssen genannt werden und

� das Programm wird lesbarer.

Im folgenden Beispiel wird die Prozedur Adresse() insgesamt fünfmalaufgerufen, mit unterschiedlichen Parametern. Abhängig von den gelie-ferten Parametern setzt sie einen Text zusammen und gibt diesen Textaus.

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 <> "" ThenAusgabe = Name & ", " & Vorname

ElseAusgabe = Name

End If

If PLZ <> "" ThenIf Ort <> "" Then

Ausgabe = Ausgabe & vbCrLf & PLZ & " " & OrtElse

Ausgabe = Ausgabe & vbCrLf & PLZEnd If

ElseIf Ort <> "" Then

Ausgabe = Ausgabe & vbCrLf & OrtEnd If

End If

MsgBox AusgabeEnd Sub

Page 157: Einstieg Mit VBA in Excel

156

Mehr über die Programmierung mit VBA5

Das Ergebnis des dritten Aufrufs der Prozedur Adresse():

Abbildung 5.13 Mit allen optionalen Parametern

Zur Erläuterung:

� Die Prozedur Addiere() erwartet insgesamt vier Parameter vomDatentyp String. Die drei letzten Parameter sind optional, nur dererste Parameter muss angegeben werden.

� Die restlichen Parameter können mit Hilfe ihres Namens in beliebigerReihenfolge angegeben werden.

5.3.6 Beliebig viele Parameter

ParamArray Mit Hilfe des Schlüsselwortes ParamArray können Sie eine Prozedur(oder Funktion) formulieren, an die beliebig viele Parameter übergebenwerden können. ParamArray verträgt sich nicht mit Optional, Sie müs-sen sich also für eine der beiden Lösungen entscheiden.

Im folgenden Beispiel wird die Funktion Mittelwert() insgesamt drei-mal aufgerufen, einmal ohne Parameter, einmal mit zwei Parameternund einmal mit vier Parametern. Sie berechnet jeweils den Mittelwertder übergebenen Parameter und liefert diesen zurück.

Sub BeliebigVieleParameter()Dim a As Double, b As Double, c As Double, d As Doublea = 4b = 7.5c = 10.5d = 9

MsgBox Mittelwert()MsgBox Mittelwert(a, b)MsgBox Mittelwert(a, b, c, d)

End Sub

Function Mittelwert(ParamArray x() As Variant) As DoubleDim i As Integer

Page 158: Einstieg Mit VBA in Excel

157

Prozeduren und Funktionen 5.3

Dim Summe As DoubleDim Anzahl As Double

For i = 0 To UBound(x)Summe = Summe + x(i)

Next

Anzahl = UBound(x) + 1If Anzahl > 0 Then Mittelwert = Summe / Anzahl

End Function

Abbildung 5.14 zeigt das Ergebnis für den letzten Aufruf.

Abbildung 5.14 Datenfeld x() mit vier Elementen

Zur Erläuterung:

Variable »Anzahl«� Die Funktion Mittelwert() wird mit unterschiedlichen Anzahlen vonParametern aufgerufen (0, 2 und 4).

Datentyp »Variant«

� Zur Aufnahme der Parameter steht das Parameterdatenfeld (ParamAr-ray) x zur Verfügung. Dabei handelt es sich um ein Datenfeld, dessenGröße nicht festgelegt ist. Dieses Datenfeld muss vom Datentyp Vari-ant sein.

UBound()� Innerhalb der Funktion werden die Parameter mit Hilfe einer Schleifesummiert. Die Obergrenze für die Schleife (also der höchste Wert fürden Index) wird über die Funktion UBound() ermittelt. Es musszunächst festgestellt werden, wie viele Elemente das Parameterdaten-feld hat.

� Der Mittelwert einer Reihe von Zahlen ist bekanntlich die Summe derZahlen geteilt durch ihre Anzahl. Wird die Funktion ohne Parameteraufgerufen, so ergibt UBound() den Wert 1. Es würde dann eine Divi-sion durch 0 durchgeführt. Dies gilt es zu vermeiden.

Funktion sollte Wert haben

� Konnte innerhalb einer Funktion kein Wert für die Funktion ermitteltwerden, so gilt wie bei Variablen auch hier der Startwert 0. Im Sinneeines sauberen Programmierstils sollten Sie dies ebenfalls vermeiden.Eine Funktion sollte während ihres Verlaufs immer explizit einenWert erhalten.

Page 159: Einstieg Mit VBA in Excel

158

Mehr über die Programmierung mit VBA5

LBound()

5.3.7 Datenfelder als Parameter

Flexible Übergabe Datenfelder können auch an Prozeduren (oder Funktionen) in der Para-meterliste übergeben werden. Dabei muss weder Anzahl noch Größe derDimensionen angegeben werden. Dadurch ist die Prozedur (oder Funk-tion) flexibler und kann unterschiedliche Felder verarbeiten. Das fol-gende Beispiel veranschaulicht eine solche Übergabe:

Sub DatenfeldUebergeben()Dim x(1 To 5, 1 To 3) As IntegerDatenfeldFuellen x()DatenfeldAusgeben x()

End Sub

Sub DatenfeldFuellen(z() As Integer)Dim i As Integer, k As IntegerFor i = LBound(z, 1) To UBound(z, 1)

For k = LBound(z, 2) To UBound(z, 2)z(i, k) = i * k

Next kNext i

End Sub

Sub DatenfeldAusgeben(z() As Integer)Dim i As Integer, k As IntegerThisWorkbook.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 iEnd Sub

Das Ergebnis sehen Sie in Abbildung 5.15.

Hinweis

Es gibt auch die Funktion LBound(), mit der Sie die Untergrenze, also denniedrigsten Wert, für den Index eines Feldes ermitteln können. Die Funktio-nen UBound() und LBound() sind in der Lage, diese Indizes für alle Dimensi-onen eines ein- oder mehrdimensionalen Datenfelds zu ermitteln. Sie habeneinen optionalen zweiten Parameter, die Nummer der Dimension (1, 2, 3...). Falls er nicht angegeben wird, dann wird die Grenze für die ersteDimension ermittelt, wie in der oben angegebenen Funktion Mittelwert().

Page 160: Einstieg Mit VBA in Excel

159

Benutzerdefinierter Datentyp 5.4

Abbildung 5.15 Übergabe eines zweidimensionalen Feldes

Zur Erläuterung:

� In der Prozedur DatenfeldUebergeben() wird ein Feld mit 5 mal 3Elementen deklariert.

Übergabe per Referenz

� Das leere Feld wird an die Prozedur DatenfeldFuellen() übergeben.In dieser Prozedur wird es mit Werten gefüllt. Da die Übergabe perReferenz erfolgt, bleiben die Werte erhalten.

� Das gefüllte Feld wird an die Prozedur DatenfeldAusgeben() überge-ben. In dieser Prozedur werden die Werte in einem Tabellenblatt aus-gegeben.

LBound(), UBound()

� In beiden Prozeduren werden mit den Funktionen LBound() undUBound() jeweils die Unter- und Obergrenzen der beiden Dimensio-nen ermittelt. Dadurch ist gewährleistet, dass alle Feldelementeerreicht werden können.

5.4 Benutzerdefinierter Datentyp

Logisch zusammen-hängende Daten

Ein benutzerdefinierter Datentyp dient zur Verbindung von zusammen-gehörigen Daten unterschiedlichen Datentyps. Der Entwickler verdeut-licht damit den logischen Zusammenhang zwischen bestimmten Daten.

KomponentenDie einzelnen Komponenten des neuen Datentyps können Datenfeldersein. Ebenso können Sie Datenfelder des neuen Datentyps bilden. Ein-zelne Variablen (und auch Datenfelder) des neuen Datentyps können anProzeduren oder Funktionen übergeben werden. Ein Beispiel:

Option Explicit

Type PersonName As StringPNummer As IntegerTelefon() As StringTelefax(1 To 2) As String

Page 161: Einstieg Mit VBA in Excel

160

Mehr über die Programmierung mit VBA5

Gehalt As SingleEnd Type

Sub Benutzerdefiniert()' Einzelne Variable und Datenfeld deklarierenDim S As PersonDim T(1 To 5) As Person

' Werte an Variable zuweisenS.Name = "Maier"S.PNummer = 17S.Telefax(1) = "0965-347767"S.Telefax(2) = "0975-227134"S.Gehalt = 2652.5

' Komponente Telefon dimensionierenReDim S.Telefon(1 To 3)S.Telefon(1) = "0965-347766"S.Telefon(2) = "0189-938439"S.Telefon(3) = "0975-227133"

' Variable an Datenfeld-Element übergebenT(5) = S

' Datenfeld-Element ausgeben' MsgBox T(5)MsgBox T(5).Name & " " & _

T(5).Telefon(3) & " " & T(5).Telefax(2)' Variable an Prozedur übergebenBDTypAusgabe 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 Erläuterung:

Type ... End Type � Benutzerdefinierte Datentypen werden zwischen Type und End Typedefiniert. Dies kann nur auf Modulebene durchgeführt werden, nichtinnerhalb von Prozeduren oder Funktionen.

Page 162: Einstieg Mit VBA in Excel

161

Benutzerdefinierter Datentyp 5.4

� Der Datentyp Person hat fünf Komponenten:

� eine Zeichenkette

� eine ganze Zahl

� ein Datenfeld variabler Größe mit Zeichenketten

� ein Datenfeld fester Größe mit zwei Zeichenketten

� und eine Zahl mit Nachkommastellen

Editor-Hilfe� Innerhalb der Prozedur Benutzerdefiniert() werden eine einzelneVariable und ein Datenfeld des neuen Datentyps definiert. Dabei bie-tet der Editor bereits Unterstützung: Nach der Eingabe des Aserscheint der Name des neuen Datentyps schon in der Liste der mög-lichen Typen.

Punkt nach Variable

� Den Komponenten der einzelnen Variablen werden Werte zugewie-sen. Nach Eingabe des Punkts hinter dem Variablennamen erscheinteine Liste der Komponenten als Hilfestellung.

� Die Komponente Telefon ist ein Datenfeld variabler Größe. DiesemDatenfeld muss eine Größe gegeben werden, bevor den Elementendieses Datenfelds Werte zugewiesen werden können.

Vollständige Zuweisung

� Eine Variable eines benutzerdefinierten Datentyps kann einer ande-ren Variablen (oder dem Element eines Datenfelds) des gleichenDatentyps zugewiesen werden. Dabei werden automatisch alle Werteder einzelnen Komponenten zugewiesen. Falls es sich bei einer Kom-ponente um ein Datenfeld variabler Größe handelt, so wird diesesunmittelbar entsprechend dimensioniert.

Einzeln ausgeben� Eine Variable eines benutzerdefinierten Datentyps kann nicht alsGanzes ausgegeben werden. Stattdessen müssen die gewünschtenKomponenten bzw. deren Elemente explizit angegeben werden.

Vollständig übergeben

� Eine Variable eines benutzerdefinierten Datentyps kann an eineProzedur (oder Funktion) übergeben werden. In der Parameter-liste dieser Prozedur muss eine Variable des entsprechendenDatentyps deklariert werden.

Komponente dimensionieren

� Falls eine Komponente ausgegeben wird, der noch kein Wert zuge-wiesen wurde, dann hat sie den Wert 0 oder "" (leere Zeichen-kette). Falls es sich bei der Komponente um ein Datenfeld variab-ler Größe handelt, so muss es zunächst dimensioniert werden,ansonsten tritt ein Fehler auf.

Page 163: Einstieg Mit VBA in Excel

162

Mehr über die Programmierung mit VBA5

Public, Private

5.5 Modular programmieren

Besser wartbar Prozeduren und Funktionen bieten die Möglichkeit zur modularen Pro-grammierung. Programme werden in kleinere Bestandteile zerlegt, dieübersichtlicher sind und einfacher gewartet werden können. Häufig vor-kommende Abläufe müssen nur einmal programmiert werden und kön-nen dann beliebig oft ausgeführt werden.

Zugriff auf andereModule

Im vorherigen Abschnitt wurden bereits Prozeduren und Funktionenaufgerufen, die sich im gleichen Modul befinden. Wie sieht es aus, wennsich die Prozeduren oder Funktionen in anderen Modulen, in Klassen-modulen oder in anderen Dateien befinden?

In den folgenden Beispielen werden aufgerufen:

� eine Prozedur, die als Parameter zwei ganze Zahlen erwartet, dieSumme berechnet und ausgibt sowie

� eine Funktion, die ebenfalls als Parameter zwei ganze Zahlen erwar-tet, die Summe berechnet und an die aufrufende Stelle zurückliefert.

5.5.1 Code in der gleichen Datei

Gleiche Datei Zunächst ein Beispiel für Prozeduren und Funktionen in der gleichenDatei. Der Code im Code-Modul Modul1:

Sub ModularGleicheDatei()' Anderes ModulSumme1 3, 5MsgBox "Summe2: " & Summe2(3, 5)

' KlassenmodulTabelle1.Summe3 3, 5MsgBox "Summe4: " & Tabelle1.Summe4(3, 5)

End Sub

Es folgt der Code im Code-Modul Modul2:

Hinweis

Ein benutzerdefinierter Datentyp hat ohne weitere Angaben einen projekt-weiten Gültigkeitsbereich (Public Type ...). Er ist also nicht nur in demModul bekannt, in dem er definiert wurde. Sie können die Gültigkeit durchdie Angabe von Private Type ... einschränken, so dass der Datentyp nurinnerhalb des Moduls bekannt ist, in dem er definiert wurde.

Page 164: Einstieg Mit VBA in Excel

163

Modular programmieren 5.5

Sub Summe1(a As Integer, b As Integer)MsgBox "Summe1: " & (a + b)

End SubFunction Summe2(a As Integer, b As Integer) As Integer

Summe2 = a + bEnd Function

Zuletzt der Code im Klassenmodul zum Objekt Tabelle1:

Sub Summe3(a As Integer, b As Integer)MsgBox "Summe3: " & (a + b)

End SubFunction Summe4(a As Integer, b As Integer) As Integer

Summe4 = a + bEnd Function

Zur Erläuterung:

Public� Prozeduren und Funktionen in Code-Modulen sind vom Typ Public,falls sie nicht explizit mit Private Sub bzw. Private Function defi-niert werden. Daher können die Prozedur Summe1() und die FunktionSumme2() aus Modul2 direkt aufgerufen werden.

Private� Prozeduren und Funktionen in Klassenmodulen sind vom Typ Pri-vate. Daher können die Prozedur Summe3() und die FunktionSumme4() aus dem Klassenmodul zu Objekt Tabelle1 nur aufgerufenwerden, wenn man sie inklusive des Namens des Klassenmoduls auf-ruft, also: <Klassenmodulname>.<Prozedurname>

5.5.2 Code in einer anderen Datei

Andere DateiEs folgt ein Beispiel für Prozeduren und Funktionen in einer anderenDatei. Diese muss in Excel geöffnet sein, damit der Code genutzt werdenkann. Zunächst der Code im Code-Modul Modul1 in dieser Datei:

Sub ModularAndereDatei()Workbooks.Open ThisWorkbook.Path & "\Mappe5Mod.xlsm"

' Aufruf in and. Datei, mit Modulangabe und ParameternApplication.Run "Mappe5Mod.xlsm!Modul1.Summe5", 3, 5MsgBox "Summe6: " & Application.Run _

("Mappe5Mod.xlsm!Modul1.Summe6", 3, 5)

Application.Run "Mappe5Mod.xlsm!Tabelle1.Summe7", 3, 5MsgBox "Summe8: " & Application.Run _

("Mappe5Mod.xlsm!Tabelle1.Summe8", 3, 5)End Sub

Page 165: Einstieg Mit VBA in Excel

164

Mehr über die Programmierung mit VBA5

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 SubFunction Summe6(a As Integer, b As Integer) As Integer

Summe6 = a + bEnd Function

Zuletzt der Code im Klassenmodul zum Objekt Tabelle1 der anderenDatei Mappe5Mod.xlsm:

Sub Summe7(a As Integer, b As Integer)MsgBox "Summe7: " & (a + b)

End SubFunction Summe8(a As Integer, b As Integer) As Integer

Summe8 = a + bEnd Function

Zur Erläuterung:

Datei geöffnet � Prozeduren und Funktionen in Code-Modulen anderer Dateien kön-nen nur aufgerufen werden, wenn die betreffende Datei in Excelgeöffnet ist. Daher wird sie zunächst geöffnet. Sollte sie bereits geöff-net sein, so ist dies kein Problem, falls nicht zwischenzeitlich der Codeder anderen Datei geändert wurde.

� Im vorliegenden Beispiel wird angenommen, dass die Datei im glei-chen Verzeichnis liegt. Daher wird das Verzeichnis dieser Datei ermit-telt und zum Vervollständigen des Namens der anderen Datei genutzt.

Application.Run() � Die Methode Run() des Application-Objekts wird benötigt, um Pro-zeduren und Funktionen in anderen Dateien aufzurufen. Als erstenParameter bekommt sie eine Zeichenkette, darin enthalten sind nach-einander:

� der Name der Datei

� ein Ausrufezeichen

� der Name des Moduls

� ein Punkt

� der Name der Prozedur bzw. Funktion

� Anschließend folgen die weiteren Parameter.

� Der Aufruf einer Prozedur sieht also wie folgt aus:

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

Page 166: Einstieg Mit VBA in Excel

165

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 derFunktion Summe8(), kann nichts zurückgeliefert werden.

5.6 Module exportieren und importieren

Falls Sie Prozeduren und Funktionen in einer anderen Arbeitsmappe ein-setzen möchten, haben Sie mehrere Möglichkeiten:

� Sie kopieren oder verschieben den Code im VBE

� in ein Modul der gewünschten Arbeitsmappe; dann steht er Ihneninnerhalb dieser Arbeitsmappe zur Verfügung;

Dateipersonal.xlsb

� in die persönliche Makroarbeitsmappe; dann steht er Ihnen jeder-zeit zur Verfügung.

Export, Import� Sie exportieren ein ganzes Modul. Anschließend importieren Sie es ineine andere Arbeitsmappe oder in die persönliche Makroarbeits-mappe. Dieser Vorgang wird nachfolgend erläutert.

5.6.1 Export eines Moduls

Datei exportierenSie wählen im Projekt-Explorer das gewünschte Modul aus, egal obCode-Modul oder UserForm-Modul (siehe Abschnitt 10.2, »Eigene Dia-logfelder und Anwendungen«). Anschließend wählen Sie im Menü Datei

den Menüpunkt 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.

Dateiendung bas, frm

Wählen Sie den Speicherort aus; als Dateiendung steht für Code-Module.bas und für UserForm-Module .frm zur Verfügung. Bei UserForm-Modulen wird automatisch im gleichen Verzeichnis noch eine Datei mitder Dateiendung .frx gespeichert.

Hinweis

In den Versionen vor Excel 2007 muss die Dateibezeichnung in den Proze-duren und Funktionen und in der Erläuterung wie folgt lauten: Mappe5Mod.xls.

Page 167: Einstieg Mit VBA in Excel

166

Mehr über die Programmierung mit VBA5

Abbildung 5.16 Datei mit VBA-Code exportieren

Modul löschen Falls Sie ein Modul löschen wollen, finden Sie im gleichen Menü den Menü-punkt Entfernen von. Zum Schutz vor einem unbeabsichtigten Löschenwerden Sie gefragt, ob Sie das Modul vorher exportieren wollen. Falls Siezustimmen, landen Sie ebenso in dem Dialogfeld Datei exportieren.

5.6.2 Import eines Moduls

Datei importieren Sie wählen im Projekt-Explorer die gewünschte Arbeitsmappe aus.Anschließend wählen Sie im Menü Datei den Menüpunkt Datei impor-

tieren. Es erscheint das Dialogfeld Datei importieren. Sie erreichen dasDialogfeld auch über das Kontextmenü: rechte Maustaste im Projekt-Explorer auf der Arbeitsmappe, in die importiert werden soll.

Abbildung 5.17 Datei mit VBA-Code importieren

Wählen Sie das Verzeichnis und das zu importierende Modul aus. Code-Module erkennen Sie an der Dateiendung .bas, UserForm-Module an derDateiendung .frm.

Page 168: Einstieg Mit VBA in Excel

167

In diesem Kapitel erfahren Sie mehr über den Umgang mit Objekten. Das Verständnis von Objekten hilft Ihnen beim Erstellen effektiverer Programme.

6 Mehr über Objekte

Die Grundlagen von Objekten haben Sie bereits in Kapitel 2 kennenge-lernt. Im Folgenden erhalten Sie weiterführende Informationen zu die-sem Thema.

6.1 Objektkatalog

Taste F2Im VBE können Sie mit der Taste (F2) den Objektkatalog einblenden.Dort sind alle Klassen, deren Eigenschaften und Methoden zu finden.Wählen Sie eine der Klassen durch Doppelklick aus (hier am BeispielWorksheets), dann erscheint rechts eine Liste der Eigenschaften, Metho-den und Ereignisse dieser Klasse.

Abbildung 6.1 Objektkatalog

Page 169: Einstieg Mit VBA in Excel

168

Mehr über Objekte6

Objektmodell-referenz

Eine weitere Hilfestellung wird über das Menü ? im VBE, MenüpunktMicrosoft Visual Basic for Applications-Hilfe angeboten. Imanschließend erscheinenden Inhaltsverzeichnis steht als erster PunktExcel 2010-Entwicklerreferenz, darin der Punkt Excel-Objektmodell-

referenz.

Abbildung 6.2 Excel-Objektmodellreferenz

6.2 Referenzierung von Objekten

Der Zugriff auf einzelne Objekte sollte möglichst direkt, ohne viele Zwi-schenschritte erfolgen. In vielen VBA-Anwendungen wird jedoch leiderwie folgt auf Objekte zugegriffen:

� Eine Arbeitsmappe wird aktiviert.

� Ein Tabellenblatt wird aktiviert.

� Ein Bereich wird selektiert.

� Eigenschaften des selektierten Bereichs werden verändert bzw. eswerden Methoden auf den selektierten Bereich angewandt.

Nicht zuempfehlen

Diese Vorgehensweise des Aktivierens und Selektierens ist zwar einfachzu verstehen, aber langsamer und fehlerträchtiger. Nachfolgend einBeispiel:

Sub AktivierenUndSelektieren()ThisWorkbook.ActivateWorksheets("Tabelle1").ActivateRange("A7:A9").SelectSelection.Interior.Color = vbYellow

End Sub

Page 170: Einstieg Mit VBA in Excel

169

Referenzierung von Objekten 6.2

ReferenzierungDurch die Referenzierung erstellen Sie Anwendungen, die schnellerablaufen und besser zu warten sind:

Sub Referenzieren()ThisWorkbook.Worksheets("Tabelle1"). _

Range("A10:A12").Interior.Color = vbYellowEnd Sub

Schneller, direkterDer VBA-Code wirkt zunächst etwas unübersichtlicher. Man geht abereinfach nach der Objekthierarchie vor: Arbeitsmappe, Tabellenblatt, Zell-bereich, Eigenschaft. Es ergeben sich meist längere Anweisungen, diesekönnen aber auf mehrere Zeilen verteilt werden, wie im obigen Beispielgeschehen.

6.2.1 Beispiel »Zellen verschieben«

Im allerersten Makro dieses Buchs wurde mit einem aufgezeichnetenMakro der Inhalt einer Zelle in eine andere Zelle verschoben:

Sub Makro1()Range("A1").SelectSelection.CutRange("C1").SelectActiveSheet.Paste

End Sub

Nachteile dieser Vorgehensweise:

� Es sind mehrere Schritte erforderlich, bei denen sich Fehler einschlei-chen können.

� Es ist nicht klar, in welcher Arbeitsmappe und auf welchem Tabellen-blatt die Verschiebung stattfindet.

� Die Anwendung ist langsamer.

Eindeutige LösungMit Referenzierung lösen Sie ein solches Problem eindeutig und schneller:

Sub Verschieben()ThisWorkbook.Worksheets("Tabelle1"). _

Range("A7:A9").Cut Destination:=ThisWorkbook. _Worksheets("Tabelle1").Range("B7")

End Sub

Page 171: Einstieg Mit VBA in Excel

170

Mehr über Objekte6

6.3 Objektzugriff mit With

With ... End With Mit Hilfe von With führen Sie eine Reihe von Anweisungen für ein ein-zelnes Objekt durch. Dabei wird der einmal erstellte Bezug zum Objektmehrfach verwendet. Bei einem längeren Objektnamen ist dies über-sichtlicher. 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 = xlThickEnd With

End Sub

Das Ergebnis:

Abbildung 6.3 Objektzugriff mit With

Zur Erläuterung:

� Die Eigenschaften der Zelle A1 werden mit Hilfe von With geändert.

Im With-Block:Punkt

� Inhalt, Zahlenformat, Schriftgröße und Rahmendicke werden gesetzt.Dabei muss zu Beginn der Anweisung jeweils nur ein Punkt angege-ben werden. Da der Programmablauf sich innerhalb des With-Blocksbefindet, ist auch mit dieser Kurzschreibweise klar, auf welchesObjekt sich die Änderungen beziehen.

Page 172: Einstieg Mit VBA in Excel

171

Arbeiten mit Objektvariablen 6.4

Geschachteltes With

SchachtelnMit With können auch geschachtelte Strukturen erzeugt werden. ZurVerdeutlichung wurde das Beispiel mit den fünf Sortierschlüsseln (erstab Excel 2007) aus Abschnitt 2.4.19 umgeschrieben.

Sub WithGeschachtelt()ThisWorkbook.Worksheets("Tabelle4").Activate

With ActiveSheet.SortWith .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 WithEnd Sub

Zur Erläuterung:

SortFields� Innerhalb des äußeren With wird mit dem Objekt Sort des aktivenTabellenblatts gearbeitet. Dies betrifft die Auflistung SortFields unddie Methoden SetRange() und Apply().

� Innerhalb des inneren With wird mit der Auflistung SortFields desObjekts Sort des aktiven Tabellenblatts gearbeitet. Dies betrifft dieMethoden Clear() und Add().

6.4 Arbeiten mit Objektvariablen

Verweis auf Objekt

Sie haben bereits Variablen der verschiedenen elementaren Datentypen,wie Integer, Double usw., kennengelernt. Die sogenannten Objektvari-ablen speichern keine Zahlen oder Texte, sondern Verweise auf Objekte.Bei einem längeren Objektnamen ist diese Vorgehensweise nützlich.

Nachfolgend ein Beispiel:

Sub ObjektVariable()Dim Rg As Range

Page 173: Einstieg Mit VBA in Excel

172

Mehr über Objekte6

Set Rg = ThisWorkbook.Worksheets("Tabelle1"). _Range("B1:B3")

Rg.Value = 18.2Rg.NumberFormatLocal = "0,000"Rg.Font.Size = 24

Einrahmen RgEnd Sub

Sub Einrahmen(x As Range)x.Borders.Weight = xlThick

End Sub

Das Ergebnis:

Abbildung 6.4 Arbeiten mit Objektvariablen

Zur Erläuterung:

Dim ... AsObjekttyp

� Die Variable rg wird mit Hilfe von As als Verweis auf ein Objekt desTyps Range deklariert.

� Man hätte sie auch als Verweis auf ein Objekt des allgemeinen TypsObject deklarieren können (Dim rg As Object). Der Verweis auf einObjekt des passenden Typs ist allerdings eindeutiger und schneller.

Set ... = ... � Eine Objektvariable bekommt ihren Wert mit Hilfe von Set. In die-sem Falle wird der Variablen rg ein Zellbereich zugewiesen. Damit istes möglich, mit rg auf diesen Zellbereich zuzugreifen.

� Inhalt, Zahlenformat und Schriftgröße werden gesetzt.

Übergabe � Eine Objektvariable kann auch als Parameter an eine Prozedur (oderFunktion) übergeben werden. In diesem Falle wird in der aufgerufe-nen Prozedur noch die Rahmendicke gesetzt. Der Parameter x ist wie-derum vom Typ Range.

Page 174: Einstieg Mit VBA in Excel

173

Arbeiten mit Objektvariablen 6.4

6.4.1 Objektvariablen hierarchisch zuweisen

Stufenweise zuweisen

Sie können Objektvariablen auch stufenweise (über die Objekthierarchie)ihren Wert zuweisen. Dies macht den Code übersichtlicher, falls aufmehrere Objekte in unterschiedlichen Ebenen der Hierarchie zugegriffenwird. Ein Beispiel:

Sub ObjektVariableHierarchisch()Dim WS As WorksheetDim 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.7Rg2.Value = 3.4

End Sub

Das Ergebnis:

Abbildung 6.5 Objektvariablen hierarchisch zuweisen

Einige wichtige Hinweise

Nothing� Sie können die Verbindung zwischen einem Objekt und einer Objekt-

variablen wie folgt wieder aufheben: Set <Objektvariable> = Nothing

Liste nach Punkt� Nach erfolgter Zuweisung für rg erleichtert die Entwicklungsumgebung

dem Entwickler die Arbeit: Sobald er den Punkt hinter rg eingibt,erscheint eine Liste der Eigenschaften und Methoden des betreffendenObjekts. Dies ist nach der Eingabe des Punkts hinter Range("B1:B3")nicht der Fall.

Taste F1� Mit der Taste (F1) wird automatisch die Hilfe für die Eigenschaft oder

Methode des passenden Objekttyps aufgerufen.

Page 175: Einstieg Mit VBA in Excel

174

Mehr über Objekte6

Zur Erläuterung:

Stufe 1 � Zunächst wird WS als Verweis auf das Tabellenblatt Tabelle1 genutzt.

Stufe 2 � Anschließend werden Rg1 und Rg2 als Verweise auf verschiedeneBereiche dieses Tabellenblatts eingesetzt.

6.4.2 Neue Objekte erzeugen

Dim ... As New ... Viele Objekte in VBA-Anwendungen sind Objekte, die man sehen kann(Range, Worksheet usw.). Es gibt aber auch unsichtbare Hilfsobjekte. Dieskann z. B. eine Verbindung zu einer Datenbank (siehe Abschnitt 9.5.2,»Beispiel-Datenbank: Verbindung herstellen«) oder eine Auflistung (Col-lection, siehe Abschnitt 6.6, »Collections«) sein. Solche Objekte werdenmit Hilfe des Schlüsselworts New neu erzeugt. Gleichzeitig oder anschlie-ßend wird ein Verweis auf das Objekt eingerichtet. Ein Beispiel mitbeiden Varianten:

Sub NeuesObjekt()Dim C1 As New CollectionDim C2 As CollectionSet C2 = New Collection

End Sub

Zur Erläuterung:

� Mit Dim C1 As New Collection wird eine neue, leere Auflistungerstellt. C1 wird gleichzeitig als Verweis auf diese Auflistung einge-richtet.

� Im Gegensatz dazu wird C2 durch Dim C2 As Collection als Verweisauf eine noch nicht existierende Auflistung erzeugt. Erst anschließendwird mit Set C2 = New Collection eine neue, leere Auflistung erzeugtund C2 als Verweis auf diese neue Auflistung eingerichtet.

6.4.3 Objekttyp ermitteln

TypeName() Es ist von Vorteil, eine Objektvariable mit dem passenden Typ zu dekla-rieren. Bei vielen Objekten ist der Typ allerdings nicht offensichtlicherkennbar. Hier erweist sich die Funktion TypeName() als nützlich. Siewurde bereits verwendet, um den Datentyp einer Variablen zu bestim-men.

Page 176: Einstieg Mit VBA in Excel

175

Arbeiten mit Objektvariablen 6.4

Sie ist aber auch in der Lage, Datenfelder und Objekttypen zu erkennen.Falls der geprüfte Begriff den Datentyp Variant hat, wird Empty zurück-geliefert.

Nachfolgend ein Beispiel mit einer Reihe von Variablen und Objekten:

Sub ObjektTyp()Dim i As IntegerDim a(1 To 5) As DoubleDim bDim c As Variant

Dim Ws1 As WorksheetSet 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 Erläuterung:

� Der Typ der einzelnen Variablen i und des Datenfelds a wird erkannt.

Variant: Empty� Eine Variable, für die kein Datentyp angegeben wird, hat den Daten-typ Variant, so als ob der Datentyp Variant explizit angegeben wird.Die Funktion TypeName() liefert in diesem Falle Empty zurück.

� Name ist eine Eigenschaft mit dem Datentyp String, also eine Zeichen-kette.

� Borders und Font sind Unterobjekte des Objekttyps Borders bzw.Font.

Page 177: Einstieg Mit VBA in Excel

176

Mehr über Objekte6

Abbildung 6.6 Ergebnis der Funktion TypeName()

6.5 For-Each-Schleife

Auflistung Die Schleife For Each ... In ... Next wird bei Auflistungen oder Daten-feldern eingesetzt. In der Objekthierarchie von Excel gibt es zahlreicheAuflistungen, z. B. Workbooks und Worksheets. Nachfolgend ein Beispielmit der Auflistung Workbooks, also der Liste aller geöffneten Excel-Dateien:

Sub ForEachWorkbook()Dim WB As WorkbookDim Ausgabe As StringAusgabe = "Workbooks: "

For Each WB In WorkbooksAusgabe = Ausgabe & WB.Name & " "

Next WB

MsgBox AusgabeEnd Sub

Das Ergebnis:

Abbildung 6.7 Liste der geöffneten Workbooks

Page 178: Einstieg Mit VBA in Excel

177

For-Each-Schleife 6.5

Zur Erläuterung:

Dim ...As Objekttyp

� Zunächst wird die Variable WB als Verweis auf ein Objekt vom TypWorkbook deklariert.

For Each ... In ...� Die Zeile For Each WB In Workbooks leitet die Schleife ein. Jedes Ele-ment der Auflistung Workbooks wird nun durchlaufen. Innerhalb derFor-Each-Schleife wird das jeweils aktuelle Element automatisch mitWB bezeichnet. Die Elemente müssen nicht einzeln mit Set WB = zuge-wiesen werden.

� In diesem Fall wird nur der Name des jeweils aktuellen Elementseiner Ausgabeliste hinzugefügt.

Next ...� Nach dem Next wird zur deutlicheren Darstellung WB geschrieben,dies könnte auch weggelassen werden.

Ein weiteres Beispiel mit der Auflistung Worksheets, also der Liste allerTabellenblätter:

Sub ForEachWorksheet()Dim WS As WorksheetDim Ausgabe As StringAusgabe = "Worksheets: "

For Each WS In ThisWorkbook.WorksheetsAusgabe = Ausgabe & WS.Name & " "

Next WS

MsgBox AusgabeEnd Sub

Das Ergebnis:

Abbildung 6.8 Liste der Worksheets

Zur Erläuterung:

� Die Variable WS wird als Verweis auf ein Objekt vom Typ Worksheetdeklariert.

Page 179: Einstieg Mit VBA in Excel

178

Mehr über Objekte6

� Die Auflistung Worksheets dieser Arbeitsmappe wird durchlaufen.Innerhalb der Schleife wird das jeweils aktuelle Element mit WSbezeichnet.

6.6 Collections

Verbund Wir haben bereits einige Auflistungen (Worksheets, Workbooks) kennen-gelernt. Die Elemente dieser Auflistungen waren festgelegt. Es gibt aberauch die Möglichkeit, eigene Auflistungen zu erschaffen. Damit könnenSie Elemente gleichen Typs oder unterschiedlichen Typs, die eine thema-tische Verwandtschaft haben, zu einem Verbund zusammenfügen.

Dazu wird der Objekttyp Collection verwendet. Collection-Objektehaben folgende Eigenschaften und Methoden:

Add() � Methode Add(): Hinzufügen eines Elements

� Eigenschaft Count: Anzahl der Elemente

� Methode Remove(): Löschen eines Elements

For Each Die Elemente einer Collection können mit Hilfe einer For-Each-Schleifeoder über einen Index erreicht werden. Im folgenden Beispiel werdeneine Zeichenkette, eine Zahl und ein Range-Objekt zu einer Collectionzusammengestellt:

Sub Collections()Dim C As New CollectionDim CItem As VariantDim Rg As Range

' Elemente hinzufügenC.Add "Peter"C.Add 43Set Rg = ThisWorkbook.Worksheets("Tabelle3"). _

Range("A1:A2")C.Add Rg

' Anzahl der ElementeMsgBox C.Count

' Alle Elemente durchlaufenFor Each CItem In C

MsgBox TypeName(CItem)Next CItem

Page 180: Einstieg Mit VBA in Excel

179

Hauptobjekt »Application« 6.7

' Elemente entfernenC.Remove (2)

' Elemente über Index erreichenMsgBox C(1)MsgBox C(2).Address

End Sub

Zur Erläuterung:

New Collection� Mit Dim C As New Collection wird ein neues Collection-Objekterzeugt und ein Verweis auf das Objekt eingerichtet.

Variant� Die einzelnen Elemente einer Collection können einen beliebigenTyp haben. Falls Sie die Elemente mit Hilfe einer For-Each-Schleifedurchlaufen möchten, wird also eine Variable vom Datentyp Variantbenötigt.

Add()� Mit der Methode Add() werden nacheinander eine Zeichenkette (Ele-ment 1), eine Zahl (Element 2) und ein Range-Objekt (Element 3) derCollection hinzugefügt.

Count� Die Eigenschaft Count liefert für die Anzahl der Elemente den Wert 3.

� Mit Hilfe der For-Each-Schleife und der Funktion TypeName() werdendie Typen aller Elemente ausgegeben.

Remove()� Das zweite Element (die Zahl) wird mit der Methode Remove() ent-fernt.

� Die beiden verbliebenen Elemente werden über den Index erreicht.Da es sich bei Element 2 um ein Range-Objekt handelt, können Siez. B. die Adresse ausgeben.

6.7 Hauptobjekt »Application«

Anwendung ExcelDas Objekt Application ist das Hauptobjekt. Es steht am oberen Endeder Objekthierarchie für die Anwendung Excel selbst. Einige Eigenschaf-ten und Methoden werden nachfolgend erläutert.

6.7.1 Anwendungspfad ausgeben

PfadMit folgender Prozedur wird der Pfad ausgegeben, in dem Excel instal-liert ist:

Page 181: Einstieg Mit VBA in Excel

180

Mehr über Objekte6

Sub AnwendungsPfad()MsgBox Application.Path

End Sub

Zur Erläuterung:

Path � Es wird der Wert der Eigenschaft Path des Application-Objektsermittelt und ausgegeben.

� Dabei handelt es sich um das Verzeichnis auf dem PC, in dem dieAnwendung Excel installiert wurde.

� Die Ausgabe bei einer Standardinstallation:

Abbildung 6.9 Application.Path

6.7.2 Prozedur zeitverzögert aufrufen

Startzeitverzögert Mit folgender Prozedur wird der Aufruf einer anderen Prozedur in derZukunft gestartet:

Sub AufrufInZukunft()Application.OnTime Now + TimeValue("00:00:05"), _

"AnwendungsPfad"End Sub

Zur Erläuterung:

OnTime() � Es wird die Methode OnTime() des Application-Objekts aufgerufen.

� Sie dient dazu, Prozeduren in der Zukunft auszuführen. Sie wird miteiner Zeitangabe und einem Prozedurnamen in Anführungsstrichenaufgerufen.

� Die Zeitangabe kann entweder absolut sein (z. B. Aufruf um 17:35:30Uhr) oder relativ (z. B. Aufruf in 5 Sekunden, wie oben).

Now(),TimeValue()

� Falls die Zeitangabe relativ ist, muss zunächst die aktuelle Uhrzeitermittelt werden, mit der vorgefertigten Funktion Now(). Zu dieserUhrzeit wird eine Zeitangabe hinzugerechnet. Diese wird von der vor-gefertigten Funktion TimeValue() geliefert.

Page 182: Einstieg Mit VBA in Excel

181

Filtern 6.8

6.7.3 Anwendung Microsoft Excel schließen

Mit folgender Prozedur wird die gesamte Anwendung Excel geschlossen:

Sub AnwendungSchliessen()Application.Quit

End Sub

Zur Erläuterung:

Quit()� Es wird die Methode Quit() des Objekts Application aufgerufen.

� Sie schließt Excel einschließlich aller geöffneten Arbeitsmappen, denVBE und die Excel-Hilfe.

Sicherheits-rückfrage

� Falls eine Arbeitsmappe geändert wurde, wird der Benutzer gefragt,ob er sie speichern möchte.

Abbildung 6.10 Application.Quit(), Frage zu Speicherung

6.8 Filtern

AutoFilter()Größere Datenmengen können Sie in Excel mithilfe von Filtern untersu-chen. Dabei legen Sie fest, welcher Teil der Daten angezeigt werden soll.Dies lässt sich in VBA mithilfe der Methode AutoFilter() auch automa-tisieren.

Als anschauliche Basis für den Einsatz von Filtern wird die Tabelle derArtikel aus der Datenbank Nordwind.mdb verwendet. Die Datenbankwird zusammen mit Microsoft Access ausgeliefert, siehe auch Kapitel 11,»Beispielprojekt«. Die Tabelle umfasst insgesamt 78 Datensätze mitjeweils sechs Spalten.

Zusätzliche SpalteZur Verdeutlichung eines Datumsfilters wird noch eine siebte Spalte mitDatumsangaben hinzugefügt. Die zufälligen Werte für diese Spalte wer-den mit der nachfolgenden Prozedur erzeugt.

Sub SpalteDatum()Dim i As IntegerRandomizeThisWorkbook.Worksheets("Tabelle5").Activate

Page 183: Einstieg Mit VBA in Excel

182

Mehr über Objekte6

For i = 2 To 78Cells(i, 7).Value = Int(Rnd() * 30) + 40200

Next iRange("G2:G78").NumberFormatLocal = "TT.MM.JJJJ"

End Sub

Zur Erläuterung:

� Die Funktion Rnd() liefert bekanntlich quasizufällige Werte zwischen0 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 vom22.01.2010 bis zum 20.02.2010.

Zahlenfilter Es folgen einige kurze Prozeduren, in denen die Methode AutoFilter()angewandt wird. Zunächst ein einfacher Zahlenfilter:

Sub ZahlenfilterGleich()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter 6, "0"

End Sub

Der Aufruf der Methode AutoFilter() ohne Parameter löscht den bishergeltenden Filter. Anschließend werden die Daten vollständig und unge-filtert dargestellt.

Der Aufruf der Methode AutoFilter() mit den Parametern 6 und »0«führt dazu, dass die Spalte 6 (Lagerbestand) gefiltert wird. Es werden nurnoch die Datensätze angezeigt, deren Wert in dieser Spalte gleich 0 ist.Der erste Parameter entspricht also der Spalte, die gefiltert wird, derzweite Parameter dem Filterkriterium.

Filter mitVergleich

Es folgt ein Filter mit einem Vergleichsoperator:

Sub ZahlenfilterVergleich()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter 5, ">20"

End Sub

Nun werden nur noch die Datensätze angezeigt, deren Wert in der Spalte5 (Einzelpreis) größer als 20 ist. Es gibt die Vergleichsoperatoren <, >, <=,>= und <>. Der Operator = entspricht in seiner Wirkung dem vorherigenBeispiel.

Page 184: Einstieg Mit VBA in Excel

183

Filtern 6.8

Filter verknüpftEs folgt ein Filter mit zwei Bedingungen (bezüglich einer Spalte), die mit-einander verknüpft sind:

Sub ZahlenfilterZwischen()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter 6, ">20", xlAnd, "<40"

End Sub

Nun werden nur noch die Datensätze angezeigt, deren Wert in der Spalte6 (Lagerbestand) größer als 20 und kleiner als 40 ist. Die integrierte Kon-stante xlAnd stellt die Verknüpfung her.

Filter über zwei Spalten

Es können auch zwei Bedingungen in unterschiedlichen Spalten mitein-ander verknüpft werden:

Sub DoppelFilter()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter 5, ">20"ActiveSheet.UsedRange.AutoFilter 6, ">40"

End Sub

Nun werden nur noch die Datensätze angezeigt, deren Wert in der Spalte5 (Einzelpreis) größer als 20 ist und deren Wert in der Spalte 6 (Lagerbe-stand) größer als 40 ist. Beide Filter werden nacheinander angewandt,wodurch sich die Filterung verstärkt.

TextfilterMithilfe von Textfiltern können Spalten mit textlichen Inhalten gefiltertwerden. Zunächst ein einfaches Beispiel:

Sub TextfilterGleich()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter 3, "Getränke"

End Sub

Nun werden nur noch die Datensätze aus der Kategorie »Getränke« ange-zeigt.

Mehrere Kategorien

Falls Sie die Artikel mehrerer Kategorien sehen möchten, geht das fol-gendermaßen:

Sub TextfilterMehrereGleich()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter 3, _

Page 185: Einstieg Mit VBA in Excel

184

Mehr über Objekte6

"Getränke", xlOr, "Gewürze"End Sub

Die integrierte Konstante xlOr sorgt dafür, dass das eine oder das andereKriterium zutreffen muss.

Mit Platzhalter Bei Textfiltern können Sie auch mit Platzhaltern arbeiten:

Sub TextfilterBeginntMit()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter 2, "M*"

End Sub

Nun werden nur noch die Datensätze 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 TextfilterEnthält()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter 2, "*ed*"

End Sub

Nun werden nur noch die Datensätze angezeigt, deren Wert in Spalte 2(Artikelname) an irgendeiner Stelle die Zeichenfolge ed enthält.

Datumsfilter Als Letztes wird der Datumsfilter gezeigt. Dabei sollte die amerikanischeSchreibweise für Daten verwendet werden (JJJJ/M/T):

Sub Datumsfilter()ThisWorkbook.Worksheets("Tabelle5").ActivateActiveSheet.UsedRange.AutoFilterActiveSheet.UsedRange.AutoFilter _

7, ">=2010/1/22", xlAnd, "<=2010/1/28"End Sub

Es werden nur noch die Datensätze angezeigt, deren Wert in der Spalte7 (letzter Einkauf) zwischen dem 22.01.2010 und dem 28.01.2010 liegt,einschließlich des Anfangs- und Enddatums.

Page 186: Einstieg Mit VBA in Excel

185

Die Automatisierung des Aufbaus von Diagrammen und Shapes hilft Ihnen beim Aufbau professioneller Anwendungen.

7 Diagramme und Grafiken

In diesem Kapitel lernen Sie diverse Möglichkeiten zur Programmierungverschiedener Arten von Grafiken kennen:

� Diagramme

� Shapes

� WordArt (seit Excel 2007)

� bedingte Formatierungen (seit Excel 2007)

� Sparklines (seit Excel 2010)

� SmartArt (seit Excel 2007)

Diagramme können in Excel per Knopfdruck schnell erzeugt werden. Indiesem Kapitel lernen Sie, wie Sie Diagramme per VBA-Programmcodeerstellen und verändern. Damit haben Sie die Möglichkeit, zusammenmit Ihren Programmierfähigkeiten, spezielle Diagramme zu erstellen.

AutomatisierungDabei kann es sich beispielsweise um ein Diagramm mit besondererDatenauswahl oder spezieller Diagrammform handeln, das automatischaus einer Textdatei, abhängig von aktuellen Bedingungen erstellt wird.

Zeichnungs-objekte

In Abschnitt 7.5 werden einige Möglichkeiten von Shapes erläutert.Shapes sind Zeichnungsobjekte, z. B. die Autoformen. Sie teilen zahlrei-che Eigenschaften mit Diagrammen.

Bedingte Formatierung

Zellen können, in Abhängigkeit von Bedingungen, mithilfe von Daten-balken, Farbskalen und Symbolsätzen unterschiedlich formatiert wer-den. Mehr zu diesen bedingten Formatierungen lesen Sie in Abschnitt 7.7.In Excel 2010 wurden die Möglichkeiten der bedingten Formatierungenerweitert.

SparklinesIn Abschnitt 7.8 wird die Erzeugung von Sparklines beschrieben. Diessind kleine Diagramme, die als Zellhintergrund eingebettet werden. Sie

Page 187: Einstieg Mit VBA in Excel

186

Diagramme und Grafiken7

sollen kurz und prägnant Zahlenverläufe verdeutlichen. Sparklines wur-den mit Excel 2010 eingeführt.

SmartArts Mithilfe von SmartArts können seit Excel 2007 Beziehungen, Prozessab-läufe oder Hierarchien schnell und übersichtlich dargestellt werden.SmartArts sind besondere Gruppen von Shapes. Sie können mithilfe vonVBA allerdings nicht verändert werden. Ihre Eigenschaften können nurausgelesen werden, siehe Abschnitt 7.9.

7.1 Diagramm erstellen

Beispieltabelle Bekanntlich können Diagramme sowohl auf eigenen Blättern in einerArbeitsmappe als auch eingebettet in einem Tabellenblatt erstellt wer-den. Beide Methoden werden in diesem Abschnitt vorgestellt. Ausgangs-punkt soll in beiden Fällen eine Tabelle mit Temperaturwerten sein:

Abbildung 7.1 Beispieldaten für Diagramme

7.1.1 Diagrammblatt erstellen

Hierarchie Diagramme auf eigenen Blättern (Diagrammblätter) stehen in derObjekthierarchie auf der gleichen Ebene wie Tabellenblätter. Es gibt ver-schiedene Auflistungen innerhalb einer Arbeitsmappe:

Sheets � Sheets enthält alle Tabellenblätter und Diagrammblätter.

� Worksheets enthält nur die Tabellenblätter (wie bekannt).

Charts � Charts enthält nur die Diagrammblätter.

Mit der folgenden Prozedur wird ein einfaches Liniendiagramm als Dia-grammblatt in der Arbeitsmappe erstellt:

Sub DiagrammNeuesBlattErstellen()ThisWorkbook.Charts.Add After:=Worksheets("Tabelle1")With ActiveChart

Page 188: Einstieg Mit VBA in Excel

187

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 Erläuterung:

Add()� Die Methode Add() des Objekts Charts erstellt ein Diagrammblattund fügt es der Charts-Auflistung der aktiven Arbeitsmappe hinzu.Ähnlich wie beim Kopieren oder Verschieben von Tabellenblätternkönnen Sie mit Hilfe von Before und After den Ort des neuen Blattsfestlegen. Ohne Angabe wird das neue Blatt vor dem aktuell aktivenBlatt eingefügt.

ActiveChart� Das neue Diagrammblatt ist vom Typ Chart. Es wird zum aktiven Dia-grammblatt. Daher kann es mit ActiveChart angesprochen werden.

ChartType� Die Eigenschaft ChartType legt den Typ des Diagramms fest, hierxlLine für ein Liniendiagramm. Einige wichtige Diagrammtypen wer-den weiter unten aufgelistet.

SetSourceData()� Die Methode SetSourceData() legt die Datenquelle für das Dia-gramm fest. In diesem Falle ist das der Bereich A1 bis C8 des Tabel-lenblatts Tabelle1 (mit den Temperaturdaten).

Eigenschaft »Name«

� Mit Hilfe der Eigenschaft Name können Sie dem Diagramm einenNamen geben.

Page 189: Einstieg Mit VBA in Excel

188

Diagramme und Grafiken7

Diagrammtypen Tabelle 7.1 stellt einige Diagrammtypen dar.

7.1.2 Eingebettetes Diagramm erstellen

ChartObjects Eingebettete Diagramme stehen in der Objekthierarchie unterhalb derTabellenblätter. Die Auflistung Worksheets enthält die UnterauflistungChartObjects, also alle Diagrammrahmen des Tabellenblatts. Ein Chart-Object ist Element dieser Auflistung ChartObjects, also ein einzelner Dia-grammrahmen. Ein einzelnes Diagramm ist ein Objekt vom Typ Chart undstellt den Wert der Eigenschaft Chart eines Diagrammrahmens dar. Bis aufdiese Einordnung gleichen sich beide Diagrammformen.

Mit der folgenden Prozedur wird ein einfaches Liniendiagramm in dasTabellenblatt Tabelle1 eingebettet:

Sub DiagrammEingebettetErstellen()Dim CO As ChartObjectDim CH As Chart

Set CO = ThisWorkbook.Worksheets("Tabelle1"). _ChartObjects.Add(200, 10, 300, 150)

Set CH = CO.ChartCH.ChartType = xlLineCH.SetSourceData Worksheets("Tabelle1"). _

Range("A1:C8")End Sub

Hinweis

Die Methode SetSourceData() hat noch einen zweiten, optionalen Parame-ter. Damit legen Sie fest, ob das Diagramm die Tabelle nach Spalten (xlCo-lumns) oder (xlRows) darstellt. Der erste Wert ist der Standard.

Diagrammtyp Eigenschaft »ChartType«

gruppiertes Säulendiagramm xlColumnClustered

gruppiertes Balkendiagramm xlBarClustered

Liniendiagramm xlLine

Kreisdiagramm xlPie

Tabelle 7.1 Diagrammtypen

Page 190: Einstieg Mit VBA in Excel

189

Diagramm erstellen 7.1

Das Ergebnis:

Abbildung 7.3 Eingebettetes Diagramm

Zur Erläuterung:

ChartObject� Zunächst wird eine Variable vom Typ ChartObject deklariert. Sie ver-weist später auf den neu erstellten Diagrammrahmen.

Chart-Variable� Anschließend wird eine Variable vom Typ Chart deklariert. Sie ver-weist später auf das Diagramm des neu erstellten Diagrammrahmens.

Add()� Die Auflistung ChartObjects enthält alle Rahmen der eingebettetenDiagramme auf einem Tabellenblatt. Die Methode Add() erstellteinen neuen Diagrammrahmen an einem bestimmten Ort in einerbestimmten Größe. Sie liefert einen Verweis auf das neu erstellteObjekt zurück. Die vier Parameter von Add() stehen für:

� Abstand des Rahmens zum linken Rand des Tabellenblatts

� Abstand des Rahmens zum oberen Rand des Tabellenblatts

� Breite des Rahmens

� Höhe des Rahmens

Eigenschaft »Chart«

� Die Eigenschaft Chart des ChartObjects stellt das eigentliche Dia-gramm innerhalb des Rahmens dar.

ChartType� Die Eigenschaft ChartType ist bereits bekannt; sie legt den Typ desDiagramms fest.

SetSourceData()� Die Methode SetSourceData() ist ebenfalls bereits bekannt. Sie legtdie Datenquelle für das Diagramm fest. In diesem Falle ist das derBereich A1 bis C8 des aktiven Tabellenblatts.

Page 191: Einstieg Mit VBA in Excel

190

Diagramme und Grafiken7

7.2 Diagramm ändern

Elemente ändern Diagramme haben viele Elemente mit zahlreichen Eigenschaften, dienatürlich auch im Nachhinein geändert werden können. Die Elementestehen in der Objekthierarchie unterhalb der Diagramme. Sie unterschei-den sich je nach Diagrammtyp. Am Beispiel des soeben erstellten Linien-diagramms sollen stellvertretend einige wichtige Eigenschaften (undMethoden) erläutert werden.

Seit Excel 2010 können Sie nicht nur die Erstellung eines Diagramms,sondern auch die Änderungen an einem Diagramm mithilfe einesMakros aufzeichnen. Dies kann eine Hilfe zur Nutzung der Objekthierar-chie sein, deren Vielfalt hier nicht komplett beschrieben werden kann.

7.2.1 Diagrammblatt ändern

Zunächst das Programm:

Sub DiagrammNeuesBlattAendern()Dim CH As ChartSet CH = ThisWorkbook.Charts(1)DiagrammAendern CH

End Sub

Das Programm ist zweigeteilt. Zunächst der Programmteil, der nur fürDiagrammblätter zutrifft:

Chart-Variable � Es wird eine Variable vom Typ Chart deklariert. Diese bekommt daserste Diagrammblatt dieser Arbeitsmappe zugewiesen.

Charts(Index) � Es wird die Prozedur DiagrammAendern() aufgerufen, als Parameterwird das erste Diagrammblatt Charts(1) übergeben.

Es folgt der Programmteil, der sowohl für Diagrammblätter als auch füreingebettete Diagramme zutrifft:

Sub DiagrammAendern(CH As Chart)' DiagrammflächeCH.ChartArea.Interior.Color = vbCyan

' ZeichnungsflächeCH.PlotArea.Interior.Color = vbYellow

' TitelCH.HasTitle = TrueCH.ChartTitle.Text = "Temperatur"

Page 192: Einstieg Mit VBA in Excel

191

Diagramm ändern 7.2

' LegendeCH.HasLegend = TrueWith CH.Legend

.Interior.Color = vbYellow

.Border.Color = vbBlue

.Border.Weight = xlThickEnd With

' Achse KategorienWith CH.Axes(xlCategory)

.HasTitle = True

.AxisTitle.Text = "Datum"

.TickLabels.NumberFormatLocal = "TT.MM."End With

' Achse WerteWith CH.Axes(xlValue)

.HasTitle = True

.AxisTitle.Text = "Grad"

.MinimumScale = 5

.MaximumScale = 35End With

' DatenreiheWith CH.SeriesCollection(1)

.Border.Color = vbRed

.MarkerStyle = xlMarkerStyleCircle

.MarkerForegroundColor = vbRed

.MarkerBackgroundColor = vbRedEnd With

'DatenpunktWith CH.SeriesCollection(1).Points(3)

.Border.Color = vbBlue

.ApplyDataLabels xlShowValue

.MarkerStyle = xlMarkerStyleSquare

.MarkerForegroundColor = vbBlue

.MarkerBackgroundColor = vbBlueEnd With

End Sub

Die Abbildungen 7.4 und 7.5 zeigen einige Bildausschnitte dazu:

Page 193: Einstieg Mit VBA in Excel

192

Diagramme und Grafiken7

Abbildung 7.4 Geändert: Flächenfarben, Legende und Datenreihe

Abbildung 7.5 Geändert: Achse, Datenpunkt

Zur Erläuterung:

ChartArea � Die Eigenschaft ChartArea steht für die Diagrammfläche des Dia-gramms. Diese umfasst z. B. Zeichnungsfläche, Titel und Legende. Siehat u. a. die Eigenschaft Interior, die für (wie bei einer Zelle) dasInnere des Objekts steht. Dieses Innere hat wiederum eine Farbe, diein diesem Beispiel auf Cyan gesetzt wird.

PlotArea � Die Eigenschaft PlotArea steht für die Zeichnungsfläche des Dia-gramms. Sie hat ebenfalls u. a. die Eigenschaft Interior, deren Farbein diesem Beispiel auf Gelb gesetzt wird.

HasTitle � Diagramme können einen Titel haben. Darüber bestimmt die Eigen-schaft HasTitle. Wird sie auf True gesetzt, dann hat das Diagrammeinen Titel; bei False hat es keinen Titel.

ChartTitle � Das Aussehen des Titels wird über die Eigenschaft ChartTitle festge-legt. Die Eigenschaft Text enthält den Text des Titels.

HasLegend � Diagramme können eine Legende haben. Darüber bestimmt dieEigenschaft HasLegend. Auch sie kann auf True oder False gesetztwerden.

Legend � Das Aussehen der Legende wird über die Eigenschaft Legend festge-legt. Ähnlich wie eine Zelle hat eine Legende die Eigenschaften Inte-

Page 194: Einstieg Mit VBA in Excel

193

Diagramm ändern 7.2

rior und Border. Damit können Sie über die Farbe des Inneren bzw.über Rahmenfarbe und -dicke bestimmen.

Axes, Axis� Alle Achsen eines Diagramms stehen in der Auflistung Axes. Eine ein-zelne Achse ist ein Objekt vom Typ Axis. Zunächst muss mit Hilfe derMethode Axes() des Objekts Chart entschieden werden, welcheAchse gemeint ist. Es gibt die Parameter:

� xlCategory für die horizontale Achse, die Kategorie-Achse

� xlValue für die vertikale Achse, die Wert-Achse

AxisTitle� Für jede der beiden Achsen wird im Beispiel festgelegt, dass sie einenAchsentitel haben (HasTitle = True). Anschließend wird der Text desAchsentitels zugewiesen (AxisTitle.Text = ...).

TickLabels� Bei der Kategorienachse wird die Formatierung der Achsenbeschrif-tung (TickLabels) bestimmt. Hier stehen im Beispiel Datumsanga-ben; sie werden mit Hilfe von NumberFormatLocal (wie Zellen) forma-tiert.

...Scale� Bei der Wertachse wird die Skalierung bestimmt. Dabei könnenunterster Wert (MinimumScale) und oberster Wert (MaximumScale)gesetzt werden.

SeriesCollection, Series

� Alle Datenreihen eines Diagramms stehen in der AuflistungSeriesCollection. Eine einzelne Datenreihe ist ein Objekt vom TypSeries. Zunächst muss mit Hilfe der Methode SeriesCollec-

tion()des Objekts Chart entschieden werden, welche Datenreihegemeint ist. Diese Methode bekommt als Parameter die Nummer derDatenreihe, beginnend bei 1, und liefert als Rückgabewert die ent-sprechende Datenreihe.

Border� Mit Border können die Eigenschaften des Rahmens (bei Liniendia-grammen die Eigenschaften der eigentlichen Linie) der Datenreihebestimmt werden. In diesem Beispiel wird die Farbe auf Rot gesetzt.

� Mit MarkerStyle, MarkerForegroundColor, MarkerBackgroundColorentscheiden Sie über das Aussehen der Markierungspunkte auf derLinie.

MarkerStyle� Für MarkerStyle ist eine Reihe von Konstanten erlaubt, z. B.xlMarkerStyleCircle (Kreis), xlMarkerStyleSquare (Quadrat),xlMarkerStyleNone (keine Markierung).

Marker...Color� Die Eigenschaften MarkerForegroundColor und MarkerBack-

groundColor stehen für die Farbe der Markierungsfüllung und desMarkierungsrands.

Page 195: Einstieg Mit VBA in Excel

194

Diagramme und Grafiken7

Points, Point � Alle Datenpunkte einer Datenreihe stehen in der Auflistung Points.Ein einzelner Datenpunkt ist ein Objekt vom Typ Point. Zunächstmuss mit Hilfe der Methode Points() des Objekts Series entschie-den werden, welcher Datenpunkt gemeint ist. Diese Methodebekommt als Parameter die Nummer des Datenpunkts, beginnend bei1, und liefert als Rückgabewert den entsprechenden Datenpunkt.

� Mit Border bestimmen Sie die Eigenschaften des Rahmens (bei Lini-endiagrammen die Eigenschaften der eigentlichen Linie) des Daten-punkts. In diesem Beispiel wird die Farbe auf Blau gesetzt.

� Die Methode ApplyDataLabels() bestimmt über die Beschriftungvon Datenreihen oder Datenpunkten. Der wichtigste Parameter istder Typ der Beschriftung. Erlaubte Werte sind u. a. xlShowValue(Wert), xlShowLabel (Kategorie), xlShowNone (keine Beschriftung).

� Das Aussehen der Markierung eines Datenpunkts lässt sich wie beieiner Datenreihe einstellen, siehe oben.

7.2.2 Eingebettetes Diagramm ändern

ÄhnlichDiagrammblatt

Das Programm zum Ändern eines eingebetteten Diagramms ist ebensoaufgebaut wie das Programm zum Ändern eines Diagrammblatts, alsozweiteilig. Es folgt der Programmteil, der nur für eingebettete Dia-gramme zutrifft:

Sub DiagrammEingebettetAendern()Dim CO As ChartObjectDim CH As Chart

Set CO = ThisWorkbook.Worksheets("Tabelle1"). _ChartObjects(1)

CO.Left = 220CO.Top = 30CO.Width = 400CO.Height = 300

Set CH = CO.ChartDiagrammAendern CH

End Sub

Hinweis

In den Versionen vor Excel 2007 lässt sich die Formatierung der Achsenbe-schriftung nicht vollständig einstellen. Die Eigenschaft NumberFormatLocaleines TickLabels kann nicht mit einem Datumsformat eingestellt werden.

Page 196: Einstieg Mit VBA in Excel

195

Diagramm verwalten 7.3

Zur Erläuterung:

ChartObject� Es wird eine Variable vom Typ ChartObject deklariert. Diesebekommt den ersten Diagrammrahmen des Tabellenblatts Tabelle1dieser Arbeitsmappe zugewiesen.

Chart-Variable� Anschließend wird eine Variable vom Typ Chart deklariert. Ihr wei-sen wir das Diagramm dieses Diagrammrahmens zu.

Diagrammrahmen� Bei einem eingebetteten Diagramm kann es sinnvoll sein, Positionund Größe des Diagrammrahmens zu ändern. Hierzu können Sie dieEigenschaften Left, Top, Width und Height nutzen.

� Es wird die (bereits bekannte) Prozedur DiagrammAendern() aufgeru-fen; als Parameter wird der Chart übergeben.

7.3 Diagramm verwalten

Diagramme können unter anderem kopiert, gelöscht oder als Bilddateiexportiert werden.

7.3.1 Diagrammblatt verwalten

KopierenEs folgen drei Programme zum Kopieren, Löschen bzw. Exportiereneines Diagrammblatts. Zunächst das Kopieren:

Sub DiagrammNeuesBlattKopieren()ThisWorkbook.Charts("Diagramm1").Copy _

After:=Worksheets("Tabelle3")ActiveChart.Name = "Diagramm1 Neu"

End Sub

Zur Erläuterung:

� Ein Diagrammblatt wird genauso kopiert wird ein Tabellenblatt.

Copy(), After, Before

� Die Methode Copy() sorgt für die Kopie. Mit Before bzw. After kön-nen Sie den Ort der Kopie angeben. Ohne Parameter würde eine neueArbeitsmappe mit dem Diagrammblatt als einzigem Blatt angelegtwerden.

Page 197: Einstieg Mit VBA in Excel

196

Diagramme und Grafiken7

Das Ergebnis:

Abbildung 7.6 Kopiertes Diagrammblatt

Löschen Es folgt das Löschen:

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

End Sub

Zur Erläuterung:

Delete() � Die Methode Delete() löscht das angegebene Diagrammblatt, mitRückfrage.

Exportieren Zuletzt das Exportieren:

Sub DiagrammNeuesBlattExport()ThisWorkbook.Charts("Diagramm1").Export _

"C:\Temp\März.png"End Sub

Zur Erläuterung:

Export() � Die Methode Export() dient zum Erzeugen einer Bilddatei. Es mussder Name der Bilddatei (gegebenenfalls mit Verzeichnisname) ange-geben werden. Die Endung des Dateinamens bestimmt über die Artder Konvertierung; es sind u. a. .jpg, .gif und .png erlaubt.

Das Ergebnis:

Abbildung 7.7 Export-Ergebnis

Page 198: Einstieg Mit VBA in Excel

197

Diagramm verwalten 7.3

7.3.2 Eingebettetes Diagramm verwalten

KopierenParallel zum vorherigen Abschnitt folgen drei Programme zum Kopieren,Löschen bzw. Exportieren eines eingebetteten Diagramms. Zunächst dasKopieren:

Sub DiagrammEingebettetKopieren()With ThisWorkbook.Worksheets("Tabelle1")

.ChartObjects(1).Copy

.Paste

.ChartObjects(2).Top = 250

.ChartObjects(2).Left = 200End With

End Sub

Das Ergebnis:

Abbildung 7.8 Kopiertes, eingebettetes Diagramm

Zur Erläuterung:

� Es wird davon ausgegangen, dass im Tabellenblatt Tabelle1 nur einDiagrammrahmen existiert.

Copy()� Dieser Rahmen hat die Nummer 1 in der ChartObjects-Auflistung.Die Methode Copy() kopiert den Diagrammrahmen (inklusive Dia-gramm) in die Zwischenablage.

Paste()� Die Methode Paste() fügt den Diagrammrahmen aus der Zwischen-ablage in das Tabellenblatt Tabelle1 ein. Damit wird er zu ChartOb-jects(2).

Diagrammrahmen� Die Position dieses neuen Diagrammrahmens wird über die Eigen-schaften Top und Left festgelegt.

Page 199: Einstieg Mit VBA in Excel

198

Diagramme und Grafiken7

Löschen Es folgt das Löschen:

Sub DiagrammEingebettetLoeschen()ThisWorkbook.Worksheets("Tabelle1"). _

ChartObjects(2).DeleteEnd Sub

Zur Erläuterung:

Delete() � Die Methode Delete() löscht den Diagrammrahmen ohne Rückfrage.

Exportieren Zuletzt das Exportieren:

Sub DiagrammEingebettetExport()ThisWorkbook.Worksheets("Tabelle1"). _

ChartObjects(1).Chart.Export _"C:\Temp\März.jpg"

End Sub

Zur Erläuterung:

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

7.4 Beispiel: Formatiertes Kreisdiagramm

Beispieltabelle Als weiteres Beispiel für ein neu erstelltes, eingebettetes und formatier-tes Diagramm soll nachfolgend ein Kreisdiagramm dienen. Sie könnenerkennen, dass dabei viele allgemeine Diagrammeigenschaften aus demLiniendiagramm übernommen werden können. Andere Eigenschaftengibt es hingegen nur bei Kreisdiagrammen. Als Datenquelle dienen diefolgenden Wahlergebnisse:

Abbildung 7.9 Basisdaten für Kreisdiagramm

Page 200: Einstieg Mit VBA in Excel

199

Beispiel: Formatiertes Kreisdiagramm 7.4

Zunächst der Code:

Sub DiagrammKreis()Dim CO As ChartObjectDim CH As ChartDim i As Integer

Set CO = ThisWorkbook.Worksheets("Tabelle2"). _ChartObjects.Add(200, 10, 400, 350)

Set CH = CO.Chart

' Diagrammtyp und DatenquelleCH.ChartType = xlPieCH.SetSourceData Range("A1:B13")

' Diagramm- und ZeichnungsflächeCH.ChartArea.Interior.Color = vbCyanCH.PlotArea.Interior.Color = vbYellow

' TitelCH.HasTitle = TrueCH.ChartTitle.Text = "Spanien 2004"

' LegendeCH.HasLegend = TrueWith CH.Legend

.Interior.Color = vbYellow

.Border.Color = vbBlue

.Border.Weight = xlThickEnd With

'DatenpunkteCH.SeriesCollection(1).Points(1). _

Interior.Color = vbWhite

For i = 1 To CH.SeriesCollection(1).Points.CountIf Cells(i + 1, 2) > 500000 Then

With CH.SeriesCollection(1).Points(i).ApplyDataLabels _

xlDataLabelsShowLabelAndPercent.DataLabel.NumberFormat = "0.00%"

End WithEnd If

Next iEnd Sub

Page 201: Einstieg Mit VBA in Excel

200

Diagramme und Grafiken7

Zwei Bildausschnitte zum Ergebnis (Abbildungen 7.10 und 7.11).

Abbildung 7.10 Formatiert: Flächen, Datenreihe, Titel

Abbildung 7.11 Formatiert: Legende

Zur Erläuterung:

Add() � Wie bekannt wird mit ChartObject.Add() der Diagrammrahmen neuerstellt.

Typ xlPie � Als Diagrammtyp dient xlPie, für Kreisdiagramme (Kuchendia-gramme).

� Diagramm- und Zeichnungsfläche, Titel und Legende können wiebeim Liniendiagramm formatiert werden.

� Bei den Datenreihen sieht es anders aus. Es gibt natürlich keine Mar-kierungen, dafür aber z. B.

Beschriftung � mit xlDataLabelsShowLabelAndPercent einen speziellen Beschrif-tungstyp und

Fläche � eine innere Fläche.

Page 202: Einstieg Mit VBA in Excel

201

Shapes 7.5

� Im vorliegenden Fall werden mit dem Beschriftungstyp die Daten-punkte, deren Wert oberhalb einer Grenze (500.000 Stimmen) liegt,mit Kategorie und Prozentzahl beschriftet.

� Außerdem wird die innere Fläche eines Datenpunkts in Weiß darge-stellt.

DataLabel� Die Eigenschaft DataLabel bestimmt über das Aussehen der Beschrif-tung. Hier wurde festgelegt, dass die Prozentzahl mit zwei Nachkom-mastellen dargestellt wird.

7.5 Shapes

Zeichnungs-objekte

Zeichnungsobjekte (Shapes) werden, wie eingebettete Diagramme,innerhalb eines Tabellenblatts angeordnet. Die Auflistung Shapes liegtdaher auch in der Objekt-Hierarchie unterhalb von Worksheets undumfasst alle Zeichnungsobjekte.

Wichtige Eigenschaften und Methoden der Auflistung Shapes sind:

� Count: Anzahl der Zeichnungsobjekte

AddShape()� AddShape(): Erzeugen der meisten Typen von Zeichnungsobjekten

� AddLine(): Erzeugen einer Linie

� AddConnector(): Erzeugen eines Verbinders

� BuildFreeform(): Erzeugen einer Freiform

Wie bei allen Auflistungen üblich, sind die Shapes eines Tabellenblatts inder Reihenfolge der Erzeugung durchnummeriert (Shapes(1),Shapes(2), Shapes(3)...).

Einige der zahlreichen Möglichkeiten von Shapes werden in diesemAbschnitt anhand von bekannten Autoformen, wie Rechteck, Oval,Linie, Verbinder und Freiform, erläutert. Zur besseren Übersicht werdenin Abschnitt 7.5.6 alle verschiedenen Formen von Shapes mithilfe einesVBA-Programms dargestellt.

7.5.1 Rechteck

Im folgenden Beispiel wird ein Rechteck, mit Füllung und Rahmenlinie,erzeugt und gedreht. Bei einem Rechteck handelt es sich um einen Shapedes Typs msoShapeRectangle.

Page 203: Einstieg Mit VBA in Excel

202

Diagramme und Grafiken7

Sub Rechteck()Dim Sh As ShapeThisWorkbook.Worksheets("Tabelle3").Activate

Set Sh = ActiveSheet.Shapes.AddShape _(msoShapeRectangle, 30, 30, 50, 80)

Sh.Fill.ForeColor.RGB = RGB(255, 0, 0)Sh.Line.ForeColor.RGB = RGB(255, 255, 0)Sh.Line.Weight = 3Sh.Rotation = 20

End Sub

Das Ergebnis:

Abbildung 7.12 Rechteck

Zur Erläuterung:

AddShape() � Die Methode AddShape() dient zur Erzeugung vieler verschiedenerTypen von Zeichnungsobjekten. Sie hat fünf Parameter:

Typ � Type: Ein Wert aus der Aufzählung msoAutoShapeType. Diese Auf-zählung hat weit über 100 Elemente; jeder steht für einenbestimmten Typ von Zeichnungsobjekt. Durch Angabe des TypsmsoShapeRectangle erzeugen Sie ein Rechteck.

Position � Left und Top: Koordinaten des Rahmens um das neue Objekt,gemessen von der oberen linken Ecke des Tabellenblatts

Größe � Width und Height: Breite und Höhe des Rahmens um das neueObjekt

UmgebendesRechteck

� Bei einem Rechteck stimmt der Rahmen mit dem Objekt selbst über-ein. Bei einem Oval ist der Rahmen das unsichtbare, umgebendeRechteck. Das umgebende Rechteck wird sichtbar, wenn Sie dasObjekt markieren.

Fill � Die Eigenschaft Fill eines Shapes dient zur Gestaltung der Füllungdes Objekts. Hier wird die Untereigenschaft ForeColor.RGB genutzt,um die Füllfarbe des Objekts einzustellen.

Page 204: Einstieg Mit VBA in Excel

203

Shapes 7.5

Line� Die Eigenschaft Line eines Shapes umfasst bei einem Zeichnungsob-jekt vom Typ Linie die Eigenschaften der Linie selbst. Bei einem aus-gedehnten Objekt (wie hier bei einem Rechteck) umfasst sie dieEigenschaften der Randlinie. Hier wird ebenfalls die UntereigenschaftForeColor.RGB genutzt, um die Linienfarbe des Objekts einzustellen.

Weight� Mit der Eigenschaft Weight können Sie die Dicke der Linie einstellen.

Rotation� Die Eigenschaft Rotation bestimmt die Drehung des Zeichnungsob-jekts in Grad. Sie wird im Uhrzeigersinn gemessen.

7.5.2 Oval

msoShapeOvalDer Typ msoShapeOval dient zur Erzeugung eines Ovals. Falls Breite undHöhe gleich sind, handelt es sich um einen Kreis. Viele Zeichnungsob-jekte können Text enthalten; dies wird nachfolgend am Oval gezeigt:

Sub Oval()Dim Sh As ShapeThisWorkbook.Worksheets("Tabelle3").Activate

Set Sh = ActiveSheet.Shapes.AddShape _(msoShapeOval, 130, 30, 80, 50)

Sh.Line.DashStyle = msoLineDashSh.TextFrame.Characters.Text = "Hallo"Sh.TextFrame.Characters.Font.Color = vbYellow

End Sub

Das Ergebnis:

Abbildung 7.13 Oval

Hinweis

Die Koordinaten des Objekts (Left und Top) verändern sich durch eine Dre-hung nicht, obwohl sich z. B. die linke obere Ecke verschiebt. Eine Aussageüber die wahre Lage ergibt sich also nur aus der Kombination der AngabenLeft, Top und Rotation.

Page 205: Einstieg Mit VBA in Excel

204

Diagramme und Grafiken7

Zur Erläuterung:

Type � Durch Angabe des Typs msoShapeOval erzeugen Sie ein Oval.

DashStyle � Die Eigenschaft DashStyle einer Linie bestimmt die Art einer Linie.Werte stammen aus der Aufzählung msoLineDashStyle. Der WertmsoLineDash bedeutet gestrichelte Linie.

Text... � Mit der Eigenschaft TextFrame können Sie einige (aber nicht alle)Eigenschaften des Texts festlegen, denen Sie viele Shapes zuordnenkönnen. Weitere Eigenschaften in diesem Zusammenhang sindTextFrame2 und TextEffect.

Characters � Die Untereigenschaft TextFrame.Characters dient u. a. zur Zuwei-sung des eigentlichen Texts (Untereigenschaft Text) und zur Zuwei-sung von Schrifteigenschaften (Untereigenschaft Font).

7.5.3 Linie

AddLine() Die Methode AddLine() erzeugt eine Linie. Rückgabewert ist aber wie-derum ein Objekt des Typs Shape. Die Eigenschaft Line eines Shapesumfasst bei einer Linie die Eigenschaften der Linie selbst. Bei einem aus-gedehnten Objekt (wie z. B. bei einem Rechteck) enthält sie die Eigen-schaften der Randlinie.

Alle Objekte, so auch Zeichnungsobjekte, können Elemente von Daten-feldern sein. Im vorliegenden Beispiel wird ein Datenfeld von drei ähnli-chen Linien erzeugt.

Sub Linie()Dim Sh(1 To 3) As ShapeDim i As IntegerThisWorkbook.Worksheets("Tabelle3").Activate

For i = 1 To 3Set Sh(i) = ActiveSheet.Shapes.AddLine _

(240, 30, 280, 30)Sh(i).Line.ForeColor.RGB = RGB(255, 0, 0)Sh(i).Line.Weight = 3Sh(i).Rotation = (i – 1) * 30

Next iEnd Sub

Page 206: Einstieg Mit VBA in Excel

205

Shapes 7.5

Das Ergebnis:

Abbildung 7.14 Linie

Zur Erläuterung:

� Bei der Methode AddLine() müssen vier Parameter angegeben werden:

Koordinaten� BeginX und BeginY für die Koordinaten des Startpunkts.

� EndX und EndY für die Koordinaten des Endpunkts.

� Innerhalb der Schleife werden Farbe und Dicke der Linie einheitlichfestgelegt.

Rotation� Die Rotation wird für jede Linie unterschiedlich bestimmt.

7.5.4 Verbinder

Flexibel verbindenEin Verbinder stellt eine flexible Verbindung zwischen zwei Objektendar. Bei einer Veränderung von einem Objekt oder beiden Objekten ver-ändern sich auch die Eigenschaften des Verbinders. Die Verbindungkann von einem der verschiedenen möglichen Verbindungspunkte einesObjekts ausgehen. Meist ist es gewünscht, dass sich die Verbindungs-punkte der beiden Objekte möglichst nahe liegen.

Verbindungs-punkte

Im folgenden Beispiel werden zunächst zwei Rechtecke erzeugt.Anschließend werden diese beiden Objekte miteinander verbunden.Rechtecke haben vier mögliche Verbindungspunkte, die sich jeweils inder Mitte der vier Seiten des Rechtecks befinden.

Sub Verbinder()Dim Sh1 As Shape, Sh2 As ShapeDim Con As ShapeThisWorkbook.Worksheets("Tabelle3").Activate

' Objekte, die verbunden werden sollenSet Sh1 = ActiveSheet.Shapes.AddShape _

(msoShapeRectangle, 80, 130, 40, 30)Set Sh2 = ActiveSheet.Shapes.AddShape _

(msoShapeRectangle, 180, 100, 40, 30)

Page 207: Einstieg Mit VBA in Excel

206

Diagramme und Grafiken7

' VerbinderSet Con = ActiveSheet.Shapes.AddConnector _

(msoConnectorStraight, 1, 1, 1, 1)Con.Line.Weight = 3Con.ConnectorFormat.BeginConnect Sh1, 1Con.ConnectorFormat.EndConnect Sh2, 1Con.RerouteConnections

End Sub

Das Ergebnis:

Abbildung 7.15 Zwei Objekte, Verbinder, Verbindungspunkte

Zur Erläuterung:

AddConnector() � Die Methode AddConnector() erzeugt einen Verbinder. Rückgabe-wert ist ebenfalls ein Objekt des Typs Shape.

msoConnector-Straight

� Der erste Parameter bestimmt die Art des Verbinders. Dies ist einWert aus der Aufzählung msoConnectorType. Der Wert msoCon-nectorStraight bedeutet gerader Verbinder.

Koordinatenunwichtig

� Die weiteren vier Parameter dienen, wie bei einer Linie, zur Fest-legung der Koordinaten des Startpunkts (BeginX, BeginY) und desEndpunkts (EndX, EndY). Wie bereits erläutert, richten sich dieseEigenschaften aber nach vollzogener Verbindung nach den Eigen-schaften der verbundenen Objekte. Daher müssen jetzt lediglichWerte festgelegt werden, die ungleich Null sind.

� Für einen Verbinder können weitere Linieneigenschaften festgelegtwerden, wie z. B. Weight für die Liniendicke.

Beginn, Ende � Die eigentliche Verbindung wird über die Methoden BeginConnect()und EndConnect() der ConnectorFormat-Eigenschaft hergestellt. BeideMethoden haben zwei Parameter:

Objekt � Im ersten Parameter wird das verbundene Objekt angegeben.

Verbindungs-punkt

� Im zweiten Parameter wird die laufende Nummer des Verbindungs-punkts angegeben. Wie bereits erläutert, ist es meist gewünscht,dass sich die Verbindungspunkte der beiden Objekte möglichst

Page 208: Einstieg Mit VBA in Excel

207

Shapes 7.5

nahe liegen. Daher müssen jetzt lediglich Werte festgelegt werden,die ungleich Null sind.

Reroute-Connections()

� Durch die Methode RerouteConnections() werden dann automa-tisch die optimalen Verbindungspunkte gewählt.

7.5.5 Freiform

LinienzugEine Freiform ist ein Zug aus geraden oder geschwungenen Linien. DieseLinien verbinden die Eckpunkte (= Knoten) der Freiform miteinander.Falls der letzte Knoten gleichzeitig der erste Knoten ist, ergibt sich einegeschlossene Freiform mit einer Innenfläche.

Erzeugen, umwandeln

Die Methode BuildFreeform() erzeugt ein Objekt des Typs Freeform-Builder mit einem ersten Knoten. Mit der Methode AddNodes() werdenweitere Knoten hinzugefügt. Als Letztes wird die Freiform mit derMethode ConvertToShape() in ein Objekt des Typs Shape umgewandelt.

Geschlossene Freiform

Es folgen zwei Beispiele: eine geschlossene Freiform und ein Linienzugals offene Freiform. Zunächst die geschlossene Freiform.

Sub FreiformGeschlossen()Dim FB As FreeformBuilderDim Sh As ShapeThisWorkbook.Worksheets("Tabelle3").Activate

' Eigenschaften der FreiformSet FB = ActiveSheet.Shapes.BuildFreeform _

(msoEditingAuto, 330, 30)FB.AddNodes msoSegmentCurve, msoEditingAuto, 390, 60FB.AddNodes msoSegmentCurve, msoEditingAuto, 390, 120FB.AddNodes msoSegmentCurve, msoEditingAuto, 430, 40FB.AddNodes msoSegmentCurve, msoEditingAuto, 330, 30

' Zeichnen der Freiform als ShapeSet Sh = FB.ConvertToShapeSh.Line.Weight = 3

End Sub

Page 209: Einstieg Mit VBA in Excel

208

Diagramme und Grafiken7

Das Ergebnis:

Abbildung 7.16 Freiform

Zur Erläuterung der geschlossenen Freiform:

BuildFreeform() � Die Methode BuildFreeform() benötigt drei Parameter:

� Der EditingType gibt die Bearbeitungseigenschaft des ersten Kno-tens an. Es muss ein Wert der Aufzählung msoEditingType ange-geben werden. Der Wert msoEditingAuto legt fest, dass sich dieBearbeitungsart nach den verbundenen Segmenten richtet. Damithat man die universelle Einstellung gewählt.

� Die beiden Eigenschaften X1 und Y1 legen die Koordinaten des ers-ten Knotens der Freiform fest.

AddNodes() � Die Methode AddNodes() benötigt mindestens vier Parameter:

� Der Parameter SegmentType legt das Aussehen der Verbindung zudiesem neuen Knoten fest. Es muss ein Wert der Aufzählung mso-SegmentType angegeben werden. Mögliche Werte sind msoSeg-mentCurve (Kurve) und msoSegmentLine (Linie).

� Der zweite Parameter wurde bereits bei BuildFreeform() erläu-tert.

� Falls der zweite Parameter den Wert msoEditingAuto hat, dannlegen die beiden Eigenschaften X1 und Y1 die Koordinaten desneuen Knotens fest.

ConvertToShape() � Die Methode ConvertToShape() wandelt die neu erzeugte Freiformin einen Shape um. Anschließend können Sie mit den bekanntenEigenschaften und Methoden von Shapes arbeiten, wie z. B. Line.Weight für die Liniendicke.

Offene Freiform Es folgt ein Linienzug als offene Freiform. Die Koordinaten der Knotenwerden dem Tabellenblatt entnommen (siehe Abbildung 7.17). Spätes-

Page 210: Einstieg Mit VBA in Excel

209

Shapes 7.5

tens jetzt lässt sich die Verwandtschaft von Shapes und Diagrammenleicht erkennen.

Abbildung 7.17 Koordinaten der Knoten für den Linienzug

Sub FreiformLinienzug()Dim FB As FreeformBuilderDim Sh As ShapeDim i As IntegerThisWorkbook.Worksheets("Tabelle3").Activate

' Eigenschaften der FreiformSet FB = ActiveSheet.Shapes.BuildFreeform _

(msoEditingAuto, Cells(1, 9), Cells(1, 10))For i = 2 To 10

FB.AddNodes msoSegmentLine, msoEditingAuto, _Cells(i, 9), Cells(i, 10)

Next i

' Zeichnen der Freiform als ShapeSet Sh = FB.ConvertToShapeSh.Line.Weight = 3

End Sub

Das Ergebnis:

Abbildung 7.18 Freiform-Linienzug

Page 211: Einstieg Mit VBA in Excel

210

Diagramme und Grafiken7

Zur Erläuterung:

� Die Koordinaten des ersten Knotens, der zur Erzeugung der Freiformbenötigt wird, stehen in der ersten Zeile.

AddNodes() � Die Koordinaten der weiteren Knoten, die von der Methode Add-Nodes() genutzt werden, stehen in den Zeilen darunter. Als Verbin-dung wird jeweils der Typ Linie festgelegt.

7.5.6 Alle Formen

Alle Shapes Zur besseren Übersicht werden in diesem Abschnitt alle verschiedenenFormen von Shapes mithilfe des nachfolgenden VBA-Programms darge-stellt:

Sub AlleFormen()Dim sh As ShapeDim i As Integer, lf As Integer, tp As Integer

' Tabellenblatt auswählenThisWorkbook.Worksheets("Tabelle4").Activate

' Kein GitternetzActiveWindow.DisplayGridlines = False

' LeerenFor i = ActiveSheet.Shapes().Count To 1 Step -1

ActiveSheet.Shapes(i).DeleteNext i

' Startwertelf = 5tp = 5

' Alle verschiedenen FormenFor i = 1 To 137

Set sh = ActiveSheet.Shapes(). _AddShape(i, lf, tp, 30, 30)

' Formatierensh.Line.Weight = 1sh.Line.ForeColor.RGB = RGB(0, 0, 0)sh.Fill.ForeColor.RGB = RGB(255, 255, 255)With sh.TextFrame.Characters

.Font.Color = vbBlack

Page 212: Einstieg Mit VBA in Excel

211

Shapes 7.5

.Font.Size = 7

.Text = iEnd With

' Nächste Positionlf = lf + 35If i Mod 15 = 0 Then

lf = 5tp = tp + 35

End IfNext i

End Sub

Zur Erläuterung:

� Zunächst werden die Gitternetzlinien im Tabellenblatt zur deutliche-ren Darstellung ausgeblendet.

� Alle evtl. bereits vorhandenen Zeichnungsobjekte werden gelöscht.Das Löschen beginnt beim letzten Zeichnungsobjekt. Falls es beimersten Zeichnungsobjekt beginnen würde, dann würde man nach kur-zer Zeit auf einen nicht mehr existierenden Index zugreifen.

� Es werden Startwerte für den Ort festgelegt, an dem das Zeichnungs-objekt gezeichnet wird.

AddShape()� Innerhalb der Schleife werden alle 137 verschiedenen Zeichnungs-objekte mithilfe der Methode AddShape() erzeugt.

Type� Jedes Objekt wird in der Größe 30 mal 30 mit einer dünnen schwar-zen Linie und einem weißen Innenbereich gezeichnet. In jedemObjekt wird der Wert für die Eigenschaft Type notiert.

� Zum Abschluss der Schleife wird die Position für das nächste Zeich-nungsobjekt festgelegt.

In Abbildung 7.19 sehen Sie einen kleinen Ausschnitt:

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

Page 213: Einstieg Mit VBA in Excel

212

Diagramme und Grafiken7

7.6 WordArt

Texteffekte Mit WordArt können Sie dekorative Texteffekte erzeugen, z. B. schattier-ten oder gespiegelten Text. Mithilfe eines VBA-Programms wird nachfol-gend eine Übersicht über die insgesamt 30 verschiedenen Effektartenerzeugt. Dazu wird die Methode AddTextEffect() verwendet. Ergebnisist wiederum ein Objekt der Klasse Shape.

Sub AlleWordArt()Dim sh As ShapeDim i As Integer, lf As Integer, tp As Integer

' Tabellenblatt auswählenThisWorkbook.Worksheets("Tabelle5").Activate

' Kein GitternetzActiveWindow.DisplayGridlines = False

' LeerenFor i = ActiveSheet.Shapes().Count To 1 Step -1

ActiveSheet.Shapes(i).DeleteNext i

' Startwertelf = 5tp = 5

' Alle verschiedenen WordArt-VoreinstellungenFor i = 0 To 29

Set sh = ActiveSheet.Shapes().AddTextEffect( _i, i, "Arial", 48, False, False, lf, tp)

sh.TextFrame.Characters.Font.Color = _RGB(255, 0, 0)

' Nächste Positionlf = lf + 70If i Mod 6 = 5 Then

Hinweis

In den Versionen vor Excel 2007 lassen sich die Eigenschaften Color undSize des Font-Objekts (zur Darstellung der laufenden Nummer in der Form)nicht einstellen.

Page 214: Einstieg Mit VBA in Excel

213

WordArt 7.6

lf = 10tp = tp + 70

End IfNext i

End Sub

Zur Erläuterung:

� Wie im vorherigen Programm werden die Gitternetzlinien ausgeblen-det und alle evtl. bereits vorhandenen Shapes gelöscht.

AddTextEffect()� Nach der Festlegung der Startposition wird in der Schleife dieMethode AddTextEffect() aufgerufen. Sie hat acht Pflichtparameter:

� Typ des vordefinierten Texteffekts,

� dargestellter Text,

� Name der Schriftart,

� Größe der Schriftart,

� Fett ja/nein,

� Kursiv ja/nein,

� Positionsangabe links,

� Positionsangabe oben

� Die Schriftfarbe, also die Farbe des im Textframe des Shapes darge-stellten Texts, wird auf Rot festgelegt.

� Zum Abschluss der Schleife wird die Position für das nächste Objektfestgelegt.

Über die Parameter kann der Texteffekt noch weiter variiert werden. InAbbildung 7.20 sehen Sie einen kleinen Ausschnitt.

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

Page 215: Einstieg Mit VBA in Excel

214

Diagramme und Grafiken7

7.7 Bedingte Formatierungen

Wertereihen Bedingte Formatierungen können zur deutlicheren Darstellung derUnterschiede und Besonderheiten innerhalb einer zusammengehörigenReihe von Werten verwendet werden. Zur Formatierung dienen Daten-balken, Farbskalen und Symbolsätze. Diese Möglichkeit gibt es erst seitExcel 2007.

7.7.1 Datenbalken

Mithilfe des nachfolgenden Programms werden die Größenverhältnisseeiner Reihe von Zahlen durch Datenbalken verdeutlicht:

Sub Datenbalken()Dim rg As RangeThisWorkbook.Worksheets("Tabelle6").ActivateSet rg = Range("A2:A11")rg.FormatConditions.Delete

' Datenbalken erzeugenrg.FormatConditions.AddDatabar

' Datenbalken ändernrg.FormatConditions(1).BarColor.Color = vbRed

End Sub

Zur Erläuterung:

� Die bedingten Formatierungen einer Zelle oder eines Zellbereichswerden in der Collection FormatConditions festgehalten.

� Die Methode Delete() löscht alle evtl. bereits vorhandenen beding-ten Formatierungen.

AddDatabar() � Mithilfe der Methode AddDatabar() wird ein Objekt der Klasse Data-bar erzeugt. Dies ist eine bedingte Formatierung in Form eines Daten-balkens.

Hinweis

In den Versionen vor Excel 2007 werden die WordArt-Formen anders gebil-det. Daher lässt sich die Eigenschaft Color des Font-Objekts (zur Darstellungder laufenden Nummer in der Form) nicht einstellen. Außerdem sehen dieWordArt-Formen anders aus.

Page 216: Einstieg Mit VBA in Excel

215

Bedingte Formatierungen 7.7

� Dieser Datenbalken kann verändert werden. Da es sich dabei um dieerste bedingte Formatierung handelt, wird sie über den Index 1 ange-sprochen. Später könnten der gleichen Zelle oder dem gleichen Zell-bereich weitere bedingte Formatierungen zugeordnet werden.

BarColor� Die Farbe des Datenbalkens wird über die Untereigenschaft Color derEigenschaft BarColor geändert.

� Das Ergebnis sehen Sie in Abbildung 7.21.

Abbildung 7.21 Datenbalken

7.7.2 Zweifarbige Farbskala

Es gibt die Möglichkeit, den Zellbereich mithilfe einer zweifarbigen oderdreifarbigen Skala zu formatieren. Zunächst ein Beispiel mit zwei Farben:

Sub ZweiFarbenSkala()Dim rg As RangeThisWorkbook.Worksheets("Tabelle6").ActivateSet rg = Range("A2:A11")rg.FormatConditions.Delete

' ZweiFarbenSkala erzeugenrg.FormatConditions.AddColorScale 2

' ZweiFarbenSkala ändernWith rg.FormatConditions(1)

.ColorScaleCriteria(1).Type = _xlConditionValueLowestValue

.ColorScaleCriteria(1).FormatColor.Color = _vbYellow

.ColorScaleCriteria(2).Type = _xlConditionValueHighestValue

Page 217: Einstieg Mit VBA in Excel

216

Diagramme und Grafiken7

.ColorScaleCriteria(2).FormatColor.Color = _vbRed

End WithEnd Sub

Zur Erläuterung:

� Zunächst werden wieder alle evtl. bereits vorhandenen bedingtenFormatierungen gelöscht.

AddColorScale() � Mithilfe der Methode AddColorScale() wird ein Objekt der KlasseColorScale erzeugt. Dies ist eine bedingte Formatierung in Formeiner Farbskala. Der erste Parameter (ColorScaleType) legt fest, ob essich um eine zweifarbige oder dreifarbige Farbskala handelt.

ColorScaleCriteria � Zur Veränderung können einer bedingten Formatierung vom TypColorScale weitere Formatierungskriterien hinzugefügt werden. AlleFormatierungskriterien stehen in der Auflistung ColorScaleCriteriades Objekts ColorScale.

Type, FormatColor � Innerhalb des ersten Kriteriums wird dem niedrigsten Wert die FarbeGelb zugewiesen. Dazu bekommt die Eigenschaft Type des Kriteriumsden Wert xlConditionValueLowestValue aus der Aufzählung xlCon-ditionValueTypes. Die Untereigenschaft Color der Eigenschaft For-matColor legt die Farbe für den auf diese Weise ausgewählten Wertfest.

� Innerhalb des zweiten Kriteriums wird dem höchsten Wert die FarbeRot zugewiesen. Dazu wird das Auflistungselement xlConditionVa-lueHighestValue benötigt.

Das Ergebnis sehen Sie in Abbildung 7.22.

Abbildung 7.22 Zweifarbige Skala

Page 218: Einstieg Mit VBA in Excel

217

Bedingte Formatierungen 7.7

7.7.3 Dreifarbige Farbskala

Es folgt ein Beispiel mit drei Farben:

Sub DreiFarbenSkala()Dim rg As RangeThisWorkbook.Worksheets("Tabelle6").ActivateSet rg = Range("A2:A11")rg.FormatConditions.Delete

' DreiFarbenSkala erzeugenrg.FormatConditions.AddColorScale 3

' DreiFarbenSkala ändernWith rg.FormatConditions(1)

.ColorScaleCriteria(1).Type = _xlConditionValueLowestValue

.ColorScaleCriteria(1).FormatColor.Color = _vbGreen

.ColorScaleCriteria(2).Type = _xlConditionValuePercentile

.ColorScaleCriteria(2).FormatColor.Color = _vbYellow

.ColorScaleCriteria(3).Type = _xlConditionValueHighestValue

.ColorScaleCriteria(3).FormatColor.Color = _vbRed

End WithEnd Sub

Zur Erläuterung der Unterschiede zur zweifarbigen Farbskala:

AddColorScale()� Die Methode AddColorScale() wird mit dem Wert 3 für den Parame-ter Type aufgerufen.

Perzentil� Bei der Änderung wird auch die Farbe für das AuflistungselementxlConditionValuePercentile geändert. Beim Perzentil handelt essich um einen bestimmten mittleren Wert aus der Statistik.

Das Ergebnis sehen Sie in Abbildung 7.23.

Page 219: Einstieg Mit VBA in Excel

218

Diagramme und Grafiken7

Abbildung 7.23 Dreifarbige Skala

7.7.4 Symbolsatz

Statt mit Datenbalken oder Farben können die Größenverhältnisse einerReihe von Zahlen auch durch unterschiedliche Symbole verdeutlichtwerden, siehe nachfolgendes Programm:

Sub Symbolsatz()Dim rg As RangeThisWorkbook.Worksheets("Tabelle6").ActivateSet rg = Range("A2:A11")rg.FormatConditions.Delete

' Symbolsatz erzeugenrg.FormatConditions.AddIconSetCondition

' Symbolsatz ändernWith rg.FormatConditions(1)

.IconSet = ActiveWorkbook.IconSets(1)

.IconCriteria(2).Value = 45

.IconCriteria(3).Value = 90End With

End Sub

Zur Erläuterung:

AddColorScale() � Mithilfe der Methode AddIconSetCondition() wird ein Objekt derKlasse IconSetCondition erzeugt. Dies ist eine bedingte Formatie-rung in Form eines Symbolsatzes.

IconSet � Der Typ des Symbolsatzes kann verändert werden. Dazu wird derEigenschaft IconSet der betreffenden bedingten Formatierung ein Ele-ment der Auflistung IconSets der aktiven Arbeitsmappe zugewiesen.

Page 220: Einstieg Mit VBA in Excel

219

Bedingte Formatierungen 7.7

� Es gibt Symbolsätze mit 3, 4 oder 5 verschiedenen Symbolen. Im vor-liegenden Beispiel handelt es sich um einen Symbolsatz mit drei Sym-bolen.

IconCriteria� Für das zweite und das dritte Symbol werden neue Kriterien festge-legt. Dazu wird die Eigenschaft Value des Elements 2 bzw. 3 der Col-lection IconCriteria verändert.

� Falls eine Zelle einen Wert von mindestens 45 % des Maximalwertesder Reihe beinhaltet, dann wird das zweite Symbol verwendet, ab90 % das dritte Symbol. Ohne besondere Festlegung gelten die Grenz-werte 34 % und 67 %.

Das Ergebnis sehen Sie in Abbildung 7.24.

Abbildung 7.24 Symbolsatz

Alle SymbolsätzeExcel 2007 hat bereits 17 verschiedene Symbolsätze geboten. In Excel2010 sind noch drei weitere hinzugekommen. Mithilfe des nachfolgen-den Programms werden alle 20 Symbolsätze übersichtlich dargestellt:

Sub AlleSymbolsätze()Dim rg As RangeDim i As IntegerThisWorkbook.Worksheets("Tabelle7").Activate

For i = 1 To 20Range("A2:A11").Copy Cells(2, i)Cells(1, i).Value = "S " & iSet rg = Range(Cells(2, i), Cells(11, i))rg.FormatConditions.Deleterg.FormatConditions.AddIconSetConditionrg.FormatConditions(1).IconSet = _

ActiveWorkbook.IconSets(i)

Page 221: Einstieg Mit VBA in Excel

220

Diagramme und Grafiken7

Next iEnd Sub

Zur Erläuterung:

� Die Werte der ersten Spalte werden in die restlichen Spalten kopiert.

� Es wird jeweils ein Bereich von 10 Zellen für die bedingte Formatie-rung festgelegt.

� Die bedingte Formatierung wird erzeugt und ihr Typ wird auf einender 20 möglichen Werte festgelegt.

In Abbildung 7.25 sehen Sie einen kleinen Ausschnitt.

Abbildung 7.25 Symbolsätze 16-20

7.8 Sparklines

Mini-Diagramme Sparklines wurden mit Excel 2010 eingeführt. Sie können eine Gruppevon Zahlenwerten schnell und platzsparend verdeutlichen. Es sind einfa-che Mini-Diagramme, die als Zellhintergrund gewählt werden können.Zur Darstellung gibt es die Typen Linie, Spalte oder Gewinn/Verlust.

7.8.1 Linie

Das nachfolgende Programm erzeugt eine Sparkline vom Typ Linie:

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

End Sub

Page 222: Einstieg Mit VBA in Excel

221

Sparklines 7.8

Zur Erläuterung:

Add()� Die Methode Add() der Auflistung SparkLineGroups erzeugt in derZielzelle (hier A10) ein Objekt der Klasse SparkLineGroup.

xlSparkLine� Der erste Parameter (Type) ist das Element xlSparkLine der Auflis-tung xlSparkType. Damit wird eine Linie erzeugt.

� Die Werte für diese Linie werden aus dem zweiten Parameter ermit-telt, einer Zeichenkette mit einem Zellbereich.

Das Ergebnis sehen Sie in Abbildung 7.26.

Abbildung 7.26 Sparkline, Typ Linie

7.8.2 Spalte

Eine Sparkline vom Typ Spalte wird ähnlich erzeugt:

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

End Sub

Zur Erläuterung:

xlSparkColumn� Diesmal wird das Element xlSparkColumn der Auflistung xlSpark-Type genutzt. Damit wird eine Reihe von Balken erzeugt.

Das Ergebnis sehen Sie in Abbildung 7.27.

Abbildung 7.27 Sparkline, Typ Spalte

Page 223: Einstieg Mit VBA in Excel

222

Diagramme und Grafiken7

7.8.3 Gewinn/Verlust-Anzeige

Zu guter Letzt folgt eine Gewinn/Verlust-Anzeige in Form von Balken für+ oder -:

Sub SparkLineGewinnVerlust()ThisWorkbook.Worksheets("Tabelle8").ActivateRange("A11").SparklineGroups.Add _

xlSparkColumnStacked100, "A1:A10"End Sub

Zur Erläuterung:

xlSparkColumn-Stacked100

� Das Element xlSparkColumnStacked100 der Auflistung xlSparkTypesorgt für die Unterscheidung von positiven und negativen Werten.

Das Ergebnis sehen sie in Abbildung 7.28.

Abbildung 7.28 Sparkline, Typ Gewinn/Verlust

7.8.4 Formatierung

Bei einer Sparkline können bestimmte Werte besonders hervorgehobenwerden. Außerdem können die Farben verändert werden. Ein Beispiel:

Sub SparkLineLinieFormatiert()ThisWorkbook.Worksheets("Tabelle8").ActivateWith Range("A11").SparklineGroups

.Add xlSparkLine, "A1:A10"

.Item(1).SeriesColor.ThemeColor = 2

.Item(1).Points.Markers.Visible = True

.Item(1).Points.Markers.Color.ThemeColor = 10

.Item(1).Points.Negative.Visible = True

.Item(1).Points.Negative.Color.ThemeColor = 9

Page 224: Einstieg Mit VBA in Excel

223

Sparklines 7.8

End WithEnd Sub

Zur Erläuterung:

SeriesColor� Zunächst wird die Farbe der Linie verändert. Dies gelingt über dieUntereigenschaft ThemeColor der Eigenschaft SeriesColor des erstenElements der Collection SparklineGroups. Die möglichen Farbenwerden im nachfolgenden Beispiel gezeigt.

Points� Die Datenpunkte bekommen eine sichtbare Markierung in einerbestimmten Farbe. Dazu werden Eigenschaften der Markierungen inder Collection Points.Markers eingestellt. Zunächst die EigenschaftVisible, anschließend die Untereigenschaft ThemeColor der Eigen-schaft Color.

Das Ergebnis sehen Sie, etwas vergrößert, in Abbildung 7.29.

Abbildung 7.29 Sparkline, formatiert

7.8.5 Alle Farben

Alle FarbenEine Übersicht aller Farben für Balken (und Linien) bei Sparklines bietetdas nachfolgende Programm:

Sub SparkLineFarben()Dim i As Integer

ThisWorkbook.Worksheets("Tabelle8").ActivateFor i = 1 To 11

Cells(i + 13, 1).SparklineGroups.Add _xlSparkColumn, "A1:A10"

Cells(i + 13, 1).SparklineGroups.Item(1). _SeriesColor.ThemeColor = i

Next i

Cells(14, 1).Interior.Color = vbBlackEnd Sub

Page 225: Einstieg Mit VBA in Excel

224

Diagramme und Grafiken7

Zur Erläuterung:

� Die Farben sind von 1 bis 11 nummeriert.

� Zur deutlicheren Darstellung hat die Zelle mit den weißen Balkeneinen schwarzen Hintergrund.

Das Ergebnis sehen Sie in Abbildung 7.30.

Abbildung 7.30 Sparkline, alle Farben

7.9 SmartArt

Mit Hilfe von SmartArt-Grafiken lassen sich Beziehungen, Prozessabläufeoder Hierarchien schnell und übersichtlich darstellen. Ein Beispiel sehenSie in Abbildung 7.31.

Abbildung 7.31 Einfache Blockliste

Für VBA ist eine SmartArt-Grafik eine Gruppe von Shapes. Die Eigen-schaften der Shapes können allerdings nur gelesen, nicht verändert wer-den. Diese Möglichkeit gibt es erst seit Excel 2007.

Page 226: Einstieg Mit VBA in Excel

225

SmartArt 7.9

Nachfolgend ein Programm, das die Position der einzelnen Blöcke aus-gibt:

Sub SmartArtLesen()Dim i As IntegerDim s As StringDim sh As Shape

' Erstes SmartArt-Objekt auswählenSet sh = ThisWorkbook.Worksheets("Tabelle9").Shapes(1)

' Ort aller Elemente des SmartArt-ObjektsFor i = 1 To sh.GroupItems.Count

s = s & Int(sh.GroupItems(i).Top) & _" " & Int(sh.GroupItems(i).Left) & vbCrLf

Next iMsgBox s

End Sub

Zur Erläuterung:

GroupItems� Die Collection GroupItems umfasst alle Elemente der Gruppe.

� Ein einzelnes Element der Gruppe kann über einen Index angespro-chen werden.

� Die Eigenschaften Top und Left der einzelnen Blöcke werden gesam-melt und ausgegeben, siehe Abbildung 7.32.

Abbildung 7.32 Ausgabe der Positionen

Page 227: Einstieg Mit VBA in Excel
Page 228: Einstieg Mit VBA in Excel

227

VBA und Excel bieten eine Vielzahl von vordefinierten Funktio-nen für viele Anwendungsbereiche.

8 VBA- und Worksheet-Funktionen

In diesem Kapitel dreht sich alles um Funktionen – zunächst eine Zusam-menstellung der verschiedenen Arten. Die ersten drei sind bereitsbekannt:

Tabellenfunk-tionen

� Tabellenfunktionen:

� Sie können (ohne VBA) in Excel statisch in Tabellenblättern einge-tragen werden. Sie ermitteln Ergebnisse und schreiben diese in dieZellen.

� Sie können in VBA dynamisch der Eigenschaft Formula bzw. For-mulaLocal eines Zellbereichs zugewiesen werden. Sie ermittelnErgebnisse und schreiben diese in die Zellen, allerdings abhängigvon VBA-Anwendungen.

VBA-Funktionen� VBA-Funktionen:

� Sie können in VBA eingesetzt werden. Sie ermitteln Ergebnisse,die innerhalb der VBA-Anwendungen genutzt werden können.

� Eine Zusammenstellung nach Kategorien findet sich in der Hilfeunter Visual Basic-Sprachverzeichnis im Eintrag Indizes und Listen.

Eigene Funktionen� Eigene Funktionen:

� Sie können vom Entwickler in VBA programmiert werden.Anschließend können sie zum Modularisieren der eigenen VBA-Programme und zum statischen Einsatz in Tabellenblättern (wieTabellenfunktionen) genutzt werden.

Worksheet-Funktionen

� Worksheet-Funktionen:

� Sie sind den Tabellenfunktionen der verschiedenen Kategorien(Finanzmathematik, Datum und Zeit, Statistik ...) sehr ähnlich,

Page 229: Einstieg Mit VBA in Excel

228

VBA- und Worksheet-Funktionen8

können aber, wie VBA-Funktionen, nur innerhalb der VBA-Anwendungen genutzt werden.

� Eine Übersicht finden Sie für Excel 2010 bzw. 2007 in der Hilfeunter Excel 2010- bzw. Excel 2007-Entwicklerreferenz. In derObjektmodellreferenz steht das Objekt WorksheetFunction mit sei-nen Elementen.

Kategorien Die große Menge der Tabellenfunktionen, VBA-Funktionen und Work-sheet-Funktionen ist in Kategorien unterteilt. Einige sehen Sie in Tabelle8.1.

8.1 Eingaben des Benutzers

Fehler desBenutzers

Die Zellen eines Tabellenblatts oder die Textfelder in einem Dialogfeld(siehe Abschnitt 10.2, »Eigene Dialogfelder und Anwendungen«) bietendie Möglichkeit, Eingaben des Benutzers entgegenzunehmen. Allerdingskönnte der Benutzer auch an anderen, unerwünschten Stellen des Tabel-lenblatts oder des Dialogfelds arbeiten.

Benutzer steuern Wenn Sie den Benutzer unbedingt zu einer Eingabe zu einem bestimm-ten Zeitpunkt veranlassen möchten, ihn also stärker steuern möchten,dann können Sie mit einem Eingabe-Dialogfeld arbeiten. In VBA gibt esdazu zwei Funktionen:

Funktionskategorie Beschreibung

Datenfelder Erstellen, Initialisieren und Bearbeiten von Datenfeldern

Datentypen Festlegen, Konvertieren und Überprüfen von Datentypen

Datum und Zeit Umwandeln und Verwenden von Datum/Zeit-Ausdrücken (siehe Abschnitt 8.4, »Datum und Uhrzeit«)

Datei-Eingabe und-Ausgabe

Zugreifen, Lesen, Schreiben und Verwalten von Dateien (siehe Abschnitte 9.1, »Textdateien, Import und Export«, und 9.2, »Arbeiten mit Dateien«)

Finanzmathematik Durchführen von finanzmathematischen Berechnungen

Mathematik Durchführen von trigonometrischen und weiteren mathe-matischen Berechnungen

Verzeichnisse und Dateien

Steuern des Dateisystems und Verarbeiten von Dateien

Zeichenketten Verarbeiten von Zeichenketten (siehe Abschnitt 8.3, »Zeichenketten«)

Tabelle 8.1 Einige Kategorien der Funktionen

Page 230: Einstieg Mit VBA in Excel

229

Eingaben des Benutzers 8.1

� Die Funktion InputBox() zur Erzeugung einer einfachen Eingabe.

� Die Methode Application.InputBox() zur Erzeugung einer komfor-tablen, geprüften Eingabe.

8.1.1 Funktion »InputBox«

Einfache EingabeDer Rückgabewert der Funktion InputBox() ist eine Zeichenkette. DasEingabefeld kann mit einem Default-Wert vorbelegt werden. Dies kannzur Hilfestellung oder zur schnelleren Verarbeitung dienen. Damit derBenutzer weiß, was und warum er etwas eingeben soll, können ein Titelund eine Eingabeaufforderung angezeigt werden. Ein Beispiel:

Sub EingabeEinfach()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A1").Value = InputBox _

("Bitte geben Sie Ihren Namen ein", _"Ihr Name", "Maier")

End Sub

Das Ergebnis:

Abbildung 8.1 Einfache InputBox

Zur Erläuterung:

� Es erscheint ein Dialogfeld mit Text, Titel und einem Vorgabewert.

� Falls der Benutzer den Button OK betätigt, wird der Text zurückgege-ben, der im Eingabefeld steht. Im vorliegenden Beispiel wird er in derZelle A1 ausgegeben.

Abbruch� Falls der Benutzer den Button Abbrechen betätigt, wird eine leere Zei-chenkette zurückgegeben.

8.1.2 Methode »Application.InputBox«

Geprüfte EingabeDer Rückgabewert der Methode Application.InputBox() hängt vomgewählten Typ ab. Als Typ können Sie z. B. Zahl, Formel, Zellbezug, Text

Page 231: Einstieg Mit VBA in Excel

230

VBA- und Worksheet-Funktionen8

oder Wahrheitswert wählen. Falls der Benutzer den Button Abbrechen

betätigt, wird False zurückgegeben; dies können Sie zur weiterenAblaufsteuerung nutzen.

Type:= ... Wie beim einfachen Eingabefeld könnten Sie einen Default-Wert undeinen Titel vorgeben. Der Typ der InputBox wird mit dem letzten Para-meter festgelegt, daher wird in den Beispielen mit benannten Parame-tern gearbeitet.

Eingabe einer Zahl

Zahl eingeben Ein Beispiel für die Eingabe einer Zahl (Typ 1):

Sub EingabeZahl()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A1").Value = Application.InputBox _

(Prompt:="Zahl:", Type:=1)End Sub

Das Ergebnis:

Abbildung 8.2 Eingabe einer Zahl

Zur Erläuterung:

� Falls der Benutzer eine gültige Eingabe macht, dann wird diese imvorliegenden Beispiel in der Zelle A1 ausgegeben.

Gültigkeit � Gültige Zahlen sind z. B. »5,7« oder »5e2« (= 5 mal 102 = 500) oder»0,57«. Ungültige Zahlen sind z. B. »5a7« oder »a57«. Die Eingabe von»5.7« ist gültig und ergibt den 05. Juli des aktuellen Jahres.

Eingabewiederholen

� Falls der Benutzer keine gültige Eingabe macht, wird er darauf auf-merksam gemacht. Das Eingabefeld bleibt erhalten; er muss noch ein-mal eingeben:

Hinweis

Excel-Versionen vor Excel 2007 reagieren auf den Aufruf dieser Methodenicht stabil. Sie melden sich nach dem Aufruf der Methode gelegentlich»völlig ab«, ohne dem Benutzer eine Eingabemöglichkeit zu bieten.

Page 232: Einstieg Mit VBA in Excel

231

Eingaben des Benutzers 8.1

Abbildung 8.3 Ungültige Zahl

Eingabe einer Formel

Formel eingebenEin Beispiel für die Eingabe einer Formel (Typ 0):

Sub EingabeFormel()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A1").Value = Application.InputBox _

(Prompt:="Formel:", Type:=0)End Sub

Das Ergebnis:

Abbildung 8.4 Bereich mit der Maus ausgewählt

Zur Erläuterung:

Zellbezüge� Der Benutzer hat die Möglichkeit, Formeln mit Zellbezügen einzuge-ben. Diese können auch nicht zusammenhängende Bereiche umfas-sen.

� Die Eingabe von =SUMME(B1:B3) führt dazu, dass diese Formel zumInhalt der Zelle A1 wird und das erwartete Rechenergebnis in derZelle A1 ausgegeben wird.

Eingabe per Maus� Beginnt der Benutzer seine Eingabe mit =SUMME(, dann kann er den zusummierenden Zellbezug auch mit der Maus bzw. mit den Pfeiltastenauswählen. Anschließend muss er nur noch die Klammer schließen.

Page 233: Einstieg Mit VBA in Excel

232

VBA- und Worksheet-Funktionen8

Gültigkeit � Eine ungültige Formel führt wie erwartet zur Ausgabe einer Fehler-meldung in der Zielzelle (#WERT? oder #NAME?).

Eingabe eines Zellbereichs

Zellbereicheingeben

Ein Beispiel für die Eingabe eines Zellbereichs (Typ 8):

Sub EingabeZellbereich()Dim RG As RangeThisWorkbook.Worksheets("Tabelle1").ActivateSet RG = Application.InputBox _

(Prompt:="Zellbereich:", Type:=8)RG.Borders.LineStyle = xlContinuous

End Sub

Falls der Benutzer den in Abbildung 8.5 dargestellten Bereich mit derMaus eingibt …

Abbildung 8.5 Ausgewählter Bereich

… wird der in Abbildung 8.6 dargestellte Rahmen erzeugt.

Abbildung 8.6 Rahmen für ausgewählten Bereich

Zur Erläuterung:

Objektvariable � Es wird zunächst eine Objektvariable für einen Range deklariert.

Eingabe per Maus � Der Benutzer hat die Möglichkeit, Zellbereiche sowohl per Tastaturals auch per Maus einzugeben. Die Zellbereiche können auch nichtzusammenhängende Bereiche umfassen.

Page 234: Einstieg Mit VBA in Excel

233

Einfacher Dialog mit dem Benutzer 8.2

� Der Zellbereich wird zurückgeliefert und in der Objektvariablengespeichert.

� Anschließend können weitere Aktionen für diesen Zellbereich ausge-führt werden, wie z. B. eine Formatierung oder eine Berechnung.

8.2 Einfacher Dialog mit dem Benutzer

MsgBox()Zur Darstellung einfacher Anzeigen oder Warnungen sowie für Benut-zer-Abfragen muss kein aufwändiges Dialogfeld erzeugt und program-miert werden. Die Funktion MsgBox(), die wir in ihrer einfachen Versionbereits kennengelernt haben, bietet eine Reihe von vorgefertigten Dia-logfeldern, mit denen Sie bereits viele alltägliche Aufgaben erledigenkönnen. Es folgt eine Reihe von typischen Szenarien.

8.2.1 Button »OK«

Button »OK«Zunächst der Code:

Sub MsgBoxOkOnly()MsgBox "Gelesen? Dann bitte Ok drücken", vbOKOnly, "Ok"

End Sub

Das Ergebnis:

Abbildung 8.7 OK-Button

Zur Erläuterung:

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

Hinweis

Für den Parameter Type der Methode Application.InputBox() gibt esneben den erläuterten Werten 1 (Zahl), 0 (Formel) und 8 (Zellbereich) zumBeispiel noch die Werte 2 (Text) und 4 (Wahrheitswert).

Page 235: Einstieg Mit VBA in Excel

234

VBA- und Worksheet-Funktionen8

vbOKOnly � Der zweite Parameter ist optional und wurde bisher noch nicht benö-tigt. Mit diesem Parameter wird das Aussehen und Verhalten des Dia-logfelds gesteuert. Im vorliegenden Fall wird mit Hilfe der KonstantenvbOkOnly nur der Button OK dargestellt – dies ist zugleich der Standard.

Titel � Der dritte Parameter ist ebenfalls optional und dient zur Angabe desDialogfeldtitels. Wird er nicht angegeben, so steht hier der Name derAnwendung.

8.2.2 Buttons – eine Übersicht

Die weiteren Beispiele in diesem Abschnitt nutzen die Möglichkeiten fürdas Aussehen und Verhalten des Dialogfelds, die in Tabelle 8.2 darge-stellt werden.

Operatoren Or, + Eine Button-Kombination kann durch den Operator Or mit einem Bild undeinem DefaultButton-Verhalten verknüpft werden. Ein Beispiel: Abort-RetryIgnore wird mit Exclamation und DefaultButton2 verknüpft. Stattdes Operators Or können Sie auch den Operator + verwenden.

Rückgabewert Wenn mehr als ein Button eingeblendet wird, muss der Rückgabewertder Funktion MsgBox() (also die Antwort des Benutzers) mit Hilfe einer

Buttons Erläuterung

AbortRetryIgnore drei Buttons: Abbrechen, Wiederholen, Ignorieren

Critical Bild, das eine kritische Warnung visuell unterstützt

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

Legt fest, welcher Button ausgeführt wird, wenn der Benut-zer nur die Taste (Enter) betätigt – normalerweise ist dies der erste Button.

Exclamation Bild, das einen deutlichen Hinweis mit einem Ausrufezeichen visuell unterstützt

Information Bild, das einen einfachen Hinweis mit einem Info-Zeichen visuell unterstützt

Question Bild, das eine Frage mit einem Fragezeichen visuell unter-stützt

RetryCancel zwei Buttons: Wiederholen, Abbrechen

SystemModal Dialogfeld bleibt immer im Vordergrund, auch wenn der Benutzer die Anwendung wechselt.

YesNo zwei Buttons: Ja, Nein

YesNoCancel drei Buttons: Ja, Nein, Abbrechen

Tabelle 8.2 Einige Möglichkeiten für Buttons

Page 236: Einstieg Mit VBA in Excel

235

Einfacher Dialog mit dem Benutzer 8.2

Verzweigung ausgewertet werden. Der Rückgabewert ist eine ganzeZahl. Damit Sie sich nicht die Zahlen merken müssen, gibt es festgelegteKonstanten, die diese Zahlen repräsentieren. Ihre Namen sind selbst-erklärend: vbAbort, vbCancel, vbIgnore, vbNo, vbOK, vbRetry und vbYes.

8.2.3 Zeichen »Information«

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

Abbildung 8.8 Info-Zeichen

Der zugehörige Code lautet:

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

End Sub

Zur Erläuterung:

� Ein Bild (hier der Buchstabe i für »Information«) kann auch allein ein-gesetzt werden. In diesem Fall wird die einfache MsgBox mit dem But-ton OK dargestellt.

8.2.4 System-modal

ModalEin Beispiel mit einem system-modalen Ausgabefeld:

Abbildung 8.9 System-modales Ausgabefeld liegt vor Anwendung Word.

Page 237: Einstieg Mit VBA in Excel

236

VBA- und Worksheet-Funktionen8

Der zugehörige Code lautet:

Sub MsgBoxSystemModal()MsgBox "Das müssen Sie unbedingt lesen", _

vbOKOnly Or vbSystemModal, "Ganz vorne"End Sub

Zur Erläuterung:

vbSystemModal � Der Button OK und die Eigenschaft system-modal werden durch Ormiteinander verknüpft. Das Dialogfeld bleibt immer im Vordergrund,auch wenn der Benutzer die Anwendung wechselt.

8.2.5 Buttons »Ja« und »Nein«

Ein Beispiel mit den Buttons Ja und Nein:

Abbildung 8.10 Fragezeichen, Buttons Ja und Nein

Der zugehörige Code lautet:

Sub MsgBoxYesNo()If MsgBox("Soll die Datei gesichert werden?", _

vbYesNo Or vbQuestion, "Sicherung") = vbYes ThenMsgBox "Sie wollen die Datei sichern"

ElseMsgBox "Sie wollen die Datei nicht sichern"

End IfEnd Sub

Zur Erläuterung:

Ja oder Nein � Die beiden Buttons Ja und Nein werden mit dem Fragezeichen ver-knüpft.

Verzweigung � Der Benutzer muss die Frage beantworten. Die Antwort wird mitHilfe einer Verzweigung ausgewertet.

� Im vorliegenden Programm werden lediglich zwei unterschiedlicheMeldungen ausgegeben. Man könnte mit der Auswertung der beidenAntworten zwei unterschiedliche Abläufe einleiten.

Page 238: Einstieg Mit VBA in Excel

237

Einfacher Dialog mit dem Benutzer 8.2

Eine mögliche Antwort:

Abbildung 8.11 Button »Nein« betätigt

8.2.6 Drei Buttons, Default-Button

Ein Beispiel mit Buttons für Ja, Nein und Abbrechen. Diesmal ist derzweite Button der Default-Button:

Abbildung 8.12 Drei Buttons, Default: »Nein«

Der zugehörige Code:

Sub MsgBoxYesNoCancel()Dim Antwort As IntegerAntwort = MsgBox("Soll die Datei gesichert werden?", _

vbYesNoCancel Or vbDefaultButton2, "Sicherung")If Antwort = vbYes Then

MsgBox "Sie wollen die Datei sichern"ElseIf Antwort = vbNo Then

MsgBox "Sie wollen die Datei nicht sichern"Else

MsgBox "Sie wollen den Vorgang abbrechen"End If

End Sub

Zur Erläuterung:

DefaultButton� Die drei Buttons Ja, Nein und Abbrechen werden verknüpft mit demVerhalten DefaultButton2. Betätigt der Benutzer also die Taste (¢),so entspricht dies der Antwort Nein bzw. dem zweiten Button.

� Da der Benutzer drei Möglichkeiten hat, muss seine Antwort gespei-chert werden.

Page 239: Einstieg Mit VBA in Excel

238

VBA- und Worksheet-Funktionen8

MehrfacheVerzweigung

� Die Antwort wird anschließend mit Hilfe einer mehrfachen Verzwei-gung ausgewertet.

8.2.7 Buttons »Wiederholen« und »Abbrechen«

Kritische Warnung Ein Beispiel mit den Buttons Wiederholen und Abbrechen sowie demZeichen für kritische Warnung:

Abbildung 8.13 Zwei Buttons, Warnung

Der zugehörige Code lautet:

Sub MsgBoxRetryCancel()If MsgBox("Beim Sichern der Datei trat ein Fehler auf." _

& vbCrLf & "Wollen Sie es noch einmal probieren?" _& vbCrLf & "Wollen Sie den Vorgang abbrechen?", _vbRetryCancel Or vbCritical, _"Fehler bei Sicherung") = vbRetry Then

MsgBox "Sie wollen es noch einmal probieren"Else

MsgBox "Sie wollen den Vorgang abbrechen"End If

End Sub

Zur Erläuterung:

� Die beiden Buttons Wiederholen und Abbrechen werden mit demZeichen für kritische Warnung verknüpft.

8.2.8 Buttons »Abbrechen«, »Wiederholen« und »Ignorieren«

Achtung Abbildung 8.14 zeigt ein Beispiel mit den drei Buttons Abbrechen, Wie-

derholen und Ignorieren sowie dem Zeichen für Achtung. Der zugehö-rige Code lautet:

Sub MsgBoxAbortRetryIgnore()Dim Antwort As IntegerAntwort = MsgBox("Beim Sichern trat ein Fehler auf." _

Page 240: Einstieg Mit VBA in Excel

239

Zeichenketten 8.3

& vbCrLf & "Wollen Sie den Vorgang abbrechen?" _& vbCrLf & "Wollen Sie den Vorgang wiederholen?" _& vbCrLf & "Wollen Sie die Info ignorieren?", _vbAbortRetryIgnore Or vbExclamation, _"Fehler bei Sicherung")

If Antwort = vbAbort ThenMsgBox "Sie wollen den Vorgang abbrechen"

ElseIf Antwort = vbRetry ThenMsgBox "Sie wollen den Vorgang wiederholen"

ElseMsgBox "Sie wollen die Info einfach ignorieren"

End IfEnd Sub

Abbildung 8.14 Drei Buttons, Achtung

Zur Erläuterung:

� Die drei Buttons Abbrechen, Wiederholen und Ignorieren werdenmit dem Zeichen für einen deutlichen Hinweis verknüpft.

8.3 Zeichenketten

Aus der Vielzahl der Zeichenkettenfunktionen sollen im nachfolgendenBeispiel stellvertretend einige VBA- und Worksheet-Funktionen erläutertwerden.

TeilzeichenketteEs werden der Inhalt und die Position einer Teilzeichenkette ermittelt.Außerdem wird eine Teilzeichenkette durch eine andere ersetzt. Neh-men wir an, die beiden Zellen A1 und A2 haben folgenden Inhalt:

Sub Zeichenketten()Dim s As StringDim pos As IntegerDim such As StringDim lg As Integer

Page 241: Einstieg Mit VBA in Excel

240

VBA- und Worksheet-Funktionen8

ThisWorkbook.Worksheets("Tabelle1").Activates = Range("A1").Valuesuch = Range("A2").Valuelg = Len(such)

' VBA-FunktionenMsgBox "Erste drei Zeichen: " & Left(s, 3)MsgBox "Position von " & such & ": " & InStr(s, such)

' Worksheet-Funktionenpos = Application.WorksheetFunction.Search(such, s)MsgBox "Position von " & such & ": " & posMsgBox Application.WorksheetFunction.Replace _

(s, pos, lg, "WELT")End Sub

Abbildung 8.15 Zwei Zeichenketten

Zur Erläuterung:

� In der Variablen s wird die zu untersuchende Zeichenkette aus derersten Tabellenzelle gespeichert.

� In der Variablen such wird die gesuchte Teilzeichenkette aus derzweiten Tabellenzelle gespeichert.

Len() � Die VBA-Funktion Len() ermittelt die Länge einer Zeichenkette,inklusive aller Leerzeichen.

Left(), Right(),Mid()

� Die VBA-Funktion Left() liefert eine Teilzeichenkette, beginnendmit dem ersten Zeichen. Die Länge der Teilzeichenkette muss angege-ben werden. Auf die gleiche Art und Weise können Sie mit den VBA-Funktionen Right() und Mid() Teilzeichenketten vom Ende oder ausder Mitte extrahieren.

Abbildung 8.16 Ergebnis von Left()

Page 242: Einstieg Mit VBA in Excel

241

Zeichenketten 8.3

InStr()� Die VBA-Funktion InStr() ermittelt die Position einer gesuchtenTeilzeichenkette. Das erste Zeichen hat die Position 1.

Search()� Die Worksheet-Funktion Search() macht das Gleiche wie InStr().Bei InStr() können Sie aber noch die Art des Vergleichs wählen.

Abbildung 8.17 Ergebnis von InStr() bzw. Search()

Replace()� Die Worksheet-Funktion Replace() dient zum Ersetzen einer Teilzei-chenkette durch eine andere. Es werden folgende Parameter benötigt:

� Original-Zeichenkette

� Position, ab der ersetzt werden soll

� Anzahl der Zeichen, die ersetzt werden sollen

� neue Teilzeichenkette, die anstelle der alten Teilzeichenkette ein-gesetzt werden soll

Abbildung 8.18 Ergebnis von Replace()

8.3.1 Zeichenketten umwandeln

Erkennen, umwandeln

In Tabellenzellen können bekanntlich Zeichenketten oder Zahlen stehen.Zahlen können auch als Datumsangaben formatiert sein. Die Zellinhaltekönnen Sie in Variablen des passenden Datentyps umwandeln, wennman Sie ihren Typ bzw. ihre Formatierung erkennen. Zur Erkennungkönnen Sie die Funktionen IsNumeric() und IsDate() nutzen, zurUmwandlung die Funktionen CDbl() und CDate(). Ein Beispiel:

Sub Umwandeln()Dim x As DoubleDim d As DateDim s As StringDim i As Integer

Page 243: Einstieg Mit VBA in Excel

242

VBA- und Worksheet-Funktionen8

ThisWorkbook.Worksheets("Tabelle1").Activate

For i = 1 To 4If IsNumeric(Cells(i, 2).Value) Then

x = CDbl(Cells(i, 2).Value)Cells(i, 3).Value = "Zahl"

ElseIf IsDate(Cells(i, 2).Value) Thend = CDate(Cells(i, 2).Value)Cells(i, 3).Value = "Datum"

Elses = Cells(i, 2).ValueCells(i, 3).Value = "Zeichenkette"

End IfNext i

End Sub

Das Ergebnis:

Abbildung 8.19 Datentypen feststellen und umwandeln

Zur Erläuterung:

IsNumeric(),CDbl()

� Falls die Funktion IsNumeric() feststellt, dass der Zellinhalt eine Zahlist, dann wird er mit der Funktion CDbl() in eine Double-Variableumgewandelt.

IsDate(), CDate() � Wird mit Hilfe der Funktion IsDate() festgestellt, dass es sich umeine Datumsangabe handelt, dann wird der Zellinhalt mit der Funk-tion CDate() in eine Variable vom Typ Date umgewandelt.

� Ansonsten wird der Zellinhalt einer String-Variablen zugewiesen.

� Anschließend kann die Anwendung mit den Variablen des korrektenDatentyps weiterarbeiten.

8.3.2 Ausgabeformatierung

Format() Die Eigenschaft NumberFormatLocal zur landesspezifischen Formatie-rung von Zahlen- und Datumsangaben in Tabellenzellen wurde bereitsvorgestellt. Zahlen, Datumsangaben und Texte können mit der Zeichen-

Page 244: Einstieg Mit VBA in Excel

243

Zeichenketten 8.3

kettenfunktion Format() auch für Ausgaben in Dialogfeldern passendformatiert werden.

Bisher ist als Dialogfeld nur die Funktion MsgBox() bekannt. Die nachfol-gend vorgestellten Möglichkeiten gelten aber für alle Arten von Dialog-feldern. Sie werden besonders für die eigenen Dialogfelder (sieheAbschnitt 10.2, »Eigene Dialogfelder und Anwendungen«) häufiggenutzt.

Einige Beispiele:

Sub Formatieren()Dim x As Single, y As SingleDim d As Date

' Dezimalstellenx = 13 / 7MsgBox Format(x, "0.00")

' Angaben in Prozentx = 1 / 7MsgBox Format(x, "0.00 %")

' Texte, Tausenderpunktx = 1399.95y = 29.95MsgBox Format(x, "#,##0.00 €") & _

vbCrLf & Format(y, "#,##0.00 €")

' Datumsangabed = "12.4.2010"MsgBox d & vbCrLf & Format(d, "d.m.yy") & _

vbCrLf & Format(d, "dddd, dd.mm.") & _vbCrLf & Format(d, "dd. mmmm yyyy")

End Sub

Zur Erläuterung:

� Der zweite Parameter der Funktion Format() ist eine Zeichenkette.Darin wird das gewünschte Format in englischer Schreibweise ange-geben.

� Das Zeichen 0 steht für einzelne Ziffern. Die betreffende Ziffer wirdimmer dargestellt. Die Dezimalstellen werden durch einen Punktabgetrennt. Es wird auf die angegebene Zahl von Dezimalstellengerundet.

Page 245: Einstieg Mit VBA in Excel

244

VBA- und Worksheet-Funktionen8

Abbildung 8.20 Zahl mit zwei Nachkommastellen

Prozentzeichen � Das Prozentzeichen sorgt dafür, dass die Zahl durch 100 geteilt undmit einem Prozentzeichen dargestellt wird.

Abbildung 8.21 Der Wert 1/7 als Prozentzahl

Ziffer eventuelldarstellen

� Das Zeichen # steht für einzelne Ziffern, aber nur, falls die Zahl dieentsprechende Größe hat. Das Komma sorgt für die Darstellung desTausenderpunkts. Text, z. B. Währungsangaben, können zusammenmit der Zahl ausgegeben werden.

Rechtsbündig

Abbildung 8.22 Tausenderpunkt, Text

Datumformatieren

� Das Standardausgabeformat für Datumsangaben (ohne spezielleAngabe) ist dd.mm.yyyy, also zwei Ziffern für den Tag, zwei Ziffern fürden Monat und vier Ziffern für das Jahr. Das Format dddd führt zur

Hinweis

Eine rechtsbündige Darstellung der Zahlen ist möglich. Da der Text in einerMsgBox allerdings in einer Proportionalschriftart ausgegeben wird (die Zei-chen sind unterschiedlich breit), würde dies nicht dazu führen, dass dieKommata verschieden großer Zahlen genau untereinander stehen. Dies istaber innerhalb von Steuerelementen in eigenen Dialogfeldern möglich (sieheAbschnitt 10.2, »Eigene Dialogfelder und Anwendungen«).

Page 246: Einstieg Mit VBA in Excel

245

Zeichenketten 8.3

Ausgabe des Tagesnamens, mit Hilfe von yyyy können Sie denMonatsnamen ausgeben.

Abbildung 8.23 Datumsformatierung

8.3.3 Datensätze zusammenfügen

Join()Für einen Export von Daten ist es häufig notwendig, die Datensätze vor-her zusammenzufügen. Dies übernimmt die Funktion Join(). Sie wan-delt ein eindimensionales Datenfeld in eine Zeichenkette um. Die einzel-nen Daten eines Datensatzes werden dabei durch definierte Zeichengetrennt. Ein Beispiel:

Sub DatensaetzeZusammenfuegen()Dim i As IntegerDim T(1 To 3) As StringThisWorkbook.Worksheets("Tabelle3").Activate

For i = 1 To 3T(i) = Cells(1, i).Value

Next iCells(2, 1).Value = Join(T, "#")

End Sub

Das Ergebnis:

Abbildung 8.24 Datenfeld in Zeichenkette umwandeln

Zur Erläuterung:

� Es wird ein Datenfeld mit drei Elementen deklariert.

� Die Daten eines Datensatzes stehen im vorliegenden Beispiel in dreiZellen nebeneinander. Sie werden den einzelnen Feldelementenzugewiesen.

Page 247: Einstieg Mit VBA in Excel

246

VBA- und Worksheet-Funktionen8

Datenfeldumwandeln

� Die Funktion Join() fügt die Elemente des Datenfelds zu einer Zei-chenkette zusammen, getrennt von dem Zeichen #.

Trennzeichen � Falls kein Trennzeichen angegeben wird, dann wird ein Leerzeichenzum Trennen verwendet.

8.3.4 Datensätze zerlegen

Split() Für einen Import von Daten ist es meist notwendig, die Datensätze vor-her zu zerlegen. Die Funktion Split() kehrt dabei die Arbeitsweise derFunktion Join() um. Sie wandelt eine Zeichenkette in ein eindimensio-nales Datenfeld um. Die einzelnen Daten eines Datensatzes müssen zurErkennung der Bestandteile durch ein definiertes Zeichen getrennt sein.Ein Beispiel:

Sub DatensaetzeZerlegen()Dim i As IntegerDim T() As StringThisWorkbook.Worksheets("Tabelle3").Activate

T = Split(Cells(4, 1).Value, "#")For i = 0 To 2

Cells(5, i + 1).Value = T(i)Next i

End Sub

Das Ergebnis:

Abbildung 8.25 Zeichenkette in Datenfeld umwandeln

Zur Erläuterung:

� Es wird ein dynamisches Datenfeld (mit variabler Größe) deklariert.

Zeichenkettezerlegen

� Die Funktion Split() zerlegt die Zeichenkette und weist das Ergebnisdem Datenfeld zu. Als Trenner wird das Zeichen # genutzt. Das ersteElement hat den Index 0.

Trennzeichen � Falls Sie kein Trennzeichen angeben, wird ein Leerzeichen zumErkennen verwendet.

� Anschließend werden die einzelnen Feldelemente in drei Zellennebeneinander geschrieben. Dabei ist darauf zu achten, dass das ersteElement den Index 0 hat.

Page 248: Einstieg Mit VBA in Excel

247

Datum und Uhrzeit 8.4

8.4 Datum und Uhrzeit

Es gibt zahlreiche VBA- und Worksheet-Funktionen zum Rechnen mitDatum und Uhrzeit. Einige Funktionen werden nachfolgend erläutert.

8.4.1 Zeitintervall addieren

DateAdd()Die VBA-Funktion DateAdd() rechnet zu einer Uhrzeit eine gegebeneAnzahl an Minuten hinzu:

Sub UhrzeitAddieren()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("E3").Value = DateAdd("n", _

Range("E2").Value, Range("E1").Value)Range("E1,E3").NumberFormatLocal = "hh:mm"

End Sub

Das Ergebnis:

Abbildung 8.26 Addition eines Zeitintervalls

Zur Erläuterung:

Zeitintervall addieren

� Die Funktion DateAdd() dient zum Addieren eines Zeitintervalls(zweiter Parameter) zu einer Zeitangabe (dritter Parameter).

Zeiteinheit� Die Einheit des Zeitintervalls wird im ersten Parameter angegeben. Esgibt folgende Möglichkeiten:

� yyyy: Jahr

� q: Quartal

� m: Monat

� y: Tag des Jahres

� d: Tag

� w: Wochentag

� ww: Woche

� h: Stunde

� n: Minute

� s: Sekunde

Page 249: Einstieg Mit VBA in Excel

248

VBA- und Worksheet-Funktionen8

� Im vorliegenden Beispiel wird zur Uhrzeit 15:38 Uhr ein Zeitintervallvon 90 Minuten addiert, das Ergebnis ist 17:08 Uhr. Die beiden Zel-len mit den Uhrzeitangaben werden zusätzlich passend formatiert.

8.4.2 Zeitdifferenz berechnen

DateDiff() Mit Hilfe der VBA-Funktion DateDiff() wird die Differenz von zweiUhrzeiten berechnet:

Sub UhrzeitSubtrahieren()ThisWorkbook.Worksheets("Tabelle1").ActivateRange("F3").Value = DateDiff("n", _

Range("F2").Value, Range("F1").Value)Range("F3").NumberFormatLocal = "0"

End Sub

Das Ergebnis:

Abbildung 8.27 Zeitdifferenz berechnen

Zur Erläuterung:

Zeitdifferenzberechnen

� Die Funktion DateDiff() dient zum Berechnen der Differenz vonzwei Zeitangaben (zweiter und dritter Parameter).

Zeiteinheit � Die Einheit der Zeitdifferenz wird im ersten Parameter angegeben.Dafür gibt es die gleichen Möglichkeiten wie bei DateAdd().

8.4.3 Datumsangaben erstellen, Wochentage markieren

DateSerial() Die Funktion DateSerial() dient zur Erstellung einer Datumsangabe,die Funktion Weekday() zur Feststellung des Wochentags einer Datums-angabe. Nachfolgend werden die beiden Funktionen genutzt, um dieTage des Wochenendes besonders hervorzuheben:

Sub WochenendeHervorheben()Dim i As IntegerDim Datum As Date

ThisWorkbook.Worksheets("Tabelle1").ActivateFor i = 1 To 31

Page 250: Einstieg Mit VBA in Excel

249

Datum und Uhrzeit 8.4

Datum = DateSerial(2010, 3, i)Cells(i, 7).Value = DatumCells(i, 7).NumberFormatLocal = "TT.MM.JJ"

If Weekday(Datum) = 7 ThenCells(i, 7).Interior.Color = vbYellow

ElseIf Weekday(Datum) = 1 ThenCells(i, 7).Interior.Color = vbGreen

ElseCells(i, 7).Interior.Pattern = xlNone

End IfNext i

End Sub

Das Ergebnis:

Abbildung 8.28 Samstag und Sonntag markieren

Zur Erläuterung:

Datum bilden� Es werden alle Daten des Monats März 2010 untereinander aufgelis-tet. Dazu wird eine Schleife von 1 bis 31 durchlaufen. Innerhalb derSchleife wird mit der Funktion DateSerial() jeweils ein Datum gebil-det. Die drei Parameter der Funktion DateSerial() sind: Jahr, Monatund Tag.

� Das Datum wird mit der Eigenschaft NumberFormatLocal formatiertausgegeben.

Weekday()� Die Funktion Weekday() liefert einen der folgenden Werte: 1 = Sonn-tag, 2 = Montag usw. bis 7 = Samstag. Im Beispiel werden Samstageund Sonntage besonders hervorgehoben.

8.4.4 Jahreskalender

Das vorherige Beispiel lässt sich leicht zu einem Jahreskalender erwei-tern. Es kommen zwei Funktionen hinzu:

Page 251: Einstieg Mit VBA in Excel

250

VBA- und Worksheet-Funktionen8

Day() � die VBA-Funktion Day() zur Ermittlung des Tages eines Monats

EoMonth() � die Worksheet-Funktion EoMonth() zur Bestimmung des letztenTages eines bestimmten Monats

Der Code für den Jahreskalender:

Sub Jahreskalender()Dim Tag As Integer, Monat As Integer, Jahr As IntegerDim Datum As Date, DatumErster As DateDim AnzahlTage As Integer

Jahr = Application.InputBox("Bitte ein Jahr eingeben:" _, Type:=1)

' Application.ScreenUpdating = False

Workbooks.addFor Monat = 1 To 12

DatumErster = DateSerial(Jahr, Monat, 1)AnzahlTage = Day(Application.WorksheetFunction. _

EoMonth(DatumErster, 0))

For Tag = 1 To AnzahlTageDatum = DateSerial(Jahr, Monat, Tag)Cells(Tag, Monat).Value = DatumCells(Tag, Monat).NumberFormatLocal = "TT.MM.JJ"

If Weekday(Datum) = 7 ThenCells(Tag, Monat).Interior.Color = vbYellow

ElseIf Weekday(Datum) = 1 ThenCells(Tag, Monat).Interior.Color = vbGreen

End IfNext Tag

Next Monat

' Application.ScreenUpdating = TrueEnd Sub

Zur Erläuterung:

� Als Erstes soll der Benutzer eine Jahreszahl eingeben:

Abbildung 8.29 Eingabe der Jahreszahl

Page 252: Einstieg Mit VBA in Excel

251

Datum und Uhrzeit 8.4

ScreenUpdating� Der Aufbau des Jahreskalenders nimmt anschließend einigeMomente in Anspruch. Sie können den Ablauf etwas schneller gestal-ten, wenn Sie die Bildschirmaktualisierung ausschalten. Dies errei-chen Sie über Application.ScreenUpdating = False. Für weitereAnwendungen müssen Sie am Ende die Bildschirmaktualisierung wie-der einschalten (= True).

� Es wird eine neue Arbeitsmappe für den Jahreskalender angelegt.Diese kann der Benutzer später an der gewünschten Stelle speichern.

� Innerhalb der äußeren Schleife werden alle zwölf Monate des Jahresdurchlaufen.

EoMonth()� Für jeden Monat wird mit Hilfe der Funktion DateSerial() dasDatum des Monatsersten bestimmt. Dieses Datum wird von derWorksheet-Funktion EoMonth() benötigt, um das Datum des Monats-letzten zu bestimmen.

Day(), Month(), Year()

� Die Funktion Day() liefert nur den Tag eines Datums, hier den Tag desMonatsletzten. Damit weiß man, wie viele Tage der betreffendeMonat hat. Es gibt auch die Funktionen Month() und Year(), die nurden Monat bzw. das Jahr eines Datums liefern.

� Die innere Schleife durchläuft jeden Tag des jeweiligen Monats. Mitder Funktion DateSerial() wird jedes einzelne Datum gebildet undin der zugehörigen Zelle formatiert ausgegeben.

Weekday()� Wie im vorherigen Beispiel werden mit Hilfe der Funktion Weekday()die Wochenendtage besonders hervorgehoben.

Das Ergebnis:

Abbildung 8.30 Beginn des Jahreskalenders

Da es die Funktion EoMonth() erst seit Excel 2007 gibt, sehen Sie im fol-genden Code die wichtigen Zeilen der Prozedur Jahreskalender() ineiner Version für Excel-Versionen vor Excel 2007, mit einem Aufruf dereigenen Funktion Monatsende() aus Abschnitt 5.3.3:

Sub Jahreskalender()...

Page 253: Einstieg Mit VBA in Excel

252

VBA- und Worksheet-Funktionen8

Workbooks.Open ThisWorkbook.Path & "\Mappe5.xls"...For Monat = 1 To 12

DatumErster = DateSerial(Jahr, Monat, 1)AnzahlTage = Application.Run _

("Mappe5.xls!Modul1.Monatsende", Jahr, Monat)

For Tag = 1 To AnzahlTage...

Zur Erläuterung:

� Die Excel-Datei Mappe5.xls wird geöffnet.

� Die Funktion Monatsende() aus Modul1 der Datei Mappe5.xls wirdmit den Parametern Jahr und Monat aufgerufen und liefert die Anzahlder Tage des betreffenden Monats.

8.5 Weitere Funktionen

In diesem Abschnitt werden einige Funktionen erläutert, die nicht zuden obengenannten Gruppen gehören.

8.5.1 Anwendung unterbrechen

Timer() Mit Hilfe der VBA-Funktion Timer() wird die Anzahl der Sekunden seitMitternacht berechnet. Sie können diese Funktion dazu nutzen, eineAnwendung zu unterbrechen, siehe folgendes Beispiel:

Sub ZeitVerzoegerung()Dim start As DoubleMsgBox "Nach dem Drücken des Ok-Buttons läuft die Zeit"start = Timer

DoDoEvents

Loop Until Timer > start + 5MsgBox "Das waren 5 Sekunden"

End Sub

Zur Erläuterung:

� Der aktuelle Zeitpunkt wird mit Hilfe der Funktion Timer() in derVariablen start gespeichert.

Page 254: Einstieg Mit VBA in Excel

253

Weitere Funktionen 8.5

Programm wartet� Nach Bestätigung der MsgBox läuft die Zeit. Es wird eine Do-While-Schleife gestartet, die so lange läuft, bis mit der Funktion Timer() einZeitpunkt ermittelt wurde, der 5 Sekunden nach dem Beginn derSchleife liegt.

DoEvents()� Innerhalb der Schleife kann (muss aber nicht) die Funktion DoE-vents() aufgerufen werden. Sie ermöglicht andere Aktionen wäh-rend der Zeit, in der die Schleife läuft.

� Sie können die Funktion DoEvents() dazu verwenden, Berechnungenim Hintergrund auszuführen oder Aktionen des Benutzers (z. B. Tas-tendrucke) abzuwarten.

8.5.2 Einheitenumrechnung

Convert()Die Worksheet-Funktion Convert() bietet eine große Anzahl anUmrechnungsmöglichkeiten für physikalische Einheiten. Es gibt sie erstseit Excel 2007.

PräfixDabei können Sie auch Einheiten mit Präfix nutzen, wie z. B. das »k« fürden Faktor 1.000 wie bei »km«.

Die folgenden vier Zahlenwerte (Angaben für Entfernung, Energie, Tem-peratur und Druck) werden in eine andere Einheit umgerechnet. Gleich-zeitig werden sie zur deutlicheren Darstellung, zusammen mit denErgebnissen der Umrechnung, formatiert:

Abbildung 8.31 Unformatierte Zahlenwerte für Einheitenumrechnung

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

Page 255: Einstieg Mit VBA in Excel

254

VBA- und Worksheet-Funktionen8

' EntfernungRange("A2").Value = Application.WorksheetFunction. _

Convert(Range("A1").Value, "km", "mi")Range("A1").NumberFormatLocal = "0,000 ""Km"""Range("A2").NumberFormatLocal = "0,000 ""Miles"""

' EnergieRange("A5").Value = Application.WorksheetFunction. _

Convert(Range("A4").Value, "J", "cal")Range("A4").NumberFormatLocal = "0,00 ""J"""Range("A5").NumberFormatLocal = "0,000 ""cal"""

' TemperaturRange("A8").Value = Application.WorksheetFunction. _

Convert(Range("A7").Value, "C", "F")Range("A7").NumberFormatLocal = "0,0 ""Grad C"""Range("A8").NumberFormatLocal = "0,0 ""Grad F"""

' DruckRange("A11").Value = Application.WorksheetFunction. _

Convert(Range("A10").Value, "hPa", "mmHg")Range("A10").NumberFormatLocal = "0,000 ""hPa"""Range("A11").NumberFormatLocal = "0,000 ""mm HG"""

End Sub

Zur Erläuterung:

Meter zu Meile � Im ersten Fall wird eine Entfernungsangabe aus Metern in britischeMeilen umgerechnet. Dazu sind die Angaben km und mi in Parameter2 und 3 notwendig. Der Präfix k sorgt dafür, dass der Wert in Kilome-tern angenommen wird.

Abbildung 8.32 Meter zu Meile

Joule zu Kalorie � Eine Energieangabe wird im zweiten Fall aus Joule in Kalorie umge-rechnet. Dazu sind die Angaben J und cal in Parameter 2 und 3 not-wendig.

Page 256: Einstieg Mit VBA in Excel

255

Weitere Funktionen 8.5

Abbildung 8.33 Joule zu Kalorie

Celsius zu Fahrenheit

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

Abbildung 8.34 Celsius zu Fahrenheit

Luftdruck� Die letzte Umrechnung ermittelt eine (Luft-)Druckangabe in mmQuecksilbersäule (mmHg) aus Hektopascal (hPa). Das h ist dabei der Prä-fix für Hekto, also hundert.

Abbildung 8.35 Pascal zu Millimeter Quecksilbersäule

Text im Format� Alle Zellen wurden passend formatiert. Zur Erinnerung: Eine Textan-gabe innerhalb eines Formats muss in zweifachen doppelten Anfüh-rungsstrichen stehen.

8.5.3 Zahlensystemumrechnung

UmrechnungInsgesamt 12 verschiedene Worksheet-Funktionen helfen (seit Excel2007) bei der Umrechnung zwischen den verschiedenen Zahlensyste-men (dezimal, hexadezimal, binär, oktal). Ihre Funktionsweise soll amBeispiel der Funktionen Dec2Bin() und Dec2Hex() gezeigt werden.

Sub BinaerHexadezimal()Dim i As IntegerThisWorkbook.Worksheets("Tabelle2").Activate

For i = 1 To 10Cells(i, 3).Value = Application. _

WorksheetFunction.Dec2Bin(Cells(i, 2).Value)

Page 257: Einstieg Mit VBA in Excel

256

VBA- und Worksheet-Funktionen8

Cells(i, 4).Value = Application. _WorksheetFunction.Dec2Hex(Cells(i, 2).Value)

Next i

Range("D1:D10").NumberFormatLocal = "x@"Range("D1:D10").HorizontalAlignment = xlRight

End Sub

Das Ergebnis:

Abbildung 8.36 Dezimal, dual, hexadezimal

Zur Erläuterung:

� Es werden die Dezimalzahlen 60 bis 69 in Spalte B umgerechnet.

Dec2Bin(),Dec2Hex()

� In einer Schleife werden die Ergebnisse der UmrechnungsfunktionDec2Bin() in Spalte C, die Ergebnisse der UmrechnungsfunktionDec2Hex() in Spalte D dargestellt.

Präfix »x« � Die hexadezimalen Ziffern stellen für Excel Text dar. Der Text wirdzur deutlicheren Kennzeichnung als hexadezimale Zahl mit dem Prä-fix x versehen und rechtsbündig formatiert.

Formatierung @ Beim Einsatz der Eigenschaft NumberFormatLocal wird die Formatierung@ verwendet. Diese steht für den Zellwert. In diesem Fall wird also ein»x«, gefolgt vom Zellwert, dargestellt.

8.5.4 Zellen zählen

Zelltyp zählen Die beiden Worksheet-Funktionen Count() und CountBlank() sindnützlich, falls Sie feststellen möchten, wie viele Zahlen oder leere Zellensich in einem Zellbereich befinden.

Page 258: Einstieg Mit VBA in Excel

257

Weitere Funktionen 8.5

Sub Zaehlen()ThisWorkbook.Worksheets("Tabelle2").ActivateRange("E6").Value = Application. _

WorksheetFunction.Count(Range("E1:E5"))Range("E10").Value = Application. _

WorksheetFunction.CountBlank(Range("E1:E9"))End Sub

Das Ergebnis:

Abbildung 8.37 Zellen mit Zahlen, leere Zellen

Zur Erläuterung:

Count()� Die Funktion Count() ermittelt, wie viele Zellen des Bereichs E1 bisE5 Zahlen oder Datumsangaben enthalten.

� Im Beispiel trifft dies für die Zellen E1 und E4 zu.

CountBlank()� Die Funktion CountBlank() zählt die Anzahl der leeren Zellen imBereich E1 bis E9.

� Im Beispiel trifft dies für die Zellen E7 bis E9 zu.

Page 259: Einstieg Mit VBA in Excel
Page 260: Einstieg Mit VBA in Excel

259

Der automatisierte Import und Export von Daten aus anderen Anwendungen ist eine besondere Stärke von VBA.

9 Externe Daten

In diesem Kapitel erfahren Sie, wie Sie Daten aus anderen Programmenin Excel importieren bzw. aus Excel in andere Programme exportieren.

9.1 Textdateien, Import und Export

Öffnen, schließenDas Lesen und Schreiben von Textdateien ist im Zusammenhang mitdem Import und Export von Daten aus anderen Anwendungen wichtig.Dazu müssen die Textdateien zu Beginn geöffnet und nach dem Lese-oder Schreibvorgang wieder geschlossen werden.

Fehler abfangenKann eine Datei nicht zum Lesen geöffnet werden, z. B. wegen einer fal-schen Pfadangabe, dann tritt ein Laufzeitfehler auf. Das Gleiche passiert,falls eine Datei nicht zum Schreiben geöffnet werden kann, z. B. auf-grund mangelnder Schreibrechte. Solche Laufzeitfehler sind in der Praxishäufig, daher werden sie in den nachfolgenden Beispielen abgefangen.

9.1.1 Lesen aus Textdateien

Alle Zeilen lesenZunächst das einfache Lesen aller Zeilen aus einer Textdatei. Diese hatfolgenden Inhalt:

Abbildung 9.1 Textdatei mit Zahlen, Daten, Texten

Page 261: Einstieg Mit VBA in Excel

260

Externe Daten9

Sub ZeilenLesen()Dim Zeile As StringDim i As Integer

ThisWorkbook.Worksheets("Tabelle1").ActivateOn Error GoTo Fehler

' Datei öffnen zum LesenOpen ThisWorkbook.Path & "\ein.txt" For Input As 1

i = 1' Solange bis Datei-EndeDo Until EOF(1)

' Zeile lesenLine Input #1, ZeileCells(i, 1).Value = Zeilei = i + 1

Loop

' Datei schließenClose 1Exit Sub

Fehler:MsgBox (Err.Description)

End Sub

Das Ergebnis:

Abbildung 9.2 Importierte Zeilen

Zur Erläuterung:

Open � Die Anweisung Open dient zum Öffnen von Dateien. Im vorliegendenBeispiel wird die Datei ein.txt geöffnet. Beide Dateien, also die Excel-Datei mit diesem Importprogramm und die Textdatei mit den Daten,befinden sich im gleichen Verzeichnis.

Page 262: Einstieg Mit VBA in Excel

261

Textdateien, Import und Export 9.1

Input, Output, Append

� Nach dem Dateinamen folgt der Öffnungsmodus. Bei Textdateien gibtes u. a. Input (zum Lesen), Output (zum Überschreiben) und Append(zum Anhängen).

As Dateinummer� Nach dem Schlüsselwort As folgt eine Dateinummer. Im weiterenVerlauf der Anwendung wird die geöffnete Datei über diese eindeu-tige Dateinummer repräsentiert.

EOF()� Es folgt eine Schleife, die so lange läuft, bis die Funktion EOF() denWert True ergibt. Die Vorgänge in der Schleife werden also so langedurchgeführt, bis das Dateiende (End of File) erreicht ist.

Line Input� Mit der Anweisung Line Input wird eine Zeile aus der Datei 1 bis zumZeilenende gelesen und in der Variablen Zeile gespeichert. DerInhalt dieser Zeile wird anschließend in eine Zelle ausgegeben. Dabeiwerden Zeichenketten, ganze Zahlen und Datumsangaben richtigerkannt. Bei Zahlen mit Nachkommastellen ist zu beachten:

� Wird eine Zahl mit Punkt als Dezimalzeichen aus der Datei gele-sen, so wird sie in Excel als Zahl erkannt und formatiert.

� Wird eine Zahl mit Komma als Dezimalzeichen aus der Datei gele-sen, so wird sie in Excel auch als Zahl erkannt, aber als Text forma-tiert.

� In beiden Fällen kann mit der erkannten Zahl weitergerechnetwerden, unabhängig vom Format.

� Mit Hilfe der Laufvariablen i sorgen Sie dafür, dass die nächste Zeilein der Zelle darunter ausgegeben wird usw.

Close� Zu guter Letzt wird die Datei 1 durch die Anweisung Close wiedergeschlossen.

9.1.2 Import von Datensätzen

Eigenes Import-programm

Sie können einfach aufgebaute Textdateien mit dem Textkonvertierungs-Assistenten von Excel öffnen und die Daten in einem Tabellenblattabspeichern. Falls allerdings noch weitere Programmlogik eingebautwerden muss, um z. B. eine spezielle Datenauswahl durchzuführen, dannkommen Sie nicht an einem eigenen Importprogramm vorbei.

CSV-DateiDas folgende Programm soll als Grundgerüst für ein solches Import-Pro-gramm dienen. Es liest sogenannte CSV-Dateien (CSV = Comma-separa-ted Values). Das sind Textdateien, in denen ein Datensatz pro Zeile steht.Die Daten des Datensatzes sind durch festgelegte Zeichen (z. B. Semiko-lon) voneinander getrennt (siehe Abbildung 9.3).

Page 263: Einstieg Mit VBA in Excel

262

Externe Daten9

Abbildung 9.3 Textdatei mit CSV-Datensätzen

Split() Die Textdatei kann die Dateiendung .txt haben. Häufig wird auch dieDateiendung .csv verwendet. Zum Einlesen der Zeilen kommt das Zerle-gen der Zeilen in die einzelnen Daten hinzu. Dies wird mit der bereitsbekannten Funktion Split() durchgeführt. Anschließend werden dieDaten übersichtlich auf einem Tabellenblatt angeordnet:

Sub DatensaetzeLesen()Dim Zeile As StringDim T() As StringDim i As Integer, k As Integer

ThisWorkbook.Worksheets("Tabelle2").ActivateOn Error GoTo Fehler

' Datei öffnen zum LesenOpen ThisWorkbook.Path & "\eindaten.txt" _

For Input As 1

i = 1' Solange bis Datei-EndeDo Until EOF(1)

' Zeile lesenLine Input #1, Zeile

' Zeile zerlegenT = Split(Zeile, ";")

For k = 0 To UBound(T)Cells(i, k + 1).Value = T(k)

Next ki = i + 1

Loop

' Datei schließenClose 1Range("A:E").Columns.AutoFit

Page 264: Einstieg Mit VBA in Excel

263

Textdateien, Import und Export 9.1

Exit SubFehler:

MsgBox (Err.Description)End Sub

Das Ergebnis:

Abbildung 9.4 Importierte Datensätze

Zur Erläuterung:

Programm-erweiterung

� Die Anwendung ist eine Erweiterung des vorherigen Beispiels »Lesenaus Textdateien«. An dieser Stelle werden nur die zusätzlichen Kom-ponenten erläutert.

� Es wird ein dynamisches Datenfeld deklariert. Dieses wird für dasZerlegen der Zeilen benötigt.

Split()� Nach dem Lesen einer Zeile wird die Zeile mit der Funktion Split()zerlegt und in dem dynamischen Datenfeld gespeichert.

UBound()� Alle Elemente des Datenfelds werden nebeneinander in einzelnenZellen ausgegeben. Die Anzahl der Elemente eines Datensatzes unddamit die Obergrenze des dynamischen Datenfelds werden mit derFunktion UBound() erkannt.

9.1.3 Schreiben in Textdateien

Excel-Daten schreiben

Es folgt zunächst das einfache Schreiben der in Abbildung 9.5 dargestel-ten Excel-Tabelleninhalte in eine Textdatei.

Abbildung 9.5 Daten, die exportiert werden sollen

Page 265: Einstieg Mit VBA in Excel

264

Externe Daten9

Sub ZeilenSchreiben()Dim i As Integer

ThisWorkbook.Worksheets("Tabelle1").ActivateOn Error GoTo Fehler

' Datei öffnen zum SchreibenOpen ThisWorkbook.Path & "\aus.txt" _

For Output As 1

For i = 1 To 5' Zeile schreibenPrint #1, Cells(i, 1).Value

Next i

' Datei schließenClose 1Exit Sub

Fehler:MsgBox (Err.Description)

End Sub

Das Ergebnis:

Abbildung 9.6 Exportierte Daten

Zur Erläuterung:

Open � Die Datei aus.txt im gleichen Verzeichnis wird mit Hilfe von Open undOutput zum Schreiben geöffnet.

Überschreiben � Falls die Datei bereits existiert, wird sie ohne Vorwarnung überschrie-ben!

Append � Mit dem Dateimodus Append statt Output könnten Sie dafür sorgen,dass neue Inhalte ans Ende der Datei angehängt werden.

Print � Die Anweisung Print sorgt für die Ausgabe einer Zeile in die Datei.

Close � Auch nach dem Schreiben muss die Datei mit Close wieder geschlos-sen werden.

Page 266: Einstieg Mit VBA in Excel

265

Textdateien, Import und Export 9.1

9.1.4 Export von Datensätzen

Eigenes Export-programm

Mit Excel ist auch das Abspeichern von Daten aus einem Tabellenblatt ineiner Textdatei möglich. Ähnlich wie beim Import gilt allerdings: Fallsweitere Programmlogik eingebaut werden muss, kommen Sie nicht aneinem eigenen Exportprogramm vorbei.

CSV-DateiDas folgende Programm soll als Grundgerüst für ein solches Export-Pro-gramm dienen. Es schreibt sogenannte CSV-Dateien. Wie bereits erläu-tert: Das sind Dateien mit einem Datensatz pro Zeile. Die Daten desDatensatzes sind durch festgelegte Zeichen (z. B. Semikolon) voneinan-der getrennt.

Join()Das Schreiben von Datensätzen in Textdateien können Sie vereinfachen,indem Sie vorher die Daten zu einer Zeichenkette mit Trennzeichenzusammenfügen. Dazu nutzen Sie die bereits bekannte Funktion Join().Zunächst die Tabelle:

Abbildung 9.7 Tabelle, die exportiert werden soll

Sub DatensaetzeSchreiben()Dim i As Integer, k As IntegerDim T(1 To 5) As String

ThisWorkbook.Worksheets("Tabelle2").ActivateOn Error GoTo Fehler

' Datei öffnen zum SchreibenOpen ThisWorkbook.Path & "\ausdaten.txt" _

For Output As 1

For i = 1 To 3For k = 1 To 5

T(k) = Cells(i, k).ValueNext k' Zusammengefügte Zeile schreibenPrint #1, Join(T, "#")

Next i

Page 267: Einstieg Mit VBA in Excel

266

Externe Daten9

' Datei schließenClose 1Exit Sub

Fehler:MsgBox (Err.Description)

End Sub

Das Ergebnis:

Abbildung 9.8 Exportierte Tabelle als CSV-Datensätze

Zur Erläuterung:

� In einer doppelten Schleife werden alle Daten der Tabelle gelesen.

Join() � Nach jeder Zeile werden die Daten der betreffenden Zeile mit Hilfeder Funktion Join() und einem Trennzeichen (diesmal dem Zeichen#) zusammengefügt.

9.2 Arbeiten mit Dateien

Dateifunktionen Eine Übersicht der Funktionen zum Arbeiten mit Dateien (und Verzeich-nissen) findet sich in der Hilfe unter Visual Basic-Sprachverzeichnis/Indi-zes und Listen im Eintrag Verzeichnis und Datei. Einige wichtige Funktio-nen werden in diesem Abschnitt behandelt.

9.2.1 Dateien suchen und auflisten

Dir() Die Funktion Dir() ist sehr nützlich zum Suchen von Dateien und zumBearbeiten einer Liste von Dateien. In einer ersten Anwendung soll fest-gestellt werden, ob es in dem Verzeichnis, in dem sich die Anwendungbefindet, eine Datei mit dem Namen text.txt gibt:

Sub DateiSuchen()' Suche mit SuchmusterIf Dir(ThisWorkbook.Path & "\test.txt") <> "" Then

MsgBox "Datei test.txt gefunden"Else

Page 268: Einstieg Mit VBA in Excel

267

Arbeiten mit Dateien 9.2

MsgBox "Datei test.txt nicht gefunden"End If

End Sub

Zur Erläuterung:

Suche mit Platzhalter

� Die Funktion Dir() liefert den Namen einer Datei, der dem angege-benen Suchmuster entspricht. Dabei können Sie auch Platzhalter füreinzelne Zeichen (?) oder mehrere Zeichen (*) verwenden.

� Im vorliegenden Beispiel wurde nach einem bestimmten Dateina-men, ohne Platzhalter, gesucht. Der Rückgabewert ist entweder derName der Datei (falls sie existiert) oder eine leere Zeichenkette (fallsdie Datei nicht existiert).

Mit Hilfe der zweiten Anwendung wird eine Liste aller Dateien, dieeinem bestimmten Suchmuster entsprechen, ausgegeben:

Sub DateiListe()Dim DateiName As StringDim Ausgabe As String

' Suche mit SuchmusterDateiName = Dir(ThisWorkbook.Path & "\*.txt")

Ausgabe = ""Do While DateiName <> ""

Ausgabe = Ausgabe & " " & DateiName

' Suche mit ursprünglichem SuchmusterDateiName = Dir

LoopMsgBox Ausgabe

End Sub

Abbildung 9.9 zeigt das Ergebnis.

Abbildung 9.9 Liste der gefundenen Dateien

Page 269: Einstieg Mit VBA in Excel

268

Externe Daten9

Zur Erläuterung:

Mit Suchmuster � Zunächst wird die Funktion Dir() mit einem Parameter aufgerufen.Darin wird angegeben, dass nach Dateien mit der Dateiendung .txtgesucht wird. Der Name der ersten Datei, die dem Suchmuster ent-spricht, wird in der Variablen DateiName gespeichert (z. B. ein.txt).

� Anschließend wird eine Schleife begonnen. Falls eine Datei gefundenwurde, dann ist die Variable DateiName nicht leer, also wird dieSchleife durchlaufen.

� Der ermittelte Name wird in einer Ausgabevariablen gesammelt.

Ohne Suchmuster= altes Suchmuster

� Die Funktion Dir() wird innerhalb der Schleife erneut aufgerufen,diesmal ohne Parameter. Dies führt dazu, dass nach der nächstenDatei gesucht wird, die dem ursprünglichen Suchmuster entspricht.

� Auf diese Weise wird die Schleife so lange durchlaufen, bis alleDateien, die dem gleichen Suchmuster entsprechen, erfasst wurden.

� Zu guter Letzt werden alle aufgesammelten Dateinamen ausgegeben.

9.2.2 Informationen über Dateien

Datei-informationen

Es gibt eine Reihe von Funktionen, die Informationen über Dateienermitteln, z. B. Änderungsdatum, Größe oder Dateiattribute. Diese kom-men im nachfolgenden Programm zum Einsatz:

Sub DateiInformationen()Dim DateiName As StringDim DateiNameGanz As StringDim i As IntegerThisWorkbook.Worksheets("Tabelle1").Activate

i = 1

' Suche mit SuchmusterDateiName = Dir(ThisWorkbook.Path & "\*.txt")

Do While DateiName <> ""DateiNameGanz = ThisWorkbook.Path & "\" & DateiName

Cells(i, 1).Value = DateiName

' Letzte ÄnderungCells(i, 2).Value = FileDateTime(DateiNameGanz)Cells(i, 2).NumberFormatLocal = "TT.MM. hh:mm"

Page 270: Einstieg Mit VBA in Excel

269

Arbeiten mit Dateien 9.2

' DateigrößeCells(i, 3).Value = FileLen(DateiNameGanz)Cells(i, 3).NumberFormatLocal = "0 ""Byte"""

' Datei-AttributeIf (GetAttr(DateiNameGanz) And vbReadOnly) > 0 Then

Cells(i, 4).Value = "Ja"Else

Cells(i, 4).Value = "Nein"End If

i = i + 1

' Suche mit ursprünglichem SuchmusterDateiName = Dir

LoopEnd Sub

Das Ergebnis:

Abbildung 9.10 Liste mit Dateiinformationen

Zur Erläuterung:

� Wie im vorherigen Beispiel wird nach Dateien gesucht, die die Datei-endung .txt haben.

� Für die nachfolgenden Funktionsaufrufe wird der vollständige Nameder Datei inklusive Pfad gespeichert.

FileDateTime()� Die Funktion FileDateTime() liefert Datum und Uhrzeit der letztenÄnderung der Datei.

FileLen()� Mit der Funktion FileLen() wird die Größe der Datei in Byte ermittelt.

GetAttr()� Die Funktion GetAttr() dient zur Ermittlung von Datei- und Ver-zeichnisattributen. Sie liefert eine Zahl, in der alle Attribute enthaltensind. Diese Zahl müssen Sie mit Hilfe des And-Operators bitweise mitdem gewünschten Attribut vergleichen. Das Ergebnis des Vergleichsist größer als 0, falls das gewünschte Attribut vorliegt.

Page 271: Einstieg Mit VBA in Excel

270

Externe Daten9

Dateiattribute � Im vorliegenden Beispiel wird untersucht, ob die Datei (oder das Ver-zeichnis) schreibgeschützt ist. Dazu wird mit der Konstanten vbRead-Only verglichen. Andere Konstanten dienen zur Ermittlung der fol-genden Attribute:

� vbHidden: Datei ist versteckt.

� vbSystem: Datei ist Systemdatei.

� vbDirectory: Es handelt sich um ein Verzeichnis.

� vbArchive: Datei wurde seit der letzten Sicherung geändert.

9.2.3 Operationen mit Dateien

Dateioperationen Von VBA aus können einige typische Dateioperationen mit Hilfe vonFunktionen durchgeführt werden. Dabei sollten Sie allerdings sehrumsichtig vorgehen, insbesondere beim Löschen von Dateien.

Im folgenden Beispiel wird eine Datei kopiert, anschließend umbenanntund zuletzt gelöscht. Zwischen den einzelnen Schritten wird zur Kon-trolle jeweils eine Liste der aktuell existierenden Dateien ausgegeben.

Sub DateiOperationen()Dim Pfad As StringPfad = ThisWorkbook.PathOn Error GoTo FehlerDateiListe

' Datei kopierenFileCopy Pfad & "\ein.txt", Pfad & "\kopie.txt"DateiListe

' Datei umbenennen bzw. verschiebenName Pfad & "\kopie.txt" As Pfad & "\andere.txt"DateiListe

' Datei löschenKill Pfad & "\andere.txt"DateiListe

Exit SubFehler:

MsgBox (Err.Description)End Sub

Page 272: Einstieg Mit VBA in Excel

271

Arbeiten mit Dateien 9.2

Zur Erläuterung:

� Zur Kontrolle der aktuell existierenden Dateien wird die eigene Pro-zedur DateiListe() verwendet, die in Abschnitt 9.2.1, »Dateiensuchen und auflisten«, bereits erläutert wurde. Die Dateiliste zuBeginn:

Abbildung 9.11 Ausgangspunkt

FileCopy()� Die Funktion FileCopy() kopiert eine Datei. Falls die Zieldatei bereitsexistiert, wird sie ohne Rückfrage überschrieben!

Abbildung 9.12 Nach der Kopie einer Datei

Name()� Die Funktion Name() dient zur Umbenennung bzw. zum Verschiebeneiner Datei.

� Falls die Zieldatei bereits existiert, wird sie nicht überschrieben. Eskommt zu einem Laufzeitfehler.

� Falls sich die Zieldatei in einem anderen Verzeichnis befindet,wird die Datei verschoben und gegebenenfalls umbenannt.

Abbildung 9.13 Nach dem Umbenennen einer Datei

Kill()� Mit der Funktion Kill() werden eine oder mehrere Dateien, gegebe-nenfalls unter Benutzung eines Platzhalters, ohne Rückfrage gelöscht!

Page 273: Einstieg Mit VBA in Excel

272

Externe Daten9

Abbildung 9.14 Nach dem Löschen einer Datei

9.3 Austausch mit Microsoft Word

EigeneKonvertierung

Sie können Daten zwischen Excel und Word über die Zwischenablageaustauschen. Ebenso ist es möglich, Tabellen aus Excel in Word einzubet-ten usw. Wie bei einfachen Textdateien gilt allerdings: Falls noch weitereProgrammlogik hinzugefügt werden muss, bietet sich ein VBA-Pro-gramm zum Datenaustausch an.

In den folgenden Abschnitten wird zunächst kurz auf das Objektmodellvon Word eingegangen. Anschließend wird gezeigt, wie Sie Word ausExcel heraus starten und auf die Inhalte der Word-Dokumente zugreifen.

9.3.1 Objektmodell von Word

Es gibt Parallelen zwischen den hierarchischen Objektmodellen vonWord und Excel:

Application � Das Hauptobjekt Application steht für die Anwendung Word.

CreateObject() � Mit der Funktion CreateObject() können ActiveX-Objekte erstelltwerden. Für den Zugriff auf Word wird damit ein Objekt vom TypWord.Application erstellt und ein Verweis auf dieses Objekt zurück-geliefert. Über diesen Verweis wird im weiteren Verlauf auf dieWord-Anwendung zugegriffen. Am Ende muss die Word-Anwen-dung wieder beendet werden

Documents � Eine Eigenschaft von Application ist die Auflistung Documents. Dieseenthält alle aktuell geöffneten Dokumente in Word.

Paragraphs � Eine Eigenschaft eines einzelnen Dokuments ist die Auflistung Para-graphs. Sie enthält alle Absätze eines Dokuments.

Tables � Parallel dazu gibt es die Auflistung Tables, die alle Tabellen eines ein-zelnen Dokuments umfasst.

Page 274: Einstieg Mit VBA in Excel

273

Austausch mit Microsoft Word 9.3

Cells� Eine Eigenschaft einer einzelnen Tabelle ist die Auflistung Cells, diealle Zellen der Tabelle enthält. Eine einzelne Zelle kann, ähnlich wiein Excel, über ein Cell-Objekt erreicht werden.

Range� Mit Range wird auch in Word ein Bereich bezeichnet. Dieser kanneinen oder mehrere Absätze ganz oder teilweise umfassen. Ebensokann er Zellen einer Tabelle umfassen.

Bibliothek einbinden

Der Zugriff auf das Objektmodell für Microsoft Word 2010 muss inner-halb der VBE von Excel zunächst eingerichtet werden. Im Menü Extras �Verweise muss dazu die Microsoft Word 14.0 Object Library eingebundenwerden, siehe Abbildung 9.15.

Im Fall von Word 2007 handelt es sich um die Microsoft Word 12.0Object Library. Bei älteren Word-Versionen wird mit der Microsoft Word10.0 Object Library gearbeitet, außerdem haben die Import- und Export-Dateien die Endung .doc statt .docx.

Abbildung 9.15 Word-Objektbibliothek einbinden

9.3.2 Import von Absätzen aus Word

Absätze importieren

Im nächsten Beispiel werden die nachfolgenden Absätze eines Word-Dokuments gelesen und jeweils in einer Zelle eines Excel-Tabellenblattsgespeichert:

Page 275: Einstieg Mit VBA in Excel

274

Externe Daten9

Abbildung 9.16 Word-Datei mit einigen Absätzen

Sub WordAbsatzImport()Dim appWord As Word.ApplicationDim i As IntegerDim tx As String

ThisWorkbook.Worksheets("Tabelle1").Activate

' Anwendung Word startenSet appWord = CreateObject("Word.Application")

' Word sichtbar machen' appWord.Visible = True

' Word-Dokument öffnenappWord.Documents.Open ThisWorkbook.Path & "\ein.docx"

For i = 1 To 6' Text eines Absatzes inkl. Absatzendetx = appWord.ActiveDocument.Paragraphs(i).Range.Text

' Absatzende löschen, Text in Zelle schreibenCells(i, 1).Value = Left(tx, Len(tx) – 1)

Next i

' Anwendung Word beendenappWord.Quit

End Sub

Page 276: Einstieg Mit VBA in Excel

275

Austausch mit Microsoft Word 9.3

Das Ergebnis:

Abbildung 9.17 Importierte Zeilen

Zur Erläuterung:

Word.Application� Die Variable appWord wird als Objekt vom Typ Word.Application(Word-Anwendung) deklariert. Dieser Objekttyp (und alle anderenWord-spezifischen Objekttypen) stehen nur zur Verfügung, wenn dieWord-Bibliothek eingebunden wurde, siehe vorheriger Abschnitt.

CreateObject()� Mit Hilfe der Funktion CreateObject() wird ein Objekt vom TypWord.Application erstellt und ein Verweis auf dieses Objekt zurück-geliefert. Über diesen Verweis wird im weiteren Verlauf auf dieWord-Anwendung zugegriffen.

Visible� Man könnte die Anwendung Word sichtbar machen, indem man dieEigenschaft Visible auf True stellt. Das ist aber für diesen Importnicht notwendig, daher wurden die Zeilen auskommentiert.

Open()� Mit der Methode Open() des Documents-Objekts wird das angegebeneWord-Dokument geöffnet. Es wird damit zum aktiven Dokument.

Paragraphs, Range� Innerhalb einer Schleife wird mit Hilfe von Paragraphs und Rangejeweils auf den Text des gesamten Bereichs eines Absatzes des aktivenDokuments (ActiveDocument) zugegriffen.

Absatzende� Das Zeichen Absatzende ist Bestandteil dieses Texts. Es wird mit Hilfeder Zeichenkettenfunktionen Left() und Len() abgeschnitten.

� Der verbleibende Text wird in eine Excel-Tabellenzelle geschrieben.

Quit()� Die Anwendung Word wird mit der Methode Quit() wieder beendet.

9.3.3 Import von Tabellen aus Word

Tabelle importieren

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

Page 277: Einstieg Mit VBA in Excel

276

Externe Daten9

Abbildung 9.18 Word-Tabelle, die importiert werden soll

Sub WordTabelleImport()Dim appWord As Word.ApplicationDim i As Integer, k As IntegerDim tb As Word.TableDim tx As String

ThisWorkbook.Worksheets("Tabelle2").Activate

' Anwendung Word startenSet appWord = CreateObject("Word.Application")

' Word-Dokument öffnenappWord.Documents.Open ThisWorkbook.Path _

& "\eindaten.docx"

' Erste Tabelle zuweisenSet tb = appWord.ActiveDocument.Tables(1)

For i = 1 To tb.Rows.CountFor k = 1 To tb.Columns.Count

' Text einer Tabellenzelle inkl. Zellenendetx = tb.Cell(i, k).Range.Text

' Zellenende löschen, Text in Zelle schreibenCells(i, k).Value = Left(tx, Len(tx) – 2)

Next kNext i

Page 278: Einstieg Mit VBA in Excel

277

Austausch mit Microsoft Word 9.3

' Anwendung Word beendenappWord.Quit

End Sub

Das Ergebnis:

Abbildung 9.19 Ergebnis des Imports

Zur Erläuterung:

Word.Table� Es wird ein Verweis auf ein Objekt vom Typ Word.Table deklariert.

Tables� Der Verweis zeigt später auf das erste Element der Auflistung Tables,also auf die erste Tabelle aus dem Word-Dokument.

Rows, Columns� Die Eigenschaften Rows und Columns umfassen die Zeilen bzw. Spal-ten einer Tabelle. Die Eigenschaft Count liefert die jeweilige Anzahlund dient hier als Obergrenze für die jeweilige Schleife.

Cell� Es wird auf den Text des gesamten Bereichs einer Tabellenzelle zuge-griffen. Eine einzelne Zelle wird mit Cell(Zeilennummer, Spalten-nummer) identifiziert.

Zellenende� Das Zeichen Zellenende ist Bestandteil dieses Texts. Es wird abgeschnit-ten.

� Der verbleibende Text wird in eine Excel-Tabellenzelle geschrieben.

9.3.4 Export zu Word, Erstellen von Absätzen

Daten exportierenDie in Abbildung 9.20 dargestellten Inhalte eines Excel-Tabellenblattssollen jeweils als Absatz in ein Word-Dokument geschrieben werden.

Sub WordAbsatzExport()Dim appWord As Word.ApplicationDim i As Integer

ThisWorkbook.Worksheets("Tabelle1").Activate

' Anwendung Word startenSet appWord = CreateObject("Word.Application")

Page 279: Einstieg Mit VBA in Excel

278

Externe Daten9

' Neues Word-Dokument erstellenappWord.Documents.Add

For i = 1 To 5' Absatz hinzufügenappWord.ActiveDocument.Paragraphs.Add

' Absatz mit Text aus Excel-Zelle füllenappWord.ActiveDocument.Paragraphs(i). _

Range.Text = Cells(i, 1).ValueNext i

' Word-Dokument speichern mit DateinameappWord.ActiveDocument.SaveAs ThisWorkbook.Path _

& "\aus.docx"

' Anwendung Word beendenappWord.Quit

End Sub

Abbildung 9.20 Excel-Daten, die exportiert werden sollen

Das Ergebnis des Codes:

Abbildung 9.21 Word-Datei mit Daten aus Excel

Page 280: Einstieg Mit VBA in Excel

279

Austausch mit Microsoft Word 9.3

Zur Erläuterung:

Documents.Add()� Die Methode Add() des Documents-Objekts öffnet ein neues Word-Dokument. Es wird damit zum aktiven Dokument.

Paragraphs.Add()� Innerhalb einer Schleife wird jeweils ein Absatz mit Hilfe derMethode Add() des Paragraphs-Objekts hinzugefügt.

� Jeder Absatz wird mit dem Inhalt einer Excel-Zelle gefüllt.

� Das neue Word-Dokument wird mit der Methode SaveAs() unterdem Namen aus.docx im gleichen Verzeichnis wie die Excel-Arbeits-mappe, die diese Anwendung enthält, gespeichert.

9.3.5 Export zu Word, Erstellen von Tabellen

Word-Tabelle schreiben

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

Abbildung 9.22 Excel-Tabelle, die exportiert werden soll

Sub WordTabelleExport()Dim appWord As Word.ApplicationDim i As Integer, k As IntegerDim tb As Word.Table

ThisWorkbook.Worksheets("Tabelle2").Activate

' Anwendung Word startenSet appWord = CreateObject("Word.Application")

' Neues Word-Dokument erstellenappWord.Documents.Add

' Neue Tabelle erstellen, mit Rahmen innen und außenSet tb = appWord.ActiveDocument.Tables.Add _

(appWord.ActiveDocument.Range(0), 3, 5)tb.Borders.InsideLineStyle = wdLineStyleSingletb.Borders.OutsideLineStyle = wdLineStyleSingle

Page 281: Einstieg Mit VBA in Excel

280

Externe Daten9

For i = 1 To 3For k = 1 To 5

' Tabellenzelle mit Text aus Excel-Zelle füllentb.Cell(i, k).Range.Text = Cells(i, k).Value

Next kNext i' Word-Dokument speichern mit DateinameappWord.ActiveDocument.SaveAs ThisWorkbook.Path _

& "\ausdaten.docx"

' Anwendung Word beendenappWord.Quit

End Sub

Das Ergebnis:

Abbildung 9.23 Word-Tabelle mit Daten aus Excel

Zur Erläuterung:

� Es wird ein neues Word-Dokument geöffnet. Dies ist nun das aktiveDokument.

Tables.Add() � Mit Hilfe der Methode Add() der Auflistung Tables wird dem Doku-ment eine neue Tabelle in der gewünschten Größe hinzugefügt. Diesebenötigt mindestens drei Parameter:

Range(0) � Ein Range-Objekt, das den Ort der neuen Tabelle bezeichnet. MitRange(0) erreichen Sie den Anfang der Datei.

� Die nächsten beiden Parameter legen die Anzahl der Zeilen unddie Anzahl der Spalten der neuen Tabelle fest.

Page 282: Einstieg Mit VBA in Excel

281

Austausch mit Microsoft Outlook 9.4

� Die Methode Add() liefert einen Verweis auf die neue Tabelle. DieserVerweis wird nachfolgend für den Zugriff auf die Tabelle genutzt.

Tabellenrahmen� Die Eigenschaft Borders enthält alle Rahmen für die Tabelle. DieEigenschaften, die mit Inside... bzw. mit Outside... beginnen, die-nen zur Festlegung des Aussehens der inneren bzw. äußeren Rahmen-linien. Im vorliegenden Fall stehen InsideLineStyle und Outside-LineStyle für die Linienart und der Wert wdLineStyleSingle füreine einfache Linie. Die Tabelle bekommt also einen einfachen Gitter-netzrahmen.

Cell� In einer doppelten Schleife werden alle Zellinhalte der Excel-Tabellein die Zellen der Word-Tabelle übertragen. Dabei wird in der Word-Tabelle wiederum mit Cell(Zeilennummer, Spaltennummer) gearbei-tet.

SaveAs()� Das neue Word-Dokument wird mit der Methode SaveAs() gespei-chert, und die Anwendung Word wird beendet.

9.4 Austausch mit Microsoft Outlook

E-Mail sendenEine Arbeitsmappe kann direkt aus Excel heraus, ohne Programmierung,als Anhang einer E-Mail versendet werden. Zusätzlich gibt es in VBA:

Anhang senden� die Methode SendMail() zum einfachen Versenden einer Arbeits-mappe als Anhang einer E-Mail

� die Möglichkeit zum Aufruf des integrierten Dialogfelds zum Sendeneiner E-Mail mit Excel

ZusammenarbeitDarüber hinaus bietet sich noch eine Reihe weiterer Möglichkeiten.Excel arbeitet naturgemäß am besten mit Outlook als E-Mail-Programmzusammen. In den folgenden Abschnitten wird auf einige Elemente desObjektmodells von Outlook eingegangen. Anschließend wird gezeigt,wie Sie auf E-Mails, Kontakte und Termine von Outlook zugreifen bzw.Objekte dieser Art mit Hilfe von Excel erzeugen.

In seltenen Fällen werden neu erzeugte Elemente vom Typ Kontakteoder Termine allerdings erst mit einer gewissen Zeitverzögerung gespei-chert. Sie sollten also nicht erwarten, dass jedes dieser Elemente sofortnach der Erzeugung im entsprechenden Outlook-Verzeichnis erscheint.

Page 283: Einstieg Mit VBA in Excel

282

Externe Daten9

9.4.1 Objektmodell von Outlook

Einige wichtige Elemente des hierarchischen Objektmodells von Out-look:

Application � Das Hauptobjekt Application steht für die Anwendung Outlook.

CreateObject() � Ähnlich wie bei Word wird mit Hilfe der Funktion CreateObject()für den Zugriff auf Outlook ein Objekt vom Typ Outlook.Applica-tion erstellt und ein Verweis auf dieses Objekt zurückgeliefert. Überdiesen Verweis wird im weiteren Verlauf auf die Outlook-Anwen-dung zugegriffen. Am Ende muss die Outlook-Anwendung wiederbeendet werden.

CreateItem() � Die Methode CreateItem() des Application-Objekts dient zurErzeugung von Elementen. Dies können z. B. E-Mails, Kontakte, Ter-mine oder Terminserien sein. Je nach Typ des Elements stehen unter-schiedliche Eigenschaften und Methoden zur Verfügung.

GetNameSpace() � Die Methode GetNameSpace() des Application-Objekts liefert einenNamensraum zurück. Dieser Namensraum wird zum Zugriff auf dieVerzeichnisse von Outlook benötigt. Als einziger Namensraumtypwird MAPI unterstützt.

GetDefault-Folder()

� Die Methode GetDefaultFolder() des Namensraums MAPI liefert einObjekt vom Typ Folder (= Verzeichnis) zurück. Dabei handelt es sichjeweils um das Standardverzeichnis für den gewünschten Typ. Dieskann z. B. der Typ Posteingang (olFolderInbox) oder der Typ Kon-takte (olFolderContacts) sein.

Items � Die Eigenschaft Items ist eine Auflistung der Elemente eines Outlook-Verzeichnisses. Wie bei der Methode CreateItem() bereits erwähnt:Je nach Typ des Elements stehen unterschiedliche Eigenschaften undMethoden zur Verfügung.

Bibliothekeinbinden

Der Zugriff auf das Objektmodell für Microsoft Outlook 2010 mussinnerhalb der VBE von Excel zunächst eingerichtet werden. Im MenüExtras � Verweise muss dazu die Microsoft Outlook 14.0 Object Libraryeingebunden werden, siehe Abbildung 9.24. Im Falle von Outlook 2007handelt es sich um die Microsoft Outlook 12.0 Object Library, bei älterenOutlook-Versionen wird mit der Microsoft Outlook 10.0 Object Librarygearbeitet.

Die Objektbibliothek wird für die Beispiele ab Abschnitt 9.4.4 benötigt.

Page 284: Einstieg Mit VBA in Excel

283

Austausch mit Microsoft Outlook 9.4

Abbildung 9.24 Outlook-Objektbibliothek einbinden

9.4.2 Einfaches Versenden einer Arbeitsmappe

SendMail()Die Methode SendMail() dient zum einfachen Versenden einer Arbeits-mappe als Anhang einer E-Mail. Ein erstes Beispiel:

Sub EinfachesSenden1()ThisWorkbook.SendMail "[email protected]", "Test"

End Sub

Externer ZugriffNach dem Aufruf der Prozedur erscheint aus Sicherheitsgründen auto-matisch ein Dialogfeld:

Abbildung 9.25 Dialogfeld aus Sicherheitsgründen

Zugriff erlaubenDarin kann der Benutzer entscheiden, ob er die Erlaubnis zum Zugriff aufOutlook Erteilen oder Verweigern möchte. Dieses Dialogfeld erscheintauch bei vielen nachfolgenden Anwendungen, die auf Elemente vonOutlook zugreifen möchten.

Page 285: Einstieg Mit VBA in Excel

284

Externe Daten9

Postausgang Nachdem der Benutzer die Erlaubnis erteilt hat, wird eine Nachricht mitAnhang ins Postausgangsfach gelegt:

Abbildung 9.26 Nachricht per SendMail()

Ein weiteres Beispiel:

Sub EinfachesSenden2()Dim Empf(1 To 2) As StringEmpf(1) = "[email protected]"Empf(2) = "[email protected]"ThisWorkbook.SendMail Empf, "Test"

End Sub

Das Ergebnis:

Abbildung 9.27 Nachricht an zwei Empfänger

Zur Erläuterung beider Programme:

SendMail() � Die Methode SendMail() hat einen festen und zwei optionale Para-meter.

Empfänger � Im ersten Parameter wird der Empfänger hinterlegt. Dabei könnenangegeben werden:

� eine einzelne Zeichenkette, falls es nur einen Empfänger gibt

� ein Datenfeld von Zeichenketten, falls es mehrere Empfänger gibt

Betreff � Im zweiten Parameter kann ein Betreff genannt werden.

Empfangs-bestätigung

� Falls Sie als dritten Parameter den Wert True angeben, wird eineEmpfangsbestätigung angefordert. Dies hängt natürlich davon ab, obdas E-Mail-Programm des Empfängers diese Anforderung verarbeitenkann.

Page 286: Einstieg Mit VBA in Excel

285

Austausch mit Microsoft Outlook 9.4

Anhang� Die erstellte E-Mail landet inklusive Anhang (dies ist die aktiveArbeitsmappe) im Ausgangskorb von Outlook. Je nach persönlicherEinstellung in Outlook wird sie direkt oder erst später versendet.

9.4.3 Integriertes E-Mail-Dialogfeld

Elemente eingeben

Falls Sie dem Benutzer in jedem Fall ermöglichen möchten, einer E-Mailweitere Elemente hinzuzufügen (z. B. Cc, Bcc oder einen Nachrichten-text), dann können Sie das integrierte E-Mail-Dialogfeld von Excel aufru-fen:

Sub EMailDialogfeld()Dim Erfolg As Boolean

Erfolg = Application.Dialogs(xlDialogSendMail). _Show("[email protected]", "Test")

If Erfolg ThenMsgBox "E-Mail wurde gespeichert"

ElseMsgBox "E-Mail-Speicherung wurde abgebrochen"

End IfEnd Sub

Das Ergebnis sehen Sie in Abbildung 9.28.

Abbildung 9.28 E-Mail-Dialogfeld zum weiteren Ausfüllen

Zur Erläuterung:

Show()� Es wird die Methode Show() der Auflistung Dialogs aufgerufen.

Dialogfeld benutzen

� Diese Methode kann zahlreiche vorgefertigte Dialoge anzeigen, sieheAbschnitt 10.1, »Integrierte Dialogfelder«. Mit Hilfe der KonstantenxlDialogSendMail wird der E-Mail-Dialog aufgerufen.

� Es können wiederum ein Empfänger (oder mehrere in einem Daten-feld) und ein Betreff angegeben werden. Die aktive Arbeitsmappe bil-

Page 287: Einstieg Mit VBA in Excel

286

Externe Daten9

det den Anhang der E-Mail. Weitere Elemente ergänzt gegebenenfallsder Benutzer.

Rückgabewert � Der Rückgabewert vom Typ Boolean kann ausgewertet werden, umfestzustellen, ob sich der Benutzer zum Speichern der E-Mail im Aus-gangskorb entschlossen hat oder nicht. Falls er speichert, wird dieE-Mail in den Postausgang gelegt:

Abbildung 9.29 Nach dem Speichern

9.4.4 Zusammensetzen einer E-Mail

Elementeerzeugen

Alle Elemente einer E-Mail können auch per VBA-Code erzeugt undzusammengestellt werden. Im folgenden Beispiel wird eine E-Mail mitEmpfänger, Betreff, Inhalt und Anhang zusammengefügt und gesendet.

Sub EMailZusammensetzen()Dim appOutlook As Outlook.ApplicationDim MailItem As Outlook.MailItem

' Anwendung Outlook startenSet appOutlook = CreateObject("Outlook.Application")

' E-Mail erstellenSet MailItem = appOutlook.CreateItem(olMailItem)

' Eigenschaften hinzufügenMailItem.To = "[email protected]"MailItem.Subject = "Test"MailItem.Body = "Hallo" & vbCrLf & "Welt"

' Anhang hinzufügenOn Error GoTo FehlerMailItem.Attachments.Add "C:\Temp\test1.jpg"

' E-Mail sendenMailItem.Send

' Anwendung Outlook beendenappOutlook.Quit

Page 288: Einstieg Mit VBA in Excel

287

Austausch mit Microsoft Outlook 9.4

Exit SubFehler:

MsgBox Err.DescriptionappOutlook.Quit

End Sub

Abbildung 9.30 zeigt das Ergebnis.

Abbildung 9.30 Ergebnis des Zusammensetzens einer E-Mail

Zur Erläuterung:

MailItem� Die Variable MailItem wird als Objekt des Typs Outlook.MailItemdeklariert.

CreateObject()� Mit Hilfe der Funktion CreateObject() wird ein Objekt vom TypOutlook.Application erstellt und ein Verweis auf dieses Objektzurückgeliefert. Über diesen Verweis wird im weiteren Verlauf aufdie Outlook-Anwendung zugegriffen.

CreateItem()� Die Methode CreateItem() des Application-Objekts erstellt Ele-mente. In diesem Falle handelt es sich um ein Element des Typs Mail-Item. Je nach Typ des Elements stehen unterschiedliche Eigenschaf-ten und Methoden zur Verfügung.

To, Subject, Body� Die Eigenschaften To, Subject und Body dienen zur Zuweisung vonEmpfänger, Betreff und Inhalt der Mail. Mehrere Empfänger könnenin einer einzigen Zeichenkette mit Semikolon als Trennzeichen ange-geben werden. Sie werden, im Unterschied zur Methode SendMail(),nicht als Datenfeld angegeben!

Attachments.Add()

� Die Auflistung Attachments umfasst alle Anhänge einer E-Mail. Mitder Methode Add() können Elemente (Dateien) zu dieser Auflistunghinzugefügt werden. Es kann vorkommen, dass die betreffende Dateinicht existiert. Dieser Fehler sollte abgefangen werden, wie im vorlie-genden Beispiel.

Page 289: Einstieg Mit VBA in Excel

288

Externe Daten9

Send() � Die Methode Send() wird zum Absenden der E-Mail genutzt.

Display() � Alternativ könnten Sie die Methode Display() verwenden. In diesemFall wird die E-Mail zunächst angezeigt. Der Benutzer wird gefragt, obsie gespeichert werden soll. Falls er zustimmt, wird die E-Mail imOutlook-Verzeichnis Entwürfe gespeichert und kann später versendetwerden.

Quit() � Am Ende wird die Outlook-Anwendung mit der Methode Quit()wieder beendet.

9.4.5 Erstellen einer Serien-E-Mail

Serien-E-Mail Das vorherige Beispiel kann leicht abgewandelt werden, um eine Serien-E-Mail an mehrere Adressen zu erstellen, die einem Excel-Tabellenblattentnommen werden:

Abbildung 9.31 Empfänger-Adressen

Das Programm:

Sub SerienEMail()Dim appOutlook As Outlook.ApplicationDim MailItem As Outlook.MailItemDim i As IntegerDim Bcc As String

' Liste der Empfänger aus Tabellenblatt zusammensetzenThisWorkbook.Worksheets("Tabelle3").Activatei = 1Do While Cells(i, 3) <> ""

Bcc = Bcc & Cells(i, 3).Value & ";"i = i + 1

LoopBcc = Left(Bcc, Len(Bcc) – 1)

' Anwendung Outlook starten, E-Mail erstellenSet appOutlook = CreateObject("Outlook.Application")Set MailItem = appOutlook.CreateItem(olMailItem)

Page 290: Einstieg Mit VBA in Excel

289

Austausch mit Microsoft Outlook 9.4

' Eigenschaften hinzufügen und sendenMailItem.To = "[email protected]"MailItem.Bcc = BccMailItem.Subject = "Grillparty um 17:00 Uhr"MailItem.Send

appOutlook.QuitEnd Sub

Das Ergebnis:

Abbildung 9.32 Zusammensetzen einer Serien-E-Mail

Zur Erläuterung:

Empfängerliste� In einem Excel-Tabellenblatt sind Name, Vorname und E-Mail-Adresse einer Reihe von Personen gespeichert.

� Mit Hilfe einer Schleife wird eine Zeichenkette zusammengesetzt, dieaus allen E-Mail-Adressen des Tabellenblatts besteht. Die Adressenwerden durch Semikolons voneinander getrennt. Das letzte Semiko-lon wird mit den Funktionen Left() und Len() wieder abgeschnit-ten.

To, Bcc, Subject� Die E-Mail wird wie im vorherigen Beispiel erstellt. Sie bekommt dieEigenschaften To, Bcc und Subject. Der Eigenschaft Bcc wird die vor-her zusammengesetzte Zeichenkette zugewiesen.

� Die E-Mail wird mit der Methode Send() versendet.

9.4.6 Bestimmten Bereich in E-Mail versenden

Bereich sendenFalls nur ein Bereich einer Arbeitsmappe versendet werden soll, könnenSie diesen Bereich vorher in eine neue Arbeitsmappe kopieren und dieseanschließend mailen:

Sub BereichMailen()Dim Rg As RangeDim appOutlook As Outlook.Application

Page 291: Einstieg Mit VBA in Excel

290

Externe Daten9

Dim MailItem As Outlook.MailItem

' Bereich ermitteln, in neue Datei kopierenSet Rg = Application.InputBox _

(Prompt:="Wählen Sie den Bereich aus," _& " der gemailt werden soll", Type:=8)

Rg.CopyWorkbooks.AddActiveSheet.PasteActiveWorkbook.SaveAs ThisWorkbook.Path _

& "\Mappe9Anhang.xlsx"ActiveWorkbook.Close

' Anwendung Outlook starten, E-Mail erstellenSet appOutlook = CreateObject("Outlook.Application")Set MailItem = appOutlook.CreateItem(olMailItem)

' Eigenschaften hinzufügenMailItem.To = "[email protected]"MailItem.Subject = "Test"MailItem.Attachments.Add ThisWorkbook.Path _

& "\Mappe9Anhang.xlsx"MailItem.Send

appOutlook.QuitEnd Sub

Zur Erläuterung:

Bereich auswählen � Mit Hilfe der Methode Application.InputBox() kann der Benutzerper Maus einen Bereich auswählen, der versendet werden soll:

Abbildung 9.33 E-Mail mit ausgewähltem Bereich in Dateianhang

Copy() � Die Methode Copy() wird genutzt, um diesen Bereich zu kopieren. Dakein Ziel per Parameter angegeben wurde, liegt der Bereich in derZwischenablage.

Page 292: Einstieg Mit VBA in Excel

291

Austausch mit Microsoft Outlook 9.4

Workbooks.Add()� Es wird mit Hilfe der Methode Workbooks.Add() eine neue Arbeits-mappe erstellt (hier: Mappe9Anhang.xlsx). Diese wird zur aktivenArbeitsmappe.

Paste()� Der Inhalt der Zwischenablage wird mit Paste() in der neuenArbeitsmappe eingefügt. Sie wird gespeichert.

CreateItem()� Die E-Mail wird mit CreateItem() erstellt. Sie bekommt die Eigen-schaften To, Subject und Attachments. Als Anhang wird die soebengespeicherte Datei verwendet.

� Die E-Mail wird ins Postausgangsfach gelegt:

Abbildung 9.34 E-Mail mit ausgewähltem Bereich in Dateianhang

9.4.7 Zugriff auf Outlook-Verzeichnis

Das folgende Programm ermittelt die Anzahl der Elemente des Verzeich-nisses Gesendete Objekte (in einer Version für Excel ab 2007). Außerdemliefert es einige Eigenschaften einer E-Mail in diesem Verzeichnis:

Sub ZugriffVerzeichnis()Dim appOutlook As Outlook.ApplicationDim Namensraum As Outlook.NamespaceDim Verzeichnis As Outlook.FolderDim Element As Outlook.MailItem

' Anwendung Outlook startenSet appOutlook = CreateObject("Outlook.Application")

' Verzeichnis ermittelnSet Namensraum = appOutlook.GetNamespace("MAPI")Set Verzeichnis = Namensraum.GetDefaultFolder _

(olFolderSentMail)

Hinweis

In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedurund in der Erläuterung wie folgt lauten: Mappe9Anhang.xls.

Page 293: Einstieg Mit VBA in Excel

292

Externe Daten9

' Elemente zählenMsgBox Verzeichnis.Items.Count _

& " Elemente im Verzeichnis 'Gesendete Objekte'"

' Eigenschaften eines Elements ermittelnSet Element = Verzeichnis.Items(1)MsgBox "Eigenschaften des ersten Elements:" & vbCrLf _

& "Betreff: " & Element.Subject & vbCrLf _& "Empfänger: " & Element.To & vbCrLf _& "Inhalt: " & Left(Element.Body, 50) & " ..."

appOutlook.QuitEnd Sub

Der erste Teil des Ergebnisses könnte wie folgt aussehen:

Abbildung 9.35 Zugriff auf Verzeichnis »Gesendete Objekte«

Zur Erläuterung:

GetNameSpace() � Die Methode GetNameSpace() des Application-Objekts liefert einenNamensraum zurück. Dieser Namensraum wird zum Zugriff auf dieVerzeichnisse von Outlook benötigt. Als einziger Namensraumtypwird MAPI unterstützt.

GetDefault-Folder()

� Die Methode GetDefaultFolder() des Namensraums MAPI liefert einObjekt vom Typ Folder zurück. Dabei handelt es sich jeweils um dasStandardverzeichnis für den gewünschten Typ. In diesem Falle ist esdas Verzeichnis Gesendete Objekte (olFolderSentMail).

Items � Die Eigenschaft Items ist eine Auflistung der Elemente eines Outlook-Verzeichnisses. Die Anzahl der Elemente kann, wie bei einer Auflis-tung üblich, mit der Eigenschaft Count ermittelt werden.

Items(Index) � Auf ein einzelnes Element der Auflistung Items kann über einenIndex zugegriffen werden.

Subject, To, Body � In diesem Falle werden die Eigenschaften Betreff (Subject), Empfän-ger (To) und Inhalt (Body) des Elements 1 aus dem Verzeichnis Gesen-dete Objekte ausgegeben.

Page 294: Einstieg Mit VBA in Excel

293

Austausch mit Microsoft Outlook 9.4

9.4.8 Zugriff auf E-Mail-Anhänge

Nachfolgend ein Beispiel, in dem innerhalb des Verzeichnisses GesendeteObjekte ermittelt wird (in einer Version für Excel ab Version 2007):

� Wie viel Prozent aller E-Mails haben einen Anhang?

� Wie viele Anhänge hat eine solche E-Mail im Durchschnitt?

Anhang an wen?� Wann und an wen wurde eine bestimmte Datei als E-Mail-Anhanggesendet?

Sub ZugriffMailAnhang()Dim appOutlook As Outlook.ApplicationDim Namensraum As Outlook.NamespaceDim Verzeichnis As Outlook.FolderDim Element As Outlook.MailItem

Dim Anhang As Outlook.AttachmentDim AnzahlMitAnhang As IntegerDim AnteilMitAnhang As SingleDim AnzahlAnhaenge As IntegerDim AnhangProMail As SingleDim Ausgabe As String

' Anwendung Outlook startenSet appOutlook = CreateObject("Outlook.Application")

' Verzeichnis ermittelnSet Namensraum = appOutlook.GetNamespace("MAPI")Set Verzeichnis = Namensraum.GetDefaultFolder _

(olFolderSentMail)

' Statistik zu AnhängenFor Each Element In Verzeichnis.Items

If Element.Attachments.Count > 0 ThenAnzahlMitAnhang = AnzahlMitAnhang + 1AnzahlAnhaenge = AnzahlAnhaenge _

+ Element.Attachments.CountEnd If

Next Element

AnteilMitAnhang = AnzahlMitAnhang _/ Verzeichnis.Items.Count

MsgBox Format(AnteilMitAnhang, "0.00 %") _& " der Elemente im Verzeichnis " _& "'Gesendete Objekte' haben einen Anhang"

Page 295: Einstieg Mit VBA in Excel

294

Externe Daten9

AnhangProMail = AnzahlAnhaenge / AnzahlMitAnhangMsgBox Format(AnhangProMail, "0.00") _

& " Anhänge hat jede E-Mail mit Anhang"

' Statistik zu bestimmtem AnhangFor Each Element In Verzeichnis.Items

For Each Anhang In Element.AttachmentsIf Anhang.Filename = "Mappe9.xlsm" Then

Ausgabe = Ausgabe & "An " & Element.To _& " am " & Element.CreationTime & vbCrLf

End IfNext Anhang

Next ElementMsgBox Ausgabe

appOutlook.QuitEnd Sub

Die ersten beiden Teile des Ergebnisses könnten wie in den Abbildungen9.36 und 9.37 aussehen.

Abbildung 9.36 Statistik zu Anhängen, Teil 1

Abbildung 9.37 Statistik zu Anhängen, Teil 2

Zur Erläuterung:

For Each<Element>

� Mit Hilfe einer For-Each-Schleife werden alle Elemente des Verzeich-nisses Gesendete Objekte untersucht.

� Falls die Anzahl der Anhänge einer E-Mail größer als 0 ist, wird dieseE-Mail gezählt. Außerdem wird die Anzahl der Anhänge gezählt. Diesgeschieht mit Hilfe der Eigenschaft Count der Auflistung Attach-ments.

Page 296: Einstieg Mit VBA in Excel

295

Austausch mit Microsoft Outlook 9.4

� Die ermittelten Werte werden ausgegeben.

Anhänge durchsuchen

� Mit Hilfe zweier geschachtelter For-Each-Schleifen werden anschlie-ßend alle Anhänge aller Elemente des Verzeichnisses GesendeteObjekte untersucht.

Datei-informationen

� Ein einzelner Anhang ist vom Typ Outlook.Attachment. Falls einerder Anhänge einem bestimmten gesuchten Dateinamen entspricht,werden Empfänger und Erzeugungsdatum der zugehörigen E-Mailgespeichert.

� Die ermittelten Daten werden ausgegeben.

9.4.9 Zugriff auf Kontakte

Nachfolgend werden alle Kontakte aufgelistet, deren Nachname mit Mbeginnt (für Excel ab Version 2007):

Sub ZugriffKontakte()Dim appOutlook As Outlook.ApplicationDim Namensraum As Outlook.NamespaceDim Verzeichnis As Outlook.FolderDim Element As Outlook.ContactItemDim Ausgabe As String

' Anwendung Outlook startenSet appOutlook = CreateObject("Outlook.Application")

' Verzeichnis ermittelnSet Namensraum = appOutlook.GetNamespace("MAPI")Set Verzeichnis = Namensraum.GetDefaultFolder _

(olFolderContacts)

' Bestimmte Kontakte ermittelnFor Each Element In Verzeichnis.Items

If Left(Element.LastName, 1) = "M" ThenAusgabe = Ausgabe & Element.LastName _

& ", " & Element.FirstName & " (" _& Element.Email1Address & ")" & vbCrLf

End IfNext Element

MsgBox AusgabeappOutlook.Quit

End Sub

Page 297: Einstieg Mit VBA in Excel

296

Externe Daten9

Zur Erläuterung:

olFolderContacts � Es wird das Standardverzeichnis für Kontakte (olFolderContacts)ermittelt.

LastName � Die Elemente dieses Verzeichnisses sind vom Typ ContactItem undhaben u. a. die Eigenschaften Nachname (LastName), Vorname(FirstName) und erste E-Mail-Adresse (Email1Address).

� Die Nachnamen werden untersucht. Mit Hilfe der Funktion Left()wird ermittelt, ob der erste Buchstabe ein M ist. Falls ja, werden dieobengenannten Eigenschaften gespeichert und ausgegeben.

9.4.10 Kontakt erzeugen

Neuer Kontakt Neue Kontakte können ähnlich wie neue E-Mails erzeugt werden. Dieszeigt das folgende Beispiel (für Excel ab Version 2007):

Sub KontaktErzeugen()Dim appOutlook As Outlook.ApplicationDim Element As Outlook.ContactItem

' Anwendung Outlook startenSet appOutlook = CreateObject("Outlook.Application")

' Neuen Kontakt erzeugenSet Element = appOutlook.CreateItem(olContactItem)

' Eigenschaften zuweisenElement.LastName = "Muster"Element.FirstName = "Max"Element.Email1Address = "[email protected]"

' Kontakt speichernElement.Save

appOutlook.QuitEnd Sub

Das Ergebnis sehen Sie in Abbildung 9.38.

Page 298: Einstieg Mit VBA in Excel

297

Austausch mit Microsoft Outlook 9.4

Abbildung 9.38 Neu erzeugter Kontakt

Zur Erläuterung:

CreateItem()� Mit Hilfe der Methode CreateItem() und der Konstanten olContact-Item wird ein neues Element des Typs ContactItem erzeugt.

� Den Eigenschaften LastName, FirstName und Email1Address desneuen Kontakts werden Werte zugewiesen.

Save()� Anschließend wird der neue Kontakt mit der Methode Save() gespei-chert.

9.4.11 Termin erzeugen

AppointmentItemElemente des Verzeichnisses Kalender sind Objekte des Typs Appoint-mentItem. Diese Elemente haben wiederum andere Eigenschaften alsObjekte des Typs MailItem. Nachfolgend wird dem persönlichen Ter-minkalender mit Hilfe von VBA ein neuer Termin hinzugefügt (für Excelab Version 2007):

Sub TerminErzeugen()Dim appOutlook As Outlook.ApplicationDim Element As Outlook.AppointmentItem

' Anwendung Outlook startenSet appOutlook = CreateObject("Outlook.Application")

' Neuen Termin erzeugenSet Element = appOutlook.CreateItem(olAppointmentItem)

' Eigenschaften zuweisenElement.Start = "30.03.2010 12:00"Element.Duration = 60

Hinweis

In seltenen Fällen erscheint der Kontakt erst zeitverzögert in Outlook.

Page 299: Einstieg Mit VBA in Excel

298

Externe Daten9

Element.Subject = "Test"Element.Location = "hier"

' Termin speichernElement.Save

appOutlook.QuitEnd Sub

Das Ergebnis:

Abbildung 9.39 Neu hinzugefügter Termin

Zur Erläuterung:

CreateItem() � Mit der Methode CreateItem() und der Konstanten olAppointment-Item wird ein neues Element des Typs AppointmentItem erzeugt.

� Den folgenden Eigenschaften des neuen Termins werden Werte zuge-wiesen:

� Start: Beginn des Termins mit Datum und Uhrzeit

� Duration: Dauer des Termins

� Subject: Betreff, also Thema des Termins

� Location: Ort, an dem der Termin stattfindet

Save() � Anschließend wird der neue Termin mit der Methode Save() gespei-chert.

9.4.12 Terminserie erzeugen

RecurrencePattern Bei einer Terminserie kommt ein weiteres Objekt hinzu: Der Typ Recur-rencePattern enthält das Muster für die Terminserie. Ein Beispiel (fürExcel ab Version 2007):

Sub TerminserieHinzufuegen()Dim appOutlook As Outlook.ApplicationDim Element As Outlook.AppointmentItemDim Muster As Outlook.RecurrencePattern

Page 300: Einstieg Mit VBA in Excel

299

Austausch mit Microsoft Outlook 9.4

' Anwendung Outlook startenSet appOutlook = CreateObject("Outlook.Application")

' Neuen Termin erzeugenSet Element = appOutlook.CreateItem(olAppointmentItem)

' Eigenschaften zuweisenElement.Start = "31.03.2010 12:00"Element.Duration = 45Element.Subject = "Test"

' Muster für Terminserie erzeugenSet Muster = Element.GetRecurrencePattern

' Eigenschaften zuweisenMuster.RecurrenceType = olRecursWeeklyMuster.DayOfWeekMask = olWednesday Or olSaturdayMuster.PatternStartDate = "31.03.2010"Muster.PatternEndDate = "17.04.2010"

' Terminserie speichernElement.Save

appOutlook.QuitEnd Sub

Informationen zu der erstellten Terminserie:

Abbildung 9.40 Uhrzeit und Dauer

Abbildung 9.41 Wiederholungsmuster

Page 301: Einstieg Mit VBA in Excel

300

Externe Daten9

Abbildung 9.42 Beginn und Ende

Zur Erläuterung:

CreateItem() � Es wird mit Hilfe der Methode CreateItem() ein Element vom TypAppointmentItem erzeugt.

� Anschließend werden dessen Eigenschaften Werte zugewiesen.

GetRecurrence-Pattern()

� Die Methode GetRecurrencePattern() liefert ein Objekt vom TypRecurrencePattern.

RecurrencePattern � Den folgenden Eigenschaften des neuen Musters werden Werte zuge-wiesen:

� RecurrenceType: Wiederholrate. Diese Eigenschaft muss zuerstfestgelegt werden. Gültige Werte sind u. a. olRecursDaily (täg-lich), olRecursWeekly (wöchentlich) oder olRecursMonthly

(monatlich).

� DayofWeekMask: Maske für die Wochentage, an denen der Terminstattfindet. Gültige Werte sind z. B. olMonday (montags) oderolTuesday (dienstags).

� PatternStartDate und PatternEndDate: Diese Termine legen denZeitraum fest, in dem die Termine der Serie stattfinden.

Save() � Anschließend wird die neue Terminserie mit der Methode Save()gespeichert.

9.5 Austausch mit Microsoft Access

Datenbankzugriff Access ist ein Programm zur Erstellung und Verwaltung von relationalenDatenbanken. Die Möglichkeiten von Datenbank-Programmen gehenweit über die Möglichkeiten von Excel-Datenbanken hinaus. An dieserStelle soll kein Exkurs zu diesem Thema folgen, das würde zu weit füh-ren. Es wird stattdessen erläutert, wie Sie auf eine vorgegebene Beispiel-Datenbank von Access zugreifen und diese gegebenenfalls verändern.

Page 302: Einstieg Mit VBA in Excel

301

Austausch mit Microsoft Access 9.5

9.5.1 Beispiel-Datenbank: Aufbau

StrukturDie Beispiel-Datenbank firma.mdb können Sie direkt von der beiliegen-den CD kopieren. Sie enthält die Tabelle personen zur Aufnahme von Per-sonendaten. Die Tabelle personen hat folgende Struktur:

Abbildung 9.43 Tabelle »personen«, Entwurfsansicht

DatensätzeAuf dem Feld personalnummer ist der Primärschlüssel (= eindeutigerIndex) definiert. Es kann also keine zwei Datensätze mit der gleichen Per-sonalnummer geben. Es gibt bereits drei Datensätze mit den folgendenInhalten:

Abbildung 9.44 Tabelle »personen«, Datenblattansicht

9.5.2 Beispiel-Datenbank: Verbindung herstellen

Ablauf des ZugriffsDer Zugriff auf eine Datenbank mit VBA besteht aus folgenden Schritten:

� Verbindung aufnehmen zur Datenbank

� Absetzen eines SQL-Befehls an die Datenbank

� Auswerten des SQL-Befehls

� Verbindung zur Datenbank schließen

ADO-BibliothekFür den Zugriff wird die ADO-Bibliothek benötigt. Dazu muss als Erstesim Menü Extras � Verweise die Microsoft ActiveX Data Objects 2.8Library (= Bibliothek) eingebunden werden. Für Excel vor Version 2007reicht auch eine ältere Version, z. B. 2.5.

Page 303: Einstieg Mit VBA in Excel

302

Externe Daten9

Abbildung 9.45 ADO-Objektbibliothek einbinden

Ähnliche Bibliotheken gibt es für die Verbindung zu anderen Datenbank-Typen bzw. zu Datenbank-Servern.

ConnectionString Die Verbindung zu einer Access-Datenbank wird mit Hilfe eines Objektsvom Typ ADODB.Connection aufgenommen. Die wichtigste Eigenschaftdes Connection-Objekts ist ConnectionString. Darin werden mehrereEigenschaften für die Art der Verbindung vereinigt. Für Access sind dies:

� der Datenbank-Provider: Microsoft.Jet.OLEDB.4.0

� die Datenquelle (Data Source): hier die Datei firma.mdb im gleichenVerzeichnis

Open(), Close() Die Methoden Open() und Close() des Connection-Objekts dienen zumÖffnen und Schließen der Verbindung. Eine offene Verbindung sollte soschnell wie möglich wieder geschlossen werden.

9.5.3 SQL-Befehle

SQL Die Abkürzung SQL steht für Structured Query Language. SQL ist einestrukturierte Abfragesprache, also eine Sprache, mit deren Hilfe Daten-bankabfragen ausgeführt werden können. Es gibt grundsätzlich zweiTypen von Abfragen:

Auswahl � Auswahlabfragen zur Sichtung von Daten mit dem SQL-Befehl SELECT

Aktion � Aktionsabfragen zur Veränderung von Daten mit den SQL-BefehlenUPDATE, DELETE und INSERT

Page 304: Einstieg Mit VBA in Excel

303

Austausch mit Microsoft Access 9.5

Im weiteren Verlauf werden Grundlagen der Sprache SQL vermittelt, sodass einige typische Arbeiten mit Datenbanken durchgeführt werdenkönnen.

RecordsetFür Auswahlabfragen wird ein Objekt des Typs ADODB.Recordset benö-tigt. Darin wird das Ergebnis der Abfrage, eine Reihe von Datensätzen,gespeichert. Bei Aktionsabfragen sollten Sie feststellen, wie viele Daten-sätze von der Änderung betroffen waren. Daran können Sie den Erfolgder Aktion bemessen.

9.5.4 Beispiel-Datenbank: Auswahlabfrage

Alle Datensätze sehen

Als Beispiel für eine Auswahlabfrage nehmen wir den einfachsten Fall –wir möchten alle Datensätze einer Tabelle mit allen Feldern sehen:

Abbildung 9.46 Import der Tabellendaten aus Access

Das Programm:

Sub Auswahlabfrage()Dim cn As ADODB.ConnectionDim rs As ADODB.RecordsetDim i As IntegerDim SQLCommand As String

ThisWorkbook.Worksheets("Tabelle4").Activate

On Error GoTo FehlerSet cn = New ADODB.Connectioncn.ConnectionString = _

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _& ThisWorkbook.Path & "\firma.mdb;"

cn.OpenSQLCommand = "SELECT * FROM personen"' MsgBox SQLCommandSet rs = cn.Execute(SQLCommand)i = 1Do While Not rs.EOF

Cells(i, 1) = rs!Name

Page 305: Einstieg Mit VBA in Excel

304

Externe Daten9

Cells(i, 2) = rs!vornameCells(i, 3) = rs!personalnummerCells(i, 4) = rs!gehaltCells(i, 5) = rs!geburtstagrs.MoveNexti = i + 1

Loop

rs.Closecn.Close

Range("E:E").NumberFormatLocal = "TT.MM.JJ"Range("A:E").Columns.AutoFitExit Sub

Fehler:MsgBox (Err.Description)

End Sub

Zur Erläuterung:

� Es werden zwei Verweise auf Objekte des Typs ADODB.Connectionund ADODB.Recordset erzeugt.

Fehler finden � Da es beim Zugriff auf eine Datenbank erfahrungsgemäß zahlreicheFehlerquellen gibt, sollten Fehler mit On Error abgefangen werden.Ähnlich wie beim Zugriff auf eine Datei kann es vorkommen, dass dieDatenbank gar nicht am genannten Ort existiert. Auch Fehler bei derSQL-Syntax werden an VBA weitergemeldet. Die verschiedenen mög-lichen Fehlermeldungen helfen beim Fehlerfinden.

Connection � Es wird ein neues Objekt des Typs ADODB.Connection erzeugt. Aufdieses Objekt wird mit dem oben erzeugten Verweis verwiesen.

ConnectionString � Der ConnectionString dieses Verbindungsobjekts wird mit denInformationen für den Provider und die Datenquelle (Datei firma.mdb) gefüllt.

Open() � Mit Aufruf der Methode Open() des Verbindungsobjekts wird dieVerbindung geöffnet.

SELECT � Der SQL-Befehl SELECT * FROM personen besteht aus den folgendenElementen:

� SELECT ... FROM ... : wähle Felder ... von Tabelle ...

� Es folgt eine Liste der gewünschten Felder im Abfrageergebnis,dabei steht der Stern (*) für: alle Felder.

� personen: Name der Tabelle, aus der ausgewählt wird

Page 306: Einstieg Mit VBA in Excel

305

Austausch mit Microsoft Access 9.5

Fehler in SQL finden

� Der SQL-Befehl wird in einer Zeichenkette gespeichert. Dies ist vorallem bei längeren SQL-Befehlen, die Benutzereingaben enthalten,nützlich. Im Fehlerfall können Sie sich den SQL-Befehl per MsgBoxausgeben lassen.

Execute()� Mit Hilfe der Methode Execute() des Verbindungsobjekts wird derSQL-Befehl gesendet. Rückgabewert der Methode ist ein Recordset-Objekt. Auf dieses Objekt wird mit dem oben erzeugten Verweis ver-wiesen.

EOF� Die Eigenschaft EOF signalisiert, ob das Ende des Recordsets (also derletzte Datensatz) erreicht wurde. Damit wird die Do-Loop-Schleifegesteuert.

Feldwerte� Innerhalb eines Datensatzes können die Werte der einzelnen Felderin der Form <Recordset>!<Feldname> angesprochen werden.

MoveNext()� Die Methode MoveNext() setzt den Datensatzzeiger auf den nächstenDatensatz des Abfrageergebnisses.

Close()� Zu guter Letzt sollten noch das Recordset und die Verbindung wiedergeschlossen werden, jeweils mit Close().

9.5.5 Beispiel-Datenbank: Aktionsabfrage

Als Beispiel für eine Aktionsabfrage soll Folgendes dienen:

Alle Datensätze ändern

Alle Gehälter sollen um 5 % erhöht werden.

Anschließend soll die Tabelle (nach einem erneuten Import aus Access)wie folgt aussehen:

Abbildung 9.47 Geänderte Datensätze

Das Programm:

Sub Aktionsabfrage()Dim cn As New ADODB.ConnectionDim SQLCommand As StringDim Anzahl As Integer

On Error GoTo Fehlercn.ConnectionString = _

Page 307: Einstieg Mit VBA in Excel

306

Externe Daten9

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _& ThisWorkbook.Path & "\firma.mdb;"

cn.OpenSQLCommand = _

"UPDATE personen SET gehalt = gehalt * 1.05"' MsgBox SQLCommandcn.Execute SQLCommand, Anzahlcn.Close

MsgBox "Anzahl Datensätze geändert: " & AnzahlExit Sub

Fehler:MsgBox (Err.Description)

End Sub

Zur Erläuterung:

Connection � Wie bei einer Auswahlabfrage wird ein Connection-Objekt benötigt.

Execute() � Die Methode Execute() wird zum Ausführen von Aktionsabfragenmit einem zweiten Parameter aufgerufen. Darin wird die Anzahl derDatensätze, die von der Aktionsabfrage betroffen waren, gespeichert.Der Rückgabewert der Methode wird nicht benötigt, da kein Record-set angefordert wurde.

UPDATE � Der SQL-Befehl UPDATE personen SET gehalt = gehalt * 1.05 bestehtaus:

� UPDATE ... SET ... (aktualisiere Tabelle ... setze Werte ...)

� personen (Name der Tabelle, in der aktualisiert wird)

� gehalt = gehalt * 1.05 (eine oder mehrere Zuweisungen mitneuen Werten für ein oder mehrere Felder)

� Zur Kontrolle wird die Anzahl der geänderten Datensätze angezeigt.

Abbildung 9.48 Anzahl der betroffenen Datensätze

Page 308: Einstieg Mit VBA in Excel

307

Austausch mit Microsoft Access 9.5

9.5.6 SQL: Auswahlabfragen mit SELECT

SQLIn diesem und den folgenden Abschnitten werden die wichtigsten SQL-Befehle behandelt. Sie werden anhand von einigen typischen Beispielenmit ihren Auswirkungen erläutert.

SELECTDie Anweisung SELECT dient zur Auswahl von Datensätzen, damit dieseangezeigt werden können. Ein erstes Beispiel wurde mit SELECT * FROMpersonen bereits gezeigt. Es folgen weitere Beispiele.

Einzelne Felder

SQLCommand = "SELECT name, vorname FROM personen"

Felder auswählenEs werden nur die Werte der Felder name und vorname für alle Daten-sätze angefordert. Das Abfrageergebnis ist kleiner, die Werte der ande-ren Felder sind nicht darin enthalten und können auch nicht in derSchleife ausgegeben werden:

Abbildung 9.49 Nur Felder name, vorname

Auswahl einschränken

WHERESQLCommand = "SELECT * FROM personen WHERE gehalt > 3600"

Datensätze auswählen

Innerhalb der WHERE-Klausel können Bedingungen angegeben werden,ähnlich wie bei einer If-Verzweigung. Das Ergebnis enthält nur dieDatensätze, die der Bedingung genügen – in diesem Fall die Datensätze,bei denen der Wert im Feld gehalt größer als 3.600 ist.

Abbildung 9.50 Nur bestimmte Datensätze

Hinweis

Die Ausgabe bezieht sich auf die Originalwerte der Tabelle, bevor sie um 5 %erhöht wurden.

Page 309: Einstieg Mit VBA in Excel

308

Externe Daten9

Zeichenketten

SQLCommand = "SELECT * FROM personen WHERE name = 'Schmitz'"

Zeichenkette,Datum

Wird mit dem Wert einer Zeichenkette oder eines Datums verglichen, somuss dieser Wert in einfache Hochkommata (') gesetzt werden (nicht zuverwechseln mit dem doppelten Hochkomma für Zeichenketten in VBAoder dem schrägen Akzentzeichen!).

Abbildung 9.51 Auswahl über eine Zeichenkette

9.5.7 SQL: Operatoren

Vergleichs-operatoren

Bei einer Bedingung können Sie die Vergleichsoperatoren aus Tabelle 9.1verwenden.

LogischeOperatoren

Die logischen Operatoren aus Tabelle 9.2 verbinden mehrere Bedingun-gen miteinander.

Mit diesen Operatoren können Sie z. B. folgende Abfrage formulieren:

Operator Erläuterung

= gleich

<> ungleich

> größer als

>= größer als oder gleich

< kleiner als

<= kleiner als oder gleich

Tabelle 9.1 SQL, Vergleichsoperatoren

Operator Erläuterung

NOT Logisches Nicht. Der Wahrheitswert einer Bedingung wird umgekehrt.

AND Logisches Und. Beide Bedingungen müssen zutreffen.

OR Logisches Oder. Nur eine der Bedingungen muss zutreffen.

Tabelle 9.2 SQL, logische Operatoren

Page 310: Einstieg Mit VBA in Excel

309

Austausch mit Microsoft Access 9.5

SQLCommand = "SELECT * FROM personen WHERE gehalt >= 3600 ANDgehalt <= 3650"

ANDDas Ergebnis enthält nur die Datensätze, bei denen der Wert im Feldgehalt zwischen 3.600 und 3.650 liegt, einschließlich der Ober- undUntergrenze.

Abbildung 9.52 Auswahl mit Hilfe von Operatoren

Operator LIKE, Platzhalter

LIKE % _Der Operator LIKE wird speziell für die Suche nach Zeichenketten mitHilfe von Platzhaltern verwendet. Der Platzhalter % (Prozentzeichen)steht in Access für eine beliebige Anzahl von unbekannten Zeichen. DerPlatzhalter _ (Unterstrich) steht in Access für genau ein unbekanntes Zei-chen.

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

Beginnt mit ...Das Ergebnis enthält nur die Datensätze, bei denen der Wert im Feldname mit M beginnt. Danach dürfen beliebig viele unbekannte Zeichenfolgen.

Abbildung 9.53 Auswahl mit Hilfe von LIKE

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

Enthält ...Das Ergebnis umfasst nur die Datensätze, die im Wert des Felds name denBuchstaben i enthalten. Davor und danach dürfen beliebig viele unbe-kannte Zeichen folgen.

Abbildung 9.54 Auswahl mit vielen beliebigen Zeichen

Page 311: Einstieg Mit VBA in Excel

310

Externe Daten9

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

Das Ergebnis enthält nur die Datensätze, deren erster Buchstabe ein M istund bei denen der vierte Buchstabe ein e und der fünfte ein r ist. Es wer-den also alle Personen gefunden, die Maier, Meier, Mayer, Meyer usw.heißen.

Abbildung 9.55 Auswahl mit einem beliebigen Zeichen

9.5.8 SQL: Abfrageergebnis sortieren

Ausgabe sortieren Die Reihenfolge der Datensätze im Abfrageergebnis lässt sich mit ORDERBY beeinflussen. Man gibt einen oder mehrere Sortierschlüssel an. DieSortierung ist normalerweise aufsteigend. Falls Sie eine absteigende Sor-tierung wünschen, müssen Sie den Zusatz DESC verwenden.

SQLCommand = "SELECT name, gehalt FROM personen ORDER BYgehalt DESC"

ORDER BY Die Datensätze sind absteigend nach Gehalt sortiert. Es werden nur dieWerte der Felder name und gehalt angezeigt.

Abbildung 9.56 Ausgabe mit fallender Sortierung

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

Die Datensätze sind nach name aufsteigend sortiert. Bei gleichem Namensind sie nach vorname aufsteigend sortiert.

Abbildung 9.57 Ausgabe mit doppeltem Sortierschlüssel

Page 312: Einstieg Mit VBA in Excel

311

Austausch mit Microsoft Access 9.5

9.5.9 SQL: Auswahlabfragen zur Suche nach Eingabe

Suche mit Suchbegriff

Sucht der Benutzer nach bestimmten Datensätzen, so kann der eingege-bene Suchbegriff in die SQL-Anweisung eingebaut werden:

SQLCommand = "SELECT * from personen WHERE name LIKE '" &Application.InputBox("Nach welchem Namen suchen Sie?") & "'"

Es werden alle Datensätze angezeigt, die den Wert im Feld name haben,den der Benutzer im Eingabefeld eingetragen hat.

Nach der Benutzereingabe in Abbildung 9.58 …

Abbildung 9.58 Suche nach Name

… wird das in Abbildung 9.59 dargestellte Ergebnis angezeigt.

Abbildung 9.59 Ergebnis der Suche nach Name

Beachten Sie, dass sich die Zeichenkette, die den SQL-Befehl enthält, ausmehreren Teilen zusammensetzt. Keinesfalls dürfen Sie die einfachenHochkommata vor und nach der Zeichenkette vergessen.

Noch einen Schritt weiter gehen wir mit dieser Anweisung:

SQLCommand = "SELECT * FROM personen WHERE name LIKE '%" &Application.InputBox("Nach welcher Zeichenkette suchen Sie?")& "%'"

Suche mit Teilbegriff

Es werden alle Datensätze angezeigt, die im Feld name einen Wert haben,in dem die Zeichenkette vorkommt, die der Benutzer im Eingabefeld ein-getragen hat.

Hinweis

Zur Verdeutlichung wurde für diese Abfrage kurzfristig ein Datensatz (Maier,Wolfgang) hinzugefügt.

Page 313: Einstieg Mit VBA in Excel

312

Externe Daten9

Nach einer Eingabe wie in Abbildung 9.60 …

Abbildung 9.60 Suche nach Zeichenkette

… werden die in Abbildung 9.61 dargestellten Datensätze angezeigt.

Abbildung 9.61 Ergebnis der Suche nach Zeichenkette

SQL kontrollieren Innerhalb des VBA-Programms ist es sinnvoll, sich zumindest währendder Entwicklung den zusammengesetzten Befehl anzeigen zu lassen.Erfahrungsgemäß werden gerade beim Einfügen von Suchparameternhäufig Fehler gemacht. Dazu können Sie die Anweisung MsgBox SQLCom-mand verwenden. Diese können Sie später wieder auskommentieren.Abbildung 9.62 zeigt die Ausgabe des SQL-Befehls für das letzte Beispiel.

Abbildung 9.62 Suche nach einem Namen, der »er« enthält

9.5.10 SQL: Aktionsabfrage zum Ändern mit UPDATE

UPDATE ... SET Die Anweisung UPDATE dient zur Änderung von Feldinhalten in einemoder mehreren Datensätzen in der Datenbanktabelle. Sie ähnelt in ihremAufbau der Anweisung SELECT. Die Auswahlkriterien sollten sorgfältiggewählt werden, da sonst eventuell nicht nur die gewünschten Daten-sätze verändert werden.

SQLCommand = "UPDATE personen SET gehalt = 3800"

Page 314: Einstieg Mit VBA in Excel

313

Austausch mit Microsoft Access 9.5

Diese Anweisung würde bei allen Datensätzen der Tabelle personen denWert für das Feld gehalt auf den Wert 3.800 setzen. Dies wäre sicherlichnicht realistisch.

WHERESQLCommand = "UPDATE personen SET gehalt = 3800 WHEREpersonalnummer = 2296"

Abbildung 9.63 zeigt das Ergebnis der Aktionsabfrage, nach erneutemImport aller Daten.

Abbildung 9.63 Ein Datensatz wurde geändert

Auswahl über Index

Diese Anweisung setzt nur bei einem Datensatz den Wert für das Feldgehalt neu. Es empfiehlt sich, in einer solchen Situation die Auswahlüber das Feld zu treffen, auf dem ein eindeutiger Index steht, also hierüber das Feld personalnummer.

Fehler findenVersuchen Sie, Änderungen vorzunehmen, die der Tabellenaufbau nichtzulässt, so wird eine Fehlermeldung zu VBA durchgeleitet. Es folgeneinige mögliche Fehler mit den zugehörigen Fehlermeldungen. Die Mel-dungen erscheinen aufgrund der Fehlerbehandlung mit On Error in derProzedur Aktionsabfrage(). Sie helfen bei der Suche nach der Ursache.

Leerer Wert� Sie möchten einen leeren Wert in ein Feld eintragen, das in Access sodefiniert ist, dass kein leerer Wert eingetragen werden darf. Ein Bei-spiel: SQLCommand = "UPDATE personen SET name = '' WHERE personal-nummer = 2296"

Abbildung 9.64 Fehlermeldung zu leerem Wert

Doppelter Wert� Es soll ein bereits vorkommender Wert in einem Feld, auf dem eineindeutiger Index steht, eingetragen werden. Ein Beispiel: SQLCom-mand = "UPDATE personen SET personalnummer = 6714 WHERE perso-nalnummer = 2296"

Page 315: Einstieg Mit VBA in Excel

314

Externe Daten9

Abbildung 9.65 Fehlermeldung zu doppeltem Wert

Ungültiger Wert � Sie möchten ein ungültiges Datum oder eine ungültige Zahl eintragen.Häufig wird dabei der Datentyp nicht erkannt. Ein Beispiel: SQLCom-mand = "UPDATE personen SET geburtstag = '32.12.1980' WHERE per-sonalnummer = 2296"

Abbildung 9.66 Fehlermeldung zu ungültigem Wert

9.5.11 SQL: Aktionsabfrage zum Einfügen mit INSERT

INSERT INTO Die Anweisung INSERT wird zum Einfügen neuer Datensätze genutzt.

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

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

Abbildung 9.67 Tabelle mit neuem Datensatz

VALUES Die Feldnamen in Klammern geben die Anzahl und Reihenfolge derWerte vor, die nach VALUES in Klammern stehen. Es sind wiederum dieeinfachen Hochkommata bei Zeichenketten und Datumsangaben zubeachten. Beim Einfügen können die gleichen Fehler auftreten wie beimÄndern.

Page 316: Einstieg Mit VBA in Excel

315

Austausch mit Microsoft Access 9.5

9.5.12 SQL: Aktionsabfrage zum Löschen mit DELETE

DELETEDie Anweisung DELETE dient zum Löschen von Datensätzen in derDatenbanktabelle. Sie ähnelt ebenfalls der Anweisung SELECT. Die Aus-wahlkriterien sollten sorgfältig gewählt werden, da sonst eventuell nichtnur die gewünschten Datensätze gelöscht werden.

SQLCommand = "DELETE FROM personen"

Diese Anweisung wird man vermutlich nie einsetzen: Sie löscht alle (!)Datensätze der Tabelle personen.

SQLCommand = "DELETE FROM personen WHERE personalnummer = 4711"

Auswahl über Index

Diese Anweisung löscht genau einen Datensatz, da die Auswahl über dasFeld getroffen wurde, auf dem ein eindeutiger Index steht, das Feld per-sonalnummer.

Page 317: Einstieg Mit VBA in Excel
Page 318: Einstieg Mit VBA in Excel

317

Die Gestaltung einer komfortablen Schnittstelle zwischen Anwendung und Benutzer ist Thema dieses Kapitels.

10 Dialogfelder

BenutzerführungDialogfelder eignen sich besonders zur komfortablen und deutlichenBenutzerführung. Dem Benutzer werden nur noch die für ihn relevantenAuswahlmöglichkeiten zur Verfügung gestellt. Er kann schneller undfehlerfreier mit der Excel-Anwendung arbeiten. Es gibt folgende Artenvon Dialogfeldern:

� Die Funktionen InputBox() und MsgBox() für einfache Ein- und Aus-gabedialoge. Sie wurden bereits in Kapitel 8, »VBA- und Worksheet-Funktionen«, erläutert.

Integrierte Dialogfelder

� Integrierte Dialogfelder für standardisierte Dialoge, z. B. zur Auswahleiner Datei oder einer Schriftformatierung. Diese Dialogfelder wer-den unmittelbar anschließend beschrieben.

Eigene Dialogfelder

� Eigene, individuelle Dialogfelder, die mit Hilfe von zahlreichen ver-schiedenen Steuerelementen genau auf die Bedürfnisse der Anwen-dung abgestimmt werden können. Sie folgen im letzten Abschnitt die-ses Kapitels.

10.1 Integrierte Dialogfelder

Dialogs(...).Show()

Es gibt eine sehr große Anzahl an integrierten Dialogfeldern. Sie sindbereits aus der Bedienung von Excel bekannt, können aber auch inner-halb von VBA-Anwendungen aufgerufen werden. Die Anzeige eines Dia-logfelds erfolgt über die Methode Application.Dialogs(<Kon-

stante>).Show():

� Die Konstante bestimmt den Typ des Dialogfelds. Dabei haben Sie dieAuswahl aus über 200 Möglichkeiten.

Rückgabewert� Die Methode Show() hat, abhängig vom Typ, bis zu 30 benannte Para-meter (= Argumente). Sie werden über arg1, arg2, arg3 usw. ausge-wählt. Der Rückgabewert ist entweder True oder False. Dies hängt

Page 319: Einstieg Mit VBA in Excel

318

Dialogfelder10

davon ab, ob das Dialogfeld ordnungsgemäß beendet oder abgebro-chen wurde.

xlDialogSendMail Das integrierte Dialogfeld zum Senden einer E-Mail haben wir bereits inAbschnitt 9.4, »Austausch mit Microsoft Outlook«, kennengelernt. Dazuwurde die Konstante xlDialogSendMail benötigt. Einige weitere Bei-spiele folgen.

10.1.1 Datei öffnen

xlDialogOpen Beim Dialog zum Öffnen einer Datei kann u. a. ein Dateiname (auch mitPlatzhalter) voreingestellt werden.

Sub DateiOeffnen()Dim Erfolg As BooleanErfolg = Application.Dialogs(xlDialogOpen). _

Show(arg1:="M*.xlsx")If Not Erfolg Then _

MsgBox "Keine Datei ausgewählt"End Sub

Das Ergebnis:

Abbildung 10.1 Dialogfeld »Datei öffnen«

Zur Erläuterung:

� Die Konstante ist xlDialogOpen.

� Es werden nur die Dateien angezeigt, die mit M beginnen und dieDateiendung .xlsx haben. In den Versionen vor Excel 2007 muss dieDateiendung .xls lauten, daher wird in diesem Falle die MethodeShow() in der Prozedur mit arg1:="M*.xls" aufgerufen. Natürlichkann der Benutzer diese Voreinstellung überschreiben.

Button »Öffnen« � Nach Betätigung des Buttons Öffnen werden die ausgewähltenDateien geöffnet.

� Nach Betätigung des Buttons Abbrechen wird eine Fehlermeldungangezeigt.

Page 320: Einstieg Mit VBA in Excel

319

Integrierte Dialogfelder 10.1

10.1.2 Datei speichern unter

xlDialogSaveAsBeim Dialog zum Speichern einer Datei kann u. a. ein einzelner Datei-name voreingestellt werden.

Sub DateiSpeichernUnter()Dim Erfolg As BooleanWorkbooks.AddErfolg = Application.Dialogs(xlDialogSaveAs). _

Show(arg1:="Test.xlsx")If Not Erfolg Then _

MsgBox "Keine Datei ausgewählt"End Sub

Das Ergebnis sehen Sie in Abbildung 10.2.

Abbildung 10.2 Dialogfeld »Speichern unter«

Zur Erläuterung:

Button »Speichern«

� Die Konstante ist xlDialogSaveAs.

� Falls der Benutzer nur den Button Speichern betätigt, wird die neuerzeugte Datei unter dem Namen Test.xlsx gespeichert.

10.1.3 Muster für Zellbereich auswählen

xlDialogPatternsNach Auswahl eines Zellbereichs, durch die Anwendung oder durch denBenutzer, kann ein Muster bzw. eine Zellhintergrundfarbe gewählt werden:

Sub AuswahlMuster()Dim Erfolg As BooleanThisWorkbook.Worksheets("Tabelle1"). _

Range("A1:C3").SelectErfolg = Application.Dialogs(xlDialogPatterns).Show

Hinweis

In den Versionen vor Excel 2007 muss die Dateibezeichnung in der Prozedurund in der Erläuterung wie folgt lauten: Test.xls.

Page 321: Einstieg Mit VBA in Excel

320

Dialogfelder10

If Not Erfolg Then _MsgBox "Kein Muster ausgewählt"

End Sub

Abbildung 10.3 zeigt das Ergebnis.

Abbildung 10.3 Dialogfeld »Zellen formatieren« (Ausfüllen)

Zur Erläuterung:

Button OK � Die Konstante ist xlDialogPatterns.

� Falls der Benutzer den Button OK betätigt, wird der ausgewählte Zell-bereich mit dem gewählten Muster formatiert.

10.1.4 Schriftformatierung für Zellbereich auswählen

xlDialogFont-Properties

Ähnlich wie ein Muster kann eine Schriftformatierung ausgewählt werden:

Sub AuswahlSchriftformatierung()Dim Erfolg As BooleanThisWorkbook.Worksheets("Tabelle1"). _

Range("A1:C3").SelectErfolg = Application.Dialogs _

(xlDialogFontProperties).ShowIf Not Erfolg Then _

MsgBox "Keine Schriftformatierung ausgewählt"End Sub

Das Ergebnis ist in Abbildung 10.4 dargestellt.

Zur Erläuterung:

Button »OK« � Die Konstante ist xlDialogFontProperties.

� Falls der Benutzer den Button OK betätigt, wird der ausgewählte Zell-bereich mit den gewählten Schrifteigenschaften formatiert.

Page 322: Einstieg Mit VBA in Excel

321

Eigene Dialogfelder und Anwendungen 10.2

Abbildung 10.4 Dialogfeld »Zellen formatieren« (Schrift)

10.2 Eigene Dialogfelder und Anwendungen

SteuerelementeEigene Dialogfelder können mit Hilfe von verschiedenen Steuerelemen-ten genau auf die Bedürfnisse einer Anwendung abgestimmt werden.

10.2.1 Ein erstes Beispiel

Zu Beginn ein einfaches Beispiel mit zwei Buttons:

Abbildung 10.5 Erstes eigenes Dialogfeld

Zur Erläuterung:

Steuerelement Button

� Nach Betätigung des Buttons Hallo erscheint eine kurze Meldung.

� Nach Betätigung des Buttons Ende wird das Dialogfeld beendet.

10.2.2 Erstes Beispiel: Gestaltung

UserFormIn diesem Abschnitt geht es um die reine Gestaltung des Beispiels. ZurErstellung eines Dialogfelds wählen Sie im VBE im Menü Einfügen denMenüpunkt UserForm. Es erscheint ein leeres Dialogfeld in Standard-größe. Außerdem wird ein kleines Dialogfeld mit einer Reihe von Steuer-elementen, die Werkzeugsammlung (Toolbox), eingeblendet.

Page 323: Einstieg Mit VBA in Excel

322

Dialogfelder10

Abbildung 10.6 Toolbox

Werkzeug-sammlung

Sollte die Toolbox einmal nicht eingeblendet sein, dann aktivieren Siedas Formular zuerst durch einfachen Klick und wählen dann im MenüAnsicht den Menüpunkt Werkzeugsammlung aus.

Per Maus Steuerelemente können mit der Maus aus der Werkzeugsammlung aufdas Dialogfeld gezogen werden. In unserem Falle sind dies zwei Buttons.

Eigenschaften-Fenster

Im Eigenschaften-Fenster sollten Sie nun einige Eigenschaften der Steu-erelemente einstellen. Dazu wählen Sie das entsprechende Steuerele-ment durch einen einfachen Klick aus. Anschließend notieren Sie dengewünschten Wert neben der Eigenschaft. Manche Eigenschaften kön-nen aus einer Liste ausgewählt werden.

Eigenschaft»Name«

Die wichtigste Eigenschaft eines Steuerelements ist sein Name. Über die-sen Namen wird das Element im VBA-Code angesprochen, daher sollteer als Erstes eingestellt und möglichst nicht mehr verändert werden.

frm, cmd, txt Es gibt Konventionen für die Namensgebung; sie erleichtern die Lesbar-keit des VBA-Codes. Der Name sollte sich aus drei Buchstaben für den Typdes Steuerelements (frm für Dialogfeld, cmd für Button, txt für Textfeldusw.) und einem selbsterklärenden Begriff zusammensetzen. Im vorlie-genden Beispiel werden die Eigenschaften wie in Tabelle 10.1 geändert.

Erklärung Eigenschaft Wert

Name des Dialogfelds (Name) frmErstes

Aufschrift des Dialogfelds Caption Erstes Beispiel

Name des ersten Buttons (Name) cmdHallo

Aufschrift des ersten Buttons Caption Hallo

Name des zweiten Buttons (Name) cmdEnde

Aufschrift des zweiten Buttons Caption Ende

Tabelle 10.1 Eigenschaften und Werte der Steuerelemente

Page 324: Einstieg Mit VBA in Excel

323

Eigene Dialogfelder und Anwendungen 10.2

Eigenschaft einstellen

Viele Steuerelemente haben die Eigenschaft Caption. Damit wird derTitel bzw. der Text neben oder auf dem Steuerelement bezeichnet. ImEigenschaftsfenster sehen die Eigenschaften des Dialogfelds (als Beispiel)wie in Abbildung 10.7 aus.

Abbildung 10.7 Eigenschaften des Dialogfelds

10.2.3 Erstes Beispiel: Code

EreignisprozedurDas kleine Beispiel aus dem vorherigen Abschnitt muss noch mit Codeversehen werden. Was passiert, wenn der Benutzer einen der Buttonsbetätigt? Dazu müssen zwei Ereignisprozeduren erstellt werden.

Prozedur füllenZum Erstellen doppelklicken Sie auf dem entsprechenden Button. Eserscheint eine leere Ereignisprozedur, deren Name sich aus dem Steuer-element und dem Ereignis zusammensetzt. In dieser Prozedur wird derCode zu dem Ereignis Click des jeweiligen Buttons gespeichert.

Button »Hallo«Im Falle des Buttons Hallo ist der Name also cmdHallo_Click. Dieseleere Prozedur wird nun mit VBA-Code gefüllt:

Private Sub cmdHallo_Click()MsgBox "Hallo"

End Sub

Steuerelement und Ereignis auswählen

Eine Ereignisprozedur kann auch so erstellt werden wie für ein Ereigniseiner Arbeitsmappe oder eines Tabellenblatts:

� Wählen Sie im Projekt-Explorer das Dialogfeld (=frmErstes) aus.

� Betätigen Sie den Menüpunkt Code im Menü Ansicht.

� Wählen Sie in der linken Liste oberhalb des Codefensters das Steuer-element aus.

� Aus der rechten Liste oberhalb des Codefensters wählen Sie das Ereignis.

Ansicht wechselnZwischen den beiden Ansichten Code und Objekt können Sie immer überdas Menü Ansicht wechseln.

Page 325: Einstieg Mit VBA in Excel

324

Dialogfelder10

Button »Ende« Die Prozedur für den Button Ende:

Private Sub cmdEnde_Click()Unload Me

End Sub

Zur Erläuterung:

Unload Me � Mit der Anweisung Unload wird ein Objekt aus dem Speicher entla-den. Alle lokalen oder modulweiten Variablen des Dialogfelds stehenanschließend nicht mehr zur Verfügung.

� Durch Me wird das aktuelle Objekt, in diesem Falle das Dialogfeld,bezeichnet.

10.2.4 Erstes Beispiel: Starten

Taste F5 Zum Testen des Dialogfelds innerhalb des VBE muss nur die Taste (F5)betätigt werden. Falls das Dialogfeld aus dem Tabellenblatt heraus gestar-tet werden soll, wird eine weitere Prozedur benötigt. Diese wird ineinem normalen Code-Modul gespeichert:

Sub DialogAnzeigen()frmErstes.ShowMsgBox "Dialogfeld geschlossen"

End Sub

Zur Erläuterung:

Show() � Die Methode Show() lädt das Dialogfeld in den Speicher und zeigt esan.

Workbook_Open Sie könnten zum Beispiel das Ereignis Öffnen der Arbeitsmappe mit derAnzeige des Dialogfelds verbinden:

Private Sub Workbook_Open()frmErstes.Show

End Sub

Hinweise

Modales Dialogfeld� Es handelt sich um ein gebundenes Dialogfeld (engl. modal). Das bedeu-

tet, dass in Excel keine anderen Aktionen ausgeführt werden können,solange das Dialogfeld angezeigt wird. Auch der weitere VBA-Code inder Prozedur DialogAnzeigen() wird erst ausgeführt, wenn das Dialog-feld wieder geschlossen wurde. Diese Eigenschaft ist von großem Vorteil,denn der Benutzer wird deutlicher durch die Anwendung geführt.

Page 326: Einstieg Mit VBA in Excel

325

Eigene Dialogfelder und Anwendungen 10.2

BenutzerführungDamit veranlassen Sie den Benutzer dazu, zunächst bestimmte Daten ein-zugeben und auszuwählen, bevor er die Tabellenblätter der Arbeits-mappe nutzen kann.

Exportieren und Importieren

UserForm exportieren

Ein UserForm-Modul mit einem Dialogfeld kann, genauso wie ein reinesCode-Modul, exportiert und importiert werden. Der Vorgang wird aus-führlich in Abschnitt 5.6, »Module exportieren und importieren«, erläu-tert. Der einzige Unterschied: Es werden zwei Dateien erzeugt, mit denDateiendungen .frm und .frx, statt nur einer Datei mit der Dateiendung.bas.

Abbildung 10.8 Dialogfeld »Datei exportieren«

10.2.5 Arbeiten mit Steuerelementen

Größe und Ort von Steuerelementen können mit der Maus leicht einge-stellt werden. Dadurch ändern sich folgende Eigenschaften:

Width, Height� Width: Breite

� Height: Höhe

vbModeless� Die Möglichkeit, ein Dialogfeld ungebunden aufzurufen, wird seltener

genutzt. Dazu gibt es den optionalen Parameter vbModeless. In diesemFalle können trotz geöffneten Dialogfelds weitere Aktionen im Tabellen-blatt ausgeführt werden. Das Dialogfeld Suchen und Ersetzen in Wordoder Excel wird auf diese Weise aufgerufen.

Page 327: Einstieg Mit VBA in Excel

326

Dialogfelder10

Left, Top � Left: Abstand zum linken Rand

� Top: Abstand zum oberen Rand

Umgekehrt können Größe und Ort durch die Eingabe von Werten imEigenschaften-Fenster verändert werden.

Menü »Format« Eine einheitliche Größe oder Anordnung erreichen Sie über die zahlrei-chen Menüpunkte im Menü Format erreichen. Vorher müssen Sienatürlich mindestens zwei Steuerelemente gleichzeitig mit der Maus undder Taste (Strg) auswählen.

Abbildung 10.9 Zwei gleichzeitig ausgewählte Steuerelemente

Steuerelementkopieren

Steuerelemente können mit den bekannten Methoden (z. B. (Strg)+(C)und (Strg)+(V)) kopiert werden. Dadurch ersparen Sie sich einige Arbeit,falls Sie bereits eine Reihe von Eigenschaften eingestellt haben.

Steuerelement-wert

Die Ermittlung des Werts eines Steuerelements (z. B. den Inhalt einesTextfelds) und eine anschließende Reaktion können zu unterschiedlichenZeitpunkten erfolgen:

Bei Ereignis � Unmittelbar nachdem sich bei dem Steuerelement etwas ereignet hat,also zum Beispiel:

� nach der Änderung des Inhalts eines Textfelds

� nach dem Markieren eines Kontrollkästchens

� nach der Auswahl eines bestimmten Listeneintrags

Bei Übernahme � Erst später bei der Übernahme der eingestellten bzw. ausgewähltenWerte in einen anderen Teil der Anwendung.

Dies hängt vom Einsatzzweck der Anwendung ab.

Page 328: Einstieg Mit VBA in Excel

327

Eigene Dialogfelder und Anwendungen 10.2

10.2.6 Textfeld und Bezeichnungsfeld

Eingabe, AnzeigeTextfelder (engl. textbox) dienen zur Eingabe von Texten oder Zahlen.Bezeichnungsfelder (engl. label) enthalten Bezeichnungen. Dies sind imAllgemeinen Texte und Zahlen, die dem Benutzer nur angezeigt werden,die er aber nicht verändern kann.

Im folgenden Beispiel gibt es drei Bezeichnungsfelder, drei Textfelderund zwei Buttons. In den ersten beiden Textfeldern kann der Benutzerzwei Zahlen eingeben. Die Summe der beiden Zahlen wird im drittenTextfeld angezeigt, sobald man den ersten Button betätigt. Bei Betätigungdes zweiten Buttons wird die gleiche Summe in einem Tabellenblattangezeigt.

Abbildung 10.10 Addition von zwei Zahlen

lbl, txtDie drei Bezeichnungsfelder bekommen die Namen lblZahl1, lblZahl2und lblErgebnis. Die drei Textfelder heißen entsprechend txtZahl1,txtZahl2 und txtErgebnis.

Der Code der Ereignisprozedur des ersten Buttons:

Private Sub cmdTextfeld_Click()If Not IsNumeric(txtZahl1.Text) Or _

Not IsNumeric(txtZahl2.Text) ThenMsgBox "Bitte Zahlen eingeben"

ElsetxtErgebnis.Text = CDbl(txtZahl1.Text) _

+ CDbl(txtZahl2.Text)End If

End Sub

Page 329: Einstieg Mit VBA in Excel

328

Dialogfelder10

Zur Erläuterung:

Eigenschaft »Text« � Die Eigenschaft Text eines Textfelds enthält die eingegebene Zeichen-kette.

Prüfen � Zunächst wird mit Hilfe der VBA-Funktion IsNumeric() geprüft, obin beiden Textfeldern eine Zeichenkette steht, die in eine Zahl umge-wandelt werden kann.

Umwandeln � Ist dies der Fall, dann werden beide Zeichenketten mit der VBA-Funk-tion CDbl() in Zahlen umgewandelt. Anschließend werden die beidenZahlen addiert.

Ausgeben � Das Ergebnis wird im dritten Textfeld ausgegeben.

Zur Ausgabe des Ergebnisses in einem Tabellenblatt dient die Ereignis-prozedur des zweiten Buttons:

Private Sub cmdTabellenblatt_Click()If Not IsNumeric(txtZahl1.Text) Or _

Not IsNumeric(txtZahl2.Text) ThenMsgBox "Bitte Zahlen eingeben"

ElseThisWorkbook.Worksheets("Tabelle1"). _

Range("A1").Value = CDbl(txtZahl1.Text) _+ CDbl(txtZahl2.Text)

End IfEnd Sub

Zur Erläuterung:

� Die Textfelder werden wiederum geprüft.

Übermittlung zumTabellenblatt

� Die Summe wird in die Zelle A1 des ersten Tabellenblatts übermittelt.

10.2.7 Optionsschaltflächen und Kontrollkästchen

Options-schaltfläche

Optionsschaltflächen (engl. radio buttons) bieten eine Auswahl aus meh-reren Möglichkeiten an. Der Benutzer kann zwischen den Radio Buttons,die zu einer Gruppe gehören, hin und her schalten.

Frame Falls auf einem Dialogfeld mehrere unabhängige Gruppen von Radio But-tons benötigt werden, so sollten Sie mit Rahmen (engl. frames) arbeiten.

Hinweis

Bitte rufen Sie sich in Erinnerung, dass Werte aus Dialogfeldern nach demSchließen und Entladen des Dialogs nicht mehr zur Verfügung stehen. Siemüssen also vor dem Schließen zum Tabellenblatt übermittelt werden.

Page 330: Einstieg Mit VBA in Excel

329

Eigene Dialogfelder und Anwendungen 10.2

KontrollkästchenEin Kontrollkästchen (engl. checkbox) dient zum Einstellen und Anzeigenvon zwei möglichen Zuständen. Dabei kann es sich um die beidenZustände »an« oder »aus« handeln oder z. B. um die Zustände »farbig«oder »schwarz-weiß«.

Erstellungs-reihenfolge

Im folgenden Beispiel werden zwei Frames dargestellt, die jeweils dreiRadio Buttons enthalten, außerdem zwei Kontrollkästchen und zwei But-tons. Zur Erstellung empfiehlt sich die folgende Reihenfolge:

1. Einfügen des ersten Frames

2. Größe und Ort des Frames einstellen

3. Einfügen eines Radio Buttons in den Frame

4. Größe und Ort des Radio Buttons einstellen

5. Zweifaches Kopieren des Radio Buttons innerhalb des Frames

Abbildung 10.11 Erster Frame mit Radio Buttons

6. Kopieren des gesamten Frames (inklusive der drei Radio Buttons)

7. Ort des zweiten Frames einstellen

8. Erstellen und Anordnen der restlichen Steuerelemente

9. Eigenschaftswerte

10. Eingabe der Eigenschaftswerte für alle Steuerelemente (Name, Caption)

Zur Erläuterung:

� Mit Hilfe des Dialogfelds sollen Eigenschaften einer Tabellenzelle ein-gestellt werden.

Farboptionen� In der ersten Gruppe wird die Schriftfarbe gewählt.

Größenoptionen� Die zweite Gruppe dient zur Einstellung der Schriftgröße.

Mit/ohne Rahmen� Durch die beiden Kontrollkästchen entscheidet der Benutzer, ob dieZelle einen Rahmen (bzw. ein Muster) haben soll.

Page 331: Einstieg Mit VBA in Excel

330

Dialogfelder10

Abbildung 10.12 Gesamtes Dialogfeld, Startzustand

Optionvoreinstellen

Innerhalb der beiden Gruppen von Radio Buttons sollte eine Optionbereits voreingestellt sein. Damit vermeiden Sie einen »undefiniertenZustand«. Diese Voreinstellung können Sie entweder über das Eigen-schaftsfenster oder per Code vornehmen.

Synchronisieren Es empfiehlt sich, den gewünschten Anfangszustand synchron für Tabel-lenzelle und Dialogfeld vorzunehmen.

Ereignis»initialisieren«

Dazu ist das Ereignis Initialisieren des Dialogfelds geeignet:

Option ExplicitDim Rg As Range

Private Sub UserForm_Initialize()Set Rg = ThisWorkbook.Worksheets("Tabelle1"). _

Range("B2")

Rg.Value = "Hallo"Rg.Font.Color = vbRedRg.Font.Size = 13Rg.Borders.LineStyle = xlDouble

optRot.Value = Trueopt13.Value = TruechkRahmen.Value = True

End Sub

Zur Erläuterung:

� Die Variable Rg vom Typ Range wird modulweit deklariert.

Page 332: Einstieg Mit VBA in Excel

331

Eigene Dialogfelder und Anwendungen 10.2

UserForm_Initialize()

� Innerhalb der Ereignisprozedur UserForm_Initialize() wird derVariablen Rg die Zelle B2 zugewiesen.

� Diese Zelle bekommt einen Inhalt, eine Schriftfarbe und -größe sowieeinen Rahmen.

Eigenschaft »Value«

� Anschließend werden die entsprechenden Einstellungen für die Steu-erelemente vorgenommen. Sowohl bei Radio Buttons als auch beiKontrollkästchen steht die Eigenschaft Value für den Zustand (WertTrue für an, Wert False für aus).

Abbildung 10.13 Tabellenblatt, Startzustand

Button »Übertragen«

Der Code des Buttons Übertragen dient zur Übernahme der Auswahldes Benutzers und zum Einstellen der Eigenschaften der Tabellenzelle:

Private Sub cmdÜbertragen_Click()If optRot.Value Then

Rg.Font.Color = vbRedElseIf optGelb.Value Then

Rg.Font.Color = vbYellowElse

Rg.Font.Color = vbGreenEnd If

If opt10.Value ThenRg.Font.Size = 10

ElseIf opt13.Value ThenRg.Font.Size = 13

ElseRg.Font.Size = 16

End If

If chkRahmen.Value ThenRg.Borders.LineStyle = xlDouble

ElseRg.Borders.LineStyle = xlLineStyleNone

End If

If chkMuster.Value ThenRg.Interior.Color = vbBlue

Page 333: Einstieg Mit VBA in Excel

332

Dialogfelder10

ElseRg.Interior.Color = xlColorIndexNone

End IfEnd Sub

Zur Erläuterung:

Value True/False � Da der Wert der Eigenschaft Value der Radio Buttons und der Kon-trollkästchen vom Typ Boolean ist, kann er unmittelbar für die ver-schiedenen Verzweigungen genutzt werden. Er muss nicht mehr mitTrue verglichen werden.

Mehrfachver-zweigung

� Bei den Gruppen von Radio Buttons wird die Schriftfarbe bzw. -größeper Mehrfachverzweigung eingestellt.

EinfacheVerzweigung

� Rahmen und Muster werden abhängig vom Wert des zugehörigenKontrollkästchens in einer einfachen Verzweigung ausgewählt.

Button »Ende« Der Button Ende dient mit Hilfe des folgenden Codes wieder zum Schlie-ßen des Dialogfelds:

Private Sub cmdEnde_Click()Unload Me

End Sub

10.2.8 Liste, Bildlaufleiste und Drehfeld

Listenfeld,Kombifeld

Ein Listenfeld bietet dem Benutzer die Möglichkeit, einen Eintrag auseiner Liste auszuwählen. Ein Kombinationsfeld ist eine Kombination auseinem Listenfeld und einem Textfeld. Der Benutzer kann also nicht nurauswählen, sondern auch eintragen.

Falls Sie bei einem Kombinationsfeld die Eigenschaft Style auf den Wert2 (= fmStyleDropDownList) stellen, dann handelt es sich um ein Listen-feld, wie Sie es von Microsoft Windows gewohnt sind: Es hat einen ein-fachen Pfeil, mit dem die Liste aufgeklappt werden kann.

ScrollBar,SpinButton

Sowohl Bildlaufleiste (ScrollBar) als auch Drehfeld (SpinButton) dienenzur Einstellung von Zahlenwerten innerhalb eines vorgegebenenBereichs. Sie sind in ihrer Funktion ähnlich, allerdings lässt sich eineBildlaufleiste größer und deutlicher darstellen.

Ereignis »Change« Allen Steuerelementen in diesem Abschnitt ist eines gemeinsam: Daswichtigste Ereignis ist Change, d. h. Auswahl wurde geändert. Im folgen-den Beispiel werden die drei genannten Steuerelemente vorgestellt.

Page 334: Einstieg Mit VBA in Excel

333

Eigene Dialogfelder und Anwendungen 10.2

Daneben steht jeweils ein Textfeld, in dem der ausgewählte bzw. einge-stellte Wert abgebildet wird.

Abbildung 10.14 Auswahl per Liste, Bildlaufleiste, Drehfeld

Eigenschaft »Locked«

Bei allen drei Textfeldern wurde die Eigenschaft Locked auf True gesetzt.Dadurch können sie nicht mehr direkt durch eine Eingabe des Benutzersverändert werden, nur noch durch die Anwendung. Zur optischen Her-vorhebung wurde bei allen drei Textfeldern die Eigenschaft BackColorauf grau gestellt.

Der Programmcode zum Dialogfeld:

Private Sub UserForm_Initialize()cmbStadt.AddItem "Berlin"cmbStadt.AddItem "Hamburg"cmbStadt.AddItem "München"

cmbStadt.ListIndex = 0End Sub

Private Sub cmbStadt_Change()txtStadt.Text = cmbStadt.Text

End Sub

Private Sub scrZahl1_Change()txtZahl1.Text = scrZahl1.Value

End Sub

Private Sub spnZahl2_Change()txtZahl2.Text = spnZahl2.Value

End Sub

Private Sub cmdEnde_Click()Unload Me

End Sub

Page 335: Einstieg Mit VBA in Excel

334

Dialogfelder10

Abbildung 10.15 Liste und zugehöriges Textfeld

Zur Erläuterung der Liste:

Eigenschaft»Style«

� Die Eigenschaft Style des Kombinationsfelds wird zur Entwurfszeitim Eigenschaftsfenster manuell auf den Wert 2 (= fmStyleDropDown-List) gestellt. Damit erzeugen Sie das Aussehen einer Liste, mit einemeinfachen Pfeil zum Aufklappen.

AddItem() � Beim Initialisieren des Dialogfelds wird die Liste mit Einträgen gefüllt.Dazu dient die Methode AddItem().

List(Nummer) � Die Einträge in einem Listenfeld oder einem Kombinationsfeld sind(mit 0 beginnend) durchnummeriert. Einen bestimmten Eintragerreicht man über die Eigenschaft List(Nummer).

ListIndex � Der erste Eintrag der Liste wird ausgewählt. Dazu stellen Sie den Wertder Eigenschaft ListIndex auf 0. Diese Eigenschaft repräsentiert zujedem Zeitpunkt die Nummer der aktuellen Auswahl innerhalb derListe.

Ereignis »Change« � Falls das Ereignis Change eintritt, wird die zugehörige Ereignisproze-dur durchlaufen.

Eigenschaft »Text« � Die Eigenschaft Text repräsentiert zu jedem Zeitpunkt den Text deraktuellen Auswahl innerhalb der Liste. Ihr Wert wird dem Textfeldzugewiesen.

Abbildung 10.16 Bildlaufleiste und zugehöriges Textfeld

Zur Erläuterung der Bildlaufleiste:

Eigenschaften � Sie soll waagerecht liegen, zur Einstellung von Werten zwischen 1und 100 dienen und zu Beginn bei 50 stehen. Ein Klick auf einen derbeiden Pfeile soll den Wert um 1 verändern. Ein Klick auf den freienBereich zwischen den beiden Pfeilen soll den Wert um 10 verändern.

Page 336: Einstieg Mit VBA in Excel

335

Eigene Dialogfelder und Anwendungen 10.2

Min, Max, Value� Daher werden zur Entwurfszeit die folgenden Eigenschaften einge-stellt:

� Orientation: 1 (= fmOrientationHorizontal)

� Min: 1

� Max: 100

� Value: 50

� SmallChange: 1

� LargeChange: 10

Ereignis »Change«� Falls das Ereignis Change eintritt, wird die zugehörige Ereignisproze-dur durchlaufen.

Value� Die Eigenschaft Value repräsentiert zu jedem Zeitpunkt den aktuellenWert. Er wird dem Textfeld zugewiesen.

Abbildung 10.17 Drehfeld und zugehöriges Textfeld

Zur Erläuterung des Drehfelds:

� Eigenschaften und Ereignisprozeduren werden wie bei der Bildlauf-leiste eingestellt.

SmallChange� Es gibt allerdings nur die Eigenschaft SmallChange, nicht die Eigen-schaft LargeChange, da das Drehfeld eine andere Darstellung hat.Außerdem soll es senkrecht stehen: Die Eigenschaft Orientationbekommt den Wert 0 (= fmOrientationVertical)

10.2.9 Ausgabeformatierung

Format()Einige Möglichkeiten der Funktion Format() zur Ausgabeformatierunginnerhalb von Nachrichten-Dialogfeldern wurden bereits vorgestellt(siehe Abschnitt 8.3.2, »Ausgabeformatierung«). Bei der Ausgabe in Steu-erelementen von eigenen Dialogfeldern zeigt diese Funktion noch weite-ren Nutzen. Nachfolgend ein Dialogfeld, in dem in einem Listenfeld undin einem Bezeichnungsfeld jeweils eine kleine Tabelle ausgegeben wird.

Zeichen gleich breit

Bei beiden Steuerelementen wird zunächst die Eigenschaft Font auf Cou-rier New gestellt. Dabei handelt es sich um eine Nicht-Proportional-schriftart, das heißt, jedes Zeichen nimmt die gleiche Breite ein. Dies istfür die Formatierung in Tabellenform wichtig.

Page 337: Einstieg Mit VBA in Excel

336

Dialogfelder10

SpecialEffect Außerdem wurde die Eigenschaft SpecialEffect des Bezeichnungsfeldsauf den Wert 2 (= fmSpecialEffectSunken) gesetzt. Durch diese etwasvertiefte Darstellung wird das Feld deutlicher erkennbar.

Zunächst die Anwendung:

Private Sub UserForm_Initialize()Dim Nr(1 To 3) As IntegerDim Prod(1 To 3) As StringDim Preis(1 To 3) As SingleDim Zeile As StringDim i As Integer

' Felder initialisierenNr(1) = 5Nr(2) = 11Nr(3) = 346Prod(1) = "Apfel"Prod(2) = "Banane"Prod(3) = "Kartoffel"Preis(1) = 2Preis(2) = 1.95Preis(3) = 2.5

' AusgabelblTabelle.Caption = ""For i = 1 To 3

' Formatierte Ausgabezeile zusammenstellenZeile = Format(Nr(i), "@@@@") & _

" " & Format(Prod(i), "!@@@@@@@@@@@@") & _Format(Format(Preis(i), "0.00€"), "@@@@@@@")

' Zeile zu Listenfeld hinzufügenlstTabelle.AddItem Zeile

' Zeile zu Bezeichnungsfeld hinzufügenlblTabelle.Caption = _

lblTabelle.Caption & Zeile & vbCrLfNext i

End Sub

Das Ergebnis sehen Sie in Abbildung 10.18.

Page 338: Einstieg Mit VBA in Excel

337

Eigene Dialogfelder und Anwendungen 10.2

Abbildung 10.18 Formatierte Ausgabe

Zur Erläuterung:

� Zunächst werden drei Datenfelder vom Typ Integer, String undSingle deklariert und mit einigen Werten gefüllt.

� Die drei zusammengehörigen Feldelemente werden zu einer forma-tierten Zeichenkette zusammengefügt.

� Diese Zeichenkette wird dem Listenfeld und dem Bezeichnungsfeldhinzugefügt.

Rechtsbündig� Die Formatierung @@@@ führt dazu, dass die Integer-Zahl einheitlichrechtsbündig mit der Breite 4 ausgegeben wird. Jedes @ steht für einZeichen.

Linksbündig� Mit Hilfe des Ausrufezeichens können Sie eine linksbündige Ausgabeerzeugen. Im vorliegenden Fall wird mit der Formatierung!@@@@@@@@@@@@ die Zeichenkette einheitlich linksbündig mit derBreite 12 ausgegeben.

Geschachteltes Format

� Hier haben wir eine Schachtelung von zwei Aufrufen der FunktionFormat(). Die innere Formatierung 0.00€ ist bereits bekannt undergibt eine Zeichenkette, die eine Zahl mit zwei Nachkommastellenund einem anschließenden Eurozeichen beinhaltet. Die äußere For-matierung sorgt dafür, dass diese Zeichenkette einheitlich rechtsbün-dig mit der Breite 7 ausgegeben wird.

10.2.10 RefEdit und Umschaltfeld

Zellbereich eingeben

Das RefEdit-Steuerelement wird genutzt, um Zellbereiche eines Tabellen-blatts zu ermitteln. Es arbeitet ähnlich wie die Funktion Applica-tion.InputBox(). Allerdings steht es nicht allein, sondern wird mit wei-teren Steuerelementen auf einem Dialogfeld kombiniert. Zellbereichekönnen per Tastatur oder per Maus eingegeben werden.

Page 339: Einstieg Mit VBA in Excel

338

Dialogfelder10

Abbildung 10.19 Dialogfeld mit RefEdit-Steuerelement, Startzustand

Eingabe per Maus Die Eingabe per Maus ist nur möglich, wenn der Cursor zunächst imRefEdit-Steuerelement steht. Beim anschließenden Klick im Tabellenblattverkleinert sich das gesamte Dialogfeld, so dass nur noch das RefEdit-Steuerelement sichtbar ist.

Abbildung 10.20 RefEdit, nach Auswahl eines Zellbereichs

Umschaltfeld Ein Umschaltfeld (engl. toggle button) dient zur Umschaltung bzw.Anzeige von zwei möglichen Zuständen. Die wichtigste Eigenschaft istValue; sie steht entweder auf True oder auf False. Im folgenden Beispielwerden die beiden Steuerelemente genutzt, um einen ausgewählten Zell-bereich mit oder ohne gelbe Farbe darzustellen:

Abbildung 10.21 Nach Umschalten auf Farbe und Übertragen

Page 340: Einstieg Mit VBA in Excel

339

Eigene Dialogfelder und Anwendungen 10.2

Der Programmcode:

Private Sub tglFarbe_Click()If tglFarbe.Value Then

tglFarbe.BackColor = vbYellowElse

tglFarbe.BackColor = vbWhiteEnd If

End Sub

Private Sub cmdÜbertragen_Click()On Error GoTo Fehler

If tglFarbe.Value ThenRange(rfeZellbereich.Value).Interior. _

Color = vbYellowElse

Range(rfeZellbereich.Value).Interior. _Pattern = xlNone

End IfExit Sub

Fehler:MsgBox "Es wurde kein Bereich ausgewählt"

End Sub

Private Sub cmdEnde_Click()Unload Me

End Sub

Zur Erläuterung:

Umschaltfeld� Beim Betätigen des Umschaltfelds wechselt der Wert der EigenschaftValue von True auf False bzw. umgekehrt. Zur deutlicheren Darstel-lung wird gleichzeitig die Farbe des Umschaltfelds gewechselt. Falls eseingeschaltet ist, also vertieft dargestellt wird, dann ist es gelb, ansons-ten weiß.

Button »Übertragen«

� Beim Betätigen des Buttons Übertragen wird der ausgewählte Zellbe-reich entweder gelb eingefärbt oder ohne Muster dargestellt. Da es mög-lich ist, im RefEdit-Feld etwas einzutragen, was keinem Zellbereich ent-spricht, muss dies mit Hilfe von On Error abgefangen werden.

Page 341: Einstieg Mit VBA in Excel
Page 342: Einstieg Mit VBA in Excel

341

Ein umfangreiches Beispielprojekt verbindet zahlreiche Aspekte der VBA-Programmierung, die Sie in diesem Buch erlernt haben, miteinander.

11 Beispielprojekt

Kleine Beispielprogramme und Übungen können die einzelnen Program-miertechniken vermitteln. Dies gilt besonders für die Beispiele in denfortgeschrittenen Kapiteln, da hier die Grundlagen vorausgesetzt undbenötigt werden.

ZusammenarbeitBei einem Projekt kann man allerdings noch deutlicher die Zusammenar-beit der einzelnen Teile einer Anwendung darstellen. In dem Projekt»Nordwind« in diesem Abschnitt werden u. a. folgende Aspekte gemein-sam eingesetzt:

� Zugriff auf Tabellen und Zellbereiche

� Einsatz von Datenfeldern und benutzerdefinierten Datentypen

� Dialogfelder, Steuerelemente und Ereignisprogrammierung

� eindeutige Benutzerführung zur Vermeidung von Fehlern

� Modularisierung, also die Unterteilung des Programms in übersichtli-che Einzelteile, und der Aufruf der Module von verschiedenen Stellenaus

Neue TechnikenEinige Techniken, deren Einsatzzweck und Vorteile sich in einfachen Bei-spielen gar nicht verdeutlichen lassen, werden im Projekt sogar erstmalsgenutzt und erläutert.

Anpassen, erweitern

Außerdem kann der Entwickler die Anwendung individuell verbessern,erweitern und seinen Bedürfnissen anpassen.

11.1 Was ist Nordwind?

WarenwirtschaftBei der Datei Nordwind.mdb handelt es sich eigentlich um eine Beispiel-Datenbank, die zusammen mit Access ausgeliefert wird. Sie enthält ein

Page 343: Einstieg Mit VBA in Excel

342

Beispielprojekt11

Warenwirtschaftsprogramm mit Kunden- und Artikelverwaltung sowieBestell- und Rechnungswesen.

Vorlage für Projekt Die Nordwind-Datenbank wurde für dieses Projekt als Vorlage genom-men. Es wird gezeigt, dass mit einer Excel-Datei, einigen Dialogfeldernund den in diesem Buch vorgestellten Mitteln der VBA-Programmierungbereits einige wichtige Aspekte der Warenwirtschaft umgesetzt werdenkönnen.

Das Projekt umfasst folgende Möglichkeiten:

� Neuanlage, Ändern und Löschen von Kundendaten

� Neuanlage, Ändern und Löschen von Artikeldaten

� Neuanlage von Bestellungen, inklusive E-Mail-Versand einer Bestell-bestätigung

Vorteile Die Vorteile der Anwendung gegenüber der reinen Speicherung derTabellendaten:

Schutz � Der Benutzer hat keine Möglichkeit, direkt auf die Tabellendatenzuzugreifen. Er kann Änderungen nur kontrolliert über die Dialogfel-der vornehmen. Daten und Struktur der Tabellen werden damit vorversehentlichen Änderungen geschützt.

Hilfe � Dem Benutzer stehen Hilfen zur Eingabe und zum Suchen bestimmterDaten zur Verfügung.

Eindeutigkeit � Den Kunden, Artikeln und Bestellungen werden eindeutige Num-mern zugeordnet. Damit können die Zusammenhänge zwischen denverschiedenen Informationen eindeutig hergestellt werden und dieDaten ohne Redundanz, das heißt ohne Doppelinformation, gespei-chert werden.

11.2 Vorbereitungen für das Projekt

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

Hinweis

Für den Leser, der sich bereits mit Datenbanken beschäftigt hat: Durch dieeindeutige Zuordnung wird es ermöglicht, die sogenannten 1:n-Relationenaus der Datenbank in einfacher Form nachzubilden.

Page 344: Einstieg Mit VBA in Excel

343

Vorbereitungen für das Projekt 11.2

11.2.1 Tabelle »Kunden«

Kunden exportieren

Die Tabelle Kunden der Nordwind.mdb wird inklusive Feldnamen alsExcel-Tabelle exportiert.

� In Excel werden alle Spalten (= Datenbankfelder) gelöscht außer: Kun-den-Code, Firma, Straße, PLZ, Ort und Land.

� Die Spalte Kunden-Code wird ans Ende verschoben und in Emailumbenannt. Aus den Inhalten wird eine E-Mail-Adresse generiert. EinBeispiel: aus dem Kunden-Code »ALFKI« wird »[email protected]«. Dieentsprechende Funktion, die in der Tabelle angewendet wird, lautet:=VERKETTEN("info@"; KLEIN(A2); ".biz").

� Die Tabelle Kunden ist bereits nach dem Namen der Firma sortiert.

Kundennummer� Vor der Spalte Firma wird eine Spalte eingefügt. Sie bekommt denNamen Kundennummer. In dieser Spalte werden fortlaufende, eindeu-tige Kundennummern eingefügt (1, 2, 3...).

� Die erste Zeile mit den Spaltennamen wird in Fettschrift formatiert.

� Das Ergebnis ist in Abbildung 11.1 dargestellt.

Abbildung 11.1 Excel-Tabelle »Kunden«

11.2.2 Tabelle »Artikel«

Artikel exportierenDie Tabelle Artikel der Nordwind.mdb wird ebenfalls inklusive Feldna-men als Excel-Tabelle exportiert.

� In Excel werden alle Spalten (= Datenbankfelder) gelöscht außer:Artikel-Nr, Artikelname, Kategorie-Nr, Liefereinheit, Einzel-preis und Lagerbestand.

Artikelnummer� Die Spalte Artikel-Nr wird umbenannt in Artikelnummer, die SpalteKategorie-Nr in Kategorie. Beim Export aus Access sind automatischanstelle der Kategorienummern die verknüpften Kategorienamenexportiert worden.

� Die Tabelle Artikel wird nach der Spalte Artikelname sortiert.

Page 345: Einstieg Mit VBA in Excel

344

Beispielprojekt11

� Die Spalte Einzelpreis wird mit dem Eurozeichen formatiert.

� Die erste Zeile mit den Spaltennamen wird in Fettschrift formatiert.

Abbildung 11.2 zeigt das Ergebnis.

Abbildung 11.2 Excel-Tabelle »Artikel«

11.2.3 Restliche Vorbereitungen

Die beiden Tabellen Kunden und Artikel werden in eine neue Excel-Dateikopiert, die unter dem Namen Nordwind.xlsm (in Excel-Versionen vor2007: Nordwind.xls) gespeichert wird. Es werden noch zwei weitereTabellen hinzugefügt. Diese Tabellen enthalten zunächst keine Daten,sondern nur die nachfolgend genannten Spalten als Überschriften inZeile 1:

Bestellungen � Tabelle Bestellungen: Bestellnummer, Kundennummer, Bestelldatum

Bestelldetails � Tabelle Bestelldetails: Bestellnummer, Artikelnummer, Anzahl

Die jeweils erste Zeile mit den Spaltennamen wird in Fettschrift forma-tiert. Die Datei umfasst damit die in Abbildung 11.3 dargestellten Tabel-len.

Abbildung 11.3 Tabellen

Outlook Der Anwendung wird ein Verweis auf die Outlook-Bibliothek hinzuge-fügt, siehe Abschnitt 9.4.1, Objektmodell von Outlook«.

11.3 Benutzung des Programms

Zum besseren Verständnis folgt eine Schilderung der Benutzung des Pro-gramms. Der VBA-Code wird in einem späteren Abschnitt beschrieben.

Page 346: Einstieg Mit VBA in Excel

345

Benutzung des Programms 11.3

11.3.1 Hauptdialogfeld »Nordwind«

Nach dem Aufruf der Excel-Datei Nordwind.xlsm (in Excel-Versionen vor2007: Nordwind.xls) erscheint automatisch das Hauptdialogfeld derAnwendung:

Abbildung 11.4 Hauptdialogfeld der Anwendung Nordwind

UnterdialogfelderNach Betätigung eines der oberen fünf Buttons verschwindet das Haupt-dialogfeld, und es erscheint das entsprechende Unterdialogfeld.

Automatische Speicherung

Mit Hilfe des Buttons Ende können Sie die Anwendung verlassen. Dabeiwird automatisch gespeichert und die Datei geschlossen. Der Benutzerkann also nicht direkt auf die Tabellendaten zugreifen.

11.3.2 Unterdialogfeld »Kunden Neu«

Nach Betätigung des Buttons Kunden Neu erscheint das entsprechendeDialogfeld (siehe Abbildung 11.5).

Hinweis

Natürlich kann der Benutzer jedes Dialogfeld der Anwendung über dasKreuz oben rechts schließen und anschließend direkt auf die Tabellendatenzugreifen. Auch dies könnten Sie verhindern. Da es sich hierbei allerdingsum ein Beispielprojekt für angehende Entwickler handelt, wurde der Zugriffnicht unterbunden.

Page 347: Einstieg Mit VBA in Excel

346

Beispielprojekt11

Abbildung 11.5 Dialogfeld »Kunden Neu«

Kein leerer Name Hier können die Daten eines neuen Kunden eingegeben werden. Fallsder Firmenname leer ist oder ein Firmenname eingegeben wurde, derbereits existiert, dann wird die Speicherung abgelehnt.

Sortierung bleibterhalten

Andernfalls werden die Daten der neuen Firma in der Tabelle Kunden ein-gefügt. Dabei bleibt die alphabetische Sortierung nach Firmenname erhal-ten. Über den Button Zurück kehren Sie zurück zum Hauptdialogfeld.

11.3.3 Unterdialogfeld »Kunden Ändern«

Nach Betätigung des Buttons Kunden Ändern erscheint das in Abbil-dung 11.6 dargestellte Dialogfeld, in dem der Benutzer Daten ändernoder löschen kann.

Abbildung 11.6 Dialogfeld »Kunden Ändern«

Page 348: Einstieg Mit VBA in Excel

347

Benutzung des Programms 11.3

Suchen

Sucht Zeichenfolge

Innerhalb des Rahmens Suchen kann nach einer bestimmten Firmagesucht werden. Sobald der Benutzer ein Zeichen im Textfeld eingibt,wird der Inhalt des Kombinationsfelds verändert. Es wird jeweils eineListe der Firmen angezeigt, deren Name die eingegebene Zeichenfolgeenthält, egal an welcher Stelle, unabhängig von Groß- und Kleinschrei-bung.

Automatische Anzeige

Ein Beispiel: Der Benutzer gibt ga ein. Es erscheint eine Liste mit den Ein-trägen Galeria ..., Magazzini ... und Tortuga ... Die Daten des ers-ten Listeneintrags werden sofort in den Feldern des unteren Bereichsangezeigt.

Anzeige wechseltFalls der Benutzer einen der Listeneinträge auswählt, erscheinen dessenDaten in den Feldern des unteren Bereichs.

Kundennummer geschützt

Die Kundennummer wird von der Anwendung verwaltet und kann alseinzige Angabe nicht vom Benutzer geändert werden.

Abbildung 11.7 Nach Eingabe und Auswahl

Hinweis

Bei diesem Kombinationsfeld (und einigen anderen Kombinationsfelderndes Projekts) wurde die Eigenschaft Style auf den Wert DropDownListgesetzt. Es hat also das Verhalten eines Listenfelds.

Page 349: Einstieg Mit VBA in Excel

348

Beispielprojekt11

Ändern, Löschen

Änderungspeichern

Der Benutzer kann Änderungen an den Daten vornehmen. Falls der Fir-menname leer ist oder ein Firmenname eingegeben wurde, der bereitsexistiert, dann wird die Speicherung abgelehnt.

Kunde löschen Falls der Benutzer den Button Löschen betätigt, wird der Datensatz nacheiner Rückfrage gelöscht.

Über den Button Zurück kehren Sie zurück zum Hauptdialogfeld.

11.3.4 Unterdialogfeld »Artikel Neu«

Nach Betätigung des Buttons Artikel Neu hat man die Möglichkeit, neueArtikel einzugeben (siehe Abbildung 11.8).

Abbildung 11.8 Dialogfeld »Artikel Neu«

Kein leerer Name Hier können die Daten eines neuen Artikels eingegeben werden. Fallsder Artikelname leer ist oder ein Artikelname eingegeben wurde, derbereits existiert, wird die Speicherung abgelehnt.

Es kann eine von insgesamt acht Kategorien ausgewählt werden. Der Ein-zelpreis wird getrennt nach Euro und Cent eingegeben, aber gemeinsamin einer Tabellenzelle gespeichert. Der Lagerbestand kann eingegebenoder über die beiden Buttons bestimmt werden.

Hinweis

Es können Kunden gelöscht werden, die aktuelle Bestellungen haben. Hierergeben sich erste Übungsmöglichkeiten für den angehenden Entwickler,nachdem er den gesamten Aufbau der Anwendung verstanden hat.

Page 350: Einstieg Mit VBA in Excel

349

Benutzung des Programms 11.3

Rechtsbündige Zahlen

Bei den insgesamt drei Textfeldern für Einzelpreis und Lagerbestandwurde die Eigenschaft TextAlign auf den Wert 3 (= fmTextAlignRight)gesetzt, so dass die Zahlen rechtsbündig angezeigt werden.

Sortierung bleibtDie Daten des neuen Artikels werden in der Tabelle Artikel eingefügt.Dabei bleibt die alphabetische Sortierung nach Artikelname erhalten.

Über den Button Zurück kehren Sie zurück zum Hauptdialogfeld.

11.3.5 Unterdialogfeld »Artikel Ändern«

Nach Betätigung des Buttons Artikel Ändern erscheint das in Abbildung11.9 dargestellte Dialogfeld, in dem der Benutzer Daten ändern oderlöschen kann.

Abbildung 11.9 Dialogfeld »Artikel ändern«

Suchen

Automatische Anzeige

Innerhalb des Rahmens Suchen kann nach einem bestimmten Artikelgesucht werden. In der Liste Artikelname werden nur die Artikel derausgewählten Kategorie angezeigt. Im unteren Bereich werden die Datendes ausgewählten Artikels angezeigt.

Anzeige wechseltSobald der Benutzer eine andere Kategorie auswählt, wird die Liste Arti-kelname neu gefüllt, und es ändert sich die Anzeige im unteren Bereich.

Page 351: Einstieg Mit VBA in Excel

350

Beispielprojekt11

Sobald der Benutzer einen anderen Artikel auswählt, ändert sich dieAnzeige ebenfalls.

Ändern, Löschen

Artikelnummergeschützt

Die Artikelnummer wird von der Anwendung verwaltet und kann alseinzige Angabe nicht vom Benutzer geändert werden.

Der Benutzer kann Änderungen an den Daten vornehmen. Falls er denButton Löschen betätigt, wird der Datensatz nach einer Rückfragegelöscht.

Über den Button Zurück kehren Sie zurück zum Hauptdialogfeld.

11.3.6 Unterdialogfeld »Bestellungen Neu«

Bestellungerzeugen

Nach Betätigung des Buttons Bestellungen Neu kommt der Benutzerzum wesentlichen Einsatzzweck der Anwendung: zur Bestellung. Hierhat er die folgenden Möglichkeiten:

� für einen Kunden die gewünschte Anzahl verschiedener Artikelzusammenzustellen

� diese Bestellung zu speichern

� dem Kunden eine Bestellbestätigung per E-Mail zu senden

Datum einstellen, Suchen

Schauen wir uns zunächst den oberen Teil des Dialogfelds an, in dem einKunde und ein Artikel ausgewählt werden (siehe Abbildung 11.10).

Bestelldatum Ganz oben erscheint als Bestelldatum zunächst automatisch das aktuelleTagesdatum. Sobald der Benutzer in das Bezeichnungsfeld mit demBestelldatum klickt, erscheint ein Kalender-Steuerelement (siehe Abbil-dung 11.11).

Kalendereinblenden

Das Kalender-Steuerelement verdeckt zwar einige andere Steuerele-mente, ist aber nur temporär sichtbar. Sobald der Benutzer ein Datumper Doppelklick ausgewählt hat, wird das Kalender-Steuerelement wie-der ausgeblendet, und das ausgewählte Bestelldatum wird für dasBezeichnungsfeld übernommen.

Hinweis

Es können Artikel gelöscht werden, die in aktuellen Bestellungen stehen.Dies sollte vom angehenden Entwickler noch verbessert werden.

Page 352: Einstieg Mit VBA in Excel

351

Benutzung des Programms 11.3

Suche bekanntInnerhalb der beiden Rahmen Firma Suchen und Artikel Suchen kön-nen mit Hilfe der Techniken, die aus den vorherigen Abschnitten bereitsbekannt sind, ein Kunde und ein Artikel ausgewählt werden. Die Datendes Kunden und des Artikels werden jeweils unter den Rahmen ange-zeigt.

Abbildung 11.10 Dialogfeld »Bestellungen Neu«, oberer Teil

Abbildung 11.11 Bestelldatum einstellen

Hinzufügen, Speichern

BestelltabelleNachdem der Benutzer einen Artikel ausgewählt hat, kann er diegewünschte Anzahl eintragen oder über die beiden Buttons einstellen.

Abbildung 11.12 zeigt den unteren Teil des Dialogfelds.

Page 353: Einstieg Mit VBA in Excel

352

Beispielprojekt11

Abbildung 11.12 Liste der bestellten Artikel

Button»Hinzufügen«

Nach Betätigung des Buttons Hinzufügen wird der Liste der bestelltenArtikel ein weiteres Element in einheitlicher Formatierung hinzugefügt.Dieses Element enthält bezüglich des hinzugefügten Artikels:

� die Anzahl

� die eindeutige Artikelnummer

� den Artikelnamen

� den Einzelpreis

� den Gesamtpreis (Einzelpreis * Anzahl)

Schritt für Schritt wird die Bestellung vervollständigt, indem der Benutzereinen Artikel auswählt, die Anzahl einträgt und der Bestellung hinzufügt.

Button»Speichern«

Nach Betätigung des Buttons Speichern

� wird die Bestellung in der Tabelle Bestellungen eingetragen.

� werden die bestellten Artikel inklusive Anzahl in der Tabelle Bestell-details eingetragen.

E-Mail � wird eine E-Mail als Bestellbestätigung an den Kunden gesandt.

Die neu eingetragene Zeile in der Tabelle Bestellungen enthält:

� die eindeutige Bestellnummer

� die eindeutige Kundennummer

� das Bestelldatum

Über den Button Zurück kehren Sie zurück zum Hauptdialogfeld.

Page 354: Einstieg Mit VBA in Excel

353

Entwicklung des Programms 11.4

11.4 Entwicklung des Programms

In diesem Abschnitt werden alle Programmelemente der AnwendungNordwind erläutert.

11.4.1 Das VBA-Projekt

Abbildung 11.13 zeigt eine Übersicht über die verschiedenen Bestand-teile des VBA-Projekts.

Abbildung 11.13 Projekt-Bestandteile

Sie erkennen folgende Objekte:

Sechs Dialogfelder� insgesamt sechs Dialogfelder (UserForms): das HauptdialogfeldNordwind und die fünf Unterdialogfelder, jeweils mit »frm« begin-nend

� die Arbeitsmappe Mappe_Nordwind

Gemeinsamer Code

� ein Code-Modul mit VBA-Code, das von allen Teilen der Anwendungbenutzt wird (Modul_Gemeinsam)

� die vier Tabellen der Anwendung

11.4.2 Die Arbeitsmappe

Anwendung starten

In der Arbeitsmappe Mappe_Nordwind steht die Prozedur zum automati-schen Start der Anwendung:

Private Sub Workbook_Open()frmNordwind.Show

End Sub

Zur Erläuterung:

Page 355: Einstieg Mit VBA in Excel

354

Beispielprojekt11

Workbook_Open � Sobald das Ereignis Workbook_Open auftritt, der Benutzer also dieDatei öffnet, wird das Hauptdialogfeld Nordwind angezeigt.

11.4.3 Das gemeinsame Modul

Das Modul Modul_Gemeinsam enthält VBA-Code, der von verschiedenenTeilen der Anwendung genutzt wird. Es handelt sich dabei um:

Datenfeld � Ein Datenfeld von Zeichenketten, in dem die acht verschiedenenKategorien gespeichert sind. Es ist wie folgt deklariert: Public Kate-gorie(1 To 8) As String.

� Die Prozedur ListeFirmaFuellen() zum Füllen der Firmenliste nachder Eingabe von einzelnen Zeichen. Erläuterung dieser sowie der fol-genden Funktion siehe Abschnitt 11.4.6, »Unterdialogfeld ›KundenÄndern‹ «.

� Die Funktion ZeileFirmaSuchen() zum Suchen und Zurückliefernder Zeile des aktuellen Kunden.

� Die Prozedur ListeArtikelFuellen() zum Füllen der Artikellistenach der Auswahl der Kategorie. Erläuterung dieser Prozedur sowieder folgenden Funktion siehe Abschnitt 11.4.8, »Unterdialogfeld›Artikel Ändern‹ «.

� Die Funktion ZeileArtikelSuchen() zum Suchen und Zurückliefernder Zeile des aktuellen Artikels.

� Die Prozeduren Kleiner() und Groesser() zum Ändern der Artikel-anzahl (Lagerbestand bzw. bestellte Artikel) mit Hilfe der beiden But-tons mit den Zeichen für kleiner und größer: < und >. Erläuterungsiehe Abschnitt 11.4.7, »Unterdialogfeld ›Artikel Neu‹ «.

Public Das Datenfeld, die Prozeduren und die Funktionen sind öffentlich, alsovom Typ Public. Damit können sie von jedem Modul der Anwendungaus erreicht werden.

11.4.4 Hauptdialogfeld »Nordwind«

Beginn, Ende

Zunächst zwei Prozeduren des Dialogfelds Nordwind, die zu Beginnund Ende des Programms wichtig sind:

Private Sub UserForm_Initialize()Kategorie(1) = "Fleischprodukte"Kategorie(2) = "Getränke"

Page 356: Einstieg Mit VBA in Excel

355

Entwicklung des Programms 11.4

Kategorie(3) = "Getreideprodukte"Kategorie(4) = "Gewürze"Kategorie(5) = "Meeresfrüchte"Kategorie(6) = "Milchprodukte"Kategorie(7) = "Naturprodukte"Kategorie(8) = "Süßwaren"

End Sub

' Private Sub UserForm_QueryClose _(Cancel As Integer, CloseMode As Integer)

' ThisWorkbook.Save

' ThisWorkbook.Close' End Sub

Private Sub cmdEnde_Click()ThisWorkbook.SaveThisWorkbook.Close

End Sub

Zur Erläuterung:

UserForm_Initialize()

� Die Prozedur UserForm_Initialize() wird nach dem Programmstartaufgerufen. Innerhalb der Prozedur wird das Datenfeld mit den achtKategorienamen gefüllt. Auf dieses Datenfeld wird in verschiedenenUnterdialogfeldern zugegriffen.

UserForm_QueryClose()

� Die Prozedur UserForm_QueryClose() wird in dem Moment aufgeru-fen, in dem das Hauptdialogfeld über das Kreuz oben rechts geschlos-sen wird. Die Arbeitsmappe wird gesichert und geschlossen. DieseProzedur ist allerdings deaktiviert, damit sich der angehende Entwick-ler leichter den VBA-Code ansehen kann. Die gleiche Prozedur mussauch bei den Unterdialogfeldern existieren, falls Sie den VBA-Codebesser vor dem unberechtigten Zugriff eines Normalbenutzers schüt-zen möchten.

Speichern, beenden

� Die Prozedur cmdEnde_Click() wird aufgerufen, wenn der Benutzerdas Programm regulär, also durch Betätigung des Buttons Ende, ver-lässt. Die Arbeitsmappe wird gesichert und geschlossen.

Aufruf der Unterdialogfelder

� Es folgen fünf kurze Prozeduren für den Aufruf der Unterdialogfelder:

Private Sub cmdKundenNeu_Click()Me.Hide

Page 357: Einstieg Mit VBA in Excel

356

Beispielprojekt11

frmKundenNeu.ShowEnd Sub

Private Sub cmdKundenAendern_Click()Me.HidefrmKundenAendern.Show

End Sub

Private Sub cmdArtikelNeu_Click()Me.HidefrmArtikelNeu.Show

End Sub

Private Sub cmdArtikelAendern_Click()Me.HidefrmArtikelAendern.Show

End Sub

Private Sub cmdBestellungenNeu_Click()Me.HidefrmBestellungenNeu.Show

End Sub

Zur Erläuterung:

Dialogfeldverstecken

� Die Prozeduren dienen zum Aufruf der jeweiligen Unterdialogfelder.Sie haben alle den gleichen Ablauf:

� Das Hauptdialogfeld wird versteckt, also ausgeblendet.

� Das jeweilige Unterdialogfeld wird angezeigt.

Hide() � Mit dem Begriff Me wird das aktuelle Dialogfeld bezeichnet. DieMethode Hide() sorgt dafür, dass die Daten des Dialogfelds weiterhinzur Verfügung stehen, das Dialogfeld selbst aber nicht mehr sichtbarist.

Unload Me � Würde das Hauptdialogfeld mit Unload Me entladen, dann würdenauch die Daten gelöscht werden. Der Inhalt des Datenfelds mit denacht Kategorienamen wäre dann nicht mehr vorhanden.

11.4.5 Unterdialogfeld »Kunden Neu«

Ähnliche Abläufe Die Unterdialogfelder Kunden Neu, Artikel Neu und Bestellungen

Neu enthalten ähnliche Abläufe. Sie sind in diesem Abschnitt ausführlichgeschildert, in den Abschnitten 11.3.4 und 11.3.5 nur kurz.

Page 358: Einstieg Mit VBA in Excel

357

Entwicklung des Programms 11.4

Beginn, Ende

Zunächst zwei Prozeduren dieses Dialogfelds, die zu Beginn und Endewichtig sind:

Private Sub UserForm_Initialize()' Zugehörige Tabelle aktivierenThisWorkbook.Worksheets("Kunden").Activate

End Sub

Private Sub cmdZurueck_Click()' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

� Zur Erläuterung:

Tabelle auswählen� In der Prozedur UserForm_Initialize() wird sichergestellt, dass beiden anschließenden Tabellenzugriffen mit der richtigen Tabelle gear-beitet wird, unabhängig davon, welche Tabelle vorher aktiv war.

Zurück zum Start� Falls der Benutzer den Button Zurück betätigt, wird dieses Unterdia-logfeld entladen und wiederum das Hauptdialogfeld Nordwind ange-zeigt.

Daten gelöscht� Bereits eingetragene, aber nicht gespeicherte Daten des Unterdialog-felds gehen beim Verlassen verloren. Dies soll aber so sein, damitbeim nächsten Aufruf das Unterdialogfeld leer ist. Dies gilt für alleUnterdialogfelder.

Default-Button� Der Button Zurück ist in allen Unterdialogfeldern der Default-Button.Dies ist der Button, der den Fokus hat. Anders ausgedrückt: Falls derBenutzer nach Aufruf des Dialogfelds nur die Taste (¢) betätigt, istdies wie eine Betätigung des Default-Buttons. Dies dient einer besse-ren und einheitlichen Benutzerführung. Im Eigenschaftsfenster mussdie Eigenschaft Default des Buttons den Wert True bekommen.

Speichern

Button »Speichern«

Es folgt die etwas umfangreichere Prozedur für den Button Speichern,also das Speichern eines neuen Kunden:

Private Sub cmdSpeichern_Click()Dim Zeile As IntegerDim LetzteZeile As IntegerDim MaxKundennummer As IntegerDim FirmaNeu As String

Page 359: Einstieg Mit VBA in Excel

358

Beispielprojekt11

' Ablehnen, falls kein Name für Firma angegebenIf txtFirma.Text = "" Then

MsgBox "Bitte einen Namen für die Firma eintragen"Exit Sub

End If

' In Großbuchstaben umwandelnFirmaNeu = StrConv(txtFirma.Text, vbUpperCase)

' Alle Firmennamen durchsuchenZeile = 2Do While Cells(Zeile, 2).Value <> ""

' Falls neuer Firmenname bereits vorhanden

If StrConv(Cells(Zeile, 2).Value, vbUpperCase) = _FirmaNeu Then

MsgBox "Fehler: Es gibt bereits eine " & _"Firma mit diesem Namen", vbCritical

Exit Sub' Zeile für neue Firma ermittelnElseIf StrConv(Cells(Zeile, 2).Value, _

vbUpperCase) > FirmaNeu ThenExit Do

End IfZeile = Zeile + 1

Loop

' Letzte Zeile ermittelnLetzteZeile = ActiveSheet.UsedRange. _

SpecialCells(xlLastCell).Row

' Bisher größte Kundennummer ermittelnMaxKundennummer = WorksheetFunction.Max _

(Range(Cells(2, 1), Cells(LetzteZeile, 1)))

' Neue Zeile einfügen, falls notwendigIf Zeile <= LetzteZeile Then

Cells(Zeile, 1).EntireRow.InsertEnd If

' Erste Zeile unter Überschrift ohne FettdruckIf Zeile = 2 Then

Cells(Zeile, 1).EntireRow.Font.Bold = FalseEnd If

Page 360: Einstieg Mit VBA in Excel

359

Entwicklung des Programms 11.4

' Neue Firma eintragenCells(Zeile, 1).Value = MaxKundennummer + 1Cells(Zeile, 2).Value = txtFirma.TextCells(Zeile, 3).Value = txtStrasse.TextCells(Zeile, 4).Value = "'" & txtPLZ.TextCells(Zeile, 5).Value = txtOrt.TextCells(Zeile, 6).Value = txtLand.TextCells(Zeile, 7).Value = txtEMail.Text

' InfoMsgBox "Neue Firma " & txtFirma.Text & _

" wurde eingetragen"

' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Zur Erläuterung:

Kein leerer Name� Falls der Benutzer keinen Firmennamen eingetragen hat, hat die Spei-cherung keinen Sinn. Sie wird daher abgelehnt, und die Prozedurwird verlassen.

StrConv()� Der eingegebene Firmenname wird mit der ZeichenkettenfunktionStrConv() in Großbuchstaben umgewandelt. Diese Funktion hat zweifeste Parameter:

� den Text, der umgewandelt werden soll

� die Form der Umwandlung

Umwandlung� Die zwei gängigsten Werte für die Umwandlungsform sind:

� vbUpperCase zur Umwandlung in Großbuchstaben

� vbLowerCase zur Umwandlung in Kleinbuchstaben

Name vorhanden?� Anschließend wird die (nach Artikelnamen sortierte) Tabelle Zeile fürZeile durchsucht. Falls der neu eingegebene Firmenname bereits vor-handen ist, wird die Speicherung abgelehnt und die Prozedur wirdverlassen.

� Dabei ist es unerheblich, ob einer der beiden Firmennamen mit Klein-buchstaben und/oder Großbuchstaben geschrieben wird, denn: BeideFirmennamen werden für die Suche in Großbuchstaben umgewan-delt.

Page 361: Einstieg Mit VBA in Excel

360

Beispielprojekt11

� Falls bei der Suche ein Firmenname gefunden wird, der alphabetischhinter dem neuen Firmennamen steht, dann haben Sie zwei Informa-tionen ermittelt:

� Es gibt den neuen Firmennamen noch nicht, die Firma kann alsoeingetragen werden.

Einfügestelle � Sie haben die Stelle gefunden, an der die neue Firma eingefügtwerden muss.

Letzte Zeile � Mit Hilfe von UsedRange, SpecialCells und der Eigenschaft Row wirddie letzte Zeile der Tabelle ermittelt.

Max() � Die Worksheet-Funktion Max()ermittelt die bisher größte Kunden-nummer. Diese Funktion benötigt als Parameter einen oder mehrereZellbereiche, die nach dem größten vorkommenden Wert durchsuchtwerden.

Zeile einfügen � Falls die neue Firma inmitten der Tabelle eingesetzt werden muss,wird mit Hilfe von Insert() eine neue leere Zeile eingefügt.

� Falls es sich bei der neuen Zeile um die erste Zeile unter der Über-schrift handelte, muss der von der ersten Zeile übernommene Fett-druck zurückgesetzt werden.

Zeile eintragen � Die insgesamt sieben Informationen über die neue Firma werden inder neu erzeugten Zeile eingetragen. Als Kundennummer wird die bis-her größte Kundennummer, um 1 erhöht, eingetragen. Dadurch wirdgewährleistet, dass die Kundennummer eine eindeutige Informationist, die nur einer Firma zugeordnet ist. Vor der Postleitzahl wird eineinzelner Apostroph eingefügt. Damit wird die Postleitzahl für Excelzum Text, und führende Nullen können nicht verlorengehen.

Zurück zum Start � Nach einer Bestätigung des Eintrags wird das Unterdialogfeld sofortverlassen, und das Hauptdialogfeld erscheint. Damit erreichen Sie, dassder Benutzer die neuen Daten nicht versehentlich zweimal speichert.

11.4.6 Unterdialogfeld »Kunden Ändern«

Ähnliche Abläufe Die Unterdialogfelder Kunden Ändern und Artikel Ändern enthaltenähnliche Abläufe. Sie sind in diesem Abschnitt ausführlich geschildert, inAbschnitt 11.4.8 nur kurz.

Beginn, Ende

Zunächst die beiden Prozeduren dieses Dialogfelds, die zu Beginn undEnde wichtig sind, wie bei Kunden Neu:

Page 362: Einstieg Mit VBA in Excel

361

Entwicklung des Programms 11.4

Private Sub UserForm_Initialize()' Zugehörige Tabelle aktivierenThisWorkbook.Worksheets("Kunden").Activate

End SubPrivate Sub cmdZurueck_Click()

' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Die Abläufe wurden bereits für das Unterdialogfeld Kunden Neu erläu-tert.

Suchen

Es folgt die Prozedur, die aufgerufen wird, sobald der Benutzer Zeichenin das obere Textfeld einträgt, um einen Kunden zu suchen:

Private Sub txtFirmaSuchen_Change()' Liste mit Firmen füllen, die zu eingegebenem Text passen

ListeFirmaFuellen MeEnd Sub

ModularitätDieser Vorgang wird auch im Unterdialogfeld Bestellungen Neu benö-tigt. Daher lohnt es sich, modular zu programmieren. Es wurde eine Pro-zedur ListeFirmaFuellen() im gemeinsamen Modul geschrieben. DieseProzedur wird mit dem Parameter Me aufgerufen. Dieser Parameter kenn-zeichnet das Dialogfeld, von dem aus die Prozedur aufgerufen wurde. Esfolgt die Prozedur aus dem gemeinsamen Modul:

' Liste mit Firmen füllen, die zu eingegebenem Text passenPublic Sub ListeFirmaFuellen(frm As UserForm)

Dim Zeile As Integer

' Zugehörige Tabelle aktivierenThisWorkbook.Worksheets("Kunden").Activate

' Liste füllenfrm.cmbFirmaSuchen.ClearZeile = 2Do While Cells(Zeile, 2).Value <> ""

' Falls eingegebene Zeichen in Firmenname vorkommen,' dann diesen Firmenname der Liste hinzufügenIf InStr(StrConv(Cells(Zeile, 2).Value, vbUpperCase), _

StrConv(frm.txtFirmaSuchen.Text, vbUpperCase)) _> 0 Then

Page 363: Einstieg Mit VBA in Excel

362

Beispielprojekt11

frm.cmbFirmaSuchen.AddItem Cells(Zeile, 2).ValueEnd IfZeile = Zeile + 1

Loop

' Falls Suchergebnis, ersten Eintrag anzeigenIf frm.cmbFirmaSuchen.ListCount <> 0 Then

frm.cmbFirmaSuchen.ListIndex = 0End If

End Sub

Zur Erläuterung:

UserForm � Der Parameter der Funktion ist ein Objekt des Typs UserForm, mitdem Namen frm. An diesen Parameter wird Me übergeben; frm stehtalso für das aufrufende Dialogfeld.

� Das Kombinationsfeld wird mit Hilfe der Methode Clear() vor demFüllen vollständig geleert.

Zeile für Zeile � Die Kundentabelle wird Zeile für Zeile durchsucht. Falls ein Firmen-name den gesuchten Text an einer beliebigen Stelle enthält, wird erdem Kombinationsfeld hinzugefügt.

� Dies gilt unabhängig von Klein- und Großschreibung, da die FunktionStrConv() eingesetzt wird.

InStr() � Die Funktion InStr() liefert einen Wert größer als 0, falls die zweiteZeichenkette in der ersten Zeichenkette enthalten ist.

frm.Name � Die Steuerelemente des aufrufenden Dialogfelds werden über dieObjektbezeichnung frm.<Steuerelementname> erreicht.

� Falls das Kombinationsfeld mindestens einen Eintrag (EigenschaftListCount > 0) enthält, dann wird der erste Eintrag ausgewählt. Diesführt mit Hilfe der nachfolgend erläuterten Prozedur dazu, dass alleEinträge der Firma im unteren Teil des Dialogfelds angezeigt werden.

Suchergebnis anzeigen

AutomatischeAnzeige

Es folgt die Prozedur, die aufgerufen wird, sobald ein neuer Listeneintragim Kombinationsfeld ausgewählt wurde. Diese Auswahl kann durch dasProgramm (durch die obige Prozedur ListeFirmaFuellen()) oder durchden Benutzer stattfinden.

Private Sub cmbFirmaSuchen_Change()Dim Zeile As Integer

Page 364: Einstieg Mit VBA in Excel

363

Entwicklung des Programms 11.4

' Zeile mit ausgewähltem Kunden suchenZeile = ZeileFirmaSuchen(Me)

' Daten der Firma in Dialogfeld kopierenlblKundennummer2.Caption = " " & Cells(Zeile, 1).ValuetxtFirma.Text = Cells(Zeile, 2).ValuetxtStrasse.Text = Cells(Zeile, 3).ValuetxtPLZ.Text = Cells(Zeile, 4).ValuetxtOrt.Text = Cells(Zeile, 5).ValuetxtLand.Text = Cells(Zeile, 6).ValuetxtEMail.Text = Cells(Zeile, 7).Value

End Sub

Zur Erläuterung:

� Da dieser Vorgang auch im Unterdialogfeld Bestellungen Neu benö-tigt wird, wurde eine Funktion ZeileFirmaSuchen() im gemeinsa-men Modul geschrieben.

� Nach erfolgreicher Suche werden die insgesamt sieben Informationenüber die Firma in die Textfelder im unteren Bereich des Dialogfeldsgeschrieben.

Kundennummer geschützt

� Nur die Kundennummer wird in ein Bezeichnungsfeld geschrieben,damit der Benutzer diese wichtige Information zwar sehen, aber nichtversehentlich verändern kann.

Es folgt die Funktion aus dem gemeinsamen Modul:

' Zeilennummer der Firma liefern,' die aktuell in der Liste angezeigt wirdPublic Function ZeileFirmaSuchen(frm As UserForm) _

As IntegerDim Zeile As Integer

' Zugehörige Tabelle aktivierenThisWorkbook.Worksheets("Kunden").Activate

' Zeile mit ausgewählter Firma suchenZeile = 2Do While Cells(Zeile, 2).Value <> ""

If Cells(Zeile, 2).Value = _frm.cmbFirmaSuchen.Text Then

Exit DoEnd IfZeile = Zeile + 1

Loop

Page 365: Einstieg Mit VBA in Excel

364

Beispielprojekt11

' Zeile zurückliefernZeileFirmaSuchen = Zeile

End Function

Zur Erläuterung:

� Die Kundentabelle wird Zeile für Zeile durchsucht. Falls der Firmen-name dem ausgewählten Listeneintrag entspricht, wird die Sucheabgebrochen.

Zeile wird geliefert � Die aktuelle Zeile wird als Wert der Funktion zurückgeliefert.

Speichern

Button»Speichern«

Es folgt die Prozedur für den Button Speichern, also das Speichern einesKunden, dessen Daten gegebenenfalls geändert wurden:

Private Sub cmdSpeichern_Click()Dim Zeile As IntegerDim LetzteZeile As Integer

' Falls kein Firmenname eingetragenIf txtFirma.Text = "" Then

MsgBox "Fehler: Bitte einen Namen " & _"für die Firma eintragen", vbCritical

Exit SubEnd If

' Zeile mit ausgewählter Firma suchenZeile = 2Do While Cells(Zeile, 1).Value <> _

CInt(lblKundennummer2.Caption)Zeile = Zeile + 1

Loop

' Geänderte Daten in Tabellenblatt übertragenCells(Zeile, 2).Value = txtFirma.TextCells(Zeile, 3).Value = txtStrasse.TextCells(Zeile, 4).Value = "'" & txtPLZ.TextCells(Zeile, 5).Value = txtOrt.TextCells(Zeile, 6).Value = txtLand.TextCells(Zeile, 7).Value = txtEMail.Text

' Tabelle neu sortierenLetzteZeile = ActiveSheet.UsedRange. _

SpecialCells(xlCellTypeLastCell).Row

Page 366: Einstieg Mit VBA in Excel

365

Entwicklung des Programms 11.4

ActiveSheet.UsedRange.Sort _Key1:=Range(Cells(1, 2), Cells(LetzteZeile, 2)), _Header:=xlYes

' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Zur Erläuterung:

Kein leerer Name� Falls der Benutzer den Firmennamen gelöscht hat, hat die Speiche-rung keinen Sinn. Sie wird daher abgelehnt, und die Prozedur wirdverlassen.

Sucht Kundennummer

� Die Kundentabelle wird Zeile für Zeile durchsucht. Falls die (für denBenutzer unveränderliche) Kundennummer dem Inhalt des Bezeich-nungsfelds entspricht, wird die Suche abgebrochen.

� Der Inhalt des Bezeichnungsfelds wird vor dem Vergleich mit demInhalt der Tabellenzelle mit der Funktion CInt() in eine ganze Zahlumgewandelt.

� Die insgesamt sieben, gegebenenfalls geänderten Informationen überdie Firma werden in der gefundenen Zeile eingetragen.

Sortieren� Die Tabelle wird mit Hilfe der Methode Sort() neu nach Firmennamesortiert. Dies ist notwendig, falls ein Firmenname geändert wurde.

Löschen

Button »Löschen«Es folgt die Prozedur für den Button Löschen, also das Löschen eines aus-gewählten Kunden:

Private Sub cmdLoeschen_Click()Dim Zeile As Integer

' Falls kein Firmenname eingetragenIf txtFirma.Text = "" Then

MsgBox "Fehler: Bitte eine Firma auswählen", _vbCritical

Exit SubEnd If

Page 367: Einstieg Mit VBA in Excel

366

Beispielprojekt11

' Sicherheitsabfrage vor dem LöschenIf MsgBox("Wollen Sie diese Firma wirklich löschen?", _

vbYesNo Or vbQuestion) = vbNo ThenExit Sub

End If

' Zeile mit ausgewählter Firma suchenZeile = 2Do While Cells(Zeile, 1).Value <> _

CInt(lblKundennummer2.Caption)Zeile = Zeile + 1

Loop

' Ganze Zeile löschenCells(Zeile, 1).EntireRow.Delete

' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Zur Erläuterung:

Kein leerer Name � Falls der Benutzer den Firmennamen gelöscht hat, so ist das Löschennicht möglich. Es wird daher abgelehnt, und die Prozedur wird ver-lassen.

Sicherheitsabfrage � Der Benutzer wird zur Sicherheit gefragt, ob er den Kunden wirklichlöschen möchte. Falls er den Button Nein betätigt, wird die Prozedurverlassen.

SuchtKundennummer

� Die Kundentabelle wird Zeile für Zeile durchsucht. Falls die Kunden-nummer dem Inhalt des Bezeichnungsfelds entspricht, wird die Sucheabgebrochen.

Delete() � Die Zeile wird mit Hilfe der Methode Delete() vollständig gelöscht.

11.4.7 Unterdialogfeld »Artikel Neu«

Ähnliche Abläufe Das Unterdialogfeld Artikel Neu enthält ähnliche Abläufe wie dasbereits beschriebene Unterdialogfeld Kunden Neu. In diesem Abschnittwerden nur die Unterschiede genauer erläutert.

Beginn, Ende

Zunächst zwei Prozeduren dieses Dialogfelds, die zu Beginn und Endewichtig sind:

Page 368: Einstieg Mit VBA in Excel

367

Entwicklung des Programms 11.4

Private Sub UserForm_Initialize()Dim i As Integer

' Zugehörige Tabelle aktivierenThisWorkbook.Worksheets("Artikel").Activate

' Kategorien hinzufügen, ersten Eintrag anzeigencmbKategorie.ClearFor i = 1 To 8

cmbKategorie.AddItem Kategorie(i)Next icmbKategorie.ListIndex = 0

' Preis und Anzahl vorbesetzentxtEinzelpreisEuro.Text = "0"txtEinzelpreisCent.Text = "00"txtAnzahl.Text = "0"

End Sub

Private Sub cmdZurueck_Click()' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Zur Erläuterung:

Kategorien auflisten

� Das Kombinationsfeld, in dem die acht Kategorien aufgelistet werden,wird zu Beginn aus dem anwendungsweiten Datenfeld gefüllt. Eswird der erste Listeneintrag ausgewählt.

Zahlenfelder� Die insgesamt drei Textfelder für Einzelpreis und Anzahl werden mitdem Startwert 0 bzw. 00 gefüllt.

Anzahl einstellen

Anzahl ändernEs folgen die Prozeduren für die beiden Buttons kleiner und größer: <und >. Mit diesen Buttons kann die Anzahl für den Lagerbestand verän-dert werden.

Private Sub cmdKleiner_Click()Kleiner Me

End SubPrivate Sub cmdGroesser_Click()

Groesser MeEnd Sub

Page 369: Einstieg Mit VBA in Excel

368

Beispielprojekt11

Zur Erläuterung:

� Da diese beiden Vorgänge auch im Unterdialogfeld Bestellungen

Neu benötigt werden, wurden die beiden Funktionen Kleiner() undGroesser() im gemeinsamen Modul geschrieben.

Es folgen die beiden Funktionen aus dem gemeinsamen Modul:

' Textfeld "Anzahl" über Button "Kleiner" steuernPublic Sub Kleiner(frm As UserForm)

If Not IsNumeric(frm.txtAnzahl.Text) Thenfrm.txtAnzahl.Text = 0

ElseIf frm.txtAnzahl.Text > 0 Thenfrm.txtAnzahl.Text = frm.txtAnzahl.Text – 1

End IfEnd Sub

' Textfeld "Anzahl" über Button "Groesser" steuernPublic Sub Groesser(frm As UserForm)

If Not IsNumeric(frm.txtAnzahl.Text) Thenfrm.txtAnzahl.Text = 1

Elsefrm.txtAnzahl.Text = CInt(frm.txtAnzahl.Text) + 1

End IfEnd Sub

Zur Erläuterung der Funktion Kleiner():

Keine Zahl? � Falls das Textfeld, das mit den beiden Buttons gekoppelt ist, keineZahl enthält, dann wird eine 0 in das Textfeld geschrieben.

Vermindern � Falls die Zahl in dem Textfeld größer als 0 ist, wird sie um 1 vermin-dert.

Zur Erläuterung der (sehr ähnlichen) Funktion Groesser():

Erhöhen � Falls das Textfeld keine Zahl enthält, wird eine 1 in das Textfeldgeschrieben, ansonsten wird die vorhandene Zahl um 1 erhöht.

Speichern

Button»Speichern«

Es folgt die Prozedur für den Button Speichern, also für das Speicherneines neuen Artikels:

Private Sub cmdSpeichern_Click()Dim Zeile As IntegerDim LetzteZeile As IntegerDim MaxArtikelnummer As Integer

Page 370: Einstieg Mit VBA in Excel

369

Entwicklung des Programms 11.4

Dim ArtikelnameNeu As StringDim Einzelpreis As Single

' Ablehnen, falls kein Name für Artikel angegebenIf txtArtikelname.Text = "" Then

MsgBox "Bitte einen Namen für den Artikel eintragen"Exit Sub

End If

' In Großbuchstaben umwandelnArtikelnameNeu = StrConv(txtArtikelname.Text, _

vbUpperCase)

' Alle Artikelnamen durchsuchenZeile = 2Do While Cells(Zeile, 2).Value <> ""

' Falls neuer Artikelname bereits vorhandenIf StrConv(Cells(Zeile, 2).Value, vbUpperCase) = _

ArtikelnameNeu ThenMsgBox "Fehler: Es gibt bereits einen " & _

"Artikel mit diesem Namen", vbCriticalExit Sub

' Zeile für neuen Artikel ermittelnElseIf StrConv(Cells(Zeile, 2).Value, _

vbUpperCase) > ArtikelnameNeu ThenExit Do

End IfZeile = Zeile + 1

Loop

' Letzte Zeile ermittelnLetzteZeile = ActiveSheet.UsedRange. _

SpecialCells(xlLastCell).Row

' Bisher größte Artikelnummer ermittelnMaxArtikelnummer = WorksheetFunction.Max _

(Range(Cells(2, 1), Cells(LetzteZeile, 1)))

' Neue Zeile einfügen, falls notwendigIf Zeile <= LetzteZeile Then

Cells(Zeile, 1).EntireRow.InsertEnd If

' Erste Zeile unter Überschrift ohne FettdruckIf Zeile = 2 Then

Page 371: Einstieg Mit VBA in Excel

370

Beispielprojekt11

Cells(Zeile, 1).EntireRow.Font.Bold = FalseEnd If

' Neuen Artikelnamen eintragenCells(Zeile, 1).Value = MaxArtikelnummer + 1Cells(Zeile, 2).Value = txtArtikelname.TextCells(Zeile, 3).Value = cmbKategorie.TextCells(Zeile, 4).Value = txtLiefereinheit.TextCells(Zeile, 6).Value = txtAnzahl.Text

' Einzelpreis zusammensetzenIf txtEinzelpreisEuro.Text = "" Then

Einzelpreis = 0Else

Einzelpreis = CInt(txtEinzelpreisEuro.Text)End IfIf txtEinzelpreisCent.Text <> "" Then

Einzelpreis = Einzelpreis + _CInt(txtEinzelpreisCent.Text) / 100

End IfCells(Zeile, 5).Value = EinzelpreisCells(Zeile, 5).NumberFormatLocal = "0,00 €"

' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Zur Erläuterung:

Artikeldateneinfügen

� Wie bei dem Namen für einen neuen Kunden wird der neue Name fürden neuen Artikel geprüft und in Großbuchstaben umgewandelt. Eswird die Zeile gesucht, vor der der neue Artikel eingetragen werdenkann. Gegebenenfalls wird eine neue Zeile zum Eintragen eingefügt.Die Artikelnummer des neuen Artikels wird wie eine neue Kunden-nummer eindeutig ermittelt.

Einzelpreisumwandeln

� Beim Eintragen der Artikelinformationen ist zu beachten, dass der derInhalt der Textfelder für Euro und Cent jeweils in eine Zahl umgewan-delt wird. Anschließend werden die beiden Zahlen zu einem Einzel-preis zusammengerechnet. Die Tabellenzelle wird außerdem passendformatiert.

Page 372: Einstieg Mit VBA in Excel

371

Entwicklung des Programms 11.4

11.4.8 Unterdialogfeld »Artikel Ändern«

Ähnliche AbläufeDas Unterdialogfeld Artikel Ändern enthält ähnliche Abläufe wie dasbereits beschriebene Unterdialogfeld Kunden Ändern. In diesemAbschnitt werden nur die Unterschiede genauer erläutert.

Beginn, Ende

Zunächst die beiden Prozeduren dieses Dialogfelds, die zu Beginn undEnde wichtig sind:

Private Sub UserForm_Initialize()Dim i As Integer

' Zugehörige Tabelle aktivierenThisWorkbook.Worksheets("Artikel").Activate

' Kategorien hinzufügen, ersten Eintrag anzeigencmbKategorie.ClearcmbKategorieSuchen.ClearFor i = 1 To 8

cmbKategorie.AddItem Kategorie(i)cmbKategorieSuchen.AddItem Kategorie(i)

Next icmbKategorieSuchen.ListIndex = 0

End SubPrivate Sub cmdZurueck_Click()

' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Zur Erläuterung:

Kategorien auflisten

� Die beiden Kombinationsfelder, in denen jeweils die acht Kategorienaufgelistet werden, werden zu Beginn aus dem anwendungsweitenDatenfeld gefüllt. Es wird der erste Listeneintrag ausgewählt.

Suchen

Es folgt die Prozedur, die aufgerufen wird, sobald der Benutzer (oder dasProgramm) eine Kategorie aus der Liste auswählt, um einen Artikel zusuchen:

Private Sub cmbKategorieSuchen_Change()' Liste mit Artikeln füllen,' die zu ausgewählter Kategorie passen

Page 373: Einstieg Mit VBA in Excel

372

Beispielprojekt11

ListeArtikelFuellen MeEnd Sub

Artikel auflisten Da dieser Vorgang auch im Unterdialogfeld Bestellungen Neu benötigtwird, wurde eine Prozedur ListeArtikelFuellen() im gemeinsamenModul geschrieben. Es folgt die Prozedur aus dem gemeinsamen Modul:

' Liste mit Artikeln füllen,' die zu ausgewählter Kategorie passenPublic Sub ListeArtikelFuellen(frm As UserForm)

Dim Zeile As Integer

' Zugehörige Tabelle aktivierenThisWorkbook.Worksheets("Artikel").Activate

' Zeilen mit ausgewählter Kategorie' in 2. Liste eintragenfrm.cmbArtikelnameSuchen.ClearZeile = 2Do While Cells(Zeile, 3).Value <> ""

If Cells(Zeile, 3).Value = _frm.cmbKategorieSuchen.Text Then

frm.cmbArtikelnameSuchen.AddItem _Cells(Zeile, 2).Value

End IfZeile = Zeile + 1

Loop

' Ersten Eintrag anzeigen, falls Einträge vorhandenIf frm.cmbArtikelnameSuchen.ListCount > 0 Then

frm.cmbArtikelnameSuchen.ListIndex = 0End If

End Sub

Zur Erläuterung:

� Das Kombinationsfeld für die Artikel wird vor dem Füllen vollständiggeleert.

Artikeltabellefiltern

� Die Artikeltabelle wird Zeile für Zeile durchsucht. Falls sich ein Arti-kel in der ausgewählten Kategorie befindet, wird er dem Kombinati-onsfeld für die Artikel hinzugefügt.

� Falls das Kombinationsfeld für die Artikel mindestens einen Eintragenthält, wird der erste Eintrag ausgewählt. Dies führt mit Hilfe der

Page 374: Einstieg Mit VBA in Excel

373

Entwicklung des Programms 11.4

nachfolgend erläuterten Prozedur dazu, dass alle Einträge des Artikelsim unteren Teil des Dialogfelds angezeigt werden.

Suchergebnis anzeigen

Automatische Anzeige

Es folgt die Prozedur, die aufgerufen wird, sobald ein neuer Listeneintragim Kombinationsfeld für die Artikel ausgewählt wurde. Diese Auswahlkann durch das Programm (durch die obige Prozedur ListeArtikel-Fuellen()) oder durch den Benutzer stattfinden.

Private Sub cmbArtikelnameSuchen_Change()Dim Zeile As IntegerDim Euro As Integer

' Zeilennummer des Artikels liefern,' der aktuell in der Liste angezeigt wirdZeile = ZeileArtikelSuchen(Me)' Daten des Artikels in Dialogfeld kopierenlblArtikelnummer2.Caption = " " & _

Cells(Zeile, 1).ValuetxtArtikelname.Text = Cells(Zeile, 2).ValuecmbKategorie.ListIndex = _

cmbKategorieSuchen.ListIndextxtLiefereinheit.Text = Cells(Zeile, 4).ValuetxtAnzahl.Text = Cells(Zeile, 6).Value

' Einzelpreis in zwei Feldern ausgebenEuro = Int(Cells(Zeile, 5).Value) ' schneidet abtxtEinzelpreisEuro.Text = EurotxtEinzelpreisCent.Text = _

(Cells(Zeile, 5).Value – Euro) * 100End Sub

Zur Erläuterung:

� Da dieser Vorgang auch im Unterdialogfeld Bestellungen Neu benö-tigt wird, wurde eine Funktion ZeileArtikelSuchen() im gemeinsa-men Modul geschrieben.

� Nach erfolgreicher Suche werden die Informationen über den Artikelin die Felder im unteren Bereich des Dialogfelds geschrieben.

� Die Artikelnummer wird in ein Bezeichnungsfeld geschrieben.

� Das Kombinationsfeld für die Kategorie wird mit dem Suchkombina-tionsfeld für die Kategorie synchronisiert.

Page 375: Einstieg Mit VBA in Excel

374

Beispielprojekt11

Einzelpreiszerlegen

� Die Werte für die beiden Felder des Einzelpreises werden berechnet.Dabei wird die Funktion Int() benutzt, um den Eurobetrag zu ermit-teln. Die Funktion Int() rundet nicht, wie die Funktion CInt(), son-dern schneidet die Nachkommastellen ab.

Es folgt die Funktion aus dem gemeinsamen Modul:

' Zeilennummer des Artikels liefern,' der aktuell in der Liste angezeigt wirdPublic Function ZeileArtikelSuchen _

(frm As UserForm) As IntegerDim Zeile As Integer

' Zugehörige Tabelle aktivierenThisWorkbook.Worksheets("Artikel").Activate

' Zeile mit ausgewähltem Artikel suchenZeile = 2Do While Cells(Zeile, 2).Value <> ""

If Cells(Zeile, 2).Value = _frm.cmbArtikelnameSuchen.Text Then

Exit DoEnd IfZeile = Zeile + 1

Loop

' Zeile zurückliefernZeileArtikelSuchen = Zeile

End Function

Zur Erläuterung:

� Die Artikeltabelle wird Zeile für Zeile durchsucht. Falls der Artikel-name dem ausgewählten Listeneintrag entspricht, wird die Sucheabgebrochen.

Zeile zurückliefern � Die aktuelle Zeile wird als Wert der Funktion zurückgeliefert.

Speichern

Button»Speichern«

Es folgt die Prozedur für den Button Speichern, also das Speichern einesArtikels, dessen Daten gegebenenfalls geändert wurden:

Private Sub cmdSpeichern_Click()Dim Zeile As IntegerDim Einzelpreis As SingleDim LetzteZeile As Integer

Page 376: Einstieg Mit VBA in Excel

375

Entwicklung des Programms 11.4

' Falls kein Artikelname eingetragenIf txtArtikelname.Text = "" Then

MsgBox "Fehler: Bitte einen Namen " & _"für den Artikel eintragen", vbCritical

Exit SubEnd If

' Zeile mit ausgewähltem Artikel suchenZeile = 2Do While Cells(Zeile, 1).Value <> _

CInt(lblArtikelnummer2.Caption)Zeile = Zeile + 1

Loop

' Geänderte Daten in Tabellenblatt übertragenCells(Zeile, 2).Value = txtArtikelname.TextCells(Zeile, 3).Value = cmbKategorie.TextCells(Zeile, 4).Value = txtLiefereinheit.TextCells(Zeile, 6).Value = txtAnzahl.Text

' Einzelpreis zusammensetzenIf txtEinzelpreisEuro.Text = "" Then

Einzelpreis = 0Else

Einzelpreis = Int(txtEinzelpreisEuro.Text)End IfIf txtEinzelpreisCent.Text <> "" Then

Einzelpreis = Einzelpreis + _Int(txtEinzelpreisCent.Text) / 100

End IfCells(Zeile, 5).Value = Einzelpreis

' Tabelle neu sortierenLetzteZeile = ActiveSheet.UsedRange. _

SpecialCells(xlCellTypeLastCell).RowActiveSheet.UsedRange.Sort _

Key1:=Range(Cells(1, 2), Cells(LetzteZeile, 2)), _Header:=xlYes

' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Page 377: Einstieg Mit VBA in Excel

376

Beispielprojekt11

Zur Erläuterung:

Kein leerer Name � Falls der Benutzer den Artikelnamen gelöscht hat, hat die Speicherungkeinen Sinn. Sie wird daher abgelehnt, und die Prozedur wird verlas-sen.

Sucht Artikel-nummer

� Die Artikeltabelle wird Zeile für Zeile durchsucht. Falls die Artikel-nummer dem Inhalt des Bezeichnungsfelds entspricht, wird die Sucheabgebrochen.

� Die gegebenenfalls geänderten Informationen über den Artikel wer-den in der gefundenen Zeile eingetragen. Dabei muss der Einzelpreiswiederum aus den beiden Textfeldern ermittelt und zusammenge-rechnet werden.

Sortieren � Die Tabelle wird mit Hilfe der Methode Sort() neu nach Artikelnamesortiert. Dies ist notwendig, falls ein Artikelname geändert wurde.

Löschen

Button »Löschen« Es folgt die Prozedur für den Button Löschen, also das Löschen eines aus-gewählten Artikels:

Private Sub cmdLoeschen_Click()Dim Zeile As Integer

' Falls kein Artikelname eingetragenIf txtArtikelname.Text = "" Then

MsgBox "Fehler: Bitte einen Namen " & _"für den Artikel eintragen", vbCritical

Exit SubEnd If

' Sicherheitsabfrage vor dem LöschenIf MsgBox("Wollen Sie den Artikel wirklich löschen?", _

vbYesNo Or vbQuestion) = vbNo ThenExit Sub

End If

' Zeile mit ausgewähltem Artikel suchenZeile = 2Do While Cells(Zeile, 1).Value <> _

CInt(lblArtikelnummer2.Caption)Zeile = Zeile + 1

Loop

Page 378: Einstieg Mit VBA in Excel

377

Entwicklung des Programms 11.4

' Ganze Zeile löschenCells(Zeile, 1).EntireRow.Delete

' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Zur Erläuterung:

Kein leerer Name� Der Artikel kann nur gelöscht werden, wenn ein Artikelname einge-tragen ist.

Sicherheits-abfrage, Delete()

� Nach der Sicherheitsabfrage wird die Zeile mit dem Artikel gesuchtund mit Hilfe der Methode Delete() vollständig gelöscht.

11.4.9 Unterdialogfeld »Bestellungen Neu«

Ähnliche AbläufeDas Unterdialogfeld Bestellungen Neu beinhaltet enthält Abläufe wiedie bereits beschriebenen Unterdialogfelder Kunden Ändern und Arti-

kel Ändern. In diesem Abschnitt werden nur die Unterschiede genauererläutert.

Beginn, Ende

Zunächst die modulweiten Variablen und zwei Prozeduren dieses Dialog-felds, die zu Beginn und Ende wichtig sind:

Option Explicit

Private Type BestelldetailTypArtikelnummer As IntegerArtikelname As StringEinzelpreis As SingleAnzahl As IntegerGesamtpreis As Single

End Type

Dim Bestelldetail() As BestelldetailTypDim MailBody As String

Private Sub UserForm_Initialize()Dim i As Integer

' Kategorien hinzufügen, ersten Eintrag anzeigencmbKategorieSuchen.Clear

Page 379: Einstieg Mit VBA in Excel

378

Beispielprojekt11

For i = 1 To 8cmbKategorieSuchen.AddItem Kategorie(i)

Next icmbKategorieSuchen.ListIndex = 0

' Bestelldatum "heute" eintragenlblBestelldatum2.Caption = " " & _

Format(Date, "dd.mm.yyyy")End Sub

Private Sub cmdZurueck_Click()' Zurück zum HauptmenüUnload MefrmNordwind.Show

End Sub

Zur Erläuterung:

Benutzerdefi-nierter Datentyp

� Der benutzerdefinierte Datentyp BestelldetailTyp wird festgelegt.Eine Variable dieses Datentyps kann die Daten eines einzelnenBestellpostens speichern. Dies sind: Artikelnummer, Anzahl, Einzel-preis, Artikelname und Gesamtpreis.

Private, Public � Da der Datentyp nur in diesem Modul benötigt wird, wurde er hierdefiniert und kann nur den Gültigkeitsbereich Private haben. EigeneDatentypen mit dem Gültigkeitsbereich Public sind zwar in dergesamten Anwendung bekannt, können aber nicht in einem User-Form definiert werden.

E-Mail speichern � Für die interne Speicherung und Zuordnung in der Tabelle Bestell-details werden nur die Bestellnummer, Artikelnummer und Anzahlbenötigt. Die Speicherung von Einzelpreis, Artikelname und Gesamt-preis erleichtert allerdings die Erstellung einer E-Mail als Bestellbestä-tigung.

DynamischesDatenfeld

� Das modulweite dynamische Datenfeld Bestelldetail() wird dekla-riert. Es dient zur Aufnahme einer (noch unbekannten) Menge anBestellposten. Es ist vom soeben erläuterten Datentyp Bestellde-tailTyp.

Inhalt E-Mail � Es wird die modulweite Variable MailBody deklariert. Während desHinzufügens einzelner Bestellposten wird der Inhalt der E-Mailbereits parallel gespeichert, so dass sie bei der endgültigen Speiche-rung einer Bestellung zum größten Teil fertig ist.

� Das Kombinationsfeld für die Kategorien wird gefüllt. Es wird dererste Listeneintrag ausgewählt.

Page 380: Einstieg Mit VBA in Excel

379

Entwicklung des Programms 11.4

Aktuelles Bestelldatum

� Das heutige Datum wird ermittelt und formatiert in dem Bezeich-nungsfeld für das Bestelldatum eingetragen. Dieses Datum kann spä-ter geändert werden.

Bestelldatum einstellen

Bestelldatum ändern

Es folgen die beiden Ereignisprozeduren zur komfortablen Änderung desBestelldatums.

Private Sub lblBestelldatum2_Click()zusKalender.Visible = True

End SubPrivate Sub zusKalender_DblClick()

lblBestelldatum2.Caption = " " & zusKalender.ValuezusKalender.Visible = False

End Sub

Zur Erläuterung:

Sichtbar machen� Falls der Benutzer mit der Maus in das Bezeichnungsfeld für dasBestelldatum klickt, wird das (zunächst unsichtbare) Kalender-Steuer-element angezeigt. Dazu wird die Eigenschaft Visible genutzt, dieden Wert True oder False haben kann.

Auswählen� Der Benutzer kann im Kalender-Steuerelement ein Datum auswählen.Sobald er auf dem ausgewählten Datum einen Doppelklick ausführt,wird das Kalender-Steuerelement wieder unsichtbar, und das Datumwird im Bezeichnungsfeld für das Bestelldatum eingetragen.

Suchen

Ähnliche AbläufeDie folgenden vier Prozeduren sind in ähnlicher Form bereits Bestandteilder anderen Unterdialogfelder. Sie dienen zur Auswahl eines Kundenund eines Artikels:

Private Sub txtFirmaSuchen_Change()' Liste mit Firmen füllen,' die zu eingegebenem Text passenListeFirmaFuellen Me

End Sub

Private Sub cmbFirmaSuchen_Change()Dim Zeile As Integer

' Zeile mit ausgewähltem Kunden suchenZeile = ZeileFirmaSuchen(Me)

Page 381: Einstieg Mit VBA in Excel

380

Beispielprojekt11

' Daten der Firma in Label anzeigenlblFirma.Caption = " KNr: " & _

Cells(Zeile, 1).Value & ", " & _Cells(Zeile, 2).Value & " (" & _Cells(Zeile, 7).Value & ")" & vbCrLf & _" " & Cells(Zeile, 3).Value & _", " & Cells(Zeile, 4).Value & _" " & Cells(Zeile, 5).Value _& " (" & Cells(Zeile, 6).Value & ")"

End Sub

Private Sub cmbKategorieSuchen_Change()' Liste mit Artikeln füllen,' die zu ausgewählter Kategorie passenListeArtikelFuellen Me

End SubPrivate Sub cmbArtikelnameSuchen_Change()

Dim Zeile As Integer

' Zeilennummer des Artikels liefern,' der aktuell in der Liste angezeigt wirdZeile = ZeileArtikelSuchen(Me)

' Daten des Artikels in Label anzeigenlblArtikel.Caption = " ANr: " & _

Cells(Zeile, 1).Value & ", " & _Cells(Zeile, 2).Value & " (" & _Cells(Zeile, 3).Value & ")" & vbCrLf & _" " & Cells(Zeile, 4).Value & _", EP: " & Format(Cells(Zeile, 5).Value, "0.00") & _" €, Bestand: " & Cells(Zeile, 6).Value

End Sub

Zur Erläuterung der Unterschiede:

Kontrollausgabe � Die Daten des ausgewählten Kunden und des ausgewählten Artikelswerden jeweils in kompakter Form in ein Bezeichnungsfeld geschrie-ben. Somit kann sich der Benutzer sicher sein, die richtige Auswahlgetroffen zu haben.

Anzahl einstellen

Die Prozeduren Kleiner() und Groesser():

Page 382: Einstieg Mit VBA in Excel

381

Entwicklung des Programms 11.4

Private Sub cmdKleiner_Click()Kleiner Me

End SubPrivate Sub cmdGroesser_Click()

Groesser MeEnd Sub

Zur Erläuterung:

Bestellte Anzahl� Mit Hilfe der bereits bekannten Prozeduren Kleiner() und Groes-ser() wird in diesem Dialogfeld die bestellte Anzahl eines Artikelseingestellt. In den anderen Dialogfeldern wurde damit der Lagerbe-stand eines Artikels eingestellt.

Bestellposten hinzufügen

Button »Hinzufügen«

Nach der Auswahl eines Artikels kann dieser Artikel über den Button Hin-

zufügen den Bestelldetails hinzugefügt werden. Dieser Vorgang bereitetdie endgültige Bestellung vor. Erst die spätere Speicherung führt zur tat-sächlichen Bestellung. Zum Hinzufügen dient die folgende Prozedur:

' Artikel zur Bestellung hinzufügenPrivate Sub cmdHinzufügen_Click()

Dim Zeile As IntegerDim Gesamtpreis As SingleDim PNr As IntegerDim AusgabeZeile As String

' Ablehnen, falls bestellte Anzahl = 0If txtAnzahl.Text = "" Then

MsgBox "Bitte eine Anzahl > 0 eintragen"Exit Sub

ElseIf txtAnzahl.Text = 0 ThenMsgBox "Bitte eine Anzahl > 0 eintragen"Exit Sub

End If

' Dynamisches Feld um ein Element vergrößernOn Error GoTo FehlerPNr = UBound(Bestelldetail)PNr = PNr + 1ReDim Preserve Bestelldetail(1 To PNr)

Page 383: Einstieg Mit VBA in Excel

382

Beispielprojekt11

' Zeile mit ausgewähltem Artikel suchenZeile = ZeileArtikelSuchen(Me)

' Gesamtpreis ermittelnGesamtpreis = Cells(Zeile, 5).Value * txtAnzahl.Text

' Ausgabezeile erzeugen,' der Liste und der Mail hinzufügenAusgabeZeile = _

Format(txtAnzahl.Text, "@@@") & " " & _Format(Cells(Zeile, 1).Value, "@@@") & _

" " & _Format(Left(Cells(Zeile, 2).Value, 24), _

"!@@@@@@@@@@@@@@@@@@@@@@@@") & " " & _Format(Format(Cells(Zeile, 5).Value, _

"#,##0.00€"), "@@@@@@@@@") & " " & _Format(Format(Gesamtpreis, "#,##0.00€"), _

"@@@@@@@@@@")lstBestelldetails.AddItem AusgabeZeileMailBody = MailBody & vbCrLf & AusgabeZeile

' Daten in dynamischem Feld speichernBestelldetail(PNr).Anzahl = txtAnzahl.TextBestelldetail(PNr).Artikelnummer = _

Cells(Zeile, 1).Value

' Ausstieg vor FehlerbehandlungExit Sub

Fehler:' Falls das dynamische Feld noch' keine Größe hat, dann ist PNr = 0PNr = 0Resume Next

End Sub

Zur Erläuterung:

Anzahl nicht leer � Zunächst wird geprüft, ob eine Anzahl für den hinzuzufügenden Arti-kel eingestellt wurde. Falls nicht, wird das Hinzufügen abgelehnt.

Größe feststellen � Mit der Funktion UBound() wird die bisherige Größe des dynami-schen Feldes festgestellt, also die aktuelle Anzahl an Bestellposten.Falls es noch keine Bestellposten gibt, führt dieser Aufruf zu einemFehler. Dieser Fehler wird mit Hilfe von On Error abgefangen. DieGröße wird dann mit 0 angegeben, und die Prozedur wird mit dernächsten Anweisung fortgesetzt.

Page 384: Einstieg Mit VBA in Excel

383

Entwicklung des Programms 11.4

ReDim� Das dynamische Datenfeld wird durch ReDim um ein Element vergrö-ßert.

� In der Tabelle Artikel wird die Zeile mit den Daten des Artikels ermit-telt.

Gesamtpreis� Der Gesamtpreis des Bestellpostens wird aus dem Einzelpreis und derbestellten Anzahl errechnet.

� Es wird eine Ausgabezeile zusammengestellt, die folgende Informati-onen enthält: Anzahl, Artikelnummer, Artikelname, Einzelpreis undGesamtpreis. Die Zeile wird mit Hilfe der Funktion Format() einheit-lich formatiert.

Ausgabezeilein Liste

� Die Ausgabezeile wird dem Listenfeld hinzugefügt. Die einheitlicheFormatierung führt dazu, dass die einzelnen Bestellposten übersicht-lich, wie in einer Tabelle, aufgelistet werden. Es ist notwendig, dieEigenschaft Font des Listenfelds auf eine Nichtproportionalschriftart,hier Courier New, zu stellen. Damit erreichen Sie, dass alle Zeichen diegleiche Breite einnehmen.

Ausgabezeilein E-Mail

� Die gleiche Ausgabezeile wird bereits dem Inhalt der E-Mail hinzuge-fügt. Beim Speichern der Bestellung werden später noch Empfänger,Betreff und der Kopf der Bestellung erzeugt.

Daten in Datenfeld

� Zwei Informationen über den Bestellposten (Artikelnummer undAnzahl) werden dem dynamischen Feld zur späteren Speicherunghinzugefügt.

Bestellung speichern

Button »Speichern«

Die folgende Prozedur für den Button Speichern dient zur endgültigenSpeicherung der Bestellung und zum Absenden der E-Mail:

' Zusammengestellte Bestellung speichernPrivate Sub cmdSpeichern_Click()

Dim MaxPNr As IntegerDim LetzteZeile As IntegerDim Zeile As IntegerDim MaxBestellnummer As IntegerDim KundenZeile As IntegerDim KNr As IntegerDim EMailAdresse As StringDim PNr As IntegerDim appOutlook As Outlook.ApplicationDim MailItem As Outlook.MailItem

Page 385: Einstieg Mit VBA in Excel

384

Beispielprojekt11

' Ablehnen, falls keine Firma ausgewählt wurdeIf cmbFirmaSuchen.ListCount = 0 Then

MsgBox "Bitte eine Firma auswählen"Exit Sub

End If

' Ablehnen, falls keine Bestelldetails vorhandenOn Error GoTo FehlerMaxPNr = UBound(Bestelldetail)If MaxPNr = 0 Then

MsgBox "Bitte Bestelldetails auswählen"Exit Sub

End If

' Zeile für Eintrag der neuen Bestellung ermittelnThisWorkbook.Worksheets("Bestellungen").ActivateLetzteZeile = ActiveSheet.UsedRange. _

SpecialCells(xlLastCell).RowZeile = LetzteZeile + 1

' Neue Bestellnummer ermitteln und eintragenIf LetzteZeile = 1 Then

MaxBestellnummer = 0Else

MaxBestellnummer = WorksheetFunction.Max _(Range(Cells(2, 1), Cells(LetzteZeile, 1)))

End IfCells(Zeile, 1).Value = MaxBestellnummer + 1

' Kundennummer und E-Mail-Adresse aus der Tabelle' Kunden ermitteln und speichernThisWorkbook.Worksheets("Kunden").ActivateKundenZeile = ZeileFirmaSuchen(Me)KNr = Cells(KundenZeile, 1).ValueEMailAdresse = Cells(KundenZeile, 7).ValueThisWorkbook.Worksheets("Bestellungen").ActivateCells(Zeile, 2).Value = KNr

' Bestelldatum eintragenCells(Zeile, 3).Value = lblBestelldatum2.Caption

' Bestelldetails eintragenThisWorkbook.Worksheets("Bestelldetails").ActivateZeile = ActiveSheet.UsedRange. _

SpecialCells(xlLastCell).Row + 1

Page 386: Einstieg Mit VBA in Excel

385

Entwicklung des Programms 11.4

For PNr = 1 To UBound(Bestelldetail)Cells(Zeile, 1).Value = MaxBestellnummer + 1Cells(Zeile, 2).Value = _

Bestelldetail(PNr).ArtikelnummerCells(Zeile, 3).Value = _

Bestelldetail(PNr).AnzahlZeile = Zeile + 1

Next PNr

' Mail erzeugen und absendenSet appOutlook = CreateObject("Outlook.Application")Set MailItem = appOutlook.CreateItem(olMailItem)MailItem.To = EMailAdresseMailItem.Subject = "Ihre Bestellung vom " & _

Trim(lblBestelldatum2.Caption)MailItem.Body = "Bestellnummer: " & _

MaxBestellnummer + 1 & vbCrLf & _"Kundennummer: " & KNr & vbCrLf & _"Bestelldatum: " & _Trim(lblBestelldatum2.Caption) & vbCrLf & _"Anz ANr Artikelname " & _"E-Preis G-Preis" & MailBody

MailItem.SendappOutlook.Quit

' Zurück zum HauptmenüUnload MefrmNordwind.Show

' Ausstieg vor FehlerbehandlungExit Sub

Fehler:' Falls das dynamische Feld noch' keine Größe hat, dann ist PNr = 0PNr = 0Resume Next

End Sub

Zur Erläuterung:

Keine leeren Daten

� Falls kein Kunde ausgewählt wurde oder keine Bestelldetails eingetra-gen wurden, ist eine Bestellung nicht sinnvoll und wird abgelehnt.

� Mit Hilfe von UsedRange und SpecialCells wird die erste freie Zeileder Tabelle Bestellungen ermittelt, für den Eintrag der neuen Bestel-lung.

Page 387: Einstieg Mit VBA in Excel

386

Beispielprojekt11

Neue Bestell-nummer

� Die Tabellenfunktion Max()ermittelt, ähnlich wie für eine neue Kun-den- oder Artikelnummer, eine neue Bestellnummer. Sie wird in derTabelle Bestellungen eingetragen.

Kundendatenholen

� Das Programm wechselt kurz zur Tabelle Kunden, ermittelt Kunden-nummer und E-Mail-Adresse und kehrt wieder zur Tabelle Bestellun-gen zurück.

� Kundennummer und Bestelldatum werden ebenfalls in der TabelleBestellungen eingetragen.

� Es wird zur Tabelle Bestelldetails gewechselt. Mit Hilfe von UsedRangeund SpecialCells wird die erste freie Zeile der Tabelle ermittelt, fürden Eintrag der neuen Bestellposten.

Bestelldetailseintragen

� Die Daten der einzelnen Bestellposten werden aus dem dynamischenFeld geholt und der Reihe nach in der Tabelle Bestelldetails eingetra-gen. In jeder Zeile wird auch die Bestellnummer eingetragen, damitder Zusammenhang zur Tabelle Bestellungen besteht.

E-Mail senden � Es wird ein neues Element vom Typ MailItem erzeugt. Die Eigen-schaften Empfängeradresse, Betreff und Inhalt werden gefüllt. DerInhalt umfasste bereits die Daten der einzelnen Bestellposten, es müs-sen nur noch die Kopfdaten hinzugefügt werden. Zu den Kopfdatengehört auch das Bestelldatum, das mit führenden Leerzeichen einge-tragen war. Diese führenden Leerzeichen werden mit Trim() ent-fernt. Die E-Mail wird gesendet.

Page 388: Einstieg Mit VBA in Excel

387

Lösungen

Die Lösungen zu den Übungsaufgaben finden Sie auch in den Arbeits-mappen zu den jeweiligen Kapiteln auf der Buch-CD, getrennt für dieExcel-Versionen ab 2007 und Excel-Versionen vor 2007.

� zu 1 A bis 1 H in Mappe1.xlsm bzw. Mappe1.xls, Modul2

� zu 3 A bis 3 J in Mappe3.xlsm bzw. Mappe3.xls, Modul2

� zu 5 A bis 5 D in Mappe5.xlsm bzw. Mappe5.xls, Modul3

Lösung zu Übung 1 A

Sub KopieE3E5()Range("E3").SelectSelection.CopyRange("E5").SelectActiveSheet.Paste

End Sub

Lösung zu Übung 1 G

Sub KopieE3E5Neu()Range("E3:G3").SelectSelection.CopyRange("E5").SelectActiveSheet.PasteRange("E10").SelectActiveSheet.Paste

End Sub

Lösung zu Übung 1 H

Sub RelKopie()Selection.CopyActiveCell.Offset(2, 0).Range("A1:C1").SelectActiveSheet.PasteActiveCell.Offset(5, 0).Range("A1:C1").SelectActiveSheet.Paste

End Sub

Page 389: Einstieg Mit VBA in Excel

388

Lösungen

Lösung zu Übung 3 A

Sub KopieE3E5Neu()Range("E3:G3").SelectSelection.Copy' Range("E5").Select' ActiveSheet.PasteRange("E10").SelectActiveSheet.PasteMsgBox "Fertig"

End Sub

Lösung zu Übung 3 B

Sub Uebung3B()Dim Nachname As StringDim Vorname As StringDim Adresse As StringDim Geburtsdatum As DateDim Alter As Integer

Nachname = "Mustermann"Vorname = "Max"Adresse = "Holzweg 7, 53776 Rheinhausen"Geburtsdatum = "20.07.1978"Alter = 30

MsgBox Vorname & " " & Nachname & vbCrLf & Adresse _& vbCrLf & "geb.: " & Geburtsdatum & vbCrLf _& "Alter: " & Alter

End Sub

Lösung zu Übung 3 C

Sub Uebung3C()Dim Ergebnis As BooleanErgebnis = (12 – 3 >= 4 * 2.5)MsgBox ErgebnisErgebnis = ("Maier" Like "M??er")MsgBox Ergebnis

End Sub

Page 390: Einstieg Mit VBA in Excel

389

Lösungen

Lösung zu Übung 3 D

Sub Uebung3D()Dim Ergebnis As BooleanErgebnis = (4 > 3 And –4 > –3)MsgBox ErgebnisErgebnis = (4 > 3 Or –4 > –3)MsgBox Ergebnis

End Sub

Lösung zu Übung 3 E

Lösung zu Übung 3 F

Sub Uebung3F()Dim Gehalt As SingleDim Steuerbetrag As Single

ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A10:A11").NumberFormatLocal = "#.##0,00 €"Gehalt = Range("A10").Value

If Gehalt <= 12000 ThenSteuerbetrag = Gehalt * 0.12

ElseIf Gehalt <= 20000 ThenSteuerbetrag = Gehalt * 0.15

ElseIf Gehalt <= 30000 ThenSteuerbetrag = Gehalt * 0.2

ElseSteuerbetrag = Gehalt * 0.25

End If

Nr. Werte Bedingung Lösung

1 a=5 b=10 a>0 And b<>10 falsch

2 a=5 b=10 a>0 Or b<>10 wahr

3 z=10 w=100 z<>0 Or z>w Or w-z=90 wahr

4 z=10 w=100 z=11 And z>w Or w-z=90 wahr

5 x=1.0 y=5.7 x>=.9 And y<=5.8 wahr

6 x=1.0 y=5.7 x>=.9 And Not(y<=5.8) falsch

7 n1=1 n2=17 n1>0 And n2>0 Or n1>n2 And n2<>17 wahr

8 n1=1 n2=17 n1>0 And (n2>0 Or n1>n2) And n2<>17 falsch

Tabelle 1 Zur Lösung der Übung 3 E

Page 391: Einstieg Mit VBA in Excel

390

Lösungen

Range("A11").Value = SteuerbetragEnd Sub

Lösung zu Übung 3 G

Sub Uebung3G()Dim Gehalt As SingleDim Steuerbetrag As Single

ThisWorkbook.Worksheets("Tabelle1").ActivateRange("A10:A11").NumberFormatLocal = "#.##0,00 €"Gehalt = Range("A10").Value

Select Case GehaltCase Is <= 12000

Steuerbetrag = Gehalt * 0.12Case Is <= 20000

Steuerbetrag = Gehalt * 0.15Case Is <= 30000

Steuerbetrag = Gehalt * 0.2Case Else

Steuerbetrag = Gehalt * 0.25End Select

Range("A11").Value = SteuerbetragEnd Sub

Lösung zu Übung 3 H

Sub Uebung3H()Dim x As SingleDim i As Integer

ThisWorkbook.Worksheets("Tabelle2").Activatei = 1

For x = 35 To 20 Step –2.5Cells(i, 4).Value = xCells(i, 4).NumberFormatLocal = "0,0"i = i + 1

Next xEnd Sub

Page 392: Einstieg Mit VBA in Excel

391

Lösungen

Lösung zu Übung 3 I

Sub Uebung3I()Dim x As SingleDim i As IntegerThisWorkbook.Worksheets("Tabelle2").Activate

x = Cells(1, 5).ValueCells(1, 5).NumberFormatLocal = "0,0000"i = 2

Dox = x / 2Cells(i, 5).Value = xCells(i, 5).NumberFormatLocal = "0,0000"i = i + 1

Loop Until x < 0.001End Sub

Lösung zu Übung 3 J

Sub Uebung3J()Dim Gehalt As SingleDim Steuersatz As SingleDim Steuerbetrag As SingleDim GehaltMinusSteuerbetrag As SingleDim i As Integer

ThisWorkbook.Worksheets("Tabelle3").Activate

i = 1For Gehalt = 9000 To 33000 Step 3000

If Gehalt <= 12000 ThenSteuersatz = 0.12

ElseIf Gehalt <= 20000 ThenSteuersatz = 0.15

ElseIf Gehalt <= 30000 ThenSteuersatz = 0.2

ElseSteuersatz = 0.25

End If

Steuerbetrag = Gehalt * SteuersatzGehaltMinusSteuerbetrag = Gehalt – Steuerbetrag

Page 393: Einstieg Mit VBA in Excel

392

Lösungen

Cells(i, 1).Value = GehaltCells(i, 1).NumberFormatLocal = "#.##0,00 €"

Cells(i, 2).Value = SteuersatzCells(i, 2).NumberFormatLocal = "0,0 %"

Cells(i, 3).Value = SteuerbetragCells(i, 3).NumberFormatLocal = "#.##0,00 €"

Cells(i, 4).Value = GehaltMinusSteuerbetragCells(i, 4).NumberFormatLocal = "#.##0,00 €"

i = i + 1Next Gehalt

End Sub

Lösung zu Übung 5 A

Sub Uebung5A()Dim T(1 To 10) As IntegerDim Minimum As IntegerDim i As Integer

ThisWorkbook.Worksheets("Tabelle1").ActivateRandomize

For i = 1 To 10T(i) = Rnd * 5 + 30If i = 1 Then

Minimum = T(i)Else

If T(i) < Minimum Then Minimum = T(i)End If

Cells(i, 9).Value = T(i)Next i

For i = 1 To 10If T(i) = Minimum Then

Cells(i, 9).Borders.LineStyle = xlContinuousElse

Cells(i, 9).Borders.LineStyle = xlLineStyleNoneEnd If

Next iEnd Sub

Page 394: Einstieg Mit VBA in Excel

393

Lösungen

Lösung zu Übung 5 B

Sub Uebung5B()Dim T(1 To 10, 1 To 2) As IntegerDim Minimum As IntegerDim i As Integer, k As Integer

ThisWorkbook.Worksheets("Tabelle1").ActivateRandomize

For i = 1 To 10For k = 1 To 2

T(i, k) = Rnd * 5 + 130If i = 1 And k = 1 Then

Minimum = T(i, k)Else

If T(i, k) < Minimum Then Minimum = T(i, k)End If

Cells(i, 9 + k).Value = T(i, k)Next k

Next i

For i = 1 To 10For k = 1 To 2

If T(i, k) = Minimum ThenCells(i, 9 + k).Interior.Color = vbYellow

ElseCells(i, 9 + k).Interior.Pattern = xlNone

End IfNext k

Next iEnd Sub

Lösung zu Übung 5 C

Sub Uebung5C()Dim a As Double, b As Doublea = 5.5b = 11.5PMittelwert a, b

End Sub

Sub PMittelwert(x As Double, y As Double)Dim z As Double

Page 395: Einstieg Mit VBA in Excel

394

Lösungen

z = (x + y) / 2MsgBox z

End Sub

Lösung zu Übung 5 D

Sub Uebung5D()Dim a As Double, b As Double, c As Doublea = 5.5b = 11.5c = FMittelwert(a, b)MsgBox c

End Sub

Function FMittelwert(x As Double, y As Double) As DoubleFMittelwert = (x + y) / 2

End Function

Page 396: Einstieg Mit VBA in Excel

395

Index

– (minus) 103! (Ausrufezeichen) 337% (Prozentzeichen)

in SQL 309& (Verkettung) 41, 109* (Multiplikation) 103* (Platzhalter) 107, 267+ (plus) 103, 234. (Punkt) 94/ (Division) 103< (kleiner) 106

in SQL 308<= (kleiner oder gleich) 106

in SQL 308<> (ungleich) 106

in SQL 308= (benannter Parameter) 56= (gleich) 106

in SQL 308> (größer) 106

in SQL 308>= (größer oder gleich) 106

in SQL 308? (Fragezeichen) 107, 267@ Formatierung 256, 337\ (Ganzzahldivision) 103^ (hoch) 104_ (Unterstrich) 60, 95

in SQL 309

A

AbfrageAktions- (SQL) 302Auswahl- (SQL) 302Ergebnis filtern (SQL) 307Ergebnis sortieren (SQL) 310

Abfrage (SQL) 302Abfrageergebnis filtern (SQL) 307AbortRetryIgnore 234Absatz erzeugen (Word) 279Access

ADO-Bibliothek 301Datenaustausch 300Verbindung herstellen 301

Activate(), Worksheets 58ActiveCell 32, 62

Address 65ActiveChart 187ActiveDocument (Word) 275ActiveSheet 22, 32, 55

UsedRange 80ActiveWindow 59

DisplayGridlines 60DisplayHeadings 60

ActiveWorkbook 32, 50ActiveX-Objekt erstellen (Word) 275Add()

Attachments (Outlook) 287ChartObjects 189Charts 187Collection 178Documents (Word) 279Paragraphs (Word) 279SortFields 88SparklineGroups 221Tables (Word) 280Workbooks 47Worksheets 55

AddColorScale(), FormatConditions 216, 217

AddConnector(), Shapes 201, 206AddDatabar(), FormatConditions 214AddIconSetCondition(), FormatConditi-

ons 218AddItem(), ComboBox 334Addition 103AddLine(), Shapes 201, 204AddNodes(), FreeformBuilder 208Address, Zellbereich 65AddShape(), 211

Shapes 201, 202AddTextEffect() 212ADO-Bibliothek, Access 301ADODB

Connection (Access) 302, 304Recordset (Access) 303, 304

AfterDiagrammblatt 187Tabellenblatt 56

Page 397: Einstieg Mit VBA in Excel

396

Index

Aktionsabfrage (SQL) 302, 305, 312, 314, 315

Aktivieren und selektieren 33Aktualisierungsabfrage (SQL) 312Alle Zellen 59, 65Alt + F11 28And 108, 269AND (SQL) 308Anführungszeichen, doppelte 71Anweisung in mehreren Zeilen 95Anwendung unterbrechen 252Anzeigefenster 59Apostroph 22, 31Append 264Application 46, 179

Dialogs 285, 317Documents (Word) 275GetNameSpace() (Outlook) 292InputBox() 229OnTime() 180Outlook 287Path 179Quit() 181Quit() (Outlook) 288Quit() (Word) 275Run() 164ScreenUpdating 251Visible (Word) 275Word 275

Apply() Sort 88ApplyDataLabels()

Point 194, 200Series 194

AppointmentItem (Outlook)Duration 298GetRecurrencePattern() 300Location 298Outlook 298Save() 298Start 298Subject 298

Arbeitsmappe 46aktive 50aktivieren 51Anzahl 47diese 46erzeugen 47ist gesichert 52laufende Nummer 52

Arbeitsmappe (Forts.)Name 49, 52öffnen 48Pfad 53schließen 48speichern 51wird geöffnet 89wird geschlossen 89

Array() 142As 99, 149, 161, 172

Dateinummer 261New 174, 179

ASC (SQL) 310Attachment (Outlook) 295Attachments

Add() (Outlook) 287Count (Outlook) 294MailItem (Outlook) 287

Auflistung 46, 55durchlaufen 176eigene 178

Aufruf, zeitverzögert 180Aufzeichnung

beenden 19beginnen 19relativ 34

Ausgabe formatieren 242, 383Ausgabedialog 233Auskommentieren 94Auswahlabfrage (SQL) 302, 303, 307Auswertungsreihenfolge 106, 110AutoFilter(), Range 181AutoFit, Columns/Rows 80Axes 193Axes(), Chart 193Axis 193

AxisTitle 193HasTitle 193MaximumScale 193MinimumScale 193TickLabels 193

AxisTitle 193

B

BackColor, TextBox 333Balkendiagramm 188BarColor, FormatConditions 215bas 165

Page 398: Einstieg Mit VBA in Excel

397

Index

Bcc, MailItem (Outlook) 289Bearbeitungsmodus 34Bedingte Formatierung 214Bedingung 111Before

Diagrammblatt 187Tabellenblatt 56

BeginConnect(), ConnectorFormat 206Benannter Parameter 56, 154Benutzer 16

-definierter Datentyp 159, 378-eingaben 228-führung 317, 341, 342

Bereich auswählen 32Bezeichnungsfeld 327Beziehung darstellen 224Bildlaufleiste 332

Eigenschaften 335Bildschirmaktualisierung ein/aus 251Bin2...() 255Binär 255Blatt, Tabelle und Diagramm 186Blau 102Body, MailItem (Outlook) 287Bold, Font 74Boolean 97, 106Border

Legend 192Point 194Series 193

BordersColor 76InsideLineStyle (Word) 281LineStyle 76OutsideLineStyle (Word) 281Range 76Table (Word) 281Weight 76

Breakpoint 132BuildFreeform(), Shapes 201, 208Button

_Click() 323Abbrechen 234Default 357erzeugen 33, 322Ignorieren 234Ja 234Nein 234OK 234

Button (Forts.)Wiederholen 234

ByRef 149ByVal 147

C

Cancel 91Caption, Steuerelement 323Carriage Return 41Case Else 115CDate() 242CDbl() 242Cell Table (Word) 277Cells 59, 65

Delete 80CenterFooter 62CenterHeader 62CenterHorizontally 62CenterVertically 62Characters

Range 75TextFrame 204

Chart 187, 188Axes() 193ChartArea 192ChartTitle 192ChartType 187, 189HasLegend 192HasTitle 192Legend 192Name 187PlotArea 192SeriesCollection() 193SetSourceData() 187, 189

ChartAreaChart 192Interior 192

ChartObject 188Copy() 197Delete() 198Export() 198Height 195Left 195Top 195Width 195

ChartObjects 188Add() 189

Page 399: Einstieg Mit VBA in Excel

398

Index

Charts 186(Index) 190Add() 187Copy() 195Delete() 196Export() 196

ChartTitleChart 192Text 192

ChartType Chart 187, 189CheckBox 329

Value 331CInt() 365Clear()

ComboBox 362Range 68SortFields 88

ClearContents(), Range 68ClearFormats(), Range 68Close Datei 261Close()

Connection (Access) 302, 305Recordset (Access) 305Workbooks 48

Code-ansicht 323exportieren 165, 325-fenster 30importieren 166, 325-modul 30selbst schreiben 38

Codefenster 88Collection 178Color

Borders 76Font 74Interior 77

ColorScale 216ColorScaleCriteria 216ColorScaleType 216Column, Range 83Columns

AutoFit 80Count (Word) 277Table (Word) 277

Columns, Range 80ColumnWidth, Range 79ComboBox 332

_Change() 334

ComboBox (Forts.)AddItem() 334Clear() 362List(Index) 334ListCount 362ListIndex 334Style 334Text 334

Connection (Access)ADODB 302, 304Close() 302, 305ConnectionString 302, 304Execute() 305, 306Open() 302, 304

ConnectionStringConnection (Access) 302, 304

ConnectorFormatBeginConnect() 206EndConnect() 206Shapes 206

ContactItem (Outlook) 296Email1Address 296FirstName 296LastName 296Save() 297

Convert(), WorksheetFunction 253ConvertToShape(), FreeformBuilder 208Copy()

ChartObject 197Charts 195Range 32, 66Worksheets 56

CountAttachments (Outlook) 294Collection 178Columns (Word) 277Items (Outlook) 292Range 81Rows (Word) 277Shapes 201Workbooks 47

Count(), WorksheetFunction 256CountBlank(), WorksheetFunction 256CreateItem() (Outlook)

AppointmentItem 298ContactItem 297MailItem 287

CreateObject()Outlook 287

Page 400: Einstieg Mit VBA in Excel

399

Index

CreateObject() (Forts.)Word 275

Critical 234CSV-Datei 261, 265Cut(), Range 22, 32, 66

D

DashStyle, Line 204Databar 214DataLabel

NumberFormatLocal 201Point 201

Date 97DateAdd() 247DateDiff() 248Datei

Änderungsdatum 269-attribut 269-ende 261Funktionen 266Import, Export 259Information über 268kopieren 271Länge 269löschen 271Menü 23öffnen 260Öffnen-Dialog 318-operationen 270schließen 261schreiben 263, 265Speichern-Dialog 319suchen 266umbenennen 271Zeile lesen 261Zeile schreiben 264

Dateiendungbas 165csv 262frm 165, 325frx 165, 325gif 196jpg 196png 196xlsb 37xlsm 24xlsx 23

Dateityp ändern 43

DatenaustauschOutlook 281Textdatei 259Word 272

Datenbalken, bedingte Formatierung 214Datenbank, relational 300Datenfeld 135

als Parameter 158dynamisch 140, 383eindimensional 136löschen 142mehrdimensional 138modulweites 378Obergrenze 157, 158Public 354statisch 135umwandeln 245Untergrenze 158von Objekten 204

Datenquelle für Diagramm 187, 189Datensatz

Access 303aus Datei lesen 261

Datentyp 96, 97benutzerdefiniert 159, 378einer Funktion 149erkennen 100

DateSerial() 248Datum Datentyp 97Datum und Zeit

Datumsangabe erstellen 248erkennen 242Jahr ermitteln 251letzter Tag im Monat 250Monat ermitteln 251Tag im Monat ermitteln 250umwandeln 242Wochentag ermitteln 248Zeit addieren 247Zeitdifferenz berechnen 248

Datumsfilter 184Day() 250DayofWeekMask, RecurrencePattern (Out-

look) 300Debug 127, 130Debug.Print 41Dec2...() 255Default-Button 234, 357

Page 401: Einstieg Mit VBA in Excel

400

Index

Deklaration 96erforderlich 28, 97

DELETE (SQL) 315Delete()

Cells 80ChartObject 198Charts 196EntireRow/EntireColumn 79, 366FormatConditions 214Range 79Worksheets 58

DESC (SQL) 310Description Err 129Destination Range 66Dezimal 255Dezimalpunkt 99Diagramm 185

Achse 193als Blatt erstellen 186ändern 190Datenpunkt 194Datenquelle 187, 189Datenreihe 193, 194Datenreihenbeschriftung 200Datenreihenbeschriftungsformat 201Diagrammfläche 192Diagrammtyp 200eingebettet 188

ändern 194exportieren 198kopieren 197löschen 198

erstellen 186hat Legende 192hat Titel 192Legende 192nach Spalten/Zeilen 188Titel 192Typ 189Zeichnungsfläche 192

Diagrammblatt 186ändern 190benennen 187exportieren 196kopieren 195löschen 196

Diagrammrahmen 188Größe 195neu erzeugen 189

Diagrammrahmen (Forts.)Position 195

Dialogfeld 317, 341anzeigen 324ausblenden 356eigenes 30, 321einfaches 233erzeugen 321initialisieren 330integriertes 317Makro 21Makro aufzeichnen 36modales 324schließen 324, 355, 356Speichern unter 23Start aus Tabellenblatt 324

DialogsApplication 285, 317Show() 285, 317

DieseArbeitsmappe, Modul 30Dim 99Dir() 266Direktfenster 41, 131Display(), MailItem (Outlook) 288DisplayGridlines, ActiveWindow 60DisplayHeadings, ActiveWindow 60Division 103

durch 0 127Rest 104

DoUntil 120While 120

doc 273Documents (Word)

Add() 279Application 275Open() 275Paragraphs 275SaveAs() 279Tables 277

docx 273DoEvents() 253Dokument (Word)

erzeugen 279speichern 279

Double 97Drehfeld 332Drucken, Seiteneinrichtung 60

Page 402: Einstieg Mit VBA in Excel

401

Index

Duration, AppointmentItem (Outlook) 298

E

Eigenschaft 45Eigenschaften-Fenster 29, 322, 326Einfügeabfrage (SQL) 314Eingaben des Benutzers 228Einheit umrechnen 253Einrückung 94Einzelschrittverfahren 130Else 112ElseIf 113E-Mail (Outlook)

Anhang 287, 295Anhang, Anzahl 294anzeigen 288Betreff 287Dialogfeld anzeigen 285einfaches Senden 283Empfänger 284, 287erzeugen 286, 287Inhalt 287Kopieempfänger 289senden 288Serie erzeugen 288Zellbereich senden 289

Email1Address, ContactItem 296Empty 175End If 113End Select 115End Sub 22, 32, 145End Type 160End With 170EndConnect(), ConnectorFormat 206Endung

doc 273docx 273xls 41xlsm 24xlsx 23

EntireColumnInsert() 78Range 78, 79, 366

EntireRowFont 360Insert() 78, 360Range 78, 79, 360, 366

Entwickler 16Entwicklungsumgebung 28EOF() 261EOF, Recordset (Access) 305EoMonth(), WorksheetFunction 250Erase 142Ereignis 45, 88Ereignisprozedur 88, 323Err 129Excel

Datei 46eigene Funktion 144, 149schließen 181vor 2007 41

Excel-Optionen 25Exclamation 234Execute(), Connection (Access) 305, 306Exit Do 120, 123Exit For 117Exit Function 149Exit Sub 129, 145Export

in Datei 263, 265Word 277, 279

Export()ChartObject 198Charts 196

F

F1 93, 173F2 167F5 31, 132, 324F8 130F9 132False 97, 106Farbe 74, 102Farbskala, bedingte Formatierung 215,

217Fehler

-behandlung 125logischer 130-objekt 129vermindern 29

Feld von Variablen 135FileCopy() 271FileDateTime() 269FileLen() 269

Page 403: Einstieg Mit VBA in Excel

402

Index

FillForeColor 202Shape 202

Filtermehrere Kategorien 183mit Platzhalter 184mit Vergleich 182über zwei Spalten 183verknüpft 183

Filtern 181FirstName, ContactItem (Outlook) 296FitToPagesTall, PageSetup 62FitToPagesWide, PageSetup 62fmOrientationHorizontal 335fmOrientationVertical 335fmSpecialEffectSunken 336fmStyleDropDownList 334fmTextAlignRight 349Folder (Outlook) 292

Items 292Font

Bold 74Color 74EntireRow 360Italic 74Name 74Range 73Size 74Subscript 75Superscript 75Underline 74

For Each 176For Next 116, 137ForeColor

Fill 202Line 203

Format() 243, 335, 383FormatColor, ColorScaleCriteria 216FormatConditions 214Formatierung 242

bedingt 214schachteln 337

Formel, Eingabe 231FormulaLocal, Range 69, 227Frame 328FreeformBuilder

AddNodes() 208ConvertToShape() 208

Freiform 201, 207

frm 165, 325frx 165, 325Function 149Funktion 144, 149, 227

aufrufen 149aufrufen in anderer Datei 162

G

Ganze Zahl 97Ganzzahldivision 103Gelb 102Geschachteltes With 171Gesendete Objekte, Outlook 291GetAttr() 269GetDefaultFolder(), Namespace

(Outlook) 292GetNameSpace(), Application (Outlook)

292GetRecurrencePattern(), AppointmentItem

(Outlook) 300gif 196Gleich 106

SQL 308Gleitkommazahl 97GoTo 129Größer als 106

SQL 308GroupItems, Shape 225Grün 102Gültigkeitsbereich 96, 133, 146

benutzerdefinierter Datentyp 162Prozeduren/Funktionen 163

H

Haltepunkt 132HasLegend, Chart 192HasTitle

Axis 193Chart 192

HeightChartObject 195Steuerelement 325

Hex2...() 255Hexadezimal 255Hierarchie darstellen 224Hilfe 93, 168Hochformat 61

Page 404: Einstieg Mit VBA in Excel

403

Index

Hochstellen 75HorizontalAlignment, Range 72

I

IconCriteria, FormatConditions 219IconSet, FormatConditions 218IconSetCondition 218If

Block 112einzeilig 112

Importaus Datei 259, 261Word 273, 275

In 176Index

Charts 190Datenfeld 136eindeutiger (Access) 301Items (Outlook) 292Points 194SeriesCollection 193Shapes 201Workbooks 52Worksheets 55

Information 234Innenbereich 77Input, Datei lesen 261InputBox()

Application 229einfache 229

INSERT (SQL) 302, 314Insert()

EntireRow 360EntireRow/EntireColumn 78Range 77

InsideLineStyleBorders (Word) 281

InStr() 241Int() 374Integer 97Integriert

Dialogfeld 317Konstante 101

InteriorChartArea 192Color 77Legend 192PlotArea 192

Interior (Forts.)Range 77

Is 114IsDate() 242IsNumeric() 242Italic, Font 74Items (Outlook)

(Index) 292Count 292Folder 292

J

Jahreskalender 249Join() 245, 265jpg 196

K

Key1, Sortierschlüssel 86Kill() 271Klammerausdruck 106, 111Klassenmodul 30, 88Kleiner als 106

SQL 308Kombinationsfeld 332

aktuelles Element 334Anzahl Elemente 362Auswahl wechselt 334Elementnummer 334füllen 334löschen 362Text des aktuellen Elements 334

Kommentar 22, 31, 94Kompatibilitätsprüfung 43Komponente 159Konstante 101Konstante, integrierte 101Kontakt

erzeugen (Outlook) 296speichern (Outlook) 297

Kontrollausgabe 38Kontrollkästchen 329Kontrollstruktur 111, 116Korrektur, automatisch 93Kreisdiagramm 188

Page 405: Einstieg Mit VBA in Excel

404

Index

L

Label 327SpecialEffect 336

LargeChange, ScrollBar 335LastName, ContactItem (Outlook) 296Laufzeitfehler 126, 259lbl 327LBound() 158Leerzeile 93Left

ChartObject 195Steuerelement 326

Left() 240LeftFooter, PageSetup 62LeftHeader, PageSetup 62Legend

Border 192Chart 192Interior 192

Len() 240Like 107LIKE (SQL) 309Line

DashStyle 204ForeColor 203Shape 203TextFrame 204Weight 203

Line Feed 41Line Input 261LineStyle, Borders 76Linie 201, 204Liniendiagramm 188Linksbündig 337List(Index), ComboBox 334ListBox 332ListCount, ComboBox 362Listenfeld 332

aktuelles Element 334Anzahl Elemente 362Auswahl wechselt 334Elementnummer 334füllen 334löschen 362Text des aktuellen Elements 334

ListIndex, ComboBox 334Location, AppointmentItem (Outlook)

298

Locked, TextBox 333Logischer Fehler 130Logischer Operator 108Lokale Variable 133Long 97Loop 120, 123Loop Until 120, 123Loop While 120, 122Löschabfrage (SQL) 315

M

Magenta 102MailItem (Outlook) 287

Attachments 287Bcc 289Body 287Display() 288Send() 288Subject 287To 287

Makro 15aktivieren 25ansehen, vor 2007 42aufzeichnen 18aufzeichnen, Diagramm 190aufzeichnen, vor 2007 42ausführen 21ausführen nicht möglich 24ausführen per Button 33ausführen, vor 2007 42deaktivieren 24geht verloren 23Name 19, 21Sicherheit, vor 2007 43speichern 23speichern, vor 2007 43überall benutzen 36Verzeichnis aktivieren 26zuweisen 33

Makrocodeansehen 21verändern 31verstehen 31

Makrosicherheit 24Button 26

MarkerBackgroundColorPoint 194Series 193

Page 406: Einstieg Mit VBA in Excel

405

Index

MarkerForegroundColorPoint 194Series 193

MarkerStylePoint 194Series 193

Max(), Worksheetfunction 360Max, ScrollBar 335MaximumScale, Axis 193Me 324, 356, 361Mehrfachauswahl 114MergeCells, Range 73Methode 45, 144Mid() 240Min, ScrollBar 335Mini-Diagramme 220MinimumScale, Axis 193Mod 104Modales Dialogfeld 324Modul

DieseArbeitsmappe 30einfügen 30exportieren 165, 325importieren 166, 325löschen 166Tabelle1 30

Modularisierung 144, 162, 341Modulo 104Modulweit

Datenfeld 378Variable 133

Month() 251Move(), Worksheets 57MoveNext(), Recordset (Access) 305MsgBox() 40, 233msoAutoShapeType 202msoConnectorStraight 206msoConnectorType 206msoEditingAuto 208msoEditingType 208msoLineDash 204msoLineDashStyle 204msoSegmentCurve 208msoSegmentLine 208msoSegmentType 208msoShapeOval 203msoShapeRectangle 202Multiplikation 103Mustervergleich 107

N

Nachrichtenbox 40Name

Chart 187Font 74von Variablen 96Workbook 49

Name(), Datei umbenennen 271Namensraum, Outlook 292Namespace, GetDefaultFolder()

(Outlook) 292New 174Next 116, 176Nicht

logisches 108logisches (SQL) 308

Nordwind.mdb 181, 341Not 108NOT (SQL) 308Nothing 173Now() 180NumberFormatLocal 256

DataLabel 201Range 70TickLabels 193

O

Object 97, 172Objekt

allgemein 167-ansicht 323Grundlagen 45Haupt- 46kurzer Zugriff 170neu erzeugen 174, 179referenzieren 169Typ ermitteln 174Verweis 171

ObjektbibliothekAccess 301Outlook 282Word 273

Objekthierarchie 46, 59, 169, 179Outlook 282Word 272

Objektkatalog 167Objektmodellreferenz 168

Page 407: Einstieg Mit VBA in Excel

406

Index

Objektorientierung 45Objektvariable 171Oct2...() 255Oder

logisches 108logisches (SQL) 308

Office-Schaltfläche 23Offset 35

Range 83Oktal 255olContactItem 297olFolderContacts 296olFolderSentMail 292olMonday 300olRecursDaily 300olRecursWeekly 300olTuesday 300On Error 126, 129OnTime(), Application 180Open()

Connection (Access) 302, 304Documents (Word) 275Workbooks 48

Open, Datei 260, 264Operator 102

arithmetisch 103logisch 108

Operator (SQL) 308Operatorenrangfolge 151Option Explicit 29, 97Optional 152Optionsschaltfläche 328

voreinstellen 330Or 108, 234OR (SQL) 308ORDER BY (SQL) 310Order1, Sortierrichtung 86Orientation

PageSetup 61Range 73ScrollBar 335SpinButton 335

OutlookApplication 287AppointmentItem 298Attachment 295ContactItem 296CreateItem() (AppointmentItem) 298CreateItem() (ContactItem) 297

Outlook (Forts.)CreateItem() (MailItem) 287Datenaustausch 281E-Mail erzeugen 286Folder 292Gesendete Objekte 291Kontakt erzeugen 296Kontakteigenschaften 296MailItem 287Namensraum 292Objektbibliothek 282Objekthierarchie 282RecurrencePattern 300starten 287Termin erzeugen 297Termineigenschaften 298Terminserie erzeugen 298Terminwiederholung 300Verzeichnis ermitteln 292Verzeichniseintrag 292Zugriff erlauben/verweigern 283

Output, Datei schreiben 264OutsideLineStyle, Borders (Word) 281Oval 203

P

PageSetupCenterHorizontally 62CenterVertically 62FitToPagesTall 62FitToPagesWide 62Header, Footer 62Orientation 61PrintGridlines 61PrintHeadings 61Worksheets 60Zoom 61

Paragraphs (Word)Add() 279Documents 275Range 275

Parallele Aktionen 253ParamArray 156Parameter 144

beliebig viele 156benannt 56, 154ist Datenfeld 158optional 152

Page 408: Einstieg Mit VBA in Excel

407

Index

Parameter (Forts.)Übergabe 147

Paste() 22, 32PasteSpecial(), Range 67Path

Application 179Workbook 53

PatternEndDate, RecurrencePattern (Outlook) 300

PatternStartDate, RecurrencePattern (Outlook) 300

Pause 252personal.xlsb 37personl.xls 44Persönliche Makroarbeitsmappe 36, 47

vor 2007 44Perzentil 217Pfad, Installation 179Platzhalter

Dateiname 267Zeichenkette 107

Platzhalter (SQL) 309PlotArea

Chart 192Interior 192

png 196Point 194

ApplyDataLabels() 194, 200Border 194DataLabel 201MarkerBackgroundColor 194MarkerForegroundColor 194MarkerStyle 194

Points 194(Index) 194SparklineGroups 223

Points(), Series 194Potenzierung 104Preserve 140, 383Primärschlüssel

Tabelle (Access) 301Print, Dateizeile schreiben 264PrintGridlines, PageSetup 61PrintHeadings, PageSetup 61Priorität der Operatoren 110Private Function 163Private Sub 163Private Type 162, 378

Programmanhalten 132unterbrechen 252

Programmabbruch 126Programmierstil 93Programmzeile in mehreren Zeilen 95Projekt, Vorteile 341Projekt-Explorer 29Projektweite Variable 133Prozedur 38, 144

aufrufen 145aufrufen in anderer Datei 162Name 39

Prozess darstellen 224Public 133

Datenfeld 354Public Function 354Public Sub 354Public Type 162, 378Punkt nach Objektname 94

Q

Querformat 61Question 234Quit()

Application 181Application (Outlook) 288

R

RadioButton 328Value 331

Rahmen 328Liniendicke 76Linienfarbe 76Linienstil 76

Randomize 121Range 22, 32, 46, 63

Borders 76Cells 65Characters 75Clear() 68ClearContents() 68ClearFormats() 68Column 83Columns 80ColumnWidth 79Copy() 66

Page 409: Einstieg Mit VBA in Excel

408

Index

Range (Forts.)Count 81Cut() 66Delete() 79EntireColumn 78, 79, 366EntireRow 78, 79, 360, 366Font 73FormulaLocal 69, 227HorizontalAlignment 72Insert() 77Interior 77MergeCells 73NumberFormatLocal 70Offset 83Orientation 73Paragraphs (Word) 275PasteSpecial() 67Row 83, 360RowHeight 79Rows 80Select() 64Sort 85Sort() 365SpecialCells 81, 360Value 39, 65, 69VerticalAlignment 72WrapText 73

Rangfolge 151Rangfolge der Operatoren 110Rechteck 201Rechtsbündig 337Recordset (Access)

ADODB 303, 304Close() 305EOF 305Feld erreichen 305MoveNext() 305

RecurrencePattern (Outlook) 300DayofWeekMask 300PatternEndDate 300PatternStartDate 300RecurrenceType 300

RecurrenceType 300ReDim 140, 383RefEdit 337Referenz, Übergabe per 147Referenzierung, Objekt 169Registerkarte

Ansicht 18

Registerkarte (Forts.)Entwicklertools 25, 26

Relationale Datenbank 300Relative Aufzeichnung 34Remove(), Collection 178Replace(), WorksheetFunction 241RerouteConnections(), Shapes 207Resume Next 129RetryCancel 234RGB() 74, 102Right() 240RightFooter, PageSetup 62RightHeader, PageSetup 62Ringtausch 149Rnd() 121Rot 102Rotation, Shape 203Row, Range 83, 360RowHeight, Range 79Rows

AutoFit 80Count (Word) 277Range 80Table (Word) 277

Rückgabewert 144, 149Run(), Application 164

S

Säulendiagramm 188Save() (Outlook)

AppointmentItem 298ContactItem 297

SaveAs(), Documents (Word) 279Schädlicher VBA-Code 24Schaltfläche 33Schaltjahr 151Schattierung 212Schleife 116, 176

bedingungsgesteuert 120geschachtelt 139kopf-/fußgesteuert 120zählergesteuert 116

Schriftart, Eigenschaften 73Schrittweite 116

negativ 119Schwarz 102ScreenUpdating, Application 251

Page 410: Einstieg Mit VBA in Excel

409

Index

ScrollBar 332Change() 335Eigenschaften 335

Search(), WorksheetFunction 241SELECT (SQL) 302, 304, 307Select 22, 32

Range 64Select Case 114Selection 22, 32Send(), MailItem (Outlook) 288SendMail(), Workbook 284Series 193

ApplyDataLables() 194Border 193MarkerBackgroundColor 193MarkerForegroundColor 193MarkerStyle 193Points() 194

SeriesCollection 193SeriesCollection(), Chart 193SeriesColor, SparkLineGroups 223Set 172SetRange(), Sort 88SetSourceData(), Chart 187, 189Shape 201

Fill 202Line 203Rotation 203

Shapes 201AddConnector() 201, 206AddLine() 201, 204AddShape() 201, 202alle 210BuildFreeform() 201, 208ConnectFormat 206Count 201RerouteConnections() 207

Sheets 186Shift + F2 99, 147Shift, Zellen verschieben 77, 79Show()

Dialogs 285, 317UserForm 324

Sicherheitscenter 27Sicherheitswarnung 24Single 97Size, Font 74SmallChange

ScrollBar 335

SmallChange (Forts.)SpinButton 335

SmartArt 224Sort

Objekt 87Range 85

SortFields, Sort 88Sortierschlüssel 87, 171Spaltennummer 65Sparkline

formatieren 222Gewinn/Verlust 222Linie 220Spalte 221

SparkLineGroups 221Sparklines 220

alle Farben 223SpecialCells, Range 81, 360SpecialEffect, Label 336Speicherbedarf 96, 97Spiegelung 212SpinButton 332

Eigenschaften 335Split() 246, 262SQL 302

Fehlersuche 312SQL-Befehl, senden 305, 306Start, AppointmentItem (Outlook) 298Statusleiste 20Step 116Steuerelement

Abstand links 326Abstand oben 326Bezeichnungsfeld 327Bildlaufleiste 332Breite 325Drehfeld 332erzeugen 322Farbe 333formatieren 326Höhe 325Kombinationsfeld 332Kontrollkästchen 329kopieren 326Listenfeld 332Name 322Optionsschaltfläche 328Rahmen 328

Page 411: Einstieg Mit VBA in Excel

410

Index

Steuerelement (Forts.)RefEdit 337-sammlung 33sichtbar/unsichtbar 379Textfeld 327Titel 323ToggleButton 338Wert ermitteln 326Zahl formatieren 335

StrConv() 359Strg 90Strg + Shift + F2 99, 147String 97Structured Query Language 302Style, ComboBox 334Sub 22, 32, 145Sub/UserForm ausführen 31Subject

AppointmentItem (Outlook) 298MailItem (Outlook) 287

Sub-Prozedur 38Subscript, Font 75Subtraktion 103Suchmuster, Dateiname 267Superscript, Font 75Symbol

Aufzeichnung beenden 20Aufzeichnung beginnen 20Auskommentierung aufheben 94Block auskommentieren 94grüner Pfeil 31

Symbolleistebearbeiten 28Visual Basic 44Voreinstellung 28

Symbolsatzalle 219bedingte Formatierung 218

Syntaxfehler 125SystemModal 234

T

Tabelleerzeugen (Word) 280Rahmen (Word) 281

Tabelle1, Modul 30Tabellenblatt 46, 55

aktiv 55

Tabellenblatt (Forts.)aktivieren 58alle Zellen 59, 65Druck skalieren 61Druck zentrieren 62Druckformat 61Druckgröße anpassen 62Druckinformationen 62erzeugen 55Gitternetzlinien 59, 61Kopf-/Fußzeile 62kopieren 56laufende Nummer 55löschen 58Name 55Seiteneinrichtung 60sperren 345strukturieren 77Überschriften Zeile/Spalte 59, 61verschieben 57wird aktiviert 90wurde neu berechnet 91

Tabellenfunktion 227Tabellenstruktur, Access 301Table (Word) 277

Borders 281Cell 277Columns 277Rows 277

Tables (Word)Add() 280Documents 277

Tabulator 94Target 90, 91Taste

Alt + F11 28F1 93, 173F2 167F5 31, 132, 324F8 130F9 132Shift + F2 99, 147Strg 90Strg + Shift + F2 99, 147Tab 94

Terminerzeugen (Outlook) 297speichern (Outlook) 298

Termineigenschaften (Outlook) 298

Page 412: Einstieg Mit VBA in Excel

411

Index

Terminserie erzeugen (Outlook) 298Terminwiederholung (Outlook) 300Text

AxisTitle 193ChartTitle 192ComboBox 334TextBox 328

TextAlign, TextBox 349TextBox 327

BackColor 333Locked 333Text 328TextAlign 349

TextdateiDatenaustausch 259lesen 259

Texteffekte 212Textfeld 327

sperren 333Textfilter 183TextFrame

Characters 204Line 204

Then 112ThisWorkbook 46TickLabels

Axis 193NumberFormatLocal 193

Tiefstellen 75Timer() 252TimeValue() 180Titel, Steuerelement 323To 114, 116, 136

MailItem (Outlook) 287ToggleButton 338

Value 339Toolbox 321Top

ChartObject 195Steuerelement 326

Trim() 386True 97, 106txt 327Type 160, 378

AddShape() 211ColorScaleCriteria 216

TypeName() 100, 174

U

Übergabe von Parametern 147UBound() 157, 158Uhrzeit

aktuell 180-angabe 180

Umschaltfeld 338Und

logisches 108logisches (SQL) 308

Underline, Font 74Ungleich 106

SQL 308Unload 324, 356UPDATE (SQL) 302, 306, 312UsedRange, Worksheet 80, 360UserForm 30

_Initialize() 330_QueryClose() 355als Parameter 361erzeugen 321Hide() 356Me 324, 356, 361Objekttyp 362Show() 324

V

ValueCheckBox 331RadioButton 331Range 39, 65, 69ScrollBar 335ToggleButton 339

Variable 96ausblenden 134Datenfeld 135Deklaration erforderlich 28, 97Gültigkeitsbereich 133lokale 133modulweite 133Objekt- 171projektweite 133

Variant 99, 142VBA 15vbAbort 235VBA-Funktion 227vbArchive 270

Page 413: Einstieg Mit VBA in Excel

412

Index

vbBlack 102vbBlue 102vbCancel 235vbCrLf 40vbCyan 102vbDirectory 270VBE 28vbGreen 102vbHidden 270vbIgnore 235vbLowerCase 359vbMagenta 102vbModeless 325vbNo 235vbOK 235vbOkOnly 234vbReadOnly 270vbRed 102vbRetry 235vbSystem 270vbUpperCase 359vbWhite 102vbYellow 102vbYes 235Verbinder 201, 205Verbindung, Datenbank (Access) 301Verbindungspunkt 205Vergleichsoperator 106, 112Verkettungsoperator 109Versatz 35VerticalAlignment, Range 72Vertrauenscenter 27Vertrauenswürdige Speicherorte 27Verweis auf Objekt 97, 171Verzeichnis

-attribut 269-eintrag (Outlook) 292ermitteln (Outlook) 292-funktionen 266

Verzweigung 106, 111Visible

Application (Word) 275Steuerelement 379

Visual Basic Editor 28Visual Basic for Applications 15

W

Wagenrücklauf 41Warenwirtschaft 342wdLineStyleSingle, Word 281Weekday() 248Weight

Borders 76Line 203

Weiß 102Werkzeugsammlung 321Wertebereich 97

außerhalb 99WHERE (SQL) 307Width

ChartObject 195Steuerelement 325

Wiederholung 116With 170

geschachtelt 171Wochentag ermitteln 248Word

Absatz 275Application 275beenden 275Datenaustausch 272Dokument öffnen 275Export 277, 279Import 273, 275Objektbibliothek 273Objekthierarchie 272starten 275Table 277

WordArt 212Workbook 46

_BeforeClose() 89_Open() 89, 325, 354Activate() 51Codefenster 88Name 49Path 53Save() 51SaveAs() 51Saved 52SendMail() 284

Workbooks 46(Index) 52Add() 47Close() 48

Page 414: Einstieg Mit VBA in Excel

413

Index

Workbooks (Forts.)Count 47FullName 49Open() 48

Worksheet_Activate() 90_BeforeDoubleClick() 91_Calculate() 91_SelectionChange() 90Codefenster 88UsedRange 80, 360

WorksheetFunctionConvert() 253Count() 256CountBlank() 256EoMonth() 250Max() 360Replace() 241Search() 241

Worksheet-Funktion 227Worksheets 46, 55

(Index) 55Activate() 58Add() 55Copy() 56Delete() 58Move() 57PageSetup 60

WrapText, Range 73

X

xlAnd 183xlAscending 86xlBarClustered 188xlBottom 73xlCategory 193xlCellTypeBlanks 83xlCellTypeFormulas 82xlCellTypeLastCell 83xlCenter 72xlColumnClustered 188xlColumns 188xlConditionValueTypes 216xlContinuous 76xlDescending 86xlDialogFontProperties 320xlDialogOpen 318xlDialogPatterns 320

xlDialogSaveAs 319xlDialogSendMail 285xlDot 76xlDouble 76xlEdgeBottom 76xlEdgeLeft 76xlEdgeRight 76xlEdgeTop 76xlFilterValues 184xlGuess 86xlHairline 76xlInsideHorizontal 76xlInsideVertical 76xlJustify 72xlLandscape 61xlLeft 72xlLine 188xlMarkerStyleCircle 193xlMarkerStyleNone 193xlMarkerStyleSquare 193xlMedium 76xlNo 86xlPasteFormats 67xlPasteValues 67xlPie 188xlPortrait 61xlRight 72xlRows 188xls 41xlsb 37xlShiftDown 77xlShiftToLeft 79xlShiftToRight 77xlShiftUp 79xlShowLabel 194xlShowNone 194xlShowValue 194xlsm 24xlSparkColumn 221xlSparkColumnStacked100 222xlSparkLine 221XLStart 37xlsx 23xlThick 76xlThin 76xlTop 73xlValue 193xlVertical 73

Page 415: Einstieg Mit VBA in Excel

414

Index

xlYes 86Xor 108

Y

Year() 251YesNo 234YesNoCancel 234

Z

ZahlEingabe 230erkennen 242ganze 97umrechnen 255umwandeln 242, 365, 374

Zahlenfilter 182Zeichen einzeln formatieren 74Zeichenkette 97

Funktionen 239Länge 240Leerzeichen löschen 386Teilzeichenkette ermitteln 240Teilzeichenkette ersetzen 241Teilzeichenkette suchen 241umwandeln 241, 359verketten 109zerlegen 246

Zeichnungsobjekt 201Anzahl 201Drehung 203Form 201, 202Freiform 201, 208Freiform, Knoten hinzufügen 208Freiform, umwandeln 208Füllfarbe 202Füllung 202Lage 203Linie 201, 203, 204Linienart 204Liniendicke 203Linienfarbe 203Text 204Textrahmen 204Typ 202, 203Verbinder 201, 206Verbindung Anfang/Ende 206Verbindung herstellen 207

Zeichnungsobjekt (Forts.)Verbindungsart 206

Zeile zerlegen 60Zeilenmarke 129Zeilennummer 65Zeilenvorschub 41Zellbereich 46, 62

Adresse 65ausschneiden 32Auswahl wird gewechselt 90auswählen 64benutzter Bereich 360besondere Zellen 80einfügen 77einfügen ganze Zeile/Spalte 78, 360Eingabe 232ermitteln 337formatieren ganze Zeile/Spalte 360Formel eintragen 227hat Formel 82Innenbereich 77Innenfarbe 77leere Zellen ermitteln 83leere Zellen zählen 256letzte Zelle ermitteln 83löschen 78löschen ganze Zeile/Spalte 79, 366Muster 76Nachbarzelle verschieben 77per E-Mail senden (Outlook) 289Rahmen 75sortieren 85, 365Spaltenbreite 79spezielle Zellen 81, 360unsichtbare Benutzung 80Versatz 83verwendeter Bereich 80Zahlen zählen 256Zeile/Spalte optimal 80Zeilenhöhe 79Zellen zählen 81zusammenhängend 63

Zelle 62Spaltennummer 83wird doppelt geklickt 91Zeilennummer 83, 360

Zellhintergrund, Sparklines 220Zellinhalt

ausrichten 72

Page 416: Einstieg Mit VBA in Excel

415

Index

Zellinhalt (Forts.)ein-/mehrzeilig 73einzelne Zeichen 74Formel eintragen 69kopieren 66löschen 68Muster-Dialog 319nur Format kopieren 67nur Format löschen 68nur Wert kopieren 67nur Wert löschen 68Schrift-Dialog 320Schrifteigenschaften 73

Zellinhalt (Forts.)übereinander 73verbinden 73verschieben 66Wert eintragen 69

Zoom, PageSetup 61Zufallszahlengenerator 121Zuweisung 96

benutzerdefinierter Datentyp 161Objekt 172über Objekthierarchie 173

Zwischenablage 22, 32Zyan 102