Entdecken Sie eBooks
Kategorien
Entdecken Sie Hörbücher
Kategorien
Entdecken Sie Zeitschriften
Kategorien
Entdecken Sie Dokumente
Kategorien
... 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. . . . . . . . . . . . . . . . . . . . . . . . . .
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
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
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
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
16
17
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
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
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
20
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.
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
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.
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.
-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
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.
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
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.
Das erste Zeichen muss ein alphanumerisches Zeichen sein. Der Makroname darf keine Leerzeichen enthalten.
28
Das Code-Fenster
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
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
Abbildung 1.7: Das erste Makro gibt den Anwendernamen auf dem Bildschirm aus.
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).
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.
31
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:
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
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
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
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
6. Klicken Sie auf die Schaltflche BENUTZERDEFINIERTE KOPFZEILE. 7. Fllen Sie das Dialogfeld mithilfe der Symbole und einigen manuell eingegebenen Texten wie folgt aus:
35
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:
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
.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.
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
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.
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
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
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.
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.
43
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
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
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
In der Entwicklungsumgebung befinden sich einige interessante Features, die Sie bei der Programmierung gut gebrauchen knnen. Einige davon sollen nun beschrieben werden.
46
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.
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
Warnmeldung angezeigt werden. Erfassen Sie zu diesem Zweck die folgenden Zeilen und stoppen mittendrin:
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
Abbildung 1.25: Die Symbole und Schaltflchen knnen nahezu beliebig kombiniert werden
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
kann. Diese Funktion wird demnach erst verfgbar, sobald anhand der ersten Buchstaben ein eindeutiger Befehl von Excel erkannt werden kann.
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
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.
51
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.
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
.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.
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
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.
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
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.
55
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
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
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
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.
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
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
1.9
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
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
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.
64
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)
Integer Long
Object Single
String Variant
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
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$
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
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
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
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.
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
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
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
Abbildung 1.43: Das Kontextmen bietet Ihnen alle zur Verfgung stehenden Objekte an.
72
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
73
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
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.
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
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
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.
Die soeben erzeugte Grafikdatei enthlt keinerlei Verbindung mehr zu den Daten der Ursprungstabelle. Das Diagramm wurde auf diese Art und Weise ausgelagert und eingefroren.
77
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.
78
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
79
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.
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
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.
81
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
Vergessen Sie nicht, den Objektverweis ber die Anweisung Set WdObjekt =
Nothing wieder aufzuheben.
Abbildung 1.52: Der Text aus A1 soll ohne Kopieraktion in die Zwischenablage.
83
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
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.
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
wissen, wie das Add-In genau heit. Sehen Sie also kurz nach, indem Sie aus dem Men EXTRAS den Befehl ADD-INS auswhlen.
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
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
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
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
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#
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
90
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
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.
91
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
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
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
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
93
Einstellung
h n s
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
94
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.
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
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
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.
96
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.
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
Deklarieren Sie eine Objektvariable vom Typ Comment. Danach fgen Sie ber die Methode AddComment einen Kommentar in die aktive Zelle Ihrer Tabelle ein.
97
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:
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
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
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
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:
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
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]
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
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
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
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.
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
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
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
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.
2.2
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
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
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
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
Fensterstatus ermitteln
In der folgenden Aufgabe soll der Fensterstatus Ihrer Anwendung ermittelt werden. Dieser Status kann drei Werte aufweisen:
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
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:
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
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.
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 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.
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.
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
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:
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
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
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
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.
Den Direktbereich knnen Sie einblenden, indem Sie in Ihre Entwicklungsumgebung wechseln und aus dem Men ANSICHT den Befehl DIREKTFENSTER whlen.
125
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.
126
Schleifen programmieren
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).
127
Abbildung 2.14: Die Bindestriche sollen durch das Zeichen Slash ersetzt werden.
128
Schleifen programmieren
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.
129
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.
131
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
2.4
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.
133
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
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.
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
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.
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
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).
137
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
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.
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
Abbildung 2.24: Das Makro stoppt bei der ersten nderung der Variablen i.
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
140
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.
141
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).
142
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
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
Exit Sub
145
fehler: MsgBox "Die Datei konnte nicht gefunden werden", _ vbCritical + vbOKOnly, "FEHLER" End Sub
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
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
147
Wenn Sie das Makro SymbolleisteLschen zweimal hintereinander starten, dann bekommen Sie folgende Fehlermeldung angezeigt:
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
148
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
2.5
F A
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
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
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.
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
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
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
Wie schon vorher erwhnt, knnen Sie selbst bestimmen, wie Excel bestimmte Objekte, z.B. Kommentare, Gitternetzlinien, Grafiken usw., anzeigt.
156
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:
157
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.
158
Wie Sie sehen, sind einige Eigenschaften nur fr die jeweils aktive Tabelle gltig, andere jedoch fr die gesamte Arbeitsmappe.
3.3
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.
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
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.
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
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
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
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
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
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.
164
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.
165
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
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
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
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
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.
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
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
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.
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
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
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
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
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.
3.9
F A
175
ber die Eigenschaft Path knnen Sie den Speicherpfad der aktiven Arbeitsmappe ermitteln.
F
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
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
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
179
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.
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.
181
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.
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.
183
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.
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.
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
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.
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.
Im folgenden Beispiel aus Listing 4.7 werden Sie selbst einen Namen fr die Arbeitsmappe festlegen:
187
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
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.
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
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.
Die Methode Close schliet die Arbeitsmappe. Wird das Argument SaveChanges auf den Wert True gesetzt, werden nderungen an der Arbeitsmappe gespeichert.
191
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
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
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.
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
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.
199
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
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.
201
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.
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
203
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.
204
4.9
F
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
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
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
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.
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:
Kontrollieren Sie das Ergebnis von Listing 5.3, indem Sie in die Entwicklungsumgebung wechseln und aus dem Men ANSICHT den Befehl DIREKTFENSTER whlen.
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.
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.
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.
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
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.
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.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.
216
Tabellen exportieren
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.
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.
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.
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.
Kostenstelle (Position 1 bis 4) Personal-Nr (Position 5 bis 10) Name (Position 11 bis 36) Abteilung (ab Position 37)
Sie haben in der Textdatei namens PersonalListe.txt einige Daten erfasst 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
222
Tabellen importieren
Index
8 9
Konstante
xlEMDFormat xlSkipColumn
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.
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.