Sie sind auf Seite 1von 609

Excel-VBA in 14 Tagen

Unser Online-Tipp fr noch mehr Wissen ...

... aktuelles Fachwissen rund um die Uhr zum Probelesen, Downloaden oder auch auf Papier.

www.InformIT.de

Excel-VBA
BERND HELD

eBook
Die nicht autorisierte Weitergabe dieses eBooks an Dritte ist eine Verletzung des Urheberrechts!

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 Rcksicht auf einen eventuellen Patentschutz verffentlicht. Warennamen werden ohne Gewhrleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit grter Sorgfalt vorgegangen. Trotzdem knnen Fehler nicht vollstndig ausgeschlossen werden. Verlag, Herausgeber und Autoren knnen fr fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung bernehmen. Fr Verbesserungsvorschlge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar.

Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulssig. Fast alle Hardware- und Software-Bezeichnungen, die in diesem Buch erwhnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder 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-Strae 1012, D81829 Mnchen/Germany Alle Rechte vorbehalten Lektorat: Rainer Fuchs, rfuchs@pearson.de Herstellung: Philipp Burkart, pburkart@pearson.de Korrektur: Petra Kienle, Frstenfeldbruck Satz: reemers publishing services gmbh, Krefeld, (www.reemers.de) Coverkonzept: independent Medien-Design, Mnchen Coverlayout: Sabine Krohberger Druck und Verarbeitung: Bercker, Kevelaer Printed in Germany

Inhaltsverzeichnis
Liebe Leserin, lieber Leser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wochenvorschau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tag 1 Die Entwicklungsplattform, Variablen und Konstanten kennen lernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Der Projekt-Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Das Eigenschaftenfenster . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen ein- und ausblenden . . . . . . . . . . . . . . . . . . . . . . Tabellen spiegeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den zu bearbeitenden Bereich festlegen . . . . . . . . . . . . . . 1.3 Das Code-Fenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Makros erfassen und starten . . . . . . . . . . . . . . . . . . . . . . . . 1.4 Der Makrorekorder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein- und Ausschalten der Gitternetzlinien . . . . . . . . . . . . Einheitliches Gestalten der Kopf- und Fuzeile . . . . . . . . 1.5 Der Objektkatalog. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Letztes nderungsdatum einer Datei ermitteln . . . . . . . . . Monatsnamen ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6 Die Online-Hilfe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verwendete Befehle nachlesen . . . . . . . . . . . . . . . . . . . . . Verfgbare Objekte ansehen . . . . . . . . . . . . . . . . . . . . . . . Befehle suchen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7 Weitere praktische Helfer in der Entwicklungsumgebung Die Symbolleiste Bearbeiten . . . . . . . . . . . . . . . . . . . . . . . Suchen & Ersetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schnelles Arbeiten ber Tastenkombinationen. . . . . . . . . 1.8 Entwicklungsumgebung einstellen . . . . . . . . . . . . . . . . . . Editoreinstellungen anpassen . . . . . . . . . . . . . . . . . . . . . . . Editierformat festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Allgemeine Einstellungen vornehmen. . . . . . . . . . . . . . . . Fenster verankern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 19 21 23 24 25 26 26 27 28 32 32 35 39 41 42 43 43 45 45 46 46 54 55 57 57 59 60 61

Inhaltsverzeichnis

1.9

Datentypen, Variablen und Konstanten . . . . . . . . . . . . . . . Was sind Variablen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablen deklarieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablendeklaration erzwingen. . . . . . . . . . . . . . . . . . . . . Vorsicht, Falle! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Statische Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ffentliche Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Private Variablen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objektvariablen einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . Konstanten einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konstanten fr die Datumsfomatierung. . . . . . . . . . . . . . . 1.10 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.11 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.12 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tag 2 Die Sprachelemente von VBA . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 Arbeiten mit Verzweigungen. . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen im Leben. . . . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen in Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen in Excel-VBA . . . . . . . . . . . . . . . . . . . . . . Zelleninhalte prfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auch eine Art von Verzweigung. . . . . . . . . . . . . . . . . . . . . 2.2 bersichtlichere Form mit Select Case . . . . . . . . . . . . . . . Excel-Version feststellen . . . . . . . . . . . . . . . . . . . . . . . . . . . Zahlenwerte prfen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fensterstatus ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Schleifen programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . For...Next-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . For Each...Next-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . Die Schleife Do Until...Loop . . . . . . . . . . . . . . . . . . . . . . . Die Schleife Do While...Loop . . . . . . . . . . . . . . . . . . . . . . 2.4 Auf Fehlersuche mit VBA . . . . . . . . . . . . . . . . . . . . . . . . . . Allgemeine Informationen zu Makros . . . . . . . . . . . . . . . . Fehler finden und beseitigen . . . . . . . . . . . . . . . . . . . . . . . Typische Fehlerquellen in Excel-VBA. . . . . . . . . . . . . . . . 2.5 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62 63 63 66 67 68 69 70 71 89 90 97 98 99 101 102 103 104 104 105 108 109 110 111 112 113 114 119 125 130 133 133 135 144 150 151 151

Inhaltsverzeichnis

Tag 3

Die Excel-Anwendung einstellen und anpassen . . . . . . . . . . . . 3.1 Vollbildansicht einstellen . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Weitere Einstellungen der Ansicht . . . . . . . . . . . . . . . . . . . 3.3 Lang laufende Makros schneller machen . . . . . . . . . . . . . Bildschirmaktualisierung ein- und ausschalten . . . . . . . . . Die Berechnung ein- und ausschalten . . . . . . . . . . . . . . . . Statuszeile einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Standardmeldungen abschalten . . . . . . . . . . . . . . . . . . . . . 3.4 Automatische Listen generieren . . . . . . . . . . . . . . . . . . . . . Benutzerdefinierte Liste aus Makro erzeugen . . . . . . . . . . Benutzerdefinierte Liste aus Zelleninhalten erzeugen . . . 3.5 Drag&Drop ein- und ausschalten . . . . . . . . . . . . . . . . . . . 3.6 Add-Ins berprfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7 Wiedervorlageliste bearbeiten. . . . . . . . . . . . . . . . . . . . . . . 3.8 Sonstige Einstellmglichkeiten in Excel . . . . . . . . . . . . . . Allgemeine Einstellungen . . . . . . . . . . . . . . . . . . . . . . . . . Zoom einstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aufenthaltsbereich festlegen. . . . . . . . . . . . . . . . . . . . . . . . 3.9 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.10 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.11 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auf Arbeitsmappen zugreifen Datei-Operationen . . . . . . . . . 4.1 Arbeitsmappen ffnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe ffnen (ohne Aktualisierung). . . . . . . . . . . . Arbeitsmappe(n) ffnen ber einen Dialog . . . . . . . . . . . . Geffnete Arbeitsmappen identifizieren . . . . . . . . . . . . . . 4.2 Arbeitsmappen speichern . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe speichern ber Dialog . . . . . . . . . . . . . . . . . Alle geffneten Arbeitsmappen speichern . . . . . . . . . . . . . Arbeitsmappe speichern unter Datum/Uhrzeit . . . . . . . . . Arbeitsmappe bedingt speichern . . . . . . . . . . . . . . . . . . . . 4.3 Arbeitsmappen schlieen . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe schlieen nderungen speichern. . . . . . . Arbeitsmappe schlieen nderungen verwerfen. . . . . . . Mehrere Arbeitsmappen schlieen. . . . . . . . . . . . . . . . . . .

153 154 156 159 159 160 161 163 164 164 165 167 167 168 171 171 173 174 175 176 176 177 178 180 181 184 185 186 188 189 190 191 191 191 191

Tag 4

Inhaltsverzeichnis

Arbeitsmappen anlegen. . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen zusammenfhren. . . . . . . . . . . . . . . . . . . . Arbeitsmappen entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . Die Dokumenteigenschaften . . . . . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften auslesen . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften setzen . . . . . . . . . . . . . . . . . . . . . 4.8 Verknpfungen in Arbeitsmappen . . . . . . . . . . . . . . . . . . . Verknpfungen dokumentieren . . . . . . . . . . . . . . . . . . . . . Verknpfungen ndern. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tag 5 Tabellenbltter programmieren . . . . . . . . . . . . . . . . . . . . . . . . . 5.1 Tabellen anlegen und benennen . . . . . . . . . . . . . . . . . . . . 5.2 Blatt-Typ bestimmen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellenbltter fllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blattprfung vor Fllung vornehmen . . . . . . . . . . . . . . . . 5.3 Tabellen entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabelle nach Rckfrage lschen . . . . . . . . . . . . . . . . . . . . Rckfrage bei Tabellenlschung unterdrcken. . . . . . . . . Eigene Rckfrage programmieren . . . . . . . . . . . . . . . . . . . Vor dem Lschen prfen . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Tabellen exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabelle als Textdatei exportieren . . . . . . . . . . . . . . . . . . . . Tabelle in eine neue Arbeitsmappe kopieren . . . . . . . . . . Tabelle in neue Arbeitsmappe bertragen . . . . . . . . . . . . . Tabelle in andere Arbeitsmappe kopieren/bertragen. . . . 5.5 Tabellen importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Textdatei-Import mit festen Datenfeldern . . . . . . . . . . . . . Textdatei-Import mit variablen Datenfeldern . . . . . . . . . . 5.6 Tabellen ein- und ausblenden . . . . . . . . . . . . . . . . . . . . . . Einfaches Aus- und Einblenden einer Tabelle . . . . . . . . . Mehrere Tabellen ausblenden . . . . . . . . . . . . . . . . . . . . . . Das sichere Ausblenden von Blttern. . . . . . . . . . . . . . . . . Bltter wieder einblenden. . . . . . . . . . . . . . . . . . . . . . . . . .

4.4 4.5 4.6 4.7

193 193 195 196 197 198 201 202 203 205 205 205 207 208 210 212 212 213 213 213 214 215 216 216 218 219 220 221 221 224 226 227 228 229 230

Inhaltsverzeichnis

5.7

5.8

5.9 5.10 5.11 5.12 5.13 Tag 6

Tabellen gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfaches Gruppieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Komplexeres Gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen schtzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nur bestimmte Zellen vor Vernderung schtzen . . . . . . Temporren Schutz einstellen . . . . . . . . . . . . . . . . . . . . . . Bestimmte Bereiche vom Schutz ausnehmen . . . . . . . . . . Tabellen sortieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kopf- und Fuzeilen programmieren. . . . . . . . . . . . . . . . . Kopf- und Fuzeilen fllen . . . . . . . . . . . . . . . . . . . . . . . . Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . bungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

231 232 234 235 237 239 240 241 243 243 245 246 247 249 250 250 251 251 253 256 257 258 259 259 260 262 262 264 266 268 270 271 273 276 276 278

Zellbearbeitung mit VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1 Zellen markieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zelle markieren und Koordinaten ausgeben . . . . . . . . . . . Zellenbereich markieren und Koordinaten ausgeben . . . . Mehrere Zellenbereiche markieren . . . . . . . . . . . . . . . . . . Relative Markierungsformen . . . . . . . . . . . . . . . . . . . . . . . Zellen ber einen Index ansprechen . . . . . . . . . . . . . . . . . Den verwendeten Bereich ermitteln . . . . . . . . . . . . . . . . . Den umliegenden Bereich ermitteln . . . . . . . . . . . . . . . . . 6.2 Zellen fllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen initialisieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen abfragen und ndern . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Zellen formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hintergrundfarbe von Zellen festlegen . . . . . . . . . . . . . . . Schriftart festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Schriftschnitte angeben . . . . . . . . . . . . . . . . . . . . . . . . Zellen rahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zahlenformate festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . Datumsformate festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Zellen benennen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5 Zellen kommentieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kommentarzellen auskundschaften . . . . . . . . . . . . . . . . . . Kommentare aus Zelleninhalten erstellen . . . . . . . . . . . . .

Inhaltsverzeichnis

Zellen fllen aus Kommentaren. . . . . . . . . . . . . . . . . . . . . Kommentare lschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6 Arbeiten mit Formeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Addition von bestimmten Stzen . . . . . . . . . . . . . . . . . . . . Subtraktion von Datumsangaben . . . . . . . . . . . . . . . . . . . . Preise erhhen durch Multiplikation . . . . . . . . . . . . . . . . . DM-Umrechnung mit Division . . . . . . . . . . . . . . . . . . . . . 6.7 Tabellenfunktionen einsetzen. . . . . . . . . . . . . . . . . . . . . . . Die Funktionsliste. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Tabellenfunktion Sum. . . . . . . . . . . . . . . . . . . . . . . . . Die Tabellenfunktionen Datedif und Rank . . . . . . . . . . . . Die Tabellenfunktion SumIf . . . . . . . . . . . . . . . . . . . . . . . Die Tabellenfunktion CountIf . . . . . . . . . . . . . . . . . . . . . . Die Tabellenfunktion Count . . . . . . . . . . . . . . . . . . . . . . . Die Tabellenfunktion CountA . . . . . . . . . . . . . . . . . . . . . . Die Tabellenfunktion CountBlank . . . . . . . . . . . . . . . . . . 6.8 Formeln finden und dokumentieren . . . . . . . . . . . . . . . . . Formelzellen finden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formelzellen dokumentieren . . . . . . . . . . . . . . . . . . . . . . . 6.9 Gltigkeitsprfungen vornehmen . . . . . . . . . . . . . . . . . . . Nur ganze Zahlen eingeben . . . . . . . . . . . . . . . . . . . . . . . . Datumsgrenzen einstellen . . . . . . . . . . . . . . . . . . . . . . . . . Gltigkeitsliste erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.10 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.11 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.12 bungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tag 7 Aktionen und Benutzereingaben in Excel berwachen . . . . . . 7.1 Was sind Ereignisse? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Ereignisse auf Arbeitsmappenebene . . . . . . . . . . . . . . . . . . Das Ereignis Workbook_Open. . . . . . . . . . . . . . . . . . . . . . Das Ereignis Workbook_BeforeClose . . . . . . . . . . . . . . . . Das Ereignis Workbook_BeforeSave . . . . . . . . . . . . . . . . . Das Ereignis Workbook_NewSheets . . . . . . . . . . . . . . . . . Weitere Arbeitsmappenereignisse im berblick . . . . . . . . 7.3 Ereignisse auf Tabellenblattebene . . . . . . . . . . . . . . . . . . . Das Ereignis Activate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Ereignis Change . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

279 280 282 282 285 285 287 288 288 289 291 293 295 296 297 299 300 301 303 306 306 309 311 312 313 314 315 316 317 317 319 320 321 322 324 324 325

10

Inhaltsverzeichnis

7.4

7.5

7.6

7.7 7.8 7.9

Das Ereignis Selection_Change. . . . . . . . . . . . . . . . . . . . . Das Ereignis Calculate . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weitere Tabellenereignisse im berblick . . . . . . . . . . . . . Excel ber Tastenkombinationen bedienen. . . . . . . . . . . . Formeln und Verknpfungen in Festwerte wandeln. . . . . Bestimmte Standardtastenkombinationen deaktivieren. . . Nur Werte einfgen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sonderzeichen per Tastenkombination einfgen . . . . . . . Programmieren mit der Maus . . . . . . . . . . . . . . . . . . . . . . Kontextmen deaktivieren/aktivieren. . . . . . . . . . . . . . . . . Kontextmen fr bestimmte Bereiche deaktivieren . . . . . Kontextmen in allen Tabellen deaktivieren. . . . . . . . . . . Kontextmen in bestimmten Tabellen deaktivieren . . . . . Eigene Funktionen mit der rechten Maustaste starten . . . Doppelklick deaktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . Werte hochzhlen per Doppelklick . . . . . . . . . . . . . . . . . . Zufallszahlen per Doppelklick . . . . . . . . . . . . . . . . . . . . . . Excel zeitmig steuern . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Uhr immer im Blick . . . . . . . . . . . . . . . . . . . . . . . . . . Countdown in Excel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verarbeitung zu einer bestimmten Zeit beginnen. . . . . . . Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . bungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

329 330 331 332 332 337 338 339 342 342 343 344 345 346 349 351 352 353 354 355 356 357 359 360

Wochenvorschau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 Tag 8 Groe Datenmengen in VBA behandeln und auswerten . . . . . 8.1 Daten filtern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den AutoFilter aktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . Ein Filterkriterium einsetzen . . . . . . . . . . . . . . . . . . . . . . . Mehrere Filterkriterien festlegen . . . . . . . . . . . . . . . . . . . . Filterkriterium aus Zelle beziehen . . . . . . . . . . . . . . . . . . . Der Filter TopTen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wo stecken die Filter? . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Spezialfilter einsetzen. . . . . . . . . . . . . . . . . . . . . . . . . Gefilterte Daten exportieren. . . . . . . . . . . . . . . . . . . . . . . . 8.2 Pivot-Tabellen einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 364 365 365 367 370 370 373 374 376 379

11

Inhaltsverzeichnis

8.3

8.4 8.5 8.6 Tag 9

Pivot-Tabellen erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . Pivot-Tabellen aktualisieren . . . . . . . . . . . . . . . . . . . . . . . . Diagramme erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrammtypen auswhlen . . . . . . . . . . . . . . . . . . . . . . . . Der Standard das Sulendiagramm. . . . . . . . . . . . . . . . . Ergebnisse ber das Balkendiagramm vergleichen . . . . . . Tagesgenaue Auswertungen ber das Liniendiagramm . . Daten richtig skalieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagramme platzieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagramme formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagramme exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . bungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

379 382 384 384 385 387 389 393 393 395 397 398 401 401

Funktionen einsetzen, um Excel zu automatisieren . . . . . . . . . 403 9.1 Eigene Tabellenfunktionen stricken. . . . . . . . . . . . . . . . . . 405 Zellen mit blauer, dicker Schriftfarbe summieren. . . . . . . 405 Aktuelle Arbeitsmappe ermitteln . . . . . . . . . . . . . . . . . . . . 408 Formelcheck durchfhren . . . . . . . . . . . . . . . . . . . . . . . . . 409 Zelleninformationen abfragen . . . . . . . . . . . . . . . . . . . . . . 410 Dokumenteigenschaften per Funktion abfragen . . . . . . . . 411 Buchstaben aus Zellen eliminieren . . . . . . . . . . . . . . . . . . 413 Das erste Auftreten einer Zahl ermitteln . . . . . . . . . . . . . . 414 9.2 Modulare Funktionen programmieren . . . . . . . . . . . . . . . 416 Arbeitsmappen-Existenz prfen . . . . . . . . . . . . . . . . . . . . . 416 Arbeitsmappen-Zustand prfen . . . . . . . . . . . . . . . . . . . . . 417 Eine mchtige Lschfunktion erstellen . . . . . . . . . . . . . . . 419 9.3 Funktionen dauerhaft verfgbar machen. . . . . . . . . . . . . . 422 Speichern der Funktionen in der persnlichen Makroarbeitsmappe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 Speichern der Funktionen in einem Add-In . . . . . . . . . . . 424 9.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 9.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 9.6 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

12

Inhaltsverzeichnis

Tag 10

Excel und das Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1 Arbeiten mit Hyperlinks . . . . . . . . . . . . . . . . . . . . . . . . . . . Hyperlinks aus einer Tabelle entfernen . . . . . . . . . . . . . . . Hyperlinks aus Zelleninhalten herstellen. . . . . . . . . . . . . . Inhaltsverzeichnis erstellen. . . . . . . . . . . . . . . . . . . . . . . . . 10.2 E-Mails verschicken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 Kontakte austauschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.6 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Excel und Datenzugriffe auf Access und Word . . . . . . . . . . . . . 11.1 Die Voraussetzung fr den Datenaustausch . . . . . . . . . . . 11.2 Excel-Daten in eine Access-Datenbank berfhren . . . . . 11.3 Access-Daten in Excel-Tabellen berfhren . . . . . . . . . . . Alle Datenstze nach Excel transferieren. . . . . . . . . . . . . . Nur bestimmte Datenstze nach Excel transferieren . . . . 11.4 Access-Tabellen manipulieren . . . . . . . . . . . . . . . . . . . . . . 11.5 Datenstze lschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.6 Zusammenarbeit zwischen Excel und Word vorbereiten . 11.7 Word-Sitzung starten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.8 Word-Sitzung bernehmen . . . . . . . . . . . . . . . . . . . . . . . . 11.9 Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfgen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.10 Ganze Excel-Tabellen in ein Word-Dokument einfgen . 11.11 Word-Dokumente in einer Excel-Tabelle auflisten . . . . . . 11.12 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.13 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.14 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeiten an der Oberflche Men- und Symbolleisten programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1 Art der Leiste identifizieren . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Menleisten programmieren . . . . . . . . . . . . . . . . . . . . . . . Arbeitsblatt-Menleiste ein- und ausblenden. . . . . . . . . . . Neue Mens einfgen und lschen . . . . . . . . . . . . . . . . . . Menbefehle einfgen . . . . . . . . . . . . . . . . . . . . . . . . . . . .

429 430 431 432 434 436 439 443 446 446 447 448 451 455 455 458 461 462 464 465 467 468 472 474 477 484 484 485 486 488 489 490 492

Tag 11

Tag 12

13

Inhaltsverzeichnis

12.3 Symbolleisten programmieren . . . . . . . . . . . . . . . . . . . . . . Neue Symbolleiste anlegen . . . . . . . . . . . . . . . . . . . . . . . . Symbole integrieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4 Kontextmens programmieren. . . . . . . . . . . . . . . . . . . . . . Zellen-Kontextmen erweitern. . . . . . . . . . . . . . . . . . . . . . Kontextmenbefehle entfernen . . . . . . . . . . . . . . . . . . . . . 12.5 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.6 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tag 13 Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1 Was sind UserForms? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 UserForms entwerfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bilder in UserForms einfgen . . . . . . . . . . . . . . . . . . . . . . Horizontale Trennstreifen einfgen . . . . . . . . . . . . . . . . . . Steuerelemente beschriften . . . . . . . . . . . . . . . . . . . . . . . . Aktivierreihenfolge festlegen. . . . . . . . . . . . . . . . . . . . . . . . 13.3 UserForms programmieren . . . . . . . . . . . . . . . . . . . . . . . . . UserForm aufrufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UserForm beenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Speichern der eingegebenen Daten . . . . . . . . . . . . . . . . . . Vokabeln einfgen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vokabeln prfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anzeigen der nchsten drei Vokabeln . . . . . . . . . . . . . . . . 13.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.6 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Import und Export ber VBE-Programmierung . . . . . . . . . . . . 14.1 Was ist VBE-Programmierung? . . . . . . . . . . . . . . . . . . . . . 14.2 Voraussetzung das Einbinden der VBE-Bibliothek. . . . . 14.3 Weitere Informationen zu Bibliotheken . . . . . . . . . . . . . . . 14.4 VBE-Bibliothek deaktivieren . . . . . . . . . . . . . . . . . . . . . . . 14.5 Objekte, Methoden und Eigenschaften der VBE . . . . . . . 14.6 Typische Aufgaben mit der VBE erledigen . . . . . . . . . . . . Arbeitsmappe mit Quellcode bestcken . . . . . . . . . . . . . .

494 494 496 500 500 501 502 504 504 505 506 507 510 511 511 511 512 512 513 514 516 519 521 523 525 525 527 528 528 532 534 535 536 536

Tag 14

14

Inhaltsverzeichnis

Quellcode sichern ber den Export . . . . . . . . . . . . . . . . . . Module ausdrucken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen von Modulen befreien. . . . . . . . . . . . . . . . Ein bestimmtes Makro entfernen . . . . . . . . . . . . . . . . . . . . Ein Ereignis lschen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VBE aufrufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.7 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.8 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.9 bung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tag 15 Lsungen der Tages-bungen . . . . . . . . . . . . . . . . . . . . . . . . . . . A Tag 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.1:Tag 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.2:Tag 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.3:Tag 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.4:Tag 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.6:Tag 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.11:Tag 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.14:Tag 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.16:Tag 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.17:Tag 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.18:Tag 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.20:Tag 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.21:Tag 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listing A.22:Tag 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wichtige Funktionen in einem eigenen Add-In ablegen . . . . . B.1 Die Ereignisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.2 Der Quellcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Menerstellung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.3 Die Makros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formeln in Festwerte umwandeln . . . . . . . . . . . . . . . . . . . Aktive Tabelle als E-Mail verschicken . . . . . . . . . . . . . . . . Aktive Tabelle in neuer Arbeitsmappe speichern . . . . . . . Informationen zu Datum und Zeit. . . . . . . . . . . . . . . . . . . Informationen zur aktiven Arbeitsmappe . . . . . . . . . . . . . . ffnen aller verknpften Arbeitsmappen . . . . . . . . . . . . . .

540 543 544 545 546 548 548 550 551 553 554 555 555 556 557 559 562 564 565 566 567 569 570 572 573 575 576 576 581 581 582 583 583 584 584

Tag 16

15

Inhaltsverzeichnis

B.4

Verknpfungen zu anderen Arbeitsmappen entfernen . . . Suchen von Texten in Arbeitsmappen . . . . . . . . . . . . . . . . Zellen bearbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen markieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen lschen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

585 585 587 588 589 592

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

16

Liebe Leserin, lieber Leser


Das Programm Microsoft Excel ist technisch sehr ausgereift und Sie werden auf den ersten Blick nicht viel vermissen, was Sie fr Ihre tgliche Arbeit brauchen. Mit Hilfe von VBA-Makros lassen sich aber gerade tgliche lstige Routinearbeiten weitgehend automatisieren. Sie haben zwar einmalig den Aufwand mit der Erstellung der dazu bentigten Makros; spter profitieren Sie jedoch davon und haben viel mehr Zeit fr andere Dinge zur Verfgung. Auerdem werden Sie zunehmend auf programmierte Excel-Lsungen stoen. Nur wenn Sie selbst mit VBA programmieren knnen, verstehen Sie diese Lsungen wirklich und knnen sie selbst nach Ihren Bedrfnissen abndern, ohne auf externe Dienstleister zurckgreifen zu mssen. Dieses Buch ist in 14 Kapitel gegliedert. Sie knnen es somit, wenn Sie wollen, in zwei Wochen durcharbeiten, wenn Sie sich jeden Tag ein Kapitel vornehmen. An den Kapitelenden finden Sie nahezu immer einen Workshop mit Fragen & Antworten, einem Quiz und einer oder auch mehreren bungen. Sie dienen Ihnen zur persnlichen Erfolgskontrolle. Ich habe mich bemht, die wichtigsten und interessantesten Lsungen im Buch vorzustellen. Zu jedem Kapitel knnen Sie auf der mitgelieferten CD-ROM die entsprechende Beispieldatei ffnen und den Quellcode ansehen und testen. Sie brauchen daher nicht die einzelnen Listings abzutippen (wenngleich ich Ihnen das empfehle, weil dann der Lerneffekt hher ist). Am Ende des Buches werden Sie in der Lage sein, effektiv mit VBA-Makros umzugehen und eigene Lsungen zu entwickeln. Bei Nachfragen und allgemeinem Feedback zu meinem Buch erreichen Sie mich ber meine Excel-Homepage http://held-Office.de oder ber Bernd.Held@mut.de. So erreichen Sie gleichzeitig auch den Verlag, den es wie mich selbst interessiert, welche Anregungen und Kritik Sie haben. Auf der Homepage von Markt+Technik finden Sie auch ein eigenes VBA-Forum (http://www.mut.de/main/main.asp?page=vbaforum), wo Sie Ihre VBA-Fragen loswerden knnen. Ich moderiere dieses Forum und antworte dort nahezu tglich. Auch Sie sind natrlich herzlich eingeladen, in diesem VBA-Forum zu antworten. Besuchen Sie auch ruhig einmal das Excel-Diskussionsforum news:microsoft.public.de.excel oder das Excel-Spotlight-Forum unter http://spotlight.de/zforen/ mse/t/forum_mse_1.html. Hier knnen Sie auf jeden Fall eine ganze Menge lernen.

17

Liebe Leserin, lieber Leser

Mchten Sie einen VBA-Kurs besuchen, so finden Sie auf meiner Homepage regelmig Schulungsangebote. Diese Angebote reichen von Einzelschulungen bei 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-Arbeitsmappen! Bernd Held MVP fr Microsoft Excel

In diesem Buch verwendete Konventionen


Dieses Buch enthlt spezielle Icons, mit denen wichtige Konzepte und Informationen herausgestrichen werden sollen. Ein Hinweis enthlt interessante Informationen zum behandelten Thema.

Ein Tipp gibt Ihnen Ratschlge oder zeigt Ihnen einfachere Wege zur Lsung eines Problems auf. Ein Achtungszeichen weist Sie auf mgliche Probleme hin und hilft Ihnen, schwierigen Situationen aus dem Wege zu gehen.

Das Symbol Neuer Begriff ist den Abstzen hinzugefgt, in denen ein neuer Begriff definiert wird. Der neue Begriff ist kursiv gedruckt, so dass Sie ihn leicht erkennen knnen.

18

T ag 1 T ag 2 T ag 3 T ag 4 T ag 5 T ag 6 T ag 7

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen Die Sprachelemente von VBA Die Excel-Anwendung einstellen und anpassen

21 101 153

Auf Arbeitsmappen zugreifen Datei-Operationen 177 Tabellenbltter programmieren Zellbearbeitung mit VBA Aktionen und Benutzereingaben in Excel berwachen Groe Datenmengen in VBA behandeln und auswerten 207 249 315

W O C H E

T ag 8 T ag 9 Tag 10 Tag 11 Tag 12 Tag 13 Tag 14

363

Funktionen einsetzen, um Excel zu automatisieren 403 Excel und das Internet Excel und Datenzugriffe auf Access und Word Arbeiten an der Oberflche Menund Symbolleisten programmieren Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren Makros dynamisch erzeugen, importieren, exportieren ber VBE-Programmierung 429 447 485 505 527

W O C H E

Die wichtigsten Grundlagen und Objekte in VBA fr Excel


In der ersten Woche werden Sie am 1. Tag mit der Entwicklungsumgebung von Excel bekannt gemacht. Sie werden einige Makros eingeben und ablaufen lassen. Bei der Eingabe der Makros werden Sie tatkrftig untersttzt durch spezielle Funktionen und Features der Entwicklungsumgebung, mit deren Hilfe Sie Codes schnell erfassen und optisch hervorheben knnen. Des Weiteren lernen Sie Datentypen, Variablen und Konstanten kennen. Der 2. Tag stellt Ihnen die wichtigsten Sprachelemente, wie Schleifen, Verzweigungen und Abfragen, welche in jeder Programmiersprache vorkommen, vor. Schon an diesem Tag lernen Sie, wie Sie diese Sprachelemente anhand von Beispielen aus der Praxis einsetzen knnen. Der 3. Tag hat als Ausbildungsziel das Einstellen der Excel-Applikationen. So werden Sie lernen, wie Sie Excel individuell ber den Einsatz von Makros konfigurieren knnen. Am 4. Tag beginnen Sie mit Excel-Arbeitsmappen zu arbeiten. Sie werden u.a. neue Arbeitsmappen anlegen und speichern, Arbeitsmappen drucken, umbenennen oder nach bestimmten Mappen auf Ihrer Festplatte oder auf einem Netzwerk suchen. Am 5. Tag der ersten Woche werden Sie sich intensiv mit Tabellenblttern beschftigen. Unter anderem werden Sie Tabellenbltter einfgen und mit Daten fllen, Tabellen entfernen oder umbenennen bzw. bestimmte Daten auf Tabellen suchen und kennzeichnen. Am 6. Tag lernen Sie, wie Sie die kleinste Einheit in Excel, die Zelle, ansprechen und programmieren knnen. Unter anderem werden Sie Zellen auslesen, fllen, einfrben, einfgen, lschen und vieles mehr. Am 7. Tag steigen Sie in die Welt der Ereignisse von Excel ein. Mit ein paar wenigen Handgriffen werden Sie dabei erstaunliche Features in Excel programmieren. Unter anderem lernen Sie, wie Sie auf Benutzereingaben automatisch reagieren und wie Sie nderungen an Ihren Tabellen dokumentieren knnen. Des Weiteren lernen Sie, wie Sie Excel ber Tastatur bzw. Zeitfunktionen steuern knnen. Unter anderem werden Sie an diesem Tag Makrolsungen erstellen, die zu bestimmten Zeitpunkten automatisch starten.

20

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Die Entwicklungsumgebung von Excel ist in der Anwendung integriert. Allerdings ist sie nicht gleich fr jedermann sichtbar. In die Entwicklungsumgebung gelangen Sie, indem Sie eine der folgenden alternativen Vorgehensweisen whlen:

Drcken Sie die Tastenkombination (Alt) + (F11). Whlen Sie aus dem Men EXTRAS den Befehl MAKRO/VISUAL BASIC-EDITOR. Klicken Sie mit der rechten Maustaste auf einen beliebigen Tabellenreiter (unten) und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN. Blenden Sie die Symbolleiste VISUAL BASIC ein und klicken Sie das Symbol VISUAL BASIC-EDITOR an. Wie Sie sehen, haben Sie eine Menge von Mglichkeiten, in die Entwicklungsumgebung von Excel zu gelangen. Persnlich bevorzuge ich die erste Variante, also das Drcken der Tastenkombination (Alt) + (F11), da dies am schnellsten geht.

Egal, fr welche Variante Sie sich entscheiden alle Varianten fhren zum selben Ziel. Sehen Sie sich nun die erste Abbildung an.

Abbildung 1.1: Der erste Aufruf der Entwicklungsumgebung

22

Der Projekt-Explorer

1.1

Der Projekt-Explorer

Auf der linken Seite sehen Sie den Projekt-Explorer. Dieser Explorer beinhaltet die momentan geffneten Arbeitsmappen. Darber hinaus werden Excel-Add-Ins angezeigt, die Sie in Ihrer Excel-Applikation ber den Add-Ins-Manager eingebunden haben. Diese Add-Ins, die Sie an der Endung .xla erkennen knnen, lassen sich ber das Plussymbol leider nicht ffnen, es sei denn, Sie wissen das Kennwort, mit dem diese Add-Ins von Microsoft geschtzt wurden. Alle anderen im ProjektExplorer angezeigten Elemente knnen Sie aufklappen. In der Arbeitsmappe Personl.xls knnen Sie Makros speichern, die Sie in Zukunft fr alle weiteren Excel-Arbeitsmappen einsetzen mchten. Wie Sie diese wichtige Arbeitsmappe anlegen und mit Makros bestcken, lernen Sie im weiteren Verlauf des Tages. Vergleichbar ist diese Datei mit der zentralen Dokumentvorlage Normal.dot, die Sie eventuell schon von Word kennen. Auch dort werden Makros hinterlegt, um sie fr alle weiteren Dokumente benutzen zu knnen. In Abbildung 1.1 sehen Sie, dass neben den beiden Add-Ins und der zentralen Makro-Arbeitsmappe Personl.xls eine weitere Arbeitsmappe Mappe2 angezeigt wird. Wenn Sie ber das Plussymbol die einzelnen Elemente dieser Arbeitsmappe aufklappen, erscheinen die in der Mappe enthaltenen Tabellenbltter (Tabelle1 bis Tabelle3) sowie der Eintrag DieseArbeitsmappe. Hinter jedem dieser Elemente knnen Sie so genannte Ereignisse einstellen. Unter einem Ereignis versteht man in Excel Vorgnge wie das ffnen oder Schlieen einer Arbeitsmappe, die Eingabe von Daten in Zellen, das Drucken oder Speichern von Mappen und vieles mehr. Ereignisse knnen Sie entweder auf Tabellenebene oder auf Arbeitsmappenebene einstellen. Sie haben somit die Mglichkeit, bestimmte Vorgnge in Ihren Excel-Tabellen separat zu berwachen und auf Vernderungen individuell zu reagieren. Auf dieses Spezialthema wird an diesem Tag nicht weiter eingegangen. Lernen Sie am Tag 7 praktische Einsatzmglichkeiten fr Ereignisse kennen.

23

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

1.2

Das Eigenschaftenfenster

ber das Men ANSICHT und den Befehl EIGENSCHAFTEN knnen Sie das Eigenschaftenfenster anzeigen, sofern es nicht bereits eingeblendet ist. Alternativ dazu knnen Sie auch die Taste (F4) drcken, um dieses Fenster einzublenden.

Abbildung 1.2: Das Eigenschaftenfenster

Mithilfe dieses Fensters knnen Sie bestimmte Eigenschaften der im ProjektExplorer markierten Objekte nher bestimmen. In diesem Beispiel ist im ProjektExplorer der Eintrag Tabelle1 (Tabelle1) markiert. Im Eigenschaftenfenster werden daraufhin die verfgbaren Eigenschaften fr dieses Objekt angezeigt. Die Namen der einzelnen Tabellen entsprechen im ersten Teil dem Namen der zeitlichen Reihenfolge, nach der die Tabellen in die Arbeitsmappe eingefgt wurden. So werden standardmig bei der Neuanlage einer Arbeitsmappe genau drei Tabellen eingefgt. Die erste Tabelle bekommt dabei den internen Namen Tabelle1, die zweite Tabelle den Namen Tabelle2 usw. Der Name, der in Klammern steht, ist der eigentliche Name der Tabelle, d.h., wenn Sie eine Tabelle umbenennen, wird der tatschliche Name in Klammern angezeigt. Um den ersten Teil des Namens anzupassen, knnen Sie den Mauszeiger im Eigenschaftenfenster rechts neben die Rubrik (Name) setzen und den gewnschten Namen der Tabelle direkt erfassen. Den zweiten Teil des Namens, der auf dem Tabellenreiter

24

Das Eigenschaftenfenster

der Tabelle angezeigt wird, knnen Sie anpassen, indem Sie den Mauszeiger im Eigenschaftenfenster rechts neben die Rubrik Name setzen und den gewnschten Namen der Tabelle direkt erfassen.

Tabellen ein- und ausblenden


ber das Eigenschaftenfenster knnen Sie die Tabelle1 ausblenden. Dazu befolgen Sie die folgenden Arbeitsschritte: 1. Markieren Sie im Projekt-Explorer den Eintrag Tabelle1 (Tabelle1). 2. Setzen Sie den Mauszeiger im Eigenschaftenfenster rechts neben das Feld Visible. 3. Dort wird nun ein Dropdown-Men angeboten, aus dem Sie eine der folgenden Einstellmglichkeiten auswhlen knnen.

-1 xlSheetVisible: Das Einstellen dieser Konstante bewirkt, dass sich die Tabelle im eingeblendeten Zustand befindet (Standardeinstellung). 0 xlSheetHidden: Whlen Sie diese Einstellung, um die Tabelle auszublenden. Wenn Sie danach aus der Entwicklungsumgebung heraus in die normale Arbeitsoberflche von Excel wechseln, wird die Tabelle nicht mehr angezeigt. Sie haben bei dieser Einstellung aber noch die Mglichkeit, die ausgeblendete Tabelle ber das Men FORMAT und den Befehl BLATT/EINBLENDEN wieder verfgbar zu machen. 2 xlSheetVeryHidden: ber diese Einstellung sorgen Sie dafr, dass die Tabelle sicher ausgeblendet wird, d.h. der Anwender kann die so ausgeblendete Tabelle nicht ber das Men FORMAT und den Befehl BLATT/ EINBLENDEN wieder verfgbar machen. Wenn Sie sich fr die sichere Variante, eine Tabelle auszublenden, entschieden haben, dann knnen Sie die so ausgeblendete Tabelle wieder ber den Projekt-Explorer und das Eigenschaftenfenster verfgbar machen, indem Sie die ausgeblendete Tabelle im Projekt-Explorer markieren und im Eigenschaftenfenster unter der Rubrik Visible die Konstante -1 xlVisible einstellen.

25

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.3: Die mit xlSheetVeryHidden ausgeblendete Tabelle1 kann ber die normale Oberflche von Excel nicht mehr eingeblendet werden.

Tabellen spiegeln
Mchten Sie einen anderen Anwender verwirren, dann drehen Sie die gewohnte Ansicht einer Tabelle einfach um. Dabei stellen Sie die gespiegelte Ansicht ber das Eigenschaftenfenster wie folgt ein: 1. Markieren Sie im Projekt-Explorer Tabelle2. 2. Im Eigenschaftenfenster setzen Sie den Mauszeiger rechts neben die Rubrik DisplayRightToLeft. 3. Whlen Sie aus dem Dropdown-Feld den Eintrag True. 4. Wechseln Sie auf die Arbeitsoberflche von Excel.

Abbildung 1.4: Spalten gespiegelt etwas anders als gewohnt

Den zu bearbeitenden Bereich festlegen


Standardmig kann ein Anwender auf alle Zellen einer Tabelle zugreifen. Dabei hat er in einer Tabelle Zugriff auf maximal 256 Spalten und 65.536 Zeilen. Mch-

26

Das Code-Fenster

ten Sie den Zugriff ein wenig einschrnken, knnen Sie gezielt ber das Eigenschaftenfenster den Bereich abstecken, in dem sich ein Anwender aufhalten darf. Dazu befolgen Sie die nchsten Arbeitsschritte: 1. Markieren Sie im Projekt-Explorer den Eintrag Tabelle3. 2. Setzen Sie den Mauszeiger im Eigenschaftenfenster rechts neben die Rubrik ScrollArea. 3. Erfassen Sie die Formel =A1:D10 und drcken Sie anschlieend die Taste (). 4. Wechseln Sie nun auf Ihre Excel-Arbeitsoberflche und versuchen Sie, den Mauszeiger ber die Pfeiltasten auerhalb dieses Bereiches zu positionieren. Es wird Ihnen nicht gelingen!

Abbildung 1.5: Der Zugriff ist nur in einem bestimmten Bereich mglich.

Leider bleibt diese Einstellung nicht dauerhaft bestehen. Sie mssen diese Einstellung nach jedem ffnen der Arbeitsmappe neu vornehmen. Wie Sie diese Einstellung jedoch ber einen Trick dauerhaft erhalten, erfahren Sie am 7. Tag.

1.3

Das Code-Fenster

Bisher haben Sie noch keine einzige Zeile programmiert. Sie haben die Eigenschaften der einzelnen Tabellen ber das Eigenschaftenfenster eingestellt. Diese Eigenschaften knnen Sie aber auch ber Makros einstellen. Dazu erfassen Sie den bentigten Code im Code-Fenster. Damit dieses Fenster angezeigt wird,

27

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

fgen Sie zunchst ein noch leeres Modul ein. Dabei haben Sie die folgenden Mglichkeiten:

In der Entwicklungsumgebung von Excel whlen Sie aus dem Men EINFGEN den Befehl MODUL. Whlen Sie auf der Symbolleiste VOREINSTELLUNG das Dropdown-Symbol und daraus den Befehl MODUL. Klicken Sie direkt auf den Projekt-Explorer mit der rechten Maustaste und whlen Sie aus dem Kontextmen den Befehl EINFGEN/MODUL.

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

Abbildung 1.6: Das Code-Fenster wird angezeigt.

Makros erfassen und starten


Nachdem Sie das Code-Fenster eingeblendet haben, knnen Sie beginnen, Ihr erstes Makro einzugeben. Jedes Makro beginnt in VBA mit der Anweisung Sub. Danach folgt ein Leerzeichen. Direkt im Anschluss daran knnen Sie einen Namen fr das Makro angeben. Bedenken Sie dabei fr die Benennung von Makros folgende Punkte:

Das erste Zeichen muss ein alphanumerisches Zeichen sein. Der Makroname darf keine Leerzeichen enthalten.

28

Das Code-Fenster

Es drfen keine Sonderzeichen wie /, %, , $, [, ], ?, ! oder hnliche verwendet werden.

Nach dem Namen geben Sie ein rundes Klammernpaar ein und drcken die Taste
(Enter). Das Makro wird jetzt um die Anweisung End Sub ergnzt. Sub DasErsteMakro() End Sub

Anwendernamen am Bildschirm ausgeben


Momentan ist das Makro noch leer. Alle Anweisungen, die Sie innerhalb dieses Rahmens schreiben, werden abgearbeitet und nacheinander ausgefhrt. Ergnzen Sie das Makro nun wie folgt, um beispielsweise den Anwendernamen auf dem Bildschirm auszugeben:
Sub DasErsteMakro() MsgBox Application.UserName End Sub

Um das Makro zu starten, haben Sie folgende Mglichkeiten:

Setzen Sie den Mauszeiger auf die erste Zeile des Makros und drcken Sie die Taste (F5). Setzen Sie den Mauszeiger auf die erste Zeile des Makros und whlen Sie aus dem Men AUSFHREN den Befehl SUB/USERFORM AUSFHREN. Setzen Sie den Mauszeiger auf die erste Zeile des Makros und klicken Sie in der Symbolleiste VOREINSTELLUNG auf das Symbol SUB/USERFORM AUSFHREN. Wechseln Sie auf Ihre Excel-Arbeitsoberflche und whlen Sie aus dem Men EXTRAS den Befehl MAKRO/MAKROS. Im nun angezeigten Dialogfeld whlen Sie das Makro aus und klicken auf die Schaltflche AUSFHREN.

In jeder beschriebenen Variante wird eine Meldung auf dem Bildschirm ausgegeben, in der der Anwendername angezeigt wird. Dies erreichen Sie, indem Sie die Funktion MsgBox einsetzen. Der angezeigte Name kann im Men EXTRAS und mit dem Befehl OPTIONEN auf der Registerkarte ALLGEMEIN im Feld BENUTZERNAMEN eingestellt werden.

29

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.7: Das erste Makro gibt den Anwendernamen auf dem Bildschirm aus.

Zustzlichen Text mit ausgeben


Um neben dem Anwendernamen noch zustzlichen Text auszugeben, verwenden Sie in VBA den Verkettungsoperator &. Das angepasste Makro sieht dann wie folgt aus:
Sub DasZweiteMakro() MsgBox "Momentan arbeitet der Benutzer: " & _ Application.UserName End Sub

Abbildung 1.8: Zustzlichen Text in der Meldung anzeigen

30

Das Code-Fenster

Beachten Sie nach dem Zeichen & den Unterstrich. Damit geben Sie bekannt, dass Sie die Anweisung in der nchsten Zeile fortsetzen mchten. Diese Methode wird sehr oft angewendet, um die Lesbarkeit des Codes zu erhhen. Selbstverstndlich haben Sie auch die Mglichkeit, die Anweisung in eine Zeile zu schreiben, was letztendlich aber zur Folge hat, dass Sie mit der horizontalen Navigationsleiste am unteren Rand des Code-Fensters scrollen mssen, um die Anweisung lesen zu knnen (siehe Abbildung 1.8).

Mehrzeilige Meldungen anzeigen


Immer wieder gefragt sind auch mehrzeilige Meldungsfenster. Im folgenden Beispiel 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 knnen Sie eine neue Zeile im Meldungsfenster ausgeben lassen. Die einzelnen Informationen werden ber den Verkettungsoperator & miteinander verknpft. ber die Standardfunktionen Date und Time knnen Sie das aktuelle Datum und die momentane Uhrzeit ermitteln.

Abbildung 1.9: Mehrzeiliges Meldungsfenster anzeigen

31

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Sollte das Datum bzw. die Uhrzeit nicht stimmen, mssen Sie diese Einstellungen in der Systemsteuerung von Windows ndern. Excel orientiert sich nmlich bei diesen beiden Funktionen an den Einstellungen von Windows.

1.4

Der Makrorekorder

Zu Beginn der Programmierung mit Excel-VBA wird es Ihnen schwer fallen, sich die Syntax einiger Befehle anzueignen. Eine hervorragende Mglichkeit, sich schnell mit den einzelnen Befehlen vertraut zu machen, besteht darin, den Makrorekorder einzusetzen. Mithilfe des Makrorekorders knnen Sie Aktionen, die Sie manuell in Excel vornehmen, im Hintergrund aufzeichnen lassen. Dabei wird jede einzelne Aktion mit den dafr notwendigen Befehlen direkt in das CodeFenster geschrieben. Sie knnen diesen aufgezeichneten Quellcode danach ansehen und ihn noch weiter anpassen. ben Sie sich im Gebrauch des Makrorekorders, indem Sie die folgenden Aufgaben durchfhren:

Ein- und Ausschalten der Gitternetzlinien


In der ersten Aufgabe werden Sie die Gitternetzlinien fr eine Tabelle aus- und wieder einschalten. Setzen Sie den Makrorekorder ein, indem Sie die nchsten Arbeitsschritte befolgen: 1. Whlen Sie in Excel aus dem Men EXTRAS den Befehl MAKRO/AUFZEICHNEN.

Abbildung 1.10: Name und Speicherort des Makros angeben

32

Der Makrorekorder

2. Geben Sie dem Makro im Feld MAKRONAME einen Namen oder bernehmen Sie den von Excel vorgeschlagenen Namen. 3. Im Feld TASTENKOMBINATION knnen Sie dem Makro eine Tastenkombination zuweisen. Geben Sie in dieses Feld einmal den Buchstaben ein. 4. Im Dropdown-Feld MAKRO keiten:

SPEICHERN IN

haben Sie drei Auswahlmglich-

DIESE ARBEITSMAPPE: Das Makro wird in der aktuellen Arbeitsmappe gespeichert. Es ist dann nur fr diese Arbeitsmappe einsetzbar. NEUE ARBEITSMAPPE: Das aufgezeichnete Makro wird in einer neuen Arbeitsmappe gespeichert. PERSNLICHE MAKROARBEITSMAPPE: Das aufgezeichnete Makro wird in der zentralen Makroarbeitsmappe PERSONL.XLS abgelegt, die mit jedem Excel-Start geladen wird, aber im Hintergrund bleibt. Somit knnen Makros, die in dieser Mappe gespeichert werden, fr alle anderen Arbeitsmappen eingesetzt werden. Die Datei Personl.xls finden Sie brigens im Office-Unterverzeichnis OFFICE/XLSTART. Standardmig ist diese Arbeitsmappe nach der Installation noch nicht angelegt. Die Mappe wird aber automatisch fr Sie angelegt, wenn Sie ein Makro aufzeichnen und als Speicherort fr das Makro die persnliche Makroarbeitsmappe auswhlen. Entscheiden Sie sich hier fr diese Variante.

5. Im Feld BESCHREIBUNG knnen Sie eine optionale Beschreibung fr das Makro erfassen, welches beispielsweise die Aufgabe, den Autor und das Erstellungsdatum beinhalten kann. 6. Besttigen Sie Ihre Eingaben mit OK. 7. Whlen Sie nun aus dem Men EXTRAS den Befehl OPTIONEN. 8. Wechseln Sie im Dialogfeld OPTIONEN auf die Registerkarte ANSICHT. 9. Deaktivieren Sie das Kontrollkstchen GITTERNETZLINIEN. 10. Besttigen Sie Ihre Aktion mit OK. 11. Beenden Sie die Aufzeichnung des Makrorekorders, indem Sie in der angezeigten kleinen Symbolleiste das Symbol AUFZEICHNUNG BEENDEN klicken (siehe Abbildung 1.11). Kontrollieren Sie nun das Resultat der Aufzeichnung, indem Sie ber die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung wechseln.

33

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.11: Die Gitternetzlinien wurden ausgeblendet.

Abbildung 1.12: Der erste selbst aufgezeichnete Code

Fr das Ausschalten der Gitternetzlinien ist lediglich eine Anweisung notwendig. Setzen Sie fr diesen Zweck die Eigenschaft DisplayGridLines auf den Wert False. Um die Gitternetzlinien wieder einzublenden, setzen Sie die Eigenschaft DisplayGridLines wieder auf den Wert True.

34

Der Makrorekorder

Einheitliches Gestalten der Kopf- und Fuzeile


Fr den Gebrauch des Makrorekorders werden Sie im zweiten Beispiel die Kopfund Fuzeilen mit Informationen bestcken. Dabei sollen folgende Informationen erfasst werden:

Kopfzeile links: Autor der Tabelle Kopfzeile Mitte: Titel der Tabelle Kopfzeile rechts: Datum Fuzeile links: Name der Arbeitsmappe und Tabellenblattname Fuzeile Mitte: Firmenname Fuzeile rechts: Seitennumerierung

Befolgen Sie nun die nchsten Arbeitsschritte, um das Makro aufzuzeichnen: 1. Whlen Sie aus dem Men EXTRAS den Befehl MAKRO/AUFZEICHNEN. 2. Geben Sie dem Makro einen Namen und whlen Sie als Speicherort den Eintrag DIESE ARBEITSMAPPE. 3. Starten Sie die Aufzeichnung mit OK. 4. Whlen Sie aus dem Men DATEI den Befehl SEITE EINRICHTEN. 5. Wechseln Sie im Dialogfeld SEITE ZEILE/FUSSZEILE.
EINRICHTEN

auf die Registerkarte KOPF-

6. Klicken Sie auf die Schaltflche BENUTZERDEFINIERTE KOPFZEILE. 7. Fllen Sie das Dialogfeld mithilfe der Symbole und einigen manuell eingegebenen Texten wie folgt aus:

Abbildung 1.13: Die benutzerdefinierte Kopfzeile

35

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

8. Besttigen Sie Ihre Einstellungen fr die Kopfzeile mit OK. 9. Klicken Sie nun auf die Schaltflche BENUTZERDEFINIERTE FUSSZEILE. 10. Orientieren Sie sich bei der Fuzeile an folgender Abbildung:

Abbildung 1.14: Die benutzerdefinierte Fuzeile

11. Besttigen Sie die Einstellungen fr die Fuzeile 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 der Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung wechseln:
Listing 1.1: Kopf- und Fuzeilen 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"

36

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 With End Sub

Wie Sie sehen, hat der Makrorekorder hier auch Dinge aufgezeichnet, die Sie gar nicht unbedingt brauchen. Dies ist nicht ungewhnlich fr den Makrorekorder. Er beschreibt einfach das, was er sieht. Dabei werden smtliche Einstellungen des Dialogs SEITE EINRICHTEN mit aufgezeichnet. Wenn Sie das Makro nur auf die Dinge beschrnken mchten, auf die es Ihnen ankommt, dann bliebe danach folgender Code noch brig:
Listing 1.2: Das bereinigte Makro fr die Erstellung der Kopf- und Fuzeilen Sub KopfUndFu() ' ' KopfUndFu Makro ' Makro am 24.08.2002 von Bernd Held aufgezeichnet With ActiveSheet.PageSetup .LeftHeader = "Held"

37

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

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

Wenn Sie sich das letzte Makro ansehen, dann werden Sie feststellen, dass Excel bei der Erstellung von Kopf- und Fuzeilen mit Buchstabenkrzeln arbeitet. Diese Krzel werden im Zusammenspiel mit dem Verkettungsoperator & verwendet. Enthlt Ihr Firmenname das Zeichen &, dann gibt es bei der Einstellung des Firmennamens Probleme, weil Excel das &-Zeichen hier als Steuerzeichen verwendet und es in diesem Fall verschluckt. Bei solchen Fllen muss das &-Zeichen zweimal hintereinander erfasst werden (wie z.B. Schmidt GmbH && Co.). Ein erstes Stilmittel der Programmierung sehen Sie bereits aus dem aufgezeichneten Listing. Mithilfe der Anweisung With knnen Sie sich eine Menge Schreibarbeit sparen. Schauen Sie sich zum Vergleich einmal das folgende Listing an, das zwar dasselbe Ergebnis wie Listing 1.2 liefert, sich in der Schreibweise aber erheblich unterscheidet.
Listing 1.3: Die etwas lngere Form Sub KopfUndFuLang() ' ' KopfUndFu Makro ' Makro am 24.08.2002 von Bernd Held aufgezeichnet ActiveSheet.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 Listing 1.2 einmal die Anweisung With definiert. Im Anschluss daran brauchen Sie den langen Befehl nicht jedes Mal zu erfassen. Es reicht stattdessen ein einfacher

38

Der Objektkatalog

Punkt zu Beginn des Befehls. Damit wei der Editor, dass damit die Kurzform gemeint ist. Achten Sie darauf, dass Sie die Anweisung mit End With abschlieen. Kontrollieren Sie das Ergebnis dieses Makros, indem Sie die Seitenansicht von Excel aufrufen. Dazu whlen Sie aus dem Men DATEI den Befehl SEITENANSICHT.

Abbildung 1.15: Die Fuzeile wurde per Makro erstellt.

1.5

Der Objektkatalog

Eine weitere Mglichkeit, sich schnell in die Entwicklungsumgebung einzuarbeiten und VBA-Befehle kennen zu lernen, bietet der Objektkatalog. Dieser Katalog enthlt alle verfgbaren VBA-Befehle, die Sie bei der Programmierung einsetzen knnen. Sie starten den Objektkatalog, indem Sie wie folgt in der Entwicklungsumgebung vorgehen: 1. Drcken Sie die Taste (F2). 2. Whlen Sie aus dem Men ANSICHT den Befehl OBJEKTKATALOG. 3. Klicken Sie in der Symbolleiste VOREINSTELLUNG das Symbol OBJEKTKATALOG. Die Entwicklungsumgebung stellt Ihnen einen Objektkatalog zur Verfgung, in dem Sie sich ber Objekte, Methoden, Ereignisse und Eigenschaften informieren knnen. ber das entsprechende Symbol knnen Sie erkennen, ob es sich um ein Objekt, eine Eigenschaft, eine Methode oder ein Ereignis handelt.

39

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.16: Der Objektkatalog gibt Auskunft ber die VBASyntax.

OBJEKTE Als Objekt bezeichnet man alle Teile, die Sie in Excel sehen knnen. Die wichtigsten Objekte sind die Arbeitsmappe, das Tabellenblatt, die Zeilen bzw. Spalten und die Zelle als kleinste Einheit in Excel. EIGENSCHAFTEN Dahinter verbergen sich die Merkmale eines Objekts. So ist z.B. die Formatierung einer Zelle eine Eigenschaft des Objekts Zelle. METHODEN Wenn von Methoden die Rede ist, fragen Sie sich am besten immer, was Sie mit den einzelnen Objekten anstellen knnen. Angewandt auf eine

40

Der Objektkatalog

Arbeitsmappe wren die Methoden das ffnen, Drucken, Speichern und Schlieen. EREIGNIS Unter einem Ereignis versteht man in Excel Vorgnge wie das ffnen oder Schlieen einer Arbeitsmappe, die Eingabe von Daten in Zellen, das Drucken oder Speichern von Mappen und vieles mehr. Ereignisse knnen Sie entweder auf Tabellenebene oder auch auf Arbeitsmappenebene einstellen. Sie haben somit die Mglichkeit, bestimmte Vorgnge in Ihren Excel-Tabellen separat zu berwachen und auf Vernderungen in Ihren Tabellen individuell zu reagieren. Alle in VBA zur Verfgung stehenden Objekte werden in Bibliotheken verwaltet. Standardmig ist im ersten Dropdown-Men der Eintrag ALLE BIBLIOTHEKEN ausgewhlt. Wenn Sie die Anzeige ein wenig einschrnken und die Inhalte einzelner Bibliotheken einsehen mchten, whlen Sie die gewnschte Bibliothek im Dropdown aus. So knnen Sie sich z.B. in der Bibliothek VBA ansehen, welche Objekte nicht nur auf die Tabellenkalkulation Excel beschrnkt sind, sondern im gesamten Office-Paket eingesetzt werden knnen.

Letztes nderungsdatum einer Datei ermitteln


Die Bibliothek VBA enthlt beispielsweise die Funktion FileDateTime, welche das Datum der letzten nderung einer Datei ausgibt. Diese Funktion ist nicht nur fr Excel-Arbeitsmappen interessant. Wenden Sie diese Funktion an, indem Sie folgenden Quellcode erfassen:
Listing 1.4: Das letzte nderungsdatum einer Mappe ausgeben Sub LetztesnderungdatumAusgeben() MsgBox FileDateTime(ActiveWorkbook.FullName) End Sub

Die Funktion FileDateTime bentigt als Information den Namen sowie den kompletten Pfad der Arbeitsmappe, deren letztes nderungsdatum Sie ermitteln knnen. Fr die aktuell geffnete Arbeitsmappe knnen Sie sich diese Angabe ber die Eigenschaft FullName beschaffen.

41

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Mchten Sie stattdessen das letzte nderungsdatum einer momentan nicht geffneten Arbeitsmappe anzeigen lassen, dann lautet die Syntax fr diese Aufgabe wie folgt:
Listing 1.5: Das letzte nderungsdatum einer geschlossenen Datei ausgeben Sub LetztesnderungdatumAusgeben02() MsgBox FileDateTime("C:\Eigene Dateien\Mappe1.xls") End Sub

Abbildung 1.17: Das letzte nderungsdatum einer Datei ermitteln

Monatsnamen ermitteln
Im nchsten Beispiel werden Sie anhand eines Datums den Monatsnamen ermitteln. Dabei kommen die Funktionen Month und MonthName aus der Bibliothek VBA zum Einsatz. Die Funktion Month gibt anhand eines Datums den dazugehrigen Monat in Form eines Wertes 112 zurck. Die Funktion MonthName gibt mithilfe eines Wertes 112 den dazugehrigen Monat Januar bis Dezember aus. Auch hier wird klar, dass diese beiden Funktionen im gesamten Office-Paket gebraucht werden. Setzen Sie diese beiden Funktionen jetzt zusammen ein und erfassen Sie dazu das folgende 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

42

Die Online-Hilfe

Deklarieren Sie zu Beginn eine Variable vom Typ Integer. Diese Variable kann ganzzahlige Werte aufnehmen. Am zweiten Tag erfahren Sie mehr ber den Einsatz von Variablen. Mithilfe der Funktion Date knnen Sie das momentane Tagesdatum ermitteln, welches Sie der Funktion Month bergeben. Die Funktion Month macht daraus eine Zahl zwischen 1 und 12. Wre das aktuelle Datum der 24. August, dann wrde die Funktion daraus den Zahlenwert 8 (fr den achten Monat im Jahr) machen. bergeben Sie danach den Inhalt der Variablen i der Funktion MonthName.

Abbildung 1.18: Den Monatsnamen ermitteln und ausgeben

1.6

Die Online-Hilfe

Die dritte Mglichkeit, schnell Fortschritte in der Programmierung mit Excel-VBA zu machen, besteht darin, die Online-Hilfe einzusetzen. Gerade im Zusammenspiel mit dem Makrorekorder knnen Sie eine Menge lernen. Im ersten Schritt zeichnen Sie einen Quellcode auf und erkunden danach mit der Online-Hilfe die dabei verwendeten Befehle.

Verwendete Befehle nachlesen


Greifen Sie jetzt beispielsweise auf das Makro zur Erstellung der Kopf- und Fuzeilen zurck, welches Sie vorher aufgezeichnet haben. Setzen Sie den Mauszeiger auf die Eigenschaft LeftHeader und drcken Sie die Taste (F1), um die Online-Hilfe aufzurufen (siehe Abbildung 1.19). Die Online-Hilfe sucht nun eigenstndig den Hilfetext zu dem Befehl, auf den Sie den Mauszeiger gesetzt und danach die Taste (F1) gedrckt haben. Hier wird der Befehl beschrieben und oft in einem zustzlichen Beispiel nher erklrt.

43

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.19: Die Online-Hilfe von Excel

In der Online-Hilfe knnen Sie einige Hyperlinks finden:

ber den Hyperlink SIEHE AUCH finden Sie verwandte Befehle, die Sie somit schnell einsehen knnen. Der Hyperlink BETRIFFT gibt Auskunft darber, auf welches bergeordnete Objekt sich der Befehl bezieht. So bezieht sich die Eigenschaft LeftHeader auf das Objekt PageSetup. ber den Hyperlink BEISPIELE wird Ihnen gezeigt, wie Sie den Befehl einsetzen knnen. Hyperlinks im Text fhren zu weiteren verwandten Themen, die Sie auf diese Weise schnell aufrufen knnen.

Die Beispiele knnen Sie brigens fr Ihre eigenen Makros bernehmen, indem Sie wie folgt vorgehen: 1. Markieren Sie mit der linken Maustaste den angezeigten Quellcode. 2. Klicken Sie mit der rechten Maustaste und whlen Sie aus dem Kontextmen den Befehl KOPIEREN. 3. Wechseln Sie in das Code-Fenster und setzen Sie den Mauszeiger auf die Stelle, an der Sie das Beispiel einfgen mchten. 4. Klicken Sie mit der rechten Maustaste und whlen Sie den Befehl EINFGEN aus dem Kontextmen.

44

Die Online-Hilfe

Verfgbare Objekte ansehen


Um alle verfgbaren Objekte in Excel in einer bersichtlichen Form anzuzeigen, wechseln Sie in der Online-Hilfe auf die Registerkarte INHALT, klappen die Rubrik MICROSOFT EXCEL VISUAL BASIC-REFERENZ auf und klicken den Eintrag MICROSOFT EXCEL-OBJEKTE an.

Abbildung 1.20: Alle Excel-Objekte auf einen Blick

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 Registerkarte INDEX wechseln. Geben Sie dort die gewnschte Aktion ein, die Sie ausfhren mchten.

Arbeitsmappe speichern
Im folgenden Beispiel mchten Sie eine Arbeitsmappe speichern und suchen daher nach dem dazu notwendigen VBA-Befehl. Geben Sie daher im Feld SCHLSSELWRTER EINGEBEN das Wort speichern ein.

45

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.21: VBA-Befehle suchen

Im Listenfeld THEMA AUSWHLEN finden Sie eine ganze Reihe von Vorgngen, bei der der gesuchte Vorgang mittelbar bzw. unmittelbar eine Rolle spielt. Aktivieren Sie den Eintrag Save-Methode und sehen Sie sich das Ergebnis auf der rechten Seite 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 Sie bei der Programmierung gut gebrauchen knnen. Einige davon sollen nun beschrieben werden.

Die Symbolleiste Bearbeiten


Die Symbolleiste BEARBEITEN enthlt Funktionen, die Ihnen helfen, den Programmcode schnell und sicher zu bearbeiten.
Abbildung 1.22: Die Symbolleiste Bearbeiten

46

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 direkt dahinter einen Punkt setzen, bietet Ihnen Excel fr dieses Objekt alle verfgbaren Eigenschaften und Methoden an. Mchten Sie aber bereits eingegebenen Quellcode nachtrglich nach verfgbaren Eigenschaften und Methoden checken, setzen Sie den Mauszeiger auf den Befehl hinter dem Punkt und klicken das Symbol EIGENSCHAFTEN/METHODEN ANZEIGEN an.

Abbildung 1.23: Alle Methoden und Eigenschaften fr das Objekt Application

Konstanten anzeigen
Viele Befehle enthalten so genannte Konstanten, die Sie einsetzen knnen. So knnen Sie beispielsweise fr eine Bildschirmmeldung ber den Einsatz von Konstanten die Schaltflchentypen festlegen. Im folgenden Beispiel soll eine

47

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

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

Abbildung 1.24: Konstanten fr die Schaltflchen anzeigen

Klicken Sie nach der Eingabe des Kommas auf das Symbol KONSTANTEN ANZEIGEN. In einer Dropdown-Liste bekommen Sie nun die verfgbaren Schaltflchen angezeigt. Selbstverstndlich knnen Sie auch mehrere Schaltflchen kombinieren. Das komplette Makro zum Anzeigen einer Warnmeldung mit den Symbolen KRITISCH sowie einer OK-Schaltflche lautet:
Listing 1.7: Eine benutzerdefinierte Meldung anzeigen Sub Warnmeldunganzeigen() MsgBox "Achtung", vbCritical + vbOKOnly, "Warnung" End Sub

48

Weitere praktische Helfer in der Entwicklungsumgebung

Abbildung 1.25: Die Symbole und Schaltflchen knnen nahezu beliebig kombiniert werden

QuickInfo oder Parameterinfo


Mithilfe des Symbols QUICKINFO bzw. des Symbols PARAMETERINFO knnen Sie sich die komplette Syntax des Befehls in einem Fensterchen anzeigen lassen. Setzen Sie dazu im vorherigen Beispiel den Mauszeiger auf die Funktion MsgBox und klicken das Symbol QUICKINFO auf der Symbolleiste BEARBEITEN.

Abbildung 1.26: Die komplette Syntax wird angezeigt.

Ganzes Wort
Mit dem Einsatz dieses Symbols sparen Sie sich ein wenig Schreibarbeit. Geben Sie beispielsweise einmal die ersten drei Buchstaben von MsgBox ein und klicken danach auf das Symbol GANZES WORT oder drcken Sie die Tastenkombination (Strg) + (____). Der Befehl wird augenblicklich um die noch fehlenden Buchstaben ergnzt. Diese Funktion funktioniert aber nur, wenn schon nach den ersten Buchstaben klar wird, dass es sich hierbei nur um den Befehl Msgbox handeln

49

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

kann. Diese Funktion wird demnach erst verfgbar, sobald anhand der ersten Buchstaben ein eindeutiger Befehl von Excel erkannt werden kann.

Einzug vergrern bzw. Einzug verkleinern


Mit der Funktion EINZUG VERGRSSERN knnen Sie einzelne Zeilen oder auch mehrere Zeilen blockweise nach links einrcken. Dies macht den Programmcode leichter lesbar.

Abbildung 1.27: Einzug vergrern nach rechts

Analog zur vorherigen Funktion knnen Sie mit der Funktion EINZUG VERKLEIeingerckte Programmteile wieder nach links rcken und pro Klick den markierten Text jeweils um einen Tabstopp versetzen.
NERN

Haltepunkt ein/aus
Wenn Sie ein Makro starten, welches einen Haltepunkt aufweist, dann stoppt es genau an diesem Haltepunkt. Auf diese Weise knnen Sie Programm-Zwischenstnde berprfen. Setzen Sie zum Beispiel einmal einen Haltepunkt im Listing 1.2 in die Zeile .RightHeader = "&D". Excel quittiert diese Aktion, indem es einen braunen, runden Punkt auf die linke Leiste setzt. Setzen Sie danach den Mauszeiger auf den Beginn des Makros und drcken Sie die Taste (F5), um das Makro zu starten.

50

Weitere praktische Helfer in der Entwicklungsumgebung

Abbildung 1.28: Haltepunkt setzen

Das Makro luft nun bis zu der Zeile mit dem gesetzten Haltepunkt und unterbricht es. Sie knnen ber die Seitenansicht prfen, dass momentan nur der linke und der mittlere Teil der Kopfzeile fertig gestellt wurde. Wenn Sie in der Entwicklungsumgebung nochmals die Taste (F5) drcken, wird der Code bis zum Ende ausgefhrt. Mchten Sie das Makro abbrechen, dann whlen Sie aus dem Men AUSFHREN den Befehl ZURCKSETZEN. Das Setzen und Entfernen von Haltepunkten knnen Sie brigens noch schneller erledigen, indem Sie den Mauszeiger in die gewnschte Zeile setzen und die Taste (F9) drcken.

Block auskommentieren bzw. Auskommentierung des Blocks aufheben


Standardmig knnen Sie einzelne Zeilen deaktivieren, indem Sie als erstes Zeichen der jeweiligen Zeile ein einfaches Apostroph eingeben. Excel quittiert diese Aktion, indem es die komplette Zeile mit der Schriftfarbe GRN einfrbt. Die so auskommentierten Zeilen werden nun nicht mehr abgearbeitet. Selbstverstndlich ist es recht mhselig, wenn Sie ganze Blcke, also mehrere Zeilen auf einmal, in Kommentar setzen mchten. Aus diesem Grund wurde die Funktion BLOCK AUSKOMMENTIEREN in die Symbolleiste BEARBEITEN integriert. Somit knnen Sie blitzschnell ganze Blcke vorbergehend in Kommentar setzen bzw. auskommen-

51

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

tierte Blcke schnell wieder verfgbar machen. Gerade wenn Sie einen Code testen und dazu mehrere Varianten berprfen mchten, empfiehlt es sich, mit dieser Funktion zu arbeiten.

Abbildung 1.29: Schnelles Auskommentieren von ganzen Codeblcken

Geizen Sie nicht mit dem Einsatz von Kommentaren im Quellcode. So empfiehlt es sich, zu Beginn des Makros Kommentare zu erfassen, die ber die Aufgabe des Makros, den Programmierer und den Zeitpunkt der Programmierung Aufschluss geben. Auch die Kommentierung einzelner Befehle ist gerade am Beginn einer Entwickler-Laufbahn wichtig. Befehle prgen sich so schneller und leichter ein. Ein typisches Intro fr ein Makro knnte 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 Fuzeile in einer ' Tabelle zusammen. '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ With ActiveSheet.PageSetup

52

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 With End Sub

Lesezeichen setzen
In recht umfangreichen Quellcodes, die mitunter mehrere DIN-A4-Seiten ausmachen knnen, kann schnell der berblick verloren gehen. Sie haben daher die Mglichkeit, Lesezeichen zu setzen und diese bei Bedarf anzuspringen.

Abbildung 1.30: Lesezeichen setzen

Ein Lesezeichen erkennen Sie daran, dass ein hellblaues abgerundetes Viereck an der linken Leiste angezeigt wird. ber die Symbole NCHSTES LESEZEICHEN bzw. VORHERIGES LESEZEICHEN knnen Sie von Lesezeichen zu Lesezeichen springen. Mit einem Klick auf das Symbol ALLE LESEZEICHEN LSCHEN entfernen Sie alle gesetzten Lesezeichen.

53

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Suchen & Ersetzen


Genau wie in anderen Programmen auch gibt es in der Entwicklungsumgebung eine Mglichkeit, Textteile zu finden und zu ersetzen. Dabei haben Sie die Mglichkeit, bestimmte Texte bzw. Befehle nicht nur im aktuellen Modul, sondern auch in allen Modulen des Projekts zu finden. Aufgerufen werden kann diese Funktion ber drei Wege:

Klicken Sie auf das Symbol SUCHEN in der Symbolleiste VOREINSTELLUNG. Alternativ dazu knnen Sie die Tastenkombination (Strg) + (F) drcken. Whlen Sie aus dem Men BEARBEITEN den Befehl SUCHEN aus.

Bei allen drei Varianten wird das Dialogfeld SUCHEN angezeigt.

Abbildung 1.31: Befehle im Quellcode suchen

Im Feld SUCHEN NACH geben Sie den Befehl bzw. die Textfolge ein, nach der Sie suchen mchten. Haben Sie vor dem Aufruf dieses Dialogfelds den Suchtext im Makro markiert, dann wird dieser automatisch in das Feld SUCHEN NACH bernommen. Im Gruppenfeld SUCHEN IN haben Sie die Mglichkeit, Ihre Suche ber Ihr aktuelles Modul hinaus auszudehnen. Standardmig unterscheidet Excel nicht zwischen Gro- und Kleinschreibung. Ist dies erwnscht, mssen Sie das entsprechende Kontrollkstchen aktivieren. Die Suchrichtung legen Sie im gleichnamigen Dropdown-Feld fest. Standardmig wird in beide Richtungen gesucht, also abwrts sowie aufwrts. Mit einem Klick auf die Schaltflche ERSETZEN wird das folgende Dialogfeld angezeigt. Die Anweisung Chr(13) und die Konstante vbCr bewirken dieselbe Aktion. Es wird bei beiden Anweisungen eine neue Zeile begonnen. Gerade bei mehrzeiligen Meldungsfenstern kommen diese beiden Mglichkeiten oft zum Einsatz.

54

Weitere praktische Helfer in der Entwicklungsumgebung

Abbildung 1.32: Befehle suchen und ersetzen

Mchten Sie einen Text durch einen anderen ersetzen, mssen Sie noch einen Text im Feld ERSETZEN DURCH angeben. Mit einem Klick auf die Schaltflche DURCHSUCHEN wird die erste gefundene bereinstimmung angezeigt. Jetzt haben Sie die Wahl, entweder schrittweise Texte zu ersetzen (sichere Methode) oder komplett alle gefundenen Texte. Vorsicht bei Ersetzungen von Textteilen! Geben Sie mglichst den gesuchten Text vollstndig an. Es kann zu katastrophalen Resultaten fhren, wenn Sie einzelne Textteile durch andere ersetzen. Nicht selten werden dann auch Teile von Befehlen, Methoden oder Eigenschaften mit ersetzt. Dies hat dann zur Folge, dass Sie den gesamten Code erneut korrigieren mssen, um Ihre Makros wieder zum Laufen zu bringen. Das ist zum Teil ein fast unmgliches Unterfangen und kann unter Umstnden 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 Sie Makros oder einzelne Befehle in die Zwischenablage. Schneller geht es allerdings, wenn Sie das Makro bzw. die Zeile(n) mit der Maus markieren und die Tastenkombination (Strg) + (C) drcken. Setzen Sie die Einfgemarke an die Einfgestelle und klicken Sie in der Symbolleiste VOREINSTELLUNG auf das Symbol EINFGEN. Alternativ dazu knnen Sie auch die Tastenkombination (Strg) + (V) drcken.

55

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Diese beiden Tastenkombinationen fr das Kopieren und Einfgen von Texten zhlen wohl zu den am hufigsten eingesetzten Tastenkombinationen bei Entwicklern. Entnehmen Sie weitere Tastenkombinationen frs schnellere Arbeiten der nchsten Tabelle:
Tastenkombination
(F7) (F2) (Strg) + (F) (Strg) + (H) (F3) () + (F3) (Strg) + () (Strg) + () () + (F2) (Strg) + (Bild) (Strg) + (Bild) (Strg) + () + (F2) (Strg) + (Pos1) (Strg) + (Ende) (Strg) + () (Strg) + () (Ende) (Pos1) (Strg) + (Z)

Beschreibung Code-Fenster anzeigen Objektkatalog anzeigen Suchen Ersetzen Weitersuchen Vorheriges suchen Nchste Prozedur Vorherige Prozedur Definition anzeigen Einen Bildschirm nach unten Einen Bildschirm nach oben Zur letzten Position wechseln Anfang des Moduls Ende des Moduls Ein Wort nach rechts Ein Wort nach links Zum Zeilenende wechseln Zum Zeilenanfang wechseln Letzten Befehl rckgngig machen

Tabelle 1.1: Die wichtigsten Tastenkombinationen fr den Entwickler

56

Entwicklungsumgebung einstellen

Tastenkombination
(Strg) + (C) (Strg) + (X) (Strg) + (V) (Strg) + (Y) (Strg) + (Entf) () () + () (Strg) + () + (F9) () + (F10) (Strg) + (P) (Strg) + (E) (Strg) + (S)

Beschreibung Code kopieren Code ausschneiden Code einfgen Aktuelle Zeile lschen Bis zum Wortende lschen Einzug vergrern Einzug verkleinern Alle Haltepunkte lschen Kontextmen anzeigen Modul drucken Modul/Formular exportieren Modul speichern

Tabelle 1.1: Die wichtigsten Tastenkombinationen fr den Entwickler (Forts.)

1.8

Entwicklungsumgebung einstellen

In der Entwicklungsumgebung von Excel haben Sie die Mglichkeit, den VisualBasic-Editor Ihren eigenen Wnschen anzupassen. Dazu whlen Sie in der Entwicklungsumgebung aus dem Men EXTRAS den Befehl OPTIONEN.

Editoreinstellungen anpassen
Im Gruppenfeld CODE-EINSTELLUNGEN finden Sie die folgenden Einstellungsmglichkeiten:

AUTOMATISCHE SYNTAXBERPRFUNG: Mit dieser Einstellung sorgen Sie dafr, dass Ihr Editor nach der Eingabe einer Codezeile automatisch eine Syntaxprfung vornimmt.

57

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.33: Editor einstellen

VARIABLENDEKLARATION ERFORDERLICH: Wenn Sie diese Option aktivieren, wird die Anweisung Option Explicit den allgemeinen Deklarationen in allen neuen Modulen hinzugefgt. Damit mssen alle im Code verwendeten Variablen zu Beginn eines Makros definiert werden. Wird dies vergessen, weist Sie Excel automatisch darauf hin. Es wird auf jeden Fall kein Makro ausgefhrt, in dem nicht alle verwendeten Variablen definiert sind. ELEMENTE AUTOMATISCH AUFLISTEN: Zeigt eine Liste mit den Informationen an, die die Anweisung an der aktuellen Einfgemarke logisch vervollstndigen wrden. AUTOMATISCHE QUICKINFO: Wird diese Option aktiviert, werden bei der Eingabe eines Befehls die dazugehrigen Funktionen bzw. Parameter angezeigt. AUTOMATISCHE DATEN-TIPPS: Diese Option ist lediglich im Haltemodus verfgbar und zeigt die Werte der Variablen an, auf denen sich der Mauszeiger gerade befindet. AUTOMATISCH EINZUG VERGRSSERN: Zur besseren bersichtlichkeit sollten Sie sich angewhnen, Ihren Quellcode einzurcken. Die dafr zur Verfgung gestellte Option ermglicht, fr die erste Codezeile einen Tabulator festzulegen. Alle nachfolgenden Zeilen beginnen an der Tabulatorposition. TAB-SCHRITTWEITE: In diesem Eingabefeld stellen Sie die Tab-Schrittweite auf einen Wert zwischen 1 und 32 Leerzeichen ein.

58

Entwicklungsumgebung einstellen

Im Gruppenfeld FENSTEREINSTELLUNGEN knnen Sie unter anderem das Drag&Drop im Code-Fenster ausschalten, automatisch eine Trennlinie zwischen den einzelnen Prozeduren ziehen lassen und das Erscheinungsbild von neuen Modulen beeinflussen.

Editierformat festlegen
Wenn Sie zur Registerkarte EDITIERFORMAT wechseln, knnen Sie die Darstellung Ihres Quellcodes anpassen.

Abbildung 1.34: Das Editierformat festlegen

Im Listenfeld CODE-FARBEN werden die Textelemente angezeigt, fr die die Farben angepasst werden knnen. Darunter befinden sich drei Dropdown-Felder, in denen Sie das Format fr den Vorder- bzw. Hintergrund der einzelnen Elemente sowie das Kennzeichen in der Kennzeichenleiste bestimmen knnen. Darber hinaus haben Sie die Mglichkeit, die Schriftart sowie deren Gre zu bestimmen. Die Kennzeichenleiste kommt dann zur Geltung, wenn Sie hufiger mit Haltepunkten oder Lesezeichen arbeiten.

59

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 fr das aktuelle Visual-Basic-Projekt festgelegt.

Abbildung 1.35: Allgemeine Einstellungen vornehmen

Im Gruppenfeld EINSTELLUNGEN FR FORMULAR-RASTER knnen Sie die Darstellungsart des Formulars beim Bearbeiten festlegen. Sie knnen ein Raster anzeigen, die Rastereinheiten sowie die Rasterung selbst fr das Formular festlegen und eingefgte Steuerelemente automatisch am Raster ausrichten lassen. Die Einstellung QUICKINFO ANZEIGEN bezieht sich lediglich auf die QuickInfos fr die Symbolschaltflchen und kann deaktiviert werden, wenn Sie etwas mehr bung haben und die Symbole in den Symbolleisten kennen. Aktivieren Sie das Kontrollkstchen AUSBLENDEN DES PROJEKTS SCHLIESST FENSTER, wenn Projekt-, UserForm-, Objekt- oder Modulfenster automatisch geschlossen werden sollen, sobald ein Projekt im Projekt-Explorer ausgeblendet wird. Im Gruppenfeld BEARBEITEN UND FORTFAHREN bestimmen Sie, ob eine Benachrichtigung erfolgen soll, wenn durch eine angeforderte Aktion alle Variablen auf Modulebene fr ein laufendes Projekt zurckgesetzt werden.

60

Entwicklungsumgebung einstellen

Das Gruppenfeld UNTERBRECHEN BEI FEHLERN bestimmt, wie Fehler in der Visual-Basic-Entwicklungsumgebung verarbeitet werden sollen. Das Einstellen dieser Option wirkt sich auf alle Instanzen von Visual Basic aus, die nach dem ndern dieser Einstellung gestartet werden. Sie haben dabei drei Mglichkeiten:

BEI JEDEM FEHLER: Bei jedem Fehler wird fr das Projekt der Haltemodus aktiviert, unabhngig davon, ob eine Fehlerbehandlungsroutine aktiviert ist oder sich der Code in einem Klassenmodul befindet. Die fehlerhafte Zeile wird dann mit einer gelben Hintergrundfarbe hinterlegt. IN KLASSENMODUL: Mit dieser Einstellung werden alle nicht verarbeiteten Fehler in einem Klassenmodul mit dem Haltemodus gestoppt. BEI NICHT VERARBEITETEN FEHLERN: Wenn eine Fehlerbehandlungsroutine luft, wird der Fehler behandelt, ohne den Haltemodus zu aktivieren. Sollte keine Fehlerbehandlungsroutine vorhanden sein, bewirkt der Fehler, dass der Haltemodus fr das Projekt aktiviert wird.

Im Gruppenfeld KOMPILIEREN legen Sie fest, ob ein Projekt vor dem Start vollstndig kompiliert oder ob der Code bei Bedarf kompiliert wird, wodurch die Anwendung schneller gestartet werden kann.

Fenster verankern
Auf der Registerkarte VERANKERN legen Sie fest, welche Fenster verankerbar sein sollen (siehe Abbildung 1.36). Ein Fenster ist verankert, wenn es mit einer Kante eines anderen verankerbaren Fensters oder eines Anwendungsfensters verbunden ist. Ein verankerbares Fenster wird beim Verschieben automatisch ausgerichtet. Ein Fenster ist nicht verankerbar, wenn es an eine beliebige Position auf dem Bildschirm verschoben werden kann und diese Position beibehlt. Whlen Sie die Fenster aus, die verankerbar sein sollen, und deaktivieren Sie die Kontrollkstchen fr die anderen Fenster.

61

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.36: Fenster verankern

1.9

Datentypen, Variablen und Konstanten

Gerade haben Sie sich mit der Entwicklungsumgebung von Excel vertraut gemacht. 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 fr die Datumsformatierung

62

Datentypen, Variablen und Konstanten

Was sind Variablen?


Bevor Sie die einzelnen Variablen kennen lernen, soll ganz bewusst zu Anfang die Frage gestellt werden, was sich hinter dem Begriff Variablen verbirgt und warum diese eingesetzt werden mssen. Variablen werden u.a. dazu bentigt, Daten zwischenzuspeichern. Wenn Sie beispielsweise daran denken, Daten aus einer Tabelle zu lesen, um diese zu bearbeiten, und dann wieder in eine andere Tabelle zurckzuschreiben, dann ist der Einsatz ohne Variablen nur ber die Zwischenablage recht unsicher. Man knnte Variablen beispielsweise mit einem Schokoladen-Adventskalender vergleichen. Dieser Kalender enthlt 24 Trchen (Variablen), die mit Schokolade (Daten) gefllt sind. Der erste Schritt, also die Trchen mit Schokolade zu fllen (Variablen fllen), ist demnach schon getan. Whrend der Lebenszeit eines Adventkalenders ist die Schokolade sicher in den Trchen verstaut, d.h. ohne Ihr Zutun bleiben diese Variablen an ihrem sicheren Ort. Wenn Sie sich entschlieen, vorab ein Trchen zu ffnen, um zu sehen, welches Schokoladensymbol dahinter verborgen ist, prfen Sie den Inhalt der Variablen. Indem Sie die Schokolade essen, wird der Inhalt des Trchens entfernt (Variablen lschen). Aus diesem Schokoladen-Beispiel wird klar, dass Sie mit Variablen dauerhaft arbeiten knnen, d.h., Sie knnen jederzeit darauf zugreifen, diese abfragen oder verndern und zum Schluss ausgeben. Dabei wird fr die Variablen bei ihrer Definition ein bestimmter Bereich im Arbeitsspeicher reserviert. Auf diesen eindeutigen Teil des Arbeitsspeichers knnen Sie ber den Namen der Variablen immer wieder zugreifen. Nach dem Ablauf eines Makros werden die Variablen standardmig gelscht, sofern diese nicht global definiert wurden. Aber dazu spter mehr.

Variablen deklarieren
Variablen werden immer zu Beginn eines Makros deklariert, also nach der Anweisung Sub. In diesem Fall spricht man von lokalen Variablen. Diese Variablen knnen nur in dem Makro verwendet werden, in dem sie deklariert wurden. Nachdem ein Makro durchgelaufen ist, wird diese Variable wieder aus dem Speicher gelscht. Von globalen Variablen spricht man, wenn Sie diese allgemein gltig also in mehreren Makros verwenden mchten. Dann muss die Variablendeklaration vor der Sub-Anweisung stattfinden.

63

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Globale Variablen knnen gleich fr mehrere Makros verwendet werden. Diese werden nach dem Ende eines Makros auch nicht gelscht und behalten ihren aktuellen Wert bei. Es gibt Beispiele, in denen diese Vorgehensweise sinnvoll ist. In den meisten Fllen sollten globale Variablen aber weitgehend vermieden werden, da sie wertvollen Speicherplatz auf dem Stapelspeicher belegen, was sich negativ auf das Laufzeitverhalten von Makros auswirken kann. Eine Variablendeklaration beginnt immer mit der Anweisung Dim, gefolgt von einem Variablennamen, den Sie frei whlen knnen. Danach geben Sie mit dem Schlsselwort As an, welchen Datentyp die Variable erhalten soll. Wenn Sie Variablen einsetzen, mssen Sie sich dabei an bestimmte Konventionen fr deren Benennung halten:

Regeln fr Variablen

Das erste Zeichen muss aus einem Buchstaben bestehen. Als folgende Zeichen knnen Sie Buchstaben, Zahlen und einige Sonderzeichen verwenden. Sie drfen keine Leerzeichen in einem Variablennamen verwenden. Wenn Sie einzelne Wrter trennen mchten, verwenden Sie dazu den Unterstrich, wie z.B. Dim Kosten_Juli as Currency. Sonderzeichen wie #, %, &, ! oder ? sind nicht erlaubt.

Die verfgbaren Datentypen


Die wichtigsten Variablentypen sind zum einen die Variable vom Typ String und zum anderen die Integer-Variable. In einer Variablen vom Typ String knnen Sie Texte bzw. Zeichen zwischenspeichern, manipulieren und ausgeben. Mit einer Variablen vom Typ Integer fhren Sie mathematische Berechnungen aus. Integer-Variablen werden oft als Zhler in Schleifen verwendet, die Sie im weiteren Verlauf des Buches noch kennen lernen werden. Entnehmen Sie der nachfolgenden Tabelle die gngigsten Variablentypen und deren Speicherbedarf:

64

Datentypen, Variablen und Konstanten

Variablentyp
Byte Boolean Currency

Wertebereich/Speicherbedarf Ganze Zahlen zwischen 0 und 255 (1Byte) Wahrheitswert, entweder True oder False (2 Byte) Whrungs-Datentyp: Festkommazahlen mit 15 Stellen vor und vier Stellen nach dem Komma (8 Byte) Datums- und Zeit-Datentyp (8 Byte) Dezimalzahlen (14 Bytes) Fliekommazahlen mit einer Genauigkeit von 16 Stellen hinterm Komma (8 Bytes) Ganze Zahlen zwischen 32.768 und +32.767 (2 Byte) Ganze Zahlen im Wertebereich von 2.147.483.648 und +2.147.483.647 (4 Byte) Datentyp gibt einen Verweis auf ein Objekt wieder (4 Byte) Fliekommazahlen mit einer Genauigkeit von acht Stellen hinterm Komma (4 Byte) Der Datentyp fr alle Texte (10 Byte) Standarddatentyp wird automatisch gewhlt, wenn kein anderer Datentyp definiert ist (16 Byte)

Date Decimal Double

Integer Long

Object Single

String Variant

Tabelle 1.2: Die Datentypen fr die Programmierung

Anbei ein paar typische korrekte Deklarationen von Variablen:


Dim Dim Dim Dim MwSt as Single KalenderWoche as Integer Meldung as String Gehalt as Currency

Den Gebrauch von Variablen werden Sie spter noch zur Genge ben. Wenn Sie nach und nach gebter programmieren, mchten Sie mglicherweise die Variablennamen nicht mehr ganz so lang schreiben und auch bei der Datentyp-Anweisung weniger Schreibarbeit haben. Sehen Sie sich dazu die folgende Tabelle an:

65

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Ausfhrlich
Dim Zhler as Integer Dim ZhlerGro as Long Dim Betrag as Currency Dim Meldung as String

Kurzform
Dim Z% Dim ZzGr& Dim Bg@ Dim Meld$

Tabelle 1.3: Variablen noch krzer definieren

Fr jeden in der Tabelle aufgefhrten Datentyp gibt es ein Kurzzeichen, welches Sie einsetzen knnen, um den Programmiercode zu verkrzen. Sie sollten aber zumindest am Anfang bei den sprechenden Variablenbenennungen bleiben.

Variablendeklaration erzwingen
Sie knnen die Entwicklungsumgebung von Excel so einstellen, dass jede Variable vor ihrer ersten Verwendung deklariert werden muss. Vorher luft kein einziges Makro an, sofern es mit Variablen arbeitet, die zuvor nicht deklariert wurden. Um diese wichtige Einstellung vorzunehmen, gehen Sie wie folgt vor: 1. Wechseln Sie in die Entwicklungsumgebung. 2. Whlen Sie aus dem Men EXTRAS den Befehl OPTIONEN. 3. Wechseln Sie im Dialogfeld OPTIONEN auf die Registerkarte EDITOR. 4. Aktivieren Sie das Kontrollkstchen VARIABLENDEKLARATION ERFORDERLICH. 5. Besttigen Sie Ihre Einstellung mit OK. Was bewirkt diese Einstellung aber genau? Immer wenn Sie ein neues Modul einfgen, wird automatisch die Anweisung Option Explicit in die erste Zeile Ihres Modulblattes eingetragen. Diese Anweisung knnen Sie selbstverstndlich auch von Hand erfassen. Sie bedeutet nichts anderes, als dass verwendete Variablen im Code vor ihrem Aufruf deklariert werden mssen. Solange verwendete Variablen im Code nicht ordnungsgem deklariert wurden, kann kein Makro laufen. Ist eine Variable dem Editor unbekannt, meldet der Editor es Ihnen.

66

Datentypen, Variablen und Konstanten

Abbildung 1.37: Die Deklaration von Variablen erzwingen

Abbildung 1.38: Variable wurde noch nicht definiert.

Sollten Sie solch eine Meldung nach dem Start eines Makros erhalten, dann markiert Excel die Variable im Quellcode und frbt die erste Zeile des Makros mit der Hintergrundfarbe Gelb. Whlen Sie in einem solchen Fall aus dem Men AUSFHREN den Befehl ZURCKSETZEN, deklarieren die Variable und starten das Makro 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

67

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Dazu ist zu sagen, dass lediglich die letzte Variable dem Typ Long zugeordnet wird. Alle anderen Variablen bekommen den Datentyp Variant. Wenn Sie einen Blick in die letzte Tabelle werfen, werden Sie erkennen, dass der Datentyp Variant 16 Byte bentigt, wogegen der Datentyp Integer lediglich 2 Byte beansprucht. Sie knnen sich vorstellen, dass es eine gewaltige Verschwendung von Speicherplatz ist, wenn Sie Ihre Variablen falsch deklarieren. Richtig wre hier:
Dim i As Long Dim i2 As Long Dim i3 As Long

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

Einen weiteren Vorteil der Deklaration von Variablen mchte ich Ihnen nicht vorenthalten. Wenn Sie vergessen, Variablen zu deklarieren, und auch nicht die Anweisung Option Explicit gesetzt haben, gehen Sie sehr verschwenderisch mit Ihrem Speicher um. Wird fr eine Variable kein Datentyp angegeben, wird automatisch der Datentyp Variant verwendet. Wegen seines hohen Speicherbedarfs von 16 Byte ist er aber nicht zu empfehlen. Die Entwicklungsumgebung von Excel bietet Ihnen eine hilfreiche Mglichkeit zu prfen, wo verwendete Variablen definiert sind. Klicken Sie die zu berprfende Variable mit der rechten Maustaste an und whlen Sie im Kontextmen den Befehl DEFINITION aus. Der Mauszeiger springt danach direkt an die Stelle im Code, an der die Variable definiert wurde.

Statische Variablen
Standardmig wird der Variableninhalt nach jedem Makroende gelscht. Sie haben jedoch auch die Mglichkeit, Variablen so zu definieren, dass deren Haltbarkeit nach jedem Makroende erhalten bleibt.

68

Datentypen, Variablen und Konstanten

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

Im folgenden Beispiel knnen Sie ein Makro mehrere Male hintereinander aufrufen. Das Makro selbst zhlt die Aufrufe und speichert diese in der Variablen Aufrufe.
Listing 1.9: Variableninhalt bleibt nach Makroende erhalten Sub VariablenInhaltBleibtBestehen() Static Aufrufe As Long Aufrufe = Aufrufe + 1 MsgBox "Makro wurde " & Aufrufe & " Mal ausgefhrt!" End Sub

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

Abbildung 1.39: Makro mehrmalig aufrufen

ffentliche Variablen
In der Entwicklungsumgebung von Excel knnen Sie mehrere Module anlegen. Um Variablen modulbergreifend abfragen oder ndern zu knnen, mssen Sie eine solche Variable als ffentlich deklarieren. Diese Variablen werden mit der Anweisung Public deklariert. Damit haben Sie die Mglichkeit, auf Variablen zuzugreifen, die in anderen Modulen untergebracht sind. Im folgenden Beispiel soll in einem Modul (MODUL2) die aktuelle Uhrzeit in einer ffentlichen Variablen gespeichert werden. Von einem anderen Modul (MODUL3) aus soll diese Startzeit abgefragt werden. Fgen Sie fr diese Aufgabe zwei neue Modulbltter (MODUL2 und MODUL3) ein und erfassen Sie die beiden Makros in Abbildung 1.40.

69

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.40: Der Einsatz einer ffentlichen Variablen

Deklarieren Sie in MODUL2 die ffentliche Variable. Danach fllen Sie diese Variable, indem Sie ber die Funktionen Date und Time das aktuelle Tagesdatum sowie die momentane Uhrzeit speichern. In MODUL3 greifen Sie auf die ffentliche Variable StartZeit zu und geben sie in einem Meldungsfenster am Bildschirm aus.

Private Variablen
Mchten Sie die Gltigkeit einer Variablen fr alle Makros auf ein bestimmtes Modul beschrnken, z.B. MODUL1, dann mssen Sie die Variable mit der Anweisung Private deklarieren. Im folgenden Beispiel soll eine Passwortverwaltung in einem Modul realisiert werden. Dabei soll jeweils die aktive Tabelle ber ein Kennwort geschtzt werden. Fr diesen Zweck speichern Sie das Kennwort in einer privaten Variablen. Es wird dadurch nicht mglich, das Kennwort ber Makros aus anderen Modulblttern auszulesen (siehe Abbildung 1.41). Deklarieren Sie zu Beginn im Modulblatt MODUL3 eine private Variable mit dem Namen Passw. Im Makro TabelleSchtzen geben Sie das Kennwort bekannt und wenden die Methode Protect an, um die aktive Tabelle zu schtzen. Das Makro TabelleEntsperren hebt den Schutz der aktiven Tabelle auf, indem es die Methode Unprotect einsetzt und dabei das Kennwort bergibt.

70

Datentypen, Variablen und Konstanten

Abbildung 1.41: Kennwort verwalten

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 so genannte Objektvariablen, die einen Verweis auf ein bestimmtes Objekt enthalten. Welche Objekte unter anderem zur Verfgung stehen, knnen Sie ermitteln, wenn Sie in der Entwicklungsumgebung den Objektkatalog aufrufen. Dies geht am schnellsten, indem Sie die Taste (F2) drcken. Alternativ dazu knnen Sie einfach mit der Deklaration einer Objektvariablen beginnen, indem Sie beispielsweise die Anweisung Dim Test As eingeben und dann die (____)-Taste drcken. Augenblicklich wird Ihnen ein Kontextmen angeboten, welches die zur Verfgung stehenden Objekte anbietet. Um den Einsatz von Objektvariablen zu ben, arbeiten Sie nun ein paar typische Beispiele durch. Dabei greifen wir an dieser Stelle schon einmal etwas vor, damit Sie sehen, was Sie im Buch noch alles erwarten knnen.

71

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Abbildung 1.42: Den Objektkatalog zur Hilfe einsetzen

Abbildung 1.43: Das Kontextmen bietet Ihnen alle zur Verfgung stehenden Objekte an.

Den Office-Assistenten aufrufen


Im folgenden Beispiel werden Sie den Office-Assistenten aufrufen und ein paar Stze sprechen lassen. Dazu ist folgendes Makro notwendig:

72

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 .Show End With Set OffAss = Nothing End Sub

Abbildung 1.44: Den Office-Assistenten ber das Objekt Balloon aufrufen

73

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

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

Schaltflche einfgen
Im nchsten Beispiel soll in eine Tabelle eine neue Schaltflche an eine bestimmte Position eingefgt und beschriftet werden. Danach soll ein bereits erfasstes Makro der Schaltflche zugewiesen werden. Nach dem Klicken dieser Schaltflche soll dieses Makro ausgefhrt werden.
Listing 1.11: Eine Schaltflche einfgen Sub SchaltflcheIntegrieren() Dim Schaltflche As Button Set Schaltflche = _ ActiveSheet.Buttons.Add(10, 20, 100, 50) With Schaltflche .Caption = "Anwendung beenden" .OnAction = "ExcelBeenden" End With Set Schaltflche = Nothing End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Button. Danach fgen Sie eine Schaltflche ein, indem Sie die Methode Add einsetzen. Die vier Argumente in der Klammer stehen fr die genaue Einfgeposition der Schaltflche in der Tabelle. Dabei ergeben die ersten beiden Argumente den linken, oberen Punkt (in Millimetern) der Einfgeposition in der Tabelle. Das dritte Argument steht fr die Breite, das vierte Argument fr die Hhe der einzufgenden Schaltflche. Setzen Sie danach die Anweisung With ein, um sich ein wenig Schreibarbeit zu ersparen. ber die Eigenschaft Caption legen Sie die Beschriftung der Schaltflche fest. Mithilfe der Eigenschaft OnAction legen Sie den Namen des Makros fest, das ausgefhrt werden soll, wenn diese Schaltflche angeklickt wird. Vergessen Sie

74

Datentypen, Variablen und Konstanten

nicht, die Anweisung End With zu schreiben, damit der Editor wei, dass der Vereinfachungsblock nun beendet ist. Heben Sie am Ende des Makros den reservierten Speicher der Objektvariablen auf, indem Sie die Anweisung Set Schaltflche = Nothing einsetzen.

Abbildung 1.45: Automatisch eine Schaltflche einfgen

Was nun noch fehlt, ist das Makro ExcelBeenden, welches Sie bei der Eigenschaft
OnAction angegeben haben. Listing 1.12: Excel ohne Rckfrage beenden Sub ExcelBeenden() Application.DisplayAlerts = False Application.Quit End Sub

Mithilfe der Eigenschaft DisplayAlerts knnen Sie die Standardmeldungen von Excel, wie beispielsweise die Abfrage vor dem Beenden von Excel, ob die nderungen gespeichert werden sollen, unterdrcken. Indem Sie die Methode Quit einsetzen, beenden Sie Microsoft Excel.

75

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Diagramm exportieren
Wenn Sie Diagramme in Excel erstellen, dann werden diese Diagramme als Chart-Objekt in VBA angesprochen. Diagramme knnen Sie brigens auch in das GIF-Format exportieren. In der folgenden Lsung haben Sie eine Datentabelle und ein integriertes Diagramm vorliegen. Orientieren Sie sich dabei an der folgenden Abbildung:

Abbildung 1.46: Die Ausgangsbasis: eine Datentabelle und ein integriertes Diagramm

Ihre Aufgabe besteht nun darin, dieses Diagramm in einer separaten Grafikdatei zu 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 = Nothing End Sub

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

76

Datentypen, Variablen und Konstanten

Im Auflistungsobjekt ChartObject sind alle Diagrammobjekte der aktiven Tabelle verzeichnet. ber den Index knnen Sie ein Diagrammobjekt ansprechen. Der Index 1 steht fr das zuerst eingefgte Diagrammobjekt. Da es nur ein Diagrammobjekt in der Tabelle gibt, haben Sie an der Stelle keine Probleme. Wenden Sie im Anschluss daran die Methode Export an und geben dabei den Namen der zu erzeugenden Exportdatei inklusive des Verzeichnisses an. Im Argument FilterName geben Sie ber die Endung der Grafikdatei das gewnschte Grafikformat an. Mit dieser Endung ist der sprachenunabhngige Name des Grafikfilters gemeint, wie er in der Registrierung von Windows erscheint. ffnen Sie zur Kontrolle die so erstellte Grafikdatei Diagramm.gif ber den Explorer von Windows.

Abbildung 1.47: Das Diagramm wurde in eine Grafikdatei exportiert.

Die soeben erzeugte Grafikdatei enthlt keinerlei Verbindung mehr zu den Daten der Ursprungstabelle. Das Diagramm wurde auf diese Art und Weise ausgelagert und eingefroren.

Menleiste ein- und ausblenden


Die Menleiste wird wie alle Symbolleisten und Kontextmens ber das Objekt CommandBars angesprochen. Jede Leiste kann in Excel beispielsweise ber einen eindeutigen Index angesprochen werden. Die Arbeitsblatt-Menleiste hat den Index 1.

77

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Blenden Sie jetzt die Arbeitsblatt-Menleiste aus, indem Sie das folgende Makro starten:
Listing 1.14: Die Arbeitsblatt-Menleiste ausblenden Sub ArbeitsplatzmenLeisteAusblenden() Dim Leiste As CommandBar Set Leiste = Application.CommandBars(1) 'oder 'Set Leiste = Application.CommandBars("Worksheet Menu Bar") Leiste.Enabled = False Set Leiste = Nothing End Sub

Deklarieren Sie zuerst eine Objektvariable vom Typ CommandBar. Damit knnen Sie alle Men- und Symbolleisten in Excel identifizieren und ansprechen. Geben Sie ber die Anweisung Set bekannt, auf welche Menleiste Sie zugreifen mchten. Wie schon gesagt, knnen Sie die Arbeitsblatt-Menleiste ber den eindeutigen Index 1 ansprechen. Mglich wre auch folgende Zeile:
Set Leiste = Application.CommandBars("Worksheet Menu Bar")

Setzen Sie die Eigenschaft Enabled auf den Wert False, um die Menleiste auszublenden. Heben Sie danach den Objektverweis auf, indem Sie das Objekt mit dem Schlsselwort Nothing bestcken.

Abbildung 1.48: Die ArbeitsblattMenleiste wurde ausgeblendet.

78

Datentypen, Variablen und Konstanten

Blenden Sie nun die Arbeitsblatt-Menleiste ein, indem Sie folgendes Makro einsetzen:
Listing 1.15: Die Arbeitsblatt-Menleiste wieder einblenden Sub ArbeitsplatzmenLeisteEinblenden() Dim Leiste As CommandBar Set Leiste = Application.CommandBars(1) 'oder 'Set Leiste = Application.CommandBars("Worksheet Menu Bar") Leiste.Enabled = True Set Leiste = Nothing End Sub

Textdatei als Symbol einfgen


In der folgenden Aufgabe kommen Sie mit dem Objekt OLEObject in Berhrung. Unter einem OLEObject versteht man Steuerelemente oder auch eingebettete Objekte wie Grafiken. Erstellen Sie als kleine Vorarbeit eine Textdatei mithilfe des Editors des WindowsZubehrs und geben Sie ein paar beliebige Daten ein. Speichern Sie diese Datei im Verzeichnis C:\Eigene Dateien\ unter dem Namen Beispiel.txt. Ihre Aufgabe besteht nun darin, diese Textdatei in eine Excel-Tabelle als Symbol einzufgen. Der Quellcode fr diese Aufgabenstellung lautet:
Listing 1.16: Textdatei als Symbol in eine Tabelle einfgen Sub TextDateiAlsSymbolEinfgen() Dim TextDatei As OLEObject Sheets("Tabelle2").Activate Set TextDatei = ActiveSheet.OLEObjects.Add( _ Filename:="c:\Eigene Dateien\Beispiel.txt", _ Link:=True, DisplayAsIcon:=True) Set TextDatei = Nothing End Sub

79

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Definieren Sie eine Objektvariable vom Typ OLEObject. Wechseln Sie jetzt auf die gewnschte Tabelle, in die Sie das Symbol einfgen mchten. Danach geben Sie ber die Anweisung Set bekannt, wo sich die Textdatei auf Ihrer Festplatte befindet und wie diese heit. ber die Methode Add fgen Sie ein neues OLE-Objekt in Ihre Tabelle ein. Indem Sie das Argument FileName verwenden und die Dateiendung .txt bekannt geben, wei Excel, um welches Steuerelement es sich handeln soll. Setzen Sie das Argument Link auf den Wert True, damit das OLE-Objekt mit der angegebenen Datei verknpft wird. Indem Sie das Argument DisplayAsIcon mit dem Wert True versehen, wird das OLE-Objekt als Symbol in der Tabelle angezeigt. Nach dem Einfgen des OLE-Objektes sollten Sie die Speicherreservierung durch die Objektvariable wieder freigeben.

Abbildung 1.49: Textdatei wurde in Excel-Tabelle als Symbol eingefgt.

Mit einem Doppelklick auf das Textblocksymbol wird die Textdatei geffnet.

Grafik einfgen
Im nchsten Beispiel wird eine Grafik in eine Tabelle eingefgt. Auch fr diesen Zweck bentigen Sie eine Objektvariable, dieses Mal vom Typ Picture. Fgen Sie jetzt 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 eingefgt Sub BildEinfgen() Dim Pic As Picture Sheets("Tabelle4").Activate

80

Datentypen, Variablen und Konstanten

Range("B3").Select Set Pic = ActiveSheet.Pictures.Insert _ ("c:\Windows\winlogo.gif") ActiveWindow.DisplayGridlines = False Set Pic = Nothing End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Picture. Danach wechseln Sie auf das gewnschte Tabellenblatt und selektieren die Zielzelle. Geben Sie danach ber die Anweisung Set bekannt, dass die Grafik in die aktive Tabelle, nmlich die gerade aktivierte TABELLE4, mithilfe der Methode Insert eingefgt werden soll. Geben Sie bei dieser Methode genau an, wie die Grafikdatei heit und wo diese gespeichert ist. Setzen Sie die Eigenschaft DisplayGridLines, die Sie gestern bereits kennen gelernt haben, auf den Wert False, um die Gitternetzlinien fr diese Tabelle auszublenden. Heben Sie am Ende des Makros den Objektverweis auf, um den reservierten Speicher wieder freizugeben.

Abbildung 1.50: Bild in Tabelle einfgen

Word starten und beenden


VBA knnen Sie Office-weit einsetzen, d.h. Sie knnen beispielsweise von Excel aus eine Word-Sitzung starten, ein neues Dokument anlegen, etwas dort hineinschreiben, das Dokument speichern und am Ende die Word-Sitzung wieder beenden.

81

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Im folgenden Beispiel wird eine Word-Sitzung gestartet, ein neues Dokument angelegt, das heutige Datum und der Anwendername ins Dokument eingetragen, das Dokument gespeichert und anschlieend die Word-Sitzung wieder beendet. Das Makro fr 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 = Nothing End Sub

Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Object. Danach erstellen Sie mithilfe der Funktion CreateObject einen Verweis auf Ihre Word-Applikation. Die Word-Sitzung wird danach geffnet. Indem Sie die Eigenschaft Visible auf den Wert True setzen, sehen Sie auch was davon. Mchten Sie diesen Vorgang komplett im Hintergrund durchfhren, setzen Sie diese Eigenschaft auf den Wert False. Wenden Sie die Methode Add an, um dem Auflistungsobjekt Documents ein neues Dokument hinzuzufgen. Im Auflistungsobjekt Documents sind brigens alle momentan geffneten Word-Dokumente verzeichnet. ber die Eigenschaft TypeText knnen Sie dem Dokument einen Text hinzufgen. Dabei fgen Sie das aktuelle Datum ber die Standardfunktion Date sowie den Benutzernamen des aktuellen Anwenders mithilfe der Eigenschaft Username hinzu. Nun wenden Sie darauf die Methode SaveAs an, um das Dokument unter dem angegebenen Namen zu speichern. ber die Methode Quit knnen Sie die WordSitzung wieder beenden.

82

Datentypen, Variablen und Konstanten

Abbildung 1.51: Ein Word-Dokument anlegen und speichern

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

Variableninhalt in die Zwischenablage befrdern


Im folgenden Beispiel werden Sie eine Variable mit einem Zelleninhalt fllen. Diesen Variableninhalt befrdern Sie dann direkt in die Zwischenablage. Sehen Sie sich zunchst folgende Ausgangssituation an.

Abbildung 1.52: Der Text aus A1 soll ohne Kopieraktion in die Zwischenablage.

83

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Der Quellcode fr die Aufgabenstellung sieht wie folgt aus:


Listing 1.19: Den Inhalt einer Variablen in die Zwischenablage bringen Dim ZwischenAblage As DataObject Sub TextInZwischenablageEinfgen() Dim Text As String Set ZwischenAblage = New DataObject Text = Sheets("Tabelle5").Range("A1").Value With ZwischenAblage .SetText Text .PutInClipboard End With Set Zwischenablage = Nothing End Sub

Bevor Sie das Makro starten, binden Sie in der Entwicklungsumgebung unter dem Befehl EXTRAS/VERWEISE die Bibliothek MICROSOFT FORMS 2.0 OBJECT LIBRARY ein. Deklarieren Sie danach eine globale Variable vom Typ DataObject. ber die Anweisung Set New DataObject gewinnen Sie Zugriff auf die Zwischenablage. Fllen Sie danach die Variable Text mit dem Zelleninhalt der Zelle A1 der TABELLE5. Mithilfe der Methode SetText transferieren Sie den Inhalt der Variablen Text in die Objektvariable Zwischenablage. Die Methode PutInClipBoard sorgt dann dafr, dass der Inhalt der Variablen Zwischenablage in die Zwischenablage eingefgt wird. Kontrollieren knnen Sie dieses Makro, indem Sie es starten, danach den Mauszeiger auf eine beliebige Zelle setzen und die Tastenkombination (Strg) + (V) drcken. 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 Zwischenablage in einer Variablen und geben den Inhalt der Variablen in Zelle B3 der TABELLE5 aus. Der Code hierfr lautet:

84

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 = Nothing End Sub

ber die Methode GetFromClipBoard transferieren Sie Daten aus der Zwischenablage in die Objektvariable Zwischenablage. Mithilfe der Methode GetText knnen Sie den Inhalt der Objektvariablen Zwischenablage ermitteln. Testen Sie beide Makros noch einmal, indem Sie zuerst das Makro aus Listing 1.19 und gleich im Anschluss das Makro aus Listing 1.20 starten.

Abbildung 1.53: Zwischenablage fllen und abfragen

Add-Ins-Prfung
Zu Excel gibt es einige Add-Ins, die Zusatzfunktionen enthalten. Damit diese Funktionen eingesetzt werden knnen, muss das entsprechende Add-In, welches die gewnschte Funktion enthlt, ber den Add-Ins-Manager eingebunden werden. Mithilfe von Excel-VBA knnen Sie aber auch auf Add-Ins zugreifen. Jedes Add-In kann ber die Objektvariable AddIn angesprochen werden. Dabei mssen Sie aber

85

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

wissen, wie das Add-In genau heit. Sehen Sie also kurz nach, indem Sie aus dem Men EXTRAS den Befehl ADD-INS auswhlen.

Abbildung 1.54: Der Add-Ins-Manager von Excel

Im Add-Ins-Manager sind alle Add-Ins verzeichnet, die Excel anbietet. Sehen Sie sich die Namen der einzelnen Add-Ins an. Ihre Aufgabe besteht darin, das Add-In ANALYSE-FUNKTIONEN per VBA-Code einzubinden. Deaktivieren Sie also zu Testzwecken dieses Add-In und besttigen Ihre Einstellung mit OK. Etwa in der Mitte des Listenfeldes sehen Sie sogar ein eigenes Add-In (MACHEROS ADD-IN- SAMMLUNG), welches ich fr mein erstes ExcelVBA-Kompendium programmiert habe. Sie werden am 12. Tag ebenfalls Ihr eigenes Add-In programmieren. Erfassen Sie nun folgendes Makro, um das Add-In ANALYSE-FUNKTIONEN einzubinden.
Listing 1.21: Das Add-In Analyse-Funktionen wird bei Bedarf installiert Sub AddInPrfung() Dim a As AddIn Set a = AddIns("Analyse-Funktionen")

86

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 = True End If Set a = Nothing End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ AddIn. Danach geben Sie ber die Anweisung Set an, welches Add-In Sie berprfen und ggf. installieren mchten. Mithilfe der Eigenschaft Installed knnen Sie jetzt berprfen, ob das Add-In bereits installiert ist. Wenn ja, dann meldet diese Eigenschaft den Wert True zurck. Wenn nicht, dann gibt diese Eigenschaft den Wert False zurck. In diesem Fall setzen Sie die Eigenschaft Installed direkt auf den Wert True. Damit erreichen Sie, dass das Add-In automatisch installiert wird. Vergessen Sie nicht, den Objektverweis ber die Anweisung Set a = Nothing wieder aufzuheben.

Zeichenobjekt einfgen
ber die Symbolleiste ZEICHNEN knnen Sie Ihre Tabellen verschnern, indem Sie Symbole, Pfeile und sonstige AutoFormen einfgen. In der nchsten Aufgabe soll ein bestimmter Zellenbereich definiert werden. Genau auf diesen Bereich soll dynamisch ein Rechteck darber gelegt und wieder weggenommen werden.
Listing 1.22: Zeichenobjekt ber Zellenbereich legen Sub ZeichenObjektEinfgen() Dim Bereich As Range Set Bereich = Range("B5:F10") ActiveSheet.Rectangles.Add _ Bereich.Left, Bereich.Top, _

87

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Bereich.Width, Bereich.Height Set Bereich = Nothing End Sub

Definieren Sie zuerst eine Objektvariable vom Typ Range. Unter einem RangeObjekt knnen Sie entweder einzelne Zellen oder gar ganze Zellenbereiche ansprechen. Geben Sie ber die Anweisung Set bekannt, ber welche Zellen sich der definierte Bereich erstrecken soll. Wenden Sie danach die Methode Add auf das Objekt Rectangles an, welches Ihnen ein Rechteck in die Tabelle einfgt. Als Einfgekoordinaten bergeben Sie der Methode die Eckkoordinaten Ihres definierten Bereichs, die Sie ber die Eigenschaften Left, Top, Width und Height angeben knnen. Vergessen Sie nicht, den Objektverweis ber die Anweisung Set Bereich = Nothing wieder aufzuheben.

Abbildung 1.55: Das Rechteck wurde genau ber den definierten Bereich gelegt.

Der Vollstndigkeit halber folgt hier noch das Makro, welches dieses Rechteck wieder 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

88

Datentypen, Variablen und Konstanten

Set Rechteck = Nothing End Sub

Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Shape. Darunter fallen alle Objekte in der Zeichnungsebene, z.B. AutoFormen, Freihandobjekte, OLEObjekte oder ein ganz normales Bild. Geben Sie ber die Anweisung Set genau an, wo sich das Shape-Objekt befindet. Das Shape-Objekt mit dem Index 1 ist das Shape-Objekt, welches als Erstes in Ihre Tabelle eingefgt wurde. Mithilfe der Methode Delete lschen Sie dieses Objekt. Auch hier sollten Sie den Objektverweis ber die Anweisung Set Rechteck = Nothing wieder aufheben, um den reservierten Speicher freizugeben.

Konstanten einsetzen
Im Gegensatz zu den Variablen ndern die Konstanten ihre Werte nie und bleiben whrend der Programmausfhrung immer konstant. Auch hier wird zwischen lokalen und globalen Konstanten unterschieden. Globale Konstanten werden auerhalb der einzelnen Makros definiert und sind damit fr alle Makros im Modul verwendbar. Lokale Konstanten hingegen gelten nur in dem Makro, in welchem sie definiert wurden. Wie schon bei den Variablen sollten Sie darauf achten, nicht allzu viele globale Konstanten zu verwenden, da sich dies merklich auf Ihren Speicher auswirkt. Nachfolgend ein paar typische Deklarationen mit Konstanten:
Const Const Const Const Const Const Const Laufwerk1 = "C:\" Laufwerk2 = "D:\" Verzeichnis1 = "C:\Eigene Dateien" Verzeichnis2 = "D:\Sicherung" Euro = 1.95583 MwSt = 1.16 EndDatum = #1/1/2002#

Was kann hier noch verbessert werden? Was fr die Variablen gilt, hat auch bei den Konstanten Konsequenzen. In den obigen Beispielen wurde noch nicht erklrt, welche Datentypen verwendet werden sollen. Zum aktuellen Zeitpunkt wird in allen gerade genannten Beispielen der Datentyp Variant eingesetzt. Es geht auch etwas genauer und Speicher sparender:
Const Laufwerk1 as String = "C:\" Const Laufwerk2 as String = "D:\"

89

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Const Const Const Const Const

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

Konstanten fr die Datumsfomatierung


Fr das Anzeigen von Datums- und Zeitangaben stehen Ihnen fertige Systemkonstanten zur Verfgung, die die Formatierung des Datums bzw. des Zeitwerts fr Sie bernehmen.

Datumsangaben formatiert ausgeben


Die Datums-/Zeitkonstanten werden unter anderem im Zusammenspiel mit der Funktion FormatDatTime verwendet. Dabei haben Sie die Mglichkeit, eine Datums- 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 whlen Sie eine der in der Tabelle folgenden Datums-/Zeitkonstanten.
Konstante
vbGeneralDate

Wert
0

Beschreibung 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 vorhanden, werden beide Teile angezeigt. Zeigt ein Datum im langen Datumsformat an, das in den Lndereinstellungen des Computers festgelegt ist. Zeigt ein Datum im kurzen Datumsformat an, das in den Lndereinstellungen des Computers festgelegt ist.

vbLongDate

VbShortDate

Tabelle 1.4: Die Datumskonstanten fr die Formatierung

90

Datentypen, Variablen und Konstanten

Konstante
vbLongTime

Wert
3

Beschreibung Zeigt eine Uhrzeit in dem Zeitformat an, das in den Lndereinstellungen des Computers festgelegt ist. Zeigt eine Uhrzeit im 24-Stunden-Format (hh:mm) an.

vbShortTime

Tabelle 1.4: Die Datumskonstanten fr die Formatierung (Forts.)

Im folgenden Beispiel wird das aktuelle Tagesdatum bzw. die momentane Uhrzeit auf verschiedene Arten ausgegeben.
Listing 1.24: Verschiedene Datums- und Zeitformate Sub DatumsformateBearbeiten() Dim DatAngabe As Date DatAngabe = Now MsgBox FormatDateTime(DatAngabe, FormatDateTime(DatAngabe, FormatDateTime(DatAngabe, FormatDateTime(DatAngabe, FormatDateTime(DatAngabe, End Sub

vbGeneralDate) & Chr(13) & _ vbLongDate) & Chr(13) & _ vbShortDate) & Chr(13) & _ vbLongTime) & Chr(13) & _ vbShortTime)

ber die entsprechende Formatkonstante wird der Inhalt der Variablen DatAngabe verschiedenartig formatiert. Das mehrzeilige Listenfenster bekommen Sie, indem Sie vor jeder neuen gewnschten Zeile die Anweisung Chr(13) einsetzen. Statt dieser Anweisung knnen Sie auch die Konstante vblf einsetzen, um einen Zeilenvorschub zu erreichen. Vergessen Sie dabei nicht den Verkettungsoperator.

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

91

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Datumsteile extrahieren
Mchten Sie einen ganz bestimmten Teil aus einem Datum herausziehen, beispielsweise den Tag, Monat, das Quartal oder das Jahr, dann setzen Sie die Funktion DatePart ein. Die Syntax dieser Funktion lautet:
DatePart(inter,date [,firstdayofweek[,firstweekofyear]])

Im Argument Inter mssen Sie genau angeben, welchen Teil des Datums Sie extrahieren mchten. Die einzelnen Mglichkeiten sehen Sie in der folgenden Tabelle:
Einstellung
yyyy q m y d w ww h n s

Beschreibung Jahr Quartal Monat Tag des Jahres Tag Wochentag Woche Stunde Minute Sekunde

Tabelle 1.5: Die Intervall-Konstanten der Funktion DatePart

Im Argument Date geben Sie das Datum an bzw. einen Zellenbezug, der ein Datum enthlt. Im Argument firstdayofweek mssen Sie den ersten Tag der Woche angeben. Denken Sie beispielsweise daran, dass der jdische Kalender mit dem Sonntag als erstem Tag der Woche beginnt. Fr unseren europischen Bereich mssen Sie daher den Wert 2 bzw. die Konstante vbMonday einsetzen. Wenn Sie die ganze Sache etwas variabler halten mchten, dann setzen Sie die Konstante vbUseSystem

92

Datentypen, Variablen und Konstanten

ein. Damit wird die Einstellung des ersten Tags der Woche direkt aus den Einstellungen Ihrer Windows-Systemsteuerung herausgelesen. Sehen Sie die einzelnen Belegungen der Konstanten in der folgenden Tabelle:.
Konstante
VbUseSystem VbSunday VbMonday vbTuesday vbWednesday vbThursday vbFriday vbSaturday

Wert
0 1 2 3 4 5 6 7

Beschreibung Die NLS API-Einstellung wird verwendet Sonntag (Voreinstellung) Montag Dienstag Mittwoch Donnerstag Freitag Samstag

Tabelle 1.6: Die FirstDayOfWeek-Konstanten der Funktion DatePart

Im letzten Argument firstweekofyear legen Sie die erste Woche eines Jahres fest. Danach richtet sich auch jeweils die Numerierung der Kalenderwoche. Dabei knnen Sie folgende Einstellungen treffen:
Einstellung
yyyy q m y d w ww

Beschreibung Jahr Quartal Monat Tag des Jahres Tag Wochentag Woche

Tabelle 1.7: Die Intervall-Konstanten der Funktion DatePart

93

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Einstellung
h n s

Beschreibung Stunde Minute Sekunde

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

Im Argument firstdayofweek mssen Sie den ersten Tag der Woche angeben. Denken Sie beispielsweise daran, dass der jdische Kalender mit dem Sonntag als erstem Tag der Woche beginnt. Fr unseren europischen Bereich mssen Sie daher den Wert 2 bzw. die Konstante vbMonday einsetzen. Wenn Sie die ganze Sache etwas variabler halten mchten, dann setzen Sie die Konstante vbUseSystem ein. Im letzten Argument firstweekofyear legen Sie die erste Woche eines Jahres fest. Danach richtet sich auch jeweils die Numerierung der Kalenderwoche. Dabei knnen Sie folgende Einstellungen treffen:
Konstante
VbUseSystem

Wert
0

Beschreibung Die NLS API-Einstellung aus der Systemsteuerung von Windows wird verwendet. Anfang in der Woche mit dem 1. Januar (Voreinstellung) Anfang in der ersten Woche, die mindestens vier Tage im neuen Jahr enthlt Anfang in der ersten vollen Woche des Jahres

vbFirstJan1 vbFirstFourDays

1 2

VbFirstFullWeek

Tabelle 1.8: Die FirstWeekOfYear-Konstanten der Funktion DatePart

ben Sie die Funktion nun an folgender Aufgabe:

Ermitteln Sie das Quartal des aktuellen Datums!

Die Lsung dieser Aufgabenstellung knnen Sie im nachfolgenden Listing sehen:

94

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 Krzel q knnen Sie ber die Funktion DatePart das momentane Quartal des Jahres ermitteln.

Abbildung 1.57: Ende August gehrt dem dritten Quartal an.

Wochentag ermitteln
Mithilfe der Funktion WeekDayName knnen Sie auf hnliche Konstanten wie gerade beschrieben zurckgreifen. Die Syntax dieser Funktion lautet:
WeekdayName(Wochentag, abkrzen, ErsterWochentag)

Das Argument Wochentag gibt die numerische Bezeichnung des Wochentages wieder, die abhngig ist von der Wahl des Arguments ErsterWochentag. Das Argument abkrzen legt fest, ob der Name des Tages abgekrzt werden soll oder nicht. Setzen Sie dieses Argument auf den Wert True, wenn Sie den ermittelten Wochentag abkrzen mchten. Setzen Sie hingegen dieses Argument auf den Wert False, um den Namen des ermittelten Tages auszuschreiben. Im Argument ErsterWochentag geben Sie den ersten Tag der Woche an, den Sie in Tabelle 1.6 ermitteln knnen. In der nchsten Aufgabe soll anhand des aktuellen Tagesdatums der dazugehrige Wochentag ermittelt werden. Das Lsungsmakro knnen Sie im folgenden Listing betrachten:
Listing 1.26: Den aktuellen Wochentag bestimmen Sub WochentagErmitteln() MsgBox "Heute ist der " & Date & vblf & _ "Dieses Datum entspricht einem " & vblf & _

95

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

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

Klar, Sie werden jetzt vielleicht sagen: Den Wochentag des aktuellen Tagesdatums zu ermitteln. Da brauch ich ja wohl kein Makro! Recht haben Sie! Aber wie ist es, wenn die Aufgabenstellung lautet: Welcher Tag ist in X Tagen von heute aus gesehen? In der folgenden Lsung wurde das Makro aus Listing 1.26 in eine Funktion berfhrt.
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 die Funktion Wochentag aufgerufen und ein zuknftiger Datumswert bergeben:
Listing 1.28: Einen zuknftigen Wochentag ermitteln Sub DatumPlus30() MsgBox "Heute ist der " & Date & vblf & _ "In 30 Tagen ist der " & Date + 30 & vblf & _ "Dieses Datum fllt auf einen: " & Wochentag(Date + 30) End Sub

Addieren Sie zum aktuellen Datum, welches Sie ber die Standardfunktion Date bekommen, einfach den Wert 30 und bergeben der Funktion diesen Datumswert.

Abbildung 1.58: Der zuknftige Termin ist unter der Woche.

96

Fragen & Antworten

1.10 Fragen & Antworten


F

Wie knnen Sie einen Befehl in der nchsten Zeile fortsetzen, ohne dass der Editor meckert?
A

Selbstverstndlich knnen Sie lngere Befehlsketten in einer Zeile eingeben. Der Nachteil daran ist, dass Sie irgendwann so weit nach rechts scrollen mssen, dass Sie den Anfang der Zeile nicht mehr sehen. Hier empfiehlt sich, ber ein Trennzeichen dem Editor mitzuteilen, dass der Befehl in der nchsten Zeile weitergehen soll. Auch hier leistet die automatische Syntaxprfung in Excel hervorragende Hilfe, denn nicht jeder Befehl lsst sich an einer beliebigen Stelle trennen. Um einen Befehl in der nchsten Zeile fortzusetzen, drcken Sie am Ende der Zeile zunchst die Taste (____) und geben anschlieend das Zeichen _ ein. Damit wei der Editor, dass der Befehl in der nchsten Zeile fortgesetzt werden muss.

Wie knnen Sie mehrere Befehle in eine einzige Zeile packen?


A

Wenn Sie mchten, knnen Sie auch mehrere kleinere Befehle in einer einzigen Zeile darstellen. Dazu verwenden Sie den Doppelpunkt als Trennzeichen zwischen den einzelnen Befehlen. Deklarieren Sie eine Objektvariable vom Typ Comment. Im folgenden Makro aus Listing 1.29 wird ein Kommentar in die aktive Zelle Ihrer Tabelle eingefgt.
Listing 1.29: Einen Kommentar einfgen Sub KommentarEinfgen() Dim Kommentar As Comment Set Kommentar = ActiveCell.AddComment Kommentar.Text "Kommentar zur Zelle" End Sub

ber welche Objektvariable knnen Sie einen Kommentar einfgen?


A

Deklarieren Sie eine Objektvariable vom Typ Comment. Danach fgen Sie ber die Methode AddComment einen Kommentar in die aktive Zelle Ihrer Tabelle ein.

97

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen

Wie knnen Sie einen Hyperlink in eine Zelle einfgen?


A

Im folgenden Makro aus Listing 1.30 wird ein Hyperlink eingefgt, der auf meine Excel-Homepage verweist.
Listing 1.30: Einen Hyperlink einfgen Sub HyperlinkEinfgen() 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 fgen Sie den Hyperlink ber die Methode Add ein. Im ersten Argument geben Sie an, wohin der Hyperlink eingefgt werden soll. Im zweiten Argument geben Sie die Adresse an, die angesprungen werden soll, wenn auf den Hyperlink geklickt wird.

1.11 Quiz
F F F F F F F

Wie rufen Sie die Entwicklungsumgebung auf? Woher holt sich die Funktion Date das aktuelle Tagesdatum? Wie kann man schnell komplette Code-Blcke auskommentieren? Wie kann man eine Deklaration von Variablen standardmig erzwingen? Wie kann man am schnellsten sehen, welche Objektvariablen fr die Programmierung zur Verfgung stehen? Wie lautet der Code, um eine PowerPoint-Sitzung zu starten? Wie kann man mithilfe der Funktion DatePart den Monatsnamen extrahieren?

98

bung

1.12 bung
Zum Abschluss dieses Tages ben Sie das heute Gelernte. Dabei soll folgende Aufgabenstellung gelst werden: In einer Tabelle sollen die Nullwerte nicht angezeigt werden. Auerdem sollen die Gitternetzlinien sowie die Spalten- und Zeilenbeschriftungen im Ausdruck mit ausgedruckt werden. Lsen Sie diese Aufgabe mithilfe des Makrorekorders und entfernen Sie danach aus der Aufzeichnung die nicht bentigten Zeilen. Sehen Sie sich jedoch vorab einmal die Ausgangssituation an:

Abbildung 1.59: Die Ausgangssituation

Die Demodateien Einstieg.xls und Syntax.xls finden Sie auf der CDROM im Verzeichnis Kap01. Die Lsung fr diese Aufgabe steht im Anhang A.

99

Die Sprachelemente von VBA

Die Sprachelemente von VBA

Am gestrigen Tag haben Sie die Entwicklungsumgebung von Excel sowie Datentypen, Variablen und den Einsatz von Konstanten kennen gelernt. Sie wissen nun, wie Sie sich in der Entwicklungsumgebung zurechtfinden knnen und warum Sie Variablen einsetzen bzw. deklarieren knnen. 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 diesem Kapitel erfahren Sie, wie Sie mithilfe von Verzweigungen, Schleifen und anderen Anweisungen Ihre Programme flexibel gestalten knnen. Diese Sprachelemente lassen sich leider nicht mit dem Makrorekorder aufzeichnen und mssen von Ihnen selbst erstellt werden. Der richtige Einsatz der Sprachelemente macht letztendlich die Kunst der Programmierung aus. Alle Makros dieses Tages finden Sie auf der mitgelieferten CD-ROM im Verzeichnis Kap02 unter dem Namen Sprachelemente.xls.

2.1

Arbeiten mit Verzweigungen

Unter einer Verzweigung versteht man ganz allgemein eine Prfung. Diese Prfung kann entweder das eine oder das andere Ergebnis bringen. Je nach Ergebnis werden Sie einen bestimmten Weg einschlagen.

102

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. Wenn nicht, dann mssen wir zu Hause bleiben und sparen! Bildlich dargestellt knnte das wie folgt aussehen:

Abbildung 2.1: Eine einfache Entscheidung

Oft sind Verzweigungen aber noch von weiteren Bedingungen abhngig, d.h. auf unser Beispiel bezogen knnte man noch weitere Kriterien anwenden, wie beispielsweise: Wenn wir Geld haben und ein gutes Angebot bekommen, fahren wir in den Urlaub! oder Wir fahren in den Urlaub, wenn wir Geld und die Kinder Ferien haben! Prfungen knnen selbstverstndlich auch geschachtelt werden, d.h. ein Zweig knnte weitergefhrt werden und weitere Verzweigungen enthalten. Angewendet auf unser Beispiel wrde das bedeuten: Also wir fahren jetzt in den Urlaub! Aber wohin? Sollen wir nach Frankreich oder nach Italien fahren?

103

Die Sprachelemente von VBA

Eine weitere Schachtelung wre dann: Wir haben uns fr Frankreich entschieden! Aber sollen wir nach Paris oder nach Nizza? Wie Sie sehen, knnen Sie auf diese Weise eine Menge Bedingungen formulieren und zu Papier bringen.

Verzweigungen in Excel
Verzweigungen kennen Sie bereits aus der normalen Arbeitsoberflche von Excel. Dort knnen Sie die Tabellenfunktion WENN() einsetzen, um entweder die eine oder die andere Aktion in Abhngigkeit von einem Zellenwert einzuleiten.

Verzweigungen in Excel-VBA
Mit Verzweigungen knnen Sie in Excel-VBA bestimmte Zustnde abfragen und je nach Zustand anders reagieren. Die allgemeine Syntax fr eine solche Verzweigung lautet:
If Bedingung Then [Anweisungen] [Else elseAnweisungen]

Alternativ knnen 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 erfllt werden muss (mssen). Unter dem Argument Anweisungen werden jene Anweisungen aufgefhrt, die durchgefhrt werden sollen, wenn die erste Bedingung erfllt wird. Unter dem Argument elseifBedingungen knnen Sie weitere Bedingungen formulieren und somit die Abfrage weiter schachteln. ber das Argument ElseIfAnweisungen lassen Sie dabei die Anweisungen folgen, sofern die elseIfBedingung erfllt ist.

104

Arbeiten mit Verzweigungen

ber das Argument elseAnweisungen knnen Sie eine oder mehrere Anweisungen folgen lassen, welche ausgefhrt werden sollen, wenn die erste Bedingung nicht erfllt wird. Lassen Sie uns nun diese etwas theoretische Syntaxbeschreibung auf einige Beispiele aus der Praxis anwenden.

Zelleninhalte prfen
Im folgenden Beispiel soll der Inhalt der momentan aktivierten Zelle geprft werden. Im ersten Schritt werden Sie testen, ob berhaupt etwas in der Zelle steht. Das Makro fr diese Aufgabe lautet:
Listing 2.1: Prfen, ob Zelle leer oder gefllt ist Sub Verzweigung() If ActiveCell.Value = "" Then _ MsgBox "Zelle ist leer" Else MsgBox "Zelle ist gefllt!" End Sub

berprfen Sie zuerst, ob die aktive Zelle gefllt ist. Alternativ zu der im Listing 2.1 aufgefhrten Abfrage knnten Sie auch die Zeile
If IsEmpty(ActiveCell.Value) Then

verwenden. Beide Bedingungen liefern das gewnschte Ergebnis. Fr den Fall, dass die Zelle einen Inhalt enthlt, wird der Then-Zweig ausgefhrt, andernfalls der Else-Zweig. Im nchsten Schritt mchten Sie prfen, ob der Zelleninhalt, sofern die Zelle gefllt ist, numerisch oder alphanumerisch ist. Dazu mssen Sie die Verzweigung schachteln. Das knnte dann wie folgt aussehen:
Listing 2.2: berprfen des genauen Zelleninhalts Sub VerzweigungDaten() If IsEmpty(ActiveCell.Value) Then MsgBox "Zelle ist leer" Else If IsNumeric(ActiveCell) Then MsgBox "Zelle enthlt eine Zahl" Else

105

Die Sprachelemente von VBA

MsgBox "Zelle enthlt einen Text" End If End If End Sub

In der ersten Verzweigung berprfen Sie, ob die Zelle leer ist. Wenn ja, geben Sie eine Meldung auf dem Bildschirm aus. Wenn die Zelle gefllt ist, mssen Sie eine zweite Verzweigung einbauen, die prft, ob es sich um einen numerischen oder alphanumerischen Zellenwert handelt. Mithilfe der Funktion IsNumeric knnen Sie diese Aufgabe erledigen. Vergessen Sie bei beiden Verzweigungen nicht, diese mit End if abzuschlieen. Bei dieser Gelegenheit mchte ich Ihnen eine weitere Funktion vorstellen, die Ihnen dabei hilft herauszufinden, ob ein Datumswert vorliegt. Sehr oft werden solche Datumsberprfungen in Excel durchgefhrt. Insbesondere bei Berechnungen von Lieferterminen oder Zahlungszielen mssen Sie als Entwickler sicherstellen, dass auch wirklich Datumseingaben vorgenommen wurden. Im nchsten Beispiel werden Sie vom Anwender eine Datumseingabe ber eine Eingabemaske verlangen. Das Makro fr diesen Zweck lautet:
Listing 2.3: Datumsprfung vornehmen Sub Datumsprfung() 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 mglich" GoTo Beginn End If d = d + 14 MsgBox "Das Zahlungsziel ist der: " & d Exit Sub

106

Arbeiten mit Verzweigungen

fehler: MsgBox "Sie haben kein gltiges Datum eingegeben!" GoTo Beginn End Sub

Im ersten Schritt fordern Sie den Anwender auf, ein Datum einzugeben. Danach kontrollieren Sie mithilfe einer Verzweigung, ob das Datum im gltigen Bereich liegt. Es werden nur Datumseingaben akzeptiert, die grer oder gleich dem Datum 01.01.2002 sind. Prfen Sie zustzlich, ob es sich berhaupt um einen gltigen Datumswert handelt. Dazu verwenden Sie die Funktion IsDate. Diese Funktion meldet den Wert True, wenn es sich um ein Datum handelt. Wurde ein gltiges Datum eingegeben, dann rechnen Sie mit diesem Datum. Dabei knnen Sie genauso vorgehen, wie Sie es auch bei numerischen Werten machen wrden. Addieren Sie zum Liefertermin einfach die Zahl 14 (14 Tage), um einen gngigen Zahlungstermin zu errechnen. Geben Sie diesen Termin dann auf dem Bildschirm aus.

Abbildung 2.2: Das Datum wurde korrekt eingegeben.

Sollte ein ungltiger Wert in der Eingabemaske erfasst werden, wird diese erneut aufgerufen. Zu Beginn des Listings finden Sie eine Anweisung On Error. Damit stellen Sie sicher, dass Ihr Makro nicht abstrzt, wenn Text eingegeben wird. Sollte ein Anwender in diesem Beispiel einen Text eingeben, wird die Sprungmarke fehler angesprungen. Dort erhlt der Benutzer eine Nachricht, dass ihm bei der Eingabe ein Fehler unterlaufen ist. Mit dem Befehl GoTo geben Sie ihm aber die Mglichkeit, seine Eingabe zu wiederholen. Als Sprungziel geben Sie dort die Sprungmarke Beginn an.

107

Die Sprachelemente von VBA

Sie haben bereits mehrere typische VBA-Funktionen kennen gelernt, die hufig eingesetzt werden, um Eingaben zu berprfen. In der folgenden Tabelle finden Sie die gngigsten Prffunktionen in VBA.
Funktion
IsEmpty

Beschreibung Gibt einen Wert vom Typ Boolean zurck, der angibt, ob eine Variable initialisiert wurde. Gibt einen Wert vom Typ Boolean zurck, der angibt, ob eine Variable ein Datenfeld ist. Gibt einen Wert vom Typ Boolean zurck, der angibt, ob ein Ausdruck in ein Datum umgewandelt werden kann. Gibt einen Wert vom Typ Boolean zurck, der angibt, ob ein Ausdruck ein Fehlerwert ist. Gibt einen Wert vom Typ Boolean zurck, der angibt, ob ein Ausdruck keine gltigen Daten (Null) enthlt. Gibt einen Wert vom Typ Boolean zurck, der angibt, ob ein Ausdruck als Zahl ausgewertet werden kann. Gibt einen Wert vom Typ Boolean zurck, der angibt, ob ein Bezeichner eine Objekt-Variable darstellt.

IsArray

IsDate

IsError

IsNull

IsNumeric

IsObject

Tabelle 2.1: Die wichtigsten Prffunktionen von VBA

Auch eine Art von Verzweigung


Neben der Verzweigung If...Then...Else gibt es eine weitere Mglichkeit, um Werte zu berprfen. 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 zurckgegebenen Wert oder Ausdruck, wenn expr den Wert True ergibt. Das Argument falsepart stellt den zurckgegebenen Wert oder Ausdruck dar, wenn expr den Wert False liefert.

108

bersichtlichere Form mit Select Case

Diese Funktion wertet immer sowohl den Teil truepart als auch den Teil falsepart aus, auch dann, wenn nur einer von beiden Teilen zurckgegeben wird. Auf ein Beispiel angewendet, berprfen Sie den Inhalt einer Zelle. Sofern der Inhalt numerisch ist, schreiben Sie in die Nebenzelle den Text Numerisch. Sollte es sich um einen Text handeln, dann schreiben Sie in die Nebenzelle den Text 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 Activecell.Offset(0, 1).Value in die Nebenzelle. Dabei weist die Eigenschaft Offset zwei Argumente auf. Das erste Argument gibt die Zeilenverschiebung, von der aktiven Zelle aus gesehen, bekannt. Da Sie in derselben Zeile bleiben mchten, ist demnach die Verschiebung gleich 0. Das zweite Argument gibt die Spaltenverschiebung, von der aktiven Zelle aus gesehen, bekannt. Da das Ergebnis in die Nebenspalte geschrieben werden soll, wird dieses Argument mit dem Wert 1 bestckt.

Abbildung 2.3: Zelleneintrag prfen und Ergebnis in Nebenzelle ausgeben

2.2

bersichtlichere Form mit Select Case

Wenn Sie mehrere Verzweigungen ineinander schachteln bzw. mehrere Verzweigungen hintereinander durchfhren mchten, gibt es dafr eine bessere und bersichtlichere Lsung. Setzen Sie fr solche Aufgaben die Anweisung Select Case ein.

109

Die Sprachelemente von VBA

Die Syntax fr Select Case lautet:


Select Case Testausdruck [Case Ausdrucksliste-n [Anweisungen-n]] ... [Case Else [elseAnw]] End Select

Unter dem Argument Testausdruck wird ein beliebiger numerischer Ausdruck oder Zeichenfolgenausdruck erfasst, den Sie auswerten mchten. Im Argument Ausdrucksliste-n spezifizieren Sie den zu untersuchenden Ausdruck nher. Dabei knnen Sie Vergleichsoperatoren, wie To, Is oder Like, verwenden. Unter dem Argument Anweisungen-n knnen Sie eine oder mehrere Anweisungen angeben, welche ausgefhrt werden sollen, wenn Testausdruck mit irgendeinem Teil in Ausdrucksliste-n bereinstimmt. Das Argument elseAnw ist optional einsetzbar. Damit knnen Sie darauf reagieren, wenn Testausdruck mit keinem der Ausdrcke im Case-Abschnitt bereinstimmen sollte. Sehen Sie nun ein paar typische Beispiele fr den Einsatz von Select Case.

Excel-Version feststellen
In der ersten Aufgabe fr dieses Sprachelement sollen Sie feststellen, mit welcher Excel-Version Sie arbeiten. Fr diese Aufgabe knnen Sie die Eigenschaft Version auswerten, 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

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 Select End Sub

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

Zahlenwerte prfen
Im nchsten Beispiel werden Eingaben geprft. Dabei soll ermittelt werden, in welchem Wertbereich die Eingabe vorgenommen wurde. Sehen Sie sich dazu folgendes Listing an:
Listing 2.6: Zahlenwerte berprfen 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

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 gltiger Wert eingegeben!" End Select End Sub

Wenden Sie die Select-Case-Anweisung an, um die eingegebenen Werte zu berprfen. In der ersten Abfrage kontrollieren Sie, ob der eingegebene Wert zwischen 1 und 5 liegt. In diesem Fall knnen Sie den Vergleichsoperator To einsetzen. In der zweiten Abfrage haben Sie die Zahlenwerte durch Komma getrennt eingegeben. Wurde kein gltiger Zahlenwert eingegeben, kommt die Anweisung Case Else zum Tragen. Dort geben Sie eine Fehlermeldung auf dem Bildschirm aus. Die folgende Tabelle enthlt eine Liste der Vergleichsoperatoren und die Bedingungen, unter denen das Ergebnis True, False oder 0 wird:
Vergleichsoperator < <= > >= = <> Erklrung kleiner als kleiner oder gleich grer als grer oder gleich gleich ungleich

Tabelle 2.2: Die Vergleichsoperatoren in Excel

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

112

Schleifen programmieren

berprfen Sie nun den Fensterstatus Ihrer Anwendung, indem Sie das folgende Makro 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: " & s End Sub

ber die Eigenschaft WindowState knnen Sie den Status Ihres Anwendungsfensters feststellen. Werten Sie diesen anschlieend ber die Anweisung Select Case aus. Die Frage nach dem Fensterstatus wird beispielsweise dann interessant, wenn Sie Daten in einer Tabelle eingeben und dazu sicherstellen mchten, dass Sie die grtmgliche Ansicht haben.

2.3

Schleifen programmieren

Schleifen werden in Excel dazu verwendet, um Ablufe mehrmals hintereinander durchzufhren. Die Schleifen werden so lange durchlaufen, bis eine oder mehrere Bedingungen zutreffen, welche dann einen Abbruch der Schleife bewirken. Je nach verwendeter Schleife findet die Abbruchprfung am Anfang bzw. am Ende der Schleife statt. Das war nun zugegeben etwas abstrakt: Stellen Sie sich vor, Sie mssten eine Flasche Wein trinken. Dabei drfen Sie den Wein nicht direkt aus der Flasche trinken, sondern mssen diesen in ein Viertel-Glas einschenken. Diesen Vorgang mssen Sie genau viermal wiederholen, um die Flasche leer zu trinken. Dies ist ein typisches Beispiel fr eine Schleife, die solange durchlaufen wird, bis die End-

113

Die Sprachelemente von VBA

bedingung eintrifft. Die Geschwindigkeit bei Excel-Schleifen ist natrlich um ein Tausendfaches schneller als bei diesem Beispiel aus dem tglichen Leben. Lernen Sie auf den nchsten Seiten die zur Verfgung stehenden Schleifen und einfache Beispiele fr den Einsatz von Schleifen kennen.

For...Next-Schleifen
Sie knnen die Schleife For...Next verwenden, um einen Block von Anweisungen eine unbestimmte Anzahl von Wiederholungen ausfhren zu lassen. For...NextSchleifen verwenden eine Zhlervariable, deren Wert mit jedem Schleifendurchlauf erhht oder verringert wird. Sie brauchen daher nicht daran zu denken, den Zhler selbst hoch- oder herunterzusetzen. Die Syntax dieser Schleife lautet:
For Zhler = Anfang To Ende [Step Schritt] [Anweisungen] [Exit For] [Anweisungen] Next [Zhler]

Das Argument Zhler ist erforderlich und besteht aus einer numerischen Variablen, die als Schleifenzhler dient. Das Argument Anfang reprsentiert den Startwert von Zhler. Mit dem Argument Ende legen Sie den Endwert von Zhler fest. Das Argument Schritt ist optional. Hier knnen Sie den Betrag bestimmen, um den der Zhler bei jedem Schleifendurchlauf verndert wird. Falls kein Wert angegeben wird, ist die Voreinstellung 1. Unter Anweisungen stehen eine oder mehrere Anweisungen zwischen For und Next, die so oft wie angegeben ausgefhrt werden. Innerhalb einer Schleife kann eine beliebige Anzahl von Exit-For-Anweisungen an beliebiger Stelle als alternative Mglichkeit zum Verlassen der Schleife verwendet werden.

114

Schleifen programmieren

ben Sie diese Art von Schleife anhand der nchsten Aufgaben:

Zeilen abarbeiten
Im ersten Beispiel zur For...Next-Schleife sollen einige Zeilen abgearbeitet werden. Diese Aufgabe gehrt zu den wichtigsten Aufgaben in Excel berhaupt. In vielen Fllen mssen Sie in einer Tabelle alle Datenstze nacheinander abarbeiten, wie z.B. Artikellisten, Preislisten oder Kundenlisten. In der nchsten Aufgabe sollen die Werte aus Spalte A in Spalte B bertragen und um den Faktor 15% erhht werden. Sehen Sie sich vorab folgende Abbildung an:

Abbildung 2.4: Eine Zahlenkolonne in Spalte A

Erfassen Sie nun das Makro, welches die Werte um 15% erhht und in Spalte B schreibt:
Listing 2.8: Zahlen um einen bestimmten Prozentsatz erhhen Sub Schleife01() Dim i As Long Sheets("Tabelle3").Activate Range("A1").Select For i = 1 To 10 ActiveCell.Offset(0, 1).Value = _

115

Die Sprachelemente von VBA

ActiveCell.Value * 1.15 ActiveCell.Offset(1, 0).Select Next i End Sub

Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie die prozentuale Erhhung durchfhren mchten. Selektieren Sie danach die Startzelle, bei der die Aktion beginnen soll. Setzen Sie nun eine For...Next-Schleife auf, die genau zehnmal durchlaufen wird. Innerhalb der Schleife multiplizieren Sie den Inhalt der jeweils aktiven Zelle und fgen diesen Wert ber die Eigenschaft OffSet in die Nebenzelle ein. Die Nebenzelle erreichen Sie, indem Sie das erste Argument von OffSet, die Zeilenverschiebung, auf den Wert 0 setzen, und das zweite Argument, die Spaltenverschiebung, auf den Wert 1. Vergessen Sie nicht, nach jedem Schleifendurchlauf den Mauszeiger ber die Anweisung ActiveCell.Offset(1, 0).Select eine Zeile weiter nach unten zu setzen, da Sie sonst eine Endlosschleife produzieren.

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

An dieser Stelle mchte ich Sie noch auf eine Schwachstelle im Listing 2.7 hinweisen. Diese Schleife ist leider nicht dynamisch, d.h. wenn Sie Ihre Tabelle erweitern, mssen Sie auch immer die Zhlvariable i anpassen.

116

Schleifen programmieren

In diesem Fall ist es besser zu ermitteln, wie viele Zeilen in der Tabelle bentigt werden, und in Abhngigkeit davon die Schleife aufzubauen. Dies wurde im folgenden 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.15 Next I End Sub

Mit der Anweisung ActiveSheet.UsedRange.Rows.Count ermitteln Sie die Anzahl der belegten Zeilen in Ihrer Tabelle. Dies bildet auch das Endkriterium fr Ihre Schleife. Innerhalb der Schleife knnen Sie auch auf das Selektieren der einzelnen Zellen verzichten, indem Sie mit Hilfe der Cells-Auflistung direkt auf die Zellen verweisen. Bei der Cells-Auflistung muss im ersten Argument die Zeile und im zweiten Argument die Spalte angegeben werden, auf die verwiesen werden soll. Der Schnittpunkt aus Zeile und Spalte ergibt dann die Zelle.

Zeilen einfrben
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 grn. Stellen Sie im folgenden Makro ein solches Papier her:
Listing 2.10: Liniertes Papier herstellen Sub Schleife02() Dim i As Long Sheets("Tabelle4").Activate Range("A1").Select

117

Die Sprachelemente von VBA

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

Die Schrittweite in Listing 2.9 ist dieses Mal nicht 1, sondern 2. Dabei verweisen Sie mithilfe der Eigenschaft OffSet, bei der Sie das Zeilenargument ber die Variable i angeben, dynamisch. Whrend der ganzen Verarbeitung bleibt der Mauszeiger immer auf Zelle A1. Sie verweisen lediglich immer auf die gewnschte Zelle. ber die Eigenschaft EntireRow gewinnen Sie Zugriff auf die komplette Zeile, die Sie ber die Eigenschaft ColorIndex einfrben. Jeder Farbwert in Excel hat einen eindeutigen Farbindex. So hat die Farbe HELLGELB den Farbindex 36. Am 6. Tag erfahren Sie, wie Sie die einzelnen Farben und deren Farbindexe auslesen knnen.

Abbildung 2.6: Das Papier im RechenzentrenLook

Tabellennamen ermitteln
Im nchsten Beispiel sollen Sie die Namen der Tabellen ermitteln, die sich in der aktiven Arbeitsmappe befinden. Dies ist wichtig, um die einzelnen Tabellen zu aktivieren und anzusprechen. Das Makro fr diese Aufgabe lautet:

118

Schleifen programmieren

Listing 2.11: Tabellennamen sammeln und ausgeben Sub Schleife03() Dim i As Integer Dim s As String For i = 1 To ThisWorkbook.Worksheets.Count s = s & Chr(13) & Worksheets(i).Name Next i MsgBox "In dieser Mappe befinden sich folgende Tabellen: " & _ Chr(13) & s, vbInformation + vbOKOnly End Sub

Die Schleife in Listing 2.11 ist dynamisch. ber die Anweisung ThisWorkbook.Worksheets.Count zhlen Sie alle Tabellen, die sich in der Arbeitsmappe befinden. Diese Anzahl bauen Sie als Endkriterium in Ihre Schleife ein. Innerhalb der Schleife sammeln Sie die einzelnen Namen der Tabellen in einer String-Variablen. Die Namen der einzelnen Tabellen bekommen Sie ber die Eigenschaft Name, welche Sie auf das jeweilige Tabellenblatt anwenden. Geben Sie am Ende den Inhalt der Variablen s am Bildschirm aus.

Abbildung 2.7: Auflisten der Tabellennamen einer Mappe

For Each...Next-Schleifen
Die Schleife For Each...Next wiederholt eine Gruppe von Anweisungen fr jedes Element in einem Datenfeld oder einer Auflistung. Die Syntax dieser Schleife lautet:
For Each Element In Gruppe [Anweisungen] [Exit For]

119

Die Sprachelemente von VBA

[Anweisungen] Next [Element]

Das Argument Element stellt die Variable zum Durchlauf durch die Elemente der Auflistung oder des Datenfeldes dar. Bei Auflistungen sind fr Element nur eine Variable vom Typ Variant, eine allgemeine Objektvariable oder eine beliebige spezielle Objektvariable zulssig. Bei Datenfeldern ist fr Element nur eine Variable vom Typ Variant zulssig. Das nchste Argument Gruppe steht fr den Namen einer Objektauflistung oder eines Datenfeldes. Das letzte Argument Anweisungen ist optional und fhrt eine oder mehrere Anweisungen durch, die fr jedes Element in Gruppe ausgefhrt werden sollen. Auch dieser wichtige Schleifentyp wird nun anhand praxisnaher Aufgaben gebt.

Zellen auswerten
Im ersten Beispiel fr die For-Each...Next-Schleife sollen Sie Zellen eines vorher definierten Bereichs auswerten. Alle Zellen in diesem Bereich, die einen Wert >80 aufweisen, sollen mit dem Schriftschnitt FETT belegt werden. Sehen Sie sich vorher die Ausgangssituation in der folgenden Abbildung an:

Abbildung 2.8: Die Ausgangslage ein Bereich mit Zahlenwerten

Erfassen Sie jetzt das Makro, welches den Zellenbereich B2:E10 untersucht und die Werte > 80 mit dem Schriftschnitt FETT belegt:

120

Schleifen programmieren

Listing 2.12: Zellen in Zielbereich untersuchen Sub Schleife04() Dim Zelle As Range Dim Bereich As Range Set Bereich = Sheets("Tabelle5").Range("B2:E10") For Each Zelle In Bereich If Zelle.Value > 80 Then Zelle.Font.Bold = True Next Zelle End Sub

Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Range. Die Objektvariable Zelle symbolisiert jeweils eine Zelle. Die Objektvariable Bereich steht fr mehrere Zellen, also einen ganzen Zellenbereich. Diesen Zellenbereich geben Sie ber die Anweisung Set bekannt. Geben Sie dabei sowohl den Namen der 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 prfen Sie ber eine If-Abfrage, ob der jeweilige Zellenwert ber 80 liegt. Wenn ja, dann wenden Sie die Eigenschaft Bold auf das Objekt Font an, um der Zelle den Schriftschnitt FETT zuzuweisen.

Abbildung 2.9: Alle Zellenwerte >80 wurden mit dem Schriftschnitt Fett formatiert.

121

Die Sprachelemente von VBA

Einheitliche Kopf- und Fuzeilen


Im nchsten Beispiel sorgen Sie fr eine einheitliche Gestaltung der Kopf- und Fuzeilen. Dabei arbeiten Sie alle Tabellen einer Arbeitsmappe ab, rufen die Seitenansicht auf und stellen die gewnschten Kopf- und Fuzeilen ein. Dabei werden folgende Informationen gewnscht:

Kopfzeile links: der Firmenname Kopfzeile Mitte: der Name des Tabellenblattes Kopfzeile rechts: das aktuelle Datum Fuzeile links: der komplette Speicherpfad inkl. Dateinamen Fuzeile Mitte: bleibt leer Fuzeile rechts: Seitennumerierung

Erfassen Sie nun das Makro aus Listing 2.13:


Listing 2.13: Einheitliche Kopf- und Fuzeilen 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 = True End Sub

122

Schleifen programmieren

Definieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. Schalten Sie danach die Bildschirmaktualisierung aus, indem Sie die Anweisung Application.ScreenUpdating = False einsetzen. Setzen Sie danach eine Schleife auf, die alle Tabellen der aktiven Arbeitsmappe durchluft und ber das Objekt PageSetup einheitliche Kopf- und Fuzeilen einstellt. Heben Sie am Ende des Makros den Objektverweis wieder auf, um Speicher freizugeben, und schalten Sie die Bildschirmaktualisierung wieder ein.

Abbildung 2.10: Die Kopf- und Fuzeilen sind auf allen Tabellen einheitlich.

123

Die Sprachelemente von VBA

Excel-Arbeitsmappen zhlen
Im letzten Beispiel zur For-Each...Next-Schleife sollen die Namen aller ExcelArbeitsmappen eines Verzeichnisses und der darunter liegenden Verzeichnisse ermittelt und ausgegeben werden. Der Code fr diese Aufgabe lautet:
Listing 2.14: Alle Excel-Arbeitsmappen eines Verzeichnisses werden gezhlt Sub Schleife06() Dim obj As Variant Const 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 " & verz End Sub

Zu Beginn des Makros knnen Sie das zu durchsuchende Verzeichnis in einer Konstanten angeben. Wechseln Sie ber die Anweisung ChDir direkt in dieses Verzeichnis. Danach starten Sie die Suche und verwenden dabei das Objekt FileSearch, um die einzelnen Dateien im Verzeichnis zu ermitteln. Auf dieses Objekt knnen Sie einige Eigenschaften anwenden: Die Eigenschaft NewSearch setzt die Einstellungen aller Suchkriterien auf die Standardeinstellungen zurck. Mithilfe der Eigenschaft LookIn geben Sie bekannt, in welchem Verzeichnis die Suche

124

Schleifen programmieren

beginnen soll. Die Eigenschaft SearchSubFolders bestimmt, ob die Suche auch in Unterverzeichnissen fortgesetzt werden soll. In diesem Fall mssen Sie diese Eigenschaft auf den Wert True setzen. Die Eigenschaft FileType gibt den Typ der Datei in einer Konstanten an, nach der gesucht werden soll. Mchten Sie beispielsweise nicht nur Excel-Arbeitsmappen suchen lassen, sondern alle Dateitypen, dann geben Sie die Konstante msoFileTypeAllFiles an. ber die Anweisung FoundFiles.Count geben Sie dann den Namen der gefundenen Datei an und schreiben diesen in den Direktbereich Ihrer Entwicklungsumgebung.

Abbildung 2.11: Die Namen der Excel-Arbeitsmappen werden im Direktbereich ausgegeben.

Den Direktbereich knnen Sie einblenden, indem Sie in Ihre Entwicklungsumgebung wechseln und aus dem Men ANSICHT den Befehl DIREKTFENSTER whlen.

Die Schleife Do Until...Loop


Die Do-Until...Loop-Schleife wiederholt einen Block mit Anweisungen, solange eine Bedingung den Wert True erhlt. Die Bedingung wird jeweils am Ende der Schleife geprft. Als Abbruchbedingung knnen Sie alles Mgliche abfragen; so knnen Sie z.B. eine Abbruchbedingung festlegen, wenn ein bestimmter Wert erreicht ist oder eine Zelle einen bestimmten Text aufweist. Beispielsweise knnten Sie eine solche Schleife so oft wiederholen, solange die Zellenformatierung der Zellen sich nicht ndert.

125

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 Zeichenfolgenausdruck dar, der entweder erfllt (True) oder nicht erfllt (False) wird. Liefert die Bedingung den Wert 0, so wird die Bedingung als False interpretiert. Hinter den Anweisungen verbergen sich eine oder mehrere Anweisungen, die wiederholt werden, solange oder bis Bedingung durch True erfllt ist. Innerhalb einer Do-UntilLoop-Anweisung kann eine beliebige Anzahl von Exit-DoAnweisungen an beliebiger Stelle als Alternative zum Verlassen einer DoUntilLoop-Anweisung verwendet werden. Exit Do wird oft in Zusammenhang mit der Auswertung einer Bedingung (zum Beispiel If...Then) eingesetzt und hat zur Folge, dass die Ausfhrung mit der ersten Anweisung im Anschluss an Loop fortgesetzt wird. ben Sie den Einsatz dieser Schleife mittels einiger ausgesuchter Beispiele.

Jede x-te Zeile lschen


Im ersten Beispiel fr die Do-Until...Loop-Schleife werden Sie in einer Tabelle jede dritte Zeile lschen. Dabei gehen Sie von folgender Ausgangstabelle aus (siehe Abbildung 2.12). Erfassen Sie nun das Makro, welches jede dritte Zeile lscht:
Listing 2.15: Jede dritte Zeile lschen Sub Schleife07() Const zz = 2 Dim i As Integer Sheets("Tabelle6").Activate Range("A1").Select i = 1 Do Until ActiveCell.Value = "" For i = 1 To zz

126

Schleifen programmieren

ActiveCell.Offset(1, 0).Select Next i Selection.EntireRow.Delete i = 1 Loop End Sub

Abbildung 2.12: Die Ausgangstabelle

Durchlaufen Sie in einer Do-Until...Loop-Schleife alle gefllten Zellen der Spalte A. Als Endkriterium fr die Schleife gilt die erste leere Zelle, auf die Excel stt. Innerhalb dieser Schleife knnen Sie mit einer weiteren Schleife arbeiten, welche die Zeilen berspringt, die nicht gelscht werden sollen. ber die Methode Delete lschen Sie jeweils jede dritte Zeile (siehe Abbildung 2.13).

Bestimmte Zeichen austauschen


Im nchsten Beispiel werden in einer Tabelle bestimmte Zeichen ausgetauscht. So sollen alle Bindestriche durch Slashes ersetzt werden. Sehen Sie sich vorher die Ausgangssituation fr diese Aufgabenstellung an (siehe Abbildung 2.14).

127

Die Sprachelemente von VBA

Abbildung 2.13: Jede dritte Zeile wurde gelscht.

Abbildung 2.14: Die Bindestriche sollen durch das Zeichen Slash ersetzt werden.

128

Schleifen programmieren

Erfassen Sie nun das folgende Makro, um diese Aufgabe zu lsen:


Listing 2.16: Alle Bindestriche wurden ersetzt Sub Schleife08() Sheets("Tabelle7").Activate Range("A1").Select Do Until ActiveCell.Value = "" If InStr(ActiveCell.Value, "-") Then ActiveCell.Value = _ Application.Substitute(ActiveCell.Value, "-", "/") End If ActiveCell.Offset(1, 0).Select Loop End Sub

Setzen Sie eine Do-Until...Loop-Schleife ein, um alle Zellen der Spalte A abzuarbeiten. Innerhalb der Schleife prfen Sie mithilfe der Funktion InStr, ob ein Bindestrich in der jeweiligen Zelle berhaupt vorkommt. Wenn ja, wenden Sie die Funktion Substitute an, um dieses Zeichen durch ein anderes auszutauschen. Vergessen Sie nicht, den Mauszeiger bei jedem Schleifendurchlauf ber die Eigenschaft Offset eine Zeile weiter nach unten zu setzen.

Abbildung 2.15: Alle Bindestriche wurden entfernt.

129

Die Sprachelemente von VBA

Die Schleife Do While...Loop


Die Do-While...Loop-Schleife wiederholt einen Block mit Anweisungen, solange eine Bedingung den Wert True erhlt. Die Prfung der angegebenen Bedingung erfolgt immer zu Beginn der Schleife. Als Abbruchbedingung knnen Sie alles Mgliche abfragen; so knnen Sie z.B. eine Abbruchbedingung festlegen, wenn ein 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 Zeichenfolgenausdruck dar, der entweder erfllt (True) oder nicht erfllt (False) wird. Liefert die Bedingung den Wert 0, so wird die Bedingung als False interpretiert. Hinter den Anweisungen verbergen sich eine oder mehrere Anweisungen, die wiederholt werden, solange oder bis die Bedingung True erfllt ist. Innerhalb einer Do-While...Loop-Anweisung kann eine beliebige Anzahl von ExitDo-Anweisungen an beliebiger Stelle als Alternative zum Verlassen einer Do...Loop-Anweisung verwendet werden. Exit Do wird oft in Zusammenhang mit der Auswertung einer Bedingung (zum Beispiel If...Then) eingesetzt und hat zur Folge, dass die Ausfhrung mit der ersten Anweisung im Anschluss an Loop fortgesetzt wird. ben Sie diese Art von Schleife anhand der nchsten Beispiele:

Zellenlnge berprfen
Im ersten Beispiel zur Schleife Do While...Loop berprfen Sie in einer Tabelle, ob in Spalte A gltige Eingaben vorgenommen wurden. So darf jeder Eintrag nur acht Zeichen lang sein. Sehen Sie zur besseren Verstndlichkeit die folgende Abbildung an (siehe Abbildung 2.16). Schreiben Sie jetzt das folgende Makro, welches die Lngen der Zellen in Spalte A berprft. Wird eine falsche Lnge gefunden, wird ein Eintrag in Spalte B vorgenommen.

130

Schleifen programmieren

Abbildung 2.16: Welche Eingaben sind korrekt? Listing 2.17: Lnge von Eingaben messen und reagieren Sub Schleife09() Sheets("Tabelle8").Activate Range("A1").Select Do While ActiveCell.Value <> "" If Len(ActiveCell.Value) <> 8 Then _ ActiveCell.Offset(0, 1).Value = "Falsche Lnge!" ActiveCell.Offset(1, 0).Select Loop End Sub

Durchlaufen Sie ber die Schleife Do While...Loop alle Zellen der Spalte A, solange Excel auf keine leere Zelle stt. Innerhalb der Schleife prfen Sie ber die Funktion Len, ob die richtige Lnge der Zelle, nmlich 8, vorliegt. Wenn nicht, 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 summiert werden, die mit der Schriftfarbe ROT und dem Schriftschnitt FETT formatiert sind. Das Makro fr diese Aufgabe lautet:

131

Die Sprachelemente von VBA

Abbildung 2.17: Falsche Eingaben wurden gekennzeichnet. Listing 2.18: Alle roten und fetten Zahlen sollen summiert werden Sub Schleife10() Dim Betrag As Single Sheets("Tabelle9").Activate Range("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 Loop MsgBox "Die Summe der roten Zahlen lautet: " & Betrag End Sub

In einer Do-While...Loop-Schleife durchlaufen Sie alle gefllten Zellen der Spalte A. berprfen Sie dabei fr jede Zelle deren Formatierung. Nur numerische Zellen, die mit der Schriftfarbe ROT und dem Schriftschnitt FETT formatiert sind, sollen summiert werden.

132

Auf Fehlersuche mit VBA

Abbildung 2.18: Alle roten, fetten Zahlen wurden summiert.

2.4

Auf Fehlersuche mit VBA

Gerade haben Sie typische Sprachelemente wie Verzweigungen und Schleifen kennen gelernt. Vielleicht werden Sie sich fragen, warum dieses Thema bereits so frh in diesem Buch behandelt wird. Nun, gerade am Anfang, beim Lernen einer Programmiersprache, macht man die meisten Fehler. Deswegen ist es besser, gleich zu Beginn zu wissen, wie man Fehler findet und beseitigt und welche Hilfsmittel zu diesem Zweck zur Verfgung stehen.

Allgemeine Informationen zu Makros


Enthlt eine Arbeitsmappe Makros, werden Sie bereits beim ffnen ber eine Bildschirmmeldung darauf hingewiesen (siehe Abbildung 2.19). Sollten Sie eine Arbeitsmappe unbekannter Herkunft erhalten, empfiehlt es sich zunchst, diese Mappe ohne Makros zu ffnen. Eine fremde Arbeitsmappe knnte unter Umstnden gefhrliche Makroviren enthalten. Klicken Sie zu diesem Zweck die Schaltflche MAKROS DEAKTIVIEREN.

133

Die Sprachelemente von VBA

Abbildung 2.19: Makrowarnmeldung beim ffnen einer Datei

In der so geffneten Arbeitsmappe knnen die Makros dann nicht ausgefhrt werden. Bevor Sie eine unbekannte Arbeitsmappe ffnen, sollten Sie auf jeden Fall ein Virensuchprogramm darber laufen lassen. Danach knnen Sie die Arbeitsmappe ffnen und die Makros aktivieren, indem Sie die Schaltflche MAKROS AKTIVIEREN anklicken. In Excel gibt es Auto-Makros, die beispielsweise direkt beim ffnen einer Arbeitsmappe gestartet werden. Auch diese Makros bergen eine gewisse Gefahr. Um das automatische Ausfhren von Auto-Makros zu unterbinden, halten Sie whrend des ffnens der Arbeitsmappe die Taste () gedrckt. Sicher ist es lstig, bei jedem ffnen einer Arbeitsmappe eine Meldung wegzuklicken, sofern die Arbeitsmappe Makros enthlt. Wenn Sie ein sicheres Virensuchprogramm im Einsatz haben und Ihren Lieferanten vertrauen, knnen Sie diesen Automatismus auch abschalten, indem Sie wie folgt vorgehen: 1. Whlen Sie aus dem Men EXTRAS den Befehl MAKRO/SICHERHEIT. 2. Aktivieren Sie die Sicherheitsstufe NIEDRIG. 3. Besttigen Sie mit OK. In Excel haben Sie die Mglichkeit, Ihren Quellcode mit einer digitalen Signatur auszustatten. Damit knnen Ihre Makros eindeutig identifiziert werden. Darber hinaus besttigt die Signatur, dass am Quellcode keine nderungen vorgenommen wurden. Beim Festlegen der Sicherheitsstufe fr Makros knnen Sie einstellen, dass Makros, die von einem Entwickler aus der Liste der vertrauenswrdigen Quellen digital signiert wurden, ausgefhrt werden. Mehr Infos zu diesem Thema finden Sie in der Online-Hilfe auf der Registerkarte INHALT unter der Rubrik SICHERHEIT/DIGITALE UNTERSCHRIFTEN UND ZERTIFIKATE.

134

Auf Fehlersuche mit VBA

Abbildung 2.20: Die Sicherheitsstufe anpassen

Enthlt eine Arbeitsmappe Makros, mssen diese nicht immer in Modulen abgelegt sein. Theoretisch knnen Makros hinter jeder einzelnen Tabelle, hinter dem Eintrag DIESE ARBEITSMAPPE und hinter UserForms verborgen sein. Klicken Sie diese einzelnen Elemente in der Entwicklungsumgebung einfach nacheinander doppelt an, bis Sie das versteckte Makro finden.

Fehler finden und beseitigen


Im Verlauf der Programmierung wird es nicht ausbleiben, dass Programmierfehler auftreten. Wichtig ist aber immer zu wissen, wie weit und vor allem ob das Programm bis zum Fehler korrekt abgelaufen ist. Daher steht Ihnen in der Entwicklungsumgebung eine Testumgebung zur Verfgung, ber die Sie Fehler schnell finden und beseitigen knnen.

Das Code-Fenster
Im Code-Fenster erfassen und bearbeiten Sie Ihre VBA-Makros. Sollte dieses Fenster noch nicht eingeblendet sein, dann whlen Sie aus dem Men ANSICHT den Befehl CODE.

135

Die Sprachelemente von VBA

Das Code-Fenster enthlt folgende Objekte:

Dropdown-Feld OBJEKT: Hier werden die Namen der markierten Objekte angezeigt. Klicken Sie auf den Pfeil rechts neben dem Listenfeld, um eine Liste aller mit dem Formular verknpften Objekte anzuzeigen. Dropdown-Feld PROZEDUR: Listet alle Ereignisse auf, die von Visual Basic fr das Formular oder das Steuerelement, das im Feld OBJEKT angezeigt wird, erkannt werden. Bei der Auswahl eines Ereignisses wird die mit diesem Ereignisnamen verknpfte Ereignisprozedur im Code-Fenster angezeigt. Alle Prozeduren werden in alphabetischer Reihenfolge im Dropdown-Feld angezeigt. Dies erleichtert die Suche nach bestimmten Modulen.

Abbildung 2.21: Schnell Makros auffinden ber das DropdownFeld Prozedur

Wenn Sie auf den rechten, oberen Rand der vertikalen Bildlaufleiste des Codefensters sehen, erkennen Sie den Fensterteiler. Der Fensterteiler befindet sich direkt oberhalb des Pfeil-nach-oben-Symbols. Damit knnen Sie das Code-Fenster in zwei horizontale Bereiche unterteilen, in denen separate Bildlufe durchgefhrt werden knnen. So knnen Sie unterschiedliche Teile wie zum Beispiel den Anfang und das Ende eines Makros gleichzeitig anzeigen.

136

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 Doppelklick auf den Fensterteiler wird ein Fenster geschlossen.

Das Direktfenster
Das Direktfenster knnen Sie hervorragend dazu einsetzen, ein Makro zu testen. Dabei haben Sie die Mglichkeit, Inhalte von Variablen und Positionen im Code zu dokumentieren. Sie knnen beispielsweise bestimmte Inhalte von Variablen im Direktfenster ausgeben. Erfassen Sie zunchst einmal einen kleinen Beispielcode:
Listing 2.19: Den Direktbereich von Excel fllen Sub Testlauf() Dim i As Integer For i = 1 To 10 Debug.Print "Schleifendurchlauf: " & i Next i End Sub

Im Makro aus Listing 2.19 wird eine Schleife genau zehnmal durchlaufen. Bei jedem Schleifendurchlauf wird mithilfe des Befehls Debug.Print ein Eintrag ins Direktfenster geschrieben, der den aktuellen Schleifendurchlauf festhlt. Setzen Sie die Einfgemarke in die erste Zeile des Makros und drcken Sie die Taste (F5), um das Makro zu starten. Kontrollieren Sie jetzt einmal das Ergebnis im Direktfenster. Dazu whlen Sie aus dem Menbefehl ANSICHT den Befehl DIREKTFENSTER oder drcken die Tastenkombination (Strg) + (G).

Code im Einzelschritt durchlaufen lassen


Eine weitere Mglichkeit der Fehlersuche in Excel ist es, das Makro Zeile fr Zeile abzuarbeiten. Dazu setzen Sie die Einfgemarke in die erste Zeile des Makros und drcken die Taste (F8). Alternativ dazu knnen Sie ebenso den Menbefehl DEBUGGEN/EINZELSCHRITT whlen. Das Makro hlt nach jedem Befehl an.

137

Die Sprachelemente von VBA

Abbildung 2.22: Die einzelnen Zustnde des Makros werden festgehalten.

Sie knnen dann prfen, ob die gewnschte Aktion ausgefhrt wurde, indem Sie die Entwicklungsumgebung kurzfristig verlassen und in Ihrer Excel-Arbeitsmappe die Ergebnisse kontrollieren. Eine weitere Variante ist es, im obigen Makro die Einfgemarke in jene Zeile zu setzen, bis zu der das Makro durchlaufen werden soll. Setzen Sie beispielsweise die Einfgemarke in die Zeile, bis zu der Sie den Code durchlaufen mchten, und drcken Sie die Tastenkombination (Strg) + (F8). Der Code wird jetzt bis zu der momentan markierten Zeile durchlaufen und stoppt genau an dieser Position. Nun knnen Sie prfen, ob das Makro auch korrekt funktioniert hat. Wenn alles soweit stimmt, knnen Sie durch die Taste (F5) dafr sorgen, dass das Makro bis zum Ende durchluft. Sollte etwas mit dem Makro nicht stimmen, brechen Sie es ab, indem Sie den Menbefehl AUSFHREN/ZURCKSETZEN aufrufen.

berwachung hinzufgen
Eine besonders wertvolle Funktion knnen Sie einsetzen, wenn Sie das berwachungsfenster einblenden. Whlen Sie dazu aus dem Men ANSICHT den Befehl BERWACHUNGSFENSTER. Sie haben jetzt beispielsweise die Mglichkeit, zu

138

Auf Fehlersuche mit VBA

berprfen, wann sich eine bestimmte Variable ndert. Genau dann soll der Makroablauf unterbrochen werden. Im folgenden Beispiel wird eine Schleife genau zehnmal durchlaufen. Bei jedem Schleifendurchlauf wird die Variable i verndert. Der Logik zufolge muss das folgende Makro dann nach dem ersten Schleifendurchlauf gestoppt werden. Sehen Sie sich zu diesem Zweck einmal folgendes Listing an:
Listing 2.20: Mehrere Schleifendurchlufe Sub Testmakro() Dim i As Integer For i = 1 To 10 Debug.Print "Schleifendurchlauf: " & i Next i End Sub

Um nun die berwachung der Variablen i einzustellen, befolgen Sie die nchsten Schritte: 1. Whlen Sie aus dem Men DEBUGGEN den Befehl BERWACHUNG HINZUFGEN.

Abbildung 2.23: berwachung hinzufgen

2. Geben Sie im Feld AUSDRUCK die Variable an, die Sie berwachen mchten. 3. Aktivieren Sie die Option UNTERBRECHEN, WENN WERT GENDERT WURDE. 4. Besttigen Sie Ihre Einstellungen mit OK.

139

Die Sprachelemente von VBA

Abbildung 2.24: Das Makro stoppt bei der ersten nderung der Variablen i.

Der momentane Inhalt der Variablen wird im berwachungsfenster angezeigt.

Das Lokal-Fenster
Das Lokal-Fenster wird in der Entwicklungsumgebung standardmig nicht angezeigt. ber das Men ANSICHT knnen Sie dieses Fenster jedoch einblenden. Das Lokal-Fenster zeigt alle deklarierten Variablen in der aktuellen Prozedur und deren Werte an. Sie haben daher die Mglichkeit, die Werte von Variablen bersichtlich zu prfen. Um diese Funktion zu testen, erfassen Sie folgendes Makro, welches alle benutzten Zellen der TABELLE1 nach TABELLE2 bertrgt:
Listing 2.21: Daten von einer Tabelle auf eine andere bertragen Sub Dim Dim Dim DatenTransferieren() TB1 As Worksheet TB2 As Worksheet i As Long

Set TB1 = Worksheets("Tabelle1") Set TB2 = Worksheets("Tabelle2")

140

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 heien. In einer anschlieenden Schleife bertragen Sie dann alle Zellen der Spalte A in TABELLE1 in die Zieltabelle TABELLE2. Dabei setzen Sie die Eigenschaft Cells ein, die zwei Argumente bentigt. Im ersten Argument geben Sie die jeweils aktive Zeile wieder, im zweiten Argument die Spalte. Da die Spalte konstant bleibt (Spalte A) knnen Sie dieses Argument mit dem Wert 1 fllen und konstant belassen. Das Zeilenargument wird bei jedem Schleifendurchlauf erhht. Gehen Sie jetzt wie folgt vor, um das Lokal-Fenster einsetzen zu knnen: 1. Setzen Sie den Mauszeiger auf die Zeile innerhalb der Schleife. 2. Drcken Sie die Taste (F9), um dort einen Haltepunkt zu setzen. 3. Starten Sie das Makro, indem Sie die Taste (F5) drcken. 4. Das Makro luft bis zum Haltepunkt. Im Lokal-Fenster wird der Inhalt der Variablen nun angezeigt. Fhren Sie noch einmal einen Schleifendurchlauf durch, indem Sie die Taste (F5) erneut drcken.

Abbildung 2.25: Der Variableninhalt wird im Lokal-Fenster angezeigt.

141

Die Sprachelemente von VBA

Folgende Spalten werden im Lokal-Fenster angezeigt.

AUSDRUCK: Listet die Namen der Variablen auf. Die erste Variable in der Liste ist eine spezielle Modulvariable und kann erweitert werden, um alle Variablen auf Modulebene des aktuellen Moduls anzuzeigen. Globale Variablen und Variablen in anderen Projekten sind ber das Lokal-Fenster nicht verfgbar. WERT: Wenn Sie in der Spalte WERT direkt auf einen Eintrag klicken, nimmt der Cursor die Form eines I-Cursors an. Sie knnen diesen Wert bearbeiten und danach mit der Taste (Enter) besttigen. Sollte der Wert nicht zulssig sein, bleibt das Bearbeitungsfeld aktiv und der Wert wird markiert. Auerdem wird ein Meldungsfeld mit einer Beschreibung des Fehlers angezeigt. Durch Drcken von (Esc) werden nderungen rckgngig gemacht. Auf unser Beispiel angewendet, knnten Sie den Wert der Variablen i auf 7 ndern. Excel wrde dann nach dem siebten Schleifendurchlauf weitermachen. TYP: In dieser Spalte wird der Datentyp der Variablen angezeigt. Diesen Typ knnen Sie aber nicht ndern. AUFRUFLISTE: Ganz rechts oben im Lokal-Fenster finden Sie eine Schaltflche mit einigen Punkten darauf. Nach einem Klick darauf wird eine Liste der derzeit aktiven Prozeduraufrufe im Haltemodus angezeigt. Beim Ausfhren von Code in einer Prozedur wird diese einer Liste der aktiven Prozeduraufrufe hinzugefgt. Bei jedem Aufruf einer anderen Prozedur durch eine Prozedur wird diese der Liste hinzugefgt. Aufgerufene Prozeduren werden aus der Liste gelscht, wenn die Ausfhrung an die aufrufende Prozedur bergeben wird. Sie knnen den Haltepunkt auch whrend der Laufzeit wieder herausnehmen. Drcken Sie nach dem erneuten Stoppen des Makros die Taste (F9).

Die Symbolleiste Debuggen


Die Symbolleiste DEBUGGEN stellt Ihnen Symbole zur Verfgung, die das schnelle Testen von Quellcode vereinfachen. Blenden Sie diese Symbolleiste ein, indem Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken und aus dem Kontextmen die Symbolleiste DEBUGGEN auswhlen.
Abbildung 2.26: Die Symbolleiste Debuggen

142

Auf Fehlersuche mit VBA

Folgende Symbole werden in dieser Symbolleiste von rechts nach links angeboten:

ENTWURFSMODUS: Aktiviert und deaktiviert den Entwurfsmodus. SUB/USERFORM AUSFHREN: Fhrt die aktuelle Prozedur aus, falls sich der Cursor in einer Prozedur befindet; fhrt das UserForm-Formular aus, falls ein UserForm-Formular aktiv ist; fhrt ein Makro aus, falls weder ein Code-Fenster noch ein UserForm-Formular aktiv sind. UNTERBRECHEN: Beendet die Ausfhrung eines Programms und wechselt in den Haltemodus. Stattdessen knnen Sie auch die Taste (Esc) drcken, um den Ablauf des Makros zu stoppen. ZURCKSETZEN: Lscht die Aufrufliste und die Variablen auf Modulebene und beendet das Projekt. HALTEPUNKT EIN/AUS: Setzt oder entfernt einen Haltepunkt in der aktuellen Zeile. Alternativ dazu gengt auch das Drcken der Taste (F9), um einen Haltepunkt zu setzen bzw. zu entfernen. EINZELSCHRITT: Fhrt jeweils genau eine Anweisung im Code aus. Alternativ knnen Sie hier mit der Taste (F8) arbeiten, um einen Code Zeile fr Zeile zu durchlaufen. PROZEDURSCHRITT: Fhrt im Code-Fenster jeweils eine Prozedur oder eine Anweisung im Code aus. PROZEDUR ABSCHLIESSEN: Fhrt die restlichen Zeilen einer Prozedur aus, in der sich der aktuelle Ausfhrungspunkt befindet. LOKAL-FENSTER: Blendet das Lokal-Fenster ein. DIREKTFENSTER: Blendet das Direktfenster ein. Alternativ dazu knnen Sie auch die Tastenkombination (Strg) + (G) drcken, um das Direktfenster einzublenden. BERWACHUNGSFENSTER: Blendet das berwachungsfenster ein. AKTUELLEN WERT ANZEIGEN: Zeigt das Dialogfeld AKTUELLEN WERT ANZEIGEN mit dem aktuellen Wert des ausgewhlten Ausdrucks an. AUFRUFLISTE: Zeigt das Dialogfeld AUFRUFLISTE an, in dem die derzeit aktiven Prozeduraufrufe (Prozeduren in der Anwendung, die gestartet, aber nicht abgeschlossen wurden) angezeigt werden.

143

Die Sprachelemente von VBA

Typische Fehlerquellen in Excel-VBA


Am Ende des Tages lernen Sie noch ein paar typische Fehler kennen, die sich ab und zu einschleichen.

Buchstabendreher
Gerade wenn Sie viel und schnell Quellcode erfassen, dann kommen hin und wieder Buchstabendreher vor und der Editor kann dadurch die Befehle nicht erkennen. Eine kleine Kontrolle vorab: Wenn Sie sich angewhnen, alle Befehle in Kleinschreibweise einzugeben, knnen Sie nach jedem Drcken der Taste (Enter) am Ende einer Zeile prfen, ob die Befehle vom Editor richtig erkannt werden. Die richtigen Befehle werden dann teilweise in Grobuchstaben 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 die Methode Activate falsch geschrieben wurde. Sie erkennen es daran, dass dieser Befehl nicht im ersten Buchstaben auf Gro konvertiert wurde. Dieselbe Meldung wird angezeigt, wenn Sie beispielsweise auf eine Tabelle zugreifen, die es gar nicht gibt.

144

Auf Fehlersuche mit VBA

Abbildung 2.27: Eine recht hufige Meldung

Nicht existente Objekte


Der Laufzeitfehler 1004 wird Sie auch des fteren begleiten. In einem solchen Fall versuchen Sie, auf ein Objekt zuzugreifen, welches es gar nicht gibt. Paradebeispiel hierfr ist das ffnen einer Arbeitsmappe, die auf Ihrer Festplatte nicht existiert. In diesem Fall sagt Ihnen Excel ganz genau, worin der Fehler liegt. Dies muss aber nicht unbedingt immer zutreffen. Auf jeden Fall sollten Sie diese hssliche Fehlermeldung abfangen, indem Sie eine Fehlerbehandlung aufsetzen. So knnte das in Abbildung 2.28 abgebildete Makro wie folgt umgeschrieben werden:
Listing 2.22: Eine Fehlerbehandlungsroutine aufsetzen Sub Mappeffnen() On Error GoTo fehler Workbooks.Open Filename:= _ ("C:\Eigene Dateien\MappeX.xls") 'Weitere Anweisungen

Exit Sub

145

Die Sprachelemente von VBA

fehler: MsgBox "Die Datei konnte nicht gefunden werden", _ vbCritical + vbOKOnly, "FEHLER" End Sub

Abbildung 2.28: Diese Arbeitsmappe existiert nicht.

Mit der Anweisung On Error GoTo fehler knnen Sie die standardmig angezeigte Fehlermeldung wie in Abbildung 2.28 abgebildet unterdrcken und stattdessen eine eigene Fehlermeldung anzeigen. Wird nun von Excel ein Fehler festgestellt, dann wird direkt in den Paragrafen FEHLER verzweigt und die dortigen Aktionen ausgefhrt. Vor den Fehlerparagrafen setzen Sie die Anweisung Exit Sub ein. Dies ist wichtig fr den Fall, dass kein Fehler festgestellt wird. In diesem Fall darf der Fehlerparagraf nicht ausgefhrt werden, d.h. Sie beenden mit dieser Anweisung das Makro auf direktem Wege. Sie knnen die Fehlernummer sowie die Fehlerbeschreibung auch ber das Objekt Err und die Eigenschaften Number und Description abfragen.
MsgBox Err.number & " " & Err.Description

146

Auf Fehlersuche mit VBA

Oft wird auch die Anweisung On Error Resume Next bei Befehlen verwendet, welche eventuell einen Fehler verursachen knnten. In diesem Fall wird nicht weiter auf einen auftretenden Fehler reagiert und dieser ignoriert. Dieser Befehl ist aber meiner Ansicht nach nur in Ausnahmefllen einzusetzen, wie es im folgenden Beispiel demonstriert wird. Stellen Sie sich vor, Sie erstellten eine eigene Symbolleiste per VBA, die Sie nun wieder lschen mchten. Das Erstellen sowie Lschen der Symbolleiste sehen Sie im folgenden Quellcode, der an dieser Stelle nicht weiter erklrt wird. Zum Thema Symbolleisten lernen Sie am 12. Tag mehr.
Listing 2.23: Eine eigene Symbolleiste erstellen und wieder lschen 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 With End Sub

Sub SymbolleisteLschen() Application.CommandBars("TEST").Delete End Sub

147

Die Sprachelemente von VBA

Wenn Sie das Makro SymbolleisteLschen zweimal hintereinander starten, dann bekommen Sie folgende Fehlermeldung angezeigt:

Abbildung 2.29: Eine ziemlich aussagearme Fehlermeldung

Nun, dieser Fehler tritt ein, wenn Sie versuchen, die Symbolleiste TEST zu lschen, obwohl sie bereits schon vorher gelscht wurde. In diesem Fall knnte man das Makro SymbolleisteLschen wie folgt ergnzen.
Listing 2.24: Symbolleiste lschen ohne Fehlermeldung Sub SymbolleisteLschen() On Error Resume Next Application.CommandBars("TEST").Delete End Sub

Nicht verfgbare Eigenschaften und Methoden


Wenn Sie versuchen, fr ein Objekt eine Eigenschaft bzw. eine Methode anzuwenden, die fr dieses Objekt nicht zur Verfgung steht, dann wird diese Absicht mit 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 Fall fehlt aber noch eine Kleinigkeit. Sie mchten den Hintergrund der Zelle frben. Der Hintergrund einer Zelle wird ber das Objekt Interior angesprochen. Die korrekte Anweisung msste also lauten:
ActiveCell.Interior.ColorIndex = 3

148

Auf Fehlersuche mit VBA

Abbildung 2.30: Eigenschaft steht nicht zur Verfgung.

Die verfgbaren Eigenschaften und Methoden knnen Sie entweder direkt nach der Eingabe des Objekts mit anschlieendem Punkt ber das Kontextmen ablesen oder im Objektkatalog nachblttern.

Abbildung 2.31: Die verfgbaren Eigenschaften und Methoden werden im Kontextmen angezeigt.

149

Die Sprachelemente von VBA

2.5
F A

Fragen & Antworten


Diese Fragestellung knnen Sie ber eine For-Each...Next-Schleife beantworten. Im folgenden Makro aus Listing 2.25 werden die Namen der geffneten Arbeitsmappen auf dem Bildschirm ausgegeben.
Listing 2.25: Alle geffneten Arbeitsmappen ausgeben Sub MappenNamenErmitteln() Dim Mappe As Workbook For Each Mappe In Workbooks MsgBox Mappe.Name Next Mappe End Sub

Wie knnen Sie berprfen, welche Arbeitsmappen gerade geffnet sind?

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Workbook. Danach greifen Sie in einer Schleife auf das Auflistungsobjekt Workbooks zu. In diesem Auflistungsobjekt sind alle geffneten Arbeitsmappen verzeichnet, die Sie ber die Eigenschaft Name auslesen und ber die Funktion MsgBox auf dem Bildschirm anzeigen knnen.
F

Wie knnen Sie mithilfe einer Schleife alle installierten, aktivierten Add-Ins ermitteln?
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 Next End Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ AddIn. Danach greifen Sie in einer Schleife auf die AddIns-Auflistung zu und ermitteln die Namen der installierten Add-Ins ber die Eigenschaft Name.

150

Quiz

Wie knnen Sie eine Fehlerbeschreibung anzeigen lassen?


A

Tritt ein Fehler auf, dann knnen Sie die Beschreibung des Fehlers ber die Anweisung Msgbox Err.Description auf dem Bildschirm ausgeben. Dazu mssen Sie einen Haltepunkt im Quellcode setzen und das Makro bis an diesen Haltepunkt durchrennen lassen. Wechseln Sie dann in die Entwicklungsumgebung und geben Sie direkt im Direktfenster die Zeichenfolge =?Variablenname ein.

Wie knnen Sie im Direktfenster den Inhalt einer Variablen ausgeben?


A

2.6
F F F F

Quiz

ber welche Funktion kann man prfen, ob eine Zelle ein Datum enthlt? Wie kann man aus einer For-Each...Next-Schleife springen? ber welche Anweisung kann man eine Meldung im Direktfenster ausgeben? Unterscheidet der Code-Editor zwischen Gro- und Kleinschreibung?

2.7

bung

Zum Abschluss dieses Tages ben Sie das heute Gelernte. Dabei soll folgende Aufgabe gelst werden: Die Namen der Tabellen einer Arbeitsmappe sollen auf der ersten Tabelle dieser Arbeitsmappe in Spalte A eingefgt werden. Lsen Sie diese Aufgabenstellung mithilfe einer For-Each...Next-Schleife. Die Demodatei Sprachelemente.xls finden Sie auf der CD-ROM im Verzeichnis Kap02. Die Lsung fr diese Aufgabe steht im Anhang A.

151

Die Excel-Anwendung einstellen und anpassen

Die Excel-Anwendung einstellen und anpassen

Gestern haben Sie die Sprachelemente von VBA kennen gelernt und einige Makros mithilfe der Testumgebung untersucht. Sie sind jetzt in der Lage, ein Makro Schritt fr Schritt durchzugehen und die Zwischenstnde zu berprfen. Sie knnen mit dem Direktfenster umgehen und haben einen Einblick in hufige Fehlerquellen erhalten. Die Themen heute:

Vollbildansicht einstellen Lang laufende Makros schneller machen Automatische Listen generieren Drag&Drop ein- und ausschalten Add-Ins berprfen Wiedervorlageliste bearbeiten Sonstige Einstellmglichkeiten in Excel

Standardmig ist Excel so eingestellt, dass Sie die Anwendung fr die meisten Zwecke optimal einsetzen knnen. Sie haben aber die Mglichkeit, die Anwendung Ihren Wnschen anzupassen. Dabei knnen Sie unter anderem das Erscheinungsbild in Excel ndern, indem Sie bestimmen, welche Objekte angezeigt werden und welche nicht. Kurzum, Sie knnen alle Einstellungen von Excel ber den Einsatz von VBA anpassen, die Sie im Men EXTRAS unter dem Befehl OPTIONEN finden. Alle Makros, die Sie an diesem Tag lernen, knnen Sie auf der mitgelieferten CD-ROM im Verzeichnis Kap03 in der Arbeitsmappe Applikation.xls nachblttern.

3.1

Vollbildansicht einstellen

Wenn Sie Daten in Excel eingeben mchten, sollten mglichst viel Tabellen und wenige Symbolleisten sowie sonstiger Schnickschnack zu sehen sein. Sie knnen in Excel daher die Ansicht GANZER BILDSCHIRM aus dem Men ANSICHT auswhlen.

154

Vollbildansicht einstellen

Die Vollbildansicht knnen Sie aber auch ber den Einsatz eines Makros wie folgt einstellen:
Listing 3.1: Vollbildansicht einstellen Sub AnsichtGanzerBildschirm() Application.DisplayFullScreen = True End Sub

Setzen Sie die Eigenschaft DisplayFullScreen auf den Wert True, um die Vollbildansicht in Excel anzuzeigen. Um die Ansicht wieder zu beenden, setzen Sie die Eigenschaft DisplayFullScreen wieder auf den Wert False.
Listing 3.2: Vollbildansicht beenden Sub NormalAnsichtEinstellen() Application.DisplayFullScreen = False End Sub

Wie aber knnen Sie dieses Feature in der Praxis einsetzen? Nun, stellen Sie sich einmal vor, Sie haben in einer Arbeitsmappe ein Tabellenblatt, in das Sie immer wieder neue Daten eingeben mssen. Optimal wre es nun, dass die Vollbildansicht immer dann eingestellt wird, wenn Sie diese Tabelle aktivieren. Beim Verlassen dieser Tabelle soll dann wieder die Normalansicht eingestellt werden. Um diesen Automatismus einzustellen, befolgen Sie die nachstehenden Arbeitsschritte: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Im Projekt-Explorer klicken Sie die Tabelle doppelt an, in die Sie diese Funktion einfgen mchten. 3. Whlen Sie im Code-Fenster aus dem ersten Dropdown-Feld den Befehl WorkSheet. 4. Aus dem zweiten Dropdown-Feld whlen Sie das Ereignis Activate. Danach whlen Sie zustzlich das Ereignis Deactivate. 5. Ergnzen Sie nun die beiden Ereignisse wie folgt:
Listing 3.3: Makros automatisch ausfhren lassen bei Blatt(de)aktivierung Private Sub Worksheet_Activate() AnsichtGanzerBildschirm End Sub

155

Die Excel-Anwendung einstellen und anpassen

Private Sub Worksheet_Deactivate() NormalAnsichtEinstellen End Sub

Das Ereignis Worksheet_Activate tritt automatisch ein, wenn Sie die Tabelle aktivieren. Innerhalb des Ereignisses rufen Sie das Makro AnsichtGanzerBildschirm auf, das Sie vorher im MODUL1 erfasst haben. Das Ereignis Worksheet_DeActivate tritt dann automatisch ein, wenn Sie die Tabelle verlassen. Innerhalb des Ereignisses rufen Sie das Makro NormalansichtEinstellen 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 erwhnt, knnen Sie selbst bestimmen, wie Excel bestimmte Objekte, z.B. Kommentare, Gitternetzlinien, Grafiken usw., anzeigt.

Abbildung 3.1: Die Registerkarte Ansicht

156

Weitere Einstellungen der Ansicht

Whlen Sie nun das Dialogfeld OPTIONEN aus dem Men EXTRAS und wechseln Sie auf die Registerkarte ANSICHT. Alle Einstellungen, die Sie auf dieser Registerkarte sehen, knnen Sie ber den Einsatz von VBA einstellen. Im Listing werden folgende Einstellungen getroffen:

Die Gitternetzlinien werden deaktiviert. Die Zeilen- und Spaltenberschriften 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:

Abbildung 3.2: Die normale Ansicht auf eine Tabelle

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

157

Die Excel-Anwendung einstellen und anpassen

End With Application.DisplayStatusBar = False End Sub

Mithilfe der Eigenschaft DisplayGridLines knnen Sie die Anzeige der Gitternetzlinien in einer Tabelle ein- und ausschalten. Setzen Sie diese Eigenschaft auf den Wert True, um die Gitternetzlinien fr die aktive Tabelle anzuzeigen. ber die Eigenschaft DisplayHeadings knnen Sie bestimmen, ob die Zeilen- und Spaltenberschriften in der Tabelle angezeigt werden sollen. Setzen Sie diese Eigenschaft auf den Wert False, um die Zeilen- und Spaltenberschriften auszublenden. Die Eigenschaft DisplayZeros sorgt dafr, dass Nullwerte in der aktiven Tabelle nicht angezeigt werden, sofern Sie diese Eigenschaft auf den Wert False setzen. ber die Eigenschaften DisplayHorizontalScrollBar bzw. DisplayVertical ScrollBar knnen Sie festlegen, ob die Bildlaufleisten angezeigt werden sollen. Mchten Sie die Registerkarten in einer Arbeitsmappe verbergen, dann setzen Sie die Eigenschaft DisplayWorkbookTabs auf den Wert False. Sie knnen dann nur noch ber die Tastenkombination (Strg) + (Bild_) bzw. mit (Strg) + (Bild_) auf eine andere Tabelle gelangen. Diese Einstellung wird oft vorgenommen, wenn die Arbeitsmappe eine einzige Tabelle enthlt. Mithilfe der Eigenschaft DisplayStatusBar knnen Sie festlegen, ob die Statusleiste am unteren Bildrand angezeigt werden soll. Wenn nicht, setzen Sie diese Eigenschaft auf den Wert False.

Abbildung 3.3: Einige Standardelemente wurden ausgeblendet.

158

Lang laufende Makros schneller machen

Wie Sie sehen, sind einige Eigenschaften nur fr die jeweils aktive Tabelle gltig, andere jedoch fr die gesamte Arbeitsmappe.

3.3

Lang laufende Makros schneller machen

Bei aufwndigen Makros wenn beispielsweise mehrere Arbeitsmappen geffnet sind und einige Tabellen mit Daten gefllt werden verlngert sich die Laufzeit, sofern Sie nicht eigene Einstellungen vornehmen.

Bildschirmaktualisierung ein- und ausschalten


Standardmig ist in Excel die Bildschirmaktualisierung eingeschaltet, d.h. alle Aktionen, wie beispielsweise ein Tabellenwechsel oder das Abarbeiten von Zeilen, werden whrend des Makroablaufs am Bildschirm angezeigt. Dies kostet Zeit und durch die stndige Aktualisierung des Bildschirms leiden Ihre Augen und der Bildschirm. Schalten Sie daher zu Beginn des Makros die Bildschirmaktualisierung aus und am Ende des Makros wieder ein. Der Makrorahmen dafr sieht wie folgt aus:
Listing 3.5: Bildschirmaktualisierung ein- und ausschalten Sub Bildschirmaktualisierung() Application.ScreenUpdating = False 'Weitere Anweisungen

Application.ScreenUpdating = True End Sub

Setzen Sie die Eigenschaft ScreenUpdating auf den Wert False, um die Aktualisierung des Bildschirms abzuschalten. Whrend die Bildschirmaktualisierung ausgeschaltet ist, wird lediglich eine Sanduhr am Bildschirm angezeigt, alle Aktionen des Makros werden im Hintergrund ausgefhrt. Weisen Sie der Eigenschaft ScreenUpdating den Wert True zu, um die Bildschirmaktualisierung wieder zuzulassen.

159

Die Excel-Anwendung einstellen und anpassen

In der Praxis knnen Sie die Bildschirmaktualisierung in einem Makro mehrere Male ein- und ausschalten, um bestimmte Zwischenstnde im Makro anzuzeigen. Damit beugen Sie auch einer Ungeduld des Anwenders vor, wenn dieser minutenlang nur die Sanduhr angezeigt bekommt und der Eindruck entsteht, das Makro bzw. die Anwendung sei abgestrzt.

Die Berechnung ein- und ausschalten


Jede Eingabe in eine Excel-Tabelle bedeutet automatisch, dass die Tabelle neu berechnet wird. Diese Funktion ist auch dann sinnvoll, wenn sich mehrere Zellen ber Formeln aufeinander beziehen. Bei der Programmierung ist dieser Automatismus aber ein recht starker Bremser. Es empfiehlt sich daher, die automatische Berechnung zu Beginn des Makros aus- und am Ende des Makros wieder einzuschalten. Makros laufen somit erheblich schneller! In Listing 3.6 sehen Sie den Makrorahmen fr das Aus- und Einschalten der automatischen Berechnung in Excel:
Listing 3.6: Die automatische Berechnung aus- und einschalten Sub BerechnungAusUndEin() Application.Calculation = xlManual 'Weitere Aktionen

Application.CalculateBeforeSave = True Application.Calculation = xlAutomatic End Sub

Weisen Sie zu Beginn des Makros der Eigenschaft Calculation die Konstante xlManual zu, um die automatische Neuberechnung von Excel zu unterdrcken. Setzen Sie die Eigenschaft CalculateBeforeSave auf den Wert True, damit die Arbeitsmappe, auch wenn die Eigenschaft Calculation auf xlManual gesetzt ist, vor dem Speichern neu berechnet wird. Am Ende des Makros weisen Sie der Eigenschaft Calculation die Konstante xlAutomatic zu, um die Berechnung wieder zu aktivieren.

160

Lang laufende Makros schneller machen

Statuszeile einsetzen
Gerade bei lnger laufenden Makros ist es wichtig, den Anwender whrend der Laufzeit des Makros nicht im Regen stehen zu lassen. Da whrend eines Makros kein paralleles Arbeiten mit Excel mglich ist, sollten Sie den Anwender durch die Statusleiste ber die einzelnen Schritte des Makros informieren. Das Makro in Listing 3.7 zeigt, wie Sie die Statusleiste einsetzen knnen:
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 = False End Sub

Sorgen Sie im ersten Schritt dafr, dass die Statusleiste sicherheitshalber auch eingeblendet wird. Dazu setzen Sie die Eigenschaft DisplayStatusBar auf den Wert True. Danach geben Sie ber die Eigenschaft StatusBar einen beliebigen Text ein, der in der Statusleiste angezeigt werden soll. Im Anschluss daran arbeiten Sie eine Schleife ab, die in diesem Fall fr eine beliebige Aufgabe stehen soll. Danach

161

Die Excel-Anwendung einstellen und anpassen

ndern Sie den Text der Statuszeile, indem Sie der Eigenschaft StatusBar einen neuen Text zuweisen. Setzen Sie am Ende des Makros die Eigenschaft StatusBar auf den Wert False, um die Steuerung der Statusleiste wieder an Excel zurckzugeben. Im nchsten Beispiel werden Sie die Statuszeile einsetzen, um eine Suche nach Excel-Dateien zu dokumentieren. Dabei werden Excel-Arbeitsmappen in einem bestimmten Verzeichnis gesucht und die Namen der gefundenen Arbeitsmappen in der Statusleiste angezeigt. Den Code fr diese Aufgabenstellung sehen Sie in Listing 3.8:
Listing 3.8: Die Suchergebnisse in der Statusleiste anzeigen Sub DateienListen() Dim NchsteDatei As String Dim i As Integer Const DateiSuche = "C:\Eigene Dateien" Application.StatusBar = "Suchen in " & DateiSuche & "\" NchsteDatei = Dir(DateiSuche & "\" & "*.xls") i = 0 Do Until NchsteDatei = "" i = i + 1 Cells(i, 1).Value = DateiSuche & "\" & NchsteDatei Application.StatusBar = DateiSuche & "\" & NchsteDatei NchsteDatei = Dir() Loop Application.StatusBar = False End Sub

Definieren Sie zu Beginn des Makros das zu durchsuchende Verzeichnis in einer Konstanten. Danach geben Sie den Namen des Verzeichnisses in der Statusleiste aus. ber die Funktion Dir suchen Sie jetzt die erste Excel-Datei. Dabei bergeben Sie der Funktion die Information, in welchem Verzeichnis gesucht werden soll, und die Dateiendung *.xls. Damit wird die erste Excel-Datei im angegebenen Verzeichnis ermittelt. In einer anschlieenden Schleife wiederholen Sie den Suchvorgang, bis Sie alle Excel-Dateien im angegebenen Verzeichnis gefunden haben. Innerhalb der Schleife geben Sie den Namen der jeweils gefundenen Arbeitsmappe in der

162

Lang laufende Makros schneller machen

Tabelle ber die Eigenschaft Cells aus, wobei Sie das erste Argument dieser Eigenschaft dynamisch halten und bei jedem Schleifendurchlauf um den Wert 1 erhhen. Das Spaltenargument dieser Eigenschaft wird konstant auf dem Wert 1 gehalten, was soviel bedeutet, dass die Spalte A angesprochen wird. Zustzlich schreiben Sie die Namen der gefundenen Arbeitsmappen ber die Eigenschaft StatusBar in die Statusleiste. Wiederholen Sie den Suchvorgang, indem Sie die Funktion Dir erneut am Ende der Schleife einsetzen. Dabei mssen Sie die Argumente der Funktion Dir nicht erneut formulieren. Setzen Sie am Ende des Makros die Eigenschaft StatusBar auf den Wert False, um die Steuerung der Statusleiste wieder an Excel zurckzugeben.

Abbildung 3.4: Die Suchergebnisse werden in der Tabelle sowie in der Statusleiste vermerkt.

Standardmeldungen abschalten
Wenn Sie beispielsweise eine Tabelle aus Ihrer Arbeitsmappe entfernen mchten, werden Sie gefragt, ob Sie diesen Vorgang wirklich durchfhren mchten. Gerade solche Standardmeldungen sollten Sie beim Starten von Makros unterdrcken, damit Sie diese nicht wegklicken mssen. Im folgenden Beispiel wird eine Tabelle ohne Rckfrage gelscht:

163

Die Excel-Anwendung einstellen und anpassen

Listing 3.9: Das aktive Tabellenblatt wird ohne Nachfrage gelscht Sub MeldungenUnterdrcken() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub

Setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um Standardmeldungen in Excel zu unterdrcken. Am Ende des Makros sollten Sie diese Einstellung jedoch wieder rckgngig machen, weil Excel dies nicht automatisch macht.

3.4

Automatische Listen generieren

Sicher kennen Sie in Excel das Ausfllkstchen, ber das Sie blitzschnell ganze Datenreihen anlegen knnen. Ein Beispiel fr eine Liste, welche bereits fest in Excel integriert ist, ist die Tagesliste. Schreiben Sie einmal das Wort Montag in eine Zelle und ziehen Sie das Ausfllkstchen dieser Zelle nach rechts.

Abbildung 3.5: Die automatisch integrierte Liste mit den Tagesnamen

Weitere benutzerdefinierte Listen knnen Sie per Makro einfgen.

Benutzerdefinierte Liste aus Makro erzeugen


Im nchsten Beispiel wird eine kleine Lnderliste als benutzerdefinierte Liste angelegt. Dabei werden die einzelnen Listeneintrge direkt im Makro angegeben. Der Quellcode fr diese Aufgabe lautet:

164

Automatische Listen generieren

Listing 3.10: Eine benutzerdefinierte Liste anlegen Sub ListeEinfgen01() Application.AddCustomList Array _ ("Deutschland", "Spanien", "Italien", "Frankreich", "Polen") End Sub

Legen Sie mit der Methode AddCustomList eine neue benutzerdefinierte Liste in Excel an. Dabei geben Sie die einzelnen Listeneintrge ber die Funktion Array bekannt. Trennen Sie jeden einzelnen Listeneintrag mit einem Komma und setzen Sie die einzelnen Listeneintrge in doppelte Hochkommata. Starten Sie das Makro aus Listing 3.10. und berprfen Sie das Ergebnis, indem Sie aus dem Men EXTRAS den Befehl OPTIONEN whlen und auf die Registerkarte BENUTZERDEFINIERTE LISTEN wechseln.

Abbildung 3.6: Die benutzerdefinierte Liste wurde angelegt.

Benutzerdefinierte Liste aus Zelleninhalten erzeugen


Um eine benutzerdefinierte Liste zu erstellen, knnen Sie auch auf eine bereits erfasste Liste in einer Tabelle zugreifen und diese dann als benutzerdefinierte Liste angeben. Um diese Mglichkeit nachzuvollziehen, geben Sie in einer neuen Tabelle in Spalte A ein paar Namen ein. Orientieren Sie sich dabei an Abbildung 3.7.

165

Die Excel-Anwendung einstellen und anpassen

Abbildung 3.7: Diese Namen sollen in eine benutzerdefinierte Liste transferiert werden.

Erfassen Sie nun das folgende Makro, um diese Namen in eine benutzerdefinierte Liste einzufgen:
Listing 3.11: Eine Liste ber einen Zellenbezug anlegen Sub ListeEinfgen02() Application.AddCustomList _ ListArray:=Sheets("Tabelle5").Columns("A:A") End Sub

Abbildung 3.8: Die benutzerdefinierte Liste wurde aus einer Tabelle bernommen und angelegt.

166

Drag&Drop ein- und ausschalten

Wenden Sie die Methode AddCustomList an, um eine benutzerdefinierte Liste anzulegen. Damit Excel wei, dass es in diesem Fall die einzelnen Eintrge aus einer Tabelle bernehmen soll, geben Sie im Argument ListArry die Spalte A der TABELLE5 an. Starten Sie das Makro aus Listing 3.11 und kontrollieren Sie das Ergebnis.

3.5

Drag&Drop ein- und ausschalten

Die gerade beschriebene Funktion des Auto-Ausfllens ber benutzerdefinierte Listen ist nur dann mglich, wenn Sie im Men EXTRAS unter dem Befehl OPTIONEN auf der Registerkarte BEARBEITEN die Drag&Drop-Funktion aktiviert haben. Mchten Sie Drag&Drop nicht zulassen, knnen Sie diese Einstellung auch dynamisch ber das folgende VBA-Makro erfassen:
Listing 3.12: Drag&Drop ausschalten Sub AusschaltenDragUndDrop() Application.CellDragAndDrop = False End Sub

Setzen Sie die Eigenschaft CellDragAndDrop auf den Wert False, wenn Sie verhindern mchten, dass das Ziehen und Ablegen von Zellen durchgefhrt werden kann. Indem Sie diese Eigenschaft auf den Wert True setzen, wird diese Art der Zellenbearbeitung wieder zugelassen.

3.6

Add-Ins berprfen

Bestimmte Tabellenfunktionen sind standardmig in Excel nicht direkt verfgbar. Nur ber das Einbinden von zustzlichen Add-Ins knnen Sie diese Funktionen einsetzen. Daher sollten Sie vor dem Gebrauch einer Tabellenfunktion aus einem Add-In prfen, ob das entsprechende Add-In bereits eingebunden ist. Im folgenden Makro werden alle zurzeit eingebundenen Add-Ins in einer Bildschirmmeldung angezeigt:

167

Die Excel-Anwendung einstellen und anpassen

Listing 3.13: Auflistung der eingebundenen Add-Ins Sub WelcheAddInsSindInstalliert() Dim AddI As AddIn Dim s As String For Each AddI In Application.AddIns If AddI.Installed = True Then s = s & Chr(13) _ & AddI.Name & " --> " & AddI.FullName Next MsgBox "Folgende Add-Ins sind derzeit installiert:" & _ Chr(13) & s, vbInformation + vbOKOnly End Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ AddIn. In einer Schleife arbeiten Sie das Auflistungsobjekt AddIns ab, in dem alle Add-Ins verzeichnet sind, die sich momentan im Add-Ins-Manager befinden. ber eine IfAbfrage und der Eigenschaft Installed berprfen Sie, ob das jeweilige Add-In eingebunden ist. Wenn ja, dann sammeln Sie die Namen sowie deren Speicherpfad in der Variablen s. Um diese beiden Informationen zu erhalten, setzen Sie die Eigenschaften Name und FullName ein. Geben Sie die so gesammelten Informationen am Ende des Makros auf dem Bildschirm aus.
Abbildung 3.9: Add-Ins und deren Installationspfad werden ausgegeben.

3.7

Wiedervorlageliste bearbeiten

Wenn Sie in Excel das Men DATEI herunterklappen, sehen Sie ganz unten im Men eine Auflistung der zuletzt geffneten Arbeitsmappen. Die Liste der zuletzt geffneten Dateien knnen Sie verndern. So knnen Sie beispielsweise dafr sorgen, dass dort berhaupt keine Arbeitsmappen mehr angezeigt werden. Wie das genau aussieht, knnen Sie im Folgenden sehen:

168

Wiedervorlageliste bearbeiten

Abbildung 3.10: Die Wiedervorlageliste von Excel Listing 3.14: Die Wiedervorlageliste verbergen Sub WiedervorlageListeZurcksetzen() With Application .DisplayRecentFiles = False End With End Sub

Setzen Sie die Eigenschaft DisplayRecentFiles auf den Wert False, um die Liste der zuletzt geffneten Dateien im Men DATEI nicht anzuzeigen. Mchten Sie die Wiedervorlageliste in Zukunft wieder anzeigen und bestimmen, wie viele Arbeitsmappen dort maximal angezeigt werden sollen, dann starten Sie das Makro aus Listing 3.15:

169

Die Excel-Anwendung einstellen und anpassen

Listing 3.15: Die Wiedervorlageliste festlegen Sub WiedervorlageListeFestlegen() With Application .DisplayRecentFiles = True .RecentFiles.Maximum = 4 End With End Sub

ber die Auflistung RecentFiles bekommen Sie Zugriff auf die zuletzt geffneten Arbeitsmappen. Die maximale Anzahl der Eintrge in der Wiedervorlageliste der zuletzt geffneten Dateien kann zwischen 0 und 9 eingestellt werden. Ein wenig problematisch ist Folgendes: Wird eine Arbeitsmappe in der Wiedervorlageliste angezeigt, die Sie in der Zwischenzeit gelscht bzw. in ein anderes Verzeichnis verschoben haben, dann erhalten Sie eine Fehlermeldung, wenn Sie versuchen, diese Arbeitsmappe ber die Wiedervorlageliste zu ffnen.

Abbildung 3.11: Die Arbeitsmappe kann nicht gefunden werden.

Schreiben Sie daher ein Makro, welches jeden einzelnen Eintrag in der Wiedervorlageliste berprft. Sollte die dort angegebene Arbeitsmappe nicht mehr auffindbar sein, wird der dazugehrige Eintrag aus der Wiedervorlageliste entfernt. Das Makro fr die Lsung dieser Aufgabenstellung sehen Sie in Listing 3.16:
Listing 3.16: Die Vorlageliste bereinigen Sub VorlageListeLschen() Dim Wiedervorlage As RecentFile For Each Wiedervorlage In Application.RecentFiles If Dir(Wiedervorlage.Name) = "" Then Wiedervorlage.Delete End If Next Wiedervorlage End Sub

170

Sonstige Einstellmglichkeiten in Excel

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ RecentFile. Danach durchlaufen Sie jeden einzelnen Eintrag in der Wiedervorlageliste und berprfen mithilfe der Funktion Dir, ob die so verzeichnete Arbeitsmappe berhaupt noch verfgbar ist. Wenn nicht, meldet die Funktion Dir eine leere Zeichenfolge zurck. In diesem Fall wenden Sie die Methode Delete an, um den Eintrag aus der Wiedervorlageliste zu entfernen.

3.8

Sonstige Einstellmglichkeiten in Excel

Zum Abschluss dieses Tages lernen Sie noch einige weitere Einstellungen in Excel kennen, die Sie ber den Einsatz von VBA einstellen knnen.

Allgemeine Einstellungen
Rufen Sie zu diesem Zweck einmal das Dialogfeld OPTIONEN aus dem Men EXTRAS auf und wechseln Sie auf die Registerkarte ALLGEMEIN.

Abbildung 3.12: Allgemeine Optionen einstellen

Im unteren Abschnitt des Dialogs knnen Sie ganz allgemeine Dinge, wie die Anzahl der Tabellen, die mit jeder neuen Arbeitsmappe angeboten werden sollen, die Standardschriftart, den Standardspeicherort von Dateien und mehr einstellen.

171

Die Excel-Anwendung einstellen und anpassen

In der nchsten Aufgabe sollen die folgenden Einstellungen per VBA durchgefhrt werden:

12 Bltter in jeder neuen Arbeitsmappe anbieten Die Standardschriftart lautet COURIER in der Schriftgre 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 knnen:
Listing 3.17: Allgemeine Einstellungen vornehmen Sub AllgemeineEinstellungenVornehmen() With Application .UserName = "Held" .StandardFont = "Courier" .StandardFontSize = "11" .DefaultFilePath = "C:\Eigene Dateien\Excel" .SheetsInNewWorkbook = 12 End With End Sub

Mithilfe der Eigenschaft UserName knnen Sie den Anwendernamen in Excel bekannt geben. Dieser Name erscheint dann auch in den Dokumenteigenschaften jeder Arbeitsmappe, die Sie zuknftig anlegen. Die Dokumenteigenschaften knnen Sie abrufen, indem Sie aus dem Men DATEI den Befehl EIGENSCHAFTEN auswhlen. ber die Eigenschaft StandardFont knnen Sie die Standardschriftart von Excel festlegen. Die Eigenschaft StandardFontSize bestimmt die Standardschriftgre. Bereits anders formatierte Zellen bleiben von dieser Einstellung unberhrt. Diese Einstellung gilt lediglich fr neue Arbeitsmappen. Die Eigenschaft DefaultFilePath gibt Aufschluss darber, welches Verzeichnis beim ffnen von Arbeitsmappen standardmig angesteuert und im Dialogfeld FFNEN angezeigt werden soll. ber die Eigenschaft SheetsInNewBook knnen Sie die Anzahl der Tabellen festlegen, die beim Einfgen einer neuen Arbeitsmappe standardmig angeboten werden. Sie haben dabei die Mglichkeit, einen Wert zwischen 1 und 255 einzutragen.

172

Sonstige Einstellmglichkeiten in Excel

Die Einstellungen werden erst nach einem erneuten Excel-Start wirksam!

Zoom einstellen
In Excel haben Sie die Mglichkeit, Ihre Tabellen ber ein eingebautes Zoom zu vergrern bzw. zu verkleinern. Dazu setzen Sie die Eigenschaft Zoom ein, der Sie einen Zoomfaktor zwischen 10% und 400% bergeben knnen. Ein eingestelltes Zoom von 100% entspricht dabei einer Ansicht der Tabelle im Verhltnis 1:1. Im folgenden Makro werden alle Tabellenbltter einer Arbeitsmappe einheitlich auf 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 = 80 Next i End Sub

Aktivieren Sie in einer Schleife eine Tabelle nach der anderen und stellen Sie das Zoom einheitlich auf 80% ein.

Abbildung 3.13: Das Zoom wurde auf allen Tabellen gleich eingestellt.

173

Die Excel-Anwendung einstellen und anpassen

Aufenthaltsbereich festlegen
ber die Eigenschaft ScrollArea knnen Sie den Aufenthaltsbereich eines Anwenders in einer Tabelle genau festlegen. Sie haben dabei die Mglichkeit, einen ganz bestimmten Zellenbereich anzugeben. Im folgenden Beispiel darf ein Anwender sich nur im Bereich B4:G15 auf der TABELLE6 aufhalten. Es wird ihm nicht gelingen, den Mauszeiger auf eine Zelle auerhalb dieses Bereiches zu setzen. Auch das Bettigen 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 fr Ihren Anwender fest, indem Sie der Eigenschaft ScrollArea die genauen Zellenkoordinaten sowie den Tabellennamen bekannt geben. Der Aufenthaltsbereich muss nach jedem ffnen der Arbeitsmappe neu eingestellt werden. Leider behlt Excel diese Einstellung nach dem Beenden und Speichern der Arbeitsmappe nicht bei. Sie knnen Excel aber austricksen! Befolgen Sie die folgenden Arbeitsschritte, um den Aufenthaltsbereich dauerhaft einzustellen: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Fhren Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Im Code-Fenster whlen Sie aus dem ersten Dropdown-Men den Eintrag WORKBOOK. 4. Nun wird das Ereignis Workbook_Open eingefgt, welches Sie wie folgt ergnzen.

174

Fragen & Antworten

Listing 3.20: Den Aufenthaltsbereich immer wieder neu einstellen Private Sub Workbook_Open() AufenthaltsbereichFestlegen End Sub

Das Ereignis Workbook_Open wird bei jedem ffnen der Arbeitsmappe automatisch ausgefhrt. Ein idealer Zeitpunkt, um die ScrollArea festzulegen!

Abbildung 3.14: Nach dem ffnen der Arbeitsmappe knnen Sie sich nur im Bereich B4:G15 aufhalten.

Erfahren Sie mehr ber den Einsatz von Ereignissen am 7. Tag.

3.9
F A

Fragen & Antworten


ber das folgende Makro werden alle Arbeitsmappen, die in der Vorlageliste stehen, in einem Meldungsfenster angezeigt:
Listing 3.21: Alle Arbeitsmappen der Vorlageliste werden ausgegeben Sub VorlageListeAnzeigen() Dim Wiedervorlage As RecentFile Dim s As String For Each Wiedervorlage In Application.RecentFiles

Wie knnen Sie auf die Wiedervorlageliste von Excel zugreifen?

175

Die Excel-Anwendung einstellen und anpassen

s = s & Wiedervorlage.Name & Chr(13) Next Wiedervorlage MsgBox s End Sub F

Wie knnen 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 VerzeichnisZurckgeben() Dim s As String s = Application.ActiveWorkbook.Path MsgBox s End Sub

ber die Eigenschaft Path knnen Sie den Speicherpfad der aktiven Arbeitsmappe ermitteln.
F

Wie knnen Sie die Registerkarten der Tabellen verstecken?


A

ber die Anweisung ActiveWindow.DisplayWorkbookTabs = False

3.10 Quiz
F F F

Wie kann man die Bildschirmaktualisierung abschalten? Was muss man beachten, wenn man die Statuszeile einsetzen und eigene Meldungen dort ausgeben mchte? Wie kann man Standardmeldungen in Excel abschalten?

3.11 bung
In dieser bung sollen Sie berprfen, ob das Add-In SOLVER bereits geladen ist. Die Lsung dieser Aufgabe finden Sie im Anhang A.

176

Auf Arbeitsmappen zugreifen DateiOperationen

Auf Arbeitsmappen zugreifen Datei-Operationen

Gestern haben Sie einen Einblick erhalten, welche Einstellungen Sie in Excel vornehmen knnen. Unter anderem haben Sie gelernt, wie Sie Makros noch schneller machen und bestimmte Objekte in der Excel-Anwendung ein- und ausblenden knnen. Die Themen heute:

Arbeitsmappen ffnen Arbeitsmappen speichern Arbeitsmappen schlieen Arbeitsmappen anlegen Arbeitsmappen zusammenfhren Arbeitsmappen entfernen Die Dokumenteigenschaften Verknpfungen in Arbeitsmappen

Die Arbeitsmappe wird durch das Objekt Workbook angesprochen. Fr dieses Objekt stehen die zu erwartenden Methoden wie das ffnen, Speichern, Schlieen, Lschen und weitere zur Verfgung. Lernen Sie nun anhand einiger Praxisaufgaben den Einsatz dieser Methoden kennen. Alle Makrobeispiele knnen Sie in der Arbeitsmappe Mappe.xls im Verzeichnis Kap04 auf der mitausgelieferten CD-ROM nachschlagen.

4.1

Arbeitsmappen ffnen

Als allererstes Beispiel werden Sie erfahren, wie Sie eine Arbeitsmappe ffnen knnen. 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 knnen Sie den Namen der Arbeitsmappe angeben, welche Sie ffnen mchten.

178

Arbeitsmappen ffnen

Das Argument UpdateLinks legt fest, ob ev. in der Arbeitsmappe enthaltene Verknpfungen aktualisiert werden sollen oder nicht. Sicher haben Sie auch schon einmal beim ffnen einer Arbeitsmappe die Meldung erhalten, ob Sie die Verknpfungen in der Arbeitsmappe aktualisieren mchten oder nicht. Diese Abfrage knnen Sie unterdrcken, indem Sie ein entsprechendes Argument 03 einsetzen. Die Bedeutung der verschiedenen Werte entnehmen Sie der folgenden Tabelle:
Konstante
0 1 2 3

Bedeutung Keine Aktualisierung von Bezgen Aktualisierung von externen Bezgen, jedoch nicht von Fernbezgen Aktualisierung von Fernbezgen, jedoch nicht von externen Bezgen Aktualisierung von externen Bezgen und Fernbezgen

Tabelle 4.1: Die Konstanten fr das Argument UpdateLinks

Setzen Sie das Argument ReadOnly auf den Wert True, wenn Sie die Arbeitsmappe schreibgeschtzt ffnen mchten. Der Anwender hat dann keine Chance, nderungen an dieser Arbeitsmappe vorzunehmen. Das Argument Format kommt dann zum Einsatz, wenn Sie eine Textdatei ffnen mchten. ber dieses Argument geben Sie das Trennzeichen an, welches in der Textdatei verwendet wird. Wenn dieses Argument nicht angegeben ist, wird das aktuelle Trennzeichen verwendet. Folgende Mglichkeiten stehen dabei zur Verfgung.
Wert
1 2 3 4 5 6

Trennzeichen Tabstopps Kommata Leerzeichen Semikolons Keine Benutzerdefiniertes Trennzeichen

Tabelle 4.2: Die Konstanten fr das Argument Format

179

Auf Arbeitsmappen zugreifen Datei-Operationen

Das Argument Password muss dann gesetzt werden, wenn Sie versuchen, eine kennwortgeschtzte Arbeitsmappe zu ffnen. In diesem Argument geben Sie das Passwort ein. Wird dieses Argument nicht angegeben, so erscheint beim ffnen einer kennwortgeschtzten Arbeitsmappe ein Dialog, in dem Sie das Passwort eingeben mssen. Ohne Kenntnis dieses Passworts haben Sie keine Mglichkeit, die Arbeitsmappe zu ffnen. Beim Argument WriteResPassword ist eine Zeichenfolge gemeint, die das zum Schreiben in eine Arbeitsmappe mit Schreiberlaubnis erforderliche Kennwort enthlt. Fehlt dieses Argument und ist ein Kennwort fr die Arbeitsmappe erforderlich, wird der Benutzer zur Kennworteingabe aufgefordert. Das Argument IgnoreReadOnlyRecommended wird auf den Wert True gesetzt, wenn Excel keine Meldung anzeigen soll, die den schreibgeschtzten Zugriff empfiehlt (falls die Arbeitsmappe mit der Option Schreibschutz empfehlen gespeichert wurde). Wenn es sich um eine Textdatei handelt, wird mit dem Argument Origin der Dateiursprung angegeben. Dies kann eine der folgenden XlPlatform-Konstanten sein: xlMacintosh, xlWindows oder xlMSDOS. Wenn dieses Argument nicht angegeben ist, wird das aktuelle Betriebssystem verwendet. Das Argument Delimiter wird nur gesetzt, wenn es sich um eine Textdatei handelt und das Argument Format den Wert 6 hat. Dabei gibt das Argument Delimiter die Zeichenfolge des zu verwendenden Trennzeichens an. Die restlichen Argumente der Methode Open sind in der Praxis eher weniger im Einsatz und knnen bei Bedarf in der Online-Hilfe nachgelesen werden. ben Sie nun den Einsatz der Methode Open anhand einiger Praxisbeispiele.

Arbeitsmappe ffnen (ohne Aktualisierung)


In der folgenden Aufgabe soll eine Arbeitsmappe in einem bestimmten Verzeichnis geffnet werden. Dabei sollen die in der Arbeitsmappe enthaltenen Verknpfungen beim ffnen nicht aktualisiert werden. Das Makro fr diese Aufgabe sehen Sie in Listing 4.1:
Listing 4.1: Eine Arbeitsmappe ohne Aktualisierung von Verknpfungen ffnen Sub Arbeitsmappeffnen() Const LW = "C:\" Const Pfad = "C:\Eigene Dateien"

180

Arbeitsmappen ffnen

ChDrive LW ChDir Pfad On Error GoTo fehler Workbooks.Open Filename:="Mappe1.xls", UpdateLinks:=0 Exit Sub fehler: MsgBox "Die angegebene Arbeitsmappe konnte nicht gefunden werden!" End Sub

Im ersten Schritt legen Sie ber den Einsatz von Konstanten fest, auf welchem Laufwerk bzw. in welchem Verzeichnis sich die zu ffnende Arbeitsmappe befindet. ber die Anweisung ChDrive wechseln Sie auf das gewnschte Laufwerk. Sie knnen sich nicht sicher sein, dass Sie automatisch schon im richtigen Verzeichnis stehen und setzen daher die Anweisung ChDir ein, um ein bestimmtes Verzeichnis einzustellen. Wenden Sie anschlieend die Methode Open an, um die Arbeitsmappe zu ffnen. Im Argument UpdateLinks geben Sie den Wert 0 an, was soviel bedeutet, dass die Verknpfungen zu anderen Arbeitsmappen beim ffnen nicht aktualisiert werden. ber die Anweisung On Error GoTo fehler stellen Sie sicher, dass das Makro nicht abstrzt, sollte die angegebene Arbeitsmappe nicht im vorgegebenen Verzeichnis exisitieren. In diesem Fall luft Excel auf einen Fehler, den Sie aber abfangen. Im Fehlerfall wird direkt in den Paragraphen fehler verzweigt, indem eine eigene Meldung auf dem Bildschirm angezeigt wird.

Arbeitsmappe(n) ffnen ber einen Dialog


Mchten Sie in einem Dialog elegant die Arbeitsmappe(n) auswhlen, die Sie ffnen mchten, dann knnen Sie mit Hilfe der Methode GetOpenFileName den Dialog FFNEN anzeigen und auswerten. Im folgenden Beispiel wird der Dialog FFNEN angezeigt. Sie haben dabei die Mglichkeit, eine Arbeitsmappe im Dialog auszuwhlen und zu ffnen.

181

Auf Arbeitsmappen zugreifen Datei-Operationen

Listing 4.2: Den Dialog ffnen anzeigen Sub ArbeitsmappeffnenDialog() Dim DatOP As Variant DatOP = Application.GetOpenFilename("Excel-Dateien(*.xls),*.xls") If DatOP = False Then Exit Sub Workbooks.Open Filename:=DatOP End Sub

Geben Sie bei der Methode GetOpenFilename den Filter an, nachdem Dateien im Dialog FFNEN angezeigt werden. Da Sie Excel-Dateien im Dialog anzeigen mchten, geben Sie die Endung xls an. Nach dem Aufruf des Dialogs mssen Sie prfen, ob der Dialog FFNEN mit der Schaltflche ABBRECHEN wieder verlassen wurde. In diesem Fall wird in der Variablen DatOP der Wert False zurckgegeben, was mit einem Verlassen des Makros ber die Anweisung Exit Sub quittiert wird. Im anderen Fall ffnen Sie mit Hilfe der Methode Open die ausgewhlte Arbeitsmappe, die in der Variablen DatOP verzeichnet ist.

Abbildung 4.1: Der Dialog ffnen

ber denselben Dialog haben Sie auch die Mglichkeit, mehrere Excel-Arbeitsmappen auf einmal zu ffnen. Fr diesen Zweck mssen Sie das Makro aus Listing 4.2 ein wenig umschreiben.

182

Arbeitsmappen ffnen

Listing 4.3: Mehrere Mappen knnen im Dialog ffnen markiert werden Sub ArbeitsmappenffnenDialog() Dim i As Integer Dim DatOP As Variant i = 0 DatOP = Application.GetOpenFilename("Excel-Dateien(*.xls),*.xls", _ MultiSelect:=True) If IsArray(DatOP) Then For i = LBound(DatOP) To UBound(DatOP) Workbooks.Open DatOP(i) Next i Else MsgBox "Sie haben keine Arbeitsmappe ausgewhlt" End If End Sub

Zeigen Sie den Dialog FFNEN an, indem Sie die Methode GetOpenFileName einsetzen. Damit Sie die Mglichkeit haben, mehrere Arbeitsmappen im Dialog ber die Taste (Strg) zu markieren, mssen Sie hierbei das Argument MultiSelect auf den Wert True setzen.

Abbildung 4.2: Den Dialog ffnen mit Mehrfachauswahl anzeigen

183

Auf Arbeitsmappen zugreifen Datei-Operationen

Im nchsten Schritt mssen Sie berprfen, ob berhaupt eine Arbeitsmappe im Dialog FFNEN markiert wurde. Wenn ja, dann meldet die Funktion IsArray den Wert True. In diesem Fall stehen die markierten Namen der Arbeitsmappen im Datenfeld DatOP. Dieses Datenfeld wird anschlieend ber den Einsatz einer Schleife abgearbeitet. Dabei reprsentiert die Funktion LBound den ersten Eintrag im Datenfeld DatOP (die erste markierte Arbeitsmappe) und die Funktion UBound den letzten Eintrag im Datenfeld DatOP (letzte markierte Arbeitsmappe). Innerhalb dieser Schleife wenden Sie die Methode Open an, um die markierten Arbeitsmappen nacheinander zu ffnen. ber die Zhlvariable sprechen Sie dabei eine Arbeitsmappe nach der anderen an.

Geffnete Arbeitsmappen identifizieren


Gerade, wenn Sie mit mehreren geffneten Arbeitsmappen arbeiten, dann mssen Sie genau wissen, welche Arbeitsmappen derzeit geffnet sind. Im folgenden Makro werden alle aktuell geffneten Arbeitsmappen in einem Meldungsfenster am Bildschirm angezeigt:
Listing 4.4: Alle geffneten Arbeitsmappen im berblick Sub MappenGeffnetErmitteln() Dim Mappe As Workbook Dim s As String For Each Mappe In Workbooks s = Mappe.Name & Chr(13) & s Next Mappe MsgBox "Folgende Mappen sind derzeit geffnet: " & _ Chr(13) & s, vbInformation + vbOKOnly End Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ WorkBook und eine Variable vom Typ String, die die Namen der geffneten Arbeitsmappen aufnehmen soll. Danach setzen Sie eine Schleife auf und arbeiten alle geffneten Arbeitsmappen ab. Diese werden Ihnen ber das Auflistungsobjekt Workbooks zur Verfgung gestellt. Speichern Sie die Namen der Arbeitsmappen mithilfe der Eigenschaft Name in der String-Variablen s. Nach jedem ermittelten Namen erzeugen Sie ber die Anweisung Chr(13) eine neue Zeile. Nach dem Verlassen der

184

Arbeitsmappen speichern

Schleife geben Sie die ermittelten Namen der geffneten Arbeitsmappen am Bildschirm aus.

Abbildung 4.3: Diese Arbeitsmappen sind derzeit geffnet.

Bei dieser Lsung werden auch ausgeblendete Arbeitsmappen wie die Mappe PERSONL.XLS aufgelistet. Die Mappe PERSONL.XLS ist die zentrale Makroarbeitsmappe, in der Sie Makros ablegen knnen, die Sie auch fr alle anderen Arbeitsmappen gebrauchen knnen.

4.2

Arbeitsmappen speichern

Beim Speichern einer Arbeitsmappe mssen Sie wissen, wo Sie die Mappe speichern mchten. Dazu verwenden Sie die ChDrive-Anweisung, um das Laufwerk zu bestimmen, 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 String Const 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:=True End Sub

185

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 knnen Sie angeben, in welchem Format Sie Ihre Mappe speichern mchten. Mit dem nchsten Argument Password knnen Sie ein Passwort festlegen, welches der Anwender beim ffnen der Datei eingeben muss, um die Datei laden zu knnen. Im Beispiel aus Listing 4.5 wurde eine Leerzeichenfolge bergeben, was bedeutet, dass kein Passwort beim ffnen der Datei abgefragt wird. Das Argument WriteResPassword sorgt dafr, dass ein Kennwort fr die Schreiberlaubnis der Datei eingegeben werden muss. Auch hier wurde eine Leerzeichenfolge bergeben, was soviel bedeutet, dass beim ffnen der so gespeicherten Arbeitsmappe kein Passwort eingegeben werden muss. Das Argument ReadOnlyRecommended setzen Sie auf True, wenn beim ffnen der Datei in einer Meldung empfohlen werden soll, die Datei mit Nur-Lese-Zugriff zu ffnen. Belassen Sie das Argument auf dem Wert False, unterbleibt diese Meldung. Das Argument CreateBackup setzen Sie auf den Wert True, wenn Excel von der Mappe eine Sicherungskopie anlegen soll. Excel legt dann eine Sicherungskopie unter demselben Namen mit dem Zusatz SICHERUNGSKOPIE VON... und der Endung WLK an. Die brigen Argumente sind in der Praxis nicht so relevant und werden an dieser Stelle nicht weiter beschrieben. Eine Beschreibung knnen Sie aber in der Online-Hilfe nachlesen.

Arbeitsmappe speichern ber Dialog


Genauso wie schon beim ffnen einer Arbeitsmappe beschrieben, gibt es in VBA auch eine Methode, um den Dialog SPEICHERN UNTER anzuzeigen. Diese Methode heit GetSaveAsFilename.
CHERN UNTER

Im folgenden Beispiel wird die momentan aktive Arbeitsmappe im Dialog SPEIangezeigt.

Listing 4.6: Eine Arbeitsmappe im Dialog Speichern unter anzeigen Sub ArbeitsmappeSpeichernDialog() Dim DATCl As Variant Const LW = "C:\"

186

Arbeitsmappen speichern

Const Pfad = "C:\Eigene Dateien" ChDrive LW ChDir Pfad DATCl = Application.GetSaveAsFilename _ (, "Excel-Dateien (*.xls),*.xls") If DATCl = False Then Else ActiveWorkbook.Save End If End Sub

Bevor Sie den Dialog SPEICHERN UNTER aufrufen, sorgen Sie dafr, dass das gewnschte Laufwerk bzw. das Verzeichnis aktiviert wird. Setzen Sie dazu die Anweisungen ChDrive und ChDir ein. Danach rufen Sie ber die Methode Get SaveAsFilename den Dialog SPEICHERN UNTER auf. Als Filter stellen Sie die ExcelDateien mit der Endung xls ein. Vor diesem Filter haben Sie die Mglichkeit, einen Namen bereits vorzugeben. Im Beispiel aus Listing 4.6 wurde bewusst darauf verzichtet, um den Dateinamen von Excel selbst vorschlagen zu lassen.

Abbildung 4.4: Arbeitsmappe speichern

Im folgenden Beispiel aus Listing 4.7 werden Sie selbst einen Namen fr die Arbeitsmappe festlegen:

187

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 Then Else ActiveWorkbook.Save End If End Sub

In beiden Makros aus Listing 4.6 und Listing 4.7 mssen Sie dann prfen, ob nicht eventuell auch die Schaltflche ABBRECHEN geklickt wurde. In diesem Fall wrde die Variable DATCl den Wert False zurckmelden. Andernfalls speichern Sie die Arbeitsmappe, indem Sie die Methode Save anwenden.

Abbildung 4.5: Den Dialog Speichern unter mit voreingestelltem Namen aufrufen

Alle geffneten Arbeitsmappen speichern


Im nchsten Beispiel sollen alle derzeit geffneten Arbeitsmappen gespeichert werden. Das Makro fr diese Aufgabe lautet:

188

Arbeitsmappen speichern

Listing 4.8: Alle geffneten 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 geffneten Arbeitsmappen ab. Innerhalb der Schleife setzen Sie die Methode Save ein, um die Arbeitsmappen zu speichern.

Arbeitsmappe speichern unter Datum/Uhrzeit


Mchten Sie fr Arbeitsmappen das aktuelle Tagesdatum sowie die momentane Uhrzeit als Dateinamen verwenden, dann knnen Sie das folgende Makro dafr einsetzen.
Listing 4.9: Arbeitsmappe mit Datum/Uhrzeit benennen Sub MappeSpeichernMitDatumUndUhrzeit() Const LW = "C:\" Const Pfad = "C:\Eigene Dateien" ChDrive LW ChDir Pfad ActiveWorkbook.SaveAs _ (Date & "_" & Hour(Time) & "_" & Minute(Time) & ".xls") End Sub

Das aktuelle Tagesdatum fr den Dateinamen bekommen Sie ber die Funktion Date. Da im Dateinamen kein Doppelpunkt (Uhrzeit z.B. 12:30) vorkommen darf, mssen Sie die Zeitangabe mit den Funktionen Hour sowie Minute extrahieren und neu zusammensetzen.

189

Auf Arbeitsmappen zugreifen Datei-Operationen

Abbildung 4.6: Die Arbeitsmappe nach Datum und Uhrzeit benennen

Arbeitsmappe bedingt speichern


Eine Arbeitsmappe sollte nur dann gespeichert werden, wenn nderungen an ihr vorgenommen wurden. Wenn Sie wissen mchten, ob nderungen in der Arbeitsmappe seit dem letzten ffnen der Arbeitsmappe gemacht wurden, sei es durch Verknpfungen oder Benutzereingaben, dann steht Ihnen hierfr eine Eigenschaft names Saved zur Verfgung. Sehen Sie sich nun folgendes Listing 4.10 an.
Listing 4.10: Prfung durchfhren, ob Arbeitsmappe gendert wurde Sub nderungArbeitsmappe() If ActiveWorkbook.Saved = False Then MsgBox "Die Mappe wurde gendert!" ActiveWorkbook.Save Else MsgBox "Arbeitsmappe ist unverndert!" End If End Sub

Die Eigenschaft Saved liefert den Wert True, wenn die aktive Arbeitsmappe seit der letzten Speicherung nicht mehr gendert wurde. Gibt die Eigenschaft den Wert False zurck, wurden nderungen an der Arbeitsmappe vorgenommen.

190

Arbeitsmappen schlieen

4.3

Arbeitsmappen schlieen

Fr das Schlieen einer Arbeitsmappe steht Ihnen die Methode Close zur Verfgung. Wenn Sie eine Arbeitsmappe wieder schlieen mchten, dann mssen Sie standardmig eine Meldung mit Ja besttigen, wenn Sie nderungen an der Mappe durchgefhrt haben. Diese Meldung knnen Sie aber unterdrcken, wenn Sie in der Methode Close ein zustzliches Argument angeben.

Arbeitsmappe schlieen nderungen speichern


Im folgenden Beispiel wird die aktive Arbeitsmappe ohne weitere Rckfrage geschlossen. Die nderungen in der Mappe werden dabei mit gesichert.
Listing 4.11: Aktive Mappe schlieen nderungen speichern Sub ArbeitsmappeSchlieen() ActiveWorkbook.Close SaveChanges:=True End Sub

Die Methode Close schliet die Arbeitsmappe. Wird das Argument SaveChanges auf den Wert True gesetzt, werden nderungen an der Arbeitsmappe gespeichert.

Arbeitsmappe schlieen nderungen verwerfen


Demzufolge knnen Sie eine Arbeitsmappe schlieen und die nderungen an dieser Arbeitsmappe verwerfen, indem Sie folgendes Makro aus Listing 4.12 starten:
Listing 4.12: Aktive Mappe schlieen nderungen verwerfen Sub ArbeitsmappeSchlieennderungenVerwerfen() ActiveWorkbook.Close SaveChanges:=False End Sub

Mehrere Arbeitsmappen schlieen


Wenn Sie mehrere Arbeitsmappen in Excel geffnet haben, knnen Sie ganz schnell mit der Tastenkombination (Strg) + (F6) zwischen den einzelnen Arbeitsmappen hin und her springen. Mchten Sie jetzt alle Arbeitsmappen, mit Aus-

191

Auf Arbeitsmappen zugreifen Datei-Operationen

nahme der, in der das Makro aus Listing 4.13 untergebracht ist, schlieen, dann starten Sie das folgende Makro:
Listing 4.13: Alle Mappen bis auf eine schlieen Sub MehrereMappenSchlieen() Dim Mappe As Workbook For Each Mappe In Application.Workbooks If Mappe.Name <> ThisWorkbook.Name Then _ Mappe.Close SaveChanges:=True Next End Sub

Im Auflistungsobjekt Workbooks sind alle zur Zeit geffneten Arbeitsmappen verzeichnet. Dies knnen Sie in einer For-Each-Schleife ntzen, die den Namen der Arbeitsmappe, die den Code aus Listing 4.13 enthlt, mit den Namen der Arbeitsmappen vergleicht, die in der Auflistung stehen. Mit der Methode Close schlieen Sie dann alle Arbeitsmappen bis auf die, die Listing 4.13 enthlt. An dieser Stelle muss auf den Unterschied zwischen den Anweisungen
ActiveWorkbook

und
ThisWorkbook

hingewiesen werden. Die Arbeitsmappe, die mit der Eigenschaft ActiveWorkbook angesprochen wird, ist die Arbeitsmappe, die momentan aktiv ist, d.h. wenn Sie aus der Entwicklungsumgebung herausspringen und in die normale Arbeitsoberflche von Excel wechseln. Mit der Eigenschaft ThisWorkbook ist die Arbeitsmappe gemeint, in die Sie die Makros eingeben. Halten Sie diese beiden Eigenschaften auseinander und klren Sie immer genau ab, was Sie an welcher Arbeitsmappe tun mchten.

192

Arbeitsmappen anlegen

4.4

Arbeitsmappen anlegen

Mchten Sie neue Arbeitsmappen einfgen, dann verwenden Sie die Methode Add. Die Anzahl der Tabellenbltter, welche Excel in der neuen Arbeitsmappe zur Verfgung stellen soll, regeln Sie ber die Eigenschaft SheetsInNewWorkbook. Achten Sie darauf, dass die Obergrenze der Tabellenbltter den Wert 255 nicht bersteigen darf. Legen Sie im folgenden Beispiel eine neue Arbeitsmappe mit drei Tabellenblttern an:
Listing 4.14: Neue Arbeitsmappe einfgen Sub NeueArbeitsmappeAnlegen() Application.SheetsInNewWorkbook = 3 Workbooks.Add End Sub

Mit Hilfe der Eigenschaft SheetsInNewWorkbook legen Sie fest, wie viele Tabellen in einer neuen Arbeitsmappe eingefgt werden sollen. Danach wenden Sie die Methode Add an, um eine neue Arbeitsmappe einzufgen.

4.5

Arbeitsmappen zusammenfhren

In der folgenden etwas greren Aufgabe werden Sie einige bereits gelernte Dinge nacheinander durchfhren. Sie werden unter anderem eine neue Arbeitsmappe mit zunchst einem Tabellenblatt einfgen. Danach greifen Sie auf ein bestimmtes Verzeichnis zu und ffnen dort eine Arbeitsmappe nach der anderen. bertragen Sie dann die einzelnen Tabellen in die gerade neu erstellte Arbeitsmappe. Das Makro zur Lsung dieser Aufgabenstellung knnen Sie im folgenden Listing sehen:
Listing 4.15: Alle Mappen aus einem Verzeichnis werden zusammenkopiert Sub KonsolidierenAlleDateienEinesVerz() Dim Mappe As String Dim i As Integer Const LW = "C:\" Const Pfad = "C:\Eigene Dateien\Excel\"

193

Auf Arbeitsmappen zugreifen Datei-Operationen

ChDrive LW ChDir Pfad Application.SheetsInNewWorkbook = 1 Workbooks.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 = Dir Loop End Sub

Wechseln Sie im ersten Schritt auf das gewnschte Laufwerk bzw. das Verzeichnis, in dem die zu konsolidierenden Arbeitsmappen stehen. Danach bestimmen Sie ber die Eigenschaft SheetsInNewWorkbook, wie viele Tabellen in der neuen Arbeitsmappe enthalten sein sollen. Legen Sie direkt im Anschluss diese neue Arbeitsmappe ber die Methode Add an. Speichern Sie direkt im Anschluss die gerade neu erstellte Arbeitsmappe im Verzeichnis C:\EIGENE DATEIEN. Basteln Sie sich nun den Suchbegriff zusammen und bergeben diesen der Funktion Dir. Stellen Sie danach wieder das Verzeichnis ber die Anweisung ChDir ein, indem die zu konsolidierenden Arbeitsmappen gespeichert sind. Setzen Sie jetzt eine Do while Schleife auf, die solange durchlaufen wird wie Arbeitsmappen im angegebenen Verzeichnis gefunden werden knnen. Innerhalb dieser Schleife ffnen Sie die einzelnen Arbeitsmappen mithilfe der Methode Open.

194

Arbeitsmappen entfernen

Jetzt bentigen Sie eine zweite Schleife, die die Tabellen der einzelnen Arbeitsmappen zhlt. ber die Methode Copy kopieren Sie nun die einzelnen Tabellen in Ihre Konsolidierungsarbeitsmappe. Sind alle Tabellen der jeweiligen Arbeitsmappe bertragen, dann wenden Sie die Methode Close an, um die Arbeitsmappe wieder zu schlieen. Setzen Sie dabei das Argument SaveChanges auf den Wert False, um diese Mappen ohne Rckfrage zu schlieen. Suchen Sie danach ber die Funktion Dir nach weiteren Arbeitsmappen.

4.6

Arbeitsmappen entfernen

Wenn Sie eine Arbeitsmappe lschen mchten, ohne dazu den Datei-Explorer von Windows einzusetzen, knnen Sie Arbeitsmappen ber die Anweisung Kill einsetzen. Dabei darf die zu lschende Arbeitsmappe selbstverstndlich nicht geffnet sein. Im folgenden Beispiel aus Listing 4.16 wird eine bestimmte Arbeitsmappe aus einem vorgegebenen Verzeichnis unwiederbringlich entfernt.
Listing 4.16: Arbeitsmappe ohne Rckfrage lschen Sub ArbeitsmappeLschen() Const Lw = "C:\" Const Pfad = "C:\eigene Dateien" Const Datei = "Mappe1.xls" On Error GoTo fehler: Kill Datei MsgBox "Arbeitsmappe " & Datei & " wurde gelscht!" 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. zweimal hintereinander versuchen, das Makro ArbeitsmappeLschen auszufhren, bekommen Sie beim ersten Mal die Besttigung, dass die Datei gelscht wurde. Wenn

195

Auf Arbeitsmappen zugreifen Datei-Operationen

Sie ein zweites Mal versuchen, die Arbeitsmappe zu lschen, liefert Excel Ihnen die Fehlermeldung, welche unter der Zeilenmarke Fehler steht.

4.7

Die Dokumenteigenschaften

Die Dokumenteigenschaften einer Arbeitsmappe knnen Sie eingeben oder auch ansehen, indem Sie aus dem Men DATEI den Befehl EIGENSCHAFTEN whlen.

Abbildung 4.7: Die Dokumenteigenschaften der Arbeitsmappe

Wie Sie sehen sind die momentan verfgbaren Eigenschaften doch etwas rar gest. Diese Dokumenteigenschaften knnen Sie ber den Einsatz von VBA setzen.

196

Die Dokumenteigenschaften

Dokumenteigenschaften auslesen
Es existiert eine ganze Reihe von Dokumenteigenschaften fr eine Arbeitsmappe. Wie aber knnen Sie wissen, wie Sie diese Dokumenteigenschaften ansprechen sollen? Die Antwort auf diese Frage knnen Sie im Makro aus Listing 4.17 ablesen.

Abbildung 4.8: Alle verfgbaren Dokumenteigenschaften Listing 4.17: Alle Dokumenteigenschaften auslesen Sub Dim Dim i = DokumentEigenschaftenAuslesen() i As Integer obj As Object 1

197

Auf Arbeitsmappen zugreifen Datei-Operationen

Sheets.Add For Each obj In ActiveWorkbook.BuiltinDocumentProperties Cells(i, 1).Value = obj.Name On Error Resume Next Cells(i, 2).Value = obj.Value i = i + 1 Next End Sub

Mit dem Befehl Sheets.Add fgen Sie eine neue Tabelle in Ihrer Arbeitsmappe ein. Danach bilden Sie eine Schleife, die nacheinander alle Dokumenteigenschaften der Arbeitsmappe durchluft und deren Namen sowie deren momentane Inhalte in die Tabelle schreibt. Mit Hilfe der Eigenschaft BuilInDocumentProperties wird Ihnen eine Auflistung aller Dokumenteigenschaften zur Verfgung gestellt.

Dokumenteigenschaften setzen
Nachdem Sie nun wissen, wie die einzelnen Dokumenteigenschaften heien, werden 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 Stichwrter sollen die Begriffe VBA, Makros und Programmierung aufgefhrt werden. Ebenso soll ein mehrzeiliger Kommentar als Dokumenteigenschaft gesetzt werden.

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

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.de End With End Sub

Fllen Sie die einzelnen Dokumenteigenschaften, indem Sie die Eigenschaft BuiltInDocumentProperties mit dem richtigen Namen ansprechen und den gewnschten Inhalt bergeben. Kontrollieren Sie das Ergebnis, indem Sie aus dem Men DATEI den Befehl EIGENSCHAFTEN whlen und die Registerkarte ZUSAMMENFASSUNG aktivieren.

Abbildung 4.9: Die Dokumenteigenschaften wurden gesetzt.

199

Auf Arbeitsmappen zugreifen Datei-Operationen

Abbildung 4.10: Die Registerkarte Statistik

Auf dieser Registerkarte sehen Sie einige Datumsangaben, die Sie wie folgt auslesen knnen.
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").Value End With End Sub

ber die Anweisung Debug.Print geben Sie die momentan gesetzten Dokumenteigenschaften im Direktfenster aus. Blenden Sie das Direktfenster ein, indem Sie in die Entwicklungsumgebung wechseln und aus dem Men ANSICHT den Befehl DIREKTFENSTER auswhlen.

200

Verknpfungen in Arbeitsmappen

Abbildung 4.11: Dokumenteigenschaften im Direktbereich ausgeben

4.8

Verknpfungen in Arbeitsmappen

Wenn Sie eine Arbeitsmappe ffnen, die Verknpfungen enthlt, werden Sie durch eine Bildschirmmeldung darauf aufmerksam gemacht, dass Verknpfungen enthalten sind. Sie haben dann die Mglichkeit, diese Verknpfungen zu aktualisieren. Dabei bleiben die verknpften Arbeitsmappen aber geschlossen. Die Zeit, die vergeht, bis die Verknpfungen alle aktualisiert sind, ist abhngig von der Anzahl der verknpften Zellen bzw. der verknpften Arbeitsmappen. Es empfiehlt sich, bei nderungen immer die beteiligten Arbeitsmappen zu ffnen. Verknpfte Arbeitsmappen knnen Sie in Excel ffnen, indem Sie aus dem Men BEARBEITEN den Befehl VERKNPFUNGEN whlen, im Listenfeld QUELLDATEI die entsprechenden verknpften Arbeitsmappen markieren und die Schaltflche QUELLE FFNEN klicken.

Abbildung 4.12: Verknpfte Arbeitsmappen anzeigen

201

Auf Arbeitsmappen zugreifen Datei-Operationen

Verknpfungen dokumentieren
Die Verknpfungen zu anderen Arbeitsmappen knnen Sie auch ber ein Makro auf einer separaten Tabelle dokumentieren. Im folgenden Makro wird eine neue Tabelle eingefgt und alle Verknpfungen zu anderen Arbeitsmappen dokumentiert.
Listing 4.20: Alle verknpften Arbeitsmappen dokumentieren Sub Dim Dim Dim VerknpfungenAusgeben() Mappe As Workbook VLink As Variant i As Integer

Set Mappe = ThisWorkbook VLink = Mappe.LinkSources(xlExcelLinks) Sheets.Add Range("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 i End If End Sub

Definieren Sie zuerst ein Objekt vom Typ Workbook. Danach definieren Sie ein Datenfeld vom Datentyp Variant, indem Sie die Namen und die Pfade der verknpften Arbeitsmappen speichern. Mit der Anweisung Set sagen Sie aus, dass das Objekt Mappe die momentan aktive Arbeitsmappe reprsentieren soll. Fgen Sie ein neues Tabellenblatt mit der Methode Add ein. Fllen Sie jetzt das Datenfeld VLink mit allen Excel-Verknpfungen dieser Arbeitsmappe. Dazu setzen Sie die Methode LinkSources mit der Xlink-Konstanten xlExcelLinks ein. Die Methode gibt eine Matrix mit Verknpfungen der Arbeitsmappe zurck. Die Namen in der Matrix entsprechen dabei den Namen der verknpften Excel-Arbeitsmappen. Wenn keine Verknpfung besteht, wird der Wert IsEmpty zurckgegeben. Setzen Sie danach eine For-Next-Schleife ein, um die einzelnen Verknpfungen in die neue Tabelle zu schreiben. In die erste Spalte erfolgt eine Numerierung der ein-

202

Verknpfungen in Arbeitsmappen

zelnen Verknpfungen. In Spalte B schreiben Sie die Namen und den dazugehrigen Pfad der verknpften Arbeitsmappen.

Abbildung 4.13: Alle verknpften Arbeitsmappen wurden dokumentiert.

Verknpfungen ndern
Mchten Sie eine bestimmte Verknpfung in der Arbeitsmappe ndern, dann knnen Sie die Methode ChangeLink einsetzen. Stellen Sie sich vor, Sie haben eine Arbeitsmappe mit anderen Mappen aus einem bestimmten Verzeichnis verknpft. In der Zwischenzeit haben Sie die verknpften Arbeitsmappen in ein anderes Verzeichnis kopiert und diese dann abgendert. Jetzt sollen die Verknpfungen so gendert werden, dass sie auf das neue Verzeichnis zeigen. Ihre Aufgabe besteht nun darin, alle Verknpfungen an das neue Verzeichnis anzupassen. Das Makro fr diese Aufgabe knnen Sie dem Listing 4.21 entnehmen.
Listing 4.21: Verknpfungen ndern Sub Dim Dim Dim Dim Dim Verknpfungndern() Mappe As Workbook VLink As Variant i As Integer e As Integer s As String

Set Mappe = ThisWorkbook

203

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 i End If End Sub

Wie schon in Listing 4.20 definieren und fllen Sie ein Datenfeld mit den zur Zeit aktiven Verknpfungen. In einer Schleife ndern Sie die Verknpfungen. Fr diesen Zweck mssen Sie zuerst aus den Verknpfungsadressen, die ja den kompletten Pfad beibehalten, den Namen der verknpften Arbeitsmappe extrahieren. Diese Aufgabe knnen Sie mithilfe der Funktion InStrRev lsen, die die Position des letzten Zeichens \ ermittelt. ber die Funktion Mid knnen Sie jetzt gezielt den Namen der verknpften Arbeitsmappe extrahieren. Wenden Sie danach die Methode ChangeLink an, bei der Sie zuerst die momentane Verknpfung angeben und dann die gewnschte Verknpfung, die sich aus dem neuen Pfad und dem Namen der ermittelten Arbeitsmappe ergibt. Kontrollieren Sie das Ergebnis dieser Aktion, indem Sie aus dem Men BEARBEITEN den Befehl VERKNPFUNGEN auswhlen.

Abbildung 4.14: Die Verknpfungspfade wurden angepasst.

204

Fragen & Antworten

4.9
F

Fragen & Antworten

ber welche Anweisung knnen Sie den Namen der aktiven Arbeitsmappe sowie den kompletten Speicherpfad am Bildschirm ausgeben?
A

Die Anweisung lautet: Msgbox ActiveWorkbook.FullName. ber die Anweisung Msgbox Application.UserName. ber die Anweisung MsgBox "Der aktuelle Pfad lautet: " & CurDir.

Wie kann man den Namen des Benutzers einer Arbeitsmappe ermitteln?
A

Wie kann man den aktuell eingestellten Pfad ermitteln?


A

4.10 Quiz
F F F F F

Wie kann man verhindern, dass beim ffnen einer Arbeitsmappe die Verknpfungen zu anderen Arbeitsmappen aktualisiert werden? Was ist der Unterschied zwischen dem Befehl ActiveWorkbook und ThisWorkbook?

Wie kann man beim Schlieen einer Arbeitsmappe dafr sorgen, dass nderungen automatisch ohne weitere Rckfrage gespeichert werden? Wie kann man bei einer Neuanlage einer Arbeitsmappe die Anzahl der Tabellen bestimmen? Was muss man beachten, wenn man die Anweisung Kill einsetzt, um eine Arbeitsmappe

4.11 bung
Als abschlieende bung an diesem Tag sollen Sie folgende Aufgabe lsen: Programmieren Sie ein Makro, welches alle Arbeitsmappen aus einem bestimmten Verzeichnis ffnet, das aktuelle Datum in Zelle A1 der ersten Tabelle schreibt und diese Arbeitsmappen speichert und schliet. Die Lsung dieser Aufgabe finden Sie im Anhang A.

205

Tabellenbltter programmieren

D 5

Tabellenbltter programmieren

Am gestrigen Tag haben Sie gelernt, wie Sie Arbeitsmappen anlegen, ffnen, speichern, schlieen und lschen knnen. Darber hinaus haben Sie auf die Dokumenteigenschaften von Arbeitsmappen zugegriffen sowie Verknpfungen zu anderen Arbeitsmappen ausgelesen und gendert. Die Themen heute:

Tabellen anlegen und benennen Blatt-Typ bestimmen Tabellen entfernen Tabellen exportieren Tabellen importieren Tabellen ein- und ausblenden Tabellen gruppieren Tabellen schtzen Tabellen sortieren Kopf- und Fuzeilen programmieren Alle Makrobeispiele knnen Sie in der Arbeitsmappe Tabellen.xls im Verzeichnis Kap05 auf der beiliegenden CD-ROM nachschlagen.

5.1

Tabellen anlegen und benennen

In Excel knnen Sie standardmig bis zu 255 Tabellen pro Arbeitsmappe einfgen, wenn Sie diese Einstellung im Men EXTRAS unter dem Befehl OPTIONEN auf der Registerkarte ALLGEMEIN auswhlen. ber den Einsatz eines Makros knnen Sie diese standardmig gesetzte Obergrenze aber locker sprengen. Im folgenden Makro fgen Sie 365 neue Tabellenbltter in eine neue Arbeitsmappe ein. Die Benennung der Tabellen sollte gleich nach deren Einfgung erfolgen. Als Namen whlen Sie die Bezeichnung Tag 1, Tag 2 usw. bis zum Tag 365.

208

Tabellen anlegen und benennen

Listing 5.1: Tabellen einfgen und benennen Sub TabellenEinfgen() Dim i As Integer Workbooks.Add For i = 1 To 365 Worksheets.Add ActiveSheet.Name = "Tag " & i Next i End Sub

Fgen Sie im ersten Schritt eine neue Arbeitsmappe ber die Methode Add ein. Danach durchlaufen Sie eine Schleife genau 365 Mal. Innerhalb der Schleife wenden Sie die Methode Add an, um eine Tabelle einzufgen. Den Namen der jeweiligen Tabelle legen Sie fest, indem Sie der Eigenschaft Name das Wort Tag sowie die fortlaufende Variable i zuweisen.

Abbildung 5.1: Tabellen einfgen und benennen

Wie Sie sehen, wurden die neuen Tabellen immer zu Beginn der Arbeitsmappe eingefgt und dann mit jeder neuen Tabelle um eine Position nach hinten verschoben. So kommt es, dass die zuletzt eingefgte Tabelle am Beginn der Arbeitsmappe steht. Um die zuerst eingefgte Tabelle auch am Beginn der Arbeitsmappe zu positionieren, geben Sie bei der Methode Add noch ein zustzliches Argument an.

209

Tabellenbltter programmieren

Listing 5.2: Tabellen einfgen und Reihenfolge beibehalten Sub TabellenEinfgen02() Dim i As Integer Workbooks.Add For i = 1 To 365 Worksheets.Add Before:=Worksheets(Worksheets.Count) ActiveSheet.Name = "Tag " & i Next i Worksheets(1).Activate End Sub

Das einzufgende Tabellenblatt wird jeweils am Ende der Arbeitsmappe eingefgt. Fr diesen Zweck mssen Sie mithilfe der Eigenschaft Count die Anzahl der Tabellen der Arbeitsmappe zhlen und dem Argument Before bergeben. Aktivieren Sie am Ende des Makros ber die Methode Activate das erste Tabellenblatt der Arbeitsmappe.

5.2

Blatt-Typ bestimmen

In Excel haben Sie die Mglichkeit, neben Tabellen auch Diagrammbltter, alte Excel-4-Makrobltter und Dialoge einzufgen. Dabei knnen alle Bltter ber die Eigenschaft Sheets angesprochen werden. Mchten Sie ausschlielich auf Tabellen zugreifen, dann setzen Sie wie in den ersten beiden Listings beschrieben die Eigenschaft Worksheets ein. Bestimmte Befehle in VBA knnen Sie nur auf Work sheets anwenden, andere haben auch Gltigkeit fr andere Bltter. Von daher ist es wichtig, genau zu wissen, was fr eine Art von Blatt man gerade mit einem Makro anpackt. Im folgenden Makro werden die Namen aller Tabellen sowie deren Typ im Direktfenster der Entwicklungsumgebung ausgegeben:
Listing 5.3: Bltter einer Arbeitsmappe identifizieren Sub TabellenIdentifizieren() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count

210

Blatt-Typ bestimmen

Debug.Print Sheets(i).Name & " --> " & TypeName(Sheets(i)) Next i End Sub

In einer Schleife durchlaufen Sie alle Tabellenbltter der Arbeitsmappe, in der Sie das Makro aus Listing 5.3 eingegeben haben (ThisWorkbook). Innerhalb der Schleife geben Sie mithilfe der Eigenschaft Name den Namen des Blattes ber den Befehl Debug.Print im Direktbereich aus. Des Weiteren ermitteln Sie ber die Funktion TypeName, um welchen Blatt-Typ es sich dabei handelt. Es wird unter folgenden 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 Entwicklungsumgebung wechseln und aus dem Men ANSICHT den Befehl DIREKTFENSTER whlen.

Abbildung 5.2: Die Blatt-Typen einer Arbeitsmappe im Direktfenster ausgeben

In einer Arbeitsmappe soll auf jedem Tabellenblatt in Zelle A1 das heutige Datum erfasst werden. Um diese Aufgabe zu lsen, gibt es zwei Lsungsanstze:

Entweder Sie springen ganz gezielt nur die Tabellenbltter der Arbeitsmappe an oder Sie prfen vorher, um welchen Typ eine Blattes es sich handelt.

Beide Varianten werden nun realisiert.

211

Tabellenbltter programmieren

Tabellenbltter fllen
Im folgenden Makro in Listing 5.4 werden alle Tabellenbltter einer Arbeitsmappe in einer Schleife nacheinander abgearbeitet:
Listing 5.4: Das aktuelle Datum in allen Tabellenblttern eintragen Sub TabellenbltterEditieren() Dim Tabelle As Worksheet For Each Tabelle In ThisWorkbook.Worksheets Tabelle.Range("A1").Value = Date Next Tabelle End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. Damit knnen nur reine Tabellenbltter angesprochen werden. In einer darauf folgenden Schleife fllen Sie jeweils die Zelle A1 in allen Tabellenblttern mit dem aktuellen Tagesdatum.

Blattprfung vor Fllung vornehmen


Im folgenden Makro prfen Sie vor jedem Einfgen des aktuellen Datums, ob es sich dabei wirklich um eine Tabelle handelt:
Listing 5.5: Tabellenbltter berprfen Sub TabellenbltterPrfen() 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 = Date Next i End Sub

212

Tabellen entfernen

Ermitteln Sie ber die Anweisung ThisWorkbook.Sheets.Count, wie viele Bltter in der Arbeitsmappe sind. Diese Anzahl bildet auch das Endkriterium fr Ihre Schleife. Innerhalb der Schleife fgen Sie ber die Funktion Date das aktuelle Tagesdatum in Zelle A1 ein.

5.3

Tabellen entfernen

Um Tabellen aus einer Arbeitsmappe zu entfernen, setzen Sie die Methode Delete ein, welche Sie auf das Auflistungsobjekt Sheets anwenden.

Tabelle nach Rckfrage lschen


Im folgenden Beispiel soll die TABELLE1 aus Ihrer Arbeitsmappe entfernt werden. Das Makro fr diesen Zweck lautet:
Listing 5.6: Eine Tabelle lschen Sub TabelleEntfernen() Sheets("Tabelle1").Delete End Sub

Wenn Sie das Makro aus Listing 5.6 starten, werden Sie von Excel gefragt, ob Sie diese Aktion wirklich durchfhren mchten.
Abbildung 5.3: Die LschenRckfrage beantworten

Rckfrage bei Tabellenlschung unterdrcken


Mchten Sie die Rckfrage unterdrcken, um die gewnschte Tabelle ohne weitere Rckfrage zu lschen, dann erweitern Sie das Makro aus Listing 5.6 wie folgt:

213

Tabellenbltter programmieren

Listing 5.7: Eine Tabelle ohne Rckfrage lschen Sub TabelleEntfernenBesser() Application.DisplayAlerts = False Sheets("Tabelle1").Delete Application.DisplayAlerts = True End Sub

Setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um die Standardmeldungen in Excel kurzfristig auszuschalten. Fhren Sie dann die Methode Delete aus, um die gewnschte Tabelle zu entfernen. Setzen Sie danach die Eigenschaft DisplayAlerts auf den Wert True, um Standardmeldungen in Excel wieder zuzulassen.

Eigene Rckfrage programmieren


Mchten Sie neben der Standardmeldung von Excel eine eigene Meldung beim Versuch, eine Tabelle zu entfernen, anzeigen, dann knnen Sie dies ber den Einsatz eines Meldungsfensters tun. Dabei erfassen Sie folgenden Quellcode aus Listing 5.8:
Listing 5.8: Eine eigene Lschmeldung anzeigen Sub TabelleEntfernenEigeneMeldung() Dim i As Integer i = MsgBox("Mchten Sie wirklich die Tabelle lschen?", _ vbYesNo + vbQuestion, "Tabelle lschen") If i = 6 Then Sheets("Tabelle1").Delete End Sub

Die Funktion MsgBox knnen Sie einsetzen, um vom Anwender durch das Klicken von Schaltflchen eine Entscheidung zu bekommen. Klickt der Anwender auf die Schaltflche JA, dann knnen Sie dies ber den Wert 6 erkennen, der in der Variablen i steht. In diesem Fall wenden Sie die Methode Delete an, um die Tabelle zu entfernen.

214

Tabellen entfernen

Abbildung 5.4: Eine Mglichkeit, eine Aktion noch einmal abzubrechen

Vor dem Lschen prfen


Die letzten drei Listings haben noch einen kleinen Schnheitsfehler. Was ist denn, wenn Sie versuchen, eine Tabelle zu entfernen, die es gar nicht mehr in der Arbeitsmappe gibt, weil sie bereits gelscht oder der Name der Tabelle nicht korrekt angegeben wurde? In diesem Fall strzt das Makro mit folgender Fehlermeldung ab, die Sie nachvollziehen knnen, wenn Sie Listing 5.7 zweimal hintereinander ausfhren.

Abbildung 5.5: Der Versuch, eine nicht existente Tabelle zu entfernen, scheitert.

Eine solche Fehlermeldung sollte vermieden werden. Prfen Sie daher vor dem Lschen einer Tabelle, ob die zu lschende Tabelle berhaupt in der Arbeitsmappe vorhanden ist. Wie das funktioniert, verrt Ihnen Listing 5.9:
Listing 5.9: Erst nach einer berprfung die Tabelle lschen Function TabelleDa(s As String) As Boolean On Error Resume Next TabelleDa = Worksheets(s).Select End Function

215

Tabellenbltter programmieren

Sub LschenTabelleNachPrfung() Dim s As String Dim b As Boolean s = "Tabelle1" b = TabelleDa(s) If b = True Then Application.DisplayAlerts = False Sheets(s).Delete Application.DisplayAlerts = True Else MsgBox (s & " konnte nicht gefunden werden!") End If End Sub

Wir verwenden eine Funktion, die berprft, ob die bergebene Tabelle auch wirklich in der Arbeitsmappe existiert. Sie bergeben der Funktion TabelleDa den Namen der zu prfenden Tabelle. Die Funktion ihrerseits prft, ob sie eine Tabelle mit dem Namen selektieren kann. Wenn nicht, wird die Variable den Wert False an das Makro LschenTabelleNachPrfung zurckgeben. In diesem Fall wird der Anwender ber eine Bildschirmmeldung darauf aufmerksam gemacht. Ist die Funktion in der Lage, das bergebene Tabellenblatt zu selektieren, gibt sie dem Makro den Wert True zurck. In diesem Fall knnen Sie die Standardmeldungen temporr abschalten, die Tabelle lschen und danach die Standardmeldungen wieder zulassen.

5.4

Tabellen exportieren

In manchen Fllen muss eine Tabelle in ein anderes Format bzw. in eine andere oder neue Arbeitsmappe berfhrt werden.

Tabelle als Textdatei exportieren


Im ersten Export-Beispiel soll folgende Tabelle in eine Textdatei berfhrt werden. Als Trennzeichen der einzelnen Spalten wird hierbei das Semikolon eingesetzt.

216

Tabellen exportieren

Abbildung 5.6: Die zu exportierende Tabelle

Erfassen Sie jetzt folgendes Makro, um diese Liste in einer Textdatei auszugeben:
Listing 5.10: Eine Tabelle in eine Textdatei transferieren Sub Dim Dim Dim Dim TabelleAlsTextExportieren() Bereich As Range Zeile As Range Zelle As Range 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 enthlt. Danach ermitteln Sie den verwendeten Bereich der Tabelle, den Sie ber die Eigenschaft UsedRange ermitteln knnen. Legen Sie danach eine Textdatei an,

217

Tabellenbltter programmieren

indem Sie die Methode Open anwenden. Dabei muss die so aktivierte Textdatei keinesfalls schon vorhanden sein. Excel legt diese selbststndig an. Setzen Sie daraufhin eine Schleife auf, die Zeile fr Zeile die Liste abarbeitet. In einer weiteren Schleife arbeiten Sie die Zellen von links nach rechts innerhalb einer Zeile ab und speichern Sie in der Variablen s. Fgen Sie nach jeder Zelle, die Sie auf diese Weise abarbeiten, als Trennzeichen das Semikolon ein. Bevor Sie die Zeile komplett in die Textdatei schreiben, mssen Sie das letzte Semikolon wieder entfernen. Dazu setzen Sie die Funktion Left ein, die eine bestimmte Anzahl von Zeichen von links bertrgt. Da das letzte Semikolon entfernt werden soll, knnen Sie von der Gesamtlnge der Variablen, die Sie ber die Funktion Len ermitteln knnen, den Wert 1 subtrahieren. Schlieen Sie am Ende des Makros die Textdatei mithilfe der Methode Close.

Abbildung 5.7: Die Tabelle wurde in eine Textdatei exportiert.

Tabelle in eine neue Arbeitsmappe kopieren


Im nchsten Beispiel soll dieselbe Tabelle in eine neue Arbeitsmappe kopiert werden. Das Makro fr diese Aufgabe sehen Sie in Listing 5.11.
Listing 5.11: Tabelle in neue Arbeitsmappe kopieren Sub TabelleInNeueArbeitsmappeKopieren() Dim Mappe As Workbook Dim Tabelle As Worksheet Set Tabelle = ThisWorkbook.Sheets("Tabelle2") Set Mappe = Workbooks.Add Tabelle.Copy Before:=Mappe.Worksheets(Worksheets.Count) End Sub

218

Tabellen exportieren

Deklarieren Sie zu Beginn des Makros zwei Objektvariablen vom Typ Workbook und Worksheet. Danach geben Sie ber die Anweisung Set bekannt, welche Tabelle Sie spter in eine neue Arbeitsmappe kopieren mchten. Legen Sie im nchsten Schritt eine neue Arbeitsmappe an und weisen Sie diese gleich der Objektvariablen zu. Danach knnen Sie mithilfe der Methode Copy die Tabelle kopieren und in die neue Arbeitsmappe einfgen.

Abbildung 5.8: Die Tabelle wurde in eine neue Arbeitsmappe kopiert.

Tabelle in neue Arbeitsmappe bertragen


Mchten Sie eine Tabelle aus Ihrer ursprnglichen Arbeitsmappe herausnehmen und in einer neuen Arbeitsmappe ablegen, dann knnen Sie das Makro aus Listing 5.11 aufgreifen und eine Stelle ndern.
Listing 5.12: Tabelle in neue Arbeitsmappe bertragen Sub TabelleInNeueArbeitsmappeTransferieren() Dim Mappe As Workbook Dim 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 Workbook und Worksheet. Danach geben Sie ber die Anweisung Set bekannt, welche Tabelle Sie spter in eine neue Arbeitsmappe bertragen mchten. Legen Sie im nchsten Schritt eine neue Arbeitsmappe an und weisen Sie diese gleich der

219

Tabellenbltter programmieren

Objektvariablen zu. Danach knnen Sie mithilfe der Methode Move die Tabelle ausschneiden und in die neue Arbeitsmappe einfgen.

Tabelle in andere Arbeitsmappe kopieren/bertragen


Soll das Ziel fr die Tabelle keine neue, sondern eine bereits bestehende Arbeitsmappe 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 Workbook Dim Tabelle As Worksheet Const LW = "C:\" Const Pfad = "C:\Eigene Dateien" ChDrive LW ChDir 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 Workbook und Worksheet. Auerdem geben Sie in zwei Konstanten bekannt, wo sich die Zielarbeitsmappe befindet. Danach geben Sie ber die Anweisung Set bekannt, welche Tabelle Sie spter in eine neue Arbeitsmappe bertragen mchten. Im nchsten Schritt ffnen Sie die Arbeitsmappe, welche die Tabelle erhalten soll, und weisen diese Arbeitsmappe gleich der Objektvariablen Mappe zu. Danach knnen Sie mithilfe der Methode Move bzw. Copy die Tabelle ausschneiden/kopieren und in die neue Arbeitsmappe einfgen.

220

Tabellen importieren

5.5

Tabellen importieren

Selbstverstndlich knnen Sie neben dem Export von Tabellen auch Textdateien in Excel einlesen.

Textdatei-Import mit festen Datenfeldern


Im nachstehenden Beispiel haben Sie eine Textdatei mit festen Datenfeldern nach folgendem Aufbau zusammengestellt:

Kostenstelle (Position 1 bis 4) Personal-Nr (Position 5 bis 10) Name (Position 11 bis 36) Abteilung (ab Position 37)

Abbildung 5.9: Die Textdatei zum Einlesen in Excel

Sie haben in der Textdatei namens PersonalListe.txt einige Daten erfasst und mchten diese nun in Excel ber ein VBA-Makro einlesen. Wie das genau aussehen knnte, 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), _

221

Tabellenbltter programmieren

Array(11, 1), Array(37, 1)), _ StartRow:=2 Columns("A:A").ColumnWidth Columns("B:B").ColumnWidth Columns("C:C").ColumnWidth Columns("D:D").ColumnWidth End Sub = = = = 6 7 30 20

Um eine Textdatei in Excel einzulesen, verwenden Sie die Methode OpenText. Im ersten Argument dieser Methode mssen Sie angeben, wo sich die einzulesende Textdatei befindet und wie diese heit. Im Argument DataType geben Sie an, ob es sich um eine Textdatei mit immer gleich langen Feldern handelt (XlFixedWidth) oder ob ein Trennzeichen zwischen den einzelnen Feldern verwendet wird (XlDemimited). In unserem ersten Beispiel wird eine konstante Feldlnge fr die einzelnen Informationen verwendet. Im Argument FieldInfo geben Sie dann die genaue Startposition sowie den Datentyp des einzelnen Feldes an. Dabei mssen Sie zwei Argumente angeben. Im ersten Feld geben Sie die genaue Spaltennummer, an dem das Datenfeld beginnt, an. Im zweiten Argument legen Sie den Datentyp ber eine Konstante oder Index fest. Entnehmen Sie der folgenden Tabelle die dafr verwendbaren Konstanten bzw. Indexe.
Index
0 1 2 3 4 5 6 7

Konstante
xlGeneralFormat xlTextFormat xlMDYFormat xlDMYFormat xlYMDFormat xlMYDFormat xlDYMFormat xlYDMFormat

Bedeutung Allgemein Text MDY date DMY date YMD date MYD date DYM date YDM date

Tabelle 5.1: Die Konstanten des Arguments FieldInfo

222

Tabellen importieren

Index
8 9

Konstante
xlEMDFormat xlSkipColumn

Bedeutung EMD date Spalte berspringen

Tabelle 5.1: Die Konstanten des Arguments FieldInfo (Forts.)

Im Argument StartRow knnen Sie bestimmen, ab welcher Zeile in der Textdatei der Import beginnen soll. Da Sie in unserem Beispiel eine berschriftenzeile haben, die Sie nicht unbedingt in der Excel-Tabelle haben mchten, setzen Sie dieses Argument auf den Wert 2. Diese Argumente reichen aus, um die Textdatei erfolgreich in eine Excel-Tabelle einzulesen. Im letzten Schritt des Makros sorgen Sie dafr, dass die Breiten der einzelnen Spalten ausreichen und dass alle Daten in der Tabelle vollstndig angezeigt werden knnen. Fr diese Aufgabe setzen Sie die Eigenschaft ColumnWidth ein, bei der Sie die exakte Spaltenbreite angeben.

Abbildung 5.10: Die Textdatei wurde erfolgreich in Excel eingelesen.

Mchten Sie die Spaltenbreiteneinstellung Excel berlassen, knnen Sie die Methode AutoFit einsetzen. Die Anweisung dafr lautet:
ActiveSheet.Columns("A:D").AutoFit

Im folgenden, etwas abgewandelten Beispiel sollen aus der Textdatei PersonalListe.txt nur die Spalten PERSONAL-NR sowie der Name des Mitarbeiters in eine Tabelle eingelesen werden. Das Makro fr die Lsung dieser Aufgabenstellung knnen Sie in Listing 5.15 sehen.

223

Tabellenbltter 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").AutoFit End Sub

Fr das bedingte Einlesen einer Textdatei setzen Sie das Argument FieldInfo im zweiten Argument fr die Spalten, die Sie nicht einlesen mchten, auf den Wert 9. Wenden Sie am Ende des Makros aus Listing 5.15 die Methode AutoFit ein, damit Excel die automatische Spaltenanpassung vornimmt.

Abbildung 5.11: Nur bestimmte Datenfelder aus der Textdatei wurden eingelesen.

Textdatei-Import mit variablen Datenfeldern


Viele Textdateien haben aber auch variable Satzlngen, d.h. die einzelnen Felder haben nicht gleich lange Feldlngen, sondern knnen X- bis Y-Zeichen aufweisen. Bei diesen Textdateien wird das Ende eines Feldes ber ein Trennzeichen bestimmt. Meistens ist dies das Semikolon, welches die einzelnen Felder voneinander abtrennt. Schauen Sie sich zur besseren Verstndlichkeit die Abbildung 5.12 an.

224

Tabellen importieren

Abbildung 5.12: Eine Textdatei mit variabler Satzlnge

Bei der Textdatei PersonalListe2.txt wird das Semikolon als Trennzeichen der einzelnen Felder verwendet. Mchten Sie diese Textdatei in eine Excel-Tabelle einlesen, dann setzen Sie das Makro aus Listing 5.16 ein:
Listing 5.16: Einlesen einer Textdatei mit variabler Satzlnge Sub TextdateiImportierenVariableSL() Workbooks.OpenText _ Filename:="C:\Eigene Dateien\PersonalListe2.txt", _ DataType:=xlDelimited, Semicolon:=True, _ StartRow:=2 ActiveSheet.Columns("A:D").AutoFit End Sub

Um eine Textdatei mit variabler Satzlnge einzulesen, mssen Sie bei der Methode OpenText im Argument DataType die Konstante XlDelimited angeben. Danach mssen Sie bekannt geben, dass Sie mit dem Semikolon als Trennzeichen arbeiten mchten, 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 standardmig angebotenen Trennzeichen mit Ihrer Textdatei bereinstimmen, wie in Abbildung 5.13 angezeigt, dann mssen Sie das Makro aus Listing 5.16 etwas abndern.

225

Tabellenbltter programmieren

Abbildung 5.13: Hier wurde das Trennzeichen * verwendet.

Die Textdatei PersonalListe3.txt soll nun in eine Excel-Tabelle importiert werden. Das dazu notwendige Makro knnen 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").AutoFit End Sub

Wird ein nicht standardmig angebotenes Trennzeichen fr eine Textdatei eingesetzt, dann setzen Sie das Argument Other auf den Wert True und geben im Argument OtherChar das Trennzeichen, welches Sie verwenden, in doppelten Hochkommata ein.

5.6

Tabellen ein- und ausblenden

Um mehr Ordnung in Ihre Arbeitsmappen zu bringen, knnen Sie selten bentigte Tabellen auch ausblenden und bei Bedarf wieder einblenden.

226

Tabellen ein- und ausblenden

Abbildung 5.14: Auch die Textdatei mit anderem Trennzeichen konnte erfolgreich eingelesen werden.

Einfaches Aus- und Einblenden einer Tabelle


Das Ein- und Ausblenden von Tabellenblttern erzielen Sie mit der Eigenschaft Visible. Setzen Sie diese Eigenschaft auf den Wert False, um eine Tabelle auszublenden. Im folgenden Beispiel blenden Sie die TABELLE1 aus:
Listing 5.18: Eine Tabelle ausblenden Sub TabelleAusblenden() On Error GoTo fehler Sheets("Tabelle1").Visible = False Exit Sub fehler: MsgBox "Die Tabelle ist nicht vorhanden!", vbCritical + vbOKOnly End Sub

Beim Ausblenden einer Tabelle sollten Sie eine Sicherheitsfunktion einbauen, die folgenden Fall bercksichtigt: Was passiert, wenn versucht wird, eine Tabelle auszublenden, die in der Arbeitsmappe gar nicht vorhanden ist? In diesem Fall wrde ein Makro ohne Fehlerbehandlungsfunktion abstrzen. Setzen Sie daher die Anweisung On Error goTo Fehler ein, um im Fehlerfall direkt in den Paragrafen fehler zu springen. Dort geben Sie eine Meldung aus.

227

Tabellenbltter programmieren

Verluft das Ausblenden einer Tabelle erfolgreich, dann mssen Sie mithilfe der Anweisung Exit Sub dafr sorgen, dass der Fehlerparagraf nicht ausgefhrt wird. Mit dieser Anweisung beenden Sie das Makro auf direktem Weg. Nachdem Sie das Makro TabelleAusblenden ausgefhrt haben, wird die Tabelle in der Arbeitsmappe nicht mehr angezeigt. Der Anwender kann aber jederzeit ber den Befehl BLATT/EINBLENDEN aus dem Men FORMAT die ausgeblendeten Tabellenbltter wieder verfgbar machen. Mchten Sie die Tabelle wieder einblenden, starten Sie das folgende Makro:
Listing 5.19: Eine Tabelle wieder einblenden Sub TabelleEinblenden() On Error GoTo fehler Sheets("Tabelle1").Visible = True Exit Sub fehler: MsgBox "Die Tabelle ist nicht vorhanden!", vbCritical + vbOKOnly End Sub

Setzen Sie die Eigenschaft Visible wieder auf den Wert True, um die Tabelle einzublenden. Fangen Sie auch hier den Fehlerfall ber die On Error-Anweisung ab.

Mehrere Tabellen ausblenden


Da es manuell nicht mglich ist, mehrere Tabellen gleichzeitig aus- bzw. einzublenden, ist bei dieser Aufgabenstellung ein Makro eine feine Sache. Im folgenden Beispiel sollen alle Tabellen mit Ausnahme der Tabelle INHALT ausgeblendet werden. Den Quellcode fr diese Aufgabe knnen Sie in Listing 5.20 sehen.
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

Tabellen ein- und ausblenden

Next i End Sub

Setzen Sie eine Schleife auf, die sooft durchlaufen wird, bis alle Bltter der Arbeitsmappe durchlaufen worden sind. Dazu ermitteln Sie ber die Eigenschaft Count, die Sie auf das Auflistungsobjekt Sheets anwenden, die Anzahl der Bltter in der Arbeitsmappe. Innerhalb der Schleife prfen Sie mithilfe der Eigenschaft Name, ob der Name des einzelnen Blattes mit der Tabelle INHALT bereinstimmt. Wenn nicht, blenden Sie die Tabelle aus, indem Sie die Eigenschaft Visible auf den Wert False setzen.

Abbildung 5.15: Alle Tabellen bis auf die Tabelle Inhalt wurden ausgeblendet.

Alle so ausgeblendeten Bltter knnen Sie jederzeit wieder verfgbar machen, indem Sie aus dem Men FORMAT den Befehl BLATT/EINBLENDEN whlen. Da dies nicht immer im Sinn des Programmierers ist, knnen Sie die einzelnen Bltter auch so ausblenden, dass sie ber die Standardoberflche nicht mehr eingeblendet werden knnen.

Das sichere Ausblenden von Blttern


Um Bltter einer Arbeitsmappe auf die sichere Methode auszublenden, damit diese vom Anwender ber die Standardoberflche von Excel nicht mehr eingeblendet werden knnen, starten Sie das Makro aus Listing 5.21.

229

Tabellenbltter programmieren

Listing 5.21: Bltter 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 = xlVeryHidden Next i End Sub

bergeben Sie der Eigenschaft Visible die Konstante xlVeryHidden, um die Bltter sicher auszublenden. Wenn Sie jetzt versuchen, die so ausgeblendeten Bltter ber den Menbefehl FORMAT/BLATT/EINBLENDEN wieder verfgbar zu machen, stellen Sie fest, dass dieser Menbefehl deaktiviert ist und berhaupt nicht ausgewhlt werden kann.

Abbildung 5.16: Es gibt keine Mglichkeit, ber die Standardoberflche sicher ausgeblendete Bltter wieder verfgbar zu machen.

Bltter wieder einblenden


Egal, wie Sie Ihre Bltter ausgeblendet haben, sei es auf normale oder sichere Weise, knnen Sie Ihre Bltter wieder einblenden, indem Sie das Makro aus Listing 5.22 starten:

230

Tabellen gruppieren

Listing 5.22: Alle versteckten Bltter wieder einblenden Sub TabellenEinblenden() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count Sheets(i).Visible = True Next i End Sub

In einer Schleife durchlaufen Sie alle Bltter der Arbeitsmappe und setzen die Eigenschaft Visible auf den Wert True, um die ausgeblendeten Bltter wieder einzublenden.

Abbildung 5.17: Alle Bltter sind nun wieder verfgbar.

5.7

Tabellen gruppieren

In Excel haben Sie die Mglichkeit, Ihre Arbeit an einem Tabellenblatt automatisch auch fr andere Tabellenbltter, hnlich einer Blaupause, gltig zu machen. Dazu gruppieren Sie die einzelnen Tabellenbltter. Manuell klappt das, indem Sie die (Strg)-Taste gedrckt halten und die einzelnen Tabellenregister mit der linken Maustaste anklicken.

231

Tabellenbltter programmieren

Einfaches Gruppieren
In der folgenden Aufgabe sollen einige Tabellen einer Arbeitsmappe gruppiert werden. Das Makro dafr sieht so aus:
Listing 5.23: Bestimmte Tabellen gruppieren Sub MehrereTabellenbltterMarkieren() On Error GoTo fehler Sheets(Array("Tabelle1", "Tabelle2", _ "Tabelle3")).Select Exit Sub fehler: MsgBox "Es ist ein Fehler beim Gruppieren aufgetreten!" End Sub

Die Funktion Array ermglicht es Ihnen, eine durch Kommata getrennte Liste von Werten (hier Tabellennamen) anzugeben. Sorgen Sie auch hier wieder fr die On Error-Anweisung, um eine Fehlermeldung zu vermeiden, falls eines der Tabellenbltter nicht vorhanden ist.

Abbildung 5.18: Gruppieren von mehreren Tabellenblttern

brigens knnen Sie anstatt der Namen der einzelnen Tabellen auch Indexwerte angeben. Der Index 1 entspricht dabei dem Tabellenblatt, das ganz vorne in der Arbeitsmappe steht. Die Indexwerte 2 und 3 reprsentieren die Tabellen, die dann

232

Tabellen gruppieren

von links nach rechts folgen. Achten Sie jedoch darauf, dass das Ergebnis ein anderes sein kann als erwartet.
Listing 5.24: Tabellen ber ihren Index gruppieren Sub MehrereTabellenbltterMarkieren02() On Error GoTo fehler Sheets(Array(1, 2, 3)).Select Exit Sub fehler: MsgBox "Es ist ein Fehler beim Gruppieren aufgetreten!" End Sub

Abbildung 5.19: Gruppieren der ersten drei Tabellen

Im Gegensatz zu Abbildung 5.18 wurden in Abbildung 5.19 die ersten drei Tabellen der Arbeitsmappe gruppiert. Die Gruppierung knnen Sie wieder aufheben, indem Sie auf einen Tabellenreiter klicken, der nicht in der Gruppierung enthalten ist.

233

Tabellenbltter programmieren

Komplexeres Gruppieren
Etwas aufwndiger wird es, wenn Sie nur bestimmte Tabellen bzw. auch alle Tabellen einer Arbeitsmappe gruppieren mchten. Die Lsung fr das Gruppieren aller Tabellenbltter einer Arbeitsmappe muss beispielsweise dynamisch sein, d.h. wenn einzelne Tabellen neu hinzukommen bzw. Tabellen umbenannt werden, muss die folgende Lsung in Listing 5.25 noch funktionieren. Des Weiteren sollen selbstverstndlich keine Diagramm- oder alte Makro4-Tabellenbltter mit in die Gruppierung aufgenommen werden.
Listing 5.25: Alle Tabellen einer Mappe gruppieren Sub Dim Dim Dim AlleTabellenBltterGruppieren() i As Integer i2 As Integer 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).Select End Sub

Da Sie zu Beginn noch nicht exakt wissen, wie gro das Datenfeld TabArray werden soll, mssen Sie es ganz allgemein mit dem Datentyp Integer deklarieren. Danach ermitteln Sie ber die Eigenschaft Count, die Sie auf die Auflistung Work sheets anwenden, die Anzahl der in der Arbeitsmappe befindlichen Tabellenbltter. Jetzt wissen Sie genau, wie gro Sie das Datenfeld TabArray definieren mssen. Dies erreichen Sie ber die Anweisung ReDim. Fllen Sie das Datenfeld im Anschluss daran ber eine Schleife, in der Sie jedes einzelne Feld des Datenfelds bestcken. Markieren Sie im Anschluss daran die so gesammelten Tabellenbltter mithilfe der Methode Select.

234

Tabellen schtzen

Abbildung 5.20: Alle Tabellenbltter wurden gruppiert.

5.8

Tabellen schtzen

Seit der Excel-Version 2002 haben Sie die Mglichkeit, Tabellen zwar zu schtzen, jedoch bestimmte Aktionen wie das Sortieren von Daten, den AutoFilter und sonstige Dinge trotzdem noch zuzulassen. In den vorherigen Versionen von Excel waren nach dem Anbringen eines Tabellenschutzes bestimmte Aktionen generell berhaupt nicht mehr mglich. Den Tabellenschutz stellen Sie ber die Methode Protect her. Die Syntax dieser Methode lautet dabei:
ActiveSheet.Protect _ (Password, DrawingObjects, Contents, _ Scenarios, UserInterfaceOnly)

Im Argument Passwort geben Sie das Kennwort fr das Blatt oder die Arbeitsmappe an. Wenn Sie dieses Argument weglassen, kann der Schutz des Blattes oder der Arbeitsmappe ohne Angabe eines Kennworts aufgehoben werden. Mit dem Argument DrawingObjects bestimmen Sie, ob Sie zustzlich zu Ihren Zellen auch noch Formen, wie z.B. Blockpfeile, Sterne oder Banner, schtzen mchten. Diese Formen werden standardmig jedoch nicht geschtzt. Wenn Sie Formen schtzen mchten, setzen Sie das Argument auf den Wert True. Beim Argument Contents, welches standardmig auf True gesetzt ist, werden die Zellen eines Tabellenblattes geschtzt.

235

Tabellenbltter programmieren

Das Argument Scenarios gilt nur fr Arbeitsbltter und bedeutet, dass bestimmte Ansichten und Einstellungen, wie z.B. das eingestellte Zoom, geschtzt werden. Die Standardeinstellung ist dabei ebenfalls True. Das letzte Argument UserInterFaceOnly gibt ber den Wert True an, dass die Benutzeroberflche, jedoch keine Makros geschtzt werden. Ab der Excel-Version 2002 gibt es folgende zustzliche Argumente, die den Tabellenschutz geradezu revolutionieren:

AllowFormattingCells: Setzen Sie dieses Argument auf den Wert True, wenn

Sie die Formatierung in geschtzten Zellen zulassen mchten.

AllowFormattingColumns: Bei dieser Einstellung darf der Benutzer Spalten formatieren, sofern dieses Argument auf den Wert True gesetzt wird. AllowFormattingRows: Bei dieser Einstellung darf der Benutzer Zeilen formatieren, sofern dieses Argument auf den Wert True gesetzt wird. AllowInsertingRows: Setzen Sie dieses Argument auf den Wert True, wenn Sie

zulassen mchten, dass der Benutzer neue Zeilen in eine geschtzte Tabelle einfgen darf.

AllowInsertingHyperlinks: Um das Einfgen von Hyperlinks in geschtzten Tabellen zuzulassen, setzen Sie dieses Argument auf den Wert True. AllowDeletingColumns: Mchten Sie zulassen, dass in einer geschtzten Tabelle Spalten gelscht werden drfen, dann setzen Sie dieses Argument auf den Wert True. AllowDeletingRows: Mchten Sie zulassen, dass in einer geschtzten Tabelle Zeilen gelscht werden drfen, dann setzen Sie dieses Argument auf den Wert True. AllowSorting: Setzen Sie dieses Argument auf den Wert True, um eine Sortierung des geschtzten Arbeitsblattes zu ermglichen. Fr jede Zelle im Sortierbereich muss die Sperre oder der Schutz aufgehoben werden. AllowFiltering: Setzen Sie dieses Argument auf den Wert True, um zu

ermglichen, Filter fr das geschtzte Arbeitsblatt festzulegen. Die Benutzer knnen Filterkriterien ndern, jedoch keinen AutoFilter aktivieren oder deaktivieren.

236

Tabellen schtzen

AllowUsingPivotTables: Setzen Sie dieses Argument auf den Wert True, um es

dem Benutzer zu ermglichen, auf einer geschtzten Tabelle mit Pivot-Tabellen zu arbeiten. Im folgenden Beispiel wird TABELLE1 mit dem Kennwort HERO geschtzt.
Listing 5.26: Die Tabelle1 wird geschtzt. Sub TabelleSchtzen() Sheets("Tabelle1").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub

Wenn Sie versuchen, eine nderung in der so geschtzten Tabelle vorzunehmen, wird Ihnen dies nicht gelingen.

Abbildung 5.21: Alle Zellen werden in der Tabelle1 geschtzt.

Selbstverstndlich mssen nicht immer alle Zellen einer Tabelle geschtzt werden, wie es im Makro aus Listing 5.26 vorgenommen wurde.

Nur bestimmte Zellen vor Vernderung schtzen


Bei Tabellen, in denen Sie Formeln und Berechnungen durchfhren, empfiehlt es sich, diese wichtigen Formeln zu schtzen. Alle anderen Nicht-Formelzellen knnen dabei vom Tabellenschutz ausgenommen werden.

237

Tabellenbltter programmieren

Abbildung 5.22: Nur Formelzellen sollen geschtzt werden.

Standardmig sind alle Zellen einer Tabelle von vornherein mit dem GeschtztKennzeichen ausgestattet, d.h. wenn Sie eine Tabelle mit einem Schutz belegen, sind alle Zellen nicht mehr vernderbar. Folgende Arbeitsschritte mssen nun durchgefhrt werden: 1. Generell fr alle Zellen der Tabelle das Geschtzt-Kennzeichen entfernen 2. Ermittlung der Zellen, die Formeln enthalten 3. Fr diese Zellen das Geschtzt-Kennzeichen setzen 4. Den Schutz fr die Tabelle einstellen Diese vier Arbeitsschritte fhren Sie im Makro aus Listing 5.27 durch.
Listing 5.27: Nur Formelzellen wurden geschtzt Sub TeileDerTabelleSchtzen() Sheets("DB").Activate Cells.Select Selection.Locked = False

238

Tabellen schtzen

Selection.SpecialCells(xlCellTypeFormulas).Select Selection.Locked = True Sheets("DB").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub

Aktivieren Sie im ersten Schritt die gewnschte Tabelle, in der Sie die Formelzellen schtzen mchten. Danach markieren Sie ber die Anweisung Cells.Select alle Zellen der Tabelle. In der Cells-Auflistung sind alle Zellen einer Tabelle verzeichnet. Setzen Sie danach die Eigenschaft Locked auf den Wert False, um zunchst das Geschtzt-Kennzeichen fr alle Zellen der Tabelle auszuschalten. Ermitteln Sie danach ber die Methode SpecialCells, der Sie die Konstante xlCellTypeFormulas mitgeben, alle Formelzellen der Tabelle und markieren diese mithilfe der Methode Select. Schalten Sie danach fr diese Zellen das GeschtztKennzeichen wieder ein, indem Sie die Eigenschaft Locked auf den Wert True setzen. Nun knnen Sie die Methode Protect einsetzen, um die Tabelle zu schtzen. Danach knnen Formelzellen in dieser Tabelle nicht mehr gendert werden.

Temporren Schutz einstellen


In der Praxis kommt es oft vor, dass Sie als Programmierer zwar den Schutz von Tabellen verwenden, aber trotzdem hin und wieder eine nderung an der Tabelle vornehmen mchten, ohne jedes Mal den Schutz aufzuheben, die nderung einzuarbeiten und den Tabellenschutz wieder einzustellen. Fr diesen Fall knnen Sie alle Teilschritte auch ber ein Makro durchfhren lassen. Dieses Makro knnen Sie in Listing 5.28 sehen.
Listing 5.28: nderungen an geschtzten Tabellen vornehmen Sub SchutzausnderungSchutzEin() 'Dokuschutz aufheben Sheets("DB").Unprotect Password:="hero" 'nderung durchfhren

239

Tabellenbltter programmieren

Range("B2").Value = Date 'Dokuschutz wieder einstellen Sheets("DB").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub

Bestimmte Bereiche vom Schutz ausnehmen


Ab der Version Excel 2002 gibt es auch eine Funktion, mithilfe der Sie gezielt Bereiche in Ihrer Tabelle definieren knnen, fr die ein eingestellter Blattschutz nicht gelten soll.

Abbildung 5.23: Der Bereich B3:E13 soll trotz Blattschutzes frei editierbar bleiben.

Im folgenden Beispiel soll auf der TABELLE3 ein Bereich definiert werden, in dem der Anwender trotz eingestellten Blattschutzes nderungen durchfhren darf. Das Makro fr diese Aufgabe sehen Sie in Listing 5.29:

240

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, knnen Sie einen Bereich definieren, der trotz eingestelltem Blattschutz weiter editierbar sein soll. Geben Sie dazu im Argument Title einen Namen fr den Bereich ein. Des Weiteren geben Sie im Argument Range bekannt, wo der gewnschte Bereich in der Tabelle sein soll. Schtzen Sie danach Ihre Tabelle ber die Methode Protect.

5.9

Tabellen sortieren

Leider gibt es noch keine Standardfunktion in Excel, welche es erlaubt, Tabellenbltter nach ihrem Namen zu sortieren. Das folgende Makro sortiert alle Tabellenbltter in aufsteigender alphabetischer Reihenfolge:
Listing 5.30: Die Bltter einer Arbeitsmappe sortieren Sub Dim Dim Dim BltterSortieren() iMax As Integer Ibl As Integer ibl2 As Integer

Application.ScreenUpdating = False iMax = ThisWorkbook.Sheets.Count For Ibl = 1 To iMax For ibl2 = Ibl To iMax If UCase(Sheets(ibl2).Name) _ < UCase(Sheets(Ibl).Name) Then

241

Tabellenbltter programmieren

Sheets(ibl2).Move before:=Sheets(Ibl) End If Next ibl2 Next Ibl Application.ScreenUpdating = True End Sub

Um das Sortieren von Arbeitsblttern durchzufhren, mssen Sie zwei verschachtelte For-Next-Schleifen durchlaufen. Beide haben als Endbedingung immer die Anzahl der Bltter, die in der Mappe enthalten sind. Innerhalb der zweiten Schleife werden die Namen der Bltter verglichen. Beim Vergleich der Blattnamen werden diese erst einmal in Grobuchstaben gewandelt, um sicherzustellen, dass die Ground Kleinschreibung beim Sortiervorgang keine Rolle spielt. Je nach Vergleichsergebnis werden die einzelnen Bltter dann innerhalb der Arbeitsmappe mithilfe der Methode Move verschoben oder auch nicht.

Abbildung 5.24: Die Bltter liegen sortiert in der Arbeitsmappe vor.

242

Kopf- und Fuzeilen programmieren

5.10 Kopf- und Fuzeilen programmieren


Auch die automatische Generierung von Kopf- und Fuzeilen ist sinnvoll. Standardmig knnen Sie manuell immer nur eine Tabelle nach der anderen mit Kopf- und Fuzeilen bestcken. Diese zeitraubende wie auch lstige Arbeit knnen Sie schneller mit dem Einsatz eines VBA-Makros erledigen. Ab der Excel-Version 2002 ist es erstmals mglich, Grafiken in die Kopf- und Fuzeile zu integrieren. In frheren Excel-Versionen konnte man sich zumindest bei den Kopfzeilen mit einem Trick behelfen. Man fgte eine Grafik in die erste Zeile der Tabelle ein und deklarierte diese Zeile als Wiederholungszeile. So wurde die so eingefgte Grafik auf jeder neuen Seite wiederholt.

Kopf- und Fuzeilen fllen


Beim Befllen der Kopf- und Fuzeilen einer Tabelle knnen Sie zum einen auf bereits existierende Funktionen wie den Namen der Tabelle, die Seitennumerierung sowie das Datum zurckgreifen, die Sie in der normalen Excel-Oberflche ber Schaltflchen hinzufgen knnen. Des Weiteren knnen Sie ber Dokumenteigenschaften oder auch Zellenbezge weitere Informationen in die Kopfund Fuzeilen bringen. Die nchste Makrolsung wird die folgenden Einstellungen an der Kopf- und Fuzeile 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 vierstelliger Jahresangabe) Fuzeile links: der Name der Mappe/Tabelle Fuzeile Mitte: der Autor der Tabelle (aus Dokumenteigenschaften) Fuzeile rechts: die Seitennumerierung (Seite X von Y Seiten)

Auerdem soll am Ende die Seitenansicht automatisch aufgerufen werden.

243

Tabellenbltter programmieren

Listing 5.31: Die Kopf- und Fuzeile festlegen Sub KopfUndFuzeileFestlegen() 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.PrintPreview End Sub

Abbildung 5.25: Die fertige Kopfund Fuzeile

Um die Kopf- und Fuzeile festlegen zu knnen, setzen Sie das Objekt PageSetup ein. Nun knnen Sie ganz gezielt auf die einzelnen Komponenten zugreifen, indem Sie diese mit den gewnschten Informationen fllen. In der linken Kopfzeile (LeftHeader) fgen Sie den Inhalt ein, der momentan in Zelle A1 steht. In der Mitte der Kopfzeile (CenterHeader), greifen Sie auf die Dokumenteigenschaft Company zu, die den Firmennamen zurckmeldet. In der rechten Kopfzeile (RightHeader) fgen Sie das aktuelle Tagesdatum ein und formatieren es mithilfe der Funktion Format nach Ihren Wnschen. In der linken Fuzeile (LeftFooter) fgen Sie den Namen der Arbeitsmappe sowie den Tabellennahmen ber die Kopf- und Fuzeilenkrzel &F und &A ein. In der Mitte der Fuzeile (CenterFooter) zeigen Sie den Namen des Autors an, welchen Sie aus den Dokumenteigen-

244

Fragen & Antworten

schaften holen. Am rechten Rand der Fuzeile (RightFooter) geben Sie die Seitennumerierung ber die Formatkrzel &P und &N an (siehe Abbildung 5.25). Mchten Sie das Makro aus Listing 5.31 nicht nur fr die aktuelle Tabelle, sondern fr alle Tabellen der Arbeitsmappe einsetzen, dann erweitern Sie dieses Makro. Das Ergebnis daraus knnen Sie in Listing 5.32 sehen:
Listing 5.32: Die Einstellungen fr die Kopf- und Fuzeile auf allen Tabellen der Arbeitsmappe bernehmen Sub KopfUndFuzeileFestlegenAlleTabellen() 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 Tabelle End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. Setzen Sie danach eine Schleife auf, in der Sie alle Tabellen der Arbeitsmappe abarbeiten. Innerhalb dieser Schleife fllen Sie die einzelnen Komponenten des Objekts PageSetup, wie bereits in Listing 5.31 beschrieben.

5.11 Fragen & Antworten


F

Wie knnen Sie die voraussichtliche Druckseiten-Anzahl einer Tabelle ermitteln?


A

ber die Anweisung:


MsgBox ExecuteExcel4Macro("Get.Document(50)").

245

Tabellenbltter programmieren

Wie knnen Sie eine Tabelle ans Ende der Arbeitsmappe verschieben?
A

Fr diese Aufgabe setzen Sie die Methode Move ein.


Sheets("Tabelle1").Move After:=Sheets(Sheets.Count)

Wie knnen Sie eine Tabelle schtzen, danach aber noch die Filterfunktion einsetzen?
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 = True End Sub

Geben Sie bei der Methode Protect als Argument userinterfaceonly den Wert True an. Damit knnen Sie auch in einer geschtzten Tabelle noch den AutoFilter verwenden.

5.12 Quiz
F

Wie kann man die Standardmeldungen von Excel abschalten? Gerade beim Lschen von Tabellen ist die dabei angezeigte Besttigungsmeldung unerwnscht. Was mssen Sie machen, wenn Sie eine Tabelle so ausblenden mchte, dass ein Anwender diese ohne den Einsatz eines Makros nicht wieder einblenden kann? Wie knnen Sie eine Grafik in die Kopfzeile Ihrer Tabelle bringen? Welche Formatkrzel knnen Sie fr die Generierung von Kopf- und Fuzeilen einsetzen?

F F F

246

bungen

5.13 bungen
Zum Abschluss dieses Tages versuchen Sie einmal, die folgenden beiden Aufgaben ber den Einsatz eines VBA-Makros zu lsen: 1. Legen Sie eine neue Arbeitsmappe an und fgen Sie darin genau 12 Tabellen ein, die Sie nach Monatsnamen benennen. 2. Entfernen Sie aus einer Tabelle alle Formeln, und zwar so, dass die Formeln in Festwerte umgewandelt werden. Die Lsung dieser beiden Aufgaben finden Sie im Anhang A.

247

Zellbearbeitung mit VBA

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 sowie Daten in Tabellen importiert. Des Weiteren haben Sie auf die Kopf- und Fuzeile per VBA-Makros zugegriffen und diese einheitlich gestaltet. Die Themen heute:

Zellen markieren Zellen fllen und formatieren Zellen benennen und kommentieren Arbeiten mit Formeln und Funktionen Daten suchen und Gltigkeiten einstellen Alle Makrobeispiele knnen Sie in der Arbeitsmappe Zellen.xls im Verzeichnis Kap06 auf der beiliegenden CD-ROM nachschlagen.

6.1

Zellen markieren

Als erste Tagesaufgabe lernen Sie heute, wie Sie Zellen in Excel markieren knnen. Fr das Markieren von Zellen verwenden Sie die Methode Select. Diese Methode wenden Sie auf das Objekt Range an, welches entweder fr eine einzelne Zelle oder einen Zellenbereich steht.

Zelle markieren und Koordinaten ausgeben


Im folgenden Beispiel aus Listing 6.1 wird die Zelle A10 markiert. Des Weiteren werden 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!", vbInformation End Sub

250

Zellen markieren

Aktivieren Sie im ersten Schritt des Makros das gewnschte Tabellenblatt, in dem Sie die Zelle A10 markieren mchten. Wenden Sie danach die Methode Select an, um die Zelle zu markieren. ber die Anweisung ActiveCell.Address knnen Sie die genauen Koordinaten der Zelle bestimmen.

Abbildung 6.1: Die Koordinaten der aktiven Zelle werden ausgegeben.

Zellenbereich markieren und Koordinaten ausgeben


Im nchsten Beispiel wird ein ganzer Zellenbereich markiert und im Anschluss daran werden die Koordinaten ausgegeben:
Listing 6.2: Einen Zellenbereich markieren und ausgeben Sub ZellenMarkieren() Sheets("Tabelle1").Activate Range("A10:C15").Select MsgBox "Sie haben die Zellen " & _ Selection.Address & " markiert!", vbInformation End Sub

Markieren Sie ber die Methode Select den gewnschten Bereich und ermitteln Sie die Koordinaten des markierten Bereichs ber die Anweisung Selection.Address.

Mehrere Zellenbereiche markieren


Einen Schritt weiter geht das folgende Makro. Es markiert mehrere Bereiche in einer Tabelle:

251

Zellbearbeitung mit VBA

Abbildung 6.2: Die Koordinaten des markierten Bereichs ausgeben Listing 6.3: Mehrere Bereiche markieren und ausgeben Sub Dim Dim Dim Dim BereicheMarkieren() Bereich1 As Range Bereich2 As Range Bereich3 As Range Gesamtbereich As Range

Sheets("Tabelle1").Activate Set 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 Set Set Set End Bereich1 = Nothing Bereich2 = Nothing Bereich3 = Nothing Gesamtbereich = Nothing Sub

Deklarieren Sie im ersten Schritt einige Objektvariablen vom Typ Range. In diesen Objektvariablen sollen die einzelnen Bereichskoordinaten gespeichert werden. Mit der Anweisung Set definieren Sie zuerst die einzelnen Zellbereiche Bereich1

252

Zellen markieren

bis Bereich3. Danach vereinen Sie diese Einzelbereiche mithilfe der Methode Union zu einem Block, welcher den Namen Gesamtbereich trgt. Diesen Block knnen Sie ber die Methode Select komplett markieren. ber die Anweisung Gesamtbereich.Address ermitteln Sie die Koordinaten der einzelnen Bereiche. Am Ende des Makros sollten Sie den reservierten Speicher, den Sie fr die Objektvariablen in Beschlag genommen haben, wieder freigeben. Dies erreichen Sie, indem Sie den Objektvariablen mit der Set-Anweisung den Wert Nothing zuweisen.

Abbildung 6.3: Die Koordinaten aller Bereiche ausgeben

Relative Markierungsformen
Bis jetzt haben Sie lediglich absolute Markierungen vorgenommen, d.h. die Zellenadressen wurden bei der Markierung in der A1-Form vorgenommen. Oft mssen aber Markierungen auch relativ angegeben werden. Ein Beispiel fr eine relative Markierungsform wre Folgendes: Geben Sie die Koordinaten der momentan aktiven Zelle aus und markieren Sie ausgehend von dieser Zelle drei weitere Zellen nach rechts! Fr den Fall, dass die aktive Zelle momentan die Zelle B5 ist, mssten dann die Zellen C5, D5 und E5 zustzlich markiert werden. Die Lsung dieser Aufgabenstellung sehen Sie im Makro aus Listing 6.4.

253

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, vbInformation End Sub

Bei der Anweisung Range(ActiveCell, ActiveCell.Offset(0,3)).Select werden ausgehend von der aktiven Zelle, drei weitere Nebenzellen markiert. Fr diesen Zweck wird die Eigenschaft OffSet verwendet. Diese Eigenschaft hat zwei Argumente:

Im ersten Argument wird die Anzahl der Zeilen (positiv, negativ oder 0 (Null)), um die der Bereich versetzt werden soll, angegeben. Bei positiven Werten erfolgt ein Versatz nach unten, bei negativen Werten ein Versatz nach oben. Da in unserem Beispiel die Markierung in derselben Zeile verbleiben soll, setzen 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 positiven Werten erfolgt ein Versatz nach rechts, bei negativen Werten ein Versatz nach links. Da in unserem Beispiel die Markierung der drei Spalten nach rechts verbleiben soll, setzen Sie dieses Argument auf den Wert 3.

Abbildung 6.4: Relative Markierungsformen

254

Zellen markieren

Im nchsten Beispiel wird eine Markierung, ausgehend von der aktiven Zelle, um vier 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 dem Makrostart die Zelle C5, die Markierung wird mithilfe der Eigenschaft OffSet um drei Zeilen nach unten und zwei Spalten nach links erweitert. Die Fehlerbehandlung fr dieses Beispiel ist wichtig, da Sie sicherstellen mssen, dass der Offset auch durchgefhrt werden kann. Fr den Fall, dass die aktive Zelle beispielsweise die Zelle A5 ist, kann der Offset nicht erfolgreich durchgefhrt werden, da es keine weiteren Spalten links neben der Spalte A gibt. Vorsicht auch bei ausgeblendeten Zeilen oder Spalten! Bei der Eigenschaft Offset werden diese ausgeblendeten Objekte mitgezhlt. Die Problematik wird in Abbildung 6.5 ersichtlich.

Abbildung 6.5: Wie lautet der Offset?

255

Zellbearbeitung mit VBA

Auf den ersten Blick wrden Sie sagen: Der Offset ausgehend von der Zelle D2 lautet:
ActiveCell.Offset(5, -1).Select

Diese Bestimmung ist falsch! Beachten Sie, dass hier einige ausgeblendete Zeilen und Spalten vorliegen, die Sie mitzhlen mssen. 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 knnen eine Zelle aber auch ber einen Index, der aus einem Zeilen- und einem Spaltenindex besteht, ansprechen. Im folgenden Makro wird die Zelle C10 selektiert und die Koordinaten 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!", vbInformation End Sub

Mithilfe der Eigenschaft Cells knnen Sie eine bestimmte Zelle ansteuern. Dabei weist diese Eigenschaft zwei Argumente auf. Das erste Argument steht fr die Zeile, das zweite Argument fr die Spalte. Der Schnittpunkt aus Zeile und Spalte ergibt dann die exakte Adresse der Zelle. ber die Eigenschaft Cells knnen selbstverstndlich auch Bereiche angesprochen 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)).Select End Sub

256

Zellen markieren

Den verwendeten Bereich ermitteln


In Excel haben Sie die Mglichkeit, den verwendeten Bereich einer Tabelle zu ermitteln. Diese Aufgabe lsen Sie, indem Sie die Eigenschaft UsedRange einsetzen. Im folgenden Makro wird der verwendete Bereich der TABELLE3 ermittelt und markiert.
Listing 6.8: Den verwendeten Bereich einer Tabelle ermitteln Sub VerwendetenBereichErmitteln() Sheets("Tabelle3").Activate ActiveSheet.UsedRange.Select End Sub

Die Eigenschaft UsedRange gibt den verwendeten Teil eines Tabellenblattes zurck.

Abbildung 6.6: Der verwendete Bereich einer Tabelle wird markiert.

257

Zellbearbeitung mit VBA

Den umliegenden Bereich ermitteln


Nicht immer ist es erwnscht, gleich den ganzen Bereich einer Tabelle zu ermitteln und zu markieren. Oft reicht es auch aus, den umliegenden Bereich einer Zelle auszukundschaften und zu markieren. Mithilfe der Eigenschaft Current Region knnen Sie beispielsweise den umliegenden Bereich einer Zelle ermitteln. Der ermittelte Bereich wird durch die erste Leerzeile bzw. Leerspalte begrenzt. Im nchsten Beispiel soll in einer Tabelle ein ganz bestimmter Bereich lokalisiert und markiert werden:
Listing 6.9: Den umliegenden Bereich einer Zelle markieren Sub UmliegendenBereichErmitteln() Sheets("Tabelle4").Activate Range("B9").Select ActiveCell.CurrentRegion.Select End Sub

ber die Eigenschaft CurrentRegion haben Sie die Mglichkeit, den umliegenden Bereich 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

Zellen fllen

6.2

Zellen fllen

Da Sie nun wissen, wie Sie Zellen und Bereiche markieren knnen, gehen wir einen Schritt weiter und fllen Zellen mit Inhalten.

Zellen initialisieren
Viele Fehler in Makros werden dadurch hervorgerufen, dass Variablen zu Beginn nicht sauber gesetzt werden. hnlich ist es beim Fllen von Zellen. Zu Beginn einer Fllaktion ist es oft angebracht, den zu fllenden Bereich vorher zu lschen und dann neu zu befllen. Warum? Es ist durchaus mglich, dass vor dem Starten des Makros bereits Werte vorhanden sind, d.h. Sie knnen nachher nur schwer feststellen, welche Werte nun neu vom Makro selbst gesetzt wurden. Im folgenden Beispiel wird ein Bereich komplett mit Nullen gelscht. Diese Bereiche sollen jeden Tag mit aktuellen Daten gefllt werden. Sehen Sie sich dazu das Makro aus Listing 6.10 an:
Listing 6.10: Bereiche initialisieren Sub Dim Dim Dim Dim BereicheInitialisieren() Bereich1 As Range Bereich2 As Range Bereich3 As Range 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 = Nothing End Sub

259

Zellbearbeitung mit VBA

Deklarieren Sie im ersten Schritt einige Objektvariablen vom Typ Range. In diesen Objektvariablen sollen die einzelnen Bereichskoordinaten gespeichert werden. Mit der Anweisung Set definieren Sie zuerst die einzelnen Zellbereiche Bereich1 bis Bereich3. Danach vereinen Sie diese Einzelbereiche mithilfe der Methode Union in einem Block, welcher den Namen Gesamtbereich trgt. Diesem Block knnen Sie nun ber die Eigenschaft Value den Wert 0 zuweisen. Am Ende des Makros sollten Sie den reservierten Speicher, den Sie fr die Objektvariablen in Beschlag genommen haben, wieder freigeben. Dies erreichen Sie, indem Sie den Objektvariablen mit der Set-Anweisung den Wert Nothing zuweisen.

Abbildung 6.8: Die Bereiche wurden auf Null gesetzt.

Zellen abfragen und ndern


Genau den umgekehrten Vorgang, nmlich den momentanen Wert einer Zelle abfragen, knnen Sie ebenfalls mit der Eigenschaft Value. Im nchsten Beispiel soll eine Liste mit Buchungen abgearbeitet werden. Dabei sollen alle Positionen, die wertmig ber 2.500 Euro liegen, in der Nebenspalte mit dem Buchstaben A gekennzeichnet werden. Sehen Sie sich zunchst die Ausgangslage in Abbildung 6.9 an. Kennzeichnen Sie nun die Buchungen, die wertmig ber 2.500 Euro liegen, indem Sie das Makro aus Listing 6.11 einsetzen:

260

Zellen fllen

Abbildung 6.9: Die Liste nach dem Datum sortiert Listing 6.11: Buchungspositionen kennzeichnen Sub ListeAbarbeiten() Sheets("Tabelle6").Activate Range("B2").Select Do Until ActiveCell.Value = "" If ActiveCell.Value > 2500 Then ActiveCell.Offset(0, 1).Value = "A" ActiveCell.Offset(1, 0).Select Loop End Sub

Aktivieren Sie im ersten Schritt die gewnschte Zelle und setzen Sie den Mauszeiger auf die Startadresse. Danach durchlaufen Sie in einer Schleife alle Buchungspositionen und fhren eine Wertprfung durch. Liegt die Buchung wertmig ber 2.500 Euro, dann schreiben Sie in die Nebenzelle den Buchstaben A. Setzen Sie fr diese Aufgabe die Offset-Eigenschaft ein, bei der Sie den Zeilen-Offset auf 0 setzen und den Spalten-Offset auf den Wert 1. Vergessen Sie nicht, am Ende der

261

Zellbearbeitung mit VBA

Schleife den Mauszeiger jeweils eine Zeile nach unten zu setzen. Die Schleife wird verlassen, sobald die erste leere Zelle in Spalte B erreicht wird.

Abbildung 6.10: Alle hheren Buchungen wurden in Spalte C gekennzeichnet.

6.3

Zellen formatieren

Beim Formatieren von Zellen und Bereichen in Excel bieten sich Ihnen viele Mglichkeiten. Sie knnen Zelleneingaben in beliebiger Schriftart, Schriftgrad sowie Schriftschnitt vornehmen, Zahlen benutzerdefiniert formatieren, Zelleneintrge optisch ausrichten, Rahmen setzen, Muster hinzufgen und vieles mehr.

Hintergrundfarbe von Zellen festlegen


Fr die Formatierung des Zellenhintergrunds stehen Ihnen 56 Farben zur Verfgung. Jede dieser Farben hat einen eindeutigen Index, ber den Sie die Farbe einstellen.

262

Zellen formatieren

Das folgende Makro aus Listing 6.12 erstellt eine neue Tabelle und gibt die Farben bzw. deren Index in einer Liste aus.
Listing 6.12: Farbindex und Farbe ermitteln Sub FarbenAusgeben() Dim i As Integer Sheets.Add Range("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).Select Next i End Sub

Fgen Sie mithilfe der Anweisung Sheets.Add eine neue Tabelle in Ihre Arbeitsmappe ein. Danach fllen Sie die Zelle A1 und B1 mit der gewnschten berschrift fr die Spalten. Setzen Sie im Anschluss daran den Mauszeiger auf die Startzelle, an der die Bearbeitung beginnen soll, und arbeiten Sie in einer Schleife alle 56 Standardfarben von Excel ab. Den Index schreiben Sie direkt in Spalte A. Die dazugehrige Farbe wenden Sie in Spalte B an, indem Sie die Eigenschaft ColorIndex auf das Objekt Interior anwenden. Das Objekt Interior steht fr den Zellenhintergrund, den Sie mithilfe der Eigenschaft ColorIndex einfrben. Vergessen Sie nicht am Ende der Schleife den Mauszeiger eine Zelle weiter nach unten zu setzen. Um auf schnelle Art und Weise zu erfahren, welcher Farbindex fr welche Farbe steht, weisen Sie einer Zelle eine Farbe zu, setzen den Mauszeiger 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.ColorIndex End Sub

263

Zellbearbeitung mit VBA

Abbildung 6.11: Alle verfgbaren Farben und deren Indexwerte in einer Tabelle

Um die Frbung einer Zelle wieder zu entfernen, setzen Sie bitte nicht den ColorIndex = 2 ein, der fr die Farbe WEISS steht. Weisen Sie stattdessen der Eigenschaft ColorIndex die Konstante XlColorIndexNone zu. Im folgenden Beispiel werden die Farben aller Zellen mit einem einzigen Befehl beseitigt:
Listing 6.14: Alle Hintergrundfarben von Zellen in einer Tabelle entfernen Sub FarbenEntfernen() Sheets("Tabelle7").Activate Cells.Interior.ColorIndex = xlColorIndexNone End Sub

ber die Eigenschaft Cells, die Sie ohne weitere Argumente angeben, haben Sie Zugriff auf alle Zellen der aktiven Tabelle. Diese Zellen entfrben Sie, indem Sie die Eigenschaft ColorIndex mit der Konstante XlColorIndexNone bestcken und auf das Objekt Interior anwenden.

Schriftart festlegen
Wie Sie die Standardschriftart von Excel ndern knnen, haben Sie bereits am fnften Tag erfahren. Diese nderung gilt dann fr alle neuen Arbeitsmappen. Um die Schriftart bei allen anderen Arbeitsmappen zu ndern, muss diese ber das Objekt Font angepasst werden.

264

Zellen formatieren

Im nchsten Beispiel soll auf einer bestimmten Tabelle ein vorgegebener Bereich mit einer anderen Schriftart in der Schriftgre 14 formatiert werden. Das Makro fr diese Aufgabe sehen Sie in Listing 6.15:
Listing 6.15: Eine andere Schriftart bzw. Schriftgre einstellen Sub SchriftArtEinstellen() Dim Zelle As Range Dim Bereich As Range Sheets("Tabelle5").Activate Set Bereich = Range("A1:E20") With Bereich.Font .Name = "Garamond" .Size = 14 End With Set Bereich = Nothing End Sub

Aktivieren Sie zuerst einmal die Tabelle, auf der Sie eine andere Schriftart einstellen mchten. Auf dieser Tabelle definieren Sie mithilfe der Anweisung Set einen Bereich. Dieser Bereich wird mit der Schriftart GARAMOND sowie der Schriftgre 14 formatiert. Das Objekt Font hat eine ganze Reihe von Eigenschaften, die Sie anwenden knnen. Fr die eben gestellte Aufgabe werden die beiden Eigenschaften Name und Size gebraucht. Bei der Angabe der Schriftart ist die korrekte Schreibweise der gewnschten Schriftart wichtig. Bei der Eigenschaft Size geben Sie eine gewnschte Gre fr die Schrift an.

Abbildung 6.12: Ein definierter Bereich wurde mit einer anderen Schriftart formatiert.

265

Zellbearbeitung mit VBA

Die Schriftschnitte angeben


Nachdem Sie die Schriftart und die Schriftgre eingestellt haben, kommen wir nun zu den Schriftschnitten sowie sonstigen Formatierungsmglichkeiten von Schriften. Alle Formatierungen werden anhand des Objekts Font vorgenommen. Entnehmen Sie weitere wichtige Eigenschaften des Objekts Font der folgenden Tabelle.
Eigenschaft
Bold

Beschreibung Diese Eigenschaft liefert den Wert True, wenn ein Text FETT formatiert ist. Diese Eigenschaft gibt die Primrfarbe des Objektes wieder. Mglich sind hierbei folgende Konstanten: vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan und vbWhite. Diese Eigenschaft gibt die Farbe des Rahmens, der Schriftart oder des Innenraums zurck. Es existieren in Excel genau 56 Farben. Diese Eigenschaft sagt aus, welcher Schriftschnitt verwendet wird. Mglich sind u.a. Fett- und Kursivdruck. Diese Eigenschaft liefert den Wert True, wenn ein Text KURSIV formatiert ist. Diese Eigenschaft liefert den Wert True, wenn ein Text als Konturschriftart formatiert wird. Diese Eigenschaft liefert den Wert True, wenn ein Text als schattierte Schriftart formatiert wird. Diese Eigenschaft liefert den Wert True, wenn ein Text als horizontal durchstrichen dargestellt wird. Diese Eigenschaft liefert den Wert True, wenn ein Text tiefer gestellt formatiert wird. Diese Eigenschaft liefert den Wert True, wenn ein Text hochgestellt formatiert wird. Diese Eigenschaft liefert den Wert True, wenn ein Text unterstrichen formatiert wird. Dabei knnen Sie u.a. Text einfach oder doppelt unterstreichen.

Color

ColorIndex

FontStyle

Italic

OutLineFont

Shadow

Strikethrough

Subscript

Superscript

Underline

Tabelle 6.1: Die wichtigsten Eigenschaften fr das Objekt Font

266

Zellen formatieren

In der folgenden Aufgabe erstellen Sie als kleine Vorarbeit eine neue Tabelle und erzeugen im Zellenbereich B2:E20 einige Zufallszahlen. Dabei knnen Sie den Bereich markieren und die Formel =Ganzzahl(Zufallszahl()*1000) einfgen. Schlieen Sie diese Formel ab, indem Sie die Tastenkombination (Strg) + (Enter) drcken. Die gerade erfasste Formel wird nun in jeder Zelle des markierten Bereiches eingefgt. Wenn Sie nun einige Male die Taste (F9) drcken, werden die Zahlen jedes Mal neu gebildet. Ersetzen Sie nun diese Formelzellen in Festwerte, indem Sie den Bereich markieren, kopieren und als Wert einfgen. Sie haben nun Zahlen vorliegen, die zwischen 0 und 999 liegen knnen. Ihre Beispieltabelle msste nun in etwa wie in Abbildung 6.13 aussehen.

Abbildung 6.13: Die Ausgangstabelle mit den Zufallszahlen

Ihre Aufgabe besteht nun darin, alle Zellen, die einen Wert grer als 600 aufweisen, 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 WerteberprfenUndKennzeichnen() Dim Zelle As Range Dim Bereich As Range Sheets("Tabelle9").Activate Set Bereich = Range("B2:E20")

267

Zellbearbeitung mit VBA

For Each Zelle In Bereich If Zelle.Value > 600 Then Zelle.Font.Bold = True Zelle.Font.Italic = True Else End If Next Zelle End Sub

Zu Beginn des Makros deklarieren Sie zwei Objektvariablen vom Typ Range. Danach aktivieren Sie die Tabelle, auf der Sie die Prfung vornehmen mchten, und definieren den Bereich, um den es geht. Jetzt durchlaufen Sie jede einzelne Zelle im definierten Bereich und fragen deren Inhalt ab. Sind die Zahlenwerte grer als der Wert 600, dann weisen Sie dem Objekt Font ber die Eigenschaften Bold und Italic die entsprechenden Schriftschnitte FETT und KURSIV zu.

Abbildung 6.14: Alle Zellen > 600 wurden im Schriftschnitt gendert.

Zellen rahmen
Fr die Rahmengestaltung von Zellen steht Ihnen in Excel eine ganze Reihe von Mglichkeiten zur Verfgung. Welche Rahmentypen dies im Einzelnen sind, knnen Sie aus der folgenden Tabelle erfahren.

268

Zellen formatieren

Konstante
xlContinuous xlDash xlDashDot xlDashDotDot xlDot xlDouble xlSlantDashDot xlLineStyleNone

Beschreibung Durchgezogene Linie Gestrichelte Linie Linie aus Strichen und Punkten Linie aus Strich-Punkt-Punkt Gepunktete Linie Linie doppelt Linie aus Wellenzeichen und Punkt Keine Linie

Tabelle 6.2: Die verschiedenen Rahmentypen in Excel

Im folgenden Beispiel werden Sie die aktuelle Auswahl mit einem gestrichelten roten Rahmen belegen. Dabei spielt es keine Rolle, ob die Auswahl eine oder mehrere Zellen enthlt. Die Lsung dieser Aufgabenstellung knnen Sie in Listing 6.17 sehen:
Listing 6.17: Einen Bereich mit einem Rahmen versehen Sub RahmenBestimmen() Dim Bereich As Range Sheets("Tabelle10").Activate On Error GoTo fehler Set 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

269

Zellbearbeitung mit VBA

Fragen Sie mithilfe der Funktion InputBox einen Bereich vom Anwender ab, den dieser ber eine Eingabemaske direkt auf der Tabelle markieren soll. Wird dieser Markierungsvorgang ber die Schaltflche ABBRECHEN abgebrochen, dann wird eine Fehlerbehandlungsroutine durchgefhrt. Markiert der Anwender wie geplant ber die Eingabemaske den Bereich und klickt auf die Schaltflche OK, dann wenden Sie die Eigenschaft ColorIndex auf das Objekt Borders (= Rahmen) an, um die Rahmenfarbe zu bestimmen. Ebenfalls auf das gleiche Objekt angewendet wird die Eigenschaft LineStyle, die Sie mit der Konstanten xlDash belegen, um einen gestrichelten Rahmen zu erzeugen. Weitere Rahmenarten lernten Sie ja bereits in Tabelle 6.2 kennen.

Abbildung 6.15: Der gestrichelte rote Rahmen

Zahlenformate festlegen
In Excel knnen Sie ber das Dialogfeld FORMAT aus zahlreichen Zahlenformaten die passende Formatierung fr Ihre Daten auswhlen. Des Weiteren sind Sie in der Lage, eigene, benutzerdefinierte Formate anzulegen. In der nchsten Aufgabe soll ein Bereich mit recht hohen Zahlen mit dem Tausenderpunkt formatiert werden. Sehen Sie sich vorerst aber die Abbildung 6.16 an.

Abbildung 6.16: Diese Zahlen sind schwer lesbar.

270

Zellen formatieren

Erhhen Sie die bersichtlichkeit und weisen Sie diesen Zahlen das TausenderTrennzeichen 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 gewnschten Datenbereich markiert haben, knnen Sie diese Eigenschaft direkt auf das Auflistungsobjekt Selection anwenden, in welchem alle Zellen der Markierung verzeichnet sind.

Abbildung 6.17: Die Lesbarkeit der Zahlenwerte ist um ein Vielfaches leichter.

Mchten Sie jegliche Formatierung Ihrer Daten lschen, setzen Sie die Methode ClearFormats ein. In Listing 6.19 werden ber diese Methode die gerade eben gesetzten Tausenderpunkte wieder entfernt.
Listing 6.19: Jegliche Formatierung innerhalb der Markierung wird gelscht Sub FormatierungLschen() Sheets("Tabelle11").Activate Range("B2:E5").Select Selection.ClearFormats End Sub

Datumsformate festlegen
In Excel werden Datumswerte intern in Zahlenwerte umgesetzt, damit Sie damit rechnen knnen. Die Zeitzhlung beginnt bei Excel standardmig am

271

Zellbearbeitung mit VBA

01.01.1900, was der Zahl 1 entspricht. Wenn Sie z.B. das Datum 10.09.2002 eingeben und diese Zelle dann mit dem Format STANDARD belegen, so liefert Ihnen dieses Datum die Zahl 37509. Excel bietet noch ein zweites Datumssystem an, das 1904-Datumssystem. Beim 1904-Datumssystem beginnt die Zeitrechnung in Excel am 01.01.1904. Das Datum 10.09.2002 entspricht in diesem Fall der Zahl 36047. Die Entscheidung, welches Datumssystem Sie whlen, liegt bei Ihnen. Wichtig dabei ist nur, dass Sie durchgngig dasselbe Datumssystem verwenden. Wechseln Sie niemals nachtrglich in einer bereits bestehenden Arbeitsmappe das Datumssystem. Wenn Sie dies trotzdem machen, dann werden alle Datumsangaben in dieser Arbeitsmappe auf das neue Datumssystem umgerechnet. In der nchsten Aufgabe liegen in einer Tabelle unterschiedliche Datumsformatierungen vor. Sehen Sie sich hierfr Abbildung 6.18 an.

Abbildung 6.18: Unterschiedliche Datumsformate sollen auf einen Stand gebracht werden.

Das Datum soll nun in der Form, wie es in Zelle A5 hinterlegt ist, auch fr alle anderen Zellen der Spalte A gltig werden.
Listing 6.20: Datumsformat zuweisen Sub DatumsformatZuweisen() Sheets("Tabelle12").Activate Range("A1:A12").NumberFormat = "DD. MMMM YYYY" End Sub

272

Zellen benennen

Bei der Eigenschaft NumberFormat knnen Sie mit Formatkrzeln arbeiten. Beim Beispiel aus Listing 6.20 steht der Buchstabe D fr den Tag, der Buchstabe M fr den Monat und der Buchstabe Y fr das Jahr. ber die Anzahl der einzelnen Buchstaben knnen Sie die Formatierung des Datums bestimmen.

Abbildung 6.19: Datumsangaben vereinheitlichen

6.4

Zellen benennen

Selbstverstndlich knnen Sie zur leichteren Navigation auf Tabellenblttern und zur besseren bersichtlichkeit Ihres Quellcodes einzelne Zellen oder Bereiche auch einen Namen geben und diese ber diesen Namen ansprechen. Bei der Vergabe eines Namens mssen Sie darauf achten, dass Sie die allgemeinen Namenskonventionen einhalten. Dabei muss das erste Zeichen des Namens ein Buchstabe oder auch ein Unterstrich sein. Beachten Sie auch, dass Namen nicht wie Zellenbezge benannt werden drfen. Bei der Lnge eines Namens knnen Sie bis zu 255 Zeichen verwenden, was in der Programmierung jedoch eher umstndlich ist. Hier sollten Sie sich auf kurze, aber sprechende Namen verstndigen. Eine weitere Einschrnkung bei der Namensvergebung ist, dass Sie Namen nicht aus mehreren Wrtern bilden drfen, d.h. konkret, dass Sie keine Leerzeichen verwenden drfen. 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 (Zellen D5:D24) als Namen angesprochen werden knnen.

273

Zellbearbeitung mit VBA

Listing 6.21: Namen vergeben Sub BereichBenennen() Dim Bereich As Range Dim 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 = Nothing End Sub

In Listing 6.21 definieren Sie zuerst die beiden Bereiche und speichern diese in den Objektvariablen Bereich bzw. Bereich2. Danach wenden Sie die Methode Add an, um die Namen festzulegen. Die Methode Add weist dabei folgende Argumente auf:

Im ersten Argument Name geben Sie den gewnschten Namen an, unter dem Sie spter den Zellbereich ansprechen mchten. Dabei knnen Sie den Namen frei whlen. Sie mssen allerdings darauf achten, dass Sie bei der Namensgebung die vorher beschriebenen Namenskonventionen einhalten. Den gewhlten Namen mssen Sie in Anfhrungszeichen setzen. Das Argument RefersTo gibt an, auf welchen Zellbereich sich der Name beziehen soll. Das Argument Visible bestimmt, ob der Name fr den Anwender sichtbar sein soll oder nicht. Verwendete Namen knnen Sie in Excel anzeigen lassen, indem Sie den Befehl NAME/DEFINIEREN aus dem Men EINFGEN whlen. Setzen Sie das Argument Visible auf den Wert False, wenn Sie verhindern mchten, dass der Anwender den von Ihnen gewhlten Namen einsehen kann.

274

Zellen benennen

Die Standardeinstellung fr dieses Argument ist jedoch True, was bedeutet, dass sowohl die verwendeten Namen als auch deren Zellenadressen vom Anwender eingesehen werden knnen.

Abbildung 6.20: Die Blcke Kosten und Leistung wurden benannt.

Mchten Sie die gerade eingefgten Namen wieder lschen, dann starten Sie das Makro aus Listing 6.22.
Listing 6.22: Namen aus der Arbeitsmappe entfernen Sub NamenEntfernen() On Error Resume Next With ThisWorkbook .Names("Kosten").Delete .Names("Leistung").Delete End With End Sub

Wenden Sie die Methode Delete an, die Sie auf das Auflistungsobjekt Names anwenden. In diesem Auflistungsobjekt sind alle Namen, die in der Arbeitsmappe verwendet werden, dokumentiert. Fr alle Flle sollten Sie eine Fehlerbehand-

275

Zellbearbeitung mit VBA

lung integrieren, die den Fall abfngt, dass ein Name gelscht wird, der bereits nicht mehr in der Arbeitsmappe vorhanden ist. Bei der Fehlerbehandlung in Listing 6.22 wird dieser Fehlerfall einfach ignoriert.

6.5

Zellen kommentieren

Kommentare knnen Sie in Excel u.a. einsetzen, um wichtige Vermerke zu bestimmten Zelleninhalten zu setzen, oder auch, um nderungen an Zellen zu dokumentieren. Ob fr eine Zelle ein Kommentar vorgenommen wurde, erkennen Sie normalerweise am roten Dreieck in der rechten oberen Ecke der Zelle, sofern die Ansicht dieses Indikators unter EXTRAS/OPTIONEN/ANSICHT in Excel eingestellt ist. Wenn Sie den Mauszeiger auf eine Zelle positionieren, wird automatisch ein kleines Textfenster eingeblendet, welches den Kommentar beinhaltet.

Kommentarzellen auskundschaften
Wenn Sie mit sehr groen Tabellen arbeiten, die viele Kommentare enthalten, so ist es mitunter bersichtlicher, wenn Sie alle Kommentare am Stck in eine Liste schreiben und die dazugehrigen Zellenadressen protokollieren. Dazu setzen Sie das folgende Makro aus Listing 6.23 ein.
Listing 6.23: Kommentare auflisten Sub Dim Dim Dim Dim KommentareAuflisten() Notiz As Comment Tabelle As Worksheet DokuBlatt As String i As Integer

Sheets.Add DokuBlatt = ActiveSheet.Name i = 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

Zellen kommentieren

i = i + 1 Next Notiz Next Tabelle Sheets(DokuBlatt).Activate With Columns("A") .ColumnWidth = 40 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With With Columns("B") .ColumnWidth = 10 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With End Sub

Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Comment, um die Notizen der Arbeitsmappe ansprechen zu knnen. Des Weiteren bentigen Sie eine Objektvariable vom Typ Worksheet sowie eine String- und eine Zhlvariable vom Typ Integer. ber die Methode Add fgen Sie eine neue Tabelle ein. Auf dieser Tabelle sollen alle Kommentare, sowohl der Kommentartext als auch die Zellenadresse des Kommentars, dokumentiert werden. Den Namen der neu eingefgten Tabelle speichern Sie in der Stringvariablen DokuBlatt. Setzen Sie die Zhlvariable i auf den Startwert 1. Dieser Startwert steht fr die erste Zeile der Tabelle. Setzen Sie jetzt eine Schleife auf, die alle Tabellen der Arbeitsmappe durchluft. Eine weitere Schleife arbeitet alle Kommentare der einzelnen Tabellen ab. Innerhalb dieser zweiten Schleife fllen Sie das DokuBlatt in der ersten Spalte mit dem Text des jeweiligen Kommentars, den Sie ber die Eigenschaft Text ermitteln knnen. Bei der Ermittlung der Zellenadresse eines Kommentars mssen Sie auf die Eigenschaft Parent zurckgreifen, die das bergeordnete Objekt des Objekts Comment zurckgibt. Mithilfe der Eigenschaft Address gelingt es Ihnen schlielich, die Zellenadresse des Kommentars zu ermitteln und in die zweite Spalte des DokuBlatt zu schreiben. Wurden alle Kommentare gefunden und in das DokuBlatt geschrieben, sorgen Sie noch fr die richtige Formatierung. Dabei definieren Sie ber die Eigenschaft ColumnWidth die Spaltenbreite und kmmern sich mithilfe der Eigenschaften HorizontalAlignment bzw. VerticalAlignment um die Textausrichtung in den Zellen der Spalten A und B.

277

Zellbearbeitung mit VBA

Abbildung 6.21: Alle Kommentare der Arbeitsmappe sind auf einem separaten Blatt aufgelistet.

Kommentare aus Zelleninhalten erstellen


Als Kommentare knnen Sie auch Zelleninhalte verwenden. Dies ist dann sinnvoll, wenn Sie beispielsweise anschlieend Daten aus Zellen lschen, aber noch eine Sicherung als Kommentar dieser alten Werte behalten mchten. Im folgenden Makro aus Listing 6.24 wird auf die TABELLE3 zugegriffen. In dieser Tabelle werden alle Zelleneintrge aus dem Bereich C5:D24 herausgenommen und als Kommentare eingefgt.
Listing 6.24: Kommentare aus Zelleninhalten bilden Sub KommentareAusZellen() Dim Kom As Comment Dim Zelle As Range Sheets("Tabelle3").Activate Range("C5:D24").Select For Each Zelle In Selection On Error Resume Next Set Kom = Zelle.AddComment Kom.Text Date & Chr(10) & Zelle.Value

278

Zellen kommentieren

Next Zelle End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Comment sowie eine vom Typ Range. Danach aktivieren Sie die gewnschte Tabelle und markieren den Bereich, dessen Zellen Sie als Kommentare einfgen mchten. In einer anschlieenden Schleife schieben Sie den Inhalt der einzelnen Zellen jeweils in ein Kommentarfenster. Dazu erzeugen Sie ber die Anweisung Set Kom =Zelle.Add Comment ein neues, noch leeres Kommentarfenster. ber die Eigenschaft Text erfassen Sie den Inhalt des Kommentars, der sich aus dem aktuellen Tagesdatum (Date) und dem Zelleninhalt ergibt.

Abbildung 6.22: Alle Zellen im markierten Bereich wurden mit Kommentaren ausgestattet.

Zellen fllen aus Kommentaren


Gerade haben Sie gelernt, wie Sie aus Zelleninhalten Kommentare machen knnen. Auch der umgekehrte Vorgang ist interessant und von praktischer Bedeutung. Im nchsten Makro aus Listing 6.25 wird auf die TABELLE3 zugegriffen. Auf dieser Tabelle werden alle Kommentartexte gesammelt und versetzt um drei Spalten nach rechts wieder in die Zellen eingefgt.
Listing 6.25: Kommentare in Zellen berfhren Sub ZellenMitKommentarenFllen() Dim Kom As Comment

279

Zellbearbeitung mit VBA

Sheets("Tabelle3").Activate For Each Kom In ThisWorkbook.Sheets("Tabelle3").Comments Range(Kom.Parent.Address).Offset(0, 3).Value = Kom.Text Next Kom End Sub

Deklarieren Sie zu Beginn eine Objektvariable vom Typ Comment. Mithilfe dieser Variablen bauen Sie sich nun eine Schleife auf, die alle Kommentare der TABELLE3 durchluft und diese um drei Spalten verschoben in die Zellen der Spalten F und G einfgt. Wo der einzelne Kommentar in der Zelle steckt, ermitteln 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 (keine Zeilenverschiebung) und den Spalten-Offset auf den Wert 3 setzen (Spaltenverschiebung um drei Spalten nach rechts). Den Inhalt des Kommentars ermitteln Sie ber die Eigenschaft Text, welche Sie auf die Objektvariable Kom anwenden.

Abbildung 6.23: Die Kommentare aus den Spalten C und D wurden in die Spalten F und G eingefgt.

Kommentare lschen
Oftmals dienen Kommentare lediglich als individuelle Gedankensttze und sind daher nicht unbedingt immer von allgemeinem Interesse. Wenn Sie also eine Arbeitsmappe versenden und deren Kommentare aus einer bestimmten Tabelle bzw. aus der ganzen Arbeitsmappe entfernen mchten, dann starten Sie eines der drei Makros aus Listing 6.26 bis 6.28, welche folgende Funktionen erfllen:

280

Zellen kommentieren

Lschen von Kommentaren, die sich in einem bestimmten Bereich einer Tabelle befinden Lschen von allen Kommentaren, die sich in einer Tabelle befinden Lschen aller Kommentare, die sich in der Arbeitsmappe befinden

Listing 6.26: Kommentare lschen im markierten Bereich Sub KommentareInTabelleLschen() Sheets("Tabelle3").Activate Range("C5:D24").Select Selection.ClearComments End Sub

Fr das Lschen von Kommentaren setzen Sie die Methode ClearComments ein. Um alle Kommentare einer Tabelle zu entfernen, starten Sie das Makro aus Listing 6.27.
Listing 6.27: Alle Kommentare aus einer Tabelle entfernen Sub KommentareAusTabelleLschen() Dim Kom As Comment For Each Kom In ThisWorkbook.Sheets("Tabelle3").Comments Kom.Delete Next Kom End Sub

Deklarieren Sie zuerst eine Objektvariable vom Typ Comment, die Sie in einer anschlieenden Schleife einsetzen, um alle Kommentare der TABELLE3 abzuarbeiten. Innerhalb der Schleife wenden Sie die Methode Delete an, um die Kommentare zu lschen. Im letzten Makro aus Listing 6.28 werden alle Kommentare, die sich in der Arbeitsmappe befinden, entfernt.
Listing 6.28: Alle Kommentare aus der Arbeitsmappe entfernen Sub KommentareAusMappeLschen() Dim Tabelle As Worksheet Dim Kom As Comment For Each Tabelle In ThisWorkbook.Worksheets

281

Zellbearbeitung mit VBA

For Each Kom In Tabelle.Comments Kom.Delete Next Kom Next Tabelle End Sub

Um alle Kommentare aus einer Arbeitsmappe zu entfernen, bentigen Sie zwei Schleifen. Die erste Schleife arbeitet alle Tabellen der Arbeitsmappe ab. Die zweite Schleife durchluft alle Kommentarzellen der jeweiligen Tabelle und entfernt die Kommentare mit Hilfe der Methode Delete. Gerade haben Sie gelernt, wie Sie Zellen ansteuern und auslesen knnen. Des Weiteren knnen Sie jetzt Zellen formatieren, benennen und mit Kommentaren belegen. Die Themen nun:

Arbeiten mit Formeln Tabellenfunktionen einsetzen Formeln finden und dokumentieren Gltigkeitsprfungen vornehmen

6.6

Arbeiten mit Formeln

Wenn wir von Formeln in VBA sprechen, dann meinen wir in erster Linie die vier Grundrechenarten, die Sie vom Taschenrechner her kennen. Auch bei den Rechenregeln rechnet Excel nach der allgemein gltigen Punkt-vor-Strich-Regel. Es folgen nun einige praktische Beispiele, in denen diese Rechenoperationen demonstriert werden. Alle Makrobeispiele knnen Sie in der Arbeitsmappe ZellenProg.xls im Verzeichnis Kap06 auf der beiliegenden CD-ROM nachschlagen.

Addition von bestimmten Stzen


Wenn Sie eine Zhlschleife verwenden, dann wird jeder Schleifendurchlauf in einer Zhlvariablen festgehalten. Bei einer solchen Schleife mssen Sie sich aber

282

Arbeiten mit Formeln

nicht um das Hochzhlen der Zhlvariablen kmmern. Diese Aufgabe erledigt Excel intern selbst. In der folgenden Aufgabe soll eine Tabelle Satz fr Satz abgearbeitet werden. Dabei sollen Stze gezhlt werden, die einer bestimmten Bedingung (numerischer Inhalt) entsprechen. Sehen Sie sich vorher Abbildung 6.24 an.

Abbildung 6.24: Eine Tabelle mit alphanumerischen und numerischen Werten

In dieser Tabelle soll die Anzahl der numerischen Werte ermittelt und diese addiert werden. Das Makro dafr lautet:
Listing 6.29: Numerische Zellen werden gezhlt und summiert Sub Dim Dim Dim WerteZhlenUndAddieren() i As Integer z As Integer Summe As Single

Sheets("Tabelle1").Activate Range("A1").Select z = 0 Summe=0 For i = 1 To ActiveSheet.UsedRange.Rows.Count If IsNumeric(ActiveCell) Then z = z + 1 Summe = Summe + ActiveCell.Value Else

283

Zellbearbeitung mit VBA

End If ActiveCell.Offset(1, 0).Select Next i MsgBox "Es wurden " & z & " numerische Werte gefunden!" & _ Chr(13) & _ "Die Summe der numerischen Werte betrgt: " & Summe End Sub

Definieren Sie zu Beginn des Makros zwei Zhlvariablen vom Typ Integer. Die eine davon wird fr die Schleifensteuerung bentigt, die zweite wird die Anzahl der numerischen Werte in der Tabelle ermitteln. Jetzt bentigen Sie eine Variable vom Typ Single, in der Sie die Summe der numerischen Zelleninhalte speichern knnen. Dabei haben Sie mit diesem Datentyp die Mglichkeit, auch Nachkommastellen mitzuverarbeiten. Setzen Sie die Variablen z und Summe zu Beginn sicherheitshalber auf den Wert 0. Die Variable i wird in der anschlieenden Schleife auf den Startwert 1 gesetzt. Die Schleife wird solange durchlaufen, bis die letzte gefllte Zeile in der Tabelle erreicht ist. Diese letzte Zeile ermitteln Sie mit der Anweisung ActiveSheet.UsedRange.Rows.Count. Innerhalb der Schleife prfen Sie mithilfe der Funktion IsNumeric, ob in der aktiven Zelle ein numerischer Wert steht. Wenn ja, dann addieren Sie die Zhlvariable z um den Wert 1 und speichern den Zellenwert in der Variablen Summe. Setzen Sie danach den Mauszeiger eine Zeile weiter nach unten und arbeiten Sie die Schleife Satz fr Satz ab. Geben Sie die Anzahl sowie die Summe der ermittelten Stze am Ende des Makros ber die Funktion MsgBox auf dem Bildschirm aus.

Abbildung 6.25: Addition von Zellen

284

Arbeiten mit Formeln

Subtraktion von Datumsangaben


Anhand einer Berechnung, die vom aktuellen Tagesdatum in die Vergangenheit geht, wird im folgenden Makro eine typische Subtraktion demonstriert. Ausgehend vom aktuellen Datum, werden genau 30 Tage subtrahiert und das Ergebnis auf dem Bildschirm angezeigt.
Listing 6.30: Eine Subtraktion von Datumswerten Sub DatumsBerechnung() Dim DatumVer As Date DatumVer = Date 30 MsgBox "Heute ist der " & Date & Chr(13) & _ "Vor 30 Tagen war der " & DatumVer, vbInformation End Sub

Da Excel intern Datumsangaben in Zahlen umrechnet, ist es kein Problem, Datumsangaben miteinander zu verrechnen. Deklarieren Sie zu Beginn des Makros eine Variable vom Typ Date. Danach wenden Sie die Funktion Date an, die Ihnen das aktuelle Tagesdatum meldet, und subtrahieren Sie davon die Zahl 30. Geben Sie das Ergebnis auf dem Bildschirm ber die Funktion MsgBox aus.

Abbildung 6.26: Datumssubtraktion durchfhren

Preise erhhen durch Multiplikation


Mit der Multiplikation knnen Sie z.B. Werte in einer Tabelle anpassen. Durch die Multiplikation eines Preises mit dem Faktor 1,1 findet eine Preiserhhung um 10% statt. Mchten Sie stattdessen Ihre Preise senken, dann multiplizieren Sie Ihre 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,1 erhht werden soll.

285

Zellbearbeitung mit VBA

Abbildung 6.27: Die Ausgangspreisliste

Ihre Aufgabe besteht nun darin, die Preise um den Faktor, der in Zelle F1 angegeben ist, zu erhhen. Dabei sollen die alten Preise in Spalte C erhalten bleiben. Schreiben Sie die neuen Preise in Spalte D.
Listing 6.31: Preise erhhen und runden Sub PreisAnpassung() Dim Faktor As Single Sheets("Tabelle2").Activate Range("C2").Select Faktor = Range("F1").Value Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.Round(ActiveCell.Value * Faktor, 2) ActiveCell.Offset(1, 0).Select Loop End Sub

Deklarieren Sie zu Beginn des Makros eine Variable vom Typ Single, in der Sie den Faktor aus Zelle F1 speichern, mit dem Sie Ihre Preise anpassen mchten. Nachdem Sie die gewnschte Tabelle und die Startzelle aktiviert haben, durchlaufen Sie eine Schleife, die solange luft, bis sie auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife fllen Sie die Nebenspalte D mit den neu kalkulierten Preisen. Dabei multiplizieren Sie den aktuellen Zellenwert aus Spalte C mit dem Faktor und runden das Ergebnis ber die Funktion Round. Geben Sie bei dieser Funktion noch an, nach wie vielen Stellen hinterm Komma gerundet werden soll.

286

Arbeiten mit Formeln

Abbildung 6.28: Die Preise wurden um 10% erhht.

DM-Umrechnung mit Division


Wenn Sie noch Excel-Arbeitsmappen haben sollten, die Sie auf die Eurowhrung umstellen mchten, dann knnen Sie diese alten DM-Betrge mit dem Faktor 1,95583 dividieren, um den Betrag in Euro zu erhalten. Sehen Sie sich dazu einmal die folgende Abbildung 6.29 an.

Abbildung 6.29: Die alte Artikelliste in DM-Betrgen

Die DM-Betrge sollen jetzt ber ein Makro umgerechnet und in der Spalte D eingefgt werden. Die Lsung dieser Aufgabe sehen Sie in Listing 6.32.
Listing 6.32: Alte DM-Betrge in Euro umrechnen Sub WhrungUmrechnen() Sheets("Tabelle3").Activate Range("C2").Select Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.Round(ActiveCell.Value / 1.95583, 2)

287

Zellbearbeitung mit VBA

ActiveCell.Offset(1, 0).Select Loop End Sub

Nachdem Sie die gewnschte Tabelle und die Startzelle aktiviert haben, durchlaufen Sie eine Schleife, die solange luft, bis sie auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife fllen Sie die Nebenspalte D mit den umgerechneten Preisen. Dabei dividieren Sie den aktuellen Zellenwert aus Spalte C mit dem Faktor 1,95583 und runden das Ergebnis ber die Funktion Round auf zwei Stellen hinterm Komma.

Abbildung 6.30: Die Whrungsumrechnung wurde durchgefhrt.

6.7

Tabellenfunktionen einsetzen

In Excel haben Sie die Mglichkeit, mehrere hundert verschiedene Funktionen ber die normale Arbeitsoberflche einzusetzen. Sehr viele dieser Tabellenfunktionen knnen Sie auch in VBA einsetzen.

Die Funktionsliste
Alle VBA-Tabellenfunktionen mssen in der englischen Syntax angegeben werden, was nicht unbedingt leicht ist, wenn Sie tglich mit den deutschen Tabellenfunktionen in der normalen Arbeitsoberflche arbeiten. Microsoft bietet Ihnen aber eine Hilfe an, indem sie Ihnen eine Excel-Tabelle mit ausliefert, in der Sie eine Gegenberstellung der deutschen und englischen Funktionen finden. Diese Arbeitsmappe heit VBAListe.xls und befindet sich in einem Unterverzeichnis von Office. Suchen Sie diese Arbeitsmappe am besten mit der Windows-Suchen-Funktion.

288

Tabellenfunktionen einsetzen

Abbildung 6.31: Eine Gegenberstellung von Tabellenfunktionen

Mit dieser Liste knnen Sie sich daranmachen, die ersten Tabellenfunktionen ber VBA zu benutzen.

Die Tabellenfunktion Sum


Im ersten Beispiel fr den Einsatz von Tabellenfunktionen in Excel-VBA werden Sie alle Preise der TABELLE2 summieren und das Ergebnis der Summation in Zelle D11 einfgen.
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 gewnschte Tabelle. Danach weisen Sie der Ergebniszelle direkt ber die Eigenschaft WorksheetFunction die Funktion Sum (= Summe) zu. Diese Funktion verlangt als Argument den Bereich, den sie summieren soll.

289

Zellbearbeitung mit VBA

Abbildung 6.32: Die neuen Preise wurden summiert.

Wie Sie in Abbildung 6.32 sehen, wird nur das Ergebnis der Tabellenfunktion in Zelle D11 eingefgt. Im nchsten Makro aus Listing 6.34 wird die Tabellenfunktion so eingefgt, dass diese nicht als Wert, sondern als wirkliche Funktion hinterlegt wird.
Listing 6.34: Eine Tabellenfunktion in eine Zelle einfgen (mit deutschen Befehlen) Sub SummeEinsetzenAlsTabFunktion() Sheets("Tabelle2").Activate Range("D11").FormulaLocal = _ "=Summe(D2:D9)" End Sub

Mithilfe der Eigenschaft FormulaLocal haben Sie die Mglichkeit, die Tabellenfunktionen so anzugeben, wie Sie es von der Standardoberflche her kennen. Sollten Sie mit anderssprachigen Anwendern Makros austauschen, empfiehlt sich aber doch die englische Variante, welche Sie in Listing 6.35 sehen knnen.
Listing 6.35: Eine Tabellenfunktion in eine Zelle einfgen (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 Tabellenfunktion in der englischen Schreibweise ein. Dieses Makro funktioniert dann auch in allen Sprachversionen.

290

Tabellenfunktionen einsetzen

Abbildung 6.33: Die Summe wird als Tabellenfunktion erfasst.

Die Tabellenfunktionen Datedif und Rank


Als zweites Beispiel fr den Einsatz von Tabellenfunktionen habe ich mich fr die Tabellenfunktionen DATEDIF und Rang entschieden. Mithilfe der Funktion DATEDIF knnen Sie Datumsberechnungen durchfhren. Die Tabellenfunktion Rang, die in der englischen Syntax Rank heit, legt wie der Name sagt, den Rang einer Zelle innerhalb einer Liste fest. In der folgenden Aufgabe sollen die drei ltesten Personen aus einer Liste ermittelt werden. Dabei wird das Geburtsdatum der Personen in Spalte B erfasst. Ihre Aufgabe 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.34: Die Ausgangssituation

291

Zellbearbeitung mit VBA

Fllen 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").Activate Range("B4").Select Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).FormulaLocal = _ "=DATEDIF(" & ActiveCell.Address & ";B1;""Y"")" ActiveCell.Offset(1, 0).Select Loop End Sub

In einer Schleife fllen Sie die Spalte C mit dem Alter der jeweiligen Personen. Dabei setzen Sie die Tabellenfunktion DATEDIF ein, der Sie im ersten Argument die Adresse der aktiven Zelle bergeben mssen und im zweiten Argument das aktuelle Tagesdatum, welches in Zelle B1 steht. Im dritten Argument legen Sie ber ein Formatkrzel fest, in welcher Einheit Sie das Alter haben mchten. (Tag = D, Monat = M und Jahr = Y). Nachdem das Krzel in doppelten Anfhrungsstrichen eingegeben werden muss, mssen Sie in diesem Fall noch zwei weitere doppelte Anfhrungsstriche setzen, damit der VBA-Editor die Eingabe richtig auswerten kann.

Abbildung 6.35: Das Alter in Jahren wurde ermittelt.

Im nchsten Schritt sollen die ltesten Personen ermittelt werden. Erfassen Sie zu diesem Zweck das Makro aus Listing 6.37:

292

Tabellenfunktionen einsetzen

Listing 6.37: Die ltesten Personen ber die Funktion Rank bestimmen Sub RangErmitteln() Dim Bereich As Range Sheets("Tabelle4").Activate Set 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).Select Loop End Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Range. In dieser Variablen geben Sie mithilfe der Anweisung Set bekannt, welcher Zellenbereich fr die Rangfolgenbestimmung herangezogen werden soll. Setzen Sie danach den Mauszeiger 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 fgen Sie die Tabellenfunktion Rank ber die Eigenschaft WorksheetFunction ein und bergeben dieser Funktion die aktive Zelle sowie den vorher definierten Bereich.

Abbildung 6.36: Wilhelm ist die lteste Person in der Liste.

Die Tabellenfunktion SumIf


Im nchsten Beispiel sollen aus einer Liste in TABELLE3 all diejenigen Positionen summiert werden, die einen Wert von 500 Euro oder mehr aufweisen. Fr diese

293

Zellbearbeitung mit VBA

Aufgabe knnen Sie die Worksheet-Funktion SumIf (= Summewenn) einsetzen. Mithilfe dieser Tabellenfunktion knnen Sie also eine bedingte Summierung durchfhren.
Listing 6.38: Die bedingte Summierung von Werten Sub BedingteSummierung() Dim Betrag As Single Sheets("Tabelle3").Activate Betrag = Application.WorksheetFunction.SumIf(Range("D2:D9"), ">500") MsgBox "Die Summe der Werte > 500 _ betrgt:" & _ Chr(13) & Format(Betrag, "#,##0.00 _"), vbInformationsgBox End Sub

bergeben Sie der Tabellenfunktion zuerst einmal den Bereich, der summiert werden soll. Im darauf folgenden Argument formulieren Sie die Bedingung. Mithilfe der Funktion Format weisen Sie dem Ergebnis das gewnschte Format zu.

Abbildung 6.37: Alle Werte grer als 500 wurden summiert.

Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in die TABELLE3 eingefgt 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").Activate Range("D12").Formula = "=SumIf(D2:D9,"">500"" )" End Sub

294

Tabellenfunktionen einsetzen

Weisen Sie der Eigenschaft Formula die Tabellenfunktion SumIf zu und achten Sie dabei darauf, dass Sie um Bedingung ein zustzliches doppelte Anfhrungszeichen setzen mssen, damit der VBA-Editor dies so erkennen kann.

Die Tabellenfunktion CountIf


Im folgenden Beispiel sollen auf TABELLE4 alle Personen gezhlt werden, die lter als 60 Jahre sind. Fr diese Aufgabe setzen Sie die Worksheet-Funktion Countif (= Zhlenwenn) ein, mithilfe derer Sie die bedingte Zhlung durchfhren knnen.
Listing 6.40: Eine bedingte Zhlung durchfhren Sub BedingteZhlung() Dim i As Integer Sheets("Tabelle4").Activate i = Application.WorksheetFunction.CountIf(Range("C4:C15"), ">60") MsgBox "Die Anzahl der Personen, die lter als 60 sind, lautet:" & _ Chr(13) & i, vbInformation End Sub

bergeben Sie der Funktion CountIf den Bereich, in dem Sie die Personen zhlen mchten, die lter als 60 Jahre sind. Die Bedingung >60 formulieren Sie gleich im Anschluss daran.

Abbildung 6.38: Alle Personen, die lter als 60 sind, werden gezhlt und ausgegeben.

295

Zellbearbeitung mit VBA

Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in die TABELLE4 eingefgt werden, dann starten Sie das folgende Makro aus Listing 6.41.
Listing 6.41: Die Tabellenfunktion wird als Funktion eingefgt Sub BedingteZhlungAlsFunktion() Sheets("Tabelle4").Activate Range("C18").Formula = "=CountIf(C4:C15, "">60"")" End Sub

Weisen Sie der Eigenschaft Formula die Tabellenfunktion CountIf zu und achten Sie dabei darauf, dass Sie um die Bedingung ein zustzliches doppeltes Anfhrungszeichen einfgen mssen, damit der VBA-Editor dies so erkennen kann.

Abbildung 6.39: Die Funktion wurde eingefgt.

Die Tabellenfunktion Count


Mithilfe der Worksheet-Funktion Count (= Anzahl) knnen Sie alle numerischen Werte in einer Liste zhlen. Im folgenden Beispiel sollen dabei alle numerischen Werte der Spalte A gezhlt und ausgegeben werden. Sehen Sie sich dazu das Makro aus Listing 6.42 an.

296

Tabellenfunktionen einsetzen

Listing 6.42: Alle numerischen Werte einer Liste zhlen Sub ZhlenNumerischeWerte() Dim i As Integer Sheets("Tabelle1").Activate i = Application.WorksheetFunction.Count(Range("A1:A17")) MsgBox "Die Anzahl der numerischen Werte, lautet:" & _ Chr(13) & i, vbInformation End Sub

Wenden Sie die Tabellenfunktion Count (=Anzahl) an, um numerische Werte einer Liste zu zhlen. Den Bereich, der dabei berprft werden soll, geben Sie direkt im Anschluss an diese Tabellenfunktion an.

Abbildung 6.40: Die Tabellenfunktion Count zhlt numerische Werte.

Die Tabellenfunktion CountA


Ist es Ihnen egal, was in einer Zelle steht, sei es nun ein numerischer oder ein alphanumerischer Wert, dann mssen Sie zur Zhlung dieser Zellen die Tabellenfunktion CountA (= Anzahl2) einsetzen, wie Sie dies im nchsten Makro aus Listing 6.43 sehen knnen.
Listing 6.43: Alle gefllten Zellen werden gezhlt. Sub ZhlenAlleZellen() Dim i As Integer

297

Zellbearbeitung mit VBA

Sheets("Tabelle1").Activate i = Application.WorksheetFunction.CountA(Range("A1:A17")) MsgBox "Die Anzahl der gefllten Zellen, lautet:" & _ Chr(13) & i, vbInformation End Sub

Mchten Sie nicht das Ergebnis der Tabellenfunktionen, sondern eben die Tabellenfunktionen selbst einfgen, starten Sie das Makro aus Listing 6.44.
Listing 6.44: Die Zhlfunktionen in die Tabelle einfgen Sub ZhlungAlsFunktionen() 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

Abbildung 6.41: Funktionen auch als Text einfgen

In der Spalte B werden die eingesetzten Funktionen aus Dokumentationszwecken noch mal als Text eingefgt. Wie Sie sehen, setzen Sie zwar englische Funktionen zum Fllen der Zellen ein. In Spalte A werden diese aber automatisch in ihre eingestellte Sprache umgesetzt. In Spalte B unterbleibt diese Konvertierung, da Sie als erstes Zeichen fr die jeweilige Zelle einen Apostroph gesetzt und somit diese Zelle als Text definiert haben. Sie haben gerade gelernt, wie Sie die Anzahl der numerischen Zellen sowie die Anzahl aller gefllten Zellen eines Bereiches zhlen knnen. Wie aber knnen Sie die alphanumerischen Zellen eines Bereiches zhlen? Fr diese Aufgabenstellung gibt es keine eigene Tabellenfunktion in Excel. Sie knnen aber die beiden Tabellenfunktionen CountA und Count voneinander subtra-

298

Tabellenfunktionen einsetzen

hieren, um die Anzahl der alphanumerischen Zellen zu erhalten, wie Sie das im folgenden Makro sehen knnen.
Listing 6.45: Zhlen von alphanumerischen Zellen Sub ZhlenAlphanumerischeZellen() 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, vbInformation End Sub

Durch die Subtraktion beider Tabellenfunktionen erhalten Sie die korrekte Anzahl der alphanumerischen Zellen.

Die Tabellenfunktion CountBlank


Neben den beiden Tabellenfunktionen Count und CountA gibt es die Mglichkeit, in Excel auch leere Zellen eines Bereiches zu zhlen. Setzen Sie fr diesen Zweck die Tabellenfunktion CountBlank (= AnzahlLeereZellen) ein. Im folgenden Beispiel aus Listing 6.46 greifen Sie wiederum auf die TABELLE1 zu und ermitteln im Bereich A1:A18 die Anzahl der leeren Zellen.
Listing 6.46: Die Anzahl der leeren Zellen eines Bereichs ermitteln Sub ZhlenLeereZellen() Dim i As Integer i = Application.WorksheetFunction.CountBlank(Range("A1:A18")) MsgBox "Die Anzahl der leeren Zellen, lautet:" & _ Chr(13) & i, vbInformation End Sub

bergeben Sie der Tabellenfunktion CountBlank den Bereich, den Sie nach leeren Zellen absuchen mchten. Enthlt eine Zelle lediglich ein Leerzeichen, dann meldet die Funktion CountBlank diese Zelle nicht als leer. Sie ist zwar optisch leer, fr Excel aber ist das Leerzeichen eben auch ein gltiger Wert.

299

Zellbearbeitung mit VBA

Um solche leeren Zellen besser sehen zu knnen, knnen Sie aus dem Men EXTRAS den Befehl OPTIONEN whlen und auf das Registerblatt UMSTEIGEN wechseln. Aktivieren Sie dort das Kontrollkstchen ALTERNATIVE BEWEGUNGSTASTEN und besttigen Sie mit OK. Nun werden leere Zellen, sofern diese aktiviert wurden, in der Bearbeitungsleiste dadurch gekennzeichnet, dass dort ein Apostroph angezeigt wird.
Abbildung 6.42: Leerzeichen in Zellen werden nun in der Bearbeitungsleiste angezeigt.

Da fhrende bzw. nachgestellte Leerzeichen in der Programmierung oft Probleme machen, gibt es in VBA eine Funktion (Trim), die Ihnen hilft, diese Leerstellen zu beseitigen. Das folgende Makro entfernt innerhalb einer Markierung alle Leerzeichen.
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 zelle End Sub

Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Range. Danach durchlaufen Sie alle Zellen einer Markierung und wenden die Funktion Trim 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.

300

Formeln finden und dokumentieren

Formelzellen finden
Eine Mglichkeit, sich Formeln, Funktionen und Verknpfungen anzeigen zu lassen, besteht darin, die Tastenkombination (Strg) + (#) zu drcken, um in die Formelansicht zu wechseln. Durch erneutes Drcken dieser Tastenkombination wird die Normalansicht von Excel wiederhergestellt. Eine andere Hilfe wre, alle Formeln und Verknpfungen der aktuellen Tabelle zu markieren. Dabei gehen Sie wie folgt vor: 1. Drcken Sie die Taste (F5), um das Dialogfeld GEHE ZU aufzurufen. 2. Klicken Sie danach auf die Schaltflche INHALTE. 3. Im Dialogfeld INHALTE FORMELN.
AUSWHLEN

aktivieren Sie die Optionsschaltflche

Abbildung 6.43: Alle Formelzellen der Tabelle aktivieren

4. Besttigen Sie mit OK. Als Ergebnis werden nun alle Formelzellen der aktuellen Tabelle markiert. Mit der Taste () knnen Sie dann von Zelle zu Zelle springen und die Formel in der Bearbeitungsleiste ansehen. Diese gerade durchgefhrte Aufgabe knnen Sie auch ber den Einsatz eines VBA-Makros erledigen, welches Sie in Listing 6.48 sehen knnen:

301

Zellbearbeitung mit VBA

Listing 6.48: Formelzellen in einer Tabelle markieren Sub FormelZellenMarkieren() Sheets("Tabelle4").Activate Selection.SpecialCells(xlCellTypeFormulas).Select End Sub

Mithilfe der Methode SpecialCells, der Sie die Konstante xlCellTypeFormulas bergeben, werden alle Zellen auf dem Tabellenblatt markiert, die entweder Formeln, Funktionen oder Verknpfungen enthalten.

Abbildung 6.44: Alle Formelzellen sind in der Tabelle markiert worden.

ber die Methode SpecialCells knnen Sie mithilfe der folgenden Konstanten aus Tabelle 6.3 auch andere Zellen markieren.
Konstante
xlCellTypeAllFormatConditions xlCellTypeAllValidation xlCellTypeBlanks xlCellTypeComments xlCellTypeConstants

Beschreibung Markiert alle formatierten Zellen Zellen mit Gltigkeitsregeln werden markiert. Gibt alle leere Zellen an Zellen mit Kommentaren werden markiert. Zellen mit Konstanten werden markiert.

Tabelle 6.3: Die Konstanten der Methode SpecialCells

302

Formeln finden und dokumentieren

Konstante
xlCellTypeFormulas xlCellTypeLastCell

Beschreibung Zellen mit Formeln werden markiert. Letzte Zelle im benutzten Bereich wird angesteuert. Zellen mit gleichem Format werden markiert. Zellen mit gleichen Gltigkeitskriterien werden markiert. Alle sichtbaren Zellen werden markiert.

xlCellTypeSameFormatConditions xlCellTypeSameValidation

xlCellTypeVisible

Tabelle 6.3: Die Konstanten der Methode SpecialCells (Forts.)

Formelzellen dokumentieren
Wir werden jetzt einen Schritt weiter gehen. Nachdem Sie gerade erfahren haben, wie Sie die Formelzellen der aktiven Tabelle ermitteln knnen, werden Sie jetzt alle verwendeten Formeln und Funktionen der Arbeitsmappe auf einer neuen Tabelle dokumentieren. Dabei sind folgende Informationen fr die Dokumentation von Interesse:

Name des Tabellenblattes Zellenadresse der Formel oder Funktion Formel oder Funktion Ergebnis der Formel oder Funktion

Um diese Aufgabe zu lsen, erfassen Sie das Makro aus Listing 6.49:
Listing 6.49: Alle Formeln und Funktionen werden in einer neuen Tabelle dokumentiert Sub Dim Dim Dim Dim FormelnUndFunktionenDokumentieren() i As Integer Zelle As Range s As String l As Long

Sheets.Add Before:=Worksheets(1) s = ActiveSheet.Name

303

Zellbearbeitung mit VBA

l = 1 Sheets(s).Cells(l, Sheets(s).Cells(l, Sheets(s).Cells(l, Sheets(s).Cells(l, Range(Cells(l, 1), l = l + 1

1).Value 2).Value 3).Value 4).Value Cells(l,

= "Tabelle" = "Zelle" = "Formel/Funktion" = "Inhalt" 4)).Font.Bold = True

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 i Sheets(s).Columns("A:D").AutoFit End Sub

Im ersten Schritt des Makros fgen Sie ber die Methode Add ein neues, noch leeres Tabellenblatt in die erste Position der Mappe ein. Danach speichern Sie den Namen dieser Tabelle mithilfe der Eigenschaft Name in der Variablen s. Erfassen Sie nun die berschriftenzeile dieser neuen Tabelle und verwenden dabei 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 Zeile dieser Tabelle an. Als Spaltenargument setzen Sie je nach Spalte den Wert 1 bis 4 ein, um die Spalten A bis D anzusprechen. Markieren Sie direkt im Anschluss diese vier gefllten berschriftenzellen und formatieren Sie mit dem Schriftschnitt FETT, indem Sie die Eigenschaft Bold auf das Objekt Font anwenden. Im nchsten Schritt durchlaufen Sie eine Schleife, die jede einzelne Tabelle der Arbeitsmappe durchluft. Innerhalb dieser Schleife aktivieren Sie das jeweilige Tabellenblatt ber die Methode Activate und markieren alle Formelzellen mithilfe der Anweisung Selection.SpecialCells(xlCellTypeFormulas).Select. Sollte eine Tabelle keine Formel enthalten, dann sorgen Sie ber die Anweisung On Error Resume Next dafr, dass es zu keinem Makroabsturz kommt. Enthlt eine

304

Formeln finden und dokumentieren

Tabelle also keine Formelzellen, dann wird dies einfach ignoriert und die Makroverarbeitung wird fortgesetzt. Sind nun alle Formelzellen der momentan aktiven Tabelle markiert, dann durchlaufen Sie in einer weiteren Schleife alle markierten Zellen. Innerhalb dieser Schleife, schreiben Sie den Namen der momentanen Tabelle in das Dokumentationsblatt in Spalte A. Um den Namen zu ermitteln, setzen Sie die Eigenschaft Name ein, die Sie auf das Auflistungsobjekt Worksheets anwenden. Der Index dieses Auflistungsobjekts, den Sie ber die Variable i variabel halten, gibt Ihnen Auskunft darber, welche Tabelle gerade aktiv ist. Die Zellenadresse der jeweiligen Formelzelle knnen Sie ber die Eigenschaft Address erfahren und in das Dokumentationsblatt in Spalte B schreiben. Die eigentliche Formel, die in der markierten Zelle steht, fragen Sie mithilfe der Eigenschaft FormulaLocal ab und tragen Sie in Spalte C des Dokumentationsblattes ein. Damit diese Formel aber nicht gerechnet wird, mssen Sie dabei als erstes Zeichen ein Apostroph einfgen, 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 Eintrge auch auf einen Blick angezeigt werden. Verwenden Sie zu diesem Zweck die Methode AutoFit, die Sie fr die Spalten A bis D anwenden.

Abbildung 6.45: Eine Auflistung aller Formeln/ Funktionen der Arbeitsmappe

305

Zellbearbeitung mit VBA

6.9

Gltigkeitsprfungen vornehmen

Seit der Version 97 ist es in Excel standardmig mglich, fr bestimmte Zellen und Bereiche eine Gltigkeitsfunktion anzuwenden. Sie haben dabei die Mglichkeit zu bestimmen, welche Eingaben in einem Bereich gemacht werden drfen und welche nicht. Bei Falscheingaben knnen Sie dem Anwender mittels einer Bildschirmmeldung mitteilen, wie er die Eingabe zu machen hat. Wenn Sie mchten, knnen Sie den Anwender sogar schon vor der Eingabe beim Positionieren des Cursors im Gltigkeitsbereich durch eine QuickInfo-Meldung auf die richtige Eingabesyntax aufmerksam machen. Die Funktion GLTIGKEIT knnen Sie einstellen, indem Sie aus dem Men DATEN den Befehl GLTIGKEIT auswhlen. Standardmig sehen Sie es den Zellen nicht an, ob diese mit einem Gltigkeitskriterium ausgestattet sind oder nicht. Erst wenn Sie den Mauszeiger auf eine Zelle mit eingestellten Gltigkeitskriterien positionieren und vorher eine Eingabemeldung definiert haben, erkennen Sie die Zellen mit Gltigkeitsfunktion. Eine kleine Ausnahme bildet das Auswahlkriterium LISTE. Damit knnen Sie fr eine Zelle gleich mehrere mgliche Eingaben akzeptieren, die auf eine Liste verweisen. In diesem Fall erscheint nach dem Positionieren des Mauszeigers ein Dropdown-Symbol am rechten unteren Rand der Gltigkeitszelle, welches Ihnen nach einem Klick ein Auswahlfenster mit den mglichen Eingabewerten der Liste anbietet. Lernen Sie nun einige Gltigkeitseinstellungen kennen, die Sie ber den Einsatz von VBA-Makros in Ihre Tabellen einfgen.

Nur ganze Zahlen eingeben


Erstellen Sie nun ein Gltigkeitskriterium fr eine Zelle mithilfe von VBA. Auf dem Tabellenblatt TABELLE5 sollen in Zelle C3 nur ganze Zahlen zwischen 1 und 10 zugelassen werden. Dazu erstellen Sie das Makro aus Listing 6.50.
Listing 6.50: Nur ganze Zahlen zwischen 1 und 10 drfen eingegeben werden Sub GltigkeitHinzufgen() Sheets("Tabelle5").Activate With Range("C3").Validation

306

Gltigkeitsprfungen vornehmen

.Add Type:=xlValidateWholeNumber, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="1", _ Formula2:="10" .InputTitle = "Zahl eingeben!" .ErrorTitle = "Keine gltige Zahl!" .InputMessage = _ "Geben Sie eine Zahl zwischen 1 und 10 ein." .ErrorMessage = _ "Sie mssen eine Zahl zwischen 1 und 10 eingeben." End With End Sub

Abbildung 6.46: Aus einer Liste knnen Eintrge ausgewhlt werden.

Abbildung 6.47: Elegante Auswahl aus einem ZellenDropdown

Mithilfe der Methode Add fgen Sie der Zelle C3 eine Gltigkeitsregel hinzu. Im ersten Argument Type legen Sie das Gltigkeitskriterium fest. Die mglichen Gltigkeitskriterien entnehmen Sie Tabelle 6.4.

307

Zellbearbeitung mit VBA

Type
xlValidateInputOnly xlValidateWholeNumber

Index
0 1

Beschreibung Jede Eingabe ist erlaubt. Nur ganze Zahlen im definierten Zahlenbereich sind erlaubt. Nur Dezimalzahlen im definierten Wertbereich werden zugelassen. Es sind nur Eingaben aus einer vorher definierten Liste mglich. Es sind nur Datumswerte im definierten Datumsbereich erlaubt. Es sind nur Zeitwerte im definierten Rahmen zulssig. Es werden nur Eingaben mit bestimmten Lngen zugelassen. Benutzerdefiniertes Gltigkeitskriterium

xlValidateDecimal

xlValidateList

xlValidateDate

XlValidateTime

XlValidateTextLength

XlValidateCustom

Tabelle 6.4: Die verfgbaren Gltigkeitskonstanten

Das zweite Argument AlertStyle legt den Stil der Gltigkeitsmeldung fest. Mglich sind hierbei xlValidAlertInformation, xlValidAlertStop oder xlValidAlertWarning. Je nach gewhltem Stil wird ein anderes Symbol in der Meldung angezeigt bzw. wird entsprechend auf Falscheingaben reagiert. Der AlertStyle xlValidAlertStop lsst beispielsweise keine andere Eingabe als die definierte zu. Beim AlertStyle xlValidAlertWarning wird zwar bei einer Falscheingabe eine Warnmeldung angezeigt, die Eingabe wird aber trotzdem zugelassen. Beim nchsten Argument, dem Operator, orientieren Sie sich an Tabelle 6.5:
Operator-Konstante
xlBetween xlNotBetween xlEqual

Beschreibung Zellenwert ist zwischen ... Zellenwert ist nicht zwischen ... Zellenwert ist gleich ...

Tabelle 6.5: Die Konstanten fr den Operator

308

Gltigkeitsprfungen vornehmen

Operator-Konstante
xlNotEqual xlGreater xlGreaterEqual xlLess xlLessEqual

Beschreibung Zellenwert ist ungleich ... Zellenwert ist grer ... Zellenwert ist grer oder gleich ... Zellenwert ist kleiner ... Zellenwert ist kleiner oder gleich ...

Tabelle 6.5: Die Konstanten fr den Operator (Forts.)

Die beiden letzten Argumente Formula1 und Formula2 beinhalten die Wertgrenzen. Sehen Sie nun das Ergebnis des Makros in Abbildung 6.48.

Abbildung 6.48: Falsche Eingaben werden verworfen.

Datumsgrenzen einstellen
Mithilfe der Gltigkeitsfunktion in Excel knnen Sie auch Datumsgrenzen festlegen. So sollen beispielsweise in Zelle C4 nur Datumsangaben vom 1.1.2002 bis zum 31.12.2002 gemacht werden drfen. Das Makro fr diese Aufgabe knnen Sie in Listing 6.51 sehen.
Listing 6.51: Datumsgrenzen als Gltigkeit festlegen Sub Datumsgrenzen() Sheets("Tabelle5").Activate Range("C4").Select With Selection.Validation .Delete

309

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 = _ "Gltiges Datum zw. dem 1.1.2002 und dem 31.12.2002 eingeben" .ErrorMessage = _ "Sie haben kein gltiges Datum eingegeben!" .ShowInput = True .ShowError = True End With End Sub

Vorsorglich lschen Sie eine eventuell schon bestehende Gltigkeitsregel mit der Methode Delete. Danach fgen Sie eine neue Gltigkeitsregel ber die Methode Add ein und legen den Gltigkeitstyp ber die Eigenschaft Type fest. Bei der Eingabe des Gltigkeitskriteriums mssen Sie auf alle Flle die Funktion
CDate verwenden. Sie sorgt dafr, dass die String-Angabe ("1/1/2002") in ein glti-

ges Datumsformat konvertiert wird.

Abbildung 6.49: Datumseingaben berprfen

Die Eigenschaft IgnoreBlank setzen Sie auf den Wert True, wenn Sie leere Werte zulassen mchten. Danach definieren Sie zuerst den Eingabetitel sowie die Fehlertitel und anschlieend die beiden Meldungen. Bei den beiden Eigenschaften ShowInput

310

Gltigkeitsprfungen vornehmen

und ShowError handelt es sich um eine Art Schalter, den Sie setzen knnen. Standardmig sind diese beiden Schalter jedoch gesetzt. Indem Sie einen Schalter auf den Wert False setzen, wird die definierte Meldung als QuickInfo nicht mehr angezeigt.

Gltigkeitsliste erstellen
Um dem Anwender mgliche Eingaben anzubieten, knnen Sie diese auch in einer Liste zusammenstellen und ihm als Zellen-Dropdown anbieten. In der folgenden Aufgabe aus Listing 6.52 wird auf der TABELLE5 in der Zelle C5 ein Zellen-Dropdown eingefgt, welches verfgbare Kostenstellen anbietet.
Listing 6.52: Eine Gltigkeitsliste 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 auswhlen" End With End Sub

Um eine Gltigkeitsliste zusammenstellen zu knnen, mssen Sie eine Gltigkeit ber die Methode Add vom Typ xlValidateList einfgen. Danach geben Sie im Argument Operator die Konstante XlEqual an und im Argument Formula1 die einzelnen mglichen Kostenstellen, jeweils getrennt durch ein Komma, ein.

Abbildung 6.50: Ein Zellen-Dropdown zur Verfgung stellen

311

Zellbearbeitung mit VBA

6.10 Fragen & Antworten


F

Wie knnen Sie die letzten fnf Zellen einer Spalte markieren?
A

Diese Aufgabe knnen Sie mit folgendem Makro lsen:


Listing 6.53: Die letzten fnf Zellen einer Spalte markieren Sub Letzte5ZeilenInSpalteMarkieren() Sheets("Tabelle14").Activate Range("A65536").End(xlUp).Select Range(Selection, ActiveCell.Offset(-4, 0)).Select End Sub

ber die Eigenschaft End ermitteln Sie die letzte belegte Zelle der Spalte A. Von da ab markieren Sie ber die Methode Select die darber liegenden vier Zellen, indem Sie den Zellen-Offset auf den Wert 4 setzen.
F

Wie knnen Sie aus allen benutzten Zellen einer Tabelle die Leerzeichen eliminieren?
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 zelle End Sub

ber die Anweisung ActiveSheet.Usedrange erfahren Sie den bentzten Bereich Ihrer Tabelle. Durchlaufen Sie danach jede einzelne Zelle dieses Bereichs und setzen Sie die Funktion Trim ein, um die Leerzeichen in den Zellen zu entfernen.
F

Wie knnen Sie ber den Einsatz einer Tabellenfunktion in VBA den zweitgrten Wert in einem Bereich ermitteln?
A

Setzen Sie fr diese Aufgabe die Funktion Large ein.

312

Quiz

Listing 6.55: Die zweitgrte Zahl in einem Bereich ausgeben Sub ZweitGrteZahlErmitteln() Dim i As Single Sheets("Tabelle1").Activate i = Application.WorksheetFunction.Large(Range("A1:A17"), 2) MsgBox "Die zweit-grte Zahl lautet: " & _ Chr(13) & i, vbInformation End Sub

Die Funktion Large bentigt zwei Argumente. Im ersten Bereich geben Sie die Adresse des Bereichs an, in dem Sie nach der zweithchsten Zahl suchen mchten. Das zweite Argument gibt den Rang wieder.
F

Wie knnen Sie die Anzahl der Formelzellen auf einer Tabelle zhlen?
A

Geben Sie dazu das Makro aus Listing 6.56 ein:


Listing 6.56: Formelzellen in einer Tabelle zhlen Sub FormelnZhlen() Dim l As Long Dim zelle As Range For Each zelle In ActiveSheet.Cells.SpecialCells(xlFormulas) l = l + 1 Next zelle MsgBox "Die Anzahl der Formelzellen lautet: " & l End Sub

ber die Methode SpecialCells, der Sie die Konstante xlFormulas mitgeben, knnen Sie die Formelzellen in einer Tabelle ermitteln. Diese markieren Sie ber die Methode Select. Innerhalb der Schleife zhlen Sie die markierten Zellen.

6.11 Quiz
F F

Wie kann man mithilfe der Eigenschaft Cells eine Zelle ansteuern? Wie knnen Sie den verwendeten Bereich einer Tabelle bestimmen?

313

Zellbearbeitung mit VBA

F F F F F F F

Welche Methode muss man einsetzen, wenn man mehrere Bereiche vereinen mchte? Wie knnen Sie die Hintergrundfarbe der aktiven Zelle am schnellsten bestimmen? Was muss man bei der Vergabe von Namen mit VBA beachten? Was ist der Unterschied zwischen den beiden Eigenschaften Formula bzw. FormulaLocal? Wie heit die Arbeitsmappe, in der eine Gegenberstellung von englischen und deutschen Tabellenfunktionen angeboten wird? Mit welcher Methode kann man sich bestimmte Zellen in einer Tabelle markieren lassen? Was mssen Sie bei der Gltigkeitsprfung in Bezug auf Datumseingaben beachten?

6.12 bungen
Zum Abschluss des Tages versuchen Sie die folgenden bungen zu bearbeiten. Die Lsungsmakros knnen Sie im Anhang A nachblttern: 1. Erstellen Sie eine neue Tabelle und fgen Sie dort im Bereich A1:D20 einige Zahlenwerte ein. Ihre Aufgabe besteht nun darin, alle Zellen zu kennzeichnen, die einen Wert grer 500 aufweisen. Frben Sie diese Zellen mit der Hintergrundfarbe GELB. 2. Listen Sie die Zellenadressen aller verwendeten Namen einer Arbeitsmappe in einem Meldungsfenster auf. 3. Dokumentieren Sie alle verwendeten Namen einer Arbeitsmappe, indem Sie eine neue Tabelle einfgen und den Namen und dessen Zellenadresse ausgeben. 4. Lschen Sie alle Gltigkeitsfestlegungen aus einer Tabelle. 5. Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte.

314

Aktionen und Benutzereingaben in Excel berwachen

Aktionen und Benutzereingaben in Excel berwachen

Gestern haben Sie gelernt, wie Sie mit Formaten, Formeln und Tabellenfunktionen in VBA-Excel umgehen. Auch das Aufspren von Formeln und deren Konvertierung in Festwerte sowie die Gltigkeitsprfung waren weitere wichtige Themen. Die Themen heute:

Was sind Ereignisse? Ereignisse auf Arbeitsmappenebene Ereignisse auf Tabellenblattebene Excel ber Tastenkombinationen steuern Programmieren mit der Maus Excel zeitmig steuern

7.1

Was sind Ereignisse?

Die Programmierung von Ereignissen ist eines meiner Lieblingsthemen in der VBA-Programmierung. Was steckt dahinter? Nun, unter einem Ereignis knnen Sie alle mglichen Vorgnge in Excel fassen, wie z.B. das ffnen einer Arbeitsmappe, das Eingeben von Daten, das Drucken von Tabellen oder den Speichervorgang einer Mappe. Dies alles sind typische Vorgnge in Excel, die auch Ereignisse genannt werden. Sie haben die Mglichkeit, weitere Aktionen diesen Ereignissen anzuhngen, d.h. Sie knnen beispielsweise dafr sorgen, dass beim Ereignis ffnen einer Arbeitsmappe weitere VBA-Befehle ausgefhrt werden sollen. Sie haben somit die Mglichkeit, auf jedes Ereignis in Excel individuell zu reagieren. Bei den Ereignissen unterscheidet man in erster Linie zwischen Ereignissen, die fr die gesamte Arbeitsmappe gelten, und Ereignissen, die nur auf bestimmten Tabellenblttern Geltung haben. Ereignisse fr eine Arbeitsmappe wren beispielsweise das ffnen, Speichern, Drucken oder Schlieen einer Arbeitsmappe. Ein Beispiel fr ein Tabellenereignis wre z.B. die Erfassung von Daten in einer Tabelle oder das Aktivieren bzw. Verlassen einer Tabelle. Selbstverstndlich gibt es noch viele weitere Ereignisse, wie z.B. Ereignisse bei UserForms (Dialogen) und Steuerelementen, die Sie am 13. Tag kennen lernen werden.

316

Ereignisse auf Arbeitsmappenebene

Alle Beispiele dieses Tages finden Sie auf der beiliegenden CD-ROM in den Arbeitsmappen Ereignisse.xls und Steuerung.xls im Verzeichnis Kap07.

7.2

Ereignisse auf Arbeitsmappenebene

Wichtige Ereignisse, welche fr die Arbeitsmappe gelten, sind zum einen das Ereignis Workbook_Open, das eintritt, sobald die Arbeitsmappe geffnet wird, und zum anderen das Ereignis Workbook_BeforeClose, welches automatisch ausgelst wird, sobald die Arbeitsmappe geschlossen wird.

Das Ereignis Workbook_Open


Das Ereignis Workbook_Open (beim ffnen) wird in der Praxis meist eingesetzt, um Meldungen anzuzeigen, um benutzerdefinierte Arbeitsumgebungen einzurichten, um Sachverhalte zu prfen oder auch um viele verschiedene Aufgaben zu erledigen, die einen vorbereitenden Charakter haben. Im nchsten Beispiel werden Sie beim ffnen einer Arbeitsmappe dafr sorgen, dass eine bestimmte Tabelle aktiviert wird. Standardmig stellt Excel beim ffnen einer Arbeitsmappe immer die Tabelle ein, die direkt vor der letzten Speicherung der Arbeitsmappe aktiviert war. Wenn Sie daran denken, dass Sie beispielsweise eine Art Inhaltsverzeichnis fr die Arbeitsmappe in TABELLE1 erstellt haben, wre es nun eine tolle Sache, diese Tabelle standardmig beim ffnen der Arbeitsmappe einzustellen. Um das Ereignis Workbook_Open einzustellen, gehen Sie wie folgt vor: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an. 3. Klicken Sie im Codefenster auf den Pfeil des linken Kombinationsfeldes und whlen Sie den Eintrag Workbook aus. Excel stellt Ihnen nun standardmig ein schon vorgefertigtes Ereignismakro zur Verfgung.

317

Aktionen und Benutzereingaben in Excel berwachen

Abbildung 7.1: Das Ereignis Workbook_Open einstellen Private Sub Workbook_Open() End Sub

Mit einem Klick auf das zweite Kombinationsfeld bekommen Sie alle verfgbaren Ereignisse angezeigt, welche fr die Arbeitsmappe einsetzbar sind. Ergnzen 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

318

Ereignisse auf Arbeitsmappenebene

Bauen Sie sicherheitshalber eine Fehlerbehandlung in ein Ereignis ein. Fr den Fall, dass das gewnschte Tabellenblatt umbenannt bzw. gelscht wurde, haben Sie somit verhindert, dass das Makro abstrzt. Mchten Sie eine Arbeitsmappe mit hinterlegten Ereignissen ffnen und dabei auf deren Ausfhrung verzichten, so drcken Sie beim ffnen der Datei die Taste ().

Das Ereignis Workbook_BeforeClose


Das Ereignis Workbook_BeforeClose (vor dem Schlieen) tritt genau dann ein, wenn Sie versuchen, eine Arbeitsmappe zu schlieen. Dieses Ereignis kann aber auch so eingestellt werden, dass es abgebrochen wird, d.h. ber einen Trick knnen Sie verhindern, dass eine Arbeitsmappe geschlossen wird. Sie knnen dabei aber eine versteckte Mglichkeit bereithalten, die es Ihnen dennoch erlaubt, die Arbeitsmappe zu schlieen. Im folgenden Beispiel in Listing 7.2 kann eine Arbeitsmappe nur dann geschlossen werden, wenn in TABELLE1 in Zelle C1 der Text OK steht. Um dieses Ereignis einzustellen, verfahren Sie wie folgt: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung 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 und whlen Sie den Eintrag Workbook aus. 4. Im zweiten Kombinationsfeld, rechts oben, whlen Sie den Eintrag Before Close aus. 5. Ergnzen Sie das Ereignis wie folgt:
Listing 7.2: Das Schlieen 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

Aktionen und Benutzereingaben in Excel berwachen

ThisWorkbook.Save End If End Sub

Nur wenn in der Zelle C1 ein Wert ungleich OK steht, kann die Arbeitsmappe geschlossen werden. In diesem Fall wird das Argument Cancel auf den Wert False gesetzt, die Arbeitsmappe ber die Methode Save gespeichert und geschlossen. Im andern Fall bleibt die Arbeitsmappe geffnet. Das Speichern der Arbeitsmappe ist aber weiterhin mglich!

Das Ereignis Workbook_BeforeSave


Beim Ereignis Workbook_BeforeSave (vor dem Speichern) knnen Sie gezielt darauf reagieren, wenn eine Arbeitsmappe gespeichert wird. Im folgenden Beispiel wird verhindert, dass eine Arbeitsmappe gespeichert werden kann. Damit knnen Sie Ihre Arbeitsmappe vor Vernderungen schtzen, ohne die Arbeitsmappe durch ein Kennwort zu schtzen. Die Speicherung soll aber in einem bestimmten Fall doch mglich sein, und zwar vereinbaren Sie, dass die Arbeitsmappe gespeichert werden darf, wenn das Datum in Zelle A1 der TABELLE1 dem aktuellen Datum entspricht. Setzen Sie diese Aufgabenstellung nun um, indem Sie die nchsten Arbeitsschritte befolgen: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung 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 und whlen Sie den Eintrag Workbook aus. 4. Im zweiten Kombinationsfeld, rechts oben, whlen Sie den Eintrag BeforeSave aus. 5. Ergnzen Sie das Ereignis wie folgt:
Listing 7.3: Speichern ist nur ber eine Bedingung mglich Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) If Worksheets("Tabelle1").Range("A1").Value <> Date Then

320

Ereignisse auf Arbeitsmappenebene

MsgBox "Arbeitsmappe kann nicht gespeichert werden!" Cancel = True Else Cancel = False End If End Sub

Nur wenn in der Zelle A1 ein Datumswert steht, der dem aktuellen Tagesdatum entspricht, kann die Arbeitsmappe gespeichert werden. In diesem Fall wird das Argument Cancel auf den Wert False gesetzt und die Arbeitsmappe gespeichert.

Das Ereignis Workbook_NewSheets


Mit dem Ereignis Workbook_NewSheets (beim Einfgen einer neuen Tabelle), das erst ab der Excel-Version 2002 verfgbar ist, knnen Sie auf das Einfgen neuer Tabellenbltter in eine Arbeitsmappe reagieren. Im folgenden Beispiel knnen Sie neue Tabellenbltter nur einfgen, wenn Sie ein bestimmtes Kennwort wissen. Setzen Sie diese Aufgabenstellung nun um, indem Sie die nchsten Arbeitsschritte befolgen: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung 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 und whlen Sie den Eintrag Workbook aus. 4. Im zweiten Kombinationsfeld, rechts oben, whlen Sie den Eintrag NewSheet aus. Ergnzen 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 heit das Kennwort?")

321

Aktionen und Benutzereingaben in Excel berwachen

If s <> "Test" Then Application.DisplayAlerts = False Sh.Delete Application.DisplayAlerts = True Else End If End Sub

Fragen Sie zu Beginn des Ereignisses ein Kennwort ab und werten Sie die Eingabe des 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 Lschvorgang der Tabelle keine Rckfragemeldung von Excel angezeigt wird, setzen Sie die Eigenschaft DisplayAlerts auf den Wert False. Nach dem Lschen der Tabelle setzen Sie diese Eigenschaft wieder auf den Wert True.

Weitere Arbeitsmappenereignisse im berblick


Entnehmen Sie aus der Tabelle 7.1 alle mglichen Ereignisse, die Sie fr die Arbeitsmappe anwenden knnen. Das eine oder andere Ereignis werden Sie im Laufe der nchsten Tage wieder sehen.
Ereignis
Workbook_Activate Workbook_AddinInstall

Beschreibung Tritt ein, sobald eine Arbeitsmappe aktiviert wird. 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. Tritt ein, wenn ein Add-In aus dem Add-Ins-Manager deaktiviert wird. Tritt vor dem Druck einer Arbeitsmappe oder auch nur einzelner Tabellen ein. Tritt vor dem Speichern-Vorgang ein. Dabei spielt es keine Rolle, ob Sie ber Menbefehle, Symbolleiste oder Tastenkombination speichern.

Workbook_AddinUninstall

Workbook_BeforePrint

Workbook_BeforeSave

Tabelle 7.1: Alle Arbeitsmappenereignisse im berblick

322

Ereignisse auf Arbeitsmappenebene

Ereignis
Workbook_Deactivate

Beschreibung Tritt ein, wenn eine Arbeitsmappe deaktiviert wird, beispielsweise wenn eine Arbeitsmappe minimiert wird. Tritt ein, wenn eine neue Tabelle in die Arbeitsmappe eingefgt wird. Tritt ein, wenn ein beliebiges Tabellen- oder Diagrammblatt in der Arbeitsmappe aktiviert wird. Arbeitsmappe ein Doppelklick mit der linken Maustaste durchgefhrt wird.

Workbook_NewSheet

Workbook_SheetActivate

Workbook_SheetBeforeDoubleClick Tritt ein, wenn an einer beliebigen Stelle der

Workbook_SheetBeforeRightClick

Tritt ein, wenn an einer beliebigen Stelle der Arbeitsmappe ein Klick mit der rechten Maustaste durchgefhrt wird. Tritt nach Neuberechnung jedes Tabellenblattes auf. Tritt ein, wenn sich auf einem beliebigen Tabellenblatt etwas ndert, sei es durch eine Verknpfung oder durch den Anwender. Tritt ein, sobald ein beliebiges Tabellenblatt in der Arbeitsmappe verlassen wird. Tritt ein, wenn der Anwender auf einen Hyperlink in einer Tabelle klickt. Tritt ein, wenn sich die Markierung auf einem Tabellenblatt ndert. Tritt ein, wenn ein Arbeitsmappenfenster aktiviert wird. Tritt ein, wenn ein Arbeitsmappenfenster deaktiviert wird. Tritt ein, wenn eine nderung an der Gre des Arbeitsmappenfensters durchgefhrt wurde.

Workbook_SheetCalculate Workbook_SheetChange

Workbook_SheetDeactivate

Workbook_SheetFollowHyperlink

Workbook_SheetSelectionChange

Workbook_WindowActivate

Workbook_WindowDeactivate

Workbook_WindowResize

Tabelle 7.1: Alle Arbeitsmappenereignisse im berblick (Forts.)

323

Aktionen und Benutzereingaben in Excel berwachen

7.3

Ereignisse auf Tabellenblattebene

Im Gegensatz zu Arbeitsmappenereignissen, die fr alle Tabellen einer Arbeitsmappe gleichermaen gelten, knnen Sie ber Tabellenereignisse ganz gezielt Ereignisse fr bestimmte Tabellenbltter einstellen. Ein wichtiges Ereignis, das fr das Tabellenblatt gilt, ist z.B. das Ereignis Worksheet_Activate, mit dem Sie bestimmen knnen, was passieren soll, wenn ein bestimmtes Tabellenblatt aktiviert wird. Auch das Ereignis Worksheet_Change ist von groer Bedeutung in der Praxis: Mithilfe dieses Ereignisses knnen Sie auf nderungen in Ihren Tabellen reagieren. Dabei haben Sie die Mglichkeit, nderungen in der gesamten Tabelle oder ganz gezielt in einzelnen Zellen oder Bereichen zu berwachen.

Das Ereignis Activate


Das Ereignis Activate (beim Aktivieren) tritt dann ein, wenn Sie eine Tabelle aktivieren. Dabei ist es egal, ob Sie die Tabelle ber die Registerlaschen, ber die Tastenkombination (Strg) + (Bild_) bzw. (Strg) + (Bild_) oder gar ber einen Fensterwechsel ansteuern. In allen Fllen wird dieses Ereignis ausgefhrt, sofern Sie es in der Entwicklungsumgebung eingestellt haben. Im folgenden Beispiel wird beim Aktivieren der TABELLE2 automatisch die aktuelle Uhrzeit in Zelle A1 eingetragen. Um das Ereignis Activate fr diese Aufgabe einzustellen, verfahren Sie wie folgt: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen mchten, doppelt an. In unserem Beispiel ist das die TABELLE2 (siehe Abbildung 7.2). 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und whlen Sie den Eintrag Worksheet aus. 4. Im zweiten Kombinationsfeld whlen Sie dann das Ereignis Activate aus. 5. Ergnzen Sie das noch leere Ereignismakro wie folgt:

324

Ereignisse auf Tabellenblattebene

Abbildung 7.2: Das Ereignis Activate einstellen 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 Uhrzeit mithilfe der Funktion Time. Formatieren Sie die Zeitangabe ber die Funktion Format, der Sie die Formatkrzel hh fr Stunden und mm fr Minuten bergeben. Mchten Sie zustzlich noch die Sekunden mitanzeigen, dann ndern Sie die Zeile wie folgt:
Range("A1").Value = Format(Time, "hh:mm,ss")

Das Ereignis Change


Das wohl am hufigsten eingesetzte Ereignis lautet Change (bei nderung) und kann eingesetzt werden, um auf nderungen in Ihrer Tabelle zu reagieren. Sie haben dabei die Mglichkeit, die gesamte Tabelle, einen Teil davon oder einzelne Zellen auf Vernderungen hin zu berwachen. Im folgenden Beispiel werden alle zuknftigen nderungen der TABELLE3 sofort kenntlich gemacht, indem der Hintergrund dieser Zellen mit der Farbe ROT belegt wird. Gehen Sie dabei von einer Personalliste aus, welche tglich aktuali-

325

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 knnen. Schauen Sie sich dazu einmal die Ausgangsliste in Abbildung 7.3 an.

Abbildung 7.3: Die Ausgangsliste

Im Verlauf eines Monats knnen sich einige Dinge ndern, wie beispielsweise folgende:

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 Grnde, eine Personalliste zu ndern, gibt es in Hlle und Flle. Machen Sie nun die Vernderungen sichtbar, indem Sie das Ereignis Worksheet_Change einstellen. Dabei verfahren Sie wie folgt: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen mchten, doppelt an. In unserem Beispiel ist das die TABELLE3. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und whlen Sie den Eintrag Worksheet aus.

326

Ereignisse auf Tabellenblattebene

4. Im zweiten Kombinationsfeld whlen Sie dann das Ereignis Change aus. 5. Ergnzen Sie das noch leere Ereignismakro wie folgt:
Listing 7.6: Alle nderungen in der Tabelle einfrben Private Sub Worksheet_Change(ByVal Target As Range) Target.Interior.ColorIndex = 3 End Sub

Wenden Sie die Eigenschaft ColorIndex auf das Objekt Interior (= Hintergrund der Zelle) an und frben Sie das Objekt Target (= Zelle) rot, indem Sie den Farbindex 3 einsetzen.

Abbildung 7.4: Die nderungen werden sofort ersichtlich.

Haben Sie am Ende des Monats alle Ihre nderungen nachvollzogen, knnen Sie die Frbungen wieder entfernen, ohne dass dadurch das Ereignis Change ausgelst wird. Ereignisse reagieren allgemein nicht auf Formatnderungen. Im nchsten Beispiel wird das Ereignis Change in TABELLE4 nur ausgelst, wenn nderungen in einem bestimmten Bereich C4:C8 durchgefhrt werden. Sehen Sie sich vorab einmal Abbildung 7.5 an. Alle Eingaben im Bereich C4 bis C8 sollen sofort in Grobuchstaben umgewandelt werden. Erfassen Sie zu diesem Zweck das Ereignis Change hinter der TABELLE4.

327

Aktionen und Benutzereingaben in Excel berwachen

Abbildung 7.5: Im Formular soll auf Eingaben reagiert werden. 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 If End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range und geben Sie ber die Anweisung Set bekannt, wo sich der zu berwachende Bereich in der Tabelle befinden soll. ber die Methode Intersect prfen Sie, ob die genderte Zelle im definierten Zielbereich Bereich liegt. Wenn ja, setzen Sie die Funktion UCase in, um die eingegebenen Buchstaben in Grobuchstaben umzuwandeln. Um Buchstaben in Kleinbuchstaben zu wandeln, setzen Sie die Funktion LCase ein.

Abbildung 7.6: Eingaben im Bereich C4:C8 werden automatisch nach Drcken der Taste (Enter) in Grobuchstaben umgesetzt.

328

Ereignisse auf Tabellenblattebene

Das Ereignis Selection_Change


Wenn Sie auf der Suche nach einer bestimmten Information in einer Tabelle sind und diese auch gefunden haben, interessiert Sie nicht nur der Inhalt der gefundenen Zelle, sondern oft auch die Informationen, die in den brigen Zellen der Zeile stecken. Aus diesem Grund knnen Sie das Ereignis Worksheet_Selection Change (bei Auswahlnderung) auch einsetzen, um die Markierung einer Zelle auf die Markierung der ganzen Zeile auszuweiten. Stellen Sie das Ereignis Selection_Change nun ein, indem Sie wie folgt vorgehen: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen mchten, doppelt an. In unserem Beispiel ist das die TABELLE4. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und whlen Sie den Eintrag Worksheet aus. 4. Im zweiten Kombinationsfeld whlen Sie dann das Ereignis Selection_Change aus. 5. Ergnzen 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 = True End Sub

Im Listing 7.8 mssen Sie die Ereignissteuerung kurzfristig ausschalten, um zu verhindern, eine Endlosschleife zu produzieren. Dazu setzen Sie die Eigenschaft EnableEvents auf den Wert False. Danach markieren Sie die komplette Zeile und sorgen dafr, dass der Mauszeiger trotzdem wieder auf der ursprnglich markierten Zelle positioniert wird. Setzen Sie daraufhin die Eigenschaft EnableEvent wieder auf den Wert True, um die Ereignissteuerung zuzulassen.

329

Aktionen und Benutzereingaben in Excel berwachen

Abbildung 7.7: Ein automatischer Zeilenzeiger

Das Ereignis Calculate


Das Ereignis Calculate (bei Neuberechnung) wird automatisch ausgelst, wenn die Tabelle neu berechnet wird. Dies ist immer dann der Fall, wenn sich Formeln bzw. Funktionen aktualisieren. Im folgenden Beispiel sehen Sie sich einmal Abbildung 7.8 an.

Abbildung 7.8: Das einfache Summierungsbeispiel

Wenn Sie jetzt die Zelle B10 berwachen mchten, dann knnen Sie dies nicht ber das Ereignis Change durchfhren, da diese Zelle eine Formel beinhaltet, die sich automatisch anpasst, wenn nderungen in den Zellen B5:B9 durchgefhrt werden. Sie mssen daher entweder die Zellen B5:B9 berwachen oder ganz allgemein das Ereignis Calculate einsetzen, das automatisch ausgelst wird, wenn eine Neuberechnung durchgefhrt wird.

330

Ereignisse auf Tabellenblattebene

Um das Ereignis Calculate einzustellen, verfahren Sie wie folgt: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen mchten, doppelt an. In unserem Beispiel ist das die TABELLE6. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und whlen Sie den Eintrag Worksheet aus. 4. Im zweiten Kombinationsfeld whlen Sie dann das Ereignis Calculate aus. 5. Ergnzen Sie das noch leere Ereignismakro wie folgt:
Listing 7.9: Das Ereignis Calculate wird bei nderungen in der Tabelle ausgefhrt. Private Sub Worksheet_Calculate() MsgBox "Es wurde eine Neuberechnung der Tabelle durchgefhrt!" End Sub

Weitere Tabellenereignisse im berblick


Entnehmen Sie der folgenden Tabelle alle Ereignisse, die Sie auf Tabellenebene einsetzen knnen.
Ereignis
Worksheet_Activate Worksheet_Change Worksheet_Calculate Worksheet_Deactivate

Beschreibung Tritt ein, wenn ein Tabellenblatt aktiviert wird. Tritt ein, wenn sich der Wert in einer Zelle ndert. Tritt ein, wenn eine Tabelle neu berechnet wird. Tritt ein, wenn ein Tabellenblatt deaktiviert wird, beispielsweise wenn ein Tabellenblatt verlassen wird. Tabelle klickt.

Worksheet_FollowHyperlink Tritt ein, wenn der Anwender auf einen Hyperlink in einer Worksheet_SelectionChange Tritt ein, wenn sich die Markierung auf einem Tabellen-

blatt ndert. Tabelle 7.2: Alle Tabellenereignisse im berblick

331

Aktionen und Benutzereingaben in Excel berwachen

Ereignis
BeforeDoubleClick

Beschreibung Tritt ein, wenn an einer beliebigen Stelle der Tabelle ein Doppelklick mit der linken Maustaste durchgefhrt wird. Tritt ein, wenn an einer beliebigen Stelle der Tabelle ein Klick mit der rechten Maustaste durchgefhrt wird. Tritt nach Neuberechnung eines Tabellenblattes auf. Tritt auf, wenn Sie eine Pivot-Tabelle aktualisieren.

BeforeRightClick

Calculate PivotTableUpdate

Tabelle 7.2: Alle Tabellenereignisse im berblick (Forts.)

7.4

Excel ber Tastenkombinationen bedienen

Viele Standardfunktionen in Excel knnen Sie ber Tastenkombinationen bzw. FTasten abrufen. Am vorhergehenden Tag haben Sie beispielsweise erfahren, dass Sie ber die Taste (F11) ein Standarddiagramm in Excel einfgen knnen. Auch die Tastenkombinationen (Strg) + (C) und (Strg) + (V), um Daten zu kopieren bzw. einzufgen, gehren zum Standard von Excel. Darber hinaus haben Sie die Mglichkeit, eigene Tastenkombinationen zu definieren, hinter die Sie dann Ihre eigenen Makros legen. Sie knnen somit Ihre Arbeit in Excel optimieren und Arbeiten noch schneller erledigen. Lernen Sie nun auf den nchsten Seiten ein paar typische Beispiele aus der Praxis kennen, bei denen Sie eigene Tastenkombinationen einsetzen knnen.

Formeln und Verknpfungen in Festwerte wandeln


Im ersten Beispiel werden Sie ber eine vorher definierte Tastenkombination alle Formeln, Funktionen bzw. Verknpfungen im markierten Bereich durch Festwerte ersetzen. Dies stellt eine ntzliche Funktion dar, da Sie auf diese Weise am schnellsten Formeln in Festwerte umsetzen knnen. Stellen Sie sich beispielsweise vor, Sie mssten eine Tabelle, die Verknpfungen zu anderen Tabellen oder Arbeitsmappen enthlt, an jemanden per E-Mail schicken. In diesem Fall ist es besser, alle Verknpfungen aus der Arbeitsmappe zu

332

Excel ber Tastenkombinationen bedienen

entfernen, um nicht alle verknpften Arbeitsmappen mit ausliefern zu mssen und den Anwender nicht durch unntigen Ballast zu belstigen. Eine weiteres Anwendungsbeispiel fr die Praxis stellt folgendes Szenario dar: Sie haben einige Berechnungen ber Funktionen und Formeln in Excel durchgefhrt. Die Arbeit ist soweit beendet. Nun mchten Sie sicherheitshalber eine Kopie der Arbeitsmappe ohne Formeln abspeichern. Sie knnen somit sicherstellen, dass diese Arbeitsmappe nicht mehr durch Formeln oder Funktionen verndert werden kann, da die Mappe nur noch Festwerte enthlt. In der folgenden Aufgabe gehen Sie von der Ausgangssituation in Abbildung 7.9 aus.

Abbildung 7.9: Eine Tabelle, die einige Formeln enthlt

Im ersten Schritt erfassen Sie das Makro, welches die Formelzellen in FestwertZellen umsetzt. Danach weisen Sie dem Makro eine Tastenkombination zu, ber die Sie das Makro schnell aufrufen knnen. Das Makro fr 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.Value Next Zelle End Sub

333

Aktionen und Benutzereingaben in Excel berwachen

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range. Danach durchlaufen Sie in einer Schleife alle Zellen, die in der Markierung enthalten sind. ber das Auflistungsobjekt Selection (= Auswahl) erhalten Sie Zugriff auf genau diese markierten Zellen. Innerhalb der Schleife berschreiben Sie den Inhalt der Zelle mit dem Wert der Zelle. Fr den Fall, dass es sich hierbei um eine Formelzelle handelt, wird die Formel durch den Festwert ersetzt. Testen Sie das Makro, indem Sie den Zellenbereich A1:B10 markieren und das Makro aus Listing 7.10 starten. Das Makro funktioniert! Nun soll das Starten des Makros ber eine Tastenkombination durchgefhrt werden. Dies spart Zeit und ist darber hinaus auch noch elegant. Das Zuweisen einer Tastenkombination in Excel sollte dynamisch erfolgen. Dabei bietet sich das ffnen einer Arbeitsmappe geradezu an. Die so definierte Tastenkombination ist danach verfgbar und nun kann auch das der Tastenkombination zugewiesene Makro gestartet werden. Fr das Ersetzen von Formelzellen in Festwerte soll beim ffnen der Arbeitsmappe Steuerung.xls die Tastenkombination (Strg) + () definiert werden. Um diese Aufgabe umzusetzen, befolgen Sie die nchsten Arbeitsschritte: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Fhren Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Whlen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook aus. 4. Ergnzen 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 fhrt die angegebene Prozedur aus, wenn eine bestimmte Taste oder Tastenkombination gedrckt wird. Die Syntax der Methode lautet Application.OnKey(Key, Procedure). Das Argument Key entspricht der Tastenkombination, die gedrckt wird. Das Argument Procedure ist optional. Es entspricht dem Makro, welches Sie der Tasten-

334

Excel ber Tastenkombinationen bedienen

kombination zuweisen mchten. Bleibt dieses Argument leer (), dann hat das Drcken der Taste keine Wirkung. Entnehmen Sie Tabelle 7.3 alle mglichen Tasten und deren Codebelegung, die Sie fr die Programmierung einsetzen knnen.
Taste
(___) (Pause) (__) (Entf) (Entf) () (Ende) (Enter) Zehnertastatur (~) (Esc) (Hilfe) (Pos1) (Einfg) () (Num) (Bild_) (Bild_) (Enter) () (Rollen)

Codebelegung {BACKSPACE} oder {BS} {BREAK} {CAPSLOCK} {CLEAR} {DELETE} oder {DEL} {DOWN} {END} {ENTER} ~ (Tilde) {ESCAPE} oder {ESC} {HELP} {HOME} {INSERT} {LEFT} {NUMLOCK} {PGDN} {PGUP} {RETURN} {RIGHT} {SCROLLOCK}

Tabelle 7.3: Die verfgbaren Tasten in Excel-VBA

335

Aktionen und Benutzereingaben in Excel berwachen

Taste
() () (F1) bis (F15)

Codebelegung {TAB} {UP} {F1} bis {F15}

Tabelle 7.3: Die verfgbaren Tasten in Excel-VBA (Forts.)

In jeder Anwendung von Windows knnen die Tasten aus Tabelle 7.3 auch mit den Tasten (Alt), (Strg) oder () kombiniert werden. Entnehmen Sie der nachfolgenden Tabelle 7.4 die Kodierung dieser Zusatztasten.
Zusatztaste
() (Strg) (Alt) [BEFEHLSTASTE]

Vorangestelltes Zeichen + (Pluszeichen) ^ (Caret-Zeichen) % (Prozentzeichen) * (Sternchen)

Tabelle 7.4: Die Zusatztasten

Nachdem Sie die Tastenkombination (Strg) + () dem Makro FormelnFest zugewiesen haben, sollten Sie beim Schlieen der Arbeitsmappe Steuerung.xls dafr sorgen, dass diese Tastenkombination wieder aufgehoben wird. Dabei verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Fhren Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Whlen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook aus. 4. Im zweiten Dropdown-Feld whlen Sie den Eintrag BeforeClose aus und ergnzen das Ereignis wie folgt:

336

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 gelegt worden. So knnen Sie beispielsweise ber die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung von Excel springen. Diese und andere Tastenkombinationen knnen Sie aber jederzeit lahm legen. Im folgenden Beispiel wird der Zugriff auf die Entwicklungsumgebung ber die Tastenkombination (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 Ihre Exceloberflche wechseln und die Tastenkombination (Alt) + (F11) drcken. Es wird Ihnen nicht gelingen, auf diesem Wege in die Entwicklungsumgebung zu gelangen. Mchten Sie diese Tastenkombination wieder zulassen, dann starten Sie das Makro 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 standardmig vorgesehene Funktion, nmlich das Springen in die Entwicklungsumgebung, wieder aktiviert.

337

Aktionen und Benutzereingaben in Excel berwachen

brigens knnen Sie die Makros aus den Listings 7.13 und 7.14 wieder mit den Ereignissen Workbook_Open bzw. Workbook_BeforeClose verbinden, um diese Funktionen beim ffnen bzw. Schlieen der Arbeitsmappe dynamisch einzubinden.

Nur Werte einfgen


Wenn Sie in Excel Zellen mit Formeln kopieren und danach einfgen mchten, werden die Formeln ebenso eingefgt. Oftmals ist dieser Automatismus aber nicht erwnscht, d.h. in den meisten Fllen reicht es, wenn lediglich die Werte eingefgt werden. Standardmig mssen Sie dazu in Excel aus dem Men BEARBEITEN den Befehl INHALTE EINFGEN whlen. Danach aktivieren Sie im Dialog INHALTE EINFGEN die Option WERTE und besttigen mit OK. Diese Schritte knnen Sie ber ein Makro bzw. eine Tastenkombination automatisch ablaufen lassen. Erfassen Sie nun das Makro, welches lediglich die Werte aus kopierten Zellen einfgt:
Listing 7.15: Lediglich Werte werden eingefgt Sub WerteEinfgen() Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = False End Sub

Um nur die Inhalte, also die Werte einzufgen, setzen Sie die Methode PasteSpecial ein. Im Paste-Argument geben Sie die Konstante xlValues an. Da nach dem Drcken der Tastenkombination (Strg) + () + (V) noch der Kopierrahmen um den kopierten Bereich aktiv ist, schalten Sie diesen durch die Eigenschaft CutCopyMode ab, indem Sie dieser den Wert False zuweisen. Weisen Sie das Makro aus Listing 7.15 nun der Tastenkombination (Strg) + () + (V) zu. Auch hierzu knnen Sie wieder das Ereignis Workbook_Open einsetzen, um diese Funktion gleich nach dem ffnen der Arbeitsmappe zur Verfgung zu stellen.

338

Excel ber Tastenkombinationen bedienen

Listing 7.16: Beim ffnen der Arbeitsmappe wird die Tastenkombination festgelegt Private Sub Workbook_Open() Application.OnKey "^+v", "WerteEinfgen" End Sub

Achten Sie auch bei diesem Schritt darauf, dass Sie die gerade definierte Tastenkombination beim Schlieen der Arbeitsmappe wieder deaktivieren. Setzen Sie fr diesen Zweck das Arbeitsmappen-Ereignis Workbook_BeforeClose ein, wie Sie es in Listing 7.17 sehen.
Listing 7.17: Beim Schlieen der Arbeitsmappe wird die Tastenkombination deaktiviert Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.OnKey "^+v" End Sub

Sonderzeichen per Tastenkombination einfgen


Eine besonders interessante Lsung ist, Sonderzeichen per Tastenkombinationen einzufgen. Dabei knnen Sie beispielsweise Zeichen aus der Schriftart WINGDINGS einsetzen, um Sonderzeichen einzusetzen. Der Buchstabe entspricht in dieser Schriftart einem Hkchen. Der Buchstabe J entspricht einem grinsenden Gesicht und der Buchstabe L einem mrrischen 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

Aktionen und Benutzereingaben in Excel berwachen

Die Spalte C soll mit Sonderzeichen ber Tastenkombinationen gefllt werden. Schreiben Sie jetzt die beiden Makros, die die Sonderzeichen in die jeweils aktive Zelle schreiben:
Listing 7.18: Sonderzeichen einfgen 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. Danach formatieren Sie die aktive Zelle ber das Font-Objekt mit der Schriftart WINGDINGS. Fr die erledigten Aufgaben definieren wir die Tastenkombination (Strg) + (), fr offene Aufgaben (Strg) + (). Der Quellcode fr diese Aufgabe lautet wie folgt:
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 aufdrngt, lautet wie folgt: Wie kann ich herausbekommen, welches Symbol der Schriftart Wingdings welchem Zeichen zugeordnet ist? Die Beantwortung dieser Frage knnen Sie Listing 7.20 entnehmen. Dort wird eine Liste erstellt, in der alle Zeichenbelegungen verzeichnet sind.

340

Excel ber Tastenkombinationen bedienen

Abbildung 7.11: Listen mit Sonderzeichen ausstatten Listing 7.20: Die einzelnen Zeichen einer Schriftart abfragen Sub Schrifttest() Dim i As Integer Sheets.Add Range("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 If Next i End Sub

Die normalen Zeichen einer Schriftart liegen im Bereich von 0 bis 256. Die Zahlen von 0 bis 31 entsprechen den nicht darstellbaren Standard-ASCII-Codes. Daher kann innerhalb der Schleife auf die Dokumentation dieser Zeichen verzichtet werden. Formatieren Sie alle Zellen der Spalte A mit der Schriftart, zu der Sie die Zeichenbelegung herausfinden mchten. ber die Funktion chr knnen Sie einen Wert vom Typ String zurckgeben, der das Zeichen enthlt, das dem angegebenen Zeichencode zugeordnet ist.

341

Aktionen und Benutzereingaben in Excel berwachen

Abbildung 7.12: Alle Belegungen der Schriftart Wingdings in eine Tabelle schreiben

7.5

Programmieren mit der Maus

Nachdem Sie nun wissen, wie Sie einzelne Tasten programmieren knnen, gehen wir zum nchsten Thema ber. Auf den folgenden Seiten wird beschrieben, wie Sie mithilfe von VBA Ihre Maustasten abfragen und programmieren knnen. Fr die Programmierung Ihrer Maustasten stehen Ihnen zwei Ereignisse zur Verfgung, die Sie bereits in diesem Kapitel kennen gelernt haben. ber das eine Ereignis knnen Sie einen Klick mit der rechten Maustaste abfangen, mit dem anderen Ereignis einen Doppelklick mit der linken Taste. Excel kann also diese beiden Mausaktionen berwachen, indem Sie ein Ereignis einstellen. Diesem Ereignis knnen Sie dann weitere Befehle hinzufgen, welche beim Eintreffen des Ereignisses zustzlich ausgefhrt werden sollen.

Kontextmen deaktivieren/aktivieren
Standardmig wird beim Drcken der rechten Maustaste ein Kontextmen in Excel aufgerufen. Beispielsweise wird das Zellenkontextmen aktiviert, wenn Sie

342

Programmieren mit der Maus

mit der rechten Maustaste auf eine beliebige Zelle klicken. Dieses Standardverhalten kann auch deaktiviert und durch eine andere, eigene Funktion ersetzt werden. Im folgenden Beispiel wird das Herunterklappen des Kontextmens unterbunden, sobald Sie eine beliebige Zelle einer bestimmten Tabelle mit der rechten Maustaste anklicken. Um dieses Ereignis einzustellen, befolgen Sie die nchsten Arbeitsschritte: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, mit der Sie die Funktion belegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforeRightClick aus. 4. Ergnzen 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 = True End Sub

Das Ereignis Worksheet_BeforeRightClick hat zwei Argumente: Im Argument Target knnen Sie die berwachung der rechten Maustaste auf einen bestimmten Bereich Ihrer Tabelle beschrnken. Im Argument Cancel haben Sie die Mglichkeit, die Standardfunktion, das Herunterklappen des Kontextmens, zu unterbinden, indem Sie dieses Argument auf den Wert True setzen.

Kontextmen fr bestimmte Bereiche deaktivieren


Um die berwachung der rechten Maustaste nur auf einen bestimmten Bereich der Tabelle zuzulassen, knnen Sie wie schon gesagt das Argument Target einsetzen. Im folgenden Makro aus Listing 7.22 wird das Kontextmen fr den Zellenbereich B2:D10 ausgeschaltet. Ergnzen Sie dazu Listing 7.21 wie folgt:

343

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 = True End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range. Danach geben Sie ber die Anweisung Set dieser Objektvariablen bekannt, welchen Bereich der Tabelle Sie berwachen mchten. Mithilfe der Methode Intersect knnen Sie berprfen, ob die angeklickte Zelle (Target) sich im definierten Bereich (Bereich) befindet. Wenn nicht, dann springen Sie ber die Anweisung Exit Sub direkt aus dem Makro heraus. Im anderen Fall setzen Sie das Argument Cancel auf den Wert True, um das Zellenkontextmen zu deaktivieren.

Abbildung 7.13: Beim Klicken mit der rechten Maustaste im definierten Bereich passiert nichts.

Kontextmen in allen Tabellen deaktivieren


In den beiden letzten Beispielen haben Sie in einer bestimmten Tabelle das Zellenkontextmen deaktiviert. Dabei haben Sie das Ereignis BeforeRightClick fr diese Tabelle eingestellt. Mchten Sie jetzt die Deaktivierung des Kontextmens in allen Tabellenblttern erreichen, mssen Sie keinesfalls dieses Ereignis fr jede einzelne Tabelle einstellen. In diesem Fall setzen Sie besser das Arbeitsmappenereignis Workbook_SheetBeforeRightClick ein. Um dieses Ereignis einzustellen, gehen Sie wie folgt vor:

344

Programmieren mit der Maus

1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Fhren Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Whlen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook. 4. Whlen Sie aus dem zweiten Dropdown-Feld das Ereignis SheetBeforeRightClick. 5. Ergnzen Sie den noch leeren Ereignisrahmen wie folgt:
Listing 7.23: Das Zellenkontextmen fr alle Tabellen ausschalten Private Sub Workbook_SheetBeforeRightClick _ (ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub

Bei diesem Arbeitsmappenereignis haben Sie gegenber dem Tabellenereignis ein Argument mehr zur Verfgung. Standardmig wird dieses Ereignis in allen Tabellenblttern der Arbeitsmappe ausgefhrt. Im Argument Sh knnen Sie einschrnken, in welchen Tabellenblttern die Mausklicks berwacht werden sollen.

Kontextmen in bestimmten Tabellen deaktivieren


Im folgenden Beispiel soll das Deaktivieren des Zellenkontextmens nur in den Tabellen TABELLE1, TABELLE2 und TABELLE12 ausgefhrt werden. Die Lsung dieser Aufgabenstellung knnen Sie in Listing 7.24 sehen.
Listing 7.24: Deaktivierung des Kontextmens 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 = False End Select End Sub

345

Aktionen und Benutzereingaben in Excel berwachen

berprfen Sie mithilfe einer Select-Case-Anweisung, ob der Name der jeweils aktiven Tabelle, auf der Sie den rechten Mausklick durchfhren, dem innerhalb der Case-Anweisung entspricht. Wenn ja, dann setzen Sie das Argument Cancel auf den 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 zugeordnet. Je nachdem, wo Sie in Ihrer Excel-Tabelle mit der rechten Maustaste klicken, wird ein bestimmtes Kontextmen zur Verfgung gestellt, welches die wichtigsten Befehle fr das angeklickte Objekt bereithlt. Wenn Sie eine Zelle anklicken, sind das Funktionen wie das Ausschneiden, Kopieren und Einfgen von Zelleninhalten. Sie wissen bereits, wie Sie das Zellenkontextmen deaktivieren. Was aber machen Sie, wenn Sie dem Klicken mit der rechten Maustaste eine eigene Funktion zuordnen mchten? Im folgenden Beispiel wird durch das Klicken mit der rechten Maustaste auf eine Zelle, diese mit der Hintergrundfarbe ROT belegt. Beim erneuten Klick mit der rechten Maustaste auf diese gefrbte Zelle wird diese wieder entfrbt. Zur Lsung dieser Aufgabenstellung gehen Sie wie folgt vor: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforeRightClick aus. 4. Ergnzen Sie den Ereignisrahmen wie folgt:
Listing 7.25: ber das Rechtsklicken wird die Zelle gefrbt/entfrbt Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) If Target.Interior.ColorIndex = 3 Then Target.Interior.ColorIndex = xlColorIndexNone

346

Programmieren mit der Maus

Else Target.Interior.ColorIndex = 3 End If Cancel = True End Sub

berprfen Sie zuerst einmal, ob die Zelle bereits mit der Hintergrundfarbe ROT formatiert wurde. Wenn ja, dann meldet die Eigenschaft ColorIndex, die Sie auf das Objekt Interior (Zellenhintergrund) anwenden, den Farbindex 3. In diesem Fall weisen Sie der Eigenschaft ColorIndex die Konstante xlColorIndexNone zu, was bedeutet, dass diese Zelle wieder entfrbt wird. Im anderen Fall weisen Sie der Eigenschaft ColorIndex den Farbindex 3 zu, um die so angeklickte Zelle mit der Hintergrundfarbe ROT zu belegen. In beiden Fllen deaktivieren Sie anschlieend das Herunterklappen des Kontextmens, indem Sie das Argument Cancel auf den Wert True setzen.

Abbildung 7.14: Schnelles Frben und Entfrben ber Mausklicks

In einem weiteren Beispiel soll in einer Tabelle ber die rechte Maustaste ein bestimmtes Sonderzeichen eingefgt werden. Orientieren Sie sich dabei am Makro aus Listing 7.20, ber das Sie die Belegung der Zeichen in der Schriftart WINGDINGS in einer Tabelle ausgegeben haben. Fr unser Beispiel entscheiden wir uns fr das Haken-Symbol, welches ber den Buchstaben in der Schriftart WINGDINGS eingefgt werden kann. In Anlehnung an die vorherige Aufgabe soll aber zuerst geprft werden, ob nicht bereits ein Haken in die Zelle eingefgt wurde. Wenn ja, soll dieser wieder entfernt werden. Stellen Sie dieses Ereignis nun ein, indem Sie die folgenden Arbeitsschritte befolgen: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN.

347

Aktionen und Benutzereingaben in Excel berwachen

2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforeRightClick aus. 4. Ergnzen Sie den Ereignisrahmen wie folgt:
Listing 7.26: Das Haken-Symbol per rechtem Mausklick einfgen 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 = True End Sub

Abbildung 7.15: Eine Einkaufsliste schnell abhaken

berprfen Sie, ob nicht bereits schon ein Haken-Symbol in der Zelle steht. Wenn ja, dann nehmen Sie den Haken wieder heraus, indem Sie den Zelleninhalt lschen. Vergessen Sie dabei aber nicht, die Schriftart wieder auf eine lesbare Schrift umzustellen. Im anderen Fall schreiben Sie den Buchstaben in die ange-

348

Programmieren mit der Maus

klickte Zelle und formatieren diese mit der Schriftart WINGDINGS, indem Sie dem Objekt Font ber die Eigenschaft Name den Namen der Schriftart bekannt geben.

Doppelklick deaktivieren
Nachdem Sie erfahren haben, wie Sie die rechte Maustaste programmieren knnen, lernen Sie nun, wie Sie die linke Maustaste steuern knnen. Standardmig ist dem linken Doppelklick auf eine Zelle die Funktion DIREKTE ZELLENBEARBEITUNG zugeordnet, d.h. der Textcursor springt genau in die Zelle hinein. Sie haben dann die Mglichkeit, Zeichen einzugeben bzw. bereits gemachte Eingaben zu korrigieren. Zum Abfangen von Doppelklicks mit der linken Maustaste steht Ihnen ein eigenes Ereignis BeforeDoubleClick zur Verfgung. Wie schon bei der rechten Maustaste gelernt, haben Sie auch bei diesem Ereignis die Mglichkeit, die standardmig zugewiesene Funktion zu deaktivieren. In der folgenden Aufgabe wird die direkte Zellenbearbeitung nach dem Ausfhren eines Doppelklicks auf eine Zelle deaktiviert.
Listing 7.27: Den Doppelklick deaktivieren Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub

Setzen Sie das Argument Cancel auf den Wert True, um die direkte Zellenbearbeitung zu deaktivieren. Wie schon beim Ereignis BeforeRightClick demonstriert, knnen Sie auch bei diesem Ereignis dafr sorgen, dass das Deaktivieren der Standardfunktion (direkte Zellenbearbeitung) nur fr einen bestimmten Bereich gelten soll. Im nchsten Beispiel soll die direkte Zellenbearbeitung, welche durch den Doppelklick ausgelst wurde, fr folgende Bereiche deaktiviert werden:

B2:B10 D3:D5 F2:F7 A1:F1

Erfassen Sie nun das Ereignismakro, indem Sie folgende Arbeitsschritte befolgen:

349

Aktionen und Benutzereingaben in Excel berwachen

1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforedoubleClick aus. 4. Ergnzen 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 Range Dim Bereich2 As Range Dim Bereich3 As Range Dim Bereich4 As Range Dim Bereich As Range Set Set Set Set Bereich1 Bereich2 Bereich3 Bereich4 = = = = Range("B2:B10") Range("D3:D5") Range("F2:F7") Range("A1:F1")

Set Bereich = Union(Bereich1, Bereich2, Bereich3, Bereich4) If Intersect(Bereich, Target) Is Nothing Then Exit Sub Cancel = True End Sub

Deklarieren Sie im ersten Schritt genau fnf Objektvariablen vom Typ Range. In den ersten vier Objektvariablen geben Sie die Zellenkoordinaten der Bereiche bekannt, bei denen Sie die direkte Zellenbearbeitung deaktivieren mchten. Setzen Sie fr diesen Zweck die Anweisung Set ein. Im nchsten Schritt verbinden Sie die einzelnen Bereiche mithilfe der Methode Union zu einem Gesamtbereich, den Sie in der Objektvariablen Bereich speichern. Danach fragen Sie ber die Methode Intersect ab, ob die angeklickte Zelle in diesem Gesamtbereich liegt. Wenn nicht, dann beenden Sie das Makro, indem Sie ber die Anweisung Exit Sub direkt aus dem Ereignis springen. Liegt die doppelt angeklickte Zelle im defi-

350

Programmieren mit der Maus

nierten Zielbereich, dann setzen Sie das Argument Cancel auf den Wert True, um die direkte Zellenbearbeitung zu deaktivieren.

Abbildung 7.16: In den farbigen Flchen ist die direkte Zellenbearbeitung deaktiviert.

Werte hochzhlen per Doppelklick


In der nchsten Praxisaufgabe soll eine bestimmte Zelle in einer Tabelle bei jedem Doppelklick auf diese Zelle um den Wert 1 addiert werden. Um diese Lsung einzustellen, verfahren Sie wie folgt: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforedoubleClick aus. 4. Ergnzen 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 If End Sub

Mithilfe der Eigenschaft Address knnen Sie die genaue Zellenadresse der doppelt angeklickten Zelle abfragen. Entspricht diese Adresse der Zelle B5, dann addieren

351

Aktionen und Benutzereingaben in Excel berwachen

Sie den momentanen Wert der Zelle mit dem Wert 1. Setzen Sie danach das Argument Cancel auf den Wert True, um die direkte Zellenbearbeitung fr diese Zelle zu deaktivieren.

Abbildung 7.17: Bei jedem Doppelklick auf Zelle B5 wird diese um den Wert 1 erhht.

Zufallszahlen per Doppelklick


Im folgenden Beispiel spielen Sie Lotto. Im Zellenbereich C6:E10 soll bei jedem Doppelklick eine Zufallszahl im Bereich zwischen 1 und 49 erzeugt werden. Um diese Aufgabe zu lsen, befolgen Sie die nchsten Arbeitsschritte: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforedoubleClick aus. 4. Ergnzen 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 Sub Target.Value = Int((49 * Rnd) + 1)

352

Excel zeitmig steuern

Cancel = True End Sub

Definieren Sie im ersten Schritt eine Objektvariable vom Typ Range, in der Sie mit Hilfe der Anweisung Set den Bereich angeben, in dem per Doppelklick Zufallszahlen erzeugt werden sollen. Danach prfen Sie ber die Methode Intersect, ob die doppelt angeklickte Zelle im definierten Zielbereich liegt. Wenn ja, wenden Sie die Funktion Rnd an, um eine Zufallszahl zu erzeugen. Den Wertebereich der Zufallszahl geben Sie zwischen 1 und 49 an. Mithilfe der Funktion Int sorgen Sie dafr, dass diese generierte Zufallszahl auch ganzzahlig ist.

Abbildung 7.18: Im gefrbten Bereich werden Zufallszahlen per Doppelklick erzeugt.

7.6

Excel zeitmig steuern

In Excel haben Sie die Mglichkeit, Makros zu einem bestimmten Zeitpunkt zu starten. Des Weiteren knnen Sie Makros auch in bestimmten Intervallen wiederholt ausfhren. Fr 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 ausgefhrt werden soll. Das Argument Procedure beinhaltet den Namen der auszufhrenden Prozedur. Das Argument LatestTime ist optional einsetzbar und gibt den letzten Zeitpunkt an, zu dem die Prozedur ausgefhrt werden kann. Das letzte Argument Schedule ist optional einsetzbar und fhrt eine neue OnTimeProzedur aus, sofern dieses Argument auf den Wert True gesetzt ist. Indem Sie das

353

Aktionen und Benutzereingaben in Excel berwachen

Argument auf den Wert False setzen, lschen Sie eine vorher eingestellte Prozedur. Die Mglichkeiten, die Sie mit dieser Zeitsteuerung haben, werden in den nchsten Praxisaufgaben nher erlutert.

Die Uhr immer im Blick


Die Methode OnTime knnen Sie einsetzen, um regelmig die aktuelle Uhrzeit in der Statusleiste anzeigen zu lassen. Dabei definieren Sie das Intervall von 60 Sekunden. Jede Minute soll dann die aktuelle Uhrzeit in der Statusleiste angezeigt werden, danach soll die Zeitansage genau fnf Sekunden in der Statusleiste sichtbar sein und danach wieder ausgeblendet werden. Dazu erfassen Sie folgendes Makro 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 die aktuelle Uhrzeit. Zur Uhrzeit addieren Sie mithilfe der Funktion TimeValue eine Minute. Damit vergeht genau eine Minute bis zum Start des Makros Uhrzeit, welches 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 Zeitanzeige End Sub

Im ersten Schritt blenden Sie sicherheitshalber die Statusleiste ber die Eigenschaft DisplayStatusBar ein. Danach fllen Sie die Statusleiste mit dem aktuellen Tagesdatum, welches Sie ber die Funktion Date bekommen, und mit der aktuellen Uhrzeit, die ber die Funktion Time abgefragt werden kann. Im Anschluss daran sorgen Sie dafr, dass Excel diese Zeitansage fnf Sekunden lang in der Statusleiste stehen lsst. Dazu verwenden Sie die Methode Wait, die das Makro fr fnf Sekunden

354

Excel zeitmig steuern

anhlt. Danach geben Sie die Verwaltung der Statusleiste wieder an Excel zurck, was dazu fhrt, dass der Text BEREIT in der Leiste angezeigt wird. Im letzten Schritt sorgen Sie dafr, dass die Zeitansage regelmig ausgefhrt wird. Dazu rufen Sie das Makro Zeitanzeige erneut mit der Anweisung Call auf.

Abbildung 7.19: Das aktuelle Datum sowie die Uhrzeit in der Statusleiste anzeigen

Countdown in Excel
Wenn Sie mchten, knnen Sie in Excel auch einen Countdown einsetzen, um eine bestimmte Aufgabe auszufhren. So knnen Sie beispielsweise dafr sorgen, dass genau 60 Sekunden nach dem Start eines Makros alle offenen Arbeitsmappen geschlossen sind und Excel beendet wird. Erfassen Sie zu diesem Zweck zuerst einmal die Zeitsteuerung, welche Sie in Listing 7.33 sehen knnen.
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 die aktuelle Uhrzeit. Zur Uhrzeit addieren Sie mithilfe der Funktion TimeValue 60 Sekunden. Damit vergehen genau 60 Sekunden bis zum Start des Makros Excel Ende, welches Sie in Listing 7.34 sehen.

355

Aktionen und Benutzereingaben in Excel berwachen

Listing 7.34: Arbeitsmappen speichern und Excel beenden Sub ExcelEnde() Dim Mappe As Workbook Application.DisplayAlerts = False For Each Mappe In Workbooks Mappe.Save Next Mappe Application.DisplayAlerts = True Application.Quit End Sub

Indem Sie die Eigenschaft DisplayAlerts auf den Wert False setzen, verhindern Sie, dass Sie noch eine Rckfrage vor dem Beenden von Excel bekommen. In einer vorherigen Schleife stellen Sie sicher, dass alle geffneten Arbeitsmappen gespeichert werden. Dabei wenden Sie innerhalb der Schleife die Methode Save an. Anschlieend 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 einer ganz bestimmten Uhrzeit starten. Erfassen Sie zu diesem Zweck das Makro aus Listing 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 Uhreinstellung in der Systemsteuerung von Windows berprfen und sicherstellen, dass Excel sowie die Arbeitsmappe, die diese Lsung enthlt, auch geffnet sind. Im Makro ZeitSteuerung wird um 16:00 Uhr das Makro Verarbeitung aufgerufen, welches Sie in Listing 7.36 sehen knnen.

356

Fragen & Antworten

Listing 7.36: Dieses Makro wird um 16:00 Uhr ausgefhrt Sub Verarbeitung() 'beliebige Aufgaben durchfhren... End Sub

7.7
F

Fragen & Antworten

Wie knnen Sie beim ffnen einer Arbeitsmappe dafr sorgen, dass alle PivotTabellen 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.RefreshAll End Sub

Setzen Sie die Methode RefreshAll ein, um alle Pivot-Tabellen in der Arbeitsmappe zu aktualisieren.
F

Wie knnen Sie den Namen einer Tabelle dynamisch aus einem Zelleninhalt bilden?
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").Value End Sub

berprfen Sie ber die Eigenschaft Address, ob die genderte Zelle C1 lautet. Wenn ja, dann weisen Sie der Tabelle den Namen zu, der in Zelle C1 eingegeben wurde.

357

Aktionen und Benutzereingaben in Excel berwachen

Wie knnen Sie die typischen Funktionen wie das Kopieren, Ausschneiden und Einfgen von Daten ber die Tastenkombinationen deaktivieren?
A

Sie knnen die Tastenkombinationen fr das Kopieren (Strg) + (C), Ausschneiden (Strg) + (X) und Einfgen (Strg) + (V) von Daten deaktivieren, 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 Befehle End Sub F

Wie knnen Sie deaktivierte Standard-Tastenkombinationen wieder verfgbar machen?


A

In Anlehnung an die vorherige Fragestellung knnen Sie fr diesen Zweck das folgende Makro aus Listing 7.40 starten:
Listing 7.40: Tastenkombinationen wieder zurcksetzen Sub TastenkombinationenAktivieren() Application.OnKey "^c" Application.OnKey "^v" Application.OnKey "^x" End Sub

Wie knnen Sie das Kontextmen fr die Symbolleisten deaktivieren?


A

Wenn Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken, wird Ihnen ein Kontextmen angeboten, aus dem Sie Symbolleisten ein- und ausblenden knnen. Mit dem folgenden Makro aus Listing 7.41 verhindern Sie das Herunterklappen des Symbolleisten-Kontextmens:

358

Quiz

Listing 7.41: Symbolleisten-Kontextmen deaktivieren Sub KontextmenSymbolDeaktivieren() Application.CommandBars("Toolbar list").Enabled = False End Sub

Das Kontextmen fr die Symbolleisten heit Toolbar list. Geben Sie diesen Namen dem Auflistungsobjekt CommandBars bekannt und setzen Sie die Eigenschaft Enabled auf den Wert False, um das Kontextmen zu deaktivieren. Weisen Sie dieser Eigenschaft den Wert True zu, um das Kontextmen wieder zu aktivieren.
F

Wie knnen Sie einen vorher definierten Bereich per Doppelklick kopieren und auch auf anderen Tabellen einfgen?
A

Nehmen wir einmal an, Sie mchten einen bestimmten Bereich auf TABELLE1 kopieren und danach diesen Bereich wahlweise auf einer anderen Tabelle einfgen. Dazu setzen Sie das Ereignis Worksheet_Before DoubleClick 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.Copy ActiveSheet.Paste End Sub

7.8
F F F

Quiz

Wie kann man die Ereignissteuerung kurzfristig ausschalten? Wird das Ereignis Change auch ausgelst, wenn man die Formatierung der Zelle ndert? Was muss man machen, wenn man das Ereignis Change nicht auf die ganze Tabelle, sondern nur auf eine einzige Zelle anwenden mchte?

359

Aktionen und Benutzereingaben in Excel berwachen

F F F F

Wie kann man das Zellenkontextmen deaktivieren? Welchem Buchstaben ist das Sonderzeichen mit dem Flugzeug zugeordnet? Wie kann man per Doppelklick auf eine Zelle den Inhalt dieser Zelle mit den Schriftschnitten FETT und KURSIV sowie der Schriftfarbe ROT formatieren? 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 lsen. Die Ergebnisse dieser Aufgaben finden Sie im Anhang. 1. Stellen Sie sicher, dass beim Aktivieren einer bestimmten Tabelle die Neuberechnung ausgelst wird. 2. Wie muss das Ereignis lauten, wenn Sie vor dem Speichern einer Arbeitsmappe in der ersten Tabelle der Arbeitsmappe das aktuelle Tagesdatum erfassen mchten? 3. ffnen Sie die Demo-Arbeitsmappe Steuerung.xls und aktivieren die Tabelle BUNG. Ihre Aufgabe besteht nun darin, die beiden Maustasten zu programmieren. Fr den Bereich A1:E15 sollen dabei folgende Vorgnge ablaufen:

Klicken mit der rechten Maustaste: Addieren der Zelle um den Wert 10 Doppelklick mit der linken Maustaste: Subtrahieren der Zelle mit 10

360

Tag 1 Tag 2 T ag 3 T ag 4 Tag 5 Tag 6 T ag 7

Die Entwicklungsplattform, Variablen und Konstanten kennen lernen Die Sprachelemente von VBA Die Excel-Anwendung einstellen und anpassen

21 101 153

Auf Arbeitsmappen zugreifen Datei-Operationen 177 Tabellenbltter programmieren Zellbearbeitung mit VBA Aktionen und Benutzereingaben in Excel berwachen Groe Datenmengen in VBA behandeln und auswerten 207 249 315

W O C H E

T ag 8 Tag 9 Tag 10 Tag 11 Tag 12 Tag 13 Tag 14

363

Funktionen einsetzen, um Excel zu automatisieren 403 Excel und das Internet Excel und Datenzugriffe auf Access und Word Arbeiten an der Oberflche Menund Symbolleisten programmieren Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren Makros dynamisch erzeugen, importieren, exportieren ber VBE-Programmierung 429 447 485 505 527

W O C H E

Auswertungen, Kommunikation, Automatisierung


Der 8. Tag beschftigt sich mit dem Thema, wie Sie Ihre Daten in Excel auswerten knnen. Hierfr stehen Ihnen unter anderem die Filterfunktionen sowie die Pivot-Tabellentechnik zur Verfgung. Des Weiteren werden Sie Ihre Daten optisch in Diagrammen darstellen. Dabei werden Sie Diagramme unterschiedlichster Art erstellen. Am 9. Tag lernen Sie, wie Sie Excel um weitere zustzliche Funktionen bereichern knnen. Ein Thema dieses Tages wird auch sein, modulare Funktionen zu schreiben, sodass Sie diese elegant in verschiedene Makros einbauen und wieder anpassen knnen. 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 knnen. Am 11. Tag erfahren Sie, wie Sie Excel-Daten in eine Access-Datenbank berfhren knnen. Aber auch der umgekehrte Vorgang, also die Datenbernahme aus einer fertigen Access-Datenbank in eine Excel-Tabelle, wird an diesem Tag ausfhrlich beschrieben. Des Weiteren erfahren Sie, wie Sie die Zusammenarbeit zwischen Excel und Word gestalten knnen. Unter anderem bertragen Sie dabei Excel-Tabellen in Word-Dokumente, fgen bestimmte Zelleninhalte an bestimmte Textmarken eines Dokuments ein und einiges andere mehr. Am 12. Tag manipulieren Sie die vorhandenen Men- und Symbolleisten von Excel und erstellen eigene Men- und Symbolleisten. Auch die Programmierung von Kontextmens bildet einen Schwerpunkt an diesem Tag. Am 13. Tag lernen Sie, wie Sie in Excel Dialoge (= UserForms) zeichnen, mit Steuerelementen wie Schaltflchen und Eingabefeldern bestcken und diese dann automatisieren. Am 14. Tag greifen Sie auf die Entwicklungsumgebung ber Makros zu. Sie werden dabei unter anderem neue Makros dynamisch erstellen bzw. vorhandene Makros einer Arbeitsmappe gezielt lschen.

362

Groe Datenmengen in VBA behandeln und auswerten

Groe Datenmengen in VBA behandeln und auswerten

Gestern haben Sie gelernt, was man unter Ereignissen in der Programmierung von Excel versteht. Sie haben Ereignisse fr Arbeitsmappen sowie fr einzelne Tabellen erstellt und knnen diese nun bei Bedarf einsetzen. Des Weiteren haben Sie Tastatureingaben ausgewertet und Makros zu bestimmten Zeitpunkten automatisch gestartet. Die Themen heute:

Daten filtern Pivot-Tabellen einsetzen Diagramme erstellen Alle Beispiele dieses Tages finden Sie auf der beiliegenden CD-ROM in den Arbeitsmappen Auswertung.xls und Diagramme.xls im Verzeichnis Kap08.

8.1

Daten filtern

Eine der schnellsten und wichtigsten Auswertungsfunktionen in Excel stellt der AutoFilter dar, den Sie im Men DATEN mit dem Befehl FILTER/AUTOFILTER aktivieren knnen. Beim Filtern von Daten stellen Sie ein Kriterium fr die Filterung ein, d.h. es werden nur die Zeilen angezeigt, die den Kriterien entsprechen, die Sie fr eine Spalte angeben. Andersherum gesehen werden beim Filtern alle Zeilen ausgeblendet, die nicht den eingestellten Kriterien entsprechen. Excel stellt zwei unterschiedliche Arten von Filtern zur Verfgung:

den AutoFilter mit der Mglichkeit, nach der ausgewhlten Zelle zu filtern, fr einfache Kriterien den Spezialfilter fr komplexere Aufgaben brigens werden beim Filtern die Daten nicht neu sortiert. Es werden lediglich die Zeilen ausgeblendet, die den eingestellten Kriterien nicht entsprechen.

364

Daten filtern

Vorsicht auch bei Leerzeilen in Excel-Tabellen! Der AutoFilter funktioniert nur einwandfrei, wenn Sie in Ihrer Tabelle keine Leerzeilen haben.

Den AutoFilter aktivieren


Den AutoFilter knnen Sie auf Ihrer Tabelle aktivieren, indem Sie aus dem Men DATEN den Befehl FILTER/AUTOFILTER whlen. Danach wird fr jede Spalte im benutzten Bereich ein AutoFilter eingeblendet. Jetzt befindet sich der AutoFilter noch im Ruhezustand, d.h. es wurde noch keine Filterung vorgenommen, was Sie auch an den schwarzen Pfeilen der AutoFilter erkennen knnen. AutoFilter, bei denen schon Filterkriterien eingestellt sind, werden durch einen blauen Pfeil gekennzeichnet. 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").AutoFilter End Sub

Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie den AutoFilter einsetzen mchten. Die Eigenschaft AutoFilterMode liefert den Wert True, wenn die Dropdown-Pfeile fr AutoFilter momentan auf dem Tabellenblatt sichtbar sind. Liefert diese Eigenschaft den Wert False zurck, dann blenden Sie die AutoFilter mithilfe der Methode AutoFilter ein. Um alle AutoFilter auf Ihrer Tabelle wieder auszublenden, setzen Sie diese Eigenschaft AutoFilterMode auf den Wert False.

Ein Filterkriterium einsetzen


Nachdem Sie gerade den AutoFilter aktiviert haben, knnen Sie nun die Kriterien einstellen, nach dem der AutoFilter Ihre Tabelle filtern soll. In der folgenden Aufgabe sollen nur Mitarbeiter in TABELLE1 angezeigt werden, die am Standort Sindelfingen beschftigt sind.

365

Groe Datenmengen in VBA behandeln und auswerten

Abbildung 8.1: Den AutoFilter einschalten Listing 8.2: Das Filterkriterium einstellen Sub MitarbeiterSindelfingen() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter _ Field:=5, Criteria1:="Sindelfingen" End Sub

Sie sollten immer sicherstellen, dass das richtige Tabellenblatt aktiviert und die AutoFilter-Pfeile angezeigt werden. Nur dann knnen Sie die Filterkriterien setzen. Um die Filterkriterien einzustellen, setzen Sie die Methode AutoFilter ein. Die Syntax dieser Methode lautet:
Ausdruck.AutoFilter(Field, Criteria1, Operator, Criteria2, VisibleDropDown)

Mit der AutoFilter-Methode haben Sie im Argument Field die Spalte E (Field:=5) als Spalte definiert, in der Sie ein Kriterium einstellen mchten.

366

Daten filtern

Das Anzeigekriterium fr die Zeilen haben Sie im Argument Criteria1 bekannt gegeben (Criteria1:="Sindelfingen"). Bei dem Argument Operator haben Sie die Auswahl aus mehreren Konstanten, die Sie Tabelle 8.1 entnehmen knnen.
Konstante
xlAnd xlOr

Erklrung Es mssen zwei Kriterien erfllt sein (Criteria1 und Criteria2). Es muss entweder das eine oder das andere Kriterium erfllt sein (Criteria1 oder Criteria2). Die n-hchsten Eintrge aus der Liste werden angezeigt (Absolutbetrachtung). Die n-hchsten Eintrge aus der Liste werden angezeigt (prozentuale Betrachtung). Die n-niedrigsten Eintrge aus der Liste werden angezeigt (Absolutbetrachtung). Die n-niedrigsten Eintrge aus der Liste werden angezeigt (prozentuale Betrachtung).

xlTop10Items

xlTop10Percent

xlBottom10Items

xlBottom10Percent

Tabelle 8.1: Die Operatoren fr die Filterung von Daten

Das Argument Criteria2 stellt ein mgliches zweites Kriterium dar. Es wird zusammen mit Criteria1 und dem Argument Operator zum Erstellen von zusammengesetzten Kriterien verwendet. Das letzte Argument VisibleDropDown ist standardmig mit dem Wert True voreingestellt, was bedeutet, dass die Dropdown-Pfeile fr das gefilterte Feld angezeigt werden. Wenn das Argument auf den Wert False gesetzt wird, werden die Dropdown-Pfeile des AutoFilters fr das gefilterte Feld ausgeblendet.

Mehrere Filterkriterien festlegen


Gerade haben Sie ein Filterkriterium fr die Spalte E festgelegt. Sie haben aber die Mglichkeit, fr mehrere Spalten Filterkriterien zu setzen.

367

Groe Datenmengen in VBA behandeln und auswerten

Abbildung 8.2: Nur die Mitarbeiter aus Sindelfingen werden angezeigt.

In der folgenden Aufgabe sollen alle Mitarbeiter in TABELLE1 angezeigt werden, die im Standort Sindelfingen beschftigt sind und der Abteilung Einkauf angehren.
Listing 8.3: Mehrere Filter einsetzen Sub MitarbeiterSindelfingenEinkauf() Sheets("Tabelle1").Activate If 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 With End Sub

Um mehrere Filter einzusetzen, die alle erfllt sein mssen, verbinden Sie die Filterkriterien mit dem Operator xlAnd. Im letzten Beispiel haben Sie je einen Filter fr die Spalten D und E eingestellt. Im folgenden Beispiel werden Sie ebenfalls zwei Filter verwenden. Allerdings werden Sie in einem Filter (Spalte E) zwei Kriterien formulieren. Folgende Aufgabe soll hierbei gelst werden:

368

Daten filtern

Abbildung 8.3: Zwei Filter (in den Spalten D und E) wurden eingesetzt.

Ermitteln Sie alle Mitarbeiter aus den Standorten Sindelfingen und Bblingen, die eine hhere Nummer als 40.000 haben. Das Makro fr diese Aufgabenbewltigung sehen Sie in Listing 8.4:
Listing 8.4: Mehrere Filter setzen Sub MitarbeiterSifiundBB() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter With Selection .AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlOr, Criteria2:="Bblingen", _ Operator:=xlAnd .AutoFilter Field:=2, Criteria1:=">40000" End With End Sub

Fr jeden einzelnen Filter setzen Sie die Methode AutoFilter ein, die die Kriterien zusammenstellt. Verbinden Sie die einzelnen Kriterien mit dem Operator xlAnd.

Abbildung 8.4: Mehrere Filterkriterien einstellen

369

Groe Datenmengen in VBA behandeln und auswerten

Filterkriterium aus Zelle beziehen


Im folgenden Beispiel werden Sie das Filterkriterium aus einer Zelle beziehen. Geben Sie hierfr in Zelle E34 den Stadtnamen Stuttgart ein und erfassen das Makro 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.

Abbildung 8.5: Die Zelle E34 bildet das Filterkriterium in Spalte E.

Der Filter TopTen


Innerhalb des AutoFilters knnen Sie auf einen ganz speziellen Filter zugreifen, den man als TopTen-Filter bezeichnet. Mithilfe dieses Filters knnen Sie die wertmig hchsten bzw. niedrigsten Werte aus einer Spalte filtern. Im folgenden Beispiel filtern Sie in TABELLE1 aus der Spalte B die wertmig hchsten Nummern.

370

Daten filtern

Listing 8.6: Die Mitarbeiter mit den hchsten 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:=xlTop10Items End Sub

Stellen Sie im ersten Schritt sicher, dass Sie sich in der gewnschten Tabelle befinden. Danach prfen Sie, ob der AutoFilter bereits eingestellt ist. Danach fllen Sie den AutoFilter, indem Sie zuerst die Spalte angeben, in der gefiltert werden soll. Daraufhin geben Sie im Argument Criteria1 an, wie viele Eintrge angezeigt werden sollen. Da die zehn hchsten Werte angezeigt werden sollen, setzen Sie hier die Zahl 10 ein. Damit Excel wei, dass es die TopTen-Filterfunktion anwenden soll, weisen Sie dem Argument Operator die Konstante xlTop10Items zu. Um die zehn niedrigsten Eintrge in Spalte B anzuzeigen, lautet die entsprechende Zeile wie folgt:
Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlBottom10Items

Abbildung 8.6: Die zehn hchsten Wert in Spalte B anzeigen

Wie Sie sehen, werden nun wirklich nur die hchsten zehn Werte aus Spalte B angezeigt. Diese Zeilen liegen aber nicht sortiert vor. In diesem Fall knnen Sie die Sortierung ber einen VBA-Befehl nachholen, den Sie im Makro aus Listing 8.7 sehen knnen.

371

Groe Datenmengen in VBA behandeln und auswerten

Listing 8.7: Filterung von Daten mit anschlieender 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:=xlYes End Sub

Wenden Sie die Methode Sort an, um einen Datenbereich zu sortieren. Den Datenbereich ermitteln Sie ber die Eigenschaft UsedRange. Bei der Methode Sort knnen Sie einige Argumente angeben. Unter anderem mssen Sie angeben, nach welchem Kriterium (Key1) sortiert werden soll. Auerdem ist natrlich auch von Interesse, ob absteigend (Order1:=xlDescending) oder aufsteigend (Order1:=xlAscending) sortiert werden soll. Ein weiteres wichtiges Argument ist Header. Damit geben Sie bekannt, ob die erste Zeile eine berschrift enthlt. In diesem Fall darf diese Zeile nicht mitsortiert werden. Setzen Sie dieses Argument auf den Wert xlYes, wenn der Bereich eine berschrift enthlt. Wenn nicht, dann weisen Sie diesem Argument die Konstante xlNo zu.

Abbildung 8.7: Die Daten liegen nun sortiert vor.

372

Daten filtern

Wo stecken die Filter?


Die eingestellten Filter sehen Sie ganz deutlich an den blauen Filterpfeilen. Wie aber knnen Sie ber den Einsatz eines Makros prfen, in welcher Spalte ein AutoFilter eingestellt ist und in welcher Spalte nicht? Im folgenden Makro wird diese Frage beantwortet. Dabei wurde im Voraus das Makro aus Listing 8.7 gestartet, welches in Spalte B die zehn hchsten Eintrge filtert.
Listing 8.8: Die eingestellten (aktiven) Filter ermitteln Sub Dim Dim Dim WoSteckenDieFilter() Mappe As Worksheet b As Boolean i As Integer

Set Mappe = ThisWorkbook.Worksheets("Tabelle1") For i = 1 To ActiveSheet.Columns.Count On Error GoTo ende If Mappe.AutoFilterMode Then b = Mappe.AutoFilter.Filters(i).On Debug.Print "Filter in Spalte " & i & ": "; b End If Next i ende: End Sub

Definieren Sie im ersten Schritt ein paar Objektvariablen. In der Objektvariablen Mappe speichern Sie die Mappe sowie die Tabelle, auf der nach den gesetzten Autofiltern recherchiert werden soll. Setzen Sie danach eine Schleife auf, die beginnend 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 der jeweiligen Spalte eingestellt ist, bzw. den Wert Wahr, wenn ein Filterkriterium fr die Spalte festgelegt wurde. Mithilfe der Methode Debug.Print geben Sie den Spaltenindex sowie den Status des Filters im Direktfenster Ihrer Entwicklungsumgebung aus.

373

Groe Datenmengen in VBA behandeln und auswerten

Nach dem Starten des Makros blenden Sie den Direktbereich ein, indem Sie in die Entwicklungsumgebung wechseln und aus dem Men ANSICHT den Befehl DIREKTFENSTER whlen.

Abbildung 8.8: In Spalte B ist der AutoFilter eingestellt.

Den Spezialfilter einsetzen


Wenn Sie in einem groen Datenbestand versehentlich Duplikate eingegeben haben und nun eine Liste erstellen mchten, bei der jeder Satz nur einmal vorkommt, dann verwenden Sie den Spezialfilter in Excel. Den Spezialfilter knnen Sie aufrufen, indem Sie aus dem Men DATEN den Befehl FILTER/SPEZIALFILTER whlen und die Kriterien des Spezialfilters einstellen. In der nchsten Aufgabe sind in Spalte A der TABELLE2 einige Zahlenwerte eingegeben. Ihre Aufgabe besteht nun darin, aus dieser Liste eine Unikatsliste in Spalte E zu erstellen. Sehen Sie sich zunchst einmal die Ausgangssituation in Abbildung 8.9 an.

374

Daten filtern

Abbildung 8.9: In dieser Liste soll jede Zahl nur einmal vorkommen.

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:=True End Sub

Legen Sie zuerst in einer Objektvariablen ber die Anweisung Set fest, welcher Bereich mit dem Spezialfilter ausgewertet werden soll. Da Sie Ihre Tabelle auf doppelte Eintrge berprfen mchten, legen Sie den Bereich fr den Spezialfilter mit der Spalte A fest. Danach wenden Sie die Methode AdvancedFilter an, die folgende Syntax aufweist:
Ausdruck.AdvancedFilter(Action, CriteriaRange, CopyToRange, Unique)

Beim Argument Ausdruck muss es sich um ein Range-Objekt handeln. Im Beispiel aus Listing 8.9 ist das der Bereich der verwendeten Zellen in Spalte A. Das Argument Action ist vom Datentyp Long und muss angegeben werden. Es stellt die Filter-Operation dar. Dabei knnen Sie eine der folgenden xlFilterAction-Konstanten anwenden: xlFilterInPlace (an gleicher Stelle filtern) oder xlFilterCopy (Ergebnis des Filterns an anderer Stelle der Tabelle einfgen).

375

Groe Datenmengen in VBA behandeln und auswerten

Das Argument CriteriaRange vom Datentyp Variant ist optional und stellt den Kriterienbereich fr die Filterung dar. Falls das Argument nicht angegeben wird, gibt es keine Kriterien. Das Argument CopyToRange vom Datentyp Variant ist optional und reprsentiert den Zielbereich fr die kopierten Zeilen, wenn das Argument Action den Wert xlFilterCopy aufweist. Andernfalls wird das Argument ignoriert.

Abbildung 8.10: Die Unikatsliste sehen Sie in Spalte E.

Gefilterte Daten exportieren


Haben Sie Ihre Daten gefiltert und mchten 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:=xlPasteAll End Sub

Mithilfe der SpecialCells-Methode und der Eigenschaft CurrentRegion ermitteln Sie alle sichtbaren Zellen im umliegenden Bereich. Diese kopieren Sie mit der Methode Copy. Fgen Sie danach mithilfe der Methode Add eine neue Arbeitsmappe ein. Setzen Sie den Mauszeiger auf Zelle A1 und fgen den Inhalt der Zwi-

376

Daten filtern

schenablage mit der Methode PasteSpecial ein. Im Argument Paste setzen Sie die Konstante xlPasteAll ein, um die Werte und Formate einzufgen. Allerdings werden die Spaltenbreiten dadurch nicht korrekt eingestellt. Diese mssen noch korrigiert werden.

Abbildung 8.11: Die gefilterten Daten wurden bertragen.

Mchten Sie die gefilterten Daten in eine Textdatei bertragen, dann fhren Sie zunchst eine Filterung der Daten durch. Sie kopieren diese auf ein neues Tabellenblatt und exportieren danach diese Tabelle in eine Textdatei. Im folgenden Makro aus Listing 8.11 wird die TABELLE1 gefiltert und in einer neuen Tabelle abgelegt. Danach wird diese neue Tabelle in eine Textdatei berfhrt.
Listing 8.11: Die gefilterten Daten in eine Textdatei berfhren Sub Dim Dim Dim Dim Dim GefilterteTabelleInTextdateiSpeichern() Zelle As Range i As Integer iZ As Integer e As Integer s As String

Sheets("Tabelle1").Activate ActiveSheet.UsedRange.Copy Sheets.Add Range("A1").Select ActiveSheet.Paste

377

Groe 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 #1 MsgBox "Datenbertragung beendet!" End Sub

Mit der Methode Copy und der Eigenschaft UsedRange kopieren Sie den benutzten Bereich und fgen diesen auf dem Tabellenblatt TABELLE1 ein. Dort ermitteln Sie die letzte belegte Zelle in Spalte A. Dies gelingt Ihnen ber die Eigenschaft End, die die Zelle am Ende der Region darstellt, die den Quellbereich enthlt. Der Quellbereich stellt im Beispiel die Zahl 65536 dar, welches die maximale Anzahl von Zeilen in einer Excel-Tabelle darstellt. Dieser Eigenschaft bergeben Sie die Richtungskonstante xlUp. Neben xlUp knnen Sie auch xlToLeft, xlToRight oder xlDown verwenden, je nachdem, welche Zelle Sie ermitteln mchten. Danach ffnen Sie mithilfe der Anweisung Open eine Textdatei, ohne sie vorher anzulegen. Nun setzen Sie eine Schleife auf, die alle Zeilen der Tabelle durchluft. Innerhalb dieser Schleife basteln Sie sich eine zweite Schleife, welche die Spalten einer Zeile von links nach rechts durchluft. Die Anzahl der abzuarbeitenden Spalten ermitteln Sie ber die Anweisung ActiveSheet.UsedRange.Columns. Count. Innerhalb dieser zweiten Schleife speichern Sie die einzelnen Zelleninhalte in der String-Variablen s. Die Zelleninhalte werden durch das Semikolon voneinander getrennt. Setzen Sie die Anweisung Print ein, um die einzelnen Zeilen in die Textdatei zu schreiben. Schlieen Sie nach der bertragung der Daten die Textdatei mithilfe der Anweisung Close.

378

Pivot-Tabellen einsetzen

Abbildung 8.12: Die gefilterten Daten liegen in einer Textdatei vor

8.2

Pivot-Tabellen einsetzen

In Excel haben Sie die Mglichkeit, sehr schnell aussagekrftige Berichte zu erstellen. Die wohl beste und sicherste Methode, in Excel Daten auszuwerten und aufzubereiten, ist die Anwendung von Pivot-Tabellen. Diese Pivot-Tabellen knnen auch per VBA-Code erstellt werden.

Pivot-Tabellen erstellen
Die nchsten Beispiele werden anhand einer Artikel-Tabelle programmiert, die Sie in Abbildung 8.13 sehen knnen.

Abbildung 8.13: Die Ausgangstabelle mit Artikeldaten

379

Groe Datenmengen in VBA behandeln und auswerten

Im folgenden Beispiel soll eine Pivot-Tabelle erstellt werden, die Aussage darber gibt, welche Artikel sich an welchem Ort befinden.
Listing 8.12: Eine Pivot-Tabelle erstellen Sub ErstellenPivotTabelle() Dim Bereich As Range Sheets("Tabelle3").Activate Set Bereich = ActiveSheet.UsedRange Range(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 = xlDataField End With End Sub

Im ersten Schritt aktivieren Sie das Tabellenblatt, welches die Quelldaten fr die Auswertung enthlt, und legen den verwendeten Bereich in der Variablen Bereich fest. Danach markieren Sie den Quellbereich und wenden die Methode Pivot TableWizard 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 nher eingegangen. Im Argument SourceType geben Sie die Quelle der Daten in dem Bericht an. Zulssig ist eine der in der folgenden Tabelle aufgefhrten Konstanten.

380

Pivot-Tabellen einsetzen

Konstante
xlConsolidation xlDatabase xlExternal xlPivotTable

Beschreibung Mehrere Konsolidierungsbereiche Microsoft Excel-Datenbank oder -Liste (Standard) Externe Datenquelle Gleiche Quelle wie ein anderer PivotTable-Bericht

Tabelle 8.2: Die Konstanten des Arguments SourceType

Beim Argument SourceData legen Sie den Datenbereich fr den neuen Bericht fest. Hierfr haben Sie vorher den verwendeten Bereich auf dem Tabellenblatt in der Variablen Bereich definiert, welche Sie hier nun als Argument angeben. Im Argument TableDestination knnen Sie eine Zieltabelle inklusive der Position der ersten Zelle fr den Pivot-Tabellenbericht angeben. Belassen Sie dieses Argument leer, wenn der Pivot-Tabellenbericht auf einer neuen Tabelle, beginnend ab Zelle A1, eingefgt werden soll. Im Argument TableName geben Sie dem Pivot-Tabellenbericht einen Namen. Dies ist sehr wichtig, um spter bei der Anordnung der Pivot-Felder auf die richtige Pivot-Tabelle zuzugreifen. Wird dieses Argument nicht gesetzt, vergibt Excel eigene Namen fr die Pivot-Tabellen, die die Bezeichnung PIVOTTABLE enthalten, und eine fortlaufende Nummer. Gerade diese fortlaufende Nummer macht dann bei der weiteren Programmierung der Pivot-Tabelle Schwierigkeiten. Aus diesem Grund fllen Sie dieses Argument mit einem Namen, der konstant bleibt. Beginnen Sie jetzt mit der Anordnung Ihrer Datenfelder und nutzen Sie dazu das Auflistungsobjekt PivotFields. In diesem Auflistungsobjekt stehen alle verfgbaren Feldnamen der Pivot-Tabelle, die den Spaltenberschriften des Quellbereichs entsprechen. Mit der Eigenschaft Orientation legen Sie die Position des Feldnamens in der Pivot-Tabelle fest. Die Mglichkeiten, die Sie dabei haben, sehen Sie in der folgenden Tabelle.

381

Groe Datenmengen in VBA behandeln und auswerten

Konstante
xlColumnField

Beschreibung Der Spaltenbereich der Pivot-Tabelle wird in unserem Beispiel mit dem Ort gefllt. Im Datenbereich der Pivot-Tabelle wird der Preis der einzelnen Artikel ausgegeben. Mit dieser Konstante knnen Sie einzelne Datenfelder ausblenden. Das Seitenfeld der Pivot-Tabelle bleibt in diesem Beispiel leer. Im Zeilenbereich wird die Bezeichnung der einzelnen Artikel aufgelistet.

xlDataField

xlHidden

xlPageField

xlRowField

Tabelle 8.3: Die verschiedenen Konstanten des Arguments Orientation

Abbildung 8.14: Die fertige PivotTabelle

Pivot-Tabellen aktualisieren
Bei der Arbeit mit Pivot-Tabellen gibt es zwei Punkte, die Sie beachten mssen:

Ist der Pivot-Tabellenbericht aktualisiert? Greift die Pivot-Tabelle wirklich auf den gewnschten Datenbereich zu? (Ist der Datenbereich nachtrglich vergrert worden?)

Um eine Pivot-Tabelle zu aktualisieren, starten Sie das Makro aus Listing 8.13.

382

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).RefreshTable Exit Sub fehler: MsgBox "Es konnte keine Pivot-Tabelle gefunden werden!" End Sub

Auf der TABELLE11 in der aktiven Arbeitsmappe wird die Pivot-Tabelle Pivot mithilfe der Methode RefreshTable auf den neuesten Stand gebracht. Die Anweisung On Error ist eine reine Sicherheitsmanahme, die verhindern soll, dass das Makro abstrzt, 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 automatisch mit. Erfassen Sie zu diesem Zweck das Makro aus Listing 8.14, welches den benutzten Bereich der TABELLE3 ermittelt und diesen Bereich der Pivot-Tabelle Pivot bergibt. Anschlieend erfolgt eine Aktualisierung der Pivot-Tabelle.
Listing 8.14: Eine Pivot-Tabelle dynamisch erweitern und aktualisieren Sub PivotTabellenDatenbereichErweitern() Dim pt As PivotTable Dim 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

Groe Datenmengen in VBA behandeln und auswerten

pt.RefreshTable Next pt End Sub

Ermitteln Sie zuerst einmal den verwendeten Bereich auf Ihrer TABELLE3 und speichern Sie diesen Bereich in der Objekt-Variablen Bereich. Benennen Sie danach den ermittelten Bereich, geben diesem den Namen Pivot und markieren Sie den Bereich im Anschluss. Mithilfe einer For-Each-Schleife greifen Sie auf alle Pivot-Tabellenberichte auf der TABELLE11 zu, erweitern den Datenbereich und aktualisieren die Pivot-Tabellenberichte. Das neue Thema lautet:

Diagrammtypen auswhlen

8.3

Diagramme erstellen

Der Spruch, dass ein Bild mehr aussagt als tausend Worte, wird immer wieder gerne verwendet. Gerade in Excel knnen Sie aus Zahlentabellen mit ein paar wenigen Handgriffen aussagekrftige Diagramme erstellen. Bei der Erstellung von Diagrammen haben Sie die Auswahl aus mehreren Diagrammtypen. Excel bietet Ihnen dabei ber den Diagramm-Assistenten eine Vielzahl an unterschiedlichen Diagrammen an.

Diagrammtypen auswhlen
In VBA wird fr den Diagrammtyp die Eigenschaft ChartType verwendet. In der nachfolgenden Tabelle sehen Sie exemplarisch eine kleine Auswahl an mglichen Diagrammtypen, die ber eine xlChartType-Konstante angesprochen werden knnen.

384

Diagramme erstellen

Diagrammtyp Sulendiagramm (gruppiert) Sulendiagramm (gestapelt) Sulendiagramm 3D-Darstellung Balkendiagramm (gruppiert) Balkendiagramm (gestapelt) Liniendiagramm Kreisdiagramm Punktdiagramm Blasendiagramm Flchendiagramm Ringdiagramm Netzdiagramm Oberflchendiagramm Kursdiagramm Tabelle 8.4: Mgliche Diagrammtypen in Excel

Konstante
xlColumnClustered xlColumnStacked xl3DColumn xlBarClustered xlBarStacked xlLine xlPie xlXYScatter xlBubble xlArea xlDoughnut xlRadar xlSurface xlStockHLC

Neben den in der Tabelle abgebildeten Diagrammtypen gibt es noch Zylinder-, Kegel- und Pyramidendiagramme sowie zu jedem Diagramm zahlreiche Untertypen. Eine komplette Liste der vorhandenen Diagramme in Excel bekommen Sie in der Online-Hilfe unter dem Stichwort ChartType.

Der Standard das Sulendiagramm


Standardmig wird in Excel das Sulendiagramm verwendet. Wenn Sie dazu den Datenbereich markieren, aus dem Sie ein Diagramm erstellen mchten, und dann die Taste (F11) drcken, wird blitzschnell automatisch ein Sulendiagramm eingefgt. Dieser Standardtyp wird in der Praxis oft verwendet, um Kosten oder Leistungen ber Monate hinweg darzustellen.

385

Groe Datenmengen in VBA behandeln und auswerten

In der folgenden Aufgabe gehen Sie von der nachfolgenden Datentabelle aus.

Abbildung 8.15: Die Ausgangstabelle mit den Rohdaten

Aus dieser Datentabelle soll nun ein Diagramm erzeugt werden. Dabei soll der Name der Tabelle (Kostenvergleich 19982001) als Diagrammtitel verwendet werden. Das Makro fr diese Aufgabe lautet:
Listing 8.15: Das Sulendiagramm erstellen Sub SulenDiagrammErstellen() Dim Bereich As Range Dim 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 With End Sub

Im ersten Schritt legen Sie den Bereich fest, der die Datenbasis fr das Diagramm enthlt. Dazu speichern Sie die Adresse des Bereichs in der Range-Variablen Bereich. Danach ermitteln Sie den Namen des aktiven Tabellenblattes ber die Eigenschaften ActiveSheet und Name und speichern ihn in der Variablen s. Mit der Methode Add erstellen Sie zunchst ein neues, noch leeres Diagrammblatt.

386

Diagramme erstellen

Danach legen Sie das Aussehen des Diagramms fest. Mit der Eigenschaft ChartType bestimmen Sie den Diagrammtyp. ber die Methode SetSourceData geben Sie an, woher Excel die Daten fr das Diagramm bekommt. Diese Methode bentigt zwei Argumente. Dem ersten Argument Source bergeben Sie die Variable Bereich. Mit dem zweiten Argument PlotBy legen Sie fest, wie die Daten angezeigt werden sollen. Whlen Sie entweder die Konstante xlColumns oder xlRows. Bei der Konstanten xlRows werden die einzelnen Sulen in einer einheitlichen Farbe formatiert. Hingegen werden die einzelnen Sulen bei Verwendung der Konstanten xlColumns in unterschiedlichen Farben ausgegeben. Die Eigenschaft HasTitle mssen Sie auf den Wert True setzen, damit eine berschrift im Diagramm angezeigt werden kann. Die berschrift des Diagramms erstellen Sie mithilfe der Eigenschaft ChartTitle und der Eigenschaft Text, die Sie aus der Variablen s erfragen knnen.

Abbildung 8.16: Das erste Diagramm ber den Einsatz von VBA erstellen

Ergebnisse ber das Balkendiagramm vergleichen


Ein weiteres sehr oft eingesetztes Diagramm ist das Balkendiagramm. Damit knnen Sie einzelne Informationen wie Umsatz, Kosten oder Leistungen auf einen Blick miteinander vergleichen.

387

Groe Datenmengen in VBA behandeln und auswerten

In der folgenden Aufgabe sollen die Umstze von Arbeitsgruppen in einem bestimmten Monat verglichen werden. Als Ausgangstabelle gehen Sie dabei von der folgenden Abbildung aus.

Abbildung 8.17: Arbeitsgruppen miteinander vergleichen

Erstellen Sie nun anhand dieser Vorgabetabelle ein Balkendiagramm.


Listing 8.16: Ein Balkendiagramm erstellen Sub BalkenDiagrammErstellen() Dim Bereich As Range Dim s As String Set Bereich = Sheets("Arbeitsgruppen-Vergleich").Range("A3:B13") s = ActiveSheet.Name Charts.Add With ActiveChart .ChartType = xl3DbarClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlColumns .HasTitle = True .ChartTitle.Text = s End With End Sub

388

Diagramme erstellen

Stellen Sie zuerst sicher, dass Sie sich auf dem gewnschten Tabellenblatt befinden, auf dem sich die Daten fr das Diagramm befinden. Diese Information geben Sie in der Objektvariablen Bereich mitsamt dem Zellenbereich ber die Anweisung Set an. Fgen Sie danach ein neues Diagrammobjekt ber die Methode Add ein. ber die Eigenschaft ChartType knnen Sie ein Diagramm Ihrer Wahl (siehe Tabelle 8.4) festlegen. Die Datenbasis fr das Diagramm ermitteln Sie mit der Methode SetSourceData, der Sie im Argument Source den vorher definierten Bereich bergeben.

Abbildung 8.18: Die Arbeitsgruppen wurden in einem bersichtlichen Diagramm dargestellt.

Tagesgenaue Auswertungen ber das Liniendiagramm


Haben Sie Datenmaterial vorliegen, das sich ber einen greren Zeitraum erstreckt, und sind dabei die einzelnen Intervalle recht kurz, dann knnen Sie ein Liniendiagramm einsetzen. So knnen Sie in der Praxis beispielsweise Temperaturschwankungen innerhalb eines Tages oder Aktienkurse ber einen bestimmten Zeitraum hinweg darstellen. In der folgenden Aufgabe werden Temperaturen innerhalb eines Tages gemessen und zu jeder vollen Stunde in eine Tabelle geschrieben. Die Temperaturtabelle sieht dabei wie in Abbildung 8.19 aus. Erfassen Sie nun das Makro, welches die Temperaturverlufe in einem Liniendiagramm darstellt.

389

Groe Datenmengen in VBA behandeln und auswerten

Abbildung 8.19: Die Temperaturen werden zu jeder vollen Stunde aufgezeichnet. Listing 8.17: Temperaturverlufe in einem Liniendiagramm darstellen Sub Dim Dim Dim LinienDiagrammErstellen() Dia As ChartObject s As String 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

390

Diagramme erstellen

.ChartType = xlLineMarkers .HasLegend = False .HasTitle = True .ChartTitle.Text = s End With Range("A1").Select End Sub

Im ersten Schritt aktivieren Sie die Tabelle TEMPERATUR und schreiben den Tabellennamen der aktiven Tabelle in die Variable s. Dieser Tabellenname soll spter die berschrift des Diagramms werden. Da Sie ein eingebettetes Diagramm einfgen mchten, mssen Sie dafr Sorge tragen, dass bei mehrmaligem Starten des Makros nicht mehrere Diagramme bereinander eingefgt werden. Lschen Sie daher zu Beginn alle integrierten Diagramme auf dem Arbeitsblatt ber die Methode Delete. Danach fgen Sie ein noch leeres Chart-Objekt in Ihre Tabelle mit der Methode
Add ein. Dabei knnen Sie die Position des ChartObjekts genau festlegen. Die vier

Zahlenwerte entsprechen den Angaben linker Rand, oberer Rand, Breite und Hhe. Die Werte werden in Punkten angegeben und beziehen sich auf die obere linke Ecke der Zelle A1 oder auf die obere linke Ecke des Diagramms. Geben Sie als Nchstes dem eingebetteten Diagramm einen Namen. Jetzt mssen Sie herausbekommen, wie viele Messungen im Diagramm angezeigt werden sollen. Dazu ermitteln Sie die letzte belegte Zelle in Spalte B und speichern die Zeilennummer in der Variablen i. Markieren Sie den Bereich und kopieren Sie ihn mit der Methode Copy. Markieren Sie danach Ihr gerade eingefgtes Diagramm. Um die kopierten Daten einzufgen, verwenden Sie die Methode Paste der SeriesCollection-Auflistung. Die Syntax dieser Methode lautet:
Paste(Rowcol, SeriesLabels, CategoryLabels, Replace, _ NewSeries)

Im ersten Argument RowCol geben Sie Auskunft darber, ob sich die Daten in Zeilen oder Spalten befinden. Zulssig sind hierbei die Konstanten xlColumns oder xlRows. Das Argument SeriesLabels gibt an, woher Excel die Beschriftung fr die Datenreihen nehmen soll. Wird der Wert auf True gesetzt, wird der Inhalt der Zelle in der ersten Spalte jeder Zeile (bzw. der ersten Zeile jeder Spalte) als Name fr die Datenreihe in der betreffenden Zeile (bzw. Spalte) verwendet. Setzen Sie dieses Argument auf den Wert False, wenn der Inhalt der Zelle in der ersten Spalte jeder

391

Groe Datenmengen in VBA behandeln und auswerten

Zeile (bzw. der ersten Zeile jeder Spalte) als erster Datenpunkt der Datenreihe verwendet werden soll. Das nchste Argument CategoryLabels weist den Wert True auf, wenn der Inhalt der ersten Zeile (bzw. Spalte) als Rubrik des Diagramms verwendet wird. Setzen Sie 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 standardmig auf den Wert True gesetzt. Dabei werden beim Ersetzen vorhandener Rubriken durch Informationen aus dem kopierten Bereich Rubriken angewendet. Das letzte Argument NewSeries hat dann den Wert True, wenn die Daten als eine neue Datenreihe eingefgt werden sollen. Setzen Sie das Argument auf den Wert False, wenn Sie die Daten als neue Datenpunkte in eine vorhandene Datenreihe einfgen mchten. Nach der Kopier- und Einfgeaktion ist nach wie vor der Kopierrahmen aktiv. Setzen Sie die Eigenschaft CutCopyMode auf den Wert False, um den Ausschneidebzw. Kopiermodus zu deaktivieren und den Laufrahmen zu entfernen. Als letzte Aufgabe weisen Sie dem Diagramm den gewnschten Diagrammtyp ber die Eigenschaft ChartType zu, verzichten auf eine Legende, indem Sie die Eigenschaft HasLegend auf den Wert False setzen, und zeigen die berschrift im Diagramm an, indem sie der Eigenschaft ChartTitle den Text Ihrer Variablen s zuweisen.

Abbildung 8.20: Die Temperaturen werden bersichtlich in einem Liniendiagramm dargestellt.

Wenn Sie sich die Abbildung 8.20 ansehen, dann stellen Sie fest, dass die Skalierung der Y-Achse von 0 bis 18 geht. Diese Skalierung wird von Excel automatisch beim Erstellen des Diagramms festgelegt. Selbstverstndlich haben Sie die Mglichkeit, die Skalierung auch selbst zu bestimmen.

392

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 grte Wert der Temperaturtabelle (17) und der niedrigste Wert (9) fr die Skalierung herangezogen werden. Die Skalierung soll beim niedrigsten Punkt beginnen und beim hchsten Punkt enden. Passen Sie das Makro aus Listing 8.17 wie folgt an. (Es werden nur die nderungen im folgenden Listing aufgefhrt.)
Listing 8.18: Die Skalierung des Diagramms selbst bestimmen Sub LinienDiagrammErstellen() Dim i_min As Integer Dim 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 Min den hchsten sowie den niedrigsten Wert der Temperaturmessung. Diese beiden Werte weisen Sie danach den Eigenschaften MinimumScale sowie MaximumScale zu. Die Schrittweite der Skalierung legen Sie mithilfe der Eigenschaft MajorUnit fest.

Diagramme platzieren
Beim Einfgen von Diagrammen haben Sie die Auswahl, ob Sie das Diagramm unterhalb Ihrer Datentabelle oder als neues Diagrammblatt einfgen mchten. Sie haben jedoch jederzeit die Mglichkeit, Diagramme innerhalb von Arbeitsmappen und Tabellen hin und her zu schieben.

393

Groe Datenmengen in VBA behandeln und auswerten

Abbildung 8.21: Die Skalierung der Daten selbst bestimmen

Im folgenden Beispiel soll das eingebettete Diagramm auf der Tabelle TEMPERATUREN in einem separaten Diagrammblatt mit dem Namen TEMPERATURENGROSS transferiert werden. Das Makro fr diese Aufgabe knnen Sie im nchsten Listing 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 wenden Sie die Methode Location an, um das eingebettete Diagramm zu verschieben. Bei der Methode Location knnen Sie im Argument Where entweder die Konstanten xlLocationAsNewSheet, xlLocationAsObject oder xlLocationAutomatic verwenden. In Listing 8.19 wird das eingebettete Diagramm in ein neues Diagrammblatt verschoben. Aus diesem Grund verwenden Sie hier das Argument xlLocationAsNewSheet. Im Argument Name geben Sie an, wie das neue Diagrammblatt heien soll.

394

Diagramme erstellen

Abbildung 8.22: Das Diagramm wurde in ein separates Diagrammblatt verschoben.

Diagramme formatieren
Excel whlt beim Erstellen von Diagrammen die Farben des Diagramms selbststndig aus. Diese Auswahl der Farben knnen Sie selbstverstndlich auch nach eigenem Geschmack durchfhren.

Abbildung 8.23: Das Ausgangsdiagramm

In der folgenden Aufgabe werden Sie ein Sulendiagramm einfgen. Im Sulendiagramm selbst werden Deckungsbeitrge angezeigt. Diese Deckungsbeitrge knnen entweder im negativen oder im positiven Bereich liegen. Ihre Aufgabe besteht nun darin, alle negativen Deckungsbeitrge mit der Fllfarbe ROT sowie alle positiven

395

Groe Datenmengen in VBA behandeln und auswerten

Deckungsbeitrge mit der Fllfarbe BLAU zu formatieren. Gehen Sie zunchst von folgender Ausgangstabelle aus (siehe Abbildung 8.23). In Abbildung 8.23 sind alle Sulen mit der Fllfarbe BLAU formatiert. Erfassen Sie jetzt das folgende Makro aus Listing 8.20, um die negativen Deckungsbeitrge mit der Fllfarbe ROT zu formatieren.
Listing 8.20: Sulen unterschiedlich einfrben Sub Dim Dim Dim Dim SulenVerschiedenfarbig() Datenreihe As Series Punkt As Point i As Integer DArray As Variant

Sheets("Deckungsbeitrge").Activate Set 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 With End Sub

Definieren Sie zuerst eine Objektvariable vom Typ Series. Nun lesen Sie alle YWerte in ein Datenfeld ein und durchlaufen danach eine For-Each-Schleife, in der Sie die einzelnen Datenpunkte kontrollieren. Die Werte entnehmen Sie dem Datenfeld DArray. Weist ein Datenpunkt einen Wert < 0 auf, wird der Innenbereich der Sule mit der Farbe ROT formatiert. Bei allen positiven Werten wird ein blauer Farbton gewhlt.

396

Diagramme erstellen

Abbildung 8.24: Unterschiedliche Farben der Sulen

Diagramme exportieren
In Excel knnen Sie Diagramme ber einen Grafikfilter umwandeln und somit in ein anderes Format berfhren. Das bringt Vorteile, wenn Sie Diagramme an Personen ausliefern mchten, die kein Excel installiert haben. Erstellen Sie aus den Excel-Diagrammen Speicher schonende Grafikdateien im GIF-Format. Auch wenn Sie Diagramme in Ihrer Textverarbeitung verwenden und dabei keine Excel-Diagramme verknpfen mchten, ist das Einbinden von Diagramm-Grafiken eine gute Alternative. Allerdings knnen diese umgewandelten Diagramme dann nicht mehr aktualisiert werden. In der folgenden Aufgabe wird das gerade formatierte Diagramm aus Abbildung 8.24 in eine Grafikdatei umgewandelt. Erfassen Sie zu diesem Zweck das Makro aus Listing 8.21.
Listing 8.21: Diagramm als Grafik-Objekt exportieren Sub DiagrammeAlsGrafikSpeichern() Dim Dia As Chart Sheets("Deckungsbeitrge").Activate Set Dia = ActiveSheet.ChartObjects(1).Chart Dia.Export Filename:="c:\Eigene Dateien\Export.gif", _ FilterName:="GIF" End Sub

397

Groe 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 verwendet werden soll.

Abbildung 8.25: Die umgewandelte Datei kann im Photo Editor aufgerufen werden.

8.4
F A

Fragen & Antworten


Um diese Aufgabe zu lsen, starten Sie das Makro aus Listing 8.22.
Listing 8.22: Die gefilterten Zeilen zhlen Sub ZeilenGefiltert() Dim Bereich As Range Dim i As Integer Sheets("Tabelle1").Activate Set Bereich = Range("A1").CurrentRegion

Wie knnen Sie feststellen, wie viele Zeilen gefiltert sind?

398

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 umliegenden Bereich, der von Leerzeilen bzw. Leerspalten umgeben wird. Es wird demnach der Block ermittelt, der sich, beginnend von der Zelle, in der der erste Filter angezeigt wird (A1), bis zur letzten gefllten Zeile ergibt. Mit der Eigenschaft Intersect prfen Sie, ob es im Bereich der Spalte A gefilterte Zeilen gibt. Dazu verwenden Sie die Methode SpecialCells, der Sie die Konstante xlVisible bergeben. Die Zhlung der ermittelten Zeilen erfolgt durch die Eigenschaft Count, von der Sie den Wert 1 subtrahieren mssen, da die berschriftenzeile nicht zum Ergebnis der gefilterten Daten gezhlt werden soll. Abschlieend geben Sie die Anzahl der gefilterten Zeilen in einem Meldungsfenster aus, welches Sie mit der Symbol-Info ausstatten. Dazu verwenden Sie die Konstante vbInformation.
F

Wie knnen Sie die erste gefilterte Zeile ermitteln?


A

Um diese Aufgabe zu lsen, 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 Next End Sub

Da die eigentlichen Daten erst in Zeile 2 beginnen, setzen Sie die ForNext-Schleife mit einem Startwert von 2 auf und durchlaufen alle Zeilen im benutzten Bereich. Innerhalb der Schleife prfen Sie, ob die Eigenschaft Hidden der jeweiligen Zeile den Wert False liefert. Wird dieser Wert zum ersten Mal zurckgegeben, wird die aktuelle Zeilennummer auf dem

399

Groe Datenmengen in VBA behandeln und auswerten

Bildschirm ausgegeben. Danach wird die Schleife ber die Anweisung Exit For direkt verlassen.
F

Wie knnen Sie alle Diagrammbltter aus Ihrer Arbeitsmappe entfernen?


A

Um alle Diagrammbltter aus einer Arbeitsmappe zu entfernen, starten Sie das Makro aus Listing 8.24.
Listing 8.24: Alle Diagrammbltter aus Arbeitsmappe entfernen Sub DiagrammeEntfernen() Application.DisplayAlerts = False On Error Resume Next ActiveWorkbook.Charts.Delete Application.DisplayAlerts = True End Sub

Indem Sie die Eigenschaft DisplayAlerts auf den Wert False setzen, brauchen Sie die einzelnen Lschungen nicht zu besttigen. Die On-ErrorAnweisung sorgt dafr, dass die Verarbeitung sauber abgefangen wird, wenn berhaupt kein Diagrammblatt in der Arbeitsmappe enthalten ist. Die Eigenschaft Charts gibt eine Auflistung aller Diagrammbltter der aktiven Arbeitsmappe zurck, die Sie mithilfe der Methode Delete lschen.
F

Wie knnen Sie die Schriftart einer Legende anpassen?


A

Sie haben Zugriff auf die Legende eines Diagramms, indem Sie auf die Eigenschaft Legend von ActiveChart zugreifen. Im folgenden Makro aus Listing 8.25 formatieren Sie eine Legende mit der Schriftfarbe BLAU und dem Schriftschnitt FETT.
Listing 8.25: Die Legende formatieren Sub LegendeFormatieren() Sheets("Deckungsbeitrge").Activate ActiveSheet.ChartObjects(1).Select ActiveChart.HasLegend = True With ActiveChart.Legend.Font .Bold = True .ColorIndex = 5 End With End Sub

400

Quiz

Blenden Sie mithilfe der Eigenschaft HasLegend die Legende des Diagramms ein, indem Sie diese Eigenschaft auf den Wert True setzen. Im Anschluss daran wenden Sie die Eigenschaften Bold und ColorIndex auf das Schriftobjekt Font der Legende an, um den Schriftschnitt sowie die Schriftfarbe festzulegen.

8.5
F F F F F F F F

Quiz

Wie lautet die Anweisung, um den AutoFilter einzuschalten? Wie heit die Methode, um den SpezialFilter aufzurufen? Wie lautet die Methode, um eine Pivot-Tabelle zu aktualisieren? Wie kann man den Diagrammtyp bestimmen? Welchen ChartType mssen Sie whlen, um ein Kreisdiagramm einzufgen? ber welche Eigenschaft stellen Sie den grten Wert einer Skalierung ein? Welche Konstante mssen Sie bei der Eigenschaft Location angeben, um ein eingebettetes Diagramm in ein separates Diagrammblatt zu transferieren? Welche zwei Argumente mssen beim Export eines Diagramms bei der Methode Export angegeben werden?

8.6

bungen

Zum Ende dieses Tages versuchen Sie bitte, folgende Aufgaben zu lsen: 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 Zylinderdiagramm zu erstellen. Das Ergebnis dieser Aufgabenstellungen finden Sie im Anhang A.

401

Funktionen einsetzen, um Excel zu automatisieren

Funktionen einsetzen, um Excel zu automatisieren

Am gestrigen Tag haben Sie gelernt, wie man groe Datenmengen ber den Einsatz von Pivot-Tabellen sowie der Datenfilterung schnell und sicher auswerten kann. Des Weiteren haben Sie erfahren, wie Sie mit Makros Diagramme einfgen und gestalten knnen. Die Themen heute:

Eigene Funktionen stricken Modulare Funktionen programmieren Funktionen dauerhaft verfgbar machen

Standardmig bietet Ihnen Excel einige hundert Funktionen an, die Sie fr Ihre tgliche Arbeit ntzen knnen. Dabei muss man zwischen den Funktionen unterscheiden:

Auf der einen Seite gibt es Funktionen, die Sie in einer Tabelle direkt in eine Zelle eingeben. Die populrste dieser Funktionen ist die Funktion SUMME(), die einen angegebenen Zellenbereich summiert. Weitere Funktionen knnen ber den Funktions-Assistenten elegant in Ihre Tabellen eingefgt werden. Daneben gibt es spezielle VBA-Standardfunktionen, die Sie in Ihren Makros einsetzen knnen, um bestimmte Aufgaben zu erledigen. Ein Beispiel fr eine solche Funktion stellt die Funktion Len dar, ber die Sie beispielsweise die Lnge eines Zelleninhaltes feststellen knnen. Diese und weitere Funktionen knnen Sie in der Online-Hilfe auf der Registerkarte INHALT unter der Rubrik FUNKTIONEN nachschlagen. In den meisten Fllen wird zu diesen Funktionen auch ein kleines Beispiel angeboten, welches Sie kopieren und in Ihre eigenen Makros mit einbauen knnen. Des Weiteren gibt es Funktionen, die Sie selbst schreiben, um sich Schreibarbeit zu sparen und Redundanz von Quellcode zu vermeiden. Ein Beispiel fr diese Art von Funktionen wre eine Funktion, die berprft, ob eine bestimmte Tabelle in einer Arbeitsmappe vorhanden ist. Da Sie so eine Aufgabe in der Programmierung bestimmt sehr oft durchfhren werden, empfiehlt es sich, eine solche Aufgabe in eine allgemeine Funktion zu packen und diese dann aus den verschiedenen Makros aufzurufen. Der Vorteil liegt auf der Hand: Wenn Sie die Funktion ndern mchten, dann mssen Sie dies nicht an vielen Stellen im Quellcode machen, sondern eben nur in dieser einen Funktion.

404

Eigene Tabellenfunktionen stricken

9.1

Eigene Tabellenfunktionen stricken

Sicher ist die Auswahl der standardmig angebotenen Tabellenfunktionen ganz betrchtlich und in den meisten Fllen auch ausreichend. Trotzdem gibt es hier und da noch Bedarf, eigene Tabellenfunktionen zu erstellen, um spezielle Aufgaben zu lsen. Die so erstellten neuen Tabellenfunktionen knnen Sie ebenso ber den Funktionsassistenten unter der Rubrik BENUTZERDEFINIERT einfgen.

Abbildung 9.1: Benutzerdefinierte Funktionen

Sehen Sie nun anhand einiger typischer Beispiele aus der Praxis, wie Sie neue Tabellenfunktionen erstellen und einsetzen knnen. Alle Beispiele heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Funktionen.xls im Verzeichnis Kap9.

Zellen mit blauer, dicker Schriftfarbe summieren


In der ersten Aufgabe haben Sie eine Tabelle mit Zahlenwerten vorliegen. Ihre Aufgabe besteht nun darin, aus dieser Tabelle alle die Zahlen zu summieren, deren Schriftfarbe BLAU und deren Schriftschnitt FETT ist. Sehen Sie sich dazu einmal die Ausgangssituation in Abbildung 9.2 an.

405

Funktionen einsetzen, um Excel zu automatisieren

Abbildung 9.2: Eine Tabelle mit unterschiedlich formatierten Zahlenwerten

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 zelle End Function

Jede Funktion beginnt mit dem Schlsselwort Function, gefolgt vom Namen der Funktion, der nahezu beliebig gewhlt werden kann. Da Sie den Namen dieser Funktion spter direkt in einer Tabellenzelle erfassen mssen, empfiehlt es sich, mglichst kurze Funktionsnamen zu verwenden. Der von mir gewhlte Name BUF steht dabei fr Blau und Fett. Nach dem Namen folgen in Klammern die Argumente, die der Funktion bergeben werden sollen. Da dieses Argument in unserem Beispiel Zellen sein sollen, bergeben Sie der Funktion eine Objektvariable vom Typ Range. Der Aufruf der Funktion in einer beliebigen Zelle einer Tabelle lautet danach beispielsweise =BUF(A1:A13).

406

Eigene Tabellenfunktionen stricken

Mit der Anweisung Application.Volatile sorgen Sie dafr, dass der Wert der Zelle neu berechnet wird, wenn ein neuer Wert in der Tabelle erfasst wird. Die Aktualisierung erfolgt nicht automatisch, wenn Sie nur die Formatierung einer Zelle ndern.

In einer anschlieenden Schleife arbeiten Sie alle Zellen nacheinander ab, die mit der Funktion bergeben wurden. Innerhalb dieser Schleife sollten Sie sicherstellen, dass es sich wirklich um Zellen handelt, die Zahlenwerte enthalten. Wenn nicht, dann meldet die VBA-Funktion IsNumeric den Wert False, was zur Folge hat, dass eine solche Zelle ignoriert wird. Neben dieser Prfung mssen Sie im Anschluss daran berprfen, ob der Schriftschnitt FETT ist. Diese Prfung erreichen Sie, indem Sie die Eigenschaft Bold des Font-Objektes abfragen. Meldet diese Prfung als Ergebnis den Wert True, dann ist die Zelle mit dem Schriftschnitt FETT formatiert. Damit noch nicht genug, es muss schlielich auch die richtige Farbe, nmlich BLAU, vorliegen. Die Farbe der Schriftart knnen Sie ber die Eigenschaft ColorIndex feststellen, welche fr die Farbe BLAU den Index 5 zurckmeldet. Nur wenn diese beiden Formatierungskriterien zutreffen, erfolgt eine Summierung. Achten Sie dabei darauf, dass Sie die bereits ermittelten Werte nicht berschreiben. Fr diesen Fall schreiben Sie die Anweisung BUF = BUF + zelle.Value, was bedeutet, dass der bisherige Wert, der momentan in BUF steht, um den Wert addiert wird, der in der aktuell berprften Zelle steht. Testen Sie nun die Funktion, indem Sie diese in eine beliebige Zelle der Tabelle eingeben, wie dies in Abbildung 9.3 durchgefhrt wurde. brigens knnen Sie die Funktion aus Listing 9.1 als Vorlage einsetzen, wenn es darum geht, anstatt der Summierung eine einfache Zhlung durchzufhren. In diesem Fall lautet die Funktion wie folgt:
Listing 9.2: Fett und blau formatierte Zellen zhlen 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

Funktionen einsetzen, um Excel zu automatisieren

BUFZ = BUFZ + 1 End If End If Next zelle End Function

Abbildung 9.3: Die Funktion liefert das richtige Ergebnis.

Aktuelle Arbeitsmappe ermitteln


Um zu prfen, welchen Namen die momentan aktive Arbeitsmappe hat, knnen Sie eine benutzerdefinierte Funktion schreiben, die den Namen der Arbeitsmappe in eine Zelle schreibt. Die Funktion fr diese Aufgabe knnen Sie in Listing 9.3 sehen:
Listing 9.3: Den Namen der aktiven Arbeitsmappe in einer Zelle zurckgeben Function AktMap() AktMap = ActiveWorkbook.Name End Function

ber die Anweisung ActiveWorkbook.Name knnen Sie den Namen der Arbeitsmappe ermitteln. Wenn Sie zustzlich zum Namen auch noch den Speicherpfad ermitteln mchten, dann erweitern Sie die Funktion aus Listing 9.3 wie folgt:

408

Eigene Tabellenfunktionen stricken

Listing 9.4: Den kompletten Speicherpfad sowie den Namen der aktiven Arbeitsmappe zurckgeben Function AktMapV() AktMapV = ActiveWorkbook.FullName End Function

ber die Eigenschaft FullName knnen Sie den Namen sowie den Pfad einer gespeicherten Arbeitsmappe ermitteln. Allerdings muss diese Arbeitsmappe vorher einmal gespeichert worden sein.

Abbildung 9.4: Beide Funktionen im Einsatz

Formelcheck durchfhren
In der nchsten Aufgabe soll mit einer Funktion geprft werden, ob eine bestimmte Zelle eine Formel enthlt oder nicht. Dazu fgen Sie folgende Funktion ein. Die Funktion aus Listing 9.5 prft, ob eine Zelle eine Formel bzw. Verknpfung enthlt:
Listing 9.5: Zellen auf Formelinhalt berprfen Function FormelZ(zelle) Application.Volatile FormelZ = False If Left(zelle.Formula, 1) = "=" Then FormelZ = True End Function

Eine Formel bzw. eine Verknpfung oder auch eine Funktion erkennen Sie in Excel daran, dass diese mit einem Gleichheitszeichen beginnt. Genau dieses Verhalten prfen Sie, indem Sie in der Zielzelle das erste Zeichen auswerten. Setzen Sie zu diesem Zweck die Funktion Left ein und extrahieren Sie das erste Zeichen der angegebenen Zelle, indem Sie als zweites Argument fr diese Funktion die Zahl 1 einsetzen. Entspricht das erste Zeichen einem Gleichheitszeichen, dann geben Sie als Rckgabewert True zurck.

409

Funktionen einsetzen, um Excel zu automatisieren

Testen Sie die Funktion, indem Sie in einer Tabelle ab Zelle B2 bis Zelle B4 ein paar Zahlenwerte eintragen und summieren danach diese Zellen in Zelle B5. Geben Sie dann die Funktion =FormelZ(B2) in Zelle C2 ein und kopieren Sie diese Funktion mit einem Doppelklick auf das Ausfllkstchen nach unten.

Abbildung 9.5: Die Zelle B5 enthlt eine Formel.

Diese Funktion bercksichtigt auch Zellen, welche Texte enthalten. Nachdem Sie zu Beginn der Funktion den Rckgabewert auf False gesetzt haben, gibt es diesbezglich keine Probleme.

Zelleninformationen abfragen
In der nchsten Aufgabe werden Sie eine Zelle mithilfe einer Funktion berprfen. Je nach Funktionsaufruf sollen dabei folgende Informationen ermittelt werden:

die Zellenadresse der Zellenwert die Zellenformel

Alle diese Informationen knnen Sie ber die folgende Funktion aus Listing 9.6 abfragen:
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

410

Eigene Tabellenfunktionen stricken

INFOZ = zelle.Value Case 3 INFOZ = zelle.FormulaLocal Case Else INFOZ = "nicht vergeben" End Select End Function

Bei der Funktion aus Listing 9.6 knnen Sie sowohl die Zellenadresse, den Zellenwert sowie die Zellenformel abfragen. Um beispielsweise die Zellenadresse abzufragen, rufen Sie die Funktion in Ihrer Tabelle wie folgt auf: =INFOZ(B7;1). Innerhalb dieser Funktion werten Sie genau dieses zweite Argument aus. Um die Zellenadresse zurckzugeben, setzen Sie die Eigenschaft Address ein. Den Wert einer Zelle bekommen Sie ber die Eigenschaft Value und die Formel der Zelle erhalten Sie ber die Eigenschaft FormulaLocal.

Abbildung 9.6: Unterschiedliche Ergebnisse je nach Funktionsaufruf

Dokumenteigenschaften per Funktion abfragen


Das folgende Beispiel hnelt dem gerade besprochenen. Auch in diesem Beispiel stricken Sie eine Funktion, die mithilfe eines flexiblen Arguments unterschiedliche Ergebnisse bringt. So sollen unter anderem folgende Dokumenteigenschaften ber eine Tabellenfunktion abgefragt werden:

Dateiname und Pfad nur Dateiname nur Pfad der Datei Dateityp

411

Funktionen einsetzen, um Excel zu automatisieren

Dateigre Erstellungsdatum der Datei letzte nderung an der Datei letzter Zugriff auf die Datei

Fassen Sie diese Informationen nun in einer Funktion zusammen, welche Sie in Listing 9.7 sehen knnen:
Listing 9.7: Dokumenteigenschaften ber eine Funktion abfragen Function DokuEig(EigenschaftsNr As Integer) Dim fso As Object Dim tmp As String On Error Resume Next Set 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 = "Ungltige EigenschaftsNr!" End Select End With DokuEig = tmp End Function

Erstellen Sie im ersten Schritt einen Verweis auf das FileSystemObject, um damit die Informationen bezglich der Arbeitsmappe zu erlangen. ber die Methode GetFile teilen Sie Excel mit, welche Datei Sie diesbezglich auswerten mchten. Danach werten Sie die bergebene Eigenschaftennummer in einer Select-CaseAnweisung aus:

412

Eigene Tabellenfunktionen stricken

Mithilfe der Eigenschaft Path ermitteln Sie den Namen sowie den kompletten Speicherpfad der aktiven Arbeitsmappe. Das Verzeichnis ermitteln Sie, indem Sie ber die Funktion Mid einen Teil aus der kompletten Pfadangabe herausschnippeln. Dabei subtrahieren Sie die Lnge 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 knnen diese Funktion auch anhand von Word-Dokumenten, Access-Datenbanken und weiteren Dateitypen anwenden. Die Eigenschaft Size gibt die Gre der Datei in Bytes an. Mithilfe der Eigenschaft DateCreated knnen Sie das Erstellungsdatum einer Datei ermitteln. ber die Eigenschaft DateLastModified gelangen Sie an das Datum inklusive der Uhrzeit der letzten nderung der Datei. Mit der Eigenschaft DateLastAccessed knnen Sie das letzte Zugangsdatum der Datei ermitteln, d.h. wann die Datei das letzte Mal geffnet wurde.

Abbildung 9.7: Die Funktion DokuEig mit unterschiedlichen Argumenten und Ergebnissen

Buchstaben aus Zellen eliminieren


Bei der nchsten Aufgabe sollen aus einer Zelle, die sowohl Buchstaben als auch Zahlen enthlt, alle Buchstaben rausgeworfen werden. Diese Aufgabe lsen Sie mit der Funktion aus Listing 9.8:

413

Funktionen einsetzen, um Excel zu automatisieren

Listing 9.8: Alle Buchstaben sollen aus einer Zelle entfernt werden Function BuchstRaus(Zelle) As Integer Dim 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 i End Function

Ermitteln Sie im ersten Schritt die Lnge der Zelle und setzen Sie dafr die Funktion Len ein. Danach prfen Sie mithilfe der Funktion Asc das jeweils aktuelle Zeichen der Zelle, indem Sie dieses in einen Integer-Wert umwandeln. Mit der Funktion Mid extrahieren Sie jeweils das nchste Zeichen aus der Zelle. Dabei entsprechen die Werte 65 bis 90 Kleinbuchstaben, die Werte 97 bis 122 den Grobuchstaben und die restlichen Werte den Sonderzeichen. Diese Wertbereiche grenzen Sie innerhalb der Select-Case-Anweisung aus. Wird ein Zeichen in der Zelle gefunden, welches numerisch ist bzw. einem Sonderzeichen entspricht, wird es gesammelt und bereits ermittelten Zahlen mit angehngt.

Abbildung 9.8: Aus gemischten Zellen Zahlen herstellen

Das erste Auftreten einer Zahl ermitteln


Die nchste Funktion ist der Funktion aus Listing 9.8 hnlich. Bei der nchsten Aufgabe soll die Position des ersten Auftretens einer Zahl in einer Zelle ermittelt und ausgegeben werden.

414

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 Integer Dim 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 = 0 End Function

Ermitteln Sie im ersten Schritt die Lnge der Zelle und setzen Sie dafr die Funktion Len ein. Danach prfen Sie mithilfe de Funktion Asc das jeweils aktuelle Zeichen der Zelle, indem Sie dieses in einen Integer-Wert umwandeln. Mit der Funktion Mid extrahieren Sie jeweils das nchste Zeichen aus der Zelle. Dabei entsprechen die Werte 65 bis 90 Kleinbuchstaben, die Werte 97 bis 122 den Grobuchstaben sowie die restlichen Werte den Sonderzeichen. Diese Wertbereiche grenzen Sie innerhalb der Select-Case-Anweisung aus. Wird das erste Zeichen in der Zelle gefunden, welches numerisch ist, dann springen Sie mit der Anweisung Exit Function aus der Funktion. In der Variablen steht dann automatisch die richtige Position des Zeichens. Wurde kein numerisches Zeichen gefunden, dann meldet die Funktion den Wert 0 zurck.

Abbildung 9.9: Aus gemischten Zellen die Position der ersten Zahl ermitteln

415

Funktionen einsetzen, um Excel zu automatisieren

9.2

Modulare Funktionen programmieren

Nachdem Sie gelernt haben, wie Sie benutzerdefinierte Tabellenfunktionen programmieren knnen, kommen wir nun zu den modularen Funktionen. Unter einer modularen Funktion fassen Sie Arbeitsschritte zusammen, die Sie immer wieder in gleicher oder hnlicher Form in Ihrem Quellcode durchfhren. Anstatt diese Arbeitsschritte in Form von Anweisungen immer wieder neu zu erfassen, schreiben Sie einmal eine Funktion und rufen diese immer wieder an verschiedenen Stellen im Quellcode auf. Dies macht den Quellcode einfacher lesbar und nderungen am Quellcode knnen so auch leichter durchgefhrt werden. Lernen Sie in den folgenden Beispielen, wie Sie diese modularen Funktionen effizient bei Ihrer Arbeit einsetzen knnen.

Arbeitsmappen-Existenz prfen
Bevor Sie eine bestimmte Arbeitmappe ber ein Makro ffnen, sollten Sie sicherstellen, ob diese Arbeitsmappe berhaupt existiert. Damit vermeiden Sie hssliche Makroabstrze, weil Sie dadurch die Mglichkeit haben, diesen Fehlerfall abzufangen. Erfassen Sie jetzt eine Funktion und bergeben dieser Funktion den Dateinamen mitsamt der Laufwerks- und Pfadangabe. Als Ergebnis dieser Funktion sollten Sie dann eine Rckmeldung bekommen, ob die angegebene Datei auch vorhanden ist.
Listing 9.10: Prfung auf Dateiexistenz Function DateiExist(s As String) As Boolean DateiExist = False If Len(s) > 0 Then DateiExist = _ (Dir(s) <> "") Exit Function End Function

Wie schon erwhnt, erwartet die Funktion den Namen der Datei, deren Existenz sie prfen soll. Die Prfung, ob berhaupt eine Zeichenfolge an die Funktion bergeben wurde, erfolgt ber die Funktion Len. Wird eine Lnge von 0 gemeldet, wurde keine Zeichenfolge an die Funktion bergeben. Ansonsten entspricht diese in jedem Fall einer Gre > 0. Die Funktion Dir versucht nun auf die Datei zuzugreifen. Ist die Datei nicht vorhanden, meldet die Funktion eine Leerfolge zurck.

416

Modulare Funktionen programmieren

Damit wird der Datentyp Boolean mit dem Wert False an das aufrufende Makro zurckgemeldet. Im anderen Falle liefert die Funktion den Wert True zurck. Erfassen Sie jetzt das Makro, welches die Funktion DateiExist aufruft und den Namen der zu berprfenden Datei bergibt.
Listing 9.11: Vor dem ffnen einer Datei deren Existenz prfen Sub Dateiffnen() Dim b As Boolean Const EDatei = "C:\Eigene Dateien\Mappe1.xls" b = DateiExist(EDatei) If b = True Then Workbooks.Open Edatei Else MsgBox "Die Datei " & EDatei & " ist nicht vorhanden!" End If End Sub

Im Makro aus Listing 9.11 wird der Name der zu ffnenden Datei in einer Konstanten zu Beginn des Makros festgelegt. Danach rufen Sie die Funktion Datei Exist auf und bergeben dieser Funktion den Namen der zu prfenden Datei, den Sie gerade in der Konstante angegeben haben. Das Ergebnis dieser berprfung durch die Funktion wird in der Variablen b abgelegt. Diese kann entweder False fr den Fall, dass die Datei gar nicht existiert, bzw. True sein, sofern die Prfung erfolgreich verlaufen ist. In diesem Fall ffnen Sie die Datei mithilfe der Methode Open.

Arbeitsmappen-Zustand prfen
Manche Fehler treten auf, wenn versucht wird, ber VBA Arbeitsmappen zu ffnen, die bereits in geffnetem Zustand sind. Gerade wenn Sie in einem greren Projekt Dateien immer wieder ffnen und schlieen, kann es durchaus vorkommen, dass eine Arbeitsmappe bereits geffnet ist. In der nchsten Funktion soll berprft werden, ob eine bestimmte Arbeitsmappe bereits geffnet wurde. Wenn ja, dann muss diese nicht noch einmal geffnet, sondern nur aktiviert werden. Die Funktion zur Lsung dieser Aufgabenstellung knnen Sie in Listing 9.12 sehen.

417

Funktionen einsetzen, um Excel zu automatisieren

Listing 9.12: Prfung, ob Datei bereits geffnet ist Function DateiGeffnet(ByVal s As String) As Boolean Dim DatSchonGeffnet As Boolean On Error GoTo fehler DatSchonGeffnet = True Windows(s).Activate Exit Function fehler: DatSchonGeffnet = False End Function

Die Funktion aus Listing 9.12 erwartet als Argument den Namen der Datei, deren Status geprft werden soll. Danach wird versucht, die entsprechende Datei zu aktivieren. Schlgt dies fehl, sorgt die On-Error-Anweisung dafr, dass die Funktion nicht mit einer Fehlermeldung abbricht. In diesem Fall wird direkt zum Fehlerabschnitt fehler gesprungen. Dort wird der Variablen DatSchonGeffnet der Wert False zugewiesen. War die Aktion erfolgreich, wird die Funktion ber die Anweisung Exit Function direkt verlassen. Nachdem Sie schon zu Beginn der Funktion der Variablen DatSchonGeffnet den Wert True zugewiesen haben, knnen Sie direkt aus der Funktion springen. Das aufrufende Makro sieht wie folgt aus:
Listing 9.13: Aktivieren oder ffnen der Arbeitsmappe Sub ffnenOderAktivieren() Dim b As Boolean Const EDatei = "C:\Eigene Dateien\Mappe1.xls" b = DateiGeffnet(EDatei) If b = True Then Else Workbooks.Open Edatei End If End Sub

418

Modulare Funktionen programmieren

Eine mchtige Lschfunktion erstellen


In der letzten Funktion packen wir eine gewaltige Menge an einzelnen Funktionen hinein. ber eine Funktion soll Folgendes mglich sein:

alle Inhalte entfernen alle Formatierungen entfernen alle Kommentare entfernen Formeln durch Festwerte ersetzen Hyperlinks lschen

Erfassen Sie jetzt die Funktion, die Sie in Listing 9.14 sehen knnen:
Listing 9.14: Durch unterschiedliche Lschnummern werden Lschaktionen gestartet Function LschenWas(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

Funktionen einsetzen, um Excel zu automatisieren

End If End With Next zelle Case Else MsgBox "Diese Nr ist nicht vergeben!" End Select End Function

Wird die Funktion LschenWas mit dem Argument 1 aufgerufen, wenden Sie die Methode Clear an, um alle Zellen der Tabelle zu lschen. Im Auflistungsobjekt Cells sind alle Zellen der Tabelle enthalten. Wird die Funktion LschenWas mit dem Argument 2 aufgerufen, wenden Sie die Methode ClearFormats an, um alle Formatierungen in der Tabelle zu entfernen. Dazu zhlen Formatierungen der Schrift, der Hintergrundfarbe der Ausrichtung der Daten und alle mglichen Rahmen und sonstigen Formatierungsmglichkeiten. Wird die Funktion LschenWas mit dem Argument 3 aufgerufen, wenden Sie die Methode ClearComments an, um alle in der Tabelle befindlichen Kommentare zu entfernen. Wird die Funktion LschenWas mit dem Argument 4 aufgerufen, sollen alle Formeln und Verknpfungen in Festwerte umgewandelt werden. In diesem Fall ist es nicht sinnvoll, alle Zellen der Tabelle ber das Auflistungsobjekt Cells abzuarbeiten. Schrnken Sie die Bearbeitung auf die Zellen ein, die in der Tabelle verwendet werden. Dazu setzen Sie die Eigenschaft UsedRange ein, die Sie auf die aktive Tabelle (ActiveSheet) anwenden. Innerhalb dieses verwendeten Bereiches durchlaufen Sie jede Zelle und ersetzen eventuell vorhandene Formeln bzw. Verknpfungen, indem Sie der jeweiligen Zelle den Wert der Eigenschaft Value zuweisen. Wird die Funktion LschenWas mit dem Argument 5 aufgerufen, sollen alle Hyperlinks in der Tabelle entfernt werden. Die Hyperlinktexte sollen aber erhalten bleiben. Auch fr diesen Zweck brauchen Sie nicht alle Zellen der Tabellen einzeln ber das Auflistungsobjekt Cells anzusprechen. Stattdessen ermitteln Sie ber die Anweisung ActiveSheet.UsedRange den verwendeten Bereich der Tabelle und durchlaufen danach in einer Schleife jede Zelle dieses Bereiches. Innerhalb der Schleife prfen Sie mithilfe der Eigenschaft Count, ob die jeweilige Zelle einen Hyperlink enthlt. Wenn ja, dann meldet diese Eigenschaft den Wert 1 zurck. In diesem Fall wenden Sie die Methode Delete an, um den Hyperlink aus der Zelle zu entfernen. Da aber auch nach

420

Modulare Funktionen programmieren

dem Entfernen des Hyperlinks die typische Hyperlinkformatierung (blaue Schriftfarbe und Unterstreichung) erhalten bleibt, mssen Sie diese jetzt entfernen. Weisen Sie hierzu der Eigenschaft UnderLine die Konstante xlUnderlineStyleNone zu, um die Unterstreichung zu entfernen. Der Eigenschaft ColorIndex weisen Sie die Konstante xlAutomatic zu, um die Festlegung der Schriftfarbe Excel zu berlassen. Rufen Sie jetzt beispielsweise die Funktion LschenWas auf und bergeben der Funktion die Lsch-Nr 5, um alle Hyperlinks aus der aktiven Tabelle zu entfernen.
Listing 9.15: ber die Lschnummer die Lschaktion festlegen Sub Lschen() Dim s As String Sheets("Tabelle8").Activate s = InputBox _ ("Geben Sie eine Lsch-Nr zwischen 1 und 5 ein!", _ "Lschaktion durchfhren", 1) If s <> "" Then LschenWas (s) Else End If End Sub

ber eine Eingabemaske legen Sie fest, welche Lschaktion durchgefhrt werden soll. Die Funktion Inputbox verwendet in diesem Beispiel drei Argumente. Im ersten Argument geben Sie an, welcher Text in der Eingabemaske angezeigt werden soll. Im zweiten Argument geben Sie den Fenstertitel der Eingabemaske bekannt. Im dritten Argument haben Sie die Mglichkeit, eine Eingabe bereits schon beim Aufruf der Maske vorzunehmen. In diesem Fall wurde die Lsch-Nr. 1, also das Entfernen aller Daten aus einer Tabelle, eingetragen.

421

Funktionen einsetzen, um Excel zu automatisieren

Abbildung 9.10: In diesem Beispiel werden die Hyperlinks aus der Tabelle entfernt.

9.3

Funktionen dauerhaft verfgbar machen

Bei den bisherigen Beispielen sind die Funktionen lediglich in der Arbeitsmappe verfgbar, in der sie in der Entwicklungsumgebung erfasst wurden. Wenn Sie Funktionen fr alle Arbeitsmappen, ob neue oder alte, anwenden mchten, haben Sie zwei Mglichkeiten:

Speichern in der persnlichen Arbeitsmappe Personl.xls oder Erstellung eines Add-Ins und Aktivierung ber den Add-In-Manager

Speichern der Funktionen in der persnlichen Makroarbeitsmappe


Um die Funktionen fr alle Arbeitsmappen zur Verfgung zu haben, knnen Sie die Funktionen in Ihrer persnlichen Makroarbeitsmappe Personl.xls ablegen, welche sich im Office-Verzeichnis XLSTART befindet. Sollte diese Arbeitsmappe noch nicht existieren, legen Sie eine an, indem Sie wie folgt vorgehen: 1. Whlen Sie in der Tabellenansicht den Menbefehl EXTRAS/MAKRO/AUFZEICHNEN. 2. Whlen Sie im Dialogfeld MAKRO AUFZEICHNEN aus dem Kombinationsfeld den Eintrag PERSNLICHE MAKROARBEITSMAPPE. 3. Klicken Sie auf OK.

422

Funktionen dauerhaft verfgbar machen

Abbildung 9.11: Die persnliche Makroarbeitsmappe anlegen

4. Klicken Sie jetzt beispielsweise auf die Zelle A1. Der Makrorekorder wird die persnliche Arbeitsmappe nun erstellen und diesen Befehl aufzeichnen. Nun haben Sie die Voraussetzung geschaffen, um Ihre Funktionen in die persnliche Arbeitsmappe zu bertragen. 5. Beenden Sie die Makroaufzeichnung, indem Sie aus dem Men EXTRAS den Befehl MAKRO/AUFZEICHNUNG BEENDEN auswhlen. bertragen Sie nun Ihre Funktionen aus der Arbeitsmappe Funktionen.xls in die persnliche 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 Menbefehl BEARBEITEN/ALLES AUSWHLEN. 5. Drcken Sie die Tastenkombination (Strg) + (C), um die Funktionen in die Zwischenablage zu kopieren. 6. Whlen Sie im Projekt-Explorer den Eintrag VBAPROJECT (PERSONL.XLS) aus. 7. Aktivieren Sie in diesem Projekt das MODUL1. 8. Fgen Sie Ihre Funktionen ein, indem Sie den Mauszeiger im Codefenster positionieren und die Tastenkombination (Strg) + (V) drcken. 9. Beenden Sie Excel und besttigen Sie beim Verlassen von Excel die nderungsabfrage mit JA.

423

Funktionen einsetzen, um Excel zu automatisieren

Nun knnen Sie die benutzerdefinierten Tabellenfunktionen ber den FunktionsAssistenten in Ihre Tabellen einfgen.

Speichern der Funktionen in einem Add-In


Die zweite Mglichkeit, um Funktionen allgemein verfgbar zu machen und auch noch an andere Anwender weiterzugeben, ist die Erstellung eines Add-Ins. Ein Add-In knnen Sie direkt aus der Datei Funktionen.xls erstellen und bei Bedarf im Add-In-Manager einbinden und, wenn Sie Ihre Funktionen zeitweise nicht bentigen, wieder deaktivieren. Bevor Sie das Add-In erstellen, sollten Sie die Dokumenteigenschaften der Datei Funktionen.xls pflegen. Diese Informationen sind spter wichtig, um Zusatzinformationen zum Add-In zu hinterlegen. Geben Sie jetzt die Dokumenteigenschaften an, indem Sie die Datei Funktionen.xls ffnen und aus dem Men DATEI den Befehl EIGENSCHAFTEN whlen.

Abbildung 9.12: Die Dokumenteigenschaften erfassen

424

Funktionen dauerhaft verfgbar machen

Geben Sie einige zustzliche Informationen zu dem zuknftigen Add-In an und besttigen Sie Ihre Eingaben mit OK. Befolgen Sie jetzt die nachfolgenden Anweisungen: 1. Whlen Sie aus dem Men DATEI den Befehl SPEICHERN UNTER. 2. Stellen Sie im Kombinationsfeld DATEITYP den Eintrag MICROSOFT EXELADD-IN ein. Nun wird automatisch das Add-In-Verzeichnis von Excel eingestellt. 3. Klicken Sie auf die Schaltflche SPEICHERN. Das Add-In FUNKTIONEN.XLS wurde nun erstellt. Binden Sie das Add-In jetzt ein, indem Sie die nchsten Arbeitsschritte befolgen: 1. Whlen Sie aus dem Men EXTRAS den Befehl ADD-INS.

Abbildung 9.13: Add-Ins einbinden

2. Aktivieren Sie das Add-In NTZLICHE FUNKTIONEN. Diese Information haben Sie vorher bei den Dokumenteigenschaften unter der Rubrik TITEL erfasst. 3. Besttigen Sie Ihre Aktion durch OK.

Erfahren Sie mehr zum Thema Add-In in Kapitel 12 dieses Buches.

425

Funktionen einsetzen, um Excel zu automatisieren

9.4
F

Fragen & Antworten

Wie knnen Sie ber eine benutzerdefinierte Tabellenfunktion den Namen des aktuellen 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.UserName End Function

Die Eigenschaft UserName gibt den Namen des aktuellen Benutzers zurck. Rufen Sie die Funktion in einer beliebigen Zelle der Tabelle wie folgt auf:
=Anwender() F

Wie knnen Sie ber eine benutzerdefinierte Tabellenfunktion die Anzahl der Ziffern einer Zelle zhlen?
A

Diese Aufgabe lsen Sie, indem Sie die Funktion aus Listing 9.17 anwenden:
Listing 9.17: Die Anzahl der Ziffern einer Zelle zhlen Function AnzZahlen (zelle) As Integer Dim i As Integer Application.Volatile For i = 1 To Len(zelle) If Mid(zelle, i, 1) Like "#" Then AnzZahlen = AnzZahlen + 1 End If Next i End Function

Ermitteln Sie zuerst einmal die Gesamtlnge der Zelle ber die Funktion Len. Danach durchlaufen Sie eine Schleife und arbeiten mithilfe der Funktion Mid ein Zeichen nach dem anderen ab. Setzen Sie den Operator Like mit dem Zusatz # ein, um zu ermitteln, ob es sich bei dem Zeichen um einen Zahlenwert handelt. In diesem Fall meldet Ihnen dieser Opera-

426

Quiz

tor einen Wert zwischen 0 und 9 zurck. Addieren Sie dann den Wert 1 in Ihrer Funktion. Rufen Sie die Funktion in einer beliebigen Zelle der Tabelle wie folgt auf:
=AnzZahlen(A1) F

Wie knnen Sie ber eine Funktion prfen, ob ein Add-In bereits im Add-InManager eingebunden ist?
A

Um diese Aufgabe zu lsen, geben Sie folgende Funktion aus Listing 9.18 ein:
Listing 9.18: Ist das Add-In Ntzliche Funktionen bereits eingebunden? Sub AddInPrfung() Dim b As Boolean b = AddInAktiv("Ntzliche Funktionen") If b = True Then MsgBox "Add-In ist aktiv!" Else MsgBox "Das Add-In ist noch nicht aktiviert!" End If End Sub

Bei der Angabe des Add-Ins verwenden Sie den Namen des Add-Ins, den Sie im Dialogfeld ADD-INS vorfinden.

9.5
F F F F

Quiz

Wie muss die Anweisung lauten, damit eine benutzerdefinierte Funktion auch auf nderungen in der Tabelle reagieren kann? Wie muss die benutzerdefinierte Funktion lauten, wenn alle Zellen addiert werden sollen, die mit der Hintergrundfarbe Rot formatiert sind? ber welche Methode knnen Sie den Inhalt einer Zelle komplett lschen? Wie heit die persnliche Makroarbeitsmappe und wo befindet sich diese?

427

Funktionen einsetzen, um Excel zu automatisieren

9.6

bung

Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe Funktionen.xls und schreiben eine modulare Funktion, die vor der Aktivierung einer Tabelle berprft, ob diese in der Arbeitsmappe berhaupt vorhanden ist. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.

428

Excel und das Internet

0 1

Excel und das Internet

Am gestrigen Tag haben Sie gelernt, wie Sie Excel durch zustzliche Tabellenfunktionen bereichern knnen. Dazu haben Sie einige benutzerdefinierte Funktionen programmiert und getestet. Des Weiteren haben Sie modulare Funktionen erstellt 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 in der Arbeitsmappe Internet.xls im Verzeichnis Kap10.

10.1 Arbeiten mit Hyperlinks


Hyperlinks kennen Sie schon aus dem Internet. Damit knnen Sie einzelne Internetseiten ber Sprungmarken miteinander verbinden, um somit schnell von Seite zu Seite zu gelangen. Auch in Excel-Tabellen knnen Sie mit Hyperlinks arbeiten, um beispielsweise einzelne Tabellen sinnvoll miteinander zu verknpfen. Hyperlinks werden standardmig in blauer Schriftfarbe und mit einer einfachen Unterstreichung formatiert. Daran knnen Sie Hyperlinks auch in einer Excel-Tabelle erkennen. Zellen, die einen Hyperlink enthalten, sind Klick-sensibel, d.h. wenn Sie mit der linken Maustaste auf eine solche Zelle klicken, werden Sie zum Ziel des Hyperlinks weitergeleitet. Excel erkennt ber seine AutoKorrektur-Option automatisch schon bei der Eingabe, ob es die Eingabe in einen Hyperlink umwandeln soll. So werden URLs von Internetseiten, E-Mail-Adressen und Netzwerkverbindungen automatisch mit der Hyperlinkfunktion und deren typischen Formatierung ausgestattet. Lernen Sie im Anschluss an diese Einfhrung ein paar typische Aufgaben aus der Praxis kennen.

430

Arbeiten mit Hyperlinks

Hyperlinks aus einer Tabelle entfernen


In der ersten Praxisaufgabe haben Sie eine Tabelle vorliegen, die einige Hyperlinks enthlt. Ihre Aufgabe besteht nun darin, diese Hyperlinks zu entfernen. Die Hyperlinktexte sollen aber erhalten bleiben. Sehen Sie sich zuerst einmal die Abbildung 10.1 an.

Abbildung 10.1: Eine Tabelle mit Hyperlinks

Erfassen Sie jetzt das folgende Makro, um die Hyperlinks aus der Tabelle zu entfernen:
Listing 10.1: Hyperlinks entfernen Sub HyperlinksEntfernen() Dim zelle As Range Dim Bereich As Range Sheets("Tabelle1").Activate Set 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

431

Excel und das Internet

End With Next zelle End Sub

Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Range. Danach geben Sie ber die Anweisung Set bekannt, in welchem Bereich der Tabelle die Entfernung von Hyperlinks durchgefhrt werden soll. Mithilfe der Anweisung ActiveSheet.UsedRange bestimmen Sie, dass alle Zellen im verwendeten Bereich der Tabelle verarbeitet werden sollen. In einer anschlieenden Schleife werden genau diese benutzten Zellen abgearbeitet. Innerhalb der Schleife berprfen Sie jede einzelne Zelle. Enthlt eine Zelle einen Hyperlink, dann knnen Sie dies ber die Anweisung Hyperlinks.Count feststellen. Meldet die Eigenschaft Count einen Wert > 0, dann enthlt die Zelle einen Hyperlink. In diesem Fall lschen Sie den Hyperlink mithilfe der Methode Delete. Da die Formatierung der Zellen aber auch noch nach der Entfernung der Hyperlinks beibehalten wird, mssen Sie die Unterstreichung sowie die blaue Schriftfarbe noch entfernen. Dazu greifen Sie auf das Objekt Font zu. Mithilfe der Eigenschaft Underline, welcher Sie die Konstante xlUnderlineStyleNone zuweisen, entfernen Sie die Unterstreichung. ber die Eigenschaft ColorIndex setzen Sie die Farbe der Schriftart auf den normalen Ausgangszustand zurck, indem Sie dieser Eigenschaft die Konstante xlAutomatic zuweisen.

Abbildung 10.2: Die Hyperlinks wurden aus der Tabelle entfernt.

Hyperlinks aus Zelleninhalten herstellen


Gerade haben Sie gelernt, wie Sie Hyperlinks aus Tabellen entfernen. Aber auch der umgekehrte Vorgang ist von Interesse. Bilden Sie daher in der folgenden Aufgabe aus den Zelleninhalten der Zellen A1:A11 (Abbildung 10.2) Hyperlinks.

432

Arbeiten mit Hyperlinks

Erfassen Sie jetzt das Makro aus Listing 10.2, um aus den Zelleninhalten Hyperlinks herzustellen.
Listing 10.2: Aus Zelleninhalten Hyperlinks herstellen Sub HyperlinksSetzen() Sheets("Tabelle1").Activate Range("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).Select Loop End Sub

Aktivieren Sie im ersten Schritt die gewnschte Tabelle, welche die Daten enthlt, die Sie in Hyperlinks verwandeln mchten. Danach setzen Sie den Textcursor auf die Startzelle und setzen eine Schleife auf, die solange durchlaufen wird, bis die erste leere Zelle in Spalte A erreicht wird. Setzen Sie den Textcursor am Ende der Schleife immer um eine Zelle nach unten, indem Sie die Eigenschaft Offset einsetzen und dabei als erstes Argument den Wert 1 (Zeilenverschiebung) einsetzen. Innerhalb der Schleife knnen Sie zur Sicherheit berprfen, ob es sich dabei auch wirklich um eine Internet-kompatible Zelle handelt. Wenn ja, dann ergibt die Prfung der ersten sieben Zeichen der Zelle das Wort http://. In diesem Fall wenden Sie die Methode Add an, um einen Hyperlink einzufgen. 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 Argument SubAddress handelt es sich um ein optionales Argument, das die Unteradresse des Hyperlinks festlegt. In diesem Argument knnen Sie beispielsweise

433

Excel und das Internet

zustzlich eine bestimmte Zellenadresse angeben. In diesem Beispiel wird dieses Argument aber nicht bentigt. ber das optionale Argument ScreenTip knnen 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 fr den Hyperlink angezeigt werden soll.

Abbildung 10.3: Hyperlinks aus Zelleninhalten bilden

Inhaltsverzeichnis erstellen
In der nchsten Aufgabe geht es darum, in einer Arbeitsmappe mit vielen Tabellenblttern ein Inhaltsverzeichnis auf einer separaten neuen Tabelle zu erstellen. Diese Tabelle enthlt alle Namen der Tabellen, die in dieser Arbeitsmappe vorhanden sind. Anschlieend sollen diese Tabellennamen in Hyperlinks gewandelt werden, damit diese ber einen Mausklick blitzschnell aktiviert werden knnen. 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

434

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).Select Next i Range("B3").Activate Do Until ActiveCell.Value = "" ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, _ Address:="", SubAddress:= ActiveCell.Value & "!A1", _ TextToDisplay:=ActiveCell.Value ActiveCell.Offset(1, 0).Select Loop End Sub

Fgen Sie im ersten Schritt mithilfe der Methode Add eine neue, noch leere Tabelle zu Beginn der Arbeitsmappe ein. Danach erfassen Sie in Zelle A1 den Titel der Tabelle (INHALTSVERZEICHNIS) und geben der Tabelle ber die Eigenschaft Name den Namen INHALT. Durchlaufen Sie anschlieend alle Tabellen, mit Ausnahme der ersten Tabelle der Arbeitsmappe, und tragen die Namen der einzelnen Tabellen in Ihre Tabelle INHALT ein. Danach setzen Sie eine erneute Schleife auf, die die einzelnen Tabellennamen in Hyperlinks umwandelt. Dabei setzen Sie die Methode Add ein und knnen in diesem Fall auch mal die Argumentnamen mit angeben. Auch diese Syntax ist in Excel erlaubt. Belassen Sie hierbei das Argument Address leer und setzen im Argument SubAddress sowohl den Namen der Tabelle, den Sie aus der aktuellen Zelle beziehen, als auch die Zellenadresse ein, an die gesprungen werden soll. Verbinden Sie diese beiden Informationen durch die Textfolge & "!.

Abbildung 10.4: Alle Tabellen knnen ber Hyperlinks schnell angesprungen werden.

435

Excel und das Internet

10.2 E-Mails verschicken


Standardmig knnen Sie die aktive Arbeitsmappe versenden, indem Sie aus dem Men DATEI den Befehl SENDEN AN/E-MAIL-EMPFNGER auswhlen. Excel zeigt danach das E-Mail-Fenster an. Standardmig wird der Name der aktiven Arbeitsmappe als Titel der E-Mail eingetragen. Mit einem Klick auf die Schaltflche AN haben Sie direkten Zugriff auf Ihre in Outlook gespeicherten E-Mail-Adressen, die Sie somit leicht bernehmen knnen. Sie mssen jetzt nur noch einen begleitenden Text ins E-Mail-Fenster eintippen und die E-Mail mit einem Klick auf die Schaltflche SENDEN abschicken. Selbstverstndlich haben Sie noch weitere Mglichkeiten, das Aussehen von E-Mails zu ndern. So knnen Sie beispielsweise schon einen vorgefertigten Text sowie die Empfnger-E-Mail-Adresse vorab eintragen. Um diese Funktion in Excel zu integrieren, mssen Sie ein VBA-Makro schreiben. Im nchsten Beispiel soll eine andere Arbeitsmappe, also nicht die aktive, mit einem bestimmten Titel und einem vorher definierten Text an einen bestimmten E-Mail-Empfnger versendet werden. Diese Arbeitsmappe wird dann als E-MailAnhang per VBA automatisch in die E-Mail eingebunden. Um diese Aufgabe auszufhren, mssen Sie zuerst einmal eine zustzliche Bibliothek in Ihre Entwicklungsumgebung einbinden. Da Sie die E-Mail ber Outlook versenden mchten, brauchen Sie die VBA-Outlook-Bibliothek. Um diese Bibliothek einzubinden, verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Whlen Sie aus dem Men EXTRAS den Befehl VERWEISE. 3. Aktivieren Sie im Listenfeld VERFGBARE VERWEISE die Bibliothek MICROSOFT OUTLOOK 10.0 OBJECT LIBRARY fr Outlook 2002 und MICROSOFT OUTLOOK 11.0 OBJECT LIBRARY fr Outlook 2003. 4. Besttigen Sie Ihre Aktion mit OK. Erfassen Sie jetzt den Quellcode, um die Datei Projekt.xls aus dem Verzeichnis C:\Eigene Dateien an einen bestimmten Empfnger held-office@t-online.de zu versenden.

436

E-Mails verschicken

Abbildung 10.5: Die Outlook-Bibliothek einbinden Listing 10.4: Eine E-Mail zusammenstellen Sub MailVersenden() Dim outl As Object Dim 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 Gren" & Chr(13) & _ " Walter Kuhn " Mail.To = "Held-office@T-online.de" Mail.CC = "Machero@aol.com" Mail.Attachments.Add "C:\Eigene Dateien\Projekt.xls" Mail.Display Set outl = Nothing

437

Excel und das Internet

Set Mail = Nothing End Sub

Die Methode CreateObject setzen Sie ein, um ein Outlook-Objekt anzulegen. Damit knnen Sie auf alle VBA-Objekte, Methoden und Eigenschaften von Outlook zugreifen. Mithilfe der Methode CreateItem erstellen Sie ein neues Outlook-Objekt. Dabei geben Sie ber die Konstante OlMailItem bekannt, dass es sich hierbei um ein E-Mail-Objekt handeln soll. ber die Eigenschaft Subject legen Sie den Titel der E-Mail fest. Dieser Titel wird in der Zeile BETREFF angezeigt. Mithilfe der Eigenschaft Body geben Sie den Text an, der als Nachrichtentext in der E-Mail eingefgt werden soll. Die Eigenschaft To bestimmt, an welche Empfnger die E-Mail versendet werden soll. Sie haben dabei auch die Mglichkeit, mehrere E-Mail-Empfnger hintereinander anzugeben. Wenn Sie mchten, knnen Sie die Eigenschaft CC einsetzen, wenn Ihre E-Mail auch an andere Empfnger als Kopie gesendet werden soll. Ergnzend zu den beiden letztgenannten Eigenschaften knnen Sie die Eigenschaft BCC einsetzen. Diese Eigenschaft kommt dann zum Tragen, wenn Sie einem Anwender eine E-Mail als Kopie zustellen mchten, ohne dass der eigentliche Empfnger der E-Mail davon etwas wei. ber das Objekt Attachments legen Sie den Anhang der E-Mail fest. Dabei wird die Arbeitsmappe Projekt.xls ber die Methode Add eingefgt. Sie sollten darauf achten, 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, knnen Sie die E-Mail natrlich auch ber einen VBA-Befehl direkt abschicken. Ergnzen Sie Ihr Makro mit dem Befehl Mail.Send.

438

Kontakte austauschen

Abbildung 10.6: Mit einem Klick wird die E-Mail versendet.

10.3 Kontakte austauschen


Im Folgenden liegt Ihnen eine Tabelle mit Adressdaten in Excel vor. Ihre Aufgabe besteht nun darin, diese Adressen in den Kontaktordner von Outlook zu transferieren. Sehen Sie sich vorerst einmal die Ausgangssituation in Abbildung 10.7 an.

Abbildung 10.7: Die Adressdaten aus Excel sollen in den Kontaktordner von Outlook.

Transferieren Sie nun diese Excel-Tabelle mithilfe des Makros aus Listing 10.5 in den Kontaktordner von Outlook.
Listing 10.5: Kontaktdaten aus Excel nach Outlook bertragen Sub KontakteAdressenNachOutlook () Dim appOutLook As Outlook.Application Dim conoutlook As Outlook.ContactItem Sheets("Kontaktaustausch").Activate

439

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 = Nothing Set appOutLook = Nothing End Sub

Wenden Sie zu Beginn des Makros die Methode CreateObject an, um ein Outlook-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 Sie ein Kontakt-Objekt bentigen, bergeben Sie dieser Methode die Konstante olContactItem. Anschlieend fllen Sie den noch leeren Kontakt mit den Daten aus Ihrer ExcelTabelle. Unter anderem verwenden Sie dabei folgende Eigenschaften:

LastName: Mit dieser Eigenschaft knnen Sie den Nachnamen, den Sie aus Ihrer Tabelle aus Spalte A holen, fllen. FirstName: Mit dieser Eigenschaft knnen Sie den Vornamen, den Sie aus Ihrer Tabelle aus Spalte B holen, fllen.

440

Kontakte austauschen

BusinessAddressStreet: Mit dieser Eigenschaft bergeben Sie den Inhalt der

Spalte C (Strae).

BusinessAddressCity: Mit dieser Eigenschaft bergeben Sie den Inhalt der

Spalte E (Ort).

BusinessAddressPostalCode: Mit dieser Eigenschaft bergeben Sie den Inhalt

der Spalte D (PLZ).

BusinessAddressCountry: Mit dieser Eigenschaft bergeben Sie den Inhalt der

Spalte F (Bundesland).

BusinessAddressState: Mit dieser Eigenschaft bergeben Sie den Inhalt der

Spalte G (Land).

Email1Address: Mit dieser Eigenschaft bergeben Sie den Inhalt der Spalte H

(E-Mail-Adresse). Mithilfe der Methode Save wird der Kontakt endgltig im Kontaktordner angelegt.

Abbildung 10.8: Die Kontakte wurden erfolgreich bertragen.

Auch der umgekehrte Vorgang, also Kontaktdaten aus Outlook in eine Tabelle zu transferieren, ist von Interesse. Im folgenden Beispiel wird der Inhalt des Kontaktordners in einer neuen Tabelle ausgegeben.

441

Excel und das Internet

Erfassen Sie zu diesem Zweck das folgende Makro:


Listing 10.6: Kontaktdaten aus Outlook ziehen Sub Dim Dim Dim Dim KontakteVonOutlook() Verz As Object i As Integer olMAPI As New Outlook.Application 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 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 End With ActiveCell.Offset(1, 0).Select Next i Columns("A:H").AutoFit Set objItem = Nothing Set olMAPI = Nothing End Sub

= .LastName = _ = _ = _ = _ = _ = .Email1Address

442

Fragen & Antworten

Fgen Sie im ersten Schritt ber die Anweisung Sheets.Add eine neue, noch leere Tabelle in Ihre Arbeitsmappe ein. Danach geben Sie dieser Tabelle ber die Eigenschaft Name den Namen KONTAKTDATEN und setzen den Mauszeiger auf die Startzelle. ber die Anweisung olMAPI.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts) gewinnen Sie Zugriff auf den Kontaktordner von Outlook. Setzen Sie nun eine Schleife auf, die alle angelegten Kontakte abarbeitet. bertragen Sie im Anschluss daran die einzelnen Informationen aus dem Kontakt in die dafr vorgesehenen Excel-Zellen. Setzen Sie am Ende des Makros die Methode AutoFit ein, um die Spaltenbreiten automatisch einzustellen, und heben Sie danach die Objektverweise ber die Anweisung Set Objektverweis = Nothing auf, um den reservierten Speicher wieder freizugeben.

Abbildung 10.9: Die aus Outlook importierten Kontaktdaten

10.4 Fragen & Antworten


F

Wie knnen Sie E-Mail-Adressen mit Hyperlinks ausstatten?


A

Wenn Sie in einer Tabelle E-Mail-Adressen vorliegen haben, dann knnen Sie diese mit dem Makro aus Listing 10.7 in Hyperlinks setzen. Sehen Sie sich aber vorher Abbildung 10.10 an.
Listing 10.7: E-Mail-Adressen in Hyperlinks verwandeln Sub EMailLinksUmsetzen() Sheets("MailAdressen").Activate Range("A1").Select Do Until ActiveCell.Value = "" If InStr(ActiveCell.Value, "@") > 0 Then

443

Excel und das Internet

ActiveCell.Hyperlinks.Add ActiveCell, _ "MailTo: " & ActiveCell.Value End If ActiveCell.Offset(1, 0).Select Loop End Sub

Abbildung 10.10: Diese E-MailAdressen sollen in Hyperlinks gewandelt werden.

In einer Schleife durchlaufen Sie alle Zellen der Spalte A. Mit der Funktion InStr knnen Sie prfen, ob die Zelle eine E-Mail-Adresse enthlt. Ist dies der Fall, dann kommt das Zeichen @ automatisch darin vor. In diesem Fall fgen Sie ber die Methode Add einen Hyperlink ein. Als Zusatz mssen Sie noch den Text MAILTO ergnzen. Damit wei Excel, dass es sich dabei um eine E-Mail-Adresse handelt. Mit einem Klick auf diese Zelle wird dann das E-Mail-Fenster mit voreingestellter E-Mail-Adresse aufgerufen.

Abbildung 10.11: Die Hyperlinks wurden erfolgreich gesetzt.

444

Fragen & Antworten

Wie knnen Sie berprfen, 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 ein Eintrag vorgenommen:
Listing 10.8: Alle Hyperlinks werden dokumentiert Sub PrfenZelleAufHyperlink() Sheets("PrfungHyper").Activate Range("A1").Select Do Until ActiveCell.Value = "" If ActiveCell.Hyperlinks.Count > 0 Then ActiveCell.Offset(0, 1).Value = _ "Nebenzelle enthlt Hyperlink!" Else End If ActiveCell.Offset(1, 0).Select Loop End Sub

Indem Sie die Eigenschaft Count abfragen, knnen Sie ermitteln, ob eine Zelle einen Hyperlink enthlt. In diesem Fall meldet diese Eigenschaft einen Wert > 0.

Abbildung 10.12: Aufspren von Hyperlinks

445

Excel und das Internet

Wie knnen Sie alle Hyperlinks einer Tabelle mit einer anderen Schriftfarbe ausstatten?
A

Erfassen Sie zu diesem Zweck das folgende Makro aus Listing 10.9. In diesem Listing werden alle Hyperlinks einer Tabelle mit der Schriftfarbe Rot formatiert:
Listing 10.9: Hyperlinks anders formatieren Sub HyperlinksFrben() Dim Hyper As Hyperlink Sheets("PrfungHyper").Activate For Each Hyper In ActiveSheet.Hyperlinks Hyper.Range.Font.ColorIndex = 3 Next Hyper End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Hyperlink. Danach durchlaufen Sie alle Hyperlinkzellen der aktiven Tabelle und frben diese ber das Font-Objekt und die Eigenschaft ColorIndex ein.

10.5 Quiz
F F F

ber welches Argument der Methode Add knnen Sie bestimmen, welche QuickInfo angezeigt wird, wenn Sie mit der Maus ber eine Hyperlinkzelle streichen? Mit welcher Anweisung knnen Sie ein leeres Outlook-Kontaktobjekt anlegen? 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 und wechseln auf die Tabelle BUNG. Schreiben Sie ein Makro, das alle Zellenadressen der dort befindlichen Hyperlinks auf einer separaten Tabelle dokumentiert. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.

446

Excel und Datenzugriffe auf Access und Word

1 1

Excel und Datenzugriffe auf Access und Word

Am gestrigen Tag haben Sie gelernt, wie Sie Hyperlinks in Excel setzen, formatieren, dokumentieren und entfernen knnen. Auerdem haben Sie ber Excel-VBA E-Mails mit Dateianhngen verschickt und Kontaktdaten mit Outlook ausgetauscht. Die Themen heute:

Die Voraussetzung fr den Datenaustausch zw. Excel und Access Excel-Daten in eine Access-Datenbank transferieren Access-Daten in Excel-Tabellen berfhren Access-Tabellen manipulieren Zusammenarbeit zwischen Excel und Word vorbereiten Eine Word-Sitzung starten und bernehmen Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfgen Ganze Excel-Tabellen in ein Word-Dokument einfgen Word-Dokumente in einer Excel-Tabelle auflisten Alle Beispiele dieses Tages finden Sie auf der mitgelieferten CD-ROM in den Arbeitsmappen Access.xls und Word.xls sowie in der Datenbankdatei Buchungen.mdb im Verzeichnis Kap11.

11.1 Die Voraussetzung fr den Datenaustausch


Die Zusammenarbeit zwischen Excel und Access bietet interessante Mglichkeiten in der Praxis. Das Datenbankprogramm Access bietet gerade in der Verwaltung von Massendaten sehr gute Mglichkeiten. So knnen Sie die Daten in einer Access-Datenbank speichern und ber Excel darauf zugreifen. Diese AccessDatenbank knnen Sie dann beispielsweise auf einem allgemein zugnglichen Netzlaufwerk zentral ablegen, auf die die einzelnen Excel-Anwender zugreifen knnen. Fr den Datenzugriff stehen zwei verschiedene Methoden zur Verfgung. Diesen Zugriff knnen Sie entweder mit der lteren Zugriffsmethode DAO (Data Access Object) oder mit der neuen Methode ADO (ActiveX Data Object) bewerkstelligen.

448

Die Voraussetzung fr den Datenaustausch

Aus Aktualittsgrnden werden die folgenden Beispiele mithilfe von ADO programmiert. Bevor Sie mit der Programmierung beginnen, mssen Sie die Voraussetzung dafr schaffen, indem Sie die ADO-Bibliothek in Ihre Excel-Entwicklungsumgebung einbinden. Somit bekommen Sie Zugriff auf alle notwendigen Objekte, Methoden und Eigenschaften, die fr einen reibungslosen Datenaustausch zwischen Excel und Access verantwortlich sind. Ebenso sollten Sie die Access-VBA-Bibliothek einbinden. Damit stehen Ihnen alle Objekte, Methoden und Eigenschaften fr Access-Datenbanken zur Verfgung. Diese knnen dann auch ber die Taste (F1) in der Online-Hilfe nachgeblttert werden. Um diese Bibliotheken einzubinden, verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Whlen Sie aus dem Men EXTRAS den Befehl VERWEISE.

Abbildung 11.1: Die ADO-Bibliothek einbinden

3. Im Listenfeld VERFGBARE VERWEISE aktivieren Sie die Bibliothek MICROSOFT ACTIVEX DATA OBJECTS 2.5 LIBRARY. 4. Im Listenfeld VERFGBARE VERWEISE aktivieren Sie wahlweise, je nach eingesetzter Version, die Bibliothek MICROSOFT ACCESS 8.0 OBJECT LIBRARY (fr Access 97), Bibliothek MICROSOFT ACCESS 9.0 OBJECT LIBRARY (fr Access

449

Excel und Datenzugriffe auf Access und Word

2000), Bibliothek MICROSOFT ACCESS 10.0 OBJECT LIBRARY (fr Access 2002) bzw. MICROSOFT ACCESS 11.0 OBJECT LIBRARY (fr Access 2003). 5. Besttigen Sie Ihre Einstellung mit OK. Sie haben nun die Mglichkeit, vorab die zur Verfgung stehenden Objekte, Methoden und Eigenschaften in Access-VBA einzusehen. Drcken Sie dazu in der Entwicklungsumgebung die Taste (F2) und stellen Sie im ersten Dropdown den Befehl ACCESS ein.

Abbildung 11.2: Alle Objekte, Methoden und Eigenschaften von Access-VBA

450

Excel-Daten in eine Access-Datenbank berfhren

11.2 Excel-Daten in eine Access-Datenbank berfhren


Im folgenden Praxisbeispiel soll eine Excel-Tabelle in eine noch leere AccessDatenbank transferiert werden. Dabei mssen Sie die Datenbank zuerst noch anlegen. Gehen Sie dabei wie folgt vor: 1. Starten Sie Microsoft Access. 2. Legen Sie eine neue Datenbank an und geben dieser Datenbank den Namen BUCHUNGEN. 3. Erstellen Sie jetzt eine neue Tabelle, indem Sie aus dem Men EINFGEN den Befehl TABELLE auswhlen. 4. Im Dialog NEUE TABELLE markieren Sie im Listenfeld den Befehl ENTWURFSANSICHT. 5. Besttigen Sie mit OK. 6. Legen Sie jetzt den Aufbau der Tabelle fest, so wie Sie ihn in Abbildung 11.3 sehen.

Abbildung 11.3: Der Aufbau der Tabelle

451

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:

Abbildung 11.4: Die Veranstaltungsdaten in Excel

bertragen Sie jetzt diese Veranstaltungsdaten aus der Excel-Tabelle in die Access-Datenbank. Setzen Sie zu diesem Zweck das Makro aus Listing 11.1 ein:
Listing 11.1: Excel-Daten nach Access transferieren Sub DatenbernahmeNachAccess() Dim ADOC As New ADODB.Connection Dim 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!Strae = ActiveCell.Offset(0, 5).Value DBS!PLZ = ActiveCell.Offset(0, 6).Value DBS!Ort = ActiveCell.Offset(0, 7).Value

452

Excel-Daten in eine Access-Datenbank berfhren

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 Sub Fehler: MsgBox "Es trat ein Fehler auf!" DBS.Close ADOC.Close Set ADOC = Nothing Set DBS = Nothing End Sub

Definieren Sie zuerst eine Objektvariable vom Typ Connection, um spter die Verbindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS bentigen Sie ein RekordSet-Objekt, welches nachher alle Datenstze der Datenquelle aufnehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, bentigen Sie zuerst einmal eine Verbindung zu Ihrem Provider, die Sie mit der Methode Open herstellen. Dieser Provider stellt alle Funktionen zur Verfgung, die notwendig sind, um auf die Access-Datenbank zuzugreifen. ffnen Sie die Access-Datenbank mit Hilfe des Objektes Connection. Zum ffnen einer Access-Datenbank brauchen Sie die Jet-Datenbank-Engine. Geben Sie daher mit der Eigenschaft Provider die Engine MICROSOFT JET 4.0 OLE DB-Provider an. ffnen Sie danach die Datenbank Buchungen.mdb. Definieren Sie darauf ein RecordSet-Objekt, das spter den gesuchten Datensatz enthalten soll. ffnen Sie jetzt ber die Methode Open die Tabelle VERANSTALTUNG. Diese Methode hat folgende Syntax:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

453

Excel und Datenzugriffe auf Access und Word

Im Argument Source geben Sie den Namen der Tabelle an, die Sie ffnen mchten. Im Argument ActiveConnection verweisen Sie auf das Connection-Objekt ADOC, welches Sie vorher angegeben haben. ber das Argument CursorType bestimmen Sie die Art des Cursors. Unter anderem wird dadurch der Zugriff auf Ihre Daten festgelegt. Dabei stehen Ihnen folgende Konstanten zur Verfgung:

adOpenForwardOnly: (Voreinstellung) ffnet einen Vorwrtscursor. Mit Hilfe dieses Cursors knnen Sie nur nach vorne blttern. adOpenKeyset: ffnet einen Cursor vom Typ Schlsselgruppen. Dieser Cursor

ist vergleichbar mit dem dynamischen Cursor. Jedoch werden bei diesem Cursor nderungen in der Tabelle, die von anderen Anwendern durchgefhrt werden, nicht angezeigt.

AdOpenDynamic: ffnet einen dynamischen Cursor. Damit haben Sie die Mg-

lichkeit, Tabelleneintrge anzuzeigen, zu ndern und zu lschen. Alle nderungen werden regelmig aktualisiert und angezeigt.

adOpenStatic: ffnet einen statischen Cursor. Bei diesem Cursor knnen die

Daten nur angezeigt, jedoch nicht gendert werden. Die Datenansicht ist als Momentaufnahme zu verstehen, der zum Zeitpunkt des ffnens der Tabelle vorgelegen hat. Mit Hilfe des Arguments LockType bestimmen Sie, welches Sperrverfahren der Provider beim ffnen der Tabelle einsetzen soll. Dabei stehen Ihnen folgende Konstanten zur Verfgung:

adLockReadOnly: Bei dieser Standardeinstellung knnen Sie die Daten in der

Tabelle nicht ndern.

adLockPessimistic: Bei dieser Einstellung wird der Datensatz vollstndig gesperrt. Dabei wird das erfolgreiche Bearbeiten der Datenstze sichergestellt, indem der Provider Datenstze in der Datenquelle sofort beim Bearbeiten sperrt. adLockOptimistic: Diese Einstellung sorgt dafr, dass die Tabelle teilweise gesperrt wird, d.h. ein Datensatz wird nur sperrt, wenn Sie die Update-Methode aufrufen. adLockBatchOptimistic: Diese Einstellung lsst eine teilweise Stapelaktualisie-

rung zu.

454

Access-Daten in Excel-Tabellen berfhren

Im letzten Argument Options knnen Sie festlegen, wie der Provider die Daten auswerten soll. Dieses Argument wird aber fr unser Beispiel nicht bentigt. Aktivieren Sie danach die Excel-Tabelle, die die zu bertragenden Daten enthlt und setzen den Mauszeiger auf die Startzelle. In einer anschlieenden Schleife werden alle Datenstze der Tabelle verarbeitet. Innerhalb der Schleife setzen Sie die Methode AddNew ein, um zunchst einen leeren Datenbanksatz anzulegen. Diesen fllen Sie im Anschluss mit den Inhalten Ihrer Excel-Tabelle. Vergessen Sie nicht, dieses Befllen des Datenbanksatzes mithilfe der Methode Update zu sichern. Am Ende des Makros schlieen Sie die Datenbank ber die Methode Close und beenden ebenfalls mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.

Abbildung 11.5: Die Daten wurden erfolgreich nach Access bertragen.

11.3 Access-Daten in Excel-Tabellen berfhren


Im nchsten Beispiel wird genau der gegenstzliche Vorgang durchgefhrt. Aus einer Access-Datenbank BUCHUNGEN.MDB sollen Daten nach Excel bertragen werden. Dabei wird der Transfer auf zwei verschiedene Arten durchgefhrt:

Alle Datenstze sollen transferiert werden. Nur ganz bestimmte Datenstze sollen transferiert werden.

Alle Datenstze nach Excel transferieren


Um alle Datenstze aus der Tabelle VERANSTALTUNG der Datenbank Buchungen.mdb nach Excel zu transferieren, setzen Sie das notwendige Makro aus Listing 11.2 ein:

455

Excel und Datenzugriffe auf Access und Word

Listing 11.2: Daten aus einer Access-Tabelle transferieren Sub Dim Dim Dim DatenbertragenNachExcel() ADOC As New ADODB.Connection DBS As New ADODB.Recordset cmd As ADODB.Command

On Error GoTo Fehlerbehandlung ADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data _ Source=C:\Eigene Dateien\Buchungen.mdb;" DBS.Open "Veranstaltung", ADOC, adOpenKeyset, _ adLockOptimistic Set cmd = New ADODB.Command cmd.CommandText = "SELECT * from Veranstaltung" cmd.ActiveConnection = ADOC Set DBS = cmd.Execute Sheets("Import").Activate Range("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!Strae 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).Select Loop Columns("A:J").AutoFit

456

Access-Daten in Excel-Tabellen berfhren

DBS.Close ADOC.Close Set DBS = Nothing Set ADOC = Nothing Set DBS = Nothing Set cmd = Nothing Exit Sub Fehlerbehandlung: MsgBox "Es ist ein Fehler aufgetreten!" _ & Chr(13) & Err.Description End Sub

Definieren Sie zuerst eine Objektvariable vom Typ Connection, um spter die Verbindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS bentigen Sie ein RekordSet-Objekt, welches nachher alle Datenstze der Datenquelle aufnehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, bentigen Sie zuerst eine Verbindung zu Ihrem Provider, die Sie mit der Methode Open herstellen. Dieser Provider stellt alle Funktionen zur Verfgung, die notwendig sind, um auf die Access-Datenbank zuzugreifen. Basteln Sie sich nun eine kleine SQL-Anweisung mithilfe des Schlsselwortes SELECT, welches Sie auf die Access-Tabelle Veranstaltung ansetzen. Der Stern (*) nach dem SELECT bedeutet, dass alle Datenstze genommen werden sollen. ber die Methode Execute fhren Sie diese SQL-Abfrage aus. Die ermittelten Datenstze stehen nun bereit. Aktivieren Sie das Zeilentabellenblatt in Excel und setzen den Mauszeiger auf die Startzelle. Arbeiten Sie in einer anschlieenden Schleife alle Datenstze der Datenbanktabelle ab. Das Ende der Verarbeitung wird ber die Anweisung EOF (End of File) angezeigt. Innerhalb der Schleife setzen Sie die Methode MoveNext ein, um jeweils zum nchsten Datensatz zu gelangen. Im RekordSet-Objekt DBS steht der komplette Datensatz. Sie haben daher die Mglichkeit, die einzelnen Felder in Ihre Excel-Tabelle zu bertragen. Lassen Sie die Spaltenbreite der Excel-Tabelle automatisch richtig anpassen, indem Sie die Methode AutoFit einsetzen und diese Methode auf die Spalten A-J anwenden. Am Ende des Makros schlieen Sie die Datenbank ber die Methode Close und beenden ebenfalls mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.

457

Excel und Datenzugriffe auf Access und Word

Abbildung 11.6: Die Daten kamen korrekt an.

Nur bestimmte Datenstze nach Excel transferieren


Im nchsten Beispiel werden Sie nur ganz bestimmte Stze nach Excel transferieren, d.h. Sie werden eine Datenbankabfrage durchfhren und nur Stze nach Excel bertragen, die bestimmten Kriterium entsprechen. So werden Sie jetzt alle Datenstze nach Excel importieren, bei denen die Teilnahmegebhr noch nicht bezahlt wurde. Das Makro fr diese Aufgabe lautet:
Listing 11.3: Nur bestimmte Datenstze aus Access nach Excel bernehmen Sub Dim Dim Dim DatenstzeSuchenUndbertragen() ADOC As ADODB.Connection DBS As ADODB.Recordset 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

458

Access-Daten in Excel-Tabellen berfhren

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!Strae 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 = Nothing End Sub

Stellen Sie wie vorher die Verbindung zum Provider her und ffnen Ihre Datenbank sowie die Access-Tabelle. In der Variablen s basteln Sie sich Ihr Suchkriterium zusammen, nach dem die Access-Tabelle durchsucht werden soll. Setzen Sie jetzt die Methode Find ein. Diese Methode sucht in der Tabelle nach dem Datensatz, der den angegebenen Kriterien entspricht. Ist das Kriterium erfllt, wird der gefundene Datensatz zum aktuellen Datensatz der Tabelle. Andernfalls wird der Zeiger auf das Ende des Tabelle festgelegt. Die Methode Find hat folgende Syntax.
Find (criteria, SkipRows, searchDirection, start)

459

Excel und Datenzugriffe auf Access und Word

Unter dem Argument criteria mssen Sie angeben, was Sie konkret in der Tabelle suchen mchten. Diese Information haben Sie bereits vorher in der Variablen s gespeichert. Dabei wurde der verwendete Spaltenname, der Vergleichsoperator sowie der Wert in der Variablen s zusammengebastelt. Beim Argument SkipRows knnen Sie den Abstand vom aktuelle Datensatz oder vom Argument start angeben. Das Argument SearchDirection gibt an, wie in der Tabelle gesucht werden soll. Dazu stehen Ihnen folgende Varianten zur Verfgung:

adSearchForward: fhrt die Suche vorwrts durch. Die Suche hrt am Ende der Tabelle auf, sofern kein entsprechender Datensatz gefunden wurde. adSearchBackward: fhrt die Suche rckwrts durch. Die Suche hrt am

Anfang der Tabelle auf, sofern kein entsprechender Datensatz gefunden wurde. Mit Hilfe des Arguments start knnen Sie einen numerischen Wert angeben, der angibt, bei welchem Datensatz die Suche in der Tabelle beginnen soll. In der ersten Verzweigung fragen Sie direkt nach, ob der gesuchte Satz gefunden wurde. Wenn nicht, dann wird die Bedingung EOF (End of file) erreicht. Wurde der gesuchte Datensatz gefunden, dann stehen alle Informationen hierber in der Objektvariablen DBS. bertragen Sie diese Informationen dann in Ihre ExcelTabelle. Um zum nchsten Datensatz zu gelangen, setzen Sie erneut die Methode Find ein. Haben Sie alle Datenstze erfolgreich in die Excel-Tabelle bertragen, dann schlieen Sie die Datenbank ber die Methode Close und beenden ebenfalls mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
Abbildung 11.7: Alle Teilnehmer von Veranstaltungen, die noch nicht bezahlt haben

460

Access-Tabellen manipulieren

11.4 Access-Tabellen manipulieren


Im nchsten Beispiel greifen Sie von Excel aus auf eine Access-Tabelle zu und passen die Preise an. Dabei sollen die Preise fr die Veranstaltungen um 10% erhht werden.

Abbildung 11.8: Originalzustand vor der Preiserhhung

Erfassen Sie nun das Makro, welches die Preise der Veranstaltungen um 10% erhht.
Listing 11.4: Die Preise wurden um 10% erhht Sub Dim Dim Dim DatenManipulieren() ADOC As ADODB.Connection DBS As ADODB.Recordset Erhhung As Single Erhhung = 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 * Erhhung DBS.Update DBS.MoveNext

461

Excel und Datenzugriffe auf Access und Word

Loop .Close End With ADOC.Close Set DBS = Nothing Set ADOC = Nothing End Sub

Da die Methoden zum ffnen einer Tabelle bereits beschrieben wurden, gehen wir gleich mitten in die Schleife. Die Preiserhhung fhren Sie durch, indem Sie das Feld KOSTEN mit dem Faktor 1,1 multiplizieren. Gleich danach wenden Sie die Methode Update an, um diese nderung wirksam werden zu lassen. Mit Hilfe der Methode MoveNext gehen Sie zum nchsten Datensatz. Diese Vorgehensweise fhren Sie durch bis Sie am letzten Satz der Tabelle angelangt sind. Dann tritt die Schleifenbedingung EOF auf und die Schleife wird verlassen. Vergessen Sie dann nicht, die Tabelle ber die Methode Close zu schlieen und die Objektverweise wieder aufzuheben.

Abbildung 11.9: Die Preise wurden erhht.

11.5 Datenstze lschen


Im letzten Beispiel sollen in einer Access-Tabelle alle Datenstze gelscht werden, bei denen der Veranstaltungsort STUTTGART ist. Diese Manipulation soll von Excel heraus durchgefhrt werden. Das Makro zur Lsung dieser Aufgabenstellung lautet:
Listing 11.5: Entfernen von bestimmten Datenstzen Sub DatenstzeLschen() Dim ADOC As New ADODB.Connection Dim DBS As ADODB.Recordset

462

Datenstze lschen

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 = Nothing End Sub

ffnen Sie die Access-Tabelle VERANSTALTUNGEN und geben ber die SQLAnweisung bekannt, welche Datenstze Sie beabsichtigen zu entfernen. Danach durchlaufen Sie in einer Schleife alle gefundenen Datenstze und lschen diese mithilfe der Methode Delete. Nach dem Lschen von Datenstzen aus einer Tabelle mssen Sie darauf achten, dass Sie mit Hilfe der Methode MoveNext jeweils zum nchsten Datensatz springen.
Abbildung 11.10: Alle Veranstaltungen in Stuttgart wurden aus der Datenbank entfernt.

463

Excel und Datenzugriffe auf Access und Word

11.6 Zusammenarbeit zwischen Excel und Word vorbereiten


Wenn Sie beschlieen, mit Excel und Word im Duett zu arbeiten, und fr diesen Zweck Makros programmieren mchten, mssen Sie Zugriff auf alle Objekte, Methoden und Eigenschaften von Word-VBA haben. Daher mssen Sie in Ihre Excel-Entwicklungsumgebung die Word-VBA-Bibliothek einbinden. Dazu verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Whlen Sie aus dem Men EXTRAS den Befehl VERWEISE.

Abbildung 11.11: Die Word-Bibliothek einbinden

3. Whlen Sie aus dem Listenfeld VERFGBARE VERWEISE wahlweise, je nach eingesetzter Word-Version, die Bibliothek MICROSOFT WORD 8.0 OBJECT LIBRARY (Word 97), MICROSOFT WORD 9.0 OBJECT LIBRARY (Word 2000), MICROSOFT WORD 10.0 OBJECT LIBRARY (Word 2002), MICROSOFT WORD 11.0 OBJECT LIBRARY (Word 2003) aus. 4. Besttigen Sie Ihre Einstellung mit OK.

464

Word-Sitzung starten

Sie haben nun die Mglichkeit, vorab die zur Verfgung stehenden Objekte, Methoden und Eigenschaften in Word-VBA einzusehen. Drcken Sie dazu in der Entwicklungsumgebung die Taste (F2) und stellen im ersten Dropdown-Feld den Befehl WORD ein.

Abbildung 11.12: Alle Objekte, Methoden und Eigenschaften von Word-VBA

11.7 Word-Sitzung starten


Im ersten Beispiel werden Sie eine neue Word-Sitzung starten, dann ein bestimmtes Dokument ffnen. Danach knnen beliebige Aktionen im Dokument durchgefhrt werden. In diesem Beispiel wird das Dokument wieder geschlossen und die Sitzung beendet. Das Makro fr diese Aufgabe lautet:

465

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 durchfhren .ActiveDocument.Close SaveChanges:=False .Application.Quit End With Set WordApp = Nothing End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable. Danach wenden Sie die Funktion CreateObject an, um eine Word-Sitzung zu erffnen. Setzen Sie dann die Eigenschaft Visible auf den Wert True, um die neue Word-Sitzung anzuzeigen. ber die Word-VBA-Methode Open ffnen Sie das Dokument Brief.doc. Nun knnen beliebige Aktionen im Dokument durchgefhrt werden (dazu aber spter mehr). ber die Methode Close schlieen Sie das aktive Dokument. Indem Sie das Argument SaveChanges auf den Wert False setzen, sorgen Sie dafr, dass das Dokument direkt geschlossen wird. Eventuelle nderungen werden somit verworfen. Wenden Sie danach die Methode Quit an, um die Word-Sitzung zu beenden.

Abbildung 11.13: Die Sitzung ist gestartet und das Dokument geffnet.

466

Word-Sitzung bernehmen

Sie haben jetzt einen Makrorahmen, der eine Word-Sitzung startet, ein bestimmtes Word-Dokument ffnet, dieses danach wieder schliet und im Anschluss daran die Anwendung beendet.

11.8 Word-Sitzung bernehmen


Nicht immer muss aber eine neue Sitzung von Word gestartet werden. Vor allem dann nicht, wenn bereits eine Word-Sitzung erffnet ist. In dem Fall muss Excel dies erkennen und somit muss diese Sitzung nur noch aktiviert werden. Im folgenden Beispiel soll geprft werden, ob eine Word-Sitzung bereits erffnet wurde. Wenn ja, soll diese Sitzung bernommen und im Anschluss daran ein neues Dokument eingefgt werden. Das Makro zur Lsung dieser Aufgabenstellung knnen Sie in Listing 11.7 sehen:
Listing 11.7: Eine Word-Sitzung bernehmen Sub WordSitzungbernehmen() Dim WordApp As Object Dim WordDok As Object On Error GoTo SitzungErffnen Set WordApp = GetObject(, "Word.Application") GoTo weiter SitzungErffnen: Set WordApp = CreateObject("Word.Application") weiter: WordApp.Visible = True Set WordDok = WordApp.Documents.Add Set WordApp = Nothing Set WordDok = Nothing End Sub

Erzeugen Sie zuerst zwei Objektvariablen. Die erste Variable wird dabei die Anwendung Word verwalten. Die zweite Variable wird ein neues, noch leeres Word-Dokument verwalten. Zunchst einmal sollten Sie berprfen, ob bereits

467

Excel und Datenzugriffe auf Access und Word

eine Applikation in Word gestartet ist. Fr diesen Zweck verwenden Sie die Funktion GetObject und bergeben ihr die Textfolge Word.application. Kommt es dabei zu einem Fehler, dann ist die Applikation noch nicht begonnen und muss ber die Funktion CreateObject gestartet werden. ber die Methode Add, die Sie auf die Auflistung Documents anwenden, fgen Sie ein neues Dokument ein.

Abbildung 11.14: Die Word-Sitzung wurde bernommen.

11.9 Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfgen


In der nchsten Aufgabe soll eine bestimmte Adresse aus einer Excel-Tabelle fr den Briefkopf in Word verwendet werden. Sehen Sie sich dazu einmal die folgende Tabelle in Abbildung 11.15 an.

Abbildung 11.15: Die Adressentabelle

468

Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfgen

Im Zellen-Dropdown-Feld in Zelle A1 knnen die verfgbaren Namen dynamisch ausgewhlt werden. Daraufhin werden in den Zellen B1 bis E1 die entsprechenden Informationen aus der darunter liegenden Tabelle geholt. Um das ZellenDropdown zu erstellen, gehen Sie wie folgt vor: 1. Setzen Sie den Mauszeiger auf Zelle A1. 2. Whlen Sie aus dem Men DATEN den Befehl GLTIGKEIT.

Abbildung 11.16: Das Zellen-Dropdown erstellen

3. Whlen Sie aus dem Dropdown-Feld ZULASSEN den Befehl LISTE. 4. Geben Sie als Quelle den Zellenbezug an, in dem Ihre Namen in der Tabelle aufgelistet werden. 5. Besttigen Sie Ihre Einstellung mit OK. Was jetzt noch fehlt, sind die Formeln in den Zellen B1 bis E1. Entnehmen Sie diese der folgenden Tabelle:
Zelle B1 C1 Formel/Funktion =SVERWEIS($A$1;$A$5:$E$13;2;FALSCH) =SVERWEIS($A$1;$A$5:$E$13;3;FALSCH)

Tabelle 11.1: Die bentigten Formeln fr die Adressen-Tabelle

469

Excel und Datenzugriffe auf Access und Word

Zelle D1 E1

Formel/Funktion =SVERWEIS($A$1;$A$5:$E$13;4;FALSCH) =SVERWEIS($A$1;$A$5:$E$13;5;FALSCH)

Tabelle 11.1: Die bentigten Formeln fr die Adressen-Tabelle (Forts.)

Immer wenn Sie jetzt einen Namen aus dem Zellen-Dropdown in Zelle A1 auswhlen, sucht Excel die dazugehrigen Adressdaten. Diese sollen jetzt in das Word-Dokument Brief.doc transferiert werden. Das Makro fr diese Aufgabe knnen Sie in Listing 11.8 sehen:
Listing 11.8: Eine Adresse aus Excel in einen Word-Brief kopieren Sub Dim Dim Dim Dim Dim Dim BriefkopfZusammenSetzen() WordApp As Object Vorname As String Nachname As String Strae As String PLZ As String Ort As String

Sheets("Adressen").Activate Nachname = Range("A1").Value Vorname = Range("B1").Value Strae = Range("C1").Value PLZ = Range("D1").Value Ort = 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

470

Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfgen

.TypeText Text:=Strae .TypeParagraph .TypeText Text:=PLZ & " " & Ort End With .ActiveDocument.Close savechanges:=True .Application.Quit (True) End With Set WordApp = Nothing End Sub

Aktivieren Sie im ersten Schritt die Tabelle in Excel, welche Ihre Adressen enthlt. Fllen Sie dann die Variablen, indem Sie die Werte der Zellen A1:E1 bertragen. Danach erffnen Sie mithilfe der Methode CreateObject eine neue Word-Sitzung und lassen diese anzeigen, indem Sie die Eigenschaft Visible auf den Wert True setzen. ffnen Sie danach ber die Methode Open das Dokument Brief.doc. Momentan steht der Textcursor im Dokument ganz links oben. Dies ist fr uns die richtige Position, um nun den Inhalt der Variablen dort einzufgen. Mit der Eigenschaft TypeText knnen Sie einen Text in das Dokument einfgen. Dies nutzen Sie fr die Erstellung der berschrift. Mit der Methode TypeParagraph fgen Sie eine leere Zeile im Dokument ein. Bevor Sie aber die neuen Daten einfgen, sollten Sie eventuell bereits eingefgte Adressen im Dokument lschen. Setzen Sie die Methode WholeStory ein, um den Text im Dokument zu markieren, und lschen diesen direkt im Anschluss, indem Sie die Methode Delete einsetzen.

Abbildung 11.17: Die Adresse wurde erfolgreich eingefgt.

471

Excel und Datenzugriffe auf Access und Word

11.10 Ganze Excel-Tabellen in ein Word-Dokument einfgen


Im nchsten Beispiel soll eine Excel-Tabelle in ein neues Word-Dokument bertragen werden. Dabei sollen die Daten Zelle fr Zelle bertragen und anschlieend in eine Word-Tabelle eingefgt werden. Gehen Sie bei dieser Aufgabe von der Excel-Tabelle in Abbildung 11.18 aus.

Abbildung 11.18: Die Ausgangssituation

Fhren Sie nun den Datentransfer durch, indem Sie das folgende Makro starten:
Listing 11.9: Eine Excel-Tabelle Zelle fr Zelle in ein Word-Dokument bertragen Sub Dim Dim Dim Dim Dim Dim Dim ExcelDatenNachWord() WordApp As Object WordDok As Object Bereich As Variant ExTab As Object i As Integer x As Integer y As Integer

Sheets("Tabelle1").Activate Bereich = ActiveSheet.UsedRange Set WordApp = CreateObject("Word.Application") WordApp.Visible = True

472

Ganze Excel-Tabellen in ein Word-Dokument einfgen

Set WordDok = WordApp.Documents.Add With WordApp.Selection .TypeText Text:="Daten aus Excel " .TypeText Text:="vom " & Format(Now(), _ "dd-mmm-yyyy") .TypeParagraph End 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 x End With Set Set Set End WordApp = Nothing WordDok = Nothing ExTab = Nothing Sub

Nachdem Sie den verwendeten Bereich in Ihrer Excel-Tabelle ber die Anweisung ActiveSheet.UsedRange ermittelt und diesen in einem Datenfeld gespeichert haben, rufen Sie Ihre Textverarbeitung Word auf. Dabei setzen Sie die Funktion CreateObject ein. ber die Eigenschaft Visible teilen Sie mit, dass die Textverarbeitung auch angezeigt werden soll. Dazu setzen Sie diese Eigenschaft auf den Wert True. Erstellen Sie nun mit der Methode Add ein neues Dokument. Mit der Eigenschaft TypeText knnen Sie einen Text in das Dokument einfgen. Dies nutzen Sie fr die Erstellung der berschrift. Mit der Methode TypeParagraph fgen Sie eine leere Zeile im Dokument ein. Setzen Sie die Methode Add ein, um eine noch leere Tabelle in das Dokument einzufgen, und fllen Sie diese Zelle fr Zelle, indem Sie das vorher gefllte Datenfeld schrittweise auslesen und mit der Methode InsertAfter in die Tabelle bertragen.

473

Excel und Datenzugriffe auf Access und Word

Abbildung 11.19: Die Excel-Tabelle wurde erfolgreich transferiert.

11.11 Word-Dokumente in einer Excel-Tabelle auflisten


In der nchsten Aufgabe soll ein Verzeichnis nach Word-Dokumenten durchsucht werden. Dabei sollen die Namen der Dokumente in eine Excel-Tabelle eingefgt und direkt im Anschluss verlinkt werden. Sie haben dann die Mglichkeit, mit einem Klick auf den jeweiligen Hyperlink das entsprechende Word-Dokument zu ffnen. Diese beiden Arbeitsschritte werden getrennt voneinander ausgefhrt. Im ersten Makro in Listing 11.10 werden die Namen der gefundenen Word-Dokumente in eine neue Tabelle geschrieben:
Listing 11.10: Word-Dokumente suchen und in einer Excel-Tabelle dokumentieren Sub WordDokumenteSuchen() Dim i As Integer Const verz = "C:\Eigene Dateien\" Sheets.Add ActiveSheet.Name = "Doku" ChDir verz

474

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 i End With End Sub

Abbildung 11.20: Alle gefundenen Word-Dokumente

Zu Beginn des Makros knnen Sie das zu durchsuchende Verzeichnis in einer Konstanten angeben. Wechseln Sie ber die Anweisung ChDir dann direkt in dieses Verzeichnis. Danach starten Sie die Suche und verwenden dabei das Objekt FileSearch, um die einzelnen Dateien im Verzeichnis zu ermitteln. Auf dieses Objekt knnen Sie einige Eigenschaften setzen: Die Eigenschaft NewSearch setzt alle Suchkriterien auf die Standardeinstellungen zurck. Mithilfe der Eigenschaft LookIn geben Sie bekannt, in welchem Verzeichnis die Suche beginnen soll. Die Eigenschaft SearchSubFolders bestimmt, ob die Suche auch in Unterverzeichnissen fortgesetzt werden soll. In diesem Fall mssen Sie diese Eigenschaft auf den

475

Excel und Datenzugriffe auf Access und Word

Wert True setzen. Die Eigenschaft FileType gibt den Typ der Datei in einer Konstanten an, nach der gesucht werden soll. Mchten Sie beispielsweise nicht nur Word-Dokumente suchen lassen, sondern alle Dateitypen, dann geben Sie die Konstante msoFileTypeAllFiles an. ber die Eigenschaft FoundFiles knnen Sie den Namen der gefundenen Datei abfragen. Schreiben Sie diesen direkt in Ihre Excel-Tabelle. Wandeln Sie jetzt die ermittelten Dokumentnamen in Hyperlinks um. Setzen Sie dazu das folgende Makro ein:
Listing 11.11: Hyperlinks einfgen Sub HyperlinksEinfgen() Sheets("Doku").Activate Range("A1").Select Do Until ActiveCell.Value = "" ActiveCell.Hyperlinks.Add ActiveCell, ActiveCell.Value ActiveCell.Offset(1, 0).Select Loop End Sub

Wenden Sie in einer Schleife die Methode Add an, um die einzelnen Hyperlinks einzufgen. In Kapitel 10 wurde diese Thematik bereits besprochen, sodass an dieser Stelle nicht nher darauf eingegangen wird.

Abbildung 11.21: Mit einem Klick das entsprechende Dokument ffnen

476

Fragen & Antworten

11.12 Fragen & Antworten


F

Wie kann ich die fnf billigsten Veranstaltungen einer Access-Tabelle ermitteln und in eine Excel-Tabelle berfhren?
A

Setzen Sie zu diesem Zweck die SQL-Anweisung TOP ein.

Listing 11.12: Die Top-Werte einer Access-Tabelle bertragen Sub Dim Dim Dim Top_DatenstzeAnzeigen() ADOC As New ADODB.Connection DBS As ADODB.Recordset 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.Recordset On Error GoTo fehler DBS.Open s, ADOC, adOpenKeyset, adLockOptimistic Sheets("TOP").Activate Range("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).Select Loop DBS.Close

477

Excel und Datenzugriffe auf Access und Word

ADOC.Close Set DBS = Nothing Set ADOC = Nothing Exit Sub fehler: MsgBox "Es ist ein Fehler aufgetreten!" & _ Chr(13) & Err.Description End Sub

Achten Sie darauf, dass Sie in der SQL-Anweisung SELECT die Felder mit bernehmen, auf die Sie spter auch zugreifen mchten. Die Sortierung der Liste knnen Sie ber das Schlsselwort ORDER bestimmen.

Abbildung 11.22: Die Top-Werte aus Access zusammentragen F

Welche spezielle Mglichkeit habe ich, eine Access-Tabelle in Excel zu importieren?


A

Wenn Sie das folgende Makro aus Listing 11.13 in Ihre Access-Entwicklungsumgebung eingeben und starten, dann erfolgt der Transfer in eine Excel-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", True End Sub

Mit Hilfe der Methode OutputTo knnen Sie die Daten in einem bestimmten Microsoft Access-Datenbankobjekt (einem Datenblatt, einem Formular, einem Bericht, einem Modul oder einer Datenzugriffsseite) in verschiedenen Formaten ausgeben. Dabei lautet die Syntax dieser Methode wie folgt:
OutputTo(ObjectType, ObjectName, OutputFormat, OutputFile, AutoStart, TemplateFile)

478

Fragen & Antworten

ber das Argument ObjectType legen Sie die Art des Access-Objektes fest, dessen Daten Sie exportieren mchten. Dabei haben Sie folgende Mglichkeiten.
acOutputForm:

Export der Daten eines Formulars Export einer Function zur Sicherung Export eines kompletten Moduls, inkl. aller Funktionen und

acOutputFunction: acOutputModule:

Makros
acOutputQuery:

Export der Ergebnisse eine Abfrage Export eines Berichts Export einer Serveransicht Export einer gespeicherten Prozedur

acOutputReport:

acOutputServerView:

acOutputStoredProcedure: acOutputTable:

Export einer Tabelle

Beim Argument ObjectName geben Sie den Namen des Objektes an, welches Sie exportieren mchten. Das Argument OutPutFormat legt fest, in welchem Datenformat Sie die Daten transferieren mchten. Die bekanntesten Formate heien dabei wie folgt:
acFormatHTML:

konvertiert die Daten in das HTML-Format.

acFormatRTF: konvertiert die Daten in das Rich-Textfile-Format. Dieses Format kann beispielsweise sehr gut in Microsoft Word eingelesen werden. acFormatTXT: acFormatXLS:

Mit diesem Format ist das Textformat gemeint. konvertiert die Daten in das Microsoft Excel-Format.

Beim Argument OutputFile geben Sie den Pfad sowie den Dateinamen der Datei an, in welche Sie die Daten transferieren mchten. Dabei muss die Datei noch nicht vorhanden sein. Access legt diese bei Bedarf selber an. Mit Hilfe des Arguments AutoStart haben Sie die Mglichkeit die so erstellte Exportdatei gleich zu ffnen. Verwenden Sie den Wert True, um die entsprechende auf Windows basierende Anwendung sofort zu starten. Setzen Sie das Argument auf den Wert False oder lassen Sie es weg, wenn Sie die Exportdatei nicht ffnen mchten. Das Argument TemplateFile ist dann von Interesse, wenn Sie eine Vorlage beispielsweise fr die HTML-Datei verwenden mchten. In diesem Fall ist dann der komplette Pfad dieser Vorlagendatei anzugeben.

479

Excel und Datenzugriffe auf Access und Word

Abbildung 11.23: Access-Tabelle wurde erfolgreich nach Excel transferiert. F

Wie kann ich ein Feld einer Access-Tabelle ansprechen, wenn dieses Feld im Namen ein Leerzeichen (z.B: Kosten Kurs) enthlt?
A

Setzen Sie um dieses Feld eckige Klammern. DBS![Kosten Kurs]. Erfassen Sie zu diesem Zweck das folgende Makro:
Listing 11.14: Einen Zellenbereich in ein Word-Dokument kopieren Sub Dim Dim Dim ExcelDatenNachWordKopieren() WordApp As Object WordDok As Object Bereich As Range

Wie knnen Sie einen Teil einer Excel-Tabelle in ein neues Dokument kopieren?
A

Set WordApp = CreateObject("Word.application") WordApp.Visible = True Set 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 = Nothing End Sub

Deklarieren Sie zu Beginn einige Objektvariablen. Erffnen Sie mithilfe der Funktion CreateObject eine neue Word-Sitzung. ber die Methode Add legen Sie danach ein neues, noch leeres Dokument an. Definieren Sie in der Objektvariablen Bereich den Bereich auf der Tabelle BUNG, den

480

Fragen & Antworten

Sie kopieren mchten. Wenden Sie danach die Methode Copy an, um den angegebenen Bereich zu kopieren. Innerhalb dieser Methode geben Sie die genaue Adresse des Zellenbereichs ber die Eigenschaft Address an. Mithilfe der Methode Paste holen Sie den kopierten Bereich, der sich momentan in der Zwischenablage befindet, direkt in Ihr Word-Dokument. Setzen Sie dann die Eigenschaft CutCopyMode auf den Wert False, um den noch existenten Laufbalken um den kopierten Bereich zu entfernen. Heben Sie am Ende die Objektverweise wieder auf, um den dafr reservierten Speicher wieder freizugeben.
F

Wie knnen Sie ein Word-Makro von Excel heraus starten?


A

Um diese Aufgabe zu lsen, legen Sie ein neues Word-Dokument (Word.doc) im Verzeichnis C:\Eigene Dateien an und fgen in dieses Dokument ein Makro namens WORDMAKRO ein. Starten Sie danach aus Ihrer 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 = Nothing End Sub

Deklarieren Sie im ersten Schritt eine Objektvariable und setzen Sie die Funktion CreateObject ein, um eine neue Word-Sitzung zu erffnen. Blenden Sie danach die Word-Sitzung ein, indem Sie der Eigenschaft Visible den Wert True zuzuweisen. ffnen Sie daraufhin das Dokument Word.doc mithilfe der Methode Open. ber die Methode Run starten Sie das Makro WORDMAKRO. Beenden Sie die Word-Sitzung, indem Sie die Methode Quit einsetzen. Heben Sie am Ende den Objektverweis wieder auf, um den dafr reservierten Speicher wieder freizugeben.

481

Excel und Datenzugriffe auf Access und Word

Wie knnen Sie in eine Excel-Tabelle ein Word-Dokument als Symbol einfgen?
A

Mchten Sie ein Word-Dokument in eine Excel-Tabelle als Symbol einfgen, starten Sie das folgende Makro:
Listing 11.16: Ein Word-Dokument als Symbol einfgen Sub DokumentObjektEinfgen() Sheets("bung").Activate Range("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").Select End Sub

ber die Methode Add erstellen Sie ein OLE-Objekt. Dabei hat diese Methode folgende Syntax:
Ausdruck.Add(ClassType, FileName, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height)

ber das Argument ClassType geben Sie den Namen der Anwendung bekannt, die zum Aktivieren des angegebenen OLE-Objekts verwendet werden soll. Im Argument FileName geben Sie den Dateinamen inklusive dem Dateipfad der Datei an, aus der das Objekt erstellt werden soll. Wenn dieses Argument fehlt, wird der aktuelle Ordner verwendet. Setzen Sie das Argument Link auf den Wert True, um das OLE-Objekt mit der Datei zu verknpfen, aus der es erstellt wurde. Weisen Sie dem Argument hingegen den Wert False zu, um das OLE-Objekt als separate Kopie der Datei anzulegen. Der Standardwert ist False. Mit dem Argument DisplayAsIcon knnen Sie das OLE-Objekt als Symbol anzeigen. Setzen Sie das Argument in diesem Fall auf True, um das Symbol anzuzeigen. Der Standardwert ist False. Unter dem Argument IconFileName mssen Sie die Datei angeben, welche das anzuzeigende Symbol enthlt.

482

Fragen & Antworten

Im Argument IconIndex ist die Indexnummer des Symbols innerhalb von IconFileName enthalten. Die Reihenfolge der Symbole in der angegebenen Datei entspricht der Reihenfolge, in der die Symbole im Dialogfeld ANDERES SYMBOL (Men EINFGEN, Dialogfeld OBJEKT) angezeigt werden, wenn das Kontrollkstchen ALS SYMBOL ANZEIGEN aktiviert ist. Im Argument IconLabel geben Sie die Beschriftung an, die unter dem Symbol angezeigt werden soll. In den Argumenten Left, Top, Width und Height knnen Sie die Position bzw. die Gre angeben, in der das OLE-Objekt in die Tabelle eingefgt wird.

Abbildung 11.24: Word-Dokument wurde als Symbol in die Tabelle eingefgt.

483

Excel und Datenzugriffe auf Access und Word

11.13 Quiz
F F F F F F F F

Warum mssen Sie die ADO-Bibliothek in Ihre Entwicklungsumgebung einbinden? An was muss ich denken, wenn ich ber die Methode AddNew einen neuen Datensatz anlege? Welches Argument muss ich einsetzen, wenn ich eine Access-Tabelle vom Ende bis zum Anfang durchsuchen mchte? Wie heit die Methode, um in einer Access-Tabelle jeweils zum nchsten Datensatz zu springen? Wie heit die Funktion, um eine Applikations-Sitzung festzustellen? Welche Eigenschaft muss man einsetzen, wenn man eine Applikation starten, diese aber nicht am Bildschirm anzeigen mchte? Wie heit die Methode, um in einem Word-Dokument eine Leerzeile einzufgen? Welches Objekt knnen Sie einsetzen, um nach bestimmten Dateitypen auf Ihrem PC zu suchen?

11.14 bung
1. Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe ACCESS.XLS und wechseln Sie auf die Tabelle BUNG. Schreiben Sie ein Makro, dass alle Datenstze aus der Access-Tabelle VERANSTALTUNG in die Excel-Tabelle bertrgt, 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 ein neues Dokument kopiert. Dabei sollen die beiden Dateien ber die Verknpfungseigenschaft miteinander verbunden bleiben. Die Lsung dieser Aufgaben knnen Sie im Anhang A nachlesen.

484

Arbeiten an der Oberflche Menund Symbolleisten programmieren

2 1

Arbeiten an der Oberflche Men- und Symbolleisten programmieren

Am gestrigen Tag haben Sie gelernt, wie Sie innerhalb von Microsoft Office arbeiten knnen. Unter anderem haben Sie eine Word-Sitzung von Excel aus gestartet bzw. bernommen. Des Weiteren haben Sie auf Access-Datentabellen zugegriffen und Daten in Excel-Tabellen importiert bzw. exportiert. Die Themen heute:

Leistenart identifizieren Menleisten programmieren Symbolleisten programmieren Kontextmens programmieren Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Leisten.xls im Verzeichnis Kap12.

12.1 Art der Leiste identifizieren


Standardmig werden in Excel die Arbeitsblatt-Menleiste sowie die Symbolleisten STANDARD und FORMAT angezeigt. Alle Leisten knnen ber das Objekt CommandBars angesprochen werden. Um zu wissen, ob es sich bei der jeweiligen Leiste um eine Symbolleiste, Menleiste oder gar um ein Kontextmen handelt, knnen Sie die Eigenschaft Type abfragen. Eine Symbolleiste gibt den Wert 0 zurck, eine Menleiste den Index 1 und ein Kontextmen den Index 2. Im nchsten Beispiel listen Sie alle Leisten von Excel in einer Tabelle auf und ermitteln ber die Eigenschaft Type, ob es sich um Menleisten, Symbolleisten oder um Kontextmens handelt. Das Makro fr diese Aufgabe sehen Sie nachfolgend:
Listing 12.1: Leisten anhand ihres Typs identifizieren Sub ArtenVonLeisten() Dim i As Integer Dim s As String Sheets.Add Range("A1").Select

486

Art der Leiste identifizieren

For i = 1 To CommandBars.Count Select Case CommandBars(i).Type Case 0 s = "Symbolleiste" Case 1 s = "Menleiste" 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").AutoFit End Sub

Ermitteln Sie im Makro aus Listing 12.1 im ersten Schritt alle vorhandenen Leisten von Excel, indem Sie diese mithilfe der Methode Count zhlen. ber die Eigenschaft Type geben Sie die Art der Befehlsleiste zurck. Entnehmen Sie die mglichen Konstanten bzw. Indexwerte der nchsten Tabelle:
Index
0 1 2

Konstante
msoBarTypeNormal msoBarTypeMenuBar msoBarTypePopup

Leiste Symbolleiste Menleiste Kontextmen

Tabelle 12.1: Die mglichen Typen von Befehlsleisten

ber die Eigenschaft Name knnen Sie den Namen der Befehlsleiste ermitteln. Verteilen Sie diese Informationen in die Spalten AC. Mithilfe der Methode AutoFit knnen Sie dafr sorgen, dass die Spaltenbreiten automatisch eingestellt werden.

487

Arbeiten an der Oberflche Men- und Symbolleisten programmieren

Abbildung 12.1: Leisten identifizieren

Wie Sie sehen, hat die Arbeitsblatt-Menleiste beispielsweise den Index 1, d.h., ber diesen Index knnen Sie diese Menleiste ansprechen, wie es im nchsten Abschnitt durchgefhrt wird.

12.2 Menleisten programmieren


Wenn es um die Programmierung von Menleisten geht, dann wird in den meisten Fllen die bereits standardmig eingeblendete Arbeitsblatt-Menleiste angepasst. Dabei haben Sie die Mglichkeit, neue Menbefehle in bereits bestehende Mens einzufgen bzw. ein neues Men innerhalb der Arbeitsblatt-Menleiste anzubieten. Des Weiteren knnen Sie bestimmte Menbefehle bei Bedarf deaktivieren oder gar die ganze Menleiste temporr aus- bzw. wieder einblenden.

488

Menleisten programmieren

Arbeitsblatt-Menleiste ein- und ausblenden


Die Arbeitsblatt-Menleiste werden Sie dann kurzfristig ausblenden, wenn Sie bei der Arbeit mit Excel mglichst viel Bildschirmplatz bentigen, wie z.B. bei der Datenerfassung. Im Beispiel in Listing 12.2 wird die Arbeitsblatt-Menleiste ausgeblendet:
Listing 12.2: Die Arbeitsblatt-Menleiste ausblenden Sub ArbeitsblattMenleisteAusblenden() Application.CommandBars(1).Enabled = False End Sub

Die Arbeitsblatt-Menleiste wird durch das CommandBars-Objekt mit dem Index 1 eindeutig identifiziert. Setzen Sie die Eigenschaft Enabled dieser Menleiste auf den Wert False, um diese auszublenden. Um die Arbeitsblatt-Menleiste wieder einzublenden, setzen Sie die Eigenschaft Enabled dieser Menleiste auf den Wert True.

Abbildung 12.2: Die ArbeitsblattMenleiste wurde ausgeblendet.

brigens knnen Sie die Arbeitsblatt-Menleiste auch ber ihren Namen ansprechen. Die Namen der einzelnen Leisten knnen Sie in Abbildung 12.1 nachsehen. Im folgenden Makro wird die Arbeitsblatt-Menleiste ber ihren Namen ausgeblendet:

489

Arbeiten an der Oberflche Men- und Symbolleisten programmieren

Listing 12.3: Die Arbeitsblatt-Menleiste ber den Namen ansprechen Sub ArbeitsblattMenleisteAusblendenVar02() Application.CommandBars("Worksheet Menu Bar").Enabled _ = False End Sub

Neue Mens einfgen und lschen


Im nchsten Beispiel soll ein zustzliches Men in die Arbeitsblatt-Menleiste integriert werden. Die Position des neuen Mens soll dabei genau vor dem HilfeMen (?) sein. Starten Sie zu diesem Zweck dieses Makro:
Listing 12.4: Ein neues Men einfgen Sub Dim Dim Dim MenAnfgen() i As Integer i_Hilfe As Integer MenNeu As CommandBarControl

i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ Before:=i_Hilfe, Temporary:=True) MenNeu.Caption = "TO&OLS" End Sub

Deklarieren Sie eine Objektvariable vom Typ CommandBarControl, um den neuen Menpunkt spter einzufgen. Mithilfe der Methode Count zhlen Sie die Anzahl der Mens in der Arbeitsblatt-Menleiste. Ermitteln Sie danach die Position des Hilfe-Mens, welches standardmig ganz rechts in der Arbeitsblatt-Menleiste steht. Die Arbeitsblatt-Menleiste knnen Sie direkt ber das Objekt CommandBars(1) ansprechen. Mithilfe der Eigenschaft Controls knnen Sie alle Steuerelemente der Arbeitsblatt-Menleiste abfragen. Wenden Sie die Methode Add an, um ein neues Men vor dem Hilfemen einzufgen. Die Methode Add hat die Syntax:
Add(Type, Id, Before, Temporary)

490

Menleisten programmieren

Das Argument Type legt die Art des Steuerelements ber eine Konstante fest, die Sie in Tabelle 12.2 sehen knnen.
Konstante
msoControlButton msoControlEdit msoControlDropdown msoControlComboBox msoControlPopup

Beschreibung ber diese Konstante wird eine Schaltflche eingefgt. ber diese Konstante wird ein Eingabefeld eingefgt. Mithilfe dieser Konstante wird ein Dropdown-Feld eingefgt. ber diese Konstante wird ein Combobox-Feld eingefgt. Mithilfe dieser Konstanten wird ein Dropdown-Men eingefgt.

Tabelle 12.2: Die mglichen Steuerelemente fr Leisten

ber das Argument ID haben Sie die Mglichkeit, neben dem Mentext auch noch ein Symbol anzuzeigen. Jede ID in Excel ist mit einem ganz bestimmten Symbol vorbelegt, dazu aber spter mehr. Mithilfe des Arguments Before geben Sie die genaue Position des Mens an. Diesem Argument bergeben Sie die vorher ermittelte Position des Hilfe-Mens. ber das Argument Temporary knnen Sie bestimmen, ob das Steuerelement temporr angelegt werden soll. Wenn Sie dieses Argument auf den Wert True setzen, wird das Steuerelement beim Beenden von Excel wieder gelscht.

Abbildung 12.3: Das neue Men wurde angelegt.

Das kaufmnnische Und-Zeichen im Makro aus Listing 12.4 wird hier genau vor dem Buchstaben O eingefgt. Dies bedeutet, dass Sie das neue Men auch ber die Tastenkombination (Alt) + (O) aktivieren knnen. Im Men wird der so gekennzeichnete Buchstabe unterstrichen. Achten Sie dabei darauf, dass der ausgewhlte Buchstabe nicht schon in einem anderen Men verwendet wird.

491

Arbeiten an der Oberflche Men- und Symbolleisten programmieren

Mchten Sie das neu eingefgte Men wieder aus der Arbeitsblatt-Menleiste entfernen, wenden Sie die Methode Delete an. Sehen Sie sich dazu das folgende Makro an:
Listing 12.5: Ein Men lschen Sub MenLschen() On Error Resume Next With Application.CommandBars(1) .Controls("TO&OLS").Delete End With End Sub

Die On-Error-Anweisung wird hier eingesetzt, um einen Makroabsturz zu verhindern, wenn versucht wird, das Men TOOLS zu lschen, dieses jedoch gar nicht mehr existiert.

Menbefehle einfgen
Das gerade neu angelegte Men TOOLS enthlt noch keine Menbefehle. Dies holen Sie jetzt nach, indem Sie das Makro aus Listing 12.4 erweitern. Dabei soll der Menbefehl Formeln> Festwerte eingefgt werden.
Listing 12.6: Einen Menbefehl einfgen Sub Dim Dim Dim Dim MenEinfgenUndFllen() i As Integer i_Hilfe As Integer MenNeu As CommandBarControl MB As CommandBarControl

i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ before:=i_Hilfe, Temporary:=True) MenNeu.Caption = "TO&OLS" Set MB = MenNeu.Controls.Add _ (Type:=msoControlButton)

492

Menleisten programmieren

With MB .Caption = _ "Formeln ---> Fe&stwerte" .Style = msoButtonIconAndCaption .OnAction = "FormelnInFestwerteWandeln" .FaceId = 350 .BeginGroup = True End With End Sub

Abbildung 12.4: Der erste Menbefehl wurde eingefgt.

Um den Menbefehl im Men TOOLS einfgen zu knnen, brauchen Sie eine Objektvariable vom Typ CommandBarControl. Setzen Sie die Methode Add ein, um den neuen Menbefehl dem Men TOOLS hinzuzufgen. Mit der Eigenschaft Caption bestimmen Sie die Beschriftung des Menbefehls. Das kaufmnnische Zeichen & wird hierbei eingesetzt, um den Shortcut fr diesen Befehl zu bestimmen. Bei aufgeklapptem Men TOOLS knnen Sie durch die Eingabe des Shortcut-Buchstabens den Menbefehl aktivieren. Mithilfe der Eigenschaft FaceId knnen Sie dem Menbefehl auch noch ein Symbol hinzufgen. Dabei drfen Sie aber nicht vergessen, dass hierzu die Eigenschaft Styles mit der Konstante msoButtonIconAndCaption angegeben werden muss. Wie aber sollen Sie wissen, welches Symbol hinter welcher FaceId steckt? Diese Frage wird zu einem spteren Zeitpunkt noch ausfhrlich beantwortet. Mchten Sie mehrere Befehle optisch schner darstellen, knnen Sie ber die Eigenschaft BeginGroup einen horizontalen Trennstreifen unter den jeweiligen Menbefehl setzen lassen. Damit knnen Sie Menbefehle, die funktionsgem zusammengehren, von anderen Menbefehlen absondern. ber die Eigenschaft OnAction geben Sie den Namen des Makros an, welches ausgefhrt werden soll, wenn der Anwender den Menbefehl auswhlt. Erfassen Sie nun das Makro, welches die Formeln einer Tabelle in Festwerte wandelt:

493

Arbeiten an der Oberflche 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.Value Next zelle End Sub

ber die Eigenschaft UsedRange ermitteln Sie den verwendeten Bereich einer Tabelle. Durchlaufen Sie in einer Schleife alle Zellen dieses Bereiches und ersetzen Sie die Formeln, indem Sie die Anweisung zelle.Value = zelle.Value einsetzen.

12.3 Symbolleisten programmieren


Als Nchstes gehen Sie an die Programmierung von Symbolleisten heran. Auch dies wird kein Problem fr Sie darstellen.

Neue Symbolleiste anlegen


Wie auch schon bei der Vorgehensweise bezglich der Menleiste werden Sie nun Schritt fr Schritt zuerst eine Symbolleiste anlegen und danach die noch leere Symbolleiste mit Symbolen fllen. Legen Sie im nchsten Beispiel in Listing 12.8 eine neue Symbolleiste an und geben 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

Symbolleisten programmieren

.Visible = True .Top = 150 .Left = 80 End With End Sub

ber die Methode Add fgen Sie eine neue Symbolleiste ein. Setzen Sie die Eigenschaft Visible auf den Wert True, damit die Symbolleiste auf dem Bildschirm angezeigt wird. ber die Eigenschaften Top und Left legen Sie die Einfgeposition (linke obere Ecke) fest.

Abbildung 12.5: Die neue Symbolleiste wurde angelegt.

Um eine Symbolleiste wieder zu entfernen, starten Sie das Makro wie folgt:
Listing 12.9: Eine Symbolleiste lschen Sub SymbolleisteLschen() Dim SB As CommandBar Set SB = CommandBars("FUNKTIONEN") On Error Resume Next SB.Delete End Sub

Definieren Sie im ersten Schritt mithilfe der Anweisung Set, welche Symbolleiste Sie lschen mchten. Zum Lschen einer Symbolleiste wenden Sie die Methode Delete an. Denken Sie daran, die Anweisung On Error Resume Next vor den Lschbefehl zu integrieren. Damit sorgen Sie dafr, dass das Makro nicht abstrzt, wenn versucht wird, die bereits gelschte Symbolleiste erneut zu lschen.

495

Arbeiten an der Oberflche Men- und Symbolleisten programmieren

Symbole integrieren
Kommen wir nun zur nchsten Aufgabe. Es sollen Symbole in die neu angelegte Symbolleiste integriert werden. Jedes einzelne Symbol in Excel hat eine eindeutige Kennzeichnung. Die FaceIdEigenschaft bestimmt dabei das Aussehen, jedoch nicht die Funktion einer Befehlsleisten-Schaltflche. Um einen berblick ber die Vielfalt der Symbole in Excel zu bekommen, erstellen Sie im nachfolgenden Makro eine neue Symbolleiste mit dem Namen SYMBOLE und fgen die ersten 500 Symbole in diese Symbolleiste ein. Die FaceIDNummer soll dabei als Quickinfo fr jedes einzelne Symbol angezeigt werden.
Listing 12.10: Die Symbole mit der FaceId anzeigen Sub Dim Dim Dim FaceIdsErmitteln() symb As CommandBar Icon As CommandBarControl i As Integer

On Error Resume Next Set symb = Application.CommandBars.Add _ ("Symbole", msoBarFloating) For i = 1 To 500 Set Icon = symb.Controls.Add(msoControlButton) Icon.FaceId = i Icon.TooltipText = i Next i symb.Visible = True End Sub

Mithilfe der Methode Add fgen Sie jeweils ein Symbol in die Symbolleiste SYMBOLE ein. Da es sich um ein Symbol handelt, muss dabei die Konstante msoControlButton mit angegeben werden. Die Eigenschaft FaceId bestimmt das Aussehen des Symbols. ber die Eigenschaft ToolTipText knnen Sie diese FaceId als Quickinfo anzeigen lassen. Mithilfe der Eigenschaft Visible zeigen Sie die Symbolleiste 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 Symbols angezeigt.

496

Symbolleisten programmieren

Abbildung 12.6: Die verfgbaren Symbole mit FaceId anzeigen

Mchten Sie nicht das Aussehen, sondern die Funktion eines Symbols ntzen, dann mssen Sie wissen, welche ID zu welchem Symbol gehrt. Im Makro in Listing 12.11 wird die Symbolleiste STANDARD untersucht. Jedes Symbol wird dabei angesteuert und dessen Bezeichnung sowie dessen ID in eine neue Tabelle geschrieben. Das Makro fr diese Aufgabe lautet:
Listing 12.11: Die IDs fr die einzelnen Symbole herausschreiben Sub IDsErmitteln() Dim symb As CommandBar Dim Icon As CommandBarControl Sheets.Add Range("A1").Select On Error Resume Next Set symb = Application.CommandBars("Standard")

497

Arbeiten an der Oberflche 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).Select Next Icon Columns("A:B").AutoFit End Sub

Mithilfe der Eigenschaft ToolTipText knnen Sie den Text ermitteln, der in der QuickInfo des angegebenen Befehlsleisten-Steuerelements angezeigt wird. ber die Eigenschaft ID knnen Sie die integrierte Aktion fr dieses Steuerelement abfragen.

Abbildung 12.7: Die ID fr ein Symbol bestimmen

Kommen wir nun auf unsere Symbolleiste FUNKTIONEN zurck, die momentan noch leer ist. Fgen Sie in diese Symbolleiste zwei Symbole ein:

ein benutzerdefiniertes Symbol mit der FaceId 350 und dem Quickinfo-Text
Formeln > Festwerte

das bereits standardmig zur Verfgung stehende Symbol SPEICHERN, welches Sie ber die ID 3 ansprechen knnen

498

Symbolleisten programmieren

Das Makro zum Lsen dieser Aufgabe sieht wie folgt aus:
Listing 12.12: Eine Symbolleiste mit Symbolen bestcken Sub NeueSymbolleisteAnlegenUndFllen() Dim SB As CommandBar Dim 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 With End Sub

Der Unterschied beim Einfgen der beiden Symbole besteht darin, dass beim ersten Symbol noch das Makro angegeben werden muss, welches dem Symbol zugewiesen werden soll. Ebenso wird das Aussehen nach eigenem Wunsch ber die Eigenschaft FaceId festgelegt. Beim zweiten Symbol greifen Sie auf ein Standardsymbol zurck, bei dem das Aussehen bereits festgelegt ist. Geben Sie daher schon bei der Anlage ber die Methode Add als Argument die ID an.

499

Arbeiten an der Oberflche Men- und Symbolleisten programmieren

Abbildung 12.8: Zwei unterschiedliche Arten von Symbolen einfgen

12.4 Kontextmens programmieren


Ein Kontextmen wird dann automatisch heruntergeklappt, wenn Sie mit der rechten Maustaste auf ein beliebiges Excel-Objekt klicken. Ein Kontextmen enthlt 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 diesem Grund werden wir uns auf dieses wichtige Kontextmen beschrnken.

Zellen-Kontextmen erweitern
Wenn Sie sich das Zellen-Kontextmen einmal ansehen, dann sehen Sie, dass die wichtigsten Befehle fr die Zelle schon darin enthalten sind. Trotzdem knnen Sie weitere Befehle in das Kontextmen einfgen. Im nchsten Beispiel werden Sie dem Zellen-Kontextmen eine neue Funktion hinzufgen. Bei dieser Funktion wird, wie schon bei der Menleiste sowie der Symbolleiste besprochen, die Funktion FormelnInWertwerteWandeln eingefgt.
Listing 12.13: Das Zellenkontextmen erweitern Sub ZellenkontextmenErgnzen() Dim MB As CommandBarControl Set MB = Application.CommandBars("Cell").Controls.Add With MB .Caption = "Formeln --> Festwerte"

500

Kontextmens programmieren

.OnAction = "FormelnInFestwerteWandeln" .FaceId = 350 End With End Sub

Wenden Sie die Methode Add an, um dem Kontextmen einen weiteren Menbefehl hinzuzufgen. ber die Eigenschaft Caption knnen Sie den Menbefehl beschriften. Die Eigenschaft OnAction sagt aus, welches Makro bei der Auswahl des Kontext-Menbefehls gestartet werden soll. Mithilfe der Eigenschaft FaceId knnen Sie dem Menbefehl ein zustzliches Symbol hinzufgen. ber die Eigenschaft BeginGroup knnen Sie einzelne Menbefehle gruppieren. Indem Sie diese Eigenschaft auf den Wert True setzen, sorgen Sie dafr, dass ein horizontaler Trennstreifen im Kontextmen eingefgt wird.

Abbildung 12.9: Das Kontextmen erweitern

Kontextmenbefehle entfernen
Mithilfe der Methode Delete knnen Sie einzelne Menbefehle aus dem Kontextmen wieder lschen. Entfernen Sie nun den Kontextmenbefehl Fomeln > Festwerte, den Sie vorher dem Kontextmen hinzugefgt haben. Starten Sie zu diesem Zweck das folgende Makro:

501

Arbeiten an der Oberflche Men- und Symbolleisten programmieren

Listing 12.14: Einen Kontextmenbefehl lschen Sub ZellenkontextmenBefehleLschen() Dim Men As CommandBar Set Men = Application.CommandBars("Cell") On Error Resume Next With Men .Controls("Formeln --> Festwerte").Delete End With End Sub

Geben Sie mithilfe der Anweisung Set bekannt, auf welche Leiste Sie zugreifen mchten. Danach sorgen Sie ber die Anweisung On Error Resume Next dafr, dass es zu keiner Fehlermeldung kommt, wenn versehentlich versucht wird, den Kontextmenbefehl zweimal hintereinander zu lschen. Wenden Sie die Methode Delete an, um den Kontextmenbefehl zu lschen. Greifen Sie dabei auf die Eigenschaft Controls zurck und geben Sie die Beschriftung des Befehls an.

12.5 Fragen & Antworten


F

Wie knnen 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 KomplettesMenDeaktivieren() On Error Resume Next Application.CommandBars(1).Controls("TO&OLS").Enabled _ = False End Sub

Mithilfe der Anweisung CommandBars(1) haben Sie Zugriff auf die Arbeitsblatt-Menleiste. ber die Eigenschaft Controls geben Sie an, welches Men Sie dort genau deaktivieren mchten. Setzen Sie die Eigenschaft Enabled fr dieses Men auf den Wert False, um es zu deaktivieren. Setzen Sie die Eigenschaft Enabled fr dieses Men auf den Wert True, um es wieder zu aktivieren.

502

Fragen & Antworten

Abbildung 12.10: Das Men Tools wurde deaktiviert. F

Wie knnen Sie eine Symbolleiste vor Vernderungen schtzen?


A

Sie knnen Symbolleisten jeder Zeit anpassen, d.h. Sie knnen neue Symbole in die Symbolleiste aufnehmen oder Symbole aus den Leisten herausnehmen. Weiter knnen Sie die Position von Symbolleisten auf dem Bildschirm frei bestimmen. Mchten Sie all dies verhindern, so haben Sie die Mglichkeit, Ihre Symbolleisten zu schtzen. Im nchsten Makro in Listing 12.16 wird die Symbolleiste STANDARD geschtzt:
Listing 12.16: Die Symbolleiste Standard schtzen Sub SymbolleisteSchtzen() With Application.CommandBars("Standard") .Protection = _ msoBarNoChangeVisible + msoBarNoCustomize .Visible = True End With End Sub

ber die Eigenschaft Protection knnen Sie Ihre Symbolleisten schtzen. Die Konstante msoBarNoChangeVisible sorgt dafr, dass die Symbolleiste nicht im Kontextmen erscheint, wenn Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken. ber die Konstante msoBarNoCustomize knnen Sie ein Anpassen der Symbolleiste verhindern. Es knnen danach keine neuen Symbole hinzugefgt bzw. Symbole aus der Symbolleiste herausgelscht werden.
F

Wie knnen Sie das Aufklappen des Kontextmens verhindern, wenn Sie mit der rechten Maustaste auf eine Symbolleiste klicken?
A

Das Aufklappen dieses Kontextmens verhindern Sie, indem Sie die Anweisung Application.CommandBars("Toolbar list").Enabled = False einsetzen.

503

Arbeiten an der Oberflche Men- und Symbolleisten programmieren

Wie knnen Sie das Aufklappen des Kontextmens verhindern, wenn Sie mit der rechten Maustaste auf die Registerkarte (unten) einer Tabelle klicken?
A

Das Aufklappen dieses Kontextmens verhindern Sie, indem Sie die Anweisung Application.CommandBars("Ply").Enabled = False einsetzen.

Wie knnen Sie das Zellen-Kontextmen von Excel auf den ursprnglichen Zustand zurcksetzen?
A

Dazu bedarf es nur eines einzigen Befehls. Dieser Befehl lautet: Application.CommandBars("Cell").Reset.

12.6 Quiz
F F F

Wie lautet die Eigenschaft, die das Aussehen eines Symbols bestimmt? Wie lautet die Eigenschaft, die die Funktion eines Symbols bestimmt? ber welche Eigenschaft wird die Beschriftung eines Menbefehls festgelegt?

12.7 bung
Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe Leisten.xls. Schreiben Sie ein Makro, welches die Menbefehle SPEICHERN und SPEICHERN UNTER im Men DATEI deaktiviert. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.

504

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

3 1

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Am gestrigen Tag haben Sie gelernt, wie Sie Menleisten programmieren knnen. Dabei haben Sie neue Mens und Menbefehle eingefgt und wieder entfernt. Des Weiteren haben Sie Symbolleisten erstellt und Kontextmens programmiert. Die Themen heute:

Was sind UserForms? UserForms entwerfen UserForms programmieren Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe UserForm.xls im Verzeichnis Kap13.

13.1 Was sind UserForms?


Als UserForms werden in Excel Dialoge bezeichnet, die Sie selbst entwerfen, mit Steuerelementen bestcken und automatisieren knnen. Dabei stehen Ihnen unter anderem Steuerelemente wie Eingabe- und Textfelder, Listenfelder, Kombinationslistenfelder, Optionsschaltflchen, Kontrollkstchen zur Verfgung. Mithilfe von Dialogen knnen Sie anwenderfreundliche Lsungen realisieren, bei denen Sie z.B. Daten erfassen und abfragen knnen. 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) Einfgen 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 fr Schritt erstellen.

506

UserForms entwerfen

13.2 UserForms entwerfen


Im ersten Schritt werden Sie zunchst eine UserForm einfgen und mit Steuerelementen bestcken. Um die erste UserForm einzufgen, verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Whlen Sie aus dem Men EINFGEN den Befehl USERFORM.

Abbildung 13.1: Die erste UserForm einfgen

Standardmig ist die neu eingefgte UserForm recht klein. Diese knnen Sie vergrern, indem Sie mit der linken Maustaste auf die rechte, untere Ecke klicken und die UserForm in der gewnschten Gre nach schrg unten aufziehen. Der Titel fr 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 und schreiben den gewnschten Titel dort hinein. Nachdem Sie die erste UserForm eingefgt haben, wird die Symbolleiste WERKZEUGSAMMLUNG eingeblendet. Diese Werkzeugsammlung nutzen Sie, um den noch leeren Dialog mit Elementen zu fllen. Entnehmen Sie der folgenden Tabelle die wichtigsten Steuerelemente der Symbolleiste WERKZEUGSAMMLUNG.

507

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Symbol

Funktionsbeschreibung ber dieses Symbol wird das entsprechende Element in der UserForm markiert. ber dieses Symbol erfassen Sie Texte in UserForm. ber dieses Symbol fgen Sie Eingabefelder ein. ber dieses Symbol wird ein Kombinationsfeld eingefgt. Mit einem Klick auf das Pfeilsymbol werden Ihnen weitere Auswahlmglichkeiten angeboten. In einem Kombinationsfeld kann immer nur ein Eintrag gewhlt werden. ber dieses Symbol wird ein Listenfeld eingefgt. Das Listenfeld bentigt jedoch mehr Platz in Ihrer UserForm, weil mehrere Eintrge gleichzeitig angezeigt werden. Sind mehr Eintrge im Listenfeld vorhanden, als angezeigt werden knnen, dann wird dynamisch eine vertikale Steuerungsleiste eingebunden. ber dieses Symbol wird ein Rahmen in Ihre UserForm eingefgt. Das Rahmen-Steuerelement knnen 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, eingefgt wird. ber dieses Symbol knnen Sie Kontrollkstchen einfgen. Bei aktiviertem Zustand erscheint im Kstchen ein Hkchen. Wenn Sie Kontrollkstchen in einer Gruppe verwenden, knnen sowohl eines als auch mehrere Kontrollkstchen aktiviert sein. ber dieses Symbol fgen Sie ein Optionsfeld ein. Bei aktiviertem Zustand ist das Optionsfeld mit einem schwarzen Punkt ausgefllt. Wenn Sie mehrere Optionsfelder innerhalb einer Gruppe verwenden, kann immer nur eine Option aktiviert sein. ber dieses Symbol fgen Sie ein Umschaltfeld ein. ber dieses Umschaltfeld knnen Sie beispielsweise zwei Funktionen in nur einem Steuerelement unterbringen (z.B. Gitternetz ein/Gitternetz aus). ber dieses Symbol fgen Sie Befehlsschaltflchen ein, die Sie spter dann mit Makros bestcken.

Tabelle 13.1: Die wichtigsten Steuerelemente fr UserForms

508

UserForms entwerfen

Symbol

Funktionsbeschreibung ber dieses Symbol fgen Sie ein oder mehrere Register in Ihre UserForm ein. Damit knnen Sie Platz sparend viel Information in einer einzigen UserForm unterbringen. ber dieses Symbol werden Scroll-Elemente eingefgt. Dieses Steuerelement verwenden Sie bei greren UserForms, wenn Sie horizontal oder auch vertikal scrollen mssen, um bestimmte Elemente anzuzeigen. ber dieses Symbol fgen Sie ein Drehfeld ein. ber ein Drehfeld knnen Sie beispielsweise Zahlen schrittweise erhhen. Das Steuerelement wird meist in Verbindung mit einem Textfeld verwendet, in dem dann das Ergebnis des Schrittes angezeigt wird. ber dieses Symbol knnen Sie Grafiken, Logos oder Bilder in Ihre UserForm einfgen. ber dieses Symbol knnen Sie ber ein Eingabefeld einen Bereich markieren bzw. auch eigene Texte eingeben und an die UserForm bergeben.

Tabelle 13.1: Die wichtigsten Steuerelemente fr UserForms (Forts.)

Weitere Steuerelemente knnen Sie jederzeit einblenden, indem Sie mit der rechten Maustaste auf die Symbolleiste klicken und aus dem Kontextmen den Befehl ZUSTZLICHE STEUERELEMENTE auswhlen. Im Listenfeld VERFGBARE STEUERELEMENTE knnen Sie dann zustzliche Steuerelemente per Mausklick Ihrer Symbolleiste hinzufgen. Ein Steuerelement knnen Sie in Ihre UserForm einfgen, indem Sie das gewnschte Steuerelement mit der linken Maustaste in der Symbolleiste WERKZEUGSAMMLUNG anklicken und in der gewnschten Gre und Position auf Ihrer UserForm aufziehen. Fgen Sie nun fr die Erfassung der Vokabeln einige Steuerelemente ein. Orientieren Sie sich dabei an der folgenden Abbildung 13.2. Fangen Sie beim Einfgen der Steuerelemente immer mit den Gruppenfeldern (= Steuerelement RAHMEN) an. Danach legen Sie weitere Steuerelemente in das Gruppenfeld hinein.

509

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Abbildung 13.2: Die UserForm zum Erfassen der Vokabeln

Bilder in UserForms einfgen


Um ein Bild in eine UserForm zu integrieren, so wie Sie es in Abbildung 13.2 sehen knnen, gehen Sie wie folgt vor: 1. Klicken Sie in der Symbolleiste WERKZEUGSAMMLUNG auf das Symbol ANZEIGE. 2. Ziehen Sie dieses Steuerelement in der gewnschten Gre auf Ihrer UserForm 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 Feld PICTURE steht. 5. Weisen Sie im Dialogfeld BILD LADEN die gewnschte Bilddatei zu und klicken auf die Schaltflche FFNEN. Das Bild wird nun direkt in die UserForm kopiert. Momentan wird das Bild noch im umrahmten Zustand dargestellt, was in den meisten Fllen nicht sehr schn aussieht. Setzen Sie daher den Mauszeiger im Eigenschaftenfenster in das Feld BORDERSTYLE und whlen aus dem Dropdown den Befehl 0 FMBORDERSTYLENONE.

510

UserForms entwerfen

Horizontale Trennstreifen einfgen


Wenn Sie sich Abbildung 13.2 ansehen, entdecken Sie direkt oberhalb der Schaltflchen einen horizontalen Trennstreifen. Fr diesen optischen Effekt gibt es kein gesondertes Steuerelement. Sie knnen sich aber mit einem Trick behelfen: 1. Klicken Sie in der Symbolleiste WERKZEUGSAMMLUNG auf das Symbol RAHMEN. 2. Ziehen Sie den Rahmen in der gewnschten Gre sowie Position in Ihrer UserForm auf. 3. Im Eigenschaftenfenster setzen Sie den Mauszeiger in das Feld CAPTION und lschen den momentanen Inhalt. 4. Im Eigenschaftenfenster setzen Sie den Mauszeiger in das Feld HEIGHT und legen die Hhe des Rahmens fest. Da es sich um einen horizontalen Trennstreifen handelt, whlen Sie eine Hhe zwischen 8 und 10. Im Eigenschaftenfenster knnen Sie ber das Feld SPECIALEFFECT noch einen speziellen optischen Effekt auswhlen. Dabei knnen Sie unter anderem entscheiden, ob der Trennstreifen hervorgehoben, versenkt oder eingefrst werden soll.

Steuerelemente beschriften
Standardmig wird beim Einfgen der Steuerelemente schon eine Beschriftung vorgegeben, die aber noch gendert werden muss. Um ein Steuerelement wie z.B. eine Schaltflche zu beschriften, gehen Sie nach dem Einfgen des Steuerelements wie folgt vor: 1. Markieren Sie das Steuerelement, das Sie beschriften mchten. 2. Setzen Sie im Eigenschaftenfenster den Mauszeiger in das Feld CAPTION. 3. Erfassen Sie die gewnschte Beschriftung und drcken Sie die Taste ().

Aktivierreihenfolge festlegen
Standardmig werden die einzelnen Steuerelemente nach der Reihenfolge aktiviert, in der Sie in die UserForm eingefgt wurden, d.h. Sie springen ber die Taste () von einem Feld zum anderen. Gerade wenn Sie zu einem spteren

511

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Zeitpunkt neue Steuerelemente hinzufgen, sollten Sie die Reihenfolge anpassen. Dazu whlen Sie den Menbefehl ANSICHT/AKTIVIERREIHENFOLGE. Ist dieser Menbefehl bei Ihnen deaktiviert, dann markieren Sie vorher eines der Textfelder oder Schaltflchen auf der UserForm.

Abbildung 13.3: Die Aktivierreihenfolge ndern

Markieren Sie das entsprechende Element im Listenfeld AKTIVIERREIHENFOLGE und klicken Sie auf die Schaltflche NACH OBEN bzw. NACH UNTEN.

13.3 UserForms programmieren


Nachdem Sie im ersten Schritt die UserForm eingefgt und mit Steuerelementen bestckt haben, knnen Sie nun darangehen, die UserForm zu programmieren. Dabei mssen unter anderem Makros erstellt werden, die die UserForm aufrufen, die eingegebenen Daten in einer Tabelle speichern und die UserForm wieder beenden.

UserForm aufrufen
Um die UserForm einmal zu testen, markieren Sie diese und drcken die Taste (F5). Selbstverstndlich werden Sie die UserForm in Zukunft ber ein Makro starten. Legen Sie das Makro aus Listing 13.1 in einem neuen Modul MODUL1 an.

512

UserForms programmieren

Abbildung 13.4: Der erste Aufruf der UserForm Listing 13.1: Eine UserForm aufrufen Sub UserFormAnzeigen() UserForm1.Show End Sub

Die Methode Show aktiviert die UserForm mit dem Namen USERFORM1. Seit Excel 2000 ist es mglich, Dialoge auch ungebunden aufzurufen; d.h., ungebundene Dialoge mssen nicht beendet werden, um mit anderen Arbeiten in Excel fortzufahren, whrend die UserForm geffnet bleibt. Um eine ungebundene UserForm aufzurufen, setzen Sie die Anweisung UserForm1.Show vbModeless ein.

UserForm beenden
Mit einem Klick auf die Schaltflche ABBRECHEN in der USERFORM1 soll die Userform beendet werden. Zu diesem Zweck mssen Sie den entsprechenden Befehl hinter diese Schaltflche legen. Verfahren Sie hierfr wie folgt: 1. Fhren Sie in Ihrer UserForm einen Doppelklick auf die Schaltflche ABBRECHEN durch. 2. Ergnzen Sie den dadurch erzeugten Programm-Rahmen wie folgt:

513

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Listing 13.2: Eine Userform beenden Private Sub CommandButton1_Click() UserForm1.Hide End Sub

Die Methode Hide blendet die UserForm aus. Damit steht die UserForm aber noch im Speicher fr weitere Aktionen bereit. Mchten Sie die UserForm richtig aus dem Speicher laden, verwenden Sie die Anweisung unload me.

Speichern der eingegebenen Daten


Fr die nchste Funktion, das Speichern der eingegebenen Daten, mssen Sie zunchst eine kleine Vorarbeit erledigen. Sie mssen eine Tabelle anlegen, in die Sie die eingegebenen Vokabeln speichern. Erstellen Sie daher eine Tabelle nach folgendem Aufbau.

Abbildung 13.5: Die noch leere Tabelle fr die Vokabeln

Sie knnen das Makro, um die USERFORM1 aufzurufen, direkt ber eine Schaltflche Ihrer Tabelle VOKABELN starten. Blenden Sie zu diesem Zweck die Symbolleiste FORMULAR ein, klicken auf das Symbol SCHALTFLCHE und ziehen es in der gewnschten Gre und Position in Ihrer Tabelle auf. Danach wird automatisch das Dialogfeld MAKRO ZUWEISEN eingeblendet, in dem Sie das Makro USERFORMANZEIGEN aus dem Listenfeld auswhlen und mit OK besttigen. Nachdem Sie die Tabelle VOKABELN angelegt haben, wechseln Sie in die Entwicklungsumgebung von Excel und klicken auf Ihrer USERFORM1 die Schaltflche OK/ERFASSEN doppelt an. Ergnzen Sie dann das eingestellte Klick-Ereignis wie folgt:

514

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 With End Sub

Bei dem Makro CommandButton2_Click handelt es sich um ein Ereignis, d.h., immer wenn die Schaltflche OK/ERFASSEN geklickt wird, luft obiges Makro ab. Als Erstes wird der Begriff USERFORM1, der ja nicht gerade kurz ist, durch ein Krzel ersetzt. Knftig knnen alle Elemente auf der UserForm krzer und damit auch schneller angesprochen werden. Jetzt wird das Tabellenblatt VOKABELN aktiviert. Mit der Eigenschaft End wird die Position ermittelt, welche die Zelle am Ende der Region darstellt, die den Quellbereich enthlt. Diese Vorgehensweise entspricht dem Drcken der Tastenkombination (Strg) + () auf dem Tabellenblatt. Die Zahl 65.536 steht fr die

515

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

maximale Anzahl Zeilen pro Excel-Tabellenblatt. Innerhalb dieses Bereiches wird nach der zuletzt verwendeten Zelle gesucht und der Zellenzeiger um eine Zeile nach unten (nchste freie Zelle) versetzt. Ist das Krzel frm einmal mit der Anweisung With angegeben, kann es weggelassen werden. In der Eigenschaft Value der Textfelder steht jeweils der vorgenommene Eintrag. Dieser Eintrag wird in die Tabelle bertragen. Dabei wird der Inhalt des ersten Textfeldes in die aktive Zelle bertragen, der Inhalt des zweiten Textfeldes wird eine Zelle weiter nach rechts verschoben eingefgt. Um festzuhalten, um welche Wortart es sich bei dem eingegebenen Wort handelt, verwenden Sie Optionsschaltflchen. Dabei kann jeweils nur eine Option mglich sein. Die Abfrage, welche Optionsschaltflche aktiviert ist, bekommen Sie ber eine If-Then-Else-Anweisung. Fragen Sie dazu die Value-Eigenschaft der ersten Optionsschaltflche ab. Liefert diese den Wert True, ist die Optionsschaltflche aktiviert. In diesem Fall schreiben Sie den Text SUBSTANTIV in die Spalte C, im anderen Fall schreiben Sie je nachdem den Text VERB bzw. ADJEKTIV in die Tabelle. Nach dem Speichern der Vokabel sollten Sie die Texteingabefelder lschen und die angeklickte Option im Gruppenfeld WORTART herausnehmen. Weisen Sie daher der Eigenschaft Value einen leeren Wert zu (Eingabefelder) bzw. den Wert False (Optionsfelder) (siehe Abbildung 13.6).

Vokabeln einfgen
Die Vokabeln sollen nach dem Zufallsprinzip abgefragt werden. Dabei sollen jeweils drei Vokabeln in einem Arbeitsgang abgefragt werden. Entwerfen Sie fr diesen Zweck die USERFORM2 in Abbildung 13.7. Direkt nach dem Aufruf der USERFORM2 sollen die Eingabefelder in der ersten Spalte mit drei zufllig ausgewhlten Vokabeln gefllt werden. Fr diesen Zweck knnen Sie das Ereignis UserForm_Initialize einsetzen, welches automatisch ausgefhrt wird, wenn Sie die UserForm aufrufen. Klicken Sie dazu auf eine freie Stelle Ihrer USERFORM2 und erfassen das folgende Ereignismakro in Listing 13.4 auf S. 518.

516

UserForms programmieren

Abbildung 13.6: Die ersten Eingaben in die Tabelle Vokabeln ber die UserForm eingeben

Abbildung 13.7: Vokabeln abfragen

517

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Listing 13.4: Die Vokabeln nach dem Zufallsprinzip einfgen Option Explicit Dim Trans1 As String Dim Trans2 As String Dim Trans3 As String Private Sub UserForm_Initialize() Dim l As Long Dim AnzVok As Long Dim frm As UserForm Dim Vok1 As String Dim Vok2 As String Dim Vok3 As String AnzVok = _ ThisWorkbook.Sheets("Vokabeln").UsedRange.Rows.Count Set frm = UserForm2 'Textfeld 1 l = Int((AnzVok * Rnd) + 2) Vok1 = Cells(l, 1).Value Trans1 = Cells(l, 2).Value 'Textfeld 3 l = Int((AnzVok * Rnd) + 2) Vok2 = Cells(l, 1).Value Trans2 = Cells(l, 2).Value 'Textfeld 5 l = Int((AnzVok * Rnd) + 2) Vok3 = Cells(l, 1).Value Trans3 = Cells(l, 2).Value With frm .TextBox1.Value = .TextBox1.Enabled .TextBox3.Value = .TextBox3.Enabled .TextBox5.Value = .TextBox5.Enabled End With End Sub

Vok1 = False Vok2 = False Vok3 = False

518

UserForms programmieren

Deklarieren Sie zuerst einmal die Variablen, um die Vokabeln und deren bersetzung speichern zu knnen. Dabei werden die Variablen Trans1 bis Trans3 auerhalb des Ereignisses zu Beginn des Codeblattes deklariert. Diese Variablen bentigen Sie spter noch fr die Prfung Ihrer eingegebenen bersetzungen. Ermitteln Sie im nchsten Schritt die Anzahl der bereits erfassten Vokabeln. Setzen Sie dazu die Eigenschaft UsedRange ein, die Sie auf die Zeilen (= Rows) der Tabelle VOKABELN anwenden. Diese Information bentigen Sie, um anschlieend ber die Anweisung l = Int((AnzVok * Rnd) + 2) eine zufllige Vokabel aus der Tabelle VOKABELN auszuwhlen. ber die Funktion Rnd erzeugen Sie diese Zufallszahl, die der Zeilennummer entspricht. Diese Zufallszahl liegt im Bereich 2 (ab Zeile 2) und der ermittelten grten Zeile, die vorher in der Variablen AnzVok gespeichert wurde. ber die Funktion Int wird diese Zufallszahl als Ganzzahl ausgegeben. Fllen Sie im Anschluss daran die Variablen Vok1 bis Vok3 und Trans1 bis Trans3 mit den ermittelten Vokabeln und deren bersetzung. Setzen Sie fr diese Aufgabe die Eigenschaft Cells ein. Im ersten Argument dieser Eigenschaft geben Sie die Zeile an, aus der die Vokabel bzw. die bersetzung derselben entnommen werden soll. Im zweiten Argument geben Sie die Spalte an. Im Falle der Vokabelfelder ist das die Spalte A, welche Sie ber den Index 1 ansprechen knnen. Im anderen Fall, wenn es sich um die bersetzten Vokabeln handelt, finden Sie diese Informationen in Spalte B der Tabelle VOKABELN. Setzen Sie dafr den Index 2 im zweiten Argument der Eigenschaft Cells ein. Weisen Sie danach den Eingabefeldern die Vokabeln zu und setzen die Eigenschaft Enabled auf den Wert False. Damit knnen diese Felder nicht mehr editiert werden.

Vokabeln prfen
In der nchsten Funktion sollen die Eingaben, die Sie in den Eingabefeldern der zweiten Spalte in der USERFORM2 vorgenommen haben, geprft werden. Haben Sie dabei die abgefragte Vokabel richtig bersetzt, dann wird das jeweilige Kontrollkstchen ganz rechts in der UserForm aktiviert. Um den dafr verantwortlichen Code zu erfassen, fhren Sie in der Entwicklungsumgebung einen Doppelklick auf die Schaltfche PRFEN durch.

519

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Abbildung 13.8: Die Vokabeln ber das Zufallsprinzip anzeigen Listing 13.5: Die eingegebenen Vokabeln berprfen Private Sub CommandButton2_Click() 'Prfen der eingegebenen Vokabeln Dim frm As UserForm Dim 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

520

UserForms programmieren

End With End Sub

Geben Sie ber die Anweisung Set an, welche UserForm Sie programmieren mchten. Sicherheitshalber sollten Sie zu Beginn des Makros alle Kreuze aus den Kontrollkstchen entfernen. Dazu durchlaufen Sie in einer Schleife alle Steuerelemente, die in der UserForm vorhanden sind. ber die Funktion TypeName knnen Sie die Kontrollkstchen in der Userform identifizieren. Diese Steuerelemente melden der Funktion TypeName den Text CheckBox. Achten Sie bei dieser Angabe auf die korrekte Schreibweise. Die Funktion TypeName unterscheidet zwischen Gro- und Kleinschreibung. berprfen Sie danach, ob die eingegebenen bersetzungen der Vokabeln, die Sie direkt aus den Eingabefeldern Textbox2, TextBox4 und Textbox6 bernehmen knnen, mit den vorher bereits ermittelten Inhalten der Variablen Trans1 bis Trans3 bereinstimmen. Um das entsprechende Kontrollkstchen anzukreuzen, setzen Sie die Eigenschaft Value des Kontrollkstchens auf den Wert True.

Abbildung 13.9: Richtig oder falsch?

Anzeigen der nchsten drei Vokabeln


Die nchste Funktion stellt sicher, dass durch einen Klick auf die Schaltflche NCHSTE 3 der USERFORM2 drei neue Vokabeln in der UserForm angezeigt werden.

521

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Fhren Sie zu diesem Zweck in der Entwicklungsumgebung einen Doppelklick auf die Schaltflche NCHSTE 3 durch und erfassen Sie folgendes Ereignismakro:
Listing 13.6: Drei neue Vokabeln einstellen Private Sub CommandButton3_Click() 'nchste 3 Vokabeln anzeigen Dim Cb As Object Dim 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 = False Next Cb End Sub

Bevor Sie die nchsten drei Vokabeln in Ihrer UserForm anzeigen lassen, entfernen Sie die bisherigen Eingaben. Dazu durchlaufen Sie in einer Schleife alle Steuerelemente, die sich auf der UserForm befinden. ber die Funktion TypeName knnen Sie die Textfelder identifizieren und ber die Eigenschaft Value, der Sie eine leere Textfolge zuweisen, lschen. Danach rufen Sie das bereits vorher erfasste Ereignis UserForm_Initialize auf, welches die Vokabeln in die UserForm einfgt und die bersetzung der Vokabeln in Variablen schreibt. Vergessen Sie danach nicht, die Kreuze aus den Kontrollkstchen zu entfernen, wie Sie es bereits im Makro in Listing 13.5 gemacht haben.

522

Fragen & Antworten

13.4 Fragen & Antworten


F

Wie knnen Sie in einer UserForm in einem Listenfeld die Namen aller Tabellenbltter anzeigen lassen?
A

Fgen Sie eine neue UserForm mit einem Listenfeld ein. Erfassen Sie dann das Ereignis UserForm_Initialize, welches automatisch ausgefhrt wird, 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 fgen Sie dem Listenfeld jeweils eine neue Zeile hinzu.

Abbildung 13.10: Eintrge in ein Listenfeld einfgen F

Wie knnen Sie erreichen, dass im soeben erstellten Listenfeld die angeklickte Tabelle aktiviert wird?
A

Erfassen Sie zu diesem Zweck das folgende Ereignismakro:

523

Dialoge entwerfen, mit Steuerelementen bestcken und automatisieren

Listing 13.8: Den ausgewhlten 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 Position des Eintrages innerhalb des Listenfeldes bekommen, knnen Sie nun direkt im Hintergrund das entsprechende Tabellenblatt aktivieren, und im Anschluss daran die UserForm schlieen
F

Wie knnen Sie den Inhalt eines Eingabefeldes markieren?


A

Standardmig wird ein Text in einem Eingabefeld nicht markiert. Wenn Sie beispielsweise beim Aufruf einer UserForm den Inhalt eines Textfeldes markieren mchten, fgen Sie eine neue Userform mit einem Eingabefeld sowie einer Schaltflche ein und erfassen folgendes Ereignismakro, welches Sie direkt hinter die Schaltflche 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 Eingabefeld. Mit der Eigenschaft SelStart bestimmen Sie die Anfangsposition des zu markierenden Textes. Die Eigenschaft SelLength legt die Anzahl der zu markierenden Zeichen fest. Weisen Sie dieser Eigenschaft die Funktion Len zu, die die Gesamtzahl der eingegebenen Zeichen des Eingabefeldes ermittelt.

524

Quiz

Abbildung 13.11: Text markieren durch Klick auf die Schaltflche

13.5 Quiz
F F F F

Wie lautet die Methode, um eine UserForm aufzurufen? ber welche Eigenschaft knnen Sie die Beschriftung von Steuerelementen bestimmen? Wie kann ein Eingabefeld deaktiviert werden? Wie heit das Ereignis, welches beim Starten einer UserForm automatisch ausgefhrt 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 separaten Tabelle BUNG dokumentiert. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.

525

Import und Export ber VBE-Programmierung

4 1

Import und Export ber VBE-Programmierung

Gestern haben Sie gelernt, wie Sie UserForms in Excel erstellen, mit Steuerelementen bestcken und automatisieren knnen. Sie haben dabei Schritt fr Schritt eine Lsung entwickelt, ber die Sie dialoggesteuert Vokabeln lernen knnen. 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 in der 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 von VBA-Makros. Damit knnen Sie Makros dynamisch einfgen und starten lassen. Des Weiteren knnen Sie ganze Module exportieren bzw. importieren sowie Arbeitsmappen von jeglichem Quellcode subern lassen. Diese und weitere Aufgaben werden Sie an diesem Tag kennen lernen.

14.2 Voraussetzung das Einbinden der VBEBibliothek


Um berhaupt die VBE programmieren zu knnen, mssen Sie vorher eine zustzliche Bibliothek in der Entwicklungsumgebung einbinden, welche die dazu ntigen Befehle bereitstellt. Dazu befolgen Sie die nchsten Arbeitsschritte:

528

Voraussetzung das Einbinden der VBE-Bibliothek

1. Wechseln Sie ber die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung von Excel. 2. Whlen Sie aus dem Men EXTRAS den Befehl VERWEISE.

Abbildung 14.1: Die VBE-Bibliothek einbinden

3. Aktivieren Sie im Listenfeld VERFGBARE VERWEISE die Bibliothek MICROSOFT VISUAL BASIC FOR APPLICATION EXTENSIBILTITY 5.3. 4. Besttigen Sie Ihre Einstellung mit OK. Nach dem Einbinden der VBE-Bibliothek knnen Sie ber den vollen Befehlssatz verfgen. brigens gibt es weitere Bibliotheken, die zustzliche VBA-Befehle zur Verfgung stellen. So stellt beispielsweise die Word-Bibliothek Befehle zur Verfgung, die es mglich machen, Ihre Textverarbeitung von Excel aus zu programmieren. Diese und andere Bibliotheken werden aber standardmig nicht eingebunden, um die Performance der Anwendung nicht zu beeintrchtigen. Hier gilt 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 knnen Sie brigens auch durch ein Makro ausfhren lassen. Dabei starten Sie das Makro aus Listing 14.1:

529

Import und Export ber VBE-Programmierung

Listing 14.1: Die VBE-Bibliothek per Code einbinden Sub VBEAktivieren() Dim VBEObj As Object On Error Resume Next VBEObj = Application.VBE.ActiveVBProject.References. _ AddFromGuid("{0002E157-0000-0000-C000-000000000046}", _ 5, 3) End Sub

Die Methode AddFromGuid fgt der REFERENCES-Auflistung einen Verweis hinzu, wobei der global eindeutige Bezeichner (GUID) des Verweises verwendet wird. Die komplette Syntax lautet:
AddFromGuid(GUID, HauptNr, NebenNr) As Reference

Das Argument Guid gibt einen Wert vom Typ String zurck, der die Klassen-ID eines Objekts enthlt. Bei der Guid handelt es sich um eine eindeutige Nummer, welche die Bibliothek identifiziert. Das Argument HauptNr gibt einen Wert vom Typ Long zurck, der die Hauptversionsnummer der Klassenbibliothek, auf die verwiesen wird, enthlt. Das Argument NebenNr gibt einen Wert vom Typ Long zurck, der die Nebenversionsnummer 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 Registrierung, um den hinzuzufgenden Verweis zu ermitteln und einzubinden. Wie aber knnen Sie nun feststellen, welche GUID, HauptNr und NebenNr eine bestimmte Bibliothek hat? Klar ist, dass es eine Mglichkeit geben muss, diese GUID sowie die Haupt- und NebenNr automatisch auszulesen. Das folgende Makro aus Listing 14.2 schreibt alle diese Informationen in eine neue Tabelle. Binden Sie dazu vorher die gewnschten Bibliotheken manuell ein.
Listing 14.2: Alle gesetzten Verweise abfragen Sub VerweiseAbfragen() Dim ref As Reference Dim i As Integer

530

Voraussetzung das Einbinden der VBE-Bibliothek

On Error Resume Next Sheets.Add Range("A1").Select i = 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 + 1 Next ref End Sub

Fgen Sie zunchst eine neue, noch leere Tabelle ein, indem Sie die Methode Add einsetzen. Danach durchlaufen Sie in einer Schleife alle gesetzten Verweise in der Reference-Auflistung. ber die Eigenschaft Name knnen Sie den Namen des Verweises erfahren. Die Eigenschaft Guid gibt einen Wert vom Typ String zurck, der die Klassen-ID eines Objekts enthlt. Bei der Guid handelt es sich um eine eindeutige Nummer, welche die Bibliothek identifiziert. Das Argument Major gibt einen Wert vom Typ Long zurck, der die Hauptversionsnummer der Klassenbibliothek, auf die verwiesen wird, enthlt. Das Argument Minor gibt einen Wert vom Typ Long zurck, der die Nebenversionsnummer der Klassenbibliothek, auf die verwiesen wird, anzeigt.

Abbildung 14.2: Diese Bibliotheken sind derzeit eingebunden.

531

Import und Export ber VBE-Programmierung

Mithilfe dieser Tabelle knnen Sie jede Bibliothek auch ber den Einsatz eines Makros einbinden. Orientieren Sie sich dazu am Makro aus Listing 14.1 und setzen Sie die Argumente aus Abbildung 14.2 ein.

14.3 Weitere Informationen zu Bibliotheken


Um zu sehen, welche Verweise auf Bibliotheken in Ihrer Arbeitsmappe gesetzt sind, wie die Bibliotheken heien und wo diese gespeichert sind, wenden Sie das folgende Makro aus Listing 14.3 an. Dabei schreiben Sie all diese Informationen in das Direktfenster der Entwicklungsumgebung. Bevor Sie das folgende Makro jedoch starten, mssen Anwender ab der Version 2002 vorher noch eine Einstellung in Excel vornehmen. Dabei whlen Sie auf Ihrem Excel-Arbeitsblatt aus dem Men EXTRAS den Befehl MAKRO/SICHERHEIT. Wechseln Sie auf die Registerkarte VERTRAUENSWRDIGE QUELLEN und aktivieren Sie das Kontrollkstchen ZUGRIFF AUF VISUAL BASIC-PPROJEKT VERTRAUEN. Besttigen Sie diese Einstellungen mit OK. Seit der Version Excel 2002 ist es aus Sicherheitsgrnden nicht mehr standardmig mglich, auf Eigenschaften und Methoden des Objektes VBE zuzugreifen. Daher mssen Sie diese Einstellung 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 Verweis End Sub

Durchlaufen Sie in einer Schleife alle gesetzten Verweise in der Entwicklungsumgebung. Mithilfe der Eigenschaft Description knnen Sie den beschreibenden

532

Weitere Informationen zu Bibliotheken

Text der jeweils eingebundenen Bibliothek abfragen. Die Eigenschaft FullPath liefert den Namen des Verzeichnisses zurck, in dem die Bibliothek gespeichert ist. ber die Eigenschaft Name knnen Sie ermitteln, wie die jeweils eingebundene Bibliothek heit. Kontrollieren Sie das Ergebnis, indem Sie in der Entwicklungsumgebung aus dem Men ANSICHT den Befehl DIREKTFENSTER auswhlen.

Abbildung 14.3: Informationen ber die gesetzten Bibliotheken

Anhand dieser Auflistung im Direktfenster knnen Sie Bibliotheken auch ber ihren Namen einbinden bzw. wieder deaktivieren. Im folgenden Beispiel wird die Bibliothek fr die OLE-Automatisierung zuerst eingebunden und danach wieder deaktiviert.
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

533

Import und Export ber VBE-Programmierung

Mit der Methode AddFromFile fgen Sie dem Projekt einen Verweis aus einer Datei hinzu. Dazu muss allerdings der Name der Bibliothek bekannt sein. Diesen knnen Sie im Dialogfeld VERWEISE VBAPROJECT im Men EXTRAS und dem Befehl VERWEISE nachsehen bzw. das Ergebnis des Makros aus Listing 14.3 im Direktfenster kontrollieren. Um die OLE-Bibliothek wieder zu deaktivieren, starten Sie das Makro aus Listing 14.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 deaktivieren. Orientieren Sie sich dabei am Ergebnis des Makros aus Listing 14.3 im Direktfenster. Dort knnen Sie den genauen Namen (STDOLE) der OLE-Bibliothek erfahren.

14.4 VBE-Bibliothek deaktivieren


Analog zum Makro aus Listing 14.1 knnen Sie den Verweis auf die VBE-Bibliothek auch wieder entfernen, indem Sie das Makro aus Listing 14.6 starten. Damit beseitigen Sie unntigen 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

Objekte, Methoden und Eigenschaften der VBE

ber die Methode Remove entfernen Sie den Verweis auf die eingebundene Bibliothek aus der aktiven Arbeitsmappe. Geben Sie dabei den Namen der VBE-Bibliothek an.

14.5 Objekte, Methoden und Eigenschaften der VBE


Nachdem Sie die VBE-Bibliothek eingebunden haben, sollten Sie erst einmal einen Blick auf die verfgbaren Objekte, Methoden und Eigenschaften dieser Bibliothek werfen. Dazu wechseln Sie in die Entwicklungsumgebung und drcken die Taste (F2), um den Objektkatalog zu starten.

Abbildung 14.4: Der Befehlssatz der Bibliothek VBE

535

Import und Export ber VBE-Programmierung

14.6 Typische Aufgaben mit der VBE erledigen


Nachdem Sie die Voraussetzung fr die Programmierung in und mit der VBE hergestellt haben, indem Sie die VBE-Bibliothek eingebunden sowie Informationen zu Bibliotheken erhalten haben, gehen Sie jetzt daran, typische Aufgaben fr die Praxis zu lsen.

Arbeitsmappe mit Quellcode bestcken


Wenn Sie Makros in den Codebereich Ihrer Entwicklungsumgebung schreiben, so stellt dies den normalen Vorgang in der Programmierung dar. Stellen Sie sich jedoch vor, Sie mssten mehrere Arbeitsmappen mit demselben Code versorgen. Haben Sie da Lust, die Makros fr jede Arbeitsmappe neu zu erfassen bzw. hineinzukopieren? Fr diesen Zweck gibt es eine Mglichkeit des Imports von Quellcode. Dieser Quellcode wird erst in einer Textdatei geschrieben und anschlieend in die gewnschte Arbeitsmappe per Makro eingelesen. Fr die nchste Aufgabe kopieren Sie einmal ein Makro in eine Textdatei und speichern diese im Verzeichnis C:\Eigene Dateien unter dem Namen Code.txt.

Abbildung 14.5: Alle Formeln sollen in einer Textdatei dokumentiert werden.

Im Makro FormelnDokumentieren wird eine Textdatei mithilfe der Methode Open geffnet. Sollte die Textdatei zu diesem Zeitpunkt noch nicht existieren, dann wird diese selbststndig angelegt. In einer anschlieenden Schleife wird jede belegte Zelle der aktiven Tabelle durchlaufen. Innerhalb der Schleife findet eine berprfung statt, ob die jeweilige Zelle eine Formel enthlt. Wenn ja, dann wird

536

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 ModulNeu anlegt und danach den Inhalt der Textdatei Code.txt hineinkopiert.
Listing 14.7: Neues Modul anlegen und Code importieren Sub MakroAusTextdateiImportieren() Dim VBKomp As VBComponent Dim CodeModul As CodeModule Const 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 With End Sub

Legen Sie zu Beginn des Makros den Namen sowie den Pfad der Textdatei in einer Konstanten fest, in der der Quellcode gespeichert ist. Um einer Arbeitsmappe ein neues, noch leeres Modul hinzuzufgen, setzen Sie die Methode Add ein. Die Methode Add verwendet die Konstante vbext_ct_StdModule, welche ein normales Modul reprsentiert. Selbstverstndlich knnen Sie ebenso Klassenmodule und UserForms ber diese Methode in Ihr Projekt einfgen. Entnehmen Sie dazu die notwendigen Konstanten der folgenden Tabelle 14.1.

537

Import und Export ber VBE-Programmierung

Konstante
vbext_ct_ClassModule vbext_ct_MSForm vbext_ct_StdModule

Erklrung Fgt der Auflistung ein Klassenmodul hinzu. Fgt der Auflistung ein Formular hinzu. Fgt der Auflistung ein Standardmodul hinzu.

Tabelle 14.1: Die Konstanten der Methode Add

Geben Sie im zweiten Schritt an, in welches Modul Sie den Inhalt der Textdatei Code.txt transferieren mchten. Verwenden Sie dazu die Anweisung Set und geben den Namen des neu eingefgten Moduls an. Wenden Sie danach die Methode AddFromFile an, um den Inhalt der Textdatei in das Modul einzufgen.

Abbildung 14.6: Das neue Modul wurde angelegt und der Quellcode importiert.

Gehen wir jetzt einen Schritt weiter und berfhren den Inhalt der Textdatei Code.txt in alle geffneten Arbeitsmappen. Den Code fr diese Aufgabe knnen Sie in Listing 14.8 sehen:
Listing 14.8: Alle geffneten Mappen mit Quellcode versorgen Sub TextdateiInAlleArbeitsmappenEinlesen() Dim Mappe As Workbook Dim VBKomp As VBComponent Const ImportDatei = "C:\Eigene Dateien\Code.txt" For Each Mappe In Application.Workbooks

538

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 _ ImportDatei Next Mappe End Sub

Durchlaufen Sie in einer Schleife alle geffneten Arbeitsmappen. Innerhalb dieser Arbeitsmappen legen Sie ber die Methode Add ein neues, noch leeres Modul an. Anschlieend fgen Sie mithilfe der Methode AddFromFile den Inhalt der Textdatei in die neu angelegten Module ein.

Abbildung 14.7: Alle geffneten Mappen wurden mit dem Modul ModulNeu2 versorgt.

Fr etwas kleinere Makros knnen Sie Quellcode auch direkt in das Modul schreiben und anschlieend starten. Im folgenden Makro aus Listing 14.9 werden die Namen der in der Arbeitsmappe enthaltenen Tabellen im Direktfenster verzeichnet.

539

Import und Export ber VBE-Programmierung

Listing 14.9: Ein Makro Zeile fr Zeile erfassen Sub MakroZeilenHinzufgen() Dim CodeModul As CodeModule Dim 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 With End Sub

Im Makro aus Listing 14.9 wird Zeile um Zeile bertragen. Die Eigenschaft Count OfLines ermittelt, wie viele Codezeilen im Modul bereits enthalten sind, und addiert den Wert 1 darauf. Diese Manahme ist notwendig, um eventuell bereits bestehende Makros nicht zu berschreiben. ber die Methode InsertLines fgen Sie die einzelnen Zeilen im Modul ein. Der Funktionsaufruf Chr(13) im obigen Listing sorgt jeweils fr den Zeilenvorschub.

Quellcode sichern ber den Export


Sehr wichtig ist es ab und zu, seinen VBA-Code in Textdateien zu sichern. Da die Gefahr von Viren sehr gro ist, die Ihre Makros vernichten knnen, ist diese Manahme zu empfehlen. Dabei sichern Sie Ihren Quellcode in Textdateien. Standardmig knnen Sie diese Aufgabe manuell durchfhren, indem Sie das entsprechende Modul, welches Sie sichern mchten, im Projekt-Explorer mit der rechten Maustaste anklicken und aus dem Kontextmen den Befehl DATEI EXPORTIEREN anklicken.

540

Typische Aufgaben mit der VBE erledigen

Abbildung 14.8: Das neue Makro wird unterhalb des letzten Makros in Modul1 eingefgt.

Abbildung 14.9: Einzelne Module per Hand sichern

Im Dialogfeld DATEI EXPORTIEREN whlen Sie das gewnschte Verzeichnis aus, geben der Sicherung einen Namen und besttigen mit einem Klick auf die Schaltflche SPEICHERN. Diesen Vorgang knnen Sie selbstverstndlich auch vollautomatisch ber ein Makro durchfhren, wie Sie es in Listing 14.10 sehen knnen.

541

Import und Export ber VBE-Programmierung

Listing 14.10: Den Quellcode in einer Textdatei sichern Sub ModulInTextdateiSichern() Dim VBKomp As Object Const ExportDatei = "C:\Eigene Dateien\Sicherung.txt" On Error Resume Next Set VBKomp = _ ThisWorkbook.VBProject.VBComponents("Modul1") With VBKomp .Export ExportDatei End With End Sub

Legen Sie ber die Anweisung Set fest, welches Modul gesichert werden soll. Mit der Methode Export sichern Sie eine Komponente als Textdatei. Dabei geben Sie den Namen sowie den Pfad der Textdatei an, in die Ihr Quellcode exportiert werden soll. Sollte diese Datei noch nicht existieren, dann wird diese angelegt.

Abbildung 14.10: Alle Makros aus Modul1 wurden erfolgreich gesichert.

542

Typische Aufgaben mit der VBE erledigen

Module ausdrucken
Auch eine Art von Sicherung bietet der Ausdruck der Makros. Dazu knnen Sie manuell im Projekt-Explorer das gewnschte Modul mit der rechten Maustaste anklicken und aus dem Kontextmen den Befehl DRUCKEN auswhlen. Per Makro gehen Sie hierzu einen kleinen Umweg. Speichern Sie das gewnschte Modul zuerst in einer Textdatei, lesen diese in eine normale Excel-Tabelle ein, stellen die bevorzugte Schriftart sowie Schriftgre ein und drucken die Makros aus. Das Makro fr 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 gewnschte Modul in einer Textdatei zu sichern. Danach ffnen Sie die Textdatei, indem Sie die Methode OpenText einsetzen. Jetzt befinden sich alle Makros in einer Tabelle. Diese Tabelle formatieren Sie nun, indem Sie die gewnschte Schriftart sowie Schriftgre einstellen. Dazu verwenden Sie die Eigenschaften Name und Size, die Sie auf das Font-Objekt anwenden. Drucken Sie die Tabelle danach ber die Methode PrintOut aus. Nach dem Ausdruck setzen Sie die Eigenschaft Display Alerts auf den Wert False, um beim Schlieen der Textdatei keine Rckfrage von Excel zuzulassen. ber die Anweisung Kill knnen Sie die Textdatei daraufhin lschen. Setzen Sie am Ende des Makros die Eigenschaft DisplayAlerts auf den Wert True, um Standardmeldungen in Excel wieder zuzulassen.

543

Import und Export ber VBE-Programmierung

Abbildung 14.11: Die Tabelle kurz vor dem Ausdruck

Arbeitsmappen von Modulen befreien


Wenn Sie bereits vorhandene Module in einer Arbeitsmappe lschen mchten, um beispielsweise einem Kunden eine von Quellcode bereinigte Arbeitsmappe zur Verfgung zu stellen, dann starten Sie das Makro aus Listing 14.12.
Listing 14.12: Ein bestimmtes Modul lschen Sub LschenModul() On Error Resume Next With ActiveWorkbook.VBProject .VBComponents.Remove .VBComponents("ModulNeu") End With End Sub

Mit der Methode Remove knnen Sie ein bestimmtes Modul lschen. Die On Error-Anweisung verhindert einen Makroabsturz, wenn das Modul nicht gefunden werden kann, weil es eventuell bereits gelscht wurde bzw. gar nicht existiert.

544

Typische Aufgaben mit der VBE erledigen

Wenn es darum geht, alle Module einer Arbeitsmappe zu entfernen, dann knnen Sie das Makro aus Listing 14.13 einsetzen:
Listing 14.13: Alle Module aus einer Arbeitsmappe entfernen Sub ModuleLschen() Dim VBKomp As VBComponent With Application.VBE.ActiveVBProject For Each VBKomp In .VBComponents If VBKomp.Type = 1 Then .VBComponents.Remove VBKomp Next VBKomp End With End 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, ein Klassenmodul oder eine UserForm handelt. Im Falle eines Moduls meldet diese Eigenschaft den Wert 1 zurck. Entfernen Sie in diesem Fall das entsprechende Modul mithilfe der Methode Remove.

Ein bestimmtes Makro entfernen


Einen Schritt weiter geht die nchste Aufgabe. In dieser Aufgabe soll aus einem bestimmten Modul ein Makro entfernt werden. Das Problem bei dieser Aufgabe ist, dass Sie dieses eine Makro unter den vielen anderen erst einmal finden mssen. In der folgenden Aufgabe soll das Makro TabellenListen im MODUL1 gefunden und gelscht werden. Die Lsung dieser Aufgabenstellung knnen Sie im folgenden Makro aus Listing 14.14 sehen.
Listing 14.14: Ein bestimmtes Makro finden und lschen Sub Dim Dim Dim MakroLschen() VBCodeModul As CodeModule i As Long e As Long

Set VBCodeModul = _ ThisWorkbook.VBProject.VBComponents("Modul1").CodeModule

545

Import und Export ber VBE-Programmierung

With VBCodeModul i = .ProcStartLine("TabellenListen", vbext_pk_Proc) e = .ProcCountLines("TabellenListen", vbext_pk_Proc) .DeleteLines i, e End With End Sub

Geben Sie im ersten Schritt des Makros ber die Anweisung Set an, in welchem Modul sich das zu lschende Makro befindet. Danach ermitteln Sie ber die Methode ProcStartLine, an welcher Stelle das gesuchte Makro beginnt. Dabei bergeben Sie dieser Methode den Namen des Makros, welches Sie finden mchten. Im zweiten Argument legen Sie die Art der zu suchenden Prozedur fest. Da Eigenschaftenprozeduren mehrere Darstellungen im Modul haben knnen, mssen Sie die Art der zu suchenden Prozedur festlegen. Alle Prozeduren verwenden die Konstante vbext_pk_Proc. Die Methode ProcStartLine gibt die Zeilennummer in einer Integer-Variablen zurck. Damit haben Sie die genaue Startposition des zu lschenden Makros. Was jetzt noch fehlt, ist das Ende des zu lschenden Makros. Diese Zeilenposition knnen Sie mithilfe der Methode ProcCountLines ermitteln, der Sie wie schon vorher, den Namen des zu lschenden Makros bergeben und ber die Konstante vbext_pk_Proc dafr sorgen, dass nach Prozeduren gesucht werden soll. Entfernen Sie im nchsten Schritt die ermittelten Zeilen, indem Sie der Methode
DeleteLines die gerade eben ermittelten Positionen der Start- sowie Endezeile des

zu lschenden Makros bergeben.

Ein Ereignis lschen


Sie wissen jetzt, wie Sie Module und einzelne Makros lschen, die in Modulen untergebracht sind. Was aber machen Sie, wenn Sie beispielsweise Ereignisse entfernen mchten, 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 gelscht Sub EntfernenEreignisse() With ActiveWorkbook.VBProject.VBComponents("Tabelle1").CodeModule .DeleteLines 1, .CountOfLines End With End Sub

546

Typische Aufgaben mit der VBE erledigen

Da auch einzelne Tabellen in der Eigenschaft VBComponents verzeichnet sind, knnen Sie diese auch gezielt ansprechen. Mithilfe der Methode DeleteLines entfernen Sie alle Ereignisse, die sich hinter der TABELLE1 befinden. bergeben Sie dieser Methode als Argumente die Startzeile (= 1) sowie die Anzahl der Zeilen, die hinter dieser Tabelle erfasst wurden. Diese Information knnen Sie ber die Eigenschaft CountOfLines ermitteln. Auf eine ganz hnliche Weise knnen Sie brigens auch dynamisch Ereignisse hinter einzelne Tabellen legen. Das Makro aus Listing 14.16 stellt 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 ""Zellennderung durchgefhrt in Zelle: "" & _ Target.Address" & Chr(13) & _ "End Sub" End With End Sub

Geben Sie im ersten Schritt ber die Anweisung Set an, hinter welche Tabelle das Ereignis Worksheet_Change eingefgt werden soll. Danach setzen Sie die Methode InsertLines ein, um den Quellcode einzufgen. Dabei bergeben Sie dieser Methode zwei Argumente. Im ersten Argument legen Sie die Startzeile fest, ab der der Quellcode eingefgt werden soll. Im zweiten Argument bertragen Sie das Ereignis Zeile fr Zeile.

Abbildung 14.12: Das Ereignis wurde per Makro eingestellt.

547

Import und Export ber VBE-Programmierung

VBE aufrufen
Standardmig drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu wechseln. Diesen Vorgang knnen Sie aber auch ber ein Makro durchfhren. Dieses Makro knnen Sie dann beispielsweise einer Schaltflche in einer Excel-Tabelle zuweisen und somit mit einem Klick in die Entwicklungsumgebung wechseln.
Listing 14.17: Die Entwicklungsumgebung per Makro aufrufen Sub VBEEditorAufrufen() With Application.VBE.MainWindow .SetFocus .Visible = True End With End Sub

Die Eigenschaft MainWindow gibt ein Window-Objekt zurck, das das Hauptfenster der Entwicklungsumgebung von Visual Basic darstellt. ber die Methode SetFocus wird der Fokus auf das Entwicklungsfenster verschoben, d.h. alle folgenden Aktionen werden danach in diesem Fenster durchgefhrt. Mithilfe der Eigenschaft Visible machen Sie das Entwicklungsfenster sichtbar, indem Sie diese Eigenschaft auf den Wert True setzen.

14.7 Fragen & Antworten


F

Wie knnen Sie eine UserForm aus einer Arbeitsmappe entfernen?


A

Eine UserForm stellt wie auch ein Modul oder ein Klassenmodul eine VBE-Komponente dar, die Sie gezielt ansprechen und somit auch entfernen knnen. Das folgende Makro aus Listing 14.18 entfernt die USERFORM1 aus der aktiven Arbeitsmappe.
Listing 14.18: Eine UserForm lschen Sub UserformLschen() With Workbooks(ActiveWorkbook.Name).VBProject .VBComponents.Remove.VBComponents("Userform1") End With End Sub

548

Fragen & Antworten

Wie kann ich die einzelnen VBE-Komponenten in einer Arbeitsmappe identifizieren?


A

Jede einzelne VBE-Komponente kann ber ihren Typ bestimmt werden. Im folgenden Makro aus Listing 14.19 werden alle in der Arbeitsmappe vorhandenen 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 VBKomp End Sub

Durchlaufen Sie in einer Schleife alle VBE-Komponenten der Arbeitsmappe und geben Sie die Namen der Komponenten ber die Eigenschaft Name sowie den Typ der Komponente ber die Eigenschaft Type mithilfe der Anweisung Debug.Print im Direktfenster der Entwicklungsumgebung aus.

Abbildung 14.13: Name und Typ der einzelnen VBE-Komponenten ausgeben

549

Import und Export ber VBE-Programmierung

Wie knnen Sie Ereignisse aus einer Arbeitsmappe entfernen, welche im ProjektExplorer hinter dem Eintrag DieseArbeitsmappe hinterlegt sind?
A

Sie knnen 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, .CountOfLines End With End Sub

Geben Sie als VBE-Komponente direkt den Namen DieseArbeitsmappe an, um Zugriff auf die dort eventuell eingefgten Ereignisse zu bekommen. Danach wenden Sie die Methode DeleteLines an, um die Ereignisse zu entfernen. bergeben Sie dieser Methode als Argumente die Startzeile (= 1) sowie die Anzahl der Zeilen, die hinter diesem Eintrag erfasst wurden. Diese Information knnen Sie ber die Eigenschaft CountOfLines ermitteln.

14.8 Quiz
F F F F

ber welche Eigenschaft knnen Sie den Namen sowie den Pfad eines Verweises herausfinden? Wie lautet die Methode, um eine Textdatei in ein VBA-Modul einzulesen? Schreiben Sie ein Makro, welches die beiden Module ModulNeu und ModulNeu2 aus der Arbeitsmappe entfernt. Erfassen Sie ein Makro, welches alle Module einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung ausgibt.

550

bung

14.9 bung
Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe VBE.xls und schreiben ein Makro, das alle Makros aus allen Modulen einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung auflistet. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.

551

Lsungen der Tages-bungen

Lsungen der Tages-bungen

Tag 1
Aufgabe In einer Tabelle sollen die Nullwerte nicht angezeigt werden. Auerdem sollen die Gitternetzlinien sowie die Spalten- und Zeilenbeschriftungen im Ausdruck mit ausgedruckt werden. Lsen Sie diese Aufgabe mit Hilfe des Makrorekorders und entfernen Sie danach aus der Aufzeichnung die nicht bentigten Zeilen. Sehen Sie sich jedoch vorab einmal die Ausgangssituation an. Lsung Die Einstellungen fr den Ausdruck des Gitternetzes sowie der Spalten- und Zeilenbeschriftungen der Tabelle finden Sie im Men DATEI unter dem Befehl SEITE EINRICHTEN auf der Registerkarte TABELLE. Die Ansicht der Nullwerte knnen Sie im Men EXTRAS mithilfe des Befehls OPTIONEN auf der Registerkarte ANSICHT ein- bzw. ausblenden. Fhren Sie diese beiden einzelnen Schritte nacheinander durch und aktivieren vorher den Makrorekorder. Entfernen Sie aus der Aufzeichnung die nicht bentigten Zeilen. Als Ergebnis erhalten Sie dann folgendes Makro:
Listing A.1: Gitternetz sowie Zeilen- und Spaltenbeschriftungen vor dem Druck einstellen und Nullwerte ausblenden Sub Makro4() ' ' Makro4 Makro ' Makro am 24.08.2003 von Bernd Held aufgezeichnet ' With ActiveSheet.PageSetup .PrintHeadings = True .PrintGridlines = True End With ActiveWindow.DisplayZeros = False End Sub

Setzen Sie die Eigenschaften PrintHeadings und PrintGridlines auf den Wert True.

554

Tag 2

Tag 2
Aufgabe Die Namen der Tabellen einer Arbeitsmappe sollen auf der ersten Tabelle dieser Arbeitsmappe in Spalte A eingefgt werden. Lsen Sie diese Aufgabenstellung mithilfe einer For Each Next Schleife. Lsung Um die Namen alle Tabellen einer Arbeitsmappe auf der ersten Tabelle in Spalte A auszugeben, erfassen Sie folgendes Makro:
Listing A.2: Alle Tabellennamen in erste Tabelle schreiben Sub bung01() Dim Tabelle As Worksheet Sheets("Tabelle1").Activate Range("A1").Select For Each Tabelle In ActiveWorkbook.Worksheets ActiveCell.Value = Tabelle.Name ActiveCell.Offset(1, 0).Select Next Tabelle End Sub

Durch die Worksheets-Auflistung gewinnen Sie Zugriff auf alle in der aktiven Arbeitsmappe befindlichen Tabellenbltter. Die Namen dieser Tabellen knnen Sie ber die Eigenschaft Name abfragen und in die Tabelle schreiben.

Tag 3
Aufgabe berprfen Sie, ob das Add-In Solver bereits geladen ist.

555

Lsungen der Tages-bungen

Lsung Um zu ermitteln, ob das Add-In Solver bereits im Add-In-Manager eingebunden ist, starten Sie folgendes Makro:
Listing A.3: Add-In Prfung Sub AddInsPrfung() Dim AddI As AddIn Dim b As Boolean b = False For Each AddI In Application.AddIns If AddI.Name = "Solver" And AddI.Installed = True Then b = True Next If 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 Eigenschaft Installed knnen Sie prfen, ob ein bestimmtes Add-In bereits im Add-InManager eingebunden wurde.

Tag 4
Aufgabe Programmieren Sie ein Makro, welches alle Arbeitsmappen aus einem bestimmten Verzeichnis ffnet, das aktuelle Datum in Zelle A1 der ersten Tabelle schreibt und diese Arbeitsmappen speichert und schliet. Lsung Starten Sie das folgende Makro:
Listing A.4: Alle Mappen eines Verzeichnisses ffnen und manipulieren Sub ArbeitsmappenffnenUndBearbeiten() Dim Mappe As String Const Lw = "C:\" Const Pfad = "C:\Eigene Dateien\"

556

Tag 5

ChDrive Lw ChDir 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 = Dir Loop End Sub

Bevor Sie die Arbeitsmappen nacheinander ffnen knnen, mssen Sie sicherstellen, dass das richtige Laufwerk sowie das gewnschte Verzeichnis eingestellt ist. Erst dann ermitteln Sie die Arbeitsmappen mithilfe der Funktion Dir, der Sie als Endung *.xls angeben. ffnen Sie danach die einzelnen Arbeitsmappen und schreiben in die erste Tabelle einer jeden Mappe in Zelle A1 das aktuelle Datum. Beim Schlieen der Arbeitsmappen speichern Sie diese Anpassung.

Tag 5
Aufgabe 1 Legen Sie eine neue Arbeitsmappe an und fgen darin genau 12 Tabellen ein, die Sie nach Monatsnamen benennen. Lsung Erfassen Sie folgendes Makro:
Listing A.5: Benannte Tabellen einfgen Sub TabellenEinfgenMitMonatsnamen() Dim i As Integer Workbooks.Add For i = 1 To 12 Worksheets.Add Before:=Worksheets(Worksheets.Count)

557

Lsungen der Tages-bungen

ActiveSheet.Name = MonthName(i) Next i End Sub

ber die Methode Add knnen Sie eine neue Arbeitsmappe anlegen. Danach wenden Sie wiederum die Methode Add an, um die einzelnen Tabellen einzufgen. Benennen Sie die eingefgten Tabellen, indem Sie die Eigenschaft Name verwenden. ber die Funktion MonthName knnen Sie die Monatsnamen (Januar bis Dezember) ermitteln. Aufgabe 2 Entfernen Sie aus einer Tabelle alle Formeln, und zwar so, dass daraus Festwerte werden. Lsung Geben Sie folgendes Makro ein:
Listing A.6: Alle Formelzellen aus Tabelle durch Festwerte ersetzen Sub FormelnAusTabelleEntfernen() Dim zelle As Range Sheets("Deckungsbeitrag").Activate Selection.SpecialCells(xlCellTypeFormulas).Select For Each zelle In Selection zelle.Value = zelle.Value Next zelle End Sub

Wenden Sie die Methode SpecialCells an, der Sie die Konstante xlCellTypeFormulas zuweisen. Damit werden alle Formelzellen in der aktiven Tabelle markiert. Diese Zellen stehen jetzt alle in der Auflistung Selection. Durchlaufen Sie im Anschluss daran alle Zellen innerhalb der Markierung und berschreiben die Formeln, indem Sie die Eigenschaft Value einsetzen.

558

Tag 6

Tag 6
Aufgabe 1 Erstellen Sie eine neue Tabelle und fgen dort im Bereich A1:D20 einige Zahlenwerte ein. Ihre Aufgabe besteht nun darin, alle Zellen zu kennzeichnen, die einen Wert grer als 500 aufweisen. Frben Sie diese Zellen mit der Hintergrundfarbe GELB. Lsung
Listing A.7: Alle Zellen > 500 werden gelb eingefrbt Erfassen Sie das folgende Makro: Sub ZellenInBereichFrben() Dim Bereich As Range Dim Zelle As Range Sheets("Tabelle14").Activate Set Bereich = Range("A1:D20") For Each Zelle In Bereich If Zelle.Value > 500 Then Zelle.Interior.ColorIndex = 6 Next Zelle End Sub

Aktivieren Sie im ersten Schritt die gewnschte Tabelle und legen den Bereich fest, indem Sie bestimmte Zellen frben mchten. In einer anschlieenden Schleife durchlaufen Sie alle Zellen, die innerhalb des definierten Bereichs liegen. Innerhalb der Schleife prfen Sie, ob der Zellwert (= Value) grer als 500 ist. Wenn ja, dann frben Sie den Hintergrund der Zelle (= Interior) mithilfe der Eigenschaft ColorIndex, der Sie den Wert 6 zuweisen. Aufgabe 2 Listen Sie die Zellenadressen aller verwendeten Namen einer Arbeitsmappe in einem Meldungsfenster auf. Lsung Erfassen Sie folgendes Makro:

559

Lsungen der Tages-bungen

Listing A.8: Alle Zellenadressen von Namen ermitteln und ausgeben Sub AlleNamenInMappeAuflisten() Dim BenannteBereiche As Object Dim s As String For Each BenannteBereiche In ActiveWorkbook.Names s = s & BenannteBereiche & Chr(13) Next MsgBox "Die Adressen der verwendeten Namen lauten: " & Chr(13) & s End Sub

In der Auflistung Names sind alle verwendeten Namen der aktiven Arbeitsmappe verzeichnet. ber die Objektvariable BenannteBereiche knnen Sie diese jetzt auslesen und am Ende des Makros in einer Bildschirmmeldung ausgeben. Aufgabe 3 Dokumentieren Sie alle verwendeten Namen einer Arbeitsmappe, indem Sie eine neue Tabelle einfgen und den Namen und dessen Zellenadresse ausgeben. Lsung 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 Next End Sub

In dieser Lsung werden die eingesetzten Namen einer Arbeitsmappe dokumentiert. Dabei wird jeweils der Name des Namens sowie dessen Zellenadresse ausgegeben.

560

Tag 6

Aufgabe 4 Lschen Sie alle Gltigkeitsfestlegungen aus einer Tabelle. Lsung Erfassen Sie folgendes Makro:
Listing A.10: Alle Gltigkeiten aus einer Tabelle entfernen Sub GltigkeitLschen() ActiveCell.SpecialCells(xlCellTypeSameValidation).Select Selection.Validation.Delete End Sub

ber die Methode SpecialCells, der Sie die Konstante xlCellTypeSameValidation zuweisen, knnen Sie alle Zellen, die eine Gltigkeitsregel beinhalten, ermitteln. ber die Methode Select markieren Sie diese Zellen. Entfernen Sie die Gltigkeitsregeln, indem Sie die Methode Delete anwenden. Aufgabe 5 Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte. Lsung Starten Sie das folgende Makro:
Listing A.11: Formeln in Festwerte wandeln Sub FormelnInFestwerteWandeln() Dim Zelle As Range Sheets("Tabelle3").Activate ActiveCell.SpecialCells(xlCellTypeFormula).Select For Each Zelle In Selection Zelle.Value = Zelle.Value Next Zelle End Sub

ber die Methode SpecialCells, der Sie die Konstante xlCellTypeFormula zuweisen, knnen Sie alle Zellen, die eine Formel beinhalten, ermitteln. ber die Methode Select markieren Sie diese Zellen. Durchlaufen Sie anschlieend alle Zellen innerhalb der Markierung und berschreiben die Formeln mit Festwerten.

561

Lsungen der Tages-bungen

Tag 7
Aufgabe 1 Stellen Sie sicher, dass beim Aktivieren einer bestimmten Tabelle die Neuberechnung ausgelst wird. Lsung Fr diese Aufgabe setzen Sie das Ereignis Activate ein, das Sie im folgenden Listing sehen.
Listing A.12: Die Neuberechnung einer Tabelle beim Aktivieren der Tabelle sicherstellen Private Sub Worksheet_Activate() Application.Calculation = xlAutomatic End Sub

Weisen Sie der Eigenschaft Calculation die Konstante xlAutomatic zu. Damit wird die Tabelle neu berechnet. Aufgabe 2 Wie muss das Ereignis lauten, wenn Sie vor dem Speichern einer Arbeitsmappe in der ersten Tabelle der Arbeitsmappe das aktuelle Tagesdatum erfassen mchten? Lsung Das Ereignis heit WorkBook_BeforeSave, welches im folgenden Listing angezeigt wird.
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 die erste Tabelle der Arbeitsmappe, in der dieser Code gespeichert ist. ber die Funktion Date ermitteln Sie das aktuelle Tagesdatum, das Sie der Zelle A1 zuweisen.

562

Tag 7

Aufgabe 3 Ihre Aufgabe besteht nun darin, auf einer bestimmten Tabelle die beiden Maustasten zu programmieren. Fr den Bereich A1:E15 sollen dabei folgende Vorgnge ablaufen:

Klicken mit der rechten Maus: Addieren der Zelle um den Wert 10 Doppelklick mit der linken Maus: Subtrahieren der Zelle mit 10

Lsung 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 Sub Target.Value = Target.Value 10 Cancel = True End 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 Sub Target.Value = Target.Value + 10 Cancel = True End Sub

Bevor Sie die Rechenoperationen durchfhren, mssen Sie prfen, ob die angeklickten Zellen auch im definierten Bereich liegen. Dazu verwenden Sie die Methode Intersect. Liegt die angeklickte Zelle, die im Argument Target verzeichnet ist, im definierten Bereich, dann wird ein Range-Objekt zurckgegeben. In diesem Fall liegt die angeklickte Zelle im definierten Bereich. Andernfalls liefert diese Methode den Wert Nothing zurck.

563

Lsungen der Tages-bungen

Tag 8
Aufgabe 1 Formatieren Sie die Pivot-Tabelle auf TABELLE1 mit einem AutoFormat. Lsung 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 With End Sub

In der Auflistung PivotTables sind alle Pivot-Tabellen der Tabelle verzeichnet. Der Index 1 bedeutet, dass die zuerst eingefgte Pivot-Tabelle angesprochen werden soll. ber die Methode AutoFormat knnen Sie mittels einer Formatkonstanten ein gewnschtes Format zuweisen. Wie die einzelnen Konstanten heien, knnen Sie brigens feststellen, indem Sie die Online-Hilfe zu dieser Methode aufrufen. Aufgabe 2 Erstellen Sie ein Zylinderdiagramm auf Basis der Tabelle BUNGEN. Fgen Sie das Diagramm als separates Diagrammblatt ein. Lsung Erfassen Sie das Makro aus Listing 16:
Listing A.16: Ein Zylinderdiagramm einfgen Sub bungZylinder() Dim Bereich As Range Dim s As String Sheets("bung").Activate

564

Tag 9

Set Bereich = Range("B3:E7") s = ActiveSheet.Name Charts.Add With ActiveChart .ApplyCustomType _ ChartType:=xlCylinderColClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlRows End With End Sub

Legen Sie im ersten Schritt den Bereich fest, auf dem basierend Sie Ihr Diagramm erstellen mchten. Danach wenden Sie die Methode Add an, um ein neues Diagramm einzufgen. Geben Sie im nchsten Schritt an, welchen Diagrammtyp Sie einsetzen mchten. Dazu weisen Sie der Eigenschaft ChartType die gewnschte Diagrammkonstante zu. ber die Methode SetSourceData weisen Sie dem Diagramm nun den vorher definierten Bereich zu.

Tag 9
Aufgabe Schreiben Sie eine modulare Funktion, die vor der Aktivierung einer Tabelle berprft, ob die zu aktivierende Tabelle in der Arbeitsmappe berhaupt vorhanden ist. Lsung Erfassen Sie die Funktion sowie das aufrufende Makro aus Listing A.17:
Listing A.17: Vor dem Zugriff auf eine Tabelle deren Existenz prfen Function TabelleExist(ByVal s As String) As Boolean Dim b As Boolean On Error GoTo fehler Sheets(s).Activate TabelleExist = True Exit Function

565

Lsungen der Tages-bungen

fehler: TabelleExist = False End Function

Sub TabelleAktivieren() Dim b As Boolean b = TabelleExist("Tabelle1") If b = False Then MsgBox "Die Tabelle ist in der Arbeitsmappe nicht verfgbar!" End Sub

Innerhalb der Funktion TabelleExist versuchen Sie die angegebene Tabelle zu aktivieren. Wenn dies nicht gelingt, dann knnen Sie davon ausgehen, dass die angegebene Tabelle nicht in der Arbeitsmappe vorhanden ist. In diesem Fall wird ein Fehler provoziert, der ber die Funktion aber abgefangen werden kann. So liefert die Funktion in diesem Fall den Wert False. Mithilfe dieser Variablen, die an das Makro zurckgegeben wird, knnen Sie entscheiden, wie Sie weiter vorgehen mchten.

Tag 10
Aufgabe Schreiben Sie ein Makro, das alle Zellenadressen der Hyperlinks in einer separaten Tabelle dokumentiert. Lsung Erfassen Sie das Makro aus Listing A.18:
Listing A.18: Alle Hyperlinks einer Tabelle werden dokumentiert Sub Dim Dim Dim HyperlinksDokumentieren() Hyper As Hyperlink i As Integer Blatt As String

Worksheets.Add ActiveSheet.Name = "DokuHyper"

566

Tag 11

Blatt = ActiveSheet.Name Sheets("PrfungHyper").Activate i = 1 For Each Hyper In ActiveSheet.Hyperlinks Sheets(Blatt).Cells(i, 1) = Hyper.Range.Address Sheets(Blatt).Cells(i, 2) = Hyper.Range.Value i = i + 1 Next Hyper End Sub

Fgen Sie im ersten Schritt eine neue Tabelle ein und benennen diese. Wechseln sie dann auf die Tabelle, die die Hyperlinks enthlt. In der Auflistung Hyperlinks sind alle Hyperlinks der aktiven Tabelle enthalten. Auf diese Hyperlinks knnen Sie nun zugreifen und die Adresse sowie deren Hyperlinktext in die Tabelle DOKUHYPER schreiben.

Tag 11
Aufgabe 1 Schreiben Sie ein Makro, das alle Datenstze aus der Access-Tabelle VERANSTALTUNG in die Excel-Tabelle bertrgt, die einen Veranstaltungsbeginn nach dem 04.10.2002 haben. Lsung Erfassen Sie das Makro aus Listing A.19:
Listing A.19: Bestimmte Datenstze aus Access nach Excel bertragen Sub Dim Dim Dim DatenstzeSuchenUndbertragenbung() ADOC As ADODB.Connection DBS As ADODB.Recordset 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

Lsungen 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!Strae 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 = Nothing End Sub

568

Tag 12

Aufgabe 2 Schreiben Sie ein Makro, welches den Zellenbereich A1:C5 in ein neues Dokument kopiert. Dabei sollen die beiden Dateien ber die Verknpfungseigenschaft miteinander verbunden bleiben. Lsung Erfassen Sie das aufrufende Makro aus Listing A.20:
Listing A.20: Einen Zellenbereich verknpft in ein Word-Dokument einfgen Sub Dim Dim Dim ExcelDatenNachWordKopierenVernpft() WordApp As Object WordDok As Object Bereich As Range

Set WordApp = CreateObject("Word.application") WordApp.Visible = True Set 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 = Nothing End Sub

Tag 12
Aufgabe Schreiben Sie ein Makro, welches die Menbefehl SPEICHERN und SPEICHERN UNTER im Men DATEI deaktiviert. Lsung Erfassen Sie das Makro aus Listing A.21:

569

Lsungen der Tages-bungen

Listing A.21: Menbefehle deaktivieren Sub MenBefehleDeaktivieren() Dim MenLeiste As CommandBar Dim ctrl As CommandBarControl Set MenLeiste = CommandBars(1) For Each ctrl In MenLeiste.Controls(1).Controls Debug.Print ctrl.Caption If ctrl.Caption = "&Speichern" Or _ ctrl.Caption = "Speichern &unter..." Then ctrl.Enabled = False Next ctrl End Sub

ber die Anweisung Debug.Print knnen Sie sich die genaue Beschriftung des Menbefehls vorab im Direktbereich ausgeben. ber die Eigenschaft Enabled knnen Sie einen Menbefehl deaktivieren, indem Sie diese Eigenschaft auf den Wert False setzen. Das Deaktivieren eines Menbefehls knnen Sie brigens auch ber die ID vornehmen. Den Menbefehl SPEICHERN knnten Sie demnach auch ber die Anweisung If ctrl.ID = 3 Then ctrl.Enabled = False deaktivieren.

Tag 13
Aufgabe Schreiben Sie ein Makro, welches die Ergebnisse der Vokabelabfragen in der separaten Tabelle BUNG dokumentiert. Lsung
Listing A.22: Die Ergebnisse der Vokabelabfrage sichern Private Sub CommandButton2_Click() 'Prfen Dim frm As UserForm Dim Cb As Object

570

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).Select End With Sheets("Vokabeln").Activate End Sub

571

Lsungen der Tages-bungen

Tag 14
Aufgabe Schreiben Sie ein Makro, das alle Makros aus allen Modulen einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung auflistet. Lsung Erfassen Sie die beiden Makros aus Listing A.23:
Listing A.23: Alle Namen der Module im Direktfenster ausgeben Sub MakrosAuflisten() Dim VBCodeModul As CodeModule Dim 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) Loop End With End Sub

Geben Sie im ersten Schritt an, in welchem Modul sich die Makros befinden. Danach durchlaufen Sie das angegebene Modul und geben die Namen der Makros im Direktfenster aus.

572

Wichtige Funktionen in einem eigenen Add-In ablegen

Wichtige Funktionen in einem eigenen Add-In ablegen

Wenn Sie die 14 Tage mit der Programmierung hinter sich haben, dann knnen Sie sich an dem in diesem Anhang vorgestellten Add-In orientieren, welche Funktionen Sie in welcher Weise derart organisieren knnen. So knnen Sie spter leicht eigene Funktionen in dieses Add-In mit integrieren oder gar ein ganz neues Add-In erstellen. Das Add-In und seine Funktionen werden brigens in meinem aktuellen ExcelVBA-Kompendium beschrieben. In diesem Buch reichte leider der Platz hierfr nicht aus, daher haben wir uns entschlossen, Ihnen wenigstens als Service die Listings sowie die Software auf CD-ROM mitzuliefern. Sie finden alle Makros, die auf den folgenden Seiten aufgelistet sind, auf der mitgelieferten CD-ROM im Verzeichnis ANHANG II in der Arbeitsmappe Macadd in.xls. Das fertige Add-In Macaddin.xla haben Sie ebenfalls in diesem Verzeichnis. Sie knnen es ber das Men EXTRAS und den Befehl ADD-INS-MANAGER einbinden. Folgende Funktionen werden Ihnen in meinem Add-In angeboten:

Umwandlung von Formeln und Funktionen in Festwerte in der aktiven Tabelle Umwandlung von Formeln und Funktionen in Festwerte als Kopie in einer neuen Datei Subern aller Zellen im markierten Bereich von nicht druckbaren Zeichen Setzen von Zellenumbrchen innerhalb einer Markierung Umwandlung von relativen Bezgen in absolute Bezge 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 verknpften Arbeitsmappen Verknpfungen zu anderen Arbeitsmappen entfernen Suchen von Text mit der Ersetzen-Funktion Suchen von Text mit der Markierungsfunktion

574

Die Ereignisse

Markierung aller Zellen in der Tabelle, die Formeln, Kommentare, Konstanten, etc. enthalten. Lschen von bestimmten Zellen.

Das Add-In legt beim Aktivieren des Tools eine eigenes Men an, das wie folgt aussieht.

Abbildung B.1: Das Add-In des Autors

B.1 Die Ereignisse


Das Add-In MACADDIN wird in der Arbeitsblatt-Menleiste vor dem Hilfemen beim Einbinden des Add-Ins erzeugt. Dazu setzen Sie das Ereignis Workbook_AddinInstall ein, welches automatisch eintritt, wenn Sie im ADD-INSMANAGER das Add-In MACADDIN einbinden. Innerhalb des Ereignisses rufen Sie das Makro MenErstellen auf.
Listing B.1: Ereignis Workbook_AddinInstall zum dynamischen Erstellen eines eigenen Mens beim Einbinden eines Add-Ins Private Sub Workbook_AddinInstall() MenErstellen End Sub

Beim Deaktivieren des Add-Ins sollte das zustzliche Men MACADDIN wieder entfernt werden. Dazu setzen Sie das Ereignis Workbook_AddinUninstall ein und rufen darin das Makro MENLSCHEN auf.

575

Wichtige Funktionen in einem eigenen Add-In ablegen

Listing B.2: Ereignis Workbook_AddinUninstall zum Entfernen eines eigenen Mens beim Deaktivieren eines Add-Ins Private Sub Workbook_AddinUninstall() MenLschen End Sub

B.2 Der Quellcode


Die folgenden Makros werden an dieser Stelle nicht ausfhrlich erklrt. Ausfhrliche Erklrungen zu den Makros und weiteren 1.000 Makros knnen Sie in meinem aktuellen Excel-VBA-Kompendium nachlesen (ISBN 3-8272-6577-0).

Menerstellung
Listing B.3: Ein eigenes Men erstellen Sub Dim Dim Dim Dim MenErstellen() i As Integer i_Hilfe As Integer MenNeu As CommandBarControl Mb As CommandBarControl

i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ before:=i_Hilfe, Temporary:=True) MenNeu.Caption = "MacAdd&In" Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = _ "Formeln, F&unktionen in Festwerte umwandeln _ (aktuelles Blatt)" .Style = msoButtonIconAndCaption

576

Der Quellcode

.OnAction = "FormelnInWerteUmwandeln" .FaceId = 39 End With Set Mb = MenNeu.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 = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Zellen in Markierung subern" .Style = msoButtonIconAndCaption .OnAction = "ZellenSubern" .FaceId = 1552 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Zellenumbrche in Markierung setzen" .Style = msoButtonIconAndCaption .OnAction = "ZellenumbruchSetzen" .FaceId = 162 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Absolut-Bezge setzen" .Style = msoButtonIconAndCaption .OnAction = "BezugndernInAbsolut" .FaceId = 384 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Ak&tive Tabelle als E-Mail versenden" .Style = msoButtonIconAndCaption

577

Wichtige Funktionen in einem eigenen Add-In ablegen

.OnAction = "EmailAktivesTabellenblatt" .FaceId = 3738 .BeginGroup = True End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = _ "Akt&ive Tabelle in neuer Arbeitsmappe speichern" .Style = msoButtonIconAndCaption .OnAction = "AktivesTabellenblattAlsDatei" .FaceId = 3 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Wo&chentag, Datum und Uhrzeit anzeigen" .Style = msoButtonIconAndCaption .OnAction = "DatumUndUhrzeit" .FaceId = 126 .BeginGroup