608
Excel-VBA in 14 Tagen

Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Embed Size (px)

Citation preview

Page 1: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel-VBA in 14 Tagen

Page 2: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Unser Online-Tipp

für noch mehr Wissen ...

... aktuelles Fachwissen rund um die Uhr — zum Probelesen,

Downloaden oder auch auf Papier.

www.InformIT.de

Page 3: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

EEEExxxxcccceeeellll----VVVVBBBBAAAA

B E R N D H E L D

Page 4: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Bibliografische Information Der Deutschen Bibliothek

Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über <http://dnb.ddb.de> abrufbar.

Die Informationen in diesem Produkt werden ohne Rücksicht auf eineneventuellen Patentschutz veröffentlicht.Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt.Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen.Trotzdem können Fehler nicht vollständig ausgeschlossen werden.Verlag, Herausgeber und Autoren können für fehlerhafte Angabenund deren Folgen weder eine juristische Verantwortung nochirgendeine Haftung übernehmen.Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag undHerausgeber dankbar.

Alle Rechte vorbehalten, auch die der fotomechanischenWiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigtenModelle und Arbeiten ist nicht zulässig.

Fast alle Hardware- und Software-Bezeichnungen, die in diesem Bucherwähnt werden, sind gleichzeitig auch eingetragene Warenzeichenoder sollten als solche betrachtet werden.

Umwelthinweis:Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt.

10 9 8 7 6 5 4 3 2 1

06 05 04

ISBN 3-8272-6619-X

© 2004 by Markt+Technik Verlag,ein Imprint der Pearson Education Deutschland GmbH,Martin-Kollar-Straße 10–12, D–81829 München/GermanyAlle Rechte vorbehaltenLektorat: Rainer Fuchs, [email protected]: Philipp Burkart, [email protected] Korrektur: Petra Kienle, Fürstenfeldbruck Satz: reemers publishing services gmbh, Krefeld, (www.reemers.de)Coverkonzept: independent Medien-Design, MünchenCoverlayout: Sabine KrohbergerDruck und Verarbeitung: Bercker, KevelaerPrinted in Germany

Page 5: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

InhaltsverzeichnisLiebe Leserin, lieber Leser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Wochenvorschau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Tag 1 Die Entwicklungsplattform, Variablen und Konstanten kennen lernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211.1 Der Projekt-Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.2 Das Eigenschaftenfenster . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Tabellen ein- und ausblenden . . . . . . . . . . . . . . . . . . . . . . 25Tabellen spiegeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Den zu bearbeitenden Bereich festlegen . . . . . . . . . . . . . . 26

1.3 Das Code-Fenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Makros erfassen und starten . . . . . . . . . . . . . . . . . . . . . . . . 28

1.4 Der Makrorekorder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Ein- und Ausschalten der Gitternetzlinien . . . . . . . . . . . . 32Einheitliches Gestalten der Kopf- und Fußzeile . . . . . . . . 35

1.5 Der Objektkatalog. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39Letztes Änderungsdatum einer Datei ermitteln . . . . . . . . . 41Monatsnamen ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

1.6 Die Online-Hilfe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Verwendete Befehle nachlesen . . . . . . . . . . . . . . . . . . . . . 43Verfügbare Objekte ansehen . . . . . . . . . . . . . . . . . . . . . . . 45Befehle suchen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

1.7 Weitere praktische Helfer in der Entwicklungsumgebung 46Die Symbolleiste Bearbeiten . . . . . . . . . . . . . . . . . . . . . . . 46Suchen & Ersetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54Schnelles Arbeiten über Tastenkombinationen. . . . . . . . . 55

1.8 Entwicklungsumgebung einstellen . . . . . . . . . . . . . . . . . . 57Editoreinstellungen anpassen . . . . . . . . . . . . . . . . . . . . . . . 57Editierformat festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Allgemeine Einstellungen vornehmen. . . . . . . . . . . . . . . . 60Fenster verankern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

5

Page 6: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

1.9 Datentypen, Variablen und Konstanten . . . . . . . . . . . . . . . 62Was sind Variablen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63Variablen deklarieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63Variablendeklaration erzwingen. . . . . . . . . . . . . . . . . . . . . 66Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Statische Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Öffentliche Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69Private Variablen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Objektvariablen einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . 71Konstanten einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Konstanten für die Datumsfomatierung. . . . . . . . . . . . . . . 90

1.10 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 971.11 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981.12 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Tag 2 Die Sprachelemente von VBA . . . . . . . . . . . . . . . . . . . . . . . . . . 1012.1 Arbeiten mit Verzweigungen. . . . . . . . . . . . . . . . . . . . . . . . 102

Verzweigungen im Leben. . . . . . . . . . . . . . . . . . . . . . . . . . 103Verzweigungen in Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . 104Verzweigungen in Excel-VBA . . . . . . . . . . . . . . . . . . . . . . 104Zelleninhalte prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105Auch eine Art von Verzweigung. . . . . . . . . . . . . . . . . . . . . 108

2.2 Übersichtlichere Form mit Select Case . . . . . . . . . . . . . . . 109Excel-Version feststellen . . . . . . . . . . . . . . . . . . . . . . . . . . . 110Zahlenwerte prüfen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111Fensterstatus ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

2.3 Schleifen programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . 113For...Next-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114For Each...Next-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . 119Die Schleife Do Until...Loop . . . . . . . . . . . . . . . . . . . . . . . 125Die Schleife Do While...Loop . . . . . . . . . . . . . . . . . . . . . . 130

2.4 Auf Fehlersuche mit VBA . . . . . . . . . . . . . . . . . . . . . . . . . . 133Allgemeine Informationen zu Makros . . . . . . . . . . . . . . . . 133Fehler finden und beseitigen . . . . . . . . . . . . . . . . . . . . . . . 135Typische Fehlerquellen in Excel-VBA. . . . . . . . . . . . . . . . 144

2.5 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1502.6 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1512.7 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

6

Page 7: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

Tag 3 Die Excel-Anwendung einstellen und anpassen . . . . . . . . . . . . 1533.1 Vollbildansicht einstellen . . . . . . . . . . . . . . . . . . . . . . . . . . 1543.2 Weitere Einstellungen der Ansicht . . . . . . . . . . . . . . . . . . . 1563.3 Lang laufende Makros schneller machen . . . . . . . . . . . . . 159

Bildschirmaktualisierung ein- und ausschalten . . . . . . . . . 159Die Berechnung ein- und ausschalten . . . . . . . . . . . . . . . . 160Statuszeile einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Standardmeldungen abschalten . . . . . . . . . . . . . . . . . . . . . 163

3.4 Automatische Listen generieren . . . . . . . . . . . . . . . . . . . . . 164Benutzerdefinierte Liste aus Makro erzeugen . . . . . . . . . . 164Benutzerdefinierte Liste aus Zelleninhalten erzeugen . . . 165

3.5 Drag&Drop ein- und ausschalten . . . . . . . . . . . . . . . . . . . 1673.6 Add-Ins überprüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1673.7 Wiedervorlageliste bearbeiten. . . . . . . . . . . . . . . . . . . . . . . 1683.8 Sonstige Einstellmöglichkeiten in Excel . . . . . . . . . . . . . . 171

Allgemeine Einstellungen . . . . . . . . . . . . . . . . . . . . . . . . . 171Zoom einstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173Aufenthaltsbereich festlegen. . . . . . . . . . . . . . . . . . . . . . . . 174

3.9 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1753.10 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1763.11 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

Tag 4 Auf Arbeitsmappen zugreifen – Datei-Operationen . . . . . . . . . 1774.1 Arbeitsmappen öffnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Arbeitsmappe öffnen (ohne Aktualisierung). . . . . . . . . . . . 180Arbeitsmappe(n) öffnen über einen Dialog . . . . . . . . . . . . 181Geöffnete Arbeitsmappen identifizieren . . . . . . . . . . . . . . 184

4.2 Arbeitsmappen speichern . . . . . . . . . . . . . . . . . . . . . . . . . . 185Arbeitsmappe speichern über Dialog . . . . . . . . . . . . . . . . . 186Alle geöffneten Arbeitsmappen speichern . . . . . . . . . . . . . 188Arbeitsmappe speichern unter Datum/Uhrzeit . . . . . . . . . 189Arbeitsmappe bedingt speichern . . . . . . . . . . . . . . . . . . . . 190

4.3 Arbeitsmappen schließen . . . . . . . . . . . . . . . . . . . . . . . . . . 191Arbeitsmappe schließen – Änderungen speichern. . . . . . . 191Arbeitsmappe schließen – Änderungen verwerfen. . . . . . . 191Mehrere Arbeitsmappen schließen. . . . . . . . . . . . . . . . . . . 191

7

Page 8: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

4.4 Arbeitsmappen anlegen. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1934.5 Arbeitsmappen zusammenführen. . . . . . . . . . . . . . . . . . . . 1934.6 Arbeitsmappen entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . 1954.7 Die Dokumenteigenschaften . . . . . . . . . . . . . . . . . . . . . . . 196

Dokumenteigenschaften auslesen . . . . . . . . . . . . . . . . . . . 197Dokumenteigenschaften setzen . . . . . . . . . . . . . . . . . . . . . 198

4.8 Verknüpfungen in Arbeitsmappen . . . . . . . . . . . . . . . . . . . 201Verknüpfungen dokumentieren . . . . . . . . . . . . . . . . . . . . . 202Verknüpfungen ändern. . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

4.9 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2054.10 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2054.11 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

Tag 5 Tabellenblätter programmieren . . . . . . . . . . . . . . . . . . . . . . . . . 2075.1 Tabellen anlegen und benennen . . . . . . . . . . . . . . . . . . . . 2085.2 Blatt-Typ bestimmen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

Tabellenblätter füllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Blattprüfung vor Füllung vornehmen . . . . . . . . . . . . . . . . 212

5.3 Tabellen entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213Tabelle nach Rückfrage löschen . . . . . . . . . . . . . . . . . . . . 213Rückfrage bei Tabellenlöschung unterdrücken. . . . . . . . . 213Eigene Rückfrage programmieren . . . . . . . . . . . . . . . . . . . 214Vor dem Löschen prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . 215

5.4 Tabellen exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Tabelle als Textdatei exportieren . . . . . . . . . . . . . . . . . . . . 216Tabelle in eine neue Arbeitsmappe kopieren . . . . . . . . . . 218Tabelle in neue Arbeitsmappe übertragen . . . . . . . . . . . . . 219Tabelle in andere Arbeitsmappe kopieren/übertragen. . . . 220

5.5 Tabellen importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221Textdatei-Import mit festen Datenfeldern . . . . . . . . . . . . . 221Textdatei-Import mit variablen Datenfeldern . . . . . . . . . . 224

5.6 Tabellen ein- und ausblenden . . . . . . . . . . . . . . . . . . . . . . 226Einfaches Aus- und Einblenden einer Tabelle . . . . . . . . . 227Mehrere Tabellen ausblenden . . . . . . . . . . . . . . . . . . . . . . 228Das sichere Ausblenden von Blättern. . . . . . . . . . . . . . . . . 229Blätter wieder einblenden. . . . . . . . . . . . . . . . . . . . . . . . . . 230

8

Page 9: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

5.7 Tabellen gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231Einfaches Gruppieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232Komplexeres Gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . . 234

5.8 Tabellen schützen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Nur bestimmte Zellen vor Veränderung schützen . . . . . . 237Temporären Schutz einstellen . . . . . . . . . . . . . . . . . . . . . . 239Bestimmte Bereiche vom Schutz ausnehmen . . . . . . . . . . 240

5.9 Tabellen sortieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2415.10 Kopf- und Fußzeilen programmieren. . . . . . . . . . . . . . . . . 243

Kopf- und Fußzeilen füllen . . . . . . . . . . . . . . . . . . . . . . . . 2435.11 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2455.12 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2465.13 Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

Tag 6 Zellbearbeitung mit VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2496.1 Zellen markieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

Zelle markieren und Koordinaten ausgeben . . . . . . . . . . . 250Zellenbereich markieren und Koordinaten ausgeben . . . . 251Mehrere Zellenbereiche markieren . . . . . . . . . . . . . . . . . . 251Relative Markierungsformen . . . . . . . . . . . . . . . . . . . . . . . 253Zellen über einen Index ansprechen . . . . . . . . . . . . . . . . . 256Den verwendeten Bereich ermitteln . . . . . . . . . . . . . . . . . 257Den umliegenden Bereich ermitteln . . . . . . . . . . . . . . . . . 258

6.2 Zellen füllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259Zellen initialisieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259Zellen abfragen und ändern . . . . . . . . . . . . . . . . . . . . . . . . 260

6.3 Zellen formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262Hintergrundfarbe von Zellen festlegen . . . . . . . . . . . . . . . 262Schriftart festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264Die Schriftschnitte angeben . . . . . . . . . . . . . . . . . . . . . . . . 266Zellen rahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268Zahlenformate festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . 270Datumsformate festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . 271

6.4 Zellen benennen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2736.5 Zellen kommentieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276

Kommentarzellen auskundschaften . . . . . . . . . . . . . . . . . . 276Kommentare aus Zelleninhalten erstellen . . . . . . . . . . . . . 278

9

Page 10: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

Zellen füllen aus Kommentaren. . . . . . . . . . . . . . . . . . . . . 279Kommentare löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280

6.6 Arbeiten mit Formeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282Addition von bestimmten Sätzen . . . . . . . . . . . . . . . . . . . . 282Subtraktion von Datumsangaben . . . . . . . . . . . . . . . . . . . . 285Preise erhöhen durch Multiplikation . . . . . . . . . . . . . . . . . 285DM-Umrechnung mit Division . . . . . . . . . . . . . . . . . . . . . 287

6.7 Tabellenfunktionen einsetzen. . . . . . . . . . . . . . . . . . . . . . . 288Die Funktionsliste. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288Die Tabellenfunktion Sum. . . . . . . . . . . . . . . . . . . . . . . . . 289Die Tabellenfunktionen Datedif und Rank . . . . . . . . . . . . 291Die Tabellenfunktion SumIf . . . . . . . . . . . . . . . . . . . . . . . 293Die Tabellenfunktion CountIf . . . . . . . . . . . . . . . . . . . . . . 295Die Tabellenfunktion Count . . . . . . . . . . . . . . . . . . . . . . . 296Die Tabellenfunktion CountA . . . . . . . . . . . . . . . . . . . . . . 297Die Tabellenfunktion CountBlank . . . . . . . . . . . . . . . . . . 299

6.8 Formeln finden und dokumentieren . . . . . . . . . . . . . . . . . 300Formelzellen finden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301Formelzellen dokumentieren. . . . . . . . . . . . . . . . . . . . . . . 303

6.9 Gültigkeitsprüfungen vornehmen . . . . . . . . . . . . . . . . . . . 306Nur ganze Zahlen eingeben . . . . . . . . . . . . . . . . . . . . . . . . 306Datumsgrenzen einstellen . . . . . . . . . . . . . . . . . . . . . . . . . 309Gültigkeitsliste erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . 311

6.10 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3126.11 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3136.12 Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314

Tag 7 Aktionen und Benutzereingaben in Excel überwachen . . . . . . 3157.1 Was sind Ereignisse? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3167.2 Ereignisse auf Arbeitsmappenebene . . . . . . . . . . . . . . . . . . 317

Das Ereignis Workbook_Open. . . . . . . . . . . . . . . . . . . . . . 317Das Ereignis Workbook_BeforeClose . . . . . . . . . . . . . . . . 319Das Ereignis Workbook_BeforeSave . . . . . . . . . . . . . . . . . 320Das Ereignis Workbook_NewSheets . . . . . . . . . . . . . . . . . 321Weitere Arbeitsmappenereignisse im Überblick . . . . . . . . 322

7.3 Ereignisse auf Tabellenblattebene . . . . . . . . . . . . . . . . . . . 324Das Ereignis Activate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324Das Ereignis Change . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325

10

Page 11: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

Das Ereignis Selection_Change. . . . . . . . . . . . . . . . . . . . . 329Das Ereignis Calculate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Weitere Tabellenereignisse im Überblick . . . . . . . . . . . . . 331

7.4 Excel über Tastenkombinationen bedienen. . . . . . . . . . . . 332Formeln und Verknüpfungen in Festwerte wandeln. . . . . 332Bestimmte Standardtastenkombinationen deaktivieren. . . 337Nur Werte einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338Sonderzeichen per Tastenkombination einfügen . . . . . . . 339

7.5 Programmieren mit der Maus . . . . . . . . . . . . . . . . . . . . . . 342Kontextmenü deaktivieren/aktivieren. . . . . . . . . . . . . . . . . 342Kontextmenü für bestimmte Bereiche deaktivieren . . . . . 343Kontextmenü in allen Tabellen deaktivieren. . . . . . . . . . . 344Kontextmenü in bestimmten Tabellen deaktivieren . . . . . 345Eigene Funktionen mit der rechten Maustaste starten . . . 346Doppelklick deaktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . 349Werte hochzählen per Doppelklick . . . . . . . . . . . . . . . . . . 351Zufallszahlen per Doppelklick . . . . . . . . . . . . . . . . . . . . . . 352

7.6 Excel zeitmäßig steuern . . . . . . . . . . . . . . . . . . . . . . . . . . . 353Die Uhr immer im Blick . . . . . . . . . . . . . . . . . . . . . . . . . . 354Countdown in Excel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355Verarbeitung zu einer bestimmten Zeit beginnen. . . . . . . 356

7.7 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3577.8 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3597.9 Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360

Wochenvorschau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361

Tag 8 Große Datenmengen in VBA behandeln und auswerten . . . . . 3638.1 Daten filtern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364

Den AutoFilter aktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . 365Ein Filterkriterium einsetzen . . . . . . . . . . . . . . . . . . . . . . . 365Mehrere Filterkriterien festlegen . . . . . . . . . . . . . . . . . . . . 367Filterkriterium aus Zelle beziehen. . . . . . . . . . . . . . . . . . . 370Der Filter TopTen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370Wo stecken die Filter? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373Den Spezialfilter einsetzen. . . . . . . . . . . . . . . . . . . . . . . . . 374Gefilterte Daten exportieren. . . . . . . . . . . . . . . . . . . . . . . . 376

8.2 Pivot-Tabellen einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . 379

11

Page 12: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

Pivot-Tabellen erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . 379Pivot-Tabellen aktualisieren . . . . . . . . . . . . . . . . . . . . . . . . 382

8.3 Diagramme erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384Diagrammtypen auswählen . . . . . . . . . . . . . . . . . . . . . . . . 384Der Standard – das Säulendiagramm. . . . . . . . . . . . . . . . . 385Ergebnisse über das Balkendiagramm vergleichen . . . . . . 387Tagesgenaue Auswertungen über das Liniendiagramm . . 389Daten richtig skalieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393Diagramme platzieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393Diagramme formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . 395Diagramme exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . 397

8.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3988.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4018.6 Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

Tag 9 Funktionen einsetzen, um Excel zu automatisieren . . . . . . . . . 4039.1 Eigene Tabellenfunktionen stricken. . . . . . . . . . . . . . . . . . 405

Zellen mit blauer, dicker Schriftfarbe summieren. . . . . . . 405Aktuelle Arbeitsmappe ermitteln . . . . . . . . . . . . . . . . . . . . 408Formelcheck durchführen . . . . . . . . . . . . . . . . . . . . . . . . . 409Zelleninformationen abfragen . . . . . . . . . . . . . . . . . . . . . . 410Dokumenteigenschaften per Funktion abfragen . . . . . . . . 411Buchstaben aus Zellen eliminieren . . . . . . . . . . . . . . . . . . 413Das erste Auftreten einer Zahl ermitteln . . . . . . . . . . . . . . 414

9.2 Modulare Funktionen programmieren . . . . . . . . . . . . . . . 416Arbeitsmappen-Existenz prüfen . . . . . . . . . . . . . . . . . . . . . 416Arbeitsmappen-Zustand prüfen . . . . . . . . . . . . . . . . . . . . . 417Eine mächtige Löschfunktion erstellen . . . . . . . . . . . . . . . 419

9.3 Funktionen dauerhaft verfügbar machen. . . . . . . . . . . . . . 422Speichern der Funktionen in der persönlichen Makroarbeits-mappe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422Speichern der Funktionen in einem Add-In . . . . . . . . . . . 424

9.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4269.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4279.6 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

12

Page 13: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

Tag 10 Excel und das Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42910.1 Arbeiten mit Hyperlinks . . . . . . . . . . . . . . . . . . . . . . . . . . . 430

Hyperlinks aus einer Tabelle entfernen . . . . . . . . . . . . . . . 431Hyperlinks aus Zelleninhalten herstellen. . . . . . . . . . . . . . 432Inhaltsverzeichnis erstellen. . . . . . . . . . . . . . . . . . . . . . . . . 434

10.2 E-Mails verschicken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43610.3 Kontakte austauschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43910.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44310.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44610.6 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446

Tag 11 Excel und Datenzugriffe auf Access und Word . . . . . . . . . . . . . 44711.1 Die Voraussetzung für den Datenaustausch . . . . . . . . . . . 44811.2 Excel-Daten in eine Access-Datenbank überführen . . . . . 45111.3 Access-Daten in Excel-Tabellen überführen . . . . . . . . . . . 455

Alle Datensätze nach Excel transferieren. . . . . . . . . . . . . . 455Nur bestimmte Datensätze nach Excel transferieren . . . . 458

11.4 Access-Tabellen manipulieren . . . . . . . . . . . . . . . . . . . . . . 46111.5 Datensätze löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46211.6 Zusammenarbeit zwischen Excel und Word vorbereiten . 46411.7 Word-Sitzung starten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46511.8 Word-Sitzung übernehmen . . . . . . . . . . . . . . . . . . . . . . . . 46711.9 Briefkopf aus Excel-Tabelle erstellen und in ein

Dokument einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46811.10 Ganze Excel-Tabellen in ein Word-Dokument einfügen . 47211.11 Word-Dokumente in einer Excel-Tabelle auflisten . . . . . . 47411.12 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47711.13 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48411.14 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484

Tag 12 Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48512.1 Art der Leiste identifizieren . . . . . . . . . . . . . . . . . . . . . . . . 48612.2 Menüleisten programmieren . . . . . . . . . . . . . . . . . . . . . . . 488

Arbeitsblatt-Menüleiste ein- und ausblenden. . . . . . . . . . . 489Neue Menüs einfügen und löschen. . . . . . . . . . . . . . . . . . 490Menübefehle einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492

13

Page 14: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

12.3 Symbolleisten programmieren . . . . . . . . . . . . . . . . . . . . . . 494Neue Symbolleiste anlegen . . . . . . . . . . . . . . . . . . . . . . . . 494Symbole integrieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496

12.4 Kontextmenüs programmieren. . . . . . . . . . . . . . . . . . . . . . 500Zellen-Kontextmenü erweitern. . . . . . . . . . . . . . . . . . . . . . 500Kontextmenübefehle entfernen . . . . . . . . . . . . . . . . . . . . . 501

12.5 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50212.6 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50412.7 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504

Tag 13 Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50513.1 Was sind UserForms? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50613.2 UserForms entwerfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507

Bilder in UserForms einfügen . . . . . . . . . . . . . . . . . . . . . . 510Horizontale Trennstreifen einfügen. . . . . . . . . . . . . . . . . . 511Steuerelemente beschriften . . . . . . . . . . . . . . . . . . . . . . . . 511Aktivierreihenfolge festlegen. . . . . . . . . . . . . . . . . . . . . . . . 511

13.3 UserForms programmieren. . . . . . . . . . . . . . . . . . . . . . . . . 512UserForm aufrufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512UserForm beenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513Speichern der eingegebenen Daten . . . . . . . . . . . . . . . . . . 514Vokabeln einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516Vokabeln prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519Anzeigen der nächsten drei Vokabeln . . . . . . . . . . . . . . . . 521

13.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52313.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52513.6 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525

Tag 14 Import und Export über VBE-Programmierung . . . . . . . . . . . . 52714.1 Was ist VBE-Programmierung? . . . . . . . . . . . . . . . . . . . . . 52814.2 Voraussetzung – das Einbinden der VBE-Bibliothek. . . . . 52814.3 Weitere Informationen zu Bibliotheken. . . . . . . . . . . . . . . 53214.4 VBE-Bibliothek deaktivieren . . . . . . . . . . . . . . . . . . . . . . . 53414.5 Objekte, Methoden und Eigenschaften der VBE . . . . . . . 53514.6 Typische Aufgaben mit der VBE erledigen . . . . . . . . . . . . 536

Arbeitsmappe mit Quellcode bestücken . . . . . . . . . . . . . . 536

14

Page 15: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

Quellcode sichern über den Export . . . . . . . . . . . . . . . . . . 540Module ausdrucken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543Arbeitsmappen von Modulen befreien. . . . . . . . . . . . . . . . 544Ein bestimmtes Makro entfernen . . . . . . . . . . . . . . . . . . . . 545Ein Ereignis löschen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546VBE aufrufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548

14.7 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54814.8 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55014.9 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551

Tag 15 Lösungen der Tages-Übungen. . . . . . . . . . . . . . . . . . . . . . . . . . . 553A Tag 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554Listing A.1:Tag 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555Listing A.2:Tag 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555Listing A.3:Tag 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556Listing A.4:Tag 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557Listing A.6:Tag 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559Listing A.11:Tag 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562Listing A.14:Tag 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564Listing A.16:Tag 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565Listing A.17:Tag 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566Listing A.18:Tag 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567Listing A.20:Tag 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569Listing A.21:Tag 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570Listing A.22:Tag 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572

Tag 16 Wichtige Funktionen in einem eigenen Add-In ablegen . . . . . 573B.1 Die Ereignisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575B.2 Der Quellcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576

Menüerstellung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576B.3 Die Makros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581

Formeln in Festwerte umwandeln . . . . . . . . . . . . . . . . . . . 581Aktive Tabelle als E-Mail verschicken . . . . . . . . . . . . . . . . 582Aktive Tabelle in neuer Arbeitsmappe speichern . . . . . . . 583Informationen zu Datum und Zeit. . . . . . . . . . . . . . . . . . . 583Informationen zur aktiven Arbeitsmappe . . . . . . . . . . . . . . 584Öffnen aller verknüpften Arbeitsmappen. . . . . . . . . . . . . . 584

15

Page 16: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Inhaltsverzeichnis

Verknüpfungen zu anderen Arbeitsmappen entfernen . . . 585Suchen von Texten in Arbeitsmappen . . . . . . . . . . . . . . . . 585Zellen bearbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587Zellen markieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588Zellen löschen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589

B.4 Die Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592

Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593

16

Page 17: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Liebe Leserin, lieber Leser

Das Programm Microsoft Excel ist technisch sehr ausgereift und Sie werden aufden ersten Blick nicht viel vermissen, was Sie für Ihre tägliche Arbeit brauchen.Mit Hilfe von VBA-Makros lassen sich aber gerade tägliche lästige Routinearbeitenweitgehend automatisieren. Sie haben zwar einmalig den Aufwand mit der Erstel-lung der dazu benötigten Makros; später profitieren Sie jedoch davon und habenviel mehr Zeit für andere Dinge zur Verfügung. Außerdem werden Sie zuneh-mend auf programmierte Excel-Lösungen stoßen. Nur wenn Sie selbst mit VBAprogrammieren können, verstehen Sie diese Lösungen wirklich und können sieselbst nach Ihren Bedürfnissen abändern, ohne auf externe Dienstleister zurück-greifen zu müssen.

Dieses Buch ist in 14 Kapitel gegliedert. Sie können es somit, wenn Sie wollen, inzwei Wochen durcharbeiten, wenn Sie sich jeden Tag ein Kapitel vornehmen. Anden Kapitelenden finden Sie nahezu immer einen Workshop mit Fragen & Ant-worten, einem Quiz und einer oder auch mehreren Übungen. Sie dienen Ihnenzur persönlichen Erfolgskontrolle. Ich habe mich bemüht, die wichtigsten und inte-ressantesten Lösungen im Buch vorzustellen. Zu jedem Kapitel können Sie auf dermitgelieferten CD-ROM die entsprechende Beispieldatei öffnen und den Quell-code ansehen und testen. Sie brauchen daher nicht die einzelnen Listings abzutip-pen (wenngleich ich Ihnen das empfehle, weil dann der Lerneffekt höher ist).

Am Ende des Buches werden Sie in der Lage sein, effektiv mit VBA-Makros umzu-gehen und eigene Lösungen zu entwickeln.

Bei Nachfragen und allgemeinem Feedback zu meinem Buch erreichen Sie michüber meine Excel-Homepage http://held-Office.de oder über [email protected]. Soerreichen Sie gleichzeitig auch den Verlag, den es wie mich selbst interessiert, welcheAnregungen und Kritik Sie haben. Auf der Homepage von Markt+Technik finden Sieauch ein eigenes VBA-Forum (http://www.mut.de/main/main.asp?page=vbaforum),wo Sie Ihre VBA-Fragen loswerden können. Ich moderiere dieses Forum und ant-worte dort nahezu täglich. Auch Sie sind natürlich herzlich eingeladen, in diesemVBA-Forum zu antworten.

Besuchen Sie auch ruhig einmal das Excel-Diskussionsforum news:micro-soft.public.de.excel oder das Excel-Spotlight-Forum unter http://spotlight.de/zforen/mse/t/forum_mse_1.html. Hier können Sie auf jeden Fall eine ganze Menge lernen.

17

Page 18: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Liebe Leserin, lieber Leser

Möchten Sie einen VBA-Kurs besuchen, so finden Sie auf meiner Homepageregelmäßig Schulungsangebote. Diese Angebote reichen von Einzelschulungenbei mir zu Hause über Hotel- und Firmenschulungen, die ich als Dozent abhalte.Gerne komme ich auch direkt zu Ihnen in Ihre Firma, um VBA zu schulen.Nun aber viel Spaß beim Lesen und bei der Programmierung Ihrer Excel-Arbeits-mappen!

Bernd HeldMVP für Microsoft Excel

In diesem Buch verwendete Konventionen

Dieses Buch enthält spezielle Icons, mit denen wichtige Konzepte und Informationen her-ausgestrichen werden sollen.

Ein Hinweis enthält interessante Informationen zum behandelten Thema.

Ein Tipp gibt Ihnen Ratschläge oder zeigt Ihnen einfachere Wege zur Lösungeines Problems auf.

Ein Achtungszeichen weist Sie auf mögliche Probleme hin und hilft Ihnen,schwierigen Situationen aus dem Wege zu gehen.

Das Symbol »Neuer Begriff« ist den Absätzen hinzugefügt, in denen einneuer Begriff definiert wird. Der neue Begriff ist kursiv gedruckt, so dassSie ihn leicht erkennen können.

18

Page 19: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

WOCHE

TTTTaaaag g g g 1111 Die Entwicklungsplattform, Variablen und Konstanten kennen lernen 21

TTTTaaaag g g g 2222 Die Sprachelemente von VBA 101

TTTTaaaag g g g 3333 Die Excel-Anwendung einstellen und anpassen 153

TTTTaaaag g g g 4444 Auf Arbeitsmappen zugreifen – Datei-Operationen 177

TTTTaaaag g g g 5555 Tabellenblätter programmieren 207

TTTTaaaag g g g 6666 Zellbearbeitung mit VBA 249

TTTTaaaag g g g 7777 Aktionen und Benutzereingaben in Excel überwachen 315

WOCHE

TTTTaaaag g g g 8888 Große Datenmengen in VBA behandeln und auswerten 363

TTTTaaaag g g g 9999 Funktionen einsetzen, um Excel zu automatisieren 403

TTTTaaaag g g g 10101010 Excel und das Internet 429

TTTTaaaag g g g 11111111 Excel und Datenzugriffe auf Access und Word 447

TTTTaaaag g g g 12121212 Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren 485

TTTTaaaag g g g 13131313 Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren 505

TTTTaaaag g g g 14141414 Makros dynamisch erzeugen, importieren, exportieren über VBE-Programmierung 527

Page 20: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die wichtigsten Grundlagen und Objekte in VBA für Excel

In der ersten Woche werden Sie am 1. Tag mit der Entwicklungsumgebung vonExcel bekannt gemacht. Sie werden einige Makros eingeben und ablaufen lassen.Bei der Eingabe der Makros werden Sie tatkräftig unterstützt durch spezielle Funk-tionen und Features der Entwicklungsumgebung, mit deren Hilfe Sie Codesschnell erfassen und optisch hervorheben können. Des Weiteren lernen SieDatentypen, Variablen und Konstanten kennen.

Der 2. Tag stellt Ihnen die wichtigsten Sprachelemente, wie Schleifen, Verzwei-gungen und Abfragen, welche in jeder Programmiersprache vorkommen, vor.Schon an diesem Tag lernen Sie, wie Sie diese Sprachelemente anhand von Bei-spielen aus der Praxis einsetzen können.

Der 3. Tag hat als Ausbildungsziel das Einstellen der Excel-Applikationen. So wer-den Sie lernen, wie Sie Excel individuell über den Einsatz von Makros konfigurie-ren können.

Am 4. Tag beginnen Sie mit Excel-Arbeitsmappen zu arbeiten. Sie werden u.a. neueArbeitsmappen anlegen und speichern, Arbeitsmappen drucken, umbenennen odernach bestimmten Mappen auf Ihrer Festplatte oder auf einem Netzwerk suchen.

Am 5. Tag der ersten Woche werden Sie sich intensiv mit Tabellenblätternbeschäftigen. Unter anderem werden Sie Tabellenblätter einfügen und mit Datenfüllen, Tabellen entfernen oder umbenennen bzw. bestimmte Daten auf Tabellensuchen und kennzeichnen.

Am 6. Tag lernen Sie, wie Sie die kleinste Einheit in Excel, die Zelle, ansprechenund programmieren können. Unter anderem werden Sie Zellen auslesen, füllen,einfärben, einfügen, löschen und vieles mehr.

Am 7. Tag steigen Sie in die Welt der Ereignisse von Excel ein. Mit ein paar weni-gen Handgriffen werden Sie dabei erstaunliche Features in Excel programmieren.Unter anderem lernen Sie, wie Sie auf Benutzereingaben automatisch reagierenund wie Sie Änderungen an Ihren Tabellen dokumentieren können. Des Weite-ren lernen Sie, wie Sie Excel über Tastatur bzw. Zeitfunktionen steuern können.Unter anderem werden Sie an diesem Tag Makrolösungen erstellen, die zubestimmten Zeitpunkten automatisch starten.

20

Page 21: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

1ennen lernen

Die Entwicklungs-plattform, Variablen

und Konstanten k

Page 22: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Die Entwicklungsumgebung von Excel ist in der Anwendung integriert. Allerdingsist sie nicht gleich für jedermann sichtbar. In die Entwicklungsumgebung gelan-gen Sie, indem Sie eine der folgenden alternativen Vorgehensweisen wählen:

� Drücken Sie die Tastenkombination (Alt) + (F11).

� Wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/VISUAL BASIC-EDI-TOR.

� Klicken Sie mit der rechten Maustaste auf einen beliebigen Tabellenreiter(unten) und wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN.

� Blenden Sie die Symbolleiste VISUAL BASIC ein und klicken Sie das SymbolVISUAL BASIC-EDITOR an.

Wie Sie sehen, haben Sie eine Menge von Möglichkeiten, in die Ent-wicklungsumgebung von Excel zu gelangen. Persönlich bevorzuge ichdie erste Variante, also das Drücken der Tastenkombination (Alt) +(F11), da dies am schnellsten geht.

Egal, für welche Variante Sie sich entscheiden – alle Varianten führen zum selbenZiel. Sehen Sie sich nun die erste Abbildung an.

Abbildung 1.1: Der erste Aufruf der Entwicklungs-umgebung

22

Page 23: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Der Projekt-Explorer

1.1 Der Projekt-Explorer

Auf der linken Seite sehen Sie den Projekt-Explorer. Dieser Explorer beinhaltetdie momentan geöffneten Arbeitsmappen. Darüber hinaus werden Excel-Add-Insangezeigt, die Sie in Ihrer Excel-Applikation über den Add-Ins-Manager eingebun-den haben. Diese Add-Ins, die Sie an der Endung .xla erkennen können, lassensich über das Plussymbol leider nicht öffnen, es sei denn, Sie wissen das Kennwort,mit dem diese Add-Ins von Microsoft geschützt wurden. Alle anderen im Projekt-Explorer angezeigten Elemente können Sie aufklappen.

In der Arbeitsmappe Personl.xls können Sie Makros speichern, die Sie inZukunft für alle weiteren Excel-Arbeitsmappen einsetzen möchten. WieSie diese wichtige Arbeitsmappe anlegen und mit Makros bestücken, ler-nen Sie im weiteren Verlauf des Tages. Vergleichbar ist diese Datei mitder zentralen Dokumentvorlage Normal.dot, die Sie eventuell schon vonWord kennen. Auch dort werden Makros hinterlegt, um sie für alle wei-teren Dokumente benutzen zu können.

In Abbildung 1.1 sehen Sie, dass neben den beiden Add-Ins und der zentralenMakro-Arbeitsmappe Personl.xls eine weitere Arbeitsmappe Mappe2 angezeigtwird. Wenn Sie über das Plussymbol die einzelnen Elemente dieser Arbeitsmappeaufklappen, erscheinen die in der Mappe enthaltenen Tabellenblätter (Tabelle1bis Tabelle3) sowie der Eintrag DieseArbeitsmappe. Hinter jedem dieser Elementekönnen Sie so genannte Ereignisse einstellen.

Unter einem Ereignis versteht man in Excel Vorgänge – wie das Öffnenoder Schließen einer Arbeitsmappe, die Eingabe von Daten in Zellen,das Drucken oder Speichern von Mappen und vieles mehr. Ereignissekönnen Sie entweder auf Tabellenebene oder auf Arbeitsmappenebeneeinstellen. Sie haben somit die Möglichkeit, bestimmte Vorgänge inIhren Excel-Tabellen separat zu überwachen und auf Veränderungenindividuell zu reagieren. Auf dieses Spezialthema wird an diesem Tagnicht weiter eingegangen. Lernen Sie am Tag 7 praktische Einsatzmög-lichkeiten für Ereignisse kennen.

23

Page 24: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

1.2 Das Eigenschaftenfenster

Über das Menü ANSICHT und den Befehl EIGENSCHAFTEN können Sie das Eigen-schaftenfenster anzeigen, sofern es nicht bereits eingeblendet ist. Alternativ dazukönnen Sie auch die Taste (F4) drücken, um dieses Fenster einzublenden.

Mithilfe dieses Fensters können Sie bestimmte Eigenschaften der im Projekt-Explorer markierten Objekte näher bestimmen. In diesem Beispiel ist im Projekt-Explorer der Eintrag Tabelle1 (Tabelle1) markiert. Im Eigenschaftenfenster wer-den daraufhin die verfügbaren Eigenschaften für dieses Objekt angezeigt.

Die Namen der einzelnen Tabellen entsprechen im ersten Teil dem Namen derzeitlichen Reihenfolge, nach der die Tabellen in die Arbeitsmappe eingefügt wur-den. So werden standardmäßig bei der Neuanlage einer Arbeitsmappe genau dreiTabellen eingefügt. Die erste Tabelle bekommt dabei den internen NamenTabelle1, die zweite Tabelle den Namen Tabelle2 usw. Der Name, der in Klam-mern steht, ist der eigentliche Name der Tabelle, d.h., wenn Sie eine Tabelleumbenennen, wird der tatsächliche Name in Klammern angezeigt. Um den erstenTeil des Namens anzupassen, können Sie den Mauszeiger im Eigenschaftenfens-ter rechts neben die Rubrik (Name) setzen und den gewünschten Namen derTabelle direkt erfassen. Den zweiten Teil des Namens, der auf dem Tabellenreiter

Abbildung 1.2: Das Eigen-schaftenfenster

24

Page 25: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Das Eigenschaftenfenster

der Tabelle angezeigt wird, können Sie anpassen, indem Sie den Mauszeiger imEigenschaftenfenster rechts neben die Rubrik Name setzen und den gewünschtenNamen der Tabelle direkt erfassen.

Tabellen ein- und ausblenden

Über das Eigenschaftenfenster können Sie die Tabelle1 ausblenden. Dazu befol-gen Sie die folgenden Arbeitsschritte:

1. Markieren Sie im Projekt-Explorer den Eintrag Tabelle1 (Tabelle1).

2. Setzen Sie den Mauszeiger im Eigenschaftenfenster rechts neben das FeldVisible.

3. Dort wird nun ein Dropdown-Menü angeboten, aus dem Sie eine der folgen-den Einstellmöglichkeiten auswählen können.

� -1 – xlSheetVisible: Das Einstellen dieser Konstante bewirkt, dass sich dieTabelle im eingeblendeten Zustand befindet (Standardeinstellung).

� 0 – xlSheetHidden: Wählen Sie diese Einstellung, um die Tabelle auszu-blenden. Wenn Sie danach aus der Entwicklungsumgebung heraus in dienormale Arbeitsoberfläche von Excel wechseln, wird die Tabelle nichtmehr angezeigt. Sie haben bei dieser Einstellung aber noch die Möglich-keit, die ausgeblendete Tabelle über das Menü FORMAT und den BefehlBLATT/EINBLENDEN wieder verfügbar zu machen.

� 2 – xlSheetVeryHidden: Über diese Einstellung sorgen Sie dafür, dass dieTabelle sicher ausgeblendet wird, d.h. der Anwender kann die so ausge-blendete Tabelle nicht über das Menü FORMAT und den Befehl BLATT/EINBLENDEN wieder verfügbar machen.

Wenn Sie sich für die sichere Variante, eine Tabelle auszublenden, ent-schieden haben, dann können Sie die so ausgeblendete Tabelle wiederüber den Projekt-Explorer und das Eigenschaftenfenster verfügbarmachen, indem Sie die ausgeblendete Tabelle im Projekt-Explorer mar-kieren und im Eigenschaftenfenster unter der Rubrik Visible die Kons-tante -1 – xlVisible einstellen.

25

Page 26: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Tabellen spiegeln

Möchten Sie einen anderen Anwender verwirren, dann drehen Sie die gewohnteAnsicht einer Tabelle einfach um. Dabei stellen Sie die gespiegelte Ansicht überdas Eigenschaftenfenster wie folgt ein:

1. Markieren Sie im Projekt-Explorer Tabelle2.

2. Im Eigenschaftenfenster setzen Sie den Mauszeiger rechts neben die RubrikDisplayRightToLeft.

3. Wählen Sie aus dem Dropdown-Feld den Eintrag True.

4. Wechseln Sie auf die Arbeitsoberfläche von Excel.

Den zu bearbeitenden Bereich festlegen

Standardmäßig kann ein Anwender auf alle Zellen einer Tabelle zugreifen. Dabeihat er in einer Tabelle Zugriff auf maximal 256 Spalten und 65.536 Zeilen. Möch-

Abbildung 1.3: Die mit xlSheet-VeryHidden aus-geblendete Tabelle1 kann über die normale Oberfläche von Excel nicht mehr eingeblendet werden.

Abbildung 1.4: Spalten gespiegelt – etwas anders als gewohnt

26

Page 27: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Das Code-Fenster

ten Sie den Zugriff ein wenig einschränken, können Sie gezielt über das Eigen-schaftenfenster den Bereich abstecken, in dem sich ein Anwender aufhalten darf.Dazu befolgen Sie die nächsten Arbeitsschritte:

1. Markieren Sie im Projekt-Explorer den Eintrag Tabelle3.

2. Setzen Sie den Mauszeiger im Eigenschaftenfenster rechts neben die RubrikScrollArea.

3. Erfassen Sie die Formel =A1:D10 und drücken Sie anschließend die Taste (ÿ).

4. Wechseln Sie nun auf Ihre Excel-Arbeitsoberfläche und versuchen Sie, denMauszeiger über die Pfeiltasten außerhalb dieses Bereiches zu positionieren.Es wird Ihnen nicht gelingen!

Leider bleibt diese Einstellung nicht dauerhaft bestehen. Sie müssendiese Einstellung nach jedem Öffnen der Arbeitsmappe neu vorneh-men. Wie Sie diese Einstellung jedoch über einen Trick dauerhafterhalten, erfahren Sie am 7. Tag.

1.3 Das Code-Fenster

Bisher haben Sie noch keine einzige Zeile programmiert. Sie haben die Eigen-schaften der einzelnen Tabellen über das Eigenschaftenfenster eingestellt. DieseEigenschaften können Sie aber auch über Makros einstellen. Dazu erfassen Sieden benötigten Code im Code-Fenster. Damit dieses Fenster angezeigt wird,

Abbildung 1.5: Der Zugriff ist nur in einem bestimm-ten Bereich mög-lich.

27

Page 28: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

fügen Sie zunächst ein noch leeres Modul ein. Dabei haben Sie die folgendenMöglichkeiten:

� In der Entwicklungsumgebung von Excel wählen Sie aus dem Menü EINFÜ-GEN den Befehl MODUL.

� Wählen Sie auf der Symbolleiste VOREINSTELLUNG das Dropdown-Symbolund daraus den Befehl MODUL.

� Klicken Sie direkt auf den Projekt-Explorer mit der rechten Maustaste undwählen Sie aus dem Kontextmenü den Befehl EINFÜGEN/MODUL.

Mit allen gerade beschriebenen Varianten wird das Code-Fenster angezeigt.

Makros erfassen und starten

Nachdem Sie das Code-Fenster eingeblendet haben, können Sie beginnen, Ihrerstes Makro einzugeben. Jedes Makro beginnt in VBA mit der Anweisung Sub.Danach folgt ein Leerzeichen. Direkt im Anschluss daran können Sie einenNamen für das Makro angeben. Bedenken Sie dabei für die Benennung vonMakros folgende Punkte:

� Das erste Zeichen muss ein alphanumerisches Zeichen sein.

� Der Makroname darf keine Leerzeichen enthalten.

Abbildung 1.6: Das Code-Fenster wird angezeigt.

28

Page 29: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Das Code-Fenster

� Es dürfen keine Sonderzeichen wie /, %, –, $, [, ], ?, ! oder ähnliche verwendetwerden.

Nach dem Namen geben Sie ein rundes Klammernpaar ein und drücken die Taste(Enter). Das Makro wird jetzt um die Anweisung End Sub ergänzt.

Sub DasErsteMakro()

End Sub

Anwendernamen am Bildschirm ausgeben

Momentan ist das Makro noch leer. Alle Anweisungen, die Sie innerhalb diesesRahmens schreiben, werden abgearbeitet und nacheinander ausgeführt. ErgänzenSie das Makro nun wie folgt, um beispielsweise den Anwendernamen auf demBildschirm auszugeben:

Sub DasErsteMakro() MsgBox Application.UserNameEnd Sub

Um das Makro zu starten, haben Sie folgende Möglichkeiten:

� Setzen Sie den Mauszeiger auf die erste Zeile des Makros und drücken Sie dieTaste (F5).

� Setzen Sie den Mauszeiger auf die erste Zeile des Makros und wählen Sie ausdem Menü AUSFÜHREN den Befehl SUB/USERFORM AUSFÜHREN.

� Setzen Sie den Mauszeiger auf die erste Zeile des Makros und klicken Sie inder Symbolleiste VOREINSTELLUNG auf das Symbol SUB/USERFORM AUSFÜH-REN.

� Wechseln Sie auf Ihre Excel-Arbeitsoberfläche und wählen Sie aus dem MenüEXTRAS den Befehl MAKRO/MAKROS. Im nun angezeigten Dialogfeld wählenSie das Makro aus und klicken auf die Schaltfläche AUSFÜHREN.

In jeder beschriebenen Variante wird eine Meldung auf dem Bildschirm ausgege-ben, in der der Anwendername angezeigt wird. Dies erreichen Sie, indem Sie dieFunktion MsgBox einsetzen.

Der angezeigte Name kann im Menü EXTRAS und mit dem BefehlOPTIONEN auf der Registerkarte ALLGEMEIN im Feld BENUTZERNAMENeingestellt werden.

29

Page 30: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Zusätzlichen Text mit ausgeben

Um neben dem Anwendernamen noch zusätzlichen Text auszugeben, verwendenSie in VBA den Verkettungsoperator &. Das angepasste Makro sieht dann wie folgtaus:

Sub DasZweiteMakro() MsgBox "Momentan arbeitet der Benutzer: " & _ Application.UserNameEnd Sub

Abbildung 1.7: Das erste Makro gibt den Anwen-dernamen auf dem Bildschirm aus.

Abbildung 1.8: Zusätzlichen Text in der Meldung anzeigen

30

Page 31: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Das Code-Fenster

Beachten Sie nach dem Zeichen & den Unterstrich. Damit geben Sie bekannt, dassSie die Anweisung in der nächsten Zeile fortsetzen möchten. Diese Methode wirdsehr oft angewendet, um die Lesbarkeit des Codes zu erhöhen. Selbstverständlichhaben Sie auch die Möglichkeit, die Anweisung in eine Zeile zu schreiben, wasletztendlich aber zur Folge hat, dass Sie mit der horizontalen Navigationsleiste amunteren Rand des Code-Fensters scrollen müssen, um die Anweisung lesen zukönnen (siehe Abbildung 1.8).

Mehrzeilige Meldungen anzeigen

Immer wieder gefragt sind auch mehrzeilige Meldungsfenster. Im folgenden Bei-spiel werden in einem Meldungsfenster mehrere Informationen angezeigt.

Sub DasDritteMakro() MsgBox "Name: " & Application.UserName & vblf & _ "Datum: " & Date & vblf & _ "Uhrzeit: " & Time & " Uhr"End Sub

Mithilfe der Konstante vblf können Sie eine neue Zeile im Meldungsfenster aus-geben lassen. Die einzelnen Informationen werden über den Verkettungsoperator& miteinander verknüpft. Über die Standardfunktionen Date und Time können Siedas aktuelle Datum und die momentane Uhrzeit ermitteln.

Abbildung 1.9: Mehrzeiliges Meldungsfenster anzeigen

31

Page 32: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Sollte das Datum bzw. die Uhrzeit nicht stimmen, müssen Sie dieseEinstellungen in der Systemsteuerung von Windows ändern. Excel ori-entiert sich nämlich bei diesen beiden Funktionen an den Einstellun-gen von Windows.

1.4 Der Makrorekorder

Zu Beginn der Programmierung mit Excel-VBA wird es Ihnen schwer fallen, sichdie Syntax einiger Befehle anzueignen. Eine hervorragende Möglichkeit, sichschnell mit den einzelnen Befehlen vertraut zu machen, besteht darin, den Makro-rekorder einzusetzen. Mithilfe des Makrorekorders können Sie Aktionen, die Siemanuell in Excel vornehmen, im Hintergrund aufzeichnen lassen. Dabei wirdjede einzelne Aktion mit den dafür notwendigen Befehlen direkt in das Code-Fenster geschrieben. Sie können diesen aufgezeichneten Quellcode danach anse-hen und ihn noch weiter anpassen. Üben Sie sich im Gebrauch des Makrorekor-ders, indem Sie die folgenden Aufgaben durchführen:

Ein- und Ausschalten der Gitternetzlinien

In der ersten Aufgabe werden Sie die Gitternetzlinien für eine Tabelle aus- undwieder einschalten. Setzen Sie den Makrorekorder ein, indem Sie die nächstenArbeitsschritte befolgen:

1. Wählen Sie in Excel aus dem Menü EXTRAS den Befehl MAKRO/AUFZEICH-NEN.

Abbildung 1.10: Name und Speicherort des Makros angeben

32

Page 33: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Der Makrorekorder

2. Geben Sie dem Makro im Feld MAKRONAME einen Namen oder übernehmenSie den von Excel vorgeschlagenen Namen.

3. Im Feld TASTENKOMBINATION können Sie dem Makro eine Tastenkombina-tion zuweisen. Geben Sie in dieses Feld einmal den Buchstaben ü ein.

4. Im Dropdown-Feld MAKRO SPEICHERN IN haben Sie drei Auswahlmöglich-keiten:

� DIESE ARBEITSMAPPE: Das Makro wird in der aktuellen Arbeitsmappegespeichert. Es ist dann nur für diese Arbeitsmappe einsetzbar.

� NEUE ARBEITSMAPPE: Das aufgezeichnete Makro wird in einer neuenArbeitsmappe gespeichert.

� PERSÖNLICHE MAKROARBEITSMAPPE: Das aufgezeichnete Makro wird inder zentralen Makroarbeitsmappe PERSONL.XLS abgelegt, die mit jedemExcel-Start geladen wird, aber im Hintergrund bleibt. Somit könnenMakros, die in dieser Mappe gespeichert werden, für alle anderen Arbeits-mappen eingesetzt werden. Die Datei Personl.xls finden Sie übrigens imOffice-Unterverzeichnis OFFICE/XLSTART. Standardmäßig ist dieseArbeitsmappe nach der Installation noch nicht angelegt. Die Mappe wirdaber automatisch für Sie angelegt, wenn Sie ein Makro aufzeichnen undals Speicherort für das Makro die persönliche Makroarbeitsmappe auswäh-len. Entscheiden Sie sich hier für diese Variante.

5. Im Feld BESCHREIBUNG können Sie eine optionale Beschreibung für dasMakro erfassen, welches beispielsweise die Aufgabe, den Autor und das Erstel-lungsdatum beinhalten kann.

6. Bestätigen Sie Ihre Eingaben mit OK.

7. Wählen Sie nun aus dem Menü EXTRAS den Befehl OPTIONEN.

8. Wechseln Sie im Dialogfeld OPTIONEN auf die Registerkarte ANSICHT.

9. Deaktivieren Sie das Kontrollkästchen GITTERNETZLINIEN.

10. Bestätigen Sie Ihre Aktion mit OK.

11. Beenden Sie die Aufzeichnung des Makrorekorders, indem Sie in der ange-zeigten kleinen Symbolleiste das Symbol AUFZEICHNUNG BEENDEN klicken(siehe Abbildung 1.11).

Kontrollieren Sie nun das Resultat der Aufzeichnung, indem Sie über die Tasten-kombination (Alt) + (F11) in die Entwicklungsumgebung wechseln.

33

Page 34: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Für das Ausschalten der Gitternetzlinien ist lediglich eine Anweisung notwendig.Setzen Sie für diesen Zweck die Eigenschaft DisplayGridLines auf den WertFalse. Um die Gitternetzlinien wieder einzublenden, setzen Sie die EigenschaftDisplayGridLines wieder auf den Wert True.

Abbildung 1.11: Die Gitternetz-linien wurden ausgeblendet.

Abbildung 1.12: Der erste selbst aufgezeichnete Code

34

Page 35: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Der Makrorekorder

Einheitliches Gestalten der Kopf- und Fußzeile

Für den Gebrauch des Makrorekorders werden Sie im zweiten Beispiel die Kopf-und Fußzeilen mit Informationen bestücken. Dabei sollen folgende Informa-tionen erfasst werden:

� Kopfzeile links: Autor der Tabelle

� Kopfzeile Mitte: Titel der Tabelle

� Kopfzeile rechts: Datum

� Fußzeile links: Name der Arbeitsmappe und Tabellenblattname

� Fußzeile Mitte: Firmenname

� Fußzeile rechts: Seitennumerierung

Befolgen Sie nun die nächsten Arbeitsschritte, um das Makro aufzuzeichnen:

1. Wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/AUFZEICHNEN.

2. Geben Sie dem Makro einen Namen und wählen Sie als Speicherort den Ein-trag DIESE ARBEITSMAPPE.

3. Starten Sie die Aufzeichnung mit OK.

4. Wählen Sie aus dem Menü DATEI den Befehl SEITE EINRICHTEN.

5. Wechseln Sie im Dialogfeld SEITE EINRICHTEN auf die Registerkarte KOPF-ZEILE/FUSSZEILE.

6. Klicken Sie auf die Schaltfläche BENUTZERDEFINIERTE KOPFZEILE.

7. Füllen Sie das Dialogfeld mithilfe der Symbole und einigen manuell eingege-benen Texten wie folgt aus:

Abbildung 1.13: Die benutzerdefi-nierte Kopfzeile

35

Page 36: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

8. Bestätigen Sie Ihre Einstellungen für die Kopfzeile mit OK.

9. Klicken Sie nun auf die Schaltfläche BENUTZERDEFINIERTE FUSSZEILE.

10. Orientieren Sie sich bei der Fußzeile an folgender Abbildung:

11. Bestätigen Sie die Einstellungen für die Fußzeile mit OK.

12. Beenden Sie das Dialogfeld SEITE EINRICHTEN mit OK.

13. Beenden Sie die Aufzeichnung des Makrorekorders.

Sehen Sie sich nun das Ergebnis der Aufzeichnung an, indem Sie mithilfe derTastenkombination (Alt) + (F11) in die Entwicklungsumgebung wechseln:

Listing 1.1: Kopf- und Fußzeilen per Makro einrichten

Sub KopfUndFuß()'' KopfUndFuß Makro' Makro am 24.08.2002 von Bernd Held aufgezeichnet'

' With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup .LeftHeader = "Held" .CenterHeader = "Kosten und Leistung" .RightHeader = "&D"

Abbildung 1.14: Die benutzerdefi-nierte Fußzeile

36

Page 37: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Der Makrorekorder

.LeftFooter = "&F / &A" .CenterFooter = "Held-Office" .RightFooter = "&P von &N" .LeftMargin = Application.InchesToPoints(0.787401575) .RightMargin = Application.InchesToPoints(0.787401575) .TopMargin = Application.InchesToPoints(0.984251969) .BottomMargin = Application.InchesToPoints(0.984251969) .HeaderMargin = Application.InchesToPoints(0.4921259845) .FooterMargin = Application.InchesToPoints(0.4921259845) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .PrintQuality = -3 .CenterHorizontally = False .CenterVertically = False .Orientation = xlPortrait .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = 100 .PrintErrors = xlPrintErrorsDisplayed End WithEnd Sub

Wie Sie sehen, hat der Makrorekorder hier auch Dinge aufgezeichnet, die Sie garnicht unbedingt brauchen. Dies ist nicht ungewöhnlich für den Makrorekorder. Erbeschreibt einfach das, was er sieht. Dabei werden sämtliche Einstellungen desDialogs SEITE EINRICHTEN mit aufgezeichnet. Wenn Sie das Makro nur auf dieDinge beschränken möchten, auf die es Ihnen ankommt, dann bliebe danach fol-gender Code noch übrig:

Listing 1.2: Das bereinigte Makro für die Erstellung der Kopf- und Fußzeilen

Sub KopfUndFuß()'' KopfUndFuß Makro' Makro am 24.08.2002 von Bernd Held aufgezeichnet

With ActiveSheet.PageSetup .LeftHeader = "Held"

37

Page 38: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

.CenterHeader = "Kosten und Leistung" .RightHeader = "&D" .LeftFooter = "&F / &A" .CenterFooter = "Held-Office" .RightFooter = "&P von &N" End WithEnd Sub

Wenn Sie sich das letzte Makro ansehen, dann werden Sie feststellen, dass Excelbei der Erstellung von Kopf- und Fußzeilen mit Buchstabenkürzeln arbeitet. DieseKürzel werden im Zusammenspiel mit dem Verkettungsoperator & verwendet.

Enthält Ihr Firmenname das Zeichen &, dann gibt es bei der Einstellungdes Firmennamens Probleme, weil Excel das &-Zeichen hier als Steuer-zeichen verwendet und es in diesem Fall verschluckt. Bei solchen Fäl-len muss das &-Zeichen zweimal hintereinander erfasst werden (wiez.B. Schmidt GmbH && Co.).

Ein erstes Stilmittel der Programmierung sehen Sie bereits aus dem aufgezeichne-ten Listing. Mithilfe der Anweisung With können Sie sich eine Menge Schreibar-beit sparen. Schauen Sie sich zum Vergleich einmal das folgende Listing an, daszwar dasselbe Ergebnis wie Listing 1.2 liefert, sich in der Schreibweise aber erheb-lich unterscheidet.

Listing 1.3: Die etwas längere Form

Sub KopfUndFußLang()'' KopfUndFuß Makro' Makro am 24.08.2002 von Bernd Held aufgezeichnetActiveSheet.PageSetup.PrintArea = ""ActiveSheet.PageSetup.LeftHeader = "Held"ActiveSheet.PageSetup.CenterHeader = "Kosten und Leistung"ActiveSheet.PageSetup.RightHeader = "&D"ActiveSheet.PageSetup.LeftFooter = "&F / &A"ActiveSheet.PageSetup.CenterFooter = "Held-Office"ActiveSheet.PageSetup.RightFooter = "&P von &N"End Sub

Die Anweisung ActiveSheet.PageSetup ist hier redundant. Daher wird in Listing1.2 einmal die Anweisung With definiert. Im Anschluss daran brauchen Sie denlangen Befehl nicht jedes Mal zu erfassen. Es reicht stattdessen ein einfacher

38

Page 39: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Der Objektkatalog

Punkt zu Beginn des Befehls. Damit weiß der Editor, dass damit die Kurzformgemeint ist. Achten Sie darauf, dass Sie die Anweisung mit End With abschließen.

Kontrollieren Sie das Ergebnis dieses Makros, indem Sie die Seitenansicht vonExcel aufrufen. Dazu wählen Sie aus dem Menü DATEI den Befehl SEITENAN-SICHT.

1.5 Der Objektkatalog

Eine weitere Möglichkeit, sich schnell in die Entwicklungsumgebung einzuarbei-ten und VBA-Befehle kennen zu lernen, bietet der Objektkatalog. Dieser Katalogenthält alle verfügbaren VBA-Befehle, die Sie bei der Programmierung einsetzenkönnen. Sie starten den Objektkatalog, indem Sie wie folgt in der Entwicklungs-umgebung vorgehen:

1. Drücken Sie die Taste (F2).

2. Wählen Sie aus dem Menü ANSICHT den Befehl OBJEKTKATALOG.

3. Klicken Sie in der Symbolleiste VOREINSTELLUNG das Symbol OBJEKTKATA-LOG.

Die Entwicklungsumgebung stellt Ihnen einen Objektkatalog zur Verfügung, indem Sie sich über Objekte, Methoden, Ereignisse und Eigenschaften informierenkönnen. Über das entsprechende Symbol können Sie erkennen, ob es sich um einObjekt, eine Eigenschaft, eine Methode oder ein Ereignis handelt.

Abbildung 1.15: Die Fußzeile wur-de per Makro erstellt.

39

Page 40: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

OBJEKTE

Als Objekt bezeichnet man alle Teile, die Sie in Excel sehen können.Die wichtigsten Objekte sind die Arbeitsmappe, das Tabellenblatt, dieZeilen bzw. Spalten und die Zelle als kleinste Einheit in Excel.

EIGENSCHAFTEN

Dahinter verbergen sich die Merkmale eines Objekts. So ist z.B. die For-matierung einer Zelle eine Eigenschaft des Objekts Zelle.

METHODEN

Wenn von Methoden die Rede ist, fragen Sie sich am besten immer, wasSie mit den einzelnen Objekten anstellen können. Angewandt auf eine

Abbildung 1.16: Der Objektkata-log gibt Auskunft über die VBA-Syntax.

40

Page 41: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Der Objektkatalog

Arbeitsmappe wären die Methoden das Öffnen, Drucken, Speichernund Schließen.

EREIGNIS

Unter einem Ereignis versteht man in Excel Vorgänge wie das Öffnenoder Schließen einer Arbeitsmappe, die Eingabe von Daten in Zellen,das Drucken oder Speichern von Mappen und vieles mehr. Ereignissekönnen Sie entweder auf Tabellenebene oder auch auf Arbeitsmappen-ebene einstellen. Sie haben somit die Möglichkeit, bestimmte Vorgängein Ihren Excel-Tabellen separat zu überwachen und auf Veränderungenin Ihren Tabellen individuell zu reagieren.

Alle in VBA zur Verfügung stehenden Objekte werden in Bibliotheken verwaltet.Standardmäßig ist im ersten Dropdown-Menü der Eintrag ALLE BIBLIOTHEKENausgewählt. Wenn Sie die Anzeige ein wenig einschränken und die Inhalte einzel-ner Bibliotheken einsehen möchten, wählen Sie die gewünschte Bibliothek imDropdown aus. So können Sie sich z.B. in der Bibliothek VBA ansehen, welcheObjekte nicht nur auf die Tabellenkalkulation Excel beschränkt sind, sondern imgesamten Office-Paket eingesetzt werden können.

Letztes Änderungsdatum einer Datei ermitteln

Die Bibliothek VBA enthält beispielsweise die Funktion FileDateTime, welche dasDatum der letzten Änderung einer Datei ausgibt. Diese Funktion ist nicht nur fürExcel-Arbeitsmappen interessant. Wenden Sie diese Funktion an, indem Sie fol-genden Quellcode erfassen:

Listing 1.4: Das letzte Änderungsdatum einer Mappe ausgeben

Sub LetztesÄnderungdatumAusgeben() MsgBox FileDateTime(ActiveWorkbook.FullName)End Sub

Die Funktion FileDateTime benötigt als Information den Namen sowie den kom-pletten Pfad der Arbeitsmappe, deren letztes Änderungsdatum Sie ermitteln kön-nen. Für die aktuell geöffnete Arbeitsmappe können Sie sich diese Angabe überdie Eigenschaft FullName beschaffen.

41

Page 42: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Möchten Sie stattdessen das letzte Änderungsdatum einer momentan nicht geöff-neten Arbeitsmappe anzeigen lassen, dann lautet die Syntax für diese Aufgabe wiefolgt:

Listing 1.5: Das letzte Änderungsdatum einer geschlossenen Datei ausgeben

Sub LetztesÄnderungdatumAusgeben02() MsgBox FileDateTime("C:\Eigene Dateien\Mappe1.xls")End Sub

Monatsnamen ermitteln

Im nächsten Beispiel werden Sie anhand eines Datums den Monatsnamen ermitteln.Dabei kommen die Funktionen Month und MonthName aus der Bibliothek VBA zumEinsatz. Die Funktion Month gibt anhand eines Datums den dazugehörigen Monat inForm eines Wertes 1–12 zurück. Die Funktion MonthName gibt mithilfe eines Wertes1–12 den dazugehörigen Monat Januar bis Dezember aus. Auch hier wird klar, dassdiese beiden Funktionen im gesamten Office-Paket gebraucht werden.

Setzen Sie diese beiden Funktionen jetzt zusammen ein und erfassen Sie dazu dasfolgende Makro:

Listing 1.6: Den Monatsnamen ausgeben

Sub MonatsnameErmitteln()Dim i As Integer

i = Month(Date)MsgBox "Heute ist der " & Date & Chr(13) & _"Wir sind momentan im Monat " & MonthName(i)End Sub

Abbildung 1.17: Das letzte Änderungsdatum einer Datei ermitteln

42

Page 43: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Online-Hilfe

Deklarieren Sie zu Beginn eine Variable vom Typ Integer. Diese Variable kannganzzahlige Werte aufnehmen. Am zweiten Tag erfahren Sie mehr über den Ein-satz von Variablen.

Mithilfe der Funktion Date können Sie das momentane Tagesdatum ermitteln,welches Sie der Funktion Month übergeben. Die Funktion Month macht daraus eineZahl zwischen 1 und 12. Wäre das aktuelle Datum der 24. August, dann würde dieFunktion daraus den Zahlenwert 8 (für den achten Monat im Jahr) machen. Über-geben Sie danach den Inhalt der Variablen i der Funktion MonthName.

1.6 Die Online-Hilfe

Die dritte Möglichkeit, schnell Fortschritte in der Programmierung mit Excel-VBAzu machen, besteht darin, die Online-Hilfe einzusetzen. Gerade im Zusammen-spiel mit dem Makrorekorder können Sie eine Menge lernen. Im ersten Schrittzeichnen Sie einen Quellcode auf und erkunden danach mit der Online-Hilfe diedabei verwendeten Befehle.

Verwendete Befehle nachlesen

Greifen Sie jetzt beispielsweise auf das Makro zur Erstellung der Kopf- und Fuß-zeilen zurück, welches Sie vorher aufgezeichnet haben. Setzen Sie den Mauszei-ger auf die Eigenschaft LeftHeader und drücken Sie die Taste (F1), um dieOnline-Hilfe aufzurufen (siehe Abbildung 1.19).

Die Online-Hilfe sucht nun eigenständig den Hilfetext zu dem Befehl, auf den Sieden Mauszeiger gesetzt und danach die Taste (F1) gedrückt haben. Hier wird derBefehl beschrieben und oft in einem zusätzlichen Beispiel näher erklärt.

Abbildung 1.18: Den Monatsnamen ermitteln und ausgeben

43

Page 44: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

In der Online-Hilfe können Sie einige Hyperlinks finden:

� Über den Hyperlink SIEHE AUCH finden Sie verwandte Befehle, die Sie somitschnell einsehen können.

� Der Hyperlink BETRIFFT gibt Auskunft darüber, auf welches übergeordneteObjekt sich der Befehl bezieht. So bezieht sich die Eigenschaft LeftHeader aufdas Objekt PageSetup.

� Über den Hyperlink BEISPIELE wird Ihnen gezeigt, wie Sie den Befehl einset-zen können.

� Hyperlinks im Text führen zu weiteren verwandten Themen, die Sie auf dieseWeise schnell aufrufen können.

Die Beispiele können Sie übrigens für Ihre eigenen Makros übernehmen, indemSie wie folgt vorgehen:

1. Markieren Sie mit der linken Maustaste den angezeigten Quellcode.

2. Klicken Sie mit der rechten Maustaste und wählen Sie aus dem Kontextmenüden Befehl KOPIEREN.

3. Wechseln Sie in das Code-Fenster und setzen Sie den Mauszeiger auf dieStelle, an der Sie das Beispiel einfügen möchten.

4. Klicken Sie mit der rechten Maustaste und wählen Sie den Befehl EINFÜGENaus dem Kontextmenü.

Abbildung 1.19: Die Online-Hilfe von Excel

44

Page 45: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Online-Hilfe

Verfügbare Objekte ansehen

Um alle verfügbaren Objekte in Excel in einer übersichtlichen Form anzuzeigen,wechseln Sie in der Online-Hilfe auf die Registerkarte INHALT, klappen die RubrikMICROSOFT EXCEL VISUAL BASIC-REFERENZ auf und klicken den EintragMICROSOFT EXCEL-OBJEKTE an.

Befehle suchen

Sind Sie auf der Suche nach einem bestimmten Befehl bzw. nach einer Funktion,dann rufen Sie die Online-Hilfe auf, indem Sie in der Online-Hilfe auf die Regis-terkarte INDEX wechseln. Geben Sie dort die gewünschte Aktion ein, die Sie aus-führen möchten.

Arbeitsmappe speichern

Im folgenden Beispiel möchten Sie eine Arbeitsmappe speichern und suchendaher nach dem dazu notwendigen VBA-Befehl. Geben Sie daher im FeldSCHLÜSSELWÖRTER EINGEBEN das Wort speichern ein.

Abbildung 1.20: Alle Excel-Objekte auf einen Blick

45

Page 46: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Im Listenfeld THEMA AUSWÄHLEN finden Sie eine ganze Reihe von Vorgängen,bei der der gesuchte Vorgang mittelbar bzw. unmittelbar eine Rolle spielt. Aktivie-ren Sie den Eintrag Save-Methode und sehen Sie sich das Ergebnis auf der rechtenSeite des Bildschirms an. Auch hier kann das Beispiel wieder in eigene Makrosübernommen werden.

1.7 Weitere praktische Helfer in der Entwicklungsumgebung

In der Entwicklungsumgebung befinden sich einige interessante Features, die Siebei der Programmierung gut gebrauchen können. Einige davon sollen nunbeschrieben werden.

Die Symbolleiste Bearbeiten

Die Symbolleiste BEARBEITEN enthält Funktionen, die Ihnen helfen, den Pro-grammcode schnell und sicher zu bearbeiten.

Abbildung 1.21: VBA-Befehle suchen

Abbildung 1.22: Die Symbolleiste Bearbeiten

46

Page 47: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Weitere praktische Helfer in der Entwicklungsumgebung

Auf die Funktionen dieser Symbolleiste wird im Folgenden kurz eingegangen:

Eigenschaften/Methoden anzeigen

Wenn Sie beispielsweise die Anweisung Application eingeben und dann direktdahinter einen Punkt setzen, bietet Ihnen Excel für dieses Objekt alle verfügbarenEigenschaften und Methoden an. Möchten Sie aber bereits eingegebenen Quell-code nachträglich nach verfügbaren Eigenschaften und Methoden checken, set-zen Sie den Mauszeiger auf den Befehl hinter dem Punkt und klicken das SymbolEIGENSCHAFTEN/METHODEN ANZEIGEN an.

Konstanten anzeigen

Viele Befehle enthalten so genannte Konstanten, die Sie einsetzen können. Sokönnen Sie beispielsweise für eine Bildschirmmeldung über den Einsatz vonKonstanten die Schaltflächentypen festlegen. Im folgenden Beispiel soll eine

Abbildung 1.23: Alle Methoden und Eigenschaf-ten für das Objekt Application

47

Page 48: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Warnmeldung angezeigt werden. Erfassen Sie zu diesem Zweck die folgendenZeilen und stoppen mittendrin:

Klicken Sie nach der Eingabe des Kommas auf das Symbol KONSTANTEN ANZEI-GEN. In einer Dropdown-Liste bekommen Sie nun die verfügbaren Schaltflächenangezeigt. Selbstverständlich können Sie auch mehrere Schaltflächen kombinie-ren. Das komplette Makro zum Anzeigen einer Warnmeldung mit den SymbolenKRITISCH sowie einer OK-Schaltfläche lautet:

Listing 1.7: Eine benutzerdefinierte Meldung anzeigen

Sub Warnmeldunganzeigen()MsgBox "Achtung", vbCritical + vbOKOnly, "Warnung"End Sub

Abbildung 1.24: Konstanten für die Schaltflächen anzeigen

48

Page 49: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Weitere praktische Helfer in der Entwicklungsumgebung

QuickInfo oder Parameterinfo

Mithilfe des Symbols QUICKINFO bzw. des Symbols PARAMETERINFO können Siesich die komplette Syntax des Befehls in einem Fensterchen anzeigen lassen. Set-zen Sie dazu im vorherigen Beispiel den Mauszeiger auf die Funktion MsgBox undklicken das Symbol QUICKINFO auf der Symbolleiste BEARBEITEN.

Ganzes Wort

Mit dem Einsatz dieses Symbols sparen Sie sich ein wenig Schreibarbeit. GebenSie beispielsweise einmal die ersten drei Buchstaben von MsgBox ein und klickendanach auf das Symbol GANZES WORT oder drücken Sie die Tastenkombination(Strg) + (____). Der Befehl wird augenblicklich um die noch fehlenden Buchsta-ben ergänzt. Diese Funktion funktioniert aber nur, wenn schon nach den erstenBuchstaben klar wird, dass es sich hierbei nur um den Befehl Msgbox handeln

Abbildung 1.25: Die Symbole und Schaltflächen können nahezu beliebig kombiniert werden

Abbildung 1.26: Die komplette Syntax wird angezeigt.

49

Page 50: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

kann. Diese Funktion wird demnach erst verfügbar, sobald anhand der erstenBuchstaben ein eindeutiger Befehl von Excel erkannt werden kann.

Einzug vergrößern bzw. Einzug verkleinern

Mit der Funktion EINZUG VERGRÖSSERN können Sie einzelne Zeilen oder auchmehrere Zeilen blockweise nach links einrücken. Dies macht den Programmcodeleichter lesbar.

Analog zur vorherigen Funktion können Sie mit der Funktion EINZUG VERKLEI-NERN eingerückte Programmteile wieder nach links rücken und pro Klick denmarkierten Text jeweils um einen Tabstopp versetzen.

Haltepunkt ein/aus

Wenn Sie ein Makro starten, welches einen Haltepunkt aufweist, dann stoppt esgenau an diesem Haltepunkt. Auf diese Weise können Sie Programm-Zwischen-stände überprüfen.

Setzen Sie zum Beispiel einmal einen Haltepunkt im Listing 1.2 in die Zeile.RightHeader = "&D". Excel quittiert diese Aktion, indem es einen braunen, run-den Punkt auf die linke Leiste setzt. Setzen Sie danach den Mauszeiger auf denBeginn des Makros und drücken Sie die Taste (F5), um das Makro zu starten.

Abbildung 1.27: Einzug vergrö-ßern nach rechts

50

Page 51: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Weitere praktische Helfer in der Entwicklungsumgebung

Das Makro läuft nun bis zu der Zeile mit dem gesetzten Haltepunkt und unter-bricht es. Sie können über die Seitenansicht prüfen, dass momentan nur der linkeund der mittlere Teil der Kopfzeile fertig gestellt wurde. Wenn Sie in der Entwick-lungsumgebung nochmals die Taste (F5) drücken, wird der Code bis zum Endeausgeführt. Möchten Sie das Makro abbrechen, dann wählen Sie aus dem MenüAUSFÜHREN den Befehl ZURÜCKSETZEN.

Das Setzen und Entfernen von Haltepunkten können Sie übrigens nochschneller erledigen, indem Sie den Mauszeiger in die gewünschte Zeilesetzen und die Taste (F9) drücken.

Block auskommentieren bzw. Auskommentierung des Blocks aufheben

Standardmäßig können Sie einzelne Zeilen deaktivieren, indem Sie als erstes Zei-chen der jeweiligen Zeile ein einfaches Apostroph eingeben. Excel quittiert dieseAktion, indem es die komplette Zeile mit der Schriftfarbe GRÜN einfärbt. Die soauskommentierten Zeilen werden nun nicht mehr abgearbeitet. Selbstverständlichist es recht mühselig, wenn Sie ganze Blöcke, also mehrere Zeilen auf einmal, inKommentar setzen möchten. Aus diesem Grund wurde die Funktion BLOCK AUS-KOMMENTIEREN in die Symbolleiste BEARBEITEN integriert. Somit können Sieblitzschnell ganze Blöcke vorübergehend in Kommentar setzen bzw. auskommen-

Abbildung 1.28: Haltepunkt setzen

51

Page 52: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

tierte Blöcke schnell wieder verfügbar machen. Gerade wenn Sie einen Code tes-ten und dazu mehrere Varianten überprüfen möchten, empfiehlt es sich, mitdieser Funktion zu arbeiten.

Geizen Sie nicht mit dem Einsatz von Kommentaren im Quellcode. Soempfiehlt es sich, zu Beginn des Makros Kommentare zu erfassen, dieüber die Aufgabe des Makros, den Programmierer und den Zeitpunktder Programmierung Aufschluss geben. Auch die Kommentierung ein-zelner Befehle ist gerade am Beginn einer »Entwickler-Laufbahn« wich-tig. Befehle prägen sich so schneller und leichter ein. Ein typisches Introfür ein Makro könnte wie folgt aussehen:

Listing 1.8: Ein Makro mit Dokumentation

Sub KopfUndFuß()'-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+' Name: KopfUndFuß' Datum: 24.08.2002' Autor: Bernd Held' Dieses Makro stellt die Kopf- und Fußzeile in einer' Tabelle zusammen.'-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ With ActiveSheet.PageSetup

Abbildung 1.29: Schnelles Auskom-mentieren von ganzen Code-blöcken

52

Page 53: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Weitere praktische Helfer in der Entwicklungsumgebung

.LeftHeader = "Held" .CenterHeader = "Kosten und Leistung" .RightHeader = "&D" .LeftFooter = "&F / &A" .CenterFooter = "Held-Office" .RightFooter = "&P von &N" End WithEnd Sub

Lesezeichen setzen

In recht umfangreichen Quellcodes, die mitunter mehrere DIN-A4-Seiten ausma-chen können, kann schnell der Überblick verloren gehen. Sie haben daher dieMöglichkeit, Lesezeichen zu setzen und diese bei Bedarf anzuspringen.

Ein Lesezeichen erkennen Sie daran, dass ein hellblaues abgerundetes Viereck ander linken Leiste angezeigt wird. Über die Symbole NÄCHSTES LESEZEICHENbzw. VORHERIGES LESEZEICHEN können Sie von Lesezeichen zu Lesezeichenspringen. Mit einem Klick auf das Symbol ALLE LESEZEICHEN LÖSCHEN entfer-nen Sie alle gesetzten Lesezeichen.

Abbildung 1.30: Lesezeichen setzen

53

Page 54: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Suchen & Ersetzen

Genau wie in anderen Programmen auch gibt es in der Entwicklungsumgebungeine Möglichkeit, Textteile zu finden und zu ersetzen. Dabei haben Sie die Mög-lichkeit, bestimmte Texte bzw. Befehle nicht nur im aktuellen Modul, sondernauch in allen Modulen des Projekts zu finden. Aufgerufen werden kann dieseFunktion über drei Wege:

� Klicken Sie auf das Symbol SUCHEN in der Symbolleiste VOREINSTELLUNG.

� Alternativ dazu können Sie die Tastenkombination (Strg) + (F) drücken.

� Wählen Sie aus dem Menü BEARBEITEN den Befehl SUCHEN aus.

Bei allen drei Varianten wird das Dialogfeld SUCHEN angezeigt.

Im Feld SUCHEN NACH geben Sie den Befehl bzw. die Textfolge ein, nach der Siesuchen möchten. Haben Sie vor dem Aufruf dieses Dialogfelds den Suchtext imMakro markiert, dann wird dieser automatisch in das Feld SUCHEN NACH über-nommen.

Im Gruppenfeld SUCHEN IN haben Sie die Möglichkeit, Ihre Suche über Ihr aktu-elles Modul hinaus auszudehnen. Standardmäßig unterscheidet Excel nicht zwi-schen Groß- und Kleinschreibung. Ist dies erwünscht, müssen Sie dasentsprechende Kontrollkästchen aktivieren. Die Suchrichtung legen Sie im gleich-namigen Dropdown-Feld fest. Standardmäßig wird in beide Richtungen gesucht,also abwärts sowie aufwärts. Mit einem Klick auf die Schaltfläche ERSETZEN wirddas folgende Dialogfeld angezeigt.

Die Anweisung Chr(13) und die Konstante vbCr bewirken dieselbeAktion. Es wird bei beiden Anweisungen eine neue Zeile begonnen.Gerade bei mehrzeiligen Meldungsfenstern kommen diese beiden Mög-lichkeiten oft zum Einsatz.

Abbildung 1.31: Befehle im Quellcode suchen

54

Page 55: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Weitere praktische Helfer in der Entwicklungsumgebung

Möchten Sie einen Text durch einen anderen ersetzen, müssen Sie noch einenText im Feld ERSETZEN DURCH angeben. Mit einem Klick auf die SchaltflächeDURCHSUCHEN wird die erste gefundene Übereinstimmung angezeigt. Jetzthaben Sie die Wahl, entweder schrittweise Texte zu ersetzen (sichere Methode)oder komplett alle gefundenen Texte.

Vorsicht bei Ersetzungen von Textteilen! Geben Sie möglichst dengesuchten Text vollständig an. Es kann zu katastrophalen Resultatenführen, wenn Sie einzelne Textteile durch andere ersetzen. Nicht seltenwerden dann auch Teile von Befehlen, Methoden oder Eigenschaftenmit ersetzt. Dies hat dann zur Folge, dass Sie den gesamten Code erneutkorrigieren müssen, um Ihre Makros wieder zum Laufen zu bringen.Das ist zum Teil ein fast unmögliches Unterfangen und kann unterUmständen stundenlang dauern.

Schnelles Arbeiten über Tastenkombinationen

Wohl die wenigsten VBA-Entwickler werden ihre Makros immer neu schreiben.Mit dem Symbol KOPIEREN aus der Symbolleiste VOREINSTELLUNG kopieren SieMakros oder einzelne Befehle in die Zwischenablage. Schneller geht es allerdings,wenn Sie das Makro bzw. die Zeile(n) mit der Maus markieren und die Tasten-kombination (Strg) + (C) drücken.

Setzen Sie die Einfügemarke an die Einfügestelle und klicken Sie in der Symbol-leiste VOREINSTELLUNG auf das Symbol EINFÜGEN. Alternativ dazu können Sieauch die Tastenkombination (Strg) + (V) drücken.

Abbildung 1.32: Befehle suchen und ersetzen

55

Page 56: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Diese beiden Tastenkombinationen für das Kopieren und Einfügen vonTexten zählen wohl zu den am häufigsten eingesetzten Tastenkombina-tionen bei Entwicklern.

Entnehmen Sie weitere Tastenkombinationen fürs schnellere Arbeiten der nächs-ten Tabelle:

Tastenkombination Beschreibung

(F7) Code-Fenster anzeigen

(F2) Objektkatalog anzeigen

(Strg) + (F) Suchen

(Strg) + (H) Ersetzen

(F3) Weitersuchen

(ª) + (F3) Vorheriges suchen

(Strg) + (¼) Nächste Prozedur

(Strg) + (½) Vorherige Prozedur

(ª) + (F2) Definition anzeigen

(Strg) + (Bild¼) Einen Bildschirm nach unten

(Strg) + (Bild½) Einen Bildschirm nach oben

(Strg) + (ª) + (F2) Zur letzten Position wechseln

(Strg) + (Pos1) Anfang des Moduls

(Strg) + (Ende) Ende des Moduls

(Strg) + (Æ) Ein Wort nach rechts

(Strg) + (æ) Ein Wort nach links

(Ende) Zum Zeilenende wechseln

(Pos1) Zum Zeilenanfang wechseln

(Strg) + (Z) Letzten Befehl rückgängig machen

Tabelle 1.1: Die wichtigsten Tastenkombinationen für den Entwickler

56

Page 57: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Entwicklungsumgebung einstellen

1.8 Entwicklungsumgebung einstellen

In der Entwicklungsumgebung von Excel haben Sie die Möglichkeit, den Visual-Basic-Editor Ihren eigenen Wünschen anzupassen. Dazu wählen Sie in der Ent-wicklungsumgebung aus dem Menü EXTRAS den Befehl OPTIONEN.

Editoreinstellungen anpassen

Im Gruppenfeld CODE-EINSTELLUNGEN finden Sie die folgenden Einstellungs-möglichkeiten:

� AUTOMATISCHE SYNTAXÜBERPRÜFUNG: Mit dieser Einstellung sorgen Siedafür, dass Ihr Editor nach der Eingabe einer Codezeile automatisch eine Syn-taxprüfung vornimmt.

(Strg) + (C) Code kopieren

(Strg) + (X) Code ausschneiden

(Strg) + (V) Code einfügen

(Strg) + (Y) Aktuelle Zeile löschen

(Strg) + (Entf) Bis zum Wortende löschen

(ÿ) Einzug vergrößern

(ª) + (ÿ) Einzug verkleinern

(Strg) + (ª) + (F9) Alle Haltepunkte löschen

(ª) + (F10) Kontextmenü anzeigen

(Strg) + (P) Modul drucken

(Strg) + (E) Modul/Formular exportieren

(Strg) + (S) Modul speichern

Tastenkombination Beschreibung

Tabelle 1.1: Die wichtigsten Tastenkombinationen für den Entwickler (Forts.)

57

Page 58: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

� VARIABLENDEKLARATION ERFORDERLICH: Wenn Sie diese Option aktivieren,wird die Anweisung Option Explicit den allgemeinen Deklarationen in allenneuen Modulen hinzugefügt. Damit müssen alle im Code verwendeten Vari-ablen zu Beginn eines Makros definiert werden. Wird dies vergessen, weist SieExcel automatisch darauf hin. Es wird auf jeden Fall kein Makro ausgeführt, indem nicht alle verwendeten Variablen definiert sind.

� ELEMENTE AUTOMATISCH AUFLISTEN: Zeigt eine Liste mit den Informationenan, die die Anweisung an der aktuellen Einfügemarke logisch vervollständigenwürden.

� AUTOMATISCHE QUICKINFO: Wird diese Option aktiviert, werden bei der Ein-gabe eines Befehls die dazugehörigen Funktionen bzw. Parameter angezeigt.

� AUTOMATISCHE DATEN-TIPPS: Diese Option ist lediglich im Haltemodus ver-fügbar und zeigt die Werte der Variablen an, auf denen sich der Mauszeigergerade befindet.

� AUTOMATISCH EINZUG VERGRÖSSERN: Zur besseren Übersichtlichkeit solltenSie sich angewöhnen, Ihren Quellcode einzurücken. Die dafür zur Verfügunggestellte Option ermöglicht, für die erste Codezeile einen Tabulator festzule-gen. Alle nachfolgenden Zeilen beginnen an der Tabulatorposition.

� TAB-SCHRITTWEITE: In diesem Eingabefeld stellen Sie die Tab-Schrittweiteauf einen Wert zwischen 1 und 32 Leerzeichen ein.

Abbildung 1.33: Editor einstellen

58

Page 59: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Entwicklungsumgebung einstellen

Im Gruppenfeld FENSTEREINSTELLUNGEN können Sie unter anderem dasDrag&Drop im Code-Fenster ausschalten, automatisch eine Trennlinie zwischenden einzelnen Prozeduren ziehen lassen und das Erscheinungsbild von neuenModulen beeinflussen.

Editierformat festlegen

Wenn Sie zur Registerkarte EDITIERFORMAT wechseln, können Sie die Darstel-lung Ihres Quellcodes anpassen.

Im Listenfeld CODE-FARBEN werden die Textelemente angezeigt, für die die Far-ben angepasst werden können. Darunter befinden sich drei Dropdown-Felder, indenen Sie das Format für den Vorder- bzw. Hintergrund der einzelnen Elementesowie das Kennzeichen in der Kennzeichenleiste bestimmen können. Darüberhinaus haben Sie die Möglichkeit, die Schriftart sowie deren Größe zu bestim-men. Die Kennzeichenleiste kommt dann zur Geltung, wenn Sie häufiger mitHaltepunkten oder Lesezeichen arbeiten.

Abbildung 1.34: Das Editierformat festlegen

59

Page 60: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Allgemeine Einstellungen vornehmen

Wechseln Sie nun zur Registerkarte ALLGEMEIN. Dort werden die Einstellungen,die Fehlerbehandlung und die Kompilierungseinstellungen für das aktuelleVisual-Basic-Projekt festgelegt.

Im Gruppenfeld EINSTELLUNGEN FÜR FORMULAR-RASTER können Sie die Dar-stellungsart des Formulars beim Bearbeiten festlegen. Sie können ein Raster anzei-gen, die Rastereinheiten sowie die Rasterung selbst für das Formular festlegen undeingefügte Steuerelemente automatisch am Raster ausrichten lassen.

Die Einstellung QUICKINFO ANZEIGEN bezieht sich lediglich auf die QuickInfosfür die Symbolschaltflächen und kann deaktiviert werden, wenn Sie etwas mehrÜbung haben und die Symbole in den Symbolleisten kennen.

Aktivieren Sie das Kontrollkästchen AUSBLENDEN DES PROJEKTS SCHLIESSTFENSTER, wenn Projekt-, UserForm-, Objekt- oder Modulfenster automatischgeschlossen werden sollen, sobald ein Projekt im Projekt-Explorer ausgeblendetwird.

Im Gruppenfeld BEARBEITEN UND FORTFAHREN bestimmen Sie, ob eine Benach-richtigung erfolgen soll, wenn durch eine angeforderte Aktion alle Variablen aufModulebene für ein laufendes Projekt zurückgesetzt werden.

Abbildung 1.35: Allgemeine Einstellun-gen vornehmen

60

Page 61: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Entwicklungsumgebung einstellen

Das Gruppenfeld UNTERBRECHEN BEI FEHLERN bestimmt, wie Fehler in derVisual-Basic-Entwicklungsumgebung verarbeitet werden sollen. Das Einstellendieser Option wirkt sich auf alle Instanzen von Visual Basic aus, die nach demÄndern dieser Einstellung gestartet werden.

Sie haben dabei drei Möglichkeiten:

� BEI JEDEM FEHLER: Bei jedem Fehler wird für das Projekt der Haltemodusaktiviert, unabhängig davon, ob eine Fehlerbehandlungsroutine aktiviert istoder sich der Code in einem Klassenmodul befindet. Die fehlerhafte Zeilewird dann mit einer gelben Hintergrundfarbe hinterlegt.

� IN KLASSENMODUL: Mit dieser Einstellung werden alle nicht verarbeitetenFehler in einem Klassenmodul mit dem Haltemodus gestoppt.

� BEI NICHT VERARBEITETEN FEHLERN: Wenn eine Fehlerbehandlungsroutineläuft, wird der Fehler behandelt, ohne den Haltemodus zu aktivieren. Solltekeine Fehlerbehandlungsroutine vorhanden sein, bewirkt der Fehler, dass derHaltemodus für das Projekt aktiviert wird.

Im Gruppenfeld KOMPILIEREN legen Sie fest, ob ein Projekt vor dem Start vollstän-dig kompiliert oder ob der Code bei Bedarf kompiliert wird, wodurch die Anwen-dung schneller gestartet werden kann.

Fenster verankern

Auf der Registerkarte VERANKERN legen Sie fest, welche Fenster verankerbar seinsollen (siehe Abbildung 1.36).

Ein Fenster ist verankert, wenn es mit einer Kante eines anderen verankerbarenFensters oder eines Anwendungsfensters verbunden ist. Ein verankerbares Fensterwird beim Verschieben automatisch ausgerichtet. Ein Fenster ist nicht veranker-bar, wenn es an eine beliebige Position auf dem Bildschirm verschoben werdenkann und diese Position beibehält. Wählen Sie die Fenster aus, die verankerbarsein sollen, und deaktivieren Sie die Kontrollkästchen für die anderen Fenster.

61

Page 62: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

1.9 Datentypen, Variablen und Konstanten

Gerade haben Sie sich mit der Entwicklungsumgebung von Excel vertrautgemacht. Sie haben erste Makros mithilfe des Makrorekorders aufgezeichnet,eigene Makros erfasst und gestartet.

Die Themen nun:

� Was sind Variablen?

� Variablen deklarieren

� Variablendeklaration erzwingen

� Vorsicht, Falle!

� Variablentypen kennen lernen

� Objektvariablen einsetzen

� Konstanten einsetzen

� Konstanten für die Datumsformatierung

Abbildung 1.36: Fenster verankern

62

Page 63: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Was sind Variablen?

Bevor Sie die einzelnen Variablen kennen lernen, soll ganz bewusst zu Anfang dieFrage gestellt werden, was sich hinter dem Begriff Variablen verbirgt und warumdiese eingesetzt werden müssen. Variablen werden u.a. dazu benötigt, Daten zwi-schenzuspeichern. Wenn Sie beispielsweise daran denken, Daten aus einerTabelle zu lesen, um diese zu bearbeiten, und dann wieder in eine andere Tabellezurückzuschreiben, dann ist der Einsatz ohne Variablen nur über die Zwischenab-lage recht unsicher.

Man könnte Variablen beispielsweise mit einem Schokoladen-Adventskalendervergleichen. Dieser Kalender enthält 24 Türchen (Variablen), die mit Schokolade(Daten) gefüllt sind. Der erste Schritt, also die Türchen mit Schokolade zu füllen(Variablen füllen), ist demnach schon getan. Während der Lebenszeit einesAdventkalenders ist die Schokolade sicher in den Türchen verstaut, d.h. ohne IhrZutun bleiben diese Variablen an ihrem sicheren Ort. Wenn Sie sich entschlie-ßen, vorab ein Türchen zu öffnen, um zu sehen, welches Schokoladensymboldahinter verborgen ist, prüfen Sie den Inhalt der »Variablen«. Indem Sie die Scho-kolade essen, wird der Inhalt des Türchens entfernt (Variablen löschen).

Aus diesem Schokoladen-Beispiel wird klar, dass Sie mit Variablen dauerhaft arbei-ten können, d.h., Sie können jederzeit darauf zugreifen, diese abfragen oder verän-dern und zum Schluss ausgeben. Dabei wird für die Variablen bei ihrer Definitionein bestimmter Bereich im Arbeitsspeicher reserviert. Auf diesen eindeutigen Teildes Arbeitsspeichers können Sie über den Namen der Variablen immer wiederzugreifen. Nach dem Ablauf eines Makros werden die Variablen standardmäßiggelöscht, sofern diese nicht global definiert wurden. Aber dazu später mehr.

Variablen deklarieren

Variablen werden immer zu Beginn eines Makros deklariert, also nach der Anwei-sung Sub. In diesem Fall spricht man von lokalen Variablen. Diese Variablen kön-nen nur in dem Makro verwendet werden, in dem sie deklariert wurden. Nachdemein Makro durchgelaufen ist, wird diese Variable wieder aus dem Speichergelöscht.

Von globalen Variablen spricht man, wenn Sie diese allgemein gültig – also inmehreren Makros – verwenden möchten. Dann muss die Variablendeklaration vorder Sub-Anweisung stattfinden.

63

Page 64: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Globale Variablen können gleich für mehrere Makros verwendet werden. Diesewerden nach dem Ende eines Makros auch nicht gelöscht und behalten ihrenaktuellen Wert bei. Es gibt Beispiele, in denen diese Vorgehensweise sinnvoll ist.In den meisten Fällen sollten globale Variablen aber weitgehend vermieden wer-den, da sie wertvollen Speicherplatz auf dem Stapelspeicher belegen, was sichnegativ auf das Laufzeitverhalten von Makros auswirken kann.

Eine Variablendeklaration beginnt immer mit der Anweisung Dim, gefolgt voneinem Variablennamen, den Sie frei wählen können. Danach geben Sie mit demSchlüsselwort As an, welchen Datentyp die Variable erhalten soll.

Wenn Sie Variablen einsetzen, müssen Sie sich dabei an bestimmte Konventionenfür deren Benennung halten:

Regeln für Variablen

� Das erste Zeichen muss aus einem Buchstaben bestehen. Als folgende Zeichenkönnen Sie Buchstaben, Zahlen und einige Sonderzeichen verwenden.

� Sie dürfen keine Leerzeichen in einem Variablennamen verwenden. WennSie einzelne Wörter trennen möchten, verwenden Sie dazu den Unterstrich,wie z.B. Dim Kosten_Juli as Currency.

� Sonderzeichen wie #, %, &, ! oder ? sind nicht erlaubt.

Die verfügbaren Datentypen

Die wichtigsten Variablentypen sind zum einen die Variable vom Typ String undzum anderen die Integer-Variable. In einer Variablen vom Typ String können SieTexte bzw. Zeichen zwischenspeichern, manipulieren und ausgeben. Mit einerVariablen vom Typ Integer führen Sie mathematische Berechnungen aus. Inte-ger-Variablen werden oft als Zähler in Schleifen verwendet, die Sie im weiterenVerlauf des Buches noch kennen lernen werden.

Entnehmen Sie der nachfolgenden Tabelle die gängigsten Variablentypen undderen Speicherbedarf:

64

Page 65: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Anbei ein paar typische korrekte Deklarationen von Variablen:

Dim MwSt as SingleDim KalenderWoche as IntegerDim Meldung as StringDim Gehalt as Currency

Den Gebrauch von Variablen werden Sie später noch zur Genüge üben.

Wenn Sie nach und nach geübter programmieren, möchten Sie möglicherweisedie Variablennamen nicht mehr ganz so lang schreiben und auch bei der Daten-typ-Anweisung weniger Schreibarbeit haben. Sehen Sie sich dazu die folgendeTabelle an:

Variablentyp Wertebereich/Speicherbedarf

Byte Ganze Zahlen zwischen 0 und 255 (1Byte)

Boolean Wahrheitswert, entweder True oder False (2 Byte)

Currency Währungs-Datentyp: Festkommazahlen mit 15 Stellen vor und vier Stel-len nach dem Komma (8 Byte)

Date Datums- und Zeit-Datentyp (8 Byte)

Decimal Dezimalzahlen (14 Bytes)

Double Fließkommazahlen mit einer Genauigkeit von 16 Stellen hinterm Komma (8 Bytes)

Integer Ganze Zahlen zwischen –32.768 und +32.767 (2 Byte)

Long Ganze Zahlen im Wertebereich von –2.147.483.648 und +2.147.483.647 (4 Byte)

Object Datentyp gibt einen Verweis auf ein Objekt wieder (4 Byte)

Single Fließkommazahlen mit einer Genauigkeit von acht Stellen hinterm Komma (4 Byte)

String Der Datentyp für alle Texte (10 Byte)

Variant Standarddatentyp – wird automatisch gewählt, wenn kein anderer Daten-typ definiert ist (16 Byte)

Tabelle 1.2: Die Datentypen für die Programmierung

65

Page 66: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Für jeden in der Tabelle aufgeführten Datentyp gibt es ein Kurzzeichen, welchesSie einsetzen können, um den Programmiercode zu verkürzen. Sie sollten aberzumindest am Anfang bei den sprechenden Variablenbenennungen bleiben.

Variablendeklaration erzwingen

Sie können die Entwicklungsumgebung von Excel so einstellen, dass jede Variablevor ihrer ersten Verwendung deklariert werden muss. Vorher läuft kein einzigesMakro an, sofern es mit Variablen arbeitet, die zuvor nicht deklariert wurden. Umdiese wichtige Einstellung vorzunehmen, gehen Sie wie folgt vor:

1. Wechseln Sie in die Entwicklungsumgebung.

2. Wählen Sie aus dem Menü EXTRAS den Befehl OPTIONEN.

3. Wechseln Sie im Dialogfeld OPTIONEN auf die Registerkarte EDITOR.

4. Aktivieren Sie das Kontrollkästchen VARIABLENDEKLARATION ERFORDERLICH.

5. Bestätigen Sie Ihre Einstellung mit OK.

Was bewirkt diese Einstellung aber genau? Immer wenn Sie ein neues Modul ein-fügen, wird automatisch die Anweisung Option Explicit in die erste Zeile IhresModulblattes eingetragen. Diese Anweisung können Sie selbstverständlich auchvon Hand erfassen. Sie bedeutet nichts anderes, als dass verwendete Variablen imCode vor ihrem Aufruf deklariert werden müssen. Solange verwendete Variablenim Code nicht ordnungsgemäß deklariert wurden, kann kein Makro laufen. Isteine Variable dem Editor unbekannt, meldet der Editor es Ihnen.

Ausführlich Kurzform

Dim Zähler as Integer Dim Z%

Dim ZählerGroß as Long Dim ZzGr&

Dim Betrag as Currency Dim Bg@

Dim Meldung as String Dim Meld$

Tabelle 1.3: Variablen noch kürzer definieren

66

Page 67: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Sollten Sie solch eine Meldung nach dem Start eines Makros erhalten, dann mar-kiert Excel die Variable im Quellcode und färbt die erste Zeile des Makros mit derHintergrundfarbe Gelb. Wählen Sie in einem solchen Fall aus dem Menü AUS-FÜHREN den Befehl ZURÜCKSETZEN, deklarieren die Variable und starten dasMakro erneut.

Vorsicht, Falle!

Bei der Deklaration von Variablen gibt es einige wichtige Dinge zu beachten.

Oft werden Variablen in folgender Form deklariert:

Dim i, i2, i3 As Long

Abbildung 1.37: Die Deklaration von Variablen erzwingen

Abbildung 1.38: Variable wurde noch nicht definiert.

67

Page 68: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Dazu ist zu sagen, dass lediglich die letzte Variable dem Typ Long zuge-ordnet wird. Alle anderen Variablen bekommen den Datentyp Variant.Wenn Sie einen Blick in die letzte Tabelle werfen, werden Sie erken-nen, dass der Datentyp Variant 16 Byte benötigt, wogegen der DatentypInteger lediglich 2 Byte beansprucht. Sie können sich vorstellen, dass eseine gewaltige Verschwendung von Speicherplatz ist, wenn Sie IhreVariablen falsch deklarieren.

Richtig wäre hier:

Dim i As LongDim i2 As LongDim i3 As Long

oder

Dim i As Long, i2 As Long, i3 As Long

Einen weiteren Vorteil der Deklaration von Variablen möchte ich Ihnennicht vorenthalten. Wenn Sie vergessen, Variablen zu deklarieren, undauch nicht die Anweisung Option Explicit gesetzt haben, gehen Siesehr verschwenderisch mit Ihrem Speicher um. Wird für eine Variablekein Datentyp angegeben, wird automatisch der Datentyp Variant ver-wendet. Wegen seines hohen Speicherbedarfs von 16 Byte ist er abernicht zu empfehlen.

Die Entwicklungsumgebung von Excel bietet Ihnen eine hilfreicheMöglichkeit zu prüfen, wo verwendete Variablen definiert sind. KlickenSie die zu überprüfende Variable mit der rechten Maustaste an undwählen Sie im Kontextmenü den Befehl DEFINITION aus. Der Mauszei-ger springt danach direkt an die Stelle im Code, an der die Variable defi-niert wurde.

Statische Variablen

Standardmäßig wird der Variableninhalt nach jedem Makroende gelöscht. Siehaben jedoch auch die Möglichkeit, Variablen so zu definieren, dass deren »Halt-barkeit« nach jedem Makroende erhalten bleibt.

68

Page 69: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Alle folgenden Listings finden Sie auf der CD-ROM im VerzeichnisKap01 unter dem Namen Syntax.xls.

Im folgenden Beispiel können Sie ein Makro mehrere Male hintereinander aufru-fen. Das Makro selbst zählt die Aufrufe und speichert diese in der Variablen Auf-rufe.

Listing 1.9: Variableninhalt bleibt nach Makroende erhalten

Sub VariablenInhaltBleibtBestehen()Static Aufrufe As Long

Aufrufe = Aufrufe + 1MsgBox "Makro wurde " & Aufrufe & " Mal ausgeführt!"End Sub

Wenn Sie das letzte Makro mehrmals hintereinander aufrufen, dann sehen Sie,dass der Inhalt der Variablen Aufrufe nach jedem Makrodurchlauf erhalten bleibt.

Öffentliche Variablen

In der Entwicklungsumgebung von Excel können Sie mehrere Module anlegen.Um Variablen modulübergreifend abfragen oder ändern zu können, müssen Sieeine solche Variable als öffentlich deklarieren. Diese Variablen werden mit derAnweisung Public deklariert. Damit haben Sie die Möglichkeit, auf Variablenzuzugreifen, die in anderen Modulen untergebracht sind.

Im folgenden Beispiel soll in einem Modul (MODUL2) die aktuelle Uhrzeit ineiner öffentlichen Variablen gespeichert werden. Von einem anderen Modul(MODUL3) aus soll diese Startzeit abgefragt werden. Fügen Sie für diese Aufgabezwei neue Modulblätter (MODUL2 und MODUL3) ein und erfassen Sie die beidenMakros in Abbildung 1.40.

Abbildung 1.39: Makro mehrmalig aufrufen

69

Page 70: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Deklarieren Sie in MODUL2 die öffentliche Variable. Danach füllen Sie dieseVariable, indem Sie über die Funktionen Date und Time das aktuelle Tagesdatumsowie die momentane Uhrzeit speichern.

In MODUL3 greifen Sie auf die öffentliche Variable StartZeit zu und geben sie ineinem Meldungsfenster am Bildschirm aus.

Private Variablen

Möchten Sie die Gültigkeit einer Variablen für alle Makros auf ein bestimmtesModul beschränken, z.B. MODUL1, dann müssen Sie die Variable mit der Anwei-sung Private deklarieren.

Im folgenden Beispiel soll eine Passwortverwaltung in einem Modul realisiert wer-den. Dabei soll jeweils die aktive Tabelle über ein Kennwort geschützt werden.Für diesen Zweck speichern Sie das Kennwort in einer privaten Variablen. Es wirddadurch nicht möglich, das Kennwort über Makros aus anderen Modulblätternauszulesen (siehe Abbildung 1.41).

Deklarieren Sie zu Beginn im Modulblatt MODUL3 eine private Variable mit demNamen Passw. Im Makro TabelleSchützen geben Sie das Kennwort bekannt undwenden die Methode Protect an, um die aktive Tabelle zu schützen. Das MakroTabelleEntsperren hebt den Schutz der aktiven Tabelle auf, indem es dieMethode Unprotect einsetzt und dabei das Kennwort übergibt.

Abbildung 1.40: Der Einsatz einer öffentlichen Variablen

70

Page 71: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Von einem anderen Modulblatt aus haben Sie in diesem Beispiel keine Chance,auf die Variable Passw zuzugreifen.

Objektvariablen einsetzen

Neben den Variablen, die Sie mit Datentypen deklarieren, gibt es auch noch sogenannte Objektvariablen, die einen Verweis auf ein bestimmtes Objekt enthalten.

Welche Objekte unter anderem zur Verfügung stehen, können Sie ermitteln,wenn Sie in der Entwicklungsumgebung den Objektkatalog aufrufen. Dies gehtam schnellsten, indem Sie die Taste (F2) drücken.

Alternativ dazu können Sie einfach mit der Deklaration einer Objektva-riablen beginnen, indem Sie beispielsweise die Anweisung Dim Test Aseingeben und dann die (____)-Taste drücken. Augenblicklich wirdIhnen ein Kontextmenü angeboten, welches die zur Verfügung stehen-den Objekte anbietet.

Um den Einsatz von Objektvariablen zu üben, arbeiten Sie nun ein paar typischeBeispiele durch. Dabei greifen wir an dieser Stelle schon einmal etwas vor, damitSie sehen, was Sie im Buch noch alles erwarten können.

Abbildung 1.41: Kennwort verwalten

71

Page 72: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Den Office-Assistenten aufrufen

Im folgenden Beispiel werden Sie den Office-Assistenten aufrufen und ein paarSätze »sprechen« lassen. Dazu ist folgendes Makro notwendig:

Abbildung 1.42: Den Objektkata-log zur Hilfe ein-setzen

Abbildung 1.43: Das Kontext-menü bietet Ihnen alle zur Ver-fügung stehenden Objekte an.

72

Page 73: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Listing 1.10: Den Office-Assistenten aufrufen und animieren

Sub OfficeAssistentenAufrufen()Dim OffAss As Balloon

Set OffAss = Assistant.NewBalloon

With OffAss .Heading = "Office-Assistent" .Icon = msoIconTip .Mode = msoModeAutoDown .BalloonType = msoBalloonTypeButtons .Labels(1).Text = "Tag 1: Die Entwicklungsplattform" .Labels(2).Text = "Tag 2: Variablen und Konstanten" .Labels(3).Text = "Tag 3: VBA-Sprachelemente" .Animation = msoAnimationGreeting .Button = msoButtonSetOK .ShowEnd With

Set OffAss = NothingEnd Sub

Abbildung 1.44: Den Office-Assis-tenten über das Objekt Balloon aufrufen

73

Page 74: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Wenn Sie eine Objektvariable deklarieren, wird Platz im Speicher reserviert, derWert der Objektvariablen wird aber auf Nothing gesetzt, bis Sie ihr mit der Set-Anweisung einen Objektverweis zuweisen. Vergessen Sie nicht, den Speicher amEnde über die Anweisung Set OffAss = Nothing wieder freizugeben.

Schaltfläche einfügen

Im nächsten Beispiel soll in eine Tabelle eine neue Schaltfläche an einebestimmte Position eingefügt und beschriftet werden. Danach soll ein bereitserfasstes Makro der Schaltfläche zugewiesen werden. Nach dem Klicken dieserSchaltfläche soll dieses Makro ausgeführt werden.

Listing 1.11: Eine Schaltfläche einfügen

Sub SchaltflächeIntegrieren()Dim Schaltfläche As Button

Set Schaltfläche = _ActiveSheet.Buttons.Add(10, 20, 100, 50)

With Schaltfläche .Caption = "Anwendung beenden" .OnAction = "ExcelBeenden"End With

Set Schaltfläche = NothingEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Button. Danachfügen Sie eine Schaltfläche ein, indem Sie die Methode Add einsetzen. Die vierArgumente in der Klammer stehen für die genaue Einfügeposition der Schaltflä-che in der Tabelle. Dabei ergeben die ersten beiden Argumente den linken, obe-ren Punkt (in Millimetern) der Einfügeposition in der Tabelle. Das dritteArgument steht für die Breite, das vierte Argument für die Höhe der einzufügen-den Schaltfläche.

Setzen Sie danach die Anweisung With ein, um sich ein wenig Schreibarbeit zuersparen. Über die Eigenschaft Caption legen Sie die Beschriftung der Schaltflä-che fest. Mithilfe der Eigenschaft OnAction legen Sie den Namen des Makros fest,das ausgeführt werden soll, wenn diese Schaltfläche angeklickt wird. Vergessen Sie

74

Page 75: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

nicht, die Anweisung End With zu schreiben, damit der Editor weiß, dass der »Ver-einfachungsblock« nun beendet ist.

Heben Sie am Ende des Makros den reservierten Speicher der Objektvariablenauf, indem Sie die Anweisung Set Schaltfläche = Nothing einsetzen.

Was nun noch fehlt, ist das Makro ExcelBeenden, welches Sie bei der EigenschaftOnAction angegeben haben.

Listing 1.12: Excel ohne Rückfrage beenden

Sub ExcelBeenden() Application.DisplayAlerts = False Application.QuitEnd Sub

Mithilfe der Eigenschaft DisplayAlerts können Sie die Standardmeldungen vonExcel, wie beispielsweise die Abfrage vor dem Beenden von Excel, ob die Ände-rungen gespeichert werden sollen, unterdrücken. Indem Sie die Methode Quiteinsetzen, beenden Sie Microsoft Excel.

Abbildung 1.45: Automatisch eine Schaltfläche ein-fügen

75

Page 76: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Diagramm exportieren

Wenn Sie Diagramme in Excel erstellen, dann werden diese Diagramme alsChart-Objekt in VBA angesprochen. Diagramme können Sie übrigens auch in dasGIF-Format exportieren.

In der folgenden Lösung haben Sie eine Datentabelle und ein integriertes Dia-gramm vorliegen. Orientieren Sie sich dabei an der folgenden Abbildung:

Ihre Aufgabe besteht nun darin, dieses Diagramm in einer separaten Grafikdateizu speichern. Erfassen Sie zu diesem Zweck das folgende Makro:

Listing 1.13: Ein eingebettetes Diagramm exportieren

Sub DiagrammExportieren()Dim Diagramm As Chart

Set Diagramm = _Sheets("Tabelle3").ChartObjects(1).Chart

Diagramm.Export _ Filename:="c:\Eigene Dateien\Diagramm.gif", _ FilterName:="GIF"

Set Diagramm = NothingEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Chart. Geben Siemithilfe der Anweisung Set bekannt, wo sich das integrierte Diagramm befindet.Über das Auflistungsobjekt Sheets geben Sie den Namen der Tabelle exakt an.

Abbildung 1.46: Die Ausgangs-basis: eine Daten-tabelle und ein integriertes Diagramm

76

Page 77: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Im Auflistungsobjekt ChartObject sind alle Diagrammobjekte der aktiven Tabelleverzeichnet. Über den Index können Sie ein Diagrammobjekt ansprechen. DerIndex 1 steht für das zuerst eingefügte Diagrammobjekt. Da es nur ein Diagramm-objekt in der Tabelle gibt, haben Sie an der Stelle keine Probleme.

Wenden Sie im Anschluss daran die Methode Export an und geben dabei denNamen der zu erzeugenden Exportdatei inklusive des Verzeichnisses an. Im Argu-ment FilterName geben Sie über die Endung der Grafikdatei das gewünschte Gra-fikformat an. Mit dieser Endung ist der sprachenunabhängige Name desGrafikfilters gemeint, wie er in der Registrierung von Windows erscheint.

Öffnen Sie zur Kontrolle die so erstellte Grafikdatei Diagramm.gif über den Explo-rer von Windows.

Die soeben erzeugte Grafikdatei enthält keinerlei Verbindung mehr zuden Daten der Ursprungstabelle. Das Diagramm wurde auf diese Artund Weise ausgelagert und »eingefroren«.

Menüleiste ein- und ausblenden

Die Menüleiste wird wie alle Symbolleisten und Kontextmenüs über das ObjektCommandBars angesprochen. Jede Leiste kann in Excel beispielsweise über eineneindeutigen Index angesprochen werden. Die Arbeitsblatt-Menüleiste hat denIndex 1.

Abbildung 1.47: Das Diagramm wurde in eine Gra-fikdatei exportiert.

77

Page 78: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Blenden Sie jetzt die Arbeitsblatt-Menüleiste aus, indem Sie das folgende Makrostarten:

Listing 1.14: Die Arbeitsblatt-Menüleiste ausblenden

Sub ArbeitsplatzmenüLeisteAusblenden()Dim Leiste As CommandBar

Set Leiste = Application.CommandBars(1)'oder'Set Leiste = Application.CommandBars("Worksheet Menu Bar")

Leiste.Enabled = False

Set Leiste = NothingEnd Sub

Deklarieren Sie zuerst eine Objektvariable vom Typ CommandBar. Damit könnenSie alle Menü- und Symbolleisten in Excel identifizieren und ansprechen. GebenSie über die Anweisung Set bekannt, auf welche Menüleiste Sie zugreifen möch-ten. Wie schon gesagt, können Sie die Arbeitsblatt-Menüleiste über den eindeuti-gen Index 1 ansprechen. Möglich wäre auch folgende Zeile:

Set Leiste = Application.CommandBars("Worksheet Menu Bar")

Setzen Sie die Eigenschaft Enabled auf den Wert False, um die Menüleiste auszu-blenden. Heben Sie danach den Objektverweis auf, indem Sie das Objekt mit demSchlüsselwort Nothing bestücken.

Abbildung 1.48: Die Arbeitsblatt-Menüleiste wurde ausgeblendet.

78

Page 79: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Blenden Sie nun die Arbeitsblatt-Menüleiste ein, indem Sie folgendes Makro ein-setzen:

Listing 1.15: Die Arbeitsblatt-Menüleiste wieder einblenden

Sub ArbeitsplatzmenüLeisteEinblenden()Dim Leiste As CommandBar

Set Leiste = Application.CommandBars(1)'oder'Set Leiste = Application.CommandBars("Worksheet Menu Bar")

Leiste.Enabled = True

Set Leiste = NothingEnd Sub

Textdatei als Symbol einfügen

In der folgenden Aufgabe kommen Sie mit dem Objekt OLEObject in Berührung.Unter einem OLEObject versteht man Steuerelemente oder auch eingebetteteObjekte wie Grafiken.

Erstellen Sie als kleine Vorarbeit eine Textdatei mithilfe des Editors des Windows-Zubehörs und geben Sie ein paar beliebige Daten ein. Speichern Sie diese Dateiim Verzeichnis C:\Eigene Dateien\ unter dem Namen Beispiel.txt. Ihre Aufgabebesteht nun darin, diese Textdatei in eine Excel-Tabelle als Symbol einzufügen.Der Quellcode für diese Aufgabenstellung lautet:

Listing 1.16: Textdatei als Symbol in eine Tabelle einfügen

Sub TextDateiAlsSymbolEinfügen()Dim TextDatei As OLEObject

Sheets("Tabelle2").Activate Set TextDatei = ActiveSheet.OLEObjects.Add( _ Filename:="c:\Eigene Dateien\Beispiel.txt", _ Link:=True, DisplayAsIcon:=True) Set TextDatei = NothingEnd Sub

79

Page 80: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Definieren Sie eine Objektvariable vom Typ OLEObject. Wechseln Sie jetzt auf diegewünschte Tabelle, in die Sie das Symbol einfügen möchten. Danach geben Sieüber die Anweisung Set bekannt, wo sich die Textdatei auf Ihrer Festplatte befin-det und wie diese heißt. Über die Methode Add fügen Sie ein neues OLE-Objekt inIhre Tabelle ein. Indem Sie das Argument FileName verwenden und die Dateien-dung .txt bekannt geben, weiß Excel, um welches Steuerelement es sich handelnsoll. Setzen Sie das Argument Link auf den Wert True, damit das OLE-Objekt mitder angegebenen Datei verknüpft wird. Indem Sie das Argument DisplayAsIconmit dem Wert True versehen, wird das OLE-Objekt als Symbol in der Tabelleangezeigt. Nach dem Einfügen des OLE-Objektes sollten Sie die Speicherreservie-rung durch die Objektvariable wieder freigeben.

Mit einem Doppelklick auf das Textblocksymbol wird die Textdatei geöffnet.

Grafik einfügen

Im nächsten Beispiel wird eine Grafik in eine Tabelle eingefügt. Auch für diesenZweck benötigen Sie eine Objektvariable, dieses Mal vom Typ Picture. Fügen Siejetzt die Datei Winlogo.gif aus dem Verzeichnis C:\Windows\ in eine Tabelle ein,indem Sie das folgende Makro starten:

Listing 1.17: Eine Grafik wird in die Tabelle eingefügt

Sub BildEinfügen()Dim Pic As Picture

Sheets("Tabelle4").Activate

Abbildung 1.49: Textdatei wurde in Excel-Tabelle als Symbol eingefügt.

80

Page 81: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Range("B3").SelectSet Pic = ActiveSheet.Pictures.Insert _("c:\Windows\winlogo.gif")ActiveWindow.DisplayGridlines = False

Set Pic = NothingEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Picture. Danachwechseln Sie auf das gewünschte Tabellenblatt und selektieren die Zielzelle.Geben Sie danach über die Anweisung Set bekannt, dass die Grafik in die aktiveTabelle, nämlich die gerade aktivierte TABELLE4, mithilfe der Methode Inserteingefügt werden soll. Geben Sie bei dieser Methode genau an, wie die Grafikda-tei heißt und wo diese gespeichert ist.

Setzen Sie die Eigenschaft DisplayGridLines, die Sie gestern bereits kennengelernt haben, auf den Wert False, um die Gitternetzlinien für diese Tabelle aus-zublenden.

Heben Sie am Ende des Makros den Objektverweis auf, um den reservierten Spei-cher wieder freizugeben.

Word starten und beenden

VBA können Sie Office-weit einsetzen, d.h. Sie können beispielsweise von Excel auseine Word-Sitzung starten, ein neues Dokument anlegen, etwas dort hineinschrei-ben, das Dokument speichern und am Ende die Word-Sitzung wieder beenden.

Abbildung 1.50: Bild in Tabelle einfügen

81

Page 82: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Im folgenden Beispiel wird eine Word-Sitzung gestartet, ein neues Dokumentangelegt, das heutige Datum und der Anwendername ins Dokument eingetragen,das Dokument gespeichert und anschließend die Word-Sitzung wieder beendet.Das Makro für diese Aufgabe sieht wie folgt aus:

Listing 1.18: Word-Sitzung starten und Dokument anlegen

Sub WordSitzungStarten()Dim wdObjekt As Object Set wdObjekt = CreateObject("Word.Application")

With wdObjekt .Visible = True .Documents.Add .Selection.TypeText Text:=Date & " " & _ Application.UserName .ActiveDocument.SaveAs "Test.doc" .Quit End With

Set wdObjekt = NothingEnd Sub

Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Object. Danach erstel-len Sie mithilfe der Funktion CreateObject einen Verweis auf Ihre Word-Applika-tion. Die Word-Sitzung wird danach geöffnet. Indem Sie die Eigenschaft Visibleauf den Wert True setzen, sehen Sie auch was davon. Möchten Sie diesen Vorgangkomplett im Hintergrund durchführen, setzen Sie diese Eigenschaft auf den WertFalse.

Wenden Sie die Methode Add an, um dem Auflistungsobjekt Documents ein neuesDokument hinzuzufügen. Im Auflistungsobjekt Documents sind übrigens allemomentan geöffneten Word-Dokumente verzeichnet. Über die Eigenschaft Type-Text können Sie dem Dokument einen Text hinzufügen. Dabei fügen Sie dasaktuelle Datum über die Standardfunktion Date sowie den Benutzernamen desaktuellen Anwenders mithilfe der Eigenschaft Username hinzu.

Nun wenden Sie darauf die Methode SaveAs an, um das Dokument unter demangegebenen Namen zu speichern. Über die Methode Quit können Sie die Word-Sitzung wieder beenden.

82

Page 83: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Vergessen Sie nicht, den Objektverweis über die Anweisung Set WdObjekt =Nothing wieder aufzuheben.

Variableninhalt in die Zwischenablage befördern

Im folgenden Beispiel werden Sie eine Variable mit einem Zelleninhalt füllen.Diesen Variableninhalt befördern Sie dann direkt in die Zwischenablage. SehenSie sich zunächst folgende Ausgangssituation an.

Abbildung 1.51: Ein Word-Doku-ment anlegen und speichern

Abbildung 1.52: Der Text aus A1 soll ohne Kopier-aktion in die Zwi-schenablage.

83

Page 84: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Der Quellcode für die Aufgabenstellung sieht wie folgt aus:

Listing 1.19: Den Inhalt einer Variablen in die Zwischenablage bringen

Dim ZwischenAblage As DataObject

Sub TextInZwischenablageEinfügen()Dim Text As String

Set ZwischenAblage = New DataObject Text = Sheets("Tabelle5").Range("A1").Value With ZwischenAblage .SetText Text .PutInClipboard End With

Set Zwischenablage = NothingEnd Sub

Bevor Sie das Makro starten, binden Sie in der Entwicklungsumgebung unter demBefehl EXTRAS/VERWEISE die Bibliothek MICROSOFT FORMS 2.0 OBJECT LIBRARYein. Deklarieren Sie danach eine globale Variable vom Typ DataObject. Über dieAnweisung Set New DataObject gewinnen Sie Zugriff auf die Zwischenablage.Füllen Sie danach die Variable Text mit dem Zelleninhalt der Zelle A1 derTABELLE5. Mithilfe der Methode SetText transferieren Sie den Inhalt der Variab-len Text in die Objektvariable Zwischenablage. Die Methode PutInClipBoard sorgtdann dafür, dass der Inhalt der Variablen Zwischenablage in die Zwischenablageeingefügt wird.

Kontrollieren können Sie dieses Makro, indem Sie es starten, danachden Mauszeiger auf eine beliebige Zelle setzen und die Tastenkombina-tion (Strg) + (V) drücken. Der Inhalt der Zelle muss dann lauten:»Franz jagt im komplett verwahrlosten Taxi quer durch Bayern.«

Ähnlich wie gerade eben speichern Sie nun den augenblicklichen Inhalt der Zwi-schenablage in einer Variablen und geben den Inhalt der Variablen in Zelle B3der TABELLE5 aus. Der Code hierfür lautet:

84

Page 85: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Listing 1.20: Den Inhalt der Zwischenablage in einer Zelle ausgeben

Sub InhaltZwischenablageErmitteln()Set Zwischenablage = New DataObject

Zwischenablage.GetFromClipboard Range("B3").Value = Zwischenablage.GetText Set Zwischenablage = NothingEnd Sub

Über die Methode GetFromClipBoard transferieren Sie Daten aus der Zwischenab-lage in die Objektvariable Zwischenablage. Mithilfe der Methode GetText könnenSie den Inhalt der Objektvariablen Zwischenablage ermitteln.

Testen Sie beide Makros noch einmal, indem Sie zuerst das Makro aus Listing1.19 und gleich im Anschluss das Makro aus Listing 1.20 starten.

Add-Ins-Prüfung

Zu Excel gibt es einige Add-Ins, die Zusatzfunktionen enthalten. Damit diese Funk-tionen eingesetzt werden können, muss das entsprechende Add-In, welches diegewünschte Funktion enthält, über den Add-Ins-Manager eingebunden werden.

Mithilfe von Excel-VBA können Sie aber auch auf Add-Ins zugreifen. Jedes Add-Inkann über die Objektvariable AddIn angesprochen werden. Dabei müssen Sie aber

Abbildung 1.53: Zwischenablage füllen und abfragen

85

Page 86: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

wissen, wie das Add-In genau heißt. Sehen Sie also kurz nach, indem Sie aus demMenü EXTRAS den Befehl ADD-INS auswählen.

Im Add-Ins-Manager sind alle Add-Ins verzeichnet, die Excel anbietet. Sehen Siesich die Namen der einzelnen Add-Ins an. Ihre Aufgabe besteht darin, das Add-InANALYSE-FUNKTIONEN per VBA-Code einzubinden. Deaktivieren Sie also zuTestzwecken dieses Add-In und bestätigen Ihre Einstellung mit OK.

Etwa in der Mitte des Listenfeldes sehen Sie sogar ein eigenes Add-In(MACHERO’S ADD-IN- SAMMLUNG), welches ich für mein erstes Excel-VBA-Kompendium programmiert habe. Sie werden am 12. Tag eben-falls Ihr eigenes Add-In programmieren.

Erfassen Sie nun folgendes Makro, um das Add-In ANALYSE-FUNKTIONEN einzu-binden.

Listing 1.21: Das Add-In Analyse-Funktionen wird bei Bedarf installiert

Sub AddInPrüfung()Dim a As AddIn

Set a = AddIns("Analyse-Funktionen")

Abbildung 1.54: Der Add-Ins-Manager von Excel

86

Page 87: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

If a.Installed = True Then MsgBox "Die Analyse-Funktionen sind installiert."Else MsgBox "Die Analyse-Funktionen sind nicht installiert." & _ Chr(13) & "Das Add-In wird nun eingebunden!" a.Installed = TrueEnd If

Set a = NothingEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ AddIn. Danachgeben Sie über die Anweisung Set an, welches Add-In Sie überprüfen und ggf.installieren möchten.

Mithilfe der Eigenschaft Installed können Sie jetzt überprüfen, ob das Add-Inbereits installiert ist. Wenn ja, dann meldet diese Eigenschaft den Wert Truezurück. Wenn nicht, dann gibt diese Eigenschaft den Wert False zurück. In die-sem Fall setzen Sie die Eigenschaft Installed direkt auf den Wert True. Damiterreichen Sie, dass das Add-In automatisch installiert wird.

Vergessen Sie nicht, den Objektverweis über die Anweisung Set a = Nothing wie-der aufzuheben.

Zeichenobjekt einfügen

Über die Symbolleiste ZEICHNEN können Sie Ihre Tabellen verschönern, indemSie Symbole, Pfeile und sonstige AutoFormen einfügen.

In der nächsten Aufgabe soll ein bestimmter Zellenbereich definiert werden.Genau auf diesen Bereich soll dynamisch ein Rechteck darüber gelegt und wiederweggenommen werden.

Listing 1.22: Zeichenobjekt über Zellenbereich legen

Sub ZeichenObjektEinfügen()Dim Bereich As Range

Set Bereich = Range("B5:F10")

ActiveSheet.Rectangles.Add _ Bereich.Left, Bereich.Top, _

87

Page 88: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Bereich.Width, Bereich.Height Set Bereich = NothingEnd Sub

Definieren Sie zuerst eine Objektvariable vom Typ Range. Unter einem Range-Objekt können Sie entweder einzelne Zellen oder gar ganze Zellenbereicheansprechen. Geben Sie über die Anweisung Set bekannt, über welche Zellen sichder definierte Bereich erstrecken soll.

Wenden Sie danach die Methode Add auf das Objekt Rectangles an, welchesIhnen ein Rechteck in die Tabelle einfügt. Als Einfügekoordinaten übergeben Sieder Methode die Eckkoordinaten Ihres definierten Bereichs, die Sie über dieEigenschaften Left, Top, Width und Height angeben können.

Vergessen Sie nicht, den Objektverweis über die Anweisung Set Bereich =Nothing wieder aufzuheben.

Der Vollständigkeit halber folgt hier noch das Makro, welches dieses Rechteckwieder aus der Tabelle entfernt.

Listing 1.23: AutoForm aus Tabelle entfernen

Sub ZeichenObjektEntfernen()Dim Rechteck As Shape

Set Rechteck = Sheets("Tabelle1").Shapes(1)Rechteck.Delete

Abbildung 1.55: Das Rechteck wur-de genau über den definierten Bereich gelegt.

88

Page 89: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Set Rechteck = NothingEnd Sub

Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Shape. Darunter fallenalle Objekte in der Zeichnungsebene, z.B. AutoFormen, Freihandobjekte, OLE-Objekte oder ein ganz normales Bild. Geben Sie über die Anweisung Set genauan, wo sich das Shape-Objekt befindet. Das Shape-Objekt mit dem Index 1 ist dasShape-Objekt, welches als Erstes in Ihre Tabelle eingefügt wurde. Mithilfe derMethode Delete löschen Sie dieses Objekt. Auch hier sollten Sie den Objektver-weis über die Anweisung Set Rechteck = Nothing wieder aufheben, um den reser-vierten Speicher freizugeben.

Konstanten einsetzen

Im Gegensatz zu den Variablen ändern die Konstanten ihre Werte nie und bleibenwährend der Programmausführung immer konstant. Auch hier wird zwischen loka-len und globalen Konstanten unterschieden.

Globale Konstanten werden außerhalb der einzelnen Makros definiert und sinddamit für alle Makros im Modul verwendbar. Lokale Konstanten hingegen geltennur in dem Makro, in welchem sie definiert wurden. Wie schon bei den Variablensollten Sie darauf achten, nicht allzu viele globale Konstanten zu verwenden, dasich dies merklich auf Ihren Speicher auswirkt.

Nachfolgend ein paar typische Deklarationen mit Konstanten:

Const Laufwerk1 = "C:\"Const Laufwerk2 = "D:\"Const Verzeichnis1 = "C:\Eigene Dateien"Const Verzeichnis2 = "D:\Sicherung"Const Euro = 1.95583Const MwSt = 1.16Const EndDatum = #1/1/2002#

Was kann hier noch verbessert werden? Was für die Variablen gilt, hat auch beiden Konstanten Konsequenzen. In den obigen Beispielen wurde noch nichterklärt, welche Datentypen verwendet werden sollen. Zum aktuellen Zeitpunktwird in allen gerade genannten Beispielen der Datentyp Variant eingesetzt. Esgeht auch etwas genauer und Speicher sparender:

Const Laufwerk1 as String = "C:\"Const Laufwerk2 as String = "D:\"

89

Page 90: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Const Verzeichnis1 as String = "C:\Eigene Dateien"Const Verzeichnis2 as String = "D:\Sicherung"Const Euro as Single = 1.95583Const MwSt as Single = 1.16Const EndDatum as Date = #1/1/2002#

Konstanten für die Datumsfomatierung

Für das Anzeigen von Datums- und Zeitangaben stehen Ihnen fertige Systemkons-tanten zur Verfügung, die die Formatierung des Datums bzw. des Zeitwerts für Sieübernehmen.

Datumsangaben formatiert ausgeben

Die Datums-/Zeitkonstanten werden unter anderem im Zusammenspiel mit derFunktion FormatDatTime verwendet. Dabei haben Sie die Möglichkeit, eineDatums- bzw. Zeitangabe auf mehrere Arten zu formatieren.

Die Funktion FormatDateTime hat folgende Syntax:

FormatDateTime(Datum[,BenanntesFormat])

Im Argument Datum übergeben Sie der Funktion einen Datumswert.

Im Argument BenanntesFormat wählen Sie eine der in der Tabelle folgendenDatums-/Zeitkonstanten.

Konstante Wert Beschreibung

vbGeneralDate 0 Zeigt ein Datum und/oder eine Uhrzeit an. Wenn es ein Datum gibt, wird es in Kurzform angezeigt. Wenn es eine Uhrzeit gibt, wird sie im langen Format angezeigt. Falls vor-handen, werden beide Teile angezeigt.

vbLongDate 1 Zeigt ein Datum im langen Datumsformat an, das in den Ländereinstellungen des Computers festgelegt ist.

VbShortDate 2 Zeigt ein Datum im kurzen Datumsformat an, das in den Ländereinstellungen des Computers festgelegt ist.

Tabelle 1.4: Die Datumskonstanten für die Formatierung

90

Page 91: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Im folgenden Beispiel wird das aktuelle Tagesdatum bzw. die momentane Uhrzeitauf verschiedene Arten ausgegeben.

Listing 1.24: Verschiedene Datums- und Zeitformate

Sub DatumsformateBearbeiten()Dim DatAngabe As Date

DatAngabe = NowMsgBox FormatDateTime(DatAngabe, vbGeneralDate) & Chr(13) & _ FormatDateTime(DatAngabe, vbLongDate) & Chr(13) & _ FormatDateTime(DatAngabe, vbShortDate) & Chr(13) & _ FormatDateTime(DatAngabe, vbLongTime) & Chr(13) & _ FormatDateTime(DatAngabe, vbShortTime)End Sub

Über die entsprechende Formatkonstante wird der Inhalt der Variablen DatAngabeverschiedenartig formatiert. Das mehrzeilige Listenfenster bekommen Sie, indemSie vor jeder neuen gewünschten Zeile die Anweisung Chr(13) einsetzen. Statt die-ser Anweisung können Sie auch die Konstante vblf einsetzen, um einen »Zeilen-vorschub« zu erreichen. Vergessen Sie dabei nicht den Verkettungsoperator.

vbLongTime 3 Zeigt eine Uhrzeit in dem Zeitformat an, das in den Län-dereinstellungen des Computers festgelegt ist.

vbShortTime 4 Zeigt eine Uhrzeit im 24-Stunden-Format (hh:mm) an.

Abbildung 1.56: Die Datums- und Zeitformate in einer mehrzeiligen Meldung

Konstante Wert Beschreibung

Tabelle 1.4: Die Datumskonstanten für die Formatierung (Forts.)

91

Page 92: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Datumsteile extrahieren

Möchten Sie einen ganz bestimmten Teil aus einem Datum herausziehen, bei-spielsweise den Tag, Monat, das Quartal oder das Jahr, dann setzen Sie die Funk-tion DatePart ein.

Die Syntax dieser Funktion lautet:

DatePart(inter,date [,firstdayofweek[,firstweekofyear]])

Im Argument Inter müssen Sie genau angeben, welchen Teil des Datums Sieextrahieren möchten. Die einzelnen Möglichkeiten sehen Sie in der folgendenTabelle:

Im Argument Date geben Sie das Datum an bzw. einen Zellenbezug, der einDatum enthält.

Im Argument firstdayofweek müssen Sie den ersten Tag der Woche angeben.Denken Sie beispielsweise daran, dass der jüdische Kalender mit dem Sonntag alserstem Tag der Woche beginnt. Für unseren europäischen Bereich müssen Siedaher den Wert 2 bzw. die Konstante vbMonday einsetzen. Wenn Sie die ganzeSache etwas variabler halten möchten, dann setzen Sie die Konstante vbUseSystem

Einstellung Beschreibung

yyyy Jahr

q Quartal

m Monat

y Tag des Jahres

d Tag

w Wochentag

ww Woche

h Stunde

n Minute

s Sekunde

Tabelle 1.5: Die Intervall-Konstanten der Funktion DatePart

92

Page 93: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

ein. Damit wird die Einstellung des ersten Tags der Woche direkt aus den Einstel-lungen Ihrer Windows-Systemsteuerung herausgelesen. Sehen Sie die einzelnenBelegungen der Konstanten in der folgenden Tabelle:.

Im letzten Argument firstweekofyear legen Sie die erste Woche eines Jahres fest.Danach richtet sich auch jeweils die Numerierung der Kalenderwoche. Dabeikönnen Sie folgende Einstellungen treffen:

Konstante Wert Beschreibung

VbUseSystem 0 Die NLS API-Einstellung wird verwendet

VbSunday 1 Sonntag (Voreinstellung)

VbMonday 2 Montag

vbTuesday 3 Dienstag

vbWednesday 4 Mittwoch

vbThursday 5 Donnerstag

vbFriday 6 Freitag

vbSaturday 7 Samstag

Tabelle 1.6: Die FirstDayOfWeek-Konstanten der Funktion DatePart

Einstellung Beschreibung

yyyy Jahr

q Quartal

m Monat

y Tag des Jahres

d Tag

w Wochentag

ww Woche

Tabelle 1.7: Die Intervall-Konstanten der Funktion DatePart

93

Page 94: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Im Argument firstdayofweek müssen Sie den ersten Tag der Woche angeben.Denken Sie beispielsweise daran, dass der jüdische Kalender mit dem Sonntag alserstem Tag der Woche beginnt. Für unseren europäischen Bereich müssen Siedaher den Wert 2 bzw. die Konstante vbMonday einsetzen. Wenn Sie die ganzeSache etwas variabler halten möchten, dann setzen Sie die Konstante vbUseSystemein.

Im letzten Argument firstweekofyear legen Sie die erste Woche eines Jahres fest.Danach richtet sich auch jeweils die Numerierung der Kalenderwoche. Dabeikönnen Sie folgende Einstellungen treffen:

Üben Sie die Funktion nun an folgender Aufgabe:

� Ermitteln Sie das Quartal des aktuellen Datums!

Die Lösung dieser Aufgabenstellung können Sie im nachfolgenden Listing sehen:

h Stunde

n Minute

s Sekunde

Konstante Wert Beschreibung

VbUseSystem 0 Die NLS API-Einstellung aus der Systemsteuerung von Windows wird verwendet.

vbFirstJan1 1 Anfang in der Woche mit dem 1. Januar (Voreinstellung)

vbFirstFourDays 2 Anfang in der ersten Woche, die mindestens vier Tage im neuen Jahr enthält

VbFirstFullWeek 3 Anfang in der ersten vollen Woche des Jahres

Tabelle 1.8: Die FirstWeekOfYear-Konstanten der Funktion DatePart

Einstellung Beschreibung

Tabelle 1.7: Die Intervall-Konstanten der Funktion DatePart (Forts.)

94

Page 95: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datentypen, Variablen und Konstanten

Listing 1.25: Das Quartal des aktuellen Tagesdatums ermitteln

Sub QuartalErmitteln() MsgBox "Das Datum von heute lautet: " & Date & vblf & _ "Wir befinden uns im Quartal: " & DatePart("q", Date)End Sub

Mit dem Kürzel q können Sie über die Funktion DatePart das momentane Quartaldes Jahres ermitteln.

Wochentag ermitteln

Mithilfe der Funktion WeekDayName können Sie auf ähnliche Konstanten wiegerade beschrieben zurückgreifen. Die Syntax dieser Funktion lautet:

WeekdayName(Wochentag, abkürzen, ErsterWochentag)

Das Argument Wochentag gibt die numerische Bezeichnung des Wochentages wie-der, die abhängig ist von der Wahl des Arguments ErsterWochentag.

Das Argument abkürzen legt fest, ob der Name des Tages abgekürzt werden solloder nicht. Setzen Sie dieses Argument auf den Wert True, wenn Sie den ermittel-ten Wochentag abkürzen möchten. Setzen Sie hingegen dieses Argument auf denWert False, um den Namen des ermittelten Tages auszuschreiben.

Im Argument ErsterWochentag geben Sie den ersten Tag der Woche an, den Sie inTabelle 1.6 ermitteln können.

In der nächsten Aufgabe soll anhand des aktuellen Tagesdatums der dazugehörigeWochentag ermittelt werden. Das Lösungsmakro können Sie im folgenden Listingbetrachten:

Listing 1.26: Den aktuellen Wochentag bestimmen

Sub WochentagErmitteln() MsgBox "Heute ist der " & Date & vblf & _ "Dieses Datum entspricht einem " & vblf & _

Abbildung 1.57: Ende August gehört dem dritten Quartal an.

95

Page 96: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

WeekdayName(Weekday(Date, vbUseSystemDayOfWeek), False)End Sub

Klar, Sie werden jetzt vielleicht sagen: »Den Wochentag des aktuellen Tagesda-tums zu ermitteln. Da brauch’ ich ja wohl kein Makro!«

Recht haben Sie! Aber wie ist es, wenn die Aufgabenstellung lautet: Welcher Tagist in X Tagen von heute aus gesehen? In der folgenden Lösung wurde das Makroaus Listing 1.26 in eine Funktion überführt.

Listing 1.27: Den Wochentag über eine Funktion ermitteln

Function Wochentag(DatAngabe) Wochentag = WeekdayName _ (Weekday(DatAngabe, vbUseSystemDayOfWeek), False)End Function

Mehr zum Thema der Funktionen erfahren Sie übrigens am 9. Tag.

Übergeben Sie der Funktion einen Datumswert. Im folgenden Makro wird dieFunktion Wochentag aufgerufen und ein zukünftiger Datumswert übergeben:

Listing 1.28: Einen zukünftigen Wochentag ermitteln

Sub DatumPlus30() MsgBox "Heute ist der " & Date & vblf & _ "In 30 Tagen ist der " & Date + 30 & vblf & _ "Dieses Datum fällt auf einen: " & Wochentag(Date + 30)End Sub

Addieren Sie zum aktuellen Datum, welches Sie über die Standardfunktion Datebekommen, einfach den Wert 30 und übergeben der Funktion diesen Datums-wert.

Abbildung 1.58: Der zukünftige Termin ist unter der Woche.

96

Page 97: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

1.10 Fragen & Antworten

F Wie können Sie einen Befehl in der nächsten Zeile fortsetzen, ohne dass der Edi-tor meckert?

A Selbstverständlich können Sie längere Befehlsketten in einer Zeile einge-ben. Der Nachteil daran ist, dass Sie irgendwann so weit nach rechts scrol-len müssen, dass Sie den Anfang der Zeile nicht mehr sehen. Hierempfiehlt sich, über ein Trennzeichen dem Editor mitzuteilen, dass derBefehl in der nächsten Zeile weitergehen soll.

Auch hier leistet die automatische Syntaxprüfung in Excel hervorragendeHilfe, denn nicht jeder Befehl lässt sich an einer beliebigen Stelle trennen.Um einen Befehl in der nächsten Zeile fortzusetzen, drücken Sie am Endeder Zeile zunächst die Taste (____) und geben anschließend das Zeichen _ein. Damit weiß der Editor, dass der Befehl in der nächsten Zeile fortge-setzt werden muss.

F Wie können Sie mehrere Befehle in eine einzige Zeile packen?

A Wenn Sie möchten, können Sie auch mehrere kleinere Befehle in einereinzigen Zeile darstellen. Dazu verwenden Sie den Doppelpunkt alsTrennzeichen zwischen den einzelnen Befehlen.

F Über welche Objektvariable können Sie einen Kommentar einfügen?

A Deklarieren Sie eine Objektvariable vom Typ Comment. Im folgendenMakro aus Listing 1.29 wird ein Kommentar in die aktive Zelle IhrerTabelle eingefügt.

Listing 1.29: Einen Kommentar einfügen

Sub KommentarEinfügen()Dim Kommentar As Comment

Set Kommentar = ActiveCell.AddComment Kommentar.Text "Kommentar zur Zelle"End Sub

Deklarieren Sie eine Objektvariable vom Typ Comment. Danach fügen Sieüber die Methode AddComment einen Kommentar in die aktive Zelle IhrerTabelle ein.

97

Page 98: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

F Wie können Sie einen Hyperlink in eine Zelle einfügen?

A Im folgenden Makro aus Listing 1.30 wird ein Hyperlink eingefügt, der aufmeine Excel-Homepage verweist.

Listing 1.30: Einen Hyperlink einfügen

Sub HyperlinkEinfügen()Dim Hyper As Hyperlink

Set Hyper = ActiveCell.Hyperlinks.Add _ (anchor:=Range("A1"), _ Address:="http://held-office.de")End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Hyperlink.Danach fügen Sie den Hyperlink über die Methode Add ein. Im erstenArgument geben Sie an, wohin der Hyperlink eingefügt werden soll. Imzweiten Argument geben Sie die Adresse an, die angesprungen werden soll,wenn auf den Hyperlink geklickt wird.

1.11 Quiz

F Wie rufen Sie die Entwicklungsumgebung auf?

F Woher holt sich die Funktion Date das aktuelle Tagesdatum?

F Wie kann man schnell komplette Code-Blöcke auskommentieren?

F Wie kann man eine Deklaration von Variablen standardmäßig erzwingen?

F Wie kann man am schnellsten sehen, welche Objektvariablen für die Program-mierung zur Verfügung stehen?

F Wie lautet der Code, um eine PowerPoint-Sitzung zu starten?

F Wie kann man mithilfe der Funktion DatePart den Monatsnamen extrahieren?

98

Page 99: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Übung

1.12 Übung

Zum Abschluss dieses Tages üben Sie das heute Gelernte. Dabei soll folgende Auf-gabenstellung gelöst werden:

In einer Tabelle sollen die Nullwerte nicht angezeigt werden. Außerdem sollen dieGitternetzlinien sowie die Spalten- und Zeilenbeschriftungen im Ausdruck mitausgedruckt werden. Lösen Sie diese Aufgabe mithilfe des Makrorekorders undentfernen Sie danach aus der Aufzeichnung die nicht benötigten Zeilen. SehenSie sich jedoch vorab einmal die Ausgangssituation an:

Die Demodateien Einstieg.xls und Syntax.xls finden Sie auf der CD-ROM im Verzeichnis Kap01. Die Lösung für diese Aufgabe steht imAnhang A.

Abbildung 1.59: Die Ausgangs-situation

99

Page 100: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;
Page 101: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

2

Die Sprach-elemente von VBA

Page 102: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Am gestrigen Tag haben Sie die Entwicklungsumgebung von Excel sowie Daten-typen, Variablen und den Einsatz von Konstanten kennen gelernt. Sie wissen nun,wie Sie sich in der Entwicklungsumgebung zurechtfinden können und warum SieVariablen einsetzen bzw. deklarieren können.

Die Themen heute:

� Arbeiten mit Verzweigungen

� Übersichtlichere Form mit Select Case

� Schleifen programmieren

� Allgemeine Informationen zu Makros

� Fehler finden und beseitigen

� Typische Fehlerquellen in Excel-VBA

Das Wesentliche einer Programmiersprache sind ihre Sprachelemente. In diesemKapitel erfahren Sie, wie Sie mithilfe von Verzweigungen, Schleifen und anderenAnweisungen Ihre Programme flexibel gestalten können. Diese Sprachelementelassen sich leider nicht mit dem Makrorekorder aufzeichnen und müssen vonIhnen selbst erstellt werden. Der richtige Einsatz der Sprachelemente macht letzt-endlich die Kunst der Programmierung aus.

Alle Makros dieses Tages finden Sie auf der mitgelieferten CD-ROM imVerzeichnis Kap02 unter dem Namen Sprachelemente.xls.

2.1 Arbeiten mit Verzweigungen

Unter einer Verzweigung versteht man ganz allgemein eine Prüfung. Diese Prü-fung kann entweder das eine oder das andere Ergebnis bringen. Je nach Ergebniswerden Sie einen bestimmten Weg einschlagen.

102

Page 103: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Verzweigungen

Verzweigungen im Leben

Dazu ein kleines Beispiel aus der Praxis:

»Wenn wir Geld auf dem Konto haben, dann fahren wir in den Urlaub. Wennnicht, dann müssen wir zu Hause bleiben und sparen!«

Bildlich dargestellt könnte das wie folgt aussehen:

Oft sind Verzweigungen aber noch von weiteren Bedingungen abhängig, d.h. aufunser Beispiel bezogen könnte man noch weitere Kriterien anwenden, wie bei-spielsweise:

»Wenn wir Geld haben und ein gutes Angebot bekommen, fahren wir in denUrlaub!«

oder

»Wir fahren in den Urlaub, wenn wir Geld und die Kinder Ferien haben!«

Prüfungen können selbstverständlich auch geschachtelt werden, d.h. ein Zweigkönnte weitergeführt werden und weitere Verzweigungen enthalten. Angewendetauf unser Beispiel würde das bedeuten:

»Also wir fahren jetzt in den Urlaub! Aber wohin? Sollen wir nach Frankreich odernach Italien fahren?«

Abbildung 2.1: Eine einfache Entscheidung

103

Page 104: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Eine weitere Schachtelung wäre dann:

»Wir haben uns für Frankreich entschieden! Aber sollen wir nach Paris oder nachNizza?«

Wie Sie sehen, können Sie auf diese Weise eine Menge Bedingungen formulierenund zu Papier bringen.

Verzweigungen in Excel

Verzweigungen kennen Sie bereits aus der normalen Arbeitsoberfläche von Excel.Dort können Sie die Tabellenfunktion WENN() einsetzen, um entweder die eineoder die andere Aktion in Abhängigkeit von einem Zellenwert einzuleiten.

Verzweigungen in Excel-VBA

Mit Verzweigungen können Sie in Excel-VBA bestimmte Zustände abfragen undje nach Zustand anders reagieren. Die allgemeine Syntax für eine solche Verzwei-gung lautet:

If Bedingung Then [Anweisungen] [Else elseAnweisungen]

Alternativ können Sie die Block-Syntax verwenden:

If Bedingung Then [Anweisungen] [ElseIf Bedingung-n Then [elseifAnweisungen] ... [Else [elseAnweisungen]]End If

Unter dem Argument Bedingung bzw. Bedingung-n geben Sie die Bedingung(en)an, die erfüllt werden muss (müssen).

Unter dem Argument Anweisungen werden jene Anweisungen aufgeführt, diedurchgeführt werden sollen, wenn die erste Bedingung erfüllt wird.

Unter dem Argument elseifBedingungen können Sie weitere Bedingungen formu-lieren und somit die Abfrage weiter schachteln. Über das Argument ElseIfAnweisun-gen lassen Sie dabei die Anweisungen folgen, sofern die elseIfBedingung erfüllt ist.

104

Page 105: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Verzweigungen

Über das Argument elseAnweisungen können Sie eine oder mehrere Anweisungenfolgen lassen, welche ausgeführt werden sollen, wenn die erste Bedingung nichterfüllt wird.

Lassen Sie uns nun diese etwas theoretische Syntaxbeschreibung auf einige Bei-spiele aus der Praxis anwenden.

Zelleninhalte prüfen

Im folgenden Beispiel soll der Inhalt der momentan aktivierten Zelle geprüft wer-den. Im ersten Schritt werden Sie testen, ob überhaupt etwas in der Zelle steht.Das Makro für diese Aufgabe lautet:

Listing 2.1: Prüfen, ob Zelle leer oder gefüllt ist

Sub Verzweigung() If ActiveCell.Value = "" Then _ MsgBox "Zelle ist leer" Else MsgBox "Zelle ist gefüllt!"End Sub

Überprüfen Sie zuerst, ob die aktive Zelle gefüllt ist. Alternativ zu der im Listing2.1 aufgeführten Abfrage könnten Sie auch die Zeile

If IsEmpty(ActiveCell.Value) Then

verwenden. Beide Bedingungen liefern das gewünschte Ergebnis. Für den Fall,dass die Zelle einen Inhalt enthält, wird der Then-Zweig ausgeführt, andernfalls derElse-Zweig.

Im nächsten Schritt möchten Sie prüfen, ob der Zelleninhalt, sofern die Zellegefüllt ist, numerisch oder alphanumerisch ist. Dazu müssen Sie die Verzweigungschachteln. Das könnte dann wie folgt aussehen:

Listing 2.2: Überprüfen des genauen Zelleninhalts

Sub VerzweigungDaten() If IsEmpty(ActiveCell.Value) Then MsgBox "Zelle ist leer" Else If IsNumeric(ActiveCell) Then MsgBox "Zelle enthält eine Zahl" Else

105

Page 106: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

MsgBox "Zelle enthält einen Text" End If End If End Sub

In der ersten Verzweigung überprüfen Sie, ob die Zelle leer ist. Wenn ja, gebenSie eine Meldung auf dem Bildschirm aus. Wenn die Zelle gefüllt ist, müssen Sieeine zweite Verzweigung einbauen, die prüft, ob es sich um einen numerischenoder alphanumerischen Zellenwert handelt. Mithilfe der Funktion IsNumeric kön-nen Sie diese Aufgabe erledigen. Vergessen Sie bei beiden Verzweigungen nicht,diese mit End if abzuschließen.

Bei dieser Gelegenheit möchte ich Ihnen eine weitere Funktion vorstellen, dieIhnen dabei hilft herauszufinden, ob ein Datumswert vorliegt. Sehr oft werden sol-che Datumsüberprüfungen in Excel durchgeführt. Insbesondere bei Berechnun-gen von Lieferterminen oder Zahlungszielen müssen Sie als Entwicklersicherstellen, dass auch wirklich Datumseingaben vorgenommen wurden. Imnächsten Beispiel werden Sie vom Anwender eine Datumseingabe über eine Ein-gabemaske verlangen. Das Makro für diesen Zweck lautet:

Listing 2.3: Datumsprüfung vornehmen

Sub Datumsprüfung()Dim d As Date

On Error GoTo fehler

Beginn:d = InputBox("Geben Sie das Lieferdatum ein!", _ "Datum eingeben")

If IsDate(d) And d >= "01.01.2002" Then Else MsgBox "Nur Eingaben im aktuellen Jahr möglich" GoTo BeginnEnd If

d = d + 14 MsgBox "Das Zahlungsziel ist der: " & dExit Sub

106

Page 107: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Verzweigungen

fehler: MsgBox "Sie haben kein gültiges Datum eingegeben!" GoTo BeginnEnd Sub

Im ersten Schritt fordern Sie den Anwender auf, ein Datum einzugeben. Danachkontrollieren Sie mithilfe einer Verzweigung, ob das Datum im gültigen Bereichliegt. Es werden nur Datumseingaben akzeptiert, die größer oder gleich demDatum 01.01.2002 sind. Prüfen Sie zusätzlich, ob es sich überhaupt um einen gül-tigen Datumswert handelt. Dazu verwenden Sie die Funktion IsDate. Diese Funk-tion meldet den Wert True, wenn es sich um ein Datum handelt. Wurde eingültiges Datum eingegeben, dann rechnen Sie mit diesem Datum. Dabei könnenSie genauso vorgehen, wie Sie es auch bei numerischen Werten machen würden.Addieren Sie zum Liefertermin einfach die Zahl 14 (14 Tage), um einen gängigenZahlungstermin zu errechnen. Geben Sie diesen Termin dann auf dem Bild-schirm aus.

Sollte ein ungültiger Wert in der Eingabemaske erfasst werden, wird diese erneutaufgerufen.

Zu Beginn des Listings finden Sie eine Anweisung On Error. Damitstellen Sie sicher, dass Ihr Makro nicht abstürzt, wenn Text eingegebenwird. Sollte ein Anwender in diesem Beispiel einen Text eingeben, wirddie Sprungmarke fehler angesprungen. Dort erhält der Benutzer eineNachricht, dass ihm bei der Eingabe ein Fehler unterlaufen ist. Mit demBefehl GoTo geben Sie ihm aber die Möglichkeit, seine Eingabe zu wie-derholen. Als Sprungziel geben Sie dort die Sprungmarke Beginn an.

Abbildung 2.2: Das Datum wurde korrekt eingegeben.

107

Page 108: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Sie haben bereits mehrere typische VBA-Funktionen kennen gelernt, die häufigeingesetzt werden, um Eingaben zu überprüfen. In der folgenden Tabelle findenSie die gängigsten Prüffunktionen in VBA.

Auch eine Art von Verzweigung

Neben der Verzweigung If...Then...Else gibt es eine weitere Möglichkeit, umWerte zu überprüfen. Die Funktion lautet IIF.

Die Funktion IIF hat folgende Syntax:

IIf(expr, truepart, falsepart)

Mit dem Argument expr geben Sie den auszuwertenden Ausdruck an.

Das Argument truepart liefert den zurückgegebenen Wert oder Ausdruck, wennexpr den Wert True ergibt.

Das Argument falsepart stellt den zurückgegebenen Wert oder Ausdruck dar,wenn expr den Wert False liefert.

Funktion Beschreibung

IsEmpty Gibt einen Wert vom Typ Boolean zurück, der angibt, ob eine Variable initialisiert wurde.

IsArray Gibt einen Wert vom Typ Boolean zurück, der angibt, ob eine Variable ein Datenfeld ist.

IsDate Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Ausdruck in ein Datum umgewandelt werden kann.

IsError Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Ausdruck ein Fehlerwert ist.

IsNull Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Ausdruck keine gültigen Daten (Null) enthält.

IsNumeric Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Ausdruck als Zahl ausgewertet werden kann.

IsObject Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Bezeichner eine Objekt-Variable darstellt.

Tabelle 2.1: Die wichtigsten Prüffunktionen von VBA

108

Page 109: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Übersichtlichere Form mit Select Case

Diese Funktion wertet immer sowohl den Teil truepart als auch den Teil false-part aus, auch dann, wenn nur einer von beiden Teilen zurückgegeben wird.

Auf ein Beispiel angewendet, überprüfen Sie den Inhalt einer Zelle. Sofern derInhalt numerisch ist, schreiben Sie in die Nebenzelle den Text »Numerisch«.Sollte es sich um einen Text handeln, dann schreiben Sie in die Nebenzelle denText »Alphanumerisch«.

Listing 2.4: Numerisch oder alphanumerisch

Sub AlternativVerzweigung()ActiveCell.Offset(0, 1).Value = _IIF(IsNumeric(ActiveCell), "Numerisch", _ "Alphanumerisch")End Sub

Das Ergebnis dieser Auswertung schreiben Sie über die Anweisung Active-cell.Offset(0, 1).Value in die Nebenzelle. Dabei weist die Eigenschaft Offsetzwei Argumente auf. Das erste Argument gibt die Zeilenverschiebung, von deraktiven Zelle aus gesehen, bekannt. Da Sie in derselben Zeile bleiben möchten, istdemnach die Verschiebung gleich 0. Das zweite Argument gibt die Spaltenver-schiebung, von der aktiven Zelle aus gesehen, bekannt. Da das Ergebnis in dieNebenspalte geschrieben werden soll, wird dieses Argument mit dem Wert 1bestückt.

2.2 Übersichtlichere Form mit Select Case

Wenn Sie mehrere Verzweigungen ineinander schachteln bzw. mehrere Verzwei-gungen hintereinander durchführen möchten, gibt es dafür eine bessere und über-sichtlichere Lösung. Setzen Sie für solche Aufgaben die Anweisung Select Case ein.

Abbildung 2.3: Zelleneintrag prüfen und Ergebnis in Nebenzelle ausgeben

109

Page 110: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Die Syntax für Select Case lautet:

Select Case Testausdruck[Case Ausdrucksliste-n

[Anweisungen-n]] ...[Case Else

[elseAnw]]End Select

Unter dem Argument Testausdruck wird ein beliebiger numerischer Ausdruckoder Zeichenfolgenausdruck erfasst, den Sie auswerten möchten. Im ArgumentAusdrucksliste-n spezifizieren Sie den zu untersuchenden Ausdruck näher.Dabei können Sie Vergleichsoperatoren, wie To, Is oder Like, verwenden.

Unter dem Argument Anweisungen-n können Sie eine oder mehrere Anweisungenangeben, welche ausgeführt werden sollen, wenn Testausdruck mit irgendeinemTeil in Ausdrucksliste-n übereinstimmt.

Das Argument elseAnw ist optional einsetzbar. Damit können Sie darauf reagieren,wenn Testausdruck mit keinem der Ausdrücke im Case-Abschnitt übereinstimmensollte.

Sehen Sie nun ein paar typische Beispiele für den Einsatz von Select Case.

Excel-Version feststellen

In der ersten Aufgabe für dieses Sprachelement sollen Sie feststellen, mit welcherExcel-Version Sie arbeiten. Für diese Aufgabe können Sie die Eigenschaft Versionauswerten, die über einen numerischen Wert Ihre Excel-Installation identifiziert.

Listing 2.5: Excel-Version ermitteln

Sub ExcelVersionFeststellen()MsgBox Application.Version Select Case Left(Application.Version, 1) Case "5" MsgBox "Excel 5" Case "7" MsgBox "Excel 7/95" Case "8" MsgBox "Excel 8/97" Case "9"

110

Page 111: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Übersichtlichere Form mit Select Case

MsgBox "Excel 2000" Case "1" If Left(Application.Version, 2) = 10 Then MsgBox "Excel 2002" Else MsgBox "Excel 2003" End If Case Else MsgBox "Unbekannte Version von Excel" End SelectEnd Sub

Werten Sie über die Funktion Left die erste Ziffer der Versionsnummer aus, dieIhnen die Eigenschaft Version meldet. Innerhalb der Select-Case-Anweisungüberprüfen Sie die Versionsnummern. Trifft eine Bedingung zu, wird eine Mel-dung am Bildschirm ausgegeben, die Ihnen die Excel-Version meldet. Da die bei-den letzten aktuellen Excel-Versionen beide die Zahl 1 (Excel 2000 mitVersionsnummer 10 und Excel 2003 mit der Versionsnummer 11) enthalten,bauen Sie innerhalb der Case-Anweisung noch eine If-Abfrage ein, um den Unter-schied der Versionen anhand der Versionsnummer festzustellen.

Zahlenwerte prüfen

Im nächsten Beispiel werden Eingaben geprüft. Dabei soll ermittelt werden, inwelchem Wertbereich die Eingabe vorgenommen wurde. Sehen Sie sich dazu fol-gendes Listing an:

Listing 2.6: Zahlenwerte überprüfen

Sub ZahlAuswerten()Dim i As Integer

i = InputBox _("Geben Sie einen Wert zwischen 1 und 100 ein!")

Select Case i Case 1 To 5 MsgBox "Wert liegt zwischen 1 und 5" Case 6, 7, 8 MsgBox "Wert ist entweder 6, 7 oder 8" Case 9 To 15

111

Page 112: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

MsgBox "Wert liegt zwischen 9 und 15" Case 16 To 100 MsgBox "Wert liegt zwischen 16 und 100" Case Else MsgBox "Es wurde kein gültiger Wert eingegeben!"End Select

End Sub

Wenden Sie die Select-Case-Anweisung an, um die eingegebenen Werte zu über-prüfen. In der ersten Abfrage kontrollieren Sie, ob der eingegebene Wert zwischen1 und 5 liegt. In diesem Fall können Sie den Vergleichsoperator To einsetzen. Inder zweiten Abfrage haben Sie die Zahlenwerte durch Komma getrennt eingege-ben. Wurde kein gültiger Zahlenwert eingegeben, kommt die Anweisung CaseElse zum Tragen. Dort geben Sie eine Fehlermeldung auf dem Bildschirm aus.

Die folgende Tabelle enthält eine Liste der Vergleichsoperatoren und die Bedin-gungen, unter denen das Ergebnis True, False oder 0 wird:

Fensterstatus ermitteln

In der folgenden Aufgabe soll der Fensterstatus Ihrer Anwendung ermittelt werden.Dieser Status kann drei Werte aufweisen:

� Fenster normal

� Fenster maximiert

� Fenster minimiert

Vergleichsoperator Erklärung

< kleiner als

<= kleiner oder gleich

> größer als

>= größer oder gleich

= gleich

<> ungleich

Tabelle 2.2: Die Vergleichsoperatoren in Excel

112

Page 113: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

Überprüfen Sie nun den Fensterstatus Ihrer Anwendung, indem Sie das folgendeMakro starten:

Listing 2.7: Fensterstatus der Anwendung ermitteln

Sub WindowStatusErmitteln()Dim s As String

Select Case Application.WindowState Case xlMaximized s = "Maximiert" Case xlMinimized s = "Minimiert" Case xlNormal s = "Normal" End Select

MsgBox "Der augenblickliche Window-Status lautet: " & sEnd Sub

Über die Eigenschaft WindowState können Sie den Status Ihres Anwendungsfens-ters feststellen. Werten Sie diesen anschließend über die Anweisung Select Caseaus. Die Frage nach dem Fensterstatus wird beispielsweise dann interessant, wennSie Daten in einer Tabelle eingeben und dazu sicherstellen möchten, dass Sie diegrößtmögliche Ansicht haben.

2.3 Schleifen programmieren

Schleifen werden in Excel dazu verwendet, um Abläufe mehrmals hintereinanderdurchzuführen. Die Schleifen werden so lange durchlaufen, bis eine oder mehrereBedingungen zutreffen, welche dann einen Abbruch der Schleife bewirken. Jenach verwendeter Schleife findet die Abbruchprüfung am Anfang bzw. am Endeder Schleife statt.

Das war nun zugegeben etwas abstrakt: Stellen Sie sich vor, Sie müssten eine Fla-sche Wein trinken. Dabei dürfen Sie den Wein nicht direkt aus der Flasche trin-ken, sondern müssen diesen in ein Viertel-Glas einschenken. Diesen Vorgangmüssen Sie genau viermal wiederholen, um die Flasche leer zu trinken. Dies istein typisches Beispiel für eine Schleife, die solange durchlaufen wird, bis die End-

113

Page 114: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

bedingung eintrifft. Die Geschwindigkeit bei Excel-Schleifen ist natürlich um einTausendfaches schneller als bei diesem Beispiel aus dem täglichen Leben.

Lernen Sie auf den nächsten Seiten die zur Verfügung stehenden Schleifen undeinfache Beispiele für den Einsatz von Schleifen kennen.

For...Next-Schleifen

Sie können die Schleife For...Next verwenden, um einen Block von Anweisungeneine unbestimmte Anzahl von Wiederholungen ausführen zu lassen. For...Next-Schleifen verwenden eine Zählervariable, deren Wert mit jedem Schleifendurch-lauf erhöht oder verringert wird. Sie brauchen daher nicht daran zu denken, denZähler selbst hoch- oder herunterzusetzen.

Die Syntax dieser Schleife lautet:

For Zähler = Anfang To Ende [Step Schritt] [Anweisungen] [Exit For] [Anweisungen]Next [Zähler]

Das Argument Zähler ist erforderlich und besteht aus einer numerischen Variab-len, die als Schleifenzähler dient.

Das Argument Anfang repräsentiert den Startwert von Zähler.

Mit dem Argument Ende legen Sie den Endwert von Zähler fest. Das ArgumentSchritt ist optional. Hier können Sie den Betrag bestimmen, um den der Zählerbei jedem Schleifendurchlauf verändert wird. Falls kein Wert angegeben wird, istdie Voreinstellung 1.

Unter Anweisungen stehen eine oder mehrere Anweisungen zwischen For undNext, die so oft wie angegeben ausgeführt werden.

Innerhalb einer Schleife kann eine beliebige Anzahl von Exit-For-Anweisungenan beliebiger Stelle als alternative Möglichkeit zum Verlassen der Schleife verwen-det werden.

114

Page 115: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

Üben Sie diese Art von Schleife anhand der nächsten Aufgaben:

Zeilen abarbeiten

Im ersten Beispiel zur For...Next-Schleife sollen einige Zeilen abgearbeitet wer-den. Diese Aufgabe gehört zu den wichtigsten Aufgaben in Excel überhaupt. Invielen Fällen müssen Sie in einer Tabelle alle Datensätze nacheinander abarbei-ten, wie z.B. Artikellisten, Preislisten oder Kundenlisten.

In der nächsten Aufgabe sollen die Werte aus Spalte A in Spalte B übertragen undum den Faktor 15% erhöht werden. Sehen Sie sich vorab folgende Abbildung an:

Erfassen Sie nun das Makro, welches die Werte um 15% erhöht und in Spalte Bschreibt:

Listing 2.8: Zahlen um einen bestimmten Prozentsatz erhöhen

Sub Schleife01()Dim i As Long

Sheets("Tabelle3").ActivateRange("A1").Select

For i = 1 To 10 ActiveCell.Offset(0, 1).Value = _

Abbildung 2.4: Eine Zahlenkolonne in Spalte A

115

Page 116: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

ActiveCell.Value * 1.15 ActiveCell.Offset(1, 0).SelectNext i

End Sub

Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie die prozentuale Erhöhungdurchführen möchten. Selektieren Sie danach die Startzelle, bei der die Aktionbeginnen soll. Setzen Sie nun eine For...Next-Schleife auf, die genau zehnmaldurchlaufen wird. Innerhalb der Schleife multiplizieren Sie den Inhalt der jeweilsaktiven Zelle und fügen diesen Wert über die Eigenschaft OffSet in die Neben-zelle ein. Die Nebenzelle erreichen Sie, indem Sie das erste Argument von OffSet,die Zeilenverschiebung, auf den Wert 0 setzen, und das zweite Argument, dieSpaltenverschiebung, auf den Wert 1.

Vergessen Sie nicht, nach jedem Schleifendurchlauf den Mauszeigerüber die Anweisung ActiveCell.Offset(1, 0).Select eine Zeile weiternach unten zu setzen, da Sie sonst eine Endlosschleife produzieren.

An dieser Stelle möchte ich Sie noch auf eine Schwachstelle im Listing 2.7 hin-weisen. Diese Schleife ist leider nicht dynamisch, d.h. wenn Sie Ihre Tabelleerweitern, müssen Sie auch immer die Zählvariable i anpassen.

Abbildung 2.5: Das Ergebnis der Operation sehen Sie in Spalte B.

116

Page 117: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

In diesem Fall ist es besser zu ermitteln, wie viele Zeilen in der Tabelle benötigtwerden, und in Abhängigkeit davon die Schleife aufzubauen. Dies wurde im fol-genden Makro in Listing 2.9 umgesetzt:

Listing 2.9: Dynamische Schleife

Sub Schleife01Dynamisch()Dim i As Long

Sheets("Tabelle3").Activate

For i = 1 To ActiveSheet.UsedRange.Rows.Count Cells(i, 2).Value = _ Cells(i, 1).Value * 1.15Next I

End Sub

Mit der Anweisung ActiveSheet.UsedRange.Rows.Count ermitteln Sie die Anzahlder belegten Zeilen in Ihrer Tabelle. Dies bildet auch das Endkriterium für IhreSchleife. Innerhalb der Schleife können Sie auch auf das Selektieren der einzel-nen Zellen verzichten, indem Sie mit Hilfe der Cells-Auflistung direkt auf die Zel-len verweisen. Bei der Cells-Auflistung muss im ersten Argument die Zeile und imzweiten Argument die Spalte angegeben werden, auf die verwiesen werden soll.Der Schnittpunkt aus Zeile und Spalte ergibt dann die Zelle.

Zeilen einfärben

Vielleicht haben Sie schon einmal einen Blick in ein Rechenzentrum geworfen.Dort gibt es riesige Papierrollen, auf denen Papier auf die Drucker geleitet wird.Dieses Papier ist oft liniert, d.h. eine Zeile weiß und eine Zeile grün.

Stellen Sie im folgenden Makro ein solches Papier her:

Listing 2.10: Liniertes Papier herstellen

Sub Schleife02()Dim i As Long

Sheets("Tabelle4").ActivateRange("A1").Select

117

Page 118: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

For i = 1 To 20 Step 2 ActiveCell.Offset(i, 0).EntireRow.Interior.ColorIndex = 36 Next iEnd Sub

Die Schrittweite in Listing 2.9 ist dieses Mal nicht 1, sondern 2. Dabei verweisenSie mithilfe der Eigenschaft OffSet, bei der Sie das Zeilenargument über die Vari-able i angeben, dynamisch. Während der ganzen Verarbeitung bleibt der Maus-zeiger immer auf Zelle A1. Sie verweisen lediglich immer auf die gewünschteZelle. Über die Eigenschaft EntireRow gewinnen Sie Zugriff auf die kompletteZeile, die Sie über die Eigenschaft ColorIndex einfärben. Jeder Farbwert in Excelhat einen eindeutigen Farbindex. So hat die Farbe HELLGELB den Farbindex 36.

Am 6. Tag erfahren Sie, wie Sie die einzelnen Farben und deren Farb-indexe auslesen können.

Tabellennamen ermitteln

Im nächsten Beispiel sollen Sie die Namen der Tabellen ermitteln, die sich in deraktiven Arbeitsmappe befinden. Dies ist wichtig, um die einzelnen Tabellen zuaktivieren und anzusprechen. Das Makro für diese Aufgabe lautet:

Abbildung 2.6: Das Papier im Rechenzentren-Look

118

Page 119: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

Listing 2.11: Tabellennamen sammeln und ausgeben

Sub Schleife03()Dim i As IntegerDim s As String

For i = 1 To ThisWorkbook.Worksheets.Count s = s & Chr(13) & Worksheets(i).NameNext i

MsgBox "In dieser Mappe befinden sich folgende Tabellen: " & _Chr(13) & s, vbInformation + vbOKOnlyEnd Sub

Die Schleife in Listing 2.11 ist dynamisch. Über die Anweisung ThisWork-book.Worksheets.Count zählen Sie alle Tabellen, die sich in der Arbeitsmappebefinden. Diese Anzahl bauen Sie als Endkriterium in Ihre Schleife ein. Innerhalbder Schleife sammeln Sie die einzelnen Namen der Tabellen in einer String-Vari-ablen. Die Namen der einzelnen Tabellen bekommen Sie über die EigenschaftName, welche Sie auf das jeweilige Tabellenblatt anwenden.

Geben Sie am Ende den Inhalt der Variablen s am Bildschirm aus.

For Each...Next-Schleifen

Die Schleife For Each...Next wiederholt eine Gruppe von Anweisungen für jedesElement in einem Datenfeld oder einer Auflistung.

Die Syntax dieser Schleife lautet:

For Each Element In Gruppe[Anweisungen][Exit For]

Abbildung 2.7: Auflisten der Tabellennamen einer Mappe

119

Page 120: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

[Anweisungen]Next [Element]

Das Argument Element stellt die Variable zum Durchlauf durch die Elemente derAuflistung oder des Datenfeldes dar. Bei Auflistungen sind für Element nur eineVariable vom Typ Variant, eine allgemeine Objektvariable oder eine beliebigespezielle Objektvariable zulässig. Bei Datenfeldern ist für Element nur eine Vari-able vom Typ Variant zulässig. Das nächste Argument Gruppe steht für den Nameneiner Objektauflistung oder eines Datenfeldes. Das letzte Argument Anweisungenist optional und führt eine oder mehrere Anweisungen durch, die für jedes Elementin Gruppe ausgeführt werden sollen.

Auch dieser wichtige Schleifentyp wird nun anhand praxisnaher Aufgaben geübt.

Zellen auswerten

Im ersten Beispiel für die For-Each...Next-Schleife sollen Sie Zellen eines vorherdefinierten Bereichs auswerten. Alle Zellen in diesem Bereich, die einen Wert >80aufweisen, sollen mit dem Schriftschnitt FETT belegt werden. Sehen Sie sich vor-her die Ausgangssituation in der folgenden Abbildung an:

Erfassen Sie jetzt das Makro, welches den Zellenbereich B2:E10 untersucht unddie Werte > 80 mit dem Schriftschnitt FETT belegt:

Abbildung 2.8: Die Ausgangslage – ein Bereich mit Zah-lenwerten

120

Page 121: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

Listing 2.12: Zellen in Zielbereich untersuchen

Sub Schleife04()Dim Zelle As RangeDim Bereich As Range

Set Bereich = Sheets("Tabelle5").Range("B2:E10")

For Each Zelle In Bereich If Zelle.Value > 80 Then Zelle.Font.Bold = TrueNext ZelleEnd Sub

Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Range. DieObjektvariable Zelle symbolisiert jeweils eine Zelle. Die Objektvariable Bereichsteht für mehrere Zellen, also einen ganzen Zellenbereich. Diesen Zellenbereichgeben Sie über die Anweisung Set bekannt. Geben Sie dabei sowohl den Namender Tabelle als auch die korrekten Koordinaten des Bereichs an.

Danach durchlaufen Sie eine For-Each...Next-Schleife, bei der alle Zellen (Zelle)des Zielbereichs (Bereich) durchlaufen werden. Innerhalb dieser Schleife prüfenSie über eine If-Abfrage, ob der jeweilige Zellenwert über 80 liegt. Wenn ja, dannwenden Sie die Eigenschaft Bold auf das Objekt Font an, um der Zelle den Schrift-schnitt FETT zuzuweisen.

Abbildung 2.9: Alle Zellenwerte >80 wurden mit dem Schrift-schnitt Fett formatiert.

121

Page 122: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Einheitliche Kopf- und Fußzeilen

Im nächsten Beispiel sorgen Sie für eine einheitliche Gestaltung der Kopf- undFußzeilen. Dabei arbeiten Sie alle Tabellen einer Arbeitsmappe ab, rufen die Sei-tenansicht auf und stellen die gewünschten Kopf- und Fußzeilen ein. Dabei wer-den folgende Informationen gewünscht:

� Kopfzeile links: der Firmenname

� Kopfzeile Mitte: der Name des Tabellenblattes

� Kopfzeile rechts: das aktuelle Datum

� Fußzeile links: der komplette Speicherpfad inkl. Dateinamen

� Fußzeile Mitte: bleibt leer

� Fußzeile rechts: Seitennumerierung

Erfassen Sie nun das Makro aus Listing 2.13:

Listing 2.13: Einheitliche Kopf- und Fußzeilen erzeugen

Sub Schleife05()Dim Tabelle As Worksheet

Application.ScreenUpdating = False For Each Tabelle In ActiveWorkbook.Worksheets With Tabelle.PageSetup .LeftHeader = "Firmennamen" .CenterHeader = "Tabellenname &A" .RightHeader = "&D" .LeftFooter = "Pfad : " & ActiveWorkbook.FullName .CenterFooter = "" .RightFooter = "Seite &P von &N" End With Next Tabelle Set Tabelle = Nothing Application.ScreenUpdating = TrueEnd Sub

122

Page 123: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

Definieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. SchaltenSie danach die Bildschirmaktualisierung aus, indem Sie die Anweisung Applica-tion.ScreenUpdating = False einsetzen. Setzen Sie danach eine Schleife auf, diealle Tabellen der aktiven Arbeitsmappe durchläuft und über das Objekt PageSetupeinheitliche Kopf- und Fußzeilen einstellt. Heben Sie am Ende des Makros denObjektverweis wieder auf, um Speicher freizugeben, und schalten Sie die Bild-schirmaktualisierung wieder ein.

Abbildung 2.10: Die Kopf- und Fuß-zeilen sind auf allen Tabellen einheitlich.

123

Page 124: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Excel-Arbeitsmappen zählen

Im letzten Beispiel zur For-Each...Next-Schleife sollen die Namen aller Excel-Arbeitsmappen eines Verzeichnisses und der darunter liegenden Verzeichnisseermittelt und ausgegeben werden. Der Code für diese Aufgabe lautet:

Listing 2.14: Alle Excel-Arbeitsmappen eines Verzeichnisses werden gezählt

Sub Schleife06()Dim obj As VariantConst verz = "C:\Eigene Dateien\"

On Error GoTo fehler ChDir verz

With Application.FileSearch .NewSearch .LookIn = verz .Filename = "*.xls" .SearchSubFolders = True

If .Execute() > 0 Then For Each obj In .FoundFiles Debug.Print obj Next obj End If

MsgBox .FoundFiles.Count End With Exit Sub

fehler:MsgBox "Es gibt kein Verzeichnis mit dem Namen " & verzEnd Sub

Zu Beginn des Makros können Sie das zu durchsuchende Verzeichnis in einerKonstanten angeben. Wechseln Sie über die Anweisung ChDir direkt in dieses Ver-zeichnis. Danach starten Sie die Suche und verwenden dabei das Objekt File-Search, um die einzelnen Dateien im Verzeichnis zu ermitteln. Auf dieses Objektkönnen Sie einige Eigenschaften anwenden: Die Eigenschaft NewSearch setzt dieEinstellungen aller Suchkriterien auf die Standardeinstellungen zurück. Mithilfeder Eigenschaft LookIn geben Sie bekannt, in welchem Verzeichnis die Suche

124

Page 125: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

beginnen soll. Die Eigenschaft SearchSubFolders bestimmt, ob die Suche auch inUnterverzeichnissen fortgesetzt werden soll. In diesem Fall müssen Sie dieseEigenschaft auf den Wert True setzen. Die Eigenschaft FileType gibt den Typ derDatei in einer Konstanten an, nach der gesucht werden soll. Möchten Sie bei-spielsweise nicht nur Excel-Arbeitsmappen suchen lassen, sondern alle Dateity-pen, dann geben Sie die Konstante msoFileTypeAllFiles an. Über die AnweisungFoundFiles.Count geben Sie dann den Namen der gefundenen Datei an undschreiben diesen in den Direktbereich Ihrer Entwicklungsumgebung.

Den Direktbereich können Sie einblenden, indem Sie in Ihre Entwick-lungsumgebung wechseln und aus dem Menü ANSICHT den BefehlDIREKTFENSTER wählen.

Die Schleife Do Until...Loop

Die Do-Until...Loop-Schleife wiederholt einen Block mit Anweisungen, solangeeine Bedingung den Wert True erhält. Die Bedingung wird jeweils am Ende derSchleife geprüft. Als Abbruchbedingung können Sie alles Mögliche abfragen; sokönnen Sie z.B. eine Abbruchbedingung festlegen, wenn ein bestimmter Werterreicht ist oder eine Zelle einen bestimmten Text aufweist. Beispielsweise könn-ten Sie eine solche Schleife so oft wiederholen, solange die Zellenformatierungder Zellen sich nicht ändert.

Abbildung 2.11: Die Namen der Excel-Arbeitsmap-pen werden im Direktbereich aus-gegeben.

125

Page 126: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Die Syntax dieser Schleife sieht wie folgt aus:

Do [{Until} Bedingung] [Anweisungen] [Exit Do] [Anweisungen]Loop

Die Bedingung stellt einen numerischen Ausdruck oder Zeichenfolgenausdruckdar, der entweder erfüllt (True) oder nicht erfüllt (False) wird. Liefert die Bedin-gung den Wert 0, so wird die Bedingung als False interpretiert. Hinter den Anwei-sungen verbergen sich eine oder mehrere Anweisungen, die wiederholt werden,solange oder bis Bedingung durch True erfüllt ist.

Innerhalb einer Do-Until…Loop-Anweisung kann eine beliebige Anzahl von Exit-Do-Anweisungen an beliebiger Stelle als Alternative zum Verlassen einer Do-Until…Loop-Anweisung verwendet werden. Exit Do wird oft in Zusammenhang mitder Auswertung einer Bedingung (zum Beispiel If...Then) eingesetzt und hat zurFolge, dass die Ausführung mit der ersten Anweisung im Anschluss an Loop fortge-setzt wird.

Üben Sie den Einsatz dieser Schleife mittels einiger ausgesuchter Beispiele.

Jede x-te Zeile löschen

Im ersten Beispiel für die Do-Until...Loop-Schleife werden Sie in einer Tabellejede dritte Zeile löschen. Dabei gehen Sie von folgender Ausgangstabelle aus(siehe Abbildung 2.12).

Erfassen Sie nun das Makro, welches jede dritte Zeile löscht:

Listing 2.15: Jede dritte Zeile löschen

Sub Schleife07()Const zz = 2Dim i As Integer

Sheets("Tabelle6").ActivateRange("A1").Selecti = 1

Do Until ActiveCell.Value = "" For i = 1 To zz

126

Page 127: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

ActiveCell.Offset(1, 0).Select Next i Selection.EntireRow.Delete i = 1LoopEnd Sub

Durchlaufen Sie in einer Do-Until...Loop-Schleife alle gefüllten Zellen der SpalteA. Als Endkriterium für die Schleife gilt die erste leere Zelle, auf die Excel stößt.Innerhalb dieser Schleife können Sie mit einer weiteren Schleife arbeiten, welchedie Zeilen überspringt, die nicht gelöscht werden sollen. Über die Methode Deletelöschen Sie jeweils jede dritte Zeile (siehe Abbildung 2.13).

Bestimmte Zeichen austauschen

Im nächsten Beispiel werden in einer Tabelle bestimmte Zeichen ausgetauscht. Sosollen alle Bindestriche durch Slashes ersetzt werden. Sehen Sie sich vorher dieAusgangssituation für diese Aufgabenstellung an (siehe Abbildung 2.14).

Abbildung 2.12: Die Ausgangs-tabelle

127

Page 128: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Abbildung 2.13: Jede dritte Zeile wurde gelöscht.

Abbildung 2.14: Die Bindestriche sollen durch das Zeichen Slash ersetzt werden.

128

Page 129: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

Erfassen Sie nun das folgende Makro, um diese Aufgabe zu lösen:

Listing 2.16: Alle Bindestriche wurden ersetzt

Sub Schleife08()Sheets("Tabelle7").ActivateRange("A1").Select

Do Until ActiveCell.Value = "" If InStr(ActiveCell.Value, "-") Then ActiveCell.Value = _ Application.Substitute(ActiveCell.Value, "-", "/") End IfActiveCell.Offset(1, 0).SelectLoopEnd Sub

Setzen Sie eine Do-Until...Loop-Schleife ein, um alle Zellen der Spalte A abzuar-beiten. Innerhalb der Schleife prüfen Sie mithilfe der Funktion InStr, ob ein Bin-destrich in der jeweiligen Zelle überhaupt vorkommt. Wenn ja, wenden Sie dieFunktion Substitute an, um dieses Zeichen durch ein anderes auszutauschen.Vergessen Sie nicht, den Mauszeiger bei jedem Schleifendurchlauf über dieEigenschaft Offset eine Zeile weiter nach unten zu setzen.

Abbildung 2.15: Alle Bindestriche wurden entfernt.

129

Page 130: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Die Schleife Do While...Loop

Die Do-While...Loop-Schleife wiederholt einen Block mit Anweisungen, solangeeine Bedingung den Wert True erhält. Die Prüfung der angegebenen Bedingungerfolgt immer zu Beginn der Schleife. Als Abbruchbedingung können Sie allesMögliche abfragen; so können Sie z.B. eine Abbruchbedingung festlegen, wennein bestimmter Wert erreicht ist oder eine Zelle einen bestimmten Text aufweist.

Die Syntax dieser Schleife sieht wie folgt aus:

Do [{While} Bedingung] [Anweisungen] [Exit Do] [Anweisungen]Loop

Die Bedingung stellt einen numerischen Ausdruck oder Zeichenfolgenausdruckdar, der entweder erfüllt (True) oder nicht erfüllt (False) wird. Liefert die Bedin-gung den Wert 0, so wird die Bedingung als False interpretiert. Hinter den Anwei-sungen verbergen sich eine oder mehrere Anweisungen, die wiederholt werden,solange oder bis die Bedingung True erfüllt ist.

Innerhalb einer Do-While...Loop-Anweisung kann eine beliebige Anzahl von Exit-Do-Anweisungen an beliebiger Stelle als Alternative zum Verlassen einerDo...Loop-Anweisung verwendet werden. Exit Do wird oft in Zusammenhang mitder Auswertung einer Bedingung (zum Beispiel If...Then) eingesetzt und hat zurFolge, dass die Ausführung mit der ersten Anweisung im Anschluss an Loop fortge-setzt wird.

Üben Sie diese Art von Schleife anhand der nächsten Beispiele:

Zellenlänge überprüfen

Im ersten Beispiel zur Schleife Do While...Loop überprüfen Sie in einer Tabelle,ob in Spalte A gültige Eingaben vorgenommen wurden. So darf jeder Eintrag nuracht Zeichen lang sein. Sehen Sie zur besseren Verständlichkeit die folgendeAbbildung an (siehe Abbildung 2.16).

Schreiben Sie jetzt das folgende Makro, welches die Längen der Zellen in Spalte Aüberprüft. Wird eine falsche Länge gefunden, wird ein Eintrag in Spalte B vorge-nommen.

130

Page 131: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Schleifen programmieren

Listing 2.17: Länge von Eingaben messen und reagieren

Sub Schleife09()Sheets("Tabelle8").ActivateRange("A1").Select Do While ActiveCell.Value <> "" If Len(ActiveCell.Value) <> 8 Then _ ActiveCell.Offset(0, 1).Value = "Falsche Länge!" ActiveCell.Offset(1, 0).Select LoopEnd Sub

Durchlaufen Sie über die Schleife Do While...Loop alle Zellen der Spalte A,solange Excel auf keine leere Zelle stößt. Innerhalb der Schleife prüfen Sie überdie Funktion Len, ob die richtige Länge der Zelle, nämlich 8, vorliegt. Wennnicht, dann schreiben Sie in die Nebenzelle in Spalte B einen Vermerk.

Bestimmte Zahlen summieren

Im folgenden Beispiel sollen in einer Tabelle mit Zahlen nur diejenigen summiertwerden, die mit der Schriftfarbe ROT und dem Schriftschnitt FETT formatiert sind.Das Makro für diese Aufgabe lautet:

Abbildung 2.16: Welche Eingaben sind korrekt?

131

Page 132: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Listing 2.18: Alle roten und fetten Zahlen sollen summiert werden

Sub Schleife10()Dim Betrag As Single

Sheets("Tabelle9").ActivateRange("A1").Select

Do While ActiveCell.Value <> "" If ActiveCell.Font.ColorIndex = 3 And _ ActiveCell.Font.Bold = True And _ IsNumeric(ActiveCell) Then _ Betrag = Betrag + ActiveCell.Value ActiveCell.Offset(1, 0).Select LoopMsgBox "Die Summe der roten Zahlen lautet: " & BetragEnd Sub

In einer Do-While...Loop-Schleife durchlaufen Sie alle gefüllten Zellen der SpalteA. Überprüfen Sie dabei für jede Zelle deren Formatierung. Nur numerische Zel-len, die mit der Schriftfarbe ROT und dem Schriftschnitt FETT formatiert sind, sol-len summiert werden.

Abbildung 2.17: Falsche Einga-ben wurden gekennzeichnet.

132

Page 133: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

2.4 Auf Fehlersuche mit VBA

Gerade haben Sie typische Sprachelemente wie Verzweigungen und Schleifenkennen gelernt.

Vielleicht werden Sie sich fragen, warum dieses Thema bereits so früh in diesemBuch behandelt wird. Nun, gerade am Anfang, beim Lernen einer Programmier-sprache, macht man die meisten Fehler. Deswegen ist es besser, gleich zu Beginnzu wissen, wie man Fehler findet und beseitigt und welche Hilfsmittel zu diesemZweck zur Verfügung stehen.

Allgemeine Informationen zu Makros

Enthält eine Arbeitsmappe Makros, werden Sie bereits beim Öffnen über eineBildschirmmeldung darauf hingewiesen (siehe Abbildung 2.19).

Sollten Sie eine Arbeitsmappe unbekannter Herkunft erhalten, empfiehlt es sichzunächst, diese Mappe ohne Makros zu öffnen. Eine fremde Arbeitsmappe könnteunter Umständen gefährliche Makroviren enthalten. Klicken Sie zu diesem Zweckdie Schaltfläche MAKROS DEAKTIVIEREN.

Abbildung 2.18: Alle roten, fetten Zahlen wurden summiert.

133

Page 134: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

In der so geöffneten Arbeitsmappe können die Makros dann nicht ausgeführt wer-den. Bevor Sie eine unbekannte Arbeitsmappe öffnen, sollten Sie auf jeden Fallein Virensuchprogramm darüber laufen lassen.

Danach können Sie die Arbeitsmappe öffnen und die Makros aktivieren, indemSie die Schaltfläche MAKROS AKTIVIEREN anklicken.

In Excel gibt es Auto-Makros, die beispielsweise direkt beim Öffneneiner Arbeitsmappe gestartet werden. Auch diese Makros bergen einegewisse Gefahr. Um das automatische Ausführen von Auto-Makros zuunterbinden, halten Sie während des Öffnens der Arbeitsmappe dieTaste (ª) gedrückt.

Sicher ist es lästig, bei jedem Öffnen einer Arbeitsmappe eine Meldung wegzukli-cken, sofern die Arbeitsmappe Makros enthält. Wenn Sie ein sicheres Virensuch-programm im Einsatz haben und Ihren »Lieferanten« vertrauen, können Siediesen Automatismus auch abschalten, indem Sie wie folgt vorgehen:

1. Wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/SICHERHEIT.

2. Aktivieren Sie die Sicherheitsstufe NIEDRIG.

3. Bestätigen Sie mit OK.

In Excel haben Sie die Möglichkeit, Ihren Quellcode mit einer digitalenSignatur auszustatten. Damit können Ihre Makros eindeutig identifiziertwerden. Darüber hinaus bestätigt die Signatur, dass am Quellcode keineÄnderungen vorgenommen wurden. Beim Festlegen der Sicherheits-stufe für Makros können Sie einstellen, dass Makros, die von einem Ent-wickler aus der Liste der vertrauenswürdigen Quellen digital signiertwurden, ausgeführt werden. Mehr Infos zu diesem Thema finden Sie inder Online-Hilfe auf der Registerkarte INHALT unter der Rubrik SICHER-HEIT/DIGITALE UNTERSCHRIFTEN UND ZERTIFIKATE.

Abbildung 2.19: Makrowarnmeldung beim Öffnen einer Datei

134

Page 135: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

Enthält eine Arbeitsmappe Makros, müssen diese nicht immer in Modu-len abgelegt sein. Theoretisch können Makros hinter jeder einzelnenTabelle, hinter dem Eintrag DIESE ARBEITSMAPPE und hinter User-Forms verborgen sein. Klicken Sie diese einzelnen Elemente in der Ent-wicklungsumgebung einfach nacheinander doppelt an, bis Sie das»versteckte« Makro finden.

Fehler finden und beseitigen

Im Verlauf der Programmierung wird es nicht ausbleiben, dass Programmierfehlerauftreten. Wichtig ist aber immer zu wissen, wie weit und vor allem ob das Pro-gramm bis zum Fehler korrekt abgelaufen ist. Daher steht Ihnen in der Entwick-lungsumgebung eine Testumgebung zur Verfügung, über die Sie Fehler schnellfinden und beseitigen können.

Das Code-Fenster

Im Code-Fenster erfassen und bearbeiten Sie Ihre VBA-Makros. Sollte dieses Fens-ter noch nicht eingeblendet sein, dann wählen Sie aus dem Menü ANSICHT denBefehl CODE.

Abbildung 2.20: Die Sicherheitsstufe anpassen

135

Page 136: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Das Code-Fenster enthält folgende Objekte:

� Dropdown-Feld OBJEKT: Hier werden die Namen der markierten Objekteangezeigt. Klicken Sie auf den Pfeil rechts neben dem Listenfeld, um eineListe aller mit dem Formular verknüpften Objekte anzuzeigen.

� Dropdown-Feld PROZEDUR: Listet alle Ereignisse auf, die von Visual Basic fürdas Formular oder das Steuerelement, das im Feld OBJEKT angezeigt wird,erkannt werden. Bei der Auswahl eines Ereignisses wird die mit diesem Ereig-nisnamen verknüpfte Ereignisprozedur im Code-Fenster angezeigt. Alle Proze-duren werden in alphabetischer Reihenfolge im Dropdown-Feld angezeigt.Dies erleichtert die Suche nach bestimmten Modulen.

Wenn Sie auf den rechten, oberen Rand der vertikalen Bildlaufleiste des Code-fensters sehen, erkennen Sie den Fensterteiler. Der Fensterteiler befindet sichdirekt oberhalb des Pfeil-nach-oben-Symbols.

Damit können Sie das Code-Fenster in zwei horizontale Bereiche unterteilen, indenen separate Bildläufe durchgeführt werden können. So können Sie unter-schiedliche Teile wie zum Beispiel den Anfang und das Ende eines Makros gleich-zeitig anzeigen.

Abbildung 2.21: Schnell Makros auffinden über das Dropdown-Feld Prozedur

136

Page 137: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

Die Informationen, die in den Feldern OBJEKT und PROZEDUR angezeigt werden,beziehen sich auf den Code in dem Fenster, das gerade aktiv ist. Mit einem Dop-pelklick auf den Fensterteiler wird ein Fenster geschlossen.

Das Direktfenster

Das Direktfenster können Sie hervorragend dazu einsetzen, ein Makro zu testen.Dabei haben Sie die Möglichkeit, Inhalte von Variablen und Positionen im Codezu dokumentieren.

Sie können beispielsweise bestimmte Inhalte von Variablen im Direktfenster aus-geben. Erfassen Sie zunächst einmal einen kleinen Beispielcode:

Listing 2.19: Den Direktbereich von Excel füllen

Sub Testlauf()Dim i As Integer

For i = 1 To 10 Debug.Print "Schleifendurchlauf: " & iNext i

End Sub

Im Makro aus Listing 2.19 wird eine Schleife genau zehnmal durchlaufen. Beijedem Schleifendurchlauf wird mithilfe des Befehls Debug.Print ein Eintrag insDirektfenster geschrieben, der den aktuellen Schleifendurchlauf festhält.

Setzen Sie die Einfügemarke in die erste Zeile des Makros und drücken Sie dieTaste (F5), um das Makro zu starten. Kontrollieren Sie jetzt einmal das Ergebnisim Direktfenster. Dazu wählen Sie aus dem Menübefehl ANSICHT den BefehlDIREKTFENSTER oder drücken die Tastenkombination (Strg) + (G).

Code im Einzelschritt durchlaufen lassen

Eine weitere Möglichkeit der Fehlersuche in Excel ist es, das Makro Zeile fürZeile abzuarbeiten. Dazu setzen Sie die Einfügemarke in die erste Zeile desMakros und drücken die Taste (F8). Alternativ dazu können Sie ebenso denMenübefehl DEBUGGEN/EINZELSCHRITT wählen. Das Makro hält nach jedemBefehl an.

137

Page 138: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Sie können dann prüfen, ob die gewünschte Aktion ausgeführt wurde, indem Siedie Entwicklungsumgebung kurzfristig verlassen und in Ihrer Excel-Arbeitsmappedie Ergebnisse kontrollieren.

Eine weitere Variante ist es, im obigen Makro die Einfügemarke in jene Zeile zusetzen, bis zu der das Makro durchlaufen werden soll. Setzen Sie beispielsweise dieEinfügemarke in die Zeile, bis zu der Sie den Code durchlaufen möchten, unddrücken Sie die Tastenkombination (Strg) + (F8). Der Code wird jetzt bis zu dermomentan markierten Zeile durchlaufen und stoppt genau an dieser Position.Nun können Sie prüfen, ob das Makro auch korrekt funktioniert hat. Wenn allessoweit stimmt, können Sie durch die Taste (F5) dafür sorgen, dass das Makro biszum Ende durchläuft.

Sollte etwas mit dem Makro nicht stimmen, brechen Sie es ab, indemSie den Menübefehl AUSFÜHREN/ZURÜCKSETZEN aufrufen.

Überwachung hinzufügen

Eine besonders wertvolle Funktion können Sie einsetzen, wenn Sie das Überwa-chungsfenster einblenden. Wählen Sie dazu aus dem Menü ANSICHT den BefehlÜBERWACHUNGSFENSTER. Sie haben jetzt beispielsweise die Möglichkeit, zu

Abbildung 2.22: Die einzelnen Zustände des Makros werden festgehalten.

138

Page 139: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

überprüfen, wann sich eine bestimmte Variable ändert. Genau dann soll derMakroablauf unterbrochen werden.

Im folgenden Beispiel wird eine Schleife genau zehnmal durchlaufen. Bei jedemSchleifendurchlauf wird die Variable i verändert. Der Logik zufolge muss das fol-gende Makro dann nach dem ersten Schleifendurchlauf gestoppt werden. SehenSie sich zu diesem Zweck einmal folgendes Listing an:

Listing 2.20: Mehrere Schleifendurchläufe

Sub Testmakro()Dim i As Integer

For i = 1 To 10 Debug.Print "Schleifendurchlauf: " & iNext iEnd Sub

Um nun die Überwachung der Variablen i einzustellen, befolgen Sie die nächstenSchritte:

1. Wählen Sie aus dem Menü DEBUGGEN den Befehl ÜBERWACHUNG HINZUFÜ-GEN.

2. Geben Sie im Feld AUSDRUCK die Variable an, die Sie überwachen möchten.

3. Aktivieren Sie die Option UNTERBRECHEN, WENN WERT GEÄNDERT WURDE.

4. Bestätigen Sie Ihre Einstellungen mit OK.

Abbildung 2.23: Überwachung hinzufügen

139

Page 140: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Der momentane Inhalt der Variablen wird im Überwachungsfenster angezeigt.

Das Lokal-Fenster

Das Lokal-Fenster wird in der Entwicklungsumgebung standardmäßig nicht ange-zeigt. Über das Menü ANSICHT können Sie dieses Fenster jedoch einblenden. DasLokal-Fenster zeigt alle deklarierten Variablen in der aktuellen Prozedur undderen Werte an. Sie haben daher die Möglichkeit, die Werte von Variablen über-sichtlich zu prüfen.

Um diese Funktion zu testen, erfassen Sie folgendes Makro, welches alle benutz-ten Zellen der TABELLE1 nach TABELLE2 überträgt:

Listing 2.21: Daten von einer Tabelle auf eine andere übertragen

Sub DatenTransferieren()Dim TB1 As WorksheetDim TB2 As WorksheetDim i As Long

Set TB1 = Worksheets("Tabelle1")Set TB2 = Worksheets("Tabelle2")

Abbildung 2.24: Das Makro stoppt bei der ersten Änderung der Variablen i.

140

Page 141: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

For i = 1 To TB1.UsedRange.Rows.Count TB2.Cells(i, 1) = TB1.Cells(i, 1)Next i

End Sub

Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Worksheet.Danach geben Sie über die Anweisung Set bekannt, wie diese heißen. In eineranschließenden Schleife übertragen Sie dann alle Zellen der Spalte A inTABELLE1 in die Zieltabelle TABELLE2. Dabei setzen Sie die Eigenschaft Cellsein, die zwei Argumente benötigt. Im ersten Argument geben Sie die jeweils aktiveZeile wieder, im zweiten Argument die Spalte. Da die Spalte konstant bleibt(Spalte A) können Sie dieses Argument mit dem Wert 1 füllen und konstant belas-sen. Das Zeilenargument wird bei jedem Schleifendurchlauf erhöht.

Gehen Sie jetzt wie folgt vor, um das Lokal-Fenster einsetzen zu können:

1. Setzen Sie den Mauszeiger auf die Zeile innerhalb der Schleife.

2. Drücken Sie die Taste (F9), um dort einen Haltepunkt zu setzen.

3. Starten Sie das Makro, indem Sie die Taste (F5) drücken.

4. Das Makro läuft bis zum Haltepunkt. Im Lokal-Fenster wird der Inhalt derVariablen nun angezeigt. Führen Sie noch einmal einen Schleifendurchlaufdurch, indem Sie die Taste (F5) erneut drücken.

Abbildung 2.25: Der Variablen-inhalt wird im Lokal-Fenster angezeigt.

141

Page 142: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Folgende Spalten werden im Lokal-Fenster angezeigt.

� AUSDRUCK: Listet die Namen der Variablen auf. Die erste Variable in der Listeist eine spezielle Modulvariable und kann erweitert werden, um alle Variablenauf Modulebene des aktuellen Moduls anzuzeigen. Globale Variablen undVariablen in anderen Projekten sind über das Lokal-Fenster nicht verfügbar.

� WERT: Wenn Sie in der Spalte WERT direkt auf einen Eintrag klicken, nimmtder Cursor die Form eines I-Cursors an. Sie können diesen Wert bearbeitenund danach mit der Taste (Enter) bestätigen. Sollte der Wert nicht zulässigsein, bleibt das Bearbeitungsfeld aktiv und der Wert wird markiert. Außerdemwird ein Meldungsfeld mit einer Beschreibung des Fehlers angezeigt. DurchDrücken von (Esc) werden Änderungen rückgängig gemacht. Auf unser Bei-spiel angewendet, könnten Sie den Wert der Variablen i auf 7 ändern. Excelwürde dann nach dem siebten Schleifendurchlauf weitermachen.

� TYP: In dieser Spalte wird der Datentyp der Variablen angezeigt. Diesen Typkönnen Sie aber nicht ändern.

� AUFRUFLISTE: Ganz rechts oben im Lokal-Fenster finden Sie eine Schaltflä-che mit einigen Punkten darauf. Nach einem Klick darauf wird eine Liste derderzeit aktiven Prozeduraufrufe im Haltemodus angezeigt. Beim Ausführenvon Code in einer Prozedur wird diese einer Liste der aktiven Prozeduraufrufehinzugefügt. Bei jedem Aufruf einer anderen Prozedur durch eine Prozedurwird diese der Liste hinzugefügt. Aufgerufene Prozeduren werden aus der Listegelöscht, wenn die Ausführung an die aufrufende Prozedur übergeben wird.

Sie können den Haltepunkt auch während der Laufzeit wieder heraus-nehmen. Drücken Sie nach dem erneuten Stoppen des Makros dieTaste (F9).

Die Symbolleiste Debuggen

Die Symbolleiste DEBUGGEN stellt Ihnen Symbole zur Verfügung, die dasschnelle Testen von Quellcode vereinfachen. Blenden Sie diese Symbolleiste ein,indem Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken undaus dem Kontextmenü die Symbolleiste DEBUGGEN auswählen.

Abbildung 2.26: Die Symbolleiste Debuggen

142

Page 143: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

Folgende Symbole werden in dieser Symbolleiste von rechts nach links angeboten:

� ENTWURFSMODUS: Aktiviert und deaktiviert den Entwurfsmodus.

� SUB/USERFORM AUSFÜHREN: Führt die aktuelle Prozedur aus, falls sich derCursor in einer Prozedur befindet; führt das UserForm-Formular aus, falls einUserForm-Formular aktiv ist; führt ein Makro aus, falls weder ein Code-Fens-ter noch ein UserForm-Formular aktiv sind.

� UNTERBRECHEN: Beendet die Ausführung eines Programms und wechselt inden Haltemodus. Stattdessen können Sie auch die Taste (Esc) drücken, umden Ablauf des Makros zu stoppen.

� ZURÜCKSETZEN: Löscht die Aufrufliste und die Variablen auf Modulebeneund beendet das Projekt.

� HALTEPUNKT EIN/AUS: Setzt oder entfernt einen Haltepunkt in der aktuellenZeile. Alternativ dazu genügt auch das Drücken der Taste (F9), um einen Hal-tepunkt zu setzen bzw. zu entfernen.

� EINZELSCHRITT: Führt jeweils genau eine Anweisung im Code aus. Alternativkönnen Sie hier mit der Taste (F8) arbeiten, um einen Code Zeile für Zeile zudurchlaufen.

� PROZEDURSCHRITT: Führt im Code-Fenster jeweils eine Prozedur oder eineAnweisung im Code aus.

� PROZEDUR ABSCHLIESSEN: Führt die restlichen Zeilen einer Prozedur aus, inder sich der aktuelle Ausführungspunkt befindet.

� LOKAL-FENSTER: Blendet das Lokal-Fenster ein.

� DIREKTFENSTER: Blendet das Direktfenster ein. Alternativ dazu können Sieauch die Tastenkombination (Strg) + (G) drücken, um das Direktfenster ein-zublenden.

� ÜBERWACHUNGSFENSTER: Blendet das Überwachungsfenster ein.

� AKTUELLEN WERT ANZEIGEN: Zeigt das Dialogfeld AKTUELLEN WERT ANZEI-GEN mit dem aktuellen Wert des ausgewählten Ausdrucks an.

� AUFRUFLISTE: Zeigt das Dialogfeld AUFRUFLISTE an, in dem die derzeit akti-ven Prozeduraufrufe (Prozeduren in der Anwendung, die gestartet, aber nichtabgeschlossen wurden) angezeigt werden.

143

Page 144: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Typische Fehlerquellen in Excel-VBA

Am Ende des Tages lernen Sie noch ein paar typische Fehler kennen, die sich abund zu einschleichen.

Buchstabendreher

Gerade wenn Sie viel und schnell Quellcode erfassen, dann kommen hin und wie-der Buchstabendreher vor und der Editor kann dadurch die Befehle nicht erkennen.

Eine kleine Kontrolle vorab: Wenn Sie sich angewöhnen, alle Befehle inKleinschreibweise einzugeben, können Sie nach jedem Drücken derTaste (Enter) am Ende einer Zeile prüfen, ob die Befehle vom Editorrichtig erkannt werden. Die richtigen Befehle werden dann teilweise inGroßbuchstaben umgesetzt. So wird aus der Eingabe

activesheet.select

der Befehl

ActiveSheet.Select

Sehen Sie sich nun einmal die Abbildung 2.27 an. Was stimmt hier nicht?

Wenn Sie sich die Zeile im Makro betrachten, werden Sie feststellen, dass hier dieMethode Activate falsch geschrieben wurde. Sie erkennen es daran, dass dieserBefehl nicht im ersten Buchstaben auf Groß konvertiert wurde.

Dieselbe Meldung wird angezeigt, wenn Sie beispielsweise auf eineTabelle zugreifen, die es gar nicht gibt.

144

Page 145: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

Nicht existente Objekte

Der Laufzeitfehler 1004 wird Sie auch des Öfteren begleiten. In einem solchenFall versuchen Sie, auf ein Objekt zuzugreifen, welches es gar nicht gibt. Parade-beispiel hierfür ist das Öffnen einer Arbeitsmappe, die auf Ihrer Festplatte nichtexistiert.

In diesem Fall sagt Ihnen Excel ganz genau, worin der Fehler liegt. Dies muss abernicht unbedingt immer zutreffen. Auf jeden Fall sollten Sie diese hässliche Fehler-meldung abfangen, indem Sie eine Fehlerbehandlung aufsetzen. So könnte das inAbbildung 2.28 abgebildete Makro wie folgt umgeschrieben werden:

Listing 2.22: Eine Fehlerbehandlungsroutine aufsetzen

Sub MappeÖffnen()On Error GoTo fehlerWorkbooks.Open Filename:= _("C:\Eigene Dateien\MappeX.xls")'Weitere Anweisungen

Exit Sub

Abbildung 2.27: Eine recht häufige Meldung

145

Page 146: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

fehler:MsgBox "Die Datei konnte nicht gefunden werden", _ vbCritical + vbOKOnly, "FEHLER"End Sub

Mit der Anweisung On Error GoTo fehler können Sie die standardmäßig ange-zeigte Fehlermeldung wie in Abbildung 2.28 abgebildet unterdrücken und statt-dessen eine eigene Fehlermeldung anzeigen. Wird nun von Excel ein Fehlerfestgestellt, dann wird direkt in den Paragrafen FEHLER verzweigt und die dortigenAktionen ausgeführt.

Vor den Fehlerparagrafen setzen Sie die Anweisung Exit Sub ein. Dies ist wichtigfür den Fall, dass kein Fehler festgestellt wird. In diesem Fall darf der Fehlerpara-graf nicht ausgeführt werden, d.h. Sie beenden mit dieser Anweisung das Makroauf direktem Wege.

Sie können die Fehlernummer sowie die Fehlerbeschreibung auch überdas Objekt Err und die Eigenschaften Number und Description abfragen.

MsgBox Err.number & " " & Err.Description

Abbildung 2.28: Diese Arbeitsmap-pe existiert nicht.

146

Page 147: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

Oft wird auch die Anweisung On Error Resume Next bei Befehlen ver-wendet, welche eventuell einen Fehler verursachen könnten. In diesemFall wird nicht weiter auf einen auftretenden Fehler reagiert und dieserignoriert. Dieser Befehl ist aber meiner Ansicht nach nur in Ausnahme-fällen einzusetzen, wie es im folgenden Beispiel demonstriert wird.

Stellen Sie sich vor, Sie erstellten eine eigene Symbolleiste per VBA, die Sie nunwieder löschen möchten. Das Erstellen sowie Löschen der Symbolleiste sehen Sieim folgenden Quellcode, der an dieser Stelle nicht weiter erklärt wird. ZumThema Symbolleisten lernen Sie am 12. Tag mehr.

Listing 2.23: Eine eigene Symbolleiste erstellen und wieder löschen

Sub SymbolleisteAnlegen() With Application.CommandBars.Add("TEST") .Visible = True .Position = msoBarTop .Protection = msoBarNoMove + msoBarNoChangeVisible With .Controls With .Add(msoControlButton) .Style = msoButtonIconAndCaption .Caption = "Erster Befehl" .OnAction = "Test01" End With With .Add(msoControlButton) .Style = msoButtonIconAndCaption .Caption = "Zweiter Befehl" .OnAction = "Test02" .BeginGroup = True End With End With End WithEnd Sub

Sub SymbolleisteLöschen() Application.CommandBars("TEST").DeleteEnd Sub

147

Page 148: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

Wenn Sie das Makro SymbolleisteLöschen zweimal hintereinander starten, dannbekommen Sie folgende Fehlermeldung angezeigt:

Nun, dieser Fehler tritt ein, wenn Sie versuchen, die Symbolleiste TEST zulöschen, obwohl sie bereits schon vorher gelöscht wurde. In diesem Fall könnteman das Makro SymbolleisteLöschen wie folgt ergänzen.

Listing 2.24: Symbolleiste löschen ohne Fehlermeldung

Sub SymbolleisteLöschen()On Error Resume Next Application.CommandBars("TEST").DeleteEnd Sub

Nicht verfügbare Eigenschaften und Methoden

Wenn Sie versuchen, für ein Objekt eine Eigenschaft bzw. eine Methode anzu-wenden, die für dieses Objekt nicht zur Verfügung steht, dann wird diese Absichtmit folgender Fehlermeldung quittiert (siehe Abbildung 2.30).

Was wurde hier falsch gemacht?

Es wurde versucht, eine Zelle mit der Farbe Rot zu formatieren. In diesem Fallfehlt aber noch eine Kleinigkeit. Sie möchten den Hintergrund der Zelle färben.Der Hintergrund einer Zelle wird über das Objekt Interior angesprochen. Diekorrekte Anweisung müsste also lauten:

ActiveCell.Interior.ColorIndex = 3

Abbildung 2.29: Eine ziemlich aussage-arme Fehlermeldung

148

Page 149: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Fehlersuche mit VBA

Die verfügbaren Eigenschaften und Methoden können Sie entwederdirekt nach der Eingabe des Objekts mit anschließendem Punkt überdas Kontextmenü ablesen oder im Objektkatalog nachblättern.

Abbildung 2.30: Eigenschaft steht nicht zur Verfü-gung.

Abbildung 2.31: Die verfügbaren Eigenschaften und Methoden werden im Kon-textmenü ange-zeigt.

149

Page 150: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Sprachelemente von VBA

2.5 Fragen & Antworten

F Wie können Sie überprüfen, welche Arbeitsmappen gerade geöffnet sind?

A Diese Fragestellung können Sie über eine For-Each...Next-Schleife beant-worten. Im folgenden Makro aus Listing 2.25 werden die Namen der geöff-neten Arbeitsmappen auf dem Bildschirm ausgegeben.

Listing 2.25: Alle geöffneten Arbeitsmappen ausgeben

Sub MappenNamenErmitteln()Dim Mappe As Workbook

For Each Mappe In Workbooks MsgBox Mappe.NameNext MappeEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Workbook.Danach greifen Sie in einer Schleife auf das Auflistungsobjekt Workbookszu. In diesem Auflistungsobjekt sind alle geöffneten Arbeitsmappen ver-zeichnet, die Sie über die Eigenschaft Name auslesen und über die Funk-tion MsgBox auf dem Bildschirm anzeigen können.

F Wie können Sie mithilfe einer Schleife alle installierten, aktivierten Add-Insermitteln?

A Erfassen Sie das Makro aus Listing 2.26:

Listing 2.26: Alle aktivierten Add-Ins ausgeben

Sub AddInsAusgeben()Dim ADDI As AddIn For Each ADDI In Application.AddIns If ADDI.Installed = True Then MsgBox ADDI.Name NextEnd Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ AddIn.Danach greifen Sie in einer Schleife auf die AddIns-Auflistung zu undermitteln die Namen der installierten Add-Ins über die Eigenschaft Name.

150

Page 151: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Quiz

F Wie können Sie eine Fehlerbeschreibung anzeigen lassen?

A Tritt ein Fehler auf, dann können Sie die Beschreibung des Fehlers überdie Anweisung Msgbox Err.Description auf dem Bildschirm ausgeben.

F Wie können Sie im Direktfenster den Inhalt einer Variablen ausgeben?

A Dazu müssen Sie einen Haltepunkt im Quellcode setzen und das Makrobis an diesen Haltepunkt durchrennen lassen. Wechseln Sie dann in dieEntwicklungsumgebung und geben Sie direkt im Direktfenster die Zei-chenfolge =?Variablenname ein.

2.6 Quiz

F Über welche Funktion kann man prüfen, ob eine Zelle ein Datum enthält?

F Wie kann man aus einer For-Each...Next-Schleife springen?

F Über welche Anweisung kann man eine Meldung im Direktfenster ausgeben?

F Unterscheidet der Code-Editor zwischen Groß- und Kleinschreibung?

2.7 Übung

Zum Abschluss dieses Tages üben Sie das heute Gelernte. Dabei soll folgende Auf-gabe gelöst werden:

Die Namen der Tabellen einer Arbeitsmappe sollen auf der ersten Tabelle dieserArbeitsmappe in Spalte A eingefügt werden. Lösen Sie diese Aufgabenstellung mit-hilfe einer For-Each...Next-Schleife.

Die Demodatei Sprachelemente.xls finden Sie auf der CD-ROM im Ver-zeichnis Kap02. Die Lösung für diese Aufgabe steht im Anhang A.

151

Page 152: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;
Page 153: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

3

Die Excel-Anwendung einstellen und anpassen

Page 154: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

Gestern haben Sie die Sprachelemente von VBA kennen gelernt und einigeMakros mithilfe der Testumgebung untersucht. Sie sind jetzt in der Lage, einMakro Schritt für Schritt durchzugehen und die Zwischenstände zu überprüfen.Sie können mit dem Direktfenster umgehen und haben einen Einblick in häufigeFehlerquellen erhalten.

Die Themen heute:

� Vollbildansicht einstellen

� Lang laufende Makros schneller machen

� Automatische Listen generieren

� Drag&Drop ein- und ausschalten

� Add-Ins überprüfen

� Wiedervorlageliste bearbeiten

� Sonstige Einstellmöglichkeiten in Excel

Standardmäßig ist Excel so eingestellt, dass Sie die Anwendung für die meistenZwecke optimal einsetzen können. Sie haben aber die Möglichkeit, die Anwen-dung Ihren Wünschen anzupassen. Dabei können Sie unter anderem das Erschei-nungsbild in Excel ändern, indem Sie bestimmen, welche Objekte angezeigtwerden und welche nicht. Kurzum, Sie können alle Einstellungen von Excel überden Einsatz von VBA anpassen, die Sie im Menü EXTRAS unter dem BefehlOPTIONEN finden.

Alle Makros, die Sie an diesem Tag lernen, können Sie auf der mitgelie-ferten CD-ROM im Verzeichnis Kap03 in der Arbeitsmappe Applika-tion.xls nachblättern.

3.1 Vollbildansicht einstellen

Wenn Sie Daten in Excel eingeben möchten, sollten möglichst viel »Tabellen«und wenige Symbolleisten sowie sonstiger Schnickschnack zu sehen sein. Sie kön-nen in Excel daher die Ansicht GANZER BILDSCHIRM aus dem Menü ANSICHTauswählen.

154

Page 155: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Vollbildansicht einstellen

Die Vollbildansicht können Sie aber auch über den Einsatz eines Makros wie folgteinstellen:

Listing 3.1: Vollbildansicht einstellen

Sub AnsichtGanzerBildschirm() Application.DisplayFullScreen = TrueEnd Sub

Setzen Sie die Eigenschaft DisplayFullScreen auf den Wert True, um die Vollbild-ansicht in Excel anzuzeigen. Um die Ansicht wieder zu beenden, setzen Sie dieEigenschaft DisplayFullScreen wieder auf den Wert False.

Listing 3.2: Vollbildansicht beenden

Sub NormalAnsichtEinstellen() Application.DisplayFullScreen = FalseEnd Sub

Wie aber können Sie dieses Feature in der Praxis einsetzen? Nun, stellen Sie sicheinmal vor, Sie haben in einer Arbeitsmappe ein Tabellenblatt, in das Sie immerwieder neue Daten eingeben müssen. Optimal wäre es nun, dass die Vollbildan-sicht immer dann eingestellt wird, wenn Sie diese Tabelle aktivieren. Beim Verlas-sen dieser Tabelle soll dann wieder die Normalansicht eingestellt werden.

Um diesen Automatismus einzustellen, befolgen Sie die nachstehenden Arbeits-schritte:

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Im Projekt-Explorer klicken Sie die Tabelle doppelt an, in die Sie diese Funk-tion einfügen möchten.

3. Wählen Sie im Code-Fenster aus dem ersten Dropdown-Feld den BefehlWorkSheet.

4. Aus dem zweiten Dropdown-Feld wählen Sie das Ereignis Activate. Danachwählen Sie zusätzlich das Ereignis Deactivate.

5. Ergänzen Sie nun die beiden Ereignisse wie folgt:

Listing 3.3: Makros automatisch ausführen lassen bei Blatt(de)aktivierung

Private Sub Worksheet_Activate() AnsichtGanzerBildschirmEnd Sub

155

Page 156: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

Private Sub Worksheet_Deactivate() NormalAnsichtEinstellenEnd Sub

Das Ereignis Worksheet_Activate tritt automatisch ein, wenn Sie die Tabelle akti-vieren. Innerhalb des Ereignisses rufen Sie das Makro AnsichtGanzerBildschirmauf, das Sie vorher im MODUL1 erfasst haben.

Das Ereignis Worksheet_DeActivate tritt dann automatisch ein, wenn Sie dieTabelle verlassen. Innerhalb des Ereignisses rufen Sie das Makro Normalansicht-Einstellen auf, das Sie vorher im MODUL1 erfasst haben.

Erfahren Sie mehr über die Ereignisprogrammierung am 7. Tag.

3.2 Weitere Einstellungen der Ansicht

Wie schon vorher erwähnt, können Sie selbst bestimmen, wie Excel bestimmteObjekte, z.B. Kommentare, Gitternetzlinien, Grafiken usw., anzeigt.

Abbildung 3.1: Die Registerkarte Ansicht

156

Page 157: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Weitere Einstellungen der Ansicht

Wählen Sie nun das Dialogfeld OPTIONEN aus dem Menü EXTRAS und wechselnSie auf die Registerkarte ANSICHT.

Alle Einstellungen, die Sie auf dieser Registerkarte sehen, können Sie über denEinsatz von VBA einstellen.

Im Listing werden folgende Einstellungen getroffen:

� Die Gitternetzlinien werden deaktiviert.

� Die Zeilen- und Spaltenüberschriften werden ausgeblendet.

� Die Nullwerte werden nicht angezeigt.

� Beide Bildlaufleisten werden ausgeblendet.

� Die Blattregisterkarten werden versteckt.

� Die Statusleiste wird ausgeblendet.

Sehen Sie sich vorab einmal die Ausgangssituation in Abbildung 3.2 an:

Alle diese Einstellungen werden im folgenden Listing 3.4 vorgenommen:

Listing 3.4: Die Ansicht von Excel bestimmen

Sub AnsichtBestimmen() With ActiveWindow .DisplayGridlines = False .DisplayHeadings = False .DisplayZeros = False .DisplayHorizontalScrollBar = False .DisplayVerticalScrollBar = False .DisplayWorkbookTabs = False

Abbildung 3.2: Die normale Ansicht auf eine Tabelle

157

Page 158: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

End With

Application.DisplayStatusBar = FalseEnd Sub

Mithilfe der Eigenschaft DisplayGridLines können Sie die Anzeige der Gitternetz-linien in einer Tabelle ein- und ausschalten. Setzen Sie diese Eigenschaft auf denWert True, um die Gitternetzlinien für die aktive Tabelle anzuzeigen.

Über die Eigenschaft DisplayHeadings können Sie bestimmen, ob die Zeilen- undSpaltenüberschriften in der Tabelle angezeigt werden sollen. Setzen Sie dieseEigenschaft auf den Wert False, um die Zeilen- und Spaltenüberschriften auszu-blenden.

Die Eigenschaft DisplayZeros sorgt dafür, dass Nullwerte in der aktiven Tabellenicht angezeigt werden, sofern Sie diese Eigenschaft auf den Wert False setzen.

Über die Eigenschaften DisplayHorizontalScrollBar bzw. DisplayVerticalScrollBar können Sie festlegen, ob die Bildlaufleisten angezeigt werden sollen.

Möchten Sie die Registerkarten in einer Arbeitsmappe verbergen, dann setzen Siedie Eigenschaft DisplayWorkbookTabs auf den Wert False. Sie können dann nurnoch über die Tastenkombination (Strg) + (Bild_½) bzw. mit (Strg) +(Bild_¼) auf eine andere Tabelle gelangen. Diese Einstellung wird oft vorge-nommen, wenn die Arbeitsmappe eine einzige Tabelle enthält.

Mithilfe der Eigenschaft DisplayStatusBar können Sie festlegen, ob die Status-leiste am unteren Bildrand angezeigt werden soll. Wenn nicht, setzen Sie dieseEigenschaft auf den Wert False.

Abbildung 3.3: Einige Standard-elemente wurden ausgeblendet.

158

Page 159: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lang laufende Makros schneller machen

Wie Sie sehen, sind einige Eigenschaften nur für die jeweils aktiveTabelle gültig, andere jedoch für die gesamte Arbeitsmappe.

3.3 Lang laufende Makros schneller machen

Bei aufwändigen Makros – wenn beispielsweise mehrere Arbeitsmappen geöffnetsind und einige Tabellen mit Daten gefüllt werden – verlängert sich die Laufzeit,sofern Sie nicht eigene Einstellungen vornehmen.

Bildschirmaktualisierung ein- und ausschalten

Standardmäßig ist in Excel die Bildschirmaktualisierung eingeschaltet, d.h. alleAktionen, wie beispielsweise ein Tabellenwechsel oder das Abarbeiten von Zeilen,werden während des Makroablaufs am Bildschirm angezeigt. Dies kostet Zeit unddurch die ständige Aktualisierung des Bildschirms leiden Ihre Augen und der Bild-schirm. Schalten Sie daher zu Beginn des Makros die Bildschirmaktualisierungaus und am Ende des Makros wieder ein. Der Makrorahmen dafür sieht wie folgtaus:

Listing 3.5: Bildschirmaktualisierung ein- und ausschalten

Sub Bildschirmaktualisierung()Application.ScreenUpdating = False

'Weitere Anweisungen

Application.ScreenUpdating = TrueEnd Sub

Setzen Sie die Eigenschaft ScreenUpdating auf den Wert False, um die Aktualisie-rung des Bildschirms abzuschalten. Während die Bildschirmaktualisierung ausge-schaltet ist, wird lediglich eine Sanduhr am Bildschirm angezeigt, alle Aktionendes Makros werden im Hintergrund ausgeführt.

Weisen Sie der Eigenschaft ScreenUpdating den Wert True zu, um die Bildschirm-aktualisierung wieder zuzulassen.

159

Page 160: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

In der Praxis können Sie die Bildschirmaktualisierung in einem Makromehrere Male ein- und ausschalten, um bestimmte Zwischenstände imMakro anzuzeigen. Damit beugen Sie auch einer Ungeduld des Anwen-ders vor, wenn dieser minutenlang nur die Sanduhr angezeigt bekommtund der Eindruck entsteht, das Makro bzw. die Anwendung sei abge-stürzt.

Die Berechnung ein- und ausschalten

Jede Eingabe in eine Excel-Tabelle bedeutet automatisch, dass die Tabelle neuberechnet wird. Diese Funktion ist auch dann sinnvoll, wenn sich mehrere Zellenüber Formeln aufeinander beziehen. Bei der Programmierung ist dieser Automa-tismus aber ein recht starker Bremser. Es empfiehlt sich daher, die automatischeBerechnung zu Beginn des Makros aus- und am Ende des Makros wieder einzu-schalten. Makros laufen somit erheblich schneller!

In Listing 3.6 sehen Sie den Makrorahmen für das Aus- und Einschalten der auto-matischen Berechnung in Excel:

Listing 3.6: Die automatische Berechnung aus- und einschalten

Sub BerechnungAusUndEin()Application.Calculation = xlManual 'Weitere Aktionen

Application.CalculateBeforeSave = TrueApplication.Calculation = xlAutomaticEnd Sub

Weisen Sie zu Beginn des Makros der Eigenschaft Calculation die KonstantexlManual zu, um die automatische Neuberechnung von Excel zu unterdrücken.

Setzen Sie die Eigenschaft CalculateBeforeSave auf den Wert True, damit dieArbeitsmappe, auch wenn die Eigenschaft Calculation auf xlManual gesetzt ist, vordem Speichern neu berechnet wird.

Am Ende des Makros weisen Sie der Eigenschaft Calculation die Konstante xlAu-tomatic zu, um die Berechnung wieder zu aktivieren.

160

Page 161: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lang laufende Makros schneller machen

Statuszeile einsetzen

Gerade bei länger laufenden Makros ist es wichtig, den Anwender während derLaufzeit des Makros nicht »im Regen stehen« zu lassen. Da während eines Makroskein paralleles Arbeiten mit Excel möglich ist, sollten Sie den Anwender durch dieStatusleiste über die einzelnen Schritte des Makros informieren.

Das Makro in Listing 3.7 zeigt, wie Sie die Statusleiste einsetzen können:

Listing 3.7: Die Statusleiste nutzen

Sub StatusBarAnsprechen()Dim l As Long

Application.DisplayStatusBar = True Application.StatusBar = "Makrosverarbeitung beginnt..."

For l = 1 To 30000000 'erste Aufgabe Next l Application.StatusBar = "Erste Aufgabe wurde beendet!" For l = 1 To 30000000 'zweite Aufgabe Next l Application.StatusBar = "Makroverarbeitung fast abgeschlossen!"

For l = 1 To 30000000 'Kurz vor Ende des Makros Next l Application.StatusBar = FalseEnd Sub

Sorgen Sie im ersten Schritt dafür, dass die Statusleiste sicherheitshalber auch ein-geblendet wird. Dazu setzen Sie die Eigenschaft DisplayStatusBar auf den WertTrue.

Danach geben Sie über die Eigenschaft StatusBar einen beliebigen Text ein, derin der Statusleiste angezeigt werden soll. Im Anschluss daran arbeiten Sie eineSchleife ab, die in diesem Fall für eine beliebige Aufgabe stehen soll. Danach

161

Page 162: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

ändern Sie den Text der Statuszeile, indem Sie der Eigenschaft StatusBar einenneuen Text zuweisen. Setzen Sie am Ende des Makros die Eigenschaft StatusBarauf den Wert False, um die Steuerung der Statusleiste wieder an Excel zurückzu-geben.

Im nächsten Beispiel werden Sie die Statuszeile einsetzen, um eine Suche nachExcel-Dateien zu dokumentieren. Dabei werden Excel-Arbeitsmappen in einembestimmten Verzeichnis gesucht und die Namen der gefundenen Arbeitsmappenin der Statusleiste angezeigt. Den Code für diese Aufgabenstellung sehen Sie inListing 3.8:

Listing 3.8: Die Suchergebnisse in der Statusleiste anzeigen

Sub DateienListen()Dim NächsteDatei As StringDim i As IntegerConst DateiSuche = "C:\Eigene Dateien"

Application.StatusBar = "Suchen in " & DateiSuche & "\"NächsteDatei = Dir(DateiSuche & "\" & "*.xls")i = 0

Do Until NächsteDatei = "" i = i + 1 Cells(i, 1).Value = DateiSuche & "\" & NächsteDatei Application.StatusBar = DateiSuche & "\" & NächsteDatei NächsteDatei = Dir()Loop

Application.StatusBar = FalseEnd Sub

Definieren Sie zu Beginn des Makros das zu durchsuchende Verzeichnis in einerKonstanten. Danach geben Sie den Namen des Verzeichnisses in der Statusleisteaus. Über die Funktion Dir suchen Sie jetzt die erste Excel-Datei. Dabei überge-ben Sie der Funktion die Information, in welchem Verzeichnis gesucht werdensoll, und die Dateiendung *.xls. Damit wird die erste Excel-Datei im angegebenenVerzeichnis ermittelt.

In einer anschließenden Schleife wiederholen Sie den Suchvorgang, bis Sie alleExcel-Dateien im angegebenen Verzeichnis gefunden haben. Innerhalb derSchleife geben Sie den Namen der jeweils gefundenen Arbeitsmappe in der

162

Page 163: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lang laufende Makros schneller machen

Tabelle über die Eigenschaft Cells aus, wobei Sie das erste Argument dieserEigenschaft dynamisch halten und bei jedem Schleifendurchlauf um den Wert 1erhöhen. Das Spaltenargument dieser Eigenschaft wird konstant auf dem Wert 1gehalten, was soviel bedeutet, dass die Spalte A angesprochen wird. Zusätzlichschreiben Sie die Namen der gefundenen Arbeitsmappen über die EigenschaftStatusBar in die Statusleiste. Wiederholen Sie den Suchvorgang, indem Sie dieFunktion Dir erneut am Ende der Schleife einsetzen. Dabei müssen Sie die Argu-mente der Funktion Dir nicht erneut formulieren. Setzen Sie am Ende desMakros die Eigenschaft StatusBar auf den Wert False, um die Steuerung der Sta-tusleiste wieder an Excel zurückzugeben.

Standardmeldungen abschalten

Wenn Sie beispielsweise eine Tabelle aus Ihrer Arbeitsmappe entfernen möchten,werden Sie gefragt, ob Sie diesen Vorgang wirklich durchführen möchten. Geradesolche Standardmeldungen sollten Sie beim Starten von Makros unterdrücken,damit Sie diese nicht wegklicken müssen.

Im folgenden Beispiel wird eine Tabelle ohne Rückfrage gelöscht:

Abbildung 3.4: Die Suchergeb-nisse werden in der Tabelle sowie in der Statusleiste vermerkt.

163

Page 164: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

Listing 3.9: Das aktive Tabellenblatt wird ohne Nachfrage gelöscht

Sub MeldungenUnterdrücken() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = TrueEnd Sub

Setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um Standardmel-dungen in Excel zu unterdrücken. Am Ende des Makros sollten Sie diese Einstel-lung jedoch wieder rückgängig machen, weil Excel dies nicht automatisch macht.

3.4 Automatische Listen generieren

Sicher kennen Sie in Excel das Ausfüllkästchen, über das Sie blitzschnell ganzeDatenreihen anlegen können. Ein Beispiel für eine Liste, welche bereits fest inExcel integriert ist, ist die Tagesliste. Schreiben Sie einmal das Wort Montag in eineZelle und ziehen Sie das Ausfüllkästchen dieser Zelle nach rechts.

Weitere benutzerdefinierte Listen können Sie per Makro einfügen.

Benutzerdefinierte Liste aus Makro erzeugen

Im nächsten Beispiel wird eine kleine Länderliste als benutzerdefinierte Listeangelegt. Dabei werden die einzelnen Listeneinträge direkt im Makro angegeben.Der Quellcode für diese Aufgabe lautet:

Abbildung 3.5: Die automatisch integrierte Liste mit den Tages-namen

164

Page 165: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Automatische Listen generieren

Listing 3.10: Eine benutzerdefinierte Liste anlegen

Sub ListeEinfügen01()Application.AddCustomList Array _("Deutschland", "Spanien", "Italien", "Frankreich", "Polen")End Sub

Legen Sie mit der Methode AddCustomList eine neue benutzerdefinierte Liste inExcel an. Dabei geben Sie die einzelnen Listeneinträge über die Funktion Arraybekannt. Trennen Sie jeden einzelnen Listeneintrag mit einem Komma und set-zen Sie die einzelnen Listeneinträge in doppelte Hochkommata.

Starten Sie das Makro aus Listing 3.10. und überprüfen Sie das Ergebnis, indemSie aus dem Menü EXTRAS den Befehl OPTIONEN wählen und auf die Register-karte BENUTZERDEFINIERTE LISTEN wechseln.

Benutzerdefinierte Liste aus Zelleninhalten erzeugen

Um eine benutzerdefinierte Liste zu erstellen, können Sie auch auf eine bereitserfasste Liste in einer Tabelle zugreifen und diese dann als benutzerdefinierte Listeangeben.

Um diese Möglichkeit nachzuvollziehen, geben Sie in einer neuen Tabelle inSpalte A ein paar Namen ein. Orientieren Sie sich dabei an Abbildung 3.7.

Abbildung 3.6: Die benutzerdefi-nierte Liste wurde angelegt.

165

Page 166: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

Erfassen Sie nun das folgende Makro, um diese Namen in eine benutzerdefinierteListe einzufügen:

Listing 3.11: Eine Liste über einen Zellenbezug anlegen

Sub ListeEinfügen02() Application.AddCustomList _ ListArray:=Sheets("Tabelle5").Columns("A:A")End Sub

Abbildung 3.7: Diese Namen sollen in eine benutzerdefinierte Liste transfe-riert werden.

Abbildung 3.8: Die benutzerdefi-nierte Liste wurde aus einer Tabelle übernommen und angelegt.

166

Page 167: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Drag&Drop ein- und ausschalten

Wenden Sie die Methode AddCustomList an, um eine benutzerdefinierte Listeanzulegen. Damit Excel weiß, dass es in diesem Fall die einzelnen Einträge auseiner Tabelle übernehmen soll, geben Sie im Argument ListArry die Spalte A derTABELLE5 an. Starten Sie das Makro aus Listing 3.11 und kontrollieren Sie dasErgebnis.

3.5 Drag&Drop ein- und ausschalten

Die gerade beschriebene Funktion des Auto-Ausfüllens über benutzerdefinierteListen ist nur dann möglich, wenn Sie im Menü EXTRAS unter dem BefehlOPTIONEN auf der Registerkarte BEARBEITEN die Drag&Drop-Funktion aktivierthaben.

Möchten Sie Drag&Drop nicht zulassen, können Sie diese Einstellung auch dyna-misch über das folgende VBA-Makro erfassen:

Listing 3.12: Drag&Drop ausschalten

Sub AusschaltenDragUndDrop() Application.CellDragAndDrop = FalseEnd Sub

Setzen Sie die Eigenschaft CellDragAndDrop auf den Wert False, wenn Sie verhin-dern möchten, dass das Ziehen und Ablegen von Zellen durchgeführt werdenkann. Indem Sie diese Eigenschaft auf den Wert True setzen, wird diese Art derZellenbearbeitung wieder zugelassen.

3.6 Add-Ins überprüfen

Bestimmte Tabellenfunktionen sind standardmäßig in Excel nicht direkt verfüg-bar. Nur über das Einbinden von zusätzlichen Add-Ins können Sie diese Funk-tionen einsetzen. Daher sollten Sie vor dem Gebrauch einer Tabellenfunktion auseinem Add-In prüfen, ob das entsprechende Add-In bereits eingebunden ist.

Im folgenden Makro werden alle zurzeit eingebundenen Add-Ins in einer Bild-schirmmeldung angezeigt:

167

Page 168: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

Listing 3.13: Auflistung der eingebundenen Add-Ins

Sub WelcheAddInsSindInstalliert()Dim AddI As AddInDim s As String

For Each AddI In Application.AddIns If AddI.Installed = True Then s = s & Chr(13) _ & AddI.Name & " --> " & AddI.FullNameNext

MsgBox "Folgende Add-Ins sind derzeit installiert:" & _Chr(13) & s, vbInformation + vbOKOnlyEnd Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ AddIn. Ineiner Schleife arbeiten Sie das Auflistungsobjekt AddIns ab, in dem alle Add-Insverzeichnet sind, die sich momentan im Add-Ins-Manager befinden. Über eine If-Abfrage und der Eigenschaft Installed überprüfen Sie, ob das jeweilige Add-Ineingebunden ist. Wenn ja, dann sammeln Sie die Namen sowie deren Speicher-pfad in der Variablen s. Um diese beiden Informationen zu erhalten, setzen Siedie Eigenschaften Name und FullName ein. Geben Sie die so gesammelten Informa-tionen am Ende des Makros auf dem Bildschirm aus.

3.7 Wiedervorlageliste bearbeiten

Wenn Sie in Excel das Menü DATEI herunterklappen, sehen Sie ganz unten imMenü eine Auflistung der zuletzt geöffneten Arbeitsmappen.

Die Liste der zuletzt geöffneten Dateien können Sie verändern. So können Sie bei-spielsweise dafür sorgen, dass dort überhaupt keine Arbeitsmappen mehr angezeigtwerden. Wie das genau aussieht, können Sie im Folgenden sehen:

Abbildung 3.9: Add-Ins und deren Installations-pfad werden aus-gegeben.

168

Page 169: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wiedervorlageliste bearbeiten

Listing 3.14: Die Wiedervorlageliste verbergen

Sub WiedervorlageListeZurücksetzen() With Application .DisplayRecentFiles = False End WithEnd Sub

Setzen Sie die Eigenschaft DisplayRecentFiles auf den Wert False, um die Listeder zuletzt geöffneten Dateien im Menü DATEI nicht anzuzeigen.

Möchten Sie die Wiedervorlageliste in Zukunft wieder anzeigen und bestimmen,wie viele Arbeitsmappen dort maximal angezeigt werden sollen, dann starten Siedas Makro aus Listing 3.15:

Abbildung 3.10: Die Wiedervorlageliste von Excel

169

Page 170: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

Listing 3.15: Die Wiedervorlageliste festlegen

Sub WiedervorlageListeFestlegen() With Application .DisplayRecentFiles = True .RecentFiles.Maximum = 4 End WithEnd Sub

Über die Auflistung RecentFiles bekommen Sie Zugriff auf die zuletzt geöffnetenArbeitsmappen. Die maximale Anzahl der Einträge in der Wiedervorlageliste derzuletzt geöffneten Dateien kann zwischen 0 und 9 eingestellt werden.

Ein wenig problematisch ist Folgendes:

Wird eine Arbeitsmappe in der Wiedervorlageliste angezeigt, die Sie in der Zwi-schenzeit gelöscht bzw. in ein anderes Verzeichnis verschoben haben, dann erhal-ten Sie eine Fehlermeldung, wenn Sie versuchen, diese Arbeitsmappe über dieWiedervorlageliste zu öffnen.

Schreiben Sie daher ein Makro, welches jeden einzelnen Eintrag in der Wieder-vorlageliste überprüft. Sollte die dort angegebene Arbeitsmappe nicht mehr auf-findbar sein, wird der dazugehörige Eintrag aus der Wiedervorlageliste entfernt.Das Makro für die Lösung dieser Aufgabenstellung sehen Sie in Listing 3.16:

Listing 3.16: Die Vorlageliste bereinigen

Sub VorlageListeLöschen()Dim Wiedervorlage As RecentFile

For Each Wiedervorlage In Application.RecentFiles If Dir(Wiedervorlage.Name) = "" Then Wiedervorlage.Delete End IfNext WiedervorlageEnd Sub

Abbildung 3.11: Die Arbeits-mappe kann nicht gefunden werden.

170

Page 171: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Sonstige Einstellmöglichkeiten in Excel

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ RecentFile.Danach durchlaufen Sie jeden einzelnen Eintrag in der Wiedervorlageliste undüberprüfen mithilfe der Funktion Dir, ob die so verzeichnete Arbeitsmappe über-haupt noch verfügbar ist. Wenn nicht, meldet die Funktion Dir eine leere Zei-chenfolge zurück. In diesem Fall wenden Sie die Methode Delete an, um denEintrag aus der Wiedervorlageliste zu entfernen.

3.8 Sonstige Einstellmöglichkeiten in Excel

Zum Abschluss dieses Tages lernen Sie noch einige weitere Einstellungen inExcel kennen, die Sie über den Einsatz von VBA einstellen können.

Allgemeine Einstellungen

Rufen Sie zu diesem Zweck einmal das Dialogfeld OPTIONEN aus dem MenüEXTRAS auf und wechseln Sie auf die Registerkarte ALLGEMEIN.

Im unteren Abschnitt des Dialogs können Sie ganz allgemeine Dinge, wie dieAnzahl der Tabellen, die mit jeder neuen Arbeitsmappe angeboten werden sollen,die Standardschriftart, den Standardspeicherort von Dateien und mehr einstellen.

Abbildung 3.12: Allgemeine Optionen ein-stellen

171

Page 172: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

In der nächsten Aufgabe sollen die folgenden Einstellungen per VBA durchgeführtwerden:

� 12 Blätter in jeder neuen Arbeitsmappe anbieten

� Die Standardschriftart lautet COURIER in der Schriftgröße 11.

� Der Standardspeicherort lautet: C:\Eigene Dateien\Excel.

� Der Benutzername lautet HELD.

Setzen Sie diese Aufgaben in einem Makro um, das Sie in Listing 3.17 sehen können:

Listing 3.17: Allgemeine Einstellungen vornehmen

Sub AllgemeineEinstellungenVornehmen() With Application .UserName = "Held" .StandardFont = "Courier" .StandardFontSize = "11" .DefaultFilePath = "C:\Eigene Dateien\Excel" .SheetsInNewWorkbook = 12 End WithEnd Sub

Mithilfe der Eigenschaft UserName können Sie den Anwendernamen in Excelbekannt geben. Dieser Name erscheint dann auch in den Dokumenteigenschaftenjeder Arbeitsmappe, die Sie zukünftig anlegen. Die Dokumenteigenschaften kön-nen Sie abrufen, indem Sie aus dem Menü DATEI den Befehl EIGENSCHAFTENauswählen.

Über die Eigenschaft StandardFont können Sie die Standardschriftart von Excelfestlegen. Die Eigenschaft StandardFontSize bestimmt die Standardschriftgröße.Bereits anders formatierte Zellen bleiben von dieser Einstellung unberührt. DieseEinstellung gilt lediglich für neue Arbeitsmappen.

Die Eigenschaft DefaultFilePath gibt Aufschluss darüber, welches Verzeichnisbeim Öffnen von Arbeitsmappen standardmäßig angesteuert und im DialogfeldÖFFNEN angezeigt werden soll.

Über die Eigenschaft SheetsInNewBook können Sie die Anzahl der Tabellen festle-gen, die beim Einfügen einer neuen Arbeitsmappe standardmäßig angeboten wer-den. Sie haben dabei die Möglichkeit, einen Wert zwischen 1 und 255einzutragen.

172

Page 173: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Sonstige Einstellmöglichkeiten in Excel

Die Einstellungen werden erst nach einem erneuten Excel-Start wirk-sam!

Zoom einstellen

In Excel haben Sie die Möglichkeit, Ihre Tabellen über ein eingebautes Zoom zuvergrößern bzw. zu verkleinern. Dazu setzen Sie die Eigenschaft Zoom ein, der Sieeinen Zoomfaktor zwischen 10% und 400% übergeben können. Ein eingestelltesZoom von 100% entspricht dabei einer Ansicht der Tabelle im Verhältnis 1:1.

Im folgenden Makro werden alle Tabellenblätter einer Arbeitsmappe einheitlichauf den Zoomfaktor 80% eingestellt.

Listing 3.18: Einheitliches Zoom auf allen Tabellen einstellen

Sub ZoomEinstellen()Dim i As Integer

For i = 1 To ActiveWorkbook.Sheets.Count Sheets(i).Select ActiveWindow.Zoom = 80Next iEnd Sub

Aktivieren Sie in einer Schleife eine Tabelle nach der anderen und stellen Sie dasZoom einheitlich auf 80% ein.

Abbildung 3.13: Das Zoom wurde auf allen Tabel-len gleich einge-stellt.

173

Page 174: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

Aufenthaltsbereich festlegen

Über die Eigenschaft ScrollArea können Sie den Aufenthaltsbereich eines Anwen-ders in einer Tabelle genau festlegen. Sie haben dabei die Möglichkeit, einen ganzbestimmten Zellenbereich anzugeben.

Im folgenden Beispiel darf ein Anwender sich nur im Bereich B4:G15 auf derTABELLE6 aufhalten. Es wird ihm nicht gelingen, den Mauszeiger auf eine Zelleaußerhalb dieses Bereiches zu setzen. Auch das Betätigen der Bildlaufleisten wirdüber diesen Bereich hinaus nicht mehr funktionieren.

Listing 3.19: Den Aufenthaltsbereich bestimmen

Sub AufenthaltsbereichFestlegen() Worksheets("Tabelle6").ScrollArea = "B4:G15"End Sub

Legen Sie den Aufenthaltsbereich für Ihren Anwender fest, indem Sie der Eigen-schaft ScrollArea die genauen Zellenkoordinaten sowie den Tabellennamenbekannt geben.

Der Aufenthaltsbereich muss nach jedem Öffnen der Arbeitsmappe neueingestellt werden. Leider behält Excel diese Einstellung nach demBeenden und Speichern der Arbeitsmappe nicht bei. Sie können Excelaber austricksen!

Befolgen Sie die folgenden Arbeitsschritte, um den Aufenthaltsbereich dauerhafteinzustellen:

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Führen Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEAR-BEITSMAPPE durch.

3. Im Code-Fenster wählen Sie aus dem ersten Dropdown-Menü den EintragWORKBOOK.

4. Nun wird das Ereignis Workbook_Open eingefügt, welches Sie wie folgt ergän-zen.

174

Page 175: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

Listing 3.20: Den Aufenthaltsbereich immer wieder neu einstellen

Private Sub Workbook_Open() AufenthaltsbereichFestlegenEnd Sub

Das Ereignis Workbook_Open wird bei jedem Öffnen der Arbeitsmappe automatischausgeführt. Ein idealer Zeitpunkt, um die ScrollArea festzulegen!

Erfahren Sie mehr über den Einsatz von Ereignissen am 7. Tag.

3.9 Fragen & Antworten

F Wie können Sie auf die Wiedervorlageliste von Excel zugreifen?

A Über das folgende Makro werden alle Arbeitsmappen, die in der Vorlage-liste stehen, in einem Meldungsfenster angezeigt:

Listing 3.21: Alle Arbeitsmappen der Vorlageliste werden ausgegeben

Sub VorlageListeAnzeigen()Dim Wiedervorlage As RecentFileDim s As String

For Each Wiedervorlage In Application.RecentFiles

Abbildung 3.14: Nach dem Öff-nen der Arbeits-mappe können Sie sich nur im Bereich B4:G15 aufhalten.

175

Page 176: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Excel-Anwendung einstellen und anpassen

s = s & Wiedervorlage.Name & Chr(13)Next WiedervorlageMsgBox sEnd Sub

F Wie können Sie den Pfad der aktiven Arbeitsmappe ausgeben?

A Starten Sie dazu das Makro aus Listing 3.22:

Listing 3.22: Den Speicherpfad einer Mappe ermitteln

Sub VerzeichnisZurückgeben()Dim s As String

s = Application.ActiveWorkbook.Path MsgBox sEnd Sub

Über die Eigenschaft Path können Sie den Speicherpfad der aktivenArbeitsmappe ermitteln.

F Wie können Sie die Registerkarten der Tabellen verstecken?

A Über die Anweisung ActiveWindow.DisplayWorkbookTabs = False

3.10 Quiz

F Wie kann man die Bildschirmaktualisierung abschalten?

F Was muss man beachten, wenn man die Statuszeile einsetzen und eigene Mel-dungen dort ausgeben möchte?

F Wie kann man Standardmeldungen in Excel abschalten?

3.11 Übung

In dieser Übung sollen Sie überprüfen, ob das Add-In SOLVER bereits geladen ist.Die Lösung dieser Aufgabe finden Sie im Anhang A.

176

Page 177: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

4

Auf Arbeitsmappen zugreifen – Datei-

Operationen

Page 178: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Gestern haben Sie einen Einblick erhalten, welche Einstellungen Sie in Excel vor-nehmen können. Unter anderem haben Sie gelernt, wie Sie Makros noch schnel-ler machen und bestimmte Objekte in der Excel-Anwendung ein- und ausblendenkönnen. Die Themen heute:

� Arbeitsmappen öffnen

� Arbeitsmappen speichern

� Arbeitsmappen schließen

� Arbeitsmappen anlegen

� Arbeitsmappen zusammenführen

� Arbeitsmappen entfernen

� Die Dokumenteigenschaften

� Verknüpfungen in Arbeitsmappen

Die Arbeitsmappe wird durch das Objekt Workbook angesprochen. Für diesesObjekt stehen die zu erwartenden Methoden wie das Öffnen, Speichern, Schlie-ßen, Löschen und weitere zur Verfügung. Lernen Sie nun anhand einiger Praxis-aufgaben den Einsatz dieser Methoden kennen.

Alle Makrobeispiele können Sie in der Arbeitsmappe Mappe.xls im Ver-zeichnis Kap04 auf der mitausgelieferten CD-ROM nachschlagen.

4.1 Arbeitsmappen öffnen

Als allererstes Beispiel werden Sie erfahren, wie Sie eine Arbeitsmappe öffnen kön-nen. Um eine Arbeitsmappe zu öffnen, setzen Sie die Methode Open ein.

Die komplette Syntax der Methode Open lautet:

Workbooks.Open(FileName, UpdateLinks, ReadOnly, _ Format, Password, WriteResPassword,_ IgnoreReadOnlyRecommended, Origin, Delimiter, _ Editable, Notify, Converter, AddToMRU)

Dem Argument FileName können Sie den Namen der Arbeitsmappe angeben, wel-che Sie öffnen möchten.

178

Page 179: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen öffnen

Das Argument UpdateLinks legt fest, ob ev. in der Arbeitsmappe enthaltene Ver-knüpfungen aktualisiert werden sollen oder nicht. Sicher haben Sie auch schoneinmal beim Öffnen einer Arbeitsmappe die Meldung erhalten, ob Sie die Ver-knüpfungen in der Arbeitsmappe aktualisieren möchten oder nicht. Diese Abfragekönnen Sie unterdrücken, indem Sie ein entsprechendes Argument 0–3 einsetzen.Die Bedeutung der verschiedenen Werte entnehmen Sie der folgenden Tabelle:

Setzen Sie das Argument ReadOnly auf den Wert True, wenn Sie die Arbeitsmappeschreibgeschützt öffnen möchten. Der Anwender hat dann keine Chance, Ände-rungen an dieser Arbeitsmappe vorzunehmen.

Das Argument Format kommt dann zum Einsatz, wenn Sie eine Textdatei öffnenmöchten. Über dieses Argument geben Sie das Trennzeichen an, welches in derTextdatei verwendet wird. Wenn dieses Argument nicht angegeben ist, wird dasaktuelle Trennzeichen verwendet. Folgende Möglichkeiten stehen dabei zur Ver-fügung.

Konstante Bedeutung

0 Keine Aktualisierung von Bezügen

1 Aktualisierung von externen Bezügen, jedoch nicht von Fernbezügen

2 Aktualisierung von Fernbezügen, jedoch nicht von externen Bezügen

3 Aktualisierung von externen Bezügen und Fernbezügen

Tabelle 4.1: Die Konstanten für das Argument UpdateLinks

Wert Trennzeichen

1 Tabstopps

2 Kommata

3 Leerzeichen

4 Semikolons

5 Keine

6 Benutzerdefiniertes Trennzeichen

Tabelle 4.2: Die Konstanten für das Argument Format

179

Page 180: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Das Argument Password muss dann gesetzt werden, wenn Sie versuchen, einekennwortgeschützte Arbeitsmappe zu öffnen. In diesem Argument geben Sie dasPasswort ein. Wird dieses Argument nicht angegeben, so erscheint beim Öffneneiner kennwortgeschützten Arbeitsmappe ein Dialog, in dem Sie das Passwort ein-geben müssen. Ohne Kenntnis dieses Passworts haben Sie keine Möglichkeit, dieArbeitsmappe zu öffnen.

Beim Argument WriteResPassword ist eine Zeichenfolge gemeint, die das zumSchreiben in eine Arbeitsmappe mit Schreiberlaubnis erforderliche Kennwort ent-hält. Fehlt dieses Argument und ist ein Kennwort für die Arbeitsmappe erforder-lich, wird der Benutzer zur Kennworteingabe aufgefordert.

Das Argument IgnoreReadOnlyRecommended wird auf den Wert True gesetzt, wennExcel keine Meldung anzeigen soll, die den schreibgeschützten Zugriff empfiehlt(falls die Arbeitsmappe mit der Option Schreibschutz empfehlen gespeichertwurde).

Wenn es sich um eine Textdatei handelt, wird mit dem Argument Origin derDateiursprung angegeben. Dies kann eine der folgenden XlPlatform-Konstantensein: xlMacintosh, xlWindows oder xlMSDOS. Wenn dieses Argument nicht angege-ben ist, wird das aktuelle Betriebssystem verwendet.

Das Argument Delimiter wird nur gesetzt, wenn es sich um eine Textdatei handeltund das Argument Format den Wert 6 hat. Dabei gibt das Argument Delimiter dieZeichenfolge des zu verwendenden Trennzeichens an.

Die restlichen Argumente der Methode Open sind in der Praxis eher weniger imEinsatz und können bei Bedarf in der Online-Hilfe nachgelesen werden. Üben Sienun den Einsatz der Methode Open anhand einiger Praxisbeispiele.

Arbeitsmappe öffnen (ohne Aktualisierung)

In der folgenden Aufgabe soll eine Arbeitsmappe in einem bestimmten Verzeich-nis geöffnet werden. Dabei sollen die in der Arbeitsmappe enthaltenen Verknüp-fungen beim Öffnen nicht aktualisiert werden. Das Makro für diese Aufgabe sehenSie in Listing 4.1:

Listing 4.1: Eine Arbeitsmappe ohne Aktualisierung von Verknüpfungen öffnen

Sub ArbeitsmappeÖffnen()Const LW = "C:\"Const Pfad = "C:\Eigene Dateien"

180

Page 181: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen öffnen

ChDrive LWChDir Pfad

On Error GoTo fehler Workbooks.Open Filename:="Mappe1.xls", UpdateLinks:=0Exit Sub

fehler: MsgBox "Die angegebene Arbeitsmappe konnte nicht gefunden werden!"End Sub

Im ersten Schritt legen Sie über den Einsatz von Konstanten fest, auf welchemLaufwerk bzw. in welchem Verzeichnis sich die zu öffnende Arbeitsmappe befin-det. Über die Anweisung ChDrive wechseln Sie auf das gewünschte Laufwerk. Siekönnen sich nicht sicher sein, dass Sie automatisch schon im richtigen Verzeich-nis stehen und setzen daher die Anweisung ChDir ein, um ein bestimmtes Ver-zeichnis einzustellen.

Wenden Sie anschließend die Methode Open an, um die Arbeitsmappe zu öffnen. ImArgument UpdateLinks geben Sie den Wert 0 an, was soviel bedeutet, dass die Ver-knüpfungen zu anderen Arbeitsmappen beim Öffnen nicht aktualisiert werden.

Über die Anweisung On Error GoTo fehler stellen Sie sicher, dass das Makro nichtabstürzt, sollte die angegebene Arbeitsmappe nicht im vorgegebenen Verzeichnisexisitieren. In diesem Fall läuft Excel auf einen Fehler, den Sie aber abfangen. ImFehlerfall wird direkt in den Paragraphen fehler verzweigt, indem eine eigeneMeldung auf dem Bildschirm angezeigt wird.

Arbeitsmappe(n) öffnen über einen Dialog

Möchten Sie in einem Dialog elegant die Arbeitsmappe(n) auswählen, die Sie öff-nen möchten, dann können Sie mit Hilfe der Methode GetOpenFileName den Dia-log ÖFFNEN anzeigen und auswerten.

Im folgenden Beispiel wird der Dialog ÖFFNEN angezeigt. Sie haben dabei dieMöglichkeit, eine Arbeitsmappe im Dialog auszuwählen und zu öffnen.

181

Page 182: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Listing 4.2: Den Dialog Öffnen anzeigen

Sub ArbeitsmappeÖffnenDialog()Dim DatOP As Variant

DatOP = Application.GetOpenFilename("Excel-Dateien(*.xls),*.xls") If DatOP = False Then Exit Sub Workbooks.Open Filename:=DatOPEnd Sub

Geben Sie bei der Methode GetOpenFilename den Filter an, nachdem Dateien imDialog ÖFFNEN angezeigt werden. Da Sie Excel-Dateien im Dialog anzeigenmöchten, geben Sie die Endung xls an.

Nach dem Aufruf des Dialogs müssen Sie prüfen, ob der Dialog ÖFFNEN mit derSchaltfläche ABBRECHEN wieder verlassen wurde. In diesem Fall wird in der Vari-ablen DatOP der Wert False zurückgegeben, was mit einem Verlassen des Makrosüber die Anweisung Exit Sub quittiert wird. Im anderen Fall öffnen Sie mit Hilfeder Methode Open die ausgewählte Arbeitsmappe, die in der Variablen DatOP ver-zeichnet ist.

Über denselben Dialog haben Sie auch die Möglichkeit, mehrere Excel-Arbeits-mappen auf einmal zu öffnen. Für diesen Zweck müssen Sie das Makro aus Lis-ting 4.2 ein wenig umschreiben.

Abbildung 4.1: Der Dialog Öff-nen

182

Page 183: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen öffnen

Listing 4.3: Mehrere Mappen können im Dialog Öffnen markiert werden

Sub ArbeitsmappenÖffnenDialog()Dim i As IntegerDim DatOP As Variant

i = 0DatOP = Application.GetOpenFilename("Excel-Dateien(*.xls),*.xls", _ MultiSelect:=True)

If IsArray(DatOP) Then For i = LBound(DatOP) To UBound(DatOP) Workbooks.Open DatOP(i) Next iElse MsgBox "Sie haben keine Arbeitsmappe ausgewählt"End If

End Sub

Zeigen Sie den Dialog ÖFFNEN an, indem Sie die Methode GetOpenFileName ein-setzen. Damit Sie die Möglichkeit haben, mehrere Arbeitsmappen im Dialog überdie Taste (Strg) zu markieren, müssen Sie hierbei das Argument MultiSelect aufden Wert True setzen.

Abbildung 4.2: Den Dialog Öff-nen mit Mehr-fachauswahl anzeigen

183

Page 184: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Im nächsten Schritt müssen Sie überprüfen, ob überhaupt eine Arbeitsmappe imDialog ÖFFNEN markiert wurde. Wenn ja, dann meldet die Funktion IsArray denWert True. In diesem Fall stehen die markierten Namen der Arbeitsmappen imDatenfeld DatOP. Dieses Datenfeld wird anschließend über den Einsatz einerSchleife abgearbeitet. Dabei repräsentiert die Funktion LBound den ersten Eintragim Datenfeld DatOP (die erste markierte Arbeitsmappe) und die Funktion UBoundden letzten Eintrag im Datenfeld DatOP (letzte markierte Arbeitsmappe). Innerhalbdieser Schleife wenden Sie die Methode Open an, um die markierten Arbeitsmap-pen nacheinander zu öffnen. Über die Zählvariable sprechen Sie dabei eineArbeitsmappe nach der anderen an.

Geöffnete Arbeitsmappen identifizieren

Gerade, wenn Sie mit mehreren geöffneten Arbeitsmappen arbeiten, dann müssenSie genau wissen, welche Arbeitsmappen derzeit geöffnet sind.

Im folgenden Makro werden alle aktuell geöffneten Arbeitsmappen in einem Mel-dungsfenster am Bildschirm angezeigt:

Listing 4.4: Alle geöffneten Arbeitsmappen im Überblick

Sub MappenGeöffnetErmitteln()Dim Mappe As WorkbookDim s As String For Each Mappe In Workbooks s = Mappe.Name & Chr(13) & s Next Mappe

MsgBox "Folgende Mappen sind derzeit geöffnet: " & _ Chr(13) & s, vbInformation + vbOKOnlyEnd Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ WorkBook undeine Variable vom Typ String, die die Namen der geöffneten Arbeitsmappen auf-nehmen soll. Danach setzen Sie eine Schleife auf und arbeiten alle geöffnetenArbeitsmappen ab. Diese werden Ihnen über das Auflistungsobjekt Workbooks zurVerfügung gestellt. Speichern Sie die Namen der Arbeitsmappen mithilfe derEigenschaft Name in der String-Variablen s. Nach jedem ermittelten Namen erzeu-gen Sie über die Anweisung Chr(13) eine neue Zeile. Nach dem Verlassen der

184

Page 185: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen speichern

Schleife geben Sie die ermittelten Namen der geöffneten Arbeitsmappen am Bild-schirm aus.

Bei dieser Lösung werden auch ausgeblendete Arbeitsmappen wie dieMappe PERSONL.XLS aufgelistet. Die Mappe PERSONL.XLS ist die zen-trale Makroarbeitsmappe, in der Sie Makros ablegen können, die Sieauch für alle anderen Arbeitsmappen gebrauchen können.

4.2 Arbeitsmappen speichern

Beim Speichern einer Arbeitsmappe müssen Sie wissen, wo Sie die Mappe spei-chern möchten. Dazu verwenden Sie die ChDrive-Anweisung, um das Laufwerk zubestimmen, sowie die Anweisung ChDir, um das richtige Verzeichnis einzustellen.Jetzt fehlt nur noch der Name.

Im folgenden Beispiel speichern Sie eine Arbeitsmappe.

Listing 4.5: Eine Arbeitsmappe speichern

Sub ArbeitsmappeSpeichern()Dim s As StringConst LW = "c:\"Const Pfad = "c:\Eigene Dateien"

s = ActiveWorkbook.Name ChDrive LW ChDir Pfad ActiveWorkbook.SaveAs Filename:=s, FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=TrueEnd Sub

Abbildung 4.3: Diese Arbeitsmappen sind derzeit geöffnet.

185

Page 186: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Die Syntax der Methode SaveAs lautet:

ActiveWorkbook.SaveAs(Filename, FileFormat, Password, _ WriteResPassword, ReadOnlyRecommended, CreateBackup, _ AddToMru, TextCodePage, TextVisualLayout)

Das Argument FileName haben Sie im Makro aus Listing 4.5 in der Variablen süber die Eigenschaft Name ermittelt. Beim Argument FileFormat können Sie ange-ben, in welchem Format Sie Ihre Mappe speichern möchten. Mit dem nächstenArgument Password können Sie ein Passwort festlegen, welches der Anwenderbeim Öffnen der Datei eingeben muss, um die Datei laden zu können. Im Beispielaus Listing 4.5 wurde eine Leerzeichenfolge übergeben, was bedeutet, dass keinPasswort beim Öffnen der Datei abgefragt wird. Das Argument WriteResPasswordsorgt dafür, dass ein Kennwort für die Schreiberlaubnis der Datei eingegeben wer-den muss. Auch hier wurde eine Leerzeichenfolge übergeben, was soviel bedeutet,dass beim Öffnen der so gespeicherten Arbeitsmappe kein Passwort eingegebenwerden muss.

Das Argument ReadOnlyRecommended setzen Sie auf True, wenn beim Öffnen derDatei in einer Meldung empfohlen werden soll, die Datei mit Nur-Lese-Zugriff zuöffnen. Belassen Sie das Argument auf dem Wert False, unterbleibt diese Mel-dung. Das Argument CreateBackup setzen Sie auf den Wert True, wenn Excel vonder Mappe eine Sicherungskopie anlegen soll. Excel legt dann eine Sicherungsko-pie unter demselben Namen mit dem Zusatz SICHERUNGSKOPIE VON... und derEndung WLK an. Die übrigen Argumente sind in der Praxis nicht so relevant undwerden an dieser Stelle nicht weiter beschrieben. Eine Beschreibung können Sieaber in der Online-Hilfe nachlesen.

Arbeitsmappe speichern über Dialog

Genauso wie schon beim Öffnen einer Arbeitsmappe beschrieben, gibt es in VBAauch eine Methode, um den Dialog SPEICHERN UNTER anzuzeigen. DieseMethode heißt GetSaveAsFilename.

Im folgenden Beispiel wird die momentan aktive Arbeitsmappe im Dialog SPEI-CHERN UNTER angezeigt.

Listing 4.6: Eine Arbeitsmappe im Dialog Speichern unter anzeigen

Sub ArbeitsmappeSpeichernDialog()Dim DATCl As VariantConst LW = "C:\"

186

Page 187: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen speichern

Const Pfad = "C:\Eigene Dateien"

ChDrive LWChDir Pfad

DATCl = Application.GetSaveAsFilename _ (, "Excel-Dateien (*.xls),*.xls")

If DATCl = False ThenElse ActiveWorkbook.SaveEnd IfEnd Sub

Bevor Sie den Dialog SPEICHERN UNTER aufrufen, sorgen Sie dafür, dass dasgewünschte Laufwerk bzw. das Verzeichnis aktiviert wird. Setzen Sie dazu dieAnweisungen ChDrive und ChDir ein. Danach rufen Sie über die Methode GetSaveAsFilename den Dialog SPEICHERN UNTER auf. Als Filter stellen Sie die Excel-Dateien mit der Endung xls ein. Vor diesem Filter haben Sie die Möglichkeit,einen Namen bereits vorzugeben. Im Beispiel aus Listing 4.6 wurde bewusstdarauf verzichtet, um den Dateinamen von Excel selbst vorschlagen zu lassen.

Im folgenden Beispiel aus Listing 4.7 werden Sie selbst einen Namen für dieArbeitsmappe festlegen:

Abbildung 4.4: Arbeitsmappe speichern

187

Page 188: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Listing 4.7: Einen eigenen Namen bestimmen

Sub EigenerNamen()Dim DATCl As Variant

DATCl = Application.GetSaveAsFilename _ ("NEUEDATEI.XLS", "Excel-Dateien (*.xls),*.xls")

If DATCl = False ThenElse ActiveWorkbook.SaveEnd IfEnd Sub

In beiden Makros aus Listing 4.6 und Listing 4.7 müssen Sie dann prüfen, ob nichteventuell auch die Schaltfläche ABBRECHEN geklickt wurde. In diesem Fall würdedie Variable DATCl den Wert False zurückmelden. Andernfalls speichern Sie dieArbeitsmappe, indem Sie die Methode Save anwenden.

Alle geöffneten Arbeitsmappen speichern

Im nächsten Beispiel sollen alle derzeit geöffneten Arbeitsmappen gespeichert wer-den. Das Makro für diese Aufgabe lautet:

Abbildung 4.5: Den Dialog Spei-chern unter mit voreingestelltem Namen aufrufen

188

Page 189: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen speichern

Listing 4.8: Alle geöffneten Arbeitsmappen speichern

Sub AlleMappenSpeichern()Dim Mappe As Workbook For Each Mappe In Workbooks Mappe.Save Next Mappe

End Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ WorkBook.Danach setzen Sie eine Schleife auf und arbeiten alle geöffneten Arbeitsmappenab. Innerhalb der Schleife setzen Sie die Methode Save ein, um die Arbeitsmap-pen zu speichern.

Arbeitsmappe speichern unter Datum/Uhrzeit

Möchten Sie für Arbeitsmappen das aktuelle Tagesdatum sowie die momentaneUhrzeit als Dateinamen verwenden, dann können Sie das folgende Makro dafüreinsetzen.

Listing 4.9: Arbeitsmappe mit Datum/Uhrzeit benennen

Sub MappeSpeichernMitDatumUndUhrzeit()Const LW = "C:\"Const Pfad = "C:\Eigene Dateien"

ChDrive LWChDir Pfad

ActiveWorkbook.SaveAs _(Date & "_" & Hour(Time) & "_" & Minute(Time) & ".xls")End Sub

Das aktuelle Tagesdatum für den Dateinamen bekommen Sie über die FunktionDate. Da im Dateinamen kein Doppelpunkt (Uhrzeit z.B. 12:30) vorkommen darf,müssen Sie die Zeitangabe mit den Funktionen Hour sowie Minute extrahieren undneu zusammensetzen.

189

Page 190: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Arbeitsmappe bedingt speichern

Eine Arbeitsmappe sollte nur dann gespeichert werden, wenn Änderungen an ihrvorgenommen wurden. Wenn Sie wissen möchten, ob Änderungen in der Arbeits-mappe seit dem letzten Öffnen der Arbeitsmappe gemacht wurden, sei es durchVerknüpfungen oder Benutzereingaben, dann steht Ihnen hierfür eine Eigen-schaft names Saved zur Verfügung. Sehen Sie sich nun folgendes Listing 4.10 an.

Listing 4.10: Prüfung durchführen, ob Arbeitsmappe geändert wurde

Sub ÄnderungArbeitsmappe() If ActiveWorkbook.Saved = False Then MsgBox "Die Mappe wurde geändert!" ActiveWorkbook.Save Else MsgBox "Arbeitsmappe ist unverändert!" End IfEnd Sub

Die Eigenschaft Saved liefert den Wert True, wenn die aktive Arbeitsmappe seit derletzten Speicherung nicht mehr geändert wurde. Gibt die Eigenschaft den WertFalse zurück, wurden Änderungen an der Arbeitsmappe vorgenommen.

Abbildung 4.6: Die Arbeitsmap-pe nach Datum und Uhrzeit benennen

190

Page 191: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen schließen

4.3 Arbeitsmappen schließen

Für das Schließen einer Arbeitsmappe steht Ihnen die Methode Close zur Verfü-gung. Wenn Sie eine Arbeitsmappe wieder schließen möchten, dann müssen Siestandardmäßig eine Meldung mit Ja bestätigen, wenn Sie Änderungen an derMappe durchgeführt haben. Diese Meldung können Sie aber unterdrücken, wennSie in der Methode Close ein zusätzliches Argument angeben.

Arbeitsmappe schließen – Änderungen speichern

Im folgenden Beispiel wird die aktive Arbeitsmappe ohne weitere Rückfragegeschlossen. Die Änderungen in der Mappe werden dabei mit gesichert.

Listing 4.11: Aktive Mappe schließen – Änderungen speichern

Sub ArbeitsmappeSchließen() ActiveWorkbook.Close SaveChanges:=TrueEnd Sub

Die Methode Close schließt die Arbeitsmappe. Wird das Argument SaveChangesauf den Wert True gesetzt, werden Änderungen an der Arbeitsmappe gespeichert.

Arbeitsmappe schließen – Änderungen verwerfen

Demzufolge können Sie eine Arbeitsmappe schließen und die Änderungen an die-ser Arbeitsmappe verwerfen, indem Sie folgendes Makro aus Listing 4.12 starten:

Listing 4.12: Aktive Mappe schließen – Änderungen verwerfen

Sub ArbeitsmappeSchließenÄnderungenVerwerfen() ActiveWorkbook.Close SaveChanges:=FalseEnd Sub

Mehrere Arbeitsmappen schließen

Wenn Sie mehrere Arbeitsmappen in Excel geöffnet haben, können Sie ganzschnell mit der Tastenkombination (Strg) + (F6) zwischen den einzelnen Arbeits-mappen hin und her springen. Möchten Sie jetzt alle Arbeitsmappen, mit Aus-

191

Page 192: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

nahme der, in der das Makro aus Listing 4.13 untergebracht ist, schließen, dannstarten Sie das folgende Makro:

Listing 4.13: Alle Mappen bis auf eine schließen

Sub MehrereMappenSchließen()Dim Mappe As Workbook

For Each Mappe In Application.Workbooks If Mappe.Name <> ThisWorkbook.Name Then _ Mappe.Close SaveChanges:=TrueNextEnd Sub

Im Auflistungsobjekt Workbooks sind alle zur Zeit geöffneten Arbeitsmappen ver-zeichnet. Dies können Sie in einer For-Each-Schleife nützen, die den Namen derArbeitsmappe, die den Code aus Listing 4.13 enthält, mit den Namen der Arbeits-mappen vergleicht, die in der Auflistung stehen. Mit der Methode Close schließenSie dann alle Arbeitsmappen bis auf die, die Listing 4.13 enthält.

An dieser Stelle muss auf den Unterschied zwischen den Anweisungen

ActiveWorkbook

und

ThisWorkbook

hingewiesen werden. Die Arbeitsmappe, die mit der EigenschaftActiveWorkbook angesprochen wird, ist die Arbeitsmappe, die momentanaktiv ist, d.h. wenn Sie aus der Entwicklungsumgebung herausspringenund in die normale Arbeitsoberfläche von Excel wechseln. Mit derEigenschaft ThisWorkbook ist die Arbeitsmappe gemeint, in die Sie dieMakros eingeben. Halten Sie diese beiden Eigenschaften auseinanderund klären Sie immer genau ab, was Sie an welcher Arbeitsmappe tunmöchten.

192

Page 193: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen anlegen

4.4 Arbeitsmappen anlegen

Möchten Sie neue Arbeitsmappen einfügen, dann verwenden Sie die MethodeAdd. Die Anzahl der Tabellenblätter, welche Excel in der neuen Arbeitsmappe zurVerfügung stellen soll, regeln Sie über die Eigenschaft SheetsInNewWorkbook. Ach-ten Sie darauf, dass die Obergrenze der Tabellenblätter den Wert 255 nicht über-steigen darf.

Legen Sie im folgenden Beispiel eine neue Arbeitsmappe mit drei Tabellenblät-tern an:

Listing 4.14: Neue Arbeitsmappe einfügen

Sub NeueArbeitsmappeAnlegen() Application.SheetsInNewWorkbook = 3 Workbooks.AddEnd Sub

Mit Hilfe der Eigenschaft SheetsInNewWorkbook legen Sie fest, wie viele Tabellenin einer neuen Arbeitsmappe eingefügt werden sollen. Danach wenden Sie dieMethode Add an, um eine neue Arbeitsmappe einzufügen.

4.5 Arbeitsmappen zusammenführen

In der folgenden etwas größeren Aufgabe werden Sie einige bereits gelernte Dingenacheinander durchführen. Sie werden unter anderem eine neue Arbeitsmappemit zunächst einem Tabellenblatt einfügen. Danach greifen Sie auf ein bestimm-tes Verzeichnis zu und öffnen dort eine Arbeitsmappe nach der anderen. Übertra-gen Sie dann die einzelnen Tabellen in die gerade neu erstellte Arbeitsmappe. DasMakro zur Lösung dieser Aufgabenstellung können Sie im folgenden Listingsehen:

Listing 4.15: Alle Mappen aus einem Verzeichnis werden zusammenkopiert

Sub KonsolidierenAlleDateienEinesVerz()Dim Mappe As StringDim i As IntegerConst LW = "C:\"Const Pfad = "C:\Eigene Dateien\Excel\"

193

Page 194: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

ChDrive LWChDir Pfad

Application.SheetsInNewWorkbook = 1Workbooks.Add

ActiveWorkbook.SaveAs ("C:\Eigene Dateien\Konsolidierung.xls")

Mappe = Dir(Pfad & "*.xls")ChDir (Pfad)

Do While Mappe <> "" Workbooks.Open Mappe

For i = 1 To Workbooks(Mappe).Sheets.Count Workbooks(Mappe).Sheets(i).Copy _ Before:=Workbooks("Konsolidierung.xls").Sheets(1) Next i

Workbooks(Mappe).Close SaveChanges:=False Mappe = DirLoopEnd Sub

Wechseln Sie im ersten Schritt auf das gewünschte Laufwerk bzw. das Verzeich-nis, in dem die zu konsolidierenden Arbeitsmappen stehen. Danach bestimmenSie über die Eigenschaft SheetsInNewWorkbook, wie viele Tabellen in der neuenArbeitsmappe enthalten sein sollen. Legen Sie direkt im Anschluss diese neueArbeitsmappe über die Methode Add an.

Speichern Sie direkt im Anschluss die gerade neu erstellte Arbeitsmappe im Ver-zeichnis C:\EIGENE DATEIEN. Basteln Sie sich nun den Suchbegriff zusammenund übergeben diesen der Funktion Dir. Stellen Sie danach wieder das Verzeich-nis über die Anweisung ChDir ein, indem die zu konsolidierenden Arbeitsmappengespeichert sind.

Setzen Sie jetzt eine Do while Schleife auf, die solange durchlaufen wird wieArbeitsmappen im angegebenen Verzeichnis gefunden werden können. Innerhalbdieser Schleife öffnen Sie die einzelnen Arbeitsmappen mithilfe der MethodeOpen.

194

Page 195: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeitsmappen entfernen

Jetzt benötigen Sie eine zweite Schleife, die die Tabellen der einzelnen Arbeits-mappen zählt. Über die Methode Copy kopieren Sie nun die einzelnen Tabellen inIhre Konsolidierungsarbeitsmappe.

Sind alle Tabellen der jeweiligen Arbeitsmappe übertragen, dann wenden Sie dieMethode Close an, um die Arbeitsmappe wieder zu schließen. Setzen Sie dabeidas Argument SaveChanges auf den Wert False, um diese Mappen ohne Rückfragezu schließen. Suchen Sie danach über die Funktion Dir nach weiteren Arbeits-mappen.

4.6 Arbeitsmappen entfernen

Wenn Sie eine Arbeitsmappe löschen möchten, ohne dazu den Datei-Explorervon Windows einzusetzen, können Sie Arbeitsmappen über die Anweisung Killeinsetzen. Dabei darf die zu löschende Arbeitsmappe selbstverständlich nichtgeöffnet sein.

Im folgenden Beispiel aus Listing 4.16 wird eine bestimmte Arbeitsmappe auseinem vorgegebenen Verzeichnis unwiederbringlich entfernt.

Listing 4.16: Arbeitsmappe ohne Rückfrage löschen

Sub ArbeitsmappeLöschen()Const Lw = "C:\"Const Pfad = "C:\eigene Dateien"Const Datei = "Mappe1.xls"

On Error GoTo fehler: Kill Datei MsgBox "Arbeitsmappe " & Datei & " wurde gelöscht!" Exit Sub

fehler: MsgBox "Es konnte keine Datei mit dem Namen " & _ Datei & " gefunden werden!"End Sub

Beachten Sie hierbei die Fehlerbehandlung von Excel. Wenn Sie z.B. zweimalhintereinander versuchen, das Makro ArbeitsmappeLöschen auszuführen, bekom-men Sie beim ersten Mal die Bestätigung, dass die Datei gelöscht wurde. Wenn

195

Page 196: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Sie ein zweites Mal versuchen, die Arbeitsmappe zu löschen, liefert Excel Ihnendie Fehlermeldung, welche unter der Zeilenmarke Fehler steht.

4.7 Die Dokumenteigenschaften

Die Dokumenteigenschaften einer Arbeitsmappe können Sie eingeben oder auchansehen, indem Sie aus dem Menü DATEI den Befehl EIGENSCHAFTEN wählen.

Wie Sie sehen sind die momentan verfügbaren Eigenschaften doch etwas rar gesät.Diese Dokumenteigenschaften können Sie über den Einsatz von VBA setzen.

Abbildung 4.7: Die Dokumenteigenschaften der Arbeitsmappe

196

Page 197: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Dokumenteigenschaften

Dokumenteigenschaften auslesen

Es existiert eine ganze Reihe von Dokumenteigenschaften für eine Arbeitsmappe.Wie aber können Sie wissen, wie Sie diese Dokumenteigenschaften ansprechensollen? Die Antwort auf diese Frage können Sie im Makro aus Listing 4.17 ablesen.

Listing 4.17: Alle Dokumenteigenschaften auslesen

Sub DokumentEigenschaftenAuslesen()Dim i As IntegerDim obj As Objecti = 1

Abbildung 4.8: Alle verfügbaren Dokumenteigen-schaften

197

Page 198: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Sheets.AddFor Each obj In ActiveWorkbook.BuiltinDocumentProperties Cells(i, 1).Value = obj.Name On Error Resume Next Cells(i, 2).Value = obj.Value i = i + 1NextEnd Sub

Mit dem Befehl Sheets.Add fügen Sie eine neue Tabelle in Ihrer Arbeitsmappeein. Danach bilden Sie eine Schleife, die nacheinander alle Dokumenteigenschaf-ten der Arbeitsmappe durchläuft und deren Namen sowie deren momentaneInhalte in die Tabelle schreibt. Mit Hilfe der Eigenschaft BuilInDocumentProper-ties wird Ihnen eine Auflistung aller Dokumenteigenschaften zur Verfügunggestellt.

Dokumenteigenschaften setzen

Nachdem Sie nun wissen, wie die einzelnen Dokumenteigenschaften heißen, wer-den Sie die folgenden Dokumenteigenschaften setzen:

� Der Titel soll gesetzt werden (z.B. VBA-Demos).

� Das Thema soll ebenfalls gesetzt werden (z.B. Arbeitsmappenbeispiele).

� Die Kategorie soll mit dem Begriff VBA gesetzt werden.

� Als Stichwörter sollen die Begriffe VBA, Makros und Programmierung aufge-führt werden.

� Ebenso soll ein mehrzeiliger Kommentar als Dokumenteigenschaft gesetztwerden.

Realisieren Sie diese Anforderungen, indem Sie das Makro aus Listing 4.18 starten.

Listing 4.18: Nahezu alle Dokumenteigenschaften wurden gesetzt

Sub DokuEigenschaftnSetzen()With ThisWorkbook .BuiltinDocumentProperties("Title").Value = "VBA-Demos" .BuiltinDocumentProperties("Subject").Value = _

198

Page 199: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Dokumenteigenschaften

"Arbeitsmappenbeispiele" .BuiltinDocumentProperties("Category").Value = "VBA" .BuiltinDocumentProperties("Keywords").Value = _ "VBA, Makros, Programmierung" .BuiltinDocumentProperties("Comments").Value = _ "Beispiele zur Programmierung mit Excel-VBA " & _ Chr(13) & "Mehr Demos finden Sie auf meiner Homepage unter der URL: " & _ http://Held-office.deEnd WithEnd Sub

Füllen Sie die einzelnen Dokumenteigenschaften, indem Sie die EigenschaftBuiltInDocumentProperties mit dem richtigen Namen ansprechen und dengewünschten Inhalt übergeben.

Kontrollieren Sie das Ergebnis, indem Sie aus dem Menü DATEI den BefehlEIGENSCHAFTEN wählen und die Registerkarte ZUSAMMENFASSUNG aktivieren.

Abbildung 4.9: Die Dokumenteigenschaften wurden gesetzt.

199

Page 200: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Auf dieser Registerkarte sehen Sie einige Datumsangaben, die Sie wie folgt ausle-sen können.

Listing 4.19: Das Erstellungsdatum und das letzte Änderungsdatum ausgeben

Sub DatumsAngabenAuslesen()With ThisWorkbook Debug.Print "Erstelldatum: " & _.BuiltinDocumentProperties("Creation date").Value Debug.Print "Letztes Speicherdatum " & _.BuiltinDocumentProperties("Last Save Time").ValueEnd WithEnd Sub

Über die Anweisung Debug.Print geben Sie die momentan gesetzten Dokumentei-genschaften im Direktfenster aus.

Blenden Sie das Direktfenster ein, indem Sie in die Entwicklungsumgebungwechseln und aus dem Menü ANSICHT den Befehl DIREKTFENSTER auswählen.

Abbildung 4.10: Die Registerkarte Statistik

200

Page 201: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Verknüpfungen in Arbeitsmappen

4.8 Verknüpfungen in Arbeitsmappen

Wenn Sie eine Arbeitsmappe öffnen, die Verknüpfungen enthält, werden Siedurch eine Bildschirmmeldung darauf aufmerksam gemacht, dass Verknüpfungenenthalten sind. Sie haben dann die Möglichkeit, diese Verknüpfungen zu aktuali-sieren. Dabei bleiben die verknüpften Arbeitsmappen aber geschlossen. Die Zeit,die vergeht, bis die Verknüpfungen alle aktualisiert sind, ist abhängig von derAnzahl der verknüpften Zellen bzw. der verknüpften Arbeitsmappen. Es empfiehltsich, bei Änderungen immer die beteiligten Arbeitsmappen zu öffnen. VerknüpfteArbeitsmappen können Sie in Excel öffnen, indem Sie aus dem Menü BEARBEI-TEN den Befehl VERKNÜPFUNGEN wählen, im Listenfeld QUELLDATEI die ent-sprechenden verknüpften Arbeitsmappen markieren und die Schaltfläche QUELLEÖFFNEN klicken.

Abbildung 4.11: Dokumenteigenschaften im Direktbereich ausge-ben

Abbildung 4.12: Verknüpfte Arbeitsmappen anzeigen

201

Page 202: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

Verknüpfungen dokumentieren

Die Verknüpfungen zu anderen Arbeitsmappen können Sie auch über ein Makroauf einer separaten Tabelle dokumentieren. Im folgenden Makro wird eine neueTabelle eingefügt und alle Verknüpfungen zu anderen Arbeitsmappen dokumen-tiert.

Listing 4.20: Alle verknüpften Arbeitsmappen dokumentieren

Sub VerknüpfungenAusgeben()Dim Mappe As WorkbookDim VLink As VariantDim i As Integer

Set Mappe = ThisWorkbookVLink = Mappe.LinkSources(xlExcelLinks)Sheets.AddRange("A1").Select

If Not IsEmpty(VLink) Then For i = 1 To UBound(VLink) ActiveCell.Value = i ActiveCell.Offset(0, 1).Value = VLink(i) ActiveCell.Offset(1, 0).Select Next iEnd IfEnd Sub

Definieren Sie zuerst ein Objekt vom Typ Workbook. Danach definieren Sie einDatenfeld vom Datentyp Variant, indem Sie die Namen und die Pfade der ver-knüpften Arbeitsmappen speichern. Mit der Anweisung Set sagen Sie aus, dass dasObjekt Mappe die momentan aktive Arbeitsmappe repräsentieren soll. Fügen Sieein neues Tabellenblatt mit der Methode Add ein. Füllen Sie jetzt das DatenfeldVLink mit allen Excel-Verknüpfungen dieser Arbeitsmappe. Dazu setzen Sie dieMethode LinkSources mit der Xlink-Konstanten xlExcelLinks ein. Die Methodegibt eine Matrix mit Verknüpfungen der Arbeitsmappe zurück. Die Namen in derMatrix entsprechen dabei den Namen der verknüpften Excel-Arbeitsmappen.Wenn keine Verknüpfung besteht, wird der Wert IsEmpty zurückgegeben. SetzenSie danach eine For-Next-Schleife ein, um die einzelnen Verknüpfungen in dieneue Tabelle zu schreiben. In die erste Spalte erfolgt eine Numerierung der ein-

202

Page 203: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Verknüpfungen in Arbeitsmappen

zelnen Verknüpfungen. In Spalte B schreiben Sie die Namen und den dazugehö-rigen Pfad der verknüpften Arbeitsmappen.

Verknüpfungen ändern

Möchten Sie eine bestimmte Verknüpfung in der Arbeitsmappe ändern, dann kön-nen Sie die Methode ChangeLink einsetzen. Stellen Sie sich vor, Sie haben eineArbeitsmappe mit anderen Mappen aus einem bestimmten Verzeichnis verknüpft.In der Zwischenzeit haben Sie die verknüpften Arbeitsmappen in ein anderes Ver-zeichnis kopiert und diese dann abgeändert. Jetzt sollen die Verknüpfungen sogeändert werden, dass sie auf das neue Verzeichnis zeigen.

Ihre Aufgabe besteht nun darin, alle Verknüpfungen an das neue Verzeichnis anzu-passen. Das Makro für diese Aufgabe können Sie dem Listing 4.21 entnehmen.

Listing 4.21: Verknüpfungen ändern

Sub VerknüpfungÄndern()Dim Mappe As WorkbookDim VLink As VariantDim i As IntegerDim e As IntegerDim s As String

Set Mappe = ThisWorkbook

Abbildung 4.13: Alle verknüpften Arbeitsmappen wurden dokumen-tiert.

203

Page 204: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auf Arbeitsmappen zugreifen – Datei-Operationen

VLink = Mappe.LinkSources(xlExcelLinks)

If Not IsEmpty(VLink) Then For i = 1 To UBound(VLink) e = InStrRev(VLink(i), "\") + 1 s = Mid(VLink(i), e, 20) ThisWorkbook.ChangeLink VLink(i), _ "C:\Eigene Dateien\Excel\" & s, xlExcelLinks Next iEnd IfEnd Sub

Wie schon in Listing 4.20 definieren und füllen Sie ein Datenfeld mit den zur Zeitaktiven Verknüpfungen. In einer Schleife ändern Sie die Verknüpfungen. Für die-sen Zweck müssen Sie zuerst aus den Verknüpfungsadressen, die ja den komplet-ten Pfad beibehalten, den Namen der verknüpften Arbeitsmappe extrahieren.Diese Aufgabe können Sie mithilfe der Funktion InStrRev lösen, die die Positiondes letzten Zeichens \ ermittelt. Über die Funktion Mid können Sie jetzt gezieltden Namen der verknüpften Arbeitsmappe extrahieren. Wenden Sie danach dieMethode ChangeLink an, bei der Sie zuerst die momentane Verknüpfung angebenund dann die gewünschte Verknüpfung, die sich aus dem neuen Pfad und demNamen der ermittelten Arbeitsmappe ergibt.

Kontrollieren Sie das Ergebnis dieser Aktion, indem Sie aus dem Menü BEARBEI-TEN den Befehl VERKNÜPFUNGEN auswählen.

Abbildung 4.14: Die Verknüp-fungspfade wur-den angepasst.

204

Page 205: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

4.9 Fragen & Antworten

F Über welche Anweisung können Sie den Namen der aktiven Arbeitsmappe sowieden kompletten Speicherpfad am Bildschirm ausgeben?

A Die Anweisung lautet: Msgbox ActiveWorkbook.FullName.

F Wie kann man den Namen des Benutzers einer Arbeitsmappe ermitteln?

A Über die Anweisung Msgbox Application.UserName.

F Wie kann man den aktuell eingestellten Pfad ermitteln?

A Über die Anweisung MsgBox "Der aktuelle Pfad lautet: " & CurDir.

4.10 Quiz

F Wie kann man verhindern, dass beim Öffnen einer Arbeitsmappe die Verknüp-fungen zu anderen Arbeitsmappen aktualisiert werden?

F Was ist der Unterschied zwischen dem Befehl ActiveWorkbook und ThisWork-book?

F Wie kann man beim Schließen einer Arbeitsmappe dafür sorgen, dass Änderun-gen automatisch ohne weitere Rückfrage gespeichert werden?

F Wie kann man bei einer Neuanlage einer Arbeitsmappe die Anzahl der Tabellenbestimmen?

F Was muss man beachten, wenn man die Anweisung Kill einsetzt, um eineArbeitsmappe

4.11 Übung

Als abschließende Übung an diesem Tag sollen Sie folgende Aufgabe lösen:

Programmieren Sie ein Makro, welches alle Arbeitsmappen aus einem bestimm-ten Verzeichnis öffnet, das aktuelle Datum in Zelle A1 der ersten Tabelle schreibtund diese Arbeitsmappen speichert und schließt.

Die Lösung dieser Aufgabe finden Sie im Anhang A.

205

Page 206: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;
Page 207: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

5D

Tabellenblätter programmieren

Page 208: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Am gestrigen Tag haben Sie gelernt, wie Sie Arbeitsmappen anlegen, öffnen, spei-chern, schließen und löschen können. Darüber hinaus haben Sie auf die Doku-menteigenschaften von Arbeitsmappen zugegriffen sowie Verknüpfungen zuanderen Arbeitsmappen ausgelesen und geändert.

Die Themen heute:

� Tabellen anlegen und benennen

� Blatt-Typ bestimmen

� Tabellen entfernen

� Tabellen exportieren

� Tabellen importieren

� Tabellen ein- und ausblenden

� Tabellen gruppieren

� Tabellen schützen

� Tabellen sortieren

� Kopf- und Fußzeilen programmieren

Alle Makrobeispiele können Sie in der Arbeitsmappe Tabellen.xls imVerzeichnis Kap05 auf der beiliegenden CD-ROM nachschlagen.

5.1 Tabellen anlegen und benennen

In Excel können Sie standardmäßig bis zu 255 Tabellen pro Arbeitsmappe einfü-gen, wenn Sie diese Einstellung im Menü EXTRAS unter dem Befehl OPTIONENauf der Registerkarte ALLGEMEIN auswählen.

Über den Einsatz eines Makros können Sie diese standardmäßig gesetzte Ober-grenze aber locker sprengen. Im folgenden Makro fügen Sie 365 neue Tabellen-blätter in eine neue Arbeitsmappe ein. Die Benennung der Tabellen sollte gleichnach deren Einfügung erfolgen. Als Namen wählen Sie die Bezeichnung Tag 1,Tag 2 usw. bis zum Tag 365.

208

Page 209: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen anlegen und benennen

Listing 5.1: Tabellen einfügen und benennen

Sub TabellenEinfügen()Dim i As Integer

Workbooks.Add

For i = 1 To 365 Worksheets.Add ActiveSheet.Name = "Tag " & iNext iEnd Sub

Fügen Sie im ersten Schritt eine neue Arbeitsmappe über die Methode Add ein.Danach durchlaufen Sie eine Schleife genau 365 Mal. Innerhalb der Schleifewenden Sie die Methode Add an, um eine Tabelle einzufügen. Den Namen derjeweiligen Tabelle legen Sie fest, indem Sie der Eigenschaft Name das Wort Tagsowie die fortlaufende Variable i zuweisen.

Wie Sie sehen, wurden die neuen Tabellen immer zu Beginn der Arbeitsmappeeingefügt und dann mit jeder neuen Tabelle um eine Position nach hinten ver-schoben. So kommt es, dass die zuletzt eingefügte Tabelle am Beginn der Arbeits-mappe steht.

Um die zuerst eingefügte Tabelle auch am Beginn der Arbeitsmappe zu positionie-ren, geben Sie bei der Methode Add noch ein zusätzliches Argument an.

Abbildung 5.1: Tabellen einfügen und benennen

209

Page 210: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Listing 5.2: Tabellen einfügen und Reihenfolge beibehalten

Sub TabellenEinfügen02()Dim i As Integer

Workbooks.Add

For i = 1 To 365 Worksheets.Add Before:=Worksheets(Worksheets.Count) ActiveSheet.Name = "Tag " & iNext iWorksheets(1).ActivateEnd Sub

Das einzufügende Tabellenblatt wird jeweils am Ende der Arbeitsmappe einge-fügt. Für diesen Zweck müssen Sie mithilfe der Eigenschaft Count die Anzahl derTabellen der Arbeitsmappe zählen und dem Argument Before übergeben. Aktivie-ren Sie am Ende des Makros über die Methode Activate das erste Tabellenblattder Arbeitsmappe.

5.2 Blatt-Typ bestimmen

In Excel haben Sie die Möglichkeit, neben Tabellen auch Diagrammblätter, alteExcel-4-Makroblätter und Dialoge einzufügen. Dabei können alle Blätter über dieEigenschaft Sheets angesprochen werden. Möchten Sie ausschließlich auf Tabel-len zugreifen, dann setzen Sie wie in den ersten beiden Listings beschrieben dieEigenschaft Worksheets ein. Bestimmte Befehle in VBA können Sie nur auf Worksheets anwenden, andere haben auch Gültigkeit für andere Blätter. Von daher istes wichtig, genau zu wissen, was für eine Art von Blatt man gerade mit einemMakro anpackt.

Im folgenden Makro werden die Namen aller Tabellen sowie deren Typ imDirektfenster der Entwicklungsumgebung ausgegeben:

Listing 5.3: Blätter einer Arbeitsmappe identifizieren

Sub TabellenIdentifizieren()Dim i As Integer

For i = 1 To ThisWorkbook.Sheets.Count

210

Page 211: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Blatt-Typ bestimmen

Debug.Print Sheets(i).Name & " --> " & TypeName(Sheets(i))Next iEnd Sub

In einer Schleife durchlaufen Sie alle Tabellenblätter der Arbeitsmappe, in der Siedas Makro aus Listing 5.3 eingegeben haben (ThisWorkbook). Innerhalb derSchleife geben Sie mithilfe der Eigenschaft Name den Namen des Blattes über denBefehl Debug.Print im Direktbereich aus. Des Weiteren ermitteln Sie über dieFunktion TypeName, um welchen Blatt-Typ es sich dabei handelt. Es wird unter fol-genden Blatt-Typen unterschieden:

� WorkSheet = Tabellenblatt bzw. alte Makro-4-Vorlage

� Chart = Diagrammblatt

� DialogSheet = Microsoft-Excel-5.0-Dialog

Kontrollieren Sie das Ergebnis von Listing 5.3, indem Sie in die Entwicklungsumge-bung wechseln und aus dem Menü ANSICHT den Befehl DIREKTFENSTER wählen.

In einer Arbeitsmappe soll auf jedem Tabellenblatt in Zelle A1 das heutige Datumerfasst werden. Um diese Aufgabe zu lösen, gibt es zwei Lösungsansätze:

� Entweder Sie springen ganz gezielt nur die Tabellenblätter der Arbeitsmappe an

� oder Sie prüfen vorher, um welchen Typ eine Blattes es sich handelt.

Beide Varianten werden nun realisiert.

Abbildung 5.2: Die Blatt-Typen einer Arbeitsmappe im Direkt-fenster ausgeben

211

Page 212: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Tabellenblätter füllen

Im folgenden Makro in Listing 5.4 werden alle Tabellenblätter einer Arbeitsmappein einer Schleife nacheinander abgearbeitet:

Listing 5.4: Das aktuelle Datum in allen Tabellenblättern eintragen

Sub TabellenblätterEditieren()Dim Tabelle As Worksheet

For Each Tabelle In ThisWorkbook.Worksheets Tabelle.Range("A1").Value = DateNext Tabelle

End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. Damitkönnen nur reine Tabellenblätter angesprochen werden. In einer darauf folgendenSchleife füllen Sie jeweils die Zelle A1 in allen Tabellenblättern mit dem aktuel-len Tagesdatum.

Blattprüfung vor Füllung vornehmen

Im folgenden Makro prüfen Sie vor jedem Einfügen des aktuellen Datums, ob essich dabei wirklich um eine Tabelle handelt:

Listing 5.5: Tabellenblätter überprüfen

Sub TabellenblätterPrüfen()Dim i As Integer

For i = 1 To ThisWorkbook.Sheets.Count Sheets(i).Select If TypeName(Sheets(i)) = "Worksheet" Then _ Sheets(i).Range("A1").Value = DateNext i

End Sub

212

Page 213: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen entfernen

Ermitteln Sie über die Anweisung ThisWorkbook.Sheets.Count, wie viele Blätter inder Arbeitsmappe sind. Diese Anzahl bildet auch das Endkriterium für IhreSchleife. Innerhalb der Schleife fügen Sie über die Funktion Date das aktuelleTagesdatum in Zelle A1 ein.

5.3 Tabellen entfernen

Um Tabellen aus einer Arbeitsmappe zu entfernen, setzen Sie die Methode Deleteein, welche Sie auf das Auflistungsobjekt Sheets anwenden.

Tabelle nach Rückfrage löschen

Im folgenden Beispiel soll die TABELLE1 aus Ihrer Arbeitsmappe entfernt werden.Das Makro für diesen Zweck lautet:

Listing 5.6: Eine Tabelle löschen

Sub TabelleEntfernen() Sheets("Tabelle1").DeleteEnd Sub

Wenn Sie das Makro aus Listing 5.6 starten, werden Sie von Excel gefragt, ob Siediese Aktion wirklich durchführen möchten.

Rückfrage bei Tabellenlöschung unterdrücken

Möchten Sie die Rückfrage unterdrücken, um die gewünschte Tabelle ohne wei-tere Rückfrage zu löschen, dann erweitern Sie das Makro aus Listing 5.6 wie folgt:

Abbildung 5.3: Die Löschen-Rückfrage beant-worten

213

Page 214: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Listing 5.7: Eine Tabelle ohne Rückfrage löschen

Sub TabelleEntfernenBesser() Application.DisplayAlerts = False Sheets("Tabelle1").Delete Application.DisplayAlerts = TrueEnd Sub

Setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um die Standard-meldungen in Excel kurzfristig auszuschalten. Führen Sie dann die MethodeDelete aus, um die gewünschte Tabelle zu entfernen. Setzen Sie danach dieEigenschaft DisplayAlerts auf den Wert True, um Standardmeldungen in Excelwieder zuzulassen.

Eigene Rückfrage programmieren

Möchten Sie neben der Standardmeldung von Excel eine eigene Meldung beimVersuch, eine Tabelle zu entfernen, anzeigen, dann können Sie dies über denEinsatz eines Meldungsfensters tun. Dabei erfassen Sie folgenden Quellcode ausListing 5.8:

Listing 5.8: Eine eigene Löschmeldung anzeigen

Sub TabelleEntfernenEigeneMeldung()Dim i As Integer

i = MsgBox("Möchten Sie wirklich die Tabelle löschen?", _ vbYesNo + vbQuestion, "Tabelle löschen")

If i = 6 Then Sheets("Tabelle1").DeleteEnd Sub

Die Funktion MsgBox können Sie einsetzen, um vom Anwender durch das Klickenvon Schaltflächen eine Entscheidung zu bekommen. Klickt der Anwender auf dieSchaltfläche JA, dann können Sie dies über den Wert 6 erkennen, der in der Vari-ablen i steht. In diesem Fall wenden Sie die Methode Delete an, um die Tabellezu entfernen.

214

Page 215: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen entfernen

Vor dem Löschen prüfen

Die letzten drei Listings haben noch einen kleinen Schönheitsfehler. Was istdenn, wenn Sie versuchen, eine Tabelle zu entfernen, die es gar nicht mehr in derArbeitsmappe gibt, weil sie bereits gelöscht oder der Name der Tabelle nicht kor-rekt angegeben wurde? In diesem Fall stürzt das Makro mit folgender Fehlermel-dung ab, die Sie nachvollziehen können, wenn Sie Listing 5.7 zweimalhintereinander ausführen.

Eine solche Fehlermeldung sollte vermieden werden. Prüfen Sie daher vor demLöschen einer Tabelle, ob die zu löschende Tabelle überhaupt in der Arbeits-mappe vorhanden ist. Wie das funktioniert, verrät Ihnen Listing 5.9:

Listing 5.9: Erst nach einer Überprüfung die Tabelle löschen

Function TabelleDa(s As String) As Boolean On Error Resume Next TabelleDa = Worksheets(s).SelectEnd Function

Abbildung 5.4: Eine Möglichkeit, eine Aktion noch einmal abzubrechen

Abbildung 5.5: Der Versuch, eine nicht existente Tabelle zu ent-fernen, scheitert.

215

Page 216: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Sub LöschenTabelleNachPrüfung()Dim s As StringDim b As Boolean

s = "Tabelle1"b = TabelleDa(s)

If b = True Then Application.DisplayAlerts = False Sheets(s).Delete Application.DisplayAlerts = TrueElse MsgBox (s & " konnte nicht gefunden werden!")End IfEnd Sub

Wir verwenden eine Funktion, die überprüft, ob die übergebene Tabelle auchwirklich in der Arbeitsmappe existiert. Sie übergeben der Funktion TabelleDa denNamen der zu prüfenden Tabelle. Die Funktion ihrerseits prüft, ob sie eineTabelle mit dem Namen selektieren kann. Wenn nicht, wird die Variable den WertFalse an das Makro LöschenTabelleNachPrüfung zurückgeben. In diesem Fall wirdder Anwender über eine Bildschirmmeldung darauf aufmerksam gemacht. Ist dieFunktion in der Lage, das übergebene Tabellenblatt zu selektieren, gibt sie demMakro den Wert True zurück. In diesem Fall können Sie die Standardmeldungentemporär abschalten, die Tabelle löschen und danach die Standardmeldungen wie-der zulassen.

5.4 Tabellen exportieren

In manchen Fällen muss eine Tabelle in ein anderes Format bzw. in eine andereoder neue Arbeitsmappe überführt werden.

Tabelle als Textdatei exportieren

Im ersten Export-Beispiel soll folgende Tabelle in eine Textdatei überführt wer-den. Als Trennzeichen der einzelnen Spalten wird hierbei das Semikolon einge-setzt.

216

Page 217: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen exportieren

Erfassen Sie jetzt folgendes Makro, um diese Liste in einer Textdatei auszugeben:

Listing 5.10: Eine Tabelle in eine Textdatei transferieren

Sub TabelleAlsTextExportieren()Dim Bereich As RangeDim Zeile As RangeDim Zelle As RangeDim s As String

Sheets("Tabelle2").Activate Set Bereich = ActiveSheet.UsedRange Open "c:\Eigene Dateien\Liste.txt" For Output As #1 For Each Zeile In Bereich.Rows For Each Zelle In Zeile.Cells s = s & Zelle.Text & ";" Next s = Left(s, Len(s) - 1) Print #1, s s = "" Next Close #1 End Sub

Aktivieren Sie zuerst einmal die Tabelle, welche die zu exportierenden Daten ent-hält. Danach ermitteln Sie den verwendeten Bereich der Tabelle, den Sie über dieEigenschaft UsedRange ermitteln können. Legen Sie danach eine Textdatei an,

Abbildung 5.6: Die zu exportie-rende Tabelle

217

Page 218: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

indem Sie die Methode Open anwenden. Dabei muss die so aktivierte Textdateikeinesfalls schon vorhanden sein. Excel legt diese selbstständig an. Setzen Siedaraufhin eine Schleife auf, die Zeile für Zeile die Liste abarbeitet. In einer weite-ren Schleife arbeiten Sie die Zellen von links nach rechts innerhalb einer Zeile abund speichern Sie in der Variablen s. Fügen Sie nach jeder Zelle, die Sie auf dieseWeise abarbeiten, als Trennzeichen das Semikolon ein. Bevor Sie die Zeile kom-plett in die Textdatei schreiben, müssen Sie das letzte Semikolon wieder entfer-nen. Dazu setzen Sie die Funktion Left ein, die eine bestimmte Anzahl vonZeichen von links überträgt. Da das letzte Semikolon entfernt werden soll, könnenSie von der Gesamtlänge der Variablen, die Sie über die Funktion Len ermittelnkönnen, den Wert 1 subtrahieren. Schließen Sie am Ende des Makros die Textda-tei mithilfe der Methode Close.

Tabelle in eine neue Arbeitsmappe kopieren

Im nächsten Beispiel soll dieselbe Tabelle in eine neue Arbeitsmappe kopiert wer-den. Das Makro für diese Aufgabe sehen Sie in Listing 5.11.

Listing 5.11: Tabelle in neue Arbeitsmappe kopieren

Sub TabelleInNeueArbeitsmappeKopieren()Dim Mappe As WorkbookDim Tabelle As Worksheet

Set Tabelle = ThisWorkbook.Sheets("Tabelle2")Set Mappe = Workbooks.Add

Tabelle.Copy Before:=Mappe.Worksheets(Worksheets.Count)End Sub

Abbildung 5.7: Die Tabelle wurde in eine Textdatei exportiert.

218

Page 219: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen exportieren

Deklarieren Sie zu Beginn des Makros zwei Objektvariablen vom Typ Workbookund Worksheet. Danach geben Sie über die Anweisung Set bekannt, welcheTabelle Sie später in eine neue Arbeitsmappe kopieren möchten. Legen Sie imnächsten Schritt eine neue Arbeitsmappe an und weisen Sie diese gleich derObjektvariablen zu. Danach können Sie mithilfe der Methode Copy die Tabellekopieren und in die neue Arbeitsmappe einfügen.

Tabelle in neue Arbeitsmappe übertragen

Möchten Sie eine Tabelle aus Ihrer ursprünglichen Arbeitsmappe herausnehmenund in einer neuen Arbeitsmappe ablegen, dann können Sie das Makro aus Listing5.11 aufgreifen und eine Stelle ändern.

Listing 5.12: Tabelle in neue Arbeitsmappe übertragen

Sub TabelleInNeueArbeitsmappeTransferieren()Dim Mappe As WorkbookDim Tabelle As Worksheet

Set Tabelle = ThisWorkbook.Sheets("Tabelle2")Set Mappe = Workbooks.Add

Tabelle.Move Before:=Mappe.Worksheets(Worksheets.Count)End Sub

Deklarieren Sie zu Beginn des Makros zwei Objektvariablen vom Typ Workbookund Worksheet. Danach geben Sie über die Anweisung Set bekannt, welcheTabelle Sie später in eine neue Arbeitsmappe übertragen möchten. Legen Sie imnächsten Schritt eine neue Arbeitsmappe an und weisen Sie diese gleich der

Abbildung 5.8: Die Tabelle wurde in eine neue Arbeitsmappe kopiert.

219

Page 220: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Objektvariablen zu. Danach können Sie mithilfe der Methode Move die Tabelleausschneiden und in die neue Arbeitsmappe einfügen.

Tabelle in andere Arbeitsmappe kopieren/übertragen

Soll das Ziel für die Tabelle keine neue, sondern eine bereits bestehende Arbeits-mappe sein, dann starten Sie das Makro aus Listing 5.13.

Listing 5.13: Eine Tabelle in eine bereits bestehende Arbeitsmappe kopieren/übertragen

Sub TabelleInAndereArbeitsmappeTransferieren()Dim Mappe As WorkbookDim Tabelle As WorksheetConst LW = "C:\"Const Pfad = "C:\Eigene Dateien"

ChDrive LWChDir Pfad

Set Tabelle = ThisWorkbook.Sheets("Tabelle2")Set Mappe = Workbooks.Open("Mappe1.xls")

Tabelle.Copy Before:=Mappe.Worksheets(Worksheets.Count)'Tabelle.Move Before:=Mappe.Worksheets(Worksheets.Count)End Sub

Deklarieren Sie zu Beginn des Makros zwei Objektvariablen vom Typ Workbookund Worksheet. Außerdem geben Sie in zwei Konstanten bekannt, wo sich dieZielarbeitsmappe befindet. Danach geben Sie über die Anweisung Set bekannt,welche Tabelle Sie später in eine neue Arbeitsmappe übertragen möchten. Imnächsten Schritt öffnen Sie die Arbeitsmappe, welche die Tabelle erhalten soll,und weisen diese Arbeitsmappe gleich der Objektvariablen Mappe zu. Danach kön-nen Sie mithilfe der Methode Move bzw. Copy die Tabelle ausschneiden/kopierenund in die neue Arbeitsmappe einfügen.

220

Page 221: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen importieren

5.5 Tabellen importieren

Selbstverständlich können Sie neben dem Export von Tabellen auch Textdateienin Excel einlesen.

Textdatei-Import mit festen Datenfeldern

Im nachstehenden Beispiel haben Sie eine Textdatei mit festen Datenfeldern nachfolgendem Aufbau zusammengestellt:

� Kostenstelle (Position 1 bis 4)

� Personal-Nr (Position 5 bis 10)

� Name (Position 11 bis 36)

� Abteilung (ab Position 37)

Sie haben in der Textdatei namens PersonalListe.txt einige Daten erfasst undmöchten diese nun in Excel über ein VBA-Makro einlesen. Wie das genau ausse-hen könnte, sehen Sie in diesem Makro:

Listing 5.14: Eine Textdatei in Excel einlesen

Sub TextdateiImportieren()Workbooks.OpenText Filename:= _ "C:\Eigene Dateien\PersonalListe.txt", _ DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(5, 1), _

Abbildung 5.9: Die Textdatei zum Einlesen in Excel

221

Page 222: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Array(11, 1), Array(37, 1)), _ StartRow:=2

Columns("A:A").ColumnWidth = 6Columns("B:B").ColumnWidth = 7Columns("C:C").ColumnWidth = 30Columns("D:D").ColumnWidth = 20End Sub

Um eine Textdatei in Excel einzulesen, verwenden Sie die Methode OpenText. Imersten Argument dieser Methode müssen Sie angeben, wo sich die einzulesendeTextdatei befindet und wie diese heißt. Im Argument DataType geben Sie an, ob essich um eine Textdatei mit immer gleich langen Feldern handelt (XlFixedWidth)oder ob ein Trennzeichen zwischen den einzelnen Feldern verwendet wird (XlDe-mimited). In unserem ersten Beispiel wird eine konstante Feldlänge für die einzel-nen Informationen verwendet.

Im Argument FieldInfo geben Sie dann die genaue Startposition sowie denDatentyp des einzelnen Feldes an. Dabei müssen Sie zwei Argumente angeben.Im ersten Feld geben Sie die genaue Spaltennummer, an dem das Datenfeldbeginnt, an. Im zweiten Argument legen Sie den Datentyp über eine Konstanteoder Index fest. Entnehmen Sie der folgenden Tabelle die dafür verwendbarenKonstanten bzw. Indexe.

Index Konstante Bedeutung

0 xlGeneralFormat Allgemein

1 xlTextFormat Text

2 xlMDYFormat MDY date

3 xlDMYFormat DMY date

4 xlYMDFormat YMD date

5 xlMYDFormat MYD date

6 xlDYMFormat DYM date

7 xlYDMFormat YDM date

Tabelle 5.1: Die Konstanten des Arguments FieldInfo

222

Page 223: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen importieren

Im Argument StartRow können Sie bestimmen, ab welcher Zeile in der Textdateider Import beginnen soll. Da Sie in unserem Beispiel eine Überschriftenzeilehaben, die Sie nicht unbedingt in der Excel-Tabelle haben möchten, setzen Siedieses Argument auf den Wert 2.

Diese Argumente reichen aus, um die Textdatei erfolgreich in eine Excel-Tabelleeinzulesen. Im letzten Schritt des Makros sorgen Sie dafür, dass die Breiten dereinzelnen Spalten ausreichen und dass alle Daten in der Tabelle vollständig ange-zeigt werden können. Für diese Aufgabe setzen Sie die Eigenschaft ColumnWidthein, bei der Sie die exakte Spaltenbreite angeben.

Möchten Sie die Spaltenbreiteneinstellung Excel überlassen, könnenSie die Methode AutoFit einsetzen. Die Anweisung dafür lautet:

ActiveSheet.Columns("A:D").AutoFit

Im folgenden, etwas abgewandelten Beispiel sollen aus der Textdatei Personal-Liste.txt nur die Spalten PERSONAL-NR sowie der Name des Mitarbeiters in eineTabelle eingelesen werden. Das Makro für die Lösung dieser Aufgabenstellungkönnen Sie in Listing 5.15 sehen.

8 xlEMDFormat EMD date

9 xlSkipColumn Spalte überspringen

Abbildung 5.10: Die Textdatei wur-de erfolgreich in Excel eingelesen.

Index Konstante Bedeutung

Tabelle 5.1: Die Konstanten des Arguments FieldInfo (Forts.)

223

Page 224: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Listing 5.15: Nur bestimmte Spalten aus der Textdatei einlesen

Sub TextdateiImportierenNichtAlles()Workbooks.OpenText Filename:= _ "C:\Eigene Dateien\PersonalListe.txt", _ DataType:=xlFixedWidth, _ FieldInfo:=Array (Array(0, 9), Array(5, 1), _ Array(11, 1), Array(37, 9)), _ StartRow:=2

ActiveSheet.Columns("A:D").AutoFitEnd Sub

Für das bedingte Einlesen einer Textdatei setzen Sie das Argument FieldInfo imzweiten Argument für die Spalten, die Sie nicht einlesen möchten, auf den Wert 9.Wenden Sie am Ende des Makros aus Listing 5.15 die Methode AutoFit ein, damitExcel die automatische Spaltenanpassung vornimmt.

Textdatei-Import mit variablen Datenfeldern

Viele Textdateien haben aber auch variable Satzlängen, d.h. die einzelnen Felderhaben nicht gleich lange Feldlängen, sondern können X- bis Y-Zeichen aufweisen.Bei diesen Textdateien wird das Ende eines Feldes über ein Trennzeichenbestimmt. Meistens ist dies das Semikolon, welches die einzelnen Felder vonei-nander abtrennt. Schauen Sie sich zur besseren Verständlichkeit die Abbildung5.12 an.

Abbildung 5.11: Nur bestimmte Datenfelder aus der Textdatei wur-den eingelesen.

224

Page 225: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen importieren

Bei der Textdatei PersonalListe2.txt wird das Semikolon als Trennzeichen der ein-zelnen Felder verwendet. Möchten Sie diese Textdatei in eine Excel-Tabelle ein-lesen, dann setzen Sie das Makro aus Listing 5.16 ein:

Listing 5.16: Einlesen einer Textdatei mit variabler Satzlänge

Sub TextdateiImportierenVariableSL()Workbooks.OpenText _ Filename:="C:\Eigene Dateien\PersonalListe2.txt", _ DataType:=xlDelimited, Semicolon:=True, _ StartRow:=2

ActiveSheet.Columns("A:D").AutoFitEnd Sub

Um eine Textdatei mit variabler Satzlänge einzulesen, müssen Sie bei derMethode OpenText im Argument DataType die Konstante XlDelimited angeben.Danach müssen Sie bekannt geben, dass Sie mit dem Semikolon als Trennzeichenarbeiten möchten, indem Sie das Argument Semicolon auf den Wert True setzen.

Weitere Trennzeichen sind der Tabulator (Tab:=True), das Komma(Comma:=True) oder das Leerzeichen (Space:=True).

Sollte keines der standardmäßig angebotenen Trennzeichen mit Ihrer Textdateiübereinstimmen, wie in Abbildung 5.13 angezeigt, dann müssen Sie das Makroaus Listing 5.16 etwas abändern.

Abbildung 5.12: Eine Textdatei mit variabler Satzlänge

225

Page 226: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Die Textdatei PersonalListe3.txt soll nun in eine Excel-Tabelle importiert werden.Das dazu notwendige Makro können Sie in Listing 5.17 einsehen:

Listing 5.17: Eine Textdatei mit alternativem Trennzeichen wird eingelesen

Sub TextdateiImportierenVariableSL_Var02()Workbooks.OpenText _ Filename:="C:\Eigene Dateien\PersonalListe3.txt", _ DataType:=xlDelimited, Other:=True, _ OtherChar:="*", StartRow:=2

ActiveSheet.Columns("A:D").AutoFitEnd Sub

Wird ein nicht standardmäßig angebotenes Trennzeichen für eine Textdatei ein-gesetzt, dann setzen Sie das Argument Other auf den Wert True und geben imArgument OtherChar das Trennzeichen, welches Sie verwenden, in doppeltenHochkommata ein.

5.6 Tabellen ein- und ausblenden

Um mehr Ordnung in Ihre Arbeitsmappen zu bringen, können Sie selten benö-tigte Tabellen auch ausblenden und bei Bedarf wieder einblenden.

Abbildung 5.13: Hier wurde das Trennzeichen * verwendet.

226

Page 227: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen ein- und ausblenden

Einfaches Aus- und Einblenden einer Tabelle

Das Ein- und Ausblenden von Tabellenblättern erzielen Sie mit der EigenschaftVisible. Setzen Sie diese Eigenschaft auf den Wert False, um eine Tabelle auszu-blenden.

Im folgenden Beispiel blenden Sie die TABELLE1 aus:

Listing 5.18: Eine Tabelle ausblenden

Sub TabelleAusblenden()On Error GoTo fehlerSheets("Tabelle1").Visible = FalseExit Sub

fehler:MsgBox "Die Tabelle ist nicht vorhanden!", vbCritical + vbOKOnlyEnd Sub

Beim Ausblenden einer Tabelle sollten Sie eine Sicherheitsfunktion einbauen, diefolgenden Fall berücksichtigt:

Was passiert, wenn versucht wird, eine Tabelle auszublenden, die in der Arbeits-mappe gar nicht vorhanden ist?

In diesem Fall würde ein Makro ohne Fehlerbehandlungsfunktion abstürzen. Set-zen Sie daher die Anweisung On Error goTo Fehler ein, um im Fehlerfall direkt inden Paragrafen fehler zu springen. Dort geben Sie eine Meldung aus.

Abbildung 5.14: Auch die Textda-tei mit »anderem« Trennzeichen konnte erfolgreich eingelesen werden.

227

Page 228: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Verläuft das Ausblenden einer Tabelle erfolgreich, dann müssen Sie mithilfe derAnweisung Exit Sub dafür sorgen, dass der Fehlerparagraf nicht ausgeführt wird.Mit dieser Anweisung beenden Sie das Makro auf direktem Weg.

Nachdem Sie das Makro TabelleAusblenden ausgeführt haben, wird dieTabelle in der Arbeitsmappe nicht mehr angezeigt. Der Anwender kannaber jederzeit über den Befehl BLATT/EINBLENDEN aus dem MenüFORMAT die ausgeblendeten Tabellenblätter wieder verfügbar machen.

Möchten Sie die Tabelle wieder einblenden, starten Sie das folgende Makro:

Listing 5.19: Eine Tabelle wieder einblenden

Sub TabelleEinblenden()On Error GoTo fehlerSheets("Tabelle1").Visible = TrueExit Sub

fehler:MsgBox "Die Tabelle ist nicht vorhanden!", vbCritical + vbOKOnlyEnd Sub

Setzen Sie die Eigenschaft Visible wieder auf den Wert True, um die Tabelle ein-zublenden. Fangen Sie auch hier den Fehlerfall über die On Error-Anweisung ab.

Mehrere Tabellen ausblenden

Da es manuell nicht möglich ist, mehrere Tabellen gleichzeitig aus- bzw. einzu-blenden, ist bei dieser Aufgabenstellung ein Makro eine feine Sache.

Im folgenden Beispiel sollen alle Tabellen mit Ausnahme der Tabelle INHALT aus-geblendet werden. Den Quellcode für diese Aufgabe können Sie in Listing 5.20sehen.

Listing 5.20: Alle Tabellen bis auf eine ausblenden

Sub TabellenAusblenden()Dim i As Integer

For i = 1 To ThisWorkbook.Sheets.Count If Sheets(i).Name <> "Inhalt" Then Sheets(i).Visible = False

228

Page 229: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen ein- und ausblenden

Next iEnd Sub

Setzen Sie eine Schleife auf, die sooft durchlaufen wird, bis alle Blätter der Arbeits-mappe durchlaufen worden sind. Dazu ermitteln Sie über die Eigenschaft Count,die Sie auf das Auflistungsobjekt Sheets anwenden, die Anzahl der Blätter in derArbeitsmappe.

Innerhalb der Schleife prüfen Sie mithilfe der Eigenschaft Name, ob der Name deseinzelnen Blattes mit der Tabelle INHALT übereinstimmt. Wenn nicht, blendenSie die Tabelle aus, indem Sie die Eigenschaft Visible auf den Wert False setzen.

Alle so ausgeblendeten Blätter können Sie jederzeit wieder verfügbar machen,indem Sie aus dem Menü FORMAT den Befehl BLATT/EINBLENDEN wählen. Dadies nicht immer im Sinn des Programmierers ist, können Sie die einzelnen Blät-ter auch so ausblenden, dass sie über die Standardoberfläche nicht mehr einge-blendet werden können.

Das sichere Ausblenden von Blättern

Um Blätter einer Arbeitsmappe auf die »sichere« Methode auszublenden, damitdiese vom Anwender über die Standardoberfläche von Excel nicht mehr einge-blendet werden können, starten Sie das Makro aus Listing 5.21.

Abbildung 5.15: Alle Tabellen bis auf die Tabelle Inhalt wurden ausgeblendet.

229

Page 230: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Listing 5.21: Blätter sicher bis auf das letzte ausblenden

Sub TabellenAusblendenSicher()Dim i As Integer

For i = 1 To ThisWorkbook.Sheets.Count If Sheets(i).Name <> "Inhalt" Then Sheets(i).Visible = xlVeryHiddenNext iEnd Sub

Übergeben Sie der Eigenschaft Visible die Konstante xlVeryHidden, um die Blät-ter sicher auszublenden. Wenn Sie jetzt versuchen, die so ausgeblendeten Blätterüber den Menübefehl FORMAT/BLATT/EINBLENDEN wieder verfügbar zu machen,stellen Sie fest, dass dieser Menübefehl deaktiviert ist und überhaupt nicht ausge-wählt werden kann.

Blätter wieder einblenden

Egal, wie Sie Ihre Blätter ausgeblendet haben, sei es auf normale oder sichereWeise, können Sie Ihre Blätter wieder einblenden, indem Sie das Makro aus Lis-ting 5.22 starten:

Abbildung 5.16: Es gibt keine Möglichkeit, über die Standardober-fläche sicher aus-geblendete Blätter wieder verfügbar zu machen.

230

Page 231: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen gruppieren

Listing 5.22: Alle versteckten Blätter wieder einblenden

Sub TabellenEinblenden()Dim i As Integer

For i = 1 To ThisWorkbook.Sheets.Count Sheets(i).Visible = TrueNext iEnd Sub

In einer Schleife durchlaufen Sie alle Blätter der Arbeitsmappe und setzen dieEigenschaft Visible auf den Wert True, um die ausgeblendeten Blätter wieder ein-zublenden.

5.7 Tabellen gruppieren

In Excel haben Sie die Möglichkeit, Ihre Arbeit an einem Tabellenblatt automa-tisch auch für andere Tabellenblätter, ähnlich einer Blaupause, gültig zu machen.Dazu gruppieren Sie die einzelnen Tabellenblätter. Manuell klappt das, indemSie die (Strg)-Taste gedrückt halten und die einzelnen Tabellenregister mit derlinken Maustaste anklicken.

Abbildung 5.17: Alle Blätter sind nun wieder verfügbar.

231

Page 232: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Einfaches Gruppieren

In der folgenden Aufgabe sollen einige Tabellen einer Arbeitsmappe gruppiertwerden. Das Makro dafür sieht so aus:

Listing 5.23: Bestimmte Tabellen gruppieren

Sub MehrereTabellenblätterMarkieren()On Error GoTo fehler Sheets(Array("Tabelle1", "Tabelle2", _ "Tabelle3")).SelectExit Sub

fehler:MsgBox "Es ist ein Fehler beim Gruppieren aufgetreten!"End Sub

Die Funktion Array ermöglicht es Ihnen, eine durch Kommata getrennte Liste vonWerten (hier Tabellennamen) anzugeben.

Sorgen Sie auch hier wieder für die On Error-Anweisung, um eine Fehlermeldungzu vermeiden, falls eines der Tabellenblätter nicht vorhanden ist.

Übrigens können Sie anstatt der Namen der einzelnen Tabellen auch Indexwerteangeben. Der Index 1 entspricht dabei dem Tabellenblatt, das ganz vorne in derArbeitsmappe steht. Die Indexwerte 2 und 3 repräsentieren die Tabellen, die dann

Abbildung 5.18: Gruppieren von mehreren Tabel-lenblättern

232

Page 233: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen gruppieren

von links nach rechts folgen. Achten Sie jedoch darauf, dass das Ergebnis ein ande-res sein kann als erwartet.

Listing 5.24: Tabellen über ihren Index gruppieren

Sub MehrereTabellenblätterMarkieren02()On Error GoTo fehler Sheets(Array(1, 2, 3)).SelectExit Sub

fehler:MsgBox "Es ist ein Fehler beim Gruppieren aufgetreten!"End Sub

Im Gegensatz zu Abbildung 5.18 wurden in Abbildung 5.19 die ersten drei Tabel-len der Arbeitsmappe gruppiert.

Die Gruppierung können Sie wieder aufheben, indem Sie auf einenTabellenreiter klicken, der nicht in der Gruppierung enthalten ist.

Abbildung 5.19: Gruppieren der ersten drei Tabellen

233

Page 234: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Komplexeres Gruppieren

Etwas aufwändiger wird es, wenn Sie nur bestimmte Tabellen bzw. auch alleTabellen einer Arbeitsmappe gruppieren möchten. Die Lösung für das Gruppie-ren aller Tabellenblätter einer Arbeitsmappe muss beispielsweise dynamisch sein,d.h. wenn einzelne Tabellen neu hinzukommen bzw. Tabellen umbenannt wer-den, muss die folgende Lösung in Listing 5.25 noch funktionieren. Des Weiterensollen selbstverständlich keine Diagramm- oder alte Makro4-Tabellenblätter mit indie Gruppierung aufgenommen werden.

Listing 5.25: Alle Tabellen einer Mappe gruppieren

Sub AlleTabellenBlätterGruppieren()Dim i As IntegerDim i2 As IntegerDim TabArray() As Integer

i = ThisWorkbook.Worksheets.Count ReDim TabArray(1 To i) For i2 = 1 To i TabArray(i2) = i2 Next i2

ThisWorkbook.Worksheets(TabArray).SelectEnd Sub

Da Sie zu Beginn noch nicht exakt wissen, wie groß das Datenfeld TabArray wer-den soll, müssen Sie es ganz allgemein mit dem Datentyp Integer deklarieren.Danach ermitteln Sie über die Eigenschaft Count, die Sie auf die Auflistung Worksheets anwenden, die Anzahl der in der Arbeitsmappe befindlichen Tabellenblät-ter. Jetzt wissen Sie genau, wie groß Sie das Datenfeld TabArray definieren müssen.Dies erreichen Sie über die Anweisung ReDim.

Füllen Sie das Datenfeld im Anschluss daran über eine Schleife, in der Sie jedeseinzelne Feld des Datenfelds bestücken. Markieren Sie im Anschluss daran die sogesammelten Tabellenblätter mithilfe der Methode Select.

234

Page 235: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen schützen

5.8 Tabellen schützen

Seit der Excel-Version 2002 haben Sie die Möglichkeit, Tabellen zwar zu schüt-zen, jedoch bestimmte Aktionen wie das Sortieren von Daten, den AutoFilter undsonstige Dinge trotzdem noch zuzulassen. In den vorherigen Versionen von Excelwaren nach dem Anbringen eines Tabellenschutzes bestimmte Aktionen generellüberhaupt nicht mehr möglich.

Den Tabellenschutz stellen Sie über die Methode Protect her. Die Syntax dieserMethode lautet dabei:

ActiveSheet.Protect _(Password, DrawingObjects, Contents, _ Scenarios, UserInterfaceOnly)

Im Argument Passwort geben Sie das Kennwort für das Blatt oder die Arbeits-mappe an. Wenn Sie dieses Argument weglassen, kann der Schutz des Blattes oderder Arbeitsmappe ohne Angabe eines Kennworts aufgehoben werden.

Mit dem Argument DrawingObjects bestimmen Sie, ob Sie zusätzlich zu IhrenZellen auch noch Formen, wie z.B. Blockpfeile, Sterne oder Banner, schützenmöchten. Diese Formen werden standardmäßig jedoch nicht geschützt. Wenn SieFormen schützen möchten, setzen Sie das Argument auf den Wert True.

Beim Argument Contents, welches standardmäßig auf True gesetzt ist, werden dieZellen eines Tabellenblattes geschützt.

Abbildung 5.20: Alle Tabellenblät-ter wurden grup-piert.

235

Page 236: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Das Argument Scenarios gilt nur für Arbeitsblätter und bedeutet, dass bestimmteAnsichten und Einstellungen, wie z.B. das eingestellte Zoom, geschützt werden.Die Standardeinstellung ist dabei ebenfalls True.

Das letzte Argument UserInterFaceOnly gibt über den Wert True an, dass dieBenutzeroberfläche, jedoch keine Makros geschützt werden.

Ab der Excel-Version 2002 gibt es folgende zusätzliche Argumente, die den Tabel-lenschutz geradezu revolutionieren:

� AllowFormattingCells: Setzen Sie dieses Argument auf den Wert True, wennSie die Formatierung in geschützten Zellen zulassen möchten.

� AllowFormattingColumns: Bei dieser Einstellung darf der Benutzer Spalten for-matieren, sofern dieses Argument auf den Wert True gesetzt wird.

� AllowFormattingRows: Bei dieser Einstellung darf der Benutzer Zeilen forma-tieren, sofern dieses Argument auf den Wert True gesetzt wird.

� AllowInsertingRows: Setzen Sie dieses Argument auf den Wert True, wenn Siezulassen möchten, dass der Benutzer neue Zeilen in eine geschützte Tabelleeinfügen darf.

� AllowInsertingHyperlinks: Um das Einfügen von Hyperlinks in geschütztenTabellen zuzulassen, setzen Sie dieses Argument auf den Wert True.

� AllowDeletingColumns: Möchten Sie zulassen, dass in einer geschütztenTabelle Spalten gelöscht werden dürfen, dann setzen Sie dieses Argument aufden Wert True.

� AllowDeletingRows: Möchten Sie zulassen, dass in einer geschützten TabelleZeilen gelöscht werden dürfen, dann setzen Sie dieses Argument auf den WertTrue.

� AllowSorting: Setzen Sie dieses Argument auf den Wert True, um eine Sortie-rung des geschützten Arbeitsblattes zu ermöglichen. Für jede Zelle im Sortier-bereich muss die Sperre oder der Schutz aufgehoben werden.

� AllowFiltering: Setzen Sie dieses Argument auf den Wert True, um zuermöglichen, Filter für das geschützte Arbeitsblatt festzulegen. Die Benutzerkönnen Filterkriterien ändern, jedoch keinen AutoFilter aktivieren oder deakti-vieren.

236

Page 237: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen schützen

� AllowUsingPivotTables: Setzen Sie dieses Argument auf den Wert True, um esdem Benutzer zu ermöglichen, auf einer geschützten Tabelle mit Pivot-Tabel-len zu arbeiten.

Im folgenden Beispiel wird TABELLE1 mit dem Kennwort HERO geschützt.

Listing 5.26: Die Tabelle1 wird geschützt.

Sub TabelleSchützen() Sheets("Tabelle1").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=TrueEnd Sub

Wenn Sie versuchen, eine Änderung in der so geschützten Tabelle vorzunehmen,wird Ihnen dies nicht gelingen.

Selbstverständlich müssen nicht immer alle Zellen einer Tabelle geschützt wer-den, wie es im Makro aus Listing 5.26 vorgenommen wurde.

Nur bestimmte Zellen vor Veränderung schützen

Bei Tabellen, in denen Sie Formeln und Berechnungen durchführen, empfiehltes sich, diese wichtigen Formeln zu schützen. Alle anderen Nicht-Formelzellenkönnen dabei vom Tabellenschutz ausgenommen werden.

Abbildung 5.21: Alle Zellen werden in der Tabelle1 geschützt.

237

Page 238: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Standardmäßig sind alle Zellen einer Tabelle von vornherein mit dem Geschützt-Kennzeichen ausgestattet, d.h. wenn Sie eine Tabelle mit einem Schutz belegen,sind alle Zellen nicht mehr veränderbar.

Folgende Arbeitsschritte müssen nun durchgeführt werden:

1. Generell für alle Zellen der Tabelle das Geschützt-Kennzeichen entfernen

2. Ermittlung der Zellen, die Formeln enthalten

3. Für diese Zellen das Geschützt-Kennzeichen setzen

4. Den Schutz für die Tabelle einstellen

Diese vier Arbeitsschritte führen Sie im Makro aus Listing 5.27 durch.

Listing 5.27: Nur Formelzellen wurden geschützt

Sub TeileDerTabelleSchützen() Sheets("DB").Activate Cells.Select Selection.Locked = False

Abbildung 5.22: Nur Formelzellen sollen geschützt werden.

238

Page 239: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen schützen

Selection.SpecialCells(xlCellTypeFormulas).Select Selection.Locked = True

Sheets("DB").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=TrueEnd Sub

Aktivieren Sie im ersten Schritt die gewünschte Tabelle, in der Sie die Formelzel-len schützen möchten. Danach markieren Sie über die Anweisung Cells.Selectalle Zellen der Tabelle. In der Cells-Auflistung sind alle Zellen einer Tabelle ver-zeichnet.

Setzen Sie danach die Eigenschaft Locked auf den Wert False, um zunächst dasGeschützt-Kennzeichen für alle Zellen der Tabelle auszuschalten.

Ermitteln Sie danach über die Methode SpecialCells, der Sie die KonstantexlCellTypeFormulas mitgeben, alle Formelzellen der Tabelle und markieren diesemithilfe der Methode Select. Schalten Sie danach für diese Zellen das Geschützt-Kennzeichen wieder ein, indem Sie die Eigenschaft Locked auf den Wert True setzen.

Nun können Sie die Methode Protect einsetzen, um die Tabelle zu schützen.Danach können Formelzellen in dieser Tabelle nicht mehr geändert werden.

Temporären Schutz einstellen

In der Praxis kommt es oft vor, dass Sie als Programmierer zwar den Schutz vonTabellen verwenden, aber trotzdem hin und wieder eine Änderung an der Tabellevornehmen möchten, ohne jedes Mal den Schutz aufzuheben, die Änderung ein-zuarbeiten und den Tabellenschutz wieder einzustellen.

Für diesen Fall können Sie alle Teilschritte auch über ein Makro durchführen las-sen. Dieses Makro können Sie in Listing 5.28 sehen.

Listing 5.28: Änderungen an geschützten Tabellen vornehmen

Sub SchutzausÄnderungSchutzEin()'Dokuschutz aufhebenSheets("DB").Unprotect Password:="hero"

'Änderung durchführen

239

Page 240: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Range("B2").Value = Date

'Dokuschutz wieder einstellen Sheets("DB").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=TrueEnd Sub

Bestimmte Bereiche vom Schutz ausnehmen

Ab der Version Excel 2002 gibt es auch eine Funktion, mithilfe der Sie gezieltBereiche in Ihrer Tabelle definieren können, für die ein eingestellter Blattschutznicht gelten soll.

Im folgenden Beispiel soll auf der TABELLE3 ein Bereich definiert werden, in demder Anwender trotz eingestellten Blattschutzes Änderungen durchführen darf. DasMakro für diese Aufgabe sehen Sie in Listing 5.29:

Abbildung 5.23: Der Bereich B3:E13 soll trotz Blattschutzes frei editierbar bleiben.

240

Page 241: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellen sortieren

Listing 5.29: Einen eingabefreien Bereich trotz Blattschutzes definieren

Sub FreieBereicheFestlegen() Sheets("Tabelle3").Activate On Error GoTo fehler Sheets("Tabelle3").Protection.AllowEditRanges.Add _ Title:="Bereich1", Range:=Range("B3:E13")Sheets("Tabelle3").Protect Password:="hero"Exit Sub

fehler:MsgBox "Es ist ein Fehler aufgetreten!"End Sub

Mithilfe der Methode Add, die Sie auf die AllowEditRanges-Auflistung anwenden,können Sie einen Bereich definieren, der trotz eingestelltem Blattschutz weitereditierbar sein soll. Geben Sie dazu im Argument Title einen Namen für denBereich ein. Des Weiteren geben Sie im Argument Range bekannt, wo dergewünschte Bereich in der Tabelle sein soll. Schützen Sie danach Ihre Tabelleüber die Methode Protect.

5.9 Tabellen sortieren

Leider gibt es noch keine Standardfunktion in Excel, welche es erlaubt, Tabellen-blätter nach ihrem Namen zu sortieren. Das folgende Makro sortiert alle Tabellen-blätter in aufsteigender alphabetischer Reihenfolge:

Listing 5.30: Die Blätter einer Arbeitsmappe sortieren

Sub BlätterSortieren()Dim iMax As IntegerDim Ibl As IntegerDim ibl2 As Integer

Application.ScreenUpdating = FalseiMax = ThisWorkbook.Sheets.CountFor Ibl = 1 To iMax For ibl2 = Ibl To iMax If UCase(Sheets(ibl2).Name) _ < UCase(Sheets(Ibl).Name) Then

241

Page 242: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Sheets(ibl2).Move before:=Sheets(Ibl) End If Next ibl2Next IblApplication.ScreenUpdating = TrueEnd Sub

Um das Sortieren von Arbeitsblättern durchzuführen, müssen Sie zwei verschach-telte For-Next-Schleifen durchlaufen. Beide haben als Endbedingung immer dieAnzahl der Blätter, die in der Mappe enthalten sind. Innerhalb der zweiten Schleifewerden die Namen der Blätter verglichen. Beim Vergleich der Blattnamen werdendiese erst einmal in Großbuchstaben gewandelt, um sicherzustellen, dass die Groß-und Kleinschreibung beim Sortiervorgang keine Rolle spielt. Je nach Vergleichs-ergebnis werden die einzelnen Blätter dann innerhalb der Arbeitsmappe mithilfeder Methode Move verschoben oder auch nicht.

Abbildung 5.24: Die Blätter liegen sortiert in der Arbeitsmappe vor.

242

Page 243: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Kopf- und Fußzeilen programmieren

5.10 Kopf- und Fußzeilen programmieren

Auch die automatische Generierung von Kopf- und Fußzeilen ist sinnvoll. Stan-dardmäßig können Sie manuell immer nur eine Tabelle nach der anderen mitKopf- und Fußzeilen bestücken. Diese zeitraubende wie auch lästige Arbeit kön-nen Sie schneller mit dem Einsatz eines VBA-Makros erledigen.

Ab der Excel-Version 2002 ist es erstmals möglich, Grafiken in die Kopf- und Fuß-zeile zu integrieren. In früheren Excel-Versionen konnte man sich zumindest beiden Kopfzeilen mit einem Trick behelfen. Man fügte eine Grafik in die erste Zeileder Tabelle ein und deklarierte diese Zeile als Wiederholungszeile. So wurde dieso eingefügte Grafik auf jeder neuen Seite wiederholt.

Kopf- und Fußzeilen füllen

Beim Befüllen der Kopf- und Fußzeilen einer Tabelle können Sie zum einen aufbereits existierende Funktionen wie den Namen der Tabelle, die Seitennumerie-rung sowie das Datum zurückgreifen, die Sie in der normalen Excel-Oberflächeüber Schaltflächen hinzufügen können. Des Weiteren können Sie über Doku-menteigenschaften oder auch Zellenbezüge weitere Informationen in die Kopf-und Fußzeilen bringen.

Die nächste Makrolösung wird die folgenden Einstellungen an der Kopf- und Fuß-zeile einer Tabelle vornehmen:

� Kopfzeile links: das Thema der Tabelle (aus Zelleninhalt A1)

� Kopfzeile Mitte: der Firmenname (aus den Dokumenteigenschaften)

� Kopfzeile rechts: das Datum (mit ausgeschriebenem Monat und vierstelligerJahresangabe)

� Fußzeile links: der Name der Mappe/Tabelle

� Fußzeile Mitte: der Autor der Tabelle (aus Dokumenteigenschaften)

� Fußzeile rechts: die Seitennumerierung (Seite X von Y Seiten)

Außerdem soll am Ende die Seitenansicht automatisch aufgerufen werden.

243

Page 244: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

Listing 5.31: Die Kopf- und Fußzeile festlegen

Sub KopfUndFußzeileFestlegen()With ActiveSheet.PageSetup .LeftHeader = ActiveSheet.Range("A1").Value .CenterHeader = _ ThisWorkbook.BuiltinDocumentProperties("Company") .RightHeader = Format(Date, "DD. MMMM YYYY") .LeftFooter = "&F/&A" .CenterFooter = ThisWorkbook.BuiltinDocumentProperties("Author") .RightFooter = "&P von &N Seiten"End With ActiveWindow.SelectedSheets.PrintPreviewEnd Sub

Um die Kopf- und Fußzeile festlegen zu können, setzen Sie das Objekt PageSetupein. Nun können Sie ganz gezielt auf die einzelnen Komponenten zugreifen,indem Sie diese mit den gewünschten Informationen füllen. In der linken Kopf-zeile (LeftHeader) fügen Sie den Inhalt ein, der momentan in Zelle A1 steht. Inder Mitte der Kopfzeile (CenterHeader), greifen Sie auf die DokumenteigenschaftCompany zu, die den Firmennamen zurückmeldet. In der rechten Kopfzeile (Righ-tHeader) fügen Sie das aktuelle Tagesdatum ein und formatieren es mithilfe derFunktion Format nach Ihren Wünschen. In der linken Fußzeile (LeftFooter)fügen Sie den Namen der Arbeitsmappe sowie den Tabellennahmen über dieKopf- und Fußzeilenkürzel &F und &A ein. In der Mitte der Fußzeile (CenterFoo-ter) zeigen Sie den Namen des Autors an, welchen Sie aus den Dokumenteigen-

Abbildung 5.25: Die fertige Kopf- und Fußzeile

244

Page 245: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

schaften holen. Am rechten Rand der Fußzeile (RightFooter) geben Sie dieSeitennumerierung über die Formatkürzel &P und &N an (siehe Abbildung 5.25).

Möchten Sie das Makro aus Listing 5.31 nicht nur für die aktuelle Tabelle, son-dern für alle Tabellen der Arbeitsmappe einsetzen, dann erweitern Sie diesesMakro. Das Ergebnis daraus können Sie in Listing 5.32 sehen:

Listing 5.32: Die Einstellungen für die Kopf- und Fußzeile auf allen Tabellen der Arbeitsmappe übernehmen

Sub KopfUndFußzeileFestlegenAlleTabellen()Dim Tabelle As Worksheet

For Each Tabelle In ThisWorkbook.Worksheets

With Tabelle.PageSetup .LeftHeader = Tabelle.Range("A1").Value .CenterHeader = _ ThisWorkbook.BuiltinDocumentProperties("Company") .RightHeader = Format(Date, "DD. MMMM YYYY") .LeftFooter = "&F/&A" .CenterFooter = ThisWorkbook.BuiltinDocumentProperties("Author") .RightFooter = "&P von &N Seiten" End With

Next TabelleEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. SetzenSie danach eine Schleife auf, in der Sie alle Tabellen der Arbeitsmappe abarbei-ten. Innerhalb dieser Schleife füllen Sie die einzelnen Komponenten des ObjektsPageSetup, wie bereits in Listing 5.31 beschrieben.

5.11 Fragen & Antworten

F Wie können Sie die voraussichtliche Druckseiten-Anzahl einer Tabelle ermitteln?

A Über die Anweisung:

MsgBox ExecuteExcel4Macro("Get.Document(50)").

245

Page 246: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenblätter programmieren

F Wie können Sie eine Tabelle ans Ende der Arbeitsmappe verschieben?

A Für diese Aufgabe setzen Sie die Methode Move ein.

Sheets("Tabelle1").Move After:=Sheets(Sheets.Count)

F Wie können Sie eine Tabelle schützen, danach aber noch die Filterfunktion ein-setzen?

A Starten Sie das Makro aus Listing 5.33

Listing 5.33: Die Filterfunktion trotz Blattschutz erhalten

Sub FilternAuchBeiBlattschutz() ActiveSheet.Protect userinterfaceonly:=True ActiveSheet.EnableAutoFilter = TrueEnd Sub

Geben Sie bei der Methode Protect als Argument userinterfaceonly denWert True an. Damit können Sie auch in einer geschützten Tabelle nochden AutoFilter verwenden.

5.12 Quiz

F Wie kann man die Standardmeldungen von Excel abschalten? Gerade beimLöschen von Tabellen ist die dabei angezeigte Bestätigungsmeldung uner-wünscht.

F Was müssen Sie machen, wenn Sie eine Tabelle so ausblenden möchte, dass einAnwender diese ohne den Einsatz eines Makros nicht wieder einblenden kann?

F Wie können Sie eine Grafik in die Kopfzeile Ihrer Tabelle bringen?

F Welche Formatkürzel können Sie für die Generierung von Kopf- und Fußzeileneinsetzen?

246

Page 247: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Übungen

5.13 Übungen

Zum Abschluss dieses Tages versuchen Sie einmal, die folgenden beiden Aufga-ben über den Einsatz eines VBA-Makros zu lösen:

1. Legen Sie eine neue Arbeitsmappe an und fügen Sie darin genau 12 Tabellenein, die Sie nach Monatsnamen benennen.

2. Entfernen Sie aus einer Tabelle alle Formeln, und zwar so, dass die Formelnin Festwerte umgewandelt werden.

Die Lösung dieser beiden Aufgaben finden Sie im Anhang A.

247

Page 248: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;
Page 249: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

6

Zellbearbeitung mit VBA

Page 250: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Am gestrigen Tag haben Sie den Umgang mit Excel-Tabellen kennen gelernt.Unter anderem haben Sie neue Tabellen angelegt, benannt und gespeichert sowieDaten in Tabellen importiert. Des Weiteren haben Sie auf die Kopf- und Fußzeileper VBA-Makros zugegriffen und diese einheitlich gestaltet.

Die Themen heute:

� Zellen markieren

� Zellen füllen und formatieren

� Zellen benennen und kommentieren

� Arbeiten mit Formeln und Funktionen

� Daten suchen und Gültigkeiten einstellen

Alle Makrobeispiele können Sie in der Arbeitsmappe Zellen.xls im Ver-zeichnis Kap06 auf der beiliegenden CD-ROM nachschlagen.

6.1 Zellen markieren

Als erste Tagesaufgabe lernen Sie heute, wie Sie Zellen in Excel markieren kön-nen. Für das Markieren von Zellen verwenden Sie die Methode Select. DieseMethode wenden Sie auf das Objekt Range an, welches entweder für eine einzelneZelle oder einen Zellenbereich steht.

Zelle markieren und Koordinaten ausgeben

Im folgenden Beispiel aus Listing 6.1 wird die Zelle A10 markiert. Des Weiterenwerden danach die Koordinaten in einer Bildschirmmeldung ausgegeben.

Listing 6.1: Zelle markieren und Koordinaten ausgeben

Sub ZelleMarkieren() Sheets("Tabelle1").Activate Range("A10").Select MsgBox "Sie haben die Zelle " & _ ActiveCell.Address & " markiert!", vbInformationEnd Sub

250

Page 251: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen markieren

Aktivieren Sie im ersten Schritt des Makros das gewünschte Tabellenblatt, in demSie die Zelle A10 markieren möchten. Wenden Sie danach die Methode Selectan, um die Zelle zu markieren. Über die Anweisung ActiveCell.Address könnenSie die genauen Koordinaten der Zelle bestimmen.

Zellenbereich markieren und Koordinaten ausgeben

Im nächsten Beispiel wird ein ganzer Zellenbereich markiert und im Anschlussdaran werden die Koordinaten ausgegeben:

Listing 6.2: Einen Zellenbereich markieren und ausgeben

Sub ZellenMarkieren()Sheets("Tabelle1").ActivateRange("A10:C15").SelectMsgBox "Sie haben die Zellen " & _ Selection.Address & " markiert!", vbInformationEnd Sub

Markieren Sie über die Methode Select den gewünschten Bereich und ermittelnSie die Koordinaten des markierten Bereichs über die Anweisung Selec-tion.Address.

Mehrere Zellenbereiche markieren

Einen Schritt weiter geht das folgende Makro. Es markiert mehrere Bereiche ineiner Tabelle:

Abbildung 6.1: Die Koordinaten der aktiven Zelle werden ausge-geben.

251

Page 252: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Listing 6.3: Mehrere Bereiche markieren und ausgeben

Sub BereicheMarkieren()Dim Bereich1 As RangeDim Bereich2 As RangeDim Bereich3 As RangeDim Gesamtbereich As Range

Sheets("Tabelle1").ActivateSet Bereich1 = Range("A5:C8")Set Bereich2 = Range("E5:G8")Set bereich3 = Range("A10:C12")

Set Gesamtbereich = Union(Bereich1, Bereich2, Bereich3)Gesamtbereich.Select

MsgBox "Sie haben die Zellen " & _ Gesamtbereich.Address & " markiert!", vbInformation

Set Bereich1 = NothingSet Bereich2 = NothingSet Bereich3 = NothingSet Gesamtbereich = NothingEnd Sub

Deklarieren Sie im ersten Schritt einige Objektvariablen vom Typ Range. In diesenObjektvariablen sollen die einzelnen Bereichskoordinaten gespeichert werden.Mit der Anweisung Set definieren Sie zuerst die einzelnen Zellbereiche Bereich1

Abbildung 6.2: Die Koordinaten des markierten Bereichs ausgeben

252

Page 253: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen markieren

bis Bereich3. Danach vereinen Sie diese Einzelbereiche mithilfe der MethodeUnion zu einem Block, welcher den Namen Gesamtbereich trägt. Diesen Blockkönnen Sie über die Methode Select komplett markieren. Über die AnweisungGesamtbereich.Address ermitteln Sie die Koordinaten der einzelnen Bereiche. AmEnde des Makros sollten Sie den reservierten Speicher, den Sie für die Objektvari-ablen in Beschlag genommen haben, wieder freigeben. Dies erreichen Sie, indemSie den Objektvariablen mit der Set-Anweisung den Wert Nothing zuweisen.

Relative Markierungsformen

Bis jetzt haben Sie lediglich absolute Markierungen vorgenommen, d.h. die Zel-lenadressen wurden bei der Markierung in der A1-Form vorgenommen. Oft müs-sen aber Markierungen auch relativ angegeben werden. Ein Beispiel für einerelative Markierungsform wäre Folgendes:

Geben Sie die Koordinaten der momentan aktiven Zelle aus und markieren Sieausgehend von dieser Zelle drei weitere Zellen nach rechts!

Für den Fall, dass die aktive Zelle momentan die Zelle B5 ist, müssten dann dieZellen C5, D5 und E5 zusätzlich markiert werden. Die Lösung dieser Aufgaben-stellung sehen Sie im Makro aus Listing 6.4.

Abbildung 6.3: Die Koordinaten aller Bereiche aus-geben

253

Page 254: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Listing 6.4: Drei weitere Zellen nach rechts werden in die Auswahl mit aufgenommen

Sub RelativeMarkierung() Worksheets("Tabelle1").Activate Range(ActiveCell, ActiveCell.Offset(0, 3)).Select MsgBox "Aktive Zelle: " & ActiveCell.Address & Chr(13) & _ "Weitere Zellen: " & Selection.Address, vbInformationEnd Sub

Bei der Anweisung Range(ActiveCell, ActiveCell.Offset(0,3)).Select werdenausgehend von der aktiven Zelle, drei weitere Nebenzellen markiert. Für diesenZweck wird die Eigenschaft OffSet verwendet. Diese Eigenschaft hat zwei Argu-mente:

� Im ersten Argument wird die Anzahl der Zeilen (positiv, negativ oder 0 (Null)),um die der Bereich versetzt werden soll, angegeben. Bei positiven Wertenerfolgt ein Versatz nach unten, bei negativen Werten ein Versatz nach oben.Da in unserem Beispiel die Markierung in derselben Zeile verbleiben soll, set-zen Sie dieses Argument auf den Wert 0.

� Im zweiten Argument wird die Anzahl der Spalten (positiv, negativ oder 0(Null)), um die der Bereich versetzt werden soll, angegeben. Bei positivenWerten erfolgt ein Versatz nach rechts, bei negativen Werten ein Versatz nachlinks. Da in unserem Beispiel die Markierung der drei Spalten nach rechts ver-bleiben soll, setzen Sie dieses Argument auf den Wert 3.

Abbildung 6.4: Relative Markie-rungsformen

254

Page 255: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen markieren

Im nächsten Beispiel wird eine Markierung, ausgehend von der aktiven Zelle, umvier Zeilen nach unten und zwei Spalten nach links erweitert:

Listing 6.5: Relative Markierung mit Fehlerbehandlung

Sub RelativeMarkierung2() Worksheets("Tabelle1").Activate On Error GoTo fehler Range(ActiveCell, ActiveCell.Offset(3, -2)).Select MsgBox "Relative Markierung: " & Selection.Address, _ vbInformation Exit Sub fehler: MsgBox "Die Markierung kann nicht vorgenommen werden!"End Sub

Ausgehend von der aktiven Zelle in unserem Beispiel markieren Sie vor demMakrostart die Zelle C5, die Markierung wird mithilfe der Eigenschaft OffSet umdrei Zeilen nach unten und zwei Spalten nach links erweitert.

Die Fehlerbehandlung für dieses Beispiel ist wichtig, da Sie sicherstellen müssen,dass der Offset auch durchgeführt werden kann. Für den Fall, dass die aktive Zellebeispielsweise die Zelle A5 ist, kann der Offset nicht erfolgreich durchgeführt wer-den, da es keine weiteren Spalten links neben der Spalte A gibt.

Vorsicht auch bei ausgeblendeten Zeilen oder Spalten! Bei der Eigen-schaft Offset werden diese ausgeblendeten Objekte mitgezählt. DieProblematik wird in Abbildung 6.5 ersichtlich.

Abbildung 6.5: Wie lautet der Offset?

255

Page 256: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Auf den ersten Blick würden Sie sagen: Der Offset ausgehend von der Zelle D2lautet:

ActiveCell.Offset(5, -1).Select

Diese Bestimmung ist falsch! Beachten Sie, dass hier einige ausgeblendete Zeilenund Spalten vorliegen, die Sie mitzählen müssen. Der richtige Offset lautet daher:

ActiveCell.Offset(12, -2).Select

Zellen über einen Index ansprechen

Seither haben Sie eine Zelle in der A1-Bezugsform angesprochen. Sie können eineZelle aber auch über einen Index, der aus einem Zeilen- und einem Spaltenindexbesteht, ansprechen. Im folgenden Makro wird die Zelle C10 selektiert und dieKoordinaten werden ausgegeben:

Listing 6.6: Ansteuern einer Zelle über die Eigenschaft Cells

Sub ZellenAnsprechen() Cells(10, 3).Select MsgBox "Die Zelle " & Cells(10, 3).Address & _ " wurde markiert!", vbInformationEnd Sub

Mithilfe der Eigenschaft Cells können Sie eine bestimmte Zelle ansteuern. Dabeiweist diese Eigenschaft zwei Argumente auf. Das erste Argument steht für dieZeile, das zweite Argument für die Spalte. Der Schnittpunkt aus Zeile und Spalteergibt dann die exakte Adresse der Zelle.

Über die Eigenschaft Cells können selbstverständlich auch Bereiche angespro-chen werden. Im Makro aus Listing 6.7 wird der Bereich C10:E10 markiert.

Listing 6.7: Einen Bereich über die Eigenschaft Cells markieren

Sub BereicheAnsprechen() Range(Cells(10, 3), Cells(10, 5)).SelectEnd Sub

256

Page 257: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen markieren

Den verwendeten Bereich ermitteln

In Excel haben Sie die Möglichkeit, den verwendeten Bereich einer Tabelle zuermitteln. Diese Aufgabe lösen Sie, indem Sie die Eigenschaft UsedRange einsetzen.

Im folgenden Makro wird der verwendete Bereich der TABELLE3 ermittelt undmarkiert.

Listing 6.8: Den verwendeten Bereich einer Tabelle ermitteln

Sub VerwendetenBereichErmitteln() Sheets("Tabelle3").Activate ActiveSheet.UsedRange.SelectEnd Sub

Die Eigenschaft UsedRange gibt den verwendeten Teil eines Tabellenblatteszurück.

Abbildung 6.6: Der verwendete Bereich einer Tabelle wird markiert.

257

Page 258: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Den umliegenden Bereich ermitteln

Nicht immer ist es erwünscht, gleich den ganzen Bereich einer Tabelle zu ermit-teln und zu markieren. Oft reicht es auch aus, den umliegenden Bereich einerZelle auszukundschaften und zu markieren. Mithilfe der Eigenschaft CurrentRegion können Sie beispielsweise den umliegenden Bereich einer Zelle ermitteln.Der ermittelte Bereich wird durch die erste Leerzeile bzw. Leerspalte begrenzt.

Im nächsten Beispiel soll in einer Tabelle ein ganz bestimmter Bereich lokalisiertund markiert werden:

Listing 6.9: Den umliegenden Bereich einer Zelle markieren

Sub UmliegendenBereichErmitteln() Sheets("Tabelle4").Activate Range("B9").Select ActiveCell.CurrentRegion.SelectEnd Sub

Über die Eigenschaft CurrentRegion haben Sie die Möglichkeit, den umliegendenBereich einer Zelle zu ermitteln. Diese Eigenschaft wird in Abbildung 6.7 klar.

Abbildung 6.7: Der umliegende Bereich um die Zelle B9 wird markiert.

258

Page 259: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen füllen

6.2 Zellen füllen

Da Sie nun wissen, wie Sie Zellen und Bereiche markieren können, gehen wireinen Schritt weiter und füllen Zellen mit Inhalten.

Zellen initialisieren

Viele Fehler in Makros werden dadurch hervorgerufen, dass Variablen zu Beginnnicht sauber gesetzt werden. Ähnlich ist es beim Füllen von Zellen. Zu Beginneiner Füllaktion ist es oft angebracht, den zu füllenden Bereich vorher zu löschenund dann neu zu befüllen. Warum?

Es ist durchaus möglich, dass vor dem Starten des Makros bereits Werte vorhandensind, d.h. Sie können nachher nur schwer feststellen, welche Werte nun neu vomMakro selbst gesetzt wurden.

Im folgenden Beispiel wird ein Bereich komplett mit Nullen gelöscht. Diese Berei-che sollen jeden Tag mit aktuellen Daten gefüllt werden. Sehen Sie sich dazu dasMakro aus Listing 6.10 an:

Listing 6.10: Bereiche initialisieren

Sub BereicheInitialisieren()Dim Bereich1 As RangeDim Bereich2 As RangeDim Bereich3 As RangeDim Gesamtbereich As Range

Sheets("Tabelle5").Activate Set Bereich1 = Range("C7:C8") Set Bereich2 = Range("C13:C14") Set Bereich3 = Range("C19:C20")

Set Gesamtbereich = Union(Bereich1, Bereich2, Bereich3) Gesamtbereich.Value = 0 Set Bereich1 = Nothing Set Bereich2 = Nothing Set Bereich3 = Nothing Set Gesamtbereich = NothingEnd Sub

259

Page 260: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Deklarieren Sie im ersten Schritt einige Objektvariablen vom Typ Range. In diesenObjektvariablen sollen die einzelnen Bereichskoordinaten gespeichert werden.Mit der Anweisung Set definieren Sie zuerst die einzelnen Zellbereiche Bereich1bis Bereich3. Danach vereinen Sie diese Einzelbereiche mithilfe der MethodeUnion in einem Block, welcher den Namen Gesamtbereich trägt. Diesem Blockkönnen Sie nun über die Eigenschaft Value den Wert 0 zuweisen. Am Ende desMakros sollten Sie den reservierten Speicher, den Sie für die Objektvariablen inBeschlag genommen haben, wieder freigeben. Dies erreichen Sie, indem Sie denObjektvariablen mit der Set-Anweisung den Wert Nothing zuweisen.

Zellen abfragen und ändern

Genau den umgekehrten Vorgang, nämlich den momentanen Wert einer Zelleabfragen, können Sie ebenfalls mit der Eigenschaft Value.

Im nächsten Beispiel soll eine Liste mit Buchungen abgearbeitet werden. Dabeisollen alle Positionen, die wertmäßig über 2.500 Euro liegen, in der Nebenspaltemit dem Buchstaben A gekennzeichnet werden. Sehen Sie sich zunächst die Aus-gangslage in Abbildung 6.9 an.

Kennzeichnen Sie nun die Buchungen, die wertmäßig über 2.500 Euro liegen,indem Sie das Makro aus Listing 6.11 einsetzen:

Abbildung 6.8: Die Bereiche wur-den auf Null gesetzt.

260

Page 261: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen füllen

Listing 6.11: Buchungspositionen kennzeichnen

Sub ListeAbarbeiten()Sheets("Tabelle6").ActivateRange("B2").Select

Do Until ActiveCell.Value = "" If ActiveCell.Value > 2500 Then ActiveCell.Offset(0, 1).Value = "A" ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Aktivieren Sie im ersten Schritt die gewünschte Zelle und setzen Sie den Mauszei-ger auf die Startadresse. Danach durchlaufen Sie in einer Schleife alle Buchungs-positionen und führen eine Wertprüfung durch. Liegt die Buchung wertmäßigüber 2.500 Euro, dann schreiben Sie in die Nebenzelle den Buchstaben A. SetzenSie für diese Aufgabe die Offset-Eigenschaft ein, bei der Sie den Zeilen-Offset auf0 setzen und den Spalten-Offset auf den Wert 1. Vergessen Sie nicht, am Ende der

Abbildung 6.9: Die Liste nach dem Datum sor-tiert

261

Page 262: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Schleife den Mauszeiger jeweils eine Zeile nach unten zu setzen. Die Schleifewird verlassen, sobald die erste leere Zelle in Spalte B erreicht wird.

6.3 Zellen formatieren

Beim Formatieren von Zellen und Bereichen in Excel bieten sich Ihnen vieleMöglichkeiten. Sie können Zelleneingaben in beliebiger Schriftart, Schriftgradsowie Schriftschnitt vornehmen, Zahlen benutzerdefiniert formatieren, Zellenein-träge optisch ausrichten, Rahmen setzen, Muster hinzufügen und vieles mehr.

Hintergrundfarbe von Zellen festlegen

Für die Formatierung des Zellenhintergrunds stehen Ihnen 56 Farben zur Verfügung.Jede dieser Farben hat einen eindeutigen Index, über den Sie die Farbe einstellen.

Abbildung 6.10: Alle höheren Buchungen wur-den in Spalte C gekennzeichnet.

262

Page 263: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen formatieren

Das folgende Makro aus Listing 6.12 erstellt eine neue Tabelle und gibt die Far-ben bzw. deren Index in einer Liste aus.

Listing 6.12: Farbindex und Farbe ermitteln

Sub FarbenAusgeben()Dim i As Integer

Sheets.AddRange("A1").Value = "Index"Range("B1").Value = "Farbe"Range("A2").Select

For i = 1 To 56 ActiveCell.Value = i ActiveCell.Offset(0, 1).Interior.ColorIndex = i ActiveCell.Offset(1, 0).SelectNext iEnd Sub

Fügen Sie mithilfe der Anweisung Sheets.Add eine neue Tabelle in Ihre Arbeits-mappe ein. Danach füllen Sie die Zelle A1 und B1 mit der gewünschten Über-schrift für die Spalten. Setzen Sie im Anschluss daran den Mauszeiger auf dieStartzelle, an der die Bearbeitung beginnen soll, und arbeiten Sie in einer Schleifealle 56 Standardfarben von Excel ab. Den Index schreiben Sie direkt in Spalte A.Die dazugehörige Farbe wenden Sie in Spalte B an, indem Sie die EigenschaftColorIndex auf das Objekt Interior anwenden. Das Objekt Interior steht für denZellenhintergrund, den Sie mithilfe der Eigenschaft ColorIndex einfärben. Verges-sen Sie nicht am Ende der Schleife den Mauszeiger eine Zelle weiter nach untenzu setzen.

Um auf schnelle Art und Weise zu erfahren, welcher Farbindex für wel-che Farbe steht, weisen Sie einer Zelle eine Farbe zu, setzen den Maus-zeiger darauf und starten folgendes Makro:

Listing 6.13: Den aktuellen Zellfarbenindex bestimmen

Sub FarbeAktiveZelle()MsgBox "Die aktive Zelle " & ActiveCell.Address & _" hat den Farbindex: " & ActiveCell.Interior.ColorIndexEnd Sub

263

Page 264: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Um die Färbung einer Zelle wieder zu entfernen, setzen Sie bitte nichtden ColorIndex = 2 ein, der für die Farbe WEISS steht. Weisen Sie statt-dessen der Eigenschaft ColorIndex die Konstante XlColorIndexNone zu.

Im folgenden Beispiel werden die Farben aller Zellen mit einem einzigen Befehlbeseitigt:

Listing 6.14: Alle Hintergrundfarben von Zellen in einer Tabelle entfernen

Sub FarbenEntfernen() Sheets("Tabelle7").Activate Cells.Interior.ColorIndex = xlColorIndexNoneEnd Sub

Über die Eigenschaft Cells, die Sie ohne weitere Argumente angeben, haben SieZugriff auf alle Zellen der aktiven Tabelle. Diese Zellen entfärben Sie, indem Siedie Eigenschaft ColorIndex mit der Konstante XlColorIndexNone bestücken undauf das Objekt Interior anwenden.

Schriftart festlegen

Wie Sie die Standardschriftart von Excel ändern können, haben Sie bereits amfünften Tag erfahren. Diese Änderung gilt dann für alle neuen Arbeitsmappen.Um die Schriftart bei allen anderen Arbeitsmappen zu ändern, muss diese über dasObjekt Font angepasst werden.

Abbildung 6.11: Alle verfügbaren Farben und deren Indexwerte in einer Tabelle

264

Page 265: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen formatieren

Im nächsten Beispiel soll auf einer bestimmten Tabelle ein vorgegebener Bereichmit einer anderen Schriftart in der Schriftgröße 14 formatiert werden. Das Makrofür diese Aufgabe sehen Sie in Listing 6.15:

Listing 6.15: Eine andere Schriftart bzw. Schriftgröße einstellen

Sub SchriftArtEinstellen()Dim Zelle As RangeDim Bereich As Range

Sheets("Tabelle5").ActivateSet Bereich = Range("A1:E20") With Bereich.Font .Name = "Garamond" .Size = 14 End With Set Bereich = NothingEnd Sub

Aktivieren Sie zuerst einmal die Tabelle, auf der Sie eine andere Schriftart einstel-len möchten. Auf dieser Tabelle definieren Sie mithilfe der Anweisung Set einenBereich. Dieser Bereich wird mit der Schriftart GARAMOND sowie der Schriftgröße14 formatiert. Das Objekt Font hat eine ganze Reihe von Eigenschaften, die Sieanwenden können. Für die eben gestellte Aufgabe werden die beiden Eigenschaf-ten Name und Size gebraucht. Bei der Angabe der Schriftart ist die korrekteSchreibweise der gewünschten Schriftart wichtig. Bei der Eigenschaft Size gebenSie eine gewünschte Größe für die Schrift an.

Abbildung 6.12: Ein definierter Bereich wurde mit einer anderen Schriftart forma-tiert.

265

Page 266: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Die Schriftschnitte angeben

Nachdem Sie die Schriftart und die Schriftgröße eingestellt haben, kommen wir nunzu den Schriftschnitten sowie sonstigen Formatierungsmöglichkeiten von Schriften.Alle Formatierungen werden anhand des Objekts Font vorgenommen. EntnehmenSie weitere wichtige Eigenschaften des Objekts Font der folgenden Tabelle.

Eigenschaft Beschreibung

Bold Diese Eigenschaft liefert den Wert True, wenn ein Text FETT forma-tiert ist.

Color Diese Eigenschaft gibt die Primärfarbe des Objektes wieder. Möglich sind hierbei folgende Konstanten: vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan und vbWhite.

ColorIndex Diese Eigenschaft gibt die Farbe des Rahmens, der Schriftart oder des Innenraums zurück. Es existieren in Excel genau 56 Farben.

FontStyle Diese Eigenschaft sagt aus, welcher Schriftschnitt verwendet wird. Möglich sind u.a. Fett- und Kursivdruck.

Italic Diese Eigenschaft liefert den Wert True, wenn ein Text KURSIV forma-tiert ist.

OutLineFont Diese Eigenschaft liefert den Wert True, wenn ein Text als Kontur-schriftart formatiert wird.

Shadow Diese Eigenschaft liefert den Wert True, wenn ein Text als schattierte Schriftart formatiert wird.

Strikethrough Diese Eigenschaft liefert den Wert True, wenn ein Text als horizontal durchstrichen dargestellt wird.

Subscript Diese Eigenschaft liefert den Wert True, wenn ein Text tiefer gestellt formatiert wird.

Superscript Diese Eigenschaft liefert den Wert True, wenn ein Text hochgestellt formatiert wird.

Underline Diese Eigenschaft liefert den Wert True, wenn ein Text unterstrichen formatiert wird. Dabei können Sie u.a. Text einfach oder doppelt unterstreichen.

Tabelle 6.1: Die wichtigsten Eigenschaften für das Objekt Font

266

Page 267: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen formatieren

In der folgenden Aufgabe erstellen Sie als kleine Vorarbeit eine neue Tabelle underzeugen im Zellenbereich B2:E20 einige Zufallszahlen. Dabei können Sie denBereich markieren und die Formel =Ganzzahl(Zufallszahl()*1000) einfügen.Schließen Sie diese Formel ab, indem Sie die Tastenkombination (Strg) +(Enter) drücken. Die gerade erfasste Formel wird nun in jeder Zelle des markier-ten Bereiches eingefügt. Wenn Sie nun einige Male die Taste (F9) drücken, wer-den die Zahlen jedes Mal neu gebildet. Ersetzen Sie nun diese Formelzellen inFestwerte, indem Sie den Bereich markieren, kopieren und als Wert einfügen. Siehaben nun Zahlen vorliegen, die zwischen 0 und 999 liegen können. Ihre Bei-spieltabelle müsste nun in etwa wie in Abbildung 6.13 aussehen.

Ihre Aufgabe besteht nun darin, alle Zellen, die einen Wert größer als 600 aufwei-sen, mit dem Schriftschnitt FETT sowie dem Schriftschnitt KURSIV zu formatieren.Erfassen Sie zu diesem Zweck das Makro aus Listing 6.16.

Listing 6.16: Die Schriftschnitte Fett und Kursiv bei Bedarf zuweisen

Sub WerteÜberprüfenUndKennzeichnen()Dim Zelle As RangeDim Bereich As Range

Sheets("Tabelle9").ActivateSet Bereich = Range("B2:E20")

Abbildung 6.13: Die Ausgangsta-belle mit den Zufallszahlen

267

Page 268: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

For Each Zelle In Bereich If Zelle.Value > 600 Then Zelle.Font.Bold = True Zelle.Font.Italic = True Else End IfNext ZelleEnd Sub

Zu Beginn des Makros deklarieren Sie zwei Objektvariablen vom Typ Range.Danach aktivieren Sie die Tabelle, auf der Sie die Prüfung vornehmen möchten,und definieren den Bereich, um den es geht. Jetzt durchlaufen Sie jede einzelneZelle im definierten Bereich und fragen deren Inhalt ab. Sind die Zahlenwertegrößer als der Wert 600, dann weisen Sie dem Objekt Font über die EigenschaftenBold und Italic die entsprechenden Schriftschnitte FETT und KURSIV zu.

Zellen rahmen

Für die Rahmengestaltung von Zellen steht Ihnen in Excel eine ganze Reihe vonMöglichkeiten zur Verfügung. Welche Rahmentypen dies im Einzelnen sind,können Sie aus der folgenden Tabelle erfahren.

Abbildung 6.14: Alle Zellen > 600 wurden im Schrift-schnitt geändert.

268

Page 269: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen formatieren

Im folgenden Beispiel werden Sie die aktuelle Auswahl mit einem gestricheltenroten Rahmen belegen. Dabei spielt es keine Rolle, ob die Auswahl eine odermehrere Zellen enthält. Die Lösung dieser Aufgabenstellung können Sie in Lis-ting 6.17 sehen:

Listing 6.17: Einen Bereich mit einem Rahmen versehen

Sub RahmenBestimmen()Dim Bereich As Range

Sheets("Tabelle10").ActivateOn Error GoTo fehlerSet Bereich = _Application.InputBox("Markieren Sie einen Bereich", Type:=8) With Bereich.Borders .ColorIndex = 3 .LineStyle = xlDash End With Set Bereich = Nothing Exit Sub

fehler: MsgBox "Der Vorgang wurde abgebrochen!"End Sub

Konstante Beschreibung

xlContinuous Durchgezogene Linie

xlDash Gestrichelte Linie

xlDashDot Linie aus Strichen und Punkten

xlDashDotDot Linie aus Strich-Punkt-Punkt

xlDot Gepunktete Linie

xlDouble Linie doppelt

xlSlantDashDot Linie aus Wellenzeichen und Punkt

xlLineStyleNone Keine Linie

Tabelle 6.2: Die verschiedenen Rahmentypen in Excel

269

Page 270: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Fragen Sie mithilfe der Funktion InputBox einen Bereich vom Anwender ab, dendieser über eine Eingabemaske direkt auf der Tabelle markieren soll. Wird dieserMarkierungsvorgang über die Schaltfläche ABBRECHEN abgebrochen, dann wirdeine Fehlerbehandlungsroutine durchgeführt.

Markiert der Anwender wie geplant über die Eingabemaske den Bereich und klicktauf die Schaltfläche OK, dann wenden Sie die Eigenschaft ColorIndex auf dasObjekt Borders (= Rahmen) an, um die Rahmenfarbe zu bestimmen. Ebenfallsauf das gleiche Objekt angewendet wird die Eigenschaft LineStyle, die Sie mit derKonstanten xlDash belegen, um einen gestrichelten Rahmen zu erzeugen. WeitereRahmenarten lernten Sie ja bereits in Tabelle 6.2 kennen.

Zahlenformate festlegen

In Excel können Sie über das Dialogfeld FORMAT aus zahlreichen Zahlenforma-ten die passende Formatierung für Ihre Daten auswählen. Des Weiteren sind Siein der Lage, eigene, benutzerdefinierte Formate anzulegen.

In der nächsten Aufgabe soll ein Bereich mit recht hohen Zahlen mit dem Tausen-derpunkt formatiert werden. Sehen Sie sich vorerst aber die Abbildung 6.16 an.

Abbildung 6.15: Der gestrichelte rote Rahmen

Abbildung 6.16: Diese Zahlen sind schwer lesbar.

270

Page 271: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen formatieren

Erhöhen Sie die Übersichtlichkeit und weisen Sie diesen Zahlen das Tausender-Trennzeichen mithilfe des Makros aus Listing 6.18 zu.

Listing 6.18: Den Tausenderpunkt in das Zahlenformat einbauen

Sub FormatierungTausenderPunkt() Sheets("Tabelle11").Activate Range("B2:E5").Select Selection.NumberFormat = "#,##0"End Sub

Das Zahlenformat wird in Excel über die Eigenschaft NumberFormat zugewiesen.Da Sie vorher den gewünschten Datenbereich markiert haben, können Sie dieseEigenschaft direkt auf das Auflistungsobjekt Selection anwenden, in welchem alleZellen der Markierung verzeichnet sind.

Möchten Sie jegliche Formatierung Ihrer Daten löschen, setzen Sie dieMethode ClearFormats ein. In Listing 6.19 werden über diese Methodedie gerade eben gesetzten Tausenderpunkte wieder entfernt.

Listing 6.19: Jegliche Formatierung innerhalb der Markierung wird gelöscht

Sub FormatierungLöschen() Sheets("Tabelle11").Activate Range("B2:E5").Select Selection.ClearFormatsEnd Sub

Datumsformate festlegen

In Excel werden Datumswerte intern in Zahlenwerte umgesetzt, damit Sie damitrechnen können. Die Zeitzählung beginnt bei Excel standardmäßig am

Abbildung 6.17: Die Lesbarkeit der Zahlenwerte ist um ein Vielfaches leichter.

271

Page 272: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

01.01.1900, was der Zahl 1 entspricht. Wenn Sie z.B. das Datum 10.09.2002 ein-geben und diese Zelle dann mit dem Format STANDARD belegen, so liefert Ihnendieses Datum die Zahl 37509. Excel bietet noch ein zweites Datumssystem an, das1904-Datumssystem. Beim 1904-Datumssystem beginnt die Zeitrechnung in Excelam 01.01.1904. Das Datum 10.09.2002 entspricht in diesem Fall der Zahl 36047.Die Entscheidung, welches Datumssystem Sie wählen, liegt bei Ihnen. Wichtigdabei ist nur, dass Sie durchgängig dasselbe Datumssystem verwenden.

Wechseln Sie niemals nachträglich in einer bereits bestehenden Arbeits-mappe das Datumssystem. Wenn Sie dies trotzdem machen, dann werdenalle Datumsangaben in dieser Arbeitsmappe auf das neue Datumssystemumgerechnet.

In der nächsten Aufgabe liegen in einer Tabelle unterschiedliche Datumsformatie-rungen vor. Sehen Sie sich hierfür Abbildung 6.18 an.

Das Datum soll nun in der Form, wie es in Zelle A5 hinterlegt ist, auch für alleanderen Zellen der Spalte A gültig werden.

Listing 6.20: Datumsformat zuweisen

Sub DatumsformatZuweisen() Sheets("Tabelle12").Activate Range("A1:A12").NumberFormat = "DD. MMMM YYYY"End Sub

Abbildung 6.18: Unterschiedliche Datumsformate sollen auf einen Stand gebracht werden.

272

Page 273: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen benennen

Bei der Eigenschaft NumberFormat können Sie mit Formatkürzeln arbeiten. BeimBeispiel aus Listing 6.20 steht der Buchstabe D für den Tag, der Buchstabe M fürden Monat und der Buchstabe Y für das Jahr. Über die Anzahl der einzelnenBuchstaben können Sie die Formatierung des Datums bestimmen.

6.4 Zellen benennen

Selbstverständlich können Sie zur leichteren Navigation auf Tabellenblättern undzur besseren Übersichtlichkeit Ihres Quellcodes einzelne Zellen oder Bereicheauch einen Namen geben und diese über diesen Namen ansprechen.

Bei der Vergabe eines Namens müssen Sie darauf achten, dass Sie die allgemeinenNamenskonventionen einhalten. Dabei muss das erste Zeichen des Namens einBuchstabe oder auch ein Unterstrich sein. Beachten Sie auch, dass Namen nicht wieZellenbezüge benannt werden dürfen. Bei der Länge eines Namens können Sie biszu 255 Zeichen verwenden, was in der Programmierung jedoch eher umständlich ist.Hier sollten Sie sich auf kurze, aber sprechende Namen verständigen. Eine weitereEinschränkung bei der Namensvergebung ist, dass Sie Namen nicht aus mehrerenWörtern bilden dürfen, d.h. konkret, dass Sie keine Leerzeichen verwenden dürfen.Die Groß- und Kleinschreibung spielt bei der Vergabe von Namen keine Rolle.

In der folgenden Aufgabe sollen zwei Bereiche in der TABELLE3 definiert werden.Dabei sollen der Block KOSTEN (Zellen C5:C24) und der Block LEISTUNG (Zel-len D5:D24) als Namen angesprochen werden können.

Abbildung 6.19: Datumsangaben vereinheitlichen

273

Page 274: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Listing 6.21: Namen vergeben

Sub BereichBenennen()Dim Bereich As RangeDim Bereich2 As Range

Set Bereich = Sheets("Tabelle3").Range("C5:C24") ActiveWorkbook.Names.Add _ Name:="Kosten", _ RefersTo:=Bereich, Visible:=True Set Bereich2 = Sheets("Tabelle3").Range("D5:D24") ActiveWorkbook.Names.Add _ Name:="Leistung", _ RefersTo:=Bereich2, Visible:=True Bereich.Select

Set Bereich = Nothing Set Bereich2 = NothingEnd Sub

In Listing 6.21 definieren Sie zuerst die beiden Bereiche und speichern diese inden Objektvariablen Bereich bzw. Bereich2. Danach wenden Sie die Methode Addan, um die Namen festzulegen.

Die Methode Add weist dabei folgende Argumente auf:

� Im ersten Argument Name geben Sie den gewünschten Namen an, unter demSie später den Zellbereich ansprechen möchten. Dabei können Sie denNamen frei wählen. Sie müssen allerdings darauf achten, dass Sie bei derNamensgebung die vorher beschriebenen Namenskonventionen einhalten.Den gewählten Namen müssen Sie in Anführungszeichen setzen.

� Das Argument RefersTo gibt an, auf welchen Zellbereich sich der Name bezie-hen soll.

� Das Argument Visible bestimmt, ob der Name für den Anwender sichtbar seinsoll oder nicht. Verwendete Namen können Sie in Excel anzeigen lassen,indem Sie den Befehl NAME/DEFINIEREN aus dem Menü EINFÜGEN wählen.Setzen Sie das Argument Visible auf den Wert False, wenn Sie verhindernmöchten, dass der Anwender den von Ihnen gewählten Namen einsehen kann.

274

Page 275: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen benennen

Die Standardeinstellung für dieses Argument ist jedoch True, was bedeutet,dass sowohl die verwendeten Namen als auch deren Zellenadressen vomAnwender eingesehen werden können.

Möchten Sie die gerade eingefügten Namen wieder löschen, dann starten Sie dasMakro aus Listing 6.22.

Listing 6.22: Namen aus der Arbeitsmappe entfernen

Sub NamenEntfernen()On Error Resume NextWith ThisWorkbook .Names("Kosten").Delete .Names("Leistung").DeleteEnd WithEnd Sub

Wenden Sie die Methode Delete an, die Sie auf das Auflistungsobjekt Namesanwenden. In diesem Auflistungsobjekt sind alle Namen, die in der Arbeitsmappeverwendet werden, dokumentiert. Für alle Fälle sollten Sie eine Fehlerbehand-

Abbildung 6.20: Die Blöcke Kos-ten und Leistung wurden benannt.

275

Page 276: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

lung integrieren, die den Fall abfängt, dass ein Name gelöscht wird, der bereitsnicht mehr in der Arbeitsmappe vorhanden ist. Bei der Fehlerbehandlung in Lis-ting 6.22 wird dieser Fehlerfall einfach ignoriert.

6.5 Zellen kommentieren

Kommentare können Sie in Excel u.a. einsetzen, um wichtige Vermerke zubestimmten Zelleninhalten zu setzen, oder auch, um Änderungen an Zellen zudokumentieren. Ob für eine Zelle ein Kommentar vorgenommen wurde, erken-nen Sie normalerweise am roten Dreieck in der rechten oberen Ecke der Zelle,sofern die Ansicht dieses Indikators unter EXTRAS/OPTIONEN/ANSICHT in Exceleingestellt ist. Wenn Sie den Mauszeiger auf eine Zelle positionieren, wird auto-matisch ein kleines Textfenster eingeblendet, welches den Kommentar beinhaltet.

Kommentarzellen auskundschaften

Wenn Sie mit sehr großen Tabellen arbeiten, die viele Kommentare enthalten, soist es mitunter übersichtlicher, wenn Sie alle Kommentare am Stück in eine Listeschreiben und die dazugehörigen Zellenadressen protokollieren.

Dazu setzen Sie das folgende Makro aus Listing 6.23 ein.

Listing 6.23: Kommentare auflisten

Sub KommentareAuflisten()Dim Notiz As CommentDim Tabelle As WorksheetDim DokuBlatt As StringDim i As Integer

Sheets.AddDokuBlatt = ActiveSheet.Namei = 1

For Each Tabelle In ThisWorkbook.Worksheets For Each Notiz In Tabelle.Comments Sheets(DokuBlatt).Cells(i, 1).Value = Notiz.Text Sheets(DokuBlatt).Cells(i, 2).Value = Notiz.Parent.Address & _ " in " & Tabelle.Name

276

Page 277: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen kommentieren

i = i + 1 Next NotizNext Tabelle

Sheets(DokuBlatt).ActivateWith Columns("A").ColumnWidth = 40.HorizontalAlignment = xlLeft.VerticalAlignment = xlCenterEnd With

With Columns("B").ColumnWidth = 10.HorizontalAlignment = xlLeft.VerticalAlignment = xlCenterEnd WithEnd Sub

Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Comment, um die Noti-zen der Arbeitsmappe ansprechen zu können. Des Weiteren benötigen Sie eineObjektvariable vom Typ Worksheet sowie eine String- und eine Zählvariable vomTyp Integer.

Über die Methode Add fügen Sie eine neue Tabelle ein. Auf dieser Tabelle sollenalle Kommentare, sowohl der Kommentartext als auch die Zellenadresse des Kom-mentars, dokumentiert werden. Den Namen der neu eingefügten Tabelle spei-chern Sie in der Stringvariablen DokuBlatt. Setzen Sie die Zählvariable i auf denStartwert 1. Dieser Startwert steht für die erste Zeile der Tabelle.

Setzen Sie jetzt eine Schleife auf, die alle Tabellen der Arbeitsmappe durchläuft.Eine weitere Schleife arbeitet alle Kommentare der einzelnen Tabellen ab. Innerhalbdieser zweiten Schleife füllen Sie das DokuBlatt in der ersten Spalte mit dem Text desjeweiligen Kommentars, den Sie über die Eigenschaft Text ermitteln können. Bei derErmittlung der Zellenadresse eines Kommentars müssen Sie auf die EigenschaftParent zurückgreifen, die das übergeordnete Objekt des Objekts Comment zurückgibt.Mithilfe der Eigenschaft Address gelingt es Ihnen schließlich, die Zellenadresse desKommentars zu ermitteln und in die zweite Spalte des DokuBlatt zu schreiben.

Wurden alle Kommentare gefunden und in das DokuBlatt geschrieben, sorgen Sienoch für die richtige Formatierung. Dabei definieren Sie über die EigenschaftColumnWidth die Spaltenbreite und kümmern sich mithilfe der EigenschaftenHorizontalAlignment bzw. VerticalAlignment um die Textausrichtung in den Zel-len der Spalten A und B.

277

Page 278: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Kommentare aus Zelleninhalten erstellen

Als Kommentare können Sie auch Zelleninhalte verwenden. Dies ist dann sinn-voll, wenn Sie beispielsweise anschließend Daten aus Zellen löschen, aber nocheine »Sicherung« als Kommentar dieser alten Werte behalten möchten.

Im folgenden Makro aus Listing 6.24 wird auf die TABELLE3 zugegriffen. In dieserTabelle werden alle Zelleneinträge aus dem Bereich C5:D24 herausgenommenund als Kommentare eingefügt.

Listing 6.24: Kommentare aus Zelleninhalten bilden

Sub KommentareAusZellen()Dim Kom As CommentDim Zelle As Range

Sheets("Tabelle3").ActivateRange("C5:D24").Select

For Each Zelle In SelectionOn Error Resume Next Set Kom = Zelle.AddComment Kom.Text Date & Chr(10) & Zelle.Value

Abbildung 6.21: Alle Kommentare der Arbeitsmappe sind auf einem sepa-raten Blatt aufge-listet.

278

Page 279: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen kommentieren

Next ZelleEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Comment sowie einevom Typ Range. Danach aktivieren Sie die gewünschte Tabelle und markieren denBereich, dessen Zellen Sie als Kommentare einfügen möchten. In einer anschlie-ßenden Schleife schieben Sie den Inhalt der einzelnen Zellen jeweils in einKommentarfenster. Dazu erzeugen Sie über die Anweisung Set Kom =Zelle.AddComment ein neues, noch leeres Kommentarfenster. Über die Eigenschaft Texterfassen Sie den Inhalt des Kommentars, der sich aus dem aktuellen Tagesdatum(Date) und dem Zelleninhalt ergibt.

Zellen füllen aus Kommentaren

Gerade haben Sie gelernt, wie Sie aus Zelleninhalten Kommentare machen kön-nen. Auch der umgekehrte Vorgang ist interessant und von praktischer Bedeutung.

Im nächsten Makro aus Listing 6.25 wird auf die TABELLE3 zugegriffen. Auf dieserTabelle werden alle Kommentartexte gesammelt und versetzt um drei Spaltennach rechts wieder in die Zellen eingefügt.

Listing 6.25: Kommentare in Zellen überführen

Sub ZellenMitKommentarenFüllen()Dim Kom As Comment

Abbildung 6.22: Alle Zellen im markierten Bereich wurden mit Kommenta-ren ausgestattet.

279

Page 280: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Sheets("Tabelle3").ActivateFor Each Kom In ThisWorkbook.Sheets("Tabelle3").Comments Range(Kom.Parent.Address).Offset(0, 3).Value = Kom.TextNext KomEnd Sub

Deklarieren Sie zu Beginn eine Objektvariable vom Typ Comment. Mithilfe dieserVariablen bauen Sie sich nun eine Schleife auf, die alle Kommentare derTABELLE3 durchläuft und diese um drei Spalten verschoben in die Zellen derSpalten F und G einfügt. Wo der einzelne Kommentar in der Zelle steckt, ermit-teln Sie über die Anweisung Kom.Parent.Address. Die Verschiebung erreichen Sieüber die Eigenschaft Offset, bei der Sie den Zeilen-Offset auf den Wert 0 (keineZeilenverschiebung) und den Spalten-Offset auf den Wert 3 setzen (Spaltenver-schiebung um drei Spalten nach rechts). Den Inhalt des Kommentars ermittelnSie über die Eigenschaft Text, welche Sie auf die Objektvariable Kom anwenden.

Kommentare löschen

Oftmals dienen Kommentare lediglich als individuelle Gedankenstütze und sinddaher nicht unbedingt immer von allgemeinem Interesse.

Wenn Sie also eine Arbeitsmappe versenden und deren Kommentare aus einerbestimmten Tabelle bzw. aus der ganzen Arbeitsmappe entfernen möchten, dannstarten Sie eines der drei Makros aus Listing 6.26 bis 6.28, welche folgende Funkti-onen erfüllen:

Abbildung 6.23: Die Kommentare aus den Spalten C und D wurden in die Spalten F und G eingefügt.

280

Page 281: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellen kommentieren

� Löschen von Kommentaren, die sich in einem bestimmten Bereich einerTabelle befinden

� Löschen von allen Kommentaren, die sich in einer Tabelle befinden

� Löschen aller Kommentare, die sich in der Arbeitsmappe befinden

Listing 6.26: Kommentare löschen im markierten Bereich

Sub KommentareInTabelleLöschen() Sheets("Tabelle3").Activate Range("C5:D24").Select Selection.ClearCommentsEnd Sub

Für das Löschen von Kommentaren setzen Sie die Methode ClearComments ein.

Um alle Kommentare einer Tabelle zu entfernen, starten Sie das Makro aus Lis-ting 6.27.

Listing 6.27: Alle Kommentare aus einer Tabelle entfernen

Sub KommentareAusTabelleLöschen()Dim Kom As Comment

For Each Kom In ThisWorkbook.Sheets("Tabelle3").Comments Kom.DeleteNext KomEnd Sub

Deklarieren Sie zuerst eine Objektvariable vom Typ Comment, die Sie in eineranschließenden Schleife einsetzen, um alle Kommentare der TABELLE3 abzuar-beiten. Innerhalb der Schleife wenden Sie die Methode Delete an, um die Kom-mentare zu löschen.

Im letzten Makro aus Listing 6.28 werden alle Kommentare, die sich in derArbeitsmappe befinden, entfernt.

Listing 6.28: Alle Kommentare aus der Arbeitsmappe entfernen

Sub KommentareAusMappeLöschen()Dim Tabelle As WorksheetDim Kom As Comment

For Each Tabelle In ThisWorkbook.Worksheets

281

Page 282: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

For Each Kom In Tabelle.Comments Kom.Delete Next KomNext TabelleEnd Sub

Um alle Kommentare aus einer Arbeitsmappe zu entfernen, benötigen Sie zweiSchleifen. Die erste Schleife arbeitet alle Tabellen der Arbeitsmappe ab. Diezweite Schleife durchläuft alle Kommentarzellen der jeweiligen Tabelle und ent-fernt die Kommentare mit Hilfe der Methode Delete.

Gerade haben Sie gelernt, wie Sie Zellen ansteuern und auslesen können. Des Wei-teren können Sie jetzt Zellen formatieren, benennen und mit Kommentaren belegen.

Die Themen nun:

� Arbeiten mit Formeln

� Tabellenfunktionen einsetzen

� Formeln finden und dokumentieren

� Gültigkeitsprüfungen vornehmen

6.6 Arbeiten mit Formeln

Wenn wir von Formeln in VBA sprechen, dann meinen wir in erster Linie die vierGrundrechenarten, die Sie vom Taschenrechner her kennen. Auch bei denRechenregeln rechnet Excel nach der allgemein gültigen Punkt-vor-Strich-Regel.Es folgen nun einige praktische Beispiele, in denen diese Rechenoperationendemonstriert werden.

Alle Makrobeispiele können Sie in der Arbeitsmappe ZellenProg.xls imVerzeichnis Kap06 auf der beiliegenden CD-ROM nachschlagen.

Addition von bestimmten Sätzen

Wenn Sie eine Zählschleife verwenden, dann wird jeder Schleifendurchlauf ineiner Zählvariablen festgehalten. Bei einer solchen Schleife müssen Sie sich aber

282

Page 283: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Formeln

nicht um das Hochzählen der Zählvariablen kümmern. Diese Aufgabe erledigtExcel intern selbst.

In der folgenden Aufgabe soll eine Tabelle Satz für Satz abgearbeitet werden.Dabei sollen Sätze gezählt werden, die einer bestimmten Bedingung (numerischerInhalt) entsprechen. Sehen Sie sich vorher Abbildung 6.24 an.

In dieser Tabelle soll die Anzahl der numerischen Werte ermittelt und dieseaddiert werden. Das Makro dafür lautet:

Listing 6.29: Numerische Zellen werden gezählt und summiert

Sub WerteZählenUndAddieren()Dim i As IntegerDim z As IntegerDim Summe As Single

Sheets("Tabelle1").ActivateRange("A1").Selectz = 0Summe=0

For i = 1 To ActiveSheet.UsedRange.Rows.Count If IsNumeric(ActiveCell) Then z = z + 1 Summe = Summe + ActiveCell.Value Else

Abbildung 6.24: Eine Tabelle mit alphanumeri-schen und numeri-schen Werten

283

Page 284: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

End If ActiveCell.Offset(1, 0).SelectNext iMsgBox "Es wurden " & z & " numerische Werte gefunden!" & _ Chr(13) & _ "Die Summe der numerischen Werte beträgt: " & SummeEnd Sub

Definieren Sie zu Beginn des Makros zwei Zählvariablen vom Typ Integer. Dieeine davon wird für die Schleifensteuerung benötigt, die zweite wird die Anzahlder numerischen Werte in der Tabelle ermitteln. Jetzt benötigen Sie eine Vari-able vom Typ Single, in der Sie die Summe der numerischen Zelleninhalte spei-chern können. Dabei haben Sie mit diesem Datentyp die Möglichkeit, auchNachkommastellen mitzuverarbeiten. Setzen Sie die Variablen z und Summe zuBeginn sicherheitshalber auf den Wert 0. Die Variable i wird in der anschließen-den Schleife auf den Startwert 1 gesetzt. Die Schleife wird solange durchlaufen,bis die letzte gefüllte Zeile in der Tabelle erreicht ist. Diese letzte Zeile ermittelnSie mit der Anweisung ActiveSheet.UsedRange.Rows.Count. Innerhalb derSchleife prüfen Sie mithilfe der Funktion IsNumeric, ob in der aktiven Zelle einnumerischer Wert steht. Wenn ja, dann addieren Sie die Zählvariable z um denWert 1 und speichern den Zellenwert in der Variablen Summe. Setzen Sie danachden Mauszeiger eine Zeile weiter nach unten und arbeiten Sie die Schleife Satzfür Satz ab. Geben Sie die Anzahl sowie die Summe der ermittelten Sätze amEnde des Makros über die Funktion MsgBox auf dem Bildschirm aus.

Abbildung 6.25: Addition von Zellen

284

Page 285: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Formeln

Subtraktion von Datumsangaben

Anhand einer Berechnung, die vom aktuellen Tagesdatum in die Vergangenheitgeht, wird im folgenden Makro eine typische Subtraktion demonstriert. Ausgehendvom aktuellen Datum, werden genau 30 Tage subtrahiert und das Ergebnis aufdem Bildschirm angezeigt.

Listing 6.30: Eine Subtraktion von Datumswerten

Sub DatumsBerechnung()Dim DatumVer As Date

DatumVer = Date – 30MsgBox "Heute ist der " & Date & Chr(13) & _"Vor 30 Tagen war der " & DatumVer, vbInformationEnd Sub

Da Excel intern Datumsangaben in Zahlen umrechnet, ist es kein Problem,Datumsangaben miteinander zu verrechnen. Deklarieren Sie zu Beginn desMakros eine Variable vom Typ Date. Danach wenden Sie die Funktion Date an,die Ihnen das aktuelle Tagesdatum meldet, und subtrahieren Sie davon die Zahl30. Geben Sie das Ergebnis auf dem Bildschirm über die Funktion MsgBox aus.

Preise erhöhen durch Multiplikation

Mit der Multiplikation können Sie z.B. Werte in einer Tabelle anpassen. Durchdie Multiplikation eines Preises mit dem Faktor 1,1 findet eine Preiserhöhung um10% statt. Möchten Sie stattdessen Ihre Preise senken, dann multiplizieren SieIhre Preise mit dem Faktor 0,9, um die Preise um 10% zu senken.

In der folgenden Abbildung sehen Sie eine Artikelliste, die mit dem Faktor 1,1erhöht werden soll.

Abbildung 6.26: Datumssubtraktion durchführen

285

Page 286: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Ihre Aufgabe besteht nun darin, die Preise um den Faktor, der in Zelle F1 angege-ben ist, zu erhöhen. Dabei sollen die alten Preise in Spalte C erhalten bleiben.Schreiben Sie die neuen Preise in Spalte D.

Listing 6.31: Preise erhöhen und runden

Sub PreisAnpassung()Dim Faktor As Single

Sheets("Tabelle2").ActivateRange("C2").SelectFaktor = Range("F1").Value

Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.Round(ActiveCell.Value * Faktor, 2) ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Deklarieren Sie zu Beginn des Makros eine Variable vom Typ Single, in der Sieden Faktor aus Zelle F1 speichern, mit dem Sie Ihre Preise anpassen möchten.Nachdem Sie die gewünschte Tabelle und die Startzelle aktiviert haben, durch-laufen Sie eine Schleife, die solange läuft, bis sie auf die erste leere Zelle in SpalteC trifft. Innerhalb der Schleife füllen Sie die Nebenspalte D mit den neu kalku-lierten Preisen. Dabei multiplizieren Sie den aktuellen Zellenwert aus Spalte Cmit dem Faktor und runden das Ergebnis über die Funktion Round. Geben Sie beidieser Funktion noch an, nach wie vielen Stellen hinterm Komma gerundet wer-den soll.

Abbildung 6.27: Die Ausgangs-preisliste

286

Page 287: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Formeln

DM-Umrechnung mit Division

Wenn Sie noch Excel-Arbeitsmappen haben sollten, die Sie auf die Eurowährungumstellen möchten, dann können Sie diese alten DM-Beträge mit dem Faktor1,95583 dividieren, um den Betrag in Euro zu erhalten. Sehen Sie sich dazu ein-mal die folgende Abbildung 6.29 an.

Die DM-Beträge sollen jetzt über ein Makro umgerechnet und in der Spalte Deingefügt werden. Die Lösung dieser Aufgabe sehen Sie in Listing 6.32.

Listing 6.32: Alte DM-Beträge in Euro umrechnen

Sub WährungUmrechnen()Sheets("Tabelle3").ActivateRange("C2").Select

Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.Round(ActiveCell.Value / 1.95583, 2)

Abbildung 6.28: Die Preise wurden um 10% erhöht.

Abbildung 6.29: Die alte Artikelliste in DM-Beträgen

287

Page 288: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Nachdem Sie die gewünschte Tabelle und die Startzelle aktiviert haben, durchlaufenSie eine Schleife, die solange läuft, bis sie auf die erste leere Zelle in Spalte C trifft.Innerhalb der Schleife füllen Sie die Nebenspalte D mit den umgerechneten Preisen.Dabei dividieren Sie den aktuellen Zellenwert aus Spalte C mit dem Faktor 1,95583und runden das Ergebnis über die Funktion Round auf zwei Stellen hinterm Komma.

6.7 Tabellenfunktionen einsetzen

In Excel haben Sie die Möglichkeit, mehrere hundert verschiedene Funktionenüber die normale Arbeitsoberfläche einzusetzen. Sehr viele dieser Tabellenfunk-tionen können Sie auch in VBA einsetzen.

Die Funktionsliste

Alle VBA-Tabellenfunktionen müssen in der englischen Syntax angegeben werden,was nicht unbedingt leicht ist, wenn Sie täglich mit den deutschen Tabellenfunkti-onen in der normalen Arbeitsoberfläche arbeiten. Microsoft bietet Ihnen aber eineHilfe an, indem sie Ihnen eine Excel-Tabelle mit ausliefert, in der Sie eine Gegen-überstellung der deutschen und englischen Funktionen finden. Diese Arbeits-mappe heißt VBAListe.xls und befindet sich in einem Unterverzeichnis von Office.Suchen Sie diese Arbeitsmappe am besten mit der Windows-Suchen-Funktion.

Abbildung 6.30: Die Währungs-umrechnung wur-de durchgeführt.

288

Page 289: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenfunktionen einsetzen

Mit dieser Liste können Sie sich daranmachen, die ersten Tabellenfunktionenüber VBA zu benutzen.

Die Tabellenfunktion Sum

Im ersten Beispiel für den Einsatz von Tabellenfunktionen in Excel-VBA werdenSie alle Preise der TABELLE2 summieren und das Ergebnis der Summation inZelle D11 einfügen.

Listing 6.33: Die Summe der neuen Preise werden ermittelt.

Sub SummeEinsetzen() Sheets("Tabelle2").Activate Range("D11").Value = _ Application.WorksheetFunction.Sum(Range("D2:D9"))End Sub

Aktivieren Sie im ersten Schritt die gewünschte Tabelle. Danach weisen Sie derErgebniszelle direkt über die Eigenschaft WorksheetFunction die Funktion Sum (=Summe) zu. Diese Funktion verlangt als Argument den Bereich, den sie summie-ren soll.

Abbildung 6.31: Eine Gegenüber-stellung von Tabellenfunk-tionen

289

Page 290: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Wie Sie in Abbildung 6.32 sehen, wird nur das Ergebnis der Tabellenfunktion inZelle D11 eingefügt. Im nächsten Makro aus Listing 6.34 wird die Tabellenfunktionso eingefügt, dass diese nicht als Wert, sondern als wirkliche Funktion hinterlegt wird.

Listing 6.34: Eine Tabellenfunktion in eine Zelle einfügen (mit deutschen Befehlen)

Sub SummeEinsetzenAlsTabFunktion() Sheets("Tabelle2").Activate Range("D11").FormulaLocal = _ "=Summe(D2:D9)"End Sub

Mithilfe der Eigenschaft FormulaLocal haben Sie die Möglichkeit, die Tabellen-funktionen so anzugeben, wie Sie es von der Standardoberfläche her kennen.

Sollten Sie mit anderssprachigen Anwendern Makros austauschen, empfiehlt sichaber doch die englische Variante, welche Sie in Listing 6.35 sehen können.

Listing 6.35: Eine Tabellenfunktion in eine Zelle einfügen (mit englischen Befehlen)

Sub SummeEinsetzenAlsTabFunktionEng () Sheets("Tabelle2").Activate Range("D11").Formula = _ "=Sum(D2:D9)"End Sub

In diesem Fall setzen Sie die Eigenschaft Formula ein und geben die Tabellen-funktion in der englischen Schreibweise ein. Dieses Makro funktioniert dann auchin allen Sprachversionen.

Abbildung 6.32: Die neuen Preise wurden summiert.

290

Page 291: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenfunktionen einsetzen

Die Tabellenfunktionen Datedif und Rank

Als zweites Beispiel für den Einsatz von Tabellenfunktionen habe ich mich für dieTabellenfunktionen DATEDIF und Rang entschieden. Mithilfe der Funktion DATEDIFkönnen Sie Datumsberechnungen durchführen. Die Tabellenfunktion Rang, diein der englischen Syntax Rank heißt, legt wie der Name sagt, den Rang einer Zelleinnerhalb einer Liste fest.

In der folgenden Aufgabe sollen die drei ältesten Personen aus einer Liste ermitteltwerden. Dabei wird das Geburtsdatum der Personen in Spalte B erfasst. Ihre Auf-gabe gliedert sich nun in zwei Teilaufgaben:

� Ermitteln des Alters der Personen in Jahren

� Ermitteln der drei ältesten Personen

Sehen Sie sich zu Beginn einmal Abbildung 6.34 an.

Abbildung 6.33: Die Summe wird als Tabellenfunk-tion erfasst.

Abbildung 6.34: Die Ausgangs-situation

291

Page 292: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Füllen Sie jetzt die Spalte C, indem Sie die Tabellenfunktion DATEDIF einsetzen.Sehen Sie sich dazu das Makro aus Listing 6.36 an.

Listing 6.36: Das Alter mithilfe der Tabellenfunktion Datedif ermitteln

Sub AlterErmitteln()Sheets("Tabelle4").ActivateRange("B4").Select

Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).FormulaLocal = _ "=DATEDIF(" & ActiveCell.Address & ";B1;""Y"")" ActiveCell.Offset(1, 0).SelectLoopEnd Sub

In einer Schleife füllen Sie die Spalte C mit dem Alter der jeweiligen Personen.Dabei setzen Sie die Tabellenfunktion DATEDIF ein, der Sie im ersten Argument dieAdresse der aktiven Zelle übergeben müssen und im zweiten Argument das aktuelleTagesdatum, welches in Zelle B1 steht. Im dritten Argument legen Sie über ein For-matkürzel fest, in welcher Einheit Sie das Alter haben möchten. (Tag = D, Monat= M und Jahr = Y). Nachdem das Kürzel in doppelten Anführungsstrichen einge-geben werden muss, müssen Sie in diesem Fall noch zwei weitere doppelte Anfüh-rungsstriche setzen, damit der VBA-Editor die Eingabe richtig auswerten kann.

Im nächsten Schritt sollen die ältesten Personen ermittelt werden. Erfassen Sie zudiesem Zweck das Makro aus Listing 6.37:

Abbildung 6.35: Das Alter in Jahren wurde ermittelt.

292

Page 293: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenfunktionen einsetzen

Listing 6.37: Die ältesten Personen über die Funktion Rank bestimmen

Sub RangErmitteln()Dim Bereich As Range

Sheets("Tabelle4").ActivateSet Bereich = Range("C4:C15")Range("C4").Select

Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.WorksheetFunction.Rank(ActiveCell, Bereich) ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Range. In dieserVariablen geben Sie mithilfe der Anweisung Set bekannt, welcher Zellenbereich fürdie Rangfolgenbestimmung herangezogen werden soll. Setzen Sie danach den Maus-zeiger auf die Startzelle und durchlaufen eine Schleife, die solange durchlaufen wird,bis das Makro auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife fügenSie die Tabellenfunktion Rank über die Eigenschaft WorksheetFunction ein und über-geben dieser Funktion die aktive Zelle sowie den vorher definierten Bereich.

Die Tabellenfunktion SumIf

Im nächsten Beispiel sollen aus einer Liste in TABELLE3 all diejenigen Positionensummiert werden, die einen Wert von 500 Euro oder mehr aufweisen. Für diese

Abbildung 6.36: Wilhelm ist die älteste Person in der Liste.

293

Page 294: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Aufgabe können Sie die Worksheet-Funktion SumIf (= Summewenn) einsetzen.Mithilfe dieser Tabellenfunktion können Sie also eine bedingte Summierungdurchführen.

Listing 6.38: Die bedingte Summierung von Werten

Sub BedingteSummierung()Dim Betrag As Single

Sheets("Tabelle3").ActivateBetrag = Application.WorksheetFunction.SumIf(Range("D2:D9"), ">500")MsgBox "Die Summe der Werte > 500 _ beträgt:" & _Chr(13) & Format(Betrag, "#,##0.00 _"), vbInformationsgBoxEnd Sub

Übergeben Sie der Tabellenfunktion zuerst einmal den Bereich, der summiertwerden soll. Im darauf folgenden Argument formulieren Sie die Bedingung. Mit-hilfe der Funktion Format weisen Sie dem Ergebnis das gewünschte Format zu.

Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in dieTABELLE3 eingefügt werden, starten Sie das folgende Makro aus Listing 6.39.

Listing 6.39: Die Tabellenfunktion bleibt als Funktion in der Tabelle erhalten

Sub BedingteSummierungAlsFunktion()Sheets("Tabelle3").ActivateRange("D12").Formula = "=SumIf(D2:D9,"">500"" )"End Sub

Abbildung 6.37: Alle Werte größer als 500 wurden sum-miert.

294

Page 295: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenfunktionen einsetzen

Weisen Sie der Eigenschaft Formula die Tabellenfunktion SumIf zu und achten Siedabei darauf, dass Sie um Bedingung ein zusätzliches doppelte Anführungszei-chen setzen müssen, damit der VBA-Editor dies so erkennen kann.

Die Tabellenfunktion CountIfIm folgenden Beispiel sollen auf TABELLE4 alle Personen gezählt werden, die älterals 60 Jahre sind. Für diese Aufgabe setzen Sie die Worksheet-Funktion Countif (=Zählenwenn) ein, mithilfe derer Sie die bedingte Zählung durchführen können.

Listing 6.40: Eine bedingte Zählung durchführen

Sub BedingteZählung()Dim i As Integer

Sheets("Tabelle4").Activatei = Application.WorksheetFunction.CountIf(Range("C4:C15"), ">60")MsgBox "Die Anzahl der Personen, die älter als 60 sind, lautet:" & _Chr(13) & i, vbInformationEnd Sub

Übergeben Sie der Funktion CountIf den Bereich, in dem Sie die Personen zählenmöchten, die älter als 60 Jahre sind. Die Bedingung >60 formulieren Sie gleich imAnschluss daran.

Abbildung 6.38: Alle Personen, die älter als 60 sind, werden gezählt und ausgegeben.

295

Page 296: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in dieTABELLE4 eingefügt werden, dann starten Sie das folgende Makro aus Listing6.41.

Listing 6.41: Die Tabellenfunktion wird als Funktion eingefügt

Sub BedingteZählungAlsFunktion()

Sheets("Tabelle4").Activate Range("C18").Formula = "=CountIf(C4:C15, "">60"")"End Sub

Weisen Sie der Eigenschaft Formula die Tabellenfunktion CountIf zu und ach-ten Sie dabei darauf, dass Sie um die Bedingung ein zusätzliches doppeltesAnführungszeichen einfügen müssen, damit der VBA-Editor dies so erkennenkann.

Die Tabellenfunktion Count

Mithilfe der Worksheet-Funktion Count (= Anzahl) können Sie alle numerischenWerte in einer Liste zählen. Im folgenden Beispiel sollen dabei alle numerischenWerte der Spalte A gezählt und ausgegeben werden. Sehen Sie sich dazu dasMakro aus Listing 6.42 an.

Abbildung 6.39: Die Funktion wurde eingefügt.

296

Page 297: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenfunktionen einsetzen

Listing 6.42: Alle numerischen Werte einer Liste zählen

Sub ZählenNumerischeWerte()Dim i As Integer

Sheets("Tabelle1").Activate i = Application.WorksheetFunction.Count(Range("A1:A17")) MsgBox "Die Anzahl der numerischen Werte, lautet:" & _ Chr(13) & i, vbInformationEnd Sub

Wenden Sie die Tabellenfunktion Count (=Anzahl) an, um numerische Werteeiner Liste zu zählen. Den Bereich, der dabei überprüft werden soll, geben Siedirekt im Anschluss an diese Tabellenfunktion an.

Die Tabellenfunktion CountA

Ist es Ihnen egal, was in einer Zelle steht, sei es nun ein numerischer oder einalphanumerischer Wert, dann müssen Sie zur Zählung dieser Zellen die Tabellen-funktion CountA (= Anzahl2) einsetzen, wie Sie dies im nächsten Makro aus Listing6.43 sehen können.

Listing 6.43: Alle gefüllten Zellen werden gezählt.

Sub ZählenAlleZellen()Dim i As Integer

Abbildung 6.40: Die Tabellenfunk-tion Count zählt numerische Werte.

297

Page 298: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Sheets("Tabelle1").Activate i = Application.WorksheetFunction.CountA(Range("A1:A17")) MsgBox "Die Anzahl der gefüllten Zellen, lautet:" & _ Chr(13) & i, vbInformationEnd Sub

Möchten Sie nicht das Ergebnis der Tabellenfunktionen, sondern eben die Tabel-lenfunktionen selbst einfügen, starten Sie das Makro aus Listing 6.44.

Listing 6.44: Die Zählfunktionen in die Tabelle einfügen

Sub ZählungAlsFunktionen() Sheets("Tabelle1").Activate Range("A19").Formula = "=Count(A1:A17)" Range("B19").Formula = "'=Count(A1:A17)" Range("A20").Formula = "=CountA(A1:A17)" Range("B20").Formula = "'=CountA(A1:A17)"End Sub

In der Spalte B werden die eingesetzten Funktionen aus Dokumentationszweckennoch mal als Text eingefügt. Wie Sie sehen, setzen Sie zwar englische Funktionenzum Füllen der Zellen ein. In Spalte A werden diese aber automatisch in ihre ein-gestellte Sprache umgesetzt. In Spalte B unterbleibt diese Konvertierung, da Sie alserstes Zeichen für die jeweilige Zelle einen Apostroph gesetzt und somit dieseZelle als Text definiert haben.

Sie haben gerade gelernt, wie Sie die Anzahl der numerischen Zellen sowie dieAnzahl aller gefüllten Zellen eines Bereiches zählen können.

Wie aber können Sie die alphanumerischen Zellen eines Bereiches zählen?

Für diese Aufgabenstellung gibt es keine eigene Tabellenfunktion in Excel. Siekönnen aber die beiden Tabellenfunktionen CountA und Count voneinander subtra-

Abbildung 6.41: Funktionen auch als Text einfügen

298

Page 299: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tabellenfunktionen einsetzen

hieren, um die Anzahl der alphanumerischen Zellen zu erhalten, wie Sie das imfolgenden Makro sehen können.

Listing 6.45: Zählen von alphanumerischen Zellen

Sub ZählenAlphanumerischeZellen()Dim i As Integer

Sheets("Tabelle1").Activate i = Application.WorksheetFunction.CountA(Range("A1:A17")) _ - Application.WorksheetFunction.Count(Range("A1:A17")) MsgBox "Die Anzahl der alphanumerischen Zellen, lautet:" & _ Chr(13) & i, vbInformationEnd Sub

Durch die Subtraktion beider Tabellenfunktionen erhalten Sie die korrekteAnzahl der alphanumerischen Zellen.

Die Tabellenfunktion CountBlank

Neben den beiden Tabellenfunktionen Count und CountA gibt es die Möglichkeit,in Excel auch leere Zellen eines Bereiches zu zählen. Setzen Sie für diesen Zweckdie Tabellenfunktion CountBlank (= AnzahlLeereZellen) ein.

Im folgenden Beispiel aus Listing 6.46 greifen Sie wiederum auf die TABELLE1 zuund ermitteln im Bereich A1:A18 die Anzahl der leeren Zellen.

Listing 6.46: Die Anzahl der leeren Zellen eines Bereichs ermitteln

Sub ZählenLeereZellen()Dim i As Integer

i = Application.WorksheetFunction.CountBlank(Range("A1:A18"))MsgBox "Die Anzahl der leeren Zellen, lautet:" & _ Chr(13) & i, vbInformationEnd Sub

Übergeben Sie der Tabellenfunktion CountBlank den Bereich, den Sie nach leerenZellen absuchen möchten.

Enthält eine Zelle lediglich ein Leerzeichen, dann meldet die FunktionCountBlank diese Zelle nicht als leer. Sie ist zwar optisch leer, für Excelaber ist das Leerzeichen eben auch ein gültiger Wert.

299

Page 300: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Um solche »leeren« Zellen besser sehen zu können, können Sie ausdem Menü EXTRAS den Befehl OPTIONEN wählen und auf das Register-blatt UMSTEIGEN wechseln. Aktivieren Sie dort das KontrollkästchenALTERNATIVE BEWEGUNGSTASTEN und bestätigen Sie mit OK. Nunwerden leere Zellen, sofern diese aktiviert wurden, in der Bearbeitungs-leiste dadurch gekennzeichnet, dass dort ein Apostroph angezeigt wird.

Da führende bzw. nachgestellte Leerzeichen in der Programmierung oft Prob-leme machen, gibt es in VBA eine Funktion (Trim), die Ihnen hilft, diese Leerstel-len zu beseitigen. Das folgende Makro entfernt innerhalb einer Markierung alleLeerzeichen.

Listing 6.47: Leerzeichen aus markierten Zellen entfernen

Sub LeerzeichenEntfernen()Dim zelle As Range

For Each zelle In Selection zelle.Value = Trim(zelle.Value)Next zelleEnd Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Range.Danach durchlaufen Sie alle Zellen einer Markierung und wenden die FunktionTrim an, um alle Leerzeichen aus den markierten Zellen zu entfernen.

6.8 Formeln finden und dokumentieren

In umfangreichen Tabellen ist es gar nicht so einfach, den Überblick zu bewahren,vor allem, wenn darin viele Formeln und Funktionen verwendet werden.

Abbildung 6.42: Leerzeichen in Zellen werden nun in der Bear-beitungsleiste angezeigt.

300

Page 301: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Formeln finden und dokumentieren

Formelzellen finden

Eine Möglichkeit, sich Formeln, Funktionen und Verknüpfungen anzeigen zu las-sen, besteht darin, die Tastenkombination (Strg) + (#) zu drücken, um in die For-melansicht zu wechseln. Durch erneutes Drücken dieser Tastenkombination wirddie Normalansicht von Excel wiederhergestellt.

Eine andere Hilfe wäre, alle Formeln und Verknüpfungen der aktuellen Tabellezu markieren. Dabei gehen Sie wie folgt vor:

1. Drücken Sie die Taste (F5), um das Dialogfeld GEHE ZU aufzurufen.

2. Klicken Sie danach auf die Schaltfläche INHALTE.

3. Im Dialogfeld INHALTE AUSWÄHLEN aktivieren Sie die OptionsschaltflächeFORMELN.

4. Bestätigen Sie mit OK.

Als Ergebnis werden nun alle Formelzellen der aktuellen Tabelle markiert. Mitder Taste (ÿ) können Sie dann von Zelle zu Zelle springen und die Formel in derBearbeitungsleiste ansehen.

Diese gerade durchgeführte Aufgabe können Sie auch über den Einsatz einesVBA-Makros erledigen, welches Sie in Listing 6.48 sehen können:

Abbildung 6.43: Alle Formelzellen der Tabelle aktivieren

301

Page 302: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Listing 6.48: Formelzellen in einer Tabelle markieren

Sub FormelZellenMarkieren() Sheets("Tabelle4").Activate Selection.SpecialCells(xlCellTypeFormulas).SelectEnd Sub

Mithilfe der Methode SpecialCells, der Sie die Konstante xlCellTypeFormulasübergeben, werden alle Zellen auf dem Tabellenblatt markiert, die entweder For-meln, Funktionen oder Verknüpfungen enthalten.

Über die Methode SpecialCells können Sie mithilfe der folgenden Konstantenaus Tabelle 6.3 auch andere Zellen markieren.

Abbildung 6.44: Alle Formelzellen sind in der Tabelle markiert worden.

Konstante Beschreibung

xlCellTypeAllFormatConditions Markiert alle formatierten Zellen

xlCellTypeAllValidation Zellen mit Gültigkeitsregeln werden markiert.

xlCellTypeBlanks Gibt alle leere Zellen an

xlCellTypeComments Zellen mit Kommentaren werden markiert.

xlCellTypeConstants Zellen mit Konstanten werden markiert.

Tabelle 6.3: Die Konstanten der Methode SpecialCells

302

Page 303: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Formeln finden und dokumentieren

Formelzellen dokumentieren

Wir werden jetzt einen Schritt weiter gehen. Nachdem Sie gerade erfahren haben,wie Sie die Formelzellen der aktiven Tabelle ermitteln können, werden Sie jetztalle verwendeten Formeln und Funktionen der Arbeitsmappe auf einer neuenTabelle dokumentieren. Dabei sind folgende Informationen für die Dokumenta-tion von Interesse:

� Name des Tabellenblattes

� Zellenadresse der Formel oder Funktion

� Formel oder Funktion

� Ergebnis der Formel oder Funktion

Um diese Aufgabe zu lösen, erfassen Sie das Makro aus Listing 6.49:

Listing 6.49: Alle Formeln und Funktionen werden in einer neuen Tabelle dokumentiert

Sub FormelnUndFunktionenDokumentieren()Dim i As IntegerDim Zelle As RangeDim s As StringDim l As Long

Sheets.Add Before:=Worksheets(1)s = ActiveSheet.Name

xlCellTypeFormulas Zellen mit Formeln werden markiert.

xlCellTypeLastCell Letzte Zelle im benutzten Bereich wird angesteuert.

xlCellTypeSameFormatConditions Zellen mit gleichem Format werden markiert.

xlCellTypeSameValidation Zellen mit gleichen Gültigkeitskriterien werden markiert.

xlCellTypeVisible Alle sichtbaren Zellen werden markiert.

Konstante Beschreibung

Tabelle 6.3: Die Konstanten der Methode SpecialCells (Forts.)

303

Page 304: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

l = 1Sheets(s).Cells(l, 1).Value = "Tabelle"Sheets(s).Cells(l, 2).Value = "Zelle"Sheets(s).Cells(l, 3).Value = "Formel/Funktion"Sheets(s).Cells(l, 4).Value = "Inhalt"Range(Cells(l, 1), Cells(l, 4)).Font.Bold = Truel = l + 1

For i = 2 To ThisWorkbook.Worksheets.Count Worksheets(i).Activate On Error Resume Next Selection.SpecialCells(xlCellTypeFormulas).Select For Each Zelle In Selection Sheets(s).Cells(l, 1).Value = Worksheets(i).Name Sheets(s).Cells(l, 2).Value = Zelle.Address Sheets(s).Cells(l, 3).Value = "'" & Zelle.FormulaLocal Sheets(s).Cells(l, 4).Value = Zelle.Value l = l + 1 Next Zelle

Next iSheets(s).Columns("A:D").AutoFitEnd Sub

Im ersten Schritt des Makros fügen Sie über die Methode Add ein neues, noch lee-res Tabellenblatt in die erste Position der Mappe ein. Danach speichern Sie denNamen dieser Tabelle mithilfe der Eigenschaft Name in der Variablen s.

Erfassen Sie nun die Überschriftenzeile dieser neuen Tabelle und verwendendabei die Eigenschaft Cells, der Sie als Zeilenargument die Variable l übergeben,die Sie zuvor auf den Wert 1 gesetzt haben. Damit sprechen Sie also die erste Zeiledieser Tabelle an. Als Spaltenargument setzen Sie je nach Spalte den Wert 1 bis 4ein, um die Spalten A bis D anzusprechen. Markieren Sie direkt im Anschlussdiese vier gefüllten Überschriftenzellen und formatieren Sie mit dem Schrift-schnitt FETT, indem Sie die Eigenschaft Bold auf das Objekt Font anwenden.

Im nächsten Schritt durchlaufen Sie eine Schleife, die jede einzelne Tabelle derArbeitsmappe durchläuft. Innerhalb dieser Schleife aktivieren Sie das jeweiligeTabellenblatt über die Methode Activate und markieren alle Formelzellen mit-hilfe der Anweisung Selection.SpecialCells(xlCellTypeFormulas).Select. Sollteeine Tabelle keine Formel enthalten, dann sorgen Sie über die Anweisung OnError Resume Next dafür, dass es zu keinem Makroabsturz kommt. Enthält eine

304

Page 305: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Formeln finden und dokumentieren

Tabelle also keine Formelzellen, dann wird dies einfach ignoriert und die Makro-verarbeitung wird fortgesetzt.

Sind nun alle Formelzellen der momentan aktiven Tabelle markiert, dann durch-laufen Sie in einer weiteren Schleife alle markierten Zellen. Innerhalb dieserSchleife, schreiben Sie den Namen der momentanen Tabelle in das Dokumentati-onsblatt in Spalte A. Um den Namen zu ermitteln, setzen Sie die Eigenschaft Nameein, die Sie auf das Auflistungsobjekt Worksheets anwenden. Der Index dieses Auf-listungsobjekts, den Sie über die Variable i »variabel« halten, gibt Ihnen Auskunftdarüber, welche Tabelle gerade aktiv ist.

Die Zellenadresse der jeweiligen Formelzelle können Sie über die EigenschaftAddress erfahren und in das Dokumentationsblatt in Spalte B schreiben.

Die eigentliche Formel, die in der markierten Zelle steht, fragen Sie mithilfe derEigenschaft FormulaLocal ab und tragen Sie in Spalte C des Dokumentationsblat-tes ein. Damit diese Formel aber nicht gerechnet wird, müssen Sie dabei als erstesZeichen ein Apostroph einfügen, damit die Formel als Text angezeigt wird.

Den Wert der markierten Formelzelle bekommen Sie über die Eigenschaft Value,die Sie im Dokumentationsblatt in Spalte D schreiben.

Stellen Sie am Ende des Makros die Spalten noch so ein, dass alle Einträge auchauf einen Blick angezeigt werden. Verwenden Sie zu diesem Zweck die MethodeAutoFit, die Sie für die Spalten A bis D anwenden.

Abbildung 6.45: Eine Auflistung aller Formeln/Funktionen der Arbeitsmappe

305

Page 306: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

6.9 Gültigkeitsprüfungen vornehmen

Seit der Version 97 ist es in Excel standardmäßig möglich, für bestimmte Zellenund Bereiche eine Gültigkeitsfunktion anzuwenden. Sie haben dabei die Möglich-keit zu bestimmen, welche Eingaben in einem Bereich gemacht werden dürfenund welche nicht. Bei Falscheingaben können Sie dem Anwender mittels einerBildschirmmeldung mitteilen, wie er die Eingabe zu machen hat. Wenn Siemöchten, können Sie den Anwender sogar schon vor der Eingabe beim Positionie-ren des Cursors im Gültigkeitsbereich durch eine QuickInfo-Meldung auf dierichtige Eingabesyntax aufmerksam machen.

Die Funktion GÜLTIGKEIT können Sie einstellen, indem Sie aus dem MenüDATEN den Befehl GÜLTIGKEIT auswählen.

Standardmäßig sehen Sie es den Zellen nicht an, ob diese mit einem Gültigkeits-kriterium ausgestattet sind oder nicht. Erst wenn Sie den Mauszeiger auf eineZelle mit eingestellten Gültigkeitskriterien positionieren und vorher eine Eingabe-meldung definiert haben, erkennen Sie die Zellen mit Gültigkeitsfunktion.

Eine kleine Ausnahme bildet das Auswahlkriterium LISTE. Damit können Sie füreine Zelle gleich mehrere mögliche Eingaben akzeptieren, die auf eine Liste ver-weisen. In diesem Fall erscheint nach dem Positionieren des Mauszeigers einDropdown-Symbol am rechten unteren Rand der Gültigkeitszelle, welches Ihnennach einem Klick ein Auswahlfenster mit den möglichen Eingabewerten der Listeanbietet.

Lernen Sie nun einige Gültigkeitseinstellungen kennen, die Sie über den Einsatzvon VBA-Makros in Ihre Tabellen einfügen.

Nur ganze Zahlen eingeben

Erstellen Sie nun ein Gültigkeitskriterium für eine Zelle mithilfe von VBA. Aufdem Tabellenblatt TABELLE5 sollen in Zelle C3 nur ganze Zahlen zwischen 1 und10 zugelassen werden. Dazu erstellen Sie das Makro aus Listing 6.50.

Listing 6.50: Nur ganze Zahlen zwischen 1 und 10 dürfen eingegeben werden

Sub GültigkeitHinzufügen() Sheets("Tabelle5").Activate With Range("C3").Validation

306

Page 307: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Gültigkeitsprüfungen vornehmen

.Add Type:=xlValidateWholeNumber, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="1", _ Formula2:="10" .InputTitle = "Zahl eingeben!" .ErrorTitle = "Keine gültige Zahl!" .InputMessage = _ "Geben Sie eine Zahl zwischen 1 und 10 ein." .ErrorMessage = _ "Sie müssen eine Zahl zwischen 1 und 10 eingeben." End With End Sub

Mithilfe der Methode Add fügen Sie der Zelle C3 eine Gültigkeitsregel hinzu. Imersten Argument Type legen Sie das Gültigkeitskriterium fest. Die möglichen Gül-tigkeitskriterien entnehmen Sie Tabelle 6.4.

Abbildung 6.46: Aus einer Liste können Einträge ausgewählt werden.

Abbildung 6.47: Elegante Auswahl aus einem Zellen-Dropdown

307

Page 308: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

Das zweite Argument AlertStyle legt den Stil der Gültigkeitsmeldung fest. Mög-lich sind hierbei xlValidAlertInformation, xlValidAlertStop oder xlValidAlert-Warning. Je nach gewähltem Stil wird ein anderes Symbol in der Meldungangezeigt bzw. wird entsprechend auf Falscheingaben reagiert. Der AlertStylexlValidAlertStop lässt beispielsweise keine andere Eingabe als die definierte zu.Beim AlertStyle xlValidAlertWarning wird zwar bei einer Falscheingabe eineWarnmeldung angezeigt, die Eingabe wird aber trotzdem zugelassen.

Beim nächsten Argument, dem Operator, orientieren Sie sich an Tabelle 6.5:

Type Index Beschreibung

xlValidateInputOnly 0 Jede Eingabe ist erlaubt.

xlValidateWholeNumber 1 Nur ganze Zahlen im definierten Zahlenbereich sind erlaubt.

xlValidateDecimal 2 Nur Dezimalzahlen im definierten Wertbereich werden zugelassen.

xlValidateList 3 Es sind nur Eingaben aus einer vorher definierten Liste möglich.

xlValidateDate 4 Es sind nur Datumswerte im definierten Datums-bereich erlaubt.

XlValidateTime 5 Es sind nur Zeitwerte im definierten Rahmen zulässig.

XlValidateTextLength 6 Es werden nur Eingaben mit bestimmten Längen zugelassen.

XlValidateCustom 7 Benutzerdefiniertes Gültigkeitskriterium

Tabelle 6.4: Die verfügbaren Gültigkeitskonstanten

Operator-Konstante Beschreibung

xlBetween Zellenwert ist zwischen ...

xlNotBetween Zellenwert ist nicht zwischen ...

xlEqual Zellenwert ist gleich ...

Tabelle 6.5: Die Konstanten für den Operator

308

Page 309: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Gültigkeitsprüfungen vornehmen

Die beiden letzten Argumente Formula1 und Formula2 beinhalten die Wertgren-zen. Sehen Sie nun das Ergebnis des Makros in Abbildung 6.48.

Datumsgrenzen einstellen

Mithilfe der Gültigkeitsfunktion in Excel können Sie auch Datumsgrenzen festle-gen. So sollen beispielsweise in Zelle C4 nur Datumsangaben vom 1.1.2002 biszum 31.12.2002 gemacht werden dürfen. Das Makro für diese Aufgabe können Siein Listing 6.51 sehen.

Listing 6.51: Datumsgrenzen als Gültigkeit festlegen

Sub Datumsgrenzen() Sheets("Tabelle5").Activate Range("C4").Select With Selection.Validation .Delete

xlNotEqual Zellenwert ist ungleich ...

xlGreater Zellenwert ist größer ...

xlGreaterEqual Zellenwert ist größer oder gleich ...

xlLess Zellenwert ist kleiner ...

xlLessEqual Zellenwert ist kleiner oder gleich ...

Abbildung 6.48: Falsche Einga-ben werden ver-worfen.

Operator-Konstante Beschreibung

Tabelle 6.5: Die Konstanten für den Operator (Forts.)

309

Page 310: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

.Add Type:=xlValidateDate, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, _ Formula1:=CDate("1/1/2002"), _ Formula2:=CDate("31/12/2002") .IgnoreBlank = True .InputTitle = "Datum eingeben" .ErrorTitle = "Falsches Datum" .InputMessage = _ "Gültiges Datum zw. dem 1.1.2002 und dem 31.12.2002 eingeben" .ErrorMessage = _ "Sie haben kein gültiges Datum eingegeben!" .ShowInput = True .ShowError = True End With End Sub

Vorsorglich löschen Sie eine eventuell schon bestehende Gültigkeitsregel mit derMethode Delete. Danach fügen Sie eine neue Gültigkeitsregel über die MethodeAdd ein und legen den Gültigkeitstyp über die Eigenschaft Type fest.

Bei der Eingabe des Gültigkeitskriteriums müssen Sie auf alle Fälle die FunktionCDate verwenden. Sie sorgt dafür, dass die String-Angabe ("1/1/2002") in ein gülti-ges Datumsformat konvertiert wird.

Die Eigenschaft IgnoreBlank setzen Sie auf den Wert True, wenn Sie leere Wertezulassen möchten. Danach definieren Sie zuerst den Eingabetitel sowie die Fehlertitelund anschließend die beiden Meldungen. Bei den beiden Eigenschaften ShowInput

Abbildung 6.49: Datumseingaben überprüfen

310

Page 311: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Gültigkeitsprüfungen vornehmen

und ShowError handelt es sich um eine Art Schalter, den Sie setzen können. Standard-mäßig sind diese beiden Schalter jedoch gesetzt. Indem Sie einen Schalter auf denWert False setzen, wird die definierte Meldung als QuickInfo nicht mehr angezeigt.

Gültigkeitsliste erstellen

Um dem Anwender mögliche Eingaben anzubieten, können Sie diese auch ineiner Liste zusammenstellen und ihm als Zellen-Dropdown anbieten.

In der folgenden Aufgabe aus Listing 6.52 wird auf der TABELLE5 in der Zelle C5ein Zellen-Dropdown eingefügt, welches verfügbare Kostenstellen anbietet.

Listing 6.52: Eine Gültigkeitsliste erstellen

Sub ListeDefinieren() Sheets("Tabelle5").Activate Range("C5").Select With Selection.Validation .Delete .Add Type:=xlValidateList, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlEqual, _ Formula1:="1790, 1800, 1830, 1850, 1900" .InputMessage = _ "Bitte Kostenstelle auswählen" End With End Sub

Um eine Gültigkeitsliste zusammenstellen zu können, müssen Sie eine Gültigkeitüber die Methode Add vom Typ xlValidateList einfügen. Danach geben Sie imArgument Operator die Konstante XlEqual an und im Argument Formula1 die ein-zelnen möglichen Kostenstellen, jeweils getrennt durch ein Komma, ein.

Abbildung 6.50: Ein Zellen-Dropdown zur Verfügung stellen

311

Page 312: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

6.10 Fragen & Antworten

F Wie können Sie die letzten fünf Zellen einer Spalte markieren?

A Diese Aufgabe können Sie mit folgendem Makro lösen:

Listing 6.53: Die letzten fünf Zellen einer Spalte markieren

Sub Letzte5ZeilenInSpalteMarkieren() Sheets("Tabelle14").Activate Range("A65536").End(xlUp).Select Range(Selection, ActiveCell.Offset(-4, 0)).SelectEnd Sub

Über die Eigenschaft End ermitteln Sie die letzte belegte Zelle der SpalteA. Von da ab markieren Sie über die Methode Select die darüber liegen-den vier Zellen, indem Sie den Zellen-Offset auf den Wert –4 setzen.

F Wie können Sie aus allen benutzten Zellen einer Tabelle die Leerzeichen elimi-nieren?

A Starten Sie zu diesem Zweck das folgende Makro:

Listing 6.54: Leerzeichen aus Zellen entfernen

Sub LeerzeichenAusZellenEntfernen()Dim zelle As Range

Worksheets("Tabelle16").Activate

For Each zelle In ActiveSheet.UsedRange zelle.Value = Application.Trim(zelle.Value)Next zelleEnd Sub

Über die Anweisung ActiveSheet.Usedrange erfahren Sie den benütztenBereich Ihrer Tabelle. Durchlaufen Sie danach jede einzelne Zelle diesesBereichs und setzen Sie die Funktion Trim ein, um die Leerzeichen in denZellen zu entfernen.

F Wie können Sie über den Einsatz einer Tabellenfunktion in VBA den zweitgröß-ten Wert in einem Bereich ermitteln?

A Setzen Sie für diese Aufgabe die Funktion Large ein.

312

Page 313: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Quiz

Listing 6.55: Die zweitgrößte Zahl in einem Bereich ausgeben

Sub ZweitGrößteZahlErmitteln()Dim i As Single

Sheets("Tabelle1").Activate i = Application.WorksheetFunction.Large(Range("A1:A17"), 2) MsgBox "Die zweit-größte Zahl lautet: " & _ Chr(13) & i, vbInformationEnd Sub

Die Funktion Large benötigt zwei Argumente. Im ersten Bereich geben Siedie Adresse des Bereichs an, in dem Sie nach der zweithöchsten Zahlsuchen möchten. Das zweite Argument gibt den Rang wieder.

F Wie können Sie die Anzahl der Formelzellen auf einer Tabelle zählen?

A Geben Sie dazu das Makro aus Listing 6.56 ein:

Listing 6.56: Formelzellen in einer Tabelle zählen

Sub FormelnZählen()Dim l As LongDim zelle As Range

For Each zelle In ActiveSheet.Cells.SpecialCells(xlFormulas) l = l + 1Next zelleMsgBox "Die Anzahl der Formelzellen lautet: " & lEnd Sub

Über die Methode SpecialCells, der Sie die Konstante xlFormulas mitge-ben, können Sie die Formelzellen in einer Tabelle ermitteln. Diese mar-kieren Sie über die Methode Select. Innerhalb der Schleife zählen Sie diemarkierten Zellen.

6.11 Quiz

F Wie kann man mithilfe der Eigenschaft Cells eine Zelle ansteuern?

F Wie können Sie den verwendeten Bereich einer Tabelle bestimmen?

313

Page 314: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Zellbearbeitung mit VBA

F Welche Methode muss man einsetzen, wenn man mehrere Bereiche vereinenmöchte?

F Wie können Sie die Hintergrundfarbe der aktiven Zelle am schnellsten bestim-men?

F Was muss man bei der Vergabe von Namen mit VBA beachten?

F Was ist der Unterschied zwischen den beiden Eigenschaften Formula bzw. For-mulaLocal?

F Wie heißt die Arbeitsmappe, in der eine Gegenüberstellung von englischen unddeutschen Tabellenfunktionen angeboten wird?

F Mit welcher Methode kann man sich bestimmte Zellen in einer Tabelle markie-ren lassen?

F Was müssen Sie bei der Gültigkeitsprüfung in Bezug auf Datumseingabenbeachten?

6.12 Übungen

Zum Abschluss des Tages versuchen Sie die folgenden Übungen zu bearbeiten.Die Lösungsmakros können Sie im Anhang A nachblättern:

1. Erstellen Sie eine neue Tabelle und fügen Sie dort im Bereich A1:D20 einigeZahlenwerte ein. Ihre Aufgabe besteht nun darin, alle Zellen zu kennzeich-nen, die einen Wert größer 500 aufweisen. Färben Sie diese Zellen mit derHintergrundfarbe GELB.

2. Listen Sie die Zellenadressen aller verwendeten Namen einer Arbeitsmappe ineinem Meldungsfenster auf.

3. Dokumentieren Sie alle verwendeten Namen einer Arbeitsmappe, indem Sieeine neue Tabelle einfügen und den Namen und dessen Zellenadresse ausgeben.

4. Löschen Sie alle Gültigkeitsfestlegungen aus einer Tabelle.

5. Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte.

314

Page 315: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

7

Aktionen und Benutzer-eingaben in Excel

überwachen

Page 316: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Gestern haben Sie gelernt, wie Sie mit Formaten, Formeln und Tabellenfunktio-nen in VBA-Excel umgehen. Auch das Aufspüren von Formeln und deren Konver-tierung in Festwerte sowie die Gültigkeitsprüfung waren weitere wichtigeThemen.

Die Themen heute:

� Was sind Ereignisse?

� Ereignisse auf Arbeitsmappenebene

� Ereignisse auf Tabellenblattebene

� Excel über Tastenkombinationen steuern

� Programmieren mit der Maus

� Excel zeitmäßig steuern

7.1 Was sind Ereignisse?

Die Programmierung von Ereignissen ist eines meiner Lieblingsthemen in derVBA-Programmierung. Was steckt dahinter? Nun, unter einem Ereignis könnenSie alle möglichen Vorgänge in Excel fassen, wie z.B. das Öffnen einer Arbeits-mappe, das Eingeben von Daten, das Drucken von Tabellen oder den Speicher-vorgang einer Mappe. Dies alles sind typische Vorgänge in Excel, die auchEreignisse genannt werden. Sie haben die Möglichkeit, weitere Aktionen diesenEreignissen anzuhängen, d.h. Sie können beispielsweise dafür sorgen, dass beimEreignis Öffnen einer Arbeitsmappe weitere VBA-Befehle ausgeführt werden sol-len. Sie haben somit die Möglichkeit, auf jedes Ereignis in Excel individuell zureagieren.

Bei den Ereignissen unterscheidet man in erster Linie zwischen Ereignissen, diefür die gesamte Arbeitsmappe gelten, und Ereignissen, die nur auf bestimmtenTabellenblättern Geltung haben. Ereignisse für eine Arbeitsmappe wären bei-spielsweise das Öffnen, Speichern, Drucken oder Schließen einer Arbeitsmappe.Ein Beispiel für ein Tabellenereignis wäre z.B. die Erfassung von Daten in einerTabelle oder das Aktivieren bzw. Verlassen einer Tabelle.

Selbstverständlich gibt es noch viele weitere Ereignisse, wie z.B. Ereignisse beiUserForms (Dialogen) und Steuerelementen, die Sie am 13. Tag kennen lernenwerden.

316

Page 317: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ereignisse auf Arbeitsmappenebene

Alle Beispiele dieses Tages finden Sie auf der beiliegenden CD-ROM inden Arbeitsmappen Ereignisse.xls und Steuerung.xls im VerzeichnisKap07.

7.2 Ereignisse auf Arbeitsmappenebene

Wichtige Ereignisse, welche für die Arbeitsmappe gelten, sind zum einen dasEreignis Workbook_Open, das eintritt, sobald die Arbeitsmappe geöffnet wird, undzum anderen das Ereignis Workbook_BeforeClose, welches automatisch ausgelöstwird, sobald die Arbeitsmappe geschlossen wird.

Das Ereignis Workbook_Open

Das Ereignis Workbook_Open (beim Öffnen) wird in der Praxis meist eingesetzt, umMeldungen anzuzeigen, um benutzerdefinierte Arbeitsumgebungen einzurichten,um Sachverhalte zu prüfen oder auch um viele verschiedene Aufgaben zu erledi-gen, die einen vorbereitenden Charakter haben.

Im nächsten Beispiel werden Sie beim Öffnen einer Arbeitsmappe dafür sorgen,dass eine bestimmte Tabelle aktiviert wird. Standardmäßig stellt Excel beim Öff-nen einer Arbeitsmappe immer die Tabelle ein, die direkt vor der letzten Speiche-rung der Arbeitsmappe aktiviert war. Wenn Sie daran denken, dass Siebeispielsweise eine Art Inhaltsverzeichnis für die Arbeitsmappe in TABELLE1erstellt haben, wäre es nun eine tolle Sache, diese Tabelle standardmäßig beimÖffnen der Arbeitsmappe einzustellen.

Um das Ereignis Workbook_Open einzustellen, gehen Sie wie folgt vor:

1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungs-umgebung zu gelangen.

2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an.

3. Klicken Sie im Codefenster auf den Pfeil des linken Kombinationsfeldes undwählen Sie den Eintrag Workbook aus. Excel stellt Ihnen nun standardmäßigein schon vorgefertigtes Ereignismakro zur Verfügung.

317

Page 318: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Private Sub Workbook_Open()

End Sub

Mit einem Klick auf das zweite Kombinationsfeld bekommen Sie alleverfügbaren Ereignisse angezeigt, welche für die Arbeitsmappe einsetz-bar sind.

Ergänzen Sie nun den eingestellten Rahmen des Ereignisses um folgende Zeilen:

Listing 7.1: Beim Öffnen eine bestimmte Tabelle aktivieren

Private Sub Workbook_Open()On Error GoTo fehler Worksheets("Tabelle1").Activate Exit Sub

fehler: MsgBox "Die Tabelle ist nicht vorhanden!"End Sub

Abbildung 7.1: Das Ereignis Workbook_Open einstellen

318

Page 319: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ereignisse auf Arbeitsmappenebene

Bauen Sie sicherheitshalber eine Fehlerbehandlung in ein Ereignis ein. Für denFall, dass das gewünschte Tabellenblatt umbenannt bzw. gelöscht wurde, habenSie somit verhindert, dass das Makro abstürzt.

Möchten Sie eine Arbeitsmappe mit hinterlegten Ereignissen öffnenund dabei auf deren Ausführung verzichten, so drücken Sie beim Öff-nen der Datei die Taste (ª).

Das Ereignis Workbook_BeforeClose

Das Ereignis Workbook_BeforeClose (vor dem Schließen) tritt genau dann ein,wenn Sie versuchen, eine Arbeitsmappe zu schließen. Dieses Ereignis kann aberauch so eingestellt werden, dass es abgebrochen wird, d.h. über einen Trick kön-nen Sie verhindern, dass eine Arbeitsmappe geschlossen wird. Sie können dabeiaber eine versteckte Möglichkeit bereithalten, die es Ihnen dennoch erlaubt, dieArbeitsmappe zu schließen.

Im folgenden Beispiel in Listing 7.2 kann eine Arbeitsmappe nur dann geschlossenwerden, wenn in TABELLE1 in Zelle C1 der Text OK steht. Um dieses Ereignis ein-zustellen, verfahren Sie wie folgt:

1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungs-umgebung zu gelangen.

2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an.

3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes undwählen Sie den Eintrag Workbook aus.

4. Im zweiten Kombinationsfeld, rechts oben, wählen Sie den Eintrag BeforeClose aus.

5. Ergänzen Sie das Ereignis wie folgt:

Listing 7.2: Das Schließen einer Arbeitsmappe verhindern

Private Sub Workbook_BeforeClose(Cancel As Boolean)If Worksheets("Tabelle1").Range("C1").Value <> "OK" Then MsgBox "Arbeitsmappe kann nicht geschlossen werden!" Cancel = True Else Cancel = False

319

Page 320: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

ThisWorkbook.SaveEnd IfEnd Sub

Nur wenn in der Zelle C1 ein Wert ungleich »OK« steht, kann die Arbeitsmappegeschlossen werden. In diesem Fall wird das Argument Cancel auf den Wert Falsegesetzt, die Arbeitsmappe über die Methode Save gespeichert und geschlossen. Imandern Fall bleibt die Arbeitsmappe geöffnet.

Das Speichern der Arbeitsmappe ist aber weiterhin möglich!

Das Ereignis Workbook_BeforeSave

Beim Ereignis Workbook_BeforeSave (vor dem Speichern) können Sie gezieltdarauf reagieren, wenn eine Arbeitsmappe gespeichert wird.

Im folgenden Beispiel wird verhindert, dass eine Arbeitsmappe gespeichert werdenkann. Damit können Sie Ihre Arbeitsmappe vor Veränderungen schützen, ohnedie Arbeitsmappe durch ein Kennwort zu schützen. Die Speicherung soll aber ineinem bestimmten Fall doch möglich sein, und zwar vereinbaren Sie, dass dieArbeitsmappe gespeichert werden darf, wenn das Datum in Zelle A1 derTABELLE1 dem aktuellen Datum entspricht.

Setzen Sie diese Aufgabenstellung nun um, indem Sie die nächsten Arbeitsschrittebefolgen:

1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungs-umgebung zu gelangen.

2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an.

3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes undwählen Sie den Eintrag Workbook aus.

4. Im zweiten Kombinationsfeld, rechts oben, wählen Sie den Eintrag BeforeSaveaus.

5. Ergänzen Sie das Ereignis wie folgt:

Listing 7.3: Speichern ist nur über eine Bedingung möglich

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean)If Worksheets("Tabelle1").Range("A1").Value <> Date Then

320

Page 321: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ereignisse auf Arbeitsmappenebene

MsgBox "Arbeitsmappe kann nicht gespeichert werden!" Cancel = True Else Cancel = FalseEnd IfEnd Sub

Nur wenn in der Zelle A1 ein Datumswert steht, der dem aktuellen Tagesdatumentspricht, kann die Arbeitsmappe gespeichert werden. In diesem Fall wird dasArgument Cancel auf den Wert False gesetzt und die Arbeitsmappe gespeichert.

Das Ereignis Workbook_NewSheets

Mit dem Ereignis Workbook_NewSheets (beim Einfügen einer neuen Tabelle), daserst ab der Excel-Version 2002 verfügbar ist, können Sie auf das Einfügen neuerTabellenblätter in eine Arbeitsmappe reagieren.

Im folgenden Beispiel können Sie neue Tabellenblätter nur einfügen, wenn Sieein bestimmtes Kennwort wissen.

Setzen Sie diese Aufgabenstellung nun um, indem Sie die nächsten Arbeitsschrittebefolgen:

1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungs-umgebung zu gelangen.

2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an.

3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes undwählen Sie den Eintrag Workbook aus.

4. Im zweiten Kombinationsfeld, rechts oben, wählen Sie den Eintrag NewSheetaus.

Ergänzen Sie das Ereignis wie folgt:

Listing 7.4: Die Neuanlage von Tabellen überwachen

Private Sub Workbook_NewSheet _(ByVal Sh As Object)Dim s As String

s = InputBox("Wie heißt das Kennwort?")

321

Page 322: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

If s <> "Test" Then Application.DisplayAlerts = False Sh.Delete Application.DisplayAlerts = TrueElseEnd IfEnd Sub

Fragen Sie zu Beginn des Ereignisses ein Kennwort ab und werten Sie die Eingabedes Benutzers aus. Er kann zwar die Tabelle neu anlegen, diese wird aber wiederüber die Methode Delete entfernt, sofern er das falsche Kennwort eingegeben hat.Damit beim Löschvorgang der Tabelle keine Rückfragemeldung von Excel ange-zeigt wird, setzen Sie die Eigenschaft DisplayAlerts auf den Wert False. Nachdem Löschen der Tabelle setzen Sie diese Eigenschaft wieder auf den Wert True.

Weitere Arbeitsmappenereignisse im Überblick

Entnehmen Sie aus der Tabelle 7.1 alle möglichen Ereignisse, die Sie für dieArbeitsmappe anwenden können. Das eine oder andere Ereignis werden Sie imLaufe der nächsten Tage wieder sehen.

Ereignis Beschreibung

Workbook_Activate Tritt ein, sobald eine Arbeitsmappe aktiviert wird.

Workbook_AddinInstall Tritt ein, wenn ein Add-In eingebunden wird. Dies kann entweder durch direktes Öffnen des Add-Ins erfolgen oder auch durch das Einbinden im Add-Ins-Manager.

Workbook_AddinUninstall Tritt ein, wenn ein Add-In aus dem Add-Ins-Manager deaktiviert wird.

Workbook_BeforePrint Tritt vor dem Druck einer Arbeitsmappe oder auch nur einzelner Tabellen ein.

Workbook_BeforeSave Tritt vor dem Speichern-Vorgang ein. Dabei spielt es keine Rolle, ob Sie über Menübefehle, Symbolleiste oder Tastenkombination speichern.

Tabelle 7.1: Alle Arbeitsmappenereignisse im Überblick

322

Page 323: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ereignisse auf Arbeitsmappenebene

Workbook_Deactivate Tritt ein, wenn eine Arbeitsmappe deaktiviert wird, beispielsweise wenn eine Arbeitsmappe minimiert wird.

Workbook_NewSheet Tritt ein, wenn eine neue Tabelle in die Arbeitsmappe eingefügt wird.

Workbook_SheetActivate Tritt ein, wenn ein beliebiges Tabellen- oder Diagrammblatt in der Arbeitsmappe aktiviert wird.

Workbook_SheetBeforeDoubleClick Tritt ein, wenn an einer beliebigen Stelle der Arbeitsmappe ein Doppelklick mit der linken Maustaste durchgeführt wird.

Workbook_SheetBeforeRightClick Tritt ein, wenn an einer beliebigen Stelle der Arbeitsmappe ein Klick mit der rechten Maustaste durchgeführt wird.

Workbook_SheetCalculate Tritt nach Neuberechnung jedes Tabellenblattes auf.

Workbook_SheetChange Tritt ein, wenn sich auf einem beliebigen Tabellenblatt etwas ändert, sei es durch eine Verknüpfung oder durch den Anwender.

Workbook_SheetDeactivate Tritt ein, sobald ein beliebiges Tabellenblatt in der Arbeitsmappe verlassen wird.

Workbook_SheetFollowHyperlink Tritt ein, wenn der Anwender auf einen Hyperlink in einer Tabelle klickt.

Workbook_SheetSelectionChange Tritt ein, wenn sich die Markierung auf einem Tabellenblatt ändert.

Workbook_WindowActivate Tritt ein, wenn ein Arbeitsmappenfenster aktiviert wird.

Workbook_WindowDeactivate Tritt ein, wenn ein Arbeitsmappenfenster deaktiviert wird.

Workbook_WindowResize Tritt ein, wenn eine Änderung an der Größe des Arbeitsmappenfensters durchgeführt wurde.

Ereignis Beschreibung

Tabelle 7.1: Alle Arbeitsmappenereignisse im Überblick (Forts.)

323

Page 324: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

7.3 Ereignisse auf Tabellenblattebene

Im Gegensatz zu Arbeitsmappenereignissen, die für alle Tabellen einer Arbeits-mappe gleichermaßen gelten, können Sie über Tabellenereignisse ganz gezieltEreignisse für bestimmte Tabellenblätter einstellen.

Ein wichtiges Ereignis, das für das Tabellenblatt gilt, ist z.B. das EreignisWorksheet_Activate, mit dem Sie bestimmen können, was passieren soll, wenn einbestimmtes Tabellenblatt aktiviert wird. Auch das Ereignis Worksheet_Change istvon großer Bedeutung in der Praxis: Mithilfe dieses Ereignisses können Sie aufÄnderungen in Ihren Tabellen reagieren. Dabei haben Sie die Möglichkeit, Ände-rungen in der gesamten Tabelle oder ganz gezielt in einzelnen Zellen oder Berei-chen zu überwachen.

Das Ereignis Activate

Das Ereignis Activate (beim Aktivieren) tritt dann ein, wenn Sie eine Tabelle akti-vieren. Dabei ist es egal, ob Sie die Tabelle über die Registerlaschen, über die Tas-tenkombination (Strg) + (Bild_½) bzw. (Strg) + (Bild_¼) oder gar über einenFensterwechsel ansteuern. In allen Fällen wird dieses Ereignis ausgeführt, sofernSie es in der Entwicklungsumgebung eingestellt haben.

Im folgenden Beispiel wird beim Aktivieren der TABELLE2 automatisch die aktu-elle Uhrzeit in Zelle A1 eingetragen. Um das Ereignis Activate für diese Aufgabeeinzustellen, verfahren Sie wie folgt:

1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungs-umgebung zu gelangen.

2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisenmöchten, doppelt an. In unserem Beispiel ist das die TABELLE2 (siehe Abbil-dung 7.2).

3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes undwählen Sie den Eintrag Worksheet aus.

4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Activate aus.

5. Ergänzen Sie das noch leere Ereignismakro wie folgt:

324

Page 325: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ereignisse auf Tabellenblattebene

Listing 7.5: Das letzte Zugangsdatum der Tabelle festhalten

Private Sub Worksheet_Activate() Range("A1").Value = Format(Time, "hh:mm")End Sub

Beim Aktivieren der TABELLE2 schreiben Sie in Zelle A1 die momentane Uhrzeitmithilfe der Funktion Time. Formatieren Sie die Zeitangabe über die FunktionFormat, der Sie die Formatkürzel hh für Stunden und mm für Minuten übergeben.

Möchten Sie zusätzlich noch die Sekunden mitanzeigen, dann ändernSie die Zeile wie folgt:

Range("A1").Value = Format(Time, "hh:mm,ss")

Das Ereignis Change

Das wohl am häufigsten eingesetzte Ereignis lautet Change (bei Änderung) undkann eingesetzt werden, um auf Änderungen in Ihrer Tabelle zu reagieren. Siehaben dabei die Möglichkeit, die gesamte Tabelle, einen Teil davon oder einzelneZellen auf Veränderungen hin zu überwachen.

Im folgenden Beispiel werden alle zukünftigen Änderungen der TABELLE3 sofortkenntlich gemacht, indem der Hintergrund dieser Zellen mit der Farbe ROTbelegt wird. Gehen Sie dabei von einer Personalliste aus, welche täglich aktuali-

Abbildung 7.2: Das Ereignis Activate einstellen

325

Page 326: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

siert und am Ende eines Monats zu Auswertungszwecken herangezogen wird. DieÄnderungen an dieser Liste sollen dann nachvollzogen werden können. SchauenSie sich dazu einmal die Ausgangsliste in Abbildung 7.3 an.

Im Verlauf eines Monats können sich einige Dinge ändern, wie beispielsweise fol-gende:

� Ein Mitarbeiter kann das Unternehmen verlassen.

� Ein/e Mitarbeiter/in kann heiraten und dadurch den Namen ändern.

� Ein Mitarbeiter kann an einen anderen Standort versetzt werden.

� Eine Mitarbeiterin kann einer anderen Kostenstelle zugeordnet werden.

� Ein neuer Mitarbeiter kann eingestellt werden.

Solche und weitere Gründe, eine Personalliste zu ändern, gibt es in Hülle undFülle. Machen Sie nun die Veränderungen sichtbar, indem Sie das EreignisWorksheet_Change einstellen. Dabei verfahren Sie wie folgt:

1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungs-umgebung zu gelangen.

2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisenmöchten, doppelt an. In unserem Beispiel ist das die TABELLE3.

3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes undwählen Sie den Eintrag Worksheet aus.

Abbildung 7.3: Die Ausgangsliste

326

Page 327: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ereignisse auf Tabellenblattebene

4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Change aus.

5. Ergänzen Sie das noch leere Ereignismakro wie folgt:

Listing 7.6: Alle Änderungen in der Tabelle einfärben

Private Sub Worksheet_Change(ByVal Target As Range) Target.Interior.ColorIndex = 3End Sub

Wenden Sie die Eigenschaft ColorIndex auf das Objekt Interior (= Hintergrundder Zelle) an und färben Sie das Objekt Target (= Zelle) rot, indem Sie den Farb-index 3 einsetzen.

Haben Sie am Ende des Monats alle Ihre Änderungen nachvollzogen,können Sie die Färbungen wieder entfernen, ohne dass dadurch dasEreignis Change ausgelöst wird. Ereignisse reagieren allgemein nicht aufFormatänderungen.

Im nächsten Beispiel wird das Ereignis Change in TABELLE4 nur ausgelöst, wennÄnderungen in einem bestimmten Bereich C4:C8 durchgeführt werden. SehenSie sich vorab einmal Abbildung 7.5 an.

Alle Eingaben im Bereich C4 bis C8 sollen sofort in Großbuchstaben umgewan-delt werden. Erfassen Sie zu diesem Zweck das Ereignis Change hinter derTABELLE4.

Abbildung 7.4: Die Änderungen werden sofort ersichtlich.

327

Page 328: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Listing 7.7: Einen Bereich überwachen

Private Sub Worksheet_Change(ByVal Target As Range)Dim Bereich As Range

Set Bereich = Range("C4:C8") If Not Intersect(Target, Bereich) Is Nothing Then Target = UCase(Target) End IfEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range und gebenSie über die Anweisung Set bekannt, wo sich der zu überwachende Bereich in derTabelle befinden soll. Über die Methode Intersect prüfen Sie, ob die geänderteZelle im definierten Zielbereich Bereich liegt. Wenn ja, setzen Sie die FunktionUCase in, um die eingegebenen Buchstaben in Großbuchstaben umzuwandeln.

Um Buchstaben in Kleinbuchstaben zu wandeln, setzen Sie die Funk-tion LCase ein.

Abbildung 7.5: Im Formular soll auf Eingaben rea-giert werden.

Abbildung 7.6: Eingaben im Bereich C4:C8 werden automa-tisch nach Drü-cken der Taste (Enter) in Groß-buchstaben umge-setzt.

328

Page 329: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ereignisse auf Tabellenblattebene

Das Ereignis Selection_Change

Wenn Sie auf der Suche nach einer bestimmten Information in einer Tabelle sindund diese auch gefunden haben, interessiert Sie nicht nur der Inhalt der gefunde-nen Zelle, sondern oft auch die Informationen, die in den übrigen Zellen derZeile stecken. Aus diesem Grund können Sie das Ereignis Worksheet_SelectionChange (bei Auswahländerung) auch einsetzen, um die Markierung einer Zelle aufdie Markierung der ganzen Zeile auszuweiten.

Stellen Sie das Ereignis Selection_Change nun ein, indem Sie wie folgt vorgehen:

1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungs-umgebung zu gelangen.

2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisenmöchten, doppelt an. In unserem Beispiel ist das die TABELLE4.

3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes undwählen Sie den Eintrag Worksheet aus.

4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Selection_Changeaus.

5. Ergänzen Sie das noch leere Ereignismakro wie folgt:

Listing 7.8: Einen dynamischen Zeilenzeiger programmieren

Private Sub Worksheet_SelectionChange _(ByVal Target As Excel.Range) Application.EnableEvents = False Rows(Target.Row).Select Target.Activate Application.EnableEvents = TrueEnd Sub

Im Listing 7.8 müssen Sie die Ereignissteuerung kurzfristig ausschalten, um zuverhindern, eine Endlosschleife zu produzieren. Dazu setzen Sie die EigenschaftEnableEvents auf den Wert False.

Danach markieren Sie die komplette Zeile und sorgen dafür, dass der Mauszeigertrotzdem wieder auf der ursprünglich markierten Zelle positioniert wird. SetzenSie daraufhin die Eigenschaft EnableEvent wieder auf den Wert True, um dieEreignissteuerung zuzulassen.

329

Page 330: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Das Ereignis Calculate

Das Ereignis Calculate (bei Neuberechnung) wird automatisch ausgelöst, wenndie Tabelle neu berechnet wird. Dies ist immer dann der Fall, wenn sich Formelnbzw. Funktionen aktualisieren.

Im folgenden Beispiel sehen Sie sich einmal Abbildung 7.8 an.

Wenn Sie jetzt die Zelle B10 überwachen möchten, dann können Sie dies nichtüber das Ereignis Change durchführen, da diese Zelle eine Formel beinhaltet, diesich automatisch anpasst, wenn Änderungen in den Zellen B5:B9 durchgeführtwerden.

Sie müssen daher entweder die Zellen B5:B9 überwachen oder ganz allgemein dasEreignis Calculate einsetzen, das automatisch ausgelöst wird, wenn eine Neube-rechnung durchgeführt wird.

Abbildung 7.7: Ein automatischer Zeilenzeiger

Abbildung 7.8: Das einfache Summierungsbei-spiel

330

Page 331: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ereignisse auf Tabellenblattebene

Um das Ereignis Calculate einzustellen, verfahren Sie wie folgt:

1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungs-umgebung zu gelangen.

2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisenmöchten, doppelt an. In unserem Beispiel ist das die TABELLE6.

3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes undwählen Sie den Eintrag Worksheet aus.

4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Calculate aus.

5. Ergänzen Sie das noch leere Ereignismakro wie folgt:

Listing 7.9: Das Ereignis Calculate wird bei Änderungen in der Tabelle ausgeführt.

Private Sub Worksheet_Calculate()MsgBox "Es wurde eine Neuberechnung der Tabelle durchgeführt!"End Sub

Weitere Tabellenereignisse im Überblick

Entnehmen Sie der folgenden Tabelle alle Ereignisse, die Sie auf Tabellenebeneeinsetzen können.

Ereignis Beschreibung

Worksheet_Activate Tritt ein, wenn ein Tabellenblatt aktiviert wird.

Worksheet_Change Tritt ein, wenn sich der Wert in einer Zelle ändert.

Worksheet_Calculate Tritt ein, wenn eine Tabelle neu berechnet wird.

Worksheet_Deactivate Tritt ein, wenn ein Tabellenblatt deaktiviert wird, beispiels-weise wenn ein Tabellenblatt verlassen wird.

Worksheet_FollowHyperlink Tritt ein, wenn der Anwender auf einen Hyperlink in einer Tabelle klickt.

Worksheet_SelectionChange Tritt ein, wenn sich die Markierung auf einem Tabellen-blatt ändert.

Tabelle 7.2: Alle Tabellenereignisse im Überblick

331

Page 332: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

7.4 Excel über Tastenkombinationen bedienen

Viele Standardfunktionen in Excel können Sie über Tastenkombinationen bzw. F-Tasten abrufen. Am vorhergehenden Tag haben Sie beispielsweise erfahren, dassSie über die Taste (F11) ein Standarddiagramm in Excel einfügen können. Auchdie Tastenkombinationen (Strg) + (C) und (Strg) + (V), um Daten zu kopierenbzw. einzufügen, gehören zum Standard von Excel.

Darüber hinaus haben Sie die Möglichkeit, eigene Tastenkombinationen zu defi-nieren, hinter die Sie dann Ihre eigenen Makros legen. Sie können somit IhreArbeit in Excel optimieren und Arbeiten noch schneller erledigen. Lernen Sie nunauf den nächsten Seiten ein paar typische Beispiele aus der Praxis kennen, beidenen Sie eigene Tastenkombinationen einsetzen können.

Formeln und Verknüpfungen in Festwerte wandeln

Im ersten Beispiel werden Sie über eine vorher definierte Tastenkombination alleFormeln, Funktionen bzw. Verknüpfungen im markierten Bereich durch Fest-werte ersetzen. Dies stellt eine nützliche Funktion dar, da Sie auf diese Weise amschnellsten Formeln in Festwerte umsetzen können.

Stellen Sie sich beispielsweise vor, Sie müssten eine Tabelle, die Verknüpfungenzu anderen Tabellen oder Arbeitsmappen enthält, an jemanden per E-Mail schi-cken. In diesem Fall ist es besser, alle Verknüpfungen aus der Arbeitsmappe zu

BeforeDoubleClick Tritt ein, wenn an einer beliebigen Stelle der Tabelle ein Doppelklick mit der linken Maustaste durchgeführt wird.

BeforeRightClick Tritt ein, wenn an einer beliebigen Stelle der Tabelle ein Klick mit der rechten Maustaste durchgeführt wird.

Calculate Tritt nach Neuberechnung eines Tabellenblattes auf.

PivotTableUpdate Tritt auf, wenn Sie eine Pivot-Tabelle aktualisieren.

Ereignis Beschreibung

Tabelle 7.2: Alle Tabellenereignisse im Überblick (Forts.)

332

Page 333: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel über Tastenkombinationen bedienen

entfernen, um nicht alle verknüpften Arbeitsmappen mit ausliefern zu müssenund den Anwender nicht durch unnötigen Ballast zu belästigen.

Eine weiteres Anwendungsbeispiel für die Praxis stellt folgendes Szenario dar: Siehaben einige Berechnungen über Funktionen und Formeln in Excel durchge-führt. Die Arbeit ist soweit beendet. Nun möchten Sie sicherheitshalber eineKopie der Arbeitsmappe ohne Formeln abspeichern. Sie können somit sicherstel-len, dass diese Arbeitsmappe nicht mehr durch Formeln oder Funktionen verän-dert werden kann, da die Mappe nur noch Festwerte enthält.

In der folgenden Aufgabe gehen Sie von der Ausgangssituation in Abbildung 7.9aus.

Im ersten Schritt erfassen Sie das Makro, welches die Formelzellen in Festwert-Zellen umsetzt. Danach weisen Sie dem Makro eine Tastenkombination zu, überdie Sie das Makro schnell aufrufen können. Das Makro für die Umsetzung lautet:

Listing 7.10: Alle Formelzellen in Markierung durch Festwerte ersetzen

Sub FormelnFest()Dim Zelle As Range

For Each Zelle In Selection Zelle.Value = Zelle.ValueNext ZelleEnd Sub

Abbildung 7.9: Eine Tabelle, die einige Formeln enthält

333

Page 334: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range. Danachdurchlaufen Sie in einer Schleife alle Zellen, die in der Markierung enthaltensind. Über das Auflistungsobjekt Selection (= Auswahl) erhalten Sie Zugriff aufgenau diese markierten Zellen. Innerhalb der Schleife überschreiben Sie denInhalt der Zelle mit dem Wert der Zelle. Für den Fall, dass es sich hierbei um eineFormelzelle handelt, wird die Formel durch den Festwert ersetzt.

Testen Sie das Makro, indem Sie den Zellenbereich A1:B10 markieren und dasMakro aus Listing 7.10 starten.

Das Makro funktioniert! Nun soll das Starten des Makros über eine Tastenkombi-nation durchgeführt werden. Dies spart Zeit und ist darüber hinaus auch noch ele-gant. Das Zuweisen einer Tastenkombination in Excel sollte dynamisch erfolgen.Dabei bietet sich das Öffnen einer Arbeitsmappe geradezu an. Die so definierteTastenkombination ist danach verfügbar und nun kann auch das der Tastenkombi-nation zugewiesene Makro gestartet werden.

Für das Ersetzen von Formelzellen in Festwerte soll beim Öffnen der Arbeits-mappe Steuerung.xls die Tastenkombination (Strg) + (Ü) definiert werden. Umdiese Aufgabe umzusetzen, befolgen Sie die nächsten Arbeitsschritte:

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Führen Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEAR-BEITSMAPPE durch.

3. Wählen Sie im Codebereich oben aus dem ersten Dropdown-Feld den EintragWorkbook aus.

4. Ergänzen Sie das Workbook_Open-Ereignis wie folgt:

Listing 7.11: Die Tastenkombination (Strg) + (Ü) ist somit aktiviert.

Private Sub Workbook_Open()Application.OnKey "^ü", "FormelnFest"End Sub

Legen Sie eine Tastenkombination fest, indem Sie die Methode OnKey einsetzen.Die Methode OnKey führt die angegebene Prozedur aus, wenn eine bestimmteTaste oder Tastenkombination gedrückt wird.

Die Syntax der Methode lautet Application.OnKey(Key, Procedure).

Das Argument Key entspricht der Tastenkombination, die gedrückt wird. Das Argu-ment Procedure ist optional. Es entspricht dem Makro, welches Sie der Tasten-

334

Page 335: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel über Tastenkombinationen bedienen

kombination zuweisen möchten. Bleibt dieses Argument leer (»«), dann hat dasDrücken der Taste keine Wirkung.

Entnehmen Sie Tabelle 7.3 alle möglichen Tasten und deren Codebelegung, dieSie für die Programmierung einsetzen können.

Taste Codebelegung

(æ___) {BACKSPACE} oder {BS}

(Pause) {BREAK}

(º__) {CAPSLOCK}

(Entf) {CLEAR}

(Entf) {DELETE} oder {DEL}

(¼) {DOWN}

(Ende) {END}

(Enter) Zehnertastatur {ENTER}

(~) ~ (Tilde)

(Esc) {ESCAPE} oder {ESC}

(Hilfe) {HELP}

(Pos1) {HOME}

(Einfg) {INSERT}

(æ) {LEFT}

(Num) {NUMLOCK}

(Bild_¼) {PGDN}

(Bild_½) {PGUP}

(Enter) {RETURN}

(Æ) {RIGHT}

(Rollen) {SCROLLOCK}

Tabelle 7.3: Die verfügbaren Tasten in Excel-VBA

335

Page 336: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

In jeder Anwendung von Windows können die Tasten aus Tabelle 7.3 auch mitden Tasten (Alt), (Strg) oder (ª) kombiniert werden. Entnehmen Sie der nach-folgenden Tabelle 7.4 die Kodierung dieser Zusatztasten.

Nachdem Sie die Tastenkombination (Strg) + (Ü) dem Makro FormelnFest zuge-wiesen haben, sollten Sie beim Schließen der Arbeitsmappe Steuerung.xls dafürsorgen, dass diese Tastenkombination wieder aufgehoben wird. Dabei verfahrenSie wie folgt:

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Führen Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEAR-BEITSMAPPE durch.

3. Wählen Sie im Codebereich oben aus dem ersten Dropdown-Feld den EintragWorkbook aus.

4. Im zweiten Dropdown-Feld wählen Sie den Eintrag BeforeClose aus undergänzen das Ereignis wie folgt:

(ÿ) {TAB}

(½) {UP}

(F1) bis (F15) {F1} bis {F15}

Zusatztaste Vorangestelltes Zeichen

(ª) + (Pluszeichen)

(Strg) ^ (Caret-Zeichen)

(Alt) % (Prozentzeichen)

[BEFEHLSTASTE] * (Sternchen)

Tabelle 7.4: Die Zusatztasten

Taste Codebelegung

Tabelle 7.3: Die verfügbaren Tasten in Excel-VBA (Forts.)

336

Page 337: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel über Tastenkombinationen bedienen

Listing 7.12: Die Tastenkombination (Strg) + (Ü) wieder deaktivieren

Private Sub Workbook_BeforeClose(Cancel As Boolean)Application.OnKey "^ü"End Sub

Bestimmte Standardtastenkombinationen deaktivieren

In Excel sind bereits einige Standardfunktionen auf Tastenkombinationen gelegtworden. So können Sie beispielsweise über die Tastenkombination (Alt) + (F11)in die Entwicklungsumgebung von Excel springen. Diese und andere Tastenkom-binationen können Sie aber jederzeit lahm legen.

Im folgenden Beispiel wird der Zugriff auf die Entwicklungsumgebung über dieTastenkombination (Alt) + (F11) deaktiviert.

Listing 7.13: Die Tastenkombination (Alt) + (F11) wird deaktiviert

Sub DeaktivierenTastenkombination() Application.OnKey "%{F11}", ""End Sub

Testen Sie die Funktion, indem Sie aus der Entwicklungsumgebung auf IhreExceloberfläche wechseln und die Tastenkombination (Alt) + (F11) drücken. Eswird Ihnen nicht gelingen, auf diesem Wege in die Entwicklungsumgebung zugelangen.

Möchten Sie diese Tastenkombination wieder zulassen, dann starten Sie dasMakro aus Listing 7.14.

Listing 7.14: Die Tastenkombination (Alt) + (F11) wird wieder aktiviert

Sub AktivierenTastenkombination() Application.OnKey "%{F11}"End Sub

Indem Sie das zweite Argument der Methode OnKey weglassen, wird die standard-mäßig vorgesehene Funktion, nämlich das Springen in die Entwicklungsumge-bung, wieder aktiviert.

337

Page 338: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Übrigens können Sie die Makros aus den Listings 7.13 und 7.14 wiedermit den Ereignissen Workbook_Open bzw. Workbook_BeforeClose verbin-den, um diese Funktionen beim Öffnen bzw. Schließen der Arbeits-mappe dynamisch einzubinden.

Nur Werte einfügen

Wenn Sie in Excel Zellen mit Formeln kopieren und danach einfügen möchten,werden die Formeln ebenso eingefügt. Oftmals ist dieser Automatismus aber nichterwünscht, d.h. in den meisten Fällen reicht es, wenn lediglich die Werte einge-fügt werden. Standardmäßig müssen Sie dazu in Excel aus dem Menü BEARBEI-TEN den Befehl INHALTE EINFÜGEN wählen. Danach aktivieren Sie im DialogINHALTE EINFÜGEN die Option WERTE und bestätigen mit OK. Diese Schrittekönnen Sie über ein Makro bzw. eine Tastenkombination automatisch ablaufenlassen.

Erfassen Sie nun das Makro, welches lediglich die Werte aus kopierten Zellen ein-fügt:

Listing 7.15: Lediglich Werte werden eingefügt

Sub WerteEinfügen() Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = FalseEnd Sub

Um nur die Inhalte, also die Werte einzufügen, setzen Sie die Methode PasteSpe-cial ein. Im Paste-Argument geben Sie die Konstante xlValues an. Da nach demDrücken der Tastenkombination (Strg) + (ª) + (V) noch der Kopierrahmen umden kopierten Bereich aktiv ist, schalten Sie diesen durch die Eigenschaft CutCopy-Mode ab, indem Sie dieser den Wert False zuweisen.

Weisen Sie das Makro aus Listing 7.15 nun der Tastenkombination (Strg) + (ª)+ (V) zu. Auch hierzu können Sie wieder das Ereignis Workbook_Open einsetzen,um diese Funktion gleich nach dem Öffnen der Arbeitsmappe zur Verfügung zustellen.

338

Page 339: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel über Tastenkombinationen bedienen

Listing 7.16: Beim Öffnen der Arbeitsmappe wird die Tastenkombination festgelegt

Private Sub Workbook_Open()Application.OnKey "^+v", "WerteEinfügen"End Sub

Achten Sie auch bei diesem Schritt darauf, dass Sie die gerade definierte Tasten-kombination beim Schließen der Arbeitsmappe wieder deaktivieren. Setzen Sie fürdiesen Zweck das Arbeitsmappen-Ereignis Workbook_BeforeClose ein, wie Sie es inListing 7.17 sehen.

Listing 7.17: Beim Schließen der Arbeitsmappe wird die Tastenkombination deaktiviert

Private Sub Workbook_BeforeClose(Cancel As Boolean)Application.OnKey "^+v"End Sub

Sonderzeichen per Tastenkombination einfügen

Eine besonders interessante Lösung ist, Sonderzeichen per Tastenkombinationeneinzufügen. Dabei können Sie beispielsweise Zeichen aus der Schriftart WING-DINGS einsetzen, um Sonderzeichen einzusetzen. Der Buchstabe Ü entspricht indieser Schriftart einem Häkchen. Der Buchstabe J entspricht einem grinsendenGesicht und der Buchstabe L einem mürrischen Gesicht.

Im folgenden Beispiel soll die To-Do-Liste aus Abbildung 7.10 abgearbeitet werden.

Abbildung 7.10: Die To-Do-Liste muss abgearbeitet werden.

339

Page 340: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Die Spalte C soll mit Sonderzeichen über Tastenkombinationen gefüllt werden.

Schreiben Sie jetzt die beiden Makros, die die Sonderzeichen in die jeweils aktiveZelle schreiben:

Listing 7.18: Sonderzeichen einfügen

Sub SmileyLachend() ActiveCell.Value = "J" ActiveCell.Font.Name = "Wingdings"End Sub

Sub SmileyTraurig() ActiveCell.Value = "L" ActiveCell.Font.Name = "Wingdings"End Sub

Schreiben Sie im ersten Schritt den Buchstaben direkt in die aktive Zelle. Danachformatieren Sie die aktive Zelle über das Font-Objekt mit der Schriftart WING-DINGS.

Für die erledigten Aufgaben definieren wir die Tastenkombination (Strg) + (Ä),für offene Aufgaben (Strg) + (Ö). Der Quellcode für diese Aufgabe lautet wiefolgt:

Listing 7.19: Die Tastenkombinationen beim Öffnen der Arbeitsmappe festlegen

Private Sub Workbook_Open()Application.OnKey "^ö", "SmileyLachend"Application.OnKey "^ä", "SmileyTraurig"End Sub

Die Frage, die sich nun geradezu aufdrängt, lautet wie folgt:

Wie kann ich herausbekommen, welches Symbol der Schriftart Wingdings wel-chem Zeichen zugeordnet ist?

Die Beantwortung dieser Frage können Sie Listing 7.20 entnehmen. Dort wirdeine Liste erstellt, in der alle Zeichenbelegungen verzeichnet sind.

340

Page 341: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel über Tastenkombinationen bedienen

Listing 7.20: Die einzelnen Zeichen einer Schriftart abfragen

Sub Schrifttest()Dim i As Integer

Sheets.AddRange("A1").Select

For i = 1 To 255 ActiveCell.Font.Name = "Wingdings" If i >= 32 Then ActiveCell.Value = Chr(i) ActiveCell.Offset(0, 1).Value = Chr(i) ActiveCell.Offset(0, 2).Value = i ActiveCell.Offset(1, 0).Select End IfNext iEnd Sub

Die normalen Zeichen einer Schriftart liegen im Bereich von 0 bis 256. Die Zah-len von 0 bis 31 entsprechen den nicht darstellbaren Standard-ASCII-Codes.Daher kann innerhalb der Schleife auf die Dokumentation dieser Zeichen ver-zichtet werden. Formatieren Sie alle Zellen der Spalte A mit der Schriftart, zu derSie die Zeichenbelegung herausfinden möchten. Über die Funktion chr könnenSie einen Wert vom Typ String zurückgeben, der das Zeichen enthält, das demangegebenen Zeichencode zugeordnet ist.

Abbildung 7.11: Listen mit Sonder-zeichen ausstatten

341

Page 342: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

7.5 Programmieren mit der Maus

Nachdem Sie nun wissen, wie Sie einzelne Tasten programmieren können, gehenwir zum nächsten Thema über. Auf den folgenden Seiten wird beschrieben, wieSie mithilfe von VBA Ihre Maustasten abfragen und programmieren können. Fürdie Programmierung Ihrer Maustasten stehen Ihnen zwei Ereignisse zur Verfü-gung, die Sie bereits in diesem Kapitel kennen gelernt haben. Über das eine Ereig-nis können Sie einen Klick mit der rechten Maustaste abfangen, mit dem anderenEreignis einen Doppelklick mit der linken Taste. Excel kann also diese beidenMausaktionen überwachen, indem Sie ein Ereignis einstellen. Diesem Ereigniskönnen Sie dann weitere Befehle hinzufügen, welche beim Eintreffen des Ereig-nisses zusätzlich ausgeführt werden sollen.

Kontextmenü deaktivieren/aktivieren

Standardmäßig wird beim Drücken der rechten Maustaste ein Kontextmenü inExcel aufgerufen. Beispielsweise wird das Zellenkontextmenü aktiviert, wenn Sie

Abbildung 7.12: Alle Belegungen der Schriftart Wingdings in eine Tabelle schreiben

342

Page 343: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Programmieren mit der Maus

mit der rechten Maustaste auf eine beliebige Zelle klicken. Dieses Standardverhal-ten kann auch deaktiviert und durch eine andere, eigene Funktion ersetzt werden.

Im folgenden Beispiel wird das Herunterklappen des Kontextmenüs unterbunden,sobald Sie eine beliebige Zelle einer bestimmten Tabelle mit der rechten Maus-taste anklicken. Um dieses Ereignis einzustellen, befolgen Sie die nächstenArbeitsschritte:

1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, mitder Sie die Funktion belegen möchten, und wählen Sie aus dem Kontextmenüden Befehl CODE ANZEIGEN.

2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten,oberen Dropdown-Feld den Befehl Worksheet.

3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforeRightClick aus.

4. Ergänzen Sie den Ereignisrahmen wie folgt:

Listing 7.21: Das Kontextmenü wird nicht heruntergeklappt.

Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Cancel = TrueEnd Sub

Das Ereignis Worksheet_BeforeRightClick hat zwei Argumente:

Im Argument Target können Sie die Überwachung der rechten Maustaste aufeinen bestimmten Bereich Ihrer Tabelle beschränken. Im Argument Cancel habenSie die Möglichkeit, die Standardfunktion, das Herunterklappen des Kontextme-nüs, zu unterbinden, indem Sie dieses Argument auf den Wert True setzen.

Kontextmenü für bestimmte Bereiche deaktivieren

Um die Überwachung der rechten Maustaste nur auf einen bestimmten Bereichder Tabelle zuzulassen, können Sie wie schon gesagt das Argument Target einset-zen. Im folgenden Makro aus Listing 7.22 wird das Kontextmenü für den Zellenbe-reich B2:D10 ausgeschaltet. Ergänzen Sie dazu Listing 7.21 wie folgt:

343

Page 344: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Listing 7.22: Das Kontextmenü in einem vorgegebenen Bereich deaktivieren

Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich As Range

Set Bereich = Range("B2:D10") If Intersect(Target, Bereich) Is Nothing Then Exit Sub Cancel = TrueEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range. Danachgeben Sie über die Anweisung Set dieser Objektvariablen bekannt, welchenBereich der Tabelle Sie überwachen möchten. Mithilfe der Methode Intersectkönnen Sie überprüfen, ob die angeklickte Zelle (Target) sich im definiertenBereich (Bereich) befindet. Wenn nicht, dann springen Sie über die AnweisungExit Sub direkt aus dem Makro heraus. Im anderen Fall setzen Sie das ArgumentCancel auf den Wert True, um das Zellenkontextmenü zu deaktivieren.

Kontextmenü in allen Tabellen deaktivieren

In den beiden letzten Beispielen haben Sie in einer bestimmten Tabelle das Zel-lenkontextmenü deaktiviert. Dabei haben Sie das Ereignis BeforeRightClick fürdiese Tabelle eingestellt. Möchten Sie jetzt die Deaktivierung des Kontextmenüsin allen Tabellenblättern erreichen, müssen Sie keinesfalls dieses Ereignis für jedeeinzelne Tabelle einstellen. In diesem Fall setzen Sie besser das Arbeitsmappener-eignis Workbook_SheetBeforeRightClick ein. Um dieses Ereignis einzustellen,gehen Sie wie folgt vor:

Abbildung 7.13: Beim Klicken mit der rechten Maus-taste im definier-ten Bereich pas-siert nichts.

344

Page 345: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Programmieren mit der Maus

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Führen Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEAR-BEITSMAPPE durch.

3. Wählen Sie im Codebereich oben aus dem ersten Dropdown-Feld den EintragWorkbook.

4. Wählen Sie aus dem zweiten Dropdown-Feld das Ereignis SheetBeforeRight-Click.

5. Ergänzen Sie den noch leeren Ereignisrahmen wie folgt:

Listing 7.23: Das Zellenkontextmenü für alle Tabellen ausschalten

Private Sub Workbook_SheetBeforeRightClick _ (ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Cancel = TrueEnd Sub

Bei diesem Arbeitsmappenereignis haben Sie gegenüber dem Tabellenereignis einArgument mehr zur Verfügung. Standardmäßig wird dieses Ereignis in allenTabellenblättern der Arbeitsmappe ausgeführt. Im Argument Sh können Sie ein-schränken, in welchen Tabellenblättern die Mausklicks überwacht werden sollen.

Kontextmenü in bestimmten Tabellen deaktivieren

Im folgenden Beispiel soll das Deaktivieren des Zellenkontextmenüs nur in denTabellen TABELLE1, TABELLE2 und TABELLE12 ausgeführt werden. Die Lösungdieser Aufgabenstellung können Sie in Listing 7.24 sehen.

Listing 7.24: Deaktivierung des Kontextmenüs nur in bestimmten Tabellen zulassen

Private Sub Workbook_SheetBeforeRightClick _(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

Select Case Sh.Name Case "Tabelle1", "Tabelle2", "Tabelle12" Cancel = True Case Else Cancel = FalseEnd SelectEnd Sub

345

Page 346: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Überprüfen Sie mithilfe einer Select-Case-Anweisung, ob der Name der jeweilsaktiven Tabelle, auf der Sie den rechten Mausklick durchführen, dem innerhalbder Case-Anweisung entspricht. Wenn ja, dann setzen Sie das Argument Cancel aufden Wert True, um das Zellenkontextmenü zu deaktivieren.

Eigene Funktionen mit der rechten Maustaste starten

Wie Sie gerade erfahren haben, ist der rechten Maustaste ein Kontextmenü zuge-ordnet. Je nachdem, wo Sie in Ihrer Excel-Tabelle mit der rechten Maustaste kli-cken, wird ein bestimmtes Kontextmenü zur Verfügung gestellt, welches diewichtigsten Befehle für das angeklickte Objekt bereithält. Wenn Sie eine Zelleanklicken, sind das Funktionen wie das Ausschneiden, Kopieren und Einfügenvon Zelleninhalten.

Sie wissen bereits, wie Sie das Zellenkontextmenü deaktivieren.

Was aber machen Sie, wenn Sie dem Klicken mit der rechten Maustaste eineeigene Funktion zuordnen möchten?

Im folgenden Beispiel wird durch das Klicken mit der rechten Maustaste auf eineZelle, diese mit der Hintergrundfarbe ROT belegt. Beim erneuten Klick mit derrechten Maustaste auf diese gefärbte Zelle wird diese wieder entfärbt.

Zur Lösung dieser Aufgabenstellung gehen Sie wie folgt vor:

1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hin-ter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kon-textmenü den Befehl CODE ANZEIGEN.

2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten,oberen Dropdown-Feld den Befehl Worksheet.

3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforeRightClick aus.

4. Ergänzen Sie den Ereignisrahmen wie folgt:

Listing 7.25: Über das Rechtsklicken wird die Zelle gefärbt/entfärbt

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

If Target.Interior.ColorIndex = 3 Then Target.Interior.ColorIndex = xlColorIndexNone

346

Page 347: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Programmieren mit der Maus

Else Target.Interior.ColorIndex = 3End If

Cancel = TrueEnd Sub

Überprüfen Sie zuerst einmal, ob die Zelle bereits mit der Hintergrundfarbe ROTformatiert wurde. Wenn ja, dann meldet die Eigenschaft ColorIndex, die Sie aufdas Objekt Interior (Zellenhintergrund) anwenden, den Farbindex 3. In diesemFall weisen Sie der Eigenschaft ColorIndex die Konstante xlColorIndexNone zu,was bedeutet, dass diese Zelle wieder entfärbt wird. Im anderen Fall weisen Sie derEigenschaft ColorIndex den Farbindex 3 zu, um die so angeklickte Zelle mit derHintergrundfarbe ROT zu belegen. In beiden Fällen deaktivieren Sie anschließenddas Herunterklappen des Kontextmenüs, indem Sie das Argument Cancel auf denWert True setzen.

In einem weiteren Beispiel soll in einer Tabelle über die rechte Maustaste einbestimmtes Sonderzeichen eingefügt werden. Orientieren Sie sich dabei amMakro aus Listing 7.20, über das Sie die Belegung der Zeichen in der SchriftartWINGDINGS in einer Tabelle ausgegeben haben. Für unser Beispiel entscheidenwir uns für das Haken-Symbol, welches über den Buchstaben Ü in der SchriftartWINGDINGS eingefügt werden kann. In Anlehnung an die vorherige Aufgabe sollaber zuerst geprüft werden, ob nicht bereits ein Haken in die Zelle eingefügtwurde. Wenn ja, soll dieser wieder entfernt werden. Stellen Sie dieses Ereignisnun ein, indem Sie die folgenden Arbeitsschritte befolgen:

1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hin-ter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kon-textmenü den Befehl CODE ANZEIGEN.

Abbildung 7.14: Schnelles Färben und Entfärben über Mausklicks

347

Page 348: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten,oberen Dropdown-Feld den Befehl Worksheet.

3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforeRightClick aus.

4. Ergänzen Sie den Ereignisrahmen wie folgt:

Listing 7.26: Das Haken-Symbol per rechtem Mausklick einfügen

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

If Target.Value = "ü" Then Target.Value = "" Target.Font.Name = "Courier" Else Target.Value = "ü" Target.Font.Name = "Wingdings" End If

Cancel = TrueEnd Sub

Überprüfen Sie, ob nicht bereits schon ein Haken-Symbol in der Zelle steht.Wenn ja, dann nehmen Sie den Haken wieder heraus, indem Sie den Zelleninhaltlöschen. Vergessen Sie dabei aber nicht, die Schriftart wieder auf eine »lesbare«Schrift umzustellen. Im anderen Fall schreiben Sie den Buchstaben Ü in die ange-

Abbildung 7.15: Eine Einkaufslis-te schnell abhaken

348

Page 349: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Programmieren mit der Maus

klickte Zelle und formatieren diese mit der Schriftart WINGDINGS, indem Sie demObjekt Font über die Eigenschaft Name den Namen der Schriftart bekannt geben.

Doppelklick deaktivieren

Nachdem Sie erfahren haben, wie Sie die rechte Maustaste programmieren kön-nen, lernen Sie nun, wie Sie die linke Maustaste steuern können. Standardmäßigist dem linken Doppelklick auf eine Zelle die Funktion DIREKTE ZELLENBEARBEI-TUNG zugeordnet, d.h. der Textcursor springt genau in die Zelle hinein. Sie habendann die Möglichkeit, Zeichen einzugeben bzw. bereits gemachte Eingaben zukorrigieren. Zum Abfangen von Doppelklicks mit der linken Maustaste steht Ihnenein eigenes Ereignis BeforeDoubleClick zur Verfügung. Wie schon bei der rechtenMaustaste gelernt, haben Sie auch bei diesem Ereignis die Möglichkeit, die stan-dardmäßig zugewiesene Funktion zu deaktivieren.

In der folgenden Aufgabe wird die direkte Zellenbearbeitung nach dem Ausführeneines Doppelklicks auf eine Zelle deaktiviert.

Listing 7.27: Den Doppelklick deaktivieren

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

Setzen Sie das Argument Cancel auf den Wert True, um die direkte Zellenbearbei-tung zu deaktivieren. Wie schon beim Ereignis BeforeRightClick demonstriert,können Sie auch bei diesem Ereignis dafür sorgen, dass das Deaktivieren der Stan-dardfunktion (direkte Zellenbearbeitung) nur für einen bestimmten Bereich gel-ten soll.

Im nächsten Beispiel soll die direkte Zellenbearbeitung, welche durch den Dop-pelklick ausgelöst wurde, für folgende Bereiche deaktiviert werden:

� B2:B10

� D3:D5

� F2:F7

� A1:F1

Erfassen Sie nun das Ereignismakro, indem Sie folgende Arbeitsschritte befolgen:

349

Page 350: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hin-ter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kon-textmenü den Befehl CODE ANZEIGEN.

2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten,oberen Dropdown-Feld den Befehl Worksheet.

3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforedoubleClick aus.

4. Ergänzen Sie den Ereignisrahmen wie folgt:

Listing 7.28: Die Mausklicks in mehreren Bereichen überwachen

Private Sub Worksheet_BeforeDoubleClick _(ByVal Target As Range, Cancel As Boolean)Dim Bereich1 As RangeDim Bereich2 As RangeDim Bereich3 As RangeDim Bereich4 As RangeDim Bereich As Range

Set Bereich1 = Range("B2:B10")Set Bereich2 = Range("D3:D5")Set Bereich3 = Range("F2:F7")Set Bereich4 = Range("A1:F1")

Set Bereich = Union(Bereich1, Bereich2, Bereich3, Bereich4)

If Intersect(Bereich, Target) Is Nothing Then Exit SubCancel = True

End Sub

Deklarieren Sie im ersten Schritt genau fünf Objektvariablen vom Typ Range. Inden ersten vier Objektvariablen geben Sie die Zellenkoordinaten der Bereichebekannt, bei denen Sie die direkte Zellenbearbeitung deaktivieren möchten. Set-zen Sie für diesen Zweck die Anweisung Set ein. Im nächsten Schritt verbindenSie die einzelnen Bereiche mithilfe der Methode Union zu einem Gesamtbereich,den Sie in der Objektvariablen Bereich speichern. Danach fragen Sie über dieMethode Intersect ab, ob die angeklickte Zelle in diesem Gesamtbereich liegt.Wenn nicht, dann beenden Sie das Makro, indem Sie über die Anweisung ExitSub direkt aus dem Ereignis springen. Liegt die doppelt angeklickte Zelle im defi-

350

Page 351: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Programmieren mit der Maus

nierten Zielbereich, dann setzen Sie das Argument Cancel auf den Wert True, umdie direkte Zellenbearbeitung zu deaktivieren.

Werte hochzählen per Doppelklick

In der nächsten Praxisaufgabe soll eine bestimmte Zelle in einer Tabelle bei jedemDoppelklick auf diese Zelle um den Wert 1 addiert werden.

Um diese Lösung einzustellen, verfahren Sie wie folgt:

1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hin-ter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kon-textmenü den Befehl CODE ANZEIGEN.

2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten,oberen Dropdown-Feld den Befehl Worksheet.

3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforedoubleClick aus.

4. Ergänzen Sie den Ereignisrahmen wie folgt:

Listing 7.29: Eine Zelle aufaddieren

Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Excel.Range, Cancel As Boolean) If Target.Address = "$B$5" Then Target.Value = Target.Value + 1 Cancel = True End IfEnd Sub

Mithilfe der Eigenschaft Address können Sie die genaue Zellenadresse der doppeltangeklickten Zelle abfragen. Entspricht diese Adresse der Zelle B5, dann addieren

Abbildung 7.16: In den farbigen Flächen ist die direkte Zellenbearbei-tung deaktiviert.

351

Page 352: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Sie den momentanen Wert der Zelle mit dem Wert 1. Setzen Sie danach das Argu-ment Cancel auf den Wert True, um die direkte Zellenbearbeitung für diese Zellezu deaktivieren.

Zufallszahlen per Doppelklick

Im folgenden Beispiel spielen Sie Lotto. Im Zellenbereich C6:E10 soll bei jedemDoppelklick eine Zufallszahl im Bereich zwischen 1 und 49 erzeugt werden. Umdiese Aufgabe zu lösen, befolgen Sie die nächsten Arbeitsschritte:

1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hin-ter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kon-textmenü den Befehl CODE ANZEIGEN.

2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten,oberen Dropdown-Feld den Befehl Worksheet.

3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforedoubleClick aus.

4. Ergänzen Sie den Ereignisrahmen wie folgt:

Listing 7.30: Zufallszahlen erzeugen per Doppelklick

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

Set Bereich = Range("C6:E10")If Intersect(Bereich, Target) Is Nothing Then Exit SubTarget.Value = Int((49 * Rnd) + 1)

Abbildung 7.17: Bei jedem Dop-pelklick auf Zelle B5 wird diese um den Wert 1 erhöht.

352

Page 353: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel zeitmäßig steuern

Cancel = TrueEnd Sub

Definieren Sie im ersten Schritt eine Objektvariable vom Typ Range, in der Sie mitHilfe der Anweisung Set den Bereich angeben, in dem per Doppelklick Zufalls-zahlen erzeugt werden sollen. Danach prüfen Sie über die Methode Intersect, obdie doppelt angeklickte Zelle im definierten Zielbereich liegt. Wenn ja, wendenSie die Funktion Rnd an, um eine Zufallszahl zu erzeugen. Den Wertebereich derZufallszahl geben Sie zwischen 1 und 49 an. Mithilfe der Funktion Int sorgen Siedafür, dass diese generierte Zufallszahl auch ganzzahlig ist.

7.6 Excel zeitmäßig steuern

In Excel haben Sie die Möglichkeit, Makros zu einem bestimmten Zeitpunkt zustarten. Des Weiteren können Sie Makros auch in bestimmten Intervallen wieder-holt ausführen. Für diese Aufgabe setzen Sie die Methode OnTime ein.

Die Syntax der Methode lautet:

OnTime(EarliestTime, Procedure, LatestTime, Schedule)

Das Argument EarliestTime gibt den Zeitpunkt an, an dem eine Prozedur ausge-führt werden soll.

Das Argument Procedure beinhaltet den Namen der auszuführenden Prozedur.

Das Argument LatestTime ist optional einsetzbar und gibt den letzten Zeitpunktan, zu dem die Prozedur ausgeführt werden kann.

Das letzte Argument Schedule ist optional einsetzbar und führt eine neue OnTime-Prozedur aus, sofern dieses Argument auf den Wert True gesetzt ist. Indem Sie das

Abbildung 7.18: Im gefärbten Bereich werden Zufallszahlen per Doppelklick erzeugt.

353

Page 354: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Argument auf den Wert False setzen, löschen Sie eine vorher eingestellte Proze-dur. Die Möglichkeiten, die Sie mit dieser Zeitsteuerung haben, werden in dennächsten Praxisaufgaben näher erläutert.

Die Uhr immer im Blick

Die Methode OnTime können Sie einsetzen, um regelmäßig die aktuelle Uhrzeit inder Statusleiste anzeigen zu lassen. Dabei definieren Sie das Intervall von 60Sekunden. Jede Minute soll dann die aktuelle Uhrzeit in der Statusleiste angezeigtwerden, danach soll die Zeitansage genau fünf Sekunden in der Statusleiste sicht-bar sein und danach wieder ausgeblendet werden. Dazu erfassen Sie folgendesMakro aus Listing 7.31.

Listing 7.31: Die Zeitansage in Excel

Sub Zeitanzeige() Application.OnTime Now + TimeValue("00:01:00"), _ "Uhrzeit"End Sub

Mit der Funktion Now ermitteln Sie sowohl das aktuelle Tagesdatum als auch dieaktuelle Uhrzeit. Zur Uhrzeit addieren Sie mithilfe der Funktion TimeValue eineMinute. Damit vergeht genau eine Minute bis zum Start des Makros Uhrzeit, wel-ches Sie in Listing 7.32 sehen.

Listing 7.32: Die aktuelle Uhrzeit in der Statusleiste ausgeben

Sub Uhrzeit() Application.DisplayStatusBar = True Application.StatusBar = Date & "," & Time Application.Wait (Now + TimeValue("0:00:05")) Application.StatusBar = False Call ZeitanzeigeEnd Sub

Im ersten Schritt blenden Sie sicherheitshalber die Statusleiste über die EigenschaftDisplayStatusBar ein. Danach füllen Sie die Statusleiste mit dem aktuellen Tages-datum, welches Sie über die Funktion Date bekommen, und mit der aktuellen Uhr-zeit, die über die Funktion Time abgefragt werden kann. Im Anschluss daran sorgenSie dafür, dass Excel diese Zeitansage fünf Sekunden lang in der Statusleiste stehenlässt. Dazu verwenden Sie die Methode Wait, die das Makro für fünf Sekunden

354

Page 355: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel zeitmäßig steuern

anhält. Danach geben Sie die Verwaltung der Statusleiste wieder an Excel zurück,was dazu führt, dass der Text BEREIT in der Leiste angezeigt wird. Im letzten Schrittsorgen Sie dafür, dass die Zeitansage regelmäßig ausgeführt wird. Dazu rufen Sie dasMakro Zeitanzeige erneut mit der Anweisung Call auf.

Countdown in Excel

Wenn Sie möchten, können Sie in Excel auch einen Countdown einsetzen, umeine bestimmte Aufgabe auszuführen. So können Sie beispielsweise dafür sorgen,dass genau 60 Sekunden nach dem Start eines Makros alle offenen Arbeitsmappengeschlossen sind und Excel beendet wird.

Erfassen Sie zu diesem Zweck zuerst einmal die Zeitsteuerung, welche Sie in Lis-ting 7.33 sehen können.

Listing 7.33: Nach genau einer Minute wird das Makro ExcelEnde gestartet

Sub CountdownEinstellen() Application.OnTime _ Now + TimeValue("00:00:60"), "ExcelEnde"End Sub

Mit der Funktion Now ermitteln Sie sowohl das aktuelle Tagesdatum als auch dieaktuelle Uhrzeit. Zur Uhrzeit addieren Sie mithilfe der Funktion TimeValue 60Sekunden. Damit vergehen genau 60 Sekunden bis zum Start des Makros ExcelEnde, welches Sie in Listing 7.34 sehen.

Abbildung 7.19: Das aktuelle Datum sowie die Uhrzeit in der Sta-tusleiste anzeigen

355

Page 356: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

Listing 7.34: Arbeitsmappen speichern und Excel beenden

Sub ExcelEnde()Dim Mappe As Workbook

Application.DisplayAlerts = FalseFor Each Mappe In Workbooks Mappe.SaveNext MappeApplication.DisplayAlerts = TrueApplication.QuitEnd Sub

Indem Sie die Eigenschaft DisplayAlerts auf den Wert False setzen, verhindernSie, dass Sie noch eine Rückfrage vor dem Beenden von Excel bekommen. Ineiner vorherigen Schleife stellen Sie sicher, dass alle geöffneten Arbeitsmappengespeichert werden. Dabei wenden Sie innerhalb der Schleife die Methode Savean. Anschließend wird über die Methode Quit Excel geschlossen.

Verarbeitung zu einer bestimmten Zeit beginnen

Im letzten Beispiel zur Zeitsteuerung mit Excel werden Sie ein Makro zu einerganz bestimmten Uhrzeit starten. Erfassen Sie zu diesem Zweck das Makro ausListing 7.35:

Listing 7.35: Um 16:00 Uhr wird die Verarbeitung gestartet

Sub ZeitSteuerung() Application.OnTime TimeValue("16:00:00"), "Verarbeitung"End Sub

Um das Makro aus Listing 7.35 korrekt ablaufen zu lassen, sollten Sie die Uhrein-stellung in der Systemsteuerung von Windows überprüfen und sicherstellen, dassExcel sowie die Arbeitsmappe, die diese Lösung enthält, auch geöffnet sind. ImMakro ZeitSteuerung wird um 16:00 Uhr das Makro Verarbeitung aufgerufen,welches Sie in Listing 7.36 sehen können.

356

Page 357: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

Listing 7.36: Dieses Makro wird um 16:00 Uhr ausgeführt

Sub Verarbeitung() 'beliebige Aufgaben durchführen...End Sub

7.7 Fragen & Antworten

F Wie können Sie beim Öffnen einer Arbeitsmappe dafür sorgen, dass alle Pivot-Tabellen der Arbeitsmappe aktualisiert werden?

A Starten Sie dazu das Makro aus Listing 7.37:

Listing 7.37: Alle Pivot-Tabellen der Arbeitsmappe werden beim Öffnen aktualisiert

Private Sub Workbook_Open() ThisWorkbook.RefreshAllEnd Sub

Setzen Sie die Methode RefreshAll ein, um alle Pivot-Tabellen in derArbeitsmappe zu aktualisieren.

F Wie können Sie den Namen einer Tabelle dynamisch aus einem Zelleninhalt bil-den?

A Erfassen Sie das Ereignis Worksheet_change wie folgt:

Listing 7.38: Den Namen einer Tabelle aus der Zelle C1 beziehen

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$C$1" Then Exit Sub ActiveSheet.Name = Range("C1").ValueEnd Sub

Überprüfen Sie über die Eigenschaft Address, ob die geänderte Zelle C1lautet. Wenn ja, dann weisen Sie der Tabelle den Namen zu, der in ZelleC1 eingegeben wurde.

357

Page 358: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

F Wie können Sie die typischen Funktionen wie das Kopieren, Ausschneiden undEinfügen von Daten über die Tastenkombinationen deaktivieren?

A Sie können die Tastenkombinationen für das Kopieren (Strg) + (C), Aus-schneiden (Strg) + (X) und Einfügen (Strg) + (V) von Daten deaktivie-ren, indem Sie folgende Makros erfassen:

Listing 7.39: Die Tastenkombinationen wurden deaktiviert

Sub TastenkombinationenDeaktivieren() Application.OnKey "^c", "KeineAktion" Application.OnKey "^v", "KeineAktion" Application.OnKey "^x", "KeineAktion"End Sub

Sub KeineAktion() 'keine weiteren BefehleEnd Sub

F Wie können Sie deaktivierte Standard-Tastenkombinationen wieder verfügbarmachen?

A In Anlehnung an die vorherige Fragestellung können Sie für diesen Zweckdas folgende Makro aus Listing 7.40 starten:

Listing 7.40: Tastenkombinationen wieder zurücksetzen

Sub TastenkombinationenAktivieren() Application.OnKey "^c" Application.OnKey "^v" Application.OnKey "^x"End Sub

F Wie können Sie das Kontextmenü für die Symbolleisten deaktivieren?

A Wenn Sie mit der rechten Maustaste auf eine beliebige Symbolleiste kli-cken, wird Ihnen ein Kontextmenü angeboten, aus dem Sie Symbolleistenein- und ausblenden können. Mit dem folgenden Makro aus Listing 7.41verhindern Sie das Herunterklappen des Symbolleisten-Kontextmenüs:

358

Page 359: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Quiz

Listing 7.41: Symbolleisten-Kontextmenü deaktivieren

Sub KontextmenüSymbolDeaktivieren() Application.CommandBars("Toolbar list").Enabled = FalseEnd Sub

Das Kontextmenü für die Symbolleisten heißt Toolbar list. Geben Siediesen Namen dem Auflistungsobjekt CommandBars bekannt und setzen Siedie Eigenschaft Enabled auf den Wert False, um das Kontextmenü zudeaktivieren. Weisen Sie dieser Eigenschaft den Wert True zu, um dasKontextmenü wieder zu aktivieren.

F Wie können Sie einen vorher definierten Bereich per Doppelklick kopieren undauch auf anderen Tabellen einfügen?

A Nehmen wir einmal an, Sie möchten einen bestimmten Bereich aufTABELLE1 kopieren und danach diesen Bereich wahlweise auf einer ande-ren Tabelle einfügen. Dazu setzen Sie das Ereignis Worksheet_BeforeDoubleClick ein, wie Sie es in Listing 7.42 sehen.

Listing 7.42: Definierten Bereich kopieren und weiter verwenden

Private Sub Worksheet_BeforeDoubleClick _(ByVal Target As Excel.Range, Cancel As Boolean)Dim Bereich As Range

Set Bereich = Worksheets("Tabelle1").Range("A1:C5")Bereich.CopyActiveSheet.PasteEnd Sub

7.8 Quiz

F Wie kann man die Ereignissteuerung kurzfristig ausschalten?

F Wird das Ereignis Change auch ausgelöst, wenn man die Formatierung der Zelleändert?

F Was muss man machen, wenn man das Ereignis Change nicht auf die ganzeTabelle, sondern nur auf eine einzige Zelle anwenden möchte?

359

Page 360: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Aktionen und Benutzereingaben in Excel überwachen

F Wie kann man das Zellenkontextmenü deaktivieren?

F Welchem Buchstaben ist das Sonderzeichen mit dem Flugzeug zugeordnet?

F Wie kann man per Doppelklick auf eine Zelle den Inhalt dieser Zelle mit denSchriftschnitten FETT und KURSIV sowie der Schriftfarbe ROT formatieren?

F Wie kann man ein Makro um 14:00 Uhr automatisch starten lassen?

7.9 Übungen

Am Ende des Tages versuchen Sie die folgenden Aufgabenstellungen zu lösen.Die Ergebnisse dieser Aufgaben finden Sie im Anhang.

1. Stellen Sie sicher, dass beim Aktivieren einer bestimmten Tabelle die Neube-rechnung ausgelöst wird.

2. Wie muss das Ereignis lauten, wenn Sie vor dem Speichern einer Arbeits-mappe in der ersten Tabelle der Arbeitsmappe das aktuelle Tagesdatum erfas-sen möchten?

3. Öffnen Sie die Demo-Arbeitsmappe Steuerung.xls und aktivieren die TabelleÜBUNG. Ihre Aufgabe besteht nun darin, die beiden Maustasten zu program-mieren. Für den Bereich A1:E15 sollen dabei folgende Vorgänge ablaufen:

� Klicken mit der rechten Maustaste: Addieren der Zelle um den Wert 10

� Doppelklick mit der linken Maustaste: Subtrahieren der Zelle mit 10

360

Page 361: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

WOCHE

TTTTaaaag g g g 1111 Die Entwicklungsplattform, Variablen und Konstanten kennen lernen 21

TTTTaaaag g g g 2222 Die Sprachelemente von VBA 101

TTTTaaaag g g g 3333 Die Excel-Anwendung einstellen und anpassen 153

TTTTaaaag g g g 4444 Auf Arbeitsmappen zugreifen – Datei-Operationen 177

TTTTaaaag g g g 5555 Tabellenblätter programmieren 207

TTTTaaaag g g g 6666 Zellbearbeitung mit VBA 249

TTTTaaaag g g g 7777 Aktionen und Benutzereingaben in Excel überwachen 315

WOCHE

TTTTaaaag g g g 8888 Große Datenmengen in VBA behandeln und auswerten 363

TTTTaaaag g g g 9999 Funktionen einsetzen, um Excel zu automatisieren 403

TTTTaaaag g g g 10101010 Excel und das Internet 429

TTTTaaaag g g g 11111111 Excel und Datenzugriffe auf Access und Word 447

TTTTaaaag g g g 12121212 Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren 485

TTTTaaaag g g g 13131313 Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren 505

TTTTaaaag g g g 14141414 Makros dynamisch erzeugen, importieren, exportieren über VBE-Programmierung 527

Page 362: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Auswertungen, Kommunika-tion, Automatisierung

Der 8. Tag beschäftigt sich mit dem Thema, wie Sie Ihre Daten in Excel auswer-ten können. Hierfür stehen Ihnen unter anderem die Filterfunktionen sowie diePivot-Tabellentechnik zur Verfügung. Des Weiteren werden Sie Ihre Datenoptisch in Diagrammen darstellen. Dabei werden Sie Diagramme unterschied-lichster Art erstellen.

Am 9. Tag lernen Sie, wie Sie Excel um weitere zusätzliche Funktionen berei-chern können. Ein Thema dieses Tages wird auch sein, modulare Funktionen zuschreiben, sodass Sie diese elegant in verschiedene Makros einbauen und wiederanpassen können.

Am 10. Tag dreht sich alles um das Thema Internet & Co. Dabei lernen Sie u.a.,wie Sie mit Hyperlinks arbeiten und E-Mails über Outlook verschicken können.

Am 11. Tag erfahren Sie, wie Sie Excel-Daten in eine Access-Datenbank überfüh-ren können. Aber auch der umgekehrte Vorgang, also die Datenübernahme auseiner fertigen Access-Datenbank in eine Excel-Tabelle, wird an diesem Tag aus-führlich beschrieben. Des Weiteren erfahren Sie, wie Sie die Zusammenarbeitzwischen Excel und Word gestalten können. Unter anderem übertragen Sie dabeiExcel-Tabellen in Word-Dokumente, fügen bestimmte Zelleninhalte anbestimmte Textmarken eines Dokuments ein und einiges andere mehr.

Am 12. Tag manipulieren Sie die vorhandenen Menü- und Symbolleisten vonExcel und erstellen eigene Menü- und Symbolleisten. Auch die Programmierungvon Kontextmenüs bildet einen Schwerpunkt an diesem Tag.

Am 13. Tag lernen Sie, wie Sie in Excel Dialoge (= UserForms) zeichnen, mitSteuerelementen wie Schaltflächen und Eingabefeldern bestücken und diesedann automatisieren.

Am 14. Tag greifen Sie auf die Entwicklungsumgebung über Makros zu. Sie wer-den dabei unter anderem neue Makros dynamisch erstellen bzw. vorhandeneMakros einer Arbeitsmappe gezielt löschen.

362

Page 363: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

8

Große Datenmengen in VBA behandeln und

auswerten

Page 364: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Gestern haben Sie gelernt, was man unter Ereignissen in der Programmierung vonExcel versteht. Sie haben Ereignisse für Arbeitsmappen sowie für einzelne Tabel-len erstellt und können diese nun bei Bedarf einsetzen. Des Weiteren haben SieTastatureingaben ausgewertet und Makros zu bestimmten Zeitpunkten automa-tisch gestartet.

Die Themen heute:

� Daten filtern

� Pivot-Tabellen einsetzen

� Diagramme erstellen

Alle Beispiele dieses Tages finden Sie auf der beiliegenden CD-ROM inden Arbeitsmappen Auswertung.xls und Diagramme.xls im VerzeichnisKap08.

8.1 Daten filtern

Eine der schnellsten und wichtigsten Auswertungsfunktionen in Excel stellt derAutoFilter dar, den Sie im Menü DATEN mit dem Befehl FILTER/AUTOFILTERaktivieren können. Beim Filtern von Daten stellen Sie ein Kriterium für die Filte-rung ein, d.h. es werden nur die Zeilen angezeigt, die den Kriterien entsprechen,die Sie für eine Spalte angeben. Andersherum gesehen werden beim Filtern alleZeilen ausgeblendet, die nicht den eingestellten Kriterien entsprechen.

Excel stellt zwei unterschiedliche Arten von Filtern zur Verfügung:

� den AutoFilter mit der Möglichkeit, nach der ausgewählten Zelle zu filtern, füreinfache Kriterien

� den Spezialfilter für komplexere Aufgaben

Übrigens werden beim Filtern die Daten nicht neu sortiert. Es werdenlediglich die Zeilen ausgeblendet, die den eingestellten Kriterien nichtentsprechen.

364

Page 365: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Daten filtern

Vorsicht auch bei Leerzeilen in Excel-Tabellen! Der AutoFilter funktio-niert nur einwandfrei, wenn Sie in Ihrer Tabelle keine Leerzeilenhaben.

Den AutoFilter aktivieren

Den AutoFilter können Sie auf Ihrer Tabelle aktivieren, indem Sie aus dem MenüDATEN den Befehl FILTER/AUTOFILTER wählen. Danach wird für jede Spalte imbenutzten Bereich ein AutoFilter eingeblendet. Jetzt befindet sich der AutoFilternoch im Ruhezustand, d.h. es wurde noch keine Filterung vorgenommen, was Sieauch an den schwarzen Pfeilen der AutoFilter erkennen können. AutoFilter, beidenen schon Filterkriterien eingestellt sind, werden durch einen blauen Pfeilgekennzeichnet.

Beim folgenden Makro in Listing 8.1 wird der Auto-Filter eingeblendet.

Listing 8.1: Den AutoFilter aktivieren

Sub AutoFilterAktivieren() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilterEnd Sub

Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie den AutoFilter einsetzenmöchten. Die Eigenschaft AutoFilterMode liefert den Wert True, wenn die Drop-down-Pfeile für AutoFilter momentan auf dem Tabellenblatt sichtbar sind. Liefertdiese Eigenschaft den Wert False zurück, dann blenden Sie die AutoFilter mit-hilfe der Methode AutoFilter ein.

Um alle AutoFilter auf Ihrer Tabelle wieder auszublenden, setzen Sie diese Eigen-schaft AutoFilterMode auf den Wert False.

Ein Filterkriterium einsetzen

Nachdem Sie gerade den AutoFilter aktiviert haben, können Sie nun die Kriterieneinstellen, nach dem der AutoFilter Ihre Tabelle filtern soll.

In der folgenden Aufgabe sollen nur Mitarbeiter in TABELLE1 angezeigt werden,die am Standort Sindelfingen beschäftigt sind.

365

Page 366: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Listing 8.2: Das Filterkriterium einstellen

Sub MitarbeiterSindelfingen()Sheets("Tabelle1").ActivateIf Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter

Selection.AutoFilter _ Field:=5, Criteria1:="Sindelfingen"End Sub

Sie sollten immer sicherstellen, dass das richtige Tabellenblatt aktiviertund die AutoFilter-Pfeile angezeigt werden. Nur dann können Sie dieFilterkriterien setzen.

Um die Filterkriterien einzustellen, setzen Sie die Methode AutoFilter ein. DieSyntax dieser Methode lautet:

Ausdruck.AutoFilter(Field, Criteria1, Operator, Criteria2, VisibleDrop-Down)

Mit der AutoFilter-Methode haben Sie im Argument Field die Spalte E(Field:=5) als Spalte definiert, in der Sie ein Kriterium einstellen möchten.

Abbildung 8.1: Den AutoFilter einschalten

366

Page 367: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Daten filtern

Das Anzeigekriterium für die Zeilen haben Sie im Argument Criteria1 bekanntgegeben (Criteria1:="Sindelfingen").

Bei dem Argument Operator haben Sie die Auswahl aus mehreren Konstanten, dieSie Tabelle 8.1 entnehmen können.

Das Argument Criteria2 stellt ein mögliches zweites Kriterium dar. Es wirdzusammen mit Criteria1 und dem Argument Operator zum Erstellen von zusam-mengesetzten Kriterien verwendet.

Das letzte Argument VisibleDropDown ist standardmäßig mit dem Wert True vor-eingestellt, was bedeutet, dass die Dropdown-Pfeile für das gefilterte Feld angezeigtwerden. Wenn das Argument auf den Wert False gesetzt wird, werden die Drop-down-Pfeile des AutoFilters für das gefilterte Feld ausgeblendet.

Mehrere Filterkriterien festlegen

Gerade haben Sie ein Filterkriterium für die Spalte E festgelegt. Sie haben aberdie Möglichkeit, für mehrere Spalten Filterkriterien zu setzen.

Konstante Erklärung

xlAnd Es müssen zwei Kriterien erfüllt sein (Criteria1 und Criteria2).

xlOr Es muss entweder das eine oder das andere Kriterium erfüllt sein (Criteria1 oder Criteria2).

xlTop10Items Die n-höchsten Einträge aus der Liste werden angezeigt (Abso-lutbetrachtung).

xlTop10Percent Die n-höchsten Einträge aus der Liste werden angezeigt (prozen-tuale Betrachtung).

xlBottom10Items Die n-niedrigsten Einträge aus der Liste werden angezeigt (Abso-lutbetrachtung).

xlBottom10Percent Die n-niedrigsten Einträge aus der Liste werden angezeigt (pro-zentuale Betrachtung).

Tabelle 8.1: Die Operatoren für die Filterung von Daten

367

Page 368: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

In der folgenden Aufgabe sollen alle Mitarbeiter in TABELLE1 angezeigt werden, dieim Standort Sindelfingen beschäftigt sind und der Abteilung Einkauf angehören.

Listing 8.3: Mehrere Filter einsetzen

Sub MitarbeiterSindelfingenEinkauf()Sheets("Tabelle1").ActivateIf Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter

With Selection .AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlAnd .AutoFilter Field:=4, Criteria1:="Einkauf", _ Operator:=xlAnd End WithEnd Sub

Um mehrere Filter einzusetzen, die alle erfüllt sein müssen, verbinden Sie die Fil-terkriterien mit dem Operator xlAnd.

Im letzten Beispiel haben Sie je einen Filter für die Spalten D und E eingestellt.Im folgenden Beispiel werden Sie ebenfalls zwei Filter verwenden. Allerdings wer-den Sie in einem Filter (Spalte E) zwei Kriterien formulieren. Folgende Aufgabesoll hierbei gelöst werden:

Abbildung 8.2: Nur die Mitarbei-ter aus Sindelfin-gen werden ange-zeigt.

368

Page 369: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Daten filtern

Ermitteln Sie alle Mitarbeiter aus den Standorten Sindelfingen und Böblingen,die eine höhere Nummer als 40.000 haben. Das Makro für diese Aufgabenbewälti-gung sehen Sie in Listing 8.4:

Listing 8.4: Mehrere Filter setzen

Sub MitarbeiterSifiundBB()Sheets("Tabelle1").ActivateIf Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter

With Selection .AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlOr, Criteria2:="Böblingen", _ Operator:=xlAnd .AutoFilter Field:=2, Criteria1:=">40000" End WithEnd Sub

Für jeden einzelnen Filter setzen Sie die Methode AutoFilter ein, die die Krite-rien zusammenstellt. Verbinden Sie die einzelnen Kriterien mit dem OperatorxlAnd.

Abbildung 8.3: Zwei Filter (in den Spalten D und E) wurden eingesetzt.

Abbildung 8.4: Mehrere Filterkri-terien einstellen

369

Page 370: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Filterkriterium aus Zelle beziehen

Im folgenden Beispiel werden Sie das Filterkriterium aus einer Zelle beziehen.Geben Sie hierfür in Zelle E34 den Stadtnamen Stuttgart ein und erfassen dasMakro aus Listing 8.5.

Listing 8.5: Filterkriterium aus Zelle beziehen

Sub FilterkriteriumausZelle()Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter _ Field:=5, Criteria1:=Range("E34").Value End Sub

Übergeben Sie als Filterkriterium den Inhalt der Zelle E34.

Der Filter TopTen

Innerhalb des AutoFilters können Sie auf einen ganz speziellen Filter zugreifen,den man als TopTen-Filter bezeichnet. Mithilfe dieses Filters können Sie die wert-mäßig höchsten bzw. niedrigsten Werte aus einer Spalte filtern.

Im folgenden Beispiel filtern Sie in TABELLE1 aus der Spalte B die wertmäßighöchsten Nummern.

Abbildung 8.5: Die Zelle E34 bil-det das Filterkrite-rium in Spalte E.

370

Page 371: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Daten filtern

Listing 8.6: Die Mitarbeiter mit den höchsten zehn Nummern werden angezeigt

Sub TopTenFilterEinstellen() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter

Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlTop10ItemsEnd Sub

Stellen Sie im ersten Schritt sicher, dass Sie sich in der gewünschten Tabellebefinden. Danach prüfen Sie, ob der AutoFilter bereits eingestellt ist. Danach fül-len Sie den AutoFilter, indem Sie zuerst die Spalte angeben, in der gefiltert wer-den soll. Daraufhin geben Sie im Argument Criteria1 an, wie viele Einträgeangezeigt werden sollen. Da die zehn höchsten Werte angezeigt werden sollen,setzen Sie hier die Zahl 10 ein. Damit Excel weiß, dass es die TopTen-Filterfunk-tion anwenden soll, weisen Sie dem Argument Operator die KonstantexlTop10Items zu.

Um die zehn niedrigsten Einträge in Spalte B anzuzeigen, lautet die ent-sprechende Zeile wie folgt:

Selection.AutoFilter Field:=2, Criteria1:="10", _Operator:=xlBottom10Items

Wie Sie sehen, werden nun wirklich nur die höchsten zehn Werte aus Spalte Bangezeigt. Diese Zeilen liegen aber nicht sortiert vor. In diesem Fall können Siedie Sortierung über einen VBA-Befehl nachholen, den Sie im Makro aus Listing8.7 sehen können.

Abbildung 8.6: Die zehn höchsten Wert in Spalte B anzeigen

371

Page 372: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Listing 8.7: Filterung von Daten mit anschließender Sortierung

Sub TopTenFilterEinstellenErw() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter

Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlTop10Items ActiveSheet.UsedRange.Sort Key1:=Range("B1"), _ Order1:=xlDescending, Header:=xlYesEnd Sub

Wenden Sie die Methode Sort an, um einen Datenbereich zu sortieren. DenDatenbereich ermitteln Sie über die Eigenschaft UsedRange. Bei der Methode Sortkönnen Sie einige Argumente angeben. Unter anderem müssen Sie angeben, nachwelchem Kriterium (Key1) sortiert werden soll. Außerdem ist natürlich auch vonInteresse, ob absteigend (Order1:=xlDescending) oder aufsteigend (Order1:=xlAs-cending) sortiert werden soll. Ein weiteres wichtiges Argument ist Header. Damitgeben Sie bekannt, ob die erste Zeile eine Überschrift enthält. In diesem Fall darfdiese Zeile nicht mitsortiert werden. Setzen Sie dieses Argument auf den WertxlYes, wenn der Bereich eine Überschrift enthält. Wenn nicht, dann weisen Siediesem Argument die Konstante xlNo zu.

Abbildung 8.7: Die Daten liegen nun sortiert vor.

372

Page 373: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Daten filtern

Wo stecken die Filter?

Die eingestellten Filter sehen Sie ganz deutlich an den blauen Filterpfeilen. Wieaber können Sie über den Einsatz eines Makros prüfen, in welcher Spalte einAutoFilter eingestellt ist und in welcher Spalte nicht?

Im folgenden Makro wird diese Frage beantwortet. Dabei wurde im Voraus dasMakro aus Listing 8.7 gestartet, welches in Spalte B die zehn höchsten Einträge fil-tert.

Listing 8.8: Die eingestellten (aktiven) Filter ermitteln

Sub WoSteckenDieFilter()Dim Mappe As WorksheetDim b As BooleanDim i As Integer

Set Mappe = ThisWorkbook.Worksheets("Tabelle1")

For i = 1 To ActiveSheet.Columns.CountOn Error GoTo ende If Mappe.AutoFilterMode Then b = Mappe.AutoFilter.Filters(i).On Debug.Print "Filter in Spalte " & i & ": "; b End IfNext i

ende:End Sub

Definieren Sie im ersten Schritt ein paar Objektvariablen. In der ObjektvariablenMappe speichern Sie die Mappe sowie die Tabelle, auf der nach den gesetztenAutofiltern recherchiert werden soll. Setzen Sie danach eine Schleife auf, diebeginnend von Spalte A alle Spalten abarbeitet.

In einer Variablen vom Typ Boolean speichern Sie den Zustand des AutoFilters.Die Eigenschaft Filters liefert den Wert Falsch, wenn kein Filterkriterium in derjeweiligen Spalte eingestellt ist, bzw. den Wert Wahr, wenn ein Filterkriterium fürdie Spalte festgelegt wurde.

Mithilfe der Methode Debug.Print geben Sie den Spaltenindex sowie den Statusdes Filters im Direktfenster Ihrer Entwicklungsumgebung aus.

373

Page 374: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Nach dem Starten des Makros blenden Sie den Direktbereich ein, indem Sie indie Entwicklungsumgebung wechseln und aus dem Menü ANSICHT den BefehlDIREKTFENSTER wählen.

Den Spezialfilter einsetzen

Wenn Sie in einem großen Datenbestand versehentlich Duplikate eingegebenhaben und nun eine Liste erstellen möchten, bei der jeder Satz nur einmal vor-kommt, dann verwenden Sie den Spezialfilter in Excel. Den Spezialfilter könnenSie aufrufen, indem Sie aus dem Menü DATEN den Befehl FILTER/SPEZIALFILTERwählen und die Kriterien des Spezialfilters einstellen.

In der nächsten Aufgabe sind in Spalte A der TABELLE2 einige Zahlenwerte einge-geben. Ihre Aufgabe besteht nun darin, aus dieser Liste eine Unikatsliste in SpalteE zu erstellen. Sehen Sie sich zunächst einmal die Ausgangssituation in Abbildung8.9 an.

Abbildung 8.8: In Spalte B ist der Auto-Filter eingestellt.

374

Page 375: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Daten filtern

Erfassen Sie nun das Makro aus Listing 8.9.

Listing 8.9: Eine Unikatsliste erstellen

Sub DatenSpezialfilter()Dim Bereich As Range

Sheets("Tabelle2").Activate Set Bereich = ActiveSheet.UsedRange.Columns(1) Bereich.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Bereich, CopyToRange:=Range("E1"), _ Unique:=TrueEnd Sub

Legen Sie zuerst in einer Objektvariablen über die Anweisung Set fest, welcherBereich mit dem Spezialfilter ausgewertet werden soll. Da Sie Ihre Tabelle aufdoppelte Einträge überprüfen möchten, legen Sie den Bereich für den Spezialfil-ter mit der Spalte A fest. Danach wenden Sie die Methode AdvancedFilter an, diefolgende Syntax aufweist:

Ausdruck.AdvancedFilter(Action, CriteriaRange, CopyToRange, Unique)

Beim Argument Ausdruck muss es sich um ein Range-Objekt handeln. Im Beispielaus Listing 8.9 ist das der Bereich der verwendeten Zellen in Spalte A.

Das Argument Action ist vom Datentyp Long und muss angegeben werden. Esstellt die Filter-Operation dar. Dabei können Sie eine der folgenden xlFilterAc-tion-Konstanten anwenden: xlFilterInPlace (an gleicher Stelle filtern) oderxlFilterCopy (Ergebnis des Filterns an anderer Stelle der Tabelle einfügen).

Abbildung 8.9: In dieser Liste soll jede Zahl nur ein-mal vorkommen.

375

Page 376: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Das Argument CriteriaRange vom Datentyp Variant ist optional und stellt denKriterienbereich für die Filterung dar. Falls das Argument nicht angegeben wird,gibt es keine Kriterien.

Das Argument CopyToRange vom Datentyp Variant ist optional und repräsentiertden Zielbereich für die kopierten Zeilen, wenn das Argument Action den WertxlFilterCopy aufweist. Andernfalls wird das Argument ignoriert.

Gefilterte Daten exportieren

Haben Sie Ihre Daten gefiltert und möchten Sie sie in eine neue Arbeitsmappeübertragen, dann starten Sie das folgende Makro:

Listing 8.10: Gefilterte Daten in neue Arbeitsmappe kopieren

Sub GefilterteDatenKopieren() Sheets("Tabelle1").Activate ActiveCell.CurrentRegion.SpecialCells(xlVisible).Copy Workbooks.Add Range("A1").Select ActiveCell.PasteSpecial Paste:=xlPasteAllEnd Sub

Mithilfe der SpecialCells-Methode und der Eigenschaft CurrentRegion ermittelnSie alle sichtbaren Zellen im umliegenden Bereich. Diese kopieren Sie mit derMethode Copy. Fügen Sie danach mithilfe der Methode Add eine neue Arbeits-mappe ein. Setzen Sie den Mauszeiger auf Zelle A1 und fügen den Inhalt der Zwi-

Abbildung 8.10: Die Unikatsliste sehen Sie in Spal-te E.

376

Page 377: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Daten filtern

schenablage mit der Methode PasteSpecial ein. Im Argument Paste setzen Sie dieKonstante xlPasteAll ein, um die Werte und Formate einzufügen. Allerdings wer-den die Spaltenbreiten dadurch nicht korrekt eingestellt. Diese müssen noch korri-giert werden.

Möchten Sie die gefilterten Daten in eine Textdatei übertragen, dann führen Siezunächst eine Filterung der Daten durch. Sie kopieren diese auf ein neues Tabel-lenblatt und exportieren danach diese Tabelle in eine Textdatei.

Im folgenden Makro aus Listing 8.11 wird die TABELLE1 gefiltert und in einerneuen Tabelle abgelegt. Danach wird diese neue Tabelle in eine Textdatei über-führt.

Listing 8.11: Die gefilterten Daten in eine Textdatei überführen

Sub GefilterteTabelleInTextdateiSpeichern()Dim Zelle As RangeDim i As IntegerDim iZ As IntegerDim e As IntegerDim s As String

Sheets("Tabelle1").ActivateActiveSheet.UsedRange.CopySheets.AddRange("A1").SelectActiveSheet.Paste

Abbildung 8.11: Die gefilterten Daten wurden übertragen.

377

Page 378: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

iZ = Range("A65536").End(xlUp).Row

Open "C:\eigene Dateien\Ausgabe.txt" For Output As #1 For i = 1 To iZ

For e = 1 To ActiveSheet.UsedRange.Columns.Count s = s & ";" & Cells(i, e).Value Next e

s = Mid(s, 2, Len(s) - 1) Print #1, s s = "" Next i

Close #1MsgBox "Datenübertragung beendet!"End Sub

Mit der Methode Copy und der Eigenschaft UsedRange kopieren Sie den benutztenBereich und fügen diesen auf dem Tabellenblatt TABELLE1 ein. Dort ermitteln Siedie letzte belegte Zelle in Spalte A. Dies gelingt Ihnen über die Eigenschaft End,die die Zelle am Ende der Region darstellt, die den Quellbereich enthält. DerQuellbereich stellt im Beispiel die Zahl 65536 dar, welches die maximale Anzahlvon Zeilen in einer Excel-Tabelle darstellt. Dieser Eigenschaft übergeben Sie dieRichtungskonstante xlUp. Neben xlUp können Sie auch xlToLeft, xlToRight oderxlDown verwenden, je nachdem, welche Zelle Sie ermitteln möchten.

Danach öffnen Sie mithilfe der Anweisung Open eine Textdatei, ohne sie vorheranzulegen. Nun setzen Sie eine Schleife auf, die alle Zeilen der Tabelle durch-läuft. Innerhalb dieser Schleife basteln Sie sich eine zweite Schleife, welche dieSpalten einer Zeile von links nach rechts durchläuft. Die Anzahl der abzuarbeiten-den Spalten ermitteln Sie über die Anweisung ActiveSheet.UsedRange.Columns.Count. Innerhalb dieser zweiten Schleife speichern Sie die einzelnen Zellenin-halte in der String-Variablen s. Die Zelleninhalte werden durch das Semikolonvoneinander getrennt.

Setzen Sie die Anweisung Print ein, um die einzelnen Zeilen in die Textdatei zuschreiben. Schließen Sie nach der Übertragung der Daten die Textdatei mithilfeder Anweisung Close.

378

Page 379: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Pivot-Tabellen einsetzen

8.2 Pivot-Tabellen einsetzen

In Excel haben Sie die Möglichkeit, sehr schnell aussagekräftige Berichte zu erstel-len. Die wohl beste und sicherste Methode, in Excel Daten auszuwerten und auf-zubereiten, ist die Anwendung von Pivot-Tabellen. Diese Pivot-Tabellen könnenauch per VBA-Code erstellt werden.

Pivot-Tabellen erstellen

Die nächsten Beispiele werden anhand einer Artikel-Tabelle programmiert, dieSie in Abbildung 8.13 sehen können.

Abbildung 8.12: Die gefilterten Daten liegen in einer Textdatei vor

Abbildung 8.13: Die Ausgangsta-belle mit Artikel-daten

379

Page 380: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Im folgenden Beispiel soll eine Pivot-Tabelle erstellt werden, die Aussage darübergibt, welche Artikel sich an welchem Ort befinden.

Listing 8.12: Eine Pivot-Tabelle erstellen

Sub ErstellenPivotTabelle()Dim Bereich As Range

Sheets("Tabelle3").ActivateSet Bereich = ActiveSheet.UsedRangeRange(Bereich.Address).Select

ActiveSheet.PivotTableWizard _ SourceType:=xlDatabase, SourceData:= _ Bereich, TableDestination:="", TableName:="Pivot"With ActiveSheet.PivotTables("Pivot") .PivotFields("Bezeichnung").Orientation = xlRowField .PivotFields("Ort").Orientation = xlColumnField .PivotFields("Preis").Orientation = xlDataFieldEnd WithEnd Sub

Im ersten Schritt aktivieren Sie das Tabellenblatt, welches die Quelldaten für dieAuswertung enthält, und legen den verwendeten Bereich in der Variablen Bereichfest. Danach markieren Sie den Quellbereich und wenden die Methode PivotTableWizard an, die die Pivot-Tabelle erstellt.

Die Methode PivotTableWizard hat folgende Syntax:

PivotTableWizard(SourceType, SourceData, _

TableDestination, TableName, RowGrand, _

ColumnGrand, SaveData, HasAutoFormat, AutoPage, _

Reserved, BackgroundQuery, OptimizeCache, _

PageFieldOrder, PageFieldWrapCount, ReadData, _

Connection)

Auf die wichtigsten Argumente der Methode PivotTableWizard wird nun nähereingegangen. Im Argument SourceType geben Sie die Quelle der Daten in demBericht an. Zulässig ist eine der in der folgenden Tabelle aufgeführten Konstanten.

380

Page 381: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Pivot-Tabellen einsetzen

Beim Argument SourceData legen Sie den Datenbereich für den neuen Berichtfest. Hierfür haben Sie vorher den verwendeten Bereich auf dem Tabellenblatt inder Variablen Bereich definiert, welche Sie hier nun als Argument angeben.

Im Argument TableDestination können Sie eine Zieltabelle inklusive der Positionder ersten Zelle für den Pivot-Tabellenbericht angeben. Belassen Sie dieses Argu-ment leer, wenn der Pivot-Tabellenbericht auf einer neuen Tabelle, beginnend abZelle A1, eingefügt werden soll.

Im Argument TableName geben Sie dem Pivot-Tabellenbericht einen Namen. Diesist sehr wichtig, um später bei der Anordnung der Pivot-Felder auf die richtigePivot-Tabelle zuzugreifen. Wird dieses Argument nicht gesetzt, vergibt Exceleigene Namen für die Pivot-Tabellen, die die Bezeichnung PIVOTTABLE enthal-ten, und eine fortlaufende Nummer. Gerade diese fortlaufende Nummer machtdann bei der weiteren Programmierung der Pivot-Tabelle Schwierigkeiten. Ausdiesem Grund füllen Sie dieses Argument mit einem Namen, der konstant bleibt.

Beginnen Sie jetzt mit der Anordnung Ihrer Datenfelder und nutzen Sie dazu dasAuflistungsobjekt PivotFields. In diesem Auflistungsobjekt stehen alle verfügba-ren Feldnamen der Pivot-Tabelle, die den Spaltenüberschriften des Quellbereichsentsprechen.

Mit der Eigenschaft Orientation legen Sie die Position des Feldnamens in derPivot-Tabelle fest. Die Möglichkeiten, die Sie dabei haben, sehen Sie in der fol-genden Tabelle.

Konstante Beschreibung

xlConsolidation Mehrere Konsolidierungsbereiche

xlDatabase Microsoft Excel-Datenbank oder -Liste (Standard)

xlExternal Externe Datenquelle

xlPivotTable Gleiche Quelle wie ein anderer PivotTable-Bericht

Tabelle 8.2: Die Konstanten des Arguments SourceType

381

Page 382: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Pivot-Tabellen aktualisieren

Bei der Arbeit mit Pivot-Tabellen gibt es zwei Punkte, die Sie beachten müssen:

� Ist der Pivot-Tabellenbericht aktualisiert?

� Greift die Pivot-Tabelle wirklich auf den gewünschten Datenbereich zu? (Istder Datenbereich nachträglich vergrößert worden?)

Um eine Pivot-Tabelle zu aktualisieren, starten Sie das Makro aus Listing 8.13.

Konstante Beschreibung

xlColumnField Der Spaltenbereich der Pivot-Tabelle wird in unserem Beispiel mit dem Ort gefüllt.

xlDataField Im Datenbereich der Pivot-Tabelle wird der Preis der einzelnen Artikel ausgegeben.

xlHidden Mit dieser Konstante können Sie einzelne Datenfelder ausblenden.

xlPageField Das Seitenfeld der Pivot-Tabelle bleibt in diesem Beispiel leer.

xlRowField Im Zeilenbereich wird die Bezeichnung der einzelnen Artikel aufgelistet.

Tabelle 8.3: Die verschiedenen Konstanten des Arguments Orientation

Abbildung 8.14: Die fertige Pivot-Tabelle

382

Page 383: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Pivot-Tabellen einsetzen

Listing 8.13: Eine Pivot-Tabelle aktualisieren

Sub EinzelnePivotTabelleAufBlattAktualisieren() On Error GoTo fehler Sheets("Tabelle11").PivotTables("Pivot").RefreshTable 'oder 'Sheets("Tabelle11").PivotTables(1).RefreshTableExit Sub

fehler: MsgBox "Es konnte keine Pivot-Tabelle gefunden werden!"End Sub

Auf der TABELLE11 in der aktiven Arbeitsmappe wird die Pivot-Tabelle Pivot mit-hilfe der Methode RefreshTable auf den neuesten Stand gebracht. Die AnweisungOn Error ist eine reine Sicherheitsmaßnahme, die verhindern soll, dass das Makroabstürzt, wenn die richtige Pivot-Tabelle nicht gefunden werden kann.

Sehr oft kommt es auch vor, dass der Bereich, auf den eine Pivot-Tabelle zugreift,erweitert wurde. Diese Anpassung bekommt die Pivot-Tabelle aber nicht automa-tisch mit. Erfassen Sie zu diesem Zweck das Makro aus Listing 8.14, welches denbenutzten Bereich der TABELLE3 ermittelt und diesen Bereich der Pivot-TabellePivot übergibt. Anschließend erfolgt eine Aktualisierung der Pivot-Tabelle.

Listing 8.14: Eine Pivot-Tabelle dynamisch erweitern und aktualisieren

Sub PivotTabellenDatenbereichErweitern()Dim pt As PivotTableDim Bereich As Range

Set Bereich = Sheets("Tabelle3").UsedRange ActiveWorkbook.Names.Add _ Name:="Pivot", _ RefersTo:=Bereich, Visible:=True Bereich.Select

For Each pt In Sheets("Tabelle11").PivotTables With pt .PivotTableWizard SourceType:=xlDatabase, _ SourceData:="Pivot" End With

383

Page 384: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

pt.RefreshTableNext ptEnd Sub

Ermitteln Sie zuerst einmal den verwendeten Bereich auf Ihrer TABELLE3 undspeichern Sie diesen Bereich in der Objekt-Variablen Bereich. Benennen Siedanach den ermittelten Bereich, geben diesem den Namen Pivot und markierenSie den Bereich im Anschluss.

Mithilfe einer For-Each-Schleife greifen Sie auf alle Pivot-Tabellenberichte auf derTABELLE11 zu, erweitern den Datenbereich und aktualisieren die Pivot-Tabellen-berichte.

Das neue Thema lautet:

� Diagrammtypen auswählen

8.3 Diagramme erstellen

Der Spruch, dass ein Bild mehr aussagt als tausend Worte, wird immer wiedergerne verwendet. Gerade in Excel können Sie aus Zahlentabellen mit ein paarwenigen Handgriffen aussagekräftige Diagramme erstellen. Bei der Erstellung vonDiagrammen haben Sie die Auswahl aus mehreren Diagrammtypen. Excel bietetIhnen dabei über den Diagramm-Assistenten eine Vielzahl an unterschiedlichenDiagrammen an.

Diagrammtypen auswählen

In VBA wird für den Diagrammtyp die Eigenschaft ChartType verwendet. In der nach-folgenden Tabelle sehen Sie exemplarisch eine kleine Auswahl an möglichen Dia-grammtypen, die über eine xlChartType-Konstante angesprochen werden können.

384

Page 385: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Diagramme erstellen

Neben den in der Tabelle abgebildeten Diagrammtypen gibt es nochZylinder-, Kegel- und Pyramidendiagramme sowie zu jedem Diagrammzahlreiche Untertypen. Eine komplette Liste der vorhandenen Dia-gramme in Excel bekommen Sie in der Online-Hilfe unter dem Stich-wort ChartType.

Der Standard – das Säulendiagramm

Standardmäßig wird in Excel das Säulendiagramm verwendet. Wenn Sie dazu denDatenbereich markieren, aus dem Sie ein Diagramm erstellen möchten, und danndie Taste (F11) drücken, wird blitzschnell automatisch ein Säulendiagramm ein-gefügt. Dieser Standardtyp wird in der Praxis oft verwendet, um Kosten oder Leis-tungen über Monate hinweg darzustellen.

Diagrammtyp Konstante

Säulendiagramm (gruppiert) xlColumnClustered

Säulendiagramm (gestapelt) xlColumnStacked

Säulendiagramm 3D-Darstellung xl3DColumn

Balkendiagramm (gruppiert) xlBarClustered

Balkendiagramm (gestapelt) xlBarStacked

Liniendiagramm xlLine

Kreisdiagramm xlPie

Punktdiagramm xlXYScatter

Blasendiagramm xlBubble

Flächendiagramm xlArea

Ringdiagramm xlDoughnut

Netzdiagramm xlRadar

Oberflächendiagramm xlSurface

Kursdiagramm xlStockHLC

Tabelle 8.4: Mögliche Diagrammtypen in Excel

385

Page 386: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

In der folgenden Aufgabe gehen Sie von der nachfolgenden Datentabelle aus.

Aus dieser Datentabelle soll nun ein Diagramm erzeugt werden. Dabei soll derName der Tabelle (Kostenvergleich 1998–2001) als Diagrammtitel verwendet wer-den. Das Makro für diese Aufgabe lautet:

Listing 8.15: Das Säulendiagramm erstellen

Sub SäulenDiagrammErstellen()Dim Bereich As RangeDim s As String

Set Bereich = Range("B2:F3") s = ActiveSheet.Name Charts.Add

With ActiveChart .ChartType = xlColumnClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlRows .HasTitle = True .ChartTitle.Text = s End WithEnd Sub

Im ersten Schritt legen Sie den Bereich fest, der die Datenbasis für das Diagrammenthält. Dazu speichern Sie die Adresse des Bereichs in der Range-VariablenBereich. Danach ermitteln Sie den Namen des aktiven Tabellenblattes über dieEigenschaften ActiveSheet und Name und speichern ihn in der Variablen s. Mitder Methode Add erstellen Sie zunächst ein neues, noch leeres Diagrammblatt.

Abbildung 8.15: Die Ausgangsta-belle mit den Roh-daten

386

Page 387: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Diagramme erstellen

Danach legen Sie das Aussehen des Diagramms fest. Mit der Eigenschaft Chart-Type bestimmen Sie den Diagrammtyp.

Über die Methode SetSourceData geben Sie an, woher Excel die Daten für dasDiagramm bekommt. Diese Methode benötigt zwei Argumente. Dem ersten Argu-ment Source übergeben Sie die Variable Bereich. Mit dem zweiten ArgumentPlotBy legen Sie fest, wie die Daten angezeigt werden sollen. Wählen Sie entwe-der die Konstante xlColumns oder xlRows. Bei der Konstanten xlRows werden dieeinzelnen Säulen in einer einheitlichen Farbe formatiert. Hingegen werden dieeinzelnen Säulen bei Verwendung der Konstanten xlColumns in unterschiedlichenFarben ausgegeben.

Die Eigenschaft HasTitle müssen Sie auf den Wert True setzen, damit eine Über-schrift im Diagramm angezeigt werden kann. Die Überschrift des Diagrammserstellen Sie mithilfe der Eigenschaft ChartTitle und der Eigenschaft Text, die Sieaus der Variablen s erfragen können.

Ergebnisse über das Balkendiagramm vergleichen

Ein weiteres sehr oft eingesetztes Diagramm ist das Balkendiagramm. Damit kön-nen Sie einzelne Informationen wie Umsatz, Kosten oder Leistungen auf einenBlick miteinander vergleichen.

Abbildung 8.16: Das erste Dia-gramm über den Einsatz von VBA erstellen

387

Page 388: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

In der folgenden Aufgabe sollen die Umsätze von Arbeitsgruppen in einembestimmten Monat verglichen werden. Als Ausgangstabelle gehen Sie dabei vonder folgenden Abbildung aus.

Erstellen Sie nun anhand dieser Vorgabetabelle ein Balkendiagramm.

Listing 8.16: Ein Balkendiagramm erstellen

Sub BalkenDiagrammErstellen()Dim Bereich As RangeDim s As String

Set Bereich = Sheets("Arbeitsgruppen-Vergleich").Range("A3:B13")s = ActiveSheet.NameCharts.Add

With ActiveChart .ChartType = xl3DbarClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlColumns .HasTitle = True .ChartTitle.Text = s End WithEnd Sub

Abbildung 8.17: Arbeitsgruppen miteinander ver-gleichen

388

Page 389: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Diagramme erstellen

Stellen Sie zuerst sicher, dass Sie sich auf dem gewünschten Tabellenblatt befin-den, auf dem sich die Daten für das Diagramm befinden. Diese Information gebenSie in der Objektvariablen Bereich mitsamt dem Zellenbereich über die Anwei-sung Set an. Fügen Sie danach ein neues Diagrammobjekt über die Methode Addein. Über die Eigenschaft ChartType können Sie ein Diagramm Ihrer Wahl (sieheTabelle 8.4) festlegen. Die Datenbasis für das Diagramm ermitteln Sie mit derMethode SetSourceData, der Sie im Argument Source den vorher definiertenBereich übergeben.

Tagesgenaue Auswertungen über das Liniendiagramm

Haben Sie Datenmaterial vorliegen, das sich über einen größeren Zeitraumerstreckt, und sind dabei die einzelnen Intervalle recht kurz, dann können Sie einLiniendiagramm einsetzen. So können Sie in der Praxis beispielsweise Tempera-turschwankungen innerhalb eines Tages oder Aktienkurse über einen bestimmtenZeitraum hinweg darstellen.

In der folgenden Aufgabe werden Temperaturen innerhalb eines Tages gemessenund zu jeder vollen Stunde in eine Tabelle geschrieben. Die Temperaturtabellesieht dabei wie in Abbildung 8.19 aus.

Erfassen Sie nun das Makro, welches die Temperaturverläufe in einem Liniendia-gramm darstellt.

Abbildung 8.18: Die Arbeitsgrup-pen wurden in einem übersichtli-chen Diagramm dargestellt.

389

Page 390: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Listing 8.17: Temperaturverläufe in einem Liniendiagramm darstellen

Sub LinienDiagrammErstellen()Dim Dia As ChartObjectDim s As StringDim i As Integer

Sheets("Temperaturen").Activate s = ActiveSheet.Name ActiveSheet.ChartObjects.Delete Set Dia = Sheets("Temperaturen").ChartObjects.Add _ (150, 10, 500, 300) Dia.Name = "Temperaturen von heute" i = ActiveSheet.Range("B1").End(xlDown).Row Range("A2:B" & i).Copy ActiveSheet.ChartObjects("Temperaturen von heute").Activate ActiveChart.SeriesCollection.Paste _ Rowcol:=xlColumns, SeriesLabels:=False, _ CategoryLabels:=True, Replace:=True, NewSeries:=True Application.CutCopyMode = False

With ActiveChart

Abbildung 8.19: Die Temperatu-ren werden zu jeder vollen Stun-de aufgezeichnet.

390

Page 391: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Diagramme erstellen

.ChartType = xlLineMarkers .HasLegend = False .HasTitle = True .ChartTitle.Text = s End With

Range("A1").SelectEnd Sub

Im ersten Schritt aktivieren Sie die Tabelle TEMPERATUR und schreiben denTabellennamen der aktiven Tabelle in die Variable s. Dieser Tabellenname sollspäter die Überschrift des Diagramms werden. Da Sie ein eingebettetes Diagrammeinfügen möchten, müssen Sie dafür Sorge tragen, dass bei mehrmaligem Startendes Makros nicht mehrere Diagramme übereinander eingefügt werden. LöschenSie daher zu Beginn alle integrierten Diagramme auf dem Arbeitsblatt über dieMethode Delete.

Danach fügen Sie ein noch leeres Chart-Objekt in Ihre Tabelle mit der MethodeAdd ein. Dabei können Sie die Position des ChartObjekts genau festlegen. Die vierZahlenwerte entsprechen den Angaben linker Rand, oberer Rand, Breite undHöhe. Die Werte werden in Punkten angegeben und beziehen sich auf die oberelinke Ecke der Zelle A1 oder auf die obere linke Ecke des Diagramms.

Geben Sie als Nächstes dem eingebetteten Diagramm einen Namen. Jetzt müssenSie herausbekommen, wie viele Messungen im Diagramm angezeigt werden sol-len. Dazu ermitteln Sie die letzte belegte Zelle in Spalte B und speichern die Zei-lennummer in der Variablen i. Markieren Sie den Bereich und kopieren Sie ihnmit der Methode Copy. Markieren Sie danach Ihr gerade eingefügtes Diagramm.

Um die kopierten Daten einzufügen, verwenden Sie die Methode Paste derSeriesCollection-Auflistung. Die Syntax dieser Methode lautet:

Paste(Rowcol, SeriesLabels, CategoryLabels, Replace, _ NewSeries)

Im ersten Argument RowCol geben Sie Auskunft darüber, ob sich die Daten in Zei-len oder Spalten befinden. Zulässig sind hierbei die Konstanten xlColumns oderxlRows.

Das Argument SeriesLabels gibt an, woher Excel die Beschriftung für die Daten-reihen nehmen soll. Wird der Wert auf True gesetzt, wird der Inhalt der Zelle inder ersten Spalte jeder Zeile (bzw. der ersten Zeile jeder Spalte) als Name für dieDatenreihe in der betreffenden Zeile (bzw. Spalte) verwendet. Setzen Sie diesesArgument auf den Wert False, wenn der Inhalt der Zelle in der ersten Spalte jeder

391

Page 392: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Zeile (bzw. der ersten Zeile jeder Spalte) als erster Datenpunkt der Datenreihe ver-wendet werden soll.

Das nächste Argument CategoryLabels weist den Wert True auf, wenn der Inhaltder ersten Zeile (bzw. Spalte) als Rubrik des Diagramms verwendet wird. SetzenSie das Argument auf den Wert False, wenn der Inhalt der ersten Zeile (bzw.Spalte) als erste Datenreihe im Diagramm verwendet werden soll.

Das Argument Replace ist standardmäßig auf den Wert True gesetzt. Dabei werdenbeim Ersetzen vorhandener Rubriken durch Informationen aus dem kopiertenBereich Rubriken angewendet.

Das letzte Argument NewSeries hat dann den Wert True, wenn die Daten als eineneue Datenreihe eingefügt werden sollen. Setzen Sie das Argument auf den WertFalse, wenn Sie die Daten als neue Datenpunkte in eine vorhandene Datenreiheeinfügen möchten.

Nach der Kopier- und Einfügeaktion ist nach wie vor der Kopierrahmen aktiv. Set-zen Sie die Eigenschaft CutCopyMode auf den Wert False, um den Ausschneide-bzw. Kopiermodus zu deaktivieren und den Laufrahmen zu entfernen. Als letzteAufgabe weisen Sie dem Diagramm den gewünschten Diagrammtyp über dieEigenschaft ChartType zu, verzichten auf eine Legende, indem Sie die EigenschaftHasLegend auf den Wert False setzen, und zeigen die Überschrift im Diagramman, indem sie der Eigenschaft ChartTitle den Text Ihrer Variablen s zuweisen.

Wenn Sie sich die Abbildung 8.20 ansehen, dann stellen Sie fest, dass die Skalie-rung der Y-Achse von 0 bis 18° geht. Diese Skalierung wird von Excel automatischbeim Erstellen des Diagramms festgelegt. Selbstverständlich haben Sie die Mög-lichkeit, die Skalierung auch selbst zu bestimmen.

Abbildung 8.20: Die Temperatu-ren werden über-sichtlich in einem Liniendiagramm dargestellt.

392

Page 393: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Diagramme erstellen

Daten richtig skalieren

Greifen wir das gerade erstellte Beispiel mit den Temperaturen noch einmal auf.Die Skalierung soll jetzt angepasst werden. Dabei sollen der größte Wert der Tem-peraturtabelle (17°) und der niedrigste Wert (9°) für die Skalierung herangezogenwerden. Die Skalierung soll beim niedrigsten Punkt beginnen und beim höchstenPunkt enden.

Passen Sie das Makro aus Listing 8.17 wie folgt an. (Es werden nur die Änderun-gen im folgenden Listing aufgeführt.)

Listing 8.18: Die Skalierung des Diagramms selbst bestimmen

Sub LinienDiagrammErstellen()Dim i_min As IntegerDim i_max As Integer

i_min = Application.WorksheetFunction.Min(Range("B2:B" & i)) i_max = Application.WorksheetFunction.Max(Range("B2:B" & i))

With ActiveChart.Axes(xlValue) .MinimumScale = i_min .MaximumScale = i_max .MajorUnit = 1 End With

End Sub

Ermitteln Sie über die beiden Tabellenfunktionen WorkSheetFunction Max und Minden höchsten sowie den niedrigsten Wert der Temperaturmessung. Diese beidenWerte weisen Sie danach den Eigenschaften MinimumScale sowie MaximumScale zu.Die Schrittweite der Skalierung legen Sie mithilfe der Eigenschaft MajorUnit fest.

Diagramme platzieren

Beim Einfügen von Diagrammen haben Sie die Auswahl, ob Sie das Diagrammunterhalb Ihrer Datentabelle oder als neues Diagrammblatt einfügen möchten.Sie haben jedoch jederzeit die Möglichkeit, Diagramme innerhalb von Arbeits-mappen und Tabellen hin und her zu schieben.

393

Page 394: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Im folgenden Beispiel soll das eingebettete Diagramm auf der Tabelle TEMPERA-TUREN in einem separaten Diagrammblatt mit dem Namen TEMPERATUREN-GROSS transferiert werden. Das Makro für diese Aufgabe können Sie im nächstenListing sehen:

Listing 8.19: Den Speicherort des Diagramms bestimmen

Sub EingebettetesDiagrammZuDiagrammblatt() Sheets("Temperaturen").Activate ActiveSheet.ChartObjects(1).Activate ActiveChart.Location Where:=xlLocationAsNewSheet, _ Name:="Temperaturen-Groß"End Sub

Greifen Sie auf das erste eingebettete Diagramm auf Ihrer Tabelle zu und wendenSie die Methode Location an, um das eingebettete Diagramm zu verschieben. Beider Methode Location können Sie im Argument Where entweder die KonstantenxlLocationAsNewSheet, xlLocationAsObject oder xlLocationAutomatic verwen-den. In Listing 8.19 wird das eingebettete Diagramm in ein neues Diagrammblattverschoben. Aus diesem Grund verwenden Sie hier das Argument xlLocationAs-NewSheet. Im Argument Name geben Sie an, wie das neue Diagrammblatt heißensoll.

Abbildung 8.21: Die Skalierung der Daten selbst bestimmen

394

Page 395: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Diagramme erstellen

Diagramme formatieren

Excel wählt beim Erstellen von Diagrammen die Farben des Diagramms selbst-ständig aus. Diese Auswahl der Farben können Sie selbstverständlich auch nacheigenem Geschmack durchführen.

In der folgenden Aufgabe werden Sie ein Säulendiagramm einfügen. Im Säulendia-gramm selbst werden Deckungsbeiträge angezeigt. Diese Deckungsbeiträge könnenentweder im negativen oder im positiven Bereich liegen. Ihre Aufgabe besteht nundarin, alle negativen Deckungsbeiträge mit der Füllfarbe ROT sowie alle positiven

Abbildung 8.22: Das Diagramm wurde in ein sepa-rates Diagramm-blatt verschoben.

Abbildung 8.23: Das Ausgangsdia-gramm

395

Page 396: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Deckungsbeiträge mit der Füllfarbe BLAU zu formatieren. Gehen Sie zunächst vonfolgender Ausgangstabelle aus (siehe Abbildung 8.23).

In Abbildung 8.23 sind alle Säulen mit der Füllfarbe BLAU formatiert. Erfassen Siejetzt das folgende Makro aus Listing 8.20, um die negativen Deckungsbeiträge mitder Füllfarbe ROT zu formatieren.

Listing 8.20: Säulen unterschiedlich einfärben

Sub SäulenVerschiedenfarbig()Dim Datenreihe As SeriesDim Punkt As PointDim i As IntegerDim DArray As Variant

Sheets("Deckungsbeiträge").ActivateSet Datenreihe = _ ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1) With Datenreihe DArray = .Values For Each Punkt In .Points i = i + 1

If DArray(i) < 0 Then Punkt.Interior.ColorIndex = 3 Else Punkt.Interior.ColorIndex = 5 End If Next End WithEnd Sub

Definieren Sie zuerst eine Objektvariable vom Typ Series. Nun lesen Sie alle Y-Werte in ein Datenfeld ein und durchlaufen danach eine For-Each-Schleife, in derSie die einzelnen Datenpunkte kontrollieren. Die Werte entnehmen Sie demDatenfeld DArray. Weist ein Datenpunkt einen Wert < 0 auf, wird der Innenbe-reich der Säule mit der Farbe ROT formatiert. Bei allen positiven Werten wird einblauer Farbton gewählt.

396

Page 397: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Diagramme erstellen

Diagramme exportieren

In Excel können Sie Diagramme über einen Grafikfilter umwandeln und somit inein anderes Format überführen. Das bringt Vorteile, wenn Sie Diagramme an Per-sonen ausliefern möchten, die kein Excel installiert haben. Erstellen Sie aus denExcel-Diagrammen Speicher schonende Grafikdateien im GIF-Format. Auchwenn Sie Diagramme in Ihrer Textverarbeitung verwenden und dabei keineExcel-Diagramme verknüpfen möchten, ist das Einbinden von Diagramm-Grafi-ken eine gute Alternative. Allerdings können diese umgewandelten Diagrammedann nicht mehr aktualisiert werden.

In der folgenden Aufgabe wird das gerade formatierte Diagramm aus Abbildung8.24 in eine Grafikdatei umgewandelt. Erfassen Sie zu diesem Zweck das Makroaus Listing 8.21.

Listing 8.21: Diagramm als Grafik-Objekt exportieren

Sub DiagrammeAlsGrafikSpeichern()Dim Dia As Chart

Sheets("Deckungsbeiträge").ActivateSet Dia = ActiveSheet.ChartObjects(1).ChartDia.Export Filename:="c:\Eigene Dateien\Export.gif", _FilterName:="GIF"End Sub

Abbildung 8.24: Unterschiedliche Farben der Säulen

397

Page 398: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Über die Methode Export exportieren Sie das Diagramm in ein Grafikformat.Dabei verwendet die Methode Export die Argumente FileName und FilterName.Im Argument FileName geben Sie den Pfad sowie den Namen der Grafikdatei an.Im Argument FilterName wird der Name des Grafikfilters angegeben, der verwen-det werden soll.

8.4 Fragen & Antworten

F Wie können Sie feststellen, wie viele Zeilen gefiltert sind?

A Um diese Aufgabe zu lösen, starten Sie das Makro aus Listing 8.22.

Listing 8.22: Die gefilterten Zeilen zählen

Sub ZeilenGefiltert()Dim Bereich As RangeDim i As Integer

Sheets("Tabelle1").Activate Set Bereich = Range("A1").CurrentRegion

Abbildung 8.25: Die umgewandel-te Datei kann im Photo Editor auf-gerufen werden.

398

Page 399: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

i = Intersect(Bereich.SpecialCells(xlVisible), _ Bereich.Columns(1)).Count – 1 MsgBox "Sie haben " & i & " Zeilen gefiltert", _ vbInformation, "Filterergebnis"End Sub

Über die Eigenschaft CurrentRegion ermitteln Sie den umliegendenBereich, der von Leerzeilen bzw. Leerspalten umgeben wird. Es wird dem-nach der Block ermittelt, der sich, beginnend von der Zelle, in der der ersteFilter angezeigt wird (A1), bis zur letzten gefüllten Zeile ergibt. Mit derEigenschaft Intersect prüfen Sie, ob es im Bereich der Spalte A gefilterteZeilen gibt. Dazu verwenden Sie die Methode SpecialCells, der Sie dieKonstante xlVisible übergeben. Die Zählung der ermittelten Zeilenerfolgt durch die Eigenschaft Count, von der Sie den Wert 1 subtrahierenmüssen, da die Überschriftenzeile nicht zum Ergebnis der gefiltertenDaten gezählt werden soll. Abschließend geben Sie die Anzahl der gefilter-ten Zeilen in einem Meldungsfenster aus, welches Sie mit der Symbol-Infoausstatten. Dazu verwenden Sie die Konstante vbInformation.

F Wie können Sie die erste gefilterte Zeile ermitteln?

A Um diese Aufgabe zu lösen, setzen Sie das Makro aus Listing 8.23 ein:

Listing 8.23: Die erste gefilterte Zeile ermitteln

Sub ErsteGefilterteZeileFinden()Dim l As Long Sheets("Tabelle1").Activate Range("A1").Select For l = 2 To ActiveSheet.UsedRange.Rows.Count If ActiveSheet.Rows(l).Hidden <> True Then MsgBox "Die erste gefilterte Zeile ist die Zeile " _ & l, vbInformation: Exit For End If NextEnd Sub

Da die eigentlichen Daten erst in Zeile 2 beginnen, setzen Sie die For-Next-Schleife mit einem Startwert von 2 auf und durchlaufen alle Zeilenim benutzten Bereich. Innerhalb der Schleife prüfen Sie, ob die Eigen-schaft Hidden der jeweiligen Zeile den Wert False liefert. Wird dieser Wertzum ersten Mal zurückgegeben, wird die aktuelle Zeilennummer auf dem

399

Page 400: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Große Datenmengen in VBA behandeln und auswerten

Bildschirm ausgegeben. Danach wird die Schleife über die AnweisungExit For direkt verlassen.

F Wie können Sie alle Diagrammblätter aus Ihrer Arbeitsmappe entfernen?

A Um alle Diagrammblätter aus einer Arbeitsmappe zu entfernen, starten Siedas Makro aus Listing 8.24.

Listing 8.24: Alle Diagrammblätter aus Arbeitsmappe entfernen

Sub DiagrammeEntfernen() Application.DisplayAlerts = False On Error Resume Next ActiveWorkbook.Charts.Delete Application.DisplayAlerts = TrueEnd Sub

Indem Sie die Eigenschaft DisplayAlerts auf den Wert False setzen, brau-chen Sie die einzelnen Löschungen nicht zu bestätigen. Die On-Error-Anweisung sorgt dafür, dass die Verarbeitung sauber abgefangen wird,wenn überhaupt kein Diagrammblatt in der Arbeitsmappe enthalten ist.Die Eigenschaft Charts gibt eine Auflistung aller Diagrammblätter der akti-ven Arbeitsmappe zurück, die Sie mithilfe der Methode Delete löschen.

F Wie können Sie die Schriftart einer Legende anpassen?

A Sie haben Zugriff auf die Legende eines Diagramms, indem Sie auf dieEigenschaft Legend von ActiveChart zugreifen. Im folgenden Makro ausListing 8.25 formatieren Sie eine Legende mit der Schriftfarbe BLAU unddem Schriftschnitt FETT.

Listing 8.25: Die Legende formatieren

Sub LegendeFormatieren()Sheets("Deckungsbeiträge").Activate ActiveSheet.ChartObjects(1).Select ActiveChart.HasLegend = True With ActiveChart.Legend.Font .Bold = True .ColorIndex = 5 End WithEnd Sub

400

Page 401: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Quiz

Blenden Sie mithilfe der Eigenschaft HasLegend die Legende des Dia-gramms ein, indem Sie diese Eigenschaft auf den Wert True setzen. ImAnschluss daran wenden Sie die Eigenschaften Bold und ColorIndex aufdas Schriftobjekt Font der Legende an, um den Schriftschnitt sowie dieSchriftfarbe festzulegen.

8.5 Quiz

F Wie lautet die Anweisung, um den AutoFilter einzuschalten?

F Wie heißt die Methode, um den SpezialFilter aufzurufen?

F Wie lautet die Methode, um eine Pivot-Tabelle zu aktualisieren?

F Wie kann man den Diagrammtyp bestimmen?

F Welchen ChartType müssen Sie wählen, um ein Kreisdiagramm einzufügen?

F Über welche Eigenschaft stellen Sie den größten Wert einer Skalierung ein?

F Welche Konstante müssen Sie bei der Eigenschaft Location angeben, um ein ein-gebettetes Diagramm in ein separates Diagrammblatt zu transferieren?

F Welche zwei Argumente müssen beim Export eines Diagramms bei der MethodeExport angegeben werden?

8.6 Übungen

Zum Ende dieses Tages versuchen Sie bitte, folgende Aufgaben zu lösen:

1. Formatieren Sie die Pivot-Tabelle auf TABELLE1 mit einem AutoFormat.

2. Öffnen Sie die Demo-Arbeitsmappe Diagramme.xls und aktivieren die TabelleÜBUNG. Ihre Aufgabe besteht nun darin, anhand des Datenmaterials ein Zylin-derdiagramm zu erstellen.

Das Ergebnis dieser Aufgabenstellungen finden Sie im Anhang A.

401

Page 402: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;
Page 403: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

9

Funktionen einsetzen, um Excel zu automatisieren

Page 404: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

Am gestrigen Tag haben Sie gelernt, wie man große Datenmengen über den Ein-satz von Pivot-Tabellen sowie der Datenfilterung schnell und sicher auswertenkann. Des Weiteren haben Sie erfahren, wie Sie mit Makros Diagramme einfügenund gestalten können.

Die Themen heute:

� Eigene Funktionen stricken

� Modulare Funktionen programmieren

� Funktionen dauerhaft verfügbar machen

Standardmäßig bietet Ihnen Excel einige hundert Funktionen an, die Sie für Ihretägliche Arbeit nützen können. Dabei muss man zwischen den Funktionen unter-scheiden:

� Auf der einen Seite gibt es Funktionen, die Sie in einer Tabelle direkt in eineZelle eingeben. Die populärste dieser Funktionen ist die Funktion SUMME(),die einen angegebenen Zellenbereich summiert. Weitere Funktionen könnenüber den Funktions-Assistenten elegant in Ihre Tabellen eingefügt werden.

� Daneben gibt es spezielle VBA-Standardfunktionen, die Sie in Ihren Makroseinsetzen können, um bestimmte Aufgaben zu erledigen. Ein Beispiel für einesolche Funktion stellt die Funktion Len dar, über die Sie beispielsweise dieLänge eines Zelleninhaltes feststellen können. Diese und weitere Funktionenkönnen Sie in der Online-Hilfe auf der Registerkarte INHALT unter der RubrikFUNKTIONEN nachschlagen. In den meisten Fällen wird zu diesen Funktionenauch ein kleines Beispiel angeboten, welches Sie kopieren und in Ihre eigenenMakros mit einbauen können.

� Des Weiteren gibt es Funktionen, die Sie selbst schreiben, um sich Schreibar-beit zu sparen und Redundanz von Quellcode zu vermeiden. Ein Beispiel fürdiese Art von Funktionen wäre eine Funktion, die überprüft, ob einebestimmte Tabelle in einer Arbeitsmappe vorhanden ist. Da Sie so eine Auf-gabe in der Programmierung bestimmt sehr oft durchführen werden, empfiehltes sich, eine solche Aufgabe in eine allgemeine Funktion zu packen und diesedann aus den verschiedenen Makros aufzurufen. Der Vorteil liegt auf derHand: Wenn Sie die Funktion ändern möchten, dann müssen Sie dies nichtan vielen Stellen im Quellcode machen, sondern eben nur in dieser einenFunktion.

404

Page 405: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Eigene Tabellenfunktionen stricken

9.1 Eigene Tabellenfunktionen stricken

Sicher ist die Auswahl der standardmäßig angebotenen Tabellenfunktionen ganzbeträchtlich und in den meisten Fällen auch ausreichend. Trotzdem gibt es hierund da noch Bedarf, eigene Tabellenfunktionen zu erstellen, um spezielle Aufga-ben zu lösen. Die so erstellten neuen Tabellenfunktionen können Sie ebenso überden Funktionsassistenten unter der Rubrik BENUTZERDEFINIERT einfügen.

Sehen Sie nun anhand einiger typischer Beispiele aus der Praxis, wie Sie neueTabellenfunktionen erstellen und einsetzen können.

Alle Beispiele heute finden Sie auf der mitgelieferten CD-ROM in derArbeitsmappe Funktionen.xls im Verzeichnis Kap9.

Zellen mit blauer, dicker Schriftfarbe summieren

In der ersten Aufgabe haben Sie eine Tabelle mit Zahlenwerten vorliegen. IhreAufgabe besteht nun darin, aus dieser Tabelle alle die Zahlen zu summieren,deren Schriftfarbe BLAU und deren Schriftschnitt FETT ist. Sehen Sie sich dazueinmal die Ausgangssituation in Abbildung 9.2 an.

Abbildung 9.1: Benutzerdefinierte Funktionen

405

Page 406: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

Erfassen Sie nun die Funktion, die die blau und fett formatierten Zellen summiert.Sehen Sie sich dazu das Makro aus Listing 9.1 an.

Listing 9.1: Alle Zellen mit bestimmter Formatierung sollen summiert werden

Function BUF(zelle As Range)Application.Volatile For Each zelle In zelle.Cells If IsNumeric(zelle) Then If zelle.Font.Bold = True And _ zelle.Font.ColorIndex = 5 Then BUF = BUF + zelle.Value End If End If Next zelleEnd Function

Jede Funktion beginnt mit dem Schlüsselwort Function, gefolgt vom Namen derFunktion, der nahezu beliebig gewählt werden kann. Da Sie den Namen dieserFunktion später direkt in einer Tabellenzelle erfassen müssen, empfiehlt es sich,möglichst kurze Funktionsnamen zu verwenden. Der von mir gewählte Name BUFsteht dabei für »Blau und Fett«. Nach dem Namen folgen in Klammern die Argu-mente, die der Funktion übergeben werden sollen. Da dieses Argument in unse-rem Beispiel Zellen sein sollen, übergeben Sie der Funktion eine Objektvariablevom Typ Range. Der Aufruf der Funktion in einer beliebigen Zelle einer Tabellelautet danach beispielsweise =BUF(A1:A13).

Abbildung 9.2: Eine Tabelle mit unterschiedlich formatierten Zah-lenwerten

406

Page 407: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Eigene Tabellenfunktionen stricken

Mit der Anweisung Application.Volatile sorgen Sie dafür, dass der Wert derZelle neu berechnet wird, wenn ein neuer Wert in der Tabelle erfasst wird.

Die Aktualisierung erfolgt nicht automatisch, wenn Sie nur die Forma-tierung einer Zelle ändern.

In einer anschließenden Schleife arbeiten Sie alle Zellen nacheinander ab, die mitder Funktion übergeben wurden. Innerhalb dieser Schleife sollten Sie sicherstel-len, dass es sich wirklich um Zellen handelt, die Zahlenwerte enthalten. Wennnicht, dann meldet die VBA-Funktion IsNumeric den Wert False, was zur Folgehat, dass eine solche Zelle ignoriert wird.

Neben dieser Prüfung müssen Sie im Anschluss daran überprüfen, ob der Schrift-schnitt FETT ist. Diese Prüfung erreichen Sie, indem Sie die Eigenschaft Bold desFont-Objektes abfragen. Meldet diese Prüfung als Ergebnis den Wert True, dann istdie Zelle mit dem Schriftschnitt FETT formatiert. Damit noch nicht genug, esmuss schließlich auch die richtige Farbe, nämlich BLAU, vorliegen. Die Farbe derSchriftart können Sie über die Eigenschaft ColorIndex feststellen, welche für dieFarbe BLAU den Index 5 zurückmeldet. Nur wenn diese beiden Formatierungskri-terien zutreffen, erfolgt eine Summierung. Achten Sie dabei darauf, dass Sie diebereits ermittelten Werte nicht überschreiben. Für diesen Fall schreiben Sie dieAnweisung BUF = BUF + zelle.Value, was bedeutet, dass der bisherige Wert, dermomentan in BUF steht, um den Wert addiert wird, der in der aktuell überprüftenZelle steht.

Testen Sie nun die Funktion, indem Sie diese in eine beliebige Zelle der Tabelleeingeben, wie dies in Abbildung 9.3 durchgeführt wurde.

Übrigens können Sie die Funktion aus Listing 9.1 als Vorlage einsetzen,wenn es darum geht, anstatt der Summierung eine einfache Zählungdurchzuführen. In diesem Fall lautet die Funktion wie folgt:

Listing 9.2: Fett und blau formatierte Zellen zählen

Function BUFZ(zelle As Range)Application.Volatile For Each zelle In zelle.Cells If IsNumeric(zelle) Then If zelle.Font.Bold = True _ And zelle.Font.ColorIndex = 5 Then

407

Page 408: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

BUFZ = BUFZ + 1 End If End If Next zelleEnd Function

Aktuelle Arbeitsmappe ermitteln

Um zu prüfen, welchen Namen die momentan aktive Arbeitsmappe hat, könnenSie eine benutzerdefinierte Funktion schreiben, die den Namen der Arbeitsmappein eine Zelle schreibt. Die Funktion für diese Aufgabe können Sie in Listing 9.3sehen:

Listing 9.3: Den Namen der aktiven Arbeitsmappe in einer Zelle zurückgeben

Function AktMap() AktMap = ActiveWorkbook.NameEnd Function

Über die Anweisung ActiveWorkbook.Name können Sie den Namen der Arbeits-mappe ermitteln. Wenn Sie zusätzlich zum Namen auch noch den Speicherpfadermitteln möchten, dann erweitern Sie die Funktion aus Listing 9.3 wie folgt:

Abbildung 9.3: Die Funktion lie-fert das richtige Ergebnis.

408

Page 409: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Eigene Tabellenfunktionen stricken

Listing 9.4: Den kompletten Speicherpfad sowie den Namen der aktiven Arbeitsmappe zurückgeben

Function AktMapV() AktMapV = ActiveWorkbook.FullNameEnd Function

Über die Eigenschaft FullName können Sie den Namen sowie den Pfad einergespeicherten Arbeitsmappe ermitteln. Allerdings muss diese Arbeitsmappe vorhereinmal gespeichert worden sein.

Formelcheck durchführen

In der nächsten Aufgabe soll mit einer Funktion geprüft werden, ob einebestimmte Zelle eine Formel enthält oder nicht. Dazu fügen Sie folgende Funk-tion ein. Die Funktion aus Listing 9.5 prüft, ob eine Zelle eine Formel bzw. Ver-knüpfung enthält:

Listing 9.5: Zellen auf Formelinhalt überprüfen

Function FormelZ(zelle)Application.Volatile FormelZ = False If Left(zelle.Formula, 1) = "=" Then FormelZ = TrueEnd Function

Eine Formel bzw. eine Verknüpfung oder auch eine Funktion erkennen Sie inExcel daran, dass diese mit einem Gleichheitszeichen beginnt. Genau dieses Ver-halten prüfen Sie, indem Sie in der Zielzelle das erste Zeichen auswerten. SetzenSie zu diesem Zweck die Funktion Left ein und extrahieren Sie das erste Zeichender angegebenen Zelle, indem Sie als zweites Argument für diese Funktion dieZahl 1 einsetzen. Entspricht das erste Zeichen einem Gleichheitszeichen, danngeben Sie als Rückgabewert True zurück.

Abbildung 9.4: Beide Funktionen im Einsatz

409

Page 410: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

Testen Sie die Funktion, indem Sie in einer Tabelle ab Zelle B2 bis Zelle B4 einpaar Zahlenwerte eintragen und summieren danach diese Zellen in Zelle B5.Geben Sie dann die Funktion =FormelZ(B2) in Zelle C2 ein und kopieren Siediese Funktion mit einem Doppelklick auf das Ausfüllkästchen nach unten.

Diese Funktion berücksichtigt auch Zellen, welche Texte enthalten.Nachdem Sie zu Beginn der Funktion den Rückgabewert auf Falsegesetzt haben, gibt es diesbezüglich keine Probleme.

Zelleninformationen abfragen

In der nächsten Aufgabe werden Sie eine Zelle mithilfe einer Funktion überprüfen.Je nach Funktionsaufruf sollen dabei folgende Informationen ermittelt werden:

� die Zellenadresse

� der Zellenwert

� die Zellenformel

Alle diese Informationen können Sie über die folgende Funktion aus Listing 9.6abfragen:

Listing 9.6: Zelle abfragen über eine Funktion

Function INFOZ(zelle As Range, i As Integer)Select Case i Case 1 INFOZ = zelle.Address Case 2

Abbildung 9.5: Die Zelle B5 ent-hält eine Formel.

410

Page 411: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Eigene Tabellenfunktionen stricken

INFOZ = zelle.Value Case 3 INFOZ = zelle.FormulaLocalCase Else INFOZ = "nicht vergeben"End SelectEnd Function

Bei der Funktion aus Listing 9.6 können Sie sowohl die Zellenadresse, den Zellen-wert sowie die Zellenformel abfragen. Um beispielsweise die Zellenadresse abzu-fragen, rufen Sie die Funktion in Ihrer Tabelle wie folgt auf: =INFOZ(B7;1).

Innerhalb dieser Funktion werten Sie genau dieses zweite Argument aus. Um dieZellenadresse zurückzugeben, setzen Sie die Eigenschaft Address ein. Den Werteiner Zelle bekommen Sie über die Eigenschaft Value und die Formel der Zelleerhalten Sie über die Eigenschaft FormulaLocal.

Dokumenteigenschaften per Funktion abfragen

Das folgende Beispiel ähnelt dem gerade besprochenen. Auch in diesem Beispielstricken Sie eine Funktion, die mithilfe eines flexiblen Arguments unterschiedli-che Ergebnisse bringt. So sollen unter anderem folgende Dokumenteigenschaftenüber eine Tabellenfunktion abgefragt werden:

� Dateiname und Pfad

� nur Dateiname

� nur Pfad der Datei

� Dateityp

Abbildung 9.6: Unterschiedliche Ergebnisse je nach Funktionsaufruf

411

Page 412: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

� Dateigröße

� Erstellungsdatum der Datei

� letzte Änderung an der Datei

� letzter Zugriff auf die Datei

Fassen Sie diese Informationen nun in einer Funktion zusammen, welche Sie inListing 9.7 sehen können:

Listing 9.7: Dokumenteigenschaften über eine Funktion abfragen

Function DokuEig(EigenschaftsNr As Integer)Dim fso As ObjectDim tmp As String

On Error Resume NextSet fso = CreateObject("Scripting.FileSystemObject")

With fso.GetFile(ActiveWorkbook.FullName)

Select Case EigenschaftsNr Case Is = 1: tmp = .Path Case Is = 2: tmp = Mid(.Path, 1, _ Len(.Path) - Len(.Name)) Case Is = 3: tmp = .Name Case Is = 4: tmp = .Type Case Is = 5: tmp = .Size Case Is = 6: tmp = .DateCreated Case Is = 7: tmp = .DateLastModified Case Is = 8: tmp = .DateLastAccessed Case Else tmp = "Ungültige EigenschaftsNr!"End SelectEnd WithDokuEig = tmpEnd Function

Erstellen Sie im ersten Schritt einen Verweis auf das FileSystemObject, um damitdie Informationen bezüglich der Arbeitsmappe zu erlangen. Über die MethodeGetFile teilen Sie Excel mit, welche Datei Sie diesbezüglich auswerten möchten.Danach werten Sie die übergebene Eigenschaftennummer in einer Select-Case-Anweisung aus:

412

Page 413: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Eigene Tabellenfunktionen stricken

� Mithilfe der Eigenschaft Path ermitteln Sie den Namen sowie den komplettenSpeicherpfad der aktiven Arbeitsmappe.

� Das Verzeichnis ermitteln Sie, indem Sie über die Funktion Mid einen Teilaus der kompletten Pfadangabe herausschnippeln. Dabei subtrahieren Sie dieLänge des Gesamttextes von der Anzahl der Zeichen des Dateinamens, den Sieüber die Eigenschaft Name ermitteln.

� Den Namen der Datei ermitteln Sie direkt über die Eigenschaft Name.

� Die Eigenschaft Type meldet Ihnen den Typ der Datei, d.h. Sie können dieseFunktion auch anhand von Word-Dokumenten, Access-Datenbanken undweiteren Dateitypen anwenden.

� Die Eigenschaft Size gibt die Größe der Datei in Bytes an.

� Mithilfe der Eigenschaft DateCreated können Sie das Erstellungsdatum einerDatei ermitteln.

� Über die Eigenschaft DateLastModified gelangen Sie an das Datum inklusiveder Uhrzeit der letzten Änderung der Datei.

� Mit der Eigenschaft DateLastAccessed können Sie das letzte Zugangsdatumder Datei ermitteln, d.h. wann die Datei das letzte Mal geöffnet wurde.

Buchstaben aus Zellen eliminieren

Bei der nächsten Aufgabe sollen aus einer Zelle, die sowohl Buchstaben als auchZahlen enthält, alle Buchstaben rausgeworfen werden. Diese Aufgabe lösen Siemit der Funktion aus Listing 9.8:

Abbildung 9.7: Die Funktion DokuEig mit unterschiedlichen Argumenten und Ergebnissen

413

Page 414: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

Listing 9.8: Alle Buchstaben sollen aus einer Zelle entfernt werden

Function BuchstRaus(Zelle) As IntegerDim i As Integer

Application.Volatile For i = 1 To Len(Zelle) Select Case Asc(Mid(Zelle, i, 1)) Case 0 To 64, 123 To 197 BuchstRaus = BuchstRaus & Mid(Zelle, i, 1) End Select Next iEnd Function

Ermitteln Sie im ersten Schritt die Länge der Zelle und setzen Sie dafür die Funk-tion Len ein. Danach prüfen Sie mithilfe der Funktion Asc das jeweils aktuelle Zei-chen der Zelle, indem Sie dieses in einen Integer-Wert umwandeln. Mit derFunktion Mid extrahieren Sie jeweils das nächste Zeichen aus der Zelle. Dabei ent-sprechen die Werte 65 bis 90 Kleinbuchstaben, die Werte 97 bis 122 den Groß-buchstaben und die restlichen Werte den Sonderzeichen. Diese Wertbereichegrenzen Sie innerhalb der Select-Case-Anweisung aus. Wird ein Zeichen in derZelle gefunden, welches numerisch ist bzw. einem Sonderzeichen entspricht, wirdes gesammelt und bereits ermittelten Zahlen mit angehängt.

Das erste Auftreten einer Zahl ermitteln

Die nächste Funktion ist der Funktion aus Listing 9.8 ähnlich. Bei der nächstenAufgabe soll die Position des ersten Auftretens einer Zahl in einer Zelle ermitteltund ausgegeben werden.

Abbildung 9.8: Aus »gemischten« Zellen Zahlen her-stellen

414

Page 415: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Eigene Tabellenfunktionen stricken

Sehen Sie sich zu diesem Zweck die Funktion aus Listing 9.9 an:

Listing 9.9: Die Position des ersten numerischen Zeichens ermitteln

Function PosErsteZahl(Zelle) As IntegerDim i As Integer

Application.Volatile For i = 1 To Len(Zelle) Select Case Asc(Mid(Zelle, i, 1)) Case 0 To 64, 123 To 197 PosErsteZahl = i Exit Function End Select Next i PosErsteZahl = 0End Function

Ermitteln Sie im ersten Schritt die Länge der Zelle und setzen Sie dafür die Funk-tion Len ein. Danach prüfen Sie mithilfe de Funktion Asc das jeweils aktuelle Zei-chen der Zelle, indem Sie dieses in einen Integer-Wert umwandeln. Mit derFunktion Mid extrahieren Sie jeweils das nächste Zeichen aus der Zelle. Dabei ent-sprechen die Werte 65 bis 90 Kleinbuchstaben, die Werte 97 bis 122 den Groß-buchstaben sowie die restlichen Werte den Sonderzeichen. Diese Wertbereichegrenzen Sie innerhalb der Select-Case-Anweisung aus. Wird das erste Zeichen inder Zelle gefunden, welches numerisch ist, dann springen Sie mit der AnweisungExit Function aus der Funktion. In der Variablen steht dann automatisch die rich-tige Position des Zeichens. Wurde kein numerisches Zeichen gefunden, dannmeldet die Funktion den Wert 0 zurück.

Abbildung 9.9: Aus »gemischten« Zellen die Position der ersten Zahl ermitteln

415

Page 416: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

9.2 Modulare Funktionen programmieren

Nachdem Sie gelernt haben, wie Sie benutzerdefinierte Tabellenfunktionen pro-grammieren können, kommen wir nun zu den modularen Funktionen. Untereiner modularen Funktion fassen Sie Arbeitsschritte zusammen, die Sie immerwieder in gleicher oder ähnlicher Form in Ihrem Quellcode durchführen. Anstattdiese Arbeitsschritte in Form von Anweisungen immer wieder neu zu erfassen,schreiben Sie einmal eine Funktion und rufen diese immer wieder an verschiede-nen Stellen im Quellcode auf. Dies macht den Quellcode einfacher lesbar undÄnderungen am Quellcode können so auch leichter durchgeführt werden.

Lernen Sie in den folgenden Beispielen, wie Sie diese modularen Funktionen effi-zient bei Ihrer Arbeit einsetzen können.

Arbeitsmappen-Existenz prüfen

Bevor Sie eine bestimmte Arbeitmappe über ein Makro öffnen, sollten Sie sicher-stellen, ob diese Arbeitsmappe überhaupt existiert. Damit vermeiden Sie hässlicheMakroabstürze, weil Sie dadurch die Möglichkeit haben, diesen Fehlerfall abzu-fangen. Erfassen Sie jetzt eine Funktion und übergeben dieser Funktion denDateinamen mitsamt der Laufwerks- und Pfadangabe. Als Ergebnis dieser Funk-tion sollten Sie dann eine Rückmeldung bekommen, ob die angegebene Dateiauch vorhanden ist.

Listing 9.10: Prüfung auf Dateiexistenz

Function DateiExist(s As String) As Boolean DateiExist = False If Len(s) > 0 Then DateiExist = _ (Dir(s) <> "") Exit FunctionEnd Function

Wie schon erwähnt, erwartet die Funktion den Namen der Datei, deren Existenzsie prüfen soll. Die Prüfung, ob überhaupt eine Zeichenfolge an die Funktionübergeben wurde, erfolgt über die Funktion Len. Wird eine Länge von 0 gemeldet,wurde keine Zeichenfolge an die Funktion übergeben. Ansonsten entspricht diesein jedem Fall einer Größe > 0. Die Funktion Dir versucht nun auf die Datei zuzu-greifen. Ist die Datei nicht vorhanden, meldet die Funktion eine Leerfolge zurück.

416

Page 417: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Modulare Funktionen programmieren

Damit wird der Datentyp Boolean mit dem Wert False an das aufrufende Makrozurückgemeldet. Im anderen Falle liefert die Funktion den Wert True zurück.

Erfassen Sie jetzt das Makro, welches die Funktion DateiExist aufruft und denNamen der zu überprüfenden Datei übergibt.

Listing 9.11: Vor dem Öffnen einer Datei deren Existenz prüfen

Sub DateiÖffnen()Dim b As BooleanConst EDatei = "C:\Eigene Dateien\Mappe1.xls"

b = DateiExist(EDatei)If b = True ThenWorkbooks.Open EdateiElseMsgBox "Die Datei " & EDatei & " ist nicht vorhanden!"End IfEnd Sub

Im Makro aus Listing 9.11 wird der Name der zu öffnenden Datei in einer Kon-stanten zu Beginn des Makros festgelegt. Danach rufen Sie die Funktion DateiExist auf und übergeben dieser Funktion den Namen der zu prüfenden Datei,den Sie gerade in der Konstante angegeben haben. Das Ergebnis dieser Überprü-fung durch die Funktion wird in der Variablen b abgelegt. Diese kann entwederFalse für den Fall, dass die Datei gar nicht existiert, bzw. True sein, sofern die Prü-fung erfolgreich verlaufen ist. In diesem Fall öffnen Sie die Datei mithilfe derMethode Open.

Arbeitsmappen-Zustand prüfen

Manche Fehler treten auf, wenn versucht wird, über VBA Arbeitsmappen zu öff-nen, die bereits in geöffnetem Zustand sind. Gerade wenn Sie in einem größerenProjekt Dateien immer wieder öffnen und schließen, kann es durchaus vorkom-men, dass eine Arbeitsmappe bereits geöffnet ist.

In der nächsten Funktion soll überprüft werden, ob eine bestimmte Arbeitsmappebereits geöffnet wurde. Wenn ja, dann muss diese nicht noch einmal geöffnet, son-dern nur aktiviert werden. Die Funktion zur Lösung dieser Aufgabenstellung kön-nen Sie in Listing 9.12 sehen.

417

Page 418: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

Listing 9.12: Prüfung, ob Datei bereits geöffnet ist

Function DateiGeöffnet(ByVal s As String) As BooleanDim DatSchonGeöffnet As Boolean

On Error GoTo fehler DatSchonGeöffnet = True Windows(s).Activate Exit Function

fehler: DatSchonGeöffnet = False End Function

Die Funktion aus Listing 9.12 erwartet als Argument den Namen der Datei, derenStatus geprüft werden soll. Danach wird versucht, die entsprechende Datei zu akti-vieren. Schlägt dies fehl, sorgt die On-Error-Anweisung dafür, dass die Funktionnicht mit einer Fehlermeldung abbricht. In diesem Fall wird direkt zum Fehlerab-schnitt fehler gesprungen. Dort wird der Variablen DatSchonGeöffnet der WertFalse zugewiesen. War die Aktion erfolgreich, wird die Funktion über die Anwei-sung Exit Function direkt verlassen. Nachdem Sie schon zu Beginn der Funktionder Variablen DatSchonGeöffnet den Wert True zugewiesen haben, können Siedirekt aus der Funktion springen. Das aufrufende Makro sieht wie folgt aus:

Listing 9.13: Aktivieren oder Öffnen der Arbeitsmappe

Sub ÖffnenOderAktivieren()Dim b As BooleanConst EDatei = "C:\Eigene Dateien\Mappe1.xls"

b = DateiGeöffnet(EDatei) If b = True Then Else Workbooks.Open Edatei End IfEnd Sub

418

Page 419: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Modulare Funktionen programmieren

Eine mächtige Löschfunktion erstellen

In der letzten Funktion packen wir eine gewaltige Menge an einzelnen Funk-tionen hinein. Über eine Funktion soll Folgendes möglich sein:

� alle Inhalte entfernen

� alle Formatierungen entfernen

� alle Kommentare entfernen

� Formeln durch Festwerte ersetzen

� Hyperlinks löschen

Erfassen Sie jetzt die Funktion, die Sie in Listing 9.14 sehen können:

Listing 9.14: Durch unterschiedliche Löschnummern werden Löschaktionen gestartet

Function LöschenWas(Nr As Integer)Dim zelle As Range

Select Case Nr Case 1 Cells.Clear Case 2 Cells.ClearFormats Case 3 Cells.ClearComments Case 4 For Each zelle In ActiveSheet.UsedRange zelle.Value = zelle.Value Next zelle Case 5 For Each zelle In ActiveSheet.UsedRange With zelle If .Hyperlinks.Count > 0 Then .Hyperlinks.Delete With .Font .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With

419

Page 420: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

End If End With Next zelle Case Else MsgBox "Diese Nr ist nicht vergeben!"End SelectEnd Function

� Wird die Funktion LöschenWas mit dem Argument 1 aufgerufen, wenden Siedie Methode Clear an, um alle Zellen der Tabelle zu löschen. Im Auflistungs-objekt Cells sind alle Zellen der Tabelle enthalten.

� Wird die Funktion LöschenWas mit dem Argument 2 aufgerufen, wenden Siedie Methode ClearFormats an, um alle Formatierungen in der Tabelle zu ent-fernen. Dazu zählen Formatierungen der Schrift, der Hintergrundfarbe derAusrichtung der Daten und alle möglichen Rahmen und sonstigen Formatie-rungsmöglichkeiten.

� Wird die Funktion LöschenWas mit dem Argument 3 aufgerufen, wenden Siedie Methode ClearComments an, um alle in der Tabelle befindlichen Kommen-tare zu entfernen.

� Wird die Funktion LöschenWas mit dem Argument 4 aufgerufen, sollen alleFormeln und Verknüpfungen in Festwerte umgewandelt werden. In diesemFall ist es nicht sinnvoll, alle Zellen der Tabelle über das AuflistungsobjektCells abzuarbeiten. Schränken Sie die Bearbeitung auf die Zellen ein, die inder Tabelle verwendet werden. Dazu setzen Sie die Eigenschaft UsedRange ein,die Sie auf die aktive Tabelle (ActiveSheet) anwenden. Innerhalb dieses ver-wendeten Bereiches durchlaufen Sie jede Zelle und ersetzen eventuell vorhan-dene Formeln bzw. Verknüpfungen, indem Sie der jeweiligen Zelle den Wertder Eigenschaft Value zuweisen.

� Wird die Funktion LöschenWas mit dem Argument 5 aufgerufen, sollen alleHyperlinks in der Tabelle entfernt werden. Die Hyperlinktexte sollen abererhalten bleiben. Auch für diesen Zweck brauchen Sie nicht alle Zellen derTabellen einzeln über das Auflistungsobjekt Cells anzusprechen. Stattdessenermitteln Sie über die Anweisung ActiveSheet.UsedRange den verwendetenBereich der Tabelle und durchlaufen danach in einer Schleife jede Zelle die-ses Bereiches. Innerhalb der Schleife prüfen Sie mithilfe der EigenschaftCount, ob die jeweilige Zelle einen Hyperlink enthält. Wenn ja, dann meldetdiese Eigenschaft den Wert 1 zurück. In diesem Fall wenden Sie die MethodeDelete an, um den Hyperlink aus der Zelle zu entfernen. Da aber auch nach

420

Page 421: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Modulare Funktionen programmieren

dem Entfernen des Hyperlinks die typische Hyperlinkformatierung (blaueSchriftfarbe und Unterstreichung) erhalten bleibt, müssen Sie diese jetzt ent-fernen. Weisen Sie hierzu der Eigenschaft UnderLine die Konstante xlUnder-lineStyleNone zu, um die Unterstreichung zu entfernen. Der EigenschaftColorIndex weisen Sie die Konstante xlAutomatic zu, um die Festlegung derSchriftfarbe Excel zu überlassen.

Rufen Sie jetzt beispielsweise die Funktion LöschenWas auf und übergeben derFunktion die Lösch-Nr 5, um alle Hyperlinks aus der aktiven Tabelle zu entfernen.

Listing 9.15: Über die Löschnummer die Löschaktion festlegen

Sub Löschen()Dim s As String

Sheets("Tabelle8").Activate s = InputBox _ ("Geben Sie eine Lösch-Nr zwischen 1 und 5 ein!", _ "Löschaktion durchführen", 1)

If s <> "" Then LöschenWas (s) Else End IfEnd Sub

Über eine Eingabemaske legen Sie fest, welche Löschaktion durchgeführt werdensoll. Die Funktion Inputbox verwendet in diesem Beispiel drei Argumente. Im ers-ten Argument geben Sie an, welcher Text in der Eingabemaske angezeigt werdensoll. Im zweiten Argument geben Sie den Fenstertitel der Eingabemaske bekannt.Im dritten Argument haben Sie die Möglichkeit, eine Eingabe bereits schon beimAufruf der Maske vorzunehmen. In diesem Fall wurde die Lösch-Nr. 1, also dasEntfernen aller Daten aus einer Tabelle, eingetragen.

421

Page 422: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

9.3 Funktionen dauerhaft verfügbar machen

Bei den bisherigen Beispielen sind die Funktionen lediglich in der Arbeitsmappeverfügbar, in der sie in der Entwicklungsumgebung erfasst wurden. Wenn SieFunktionen für alle Arbeitsmappen, ob neue oder alte, anwenden möchten, habenSie zwei Möglichkeiten:

� Speichern in der persönlichen Arbeitsmappe Personl.xls oder

� Erstellung eines Add-Ins und Aktivierung über den Add-In-Manager

Speichern der Funktionen in der persönlichen Makroarbeitsmappe

Um die Funktionen für alle Arbeitsmappen zur Verfügung zu haben, können Siedie Funktionen in Ihrer persönlichen Makroarbeitsmappe Personl.xls ablegen, wel-che sich im Office-Verzeichnis XLSTART befindet. Sollte diese Arbeitsmappe nochnicht existieren, legen Sie eine an, indem Sie wie folgt vorgehen:

1. Wählen Sie in der Tabellenansicht den Menübefehl EXTRAS/MAKRO/AUF-ZEICHNEN.

2. Wählen Sie im Dialogfeld MAKRO AUFZEICHNEN aus dem Kombinationsfeldden Eintrag PERSÖNLICHE MAKROARBEITSMAPPE.

3. Klicken Sie auf OK.

Abbildung 9.10: In diesem Beispiel werden die Hyper-links aus der Tabelle entfernt.

422

Page 423: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen dauerhaft verfügbar machen

4. Klicken Sie jetzt beispielsweise auf die Zelle A1. Der Makrorekorder wird diepersönliche Arbeitsmappe nun erstellen und diesen Befehl aufzeichnen. Nunhaben Sie die Voraussetzung geschaffen, um Ihre Funktionen in die persönli-che Arbeitsmappe zu übertragen.

5. Beenden Sie die Makroaufzeichnung, indem Sie aus dem Menü EXTRAS denBefehl MAKRO/AUFZEICHNUNG BEENDEN auswählen.

Übertragen Sie nun Ihre Funktionen aus der Arbeitsmappe Funktionen.xls in die per-sönliche Arbeitsmappe Personl.xls. Dazu ist folgende Vorgehensweise notwendig:

1. Öffnen Sie die Arbeitsmappe Funktionen.xls.

2. Wechseln Sie in die Entwicklungsumgebung.

3. Aktivieren Sie das MODUL1.

4. Markieren Sie alle Funktionen mit dem Menübefehl BEARBEITEN/ALLES AUS-WÄHLEN.

5. Drücken Sie die Tastenkombination (Strg) + (C), um die Funktionen in dieZwischenablage zu kopieren.

6. Wählen Sie im Projekt-Explorer den Eintrag VBAPROJECT (PERSONL.XLS) aus.

7. Aktivieren Sie in diesem Projekt das MODUL1.

8. Fügen Sie Ihre Funktionen ein, indem Sie den Mauszeiger im Codefensterpositionieren und die Tastenkombination (Strg) + (V) drücken.

9. Beenden Sie Excel und bestätigen Sie beim Verlassen von Excel die Ände-rungsabfrage mit JA.

Abbildung 9.11: Die persönliche Makroarbeitsmappe anlegen

423

Page 424: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

Nun können Sie die benutzerdefinierten Tabellenfunktionen über den Funktions-Assistenten in Ihre Tabellen einfügen.

Speichern der Funktionen in einem Add-In

Die zweite Möglichkeit, um Funktionen allgemein verfügbar zu machen undauch noch an andere Anwender weiterzugeben, ist die Erstellung eines Add-Ins.Ein Add-In können Sie direkt aus der Datei Funktionen.xls erstellen und beiBedarf im Add-In-Manager einbinden und, wenn Sie Ihre Funktionen zeitweisenicht benötigen, wieder deaktivieren.

Bevor Sie das Add-In erstellen, sollten Sie die Dokumenteigenschaften der DateiFunktionen.xls pflegen. Diese Informationen sind später wichtig, um Zusatzinfor-mationen zum Add-In zu hinterlegen.

Geben Sie jetzt die Dokumenteigenschaften an, indem Sie die Datei Funk-tionen.xls öffnen und aus dem Menü DATEI den Befehl EIGENSCHAFTEN wählen.

Abbildung 9.12: Die Dokumenteigenschaften erfassen

424

Page 425: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen dauerhaft verfügbar machen

Geben Sie einige zusätzliche Informationen zu dem zukünftigen Add-In an undbestätigen Sie Ihre Eingaben mit OK.

Befolgen Sie jetzt die nachfolgenden Anweisungen:

1. Wählen Sie aus dem Menü DATEI den Befehl SPEICHERN UNTER.

2. Stellen Sie im Kombinationsfeld DATEITYP den Eintrag MICROSOFT EXEL-ADD-IN ein. Nun wird automatisch das Add-In-Verzeichnis von Excel ein-gestellt.

3. Klicken Sie auf die Schaltfläche SPEICHERN.

Das Add-In FUNKTIONEN.XLS wurde nun erstellt. Binden Sie das Add-In jetzt ein,indem Sie die nächsten Arbeitsschritte befolgen:

1. Wählen Sie aus dem Menü EXTRAS den Befehl ADD-INS.

2. Aktivieren Sie das Add-In NÜTZLICHE FUNKTIONEN. Diese Information habenSie vorher bei den Dokumenteigenschaften unter der Rubrik TITEL erfasst.

3. Bestätigen Sie Ihre Aktion durch OK.

Erfahren Sie mehr zum Thema Add-In in Kapitel 12 dieses Buches.

Abbildung 9.13: Add-Ins einbinden

425

Page 426: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

9.4 Fragen & Antworten

F Wie können Sie über eine benutzerdefinierte Tabellenfunktion den Namen desaktuellen Anwenders in einer Zelle ausgeben?

A Erfassen Sie zu diesem Zweck die Funktion aus Listing 9.16:

Listing 9.16: Den Namen des Anwenders in einer Zelle ausgeben

Function Anwender() Application.Volatile Anwender = Application.UserNameEnd Function

Die Eigenschaft UserName gibt den Namen des aktuellen Benutzers zurück.Rufen Sie die Funktion in einer beliebigen Zelle der Tabelle wie folgt auf:=Anwender()

F Wie können Sie über eine benutzerdefinierte Tabellenfunktion die Anzahl derZiffern einer Zelle zählen?

A Diese Aufgabe lösen Sie, indem Sie die Funktion aus Listing 9.17 anwen-den:

Listing 9.17: Die Anzahl der Ziffern einer Zelle zählen

Function AnzZahlen (zelle) As IntegerDim i As Integer

Application.VolatileFor i = 1 To Len(zelle)If Mid(zelle, i, 1) Like "#" ThenAnzZahlen = AnzZahlen + 1End IfNext iEnd Function

Ermitteln Sie zuerst einmal die Gesamtlänge der Zelle über die FunktionLen. Danach durchlaufen Sie eine Schleife und arbeiten mithilfe derFunktion Mid ein Zeichen nach dem anderen ab. Setzen Sie den OperatorLike mit dem Zusatz # ein, um zu ermitteln, ob es sich bei dem Zeichenum einen Zahlenwert handelt. In diesem Fall meldet Ihnen dieser Opera-

426

Page 427: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Quiz

tor einen Wert zwischen 0 und 9 zurück. Addieren Sie dann den Wert 1 inIhrer Funktion.

Rufen Sie die Funktion in einer beliebigen Zelle der Tabelle wie folgt auf:=AnzZahlen(A1)

F Wie können Sie über eine Funktion prüfen, ob ein Add-In bereits im Add-In-Manager eingebunden ist?

A Um diese Aufgabe zu lösen, geben Sie folgende Funktion aus Listing 9.18ein:

Listing 9.18: Ist das Add-In »Nützliche Funktionen« bereits eingebunden?

Sub AddInPrüfung()Dim b As Boolean

b = AddInAktiv("Nützliche Funktionen")If b = True ThenMsgBox "Add-In ist aktiv!"ElseMsgBox "Das Add-In ist noch nicht aktiviert!"End IfEnd Sub

Bei der Angabe des Add-Ins verwenden Sie den Namen des Add-Ins, denSie im Dialogfeld ADD-INS vorfinden.

9.5 Quiz

F Wie muss die Anweisung lauten, damit eine benutzerdefinierte Funktion auchauf Änderungen in der Tabelle reagieren kann?

F Wie muss die benutzerdefinierte Funktion lauten, wenn alle Zellen addiert wer-den sollen, die mit der Hintergrundfarbe Rot formatiert sind?

F Über welche Methode können Sie den Inhalt einer Zelle komplett löschen?

F Wie heißt die persönliche Makroarbeitsmappe und wo befindet sich diese?

427

Page 428: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Funktionen einsetzen, um Excel zu automatisieren

9.6 Übung

Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Funktionen.xlsund schreiben eine modulare Funktion, die vor der Aktivierung einer Tabelleüberprüft, ob diese in der Arbeitsmappe überhaupt vorhanden ist.

Die Lösung dieser Aufgabe können Sie im Anhang A nachlesen.

428

Page 429: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

10

Excel und das Internet

Page 430: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

Am gestrigen Tag haben Sie gelernt, wie Sie Excel durch zusätzliche Tabellen-funktionen bereichern können. Dazu haben Sie einige benutzerdefinierte Funk-tionen programmiert und getestet. Des Weiteren haben Sie modulare Funktionenerstellt und durch Makros aufrufen lassen.

Die Themen heute:

� Arbeiten mit Hyperlinks

� E-Mails verschicken

� Kontakte mit Outlook austauschen

Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM inder Arbeitsmappe Internet.xls im Verzeichnis Kap10.

10.1 Arbeiten mit Hyperlinks

Hyperlinks kennen Sie schon aus dem Internet. Damit können Sie einzelne Inter-netseiten über Sprungmarken miteinander verbinden, um somit schnell von Seitezu Seite zu gelangen. Auch in Excel-Tabellen können Sie mit Hyperlinks arbeiten,um beispielsweise einzelne Tabellen sinnvoll miteinander zu verknüpfen. Hyper-links werden standardmäßig in blauer Schriftfarbe und mit einer einfachen Unter-streichung formatiert. Daran können Sie Hyperlinks auch in einer Excel-Tabelleerkennen. Zellen, die einen Hyperlink enthalten, sind »Klick-sensibel«, d.h. wennSie mit der linken Maustaste auf eine solche Zelle klicken, werden Sie zum Zieldes Hyperlinks weitergeleitet. Excel erkennt über seine AutoKorrektur-Optionautomatisch schon bei der Eingabe, ob es die Eingabe in einen Hyperlink umwan-deln soll. So werden URLs von Internetseiten, E-Mail-Adressen und Netzwerkver-bindungen automatisch mit der Hyperlinkfunktion und deren typischenFormatierung ausgestattet.

Lernen Sie im Anschluss an diese Einführung ein paar typische Aufgaben aus derPraxis kennen.

430

Page 431: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Hyperlinks

Hyperlinks aus einer Tabelle entfernen

In der ersten Praxisaufgabe haben Sie eine Tabelle vorliegen, die einige Hyper-links enthält. Ihre Aufgabe besteht nun darin, diese Hyperlinks zu entfernen. DieHyperlinktexte sollen aber erhalten bleiben. Sehen Sie sich zuerst einmal dieAbbildung 10.1 an.

Erfassen Sie jetzt das folgende Makro, um die Hyperlinks aus der Tabelle zu ent-fernen:

Listing 10.1: Hyperlinks entfernen

Sub HyperlinksEntfernen()Dim zelle As RangeDim Bereich As Range

Sheets("Tabelle1").ActivateSet Bereich = ActiveSheet.UsedRange

For Each zelle In Bereich With zelle If .Hyperlinks.Count > 0 Then .Hyperlinks.Delete With .Font .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With End If

Abbildung 10.1: Eine Tabelle mit Hyperlinks

431

Page 432: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

End WithNext zelleEnd Sub

Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Range. Danachgeben Sie über die Anweisung Set bekannt, in welchem Bereich der Tabelle dieEntfernung von Hyperlinks durchgeführt werden soll. Mithilfe der AnweisungActiveSheet.UsedRange bestimmen Sie, dass alle Zellen im verwendeten Bereichder Tabelle verarbeitet werden sollen. In einer anschließenden Schleife werdengenau diese benutzten Zellen abgearbeitet. Innerhalb der Schleife überprüfen Siejede einzelne Zelle. Enthält eine Zelle einen Hyperlink, dann können Sie diesüber die Anweisung Hyperlinks.Count feststellen. Meldet die Eigenschaft Counteinen Wert > 0, dann enthält die Zelle einen Hyperlink. In diesem Fall löschenSie den Hyperlink mithilfe der Methode Delete. Da die Formatierung der Zellenaber auch noch nach der Entfernung der Hyperlinks beibehalten wird, müssen Siedie Unterstreichung sowie die blaue Schriftfarbe noch entfernen. Dazu greifen Sieauf das Objekt Font zu. Mithilfe der Eigenschaft Underline, welcher Sie die Kon-stante xlUnderlineStyleNone zuweisen, entfernen Sie die Unterstreichung. Überdie Eigenschaft ColorIndex setzen Sie die Farbe der Schriftart auf den »normalen«Ausgangszustand zurück, indem Sie dieser Eigenschaft die Konstante xlAutomaticzuweisen.

Hyperlinks aus Zelleninhalten herstellen

Gerade haben Sie gelernt, wie Sie Hyperlinks aus Tabellen entfernen. Aber auchder umgekehrte Vorgang ist von Interesse. Bilden Sie daher in der folgenden Auf-gabe aus den Zelleninhalten der Zellen A1:A11 (Abbildung 10.2) Hyperlinks.

Abbildung 10.2: Die Hyperlinks wurden aus der Tabelle entfernt.

432

Page 433: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Hyperlinks

Erfassen Sie jetzt das Makro aus Listing 10.2, um aus den Zelleninhalten Hyper-links herzustellen.

Listing 10.2: Aus Zelleninhalten Hyperlinks herstellen

Sub HyperlinksSetzen() Sheets("Tabelle1").ActivateRange("A1").Select

Do Until ActiveCell.Value = "" If Left(ActiveCell.Value, 7) = "http://" Then ActiveCell.Hyperlinks.Add ActiveCell,_ ActiveCell.Value, , _ "Klicken Sie hier, um die Verbindung herzustellen", _ ActiveCell.Value Else End If ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Aktivieren Sie im ersten Schritt die gewünschte Tabelle, welche die Daten enthält,die Sie in Hyperlinks verwandeln möchten. Danach setzen Sie den Textcursor aufdie Startzelle und setzen eine Schleife auf, die solange durchlaufen wird, bis dieerste leere Zelle in Spalte A erreicht wird. Setzen Sie den Textcursor am Ende derSchleife immer um eine Zelle nach unten, indem Sie die Eigenschaft Offset ein-setzen und dabei als erstes Argument den Wert 1 (Zeilenverschiebung) einsetzen.Innerhalb der Schleife können Sie zur Sicherheit überprüfen, ob es sich dabeiauch wirklich um eine »Internet-kompatible« Zelle handelt. Wenn ja, dann ergibtdie Prüfung der ersten sieben Zeichen der Zelle das Wort http://. In diesem Fallwenden Sie die Methode Add an, um einen Hyperlink einzufügen.

Diese Methode in Bezug auf Hyperlinks hat folgende Syntax:

Ausdruck.Add(Anchor, Address, SubAddress, ScreenTip, TextToDisplay)

Im Argument Anchor legen Sie die Verankerung des Hyperlinks fest.

Das Argument Address bildet die eigentliche Adresse des Hyperlinks. Beim Argu-ment SubAddress handelt es sich um ein optionales Argument, das die Unter-adresse des Hyperlinks festlegt. In diesem Argument können Sie beispielsweise

433

Page 434: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

zusätzlich eine bestimmte Zellenadresse angeben. In diesem Beispiel wird diesesArgument aber nicht benötigt.

Über das optionale Argument ScreenTip können Sie die QuickInfo bestimmen,die angezeigt werden soll, wenn sich der Mauszeiger auf dem Hyperlink befindet.

Im letzten Argument TextToDisplay legen Sie den Text fest, der für den Hyperlinkangezeigt werden soll.

Inhaltsverzeichnis erstellen

In der nächsten Aufgabe geht es darum, in einer Arbeitsmappe mit vielen Tabel-lenblättern ein Inhaltsverzeichnis auf einer separaten neuen Tabelle zu erstellen.Diese Tabelle enthält alle Namen der Tabellen, die in dieser Arbeitsmappe vor-handen sind. Anschließend sollen diese Tabellennamen in Hyperlinks gewandeltwerden, damit diese über einen Mausklick blitzschnell aktiviert werden können.

Sehen Sie sich dazu das folgende Listing an:

Listing 10.3: Die Tabellennamen »verlinken«

Sub InhaltsverzeichnisErstellen()Dim i As Integer

ActiveWorkbook.Sheets.Add Before:=Worksheets(1)ActiveSheet.Name = "Inhalt"Range("A1").Value = "Inhaltsverzeichnis"ActiveCell.Offset(2, 0).Select

Abbildung 10.3: Hyperlinks aus Zelleninhalten bilden

434

Page 435: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten mit Hyperlinks

For i = 2 To ActiveWorkbook.Sheets.Count ActiveCell.Value = i-1 ActiveCell.Offset(0, 1).Value = Sheets(i).Name ActiveCell.Offset(1, 0).SelectNext i

Range("B3").ActivateDo Until ActiveCell.Value = "" ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, _ Address:="", SubAddress:= ActiveCell.Value & "!A1", _ TextToDisplay:=ActiveCell.Value ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Fügen Sie im ersten Schritt mithilfe der Methode Add eine neue, noch leereTabelle zu Beginn der Arbeitsmappe ein. Danach erfassen Sie in Zelle A1 denTitel der Tabelle (INHALTSVERZEICHNIS) und geben der Tabelle über die Eigen-schaft Name den Namen INHALT.

Durchlaufen Sie anschließend alle Tabellen, mit Ausnahme der ersten Tabelleder Arbeitsmappe, und tragen die Namen der einzelnen Tabellen in Ihre TabelleINHALT ein. Danach setzen Sie eine erneute Schleife auf, die die einzelnen Tabel-lennamen in Hyperlinks umwandelt. Dabei setzen Sie die Methode Add ein undkönnen in diesem Fall auch mal die Argumentnamen mit angeben. Auch dieseSyntax ist in Excel erlaubt. Belassen Sie hierbei das Argument Address leer und set-zen im Argument SubAddress sowohl den Namen der Tabelle, den Sie aus deraktuellen Zelle beziehen, als auch die Zellenadresse ein, an die gesprungen wer-den soll. Verbinden Sie diese beiden Informationen durch die Textfolge & "!.

Abbildung 10.4: Alle Tabellen kön-nen über Hyper-links schnell ange-sprungen werden.

435

Page 436: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

10.2 E-Mails verschicken

Standardmäßig können Sie die aktive Arbeitsmappe versenden, indem Sie aus demMenü DATEI den Befehl SENDEN AN/E-MAIL-EMPFÄNGER auswählen. Excel zeigtdanach das E-Mail-Fenster an. Standardmäßig wird der Name der aktiven Arbeits-mappe als Titel der E-Mail eingetragen. Mit einem Klick auf die Schaltfläche ANhaben Sie direkten Zugriff auf Ihre in Outlook gespeicherten E-Mail-Adressen, dieSie somit leicht übernehmen können. Sie müssen jetzt nur noch einen begleiten-den Text ins E-Mail-Fenster eintippen und die E-Mail mit einem Klick auf dieSchaltfläche SENDEN abschicken.

Selbstverständlich haben Sie noch weitere Möglichkeiten, das Aussehen vonE-Mails zu ändern. So können Sie beispielsweise schon einen vorgefertigten Textsowie die Empfänger-E-Mail-Adresse vorab eintragen. Um diese Funktion in Excelzu integrieren, müssen Sie ein VBA-Makro schreiben.

Im nächsten Beispiel soll eine andere Arbeitsmappe, also nicht die aktive, miteinem bestimmten Titel und einem vorher definierten Text an einen bestimmtenE-Mail-Empfänger versendet werden. Diese Arbeitsmappe wird dann als E-Mail-Anhang per VBA automatisch in die E-Mail eingebunden. Um diese Aufgabe aus-zuführen, müssen Sie zuerst einmal eine zusätzliche Bibliothek in Ihre Entwick-lungsumgebung einbinden. Da Sie die E-Mail über Outlook versenden möchten,brauchen Sie die VBA-Outlook-Bibliothek. Um diese Bibliothek einzubinden, ver-fahren Sie wie folgt:

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.

3. Aktivieren Sie im Listenfeld VERFÜGBARE VERWEISE die Bibliothek MICRO-SOFT OUTLOOK 10.0 OBJECT LIBRARY für Outlook 2002 und MICROSOFTOUTLOOK 11.0 OBJECT LIBRARY für Outlook 2003.

4. Bestätigen Sie Ihre Aktion mit OK.

Erfassen Sie jetzt den Quellcode, um die Datei Projekt.xls aus dem VerzeichnisC:\Eigene Dateien an einen bestimmten Empfänger [email protected] zu ver-senden.

436

Page 437: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

E-Mails verschicken

Listing 10.4: Eine E-Mail zusammenstellen

Sub MailVersenden()Dim outl As ObjectDim Mail As Object

Set outl = CreateObject("Outlook.Application") Set Mail = outl.CreateItem(olMailItem)

Mail.Subject = "Projekt-Status" Mail.Body = "Sehr geehrter Herr Held" & Chr(13) & _ "anbei erhalten Sie den aktuellen Projektbericht " & _ Chr(13) & " im aktuellen Monat " & Chr(13) & _ Chr(13) & " Mit freundlichen Grüßen" & Chr(13) & _ " Walter Kuhn "

Mail.To = "[email protected]" Mail.CC = "[email protected]" Mail.Attachments.Add "C:\Eigene Dateien\Projekt.xls" Mail.Display

Set outl = Nothing

Abbildung 10.5: Die Outlook-Bib-liothek einbinden

437

Page 438: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

Set Mail = Nothing End Sub

Die Methode CreateObject setzen Sie ein, um ein Outlook-Objekt anzulegen.Damit können Sie auf alle VBA-Objekte, Methoden und Eigenschaften von Out-look zugreifen.

Mithilfe der Methode CreateItem erstellen Sie ein neues Outlook-Objekt. Dabeigeben Sie über die Konstante OlMailItem bekannt, dass es sich hierbei um einE-Mail-Objekt handeln soll.

Über die Eigenschaft Subject legen Sie den Titel der E-Mail fest. Dieser Titel wirdin der Zeile BETREFF angezeigt.

Mithilfe der Eigenschaft Body geben Sie den Text an, der als Nachrichtentext inder E-Mail eingefügt werden soll.

Die Eigenschaft To bestimmt, an welche Empfänger die E-Mail versendet werdensoll. Sie haben dabei auch die Möglichkeit, mehrere E-Mail-Empfänger hinterei-nander anzugeben. Wenn Sie möchten, können Sie die Eigenschaft CC einsetzen,wenn Ihre E-Mail auch an andere Empfänger als Kopie gesendet werden soll.Ergänzend zu den beiden letztgenannten Eigenschaften können Sie die Eigen-schaft BCC einsetzen. Diese Eigenschaft kommt dann zum Tragen, wenn Sie einemAnwender eine E-Mail als Kopie zustellen möchten, ohne dass der eigentlicheEmpfänger der E-Mail davon etwas weiß.

Über das Objekt Attachments legen Sie den Anhang der E-Mail fest. Dabei wirddie Arbeitsmappe Projekt.xls über die Methode Add eingefügt. Sie sollten daraufachten, dass die angegebene Datei sowie der Pfad auch existieren.

Mithilfe der Methode Display zeigen Sie das E-Mail-Fenster auf dem Bildschirm an.

Entfernen Sie die vorher definierten Outlook-Objekte wieder aus dem Speicher.Dazu dienen die Anweisungen: Set outl = Nothing bzw. Set Mail = Nothing.

Sind Sie sich ganz sicher, dass alle Angaben stimmen, können Sie dieE-Mail natürlich auch über einen VBA-Befehl direkt abschicken. Ergän-zen Sie Ihr Makro mit dem Befehl Mail.Send.

438

Page 439: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Kontakte austauschen

10.3 Kontakte austauschen

Im Folgenden liegt Ihnen eine Tabelle mit Adressdaten in Excel vor. Ihre Aufgabebesteht nun darin, diese Adressen in den Kontaktordner von Outlook zu transferie-ren. Sehen Sie sich vorerst einmal die Ausgangssituation in Abbildung 10.7 an.

Transferieren Sie nun diese Excel-Tabelle mithilfe des Makros aus Listing 10.5 inden Kontaktordner von Outlook.

Listing 10.5: Kontaktdaten aus Excel nach Outlook übertragen

Sub KontakteAdressenNachOutlook ()Dim appOutLook As Outlook.ApplicationDim conoutlook As Outlook.ContactItem Sheets("Kontaktaustausch").Activate

Abbildung 10.6: Mit einem Klick wird die E-Mail versendet.

Abbildung 10.7: Die Adressdaten aus Excel sollen in den Kontaktord-ner von Outlook.

439

Page 440: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

Set appOutLook = CreateObject("Outlook.Application")Range("A2").Select Do Until ActiveCell.Value = "" Set conoutlook = appOutLook.CreateItem(olContactItem) With conoutlook .LastName = ActiveCell.Value .FirstName = ActiveCell.Offset(0, 1).Value .BusinessAddressStreet = _ ActiveCell.Offset(0, 2).Value .BusinessAddressCity = ActiveCell.Offset(0, 4).Value .BusinessAddressPostalCode = _ ActiveCell.Offset(0, 3).Value .BusinessAddressCountry = _ ActiveCell.Offset(0, 5).Value .BusinessAddressState = ActiveCell.Offset(0, 6).Value .Email1Address = ActiveCell.Offset(0, 7).Value .Save End With ActiveCell.Offset(1, 0).Select Loop Set conoutlook = NothingSet appOutLook = NothingEnd Sub

Wenden Sie zu Beginn des Makros die Methode CreateObject an, um ein Out-look-Objekt anzulegen. Damit gewinnen Sie den Zugriff auf alle VBA-Objekte,Methoden und Eigenschaften von Outlook.

Mithilfe der Methode CreateItem erstellen Sie ein neues Outlook-Objekt. Da Sieein Kontakt-Objekt benötigen, übergeben Sie dieser Methode die KonstanteolContactItem.

Anschließend füllen Sie den noch leeren Kontakt mit den Daten aus Ihrer Excel-Tabelle. Unter anderem verwenden Sie dabei folgende Eigenschaften:

� LastName: Mit dieser Eigenschaft können Sie den Nachnamen, den Sie ausIhrer Tabelle aus Spalte A holen, füllen.

� FirstName: Mit dieser Eigenschaft können Sie den Vornamen, den Sie ausIhrer Tabelle aus Spalte B holen, füllen.

440

Page 441: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Kontakte austauschen

� BusinessAddressStreet: Mit dieser Eigenschaft übergeben Sie den Inhalt derSpalte C (Straße).

� BusinessAddressCity: Mit dieser Eigenschaft übergeben Sie den Inhalt derSpalte E (Ort).

� BusinessAddressPostalCode: Mit dieser Eigenschaft übergeben Sie den Inhaltder Spalte D (PLZ).

� BusinessAddressCountry: Mit dieser Eigenschaft übergeben Sie den Inhalt derSpalte F (Bundesland).

� BusinessAddressState: Mit dieser Eigenschaft übergeben Sie den Inhalt derSpalte G (Land).

� Email1Address: Mit dieser Eigenschaft übergeben Sie den Inhalt der Spalte H(E-Mail-Adresse).

Mithilfe der Methode Save wird der Kontakt endgültig im Kontaktordner angelegt.

Auch der umgekehrte Vorgang, also Kontaktdaten aus Outlook in eine Tabelle zutransferieren, ist von Interesse. Im folgenden Beispiel wird der Inhalt des Kontakt-ordners in einer neuen Tabelle ausgegeben.

Abbildung 10.8: Die Kontakte wur-den erfolgreich übertragen.

441

Page 442: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

Erfassen Sie zu diesem Zweck das folgende Makro:

Listing 10.6: Kontaktdaten aus Outlook ziehen

Sub KontakteVonOutlook()Dim Verz As ObjectDim i As IntegerDim olMAPI As New Outlook.ApplicationDim objItem As Object Sheets.Add ActiveSheet.Name = "Kontaktdaten" Range("A1").Select

Set Verz = _ olMAPI.GetNamespace("MAPI") _. GetDefaultFolder(olFolderContacts)

For i = 1 To Verz.Items.Count Set objItem = Verz.Items(i) With objItem ActiveCell.Value = .FirstName ActiveCell.Offset(0, 1).Value = .LastName ActiveCell.Offset(0, 2).Value = _ .BusinessAddressStreet ActiveCell.Offset(0, 3).Value = _ .BusinessAddressPostalCode ActiveCell.Offset(0, 4).Value = _ .BusinessAddressCity ActiveCell.Offset(0, 5).Value = _ .BusinessAddressCountry ActiveCell.Offset(0, 6).Value = _ .BusinessAddressState ActiveCell.Offset(0, 7).Value = .Email1Address End With ActiveCell.Offset(1, 0).Select Next i Columns("A:H").AutoFit Set objItem = Nothing Set olMAPI = NothingEnd Sub

442

Page 443: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

Fügen Sie im ersten Schritt über die Anweisung Sheets.Add eine neue, noch leereTabelle in Ihre Arbeitsmappe ein. Danach geben Sie dieser Tabelle über dieEigenschaft Name den Namen KONTAKTDATEN und setzen den Mauszeiger auf dieStartzelle. Über die Anweisung olMAPI.GetNamespace("MAPI").GetDefaultFol-der(olFolderContacts) gewinnen Sie Zugriff auf den Kontaktordner von Outlook.Setzen Sie nun eine Schleife auf, die alle angelegten Kontakte abarbeitet. Übertra-gen Sie im Anschluss daran die einzelnen Informationen aus dem Kontakt in diedafür vorgesehenen Excel-Zellen.

Setzen Sie am Ende des Makros die Methode AutoFit ein, um die Spaltenbreitenautomatisch einzustellen, und heben Sie danach die Objektverweise über dieAnweisung Set Objektverweis = Nothing auf, um den reservierten Speicher wie-der freizugeben.

10.4 Fragen & Antworten

F Wie können Sie E-Mail-Adressen mit Hyperlinks ausstatten?

A Wenn Sie in einer Tabelle E-Mail-Adressen vorliegen haben, dann könnenSie diese mit dem Makro aus Listing 10.7 in Hyperlinks setzen. Sehen Siesich aber vorher Abbildung 10.10 an.

Listing 10.7: E-Mail-Adressen in Hyperlinks verwandeln

Sub EMailLinksUmsetzen()Sheets("MailAdressen").ActivateRange("A1").Select

Do Until ActiveCell.Value = "" If InStr(ActiveCell.Value, "@") > 0 Then

Abbildung 10.9: Die aus Outlook importierten Kon-taktdaten

443

Page 444: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

ActiveCell.Hyperlinks.Add ActiveCell, _ "MailTo: " & ActiveCell.Value End IfActiveCell.Offset(1, 0).SelectLoopEnd Sub

In einer Schleife durchlaufen Sie alle Zellen der Spalte A. Mit der FunktionInStr können Sie prüfen, ob die Zelle eine E-Mail-Adresse enthält. Ist diesder Fall, dann kommt das Zeichen @ automatisch darin vor. In diesem Fallfügen Sie über die Methode Add einen Hyperlink ein. Als Zusatz müssen Sienoch den Text MAILTO ergänzen. Damit weiß Excel, dass es sich dabei umeine E-Mail-Adresse handelt. Mit einem Klick auf diese Zelle wird dann dasE-Mail-Fenster mit voreingestellter E-Mail-Adresse aufgerufen.

Abbildung 10.10: Diese E-Mail-Adressen sollen in Hyperlinks gewan-delt werden.

Abbildung 10.11: Die Hyperlinks wurden erfolg-reich gesetzt.

444

Page 445: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

F Wie können Sie überprüfen, ob eine Zelle einen Hyperlink hat?

A Im folgenden Makro wird eine Tabelle nach Hyperlinks durchforstet.Überall dort, wo Excel Hyperlinks finden kann, wird in der Nebenzelle einEintrag vorgenommen:

Listing 10.8: Alle Hyperlinks werden dokumentiert

Sub PrüfenZelleAufHyperlink()Sheets("PrüfungHyper").ActivateRange("A1").Select

Do Until ActiveCell.Value = "" If ActiveCell.Hyperlinks.Count > 0 Then ActiveCell.Offset(0, 1).Value = _ "Nebenzelle enthält Hyperlink!" Else End If ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Indem Sie die Eigenschaft Count abfragen, können Sie ermitteln, ob eineZelle einen Hyperlink enthält. In diesem Fall meldet diese Eigenschafteinen Wert > 0.

Abbildung 10.12: Aufspüren von Hyperlinks

445

Page 446: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und das Internet

F Wie können Sie alle Hyperlinks einer Tabelle mit einer anderen Schriftfarbe aus-statten?

A Erfassen Sie zu diesem Zweck das folgende Makro aus Listing 10.9. In die-sem Listing werden alle Hyperlinks einer Tabelle mit der Schriftfarbe Rotformatiert:

Listing 10.9: Hyperlinks anders formatieren

Sub HyperlinksFärben()Dim Hyper As HyperlinkSheets("PrüfungHyper").Activate

For Each Hyper In ActiveSheet.Hyperlinks Hyper.Range.Font.ColorIndex = 3Next HyperEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Hyperlink.Danach durchlaufen Sie alle Hyperlinkzellen der aktiven Tabelle und fär-ben diese über das Font-Objekt und die Eigenschaft ColorIndex ein.

10.5 Quiz

F Über welches Argument der Methode Add können Sie bestimmen, welche Quick-Info angezeigt wird, wenn Sie mit der Maus über eine Hyperlinkzelle streichen?

F Mit welcher Anweisung können Sie ein leeres Outlook-Kontaktobjekt anlegen?

F Was muss beim Anlegen eines Outlook-Kontaktes aus Excel heraus beachtet werden?

10.6 Übung

Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Internet.xls undwechseln auf die Tabelle ÜBUNG. Schreiben Sie ein Makro, das alle Zellenadres-sen der dort befindlichen Hyperlinks auf einer separaten Tabelle dokumentiert.

Die Lösung dieser Aufgabe können Sie im Anhang A nachlesen.

446

Page 447: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

11

Excel und Daten-zugriffe auf Access

und Word

Page 448: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Am gestrigen Tag haben Sie gelernt, wie Sie Hyperlinks in Excel setzen, formatie-ren, dokumentieren und entfernen können. Außerdem haben Sie über Excel-VBAE-Mails mit Dateianhängen verschickt und Kontaktdaten mit Outlook ausge-tauscht.

Die Themen heute:

� Die Voraussetzung für den Datenaustausch zw. Excel und Access

� Excel-Daten in eine Access-Datenbank transferieren

� Access-Daten in Excel-Tabellen überführen

� Access-Tabellen manipulieren

� Zusammenarbeit zwischen Excel und Word vorbereiten

� Eine Word-Sitzung starten und übernehmen

� Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen

� Ganze Excel-Tabellen in ein Word-Dokument einfügen

� Word-Dokumente in einer Excel-Tabelle auflisten

Alle Beispiele dieses Tages finden Sie auf der mitgelieferten CD-ROMin den Arbeitsmappen Access.xls und Word.xls sowie in der Datenbank-datei Buchungen.mdb im Verzeichnis Kap11.

11.1 Die Voraussetzung für den Datenaustausch

Die Zusammenarbeit zwischen Excel und Access bietet interessante Möglichkei-ten in der Praxis. Das Datenbankprogramm Access bietet gerade in der Verwaltungvon Massendaten sehr gute Möglichkeiten. So können Sie die Daten in einerAccess-Datenbank speichern und über Excel darauf zugreifen. Diese Access-Datenbank können Sie dann beispielsweise auf einem allgemein zugänglichenNetzlaufwerk zentral ablegen, auf die die einzelnen Excel-Anwender zugreifenkönnen.

Für den Datenzugriff stehen zwei verschiedene Methoden zur Verfügung. DiesenZugriff können Sie entweder mit der älteren Zugriffsmethode DAO (Data AccessObject) oder mit der neuen Methode ADO (ActiveX Data Object) bewerkstelligen.

448

Page 449: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Voraussetzung für den Datenaustausch

Aus Aktualitätsgründen werden die folgenden Beispiele mithilfe von ADO pro-grammiert.

Bevor Sie mit der Programmierung beginnen, müssen Sie die Voraussetzung dafürschaffen, indem Sie die ADO-Bibliothek in Ihre Excel-Entwicklungsumgebungeinbinden. Somit bekommen Sie Zugriff auf alle notwendigen Objekte, Methodenund Eigenschaften, die für einen reibungslosen Datenaustausch zwischen Excelund Access verantwortlich sind. Ebenso sollten Sie die Access-VBA-Bibliothek ein-binden. Damit stehen Ihnen alle Objekte, Methoden und Eigenschaften fürAccess-Datenbanken zur Verfügung. Diese können dann auch über die Taste (F1)in der Online-Hilfe nachgeblättert werden. Um diese Bibliotheken einzubinden,verfahren Sie wie folgt:

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.

3. Im Listenfeld VERFÜGBARE VERWEISE aktivieren Sie die Bibliothek MICRO-SOFT ACTIVEX DATA OBJECTS 2.5 LIBRARY.

4. Im Listenfeld VERFÜGBARE VERWEISE aktivieren Sie wahlweise, je nach einge-setzter Version, die Bibliothek MICROSOFT ACCESS 8.0 OBJECT LIBRARY (fürAccess 97), Bibliothek MICROSOFT ACCESS 9.0 OBJECT LIBRARY (für Access

Abbildung 11.1: Die ADO-Biblio-thek einbinden

449

Page 450: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

2000), Bibliothek MICROSOFT ACCESS 10.0 OBJECT LIBRARY (für Access2002) bzw. MICROSOFT ACCESS 11.0 OBJECT LIBRARY (für Access 2003).

5. Bestätigen Sie Ihre Einstellung mit OK.

Sie haben nun die Möglichkeit, vorab die zur Verfügung stehenden Objekte,Methoden und Eigenschaften in Access-VBA einzusehen. Drücken Sie dazu inder Entwicklungsumgebung die Taste (F2) und stellen Sie im ersten Dropdownden Befehl ACCESS ein.

Abbildung 11.2: Alle Objekte, Methoden und Eigenschaften von Access-VBA

450

Page 451: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel-Daten in eine Access-Datenbank überführen

11.2 Excel-Daten in eine Access-Datenbank überführen

Im folgenden Praxisbeispiel soll eine Excel-Tabelle in eine noch leere Access-Datenbank transferiert werden. Dabei müssen Sie die Datenbank zuerst noch anle-gen. Gehen Sie dabei wie folgt vor:

1. Starten Sie Microsoft Access.

2. Legen Sie eine neue Datenbank an und geben dieser Datenbank den NamenBUCHUNGEN.

3. Erstellen Sie jetzt eine neue Tabelle, indem Sie aus dem Menü EINFÜGENden Befehl TABELLE auswählen.

4. Im Dialog NEUE TABELLE markieren Sie im Listenfeld den Befehl ENT-WURFSANSICHT.

5. Bestätigen Sie mit OK.

6. Legen Sie jetzt den Aufbau der Tabelle fest, so wie Sie ihn in Abbildung 11.3sehen.

Abbildung 11.3: Der Aufbau der Tabelle

451

Page 452: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

7. Geben Sie der Tabelle den Namen VERANSTALTUNG.

8. Beenden Sie nun Microsoft Access.

Im zweiten Schritt haben Sie eine Excel-Tabelle nach folgendem Muster vorliegen:

Übertragen Sie jetzt diese Veranstaltungsdaten aus der Excel-Tabelle in dieAccess-Datenbank. Setzen Sie zu diesem Zweck das Makro aus Listing 11.1 ein:

Listing 11.1: Excel-Daten nach Access transferieren

Sub DatenübernahmeNachAccess()Dim ADOC As New ADODB.ConnectionDim DBS As New ADODB.Recordset

ADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0; _Data Source=C:\Eigene Dateien\Buchungen.mdb;" DBS.Open "Veranstaltung", ADOC, adOpenKeyset, _ adLockOptimistic Sheets("Veranstaltungen").Activate Range("A2").Select

On Error GoTo Fehler Do Until ActiveCell.Value = "" DBS.AddNew DBS!Bdatum = ActiveCell.Value DBS!Vdatum = ActiveCell.Offset(0, 1).Value DBS!Veranstaltung = ActiveCell.Offset(0, 2).Value DBS!V_Ort = ActiveCell.Offset(0, 3).Value DBS!Teilnehmer = ActiveCell.Offset(0, 4).Value DBS!Straße = ActiveCell.Offset(0, 5).Value DBS!PLZ = ActiveCell.Offset(0, 6).Value DBS!Ort = ActiveCell.Offset(0, 7).Value

Abbildung 11.4: Die Veranstal-tungsdaten in Excel

452

Page 453: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel-Daten in eine Access-Datenbank überführen

DBS!Kosten = ActiveCell.Offset(0, 8).Value If ActiveCell.Offset(0, 9).Value = "Ja" Then DBS!Bezahlt = True Else DBS!Bezahlt = False DBS.Update ActiveCell.Offset(1, 0).Select Loop

DBS.Close ADOC.Close Set ADOC = Nothing Set DBS = Nothing Exit SubFehler: MsgBox "Es trat ein Fehler auf!" DBS.Close ADOC.Close Set ADOC = Nothing Set DBS = NothingEnd Sub

Definieren Sie zuerst eine Objektvariable vom Typ Connection, um später die Ver-bindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS benötigenSie ein RekordSet-Objekt, welches nachher alle Datensätze der Datenquelle auf-nehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, benötigenSie zuerst einmal eine Verbindung zu Ihrem Provider, die Sie mit der MethodeOpen herstellen. Dieser Provider stellt alle Funktionen zur Verfügung, die notwen-dig sind, um auf die Access-Datenbank zuzugreifen.

Öffnen Sie die Access-Datenbank mit Hilfe des Objektes Connection. Zum Öffneneiner Access-Datenbank brauchen Sie die Jet-Datenbank-Engine. Geben Sie dahermit der Eigenschaft Provider die Engine MICROSOFT JET 4.0 OLE DB-Provideran. Öffnen Sie danach die Datenbank Buchungen.mdb.

Definieren Sie darauf ein RecordSet-Objekt, das später den gesuchten Datensatzenthalten soll. Öffnen Sie jetzt über die Methode Open die Tabelle VERANSTAL-TUNG.

Diese Methode hat folgende Syntax:

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

453

Page 454: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Im Argument Source geben Sie den Namen der Tabelle an, die Sie öffnen möch-ten. Im Argument ActiveConnection verweisen Sie auf das Connection-ObjektADOC, welches Sie vorher angegeben haben.

Über das Argument CursorType bestimmen Sie die Art des Cursors. Unter anderemwird dadurch der Zugriff auf Ihre Daten festgelegt. Dabei stehen Ihnen folgendeKonstanten zur Verfügung:

� adOpenForwardOnly: (Voreinstellung) öffnet einen Vorwärtscursor. Mit Hilfedieses Cursors können Sie nur nach vorne blättern.

� adOpenKeyset: öffnet einen Cursor vom Typ Schlüsselgruppen. Dieser Cursorist vergleichbar mit dem dynamischen Cursor. Jedoch werden bei diesem Cur-sor Änderungen in der Tabelle, die von anderen Anwendern durchgeführt wer-den, nicht angezeigt.

� AdOpenDynamic: öffnet einen dynamischen Cursor. Damit haben Sie die Mög-lichkeit, Tabelleneinträge anzuzeigen, zu ändern und zu löschen. Alle Ände-rungen werden regelmäßig aktualisiert und angezeigt.

� adOpenStatic: öffnet einen statischen Cursor. Bei diesem Cursor können dieDaten nur angezeigt, jedoch nicht geändert werden. Die Datenansicht ist alsMomentaufnahme zu verstehen, der zum Zeitpunkt des Öffnens der Tabellevorgelegen hat.

Mit Hilfe des Arguments LockType bestimmen Sie, welches Sperrverfahren derProvider beim Öffnen der Tabelle einsetzen soll. Dabei stehen Ihnen folgendeKonstanten zur Verfügung:

� adLockReadOnly: Bei dieser Standardeinstellung können Sie die Daten in derTabelle nicht ändern.

� adLockPessimistic: Bei dieser Einstellung wird der Datensatz vollständiggesperrt. Dabei wird das erfolgreiche Bearbeiten der Datensätze sichergestellt,indem der Provider Datensätze in der Datenquelle sofort beim Bearbeitensperrt.

� adLockOptimistic: Diese Einstellung sorgt dafür, dass die Tabelle teilweisegesperrt wird, d.h. ein Datensatz wird nur sperrt, wenn Sie die Update-Methodeaufrufen.

� adLockBatchOptimistic: Diese Einstellung lässt eine teilweise Stapelaktualisie-rung zu.

454

Page 455: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Access-Daten in Excel-Tabellen überführen

Im letzten Argument Options können Sie festlegen, wie der Provider die Datenauswerten soll. Dieses Argument wird aber für unser Beispiel nicht benötigt.

Aktivieren Sie danach die Excel-Tabelle, die die zu übertragenden Daten enthältund setzen den Mauszeiger auf die Startzelle. In einer anschließenden Schleifewerden alle Datensätze der Tabelle verarbeitet. Innerhalb der Schleife setzen Siedie Methode AddNew ein, um zunächst einen leeren Datenbanksatz anzulegen.Diesen füllen Sie im Anschluss mit den Inhalten Ihrer Excel-Tabelle. VergessenSie nicht, dieses Befüllen des Datenbanksatzes mithilfe der Methode Update zusichern.

Am Ende des Makros schließen Sie die Datenbank über die Methode Close undbeenden ebenfalls mit derselben Methode die Verbindung zum Provider. HebenSie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objekt-variable = Nothing einsetzen.

11.3 Access-Daten in Excel-Tabellen überführen

Im nächsten Beispiel wird genau der gegensätzliche Vorgang durchgeführt. Auseiner Access-Datenbank BUCHUNGEN.MDB sollen Daten nach Excel übertragenwerden. Dabei wird der Transfer auf zwei verschiedene Arten durchgeführt:

� Alle Datensätze sollen transferiert werden.

� Nur ganz bestimmte Datensätze sollen transferiert werden.

Alle Datensätze nach Excel transferieren

Um alle Datensätze aus der Tabelle VERANSTALTUNG der Datenbank Buchun-gen.mdb nach Excel zu transferieren, setzen Sie das notwendige Makro aus Listing11.2 ein:

Abbildung 11.5: Die Daten wur-den erfolgreich nach Access über-tragen.

455

Page 456: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Listing 11.2: Daten aus einer Access-Tabelle transferieren

Sub DatenÜbertragenNachExcel()Dim ADOC As New ADODB.ConnectionDim DBS As New ADODB.RecordsetDim cmd As ADODB.Command

On Error GoTo FehlerbehandlungADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data _Source=C:\Eigene Dateien\Buchungen.mdb;" DBS.Open "Veranstaltung", ADOC, adOpenKeyset, _ adLockOptimistic

Set cmd = New ADODB.Commandcmd.CommandText = "SELECT * from Veranstaltung"cmd.ActiveConnection = ADOC

Set DBS = cmd.ExecuteSheets("Import").ActivateRange("A2").Select

Do While Not DBS.EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Offset(0, 1).Value = DBS!Vdatum ActiveCell.Offset(0, 2).Value = DBS!Veranstaltung ActiveCell.Offset(0, 3).Value = DBS!V_Ort ActiveCell.Offset(0, 4).Value = DBS!Teilnehmer ActiveCell.Offset(0, 5).Value = DBS!Straße ActiveCell.Offset(0, 6).Value = DBS!PLZ ActiveCell.Offset(0, 7).Value = DBS!Ort ActiveCell.Offset(0, 8).Value = DBS!Kosten If DBS!Bezahlt = True Then ActiveCell.Offset(0, 9).Value = "Ja" Else ActiveCell.Offset(0, 9).Value = "Nein" End If DBS.MoveNext ActiveCell.Offset(1, 0).SelectLoop

Columns("A:J").AutoFit

456

Page 457: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Access-Daten in Excel-Tabellen überführen

DBS.CloseADOC.CloseSet DBS = NothingSet ADOC = NothingSet DBS = NothingSet cmd = Nothing

Exit SubFehlerbehandlung: MsgBox "Es ist ein Fehler aufgetreten!" _ & Chr(13) & Err.DescriptionEnd Sub

Definieren Sie zuerst eine Objektvariable vom Typ Connection, um später die Ver-bindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS benötigenSie ein RekordSet-Objekt, welches nachher alle Datensätze der Datenquelle auf-nehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, benötigenSie zuerst eine Verbindung zu Ihrem Provider, die Sie mit der Methode Open her-stellen. Dieser Provider stellt alle Funktionen zur Verfügung, die notwendig sind,um auf die Access-Datenbank zuzugreifen.

Basteln Sie sich nun eine kleine SQL-Anweisung mithilfe des SchlüsselwortesSELECT, welches Sie auf die Access-Tabelle Veranstaltung ansetzen. Der Stern (*)nach dem SELECT bedeutet, dass alle Datensätze genommen werden sollen. Überdie Methode Execute führen Sie diese SQL-Abfrage aus. Die ermittelten Daten-sätze stehen nun bereit.

Aktivieren Sie das Zeilentabellenblatt in Excel und setzen den Mauszeiger auf dieStartzelle. Arbeiten Sie in einer anschließenden Schleife alle Datensätze derDatenbanktabelle ab. Das Ende der Verarbeitung wird über die Anweisung EOF(End of File) angezeigt. Innerhalb der Schleife setzen Sie die Methode MoveNextein, um jeweils zum nächsten Datensatz zu gelangen. Im RekordSet-Objekt DBSsteht der komplette Datensatz. Sie haben daher die Möglichkeit, die einzelnenFelder in Ihre Excel-Tabelle zu übertragen. Lassen Sie die Spaltenbreite derExcel-Tabelle automatisch richtig anpassen, indem Sie die Methode AutoFit ein-setzen und diese Methode auf die Spalten A-J anwenden.

Am Ende des Makros schließen Sie die Datenbank über die Methode Close undbeenden ebenfalls mit derselben Methode die Verbindung zum Provider. HebenSie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objekt-variable = Nothing einsetzen.

457

Page 458: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Nur bestimmte Datensätze nach Excel transferieren

Im nächsten Beispiel werden Sie nur ganz bestimmte Sätze nach Excel transferie-ren, d.h. Sie werden eine Datenbankabfrage durchführen und nur Sätze nachExcel übertragen, die bestimmten Kriterium entsprechen. So werden Sie jetzt alleDatensätze nach Excel importieren, bei denen die Teilnahmegebühr noch nichtbezahlt wurde. Das Makro für diese Aufgabe lautet:

Listing 11.3: Nur bestimmte Datensätze aus Access nach Excel übernehmen

Sub DatensätzeSuchenUndÜbertragen()Dim ADOC As ADODB.ConnectionDim DBS As ADODB.RecordsetDim s As String s = "Bezahlt=false" Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic .Find Criteria:=s, SearchDirection:=adSearchForward Sheets("Offene").Activate Range("A2").Select

Abbildung 11.6: Die Daten kamen korrekt an.

458

Page 459: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Access-Daten in Excel-Tabellen überführen

If Not .EOF Then Do While Not .EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Value = Format(ActiveCell.Value, _ "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Vdatum ActiveCell.Offset(0, 1) = _ Format(ActiveCell.Offset(0, 1).Value, _ "dd.mm.yyyy") ActiveCell.Offset(0, 2).Value = DBS!Veranstaltung ActiveCell.Offset(0, 3).Value = DBS!V_Ort ActiveCell.Offset(0, 4).Value = DBS!Teilnehmer ActiveCell.Offset(0, 5).Value = DBS!Straße ActiveCell.Offset(0, 6).Value = DBS!PLZ ActiveCell.Offset(0, 7).Value = DBS!Ort ActiveCell.Offset(0, 8).Value = DBS!Kosten .Find Criteria:=s, SkipRecords:=1 ActiveCell.Offset(1, 0).Select Loop Else MsgBox "Datensatz nicht gefunden" End If .Close End With Columns("A:J").AutoFit

ADOC.Close Set DBS = Nothing Set ADOC = NothingEnd Sub

Stellen Sie wie vorher die Verbindung zum Provider her und öffnen Ihre Daten-bank sowie die Access-Tabelle. In der Variablen s basteln Sie sich Ihr Suchkrite-rium zusammen, nach dem die Access-Tabelle durchsucht werden soll.

Setzen Sie jetzt die Methode Find ein. Diese Methode sucht in der Tabelle nachdem Datensatz, der den angegebenen Kriterien entspricht. Ist das Kriterium erfüllt,wird der gefundene Datensatz zum aktuellen Datensatz der Tabelle. Andernfallswird der Zeiger auf das Ende des Tabelle festgelegt.

Die Methode Find hat folgende Syntax.

Find (criteria, SkipRows, searchDirection, start)

459

Page 460: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Unter dem Argument criteria müssen Sie angeben, was Sie konkret in derTabelle suchen möchten. Diese Information haben Sie bereits vorher in der Vari-ablen s gespeichert. Dabei wurde der verwendete Spaltenname, der Vergleichs-operator sowie der Wert in der Variablen s zusammengebastelt.

Beim Argument SkipRows können Sie den Abstand vom aktuelle Datensatz odervom Argument start angeben.

Das Argument SearchDirection gibt an, wie in der Tabelle gesucht werden soll.Dazu stehen Ihnen folgende Varianten zur Verfügung:

� adSearchForward: führt die Suche vorwärts durch. Die Suche hört am Ende derTabelle auf, sofern kein entsprechender Datensatz gefunden wurde.

� adSearchBackward: führt die Suche rückwärts durch. Die Suche hört amAnfang der Tabelle auf, sofern kein entsprechender Datensatz gefundenwurde.

Mit Hilfe des Arguments start können Sie einen numerischen Wert angeben, derangibt, bei welchem Datensatz die Suche in der Tabelle beginnen soll.

In der ersten Verzweigung fragen Sie direkt nach, ob der gesuchte Satz gefundenwurde. Wenn nicht, dann wird die Bedingung EOF (End of file) erreicht. Wurdeder gesuchte Datensatz gefunden, dann stehen alle Informationen hierüber in derObjektvariablen DBS. Übertragen Sie diese Informationen dann in Ihre Excel-Tabelle. Um zum nächsten Datensatz zu gelangen, setzen Sie erneut die MethodeFind ein.

Haben Sie alle Datensätze erfolgreich in die Excel-Tabelle übertragen, dannschließen Sie die Datenbank über die Methode Close und beenden ebenfalls mitderselben Methode die Verbindung zum Provider. Heben Sie die Objektverweiseim Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing ein-setzen.

Abbildung 11.7: Alle Teilnehmer von Veranstaltun-gen, die noch nicht bezahlt haben

460

Page 461: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Access-Tabellen manipulieren

11.4 Access-Tabellen manipulieren

Im nächsten Beispiel greifen Sie von Excel aus auf eine Access-Tabelle zu und pas-sen die Preise an. Dabei sollen die Preise für die Veranstaltungen um 10% erhöhtwerden.

Erfassen Sie nun das Makro, welches die Preise der Veranstaltungen um 10%erhöht.

Listing 11.4: Die Preise wurden um 10% erhöht

Sub DatenManipulieren()Dim ADOC As ADODB.ConnectionDim DBS As ADODB.RecordsetDim Erhöhung As Single Erhöhung = 1.1 Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic Do While Not .EOF DBS!Kosten = DBS!Kosten * Erhöhung DBS.Update DBS.MoveNext

Abbildung 11.8: Originalzustand vor der Preiserhö-hung

461

Page 462: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Loop .Close End With

ADOC.Close Set DBS = Nothing Set ADOC = NothingEnd Sub

Da die Methoden zum Öffnen einer Tabelle bereits beschrieben wurden, gehenwir gleich mitten in die Schleife. Die Preiserhöhung führen Sie durch, indem Siedas Feld KOSTEN mit dem Faktor 1,1 multiplizieren. Gleich danach wenden Siedie Methode Update an, um diese Änderung wirksam werden zu lassen. Mit Hilfeder Methode MoveNext gehen Sie zum nächsten Datensatz. Diese Vorgehensweiseführen Sie durch bis Sie am letzten Satz der Tabelle angelangt sind. Dann tritt dieSchleifenbedingung EOF auf und die Schleife wird verlassen. Vergessen Sie dannnicht, die Tabelle über die Methode Close zu schließen und die Objektverweisewieder aufzuheben.

11.5 Datensätze löschen

Im letzten Beispiel sollen in einer Access-Tabelle alle Datensätze gelöscht werden,bei denen der Veranstaltungsort STUTTGART ist. Diese Manipulation soll vonExcel heraus durchgeführt werden.

Das Makro zur Lösung dieser Aufgabenstellung lautet:

Listing 11.5: Entfernen von bestimmten Datensätzen

Sub DatensätzeLöschen()Dim ADOC As New ADODB.ConnectionDim DBS As ADODB.Recordset

Abbildung 11.9: Die Preise wur-den erhöht.

462

Page 463: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Datensätze löschen

Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset DBS.Open _ "Select * FROM Veranstaltung where (V_Ort = 'Stuttgart')", ADOC, adOpenKeyset, adLockOptimistic Do Until DBS.EOF DBS.Delete DBS.MoveNext Loop DBS.Close Set DBS = Nothing Set ADOC = NothingEnd Sub

Öffnen Sie die Access-Tabelle VERANSTALTUNGEN und geben über die SQL-Anweisung bekannt, welche Datensätze Sie beabsichtigen zu entfernen. Danachdurchlaufen Sie in einer Schleife alle gefundenen Datensätze und löschen diesemithilfe der Methode Delete. Nach dem Löschen von Datensätzen aus einerTabelle müssen Sie darauf achten, dass Sie mit Hilfe der Methode MoveNextjeweils zum nächsten Datensatz springen.

Abbildung 11.10: Alle Veranstaltun-gen in Stuttgart wurden aus der Datenbank ent-fernt.

463

Page 464: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

11.6 Zusammenarbeit zwischen Excel und Word vorbereiten

Wenn Sie beschließen, mit Excel und Word im Duett zu arbeiten, und für diesenZweck Makros programmieren möchten, müssen Sie Zugriff auf alle Objekte,Methoden und Eigenschaften von Word-VBA haben. Daher müssen Sie in IhreExcel-Entwicklungsumgebung die Word-VBA-Bibliothek einbinden. Dazu verfah-ren Sie wie folgt:

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.

3. Wählen Sie aus dem Listenfeld VERFÜGBARE VERWEISE wahlweise, je nacheingesetzter Word-Version, die Bibliothek MICROSOFT WORD 8.0 OBJECTLIBRARY (Word 97), MICROSOFT WORD 9.0 OBJECT LIBRARY (Word 2000),MICROSOFT WORD 10.0 OBJECT LIBRARY (Word 2002), MICROSOFT WORD11.0 OBJECT LIBRARY (Word 2003) aus.

4. Bestätigen Sie Ihre Einstellung mit OK.

Abbildung 11.11: Die Word-Biblio-thek einbinden

464

Page 465: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Word-Sitzung starten

Sie haben nun die Möglichkeit, vorab die zur Verfügung stehenden Objekte,Methoden und Eigenschaften in Word-VBA einzusehen. Drücken Sie dazu in derEntwicklungsumgebung die Taste (F2) und stellen im ersten Dropdown-Feld denBefehl WORD ein.

11.7 Word-Sitzung starten

Im ersten Beispiel werden Sie eine neue Word-Sitzung starten, dann ein bestimm-tes Dokument öffnen. Danach können beliebige Aktionen im Dokument durchge-führt werden. In diesem Beispiel wird das Dokument wieder geschlossen und dieSitzung beendet. Das Makro für diese Aufgabe lautet:

Abbildung 11.12: Alle Objekte, Methoden und Eigenschaften von Word-VBA

465

Page 466: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Listing 11.6: Eine Word-Sitzung starten und ein Dokument öffnen

Sub WordSitzungStarten()Dim WordApp As Object

Set WordApp = CreateObject("Word.application")

With WordApp.Application.Visible = True.Application.Documents.Open _ ("C:\Eigene Dateien\Brief.doc")

'Beliebige Aktionen durchführen

.ActiveDocument.Close SaveChanges:=False

.Application.QuitEnd With

Set WordApp = NothingEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable. Danach wenden Sie dieFunktion CreateObject an, um eine Word-Sitzung zu eröffnen. Setzen Sie danndie Eigenschaft Visible auf den Wert True, um die neue Word-Sitzung anzuzei-gen. Über die Word-VBA-Methode Open öffnen Sie das Dokument Brief.doc. Nunkönnen beliebige Aktionen im Dokument durchgeführt werden (dazu aber spätermehr). Über die Methode Close schließen Sie das aktive Dokument. Indem Siedas Argument SaveChanges auf den Wert False setzen, sorgen Sie dafür, dass dasDokument direkt geschlossen wird. Eventuelle Änderungen werden somit verwor-fen. Wenden Sie danach die Methode Quit an, um die Word-Sitzung zu beenden.

Abbildung 11.13: Die Sitzung ist gestartet und das Dokument geöff-net.

466

Page 467: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Word-Sitzung übernehmen

Sie haben jetzt einen Makrorahmen, der eine Word-Sitzung startet, ein bestimm-tes Word-Dokument öffnet, dieses danach wieder schließt und im Anschluss darandie Anwendung beendet.

11.8 Word-Sitzung übernehmen

Nicht immer muss aber eine neue Sitzung von Word gestartet werden. Vor allemdann nicht, wenn bereits eine Word-Sitzung eröffnet ist. In dem Fall muss Exceldies erkennen und somit muss diese Sitzung nur noch aktiviert werden.

Im folgenden Beispiel soll geprüft werden, ob eine Word-Sitzung bereits eröffnetwurde. Wenn ja, soll diese Sitzung übernommen und im Anschluss daran einneues Dokument eingefügt werden. Das Makro zur Lösung dieser Aufgabenstel-lung können Sie in Listing 11.7 sehen:

Listing 11.7: Eine Word-Sitzung übernehmen

Sub WordSitzungÜbernehmen()Dim WordApp As ObjectDim WordDok As Object

On Error GoTo SitzungEröffnen Set WordApp = GetObject(, "Word.Application") GoTo weiter

SitzungEröffnen: Set WordApp = CreateObject("Word.Application")

weiter: WordApp.Visible = True

Set WordDok = WordApp.Documents.Add

Set WordApp = Nothing Set WordDok = NothingEnd Sub

Erzeugen Sie zuerst zwei Objektvariablen. Die erste Variable wird dabei dieAnwendung Word verwalten. Die zweite Variable wird ein neues, noch leeresWord-Dokument verwalten. Zunächst einmal sollten Sie überprüfen, ob bereits

467

Page 468: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

eine Applikation in Word gestartet ist. Für diesen Zweck verwenden Sie die Funk-tion GetObject und übergeben ihr die Textfolge Word.application. Kommt esdabei zu einem Fehler, dann ist die Applikation noch nicht begonnen und mussüber die Funktion CreateObject gestartet werden. Über die Methode Add, die Sieauf die Auflistung Documents anwenden, fügen Sie ein neues Dokument ein.

11.9 Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen

In der nächsten Aufgabe soll eine bestimmte Adresse aus einer Excel-Tabelle fürden Briefkopf in Word verwendet werden. Sehen Sie sich dazu einmal die fol-gende Tabelle in Abbildung 11.15 an.

Abbildung 11.14: Die Word-Sitzung wurde übernom-men.

Abbildung 11.15: Die Adressen-tabelle

468

Page 469: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen

Im Zellen-Dropdown-Feld in Zelle A1 können die verfügbaren Namen dynamischausgewählt werden. Daraufhin werden in den Zellen B1 bis E1 die entsprechen-den Informationen aus der darunter liegenden Tabelle geholt. Um das Zellen-Dropdown zu erstellen, gehen Sie wie folgt vor:

1. Setzen Sie den Mauszeiger auf Zelle A1.

2. Wählen Sie aus dem Menü DATEN den Befehl GÜLTIGKEIT.

3. Wählen Sie aus dem Dropdown-Feld ZULASSEN den Befehl LISTE.

4. Geben Sie als Quelle den Zellenbezug an, in dem Ihre Namen in der Tabelleaufgelistet werden.

5. Bestätigen Sie Ihre Einstellung mit OK.

Was jetzt noch fehlt, sind die Formeln in den Zellen B1 bis E1. Entnehmen Siediese der folgenden Tabelle:

Abbildung 11.16: Das Zellen-Dropdown erstellen

Zelle Formel/Funktion

B1 =SVERWEIS($A$1;$A$5:$E$13;2;FALSCH)

C1 =SVERWEIS($A$1;$A$5:$E$13;3;FALSCH)

Tabelle 11.1: Die benötigten Formeln für die Adressen-Tabelle

469

Page 470: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Immer wenn Sie jetzt einen Namen aus dem Zellen-Dropdown in Zelle A1 aus-wählen, sucht Excel die dazugehörigen Adressdaten. Diese sollen jetzt in dasWord-Dokument Brief.doc transferiert werden. Das Makro für diese Aufgabe kön-nen Sie in Listing 11.8 sehen:

Listing 11.8: Eine Adresse aus Excel in einen Word-Brief kopieren

Sub BriefkopfZusammenSetzen()Dim WordApp As ObjectDim Vorname As StringDim Nachname As StringDim Straße As StringDim PLZ As StringDim Ort As String

Sheets("Adressen").ActivateNachname = Range("A1").ValueVorname = Range("B1").ValueStraße = Range("C1").ValuePLZ = Range("D1").ValueOrt = Range("E1").Value

Set WordApp = CreateObject("Word.application")

With WordApp.Application.Visible = True.Application.Documents.Open _ ("C:\Eigene Dateien\Brief.doc")

With WordApp.Selection .WholeStory .Delete .TypeText Text:=Vorname & " " & Nachname .TypeParagraph

D1 =SVERWEIS($A$1;$A$5:$E$13;4;FALSCH)

E1 =SVERWEIS($A$1;$A$5:$E$13;5;FALSCH)

Zelle Formel/Funktion

Tabelle 11.1: Die benötigten Formeln für die Adressen-Tabelle (Forts.)

470

Page 471: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen

.TypeText Text:=Straße .TypeParagraph .TypeText Text:=PLZ & " " & OrtEnd With

.ActiveDocument.Close savechanges:=True

.Application.Quit (True)End With

Set WordApp = NothingEnd Sub

Aktivieren Sie im ersten Schritt die Tabelle in Excel, welche Ihre Adressen enthält.Füllen Sie dann die Variablen, indem Sie die Werte der Zellen A1:E1 übertragen.Danach eröffnen Sie mithilfe der Methode CreateObject eine neue Word-Sitzungund lassen diese anzeigen, indem Sie die Eigenschaft Visible auf den Wert Truesetzen. Öffnen Sie danach über die Methode Open das Dokument Brief.doc.Momentan steht der Textcursor im Dokument ganz links oben. Dies ist für uns dierichtige Position, um nun den Inhalt der Variablen dort einzufügen. Mit derEigenschaft TypeText können Sie einen Text in das Dokument einfügen. Dies nut-zen Sie für die Erstellung der Überschrift. Mit der Methode TypeParagraph fügenSie eine leere Zeile im Dokument ein. Bevor Sie aber die neuen Daten einfügen,sollten Sie eventuell bereits eingefügte Adressen im Dokument löschen. SetzenSie die Methode WholeStory ein, um den Text im Dokument zu markieren, undlöschen diesen direkt im Anschluss, indem Sie die Methode Delete einsetzen.

Abbildung 11.17: Die Adresse wur-de erfolgreich ein-gefügt.

471

Page 472: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

11.10 Ganze Excel-Tabellen in ein Word-Dokument einfügen

Im nächsten Beispiel soll eine Excel-Tabelle in ein neues Word-Dokument über-tragen werden. Dabei sollen die Daten Zelle für Zelle übertragen und anschlie-ßend in eine Word-Tabelle eingefügt werden. Gehen Sie bei dieser Aufgabe vonder Excel-Tabelle in Abbildung 11.18 aus.

Führen Sie nun den Datentransfer durch, indem Sie das folgende Makro starten:

Listing 11.9: Eine Excel-Tabelle Zelle für Zelle in ein Word-Dokument übertragen

Sub ExcelDatenNachWord()Dim WordApp As ObjectDim WordDok As ObjectDim Bereich As VariantDim ExTab As ObjectDim i As IntegerDim x As IntegerDim y As Integer

Sheets("Tabelle1").ActivateBereich = ActiveSheet.UsedRange

Set WordApp = CreateObject("Word.Application")

WordApp.Visible = True

Abbildung 11.18: Die Ausgangs-situation

472

Page 473: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Ganze Excel-Tabellen in ein Word-Dokument einfügen

Set WordDok = WordApp.Documents.Add

With WordApp.Selection .TypeText Text:="Daten aus Excel " .TypeText Text:="vom " & Format(Now(), _ "dd-mmm-yyyy") .TypeParagraphEnd With

Set ExTab = WordDok.Tables.Add _ (WordApp.Selection.Range, _ UBound(Bereich, 1), UBound(Bereich, 2))

With ExTab For x = 1 To UBound(Bereich, 1) For y = 1 To UBound(Bereich, 2) .Cell(x, y).Range.InsertAfter Bereich(x, y) Next y Next xEnd With

Set WordApp = NothingSet WordDok = NothingSet ExTab = NothingEnd Sub

Nachdem Sie den verwendeten Bereich in Ihrer Excel-Tabelle über die Anwei-sung ActiveSheet.UsedRange ermittelt und diesen in einem Datenfeld gespeicherthaben, rufen Sie Ihre Textverarbeitung Word auf. Dabei setzen Sie die FunktionCreateObject ein. Über die Eigenschaft Visible teilen Sie mit, dass die Textverar-beitung auch angezeigt werden soll. Dazu setzen Sie diese Eigenschaft auf denWert True. Erstellen Sie nun mit der Methode Add ein neues Dokument.

Mit der Eigenschaft TypeText können Sie einen Text in das Dokument einfügen.Dies nutzen Sie für die Erstellung der Überschrift. Mit der Methode TypePara-graph fügen Sie eine leere Zeile im Dokument ein. Setzen Sie die Methode Addein, um eine noch leere Tabelle in das Dokument einzufügen, und füllen Siediese Zelle für Zelle, indem Sie das vorher gefüllte Datenfeld schrittweise auslesenund mit der Methode InsertAfter in die Tabelle übertragen.

473

Page 474: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

11.11 Word-Dokumente in einer Excel-Tabelle auflisten

In der nächsten Aufgabe soll ein Verzeichnis nach Word-Dokumenten durchsuchtwerden. Dabei sollen die Namen der Dokumente in eine Excel-Tabelle eingefügtund direkt im Anschluss verlinkt werden. Sie haben dann die Möglichkeit, miteinem Klick auf den jeweiligen Hyperlink das entsprechende Word-Dokument zuöffnen. Diese beiden Arbeitsschritte werden getrennt voneinander ausgeführt. Imersten Makro in Listing 11.10 werden die Namen der gefundenen Word-Doku-mente in eine neue Tabelle geschrieben:

Listing 11.10: Word-Dokumente suchen und in einer Excel-Tabelle dokumentieren

Sub WordDokumenteSuchen()Dim i As IntegerConst verz = "C:\Eigene Dateien\"

Sheets.AddActiveSheet.Name = "Doku"ChDir verz

Abbildung 11.19: Die Excel-Tabelle wurde erfolgreich transferiert.

474

Page 475: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Word-Dokumente in einer Excel-Tabelle auflisten

Range("A1").Select

With Application.FileSearch .NewSearch .LookIn = verz .SearchSubFolders = False .FileType = msoFileTypeWordDocuments .Execute For i = 1 To .FoundFiles.Count ActiveCell.Value = .FoundFiles(i) ActiveCell.Offset(1, 0).Select Next iEnd WithEnd Sub

Zu Beginn des Makros können Sie das zu durchsuchende Verzeichnis in einerKonstanten angeben. Wechseln Sie über die Anweisung ChDir dann direkt in die-ses Verzeichnis. Danach starten Sie die Suche und verwenden dabei das ObjektFileSearch, um die einzelnen Dateien im Verzeichnis zu ermitteln. Auf diesesObjekt können Sie einige Eigenschaften setzen: Die Eigenschaft NewSearch setztalle Suchkriterien auf die Standardeinstellungen zurück. Mithilfe der EigenschaftLookIn geben Sie bekannt, in welchem Verzeichnis die Suche beginnen soll. DieEigenschaft SearchSubFolders bestimmt, ob die Suche auch in Unterverzeichnis-sen fortgesetzt werden soll. In diesem Fall müssen Sie diese Eigenschaft auf den

Abbildung 11.20: Alle gefundenen Word-Dokumente

475

Page 476: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

Wert True setzen. Die Eigenschaft FileType gibt den Typ der Datei in einer Kon-stanten an, nach der gesucht werden soll. Möchten Sie beispielsweise nicht nurWord-Dokumente suchen lassen, sondern alle Dateitypen, dann geben Sie dieKonstante msoFileTypeAllFiles an. Über die Eigenschaft FoundFiles können Sieden Namen der gefundenen Datei abfragen. Schreiben Sie diesen direkt in IhreExcel-Tabelle.

Wandeln Sie jetzt die ermittelten Dokumentnamen in Hyperlinks um. Setzen Siedazu das folgende Makro ein:

Listing 11.11: Hyperlinks einfügen

Sub HyperlinksEinfügen()Sheets("Doku").ActivateRange("A1").SelectDo Until ActiveCell.Value = "" ActiveCell.Hyperlinks.Add ActiveCell, ActiveCell.Value ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Wenden Sie in einer Schleife die Methode Add an, um die einzelnen Hyperlinkseinzufügen. In Kapitel 10 wurde diese Thematik bereits besprochen, sodass an die-ser Stelle nicht näher darauf eingegangen wird.

Abbildung 11.21: Mit einem Klick das entsprechen-de Dokument öffnen

476

Page 477: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

11.12 Fragen & Antworten

F Wie kann ich die fünf billigsten Veranstaltungen einer Access-Tabelle ermittelnund in eine Excel-Tabelle überführen?

A Setzen Sie zu diesem Zweck die SQL-Anweisung TOP ein.

Listing 11.12: Die Top-Werte einer Access-Tabelle übertragen

Sub Top_DatensätzeAnzeigen()Dim ADOC As New ADODB.ConnectionDim DBS As ADODB.RecordsetDim s As String Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With

s = _"SELECT TOP 5 Kosten, Veranstaltung, V_Ort, Vdatum FROM Veranstaltung ORDER BY Kosten"

Set DBS = New ADODB.RecordsetOn Error GoTo fehlerDBS.Open s, ADOC, adOpenKeyset, adLockOptimisticSheets("TOP").ActivateRange("A2").Select

Do While Not DBS.EOF ActiveCell.Value = DBS!Vdatum ActiveCell.Value = _ Format(ActiveCell.Value, "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Veranstaltung ActiveCell.Offset(0, 2).Value = DBS!V_Ort ActiveCell.Offset(0, 3).Value = DBS!Kosten DBS.MoveNext ActiveCell.Offset(1, 0).SelectLoop

DBS.Close

477

Page 478: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

ADOC.Close Set DBS = Nothing Set ADOC = Nothing Exit Subfehler: MsgBox "Es ist ein Fehler aufgetreten!" & _ Chr(13) & Err.DescriptionEnd Sub

Achten Sie darauf, dass Sie in der SQL-Anweisung SELECT die Felder mitübernehmen, auf die Sie später auch zugreifen möchten. Die Sortierungder Liste können Sie über das Schlüsselwort ORDER bestimmen.

F Welche spezielle Möglichkeit habe ich, eine Access-Tabelle in Excel zu importie-ren?

A Wenn Sie das folgende Makro aus Listing 11.13 in Ihre Access-Entwick-lungsumgebung eingeben und starten, dann erfolgt der Transfer in eineExcel-Datei noch schneller:

Listing 11.13: Der Transfer einer Access-Tabelle nach Excel

Sub TabelleNachExcel()DoCmd.OutputTo acOutputTable, _"Veranstaltung", acFormatXLS, _"C:\Eigene Dateien\Veranstaltungen.xls", TrueEnd Sub

Mit Hilfe der Methode OutputTo können Sie die Daten in einem bestimmtenMicrosoft Access-Datenbankobjekt (einem Datenblatt, einem Formular,einem Bericht, einem Modul oder einer Datenzugriffsseite) in verschiedenenFormaten ausgeben. Dabei lautet die Syntax dieser Methode wie folgt:

OutputTo(ObjectType, ObjectName, OutputFormat, OutputFile, AutoStart,TemplateFile)

Abbildung 11.22: Die Top-Werte aus Access zusam-mentragen

478

Page 479: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

Über das Argument ObjectType legen Sie die Art des Access-Objektes fest, des-sen Daten Sie exportieren möchten. Dabei haben Sie folgende Möglichkeiten.

�acOutputForm: Export der Daten eines Formulars

�acOutputFunction: Export einer Function zur Sicherung

�acOutputModule: Export eines kompletten Moduls, inkl. aller Funktionen undMakros

�acOutputQuery: Export der Ergebnisse eine Abfrage

�acOutputReport: Export eines Berichts

�acOutputServerView: Export einer Serveransicht

�acOutputStoredProcedure: Export einer gespeicherten Prozedur

�acOutputTable: Export einer Tabelle

Beim Argument ObjectName geben Sie den Namen des Objektes an, welchesSie exportieren möchten.

Das Argument OutPutFormat legt fest, in welchem Datenformat Sie die Datentransferieren möchten. Die bekanntesten Formate heißen dabei wie folgt:

�acFormatHTML: konvertiert die Daten in das HTML-Format.

�acFormatRTF: konvertiert die Daten in das Rich-Textfile-Format. Dieses For-mat kann beispielsweise sehr gut in Microsoft Word eingelesen werden.

�acFormatTXT: Mit diesem Format ist das Textformat gemeint.

�acFormatXLS: konvertiert die Daten in das Microsoft Excel-Format.

Beim Argument OutputFile geben Sie den Pfad sowie den Dateinamen derDatei an, in welche Sie die Daten transferieren möchten. Dabei muss dieDatei noch nicht vorhanden sein. Access legt diese bei Bedarf selber an.

Mit Hilfe des Arguments AutoStart haben Sie die Möglichkeit die so erstellteExportdatei gleich zu öffnen. Verwenden Sie den Wert True, um die entspre-chende auf Windows basierende Anwendung sofort zu starten. Setzen Sie dasArgument auf den Wert False oder lassen Sie es weg, wenn Sie die Exportdateinicht öffnen möchten.

Das Argument TemplateFile ist dann von Interesse, wenn Sie eine Vorlage bei-spielsweise für die HTML-Datei verwenden möchten. In diesem Fall ist dannder komplette Pfad dieser Vorlagendatei anzugeben.

479

Page 480: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

F Wie kann ich ein Feld einer Access-Tabelle ansprechen, wenn dieses Feld imNamen ein Leerzeichen (z.B: Kosten Kurs) enthält?

A Setzen Sie um dieses Feld eckige Klammern. DBS![Kosten Kurs].

F Wie können Sie einen Teil einer Excel-Tabelle in ein neues Dokument kopieren?

A Erfassen Sie zu diesem Zweck das folgende Makro:

Listing 11.14: Einen Zellenbereich in ein Word-Dokument kopieren

Sub ExcelDatenNachWordKopieren()Dim WordApp As ObjectDim WordDok As ObjectDim Bereich As Range Set WordApp = CreateObject("Word.application")WordApp.Visible = TrueSet WordDok = WordObj.Documents.Add

Set Bereich = Sheets("Übung").Range("A1:C5") Range(Bereich.Address).Copy WordApp.Selection.Paste Application.CutCopyMode = False

Set WordApp = Nothing Set WordDok = NothingEnd Sub

Deklarieren Sie zu Beginn einige Objektvariablen. Eröffnen Sie mithilfeder Funktion CreateObject eine neue Word-Sitzung. Über die MethodeAdd legen Sie danach ein neues, noch leeres Dokument an. Definieren Siein der Objektvariablen Bereich den Bereich auf der Tabelle ÜBUNG, den

Abbildung 11.23: Access-Tabelle wurde erfolgreich nach Excel trans-feriert.

480

Page 481: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

Sie kopieren möchten. Wenden Sie danach die Methode Copy an, um denangegebenen Bereich zu kopieren. Innerhalb dieser Methode geben Siedie genaue Adresse des Zellenbereichs über die Eigenschaft Address an.Mithilfe der Methode Paste holen Sie den kopierten Bereich, der sichmomentan in der Zwischenablage befindet, direkt in Ihr Word-Dokument.Setzen Sie dann die Eigenschaft CutCopyMode auf den Wert False, um dennoch existenten Laufbalken um den kopierten Bereich zu entfernen.Heben Sie am Ende die Objektverweise wieder auf, um den dafür reser-vierten Speicher wieder freizugeben.

F Wie können Sie ein Word-Makro von Excel heraus starten?

A Um diese Aufgabe zu lösen, legen Sie ein neues Word-Dokument(Word.doc) im Verzeichnis C:\Eigene Dateien an und fügen in diesesDokument ein Makro namens WORDMAKRO ein. Starten Sie danach ausIhrer Excel-Entwicklungsumgebung heraus das Makro aus Listing 11.15:

Listing 11.15: Ein Word-Makro starten

Sub WordMakroStarten()Dim WordApp As Object

Set WordApp = CreateObject("Word.Application") WordApp.Visible = True WordApp.Application.Documents.Open _("C:\Eigene Dateien\Word.doc") WordApp.Run "WordMakro"

WordApp.Quit Set WordApp = NothingEnd Sub

Deklarieren Sie im ersten Schritt eine Objektvariable und setzen Sie dieFunktion CreateObject ein, um eine neue Word-Sitzung zu eröffnen.Blenden Sie danach die Word-Sitzung ein, indem Sie der EigenschaftVisible den Wert True zuzuweisen. Öffnen Sie daraufhin das DokumentWord.doc mithilfe der Methode Open. Über die Methode Run starten Sie dasMakro WORDMAKRO. Beenden Sie die Word-Sitzung, indem Sie dieMethode Quit einsetzen. Heben Sie am Ende den Objektverweis wiederauf, um den dafür reservierten Speicher wieder freizugeben.

481

Page 482: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

F Wie können Sie in eine Excel-Tabelle ein Word-Dokument als Symbol einfügen?

A Möchten Sie ein Word-Dokument in eine Excel-Tabelle als Symbol einfü-gen, starten Sie das folgende Makro:

Listing 11.16: Ein Word-Dokument als Symbol einfügen

Sub DokumentObjektEinfügen()Sheets("Übung").ActivateRange("B8").Select

ActiveSheet.OLEObjects.Add _ (Filename:="C:\Eigene Dateien\Brief.doc", Link:= _ False, DisplayAsIcon:=True, IconFileName:= _ "C:\PROGRAMME\MICROSOFT OFFICE 97\OFFICE\WINWORD.EXE", _ IconIndex:=0, _ IconLabel:="C:\Eigene Dateien\Brief.doc").SelectEnd Sub

Über die Methode Add erstellen Sie ein OLE-Objekt. Dabei hat dieseMethode folgende Syntax:

Ausdruck.Add(ClassType, FileName, Link, DisplayAsIcon, IconFile-Name, IconIndex, IconLabel, Left, Top, Width, Height)

Über das Argument ClassType geben Sie den Namen der Anwendungbekannt, die zum Aktivieren des angegebenen OLE-Objekts verwendetwerden soll.

Im Argument FileName geben Sie den Dateinamen inklusive dem Datei-pfad der Datei an, aus der das Objekt erstellt werden soll. Wenn diesesArgument fehlt, wird der aktuelle Ordner verwendet.

Setzen Sie das Argument Link auf den Wert True, um das OLE-Objekt mitder Datei zu verknüpfen, aus der es erstellt wurde. Weisen Sie dem Argu-ment hingegen den Wert False zu, um das OLE-Objekt als separate Kopieder Datei anzulegen. Der Standardwert ist False.

Mit dem Argument DisplayAsIcon können Sie das OLE-Objekt als Symbolanzeigen. Setzen Sie das Argument in diesem Fall auf True, um das Sym-bol anzuzeigen. Der Standardwert ist False.

Unter dem Argument IconFileName müssen Sie die Datei angeben, welchedas anzuzeigende Symbol enthält.

482

Page 483: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

Im Argument IconIndex ist die Indexnummer des Symbols innerhalb vonIconFileName enthalten. Die Reihenfolge der Symbole in der angegebenenDatei entspricht der Reihenfolge, in der die Symbole im Dialogfeld ANDE-RES SYMBOL (Menü EINFÜGEN, Dialogfeld OBJEKT) angezeigt werden,wenn das Kontrollkästchen ALS SYMBOL ANZEIGEN aktiviert ist.

Im Argument IconLabel geben Sie die Beschriftung an, die unter demSymbol angezeigt werden soll.

In den Argumenten Left, Top, Width und Height können Sie die Positionbzw. die Größe angeben, in der das OLE-Objekt in die Tabelle eingefügtwird.

Abbildung 11.24: Word-Dokument wurde als Symbol in die Tabelle ein-gefügt.

483

Page 484: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Excel und Datenzugriffe auf Access und Word

11.13 Quiz

F Warum müssen Sie die ADO-Bibliothek in Ihre Entwicklungsumgebung einbin-den?

F An was muss ich denken, wenn ich über die Methode AddNew einen neuen Daten-satz anlege?

F Welches Argument muss ich einsetzen, wenn ich eine Access-Tabelle vom Endebis zum Anfang durchsuchen möchte?

F Wie heißt die Methode, um in einer Access-Tabelle jeweils zum nächsten Daten-satz zu springen?

F Wie heißt die Funktion, um eine Applikations-Sitzung festzustellen?

F Welche Eigenschaft muss man einsetzen, wenn man eine Applikation starten,diese aber nicht am Bildschirm anzeigen möchte?

F Wie heißt die Methode, um in einem Word-Dokument eine Leerzeile einzufügen?

F Welches Objekt können Sie einsetzen, um nach bestimmten Dateitypen aufIhrem PC zu suchen?

11.14 Übung

1. Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe ACCESS.XLSund wechseln Sie auf die Tabelle ÜBUNG. Schreiben Sie ein Makro, dass alleDatensätze aus der Access-Tabelle VERANSTALTUNG in die Excel-Tabelleüberträgt, die einen Veranstaltungsbeginn nach dem 04.10.2002 haben.

2. Öffnen Sie die Demo-Arbeitsmappe Word.xls und wechseln auf die TabelleÜBUNG. Schreiben Sie ein Makro, welches den Zellenbereich A1:C5 in einneues Dokument kopiert. Dabei sollen die beiden Dateien über die Verknüp-fungseigenschaft miteinander verbunden bleiben.

Die Lösung dieser Aufgaben können Sie im Anhang A nachlesen.

484

Page 485: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

12ogrammieren

Arbeiten an der Oberfläche – Menü- und Symbolleisten

pr

Page 486: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

Am gestrigen Tag haben Sie gelernt, wie Sie innerhalb von Microsoft Office arbei-ten können. Unter anderem haben Sie eine Word-Sitzung von Excel aus gestartetbzw. übernommen. Des Weiteren haben Sie auf Access-Datentabellen zugegriffenund Daten in Excel-Tabellen importiert bzw. exportiert.

Die Themen heute:

� Leistenart identifizieren

� Menüleisten programmieren

� Symbolleisten programmieren

� Kontextmenüs programmieren

Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM inder Arbeitsmappe Leisten.xls im Verzeichnis Kap12.

12.1 Art der Leiste identifizieren

Standardmäßig werden in Excel die Arbeitsblatt-Menüleiste sowie die Symbolleis-ten STANDARD und FORMAT angezeigt. Alle Leisten können über das Objekt Com-mandBars angesprochen werden. Um zu wissen, ob es sich bei der jeweiligen Leisteum eine Symbolleiste, Menüleiste oder gar um ein Kontextmenü handelt, könnenSie die Eigenschaft Type abfragen. Eine Symbolleiste gibt den Wert 0 zurück, eineMenüleiste den Index 1 und ein Kontextmenü den Index 2.

Im nächsten Beispiel listen Sie alle Leisten von Excel in einer Tabelle auf undermitteln über die Eigenschaft Type, ob es sich um Menüleisten, Symbolleistenoder um Kontextmenüs handelt. Das Makro für diese Aufgabe sehen Sie nachfol-gend:

Listing 12.1: Leisten anhand ihres Typs identifizieren

Sub ArtenVonLeisten()Dim i As IntegerDim s As String

Sheets.AddRange("A1").Select

486

Page 487: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Art der Leiste identifizieren

For i = 1 To CommandBars.Count Select Case CommandBars(i).Type Case 0 s = "Symbolleiste" Case 1 s = "Menüleiste" Case 2 s = "Kontextmenü" Case Else s = "nicht ermittelbar" End Select

ActiveCell.Value = i ActiveCell.Offset(0, 1).Value = CommandBars(i).Name ActiveCell.Offset(0, 2).Value = s ActiveCell.Offset(1, 0).Select Next i

Columns("A:C").AutoFitEnd Sub

Ermitteln Sie im Makro aus Listing 12.1 im ersten Schritt alle vorhandenen Leis-ten von Excel, indem Sie diese mithilfe der Methode Count zählen. Über dieEigenschaft Type geben Sie die Art der Befehlsleiste zurück. Entnehmen Sie diemöglichen Konstanten bzw. Indexwerte der nächsten Tabelle:

Über die Eigenschaft Name können Sie den Namen der Befehlsleiste ermitteln. Ver-teilen Sie diese Informationen in die Spalten A–C. Mithilfe der Methode AutoFitkönnen Sie dafür sorgen, dass die Spaltenbreiten automatisch eingestellt werden.

Index Konstante Leiste

0 msoBarTypeNormal Symbolleiste

1 msoBarTypeMenuBar Menüleiste

2 msoBarTypePopup Kontextmenü

Tabelle 12.1: Die möglichen Typen von Befehlsleisten

487

Page 488: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

Wie Sie sehen, hat die Arbeitsblatt-Menüleiste beispielsweise den Index 1, d.h.,über diesen Index können Sie diese Menüleiste ansprechen, wie es im nächstenAbschnitt durchgeführt wird.

12.2 Menüleisten programmieren

Wenn es um die Programmierung von Menüleisten geht, dann wird in den meis-ten Fällen die bereits standardmäßig eingeblendete Arbeitsblatt-Menüleiste ange-passt. Dabei haben Sie die Möglichkeit, neue Menübefehle in bereits bestehendeMenüs einzufügen bzw. ein neues Menü innerhalb der Arbeitsblatt-Menüleisteanzubieten. Des Weiteren können Sie bestimmte Menübefehle bei Bedarf deakti-vieren oder gar die ganze Menüleiste temporär aus- bzw. wieder einblenden.

Abbildung 12.1: Leisten identifizieren

488

Page 489: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Menüleisten programmieren

Arbeitsblatt-Menüleiste ein- und ausblenden

Die Arbeitsblatt-Menüleiste werden Sie dann kurzfristig ausblenden, wenn Sie beider Arbeit mit Excel möglichst viel »Bildschirmplatz« benötigen, wie z.B. bei derDatenerfassung.

Im Beispiel in Listing 12.2 wird die Arbeitsblatt-Menüleiste ausgeblendet:

Listing 12.2: Die Arbeitsblatt-Menüleiste ausblenden

Sub ArbeitsblattMenüleisteAusblenden() Application.CommandBars(1).Enabled = FalseEnd Sub

Die Arbeitsblatt-Menüleiste wird durch das CommandBars-Objekt mit dem Index 1eindeutig identifiziert. Setzen Sie die Eigenschaft Enabled dieser Menüleiste aufden Wert False, um diese auszublenden.

Um die Arbeitsblatt-Menüleiste wieder einzublenden, setzen Sie dieEigenschaft Enabled dieser Menüleiste auf den Wert True.

Übrigens können Sie die Arbeitsblatt-Menüleiste auch über ihrenNamen ansprechen. Die Namen der einzelnen Leisten können Sie inAbbildung 12.1 nachsehen.

Im folgenden Makro wird die Arbeitsblatt-Menüleiste über ihren Namen ausge-blendet:

Abbildung 12.2: Die Arbeitsblatt-Menüleiste wurde ausgeblendet.

489

Page 490: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

Listing 12.3: Die Arbeitsblatt-Menüleiste über den Namen ansprechen

Sub ArbeitsblattMenüleisteAusblendenVar02() Application.CommandBars("Worksheet Menu Bar").Enabled _ = FalseEnd Sub

Neue Menüs einfügen und löschen

Im nächsten Beispiel soll ein zusätzliches Menü in die Arbeitsblatt-Menüleisteintegriert werden. Die Position des neuen Menüs soll dabei genau vor dem Hilfe-Menü (?) sein. Starten Sie zu diesem Zweck dieses Makro:

Listing 12.4: Ein neues Menü einfügen

Sub MenüAnfügen()Dim i As IntegerDim i_Hilfe As IntegerDim MenüNeu As CommandBarControl

i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index

Set MenüNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ Before:=i_Hilfe, Temporary:=True) MenüNeu.Caption = "TO&OLS"End Sub

Deklarieren Sie eine Objektvariable vom Typ CommandBarControl, um den neuenMenüpunkt später einzufügen. Mithilfe der Methode Count zählen Sie die Anzahlder Menüs in der Arbeitsblatt-Menüleiste. Ermitteln Sie danach die Position desHilfe-Menüs, welches standardmäßig ganz rechts in der Arbeitsblatt-Menüleistesteht. Die Arbeitsblatt-Menüleiste können Sie direkt über das Objekt Command-Bars(1) ansprechen. Mithilfe der Eigenschaft Controls können Sie alle Steuerele-mente der Arbeitsblatt-Menüleiste abfragen.

Wenden Sie die Methode Add an, um ein neues Menü vor dem Hilfemenü einzu-fügen. Die Methode Add hat die Syntax:

Add(Type, Id, Before, Temporary)

490

Page 491: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Menüleisten programmieren

Das Argument Type legt die Art des Steuerelements über eine Konstante fest, dieSie in Tabelle 12.2 sehen können.

Über das Argument ID haben Sie die Möglichkeit, neben dem Menütext auchnoch ein Symbol anzuzeigen. Jede ID in Excel ist mit einem ganz bestimmtenSymbol vorbelegt, dazu aber später mehr. Mithilfe des Arguments Before gebenSie die genaue Position des Menüs an. Diesem Argument übergeben Sie die vor-her ermittelte Position des Hilfe-Menüs. Über das Argument Temporary könnenSie bestimmen, ob das Steuerelement »temporär« angelegt werden soll. Wenn Siedieses Argument auf den Wert True setzen, wird das Steuerelement beim Beendenvon Excel wieder gelöscht.

Das kaufmännische Und-Zeichen im Makro aus Listing 12.4 wird hiergenau vor dem Buchstaben O eingefügt. Dies bedeutet, dass Sie dasneue Menü auch über die Tastenkombination (Alt) + (O) aktivierenkönnen. Im Menü wird der so gekennzeichnete Buchstabe unterstri-chen. Achten Sie dabei darauf, dass der ausgewählte Buchstabe nichtschon in einem anderen Menü verwendet wird.

Konstante Beschreibung

msoControlButton Über diese Konstante wird eine Schaltfläche eingefügt.

msoControlEdit Über diese Konstante wird ein Eingabefeld eingefügt.

msoControlDropdown Mithilfe dieser Konstante wird ein Dropdown-Feld eingefügt.

msoControlComboBox Über diese Konstante wird ein Combobox-Feld eingefügt.

msoControlPopup Mithilfe dieser Konstanten wird ein Dropdown-Menü eingefügt.

Tabelle 12.2: Die möglichen Steuerelemente für Leisten

Abbildung 12.3: Das neue Menü wurde angelegt.

491

Page 492: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

Möchten Sie das neu eingefügte Menü wieder aus der Arbeitsblatt-Menüleiste ent-fernen, wenden Sie die Methode Delete an. Sehen Sie sich dazu das folgendeMakro an:

Listing 12.5: Ein Menü löschen

Sub MenüLöschen()On Error Resume Next With Application.CommandBars(1) .Controls("TO&OLS").Delete End WithEnd Sub

Die On-Error-Anweisung wird hier eingesetzt, um einen Makroabsturz zu verhin-dern, wenn versucht wird, das Menü TOOLS zu löschen, dieses jedoch gar nichtmehr existiert.

Menübefehle einfügen

Das gerade neu angelegte Menü TOOLS enthält noch keine Menübefehle. Diesholen Sie jetzt nach, indem Sie das Makro aus Listing 12.4 erweitern. Dabei sollder Menübefehl Formeln—> Festwerte eingefügt werden.

Listing 12.6: Einen Menübefehl einfügen

Sub MenüEinfügenUndFüllen()Dim i As IntegerDim i_Hilfe As IntegerDim MenüNeu As CommandBarControlDim MB As CommandBarControl

i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index

Set MenüNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ before:=i_Hilfe, Temporary:=True) MenüNeu.Caption = "TO&OLS"

Set MB = MenüNeu.Controls.Add _ (Type:=msoControlButton)

492

Page 493: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Menüleisten programmieren

With MB .Caption = _ "Formeln ---> Fe&stwerte" .Style = msoButtonIconAndCaption .OnAction = "FormelnInFestwerteWandeln" .FaceId = 350 .BeginGroup = True End WithEnd Sub

Um den Menübefehl im Menü TOOLS einfügen zu können, brauchen Sie eineObjektvariable vom Typ CommandBarControl. Setzen Sie die Methode Add ein, umden neuen Menübefehl dem Menü TOOLS hinzuzufügen.

Mit der Eigenschaft Caption bestimmen Sie die Beschriftung des Menübefehls.Das kaufmännische Zeichen & wird hierbei eingesetzt, um den Shortcut für die-sen Befehl zu bestimmen. Bei aufgeklapptem Menü TOOLS können Sie durch dieEingabe des Shortcut-Buchstabens den Menübefehl aktivieren.

Mithilfe der Eigenschaft FaceId können Sie dem Menübefehl auch noch ein Sym-bol hinzufügen. Dabei dürfen Sie aber nicht vergessen, dass hierzu die EigenschaftStyles mit der Konstante msoButtonIconAndCaption angegeben werden muss. Wieaber sollen Sie wissen, welches Symbol hinter welcher FaceId steckt? Diese Fragewird zu einem späteren Zeitpunkt noch ausführlich beantwortet.

Möchten Sie mehrere Befehle optisch schöner darstellen, können Sie über dieEigenschaft BeginGroup einen horizontalen Trennstreifen unter den jeweiligenMenübefehl setzen lassen. Damit können Sie Menübefehle, die funktionsgemäßzusammengehören, von anderen Menübefehlen absondern.

Über die Eigenschaft OnAction geben Sie den Namen des Makros an, welches aus-geführt werden soll, wenn der Anwender den Menübefehl auswählt. Erfassen Sienun das Makro, welches die Formeln einer Tabelle in Festwerte wandelt:

Abbildung 12.4: Der erste Menü-befehl wurde ein-gefügt.

493

Page 494: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

Listing 12.7: Alle Formelzellen in Festwert-Zellen wandeln

Sub FormelnInFestwerteWandeln()Dim zelle As Range

For Each zelle In ActiveSheet.UsedRange zelle.Value = zelle.ValueNext zelle

End Sub

Über die Eigenschaft UsedRange ermitteln Sie den verwendeten Bereich einerTabelle. Durchlaufen Sie in einer Schleife alle Zellen dieses Bereiches und ersetzenSie die Formeln, indem Sie die Anweisung zelle.Value = zelle.Value einsetzen.

12.3 Symbolleisten programmieren

Als Nächstes gehen Sie an die Programmierung von Symbolleisten heran. Auchdies wird kein Problem für Sie darstellen.

Neue Symbolleiste anlegen

Wie auch schon bei der Vorgehensweise bezüglich der Menüleiste werden Sienun Schritt für Schritt zuerst eine Symbolleiste anlegen und danach die nochleere Symbolleiste mit Symbolen füllen.

Legen Sie im nächsten Beispiel in Listing 12.8 eine neue Symbolleiste an undgeben Sie dieser den Namen FUNKTIONEN:

Listing 12.8: Eine neue, noch leere Symbolleiste anlegen

Sub NeueSymbolleisteAnlegen()Dim SB As CommandBar

On Error Resume Next Set SB = CommandBars.Add("FUNKTIONEN")

With SB

494

Page 495: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Symbolleisten programmieren

.Visible = True .Top = 150 .Left = 80 End WithEnd Sub

Über die Methode Add fügen Sie eine neue Symbolleiste ein. Setzen Sie die Eigen-schaft Visible auf den Wert True, damit die Symbolleiste auf dem Bildschirmangezeigt wird. Über die Eigenschaften Top und Left legen Sie die Einfügeposi-tion (linke obere Ecke) fest.

Um eine Symbolleiste wieder zu entfernen, starten Sie das Makro wie folgt:

Listing 12.9: Eine Symbolleiste löschen

Sub SymbolleisteLöschen()Dim SB As CommandBar

Set SB = CommandBars("FUNKTIONEN") On Error Resume Next SB.DeleteEnd Sub

Definieren Sie im ersten Schritt mithilfe der Anweisung Set, welche SymbolleisteSie löschen möchten. Zum Löschen einer Symbolleiste wenden Sie die MethodeDelete an. Denken Sie daran, die Anweisung On Error Resume Next vor denLöschbefehl zu integrieren. Damit sorgen Sie dafür, dass das Makro nicht abstürzt,wenn versucht wird, die bereits gelöschte Symbolleiste erneut zu löschen.

Abbildung 12.5: Die neue Symbol-leiste wurde ange-legt.

495

Page 496: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

Symbole integrieren

Kommen wir nun zur nächsten Aufgabe. Es sollen Symbole in die neu angelegteSymbolleiste integriert werden.

Jedes einzelne Symbol in Excel hat eine eindeutige Kennzeichnung. Die FaceId-Eigenschaft bestimmt dabei das Aussehen, jedoch nicht die Funktion einerBefehlsleisten-Schaltfläche.

Um einen Überblick über die Vielfalt der Symbole in Excel zu bekommen, erstel-len Sie im nachfolgenden Makro eine neue Symbolleiste mit dem Namen SYM-BOLE und fügen die ersten 500 Symbole in diese Symbolleiste ein. Die FaceID-Nummer soll dabei als Quickinfo für jedes einzelne Symbol angezeigt werden.

Listing 12.10: Die Symbole mit der FaceId anzeigen

Sub FaceIdsErmitteln()Dim symb As CommandBarDim Icon As CommandBarControlDim i As Integer

On Error Resume NextSet symb = Application.CommandBars.Add _ ("Symbole", msoBarFloating)

For i = 1 To 500 Set Icon = symb.Controls.Add(msoControlButton) Icon.FaceId = i Icon.TooltipText = iNext isymb.Visible = TrueEnd Sub

Mithilfe der Methode Add fügen Sie jeweils ein Symbol in die Symbolleiste SYM-BOLE ein. Da es sich um ein Symbol handelt, muss dabei die Konstante msoCont-rolButton mit angegeben werden. Die Eigenschaft FaceId bestimmt das Aussehendes Symbols. Über die Eigenschaft ToolTipText können Sie diese FaceId alsQuickinfo anzeigen lassen. Mithilfe der Eigenschaft Visible zeigen Sie die Sym-bolleiste am Bildschirm an. Setzen Sie dazu diese Eigenschaft auf den Wert True.

Wenn Sie mit der Maus über ein Symbol streichen, wird die FaceId des Symbolsangezeigt.

496

Page 497: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Symbolleisten programmieren

Möchten Sie nicht das Aussehen, sondern die Funktion eines Symbols nützen,dann müssen Sie wissen, welche ID zu welchem Symbol gehört. Im Makro in Lis-ting 12.11 wird die Symbolleiste STANDARD untersucht. Jedes Symbol wird dabeiangesteuert und dessen Bezeichnung sowie dessen ID in eine neue Tabellegeschrieben. Das Makro für diese Aufgabe lautet:

Listing 12.11: Die IDs für die einzelnen Symbole herausschreiben

Sub IDsErmitteln()Dim symb As CommandBarDim Icon As CommandBarControl

Sheets.AddRange("A1").SelectOn Error Resume Next

Set symb = Application.CommandBars("Standard")

Abbildung 12.6: Die verfügbaren Symbole mit FaceId anzeigen

497

Page 498: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

For Each Icon In symb.Controls ActiveCell.Value = Icon.TooltipText ActiveCell.Offset(0, 1).Value = Icon.ID ActiveCell.Offset(1, 0).SelectNext IconColumns("A:B").AutoFitEnd Sub

Mithilfe der Eigenschaft ToolTipText können Sie den Text ermitteln, der in derQuickInfo des angegebenen Befehlsleisten-Steuerelements angezeigt wird. Überdie Eigenschaft ID können Sie die integrierte Aktion für dieses Steuerelementabfragen.

Kommen wir nun auf unsere Symbolleiste FUNKTIONEN zurück, die momentannoch leer ist. Fügen Sie in diese Symbolleiste zwei Symbole ein:

� ein benutzerdefiniertes Symbol mit der FaceId 350 und dem Quickinfo-TextFormeln —> Festwerte

� das bereits standardmäßig zur Verfügung stehende Symbol SPEICHERN, wel-ches Sie über die ID 3 ansprechen können

Abbildung 12.7: Die ID für ein Symbol bestim-men

498

Page 499: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Symbolleisten programmieren

Das Makro zum Lösen dieser Aufgabe sieht wie folgt aus:

Listing 12.12: Eine Symbolleiste mit Symbolen bestücken

Sub NeueSymbolleisteAnlegenUndFüllen()Dim SB As CommandBarDim icon As CommandBarControl

On Error Resume Next Set SB = CommandBars.Add("FUNKTIONEN")

With SB .Visible = True .Top = 150 .Left = 80 End With

Set icon = SB.Controls.Add(msoControlButton) With icon .FaceId = 350 .TooltipText = "Formeln ---> Festwerte" .OnAction = "FormelnInFestwerteWandeln" End With

Set icon = SB.Controls.Add(msoControlButton, ID:=3) With icon .TooltipText = "Mappe speichern" End WithEnd Sub

Der Unterschied beim Einfügen der beiden Symbole besteht darin, dass beim ers-ten Symbol noch das Makro angegeben werden muss, welches dem Symbol zuge-wiesen werden soll. Ebenso wird das Aussehen nach eigenem Wunsch über dieEigenschaft FaceId festgelegt.

Beim zweiten Symbol greifen Sie auf ein Standardsymbol zurück, bei dem dasAussehen bereits festgelegt ist. Geben Sie daher schon bei der Anlage über dieMethode Add als Argument die ID an.

499

Page 500: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

12.4 Kontextmenüs programmieren

Ein Kontextmenü wird dann automatisch heruntergeklappt, wenn Sie mit derrechten Maustaste auf ein beliebiges Excel-Objekt klicken. Ein Kontextmenü ent-hält dann die wichtigsten Befehle zu dem angeklickten Objekt.

Das am meisten eingesetzte Kontextmenü ist das Zellen-Kontextmenü, welchesüber das Objekt CommandBars("Cell") angesprochen werden kann. Aus diesemGrund werden wir uns auf dieses wichtige Kontextmenü beschränken.

Zellen-Kontextmenü erweitern

Wenn Sie sich das Zellen-Kontextmenü einmal ansehen, dann sehen Sie, dass diewichtigsten Befehle für die Zelle schon darin enthalten sind. Trotzdem könnenSie weitere Befehle in das Kontextmenü einfügen.

Im nächsten Beispiel werden Sie dem Zellen-Kontextmenü eine neue Funktionhinzufügen. Bei dieser Funktion wird, wie schon bei der Menüleiste sowie derSymbolleiste besprochen, die Funktion FormelnInWertwerteWandeln eingefügt.

Listing 12.13: Das Zellenkontextmenü erweitern

Sub ZellenkontextmenüErgänzen()Dim MB As CommandBarControl

Set MB = Application.CommandBars("Cell").Controls.Add

With MB .Caption = "Formeln --> Festwerte"

Abbildung 12.8: Zwei unterschied-liche Arten von Symbolen einfü-gen

500

Page 501: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Kontextmenüs programmieren

.OnAction = "FormelnInFestwerteWandeln" .FaceId = 350 End WithEnd Sub

Wenden Sie die Methode Add an, um dem Kontextmenü einen weiteren Menü-befehl hinzuzufügen. Über die Eigenschaft Caption können Sie den Menübefehlbeschriften. Die Eigenschaft OnAction sagt aus, welches Makro bei der Auswahldes Kontext-Menübefehls gestartet werden soll. Mithilfe der Eigenschaft FaceIdkönnen Sie dem Menübefehl ein zusätzliches Symbol hinzufügen. Über dieEigenschaft BeginGroup können Sie einzelne Menübefehle gruppieren. Indem Siediese Eigenschaft auf den Wert True setzen, sorgen Sie dafür, dass ein horizontalerTrennstreifen im Kontextmenü eingefügt wird.

Kontextmenübefehle entfernen

Mithilfe der Methode Delete können Sie einzelne Menübefehle aus dem Kontext-menü wieder löschen. Entfernen Sie nun den Kontextmenübefehl Fomeln —>Festwerte, den Sie vorher dem Kontextmenü hinzugefügt haben. Starten Sie zudiesem Zweck das folgende Makro:

Abbildung 12.9: Das Kontext-menü erweitern

501

Page 502: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

Listing 12.14: Einen Kontextmenübefehl löschen

Sub ZellenkontextmenüBefehleLöschen()Dim Menü As CommandBar

Set Menü = Application.CommandBars("Cell") On Error Resume Next With Menü .Controls("Formeln --> Festwerte").Delete End WithEnd Sub

Geben Sie mithilfe der Anweisung Set bekannt, auf welche Leiste Sie zugreifenmöchten. Danach sorgen Sie über die Anweisung On Error Resume Next dafür, dasses zu keiner Fehlermeldung kommt, wenn versehentlich versucht wird, den Kon-textmenübefehl zweimal hintereinander zu löschen. Wenden Sie die MethodeDelete an, um den Kontextmenübefehl zu löschen. Greifen Sie dabei auf die Eigen-schaft Controls zurück und geben Sie die Beschriftung des Befehls an.

12.5 Fragen & Antworten

F Wie können Sie ein komplettes Menü deaktivieren?

A Im folgenden Makro aus Listing 12.15 wird das Menü TOOLS deaktiviert:

Listing 12.15: Ein Menü deaktivieren

Sub KomplettesMenüDeaktivieren()On Error Resume Next Application.CommandBars(1).Controls("TO&OLS").Enabled _ = FalseEnd Sub

Mithilfe der Anweisung CommandBars(1) haben Sie Zugriff auf die Arbeits-blatt-Menüleiste. Über die Eigenschaft Controls geben Sie an, welchesMenü Sie dort genau deaktivieren möchten. Setzen Sie die EigenschaftEnabled für dieses Menü auf den Wert False, um es zu deaktivieren.

Setzen Sie die Eigenschaft Enabled für dieses Menü auf den Wert True, umes wieder zu aktivieren.

502

Page 503: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

F Wie können Sie eine Symbolleiste vor Veränderungen schützen?

A Sie können Symbolleisten jeder Zeit anpassen, d.h. Sie können neue Sym-bole in die Symbolleiste aufnehmen oder Symbole aus den Leisten heraus-nehmen. Weiter können Sie die Position von Symbolleisten auf demBildschirm frei bestimmen. Möchten Sie all dies verhindern, so haben Siedie Möglichkeit, Ihre Symbolleisten zu schützen. Im nächsten Makro inListing 12.16 wird die Symbolleiste STANDARD geschützt:

Listing 12.16: Die Symbolleiste Standard schützen

Sub SymbolleisteSchützen()With Application.CommandBars("Standard") .Protection = _ msoBarNoChangeVisible + msoBarNoCustomize .Visible = TrueEnd WithEnd Sub

Über die Eigenschaft Protection können Sie Ihre Symbolleisten schützen.Die Konstante msoBarNoChangeVisible sorgt dafür, dass die Symbolleistenicht im Kontextmenü erscheint, wenn Sie mit der rechten Maustaste aufeine beliebige Symbolleiste klicken. Über die Konstante msoBarNoCusto-mize können Sie ein Anpassen der Symbolleiste verhindern. Es könnendanach keine neuen Symbole hinzugefügt bzw. Symbole aus der Symbol-leiste herausgelöscht werden.

F Wie können Sie das Aufklappen des Kontextmenüs verhindern, wenn Sie mit derrechten Maustaste auf eine Symbolleiste klicken?

A Das Aufklappen dieses Kontextmenüs verhindern Sie, indem Sie dieAnweisung Application.CommandBars("Toolbar list").Enabled = Falseeinsetzen.

Abbildung 12.10: Das Menü Tools wurde deaktiviert.

503

Page 504: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren

F Wie können Sie das Aufklappen des Kontextmenüs verhindern, wenn Sie mit derrechten Maustaste auf die Registerkarte (unten) einer Tabelle klicken?

A Das Aufklappen dieses Kontextmenüs verhindern Sie, indem Sie dieAnweisung Application.CommandBars("Ply").Enabled = False einsetzen.

F Wie können Sie das Zellen-Kontextmenü von Excel auf den ursprünglichenZustand zurücksetzen?

A Dazu bedarf es nur eines einzigen Befehls. Dieser Befehl lautet: Applica-tion.CommandBars("Cell").Reset.

12.6 Quiz

F Wie lautet die Eigenschaft, die das Aussehen eines Symbols bestimmt?

F Wie lautet die Eigenschaft, die die Funktion eines Symbols bestimmt?

F Über welche Eigenschaft wird die Beschriftung eines Menübefehls festgelegt?

12.7 Übung

Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Leisten.xls.Schreiben Sie ein Makro, welches die Menübefehle SPEICHERN und SPEICHERNUNTER im Menü DATEI deaktiviert.

Die Lösung dieser Aufgabe können Sie im Anhang A nachlesen.

504

Page 505: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

13utomatisieren

Dialoge entwerfen, mit Steuerelementen

bestücken und a

Page 506: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Am gestrigen Tag haben Sie gelernt, wie Sie Menüleisten programmieren können.Dabei haben Sie neue Menüs und Menübefehle eingefügt und wieder entfernt.Des Weiteren haben Sie Symbolleisten erstellt und Kontextmenüs programmiert.

Die Themen heute:

� Was sind UserForms?

� UserForms entwerfen

� UserForms programmieren

Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM inder Arbeitsmappe UserForm.xls im Verzeichnis Kap13.

13.1 Was sind UserForms?

Als UserForms werden in Excel Dialoge bezeichnet, die Sie selbst entwerfen, mitSteuerelementen bestücken und automatisieren können. Dabei stehen Ihnenunter anderem Steuerelemente wie Eingabe- und Textfelder, Listenfelder, Kombi-nationslistenfelder, Optionsschaltflächen, Kontrollkästchen zur Verfügung. Mit-hilfe von Dialogen können Sie anwenderfreundliche Lösungen realisieren, beidenen Sie z.B. Daten erfassen und abfragen können.

Heute werden Sie ein Vokabel-Lernprogramm entwerfen und programmieren.Dabei sollen u.a. folgende Funktionen integriert werden:

� Eingabe von Vokabeln (Deutsch-Englisch)

� Einordnen der Vokabeln in Kategorien (Sustantiv, Verb oder Adjektiv)

� Einfügen dieser Vokabeln in die UserForm über einen Zufallsgenerator

� Abfrage der eingegebenen Übersetzungen und Kontrollanzeige

� Auf Klick sollen jeweils drei neue Vokabeln in der UserForm angezeigt werden

Dieses Vokabel-Lernprogramm werden Sie nun Schritt für Schritt erstellen.

506

Page 507: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

UserForms entwerfen

13.2 UserForms entwerfen

Im ersten Schritt werden Sie zunächst eine UserForm einfügen und mit Steuerele-menten bestücken. Um die erste UserForm einzufügen, verfahren Sie wie folgt:

1. Wechseln Sie in die Entwicklungsumgebung von Excel.

2. Wählen Sie aus dem Menü EINFÜGEN den Befehl USERFORM.

Standardmäßig ist die neu eingefügte UserForm recht klein. Diese können Sie ver-größern, indem Sie mit der linken Maustaste auf die rechte, untere Ecke klickenund die UserForm in der gewünschten Größe nach schräg unten aufziehen.

Der Titel für die UserForm, der in der Titelleiste oberhalb der UserForm steht,wird abgeleitet vom Namen der UserForm. Um einen anderen Titel einzustellen,setzen Sie den Mauszeiger im Eigenschaftenfenster in das Feld CAPTION undschreiben den gewünschten Titel dort hinein.

Nachdem Sie die erste UserForm eingefügt haben, wird die Symbolleiste WERK-ZEUGSAMMLUNG eingeblendet. Diese Werkzeugsammlung nutzen Sie, um dennoch leeren Dialog mit Elementen zu füllen.

Entnehmen Sie der folgenden Tabelle die wichtigsten Steuerelemente der Sym-bolleiste WERKZEUGSAMMLUNG.

Abbildung 13.1: Die erste User-Form einfügen

507

Page 508: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Symbol Funktionsbeschreibung

Über dieses Symbol wird das entsprechende Element in der UserForm mar-kiert.

Über dieses Symbol erfassen Sie Texte in UserForm.

Über dieses Symbol fügen Sie Eingabefelder ein.

Über dieses Symbol wird ein Kombinationsfeld eingefügt. Mit einem Klick auf das Pfeilsymbol werden Ihnen weitere Auswahlmöglichkeiten angeboten. In einem Kombinationsfeld kann immer nur ein Eintrag gewählt werden.

Über dieses Symbol wird ein Listenfeld eingefügt. Das Listenfeld benötigt jedoch mehr Platz in Ihrer UserForm, weil mehrere Einträge gleichzeitig angezeigt werden. Sind mehr Einträge im Listenfeld vorhanden, als ange-zeigt werden können, dann wird dynamisch eine vertikale Steuerungsleiste eingebunden.

Über dieses Symbol wird ein Rahmen in Ihre UserForm eingefügt. Das Rah-men-Steuerelement können Sie einsetzen, um einzelne Elemente in einer Gruppe zusammenzufassen. Wichtig bei der Erstellung eines Rahmens ist, dass dieser vor den einzelnen Steuerelementen, die darin platziert werden sollen, eingefügt wird.

Über dieses Symbol können Sie Kontrollkästchen einfügen. Bei aktiviertem Zustand erscheint im Kästchen ein Häkchen. Wenn Sie Kontrollkästchen in einer Gruppe verwenden, können sowohl eines als auch mehrere Kontroll-kästchen aktiviert sein.

Über dieses Symbol fügen Sie ein Optionsfeld ein. Bei aktiviertem Zustand ist das Optionsfeld mit einem schwarzen Punkt ausgefüllt. Wenn Sie mehrere Optionsfelder innerhalb einer Gruppe verwenden, kann immer nur eine Option aktiviert sein.

Über dieses Symbol fügen Sie ein Umschaltfeld ein. Über dieses Umschalt-feld können Sie beispielsweise zwei Funktionen in nur einem Steuerele-ment unterbringen (z.B. Gitternetz ein/Gitternetz aus).

Über dieses Symbol fügen Sie Befehlsschaltflächen ein, die Sie später dann mit Makros bestücken.

Tabelle 13.1: Die wichtigsten Steuerelemente für UserForms

508

Page 509: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

UserForms entwerfen

Weitere Steuerelemente können Sie jederzeit einblenden, indem Siemit der rechten Maustaste auf die Symbolleiste klicken und aus demKontextmenü den Befehl ZUSÄTZLICHE STEUERELEMENTE auswählen.Im Listenfeld VERFÜGBARE STEUERELEMENTE können Sie dann zusätz-liche Steuerelemente per Mausklick Ihrer Symbolleiste hinzufügen.

Ein Steuerelement können Sie in Ihre UserForm einfügen, indem Sie dasgewünschte Steuerelement mit der linken Maustaste in der Symbolleiste WERK-ZEUGSAMMLUNG anklicken und in der gewünschten Größe und Position auf IhrerUserForm aufziehen.

Fügen Sie nun für die Erfassung der Vokabeln einige Steuerelemente ein. Orien-tieren Sie sich dabei an der folgenden Abbildung 13.2.

Fangen Sie beim Einfügen der Steuerelemente immer mit den Gruppenfeldern(= Steuerelement RAHMEN) an. Danach legen Sie weitere Steuerelemente in dasGruppenfeld hinein.

Über dieses Symbol fügen Sie ein oder mehrere Register in Ihre UserForm ein. Damit können Sie Platz sparend viel Information in einer einzigen UserForm unterbringen.

Über dieses Symbol werden Scroll-Elemente eingefügt. Dieses Steuerele-ment verwenden Sie bei größeren UserForms, wenn Sie horizontal oder auch vertikal scrollen müssen, um bestimmte Elemente anzuzeigen.

Über dieses Symbol fügen Sie ein Drehfeld ein. Über ein Drehfeld können Sie beispielsweise Zahlen schrittweise erhöhen. Das Steuerelement wird meist in Verbindung mit einem Textfeld verwendet, in dem dann das Ergeb-nis des Schrittes angezeigt wird.

Über dieses Symbol können Sie Grafiken, Logos oder Bilder in Ihre User-Form einfügen.

Über dieses Symbol können Sie über ein Eingabefeld einen Bereich markie-ren bzw. auch eigene Texte eingeben und an die UserForm übergeben.

Symbol Funktionsbeschreibung

Tabelle 13.1: Die wichtigsten Steuerelemente für UserForms (Forts.)

509

Page 510: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Bilder in UserForms einfügen

Um ein Bild in eine UserForm zu integrieren, so wie Sie es in Abbildung 13.2sehen können, gehen Sie wie folgt vor:

1. Klicken Sie in der Symbolleiste WERKZEUGSAMMLUNG auf das SymbolANZEIGE.

2. Ziehen Sie dieses Steuerelement in der gewünschten Größe auf Ihrer User-Form auf.

3. Setzen Sie im Eigenschaftenfenster den Mauszeiger in das Feld PICTURE.

4. Klicken Sie auf das Symbol mit den drei Punkten, welches ganz rechts im FeldPICTURE steht.

5. Weisen Sie im Dialogfeld BILD LADEN die gewünschte Bilddatei zu und kli-cken auf die Schaltfläche ÖFFNEN.

Das Bild wird nun direkt in die UserForm kopiert. Momentan wird das Bild nochim umrahmten Zustand dargestellt, was in den meisten Fällen nicht sehr schönaussieht. Setzen Sie daher den Mauszeiger im Eigenschaftenfenster in das FeldBORDERSTYLE und wählen aus dem Dropdown den Befehl 0 – FMBORDERSTYLE-NONE.

Abbildung 13.2: Die UserForm zum Erfassen der Vokabeln

510

Page 511: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

UserForms entwerfen

Horizontale Trennstreifen einfügen

Wenn Sie sich Abbildung 13.2 ansehen, entdecken Sie direkt oberhalb der Schalt-flächen einen horizontalen Trennstreifen. Für diesen optischen Effekt gibt es keingesondertes Steuerelement. Sie können sich aber mit einem Trick behelfen:

1. Klicken Sie in der Symbolleiste WERKZEUGSAMMLUNG auf das Symbol RAH-MEN.

2. Ziehen Sie den Rahmen in der gewünschten Größe sowie Position in IhrerUserForm auf.

3. Im Eigenschaftenfenster setzen Sie den Mauszeiger in das Feld CAPTION undlöschen den momentanen Inhalt.

4. Im Eigenschaftenfenster setzen Sie den Mauszeiger in das Feld HEIGHT undlegen die Höhe des Rahmens fest. Da es sich um einen horizontalen Trenn-streifen handelt, wählen Sie eine Höhe zwischen 8 und 10.

Im Eigenschaftenfenster können Sie über das Feld SPECIALEFFECT noch einenspeziellen optischen Effekt auswählen. Dabei können Sie unter anderem entschei-den, ob der Trennstreifen hervorgehoben, versenkt oder eingefräst werden soll.

Steuerelemente beschriften

Standardmäßig wird beim Einfügen der Steuerelemente schon eine Beschriftungvorgegeben, die aber noch geändert werden muss.

Um ein Steuerelement wie z.B. eine Schaltfläche zu beschriften, gehen Sie nachdem Einfügen des Steuerelements wie folgt vor:

1. Markieren Sie das Steuerelement, das Sie beschriften möchten.

2. Setzen Sie im Eigenschaftenfenster den Mauszeiger in das Feld CAPTION.

3. Erfassen Sie die gewünschte Beschriftung und drücken Sie die Taste (ÿ).

Aktivierreihenfolge festlegen

Standardmäßig werden die einzelnen Steuerelemente nach der Reihenfolge akti-viert, in der Sie in die UserForm eingefügt wurden, d.h. Sie springen über dieTaste (ÿ) von einem Feld zum anderen. Gerade wenn Sie zu einem späteren

511

Page 512: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Zeitpunkt neue Steuerelemente hinzufügen, sollten Sie die Reihenfolge anpassen.Dazu wählen Sie den Menübefehl ANSICHT/AKTIVIERREIHENFOLGE. Ist dieserMenübefehl bei Ihnen deaktiviert, dann markieren Sie vorher eines der Textfelderoder Schaltflächen auf der UserForm.

Markieren Sie das entsprechende Element im Listenfeld AKTIVIERREIHENFOLGEund klicken Sie auf die Schaltfläche NACH OBEN bzw. NACH UNTEN.

13.3 UserForms programmieren

Nachdem Sie im ersten Schritt die UserForm eingefügt und mit Steuerelementenbestückt haben, können Sie nun darangehen, die UserForm zu programmieren.Dabei müssen unter anderem Makros erstellt werden, die die UserForm aufrufen,die eingegebenen Daten in einer Tabelle speichern und die UserForm wiederbeenden.

UserForm aufrufen

Um die UserForm einmal zu testen, markieren Sie diese und drücken die Taste(F5).

Selbstverständlich werden Sie die UserForm in Zukunft über ein Makro starten.Legen Sie das Makro aus Listing 13.1 in einem neuen Modul MODUL1 an.

Abbildung 13.3: Die Aktivierreihenfolge ändern

512

Page 513: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

UserForms programmieren

Listing 13.1: Eine UserForm aufrufen

Sub UserFormAnzeigen() UserForm1.ShowEnd Sub

Die Methode Show aktiviert die UserForm mit dem Namen USERFORM1.

Seit Excel 2000 ist es möglich, Dialoge auch ungebunden aufzurufen;d.h., ungebundene Dialoge müssen nicht beendet werden, um mitanderen Arbeiten in Excel fortzufahren, während die UserForm geöffnetbleibt. Um eine ungebundene UserForm aufzurufen, setzen Sie dieAnweisung UserForm1.Show vbModeless ein.

UserForm beenden

Mit einem Klick auf die Schaltfläche ABBRECHEN in der USERFORM1 soll dieUserform beendet werden. Zu diesem Zweck müssen Sie den entsprechendenBefehl hinter diese Schaltfläche legen. Verfahren Sie hierfür wie folgt:

1. Führen Sie in Ihrer UserForm einen Doppelklick auf die Schaltfläche ABBRE-CHEN durch.

2. Ergänzen Sie den dadurch erzeugten Programm-Rahmen wie folgt:

Abbildung 13.4: Der erste Aufruf der UserForm

513

Page 514: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Listing 13.2: Eine Userform beenden

Private Sub CommandButton1_Click() UserForm1.HideEnd Sub

Die Methode Hide blendet die UserForm aus. Damit steht die UserForm abernoch im Speicher für weitere Aktionen bereit. Möchten Sie die UserForm richtigaus dem Speicher laden, verwenden Sie die Anweisung unload me.

Speichern der eingegebenen Daten

Für die nächste Funktion, das Speichern der eingegebenen Daten, müssen Siezunächst eine kleine Vorarbeit erledigen. Sie müssen eine Tabelle anlegen, in dieSie die eingegebenen Vokabeln speichern. Erstellen Sie daher eine Tabelle nachfolgendem Aufbau.

Sie können das Makro, um die USERFORM1 aufzurufen, direkt übereine Schaltfläche Ihrer Tabelle VOKABELN starten. Blenden Sie zu die-sem Zweck die Symbolleiste FORMULAR ein, klicken auf das SymbolSCHALTFLÄCHE und ziehen es in der gewünschten Größe und Positionin Ihrer Tabelle auf. Danach wird automatisch das Dialogfeld MAKROZUWEISEN eingeblendet, in dem Sie das Makro USERFORMANZEIGENaus dem Listenfeld auswählen und mit OK bestätigen.

Nachdem Sie die Tabelle VOKABELN angelegt haben, wechseln Sie in die Ent-wicklungsumgebung von Excel und klicken auf Ihrer USERFORM1 die Schaltflä-che OK/ERFASSEN doppelt an. Ergänzen Sie dann das eingestellte Klick-Ereigniswie folgt:

Abbildung 13.5: Die noch leere Tabelle für die Vokabeln

514

Page 515: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

UserForms programmieren

Listing 13.3: Die eingegebenen Vokabeln speichern

Private Sub CommandButton2_Click()'Vokabeln speichern

Dim frm As UserForm

Set frm = UserForm1 Sheets("Vokabeln").Activate Range("A65536").End(xlUp).Offset(1, 0).Select

With frm ActiveCell.Value = .TextBox1.Value ActiveCell.Offset(0, 1).Value = .TextBox2.Value If .OptionButton1.Value = True Then ActiveCell.Offset(0, 2).Value = "Substantiv" Else If .OptionButton2.Value = True Then ActiveCell.Offset(0, 2).Value = "Verb" Else ActiveCell.Offset(0, 2).Value = "Adjektiv" End If End If .TextBox1.Value = "" .TextBox2.Value = "" .OptionButton1 = False .OptionButton2 = False .OptionButton3 = False End WithEnd Sub

Bei dem Makro CommandButton2_Click handelt es sich um ein Ereignis, d.h.,immer wenn die Schaltfläche OK/ERFASSEN geklickt wird, läuft obiges Makro ab.Als Erstes wird der Begriff USERFORM1, der ja nicht gerade kurz ist, durch ein Kür-zel ersetzt. Künftig können alle Elemente auf der UserForm kürzer und damitauch schneller angesprochen werden.

Jetzt wird das Tabellenblatt VOKABELN aktiviert. Mit der Eigenschaft End wird diePosition ermittelt, welche die Zelle am Ende der Region darstellt, die den Quell-bereich enthält. Diese Vorgehensweise entspricht dem Drücken der Tastenkombi-nation (Strg) + (¼) auf dem Tabellenblatt. Die Zahl 65.536 steht für die

515

Page 516: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

maximale Anzahl Zeilen pro Excel-Tabellenblatt. Innerhalb dieses Bereiches wirdnach der zuletzt verwendeten Zelle gesucht und der Zellenzeiger um eine Zeilenach unten (nächste freie Zelle) versetzt.

Ist das Kürzel frm einmal mit der Anweisung With angegeben, kann es weggelassenwerden.

In der Eigenschaft Value der Textfelder steht jeweils der vorgenommene Eintrag.Dieser Eintrag wird in die Tabelle übertragen. Dabei wird der Inhalt des erstenTextfeldes in die aktive Zelle übertragen, der Inhalt des zweiten Textfeldes wirdeine Zelle weiter nach rechts verschoben eingefügt.

Um festzuhalten, um welche Wortart es sich bei dem eingegebenen Wort handelt,verwenden Sie Optionsschaltflächen. Dabei kann jeweils nur eine Option möglichsein. Die Abfrage, welche Optionsschaltfläche aktiviert ist, bekommen Sie übereine If-Then-Else-Anweisung. Fragen Sie dazu die Value-Eigenschaft der erstenOptionsschaltfläche ab. Liefert diese den Wert True, ist die Optionsschaltflächeaktiviert. In diesem Fall schreiben Sie den Text SUBSTANTIV in die Spalte C, imanderen Fall schreiben Sie je nachdem den Text VERB bzw. ADJEKTIV in dieTabelle.

Nach dem Speichern der Vokabel sollten Sie die Texteingabefelder löschen unddie angeklickte Option im Gruppenfeld WORTART herausnehmen. Weisen Siedaher der Eigenschaft Value einen leeren Wert zu (Eingabefelder) bzw. den WertFalse (Optionsfelder) (siehe Abbildung 13.6).

Vokabeln einfügen

Die Vokabeln sollen nach dem Zufallsprinzip abgefragt werden. Dabei sollenjeweils drei Vokabeln in einem Arbeitsgang abgefragt werden. Entwerfen Sie fürdiesen Zweck die USERFORM2 in Abbildung 13.7.

Direkt nach dem Aufruf der USERFORM2 sollen die Eingabefelder in der erstenSpalte mit drei zufällig ausgewählten Vokabeln gefüllt werden. Für diesen Zweckkönnen Sie das Ereignis UserForm_Initialize einsetzen, welches automatisch aus-geführt wird, wenn Sie die UserForm aufrufen. Klicken Sie dazu auf eine freieStelle Ihrer USERFORM2 und erfassen das folgende Ereignismakro in Listing 13.4auf S. 518.

516

Page 517: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

UserForms programmieren

Abbildung 13.6: Die ersten Einga-ben in die Tabelle Vokabeln über die UserForm eingeben

Abbildung 13.7: Vokabeln abfragen

517

Page 518: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Listing 13.4: Die Vokabeln nach dem Zufallsprinzip einfügen

Option ExplicitDim Trans1 As StringDim Trans2 As StringDim Trans3 As String

Private Sub UserForm_Initialize()Dim l As LongDim AnzVok As LongDim frm As UserFormDim Vok1 As StringDim Vok2 As StringDim Vok3 As String

AnzVok = _ThisWorkbook.Sheets("Vokabeln").UsedRange.Rows.CountSet frm = UserForm2

'Textfeld 1l = Int((AnzVok * Rnd) + 2)Vok1 = Cells(l, 1).ValueTrans1 = Cells(l, 2).Value

'Textfeld 3l = Int((AnzVok * Rnd) + 2)Vok2 = Cells(l, 1).ValueTrans2 = Cells(l, 2).Value

'Textfeld 5l = Int((AnzVok * Rnd) + 2)Vok3 = Cells(l, 1).ValueTrans3 = Cells(l, 2).Value

With frm .TextBox1.Value = Vok1 .TextBox1.Enabled = False .TextBox3.Value = Vok2 .TextBox3.Enabled = False .TextBox5.Value = Vok3 .TextBox5.Enabled = FalseEnd WithEnd Sub

518

Page 519: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

UserForms programmieren

Deklarieren Sie zuerst einmal die Variablen, um die Vokabeln und deren Überset-zung speichern zu können. Dabei werden die Variablen Trans1 bis Trans3 außer-halb des Ereignisses zu Beginn des Codeblattes deklariert. Diese Variablenbenötigen Sie später noch für die Prüfung Ihrer eingegebenen Übersetzungen.

Ermitteln Sie im nächsten Schritt die Anzahl der bereits erfassten Vokabeln. Set-zen Sie dazu die Eigenschaft UsedRange ein, die Sie auf die Zeilen (= Rows) derTabelle VOKABELN anwenden. Diese Information benötigen Sie, um anschließendüber die Anweisung l = Int((AnzVok * Rnd) + 2) eine zufällige Vokabel aus derTabelle VOKABELN auszuwählen. Über die Funktion Rnd erzeugen Sie dieseZufallszahl, die der Zeilennummer entspricht. Diese Zufallszahl liegt im Bereich2 (ab Zeile 2) und der ermittelten größten Zeile, die vorher in der Variablen Anz-Vok gespeichert wurde. Über die Funktion Int wird diese Zufallszahl als Ganzzahlausgegeben.

Füllen Sie im Anschluss daran die Variablen Vok1 bis Vok3 und Trans1 bis Trans3mit den ermittelten Vokabeln und deren Übersetzung. Setzen Sie für diese Auf-gabe die Eigenschaft Cells ein. Im ersten Argument dieser Eigenschaft geben Siedie Zeile an, aus der die Vokabel bzw. die Übersetzung derselben entnommenwerden soll. Im zweiten Argument geben Sie die Spalte an. Im Falle der Vokabel-felder ist das die Spalte A, welche Sie über den Index 1 ansprechen können. Imanderen Fall, wenn es sich um die übersetzten Vokabeln handelt, finden Sie dieseInformationen in Spalte B der Tabelle VOKABELN. Setzen Sie dafür den Index 2im zweiten Argument der Eigenschaft Cells ein.

Weisen Sie danach den Eingabefeldern die Vokabeln zu und setzen die Eigen-schaft Enabled auf den Wert False. Damit können diese Felder nicht mehr editiertwerden.

Vokabeln prüfen

In der nächsten Funktion sollen die Eingaben, die Sie in den Eingabefeldern derzweiten Spalte in der USERFORM2 vorgenommen haben, geprüft werden. HabenSie dabei die abgefragte Vokabel richtig übersetzt, dann wird das jeweilige Kon-trollkästchen ganz rechts in der UserForm aktiviert.

Um den dafür verantwortlichen Code zu erfassen, führen Sie in der Entwicklungs-umgebung einen Doppelklick auf die Schaltfäche PRÜFEN durch.

519

Page 520: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Listing 13.5: Die eingegebenen Vokabeln überprüfen

Private Sub CommandButton2_Click()'Prüfen der eingegebenen VokabelnDim frm As UserFormDim Cb As Object

Set frm = UserForm2

For Each Cb In frm.Controls If TypeName(Cb) = "CheckBox" Then Cb.Value = False Next Cb

With frm If .TextBox2.Value = Trans1 _ Then .CheckBox1.Value = True Else .CheckBox2.Value = True End if If .TextBox4.Value = Trans2 _ Then .CheckBox3.Value = True _ Else .CheckBox4.Value = True End if If .TextBox6.Value = Trans3 _ Then .CheckBox5.Value = True _ Else .CheckBox6.Value = True End if

Abbildung 13.8: Die Vokabeln über das Zufallsprinzip anzeigen

520

Page 521: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

UserForms programmieren

End WithEnd Sub

Geben Sie über die Anweisung Set an, welche UserForm Sie programmierenmöchten. Sicherheitshalber sollten Sie zu Beginn des Makros alle Kreuze aus denKontrollkästchen entfernen. Dazu durchlaufen Sie in einer Schleife alle Steuer-elemente, die in der UserForm vorhanden sind. Über die Funktion TypeName kön-nen Sie die Kontrollkästchen in der Userform identifizieren. DieseSteuerelemente melden der Funktion TypeName den Text CheckBox. Achten Sie beidieser Angabe auf die korrekte Schreibweise. Die Funktion TypeName unterscheidetzwischen Groß- und Kleinschreibung.

Überprüfen Sie danach, ob die eingegebenen Übersetzungen der Vokabeln, dieSie direkt aus den Eingabefeldern Textbox2, TextBox4 und Textbox6 übernehmenkönnen, mit den vorher bereits ermittelten Inhalten der Variablen Trans1 bisTrans3 übereinstimmen.

Um das entsprechende Kontrollkästchen anzukreuzen, setzen Sie die EigenschaftValue des Kontrollkästchens auf den Wert True.

Anzeigen der nächsten drei Vokabeln

Die nächste Funktion stellt sicher, dass durch einen Klick auf die SchaltflächeNÄCHSTE 3 der USERFORM2 drei neue Vokabeln in der UserForm angezeigt werden.

Abbildung 13.9: Richtig oder falsch?

521

Page 522: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Führen Sie zu diesem Zweck in der Entwicklungsumgebung einen Doppelklickauf die Schaltfläche NÄCHSTE 3 durch und erfassen Sie folgendes Ereignismakro:

Listing 13.6: Drei neue Vokabeln einstellen

Private Sub CommandButton3_Click()'nächste 3 Vokabeln anzeigenDim Cb As ObjectDim Tb As Object

For Each Tb In UserForm2.Controls If TypeName(Tb) = "TextBox" Then Tb.Value = "" Next Tb UserForm_Initialize

For Each Cb In UserForm2.Controls If TypeName(Cb) = "CheckBox" Then Cb.Value = FalseNext CbEnd Sub

Bevor Sie die nächsten drei Vokabeln in Ihrer UserForm anzeigen lassen, entfer-nen Sie die bisherigen Eingaben. Dazu durchlaufen Sie in einer Schleife alleSteuerelemente, die sich auf der UserForm befinden. Über die Funktion TypeNamekönnen Sie die Textfelder identifizieren und über die Eigenschaft Value, der Sieeine leere Textfolge zuweisen, löschen.

Danach rufen Sie das bereits vorher erfasste Ereignis UserForm_Initialize auf,welches die Vokabeln in die UserForm einfügt und die Übersetzung der Vokabelnin Variablen schreibt.

Vergessen Sie danach nicht, die Kreuze aus den Kontrollkästchen zu entfernen,wie Sie es bereits im Makro in Listing 13.5 gemacht haben.

522

Page 523: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

13.4 Fragen & Antworten

F Wie können Sie in einer UserForm in einem Listenfeld die Namen aller Tabel-lenblätter anzeigen lassen?

A Fügen Sie eine neue UserForm mit einem Listenfeld ein. Erfassen Siedann das Ereignis UserForm_Initialize, welches automatisch ausgeführtwird, wenn die UserForm aufgerufen wird.

Listing 13.7: Tabellennamen in Listenfeld einlesen

Private Sub UserForm_Initialize()Dim Blatt As Worksheet

For Each Blatt In ThisWorkbook.Sheets ListBox1.AddItem Blatt.Name Next End Sub

Mit der Methode AddItem fügen Sie dem Listenfeld jeweils eine neue Zeilehinzu.

F Wie können Sie erreichen, dass im soeben erstellten Listenfeld die angeklickteTabelle aktiviert wird?

A Erfassen Sie zu diesem Zweck das folgende Ereignismakro:

Abbildung 13.10: Einträge in ein Listenfeld einfügen

523

Page 524: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren

Listing 13.8: Den ausgewählten Eintrag im Listenfeld auslesen

Private Sub ListBox1_Click() ThisWorkbook.Sheets(ListBox1.Value).Activate Range("A1").Select Unload Me End Sub

Indem Sie über die Eigenschaft Value des Listenfeldes auch die Positiondes Eintrages innerhalb des Listenfeldes bekommen, können Sie nundirekt im Hintergrund das entsprechende Tabellenblatt aktivieren, und imAnschluss daran die UserForm schließen

F Wie können Sie den Inhalt eines Eingabefeldes markieren?

A Standardmäßig wird ein Text in einem Eingabefeld nicht markiert. WennSie beispielsweise beim Aufruf einer UserForm den Inhalt eines Textfeldesmarkieren möchten, fügen Sie eine neue Userform mit einem Eingabefeldsowie einer Schaltfläche ein und erfassen folgendes Ereignismakro, wel-ches Sie direkt hinter die Schaltfläche legen:

Listing 13.9: Einen Text in einem Eingabefeld komplett markieren

Private Sub CommandButton1_Click() TextBox1.SetFocus TextBox1.SelStart = 0 TextBox1.SelLength = Len(TextBox1.Text)End Sub

Mithilfe der Methode SetFocus setzen Sie den Textcursor auf das Eingabe-feld. Mit der Eigenschaft SelStart bestimmen Sie die Anfangsposition deszu markierenden Textes. Die Eigenschaft SelLength legt die Anzahl der zumarkierenden Zeichen fest. Weisen Sie dieser Eigenschaft die FunktionLen zu, die die Gesamtzahl der eingegebenen Zeichen des Eingabefeldesermittelt.

524

Page 525: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Quiz

13.5 Quiz

F Wie lautet die Methode, um eine UserForm aufzurufen?

F Über welche Eigenschaft können Sie die Beschriftung von Steuerelementenbestimmen?

F Wie kann ein Eingabefeld deaktiviert werden?

F Wie heißt das Ereignis, welches beim Starten einer UserForm automatisch ausge-führt wird?

13.6 Übung

Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe UserForm.xls.Schreiben Sie ein Makro, welches die Ergebnisse der Vokabelabfragen in der sepa-raten Tabelle ÜBUNG dokumentiert.

Die Lösung dieser Aufgabe können Sie im Anhang A nachlesen.

Abbildung 13.11: Text markieren durch Klick auf die Schaltfläche

525

Page 526: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;
Page 527: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

14

Import und Export über VBE-Programmierung

Page 528: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

Gestern haben Sie gelernt, wie Sie UserForms in Excel erstellen, mit Steuerele-menten bestücken und automatisieren können. Sie haben dabei Schritt für Schritteine Lösung entwickelt, über die Sie dialoggesteuert Vokabeln lernen können.

Die Themen heute:

� Was verbirgt sich hinter der VBE-Programmierung?

� Voraussetzung – das Einbinden der VBE-Bibliothek

� Weitere Informationen zu Bibliotheken

� VBE-Bibliothek deaktivieren

� Objekte, Methoden und Eigenschaften der VBE

� Typische Aufgaben mit der VBE erledigen

Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM inder Arbeitsmappe VBE.xls im Verzeichnis Kap14.

14.1 Was ist VBE-Programmierung?

Die VBE stellt die Entwicklungsumgebung dar, in der Sie Ihre Makros erfassen.Auf diese Entwicklungsumgebung haben Sie auch Zugriff über den Einsatz vonVBA-Makros. Damit können Sie Makros dynamisch einfügen und starten lassen.Des Weiteren können Sie ganze Module exportieren bzw. importieren sowieArbeitsmappen von jeglichem Quellcode säubern lassen. Diese und weitere Aufga-ben werden Sie an diesem Tag kennen lernen.

14.2 Voraussetzung – das Einbinden der VBE-Bibliothek

Um überhaupt die VBE programmieren zu können, müssen Sie vorher einezusätzliche Bibliothek in der Entwicklungsumgebung einbinden, welche die dazunötigen Befehle bereitstellt. Dazu befolgen Sie die nächsten Arbeitsschritte:

528

Page 529: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Voraussetzung – das Einbinden der VBE-Bibliothek

1. Wechseln Sie über die Tastenkombination (Alt) + (F11) in die Entwicklungs-umgebung von Excel.

2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.

3. Aktivieren Sie im Listenfeld VERFÜGBARE VERWEISE die Bibliothek MICRO-SOFT VISUAL BASIC FOR APPLICATION EXTENSIBILTITY 5.3.

4. Bestätigen Sie Ihre Einstellung mit OK.

Nach dem Einbinden der VBE-Bibliothek können Sie über den vollen Befehlssatzverfügen. Übrigens gibt es weitere Bibliotheken, die zusätzliche VBA-Befehle zurVerfügung stellen. So stellt beispielsweise die Word-Bibliothek Befehle zur Verfü-gung, die es möglich machen, Ihre Textverarbeitung von Excel aus zu program-mieren. Diese und andere Bibliotheken werden aber standardmäßig nichteingebunden, um die Performance der Anwendung nicht zu beeinträchtigen. Hiergilt wie schon bei den Add-Ins der Grundsatz: Es wird erst etwas eingebunden,wenn es auch wirklich gebraucht wird!

Diese manuelle Vorgehensweise zum Einbinden der VBE-Bibliothek können Sieübrigens auch durch ein Makro ausführen lassen. Dabei starten Sie das Makro ausListing 14.1:

Abbildung 14.1: Die VBE-Biblio-thek einbinden

529

Page 530: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

Listing 14.1: Die VBE-Bibliothek per Code einbinden

Sub VBEAktivieren()Dim VBEObj As Object

On Error Resume NextVBEObj = Application.VBE.ActiveVBProject.References. _AddFromGuid("{0002E157-0000-0000-C000-000000000046}", _ 5, 3)End Sub

Die Methode AddFromGuid fügt der REFERENCES-Auflistung einen Verweishinzu, wobei der global eindeutige Bezeichner (GUID) des Verweises verwendetwird.

Die komplette Syntax lautet:

AddFromGuid(GUID, HauptNr, NebenNr) As Reference

Das Argument Guid gibt einen Wert vom Typ String zurück, der die Klassen-IDeines Objekts enthält. Bei der Guid handelt es sich um eine eindeutige Nummer,welche die Bibliothek identifiziert.

Das Argument HauptNr gibt einen Wert vom Typ Long zurück, der die Hauptver-sionsnummer der Klassenbibliothek, auf die verwiesen wird, enthält.

Das Argument NebenNr gibt einen Wert vom Typ Long zurück, der die Nebenver-sionsnummer der Klassenbibliothek, auf die verwiesen wird, anzeigt.

Beide Nummern sind notwendig, um die Bibliothek richtig zu adressieren.Anhand dieser beiden Nummern durchsucht die Methode AddFromGuid die Regist-rierung, um den hinzuzufügenden Verweis zu ermitteln und einzubinden.

Wie aber können Sie nun feststellen, welche GUID, HauptNr und NebenNr einebestimmte Bibliothek hat?

Klar ist, dass es eine Möglichkeit geben muss, diese GUID sowie die Haupt- undNebenNr automatisch auszulesen. Das folgende Makro aus Listing 14.2 schreibtalle diese Informationen in eine neue Tabelle. Binden Sie dazu vorher diegewünschten Bibliotheken manuell ein.

Listing 14.2: Alle gesetzten Verweise abfragen

Sub VerweiseAbfragen()Dim ref As ReferenceDim i As Integer

530

Page 531: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Voraussetzung – das Einbinden der VBE-Bibliothek

On Error Resume NextSheets.AddRange("A1").Selecti = 1 ActiveCell.Value = "Verweis" ActiveCell.Offset(0, 1).Value = "GUID" ActiveCell.Offset(0, 2).Value = "Major" ActiveCell.Offset(0, 3).Value = "Minor"

For Each ref In Application.VBE.ActiveVBProject.References ActiveCell.Offset(i, 0).Value = ref.Name ActiveCell.Offset(i, 1).Value = ref.GUID ActiveCell.Offset(i, 2).Value = ref.Major ActiveCell.Offset(i, 3).Value = ref.Minor i = i + 1Next refEnd Sub

Fügen Sie zunächst eine neue, noch leere Tabelle ein, indem Sie die MethodeAdd einsetzen. Danach durchlaufen Sie in einer Schleife alle gesetzten Verweise inder Reference-Auflistung. Über die Eigenschaft Name können Sie den Namen desVerweises erfahren. Die Eigenschaft Guid gibt einen Wert vom Typ String zurück,der die Klassen-ID eines Objekts enthält. Bei der Guid handelt es sich um eine ein-deutige Nummer, welche die Bibliothek identifiziert. Das Argument Major gibteinen Wert vom Typ Long zurück, der die Hauptversionsnummer der Klassenbibli-othek, auf die verwiesen wird, enthält. Das Argument Minor gibt einen Wert vomTyp Long zurück, der die Nebenversionsnummer der Klassenbibliothek, auf dieverwiesen wird, anzeigt.

Abbildung 14.2: Diese Biblio-theken sind derzeit eingebunden.

531

Page 532: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

Mithilfe dieser Tabelle können Sie jede Bibliothek auch über den Einsatz einesMakros einbinden. Orientieren Sie sich dazu am Makro aus Listing 14.1 und set-zen Sie die Argumente aus Abbildung 14.2 ein.

14.3 Weitere Informationen zu Bibliotheken

Um zu sehen, welche Verweise auf Bibliotheken in Ihrer Arbeitsmappe gesetztsind, wie die Bibliotheken heißen und wo diese gespeichert sind, wenden Sie dasfolgende Makro aus Listing 14.3 an. Dabei schreiben Sie all diese Informationenin das Direktfenster der Entwicklungsumgebung.

Bevor Sie das folgende Makro jedoch starten, müssen Anwender ab derVersion 2002 vorher noch eine Einstellung in Excel vornehmen. Dabeiwählen Sie auf Ihrem Excel-Arbeitsblatt aus dem Menü EXTRAS denBefehl MAKRO/SICHERHEIT. Wechseln Sie auf die Registerkarte VER-TRAUENSWÜRDIGE QUELLEN und aktivieren Sie das KontrollkästchenZUGRIFF AUF VISUAL BASIC-PPROJEKT VERTRAUEN. Bestätigen Sie dieseEinstellungen mit OK. Seit der Version Excel 2002 ist es aus Sicher-heitsgründen nicht mehr standardmäßig möglich, auf Eigenschaftenund Methoden des Objektes VBE zuzugreifen. Daher müssen Sie dieseEinstellung vorab vornehmen.

Listing 14.3: Informationen zu den gesetzten Verweisen ermitteln

Sub InfosZuBibliothekenAusgeben()Dim Verweis As Reference

On Error Resume Next For Each Verweis In _ Application.VBE.ActiveVBProject.References Debug.Print "Bezeichnung: " & Verweis.Description & _ Chr(13) & "Speicherort: " & Verweis.FullPath _ & Chr(13) & "Name: " & _ Verweis.Name & Chr(13) & Chr(13) Next VerweisEnd Sub

Durchlaufen Sie in einer Schleife alle gesetzten Verweise in der Entwicklungsum-gebung. Mithilfe der Eigenschaft Description können Sie den beschreibenden

532

Page 533: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Weitere Informationen zu Bibliotheken

Text der jeweils eingebundenen Bibliothek abfragen. Die Eigenschaft FullPathliefert den Namen des Verzeichnisses zurück, in dem die Bibliothek gespeichertist. Über die Eigenschaft Name können Sie ermitteln, wie die jeweils eingebundeneBibliothek heißt.

Kontrollieren Sie das Ergebnis, indem Sie in der Entwicklungsumgebung aus demMenü ANSICHT den Befehl DIREKTFENSTER auswählen.

Anhand dieser Auflistung im Direktfenster können Sie Bibliotheken auch überihren Namen einbinden bzw. wieder deaktivieren. Im folgenden Beispiel wird dieBibliothek für die OLE-Automatisierung zuerst eingebunden und danach wiederdeaktiviert.

Listing 14.4: Die OLE-Bibliothek einbinden

Sub OLEBiboEinbinden()Dim VBEObj As Object

Set VBEObj = Application.VBE.ActiveVBProject.References On Error Resume Next VBEObj.AddFromFile "stdole2.tlb"End Sub

Abbildung 14.3: Informationen über die gesetzten Bibliotheken

533

Page 534: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

Mit der Methode AddFromFile fügen Sie dem Projekt einen Verweis aus einerDatei hinzu. Dazu muss allerdings der Name der Bibliothek bekannt sein. Diesenkönnen Sie im Dialogfeld VERWEISE VBAPROJECT im Menü EXTRAS und demBefehl VERWEISE nachsehen bzw. das Ergebnis des Makros aus Listing 14.3 imDirektfenster kontrollieren.

Um die OLE-Bibliothek wieder zu deaktivieren, starten Sie das Makro aus Listing14.5:

Listing 14.5: Die OLE-Bibliothek deaktivieren

Sub OLEBiboDeaktivieren()Dim VBEObj As Object

On Error Resume Next Set VBEObj = Application.VBE.ActiveVBProject.References VBEObj.Remove VBEObj("stdole")End Sub

Setzen Sie die Methode Remove ein, um die Bibliothek OLE wieder zu deaktivie-ren. Orientieren Sie sich dabei am Ergebnis des Makros aus Listing 14.3 imDirektfenster. Dort können Sie den genauen Namen (STDOLE) der OLE-Biblio-thek erfahren.

14.4 VBE-Bibliothek deaktivieren

Analog zum Makro aus Listing 14.1 können Sie den Verweis auf die VBE-Biblio-thek auch wieder entfernen, indem Sie das Makro aus Listing 14.6 starten. Damitbeseitigen Sie unnötigen Ballast aus der Arbeitsmappe.

Listing 14.6: Die VBE-Bibliothek deaktivieren

Sub VBEDeaktivieren()Dim VBEObj As Object

On Error Resume Next Set VBEObj = Application.VBE.ActiveVBProject.References VBEObj.Remove VBEObj("VBIDE")End Sub

534

Page 535: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Objekte, Methoden und Eigenschaften der VBE

Über die Methode Remove entfernen Sie den Verweis auf die eingebundene Biblio-thek aus der aktiven Arbeitsmappe. Geben Sie dabei den Namen der VBE-Biblio-thek an.

14.5 Objekte, Methoden und Eigenschaften der VBE

Nachdem Sie die VBE-Bibliothek eingebunden haben, sollten Sie erst einmaleinen Blick auf die verfügbaren Objekte, Methoden und Eigenschaften dieser Bib-liothek werfen. Dazu wechseln Sie in die Entwicklungsumgebung und drückendie Taste (F2), um den Objektkatalog zu starten.

Abbildung 14.4: Der Befehlssatz der Bibliothek VBE

535

Page 536: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

14.6 Typische Aufgaben mit der VBE erledigen

Nachdem Sie die Voraussetzung für die Programmierung in und mit der VBE her-gestellt haben, indem Sie die VBE-Bibliothek eingebunden sowie Informationenzu Bibliotheken erhalten haben, gehen Sie jetzt daran, typische Aufgaben für diePraxis zu lösen.

Arbeitsmappe mit Quellcode bestücken

Wenn Sie Makros in den Codebereich Ihrer Entwicklungsumgebung schreiben,so stellt dies den normalen Vorgang in der Programmierung dar. Stellen Sie sichjedoch vor, Sie müssten mehrere Arbeitsmappen mit demselben Code versorgen.Haben Sie da Lust, die Makros für jede Arbeitsmappe neu zu erfassen bzw. hinein-zukopieren?

Für diesen Zweck gibt es eine Möglichkeit des Imports von Quellcode. DieserQuellcode wird erst in einer Textdatei geschrieben und anschließend in diegewünschte Arbeitsmappe per Makro eingelesen. Für die nächste Aufgabe kopie-ren Sie einmal ein Makro in eine Textdatei und speichern diese im VerzeichnisC:\Eigene Dateien unter dem Namen Code.txt.

Im Makro FormelnDokumentieren wird eine Textdatei mithilfe der Methode Opengeöffnet. Sollte die Textdatei zu diesem Zeitpunkt noch nicht existieren, dannwird diese selbstständig angelegt. In einer anschließenden Schleife wird jedebelegte Zelle der aktiven Tabelle durchlaufen. Innerhalb der Schleife findet eineÜberprüfung statt, ob die jeweilige Zelle eine Formel enthält. Wenn ja, dann wird

Abbildung 14.5: Alle Formeln sol-len in einer Text-datei dokumen-tiert werden.

536

Page 537: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Typische Aufgaben mit der VBE erledigen

die Adresse der Zelle über die Eigenschaft Address sowie der Inhalt der Formelüber die Eigenschaft FormulaLocal direkt in die Textdatei geschrieben.

Erfassen Sie nun das Makro, welches im ersten Schritt ein neues Modul ModulNeuanlegt und danach den Inhalt der Textdatei Code.txt hineinkopiert.

Listing 14.7: Neues Modul anlegen und Code importieren

Sub MakroAusTextdateiImportieren()Dim VBKomp As VBComponentDim CodeModul As CodeModuleConst ImportDatei = "C:\Eigene Dateien\Code.txt"

Set VBKomp = _ ThisWorkbook.VBProject.VBComponents.Add _ (vbext_ct_StdModule) VBKomp.Name = "ModulNeu" Application.Visible = True

Set CodeModul = _ ThisWorkbook.VBProject.VBComponents _ ("ModulNeu").CodeModule

With CodeModul .AddFromFile ImportDatei End WithEnd Sub

Legen Sie zu Beginn des Makros den Namen sowie den Pfad der Textdatei ineiner Konstanten fest, in der der Quellcode gespeichert ist. Um einer Arbeits-mappe ein neues, noch leeres Modul hinzuzufügen, setzen Sie die Methode Addein. Die Methode Add verwendet die Konstante vbext_ct_StdModule, welche einnormales Modul repräsentiert.

Selbstverständlich können Sie ebenso Klassenmodule und UserForms über dieseMethode in Ihr Projekt einfügen. Entnehmen Sie dazu die notwendigen Konstan-ten der folgenden Tabelle 14.1.

537

Page 538: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

Geben Sie im zweiten Schritt an, in welches Modul Sie den Inhalt der TextdateiCode.txt transferieren möchten. Verwenden Sie dazu die Anweisung Set undgeben den Namen des neu eingefügten Moduls an. Wenden Sie danach dieMethode AddFromFile an, um den Inhalt der Textdatei in das Modul einzufügen.

Gehen wir jetzt einen Schritt weiter und überführen den Inhalt der TextdateiCode.txt in alle geöffneten Arbeitsmappen. Den Code für diese Aufgabe könnenSie in Listing 14.8 sehen:

Listing 14.8: Alle geöffneten Mappen mit Quellcode versorgen

Sub TextdateiInAlleArbeitsmappenEinlesen()Dim Mappe As WorkbookDim VBKomp As VBComponentConst ImportDatei = "C:\Eigene Dateien\Code.txt"

For Each Mappe In Application.Workbooks

Konstante Erklärung

vbext_ct_ClassModule Fügt der Auflistung ein Klassenmodul hinzu.

vbext_ct_MSForm Fügt der Auflistung ein Formular hinzu.

vbext_ct_StdModule Fügt der Auflistung ein Standardmodul hinzu.

Tabelle 14.1: Die Konstanten der Methode Add

Abbildung 14.6: Das neue Modul wurde angelegt und der Quellcode importiert.

538

Page 539: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Typische Aufgaben mit der VBE erledigen

Set VBKomp = _ Mappe.VBProject.VBComponents.Add _ (vbext_ct_StdModule) VBKomp.Name = "ModulNeu2" Application.Visible = True

Mappe.VBProject.VBComponents("ModulNeu2").CodeModule.AddFromFile _ ImportDateiNext MappeEnd Sub

Durchlaufen Sie in einer Schleife alle geöffneten Arbeitsmappen. Innerhalb dieserArbeitsmappen legen Sie über die Methode Add ein neues, noch leeres Modul an.Anschließend fügen Sie mithilfe der Methode AddFromFile den Inhalt der Textda-tei in die neu angelegten Module ein.

Für etwas kleinere Makros können Sie Quellcode auch direkt in das Modul schrei-ben und anschließend starten. Im folgenden Makro aus Listing 14.9 werden dieNamen der in der Arbeitsmappe enthaltenen Tabellen im Direktfenster verzeichnet.

Abbildung 14.7: Alle geöffneten Mappen wurden mit dem Modul ModulNeu2 versorgt.

539

Page 540: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

Listing 14.9: Ein Makro Zeile für Zeile erfassen

Sub MakroZeilenHinzufügen()Dim CodeModul As CodeModuleDim i As Long

Set CodeModul = _ ThisWorkbook.VBProject.VBComponents _ ("Modul1").CodeModule

With CodeModul i = .CountOfLines + 1 .InsertLines i, _ "Sub TabellenListen()" & Chr(13) & _ " Dim Tabelle as worksheet" & Chr(13) & _ " For each Tabelle in Activeworkbook.Worksheets " & Chr(13) & _ " Debug.Print Tabelle.name " & Chr(13) & _ " Next Tabelle " & Chr(13) & _ "End Sub" End WithEnd Sub

Im Makro aus Listing 14.9 wird Zeile um Zeile übertragen. Die Eigenschaft CountOfLines ermittelt, wie viele Codezeilen im Modul bereits enthalten sind, undaddiert den Wert 1 darauf. Diese Maßnahme ist notwendig, um eventuell bereitsbestehende Makros nicht zu überschreiben. Über die Methode InsertLines fügenSie die einzelnen Zeilen im Modul ein. Der Funktionsaufruf Chr(13) im obigenListing sorgt jeweils für den Zeilenvorschub.

Quellcode sichern über den Export

Sehr wichtig ist es ab und zu, seinen VBA-Code in Textdateien zu sichern. Da dieGefahr von Viren sehr groß ist, die Ihre Makros vernichten können, ist diese Maß-nahme zu empfehlen. Dabei sichern Sie Ihren Quellcode in Textdateien. Stan-dardmäßig können Sie diese Aufgabe manuell durchführen, indem Sie dasentsprechende Modul, welches Sie sichern möchten, im Projekt-Explorer mit derrechten Maustaste anklicken und aus dem Kontextmenü den Befehl DATEI EXPOR-TIEREN anklicken.

540

Page 541: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Typische Aufgaben mit der VBE erledigen

Im Dialogfeld DATEI EXPORTIEREN wählen Sie das gewünschte Verzeichnis aus,geben der Sicherung einen Namen und bestätigen mit einem Klick auf die Schalt-fläche SPEICHERN.

Diesen Vorgang können Sie selbstverständlich auch vollautomatisch über einMakro durchführen, wie Sie es in Listing 14.10 sehen können.

Abbildung 14.8: Das neue Makro wird unterhalb des letzten Makros in Modul1 eingefügt.

Abbildung 14.9: Einzelne Module per Hand sichern

541

Page 542: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

Listing 14.10: Den Quellcode in einer Textdatei sichern

Sub ModulInTextdateiSichern()Dim VBKomp As ObjectConst ExportDatei = "C:\Eigene Dateien\Sicherung.txt"

On Error Resume NextSet VBKomp = _ ThisWorkbook.VBProject.VBComponents("Modul1")

With VBKomp .Export ExportDateiEnd WithEnd Sub

Legen Sie über die Anweisung Set fest, welches Modul gesichert werden soll. Mitder Methode Export sichern Sie eine Komponente als Textdatei. Dabei geben Sieden Namen sowie den Pfad der Textdatei an, in die Ihr Quellcode exportiert wer-den soll. Sollte diese Datei noch nicht existieren, dann wird diese angelegt.

Abbildung 14.10: Alle Makros aus Modul1 wurden erfolgreich gesi-chert.

542

Page 543: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Typische Aufgaben mit der VBE erledigen

Module ausdrucken

Auch eine Art von Sicherung bietet der Ausdruck der Makros. Dazu können Siemanuell im Projekt-Explorer das gewünschte Modul mit der rechten Maustasteanklicken und aus dem Kontextmenü den Befehl DRUCKEN auswählen.

Per Makro gehen Sie hierzu einen kleinen Umweg. Speichern Sie das gewünschteModul zuerst in einer Textdatei, lesen diese in eine normale Excel-Tabelle ein,stellen die bevorzugte Schriftart sowie Schriftgröße ein und drucken die Makrosaus. Das Makro für diese Aufgabe lautet:

Listing 14.11: Ein Modul mit allen Makros drucken

Sub DruckenModul()Const ExportDatei = "C:\Eigene Dateien\Ausdruck.txt"

ActiveWorkbook.VBProject.VBComponents("Modul1").Export ExportDatei Workbooks.OpenText ExportDatei With ActiveSheet.Cells .Font.Name = "Courier" .Font.Size = 10 .PrintOut End With Application.DisplayAlerts = False ActiveWorkbook.Close Kill ExportDatei Application.DisplayAlerts = True

End Sub

Wenden Sie im ersten Schritt die Methode Export an, um das gewünschte Modulin einer Textdatei zu sichern. Danach öffnen Sie die Textdatei, indem Sie dieMethode OpenText einsetzen. Jetzt befinden sich alle Makros in einer Tabelle.Diese Tabelle formatieren Sie nun, indem Sie die gewünschte Schriftart sowieSchriftgröße einstellen. Dazu verwenden Sie die Eigenschaften Name und Size, dieSie auf das Font-Objekt anwenden. Drucken Sie die Tabelle danach über dieMethode PrintOut aus. Nach dem Ausdruck setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um beim Schließen der Textdatei keine Rückfrage vonExcel zuzulassen. Über die Anweisung Kill können Sie die Textdatei daraufhinlöschen. Setzen Sie am Ende des Makros die Eigenschaft DisplayAlerts auf denWert True, um Standardmeldungen in Excel wieder zuzulassen.

543

Page 544: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

Arbeitsmappen von Modulen befreien

Wenn Sie bereits vorhandene Module in einer Arbeitsmappe löschen möchten,um beispielsweise einem Kunden eine von Quellcode bereinigte Arbeitsmappezur Verfügung zu stellen, dann starten Sie das Makro aus Listing 14.12.

Listing 14.12: Ein bestimmtes Modul löschen

Sub LöschenModul() On Error Resume Next With ActiveWorkbook.VBProject .VBComponents.Remove .VBComponents("ModulNeu") End WithEnd Sub

Mit der Methode Remove können Sie ein bestimmtes Modul löschen. Die OnError-Anweisung verhindert einen Makroabsturz, wenn das Modul nicht gefundenwerden kann, weil es eventuell bereits gelöscht wurde bzw. gar nicht existiert.

Abbildung 14.11: Die Tabelle kurz vor dem Ausdruck

544

Page 545: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Typische Aufgaben mit der VBE erledigen

Wenn es darum geht, alle Module einer Arbeitsmappe zu entfernen, dann könnenSie das Makro aus Listing 14.13 einsetzen:

Listing 14.13: Alle Module aus einer Arbeitsmappe entfernen

Sub ModuleLöschen()Dim VBKomp As VBComponent

With Application.VBE.ActiveVBProject For Each VBKomp In .VBComponents If VBKomp.Type = 1 Then .VBComponents.Remove VBKomp Next VBKomp End WithEnd Sub

In einer Schleife durchlaufen Sie alle VBE-Komponenten einer Arbeitsmappe.Über die Eigenschaft Type finden Sie heraus, ob es sich dabei um ein Modul, einKlassenmodul oder eine UserForm handelt. Im Falle eines Moduls meldet dieseEigenschaft den Wert 1 zurück. Entfernen Sie in diesem Fall das entsprechendeModul mithilfe der Methode Remove.

Ein bestimmtes Makro entfernen

Einen Schritt weiter geht die nächste Aufgabe. In dieser Aufgabe soll aus einembestimmten Modul ein Makro entfernt werden. Das Problem bei dieser Aufgabe ist,dass Sie dieses eine Makro unter den vielen anderen erst einmal finden müssen.

In der folgenden Aufgabe soll das Makro TabellenListen im MODUL1 gefundenund gelöscht werden. Die Lösung dieser Aufgabenstellung können Sie im folgen-den Makro aus Listing 14.14 sehen.

Listing 14.14: Ein bestimmtes Makro finden und löschen

Sub MakroLöschen()Dim VBCodeModul As CodeModuleDim i As LongDim e As Long

Set VBCodeModul = _ ThisWorkbook.VBProject.VBComponents("Modul1").CodeModule

545

Page 546: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

With VBCodeModul i = .ProcStartLine("TabellenListen", vbext_pk_Proc) e = .ProcCountLines("TabellenListen", vbext_pk_Proc) .DeleteLines i, eEnd WithEnd Sub

Geben Sie im ersten Schritt des Makros über die Anweisung Set an, in welchemModul sich das zu löschende Makro befindet. Danach ermitteln Sie über dieMethode ProcStartLine, an welcher Stelle das gesuchte Makro beginnt. Dabeiübergeben Sie dieser Methode den Namen des Makros, welches Sie finden möch-ten. Im zweiten Argument legen Sie die Art der zu suchenden Prozedur fest. DaEigenschaftenprozeduren mehrere Darstellungen im Modul haben können, müs-sen Sie die Art der zu suchenden Prozedur festlegen. Alle Prozeduren verwendendie Konstante vbext_pk_Proc. Die Methode ProcStartLine gibt die Zeilennummerin einer Integer-Variablen zurück. Damit haben Sie die genaue Startposition deszu löschenden Makros.

Was jetzt noch fehlt, ist das Ende des zu löschenden Makros. Diese Zeilenpositionkönnen Sie mithilfe der Methode ProcCountLines ermitteln, der Sie wie schon vor-her, den Namen des zu löschenden Makros übergeben und über die Konstantevbext_pk_Proc dafür sorgen, dass nach Prozeduren gesucht werden soll.

Entfernen Sie im nächsten Schritt die ermittelten Zeilen, indem Sie der MethodeDeleteLines die gerade eben ermittelten Positionen der Start- sowie Endezeile deszu löschenden Makros übergeben.

Ein Ereignis löschen

Sie wissen jetzt, wie Sie Module und einzelne Makros löschen, die in Modulenuntergebracht sind. Was aber machen Sie, wenn Sie beispielsweise Ereignisse ent-fernen möchten, welche hinter einer Tabelle im Projekt-Explorer verborgen sind?In diesem Fall starten Sie das Makro aus Listing 14.15:

Listing 14.15: Alle Ereignisse, die hinter der Tabelle1 stehen, werden gelöscht

Sub EntfernenEreignisse() With ActiveWorkbook.VBProject.VBComponents("Tabelle1").CodeModule .DeleteLines 1, .CountOfLinesEnd WithEnd Sub

546

Page 547: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Typische Aufgaben mit der VBE erledigen

Da auch einzelne Tabellen in der Eigenschaft VBComponents verzeichnet sind, kön-nen Sie diese auch gezielt ansprechen. Mithilfe der Methode DeleteLines entfer-nen Sie alle Ereignisse, die sich hinter der TABELLE1 befinden. Übergeben Siedieser Methode als Argumente die Startzeile (= 1) sowie die Anzahl der Zeilen, diehinter dieser Tabelle erfasst wurden. Diese Information können Sie über dieEigenschaft CountOfLines ermitteln.

Auf eine ganz ähnliche Weise können Sie übrigens auch dynamischEreignisse hinter einzelne Tabellen legen. Das Makro aus Listing 14.16stellt das Ereignis Worksheet_Change hinter der TABELLE1 ein.

Listing 14.16: Ein Ereignis dynamisch einstellen

Sub EreignisEinstellen()With ThisWorkbook.VBProject.VBComponents("Tabelle1").CodeModule .InsertLines 1, _"Private Sub Worksheet_Change(ByVal Target As Range)" & Chr(13) & _" Msgbox ""Zellenänderung durchgeführt in Zelle: "" & _ Target.Address" & Chr(13) & _"End Sub"End WithEnd Sub

Geben Sie im ersten Schritt über die Anweisung Set an, hinter welcheTabelle das Ereignis Worksheet_Change eingefügt werden soll. Danachsetzen Sie die Methode InsertLines ein, um den Quellcode einzufü-gen. Dabei übergeben Sie dieser Methode zwei Argumente. Im erstenArgument legen Sie die Startzeile fest, ab der der Quellcode eingefügtwerden soll. Im zweiten Argument übertragen Sie das Ereignis Zeile fürZeile.

Abbildung 14.12: Das Ereignis wur-de per Makro ein-gestellt.

547

Page 548: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

VBE aufrufen

Standardmäßig drücken Sie die Tastenkombination (Alt) + (F11), um in die Ent-wicklungsumgebung zu wechseln. Diesen Vorgang können Sie aber auch über einMakro durchführen. Dieses Makro können Sie dann beispielsweise einer Schaltflä-che in einer Excel-Tabelle zuweisen und somit mit einem Klick in die Entwick-lungsumgebung wechseln.

Listing 14.17: Die Entwicklungsumgebung per Makro aufrufen

Sub VBEEditorAufrufen()With Application.VBE.MainWindow .SetFocus .Visible = TrueEnd WithEnd Sub

Die Eigenschaft MainWindow gibt ein Window-Objekt zurück, das das Hauptfensterder Entwicklungsumgebung von Visual Basic darstellt. Über die Methode SetFo-cus wird der Fokus auf das Entwicklungsfenster verschoben, d.h. alle folgendenAktionen werden danach in diesem Fenster durchgeführt. Mithilfe der EigenschaftVisible machen Sie das Entwicklungsfenster sichtbar, indem Sie diese Eigen-schaft auf den Wert True setzen.

14.7 Fragen & Antworten

F Wie können Sie eine UserForm aus einer Arbeitsmappe entfernen?

A Eine UserForm stellt wie auch ein Modul oder ein Klassenmodul eineVBE-Komponente dar, die Sie gezielt ansprechen und somit auch entfer-nen können. Das folgende Makro aus Listing 14.18 entfernt dieUSERFORM1 aus der aktiven Arbeitsmappe.

Listing 14.18: Eine UserForm löschen

Sub UserformLöschen() With Workbooks(ActiveWorkbook.Name).VBProject .VBComponents.Remove.VBComponents("Userform1") End WithEnd Sub

548

Page 549: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Fragen & Antworten

F Wie kann ich die einzelnen VBE-Komponenten in einer Arbeitsmappe identifi-zieren?

A Jede einzelne VBE-Komponente kann über ihren Typ bestimmt werden.Im folgenden Makro aus Listing 14.19 werden alle in der Arbeitsmappevorhandenen VBE-Komponenten aufgelistet.

Listing 14.19: Alle VBE-Komponenten der Arbeitsmappe auflisten

Sub KomponentenAusgeben()Dim VBKomp As VBComponent

For Each VBKomp In ThisWorkbook.VBProject.VBComponents Debug.Print "Name der Komponente: " & VBKomp.Name & _ Chr(13) & "Typ der Komponente: " & _ VBKomp.Type & Chr(13) Next VBKompEnd Sub

Durchlaufen Sie in einer Schleife alle VBE-Komponenten der Arbeits-mappe und geben Sie die Namen der Komponenten über die EigenschaftName sowie den Typ der Komponente über die Eigenschaft Type mithilfeder Anweisung Debug.Print im Direktfenster der Entwicklungsumgebungaus.

Abbildung 14.13: Name und Typ der einzelnen VBE-Komponen-ten ausgeben

549

Page 550: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Import und Export über VBE-Programmierung

F Wie können Sie Ereignisse aus einer Arbeitsmappe entfernen, welche im Projekt-Explorer hinter dem Eintrag DieseArbeitsmappe hinterlegt sind?

A Sie können ein Arbeitsmappenereignis aus der Arbeitsmappe entfernen,indem Sie das Makro aus Listing 14.20 einsetzen.

Listing 14.20: Ein Arbeitsmappenereignis entfernen

Sub ArbeitsmappenEreignisEntfernen() With ThisWorkbook.VBProject.VBComponents _("DieseArbeitsmappe").CodeModule .DeleteLines 1, .CountOfLinesEnd WithEnd Sub

Geben Sie als VBE-Komponente direkt den Namen DieseArbeitsmappean, um Zugriff auf die dort eventuell eingefügten Ereignisse zu bekom-men. Danach wenden Sie die Methode DeleteLines an, um die Ereignissezu entfernen. Übergeben Sie dieser Methode als Argumente die Startzeile(= 1) sowie die Anzahl der Zeilen, die hinter diesem Eintrag erfasst wur-den. Diese Information können Sie über die Eigenschaft CountOfLinesermitteln.

14.8 Quiz

F Über welche Eigenschaft können Sie den Namen sowie den Pfad eines Verweisesherausfinden?

F Wie lautet die Methode, um eine Textdatei in ein VBA-Modul einzulesen?

F Schreiben Sie ein Makro, welches die beiden Module ModulNeu undModulNeu2 aus der Arbeitsmappe entfernt.

F Erfassen Sie ein Makro, welches alle Module einer Arbeitsmappe im Direktfens-ter der Entwicklungsumgebung ausgibt.

550

Page 551: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Übung

14.9 Übung

Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe VBE.xls undschreiben ein Makro, das alle Makros aus allen Modulen einer Arbeitsmappe imDirektfenster der Entwicklungsumgebung auflistet.

Die Lösung dieser Aufgabe können Sie im Anhang A nachlesen.

551

Page 552: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;
Page 553: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

A

Lösungen der Tages-Übungen

Page 554: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

Tag 1

Aufgabe

In einer Tabelle sollen die Nullwerte nicht angezeigt werden. Außerdem sollen dieGitternetzlinien sowie die Spalten- und Zeilenbeschriftungen im Ausdruck mitausgedruckt werden. Lösen Sie diese Aufgabe mit Hilfe des Makrorekorders undentfernen Sie danach aus der Aufzeichnung die nicht benötigten Zeilen. SehenSie sich jedoch vorab einmal die Ausgangssituation an.

Lösung

Die Einstellungen für den Ausdruck des Gitternetzes sowie der Spalten- und Zei-lenbeschriftungen der Tabelle finden Sie im Menü DATEI unter dem BefehlSEITE EINRICHTEN auf der Registerkarte TABELLE. Die Ansicht der Nullwerte kön-nen Sie im Menü EXTRAS mithilfe des Befehls OPTIONEN auf der RegisterkarteANSICHT ein- bzw. ausblenden. Führen Sie diese beiden einzelnen Schritte nach-einander durch und aktivieren vorher den Makrorekorder. Entfernen Sie aus derAufzeichnung die nicht benötigten Zeilen. Als Ergebnis erhalten Sie dann folgen-des Makro:

Listing A.1: Gitternetz sowie Zeilen- und Spaltenbeschriftungen vor dem Druck einstel-len und Nullwerte ausblenden

Sub Makro4()'' Makro4 Makro' Makro am 24.08.2003 von Bernd Held aufgezeichnet'

With ActiveSheet.PageSetup .PrintHeadings = True .PrintGridlines = TrueEnd With ActiveWindow.DisplayZeros = FalseEnd Sub

Setzen Sie die Eigenschaften PrintHeadings und PrintGridlines auf den WertTrue.

554

Page 555: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 2

Tag 2

Aufgabe

Die Namen der Tabellen einer Arbeitsmappe sollen auf der ersten Tabelle dieserArbeitsmappe in Spalte A eingefügt werden. Lösen Sie diese Aufgabenstellung mit-hilfe einer For Each Next –Schleife.

Lösung

Um die Namen alle Tabellen einer Arbeitsmappe auf der ersten Tabelle in SpalteA auszugeben, erfassen Sie folgendes Makro:

Listing A.2: Alle Tabellennamen in erste Tabelle schreiben

Sub Übung01()Dim Tabelle As Worksheet

Sheets("Tabelle1").ActivateRange("A1").Select

For Each Tabelle In ActiveWorkbook.Worksheets ActiveCell.Value = Tabelle.Name ActiveCell.Offset(1, 0).SelectNext Tabelle

End Sub

Durch die Worksheets-Auflistung gewinnen Sie Zugriff auf alle in der aktivenArbeitsmappe befindlichen Tabellenblätter. Die Namen dieser Tabellen könnenSie über die Eigenschaft Name abfragen und in die Tabelle schreiben.

Tag 3

Aufgabe

Überprüfen Sie, ob das Add-In Solver bereits geladen ist.

555

Page 556: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

Lösung

Um zu ermitteln, ob das Add-In Solver bereits im Add-In-Manager eingebundenist, starten Sie folgendes Makro:

Listing A.3: Add-In Prüfung

Sub AddInsPrüfung()Dim AddI As AddInDim b As Boolean

b = FalseFor Each AddI In Application.AddIns If AddI.Name = "Solver" And AddI.Installed = True Then b = TrueNextIf b = True Then MsgBox "Das Add-In Solver ist eingebunden!" _ Else MsgBox "Das Add-In Solver ist noch nicht eingebunden!"End Sub

In der AddIns-Auflistung sind alle Add-Ins von Excel verzeichnet. Über die Eigen-schaft Installed können Sie prüfen, ob ein bestimmtes Add-In bereits im Add-In-Manager eingebunden wurde.

Tag 4

Aufgabe

Programmieren Sie ein Makro, welches alle Arbeitsmappen aus einem bestimm-ten Verzeichnis öffnet, das aktuelle Datum in Zelle A1 der ersten Tabelle schreibtund diese Arbeitsmappen speichert und schließt.

Lösung

Starten Sie das folgende Makro:

Listing A.4: Alle Mappen eines Verzeichnisses öffnen und manipulieren

Sub ArbeitsmappenÖffnenUndBearbeiten()Dim Mappe As StringConst Lw = "C:\"Const Pfad = "C:\Eigene Dateien\"

556

Page 557: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 5

ChDrive LwChDir Pfad

Mappe = Dir(Pfad & "*.xls")

Do While Mappe <> "" Workbooks.Open Mappe Workbooks(Mappe).Sheets(1).Range("A1").Value = Date Workbooks(Mappe).Close SaveChanges:=True Mappe = DirLoopEnd Sub

Bevor Sie die Arbeitsmappen nacheinander öffnen können, müssen Sie sicherstel-len, dass das richtige Laufwerk sowie das gewünschte Verzeichnis eingestellt ist.Erst dann ermitteln Sie die Arbeitsmappen mithilfe der Funktion Dir, der Sie alsEndung *.xls angeben. Öffnen Sie danach die einzelnen Arbeitsmappen undschreiben in die erste Tabelle einer jeden Mappe in Zelle A1 das aktuelle Datum.Beim Schließen der Arbeitsmappen speichern Sie diese Anpassung.

Tag 5

Aufgabe 1

Legen Sie eine neue Arbeitsmappe an und fügen darin genau 12 Tabellen ein, dieSie nach Monatsnamen benennen.

Lösung

Erfassen Sie folgendes Makro:

Listing A.5: Benannte Tabellen einfügen

Sub TabellenEinfügenMitMonatsnamen()Dim i As Integer

Workbooks.Add

For i = 1 To 12 Worksheets.Add Before:=Worksheets(Worksheets.Count)

557

Page 558: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

ActiveSheet.Name = MonthName(i)Next iEnd Sub

Über die Methode Add können Sie eine neue Arbeitsmappe anlegen. Danach wen-den Sie wiederum die Methode Add an, um die einzelnen Tabellen einzufügen.Benennen Sie die eingefügten Tabellen, indem Sie die Eigenschaft Name verwen-den. Über die Funktion MonthName können Sie die Monatsnamen (Januar bisDezember) ermitteln.

Aufgabe 2

Entfernen Sie aus einer Tabelle alle Formeln, und zwar so, dass daraus Festwertewerden.

Lösung

Geben Sie folgendes Makro ein:

Listing A.6: Alle Formelzellen aus Tabelle durch Festwerte ersetzen

Sub FormelnAusTabelleEntfernen()Dim zelle As Range

Sheets("Deckungsbeitrag").ActivateSelection.SpecialCells(xlCellTypeFormulas).Select

For Each zelle In Selection zelle.Value = zelle.ValueNext zelleEnd Sub

Wenden Sie die Methode SpecialCells an, der Sie die Konstante xlCellTypeFor-mulas zuweisen. Damit werden alle Formelzellen in der aktiven Tabelle markiert.Diese Zellen stehen jetzt alle in der Auflistung Selection. Durchlaufen Sie imAnschluss daran alle Zellen innerhalb der Markierung und überschreiben die For-meln, indem Sie die Eigenschaft Value einsetzen.

558

Page 559: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 6

Tag 6

Aufgabe 1

Erstellen Sie eine neue Tabelle und fügen dort im Bereich A1:D20 einige Zahlen-werte ein. Ihre Aufgabe besteht nun darin, alle Zellen zu kennzeichnen, die einenWert größer als 500 aufweisen. Färben Sie diese Zellen mit der HintergrundfarbeGELB.

Lösung

Listing A.7: Alle Zellen > 500 werden gelb eingefärbt

Erfassen Sie das folgende Makro:Sub ZellenInBereichFärben()Dim Bereich As RangeDim Zelle As Range

Sheets("Tabelle14").ActivateSet Bereich = Range("A1:D20") For Each Zelle In Bereich If Zelle.Value > 500 Then Zelle.Interior.ColorIndex = 6 Next ZelleEnd Sub

Aktivieren Sie im ersten Schritt die gewünschte Tabelle und legen den Bereichfest, indem Sie bestimmte Zellen färben möchten. In einer anschließendenSchleife durchlaufen Sie alle Zellen, die innerhalb des definierten Bereichs lie-gen. Innerhalb der Schleife prüfen Sie, ob der Zellwert (= Value) größer als 500 ist.Wenn ja, dann färben Sie den Hintergrund der Zelle (= Interior) mithilfe derEigenschaft ColorIndex, der Sie den Wert 6 zuweisen.

Aufgabe 2

Listen Sie die Zellenadressen aller verwendeten Namen einer Arbeitsmappe ineinem Meldungsfenster auf.

Lösung

Erfassen Sie folgendes Makro:

559

Page 560: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

Listing A.8: Alle Zellenadressen von Namen ermitteln und ausgeben

Sub AlleNamenInMappeAuflisten()Dim BenannteBereiche As ObjectDim s As String

For Each BenannteBereiche In ActiveWorkbook.Names s = s & BenannteBereiche & Chr(13)Next MsgBox "Die Adressen der verwendeten Namen lauten: " & Chr(13) & sEnd Sub

In der Auflistung Names sind alle verwendeten Namen der aktiven Arbeitsmappeverzeichnet. Über die Objektvariable BenannteBereiche können Sie diese jetzt aus-lesen und am Ende des Makros in einer Bildschirmmeldung ausgeben.

Aufgabe 3

Dokumentieren Sie alle verwendeten Namen einer Arbeitsmappe, indem Sie eineneue Tabelle einfügen und den Namen und dessen Zellenadresse ausgeben.

Lösung

Erfassen Sie folgendes Makro:

Listing A.9: Alle verwendeten Namen in Tabelle dokumentieren

Sub AlleNamenProtokollieren()Dim BenannteBereiche As Object

Sheets.Add Range("A1").Select For Each BenannteBereiche In ActiveWorkbook.Names ActiveCell.Value = BenannteBereiche.Name ActiveCell.Offset(0, 1).Value = _ ActiveWorkbook.Names.Item(BenannteBereiche.Name) ActiveCell.Offset(1, 0).Select NextEnd Sub

In dieser Lösung werden die eingesetzten Namen einer Arbeitsmappe dokumen-tiert. Dabei wird jeweils der Name des Namens sowie dessen Zellenadresse ausge-geben.

560

Page 561: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 6

Aufgabe 4

Löschen Sie alle Gültigkeitsfestlegungen aus einer Tabelle.

Lösung

Erfassen Sie folgendes Makro:

Listing A.10: Alle Gültigkeiten aus einer Tabelle entfernen

Sub GültigkeitLöschen()ActiveCell.SpecialCells(xlCellTypeSameValidation).Select Selection.Validation.DeleteEnd Sub

Über die Methode SpecialCells, der Sie die Konstante xlCellTypeSameValidationzuweisen, können Sie alle Zellen, die eine Gültigkeitsregel beinhalten, ermitteln.Über die Methode Select markieren Sie diese Zellen. Entfernen Sie die Gültig-keitsregeln, indem Sie die Methode Delete anwenden.

Aufgabe 5

Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte.

Lösung

Starten Sie das folgende Makro:

Listing A.11: Formeln in Festwerte wandeln

Sub FormelnInFestwerteWandeln()Dim Zelle As Range

Sheets("Tabelle3").ActivateActiveCell.SpecialCells(xlCellTypeFormula).Select

For Each Zelle In Selection Zelle.Value = Zelle.ValueNext ZelleEnd Sub

Über die Methode SpecialCells, der Sie die Konstante xlCellTypeFormula zuwei-sen, können Sie alle Zellen, die eine Formel beinhalten, ermitteln. Über dieMethode Select markieren Sie diese Zellen. Durchlaufen Sie anschließend alleZellen innerhalb der Markierung und überschreiben die Formeln mit Festwerten.

561

Page 562: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

Tag 7

Aufgabe 1

Stellen Sie sicher, dass beim Aktivieren einer bestimmten Tabelle die Neuberech-nung ausgelöst wird.

Lösung

Für diese Aufgabe setzen Sie das Ereignis Activate ein, das Sie im folgenden Lis-ting sehen.

Listing A.12: Die Neuberechnung einer Tabelle beim Aktivieren der Tabelle sicherstellen

Private Sub Worksheet_Activate() Application.Calculation = xlAutomaticEnd Sub

Weisen Sie der Eigenschaft Calculation die Konstante xlAutomatic zu. Damitwird die Tabelle neu berechnet.

Aufgabe 2

Wie muss das Ereignis lauten, wenn Sie vor dem Speichern einer Arbeitsmappe inder ersten Tabelle der Arbeitsmappe das aktuelle Tagesdatum erfassen möchten?

Lösung

Das Ereignis heißt WorkBook_BeforeSave, welches im folgenden Listing angezeigtwird.

Listing A.13: Das aktuelle Tagesdatum vor dem Speichern in Zelle A1 der Tabelle1 schreiben

Private Sub Workbook_BeforeSave _ (ByVal SaveAsUI As Boolean, Cancel As Boolean) ThisWorkbook.Sheets(1).Range("A1").Value = Date End Sub

Indem Sie den Index 1 auf die Auflistung Sheets anwenden, verweisen Sie auf dieerste Tabelle der Arbeitsmappe, in der dieser Code gespeichert ist. Über die Funk-tion Date ermitteln Sie das aktuelle Tagesdatum, das Sie der Zelle A1 zuweisen.

562

Page 563: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 7

Aufgabe 3

Ihre Aufgabe besteht nun darin, auf einer bestimmten Tabelle die beiden Maustas-ten zu programmieren. Für den Bereich A1:E15 sollen dabei folgende Vorgängeablaufen:

� Klicken mit der rechten Maus: Addieren der Zelle um den Wert 10

� Doppelklick mit der linken Maus: Subtrahieren der Zelle mit 10

Lösung

Erfassen Sie die beiden Makros aus Listing 14:

Listing A.14: Addieren und Subtrahieren per Mausklick

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

Set Bereich = Range("A1:E15")If Intersect(Bereich, Target) Is Nothing Then Exit SubTarget.Value = Target.Value – 10Cancel = TrueEnd Sub

Private Sub Worksheet_BeforeRightClick _(ByVal Target As Range, Cancel As Boolean)Dim Bereich As Range

Set Bereich = Range("A1:E15")If Intersect(Bereich, Target) Is Nothing Then Exit SubTarget.Value = Target.Value + 10Cancel = TrueEnd Sub

Bevor Sie die Rechenoperationen durchführen, müssen Sie prüfen, ob die ange-klickten Zellen auch im definierten Bereich liegen. Dazu verwenden Sie dieMethode Intersect. Liegt die angeklickte Zelle, die im Argument Target verzeich-net ist, im definierten Bereich, dann wird ein Range-Objekt zurückgegeben. In die-sem Fall liegt die angeklickte Zelle im definierten Bereich. Andernfalls liefertdiese Methode den Wert Nothing zurück.

563

Page 564: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

Tag 8

Aufgabe 1

Formatieren Sie die Pivot-Tabelle auf TABELLE1 mit einem AutoFormat.

Lösung

Starten Sie zu diesem Zweck das folgende Makro aus Listing Anhang 15:

Listing A.15: Eine Pivot-Tabelle formatieren

Sub PivotFormatEinstellen()Dim Pivot1 As PivotTable

Set Pivot1 = Worksheets("Tabelle11").PivotTables(1) With Pivot1 .TableRange1.AutoFormat Format:=xlClassic3 End WithEnd Sub

In der Auflistung PivotTables sind alle Pivot-Tabellen der Tabelle verzeichnet.Der Index 1 bedeutet, dass die zuerst eingefügte Pivot-Tabelle angesprochen wer-den soll. Über die Methode AutoFormat können Sie mittels einer Formatkonstan-ten ein gewünschtes Format zuweisen. Wie die einzelnen Konstanten heißen,können Sie übrigens feststellen, indem Sie die Online-Hilfe zu dieser Methodeaufrufen.

Aufgabe 2

Erstellen Sie ein Zylinderdiagramm auf Basis der Tabelle ÜBUNGEN. Fügen Siedas Diagramm als separates Diagrammblatt ein.

Lösung

Erfassen Sie das Makro aus Listing 16:

Listing A.16: Ein Zylinderdiagramm einfügen

Sub ÜbungZylinder()Dim Bereich As RangeDim s As String

Sheets("Übung").Activate

564

Page 565: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 9

Set Bereich = Range("B3:E7") s = ActiveSheet.Name Charts.Add With ActiveChart .ApplyCustomType _ ChartType:=xlCylinderColClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlRows End WithEnd Sub

Legen Sie im ersten Schritt den Bereich fest, auf dem basierend Sie Ihr Diagrammerstellen möchten. Danach wenden Sie die Methode Add an, um ein neues Dia-gramm einzufügen. Geben Sie im nächsten Schritt an, welchen Diagrammtyp Sieeinsetzen möchten. Dazu weisen Sie der Eigenschaft ChartType die gewünschteDiagrammkonstante zu. Über die Methode SetSourceData weisen Sie dem Dia-gramm nun den vorher definierten Bereich zu.

Tag 9

Aufgabe

Schreiben Sie eine modulare Funktion, die vor der Aktivierung einer Tabelleüberprüft, ob die zu aktivierende Tabelle in der Arbeitsmappe überhaupt vorhan-den ist.

Lösung

Erfassen Sie die Funktion sowie das aufrufende Makro aus Listing A.17:

Listing A.17: Vor dem Zugriff auf eine Tabelle deren Existenz prüfen

Function TabelleExist(ByVal s As String) As BooleanDim b As Boolean

On Error GoTo fehler Sheets(s).Activate TabelleExist = True Exit Function

565

Page 566: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

fehler: TabelleExist = FalseEnd Function

Sub TabelleAktivieren()Dim b As Boolean

b = TabelleExist("Tabelle1")If b = False Then MsgBox "Die Tabelle ist in der Arbeitsmappe nicht verfügbar!"End Sub

Innerhalb der Funktion TabelleExist versuchen Sie die angegebene Tabelle zuaktivieren. Wenn dies nicht gelingt, dann können Sie davon ausgehen, dass dieangegebene Tabelle nicht in der Arbeitsmappe vorhanden ist. In diesem Fall wirdein Fehler provoziert, der über die Funktion aber abgefangen werden kann. So lie-fert die Funktion in diesem Fall den Wert False. Mithilfe dieser Variablen, die andas Makro zurückgegeben wird, können Sie entscheiden, wie Sie weiter vorgehenmöchten.

Tag 10

Aufgabe

Schreiben Sie ein Makro, das alle Zellenadressen der Hyperlinks in einer separa-ten Tabelle dokumentiert.

Lösung

Erfassen Sie das Makro aus Listing A.18:

Listing A.18: Alle Hyperlinks einer Tabelle werden dokumentiert

Sub HyperlinksDokumentieren()Dim Hyper As HyperlinkDim i As IntegerDim Blatt As String

Worksheets.AddActiveSheet.Name = "DokuHyper"

566

Page 567: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 11

Blatt = ActiveSheet.Name

Sheets("PrüfungHyper").Activatei = 1For Each Hyper In ActiveSheet.Hyperlinks Sheets(Blatt).Cells(i, 1) = Hyper.Range.Address Sheets(Blatt).Cells(i, 2) = Hyper.Range.Value i = i + 1Next HyperEnd Sub

Fügen Sie im ersten Schritt eine neue Tabelle ein und benennen diese. Wechselnsie dann auf die Tabelle, die die Hyperlinks enthält. In der Auflistung Hyperlinkssind alle Hyperlinks der aktiven Tabelle enthalten. Auf diese Hyperlinks könnenSie nun zugreifen und die Adresse sowie deren Hyperlinktext in die TabelleDOKUHYPER schreiben.

Tag 11

Aufgabe 1

Schreiben Sie ein Makro, das alle Datensätze aus der Access-Tabelle VERANSTAL-TUNG in die Excel-Tabelle überträgt, die einen Veranstaltungsbeginn nach dem04.10.2002 haben.

Lösung

Erfassen Sie das Makro aus Listing A.19:

Listing A.19: Bestimmte Datensätze aus Access nach Excel übertragen

Sub DatensätzeSuchenUndÜbertragenÜbung()Dim ADOC As ADODB.ConnectionDim DBS As ADODB.RecordsetDim s As String s = "VDatum > '04.10.2002'" Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb"

567

Page 568: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic .Find Criteria:=s, SearchDirection:=adSearchForward Sheets("Übung").Activate Range("A2").Select If Not .EOF Then Do While Not .EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Value = _ Format(ActiveCell.Value, "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Vdatum ActiveCell.Offset(0, 1) = Format _ (ActiveCell.Offset(0, 1).Value, "dd.mm.yyyy") ActiveCell.Offset(0, 2).Value = DBS!Veranstaltung ActiveCell.Offset(0, 3).Value = DBS!V_Ort ActiveCell.Offset(0, 4).Value = DBS!Teilnehmer ActiveCell.Offset(0, 5).Value = DBS!Straße ActiveCell.Offset(0, 6).Value = DBS!PLZ ActiveCell.Offset(0, 7).Value = DBS!Ort ActiveCell.Offset(0, 8).Value = DBS!Kosten .Find Criteria:=s, SkipRecords:=1 ActiveCell.Offset(1, 0).Select Loop Else MsgBox "Datensatz nicht gefunden" End If .Close End With Columns("A:J").AutoFit

ADOC.Close Set DBS = Nothing Set ADOC = NothingEnd Sub

568

Page 569: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 12

Aufgabe 2

Schreiben Sie ein Makro, welches den Zellenbereich A1:C5 in ein neues Doku-ment kopiert. Dabei sollen die beiden Dateien über die Verknüpfungseigenschaftmiteinander verbunden bleiben.

Lösung

Erfassen Sie das aufrufende Makro aus Listing A.20:

Listing A.20: Einen Zellenbereich verknüpft in ein Word-Dokument einfügen

Sub ExcelDatenNachWordKopierenVernüpft()Dim WordApp As ObjectDim WordDok As ObjectDim Bereich As Range

Set WordApp = CreateObject("Word.application")WordApp.Visible = TrueSet WordDok = WordApp.Documents.Add

Set Bereich = Sheets("Übung").Range("A1:C5") Range(Bereich.Address).Copy WordApp.Selection.PasteSpecial Link:=True Application.CutCopyMode = False Set WordApp = Nothing Set WordDok = NothingEnd Sub

Tag 12

Aufgabe

Schreiben Sie ein Makro, welches die Menübefehl SPEICHERN und SPEICHERNUNTER im Menü DATEI deaktiviert.

Lösung

Erfassen Sie das Makro aus Listing A.21:

569

Page 570: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

Listing A.21: Menübefehle deaktivieren

Sub MenüBefehleDeaktivieren()Dim MenüLeiste As CommandBarDim ctrl As CommandBarControl

Set MenüLeiste = CommandBars(1)

For Each ctrl In MenüLeiste.Controls(1).Controls Debug.Print ctrl.Caption If ctrl.Caption = "&Speichern" Or _ ctrl.Caption = "Speichern &unter..." Then ctrl.Enabled = FalseNext ctrlEnd Sub

Über die Anweisung Debug.Print können Sie sich die genaue Beschriftung desMenübefehls vorab im Direktbereich ausgeben. Über die Eigenschaft Enabledkönnen Sie einen Menübefehl deaktivieren, indem Sie diese Eigenschaft auf denWert False setzen.

Das Deaktivieren eines Menübefehls können Sie übrigens auch über dieID vornehmen. Den Menübefehl SPEICHERN könnten Sie demnachauch über die Anweisung If ctrl.ID = 3 Then ctrl.Enabled = Falsedeaktivieren.

Tag 13

Aufgabe

Schreiben Sie ein Makro, welches die Ergebnisse der Vokabelabfragen in der sepa-raten Tabelle ÜBUNG dokumentiert.

Lösung

Listing A.22: Die Ergebnisse der Vokabelabfrage sichern

Private Sub CommandButton2_Click()'PrüfenDim frm As UserFormDim Cb As Object

570

Page 571: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Tag 13

Set frm = UserForm2

For Each Cb In frm.Controls If TypeName(Cb) = "CheckBox" Then Cb.Value = False Next Cb

With frm If .TextBox2.Value = Trans1 Then .CheckBox1.Value = True _ Else .CheckBox2.Value = True If .TextBox4.Value = Trans2 Then .CheckBox3.Value = True _ Else .CheckBox4.Value = True If .TextBox6.Value = Trans3 Then .CheckBox5.Value = True _ Else .CheckBox6.Value = True

'Vokabeln speichern Sheets("Übung").Activate Range("A65536").End(xlUp).Offset(1, 0).Select

ActiveCell.Value = .TextBox1.Value ActiveCell.Offset(0, 1).Value = .TextBox2.Value If .CheckBox1.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).Select

ActiveCell.Value = .TextBox3.Value ActiveCell.Offset(0, 1).Value = .TextBox4.Value If .CheckBox3.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).Select

ActiveCell.Value = .TextBox5.Value ActiveCell.Offset(0, 1).Value = .TextBox6.Value If .CheckBox5.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).SelectEnd WithSheets("Vokabeln").ActivateEnd Sub

571

Page 572: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Lösungen der Tages-Übungen

Tag 14

Aufgabe

Schreiben Sie ein Makro, das alle Makros aus allen Modulen einer Arbeitsmappeim Direktfenster der Entwicklungsumgebung auflistet.

Lösung

Erfassen Sie die beiden Makros aus Listing A.23:

Listing A.23: Alle Namen der Module im Direktfenster ausgeben

Sub MakrosAuflisten()Dim VBCodeModul As CodeModuleDim i As Long

Set VBCodeModul = _ThisWorkbook.VBProject.VBComponents("Modul1").CodeModule

With VBCodeModul i = .CountOfDeclarationLines + 1 Do Until i >= .CountOfLines Debug.Print .ProcOfLine(i, vbext_pk_Proc) i = i + .ProcCountLines(.ProcOfLine(i, _ vbext_pk_Proc), vbext_pk_Proc) LoopEnd WithEnd Sub

Geben Sie im ersten Schritt an, in welchem Modul sich die Makros befinden.Danach durchlaufen Sie das angegebene Modul und geben die Namen derMakros im Direktfenster aus.

572

Page 573: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

B

Wichtige Funktionen in einem eigenen Add-In

ablegen

Page 574: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

Wenn Sie die 14 Tage mit der Programmierung hinter sich haben, dann könnenSie sich an dem in diesem Anhang vorgestellten Add-In orientieren, welche Funk-tionen Sie in welcher Weise derart organisieren können. So können Sie späterleicht eigene Funktionen in dieses Add-In mit integrieren oder gar ein ganz neuesAdd-In erstellen.

Das Add-In und seine Funktionen werden übrigens in meinem aktuellen Excel-VBA-Kompendium beschrieben. In diesem Buch reichte leider der Platz hierfürnicht aus, daher haben wir uns entschlossen, Ihnen wenigstens als Service die Lis-tings sowie die Software auf CD-ROM mitzuliefern.

Sie finden alle Makros, die auf den folgenden Seiten aufgelistet sind, auf der mit-gelieferten CD-ROM im Verzeichnis ANHANG II in der Arbeitsmappe Macaddin.xls. Das fertige Add-In Macaddin.xla haben Sie ebenfalls in diesem Verzeichnis.Sie können es über das Menü EXTRAS und den Befehl ADD-INS-MANAGER einbin-den.

Folgende Funktionen werden Ihnen in meinem Add-In angeboten:

� Umwandlung von Formeln und Funktionen in Festwerte in der aktivenTabelle

� Umwandlung von Formeln und Funktionen in Festwerte als Kopie in einerneuen Datei

� Säubern aller Zellen im markierten Bereich von nicht druckbaren Zeichen

� Setzen von Zellenumbrüchen innerhalb einer Markierung

� Umwandlung von relativen Bezügen in absolute Bezüge

� Aktives Tabellenblatt als E-Mail-Anhang versenden

� Aktive Tabelle in neuer Arbeitsmappe speichern

� Wochentag, Datum und Uhrzeit anzeigen

� Informationen zur aktuellen Arbeitsmappe anzeigen (Name der Arbeitsmappe,Autor, letzter Zugriff, letzte Änderung, Speicherort der Arbeitsmappe)

� Öffnen aller verknüpften Arbeitsmappen

� Verknüpfungen zu anderen Arbeitsmappen entfernen

� Suchen von Text mit der Ersetzen-Funktion

� Suchen von Text mit der Markierungsfunktion

574

Page 575: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Ereignisse

� Markierung aller Zellen in der Tabelle, die Formeln, Kommentare, Konstan-ten, etc. enthalten.

� Löschen von bestimmten Zellen.

Das Add-In legt beim Aktivieren des Tools eine eigenes Menü an, das wie folgt aus-sieht.

B.1 Die Ereignisse

Das Add-In MACADDIN wird in der Arbeitsblatt-Menüleiste vor dem Hilfemenübeim Einbinden des Add-Ins erzeugt. Dazu setzen Sie das EreignisWorkbook_AddinInstall ein, welches automatisch eintritt, wenn Sie im ADD-INS-MANAGER das Add-In MACADDIN einbinden. Innerhalb des Ereignisses rufenSie das Makro MenüErstellen auf.

Listing B.1: Ereignis Workbook_AddinInstall zum dynamischen Erstellen eines eigenen Menüs beim Einbinden eines Add-Ins

Private Sub Workbook_AddinInstall() MenüErstellenEnd Sub

Beim Deaktivieren des Add-Ins sollte das zusätzliche Menü MACADDIN wiederentfernt werden. Dazu setzen Sie das Ereignis Workbook_AddinUninstall ein undrufen darin das Makro MENÜLÖSCHEN auf.

Abbildung B.1: Das Add-In des Autors

575

Page 576: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

Listing B.2: Ereignis Workbook_AddinUninstall zum Entfernen eines eigenen Menüs beim Deaktivieren eines Add-Ins

Private Sub Workbook_AddinUninstall() MenüLöschenEnd Sub

B.2 Der Quellcode

Die folgenden Makros werden an dieser Stelle nicht ausführlich erklärt. Ausführli-che Erklärungen zu den Makros und weiteren 1.000 Makros können Sie in mei-nem aktuellen Excel-VBA-Kompendium nachlesen (ISBN 3-8272-6577-0).

Menüerstellung

Listing B.3: Ein eigenes Menü erstellen

Sub MenüErstellen()Dim i As IntegerDim i_Hilfe As IntegerDim MenüNeu As CommandBarControlDim Mb As CommandBarControl

i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenüNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ before:=i_Hilfe, Temporary:=True) MenüNeu.Caption = "MacAdd&In"

Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = _ "Formeln, F&unktionen in Festwerte umwandeln _ (aktuelles Blatt)" .Style = msoButtonIconAndCaption

576

Page 577: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Der Quellcode

.OnAction = "FormelnInWerteUmwandeln" .FaceId = 39 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = _ "Formeln, Fu&nktionen in Festwerte umwandeln _ (neue Mappe)" .Style = msoButtonIconAndCaption .OnAction = "FormelnInWerteUmwandelnNeueDatei" .FaceId = 159 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Zellen in Markierung säubern" .Style = msoButtonIconAndCaption .OnAction = "ZellenSäubern" .FaceId = 1552 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Zellenumbrüche in Markierung setzen" .Style = msoButtonIconAndCaption .OnAction = "ZellenumbruchSetzen" .FaceId = 162 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Absolut-Bezüge setzen" .Style = msoButtonIconAndCaption .OnAction = "BezugÄndernInAbsolut" .FaceId = 384 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Ak&tive Tabelle als E-Mail versenden" .Style = msoButtonIconAndCaption

577

Page 578: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

.OnAction = "EmailAktivesTabellenblatt" .FaceId = 3738 .BeginGroup = True End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = _ "Akt&ive Tabelle in neuer Arbeitsmappe speichern" .Style = msoButtonIconAndCaption .OnAction = "AktivesTabellenblattAlsDatei" .FaceId = 3 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Wo&chentag, Datum und Uhrzeit anzeigen" .Style = msoButtonIconAndCaption .OnAction = "DatumUndUhrzeit" .FaceId = 126 .BeginGroup = True End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Informationen zur Mappe anzeigen" .Style = msoButtonIconAndCaption .OnAction = "InfoZurAktuellenDatei" .FaceId = 1954 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "&Öffnen aller verknüpften Mappen" .Style = msoButtonIconAndCaption .OnAction = "ÖffnenVerknüpfteMappen" .BeginGroup = True .FaceId = 23 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb

578

Page 579: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Der Quellcode

.Caption = "Verknüpfungen entfernen" .Style = msoButtonIconAndCaption .OnAction = "ExterneLinksInFestwerteUmsetzen" .FaceId = 2137 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Suchen von Text mit Ersetzen" .Style = msoButtonIconAndCaption .OnAction = "TextInArbeitsmappeSuchenUndErsetzen" .BeginGroup = True .FaceId = 141 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Suchen von Text mit Markieren" .Style = msoButtonIconAndCaption .OnAction = _ TextInArbeitsmappeSuchenUndKennzeichnen" .FaceId = 141 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlPopup) With Mb .Caption = "Markieren..." .BeginGroup = True End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Kommentarzellen" .FaceId = 1589 .OnAction = "KommentarzellenMarkieren" End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Formelzellen" .FaceId = 622 .OnAction = "Formelzellenmarkieren" End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Zellen mit Gültigkeitsprüfung" .FaceId = 1019

579

Page 580: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

.OnAction = "Gültigkeitszellenmarkieren" End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Zellen mit bedingten Formaten" .FaceId = 439 .OnAction = "BedingteFormatzellenmarkieren" End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlPopup) With Mb .Caption = "Löschen..." .BeginGroup = True End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Kommentare" .FaceId = 1592 .OnAction = "KommentareLöschen" End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Formeln und Verknüpfungen" .FaceId = 67 .OnAction = "FormelnLöschen" End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Inhalte" .FaceId = 67 .OnAction = "InhalteLöschen" End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Gültigkeitsprüfungen" .FaceId = 67 .OnAction = "GültigkeitLöschen" End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle bedingten Formate" .FaceId = 67 .OnAction = "BedFormateLöschen" End With With Mb.Controls.Add(Type:=msoControlButton) .Caption = "Alle Formate" .FaceId = 67

580

Page 581: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Makros

.OnAction = "FormateLöschen" End WithEnd Sub

Für das Löschen des zusätzlichen Menüs setzen Sie das folgende Makro aus Lis-ting B.4 ein.

Listing B.4: Makro zum Löschen eines Menüs

Sub MenüLöschen()On Error Resume Next With Application.CommandBars(1) .Controls("MacAdd&In").Delete End WithEnd Sub

B.3 Die Makros

Sehen Sie sich nun den Quellcode der Makros an, die im Add-In MACADDINenthalten sind.

Formeln in Festwerte umwandeln

Listing B.5: Alle Formelzellen der aktiven Tabelle werden in Festwerte umgesetzt.

Sub FormelnInWerteUmwandeln()Cells.Copy Range("A1").Select Selection.PasteSpecial Paste:=xlValues, _ Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = FalseEnd Sub

Soll das Ergebnis in einer neuen Tabelle abgelegt werden, dann kommt das Makroaus Listing B.6 zum Einsatz.

581

Page 582: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

Listing B.6: Alle Formelzellen werden in Festwerte umgewandelt. Das Ergebnis daraus wird in eine neue Arbeitsmappe kopiert

Sub FormelnInWerteUmwandelnNeueDatei() ActiveSheet.Copy Cells.copy Range("A1").Select Selection.PasteSpecial Paste:=xlValues, _ Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False Range("A1").SelectEnd Sub

Aktive Tabelle als E-Mail verschicken

Listing B.7: Aktive Tabelle als E-Mail mit Anhang versenden

Sub EmailAktivesTabellenblatt()Dim s As StringDim s2 As String

ActiveWorkbook.Worksheets(ActiveSheet.Name).Copy s = InputBox _ ("Bitte geben Sie den Adressaten ein!", "Adressat") If s = "" Then MsgBox "Sie haben abgebrochen!" _ : Exit Sub s2 = InputBox _ ("Bitte geben Sie den Titel der E-Mail ein!", "Titel") If s2 = "" Then MsgBox "Sie haben abgebrochen!" : Exit Sub Application.Dialogs(xlDialogSendMail).Show s, s2 ActiveWorkbook.Close savechanges:=FalseEnd Sub

582

Page 583: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Makros

Aktive Tabelle in neuer Arbeitsmappe speichern

Listing B.8: Die aktive Tabelle wird in einer neuen Arbeitsmappe gespeichert

Sub AktivesTabellenblattAlsDatei() ActiveSheet.CopyEnd Sub

Informationen zu Datum und Zeit

Listing B.9: Datum, Wochentag und Uhrzeit auf dem Bildschirm ausgeben

Sub DatumUndUhrzeit()Dim i As IntegerDim wota As String

i = Application.Weekday(Date)Select Case i Case 1 wota = "Sonntag" Case 2 wota = "Montag" Case 3 wota = "Dienstag" Case 4 wota = "Mittwoch" Case 5 wota = "Donnerstag" Case 6 wota = "Freitag" Case 7 wota = "Samstag"End Select

MsgBox "Heute ist " & wota & ", der " & Date _ & ", " & Time & " Uhr!"End Sub

583

Page 584: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

Informationen zur aktiven Arbeitsmappe

Listing B.10: Alle Informationen zur aktiven Arbeitsmappe sollen ausgegeben werden

Sub InfoZurAktuellenDatei()Dim fsO As ObjectDim sName As ObjectDim sMeldung As StringDim s As String

s = Application.ActiveWorkbook.Path Set fsO = CreateObject("Scripting.FileSystemObject") Set sName = fsO.GetFile(ActiveWorkbook.Name) MsgBox ("Dateiname: " & ActiveWorkbook.Name & _ VbLf & "Autor: " & ActiveWorkbook.Author & _ VbLf & "angelegt am: " & sName.DateCreated & _ VbLf & "Letzter Zugriff: " & _ sName.DateLastAccessed & VbLf & _ "Letzte Änderung: " & sName.DateLastModified) & _ "Speicherort: " & s & VbLf _ , vbInformation, "Datei-Info"End Sub

Öffnen aller verknüpften Arbeitsmappen

Listing B.11: Alle verknüpften Arbeitsmappen werden geöffnet

Sub ÖffnenVerknüpfteMappen()Dim V_Mappen As VariantDim i As Integer

V_Mappen = ActiveWorkbook.LinkSources(xlExcelLinks) If Not IsEmpty(Links) Then For i = 1 To UBound(V_Mappen) Workbooks.Open V_Mappen(i) Next i Else MsgBox _ "In der Mappe sind keine Verknüpfungen enthalten!" End IfEnd Sub

584

Page 585: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Makros

Verknüpfungen zu anderen Arbeitsmappen entfernen

Listing B.12: Externe Verknüpfungen zu anderen Arbeitsmappen löschen

Sub ExterneLinksInFestwerteUmsetzen()Dim Blatt As WorksheetDim Zelle As Range

For Each Blatt In ActiveWorkbook.Worksheets Blatt.Activate Set Zelle = Cells.Find(what:="[", After:=ActiveCell, _ LookIn:=xlFormulas, lookat:=xlPart, _ searchorder:=xlByRows, _ searchdirection:=xlNext, MatchCase:=False) While TypeName(Zelle) <> "Nothing" Zelle.Activate Zelle.Formula = Zelle.Value Set Zelle = Cells.FindNext(After:=ActiveCell) Wend Next BlattEnd Sub

Suchen von Texten in Arbeitsmappen

Listing B.13: Suchen und ersetzen von Texten in Arbeitsmappen

Sub TextInArbeitsmappeSuchenUndErsetzen()Dim s_Such As StringDim s_Ersetz As StringDim Blatt As WorksheetDim Treffer As RangeDim Treffer1 As Variant

s_Such = InputBox("Geben Sie den Suchbegriff ein!") s_Ersetz = InputBox _ ("Geben Sie den Ersetzbegriff ein!") For Each Blatt In Worksheets Blatt.Activate Set Treffer = Blatt.Cells.Find(s_Such) If Not Treffer Is Nothing Then Treffer1 = Treffer.Address

585

Page 586: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

Do Treffer.Activate Treffer.Value = s_Ersetz Set Treffer = Cells.FindNext(After:=ActiveCell) On Error Resume Next If Treffer.Address = Treffer1 Then Exit Do Treffer.Value = s_Ersetz Loop End If Next BlattEnd Sub

Soll der gesuchte Text in der gesamten Arbeitsmappe gesucht und ersetzt werden,dann kommt das Makro aus Listing B.14 zum Einsatz.

Listing B.14: Suche nach bestimmten Texten in der aktiven Arbeitsmappe und Kenn-zeichnung der gefundenen Zellen

Sub TextInArbeitsmappeSuchenUndKennzeichnen()Dim s As StringDim i As IntegerDim Erg1 As VariantDim Erg2 As Variant

s = InputBox _ ("Geben Sie den Suchbegriff ein!", "Textsuche")If s = "" Then Exit Sub

For i = 1 To ActiveWorkbook.WorkSheets.Count Sheets(i).Activate Set Erg1 = Sheets(i).Cells.Find(s) If Not Erg1 Is Nothing Then Erg2 = Erg1.Address Do With Erg1 .Activate .Interior.ColorIndex = 4 End With Set Erg1 = Cells.FindNext(After:=ActiveCell) On Error Resume Next If Erg1.Address = Erg2 Then Exit Do Erg1.Interior.ColorIndex = 4 Loop

586

Page 587: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Makros

End IfNext iEnd Sub

Zellen bearbeiten

Im ersten Makro aus dieser Gruppe werden alle nicht druckbaren Zeichen aus denZellen, die markiert sind, entfernt. Löscht alle nicht druckbaren Zeichen auseinem Text. Verwendet wird diese Funktion für Texte, die aus anderen Anwen-dungen importiert wurden und eventuell Zeichen enthalten, die das von Ihnenverwendete Betriebssystem nicht drucken kann.

Listing B.15: Alle Zellen in der Markierung werden gesäubert

Sub ZellenSäubern()Dim Zelle As Range

For Each Zelle In SelectionIf Zelle.HasFormula = False Then Zelle.Value =_ Application.WorksheetFunction.Clean(Zelle.Value) End IfNext ZelleEnd Sub

Das folgende Makro aus Listing B.16 setzt automatisch einen Zeilenumbruch füralle Zellen, die momentan markiert sind.

Listing B.16: Zellenumbruch in allen Zellen innerhalb einer Markierung einstellen

Sub ZellenumbruchSetzen()Dim Zelle As Range

For Each Zelle In Selection Zelle.WrapText = TrueNext ZelleEnd Sub

Eine sehr nützliche Funktion ist auch die folgende Funktion aus Listing B.17.Dort werden alle relativen Zellenbezüge in absolute Zellenbezüge umgesetzt, diemomentan markiert sind. Diese Arbeit wäre manuell durchzuführen eine Tortur.

587

Page 588: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

Listing B.17: Alle Zellenbezüge innerhalb einer Markierung werden in absolute Bezüge umgewandelt

Sub BezugÄndernInAbsolut()Dim Zelle As Range For Each Zelle In Selection If Zelle.HasFormula = True Then Zelle.Formula = _ Application.ConvertFormula(Formula:=Zelle.Formula, _ fromreferencestyle:=xlA1, _ toreferencestyle:=xlA1, _ toabsolute:=xlAbsolute) Else End If Next ZelleEnd Sub

Zellen markieren

Im folgenden Listing werden alle Formelzellen der aktiven Tabelle markiert.

Listing B.18: Alle Formelzellen der aktiven Tabelle werden markiert

Sub FormelnMarkieren()On Error GoTo fehlermSelection.SpecialCells(xlCellTypeFormulas).SelectExit Sub

fehlerm:MsgBox "Dieses Tabellenblatt enthält keine Formeln!"End Sub

Das nächste Listing markiert alle Zellen einer Tabelle, die Kommentare enthalten.

Listing B.19: Alle Kommentarzellen der aktiven Tabelle werden markiert

Sub KommentarzellenMarkieren()On Error GoTo fehler Selection.SpecialCells(xlCellTypeComments).SelectExit Sub

fehler:

588

Page 589: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Makros

MsgBox "Es gibt keine Kommentare in der Tabelle!", _ vbInformationEnd Sub

Im folgenden Listing werden alle Zellen, die eine Gültigkeitsregel enthalten, mar-kiert.

Listing B.20: Alle Zellen mit Gültigkeitsregel werden markiert

Sub GültigkeitszellenMarkieren()On Error GoTo fehler Selection.SpecialCells(xlCellTypeAllValidation).SelectExit Sub

fehler: MsgBox "Keine Gültigkeiten in dieser Tabelle!", _ vbInformationEnd Sub

Im nächsten Listing werden alle Zellen, die mit einer bedingten Formatierung for-matiert wurden, markiert.

Listing B.21: Alle Zellen mit bedingter Formatierung werden markiert

Sub BedingteFormatzellenMarkieren()On Error GoTo fehler Selection.SpecialCells _(xlCellTypeAllFormatConditions).SelectExit Sub

fehler: MsgBox "Keine bedingten Formatierten Zellen!", _ vbInformationEnd Sub

Zellen löschen

Im letzten Menüpunkt werden verschiedene Löschoperationen angeboten. Im fol-genden Listing werden alle Kommentare aus der aktiven Tabelle gelöscht.

589

Page 590: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

Listing B.22: Alle Kommentare aus der aktiven Tabelle löschen

Sub KommentareLöschen()Dim Notiz As Comment

On Error GoTo fehlerFor Each Notiz In ActiveSheet.Comments Notiz.DeleteNext NotizExit Sub

fehler:MsgBox "Keine Kommentare in der Tabelle!", vbInformationEnd Sub

Im nächsten Listing werden alle Zellen mit Formeln mit Festwerten ersetzt, diesich innerhalb der Markierung befinden.

Listing B.23: Alle Formeln einer Tabelle in Festwerte umsetzen

Sub FormelnLöschen()Dim zelle As Range

On Error GoTo fehler Selection.SpecialCells(xlCellTypeFormulas).Select For Each zelle In Selection zelle.Value = zelle.Value Next zelleExit Sub

fehler:MsgBox "Keine Formeln in der Tabelle!", vbInformationEnd Sub

Übrigens werden ebenso wie Formeln auch Funktionen und externe Verknüpfun-gen in Festwerte umgesetzt.

Im folgenden Listing werden alle Gültigkeitsregeln einer Tabelle entfernt.

Listing B.24: Alle Gültigkeitsregeln in einer Tabelle werden entfernt

Sub GültigkeitLöschen()Dim zelle As Range

590

Page 591: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Die Makros

On Error GoTo fehler Selection.SpecialCells(xlCellTypeAllValidation).Select For Each zelle In Selection zelle.Validation.Delete Next zelleExit Sub

fehler: MsgBox "Keine Zellen mit Gültigkeiten in Tabelle!", _ vbInformationEnd Sub

Im nächsten Listing werden alle bedingten Formate aus einer Tabelle entfernt.

Listing B.25: Alle bedingten Formate in einer Tabelle werden entfernt

Sub BedFormateLöschen()Dim zelle As Range

On Error GoTo fehler Selection.SpecialCells _(xlCellTypeAllFormatConditions).Select For Each zelle In Selection zelle.FormatConditions.Delete Next zelleExit Sub

fehler: MsgBox "Keine Zellen mit bedingten Formaten!", _ vbInformationEnd Sub

Im Gegensatz zu vorherigen Listing werden im folgenden Listing alle Formatie-rungen einer Tabelle entfernt.

Listing B.26: Alle Formatierungen in einer Tabelle werden entfernt

Sub FormateLöschen()Dim zelle As Range

ActiveSheet.UsedRange.SelectSelection.ClearFormatsEnd Sub

591

Page 592: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Wichtige Funktionen in einem eigenen Add-In ablegen

Im letzten Listing werden alle Zellen einer Tabelle, die Festwerte aufweisen,gelöscht.

Listing B.27: Alle Zellen, die Festwerte enthalten, werden gelöscht

Sub InhalteLöschen()On Error GoTo fehler Selection.SpecialCells(xlCellTypeConstants).Select Selection.ClearContents Exit Sub

fehler:End Sub

B.4 Die Integration

Richten Sie das Add-In über den Add-In-Manager ein. Der Add-In-Manager ist einWerkzeug aus dem Standard-Umfang von Excel, der nicht nur bereits installierteAdd-Ins auflistet, sondern auch die Installation von Add-Ins ermöglicht.

1. Wählen Sie EXTRAS/ADD-INS-MANAGER (Excel 97) bzw. EXTRAS/ADD-INS(Exel 2000/2002/2003).

2. Klicken Sie auf die Schaltfläche DURCHSUCHEN, und wechseln Sie in denOrdner, der die Add-In-Datei enthält:

3. Markieren Sie die Datei MACADDIN.XLA, und bestätigen Sie mit Klick aufOK.

4. Das Add-In wird eingebunden, Sie können den Add-Ins-Manager mit Klick aufOK schließen.

Wenn Sie das Add-In wieder aus der Liste löschen wollen, starten Sie den Add-In-Manager erneut und klicken auf das Häkchen, um es zu entfernen. Der Eintragbleibt in der Liste, Sie können die Werkzeugsammlung jederzeit wieder aktivieren.

592

Page 593: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

AAccess-Daten einlesen 455Access-Tabellen manipulieren 461Access-VBA-Bibliothek einbinden 449Action 375Activate 144, 304ActiveCell 251ActiveSheet 38, 386ActiveWorkbook 408Add 80, 88, 98, 193, 202, 209, 537AddComment 97, 279AddCustomList 165, 167AddFromFile 534, 538f.AddFromGuid 530Add-In 85, 87, 150– erstellen 424– installieren 87– prüfen 85– überprüfen 167AddItem 523AddNew 455Address 251, 251, 280, 305, 351, 411, 433,

435adLockBatchOptimistic 454adLockOptimistic 454adLockPessimistic 454adLockReadOnly 454ADO-Bibliothek einbinden 449AdOpenDynamic 454adOpenForwardOnly 454adOpenKeyset 454adOpenStatic 454adSearchBackward 460adSearchForward 460AdvancedFilter 375Änderungsdatum– abfragen 412– ermitteln 41

Aktivierreihenfolge festlegen 511AlertStyle 308AllowDeletingColumns 236AllowDeletingRows 236AllowEditRanges 241AllowFiltering 236AllowFormattingCells 236AllowFormattingColumns 236AllowFormattingRows 236AllowInsertingHyperlinks 236AllowInsertingRows 236AllowSorting 236AllowUsingPivotTables 237Anchor 433Anwendernamen ausgeben 29Arbeitsblatt-Menüleiste– ausblenden 489– einblenden 489Arbeitsmappe– anlegen 193, 376– entfernen 195– identifizieren 184, 408– konsolidieren 193– öffnen 178, 180, 417– schließen 191, 195– speichern 185, 188f.– löschen 195– verknüpfen 201– zusammenführen 193Arbeitsmappen-Existenz prüfen 416Arbeitsmappen-Zustand prüfen 417Array 165, 232Asc 414Attachments 438Aufenthaltsbereich festlegen 174AutoFilter 365f., 369– aktivieren 365

593

Page 594: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

AutoFilterMode 365AutoFit 223f., 305, 443, 457, 487

BBalkendiagramm erstellen 387BCC 438Befehle suchen 45Befehlsleistenamen ermitteln 487Before 491BeforeDoubleClick 332, 349BeforeRightClick 332, 343, 348f.BeginGroup 493, 501Benutzerdefinierte Liste– erstellen 165– generieren 164Benutzernamen– ausgeben 82– einstellen 172Benutzten Bereich markieren 378Berechnung– ausschalten 160– einschalten 160Bereiche– festlegen 265– schützen 241– verbinden 350– zusammenfassen 253Beschriftung festlegen 74Bibliothek– einbinden 528– entfernen 534Bilder einfügen 510Bildlaufleisten ausblenden 157Bildschirmaktualisierung– ausschalten 123, 159– einschalten 123, 159Blätter zählen 213, 229Blattprüfung vornehmen 212Blatt-Typ bestimmen 210Block auskommentieren 51Body 438Bold 121, 266, 268, 401Boolean 65

Borders 270Briefkopf erstellen 468Buchstaben eliminieren 413BuiltInDocumentProperties 198f.BusinessAddressCity 441BusinessAddressCountry 441BusinessAddressPostalCode 441BusinessAddressState 441BusinessAddressStreet 441Button 74Byte 65

CCalculate 330, 332CalculateBeforeSave 160Calculation 160Call 355Cancel 343f., 349, 351Caption 74, 493, 501, 507, 511CategoryLabels 392CC 438CDate 310CD-ROM zum Buch 17CellDragAndDrop 167Cells 141, 239, 256, 264, 304, 420, 519CenterFooter 244CenterHeader 244Change 325ChangeLink 203ChartObject 77ChartTitle 387, 392ChartType 384, 387, 389, 392ChDir 124, 181, 185, 187, 194, 475ChDrive 181, 185, 187Chr 91chr 341Chr(13) 540ClassType 482Clear 420ClearComments 281, 420ClearFormats 271, 420Close 191f., 195, 218, 378, 455, 457, 460Code anzeigen 22

594

Page 595: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

Code-Fenster– aufrufen 27– einblenden 135– teilen 136Codezeilen zählen 540Color 266ColorIndex 118, 263, 266, 270, 327, 347,

401, 407, 421, 432Columns.Count 378CommandBarControl 490, 493CommandBars 77, 359, 486, 500Comment 97, 279f.Connection 453, 457Contents 235Controls 490, 502, 502Controls.Add 490Copy 195, 219f., 376, 378, 391, 481CopyToRange 376Count 119, 213, 229, 234, 296, 298, 420,

432, 445, 487Count down einstellen 355CountA 297f.CountBlank 299CountIf 295CountOfLines 540, 547CreateBackup 186CreateItem 438, 440CreateObject 82, 438, 440, 466, 468, 471criteria 460Criteria1 367CriteriaRange 376Currency 65CurrentRegion 258, 376, 399CursorType 454CutCopyMode 338, 392, 481

DDataObject 84DataType 222Date 31, 43, 65, 82, 189, 354DateCreated 413Dateien suchen 124Dateigröße abfragen 412Dateiname abfragen 411

Dateityp abfragen 411DateLastAccessed 413DateLastModified 413Daten– einfügen 391– filtern 364– kopieren 391– skalieren 393– speichern 514Datenbank– öffnen 453– schließen 455Datenbanksatz– anlegen 455– speichern 455Datenbereich– angeben 381– angeben (Diagramm) 387– sortieren 372Datenfeld– füllen 396– programmieren 184Datensätze löschen 462Datensatz– aktivieren 457– finden 459– suchen 459DatePart 92Datumsangaben– formatieren 90– subtrahieren 285Datumsformat– festlegen 271– konvertieren 310Datumsgrenzen einstellen 309Datumsprüfung vornehmen 107Datumsteile extrahieren 92Debug.Print 137, 200, 373Decimal 65DefaultFilePath 172Definition– ADO 448– Eigenschaften 40– Ereignisse 41, 316

595

Page 596: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

– Methoden 40– modulare Funktionen 416– Objekte 40– UserForms 506– Variablen 63– VBE-Programmierung 528Delete 89, 127, 171, 214, 275, 281, 322, 391,

420, 432, 463, 471, 492, 495DeleteLines 546Delimiter 180Description 532Diagramm– Balkendiagramm (gestapelt) 385– Balkendiagramm (gruppiert) 385– Blasendiagramm 385– exportieren 76, 397– Flächendiagramm 385– formatieren 395– Kreisdiagramm 385– Kursdiagramm 385– Liniendiagramm 385– löschen 391– Netzdiagramm 385– Oberflächendiagramm 385– platzieren 393– Punktdiagramm 385– Ringdiagramm 385– Säulendiagramm 385– Säulendiagramm 3D-Darstellung 385Diagrammblätter, entfernen 400Diagrammobjekt exportieren 77Diagrammposition festlegen 391Diagrammtypen auswählen 384Diagrammüberschrift– anzeigen 387– festlegen 387Dim 64Dir 162, 171, 194Direktfenster– einblenden 137– einsetzen 137– füllen 137, 200Display 438

DisplayAlerts 75, 164, 322, 356, 543DisplayAsIcon 80, 482DisplayFullScreen 155DisplayGridLines 34, 81, 158DisplayHeadings 158DisplayHorizontalScrollBar 158DisplayRecentFiles 169DisplayStatusBar 354DisplayStatusbar 161DisplayVerticalScrollBar 158DisplayWorkbookTabs 158DisplayZeros 158Do Until...Loop-Schleife

programmieren 125Do while 194Do While...Loop-Schleife

programmieren 130Documents 82, 468Documents.Add 468Dokument– einfügen 468– öffnen 466, 471– speichern 82Dokumenteigenschaften– abfragen 411– ansprechen 197– auflisten 198– auslesen 197– füllen 198– programmieren 197– setzen 198Doppelklick– aktivieren 349– deaktivieren 349Double 65Drag&Drop– ausschalten 167– einschalten 167DrawingObjects 235Dropdown-Pfeile anzeigen 367Druckseiten-Anzahl ermitteln 245Duplikate entfernen 375

596

Page 597: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

EEarliestTime 353Editierformat festlegen 59Editoreinstellungen anpassen 57Eigenschaften anzeigen 47Eigenschaftenfenster anzeigen 24Eingabefelder sperren 519Eingabemaske aufrufen 270Eingabemeldung anzeigen 310Einzug– vergrößern 50– verkleinern 50E-Mail-Empfänger angeben 438E-Mail senden 438Email1Address 441E-Mail-Fenster anzeigen 438E-Mails verschicken 436E-Mail-Text angeben 438E-Mail-Titel festlegen 438Enabled 78, 359, 489, 502, 519EnableEvents 329End 378, 515End With 39EntireRow 118Entwicklungsumgebung– aufrufen 22, 548– einstellen 57EOF 457, 460, 462Ereignis– Activate 324– Calculate 330– Change 325– einfügen 547– entfernen 550– löschen 546– Selection_Change 329– UserForm_Initialize 522– Workbook_BeforeClose 319– Workbook_BeforeSave 320– Workbook_NewSheets 321– Workbook_Open 317– Workbook_SheetBeforeRightClick 344– Worksheet_BeforeDoubleClick 349– Worksheet_BeforeRightClick 343

Ereignissteuerung– ausschalten 329– einschalten 329Ergebnis runden 286Err 146Erstellungsdatum abfragen 412Excel beenden 75, 356Excel-Arbeitsmappen zählen 124Excel-Dateien suchen 162Excel-Daten exportieren 451Excel-Version feststellen 110Execute 457Exit Function 415Exit Sub 146, 228Export 77, 542

FFaceId 493, 496, 496, 499, 501Farbe– ausgeben 263– zuweisen 266Fehler– beseitigen 135– finden 135Fehlerbeschreibung anzeigen 146Fehlermeldung anzeigen 310Fehlernummer anzeigen 146Fehlerparagraphen anspringen 107Fehlerquellen ausschließen 144Fenster verankern 61Fensterstatus ermitteln 112Fensterteiler betätigen 136Fett-Druck zuweisen 266Field 366FieldInfo 222FileDateTime 41FileFormat 186FileName 178, 186, 398, 482FileSearch 124, 475FileSystemObject 412FileType 125, 476Filter 398– aufspüren 373– TopTen 370

597

Page 598: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

Filterkriterium– einstellen (aus Zelle) 370– festlegen 367– setzen 365FilterName 398Filteroperatoren einsetzen 367Filters 373Find 459f.FirstName 440Font 121, 264, 266, 268, 340, 349, 432FontStyle 266For Each 192, 384, 396For Each...Next-Schleifen einsetzen 119For Next 242For...Next-Schleifen programmieren 114Format 179, 244, 294– löschen 271FormatDatTime 90Format, Formatierte Zellen markieren 302Formatierung löschen 271Formelcheck durchführen 409Formeln– dokumentieren 300– finden 300– wandeln (Festwerte) 332Formelzellen– dokumentieren 303– finden 301– markieren 239, 303Formula 290, 296Formula1 309Formula2 309FormulaLocal 290, 305, 411Formular einfügen 538FoundFiles 125, 476FullName 41, 168, 409FullPath 533Function 406Funktionen– speichern 422– verfügbar machen 422Funktionsliste aufrufen 288

Fußzeile– gestalten 35, 122– programmieren 243

GGefilterte Daten exportieren 376GetDefaultFolder 443GetFile 412GetNamespace 443GetObject 468GetOpenFileName 181, 183GetSaveAsFilename 186Gitternetzlinien– anzeigen 32, 81– ausblenden 32, 81– deaktivieren 157GoTo 107Grafik einfügen 80Großbuchstaben wandeln 327Gültigkeit– Alles erlaubt 308– Benutzerdefiniert 308– nur Datumswerte 308– nur Dezimalzahlen 308– nur ganze Zahlen 308– nur Listeneinträge 308– nur Zeitwerte 308Gültigkeitsliste erstellen 311Gültigkeitsoperatoren auswählen 308Gültigkeitsprüfungen vornehmen 306Gültigkeitsregel hinzufügen 307Gültigkeitszellen markieren 302f.Guid 530f.

HHaltepunkt– ausschalten 50– einfügen 50HasLegend 392, 401HasTitle 387HauptNr 530Header 372Height 483, 511

598

Page 599: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

Hidden 399Hide 514Hintergrundfarbe festlegen 262Horizontale Trennstreifen einfügen 511Hour 189Hyperlink 98– einfügen 98– entfernen 431– erstellen 432– formatieren 446– programmieren 430– prüfen 444– zählen 432, 445Hyperlinks.Add 433Hyperlinktext festlegen 434

IIconFileName 482IconIndex 483IconLabel 483ID 491, 498If 104, 168IgnoreBlank 310IgnoreReadOnlyRecommended 180IIf 108Inhaltsverzeichnis erstellen 434InputBox 270InsertAfter 473InsertLines 547Installed 87, 168InStr 129, 444InStrRev 204Int 353Integer 64f.Interior 263, 327, 347Intersect 328, 344, 350, 353IsArray 108, 184IsDate 107f.IsEmpty 105, 108, 202IsError 108IsNull 108IsNumeric 108, 407IsObject 108Italic 266, 268

KKey 334Key1 372Kill 195Klassenmodul einfügen 538Kleinbuchstaben wandeln 328Kommentaradresse ermitteln 280Kommentare– auslesen 279– einfügen 97, 276– entfernen 280– erstellen 278– löschen 280Kommentarenzellen– auskundschaften 276– markieren 302Kommentartext festlegen 279Kommentierung aufheben 51Konstanten– anzeigen 47– einsetzen 89– global 89– lokal 89Kontakt– anlegen 441– austauschen 439Kontextmenü– aktivieren 342– deaktivieren 342, 503– erweitern 500– programmieren 500Kontextmenübefehle– entfernen 501– löschen 501Konturschriftschnitt, zuweisen 266Koordinaten ermitteln 250Kopfzeile– gestalten 35, 122– programmieren 243Kopierrahmen entfernen 392Kursiv-Druck zuweisen 266

599

Page 600: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

LLarge 312LastName 440LatestTime 353Laufwerk wechseln 181Laufzeitfehler 1004 145Laufzeitfehler 438 148LCase 328Leerstellen entfernen 300Leerzeichen entfernen 312Leerzellen– ignorieren 310– markieren 302Left 111, 409, 483, 495LeftFooter 244LeftHeader 43, 244Legende anpassen 401Leisten– identifizieren 486– zählen 487Len 218, 415, 524Lesezeichen– aktivieren 53– löschen 53– setzen 53Letzte Zelle– ermitteln 378– markieren 303Liniendiagramm erstellen 389Link 482LinkSources 202Listen generieren 164Listenfeld– auslesen 524– füllen 523Location 394, 401Locked 239LockType 454Löschen– Alle Formatierungen 419– Alle Inhalte 419– Alle Kommentare 419– Formeln 419– Hyperlinks 419

Löschfunktion erstellen 419Lokal-Fenster einblenden 140Long 65LookIn 124, 475

MMainWindow 548Major 531MajorUnit 393Makro– aktivieren 134– auflisten 550– aufrufen 355– aufzeichnen 32– benennen 28– deaktivieren 133– debuggen 137– einfügen 28, 44, 55– entfernen 545– kopieren 44, 55– löschen 545– speichern 33– übernehmen 44– zurücksetzen 138– zuweisen 74, 334Makrorekorder einsetzen 32Makrosicherheit einstellen 134Markierte Zellen ansprechen 334Markierung relativ 254Maus programmieren 342Max 393MaximumScale 393Meldungsfenster ausgeben 31Menü– aktivieren 502– deaktivieren 502– einfügen 490– entfernen 492– löschen 490, 492Menübefehle einfügen 492Menübefehlsymbol festlegen 493Menübefehlstext festlegen 493Menüleiste– ausblenden 77

600

Page 601: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

– einblenden 77– programmieren 488Methoden anzeigen 47Mid 204, 413ff.Min 393MinimumScale 393Minor 531Minute 189Minuten ermitteln 189Modul– drucken 543– einfügen 28– entfernen 544, 550– löschen 544, 550Modulare Funktionen programmieren 416Monatsnamen ermitteln 42Month 42MonthName 42Move 220, 220, 242, 246MoveNext 457, 462f.MsgBox 29, 49, 150, 214msoBarNoCustomize 503msoBarTypeMenuBar 487msoBarTypeNormal 487msoBarTypePopup 487msoControlButton 491msoControlComboBox 491msoControlDropdown 491msoControlEdit 491msoControlPopup 491MultiSelect 183

NName 150, 168, 184, 186, 211, 229, 265,

304, 408, 413, 487, 543Namen löschen 276Names.Add 274NebenNr 530NewSearch 124, 475NewSeries 392Nothing 74Notizen einfügen 277Now 354f.Nullwerte ausblenden 157

Number 146NumberFormat 271, 273

OObject 65, 82ObjectType 479Objektkatalog aufrufen 39Objektvariable– auflösen 253– deklarieren 76– einsetzen 71Objektverweis aufheben 83, 88Öffnen-Dialog anzeigen 181f.Office-Assistenten aufrufen 72OffSet 116, 254Offset 109, 261, 433olContactItem 440OLE-Objekt, einfügen 482On Error 107, 146, 232, 383, 418, 492, 544– goTo 146– Resume next 147OnAction 74, 493, 501OnKey 337Online-Hilfe aufrufen 43OnTime 353f.Open 178, 178, 181f., 218, 378, 417, 453,

457, 466OpenText 222, 225, 543Operator 367Option Explicit 66Optionsschaltfläche auslesen 516Order1 372Orientation 381Origin 180OutLineFont 266OutputTo 478

PPageSetup 38, 244Parameterinfo anzeigen 49Password 180, 186Passwort 235Paste 377, 391, 481PasteSpecial 338, 377

601

Page 602: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

Path 413Pfad abfragen 411Picture 80PivotFields 381Pivot-Tabellen– aktualisieren 357, 382– erstellen 379– programmieren 379PivotTableUpdate 332PivotTableWizard 380PlotBy 387Position ermitteln (erste Zahl) 414PowerPoint starten 98Preise erhöhen 285Primärfarbe zuweisen 266Print 378PrintOut 543ProcCountLines 546Procedure 334, 353ProcStartLine 546, 546Protect 235, 239, 241, 246Protection 503Prozeduren anzeigen 136PutInClipBoard 84

QQuellcode– exportieren 540– importieren 536QuickInfo– anzeigen 49, 496– festlegen 434Quit 75, 356, 466

RRahmenart festlegen 270Rahmentypen festlegen 269Range 88, 250, 334ReadOnly 179ReadOnlyRecommended 186RecentFile 170f.ReDim 234Reference 531RefersTo 274

RefreshTable 383Remove 534, 544Replace 392RightFooter 245RightHeader 244Rnd 353, 519Round 286RowCol 391Rows.Count 284Rückfrage– programmieren 214– unterdrücken 213

SSäulendiagramm, einfügen 385Save 188f., 441SaveAs 82, 186SaveChanges 191, 466Saved 190Scenarios 236Schaltfläche einfügen 74Schedule 353Schleifen programmieren 113Schreibarbeit sparen 38Schriftart– einstellen 340, 543– festlegen 264– schattieren 266Schriftgröße– einstellen 543– festlegen 265Schriftschnitt– einsetzen 266– festlegen 121– zuweisen 266ScreenTip 434ScreenUpdating 123, 159ScrollArea 174– angeben 27– festlegen 174SearchDirection 460SearchSubFolders 125, 475Seitennumerierung angeben 245Select 234, 239, 250f.

602

Page 603: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

Select Case 110, 346, 412, 414f.Selection 251, 271, 334SelLength 524SelStart 524Send 438Series 396SeriesLabels 391Set 76, 202, 538SetFocus 524, 548SetSourceData 387, 389Shadow 266SheetBeforeRightClick, 345Sheets 76, 210, 229, 263Sheets.Add 263, 443SheetsInNewBook 172SheetsInNewWorkbook 193f.Show 513ShowError 311ShowInput 310Sicherungskopie anlegen 186Sichtbare Zellen, markieren 303, 376Single 65, 286Size 265, 413, 543Skalierung vornehmen 393SkipRows 460Sonderzeichen einfügen 339Sort 372Source 389, 454SourceData 381SourceTyp 380Spalten zählen 378Spaltenbreite einstellen 305Spaltenbreiteneinstellung vornehmen 223Spaltenüberschriften ausblenden 157SpecialCells 239, 302, 376, 399SpecialEffect 511Speicher freigeben 74, 443Speicher-Dialog aufrufen 186Speicherpfad ermitteln 41Spezialfilter einsetzen 374SQL-Abfrage durchführen 457StandardFont 172StandardFontSize 172

Standardmeldungen– abschalten 163– ausschalten 75Standardmodul einfügen 538Standardschriftart einstellen 172Standardspeicherort einstellen 172Standardtastenkombinationen– aktivieren 358– deaktivieren 337start 460StartRow 223StatusBar 161Statusleiste– ausblenden 157– einblenden 161– programmieren 354Statuszeile programmieren 161Steuerelemente– beschriften 511– einsetzen 507– hinzufügen 507– identifizieren 521Strikethrough 266String 64f.Stunden ermitteln 189Styles 493SubAddress 433, 435Subject 438Subscript 266Substitute 129SumIf 294Superscript 266Symbolaussehen bestimmen 496Symbole– auflisten 496– einfügen 496– integrieren 496Symbolfunktion bestimmen 497Symbolleiste– anlegen 494, 496– einblenden 46– entfernen 495– löschen 495

603

Page 604: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

– programmieren 494– schützen 503Symbolleistenkontextmenü

deaktivieren 358Symbolleistenposition festlegen 495

TTabelle– anlegen 208– ausblenden 25, 226, 228– ausblenden (sicher) 229– auswählen 234, 239– benennen 208– berechnen 330– einblenden 226, 230– einfügen 198, 263, 443– entfernen 213– exportieren 216– gruppieren 231– importieren 221– kopieren 195, 218– löschen 213– Prüffunktionen 108– schützen 235, 239– sortieren 241, 372– spiegeln 26– übertragen 219– zählen 119Tabellenanzahl einstellen 172Tabellenblätter füllen 212Tabellenblätteranzahl festlegen 193Tabellenblatt aktivieren 304Tabellenfunktion– COUNT 296– COUNTA 297– COUNTBLANK 299– COUNTIF 295– DATEDIF 291– einfügen 289– einsetzen 288– erstellen 405– LARGE 312– MAX 393– MIN 393

– RANK 291– SUM 289– SUMIF 293Tabellennamen ermitteln 118TableDestination 381TableName 381Tagesdatum ausgeben 31Target 327, 343f.Tastenkombination– bekannt geben 334– einsetzen 55– verwenden 332– zuweisen 334Temporary 491Text 279, 387– ausgeben 30– durchstreichen 266– höherstellen 266– tieferstellen 266– unterstreichen 266Textdatei– einfügen (als Symbol) 79– öffnen 378– schließen 378Textteile– ersetzen 54– suchen 54TextToDisplay 434ThisWorkbook 119, 211Time 31TimeValue 354f.To 438ToolTipText 496, 498Top 483, 495Trim 300, 312Type 310, 413, 486, 491TypeName 211, 521TypeParagraph 471TypeText 82, 473

UUBound 184UCase 328Überwachung hinzufügen 138

604

Page 605: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

Uhrzeit ausgeben 31Umliegenden Bereich– ermitteln 258– markieren 376UnderLine 421Underline 266, 432Union 253, 350unload me 514Unterstreichung entfernen 421Update 455, 462UpdateLinks 179UsedRange 217, 257, 372, 378, 494, 519UserForm– aufrufen 512– beenden 513– benennen 507– einfügen 507– entfernen 548– entwerfen 507– programmieren 512– starten 512– testen 512– Titel festlegen 507– vergrößern 507UserInterFaceOnly 236UserName 172Username 82

VValidation.Add 307Value 260, 305, 411, 516, 521, 524Variablen– deklarieren 63– global 63– lokal 63– öffentlich 69– privat 70– Regeln 64– statisch 68Variablendeklaration erzwingen 66Variablenlänge ermitteln 218Variablentypen auswählen 64Variant 65VBComponents 547

vbCr 54VBE– aufrufen 548– Eigenschaften 535– Methoden 535– Objekte 535VBE-Bibliothek deaktivieren 534VBE-Komponenten auflisten 549vbext_ct_ClassModule 538Vbext_ct_MSForm 538Vbext_ct_StdModule 538vbext_ct_StdModule 537vbext_pk_Proc 546VBE-Zugriff zulassen 532vbInformation 399Veränderungen verhindern 237Verfügbare Objekte ansehen 45Vergleichsoperatoren einsetzen 112Verknüpfungen– ändern 203– dokumentieren 202– wandeln (Festwerte) 332Version 110Verweis erstellen 82Verwendeten Bereich– ermitteln 217, 257– markieren 378Verzeichnis wechseln 181Verzweigungen einsetzen 102Visible 82, 227, 231, 274, 466, 471, 496, 548VisibleDropDown 367Vokabel-Lernprogramm

programmieren 506Vokabeln– einfügen 516– prüfen 519Volatile 407Vollbildansicht einstellen 154

WWait 354WeekDayName 95Werkzeugsammlung einsetzen 507

605

Page 606: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

Werte– addieren 351– einfügen 338Where 394WholeStory 471Width 483Wiedervorlageliste– anzeigen 168– ausblenden 168– bearbeiten 168– überprüfen 170WindowState 113With 38, 74, 516Wochentag ermitteln 95Word– beenden 81– starten 81Word-Dokumente– auflisten 474– suchen 476Word-Sitzung– beenden 466– starten 465– übernehmen 467Word-VBA Bibliothek einbinden 464WorkBook 184Workbook 150, 178Workbook_Activate 322Workbook_AddinInstall 322Workbook_AddinUninstall 322Workbook_BeforeClose 319, 339Workbook_BeforePrint 322Workbook_BeforeSave 320, 322Workbook_Deactivate 323Workbook_NewSheet 323Workbook_Open 317, 338Workbook_SheetActivate 323Workbook_SheetBeforeDoubleClick 323Workbook_SheetBeforeRightClick 323Workbook_SheetCalculate 323Workbook_SheetChange 323Workbook_SheetDeactivate 323Workbook_SheetFollowHyperlink 323Workbook_SheetSelectionChange 323

Workbook_WindowActivate_ 323Workbook_WindowDeactivate 323Workbook_WindowResize 323Workbooks 150, 184Workbooks.Add 376Worksheet 119, 123, 210Worksheet_Activate 331Worksheet_BeforeRightClick 343Worksheet_Calculate 331Worksheet_Change 331Worksheet_Deactivate 331Worksheet_FollowHyperlink 331Worksheet_SelectionChange 329, 331WorksheetFunction 289, 293WriteResPassword 180, 186

Xxl3DColumn 385xlAnd 367xlArea 385xlAscending 372xlAutomatic 421, 432xlBarClustered 385xlBarStacked 385xlBetween 308xlBottom10Items 367xlBottom10Percent 367xlBubble 385xlCellTypeAllFormatConditions 302xlCellTypeAllValidation 302xlCellTypeBlanks 302xlCellTypeComments 302xlCellTypeFormulas 239, 302xlColorIndexNone, 347xlColumnClustered 385xlColumnField 382xlColumns 387, 391xlColumnStacked 385xlConsolidation 381xlContinuous 269xlDash 269xlDashDot 269xlDashDotDot 269xlDatabase 381

606

Page 607: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

xlDataField 382xlDescending 372xlDot 269xlDouble 269xlDoughnut 385xlDown 378xlEqual 308xlExternal 381xlFilterCopy 375f.xlFilterInPlace 375xlGreater 309xlGreaterEqual 309xlHidden 382xlLess 309xlLessEqual 309xlLine 385xlLineStyleNone 269xlLocationAsNewSheet 394xlLocationAsObject 394xlLocationAutomatic 394xlNo 372xlNotBetween 308xlNotEqual 309xlOr 367xlPageField 382XLPasteAll 377xlPie 385xlPivotTable 381xlRadar 385xlRowField 382xlRows 387, 391xlSheetHidden 25xlSheetVeryHidden 25xlSlantDashDot 269xlStockHLC 385xlSurface 385xlToLeft 378xlTop10Items 367, 371xlTop10Percent 367xlToRight 378xlUnderlineStyleNone 421, 432xlUp 378xlValidAlertInformation 308xlValidAlertStop 308

xlValidAlertWarning 308XlValidateCustom 308xlValidateDate 308xlValidateDecimal 308xlValidateInputOnly 308xlValidateList 308XlValidateTextLength 308XlValidateTime 308xlValidateWholeNumber 308xlValues 338xlVeryHidden 230xlVisible 25, 399xlXYScatter 385xlYes 372

ZZahlen summieren 131Zahlenformate festlegen 270Zahlenwerte prüfen 111Zeichen– austauschen 127– ersetzen 129Zeichen-Belegung herausfinden 341Zeichen-Code, ermitteln 341Zeichenfolge– ersetzen 129– extrahieren 204Zeichenobjekt– einfügen 87– entfernen 89Zeichenposition ermitteln 204Zeichenprüfung durchführen 129Zeilen– abarbeiten 115– einfärben 117– löschen 126– zählen 284Zeilenüberschriften ausblenden 157Zeilenvorschub einfügen 54Zeitsteuerung, programmieren 353Zelle– abfragen 260– addieren 283– ändern 260

607

Page 608: Excel-VBA in 14 Tagen - babober.de · Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

Stichwortverzeichnis

– auswerten 120– benennen 273– dividieren 287– einfügen 377– formatieren 262– füllen 141, 259– initialisieren 259– kommentieren 276– kopieren 376– markieren 250– multiplizieren 285– rahmen 268– summieren 405Zellenadresse abfragen 410Zellenbereich markieren 251, 251Zellenformel abfragen 410Zellenhintergrund

– auslesen 263– formatieren 347– löschen 264Zelleninformationen abfragen 410Zelleninhalte prüfen 105Zellenlänge überprüfen 130Zellenverschiebung angeben 109Zellenwert abfragen 410Zoom einstellen 173Zufallszahl– bilden 352– erzeugen 519Zugriffsdatumabfragen 412Zwischenablage– ansprechen 83– füllen 83f.– leeren 84

608