... 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.
224
Tabellen importieren
Bei der Textdatei PersonalListe2.txt wird das Semikolon als Trennzeichen der einzelnen Felder verwendet. Mchten Sie diese Textdatei in eine Excel-Tabelle einlesen, dann setzen Sie das Makro aus Listing 5.16 ein:
Listing 5.16: Einlesen einer Textdatei mit variabler Satzlnge Sub TextdateiImportierenVariableSL() Workbooks.OpenText _ Filename:="C:\Eigene Dateien\PersonalListe2.txt", _ DataType:=xlDelimited, Semicolon:=True, _ StartRow:=2 ActiveSheet.Columns("A:D").AutoFit End Sub
Um eine Textdatei mit variabler Satzlnge einzulesen, mssen Sie bei der Methode OpenText im Argument DataType die Konstante XlDelimited angeben. Danach mssen Sie bekannt geben, dass Sie mit dem Semikolon als Trennzeichen arbeiten mchten, indem Sie das Argument Semicolon auf den Wert True setzen. Weitere Trennzeichen sind der Tabulator (Tab:=True), das Komma (Comma:=True) oder das Leerzeichen (Space:=True).
Sollte keines der standardmig angebotenen Trennzeichen mit Ihrer Textdatei bereinstimmen, wie in Abbildung 5.13 angezeigt, dann mssen Sie das Makro aus Listing 5.16 etwas abndern.
225
Tabellenbltter programmieren
Die Textdatei PersonalListe3.txt soll nun in eine Excel-Tabelle importiert werden. Das dazu notwendige Makro knnen Sie in Listing 5.17 einsehen:
Listing 5.17: Eine Textdatei mit alternativem Trennzeichen wird eingelesen Sub TextdateiImportierenVariableSL_Var02() Workbooks.OpenText _ Filename:="C:\Eigene Dateien\PersonalListe3.txt", _ DataType:=xlDelimited, Other:=True, _ OtherChar:="*", StartRow:=2 ActiveSheet.Columns("A:D").AutoFit End Sub
Wird ein nicht standardmig angebotenes Trennzeichen fr eine Textdatei eingesetzt, dann setzen Sie das Argument Other auf den Wert True und geben im Argument OtherChar das Trennzeichen, welches Sie verwenden, in doppelten Hochkommata ein.
5.6
Um mehr Ordnung in Ihre Arbeitsmappen zu bringen, knnen Sie selten bentigte Tabellen auch ausblenden und bei Bedarf wieder einblenden.
226
Abbildung 5.14: Auch die Textdatei mit anderem Trennzeichen konnte erfolgreich eingelesen werden.
Beim Ausblenden einer Tabelle sollten Sie eine Sicherheitsfunktion einbauen, die folgenden Fall bercksichtigt: Was passiert, wenn versucht wird, eine Tabelle auszublenden, die in der Arbeitsmappe gar nicht vorhanden ist? In diesem Fall wrde ein Makro ohne Fehlerbehandlungsfunktion abstrzen. Setzen Sie daher die Anweisung On Error goTo Fehler ein, um im Fehlerfall direkt in den Paragrafen fehler zu springen. Dort geben Sie eine Meldung aus.
227
Tabellenbltter programmieren
Verluft das Ausblenden einer Tabelle erfolgreich, dann mssen Sie mithilfe der Anweisung Exit Sub dafr sorgen, dass der Fehlerparagraf nicht ausgefhrt wird. Mit dieser Anweisung beenden Sie das Makro auf direktem Weg. Nachdem Sie das Makro TabelleAusblenden ausgefhrt haben, wird die Tabelle in der Arbeitsmappe nicht mehr angezeigt. Der Anwender kann aber jederzeit ber den Befehl BLATT/EINBLENDEN aus dem Men FORMAT die ausgeblendeten Tabellenbltter wieder verfgbar machen. Mchten Sie die Tabelle wieder einblenden, starten Sie das folgende Makro:
Listing 5.19: Eine Tabelle wieder einblenden Sub TabelleEinblenden() On Error GoTo fehler Sheets("Tabelle1").Visible = True Exit Sub fehler: MsgBox "Die Tabelle ist nicht vorhanden!", vbCritical + vbOKOnly End Sub
Setzen Sie die Eigenschaft Visible wieder auf den Wert True, um die Tabelle einzublenden. Fangen Sie auch hier den Fehlerfall ber die On Error-Anweisung ab.
228
Setzen Sie eine Schleife auf, die sooft durchlaufen wird, bis alle Bltter der Arbeitsmappe durchlaufen worden sind. Dazu ermitteln Sie ber die Eigenschaft Count, die Sie auf das Auflistungsobjekt Sheets anwenden, die Anzahl der Bltter in der Arbeitsmappe. Innerhalb der Schleife prfen Sie mithilfe der Eigenschaft Name, ob der Name des einzelnen Blattes mit der Tabelle INHALT bereinstimmt. Wenn nicht, blenden Sie die Tabelle aus, indem Sie die Eigenschaft Visible auf den Wert False setzen.
Abbildung 5.15: Alle Tabellen bis auf die Tabelle Inhalt wurden ausgeblendet.
Alle so ausgeblendeten Bltter knnen Sie jederzeit wieder verfgbar machen, indem Sie aus dem Men FORMAT den Befehl BLATT/EINBLENDEN whlen. Da dies nicht immer im Sinn des Programmierers ist, knnen Sie die einzelnen Bltter auch so ausblenden, dass sie ber die Standardoberflche nicht mehr eingeblendet werden knnen.
229
Tabellenbltter programmieren
Listing 5.21: Bltter sicher bis auf das letzte ausblenden Sub TabellenAusblendenSicher() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count If Sheets(i).Name <> "Inhalt" Then Sheets(i).Visible = xlVeryHidden Next i End Sub
bergeben Sie der Eigenschaft Visible die Konstante xlVeryHidden, um die Bltter sicher auszublenden. Wenn Sie jetzt versuchen, die so ausgeblendeten Bltter ber den Menbefehl FORMAT/BLATT/EINBLENDEN wieder verfgbar zu machen, stellen Sie fest, dass dieser Menbefehl deaktiviert ist und berhaupt nicht ausgewhlt werden kann.
Abbildung 5.16: Es gibt keine Mglichkeit, ber die Standardoberflche sicher ausgeblendete Bltter wieder verfgbar zu machen.
230
Tabellen gruppieren
Listing 5.22: Alle versteckten Bltter wieder einblenden Sub TabellenEinblenden() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count Sheets(i).Visible = True Next i End Sub
In einer Schleife durchlaufen Sie alle Bltter der Arbeitsmappe und setzen die Eigenschaft Visible auf den Wert True, um die ausgeblendeten Bltter wieder einzublenden.
5.7
Tabellen gruppieren
In Excel haben Sie die Mglichkeit, Ihre Arbeit an einem Tabellenblatt automatisch auch fr andere Tabellenbltter, hnlich einer Blaupause, gltig zu machen. Dazu gruppieren Sie die einzelnen Tabellenbltter. Manuell klappt das, indem Sie die (Strg)-Taste gedrckt halten und die einzelnen Tabellenregister mit der linken Maustaste anklicken.
231
Tabellenbltter programmieren
Einfaches Gruppieren
In der folgenden Aufgabe sollen einige Tabellen einer Arbeitsmappe gruppiert werden. Das Makro dafr sieht so aus:
Listing 5.23: Bestimmte Tabellen gruppieren Sub MehrereTabellenbltterMarkieren() On Error GoTo fehler Sheets(Array("Tabelle1", "Tabelle2", _ "Tabelle3")).Select Exit Sub fehler: MsgBox "Es ist ein Fehler beim Gruppieren aufgetreten!" End Sub
Die Funktion Array ermglicht es Ihnen, eine durch Kommata getrennte Liste von Werten (hier Tabellennamen) anzugeben. Sorgen Sie auch hier wieder fr die On Error-Anweisung, um eine Fehlermeldung zu vermeiden, falls eines der Tabellenbltter nicht vorhanden ist.
brigens knnen Sie anstatt der Namen der einzelnen Tabellen auch Indexwerte angeben. Der Index 1 entspricht dabei dem Tabellenblatt, das ganz vorne in der Arbeitsmappe steht. Die Indexwerte 2 und 3 reprsentieren die Tabellen, die dann
232
Tabellen gruppieren
von links nach rechts folgen. Achten Sie jedoch darauf, dass das Ergebnis ein anderes sein kann als erwartet.
Listing 5.24: Tabellen ber ihren Index gruppieren Sub MehrereTabellenbltterMarkieren02() On Error GoTo fehler Sheets(Array(1, 2, 3)).Select Exit Sub fehler: MsgBox "Es ist ein Fehler beim Gruppieren aufgetreten!" End Sub
Im Gegensatz zu Abbildung 5.18 wurden in Abbildung 5.19 die ersten drei Tabellen der Arbeitsmappe gruppiert. Die Gruppierung knnen Sie wieder aufheben, indem Sie auf einen Tabellenreiter klicken, der nicht in der Gruppierung enthalten ist.
233
Tabellenbltter programmieren
Komplexeres Gruppieren
Etwas aufwndiger wird es, wenn Sie nur bestimmte Tabellen bzw. auch alle Tabellen einer Arbeitsmappe gruppieren mchten. Die Lsung fr das Gruppieren aller Tabellenbltter einer Arbeitsmappe muss beispielsweise dynamisch sein, d.h. wenn einzelne Tabellen neu hinzukommen bzw. Tabellen umbenannt werden, muss die folgende Lsung in Listing 5.25 noch funktionieren. Des Weiteren sollen selbstverstndlich keine Diagramm- oder alte Makro4-Tabellenbltter mit in die Gruppierung aufgenommen werden.
Listing 5.25: Alle Tabellen einer Mappe gruppieren Sub Dim Dim Dim AlleTabellenBltterGruppieren() i As Integer i2 As Integer TabArray() As Integer i = ThisWorkbook.Worksheets.Count ReDim TabArray(1 To i) For i2 = 1 To i TabArray(i2) = i2 Next i2 ThisWorkbook.Worksheets(TabArray).Select End Sub
Da Sie zu Beginn noch nicht exakt wissen, wie gro das Datenfeld TabArray werden soll, mssen Sie es ganz allgemein mit dem Datentyp Integer deklarieren. Danach ermitteln Sie ber die Eigenschaft Count, die Sie auf die Auflistung Work sheets anwenden, die Anzahl der in der Arbeitsmappe befindlichen Tabellenbltter. Jetzt wissen Sie genau, wie gro Sie das Datenfeld TabArray definieren mssen. Dies erreichen Sie ber die Anweisung ReDim. Fllen Sie das Datenfeld im Anschluss daran ber eine Schleife, in der Sie jedes einzelne Feld des Datenfelds bestcken. Markieren Sie im Anschluss daran die so gesammelten Tabellenbltter mithilfe der Methode Select.
234
Tabellen schtzen
5.8
Tabellen schtzen
Seit der Excel-Version 2002 haben Sie die Mglichkeit, Tabellen zwar zu schtzen, jedoch bestimmte Aktionen wie das Sortieren von Daten, den AutoFilter und sonstige Dinge trotzdem noch zuzulassen. In den vorherigen Versionen von Excel waren nach dem Anbringen eines Tabellenschutzes bestimmte Aktionen generell berhaupt nicht mehr mglich. Den Tabellenschutz stellen Sie ber die Methode Protect her. Die Syntax dieser Methode lautet dabei:
ActiveSheet.Protect _ (Password, DrawingObjects, Contents, _ Scenarios, UserInterfaceOnly)
Im Argument Passwort geben Sie das Kennwort fr das Blatt oder die Arbeitsmappe an. Wenn Sie dieses Argument weglassen, kann der Schutz des Blattes oder der Arbeitsmappe ohne Angabe eines Kennworts aufgehoben werden. Mit dem Argument DrawingObjects bestimmen Sie, ob Sie zustzlich zu Ihren Zellen auch noch Formen, wie z.B. Blockpfeile, Sterne oder Banner, schtzen mchten. Diese Formen werden standardmig jedoch nicht geschtzt. Wenn Sie Formen schtzen mchten, setzen Sie das Argument auf den Wert True. Beim Argument Contents, welches standardmig auf True gesetzt ist, werden die Zellen eines Tabellenblattes geschtzt.
235
Tabellenbltter programmieren
Das Argument Scenarios gilt nur fr Arbeitsbltter und bedeutet, dass bestimmte Ansichten und Einstellungen, wie z.B. das eingestellte Zoom, geschtzt werden. Die Standardeinstellung ist dabei ebenfalls True. Das letzte Argument UserInterFaceOnly gibt ber den Wert True an, dass die Benutzeroberflche, jedoch keine Makros geschtzt werden. Ab der Excel-Version 2002 gibt es folgende zustzliche Argumente, die den Tabellenschutz geradezu revolutionieren:
AllowFormattingCells: Setzen Sie dieses Argument auf den Wert True, wenn
AllowFormattingColumns: Bei dieser Einstellung darf der Benutzer Spalten formatieren, sofern dieses Argument auf den Wert True gesetzt wird. AllowFormattingRows: Bei dieser Einstellung darf der Benutzer Zeilen formatieren, sofern dieses Argument auf den Wert True gesetzt wird. AllowInsertingRows: Setzen Sie dieses Argument auf den Wert True, wenn Sie
zulassen mchten, dass der Benutzer neue Zeilen in eine geschtzte Tabelle einfgen darf.
AllowInsertingHyperlinks: Um das Einfgen von Hyperlinks in geschtzten Tabellen zuzulassen, setzen Sie dieses Argument auf den Wert True. AllowDeletingColumns: Mchten Sie zulassen, dass in einer geschtzten Tabelle Spalten gelscht werden drfen, dann setzen Sie dieses Argument auf den Wert True. AllowDeletingRows: Mchten Sie zulassen, dass in einer geschtzten Tabelle Zeilen gelscht werden drfen, dann setzen Sie dieses Argument auf den Wert True. AllowSorting: Setzen Sie dieses Argument auf den Wert True, um eine Sortierung des geschtzten Arbeitsblattes zu ermglichen. Fr jede Zelle im Sortierbereich muss die Sperre oder der Schutz aufgehoben werden. AllowFiltering: Setzen Sie dieses Argument auf den Wert True, um zu
ermglichen, Filter fr das geschtzte Arbeitsblatt festzulegen. Die Benutzer knnen Filterkriterien ndern, jedoch keinen AutoFilter aktivieren oder deaktivieren.
236
Tabellen schtzen
dem Benutzer zu ermglichen, auf einer geschtzten Tabelle mit Pivot-Tabellen zu arbeiten. Im folgenden Beispiel wird TABELLE1 mit dem Kennwort HERO geschtzt.
Listing 5.26: Die Tabelle1 wird geschtzt. Sub TabelleSchtzen() Sheets("Tabelle1").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
Wenn Sie versuchen, eine nderung in der so geschtzten Tabelle vorzunehmen, wird Ihnen dies nicht gelingen.
Selbstverstndlich mssen nicht immer alle Zellen einer Tabelle geschtzt werden, wie es im Makro aus Listing 5.26 vorgenommen wurde.
237
Tabellenbltter programmieren
Standardmig sind alle Zellen einer Tabelle von vornherein mit dem GeschtztKennzeichen ausgestattet, d.h. wenn Sie eine Tabelle mit einem Schutz belegen, sind alle Zellen nicht mehr vernderbar. Folgende Arbeitsschritte mssen nun durchgefhrt werden: 1. Generell fr alle Zellen der Tabelle das Geschtzt-Kennzeichen entfernen 2. Ermittlung der Zellen, die Formeln enthalten 3. Fr diese Zellen das Geschtzt-Kennzeichen setzen 4. Den Schutz fr die Tabelle einstellen Diese vier Arbeitsschritte fhren Sie im Makro aus Listing 5.27 durch.
Listing 5.27: Nur Formelzellen wurden geschtzt Sub TeileDerTabelleSchtzen() Sheets("DB").Activate Cells.Select Selection.Locked = False
238
Tabellen schtzen
Selection.SpecialCells(xlCellTypeFormulas).Select Selection.Locked = True Sheets("DB").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
Aktivieren Sie im ersten Schritt die gewnschte Tabelle, in der Sie die Formelzellen schtzen mchten. Danach markieren Sie ber die Anweisung Cells.Select alle Zellen der Tabelle. In der Cells-Auflistung sind alle Zellen einer Tabelle verzeichnet. Setzen Sie danach die Eigenschaft Locked auf den Wert False, um zunchst das Geschtzt-Kennzeichen fr alle Zellen der Tabelle auszuschalten. Ermitteln Sie danach ber die Methode SpecialCells, der Sie die Konstante xlCellTypeFormulas mitgeben, alle Formelzellen der Tabelle und markieren diese mithilfe der Methode Select. Schalten Sie danach fr diese Zellen das GeschtztKennzeichen wieder ein, indem Sie die Eigenschaft Locked auf den Wert True setzen. Nun knnen Sie die Methode Protect einsetzen, um die Tabelle zu schtzen. Danach knnen Formelzellen in dieser Tabelle nicht mehr gendert werden.
239
Tabellenbltter programmieren
Range("B2").Value = Date 'Dokuschutz wieder einstellen Sheets("DB").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
Abbildung 5.23: Der Bereich B3:E13 soll trotz Blattschutzes frei editierbar bleiben.
Im folgenden Beispiel soll auf der TABELLE3 ein Bereich definiert werden, in dem der Anwender trotz eingestellten Blattschutzes nderungen durchfhren darf. Das Makro fr diese Aufgabe sehen Sie in Listing 5.29:
240
Tabellen sortieren
Listing 5.29: Einen eingabefreien Bereich trotz Blattschutzes definieren Sub FreieBereicheFestlegen() Sheets("Tabelle3").Activate On Error GoTo fehler Sheets("Tabelle3").Protection.AllowEditRanges.Add _ Title:="Bereich1", Range:=Range("B3:E13") Sheets("Tabelle3").Protect Password:="hero" Exit Sub fehler: MsgBox "Es ist ein Fehler aufgetreten!" End Sub
Mithilfe der Methode Add, die Sie auf die AllowEditRanges-Auflistung anwenden, knnen Sie einen Bereich definieren, der trotz eingestelltem Blattschutz weiter editierbar sein soll. Geben Sie dazu im Argument Title einen Namen fr den Bereich ein. Des Weiteren geben Sie im Argument Range bekannt, wo der gewnschte Bereich in der Tabelle sein soll. Schtzen Sie danach Ihre Tabelle ber die Methode Protect.
5.9
Tabellen sortieren
Leider gibt es noch keine Standardfunktion in Excel, welche es erlaubt, Tabellenbltter nach ihrem Namen zu sortieren. Das folgende Makro sortiert alle Tabellenbltter in aufsteigender alphabetischer Reihenfolge:
Listing 5.30: Die Bltter einer Arbeitsmappe sortieren Sub Dim Dim Dim BltterSortieren() iMax As Integer Ibl As Integer ibl2 As Integer
Application.ScreenUpdating = False iMax = ThisWorkbook.Sheets.Count For Ibl = 1 To iMax For ibl2 = Ibl To iMax If UCase(Sheets(ibl2).Name) _ < UCase(Sheets(Ibl).Name) Then
241
Tabellenbltter programmieren
Sheets(ibl2).Move before:=Sheets(Ibl) End If Next ibl2 Next Ibl Application.ScreenUpdating = True End Sub
Um das Sortieren von Arbeitsblttern durchzufhren, mssen Sie zwei verschachtelte For-Next-Schleifen durchlaufen. Beide haben als Endbedingung immer die Anzahl der Bltter, die in der Mappe enthalten sind. Innerhalb der zweiten Schleife werden die Namen der Bltter verglichen. Beim Vergleich der Blattnamen werden diese erst einmal in Grobuchstaben gewandelt, um sicherzustellen, dass die Ground Kleinschreibung beim Sortiervorgang keine Rolle spielt. Je nach Vergleichsergebnis werden die einzelnen Bltter dann innerhalb der Arbeitsmappe mithilfe der Methode Move verschoben oder auch nicht.
242
Kopfzeile links: das Thema der Tabelle (aus Zelleninhalt A1) Kopfzeile Mitte: der Firmenname (aus den Dokumenteigenschaften) Kopfzeile rechts: das Datum (mit ausgeschriebenem Monat und vierstelliger Jahresangabe) Fuzeile links: der Name der Mappe/Tabelle Fuzeile Mitte: der Autor der Tabelle (aus Dokumenteigenschaften) Fuzeile rechts: die Seitennumerierung (Seite X von Y Seiten)
243
Tabellenbltter programmieren
Listing 5.31: Die Kopf- und Fuzeile festlegen Sub KopfUndFuzeileFestlegen() With ActiveSheet.PageSetup .LeftHeader = ActiveSheet.Range("A1").Value .CenterHeader = _ ThisWorkbook.BuiltinDocumentProperties("Company") .RightHeader = Format(Date, "DD. MMMM YYYY") .LeftFooter = "&F/&A" .CenterFooter = ThisWorkbook.BuiltinDocumentProperties("Author") .RightFooter = "&P von &N Seiten" End With ActiveWindow.SelectedSheets.PrintPreview End Sub
Um die Kopf- und Fuzeile festlegen zu knnen, setzen Sie das Objekt PageSetup ein. Nun knnen Sie ganz gezielt auf die einzelnen Komponenten zugreifen, indem Sie diese mit den gewnschten Informationen fllen. In der linken Kopfzeile (LeftHeader) fgen Sie den Inhalt ein, der momentan in Zelle A1 steht. In der Mitte der Kopfzeile (CenterHeader), greifen Sie auf die Dokumenteigenschaft Company zu, die den Firmennamen zurckmeldet. In der rechten Kopfzeile (RightHeader) fgen Sie das aktuelle Tagesdatum ein und formatieren es mithilfe der Funktion Format nach Ihren Wnschen. In der linken Fuzeile (LeftFooter) fgen Sie den Namen der Arbeitsmappe sowie den Tabellennahmen ber die Kopf- und Fuzeilenkrzel &F und &A ein. In der Mitte der Fuzeile (CenterFooter) zeigen Sie den Namen des Autors an, welchen Sie aus den Dokumenteigen-
244
schaften holen. Am rechten Rand der Fuzeile (RightFooter) geben Sie die Seitennumerierung ber die Formatkrzel &P und &N an (siehe Abbildung 5.25). Mchten Sie das Makro aus Listing 5.31 nicht nur fr die aktuelle Tabelle, sondern fr alle Tabellen der Arbeitsmappe einsetzen, dann erweitern Sie dieses Makro. Das Ergebnis daraus knnen Sie in Listing 5.32 sehen:
Listing 5.32: Die Einstellungen fr die Kopf- und Fuzeile auf allen Tabellen der Arbeitsmappe bernehmen Sub KopfUndFuzeileFestlegenAlleTabellen() Dim Tabelle As Worksheet For Each Tabelle In ThisWorkbook.Worksheets With Tabelle.PageSetup .LeftHeader = Tabelle.Range("A1").Value .CenterHeader = _ ThisWorkbook.BuiltinDocumentProperties("Company") .RightHeader = Format(Date, "DD. MMMM YYYY") .LeftFooter = "&F/&A" .CenterFooter = ThisWorkbook.BuiltinDocumentProperties("Author") .RightFooter = "&P von &N Seiten" End With Next Tabelle End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. Setzen Sie danach eine Schleife auf, in der Sie alle Tabellen der Arbeitsmappe abarbeiten. Innerhalb dieser Schleife fllen Sie die einzelnen Komponenten des Objekts PageSetup, wie bereits in Listing 5.31 beschrieben.
245
Tabellenbltter programmieren
Wie knnen Sie eine Tabelle ans Ende der Arbeitsmappe verschieben?
A
Wie knnen Sie eine Tabelle schtzen, danach aber noch die Filterfunktion einsetzen?
A
Geben Sie bei der Methode Protect als Argument userinterfaceonly den Wert True an. Damit knnen Sie auch in einer geschtzten Tabelle noch den AutoFilter verwenden.
5.12 Quiz
F
Wie kann man die Standardmeldungen von Excel abschalten? Gerade beim Lschen von Tabellen ist die dabei angezeigte Besttigungsmeldung unerwnscht. Was mssen Sie machen, wenn Sie eine Tabelle so ausblenden mchte, dass ein Anwender diese ohne den Einsatz eines Makros nicht wieder einblenden kann? Wie knnen Sie eine Grafik in die Kopfzeile Ihrer Tabelle bringen? Welche Formatkrzel knnen Sie fr die Generierung von Kopf- und Fuzeilen einsetzen?
F F F
246
bungen
5.13 bungen
Zum Abschluss dieses Tages versuchen Sie einmal, die folgenden beiden Aufgaben ber den Einsatz eines VBA-Makros zu lsen: 1. Legen Sie eine neue Arbeitsmappe an und fgen Sie darin genau 12 Tabellen ein, die Sie nach Monatsnamen benennen. 2. Entfernen Sie aus einer Tabelle alle Formeln, und zwar so, dass die Formeln in Festwerte umgewandelt werden. Die Lsung dieser beiden Aufgaben finden Sie im Anhang A.
247
Am gestrigen Tag haben Sie den Umgang mit Excel-Tabellen kennen gelernt. Unter anderem haben Sie neue Tabellen angelegt, benannt und gespeichert sowie Daten in Tabellen importiert. Des Weiteren haben Sie auf die Kopf- und Fuzeile per VBA-Makros zugegriffen und diese einheitlich gestaltet. Die Themen heute:
Zellen markieren Zellen fllen und formatieren Zellen benennen und kommentieren Arbeiten mit Formeln und Funktionen Daten suchen und Gltigkeiten einstellen Alle Makrobeispiele knnen Sie in der Arbeitsmappe Zellen.xls im Verzeichnis Kap06 auf der beiliegenden CD-ROM nachschlagen.
6.1
Zellen markieren
Als erste Tagesaufgabe lernen Sie heute, wie Sie Zellen in Excel markieren knnen. Fr das Markieren von Zellen verwenden Sie die Methode Select. Diese Methode wenden Sie auf das Objekt Range an, welches entweder fr eine einzelne Zelle oder einen Zellenbereich steht.
250
Zellen markieren
Aktivieren Sie im ersten Schritt des Makros das gewnschte Tabellenblatt, in dem Sie die Zelle A10 markieren mchten. Wenden Sie danach die Methode Select an, um die Zelle zu markieren. ber die Anweisung ActiveCell.Address knnen Sie die genauen Koordinaten der Zelle bestimmen.
Markieren Sie ber die Methode Select den gewnschten Bereich und ermitteln Sie die Koordinaten des markierten Bereichs ber die Anweisung Selection.Address.
251
Abbildung 6.2: Die Koordinaten des markierten Bereichs ausgeben Listing 6.3: Mehrere Bereiche markieren und ausgeben Sub Dim Dim Dim Dim BereicheMarkieren() Bereich1 As Range Bereich2 As Range Bereich3 As Range Gesamtbereich As Range
Sheets("Tabelle1").Activate Set Bereich1 = Range("A5:C8") Set Bereich2 = Range("E5:G8") Set bereich3 = Range("A10:C12") Set Gesamtbereich = Union(Bereich1, Bereich2, Bereich3) Gesamtbereich.Select MsgBox "Sie haben die Zellen " & _ Gesamtbereich.Address & " markiert!", vbInformation Set Set Set Set End Bereich1 = Nothing Bereich2 = Nothing Bereich3 = Nothing Gesamtbereich = Nothing Sub
Deklarieren Sie im ersten Schritt einige Objektvariablen vom Typ Range. In diesen Objektvariablen sollen die einzelnen Bereichskoordinaten gespeichert werden. Mit der Anweisung Set definieren Sie zuerst die einzelnen Zellbereiche Bereich1
252
Zellen markieren
bis Bereich3. Danach vereinen Sie diese Einzelbereiche mithilfe der Methode Union zu einem Block, welcher den Namen Gesamtbereich trgt. Diesen Block knnen Sie ber die Methode Select komplett markieren. ber die Anweisung Gesamtbereich.Address ermitteln Sie die Koordinaten der einzelnen Bereiche. Am Ende des Makros sollten Sie den reservierten Speicher, den Sie fr die Objektvariablen in Beschlag genommen haben, wieder freigeben. Dies erreichen Sie, indem Sie den Objektvariablen mit der Set-Anweisung den Wert Nothing zuweisen.
Relative Markierungsformen
Bis jetzt haben Sie lediglich absolute Markierungen vorgenommen, d.h. die Zellenadressen wurden bei der Markierung in der A1-Form vorgenommen. Oft mssen aber Markierungen auch relativ angegeben werden. Ein Beispiel fr eine relative Markierungsform wre Folgendes: Geben Sie die Koordinaten der momentan aktiven Zelle aus und markieren Sie ausgehend von dieser Zelle drei weitere Zellen nach rechts! Fr den Fall, dass die aktive Zelle momentan die Zelle B5 ist, mssten dann die Zellen C5, D5 und E5 zustzlich markiert werden. Die Lsung dieser Aufgabenstellung sehen Sie im Makro aus Listing 6.4.
253
Listing 6.4: Drei weitere Zellen nach rechts werden in die Auswahl mit aufgenommen Sub RelativeMarkierung() Worksheets("Tabelle1").Activate Range(ActiveCell, ActiveCell.Offset(0, 3)).Select MsgBox "Aktive Zelle: " & ActiveCell.Address & Chr(13) & _ "Weitere Zellen: " & Selection.Address, vbInformation End Sub
Bei der Anweisung Range(ActiveCell, ActiveCell.Offset(0,3)).Select werden ausgehend von der aktiven Zelle, drei weitere Nebenzellen markiert. Fr diesen Zweck wird die Eigenschaft OffSet verwendet. Diese Eigenschaft hat zwei Argumente:
Im ersten Argument wird die Anzahl der Zeilen (positiv, negativ oder 0 (Null)), um die der Bereich versetzt werden soll, angegeben. Bei positiven Werten erfolgt ein Versatz nach unten, bei negativen Werten ein Versatz nach oben. Da in unserem Beispiel die Markierung in derselben Zeile verbleiben soll, setzen Sie dieses Argument auf den Wert 0. Im zweiten Argument wird die Anzahl der Spalten (positiv, negativ oder 0 (Null)), um die der Bereich versetzt werden soll, angegeben. Bei positiven Werten erfolgt ein Versatz nach rechts, bei negativen Werten ein Versatz nach links. Da in unserem Beispiel die Markierung der drei Spalten nach rechts verbleiben soll, setzen Sie dieses Argument auf den Wert 3.
254
Zellen markieren
Im nchsten Beispiel wird eine Markierung, ausgehend von der aktiven Zelle, um vier Zeilen nach unten und zwei Spalten nach links erweitert:
Listing 6.5: Relative Markierung mit Fehlerbehandlung Sub RelativeMarkierung2() Worksheets("Tabelle1").Activate On Error GoTo fehler Range(ActiveCell, ActiveCell.Offset(3, -2)).Select MsgBox "Relative Markierung: " & Selection.Address, _ vbInformation Exit Sub fehler: MsgBox "Die Markierung kann nicht vorgenommen werden!" End Sub
Ausgehend von der aktiven Zelle in unserem Beispiel markieren Sie vor dem Makrostart die Zelle C5, die Markierung wird mithilfe der Eigenschaft OffSet um drei Zeilen nach unten und zwei Spalten nach links erweitert. Die Fehlerbehandlung fr dieses Beispiel ist wichtig, da Sie sicherstellen mssen, dass der Offset auch durchgefhrt werden kann. Fr den Fall, dass die aktive Zelle beispielsweise die Zelle A5 ist, kann der Offset nicht erfolgreich durchgefhrt werden, da es keine weiteren Spalten links neben der Spalte A gibt. Vorsicht auch bei ausgeblendeten Zeilen oder Spalten! Bei der Eigenschaft Offset werden diese ausgeblendeten Objekte mitgezhlt. Die Problematik wird in Abbildung 6.5 ersichtlich.
255
Auf den ersten Blick wrden Sie sagen: Der Offset ausgehend von der Zelle D2 lautet:
ActiveCell.Offset(5, -1).Select
Diese Bestimmung ist falsch! Beachten Sie, dass hier einige ausgeblendete Zeilen und Spalten vorliegen, die Sie mitzhlen mssen. Der richtige Offset lautet daher:
ActiveCell.Offset(12, -2).Select
Mithilfe der Eigenschaft Cells knnen Sie eine bestimmte Zelle ansteuern. Dabei weist diese Eigenschaft zwei Argumente auf. Das erste Argument steht fr die Zeile, das zweite Argument fr die Spalte. Der Schnittpunkt aus Zeile und Spalte ergibt dann die exakte Adresse der Zelle. ber die Eigenschaft Cells knnen selbstverstndlich auch Bereiche angesprochen werden. Im Makro aus Listing 6.7 wird der Bereich C10:E10 markiert.
Listing 6.7: Einen Bereich ber die Eigenschaft Cells markieren Sub BereicheAnsprechen() Range(Cells(10, 3), Cells(10, 5)).Select End Sub
256
Zellen markieren
Die Eigenschaft UsedRange gibt den verwendeten Teil eines Tabellenblattes zurck.
257
ber die Eigenschaft CurrentRegion haben Sie die Mglichkeit, den umliegenden Bereich einer Zelle zu ermitteln. Diese Eigenschaft wird in Abbildung 6.7 klar.
258
Zellen fllen
6.2
Zellen fllen
Da Sie nun wissen, wie Sie Zellen und Bereiche markieren knnen, gehen wir einen Schritt weiter und fllen Zellen mit Inhalten.
Zellen initialisieren
Viele Fehler in Makros werden dadurch hervorgerufen, dass Variablen zu Beginn nicht sauber gesetzt werden. hnlich ist es beim Fllen von Zellen. Zu Beginn einer Fllaktion ist es oft angebracht, den zu fllenden Bereich vorher zu lschen und dann neu zu befllen. Warum? Es ist durchaus mglich, dass vor dem Starten des Makros bereits Werte vorhanden sind, d.h. Sie knnen nachher nur schwer feststellen, welche Werte nun neu vom Makro selbst gesetzt wurden. Im folgenden Beispiel wird ein Bereich komplett mit Nullen gelscht. Diese Bereiche sollen jeden Tag mit aktuellen Daten gefllt werden. Sehen Sie sich dazu das Makro aus Listing 6.10 an:
Listing 6.10: Bereiche initialisieren Sub Dim Dim Dim Dim BereicheInitialisieren() Bereich1 As Range Bereich2 As Range Bereich3 As Range Gesamtbereich As Range
Sheets("Tabelle5").Activate Set Bereich1 = Range("C7:C8") Set Bereich2 = Range("C13:C14") Set Bereich3 = Range("C19:C20") Set Gesamtbereich = Union(Bereich1, Bereich2, Bereich3) Gesamtbereich.Value = 0 Set Bereich1 = Nothing Set Bereich2 = Nothing Set Bereich3 = Nothing Set Gesamtbereich = Nothing End Sub
259
Deklarieren Sie im ersten Schritt einige Objektvariablen vom Typ Range. In diesen Objektvariablen sollen die einzelnen Bereichskoordinaten gespeichert werden. Mit der Anweisung Set definieren Sie zuerst die einzelnen Zellbereiche Bereich1 bis Bereich3. Danach vereinen Sie diese Einzelbereiche mithilfe der Methode Union in einem Block, welcher den Namen Gesamtbereich trgt. Diesem Block knnen Sie nun ber die Eigenschaft Value den Wert 0 zuweisen. Am Ende des Makros sollten Sie den reservierten Speicher, den Sie fr die Objektvariablen in Beschlag genommen haben, wieder freigeben. Dies erreichen Sie, indem Sie den Objektvariablen mit der Set-Anweisung den Wert Nothing zuweisen.
260
Zellen fllen
Abbildung 6.9: Die Liste nach dem Datum sortiert Listing 6.11: Buchungspositionen kennzeichnen Sub ListeAbarbeiten() Sheets("Tabelle6").Activate Range("B2").Select Do Until ActiveCell.Value = "" If ActiveCell.Value > 2500 Then ActiveCell.Offset(0, 1).Value = "A" ActiveCell.Offset(1, 0).Select Loop End Sub
Aktivieren Sie im ersten Schritt die gewnschte Zelle und setzen Sie den Mauszeiger auf die Startadresse. Danach durchlaufen Sie in einer Schleife alle Buchungspositionen und fhren eine Wertprfung durch. Liegt die Buchung wertmig ber 2.500 Euro, dann schreiben Sie in die Nebenzelle den Buchstaben A. Setzen Sie fr diese Aufgabe die Offset-Eigenschaft ein, bei der Sie den Zeilen-Offset auf 0 setzen und den Spalten-Offset auf den Wert 1. Vergessen Sie nicht, am Ende der
261
Schleife den Mauszeiger jeweils eine Zeile nach unten zu setzen. Die Schleife wird verlassen, sobald die erste leere Zelle in Spalte B erreicht wird.
6.3
Zellen formatieren
Beim Formatieren von Zellen und Bereichen in Excel bieten sich Ihnen viele Mglichkeiten. Sie knnen Zelleneingaben in beliebiger Schriftart, Schriftgrad sowie Schriftschnitt vornehmen, Zahlen benutzerdefiniert formatieren, Zelleneintrge optisch ausrichten, Rahmen setzen, Muster hinzufgen und vieles mehr.
262
Zellen formatieren
Das folgende Makro aus Listing 6.12 erstellt eine neue Tabelle und gibt die Farben bzw. deren Index in einer Liste aus.
Listing 6.12: Farbindex und Farbe ermitteln Sub FarbenAusgeben() Dim i As Integer Sheets.Add Range("A1").Value = "Index" Range("B1").Value = "Farbe" Range("A2").Select For i = 1 To 56 ActiveCell.Value = i ActiveCell.Offset(0, 1).Interior.ColorIndex = i ActiveCell.Offset(1, 0).Select Next i End Sub
Fgen Sie mithilfe der Anweisung Sheets.Add eine neue Tabelle in Ihre Arbeitsmappe ein. Danach fllen Sie die Zelle A1 und B1 mit der gewnschten berschrift fr die Spalten. Setzen Sie im Anschluss daran den Mauszeiger auf die Startzelle, an der die Bearbeitung beginnen soll, und arbeiten Sie in einer Schleife alle 56 Standardfarben von Excel ab. Den Index schreiben Sie direkt in Spalte A. Die dazugehrige Farbe wenden Sie in Spalte B an, indem Sie die Eigenschaft ColorIndex auf das Objekt Interior anwenden. Das Objekt Interior steht fr den Zellenhintergrund, den Sie mithilfe der Eigenschaft ColorIndex einfrben. Vergessen Sie nicht am Ende der Schleife den Mauszeiger eine Zelle weiter nach unten zu setzen. Um auf schnelle Art und Weise zu erfahren, welcher Farbindex fr welche Farbe steht, weisen Sie einer Zelle eine Farbe zu, setzen den Mauszeiger darauf und starten folgendes Makro:
Listing 6.13: Den aktuellen Zellfarbenindex bestimmen Sub FarbeAktiveZelle() MsgBox "Die aktive Zelle " & ActiveCell.Address & _ " hat den Farbindex: " & ActiveCell.Interior.ColorIndex End Sub
263
Abbildung 6.11: Alle verfgbaren Farben und deren Indexwerte in einer Tabelle
Um die Frbung einer Zelle wieder zu entfernen, setzen Sie bitte nicht den ColorIndex = 2 ein, der fr die Farbe WEISS steht. Weisen Sie stattdessen der Eigenschaft ColorIndex die Konstante XlColorIndexNone zu. Im folgenden Beispiel werden die Farben aller Zellen mit einem einzigen Befehl beseitigt:
Listing 6.14: Alle Hintergrundfarben von Zellen in einer Tabelle entfernen Sub FarbenEntfernen() Sheets("Tabelle7").Activate Cells.Interior.ColorIndex = xlColorIndexNone End Sub
ber die Eigenschaft Cells, die Sie ohne weitere Argumente angeben, haben Sie Zugriff auf alle Zellen der aktiven Tabelle. Diese Zellen entfrben Sie, indem Sie die Eigenschaft ColorIndex mit der Konstante XlColorIndexNone bestcken und auf das Objekt Interior anwenden.
Schriftart festlegen
Wie Sie die Standardschriftart von Excel ndern knnen, haben Sie bereits am fnften Tag erfahren. Diese nderung gilt dann fr alle neuen Arbeitsmappen. Um die Schriftart bei allen anderen Arbeitsmappen zu ndern, muss diese ber das Objekt Font angepasst werden.
264
Zellen formatieren
Im nchsten Beispiel soll auf einer bestimmten Tabelle ein vorgegebener Bereich mit einer anderen Schriftart in der Schriftgre 14 formatiert werden. Das Makro fr diese Aufgabe sehen Sie in Listing 6.15:
Listing 6.15: Eine andere Schriftart bzw. Schriftgre einstellen Sub SchriftArtEinstellen() Dim Zelle As Range Dim Bereich As Range Sheets("Tabelle5").Activate Set Bereich = Range("A1:E20") With Bereich.Font .Name = "Garamond" .Size = 14 End With Set Bereich = Nothing End Sub
Aktivieren Sie zuerst einmal die Tabelle, auf der Sie eine andere Schriftart einstellen mchten. Auf dieser Tabelle definieren Sie mithilfe der Anweisung Set einen Bereich. Dieser Bereich wird mit der Schriftart GARAMOND sowie der Schriftgre 14 formatiert. Das Objekt Font hat eine ganze Reihe von Eigenschaften, die Sie anwenden knnen. Fr die eben gestellte Aufgabe werden die beiden Eigenschaften Name und Size gebraucht. Bei der Angabe der Schriftart ist die korrekte Schreibweise der gewnschten Schriftart wichtig. Bei der Eigenschaft Size geben Sie eine gewnschte Gre fr die Schrift an.
Abbildung 6.12: Ein definierter Bereich wurde mit einer anderen Schriftart formatiert.
265
Beschreibung Diese Eigenschaft liefert den Wert True, wenn ein Text FETT formatiert ist. Diese Eigenschaft gibt die Primrfarbe des Objektes wieder. Mglich sind hierbei folgende Konstanten: vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan und vbWhite. Diese Eigenschaft gibt die Farbe des Rahmens, der Schriftart oder des Innenraums zurck. Es existieren in Excel genau 56 Farben. Diese Eigenschaft sagt aus, welcher Schriftschnitt verwendet wird. Mglich sind u.a. Fett- und Kursivdruck. Diese Eigenschaft liefert den Wert True, wenn ein Text KURSIV formatiert ist. Diese Eigenschaft liefert den Wert True, wenn ein Text als Konturschriftart formatiert wird. Diese Eigenschaft liefert den Wert True, wenn ein Text als schattierte Schriftart formatiert wird. Diese Eigenschaft liefert den Wert True, wenn ein Text als horizontal durchstrichen dargestellt wird. Diese Eigenschaft liefert den Wert True, wenn ein Text tiefer gestellt formatiert wird. Diese Eigenschaft liefert den Wert True, wenn ein Text hochgestellt formatiert wird. Diese Eigenschaft liefert den Wert True, wenn ein Text unterstrichen formatiert wird. Dabei knnen Sie u.a. Text einfach oder doppelt unterstreichen.
Color
ColorIndex
FontStyle
Italic
OutLineFont
Shadow
Strikethrough
Subscript
Superscript
Underline
266
Zellen formatieren
In der folgenden Aufgabe erstellen Sie als kleine Vorarbeit eine neue Tabelle und erzeugen im Zellenbereich B2:E20 einige Zufallszahlen. Dabei knnen Sie den Bereich markieren und die Formel =Ganzzahl(Zufallszahl()*1000) einfgen. Schlieen Sie diese Formel ab, indem Sie die Tastenkombination (Strg) + (Enter) drcken. Die gerade erfasste Formel wird nun in jeder Zelle des markierten Bereiches eingefgt. Wenn Sie nun einige Male die Taste (F9) drcken, werden die Zahlen jedes Mal neu gebildet. Ersetzen Sie nun diese Formelzellen in Festwerte, indem Sie den Bereich markieren, kopieren und als Wert einfgen. Sie haben nun Zahlen vorliegen, die zwischen 0 und 999 liegen knnen. Ihre Beispieltabelle msste nun in etwa wie in Abbildung 6.13 aussehen.
Ihre Aufgabe besteht nun darin, alle Zellen, die einen Wert grer als 600 aufweisen, mit dem Schriftschnitt FETT sowie dem Schriftschnitt KURSIV zu formatieren. Erfassen Sie zu diesem Zweck das Makro aus Listing 6.16.
Listing 6.16: Die Schriftschnitte Fett und Kursiv bei Bedarf zuweisen Sub WerteberprfenUndKennzeichnen() Dim Zelle As Range Dim Bereich As Range Sheets("Tabelle9").Activate Set Bereich = Range("B2:E20")
267
For Each Zelle In Bereich If Zelle.Value > 600 Then Zelle.Font.Bold = True Zelle.Font.Italic = True Else End If Next Zelle End Sub
Zu Beginn des Makros deklarieren Sie zwei Objektvariablen vom Typ Range. Danach aktivieren Sie die Tabelle, auf der Sie die Prfung vornehmen mchten, und definieren den Bereich, um den es geht. Jetzt durchlaufen Sie jede einzelne Zelle im definierten Bereich und fragen deren Inhalt ab. Sind die Zahlenwerte grer als der Wert 600, dann weisen Sie dem Objekt Font ber die Eigenschaften Bold und Italic die entsprechenden Schriftschnitte FETT und KURSIV zu.
Zellen rahmen
Fr die Rahmengestaltung von Zellen steht Ihnen in Excel eine ganze Reihe von Mglichkeiten zur Verfgung. Welche Rahmentypen dies im Einzelnen sind, knnen Sie aus der folgenden Tabelle erfahren.
268
Zellen formatieren
Konstante
xlContinuous xlDash xlDashDot xlDashDotDot xlDot xlDouble xlSlantDashDot xlLineStyleNone
Beschreibung Durchgezogene Linie Gestrichelte Linie Linie aus Strichen und Punkten Linie aus Strich-Punkt-Punkt Gepunktete Linie Linie doppelt Linie aus Wellenzeichen und Punkt Keine Linie
Im folgenden Beispiel werden Sie die aktuelle Auswahl mit einem gestrichelten roten Rahmen belegen. Dabei spielt es keine Rolle, ob die Auswahl eine oder mehrere Zellen enthlt. Die Lsung dieser Aufgabenstellung knnen Sie in Listing 6.17 sehen:
Listing 6.17: Einen Bereich mit einem Rahmen versehen Sub RahmenBestimmen() Dim Bereich As Range Sheets("Tabelle10").Activate On Error GoTo fehler Set Bereich = _ Application.InputBox("Markieren Sie einen Bereich", Type:=8) With Bereich.Borders .ColorIndex = 3 .LineStyle = xlDash End With Set Bereich = Nothing Exit Sub fehler: MsgBox "Der Vorgang wurde abgebrochen!" End Sub
269
Fragen Sie mithilfe der Funktion InputBox einen Bereich vom Anwender ab, den dieser ber eine Eingabemaske direkt auf der Tabelle markieren soll. Wird dieser Markierungsvorgang ber die Schaltflche ABBRECHEN abgebrochen, dann wird eine Fehlerbehandlungsroutine durchgefhrt. Markiert der Anwender wie geplant ber die Eingabemaske den Bereich und klickt auf die Schaltflche OK, dann wenden Sie die Eigenschaft ColorIndex auf das Objekt Borders (= Rahmen) an, um die Rahmenfarbe zu bestimmen. Ebenfalls auf das gleiche Objekt angewendet wird die Eigenschaft LineStyle, die Sie mit der Konstanten xlDash belegen, um einen gestrichelten Rahmen zu erzeugen. Weitere Rahmenarten lernten Sie ja bereits in Tabelle 6.2 kennen.
Zahlenformate festlegen
In Excel knnen Sie ber das Dialogfeld FORMAT aus zahlreichen Zahlenformaten die passende Formatierung fr Ihre Daten auswhlen. Des Weiteren sind Sie in der Lage, eigene, benutzerdefinierte Formate anzulegen. In der nchsten Aufgabe soll ein Bereich mit recht hohen Zahlen mit dem Tausenderpunkt formatiert werden. Sehen Sie sich vorerst aber die Abbildung 6.16 an.
270
Zellen formatieren
Erhhen Sie die bersichtlichkeit und weisen Sie diesen Zahlen das TausenderTrennzeichen mithilfe des Makros aus Listing 6.18 zu.
Listing 6.18: Den Tausenderpunkt in das Zahlenformat einbauen Sub FormatierungTausenderPunkt() Sheets("Tabelle11").Activate Range("B2:E5").Select Selection.NumberFormat = "#,##0" End Sub
Das Zahlenformat wird in Excel ber die Eigenschaft NumberFormat zugewiesen. Da Sie vorher den gewnschten Datenbereich markiert haben, knnen Sie diese Eigenschaft direkt auf das Auflistungsobjekt Selection anwenden, in welchem alle Zellen der Markierung verzeichnet sind.
Abbildung 6.17: Die Lesbarkeit der Zahlenwerte ist um ein Vielfaches leichter.
Mchten Sie jegliche Formatierung Ihrer Daten lschen, setzen Sie die Methode ClearFormats ein. In Listing 6.19 werden ber diese Methode die gerade eben gesetzten Tausenderpunkte wieder entfernt.
Listing 6.19: Jegliche Formatierung innerhalb der Markierung wird gelscht Sub FormatierungLschen() Sheets("Tabelle11").Activate Range("B2:E5").Select Selection.ClearFormats End Sub
Datumsformate festlegen
In Excel werden Datumswerte intern in Zahlenwerte umgesetzt, damit Sie damit rechnen knnen. Die Zeitzhlung beginnt bei Excel standardmig am
271
01.01.1900, was der Zahl 1 entspricht. Wenn Sie z.B. das Datum 10.09.2002 eingeben und diese Zelle dann mit dem Format STANDARD belegen, so liefert Ihnen dieses Datum die Zahl 37509. Excel bietet noch ein zweites Datumssystem an, das 1904-Datumssystem. Beim 1904-Datumssystem beginnt die Zeitrechnung in Excel am 01.01.1904. Das Datum 10.09.2002 entspricht in diesem Fall der Zahl 36047. Die Entscheidung, welches Datumssystem Sie whlen, liegt bei Ihnen. Wichtig dabei ist nur, dass Sie durchgngig dasselbe Datumssystem verwenden. Wechseln Sie niemals nachtrglich in einer bereits bestehenden Arbeitsmappe das Datumssystem. Wenn Sie dies trotzdem machen, dann werden alle Datumsangaben in dieser Arbeitsmappe auf das neue Datumssystem umgerechnet. In der nchsten Aufgabe liegen in einer Tabelle unterschiedliche Datumsformatierungen vor. Sehen Sie sich hierfr Abbildung 6.18 an.
Abbildung 6.18: Unterschiedliche Datumsformate sollen auf einen Stand gebracht werden.
Das Datum soll nun in der Form, wie es in Zelle A5 hinterlegt ist, auch fr alle anderen Zellen der Spalte A gltig werden.
Listing 6.20: Datumsformat zuweisen Sub DatumsformatZuweisen() Sheets("Tabelle12").Activate Range("A1:A12").NumberFormat = "DD. MMMM YYYY" End Sub
272
Zellen benennen
Bei der Eigenschaft NumberFormat knnen Sie mit Formatkrzeln arbeiten. Beim Beispiel aus Listing 6.20 steht der Buchstabe D fr den Tag, der Buchstabe M fr den Monat und der Buchstabe Y fr das Jahr. ber die Anzahl der einzelnen Buchstaben knnen Sie die Formatierung des Datums bestimmen.
6.4
Zellen benennen
Selbstverstndlich knnen Sie zur leichteren Navigation auf Tabellenblttern und zur besseren bersichtlichkeit Ihres Quellcodes einzelne Zellen oder Bereiche auch einen Namen geben und diese ber diesen Namen ansprechen. Bei der Vergabe eines Namens mssen Sie darauf achten, dass Sie die allgemeinen Namenskonventionen einhalten. Dabei muss das erste Zeichen des Namens ein Buchstabe oder auch ein Unterstrich sein. Beachten Sie auch, dass Namen nicht wie Zellenbezge benannt werden drfen. Bei der Lnge eines Namens knnen Sie bis zu 255 Zeichen verwenden, was in der Programmierung jedoch eher umstndlich ist. Hier sollten Sie sich auf kurze, aber sprechende Namen verstndigen. Eine weitere Einschrnkung bei der Namensvergebung ist, dass Sie Namen nicht aus mehreren Wrtern bilden drfen, d.h. konkret, dass Sie keine Leerzeichen verwenden drfen. Die Gro- und Kleinschreibung spielt bei der Vergabe von Namen keine Rolle. In der folgenden Aufgabe sollen zwei Bereiche in der TABELLE3 definiert werden. Dabei sollen der Block KOSTEN (Zellen C5:C24) und der Block LEISTUNG (Zellen D5:D24) als Namen angesprochen werden knnen.
273
Listing 6.21: Namen vergeben Sub BereichBenennen() Dim Bereich As Range Dim Bereich2 As Range Set Bereich = Sheets("Tabelle3").Range("C5:C24") ActiveWorkbook.Names.Add _ Name:="Kosten", _ RefersTo:=Bereich, Visible:=True Set Bereich2 = Sheets("Tabelle3").Range("D5:D24") ActiveWorkbook.Names.Add _ Name:="Leistung", _ RefersTo:=Bereich2, Visible:=True Bereich.Select Set Bereich = Nothing Set Bereich2 = Nothing End Sub
In Listing 6.21 definieren Sie zuerst die beiden Bereiche und speichern diese in den Objektvariablen Bereich bzw. Bereich2. Danach wenden Sie die Methode Add an, um die Namen festzulegen. Die Methode Add weist dabei folgende Argumente auf:
Im ersten Argument Name geben Sie den gewnschten Namen an, unter dem Sie spter den Zellbereich ansprechen mchten. Dabei knnen Sie den Namen frei whlen. Sie mssen allerdings darauf achten, dass Sie bei der Namensgebung die vorher beschriebenen Namenskonventionen einhalten. Den gewhlten Namen mssen Sie in Anfhrungszeichen setzen. Das Argument RefersTo gibt an, auf welchen Zellbereich sich der Name beziehen soll. Das Argument Visible bestimmt, ob der Name fr den Anwender sichtbar sein soll oder nicht. Verwendete Namen knnen Sie in Excel anzeigen lassen, indem Sie den Befehl NAME/DEFINIEREN aus dem Men EINFGEN whlen. Setzen Sie das Argument Visible auf den Wert False, wenn Sie verhindern mchten, dass der Anwender den von Ihnen gewhlten Namen einsehen kann.
274
Zellen benennen
Die Standardeinstellung fr dieses Argument ist jedoch True, was bedeutet, dass sowohl die verwendeten Namen als auch deren Zellenadressen vom Anwender eingesehen werden knnen.
Mchten Sie die gerade eingefgten Namen wieder lschen, dann starten Sie das Makro aus Listing 6.22.
Listing 6.22: Namen aus der Arbeitsmappe entfernen Sub NamenEntfernen() On Error Resume Next With ThisWorkbook .Names("Kosten").Delete .Names("Leistung").Delete End With End Sub
Wenden Sie die Methode Delete an, die Sie auf das Auflistungsobjekt Names anwenden. In diesem Auflistungsobjekt sind alle Namen, die in der Arbeitsmappe verwendet werden, dokumentiert. Fr alle Flle sollten Sie eine Fehlerbehand-
275
lung integrieren, die den Fall abfngt, dass ein Name gelscht wird, der bereits nicht mehr in der Arbeitsmappe vorhanden ist. Bei der Fehlerbehandlung in Listing 6.22 wird dieser Fehlerfall einfach ignoriert.
6.5
Zellen kommentieren
Kommentare knnen Sie in Excel u.a. einsetzen, um wichtige Vermerke zu bestimmten Zelleninhalten zu setzen, oder auch, um nderungen an Zellen zu dokumentieren. Ob fr eine Zelle ein Kommentar vorgenommen wurde, erkennen Sie normalerweise am roten Dreieck in der rechten oberen Ecke der Zelle, sofern die Ansicht dieses Indikators unter EXTRAS/OPTIONEN/ANSICHT in Excel eingestellt ist. Wenn Sie den Mauszeiger auf eine Zelle positionieren, wird automatisch ein kleines Textfenster eingeblendet, welches den Kommentar beinhaltet.
Kommentarzellen auskundschaften
Wenn Sie mit sehr groen Tabellen arbeiten, die viele Kommentare enthalten, so ist es mitunter bersichtlicher, wenn Sie alle Kommentare am Stck in eine Liste schreiben und die dazugehrigen Zellenadressen protokollieren. Dazu setzen Sie das folgende Makro aus Listing 6.23 ein.
Listing 6.23: Kommentare auflisten Sub Dim Dim Dim Dim KommentareAuflisten() Notiz As Comment Tabelle As Worksheet DokuBlatt As String i As Integer
Sheets.Add DokuBlatt = ActiveSheet.Name i = 1 For Each Tabelle In ThisWorkbook.Worksheets For Each Notiz In Tabelle.Comments Sheets(DokuBlatt).Cells(i, 1).Value = Notiz.Text Sheets(DokuBlatt).Cells(i, 2).Value = Notiz.Parent.Address & _ " in " & Tabelle.Name
276
Zellen kommentieren
i = i + 1 Next Notiz Next Tabelle Sheets(DokuBlatt).Activate With Columns("A") .ColumnWidth = 40 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With With Columns("B") .ColumnWidth = 10 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With End Sub
Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Comment, um die Notizen der Arbeitsmappe ansprechen zu knnen. Des Weiteren bentigen Sie eine Objektvariable vom Typ Worksheet sowie eine String- und eine Zhlvariable vom Typ Integer. ber die Methode Add fgen Sie eine neue Tabelle ein. Auf dieser Tabelle sollen alle Kommentare, sowohl der Kommentartext als auch die Zellenadresse des Kommentars, dokumentiert werden. Den Namen der neu eingefgten Tabelle speichern Sie in der Stringvariablen DokuBlatt. Setzen Sie die Zhlvariable i auf den Startwert 1. Dieser Startwert steht fr die erste Zeile der Tabelle. Setzen Sie jetzt eine Schleife auf, die alle Tabellen der Arbeitsmappe durchluft. Eine weitere Schleife arbeitet alle Kommentare der einzelnen Tabellen ab. Innerhalb dieser zweiten Schleife fllen Sie das DokuBlatt in der ersten Spalte mit dem Text des jeweiligen Kommentars, den Sie ber die Eigenschaft Text ermitteln knnen. Bei der Ermittlung der Zellenadresse eines Kommentars mssen Sie auf die Eigenschaft Parent zurckgreifen, die das bergeordnete Objekt des Objekts Comment zurckgibt. Mithilfe der Eigenschaft Address gelingt es Ihnen schlielich, die Zellenadresse des Kommentars zu ermitteln und in die zweite Spalte des DokuBlatt zu schreiben. Wurden alle Kommentare gefunden und in das DokuBlatt geschrieben, sorgen Sie noch fr die richtige Formatierung. Dabei definieren Sie ber die Eigenschaft ColumnWidth die Spaltenbreite und kmmern sich mithilfe der Eigenschaften HorizontalAlignment bzw. VerticalAlignment um die Textausrichtung in den Zellen der Spalten A und B.
277
Abbildung 6.21: Alle Kommentare der Arbeitsmappe sind auf einem separaten Blatt aufgelistet.
278
Zellen kommentieren
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Comment sowie eine vom Typ Range. Danach aktivieren Sie die gewnschte Tabelle und markieren den Bereich, dessen Zellen Sie als Kommentare einfgen mchten. In einer anschlieenden Schleife schieben Sie den Inhalt der einzelnen Zellen jeweils in ein Kommentarfenster. Dazu erzeugen Sie ber die Anweisung Set Kom =Zelle.Add Comment ein neues, noch leeres Kommentarfenster. ber die Eigenschaft Text erfassen Sie den Inhalt des Kommentars, der sich aus dem aktuellen Tagesdatum (Date) und dem Zelleninhalt ergibt.
Abbildung 6.22: Alle Zellen im markierten Bereich wurden mit Kommentaren ausgestattet.
279
Sheets("Tabelle3").Activate For Each Kom In ThisWorkbook.Sheets("Tabelle3").Comments Range(Kom.Parent.Address).Offset(0, 3).Value = Kom.Text Next Kom End Sub
Deklarieren Sie zu Beginn eine Objektvariable vom Typ Comment. Mithilfe dieser Variablen bauen Sie sich nun eine Schleife auf, die alle Kommentare der TABELLE3 durchluft und diese um drei Spalten verschoben in die Zellen der Spalten F und G einfgt. Wo der einzelne Kommentar in der Zelle steckt, ermitteln Sie ber die Anweisung Kom.Parent.Address. Die Verschiebung erreichen Sie ber die Eigenschaft Offset, bei der Sie den Zeilen-Offset auf den Wert 0 (keine Zeilenverschiebung) und den Spalten-Offset auf den Wert 3 setzen (Spaltenverschiebung um drei Spalten nach rechts). Den Inhalt des Kommentars ermitteln Sie ber die Eigenschaft Text, welche Sie auf die Objektvariable Kom anwenden.
Abbildung 6.23: Die Kommentare aus den Spalten C und D wurden in die Spalten F und G eingefgt.
Kommentare lschen
Oftmals dienen Kommentare lediglich als individuelle Gedankensttze und sind daher nicht unbedingt immer von allgemeinem Interesse. Wenn Sie also eine Arbeitsmappe versenden und deren Kommentare aus einer bestimmten Tabelle bzw. aus der ganzen Arbeitsmappe entfernen mchten, dann starten Sie eines der drei Makros aus Listing 6.26 bis 6.28, welche folgende Funktionen erfllen:
280
Zellen kommentieren
Lschen von Kommentaren, die sich in einem bestimmten Bereich einer Tabelle befinden Lschen von allen Kommentaren, die sich in einer Tabelle befinden Lschen aller Kommentare, die sich in der Arbeitsmappe befinden
Listing 6.26: Kommentare lschen im markierten Bereich Sub KommentareInTabelleLschen() Sheets("Tabelle3").Activate Range("C5:D24").Select Selection.ClearComments End Sub
Fr das Lschen von Kommentaren setzen Sie die Methode ClearComments ein. Um alle Kommentare einer Tabelle zu entfernen, starten Sie das Makro aus Listing 6.27.
Listing 6.27: Alle Kommentare aus einer Tabelle entfernen Sub KommentareAusTabelleLschen() Dim Kom As Comment For Each Kom In ThisWorkbook.Sheets("Tabelle3").Comments Kom.Delete Next Kom End Sub
Deklarieren Sie zuerst eine Objektvariable vom Typ Comment, die Sie in einer anschlieenden Schleife einsetzen, um alle Kommentare der TABELLE3 abzuarbeiten. Innerhalb der Schleife wenden Sie die Methode Delete an, um die Kommentare zu lschen. Im letzten Makro aus Listing 6.28 werden alle Kommentare, die sich in der Arbeitsmappe befinden, entfernt.
Listing 6.28: Alle Kommentare aus der Arbeitsmappe entfernen Sub KommentareAusMappeLschen() Dim Tabelle As Worksheet Dim Kom As Comment For Each Tabelle In ThisWorkbook.Worksheets
281
For Each Kom In Tabelle.Comments Kom.Delete Next Kom Next Tabelle End Sub
Um alle Kommentare aus einer Arbeitsmappe zu entfernen, bentigen Sie zwei Schleifen. Die erste Schleife arbeitet alle Tabellen der Arbeitsmappe ab. Die zweite Schleife durchluft alle Kommentarzellen der jeweiligen Tabelle und entfernt die Kommentare mit Hilfe der Methode Delete. Gerade haben Sie gelernt, wie Sie Zellen ansteuern und auslesen knnen. Des Weiteren knnen Sie jetzt Zellen formatieren, benennen und mit Kommentaren belegen. Die Themen nun:
Arbeiten mit Formeln Tabellenfunktionen einsetzen Formeln finden und dokumentieren Gltigkeitsprfungen vornehmen
6.6
Wenn wir von Formeln in VBA sprechen, dann meinen wir in erster Linie die vier Grundrechenarten, die Sie vom Taschenrechner her kennen. Auch bei den Rechenregeln rechnet Excel nach der allgemein gltigen Punkt-vor-Strich-Regel. Es folgen nun einige praktische Beispiele, in denen diese Rechenoperationen demonstriert werden. Alle Makrobeispiele knnen Sie in der Arbeitsmappe ZellenProg.xls im Verzeichnis Kap06 auf der beiliegenden CD-ROM nachschlagen.
282
nicht um das Hochzhlen der Zhlvariablen kmmern. Diese Aufgabe erledigt Excel intern selbst. In der folgenden Aufgabe soll eine Tabelle Satz fr Satz abgearbeitet werden. Dabei sollen Stze gezhlt werden, die einer bestimmten Bedingung (numerischer Inhalt) entsprechen. Sehen Sie sich vorher Abbildung 6.24 an.
In dieser Tabelle soll die Anzahl der numerischen Werte ermittelt und diese addiert werden. Das Makro dafr lautet:
Listing 6.29: Numerische Zellen werden gezhlt und summiert Sub Dim Dim Dim WerteZhlenUndAddieren() i As Integer z As Integer Summe As Single
Sheets("Tabelle1").Activate Range("A1").Select z = 0 Summe=0 For i = 1 To ActiveSheet.UsedRange.Rows.Count If IsNumeric(ActiveCell) Then z = z + 1 Summe = Summe + ActiveCell.Value Else
283
End If ActiveCell.Offset(1, 0).Select Next i MsgBox "Es wurden " & z & " numerische Werte gefunden!" & _ Chr(13) & _ "Die Summe der numerischen Werte betrgt: " & Summe End Sub
Definieren Sie zu Beginn des Makros zwei Zhlvariablen vom Typ Integer. Die eine davon wird fr die Schleifensteuerung bentigt, die zweite wird die Anzahl der numerischen Werte in der Tabelle ermitteln. Jetzt bentigen Sie eine Variable vom Typ Single, in der Sie die Summe der numerischen Zelleninhalte speichern knnen. Dabei haben Sie mit diesem Datentyp die Mglichkeit, auch Nachkommastellen mitzuverarbeiten. Setzen Sie die Variablen z und Summe zu Beginn sicherheitshalber auf den Wert 0. Die Variable i wird in der anschlieenden Schleife auf den Startwert 1 gesetzt. Die Schleife wird solange durchlaufen, bis die letzte gefllte Zeile in der Tabelle erreicht ist. Diese letzte Zeile ermitteln Sie mit der Anweisung ActiveSheet.UsedRange.Rows.Count. Innerhalb der Schleife prfen Sie mithilfe der Funktion IsNumeric, ob in der aktiven Zelle ein numerischer Wert steht. Wenn ja, dann addieren Sie die Zhlvariable z um den Wert 1 und speichern den Zellenwert in der Variablen Summe. Setzen Sie danach den Mauszeiger eine Zeile weiter nach unten und arbeiten Sie die Schleife Satz fr Satz ab. Geben Sie die Anzahl sowie die Summe der ermittelten Stze am Ende des Makros ber die Funktion MsgBox auf dem Bildschirm aus.
284
Da Excel intern Datumsangaben in Zahlen umrechnet, ist es kein Problem, Datumsangaben miteinander zu verrechnen. Deklarieren Sie zu Beginn des Makros eine Variable vom Typ Date. Danach wenden Sie die Funktion Date an, die Ihnen das aktuelle Tagesdatum meldet, und subtrahieren Sie davon die Zahl 30. Geben Sie das Ergebnis auf dem Bildschirm ber die Funktion MsgBox aus.
285
Ihre Aufgabe besteht nun darin, die Preise um den Faktor, der in Zelle F1 angegeben ist, zu erhhen. Dabei sollen die alten Preise in Spalte C erhalten bleiben. Schreiben Sie die neuen Preise in Spalte D.
Listing 6.31: Preise erhhen und runden Sub PreisAnpassung() Dim Faktor As Single Sheets("Tabelle2").Activate Range("C2").Select Faktor = Range("F1").Value Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.Round(ActiveCell.Value * Faktor, 2) ActiveCell.Offset(1, 0).Select Loop End Sub
Deklarieren Sie zu Beginn des Makros eine Variable vom Typ Single, in der Sie den Faktor aus Zelle F1 speichern, mit dem Sie Ihre Preise anpassen mchten. Nachdem Sie die gewnschte Tabelle und die Startzelle aktiviert haben, durchlaufen Sie eine Schleife, die solange luft, bis sie auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife fllen Sie die Nebenspalte D mit den neu kalkulierten Preisen. Dabei multiplizieren Sie den aktuellen Zellenwert aus Spalte C mit dem Faktor und runden das Ergebnis ber die Funktion Round. Geben Sie bei dieser Funktion noch an, nach wie vielen Stellen hinterm Komma gerundet werden soll.
286
Die DM-Betrge sollen jetzt ber ein Makro umgerechnet und in der Spalte D eingefgt werden. Die Lsung dieser Aufgabe sehen Sie in Listing 6.32.
Listing 6.32: Alte DM-Betrge in Euro umrechnen Sub WhrungUmrechnen() Sheets("Tabelle3").Activate Range("C2").Select Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.Round(ActiveCell.Value / 1.95583, 2)
287
Nachdem Sie die gewnschte Tabelle und die Startzelle aktiviert haben, durchlaufen Sie eine Schleife, die solange luft, bis sie auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife fllen Sie die Nebenspalte D mit den umgerechneten Preisen. Dabei dividieren Sie den aktuellen Zellenwert aus Spalte C mit dem Faktor 1,95583 und runden das Ergebnis ber die Funktion Round auf zwei Stellen hinterm Komma.
6.7
Tabellenfunktionen einsetzen
In Excel haben Sie die Mglichkeit, mehrere hundert verschiedene Funktionen ber die normale Arbeitsoberflche einzusetzen. Sehr viele dieser Tabellenfunktionen knnen Sie auch in VBA einsetzen.
Die Funktionsliste
Alle VBA-Tabellenfunktionen mssen in der englischen Syntax angegeben werden, was nicht unbedingt leicht ist, wenn Sie tglich mit den deutschen Tabellenfunktionen in der normalen Arbeitsoberflche arbeiten. Microsoft bietet Ihnen aber eine Hilfe an, indem sie Ihnen eine Excel-Tabelle mit ausliefert, in der Sie eine Gegenberstellung der deutschen und englischen Funktionen finden. Diese Arbeitsmappe heit VBAListe.xls und befindet sich in einem Unterverzeichnis von Office. Suchen Sie diese Arbeitsmappe am besten mit der Windows-Suchen-Funktion.
288
Tabellenfunktionen einsetzen
Mit dieser Liste knnen Sie sich daranmachen, die ersten Tabellenfunktionen ber VBA zu benutzen.
Aktivieren Sie im ersten Schritt die gewnschte Tabelle. Danach weisen Sie der Ergebniszelle direkt ber die Eigenschaft WorksheetFunction die Funktion Sum (= Summe) zu. Diese Funktion verlangt als Argument den Bereich, den sie summieren soll.
289
Wie Sie in Abbildung 6.32 sehen, wird nur das Ergebnis der Tabellenfunktion in Zelle D11 eingefgt. Im nchsten Makro aus Listing 6.34 wird die Tabellenfunktion so eingefgt, dass diese nicht als Wert, sondern als wirkliche Funktion hinterlegt wird.
Listing 6.34: Eine Tabellenfunktion in eine Zelle einfgen (mit deutschen Befehlen) Sub SummeEinsetzenAlsTabFunktion() Sheets("Tabelle2").Activate Range("D11").FormulaLocal = _ "=Summe(D2:D9)" End Sub
Mithilfe der Eigenschaft FormulaLocal haben Sie die Mglichkeit, die Tabellenfunktionen so anzugeben, wie Sie es von der Standardoberflche her kennen. Sollten Sie mit anderssprachigen Anwendern Makros austauschen, empfiehlt sich aber doch die englische Variante, welche Sie in Listing 6.35 sehen knnen.
Listing 6.35: Eine Tabellenfunktion in eine Zelle einfgen (mit englischen Befehlen) Sub SummeEinsetzenAlsTabFunktionEng () Sheets("Tabelle2").Activate Range("D11").Formula = _ "=Sum(D2:D9)" End Sub
In diesem Fall setzen Sie die Eigenschaft Formula ein und geben die Tabellenfunktion in der englischen Schreibweise ein. Dieses Makro funktioniert dann auch in allen Sprachversionen.
290
Tabellenfunktionen einsetzen
Ermitteln des Alters der Personen in Jahren Ermitteln der drei ltesten Personen
291
Fllen Sie jetzt die Spalte C, indem Sie die Tabellenfunktion DATEDIF einsetzen. Sehen Sie sich dazu das Makro aus Listing 6.36 an.
Listing 6.36: Das Alter mithilfe der Tabellenfunktion Datedif ermitteln Sub AlterErmitteln() Sheets("Tabelle4").Activate Range("B4").Select Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).FormulaLocal = _ "=DATEDIF(" & ActiveCell.Address & ";B1;""Y"")" ActiveCell.Offset(1, 0).Select Loop End Sub
In einer Schleife fllen Sie die Spalte C mit dem Alter der jeweiligen Personen. Dabei setzen Sie die Tabellenfunktion DATEDIF ein, der Sie im ersten Argument die Adresse der aktiven Zelle bergeben mssen und im zweiten Argument das aktuelle Tagesdatum, welches in Zelle B1 steht. Im dritten Argument legen Sie ber ein Formatkrzel fest, in welcher Einheit Sie das Alter haben mchten. (Tag = D, Monat = M und Jahr = Y). Nachdem das Krzel in doppelten Anfhrungsstrichen eingegeben werden muss, mssen Sie in diesem Fall noch zwei weitere doppelte Anfhrungsstriche setzen, damit der VBA-Editor die Eingabe richtig auswerten kann.
Im nchsten Schritt sollen die ltesten Personen ermittelt werden. Erfassen Sie zu diesem Zweck das Makro aus Listing 6.37:
292
Tabellenfunktionen einsetzen
Listing 6.37: Die ltesten Personen ber die Funktion Rank bestimmen Sub RangErmitteln() Dim Bereich As Range Sheets("Tabelle4").Activate Set Bereich = Range("C4:C15") Range("C4").Select Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.WorksheetFunction.Rank(ActiveCell, Bereich) ActiveCell.Offset(1, 0).Select Loop End Sub
Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Range. In dieser Variablen geben Sie mithilfe der Anweisung Set bekannt, welcher Zellenbereich fr die Rangfolgenbestimmung herangezogen werden soll. Setzen Sie danach den Mauszeiger auf die Startzelle und durchlaufen eine Schleife, die solange durchlaufen wird, bis das Makro auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife fgen Sie die Tabellenfunktion Rank ber die Eigenschaft WorksheetFunction ein und bergeben dieser Funktion die aktive Zelle sowie den vorher definierten Bereich.
293
Aufgabe knnen Sie die Worksheet-Funktion SumIf (= Summewenn) einsetzen. Mithilfe dieser Tabellenfunktion knnen Sie also eine bedingte Summierung durchfhren.
Listing 6.38: Die bedingte Summierung von Werten Sub BedingteSummierung() Dim Betrag As Single Sheets("Tabelle3").Activate Betrag = Application.WorksheetFunction.SumIf(Range("D2:D9"), ">500") MsgBox "Die Summe der Werte > 500 _ betrgt:" & _ Chr(13) & Format(Betrag, "#,##0.00 _"), vbInformationsgBox End Sub
bergeben Sie der Tabellenfunktion zuerst einmal den Bereich, der summiert werden soll. Im darauf folgenden Argument formulieren Sie die Bedingung. Mithilfe der Funktion Format weisen Sie dem Ergebnis das gewnschte Format zu.
Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in die TABELLE3 eingefgt werden, starten Sie das folgende Makro aus Listing 6.39.
Listing 6.39: Die Tabellenfunktion bleibt als Funktion in der Tabelle erhalten Sub BedingteSummierungAlsFunktion() Sheets("Tabelle3").Activate Range("D12").Formula = "=SumIf(D2:D9,"">500"" )" End Sub
294
Tabellenfunktionen einsetzen
Weisen Sie der Eigenschaft Formula die Tabellenfunktion SumIf zu und achten Sie dabei darauf, dass Sie um Bedingung ein zustzliches doppelte Anfhrungszeichen setzen mssen, damit der VBA-Editor dies so erkennen kann.
bergeben Sie der Funktion CountIf den Bereich, in dem Sie die Personen zhlen mchten, die lter als 60 Jahre sind. Die Bedingung >60 formulieren Sie gleich im Anschluss daran.
Abbildung 6.38: Alle Personen, die lter als 60 sind, werden gezhlt und ausgegeben.
295
Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in die TABELLE4 eingefgt werden, dann starten Sie das folgende Makro aus Listing 6.41.
Listing 6.41: Die Tabellenfunktion wird als Funktion eingefgt Sub BedingteZhlungAlsFunktion() Sheets("Tabelle4").Activate Range("C18").Formula = "=CountIf(C4:C15, "">60"")" End Sub
Weisen Sie der Eigenschaft Formula die Tabellenfunktion CountIf zu und achten Sie dabei darauf, dass Sie um die Bedingung ein zustzliches doppeltes Anfhrungszeichen einfgen mssen, damit der VBA-Editor dies so erkennen kann.
296
Tabellenfunktionen einsetzen
Listing 6.42: Alle numerischen Werte einer Liste zhlen Sub ZhlenNumerischeWerte() Dim i As Integer Sheets("Tabelle1").Activate i = Application.WorksheetFunction.Count(Range("A1:A17")) MsgBox "Die Anzahl der numerischen Werte, lautet:" & _ Chr(13) & i, vbInformation End Sub
Wenden Sie die Tabellenfunktion Count (=Anzahl) an, um numerische Werte einer Liste zu zhlen. Den Bereich, der dabei berprft werden soll, geben Sie direkt im Anschluss an diese Tabellenfunktion an.
297
Sheets("Tabelle1").Activate i = Application.WorksheetFunction.CountA(Range("A1:A17")) MsgBox "Die Anzahl der gefllten Zellen, lautet:" & _ Chr(13) & i, vbInformation End Sub
Mchten Sie nicht das Ergebnis der Tabellenfunktionen, sondern eben die Tabellenfunktionen selbst einfgen, starten Sie das Makro aus Listing 6.44.
Listing 6.44: Die Zhlfunktionen in die Tabelle einfgen Sub ZhlungAlsFunktionen() Sheets("Tabelle1").Activate Range("A19").Formula = "=Count(A1:A17)" Range("B19").Formula = "'=Count(A1:A17)" Range("A20").Formula = "=CountA(A1:A17)" Range("B20").Formula = "'=CountA(A1:A17)" End Sub
In der Spalte B werden die eingesetzten Funktionen aus Dokumentationszwecken noch mal als Text eingefgt. Wie Sie sehen, setzen Sie zwar englische Funktionen zum Fllen der Zellen ein. In Spalte A werden diese aber automatisch in ihre eingestellte Sprache umgesetzt. In Spalte B unterbleibt diese Konvertierung, da Sie als erstes Zeichen fr die jeweilige Zelle einen Apostroph gesetzt und somit diese Zelle als Text definiert haben. Sie haben gerade gelernt, wie Sie die Anzahl der numerischen Zellen sowie die Anzahl aller gefllten Zellen eines Bereiches zhlen knnen. Wie aber knnen Sie die alphanumerischen Zellen eines Bereiches zhlen? Fr diese Aufgabenstellung gibt es keine eigene Tabellenfunktion in Excel. Sie knnen aber die beiden Tabellenfunktionen CountA und Count voneinander subtra-
298
Tabellenfunktionen einsetzen
hieren, um die Anzahl der alphanumerischen Zellen zu erhalten, wie Sie das im folgenden Makro sehen knnen.
Listing 6.45: Zhlen von alphanumerischen Zellen Sub ZhlenAlphanumerischeZellen() Dim i As Integer Sheets("Tabelle1").Activate i = Application.WorksheetFunction.CountA(Range("A1:A17")) _ - Application.WorksheetFunction.Count(Range("A1:A17")) MsgBox "Die Anzahl der alphanumerischen Zellen, lautet:" & _ Chr(13) & i, vbInformation End Sub
Durch die Subtraktion beider Tabellenfunktionen erhalten Sie die korrekte Anzahl der alphanumerischen Zellen.
bergeben Sie der Tabellenfunktion CountBlank den Bereich, den Sie nach leeren Zellen absuchen mchten. Enthlt eine Zelle lediglich ein Leerzeichen, dann meldet die Funktion CountBlank diese Zelle nicht als leer. Sie ist zwar optisch leer, fr Excel aber ist das Leerzeichen eben auch ein gltiger Wert.
299
Um solche leeren Zellen besser sehen zu knnen, knnen Sie aus dem Men EXTRAS den Befehl OPTIONEN whlen und auf das Registerblatt UMSTEIGEN wechseln. Aktivieren Sie dort das Kontrollkstchen ALTERNATIVE BEWEGUNGSTASTEN und besttigen Sie mit OK. Nun werden leere Zellen, sofern diese aktiviert wurden, in der Bearbeitungsleiste dadurch gekennzeichnet, dass dort ein Apostroph angezeigt wird.
Abbildung 6.42: Leerzeichen in Zellen werden nun in der Bearbeitungsleiste angezeigt.
Da fhrende bzw. nachgestellte Leerzeichen in der Programmierung oft Probleme machen, gibt es in VBA eine Funktion (Trim), die Ihnen hilft, diese Leerstellen zu beseitigen. Das folgende Makro entfernt innerhalb einer Markierung alle Leerzeichen.
Listing 6.47: Leerzeichen aus markierten Zellen entfernen Sub LeerzeichenEntfernen() Dim zelle As Range For Each zelle In Selection zelle.Value = Trim(zelle.Value) Next zelle End Sub
Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Range. Danach durchlaufen Sie alle Zellen einer Markierung und wenden die Funktion Trim an, um alle Leerzeichen aus den markierten Zellen zu entfernen.
6.8
In umfangreichen Tabellen ist es gar nicht so einfach, den berblick zu bewahren, vor allem, wenn darin viele Formeln und Funktionen verwendet werden.
300
Formelzellen finden
Eine Mglichkeit, sich Formeln, Funktionen und Verknpfungen anzeigen zu lassen, besteht darin, die Tastenkombination (Strg) + (#) zu drcken, um in die Formelansicht zu wechseln. Durch erneutes Drcken dieser Tastenkombination wird die Normalansicht von Excel wiederhergestellt. Eine andere Hilfe wre, alle Formeln und Verknpfungen der aktuellen Tabelle zu markieren. Dabei gehen Sie wie folgt vor: 1. Drcken Sie die Taste (F5), um das Dialogfeld GEHE ZU aufzurufen. 2. Klicken Sie danach auf die Schaltflche INHALTE. 3. Im Dialogfeld INHALTE FORMELN.
AUSWHLEN
4. Besttigen Sie mit OK. Als Ergebnis werden nun alle Formelzellen der aktuellen Tabelle markiert. Mit der Taste () knnen Sie dann von Zelle zu Zelle springen und die Formel in der Bearbeitungsleiste ansehen. Diese gerade durchgefhrte Aufgabe knnen Sie auch ber den Einsatz eines VBA-Makros erledigen, welches Sie in Listing 6.48 sehen knnen:
301
Listing 6.48: Formelzellen in einer Tabelle markieren Sub FormelZellenMarkieren() Sheets("Tabelle4").Activate Selection.SpecialCells(xlCellTypeFormulas).Select End Sub
Mithilfe der Methode SpecialCells, der Sie die Konstante xlCellTypeFormulas bergeben, werden alle Zellen auf dem Tabellenblatt markiert, die entweder Formeln, Funktionen oder Verknpfungen enthalten.
ber die Methode SpecialCells knnen Sie mithilfe der folgenden Konstanten aus Tabelle 6.3 auch andere Zellen markieren.
Konstante
xlCellTypeAllFormatConditions xlCellTypeAllValidation xlCellTypeBlanks xlCellTypeComments xlCellTypeConstants
Beschreibung Markiert alle formatierten Zellen Zellen mit Gltigkeitsregeln werden markiert. Gibt alle leere Zellen an Zellen mit Kommentaren werden markiert. Zellen mit Konstanten werden markiert.
302
Konstante
xlCellTypeFormulas xlCellTypeLastCell
Beschreibung Zellen mit Formeln werden markiert. Letzte Zelle im benutzten Bereich wird angesteuert. Zellen mit gleichem Format werden markiert. Zellen mit gleichen Gltigkeitskriterien werden markiert. Alle sichtbaren Zellen werden markiert.
xlCellTypeSameFormatConditions xlCellTypeSameValidation
xlCellTypeVisible
Formelzellen dokumentieren
Wir werden jetzt einen Schritt weiter gehen. Nachdem Sie gerade erfahren haben, wie Sie die Formelzellen der aktiven Tabelle ermitteln knnen, werden Sie jetzt alle verwendeten Formeln und Funktionen der Arbeitsmappe auf einer neuen Tabelle dokumentieren. Dabei sind folgende Informationen fr die Dokumentation von Interesse:
Name des Tabellenblattes Zellenadresse der Formel oder Funktion Formel oder Funktion Ergebnis der Formel oder Funktion
Um diese Aufgabe zu lsen, erfassen Sie das Makro aus Listing 6.49:
Listing 6.49: Alle Formeln und Funktionen werden in einer neuen Tabelle dokumentiert Sub Dim Dim Dim Dim FormelnUndFunktionenDokumentieren() i As Integer Zelle As Range s As String l As Long
303
For i = 2 To ThisWorkbook.Worksheets.Count Worksheets(i).Activate On Error Resume Next Selection.SpecialCells(xlCellTypeFormulas).Select For Each Zelle In Selection Sheets(s).Cells(l, 1).Value = Worksheets(i).Name Sheets(s).Cells(l, 2).Value = Zelle.Address Sheets(s).Cells(l, 3).Value = "'" & Zelle.FormulaLocal Sheets(s).Cells(l, 4).Value = Zelle.Value l = l + 1 Next Zelle Next i Sheets(s).Columns("A:D").AutoFit End Sub
Im ersten Schritt des Makros fgen Sie ber die Methode Add ein neues, noch leeres Tabellenblatt in die erste Position der Mappe ein. Danach speichern Sie den Namen dieser Tabelle mithilfe der Eigenschaft Name in der Variablen s. Erfassen Sie nun die berschriftenzeile dieser neuen Tabelle und verwenden dabei die Eigenschaft Cells, der Sie als Zeilenargument die Variable l bergeben, die Sie zuvor auf den Wert 1 gesetzt haben. Damit sprechen Sie also die erste Zeile dieser Tabelle an. Als Spaltenargument setzen Sie je nach Spalte den Wert 1 bis 4 ein, um die Spalten A bis D anzusprechen. Markieren Sie direkt im Anschluss diese vier gefllten berschriftenzellen und formatieren Sie mit dem Schriftschnitt FETT, indem Sie die Eigenschaft Bold auf das Objekt Font anwenden. Im nchsten Schritt durchlaufen Sie eine Schleife, die jede einzelne Tabelle der Arbeitsmappe durchluft. Innerhalb dieser Schleife aktivieren Sie das jeweilige Tabellenblatt ber die Methode Activate und markieren alle Formelzellen mithilfe der Anweisung Selection.SpecialCells(xlCellTypeFormulas).Select. Sollte eine Tabelle keine Formel enthalten, dann sorgen Sie ber die Anweisung On Error Resume Next dafr, dass es zu keinem Makroabsturz kommt. Enthlt eine
304
Tabelle also keine Formelzellen, dann wird dies einfach ignoriert und die Makroverarbeitung wird fortgesetzt. Sind nun alle Formelzellen der momentan aktiven Tabelle markiert, dann durchlaufen Sie in einer weiteren Schleife alle markierten Zellen. Innerhalb dieser Schleife, schreiben Sie den Namen der momentanen Tabelle in das Dokumentationsblatt in Spalte A. Um den Namen zu ermitteln, setzen Sie die Eigenschaft Name ein, die Sie auf das Auflistungsobjekt Worksheets anwenden. Der Index dieses Auflistungsobjekts, den Sie ber die Variable i variabel halten, gibt Ihnen Auskunft darber, welche Tabelle gerade aktiv ist. Die Zellenadresse der jeweiligen Formelzelle knnen Sie ber die Eigenschaft Address erfahren und in das Dokumentationsblatt in Spalte B schreiben. Die eigentliche Formel, die in der markierten Zelle steht, fragen Sie mithilfe der Eigenschaft FormulaLocal ab und tragen Sie in Spalte C des Dokumentationsblattes ein. Damit diese Formel aber nicht gerechnet wird, mssen Sie dabei als erstes Zeichen ein Apostroph einfgen, damit die Formel als Text angezeigt wird. Den Wert der markierten Formelzelle bekommen Sie ber die Eigenschaft Value, die Sie im Dokumentationsblatt in Spalte D schreiben. Stellen Sie am Ende des Makros die Spalten noch so ein, dass alle Eintrge auch auf einen Blick angezeigt werden. Verwenden Sie zu diesem Zweck die Methode AutoFit, die Sie fr die Spalten A bis D anwenden.
305
6.9
Gltigkeitsprfungen vornehmen
Seit der Version 97 ist es in Excel standardmig mglich, fr bestimmte Zellen und Bereiche eine Gltigkeitsfunktion anzuwenden. Sie haben dabei die Mglichkeit zu bestimmen, welche Eingaben in einem Bereich gemacht werden drfen und welche nicht. Bei Falscheingaben knnen Sie dem Anwender mittels einer Bildschirmmeldung mitteilen, wie er die Eingabe zu machen hat. Wenn Sie mchten, knnen Sie den Anwender sogar schon vor der Eingabe beim Positionieren des Cursors im Gltigkeitsbereich durch eine QuickInfo-Meldung auf die richtige Eingabesyntax aufmerksam machen. Die Funktion GLTIGKEIT knnen Sie einstellen, indem Sie aus dem Men DATEN den Befehl GLTIGKEIT auswhlen. Standardmig sehen Sie es den Zellen nicht an, ob diese mit einem Gltigkeitskriterium ausgestattet sind oder nicht. Erst wenn Sie den Mauszeiger auf eine Zelle mit eingestellten Gltigkeitskriterien positionieren und vorher eine Eingabemeldung definiert haben, erkennen Sie die Zellen mit Gltigkeitsfunktion. Eine kleine Ausnahme bildet das Auswahlkriterium LISTE. Damit knnen Sie fr eine Zelle gleich mehrere mgliche Eingaben akzeptieren, die auf eine Liste verweisen. In diesem Fall erscheint nach dem Positionieren des Mauszeigers ein Dropdown-Symbol am rechten unteren Rand der Gltigkeitszelle, welches Ihnen nach einem Klick ein Auswahlfenster mit den mglichen Eingabewerten der Liste anbietet. Lernen Sie nun einige Gltigkeitseinstellungen kennen, die Sie ber den Einsatz von VBA-Makros in Ihre Tabellen einfgen.
306
Gltigkeitsprfungen vornehmen
.Add Type:=xlValidateWholeNumber, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="1", _ Formula2:="10" .InputTitle = "Zahl eingeben!" .ErrorTitle = "Keine gltige Zahl!" .InputMessage = _ "Geben Sie eine Zahl zwischen 1 und 10 ein." .ErrorMessage = _ "Sie mssen eine Zahl zwischen 1 und 10 eingeben." End With End Sub
Mithilfe der Methode Add fgen Sie der Zelle C3 eine Gltigkeitsregel hinzu. Im ersten Argument Type legen Sie das Gltigkeitskriterium fest. Die mglichen Gltigkeitskriterien entnehmen Sie Tabelle 6.4.
307
Type
xlValidateInputOnly xlValidateWholeNumber
Index
0 1
Beschreibung Jede Eingabe ist erlaubt. Nur ganze Zahlen im definierten Zahlenbereich sind erlaubt. Nur Dezimalzahlen im definierten Wertbereich werden zugelassen. Es sind nur Eingaben aus einer vorher definierten Liste mglich. Es sind nur Datumswerte im definierten Datumsbereich erlaubt. Es sind nur Zeitwerte im definierten Rahmen zulssig. Es werden nur Eingaben mit bestimmten Lngen zugelassen. Benutzerdefiniertes Gltigkeitskriterium
xlValidateDecimal
xlValidateList
xlValidateDate
XlValidateTime
XlValidateTextLength
XlValidateCustom
Das zweite Argument AlertStyle legt den Stil der Gltigkeitsmeldung fest. Mglich sind hierbei xlValidAlertInformation, xlValidAlertStop oder xlValidAlertWarning. Je nach gewhltem Stil wird ein anderes Symbol in der Meldung angezeigt bzw. wird entsprechend auf Falscheingaben reagiert. Der AlertStyle xlValidAlertStop lsst beispielsweise keine andere Eingabe als die definierte zu. Beim AlertStyle xlValidAlertWarning wird zwar bei einer Falscheingabe eine Warnmeldung angezeigt, die Eingabe wird aber trotzdem zugelassen. Beim nchsten Argument, dem Operator, orientieren Sie sich an Tabelle 6.5:
Operator-Konstante
xlBetween xlNotBetween xlEqual
Beschreibung Zellenwert ist zwischen ... Zellenwert ist nicht zwischen ... Zellenwert ist gleich ...
308
Gltigkeitsprfungen vornehmen
Operator-Konstante
xlNotEqual xlGreater xlGreaterEqual xlLess xlLessEqual
Beschreibung Zellenwert ist ungleich ... Zellenwert ist grer ... Zellenwert ist grer oder gleich ... Zellenwert ist kleiner ... Zellenwert ist kleiner oder gleich ...
Die beiden letzten Argumente Formula1 und Formula2 beinhalten die Wertgrenzen. Sehen Sie nun das Ergebnis des Makros in Abbildung 6.48.
Datumsgrenzen einstellen
Mithilfe der Gltigkeitsfunktion in Excel knnen Sie auch Datumsgrenzen festlegen. So sollen beispielsweise in Zelle C4 nur Datumsangaben vom 1.1.2002 bis zum 31.12.2002 gemacht werden drfen. Das Makro fr diese Aufgabe knnen Sie in Listing 6.51 sehen.
Listing 6.51: Datumsgrenzen als Gltigkeit festlegen Sub Datumsgrenzen() Sheets("Tabelle5").Activate Range("C4").Select With Selection.Validation .Delete
309
.Add Type:=xlValidateDate, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, _ Formula1:=CDate("1/1/2002"), _ Formula2:=CDate("31/12/2002") .IgnoreBlank = True .InputTitle = "Datum eingeben" .ErrorTitle = "Falsches Datum" .InputMessage = _ "Gltiges Datum zw. dem 1.1.2002 und dem 31.12.2002 eingeben" .ErrorMessage = _ "Sie haben kein gltiges Datum eingegeben!" .ShowInput = True .ShowError = True End With End Sub
Vorsorglich lschen Sie eine eventuell schon bestehende Gltigkeitsregel mit der Methode Delete. Danach fgen Sie eine neue Gltigkeitsregel ber die Methode Add ein und legen den Gltigkeitstyp ber die Eigenschaft Type fest. Bei der Eingabe des Gltigkeitskriteriums mssen Sie auf alle Flle die Funktion
CDate verwenden. Sie sorgt dafr, dass die String-Angabe ("1/1/2002") in ein glti-
Die Eigenschaft IgnoreBlank setzen Sie auf den Wert True, wenn Sie leere Werte zulassen mchten. Danach definieren Sie zuerst den Eingabetitel sowie die Fehlertitel und anschlieend die beiden Meldungen. Bei den beiden Eigenschaften ShowInput
310
Gltigkeitsprfungen vornehmen
und ShowError handelt es sich um eine Art Schalter, den Sie setzen knnen. Standardmig sind diese beiden Schalter jedoch gesetzt. Indem Sie einen Schalter auf den Wert False setzen, wird die definierte Meldung als QuickInfo nicht mehr angezeigt.
Gltigkeitsliste erstellen
Um dem Anwender mgliche Eingaben anzubieten, knnen Sie diese auch in einer Liste zusammenstellen und ihm als Zellen-Dropdown anbieten. In der folgenden Aufgabe aus Listing 6.52 wird auf der TABELLE5 in der Zelle C5 ein Zellen-Dropdown eingefgt, welches verfgbare Kostenstellen anbietet.
Listing 6.52: Eine Gltigkeitsliste erstellen Sub ListeDefinieren() Sheets("Tabelle5").Activate Range("C5").Select With Selection.Validation .Delete .Add Type:=xlValidateList, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlEqual, _ Formula1:="1790, 1800, 1830, 1850, 1900" .InputMessage = _ "Bitte Kostenstelle auswhlen" End With End Sub
Um eine Gltigkeitsliste zusammenstellen zu knnen, mssen Sie eine Gltigkeit ber die Methode Add vom Typ xlValidateList einfgen. Danach geben Sie im Argument Operator die Konstante XlEqual an und im Argument Formula1 die einzelnen mglichen Kostenstellen, jeweils getrennt durch ein Komma, ein.
311
Wie knnen Sie die letzten fnf Zellen einer Spalte markieren?
A
ber die Eigenschaft End ermitteln Sie die letzte belegte Zelle der Spalte A. Von da ab markieren Sie ber die Methode Select die darber liegenden vier Zellen, indem Sie den Zellen-Offset auf den Wert 4 setzen.
F
Wie knnen Sie aus allen benutzten Zellen einer Tabelle die Leerzeichen eliminieren?
A
ber die Anweisung ActiveSheet.Usedrange erfahren Sie den bentzten Bereich Ihrer Tabelle. Durchlaufen Sie danach jede einzelne Zelle dieses Bereichs und setzen Sie die Funktion Trim ein, um die Leerzeichen in den Zellen zu entfernen.
F
Wie knnen Sie ber den Einsatz einer Tabellenfunktion in VBA den zweitgrten Wert in einem Bereich ermitteln?
A
312
Quiz
Listing 6.55: Die zweitgrte Zahl in einem Bereich ausgeben Sub ZweitGrteZahlErmitteln() Dim i As Single Sheets("Tabelle1").Activate i = Application.WorksheetFunction.Large(Range("A1:A17"), 2) MsgBox "Die zweit-grte Zahl lautet: " & _ Chr(13) & i, vbInformation End Sub
Die Funktion Large bentigt zwei Argumente. Im ersten Bereich geben Sie die Adresse des Bereichs an, in dem Sie nach der zweithchsten Zahl suchen mchten. Das zweite Argument gibt den Rang wieder.
F
Wie knnen Sie die Anzahl der Formelzellen auf einer Tabelle zhlen?
A
ber die Methode SpecialCells, der Sie die Konstante xlFormulas mitgeben, knnen Sie die Formelzellen in einer Tabelle ermitteln. Diese markieren Sie ber die Methode Select. Innerhalb der Schleife zhlen Sie die markierten Zellen.
6.11 Quiz
F F
Wie kann man mithilfe der Eigenschaft Cells eine Zelle ansteuern? Wie knnen Sie den verwendeten Bereich einer Tabelle bestimmen?
313
F F F F F F F
Welche Methode muss man einsetzen, wenn man mehrere Bereiche vereinen mchte? Wie knnen Sie die Hintergrundfarbe der aktiven Zelle am schnellsten bestimmen? Was muss man bei der Vergabe von Namen mit VBA beachten? Was ist der Unterschied zwischen den beiden Eigenschaften Formula bzw. FormulaLocal? Wie heit die Arbeitsmappe, in der eine Gegenberstellung von englischen und deutschen Tabellenfunktionen angeboten wird? Mit welcher Methode kann man sich bestimmte Zellen in einer Tabelle markieren lassen? Was mssen Sie bei der Gltigkeitsprfung in Bezug auf Datumseingaben beachten?
6.12 bungen
Zum Abschluss des Tages versuchen Sie die folgenden bungen zu bearbeiten. Die Lsungsmakros knnen Sie im Anhang A nachblttern: 1. Erstellen Sie eine neue Tabelle und fgen Sie dort im Bereich A1:D20 einige Zahlenwerte ein. Ihre Aufgabe besteht nun darin, alle Zellen zu kennzeichnen, die einen Wert grer 500 aufweisen. Frben Sie diese Zellen mit der Hintergrundfarbe GELB. 2. Listen Sie die Zellenadressen aller verwendeten Namen einer Arbeitsmappe in einem Meldungsfenster auf. 3. Dokumentieren Sie alle verwendeten Namen einer Arbeitsmappe, indem Sie eine neue Tabelle einfgen und den Namen und dessen Zellenadresse ausgeben. 4. Lschen Sie alle Gltigkeitsfestlegungen aus einer Tabelle. 5. Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte.
314
Gestern haben Sie gelernt, wie Sie mit Formaten, Formeln und Tabellenfunktionen in VBA-Excel umgehen. Auch das Aufspren von Formeln und deren Konvertierung in Festwerte sowie die Gltigkeitsprfung waren weitere wichtige Themen. Die Themen heute:
Was sind Ereignisse? Ereignisse auf Arbeitsmappenebene Ereignisse auf Tabellenblattebene Excel ber Tastenkombinationen steuern Programmieren mit der Maus Excel zeitmig steuern
7.1
Die Programmierung von Ereignissen ist eines meiner Lieblingsthemen in der VBA-Programmierung. Was steckt dahinter? Nun, unter einem Ereignis knnen Sie alle mglichen Vorgnge in Excel fassen, wie z.B. das ffnen einer Arbeitsmappe, das Eingeben von Daten, das Drucken von Tabellen oder den Speichervorgang einer Mappe. Dies alles sind typische Vorgnge in Excel, die auch Ereignisse genannt werden. Sie haben die Mglichkeit, weitere Aktionen diesen Ereignissen anzuhngen, d.h. Sie knnen beispielsweise dafr sorgen, dass beim Ereignis ffnen einer Arbeitsmappe weitere VBA-Befehle ausgefhrt werden sollen. Sie haben somit die Mglichkeit, auf jedes Ereignis in Excel individuell zu reagieren. Bei den Ereignissen unterscheidet man in erster Linie zwischen Ereignissen, die fr die gesamte Arbeitsmappe gelten, und Ereignissen, die nur auf bestimmten Tabellenblttern Geltung haben. Ereignisse fr eine Arbeitsmappe wren beispielsweise das ffnen, Speichern, Drucken oder Schlieen einer Arbeitsmappe. Ein Beispiel fr ein Tabellenereignis wre z.B. die Erfassung von Daten in einer Tabelle oder das Aktivieren bzw. Verlassen einer Tabelle. Selbstverstndlich gibt es noch viele weitere Ereignisse, wie z.B. Ereignisse bei UserForms (Dialogen) und Steuerelementen, die Sie am 13. Tag kennen lernen werden.
316
Alle Beispiele dieses Tages finden Sie auf der beiliegenden CD-ROM in den Arbeitsmappen Ereignisse.xls und Steuerung.xls im Verzeichnis Kap07.
7.2
Wichtige Ereignisse, welche fr die Arbeitsmappe gelten, sind zum einen das Ereignis Workbook_Open, das eintritt, sobald die Arbeitsmappe geffnet wird, und zum anderen das Ereignis Workbook_BeforeClose, welches automatisch ausgelst wird, sobald die Arbeitsmappe geschlossen wird.
317
Abbildung 7.1: Das Ereignis Workbook_Open einstellen Private Sub Workbook_Open() End Sub
Mit einem Klick auf das zweite Kombinationsfeld bekommen Sie alle verfgbaren Ereignisse angezeigt, welche fr die Arbeitsmappe einsetzbar sind. Ergnzen Sie nun den eingestellten Rahmen des Ereignisses um folgende Zeilen:
Listing 7.1: Beim ffnen eine bestimmte Tabelle aktivieren Private Sub Workbook_Open() On Error GoTo fehler Worksheets("Tabelle1").Activate Exit Sub fehler: MsgBox "Die Tabelle ist nicht vorhanden!" End Sub
318
Bauen Sie sicherheitshalber eine Fehlerbehandlung in ein Ereignis ein. Fr den Fall, dass das gewnschte Tabellenblatt umbenannt bzw. gelscht wurde, haben Sie somit verhindert, dass das Makro abstrzt. Mchten Sie eine Arbeitsmappe mit hinterlegten Ereignissen ffnen und dabei auf deren Ausfhrung verzichten, so drcken Sie beim ffnen der Datei die Taste ().
319
Nur wenn in der Zelle C1 ein Wert ungleich OK steht, kann die Arbeitsmappe geschlossen werden. In diesem Fall wird das Argument Cancel auf den Wert False gesetzt, die Arbeitsmappe ber die Methode Save gespeichert und geschlossen. Im andern Fall bleibt die Arbeitsmappe geffnet. Das Speichern der Arbeitsmappe ist aber weiterhin mglich!
320
MsgBox "Arbeitsmappe kann nicht gespeichert werden!" Cancel = True Else Cancel = False End If End Sub
Nur wenn in der Zelle A1 ein Datumswert steht, der dem aktuellen Tagesdatum entspricht, kann die Arbeitsmappe gespeichert werden. In diesem Fall wird das Argument Cancel auf den Wert False gesetzt und die Arbeitsmappe gespeichert.
321
If s <> "Test" Then Application.DisplayAlerts = False Sh.Delete Application.DisplayAlerts = True Else End If End Sub
Fragen Sie zu Beginn des Ereignisses ein Kennwort ab und werten Sie die Eingabe des Benutzers aus. Er kann zwar die Tabelle neu anlegen, diese wird aber wieder ber die Methode Delete entfernt, sofern er das falsche Kennwort eingegeben hat. Damit beim Lschvorgang der Tabelle keine Rckfragemeldung von Excel angezeigt wird, setzen Sie die Eigenschaft DisplayAlerts auf den Wert False. Nach dem Lschen der Tabelle setzen Sie diese Eigenschaft wieder auf den Wert True.
Beschreibung Tritt ein, sobald eine Arbeitsmappe aktiviert wird. Tritt ein, wenn ein Add-In eingebunden wird. Dies kann entweder durch direktes ffnen des Add-Ins erfolgen oder auch durch das Einbinden im Add-Ins-Manager. Tritt ein, wenn ein Add-In aus dem Add-Ins-Manager deaktiviert wird. Tritt vor dem Druck einer Arbeitsmappe oder auch nur einzelner Tabellen ein. Tritt vor dem Speichern-Vorgang ein. Dabei spielt es keine Rolle, ob Sie ber Menbefehle, Symbolleiste oder Tastenkombination speichern.
Workbook_AddinUninstall
Workbook_BeforePrint
Workbook_BeforeSave
322
Ereignis
Workbook_Deactivate
Beschreibung Tritt ein, wenn eine Arbeitsmappe deaktiviert wird, beispielsweise wenn eine Arbeitsmappe minimiert wird. Tritt ein, wenn eine neue Tabelle in die Arbeitsmappe eingefgt wird. Tritt ein, wenn ein beliebiges Tabellen- oder Diagrammblatt in der Arbeitsmappe aktiviert wird. Arbeitsmappe ein Doppelklick mit der linken Maustaste durchgefhrt wird.
Workbook_NewSheet
Workbook_SheetActivate
Workbook_SheetBeforeRightClick
Tritt ein, wenn an einer beliebigen Stelle der Arbeitsmappe ein Klick mit der rechten Maustaste durchgefhrt wird. Tritt nach Neuberechnung jedes Tabellenblattes auf. Tritt ein, wenn sich auf einem beliebigen Tabellenblatt etwas ndert, sei es durch eine Verknpfung oder durch den Anwender. Tritt ein, sobald ein beliebiges Tabellenblatt in der Arbeitsmappe verlassen wird. Tritt ein, wenn der Anwender auf einen Hyperlink in einer Tabelle klickt. Tritt ein, wenn sich die Markierung auf einem Tabellenblatt ndert. Tritt ein, wenn ein Arbeitsmappenfenster aktiviert wird. Tritt ein, wenn ein Arbeitsmappenfenster deaktiviert wird. Tritt ein, wenn eine nderung an der Gre des Arbeitsmappenfensters durchgefhrt wurde.
Workbook_SheetCalculate Workbook_SheetChange
Workbook_SheetDeactivate
Workbook_SheetFollowHyperlink
Workbook_SheetSelectionChange
Workbook_WindowActivate
Workbook_WindowDeactivate
Workbook_WindowResize
323
7.3
Im Gegensatz zu Arbeitsmappenereignissen, die fr alle Tabellen einer Arbeitsmappe gleichermaen gelten, knnen Sie ber Tabellenereignisse ganz gezielt Ereignisse fr bestimmte Tabellenbltter einstellen. Ein wichtiges Ereignis, das fr das Tabellenblatt gilt, ist z.B. das Ereignis Worksheet_Activate, mit dem Sie bestimmen knnen, was passieren soll, wenn ein bestimmtes Tabellenblatt aktiviert wird. Auch das Ereignis Worksheet_Change ist von groer Bedeutung in der Praxis: Mithilfe dieses Ereignisses knnen Sie auf nderungen in Ihren Tabellen reagieren. Dabei haben Sie die Mglichkeit, nderungen in der gesamten Tabelle oder ganz gezielt in einzelnen Zellen oder Bereichen zu berwachen.
324
Abbildung 7.2: Das Ereignis Activate einstellen Listing 7.5: Das letzte Zugangsdatum der Tabelle festhalten Private Sub Worksheet_Activate() Range("A1").Value = Format(Time, "hh:mm") End Sub
Beim Aktivieren der TABELLE2 schreiben Sie in Zelle A1 die momentane Uhrzeit mithilfe der Funktion Time. Formatieren Sie die Zeitangabe ber die Funktion Format, der Sie die Formatkrzel hh fr Stunden und mm fr Minuten bergeben. Mchten Sie zustzlich noch die Sekunden mitanzeigen, dann ndern Sie die Zeile wie folgt:
Range("A1").Value = Format(Time, "hh:mm,ss")
325
siert und am Ende eines Monats zu Auswertungszwecken herangezogen wird. Die nderungen an dieser Liste sollen dann nachvollzogen werden knnen. Schauen Sie sich dazu einmal die Ausgangsliste in Abbildung 7.3 an.
Im Verlauf eines Monats knnen sich einige Dinge ndern, wie beispielsweise folgende:
Ein Mitarbeiter kann das Unternehmen verlassen. Ein/e Mitarbeiter/in kann heiraten und dadurch den Namen ndern. Ein Mitarbeiter kann an einen anderen Standort versetzt werden. Eine Mitarbeiterin kann einer anderen Kostenstelle zugeordnet werden. Ein neuer Mitarbeiter kann eingestellt werden.
Solche und weitere Grnde, eine Personalliste zu ndern, gibt es in Hlle und Flle. Machen Sie nun die Vernderungen sichtbar, indem Sie das Ereignis Worksheet_Change einstellen. Dabei verfahren Sie wie folgt: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen mchten, doppelt an. In unserem Beispiel ist das die TABELLE3. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und whlen Sie den Eintrag Worksheet aus.
326
4. Im zweiten Kombinationsfeld whlen Sie dann das Ereignis Change aus. 5. Ergnzen Sie das noch leere Ereignismakro wie folgt:
Listing 7.6: Alle nderungen in der Tabelle einfrben Private Sub Worksheet_Change(ByVal Target As Range) Target.Interior.ColorIndex = 3 End Sub
Wenden Sie die Eigenschaft ColorIndex auf das Objekt Interior (= Hintergrund der Zelle) an und frben Sie das Objekt Target (= Zelle) rot, indem Sie den Farbindex 3 einsetzen.
Haben Sie am Ende des Monats alle Ihre nderungen nachvollzogen, knnen Sie die Frbungen wieder entfernen, ohne dass dadurch das Ereignis Change ausgelst wird. Ereignisse reagieren allgemein nicht auf Formatnderungen. Im nchsten Beispiel wird das Ereignis Change in TABELLE4 nur ausgelst, wenn nderungen in einem bestimmten Bereich C4:C8 durchgefhrt werden. Sehen Sie sich vorab einmal Abbildung 7.5 an. Alle Eingaben im Bereich C4 bis C8 sollen sofort in Grobuchstaben umgewandelt werden. Erfassen Sie zu diesem Zweck das Ereignis Change hinter der TABELLE4.
327
Abbildung 7.5: Im Formular soll auf Eingaben reagiert werden. Listing 7.7: Einen Bereich berwachen Private Sub Worksheet_Change(ByVal Target As Range) Dim Bereich As Range Set Bereich = Range("C4:C8") If Not Intersect(Target, Bereich) Is Nothing Then Target = UCase(Target) End If End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range und geben Sie ber die Anweisung Set bekannt, wo sich der zu berwachende Bereich in der Tabelle befinden soll. ber die Methode Intersect prfen Sie, ob die genderte Zelle im definierten Zielbereich Bereich liegt. Wenn ja, setzen Sie die Funktion UCase in, um die eingegebenen Buchstaben in Grobuchstaben umzuwandeln. Um Buchstaben in Kleinbuchstaben zu wandeln, setzen Sie die Funktion LCase ein.
Abbildung 7.6: Eingaben im Bereich C4:C8 werden automatisch nach Drcken der Taste (Enter) in Grobuchstaben umgesetzt.
328
Im Listing 7.8 mssen Sie die Ereignissteuerung kurzfristig ausschalten, um zu verhindern, eine Endlosschleife zu produzieren. Dazu setzen Sie die Eigenschaft EnableEvents auf den Wert False. Danach markieren Sie die komplette Zeile und sorgen dafr, dass der Mauszeiger trotzdem wieder auf der ursprnglich markierten Zelle positioniert wird. Setzen Sie daraufhin die Eigenschaft EnableEvent wieder auf den Wert True, um die Ereignissteuerung zuzulassen.
329
Wenn Sie jetzt die Zelle B10 berwachen mchten, dann knnen Sie dies nicht ber das Ereignis Change durchfhren, da diese Zelle eine Formel beinhaltet, die sich automatisch anpasst, wenn nderungen in den Zellen B5:B9 durchgefhrt werden. Sie mssen daher entweder die Zellen B5:B9 berwachen oder ganz allgemein das Ereignis Calculate einsetzen, das automatisch ausgelst wird, wenn eine Neuberechnung durchgefhrt wird.
330
Um das Ereignis Calculate einzustellen, verfahren Sie wie folgt: 1. Drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen mchten, doppelt an. In unserem Beispiel ist das die TABELLE6. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und whlen Sie den Eintrag Worksheet aus. 4. Im zweiten Kombinationsfeld whlen Sie dann das Ereignis Calculate aus. 5. Ergnzen Sie das noch leere Ereignismakro wie folgt:
Listing 7.9: Das Ereignis Calculate wird bei nderungen in der Tabelle ausgefhrt. Private Sub Worksheet_Calculate() MsgBox "Es wurde eine Neuberechnung der Tabelle durchgefhrt!" End Sub
Beschreibung Tritt ein, wenn ein Tabellenblatt aktiviert wird. Tritt ein, wenn sich der Wert in einer Zelle ndert. Tritt ein, wenn eine Tabelle neu berechnet wird. Tritt ein, wenn ein Tabellenblatt deaktiviert wird, beispielsweise wenn ein Tabellenblatt verlassen wird. Tabelle klickt.
Worksheet_FollowHyperlink Tritt ein, wenn der Anwender auf einen Hyperlink in einer Worksheet_SelectionChange Tritt ein, wenn sich die Markierung auf einem Tabellen-
331
Ereignis
BeforeDoubleClick
Beschreibung Tritt ein, wenn an einer beliebigen Stelle der Tabelle ein Doppelklick mit der linken Maustaste durchgefhrt wird. Tritt ein, wenn an einer beliebigen Stelle der Tabelle ein Klick mit der rechten Maustaste durchgefhrt wird. Tritt nach Neuberechnung eines Tabellenblattes auf. Tritt auf, wenn Sie eine Pivot-Tabelle aktualisieren.
BeforeRightClick
Calculate PivotTableUpdate
7.4
Viele Standardfunktionen in Excel knnen Sie ber Tastenkombinationen bzw. FTasten abrufen. Am vorhergehenden Tag haben Sie beispielsweise erfahren, dass Sie ber die Taste (F11) ein Standarddiagramm in Excel einfgen knnen. Auch die Tastenkombinationen (Strg) + (C) und (Strg) + (V), um Daten zu kopieren bzw. einzufgen, gehren zum Standard von Excel. Darber hinaus haben Sie die Mglichkeit, eigene Tastenkombinationen zu definieren, hinter die Sie dann Ihre eigenen Makros legen. Sie knnen somit Ihre Arbeit in Excel optimieren und Arbeiten noch schneller erledigen. Lernen Sie nun auf den nchsten Seiten ein paar typische Beispiele aus der Praxis kennen, bei denen Sie eigene Tastenkombinationen einsetzen knnen.
332
entfernen, um nicht alle verknpften Arbeitsmappen mit ausliefern zu mssen und den Anwender nicht durch unntigen Ballast zu belstigen. Eine weiteres Anwendungsbeispiel fr die Praxis stellt folgendes Szenario dar: Sie haben einige Berechnungen ber Funktionen und Formeln in Excel durchgefhrt. Die Arbeit ist soweit beendet. Nun mchten Sie sicherheitshalber eine Kopie der Arbeitsmappe ohne Formeln abspeichern. Sie knnen somit sicherstellen, dass diese Arbeitsmappe nicht mehr durch Formeln oder Funktionen verndert werden kann, da die Mappe nur noch Festwerte enthlt. In der folgenden Aufgabe gehen Sie von der Ausgangssituation in Abbildung 7.9 aus.
Im ersten Schritt erfassen Sie das Makro, welches die Formelzellen in FestwertZellen umsetzt. Danach weisen Sie dem Makro eine Tastenkombination zu, ber die Sie das Makro schnell aufrufen knnen. Das Makro fr die Umsetzung lautet:
Listing 7.10: Alle Formelzellen in Markierung durch Festwerte ersetzen Sub FormelnFest() Dim Zelle As Range For Each Zelle In Selection Zelle.Value = Zelle.Value Next Zelle End Sub
333
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range. Danach durchlaufen Sie in einer Schleife alle Zellen, die in der Markierung enthalten sind. ber das Auflistungsobjekt Selection (= Auswahl) erhalten Sie Zugriff auf genau diese markierten Zellen. Innerhalb der Schleife berschreiben Sie den Inhalt der Zelle mit dem Wert der Zelle. Fr den Fall, dass es sich hierbei um eine Formelzelle handelt, wird die Formel durch den Festwert ersetzt. Testen Sie das Makro, indem Sie den Zellenbereich A1:B10 markieren und das Makro aus Listing 7.10 starten. Das Makro funktioniert! Nun soll das Starten des Makros ber eine Tastenkombination durchgefhrt werden. Dies spart Zeit und ist darber hinaus auch noch elegant. Das Zuweisen einer Tastenkombination in Excel sollte dynamisch erfolgen. Dabei bietet sich das ffnen einer Arbeitsmappe geradezu an. Die so definierte Tastenkombination ist danach verfgbar und nun kann auch das der Tastenkombination zugewiesene Makro gestartet werden. Fr das Ersetzen von Formelzellen in Festwerte soll beim ffnen der Arbeitsmappe Steuerung.xls die Tastenkombination (Strg) + () definiert werden. Um diese Aufgabe umzusetzen, befolgen Sie die nchsten Arbeitsschritte: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Fhren Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Whlen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook aus. 4. Ergnzen Sie das Workbook_Open-Ereignis wie folgt:
Listing 7.11: Die Tastenkombination (Strg) + () ist somit aktiviert. Private Sub Workbook_Open() Application.OnKey "^", "FormelnFest" End Sub
Legen Sie eine Tastenkombination fest, indem Sie die Methode OnKey einsetzen. Die Methode OnKey fhrt die angegebene Prozedur aus, wenn eine bestimmte Taste oder Tastenkombination gedrckt wird. Die Syntax der Methode lautet Application.OnKey(Key, Procedure). Das Argument Key entspricht der Tastenkombination, die gedrckt wird. Das Argument Procedure ist optional. Es entspricht dem Makro, welches Sie der Tasten-
334
kombination zuweisen mchten. Bleibt dieses Argument leer (), dann hat das Drcken der Taste keine Wirkung. Entnehmen Sie Tabelle 7.3 alle mglichen Tasten und deren Codebelegung, die Sie fr die Programmierung einsetzen knnen.
Taste
(___) (Pause) (__) (Entf) (Entf) () (Ende) (Enter) Zehnertastatur (~) (Esc) (Hilfe) (Pos1) (Einfg) () (Num) (Bild_) (Bild_) (Enter) () (Rollen)
Codebelegung {BACKSPACE} oder {BS} {BREAK} {CAPSLOCK} {CLEAR} {DELETE} oder {DEL} {DOWN} {END} {ENTER} ~ (Tilde) {ESCAPE} oder {ESC} {HELP} {HOME} {INSERT} {LEFT} {NUMLOCK} {PGDN} {PGUP} {RETURN} {RIGHT} {SCROLLOCK}
335
Taste
() () (F1) bis (F15)
In jeder Anwendung von Windows knnen die Tasten aus Tabelle 7.3 auch mit den Tasten (Alt), (Strg) oder () kombiniert werden. Entnehmen Sie der nachfolgenden Tabelle 7.4 die Kodierung dieser Zusatztasten.
Zusatztaste
() (Strg) (Alt) [BEFEHLSTASTE]
Nachdem Sie die Tastenkombination (Strg) + () dem Makro FormelnFest zugewiesen haben, sollten Sie beim Schlieen der Arbeitsmappe Steuerung.xls dafr sorgen, dass diese Tastenkombination wieder aufgehoben wird. Dabei verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Fhren Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Whlen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook aus. 4. Im zweiten Dropdown-Feld whlen Sie den Eintrag BeforeClose aus und ergnzen das Ereignis wie folgt:
336
Listing 7.12: Die Tastenkombination (Strg) + () wieder deaktivieren Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.OnKey "^" End Sub
Testen Sie die Funktion, indem Sie aus der Entwicklungsumgebung auf Ihre Exceloberflche wechseln und die Tastenkombination (Alt) + (F11) drcken. Es wird Ihnen nicht gelingen, auf diesem Wege in die Entwicklungsumgebung zu gelangen. Mchten Sie diese Tastenkombination wieder zulassen, dann starten Sie das Makro aus Listing 7.14.
Listing 7.14: Die Tastenkombination (Alt) + (F11) wird wieder aktiviert Sub AktivierenTastenkombination() Application.OnKey "%{F11}" End Sub
Indem Sie das zweite Argument der Methode OnKey weglassen, wird die standardmig vorgesehene Funktion, nmlich das Springen in die Entwicklungsumgebung, wieder aktiviert.
337
brigens knnen Sie die Makros aus den Listings 7.13 und 7.14 wieder mit den Ereignissen Workbook_Open bzw. Workbook_BeforeClose verbinden, um diese Funktionen beim ffnen bzw. Schlieen der Arbeitsmappe dynamisch einzubinden.
Um nur die Inhalte, also die Werte einzufgen, setzen Sie die Methode PasteSpecial ein. Im Paste-Argument geben Sie die Konstante xlValues an. Da nach dem Drcken der Tastenkombination (Strg) + () + (V) noch der Kopierrahmen um den kopierten Bereich aktiv ist, schalten Sie diesen durch die Eigenschaft CutCopyMode ab, indem Sie dieser den Wert False zuweisen. Weisen Sie das Makro aus Listing 7.15 nun der Tastenkombination (Strg) + () + (V) zu. Auch hierzu knnen Sie wieder das Ereignis Workbook_Open einsetzen, um diese Funktion gleich nach dem ffnen der Arbeitsmappe zur Verfgung zu stellen.
338
Listing 7.16: Beim ffnen der Arbeitsmappe wird die Tastenkombination festgelegt Private Sub Workbook_Open() Application.OnKey "^+v", "WerteEinfgen" End Sub
Achten Sie auch bei diesem Schritt darauf, dass Sie die gerade definierte Tastenkombination beim Schlieen der Arbeitsmappe wieder deaktivieren. Setzen Sie fr diesen Zweck das Arbeitsmappen-Ereignis Workbook_BeforeClose ein, wie Sie es in Listing 7.17 sehen.
Listing 7.17: Beim Schlieen der Arbeitsmappe wird die Tastenkombination deaktiviert Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.OnKey "^+v" End Sub
339
Die Spalte C soll mit Sonderzeichen ber Tastenkombinationen gefllt werden. Schreiben Sie jetzt die beiden Makros, die die Sonderzeichen in die jeweils aktive Zelle schreiben:
Listing 7.18: Sonderzeichen einfgen Sub SmileyLachend() ActiveCell.Value = "J" ActiveCell.Font.Name = "Wingdings" End Sub Sub SmileyTraurig() ActiveCell.Value = "L" ActiveCell.Font.Name = "Wingdings" End Sub
Schreiben Sie im ersten Schritt den Buchstaben direkt in die aktive Zelle. Danach formatieren Sie die aktive Zelle ber das Font-Objekt mit der Schriftart WINGDINGS. Fr die erledigten Aufgaben definieren wir die Tastenkombination (Strg) + (), fr offene Aufgaben (Strg) + (). Der Quellcode fr diese Aufgabe lautet wie folgt:
Listing 7.19: Die Tastenkombinationen beim ffnen der Arbeitsmappe festlegen Private Sub Workbook_Open() Application.OnKey "^", "SmileyLachend" Application.OnKey "^", "SmileyTraurig" End Sub
Die Frage, die sich nun geradezu aufdrngt, lautet wie folgt: Wie kann ich herausbekommen, welches Symbol der Schriftart Wingdings welchem Zeichen zugeordnet ist? Die Beantwortung dieser Frage knnen Sie Listing 7.20 entnehmen. Dort wird eine Liste erstellt, in der alle Zeichenbelegungen verzeichnet sind.
340
Abbildung 7.11: Listen mit Sonderzeichen ausstatten Listing 7.20: Die einzelnen Zeichen einer Schriftart abfragen Sub Schrifttest() Dim i As Integer Sheets.Add Range("A1").Select For i = 1 To 255 ActiveCell.Font.Name = "Wingdings" If i >= 32 Then ActiveCell.Value = Chr(i) ActiveCell.Offset(0, 1).Value = Chr(i) ActiveCell.Offset(0, 2).Value = i ActiveCell.Offset(1, 0).Select End If Next i End Sub
Die normalen Zeichen einer Schriftart liegen im Bereich von 0 bis 256. Die Zahlen von 0 bis 31 entsprechen den nicht darstellbaren Standard-ASCII-Codes. Daher kann innerhalb der Schleife auf die Dokumentation dieser Zeichen verzichtet werden. Formatieren Sie alle Zellen der Spalte A mit der Schriftart, zu der Sie die Zeichenbelegung herausfinden mchten. ber die Funktion chr knnen Sie einen Wert vom Typ String zurckgeben, der das Zeichen enthlt, das dem angegebenen Zeichencode zugeordnet ist.
341
Abbildung 7.12: Alle Belegungen der Schriftart Wingdings in eine Tabelle schreiben
7.5
Nachdem Sie nun wissen, wie Sie einzelne Tasten programmieren knnen, gehen wir zum nchsten Thema ber. Auf den folgenden Seiten wird beschrieben, wie Sie mithilfe von VBA Ihre Maustasten abfragen und programmieren knnen. Fr die Programmierung Ihrer Maustasten stehen Ihnen zwei Ereignisse zur Verfgung, die Sie bereits in diesem Kapitel kennen gelernt haben. ber das eine Ereignis knnen Sie einen Klick mit der rechten Maustaste abfangen, mit dem anderen Ereignis einen Doppelklick mit der linken Taste. Excel kann also diese beiden Mausaktionen berwachen, indem Sie ein Ereignis einstellen. Diesem Ereignis knnen Sie dann weitere Befehle hinzufgen, welche beim Eintreffen des Ereignisses zustzlich ausgefhrt werden sollen.
Kontextmen deaktivieren/aktivieren
Standardmig wird beim Drcken der rechten Maustaste ein Kontextmen in Excel aufgerufen. Beispielsweise wird das Zellenkontextmen aktiviert, wenn Sie
342
mit der rechten Maustaste auf eine beliebige Zelle klicken. Dieses Standardverhalten kann auch deaktiviert und durch eine andere, eigene Funktion ersetzt werden. Im folgenden Beispiel wird das Herunterklappen des Kontextmens unterbunden, sobald Sie eine beliebige Zelle einer bestimmten Tabelle mit der rechten Maustaste anklicken. Um dieses Ereignis einzustellen, befolgen Sie die nchsten Arbeitsschritte: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, mit der Sie die Funktion belegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforeRightClick aus. 4. Ergnzen Sie den Ereignisrahmen wie folgt:
Listing 7.21: Das Kontextmen wird nicht heruntergeklappt. Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub
Das Ereignis Worksheet_BeforeRightClick hat zwei Argumente: Im Argument Target knnen Sie die berwachung der rechten Maustaste auf einen bestimmten Bereich Ihrer Tabelle beschrnken. Im Argument Cancel haben Sie die Mglichkeit, die Standardfunktion, das Herunterklappen des Kontextmens, zu unterbinden, indem Sie dieses Argument auf den Wert True setzen.
343
Listing 7.22: Das Kontextmen in einem vorgegebenen Bereich deaktivieren Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich As Range Set Bereich = Range("B2:D10") If Intersect(Target, Bereich) Is Nothing Then Exit Sub Cancel = True End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range. Danach geben Sie ber die Anweisung Set dieser Objektvariablen bekannt, welchen Bereich der Tabelle Sie berwachen mchten. Mithilfe der Methode Intersect knnen Sie berprfen, ob die angeklickte Zelle (Target) sich im definierten Bereich (Bereich) befindet. Wenn nicht, dann springen Sie ber die Anweisung Exit Sub direkt aus dem Makro heraus. Im anderen Fall setzen Sie das Argument Cancel auf den Wert True, um das Zellenkontextmen zu deaktivieren.
Abbildung 7.13: Beim Klicken mit der rechten Maustaste im definierten Bereich passiert nichts.
344
1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Fhren Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Whlen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook. 4. Whlen Sie aus dem zweiten Dropdown-Feld das Ereignis SheetBeforeRightClick. 5. Ergnzen Sie den noch leeren Ereignisrahmen wie folgt:
Listing 7.23: Das Zellenkontextmen fr alle Tabellen ausschalten Private Sub Workbook_SheetBeforeRightClick _ (ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub
Bei diesem Arbeitsmappenereignis haben Sie gegenber dem Tabellenereignis ein Argument mehr zur Verfgung. Standardmig wird dieses Ereignis in allen Tabellenblttern der Arbeitsmappe ausgefhrt. Im Argument Sh knnen Sie einschrnken, in welchen Tabellenblttern die Mausklicks berwacht werden sollen.
345
berprfen Sie mithilfe einer Select-Case-Anweisung, ob der Name der jeweils aktiven Tabelle, auf der Sie den rechten Mausklick durchfhren, dem innerhalb der Case-Anweisung entspricht. Wenn ja, dann setzen Sie das Argument Cancel auf den Wert True, um das Zellenkontextmen zu deaktivieren.
346
berprfen Sie zuerst einmal, ob die Zelle bereits mit der Hintergrundfarbe ROT formatiert wurde. Wenn ja, dann meldet die Eigenschaft ColorIndex, die Sie auf das Objekt Interior (Zellenhintergrund) anwenden, den Farbindex 3. In diesem Fall weisen Sie der Eigenschaft ColorIndex die Konstante xlColorIndexNone zu, was bedeutet, dass diese Zelle wieder entfrbt wird. Im anderen Fall weisen Sie der Eigenschaft ColorIndex den Farbindex 3 zu, um die so angeklickte Zelle mit der Hintergrundfarbe ROT zu belegen. In beiden Fllen deaktivieren Sie anschlieend das Herunterklappen des Kontextmens, indem Sie das Argument Cancel auf den Wert True setzen.
In einem weiteren Beispiel soll in einer Tabelle ber die rechte Maustaste ein bestimmtes Sonderzeichen eingefgt werden. Orientieren Sie sich dabei am Makro aus Listing 7.20, ber das Sie die Belegung der Zeichen in der Schriftart WINGDINGS in einer Tabelle ausgegeben haben. Fr unser Beispiel entscheiden wir uns fr das Haken-Symbol, welches ber den Buchstaben in der Schriftart WINGDINGS eingefgt werden kann. In Anlehnung an die vorherige Aufgabe soll aber zuerst geprft werden, ob nicht bereits ein Haken in die Zelle eingefgt wurde. Wenn ja, soll dieser wieder entfernt werden. Stellen Sie dieses Ereignis nun ein, indem Sie die folgenden Arbeitsschritte befolgen: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN.
347
2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforeRightClick aus. 4. Ergnzen Sie den Ereignisrahmen wie folgt:
Listing 7.26: Das Haken-Symbol per rechtem Mausklick einfgen Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) If Target.Value = "" Then Target.Value = "" Target.Font.Name = "Courier" Else Target.Value = "" Target.Font.Name = "Wingdings" End If Cancel = True End Sub
berprfen Sie, ob nicht bereits schon ein Haken-Symbol in der Zelle steht. Wenn ja, dann nehmen Sie den Haken wieder heraus, indem Sie den Zelleninhalt lschen. Vergessen Sie dabei aber nicht, die Schriftart wieder auf eine lesbare Schrift umzustellen. Im anderen Fall schreiben Sie den Buchstaben in die ange-
348
klickte Zelle und formatieren diese mit der Schriftart WINGDINGS, indem Sie dem Objekt Font ber die Eigenschaft Name den Namen der Schriftart bekannt geben.
Doppelklick deaktivieren
Nachdem Sie erfahren haben, wie Sie die rechte Maustaste programmieren knnen, lernen Sie nun, wie Sie die linke Maustaste steuern knnen. Standardmig ist dem linken Doppelklick auf eine Zelle die Funktion DIREKTE ZELLENBEARBEITUNG zugeordnet, d.h. der Textcursor springt genau in die Zelle hinein. Sie haben dann die Mglichkeit, Zeichen einzugeben bzw. bereits gemachte Eingaben zu korrigieren. Zum Abfangen von Doppelklicks mit der linken Maustaste steht Ihnen ein eigenes Ereignis BeforeDoubleClick zur Verfgung. Wie schon bei der rechten Maustaste gelernt, haben Sie auch bei diesem Ereignis die Mglichkeit, die standardmig zugewiesene Funktion zu deaktivieren. In der folgenden Aufgabe wird die direkte Zellenbearbeitung nach dem Ausfhren eines Doppelklicks auf eine Zelle deaktiviert.
Listing 7.27: Den Doppelklick deaktivieren Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub
Setzen Sie das Argument Cancel auf den Wert True, um die direkte Zellenbearbeitung zu deaktivieren. Wie schon beim Ereignis BeforeRightClick demonstriert, knnen Sie auch bei diesem Ereignis dafr sorgen, dass das Deaktivieren der Standardfunktion (direkte Zellenbearbeitung) nur fr einen bestimmten Bereich gelten soll. Im nchsten Beispiel soll die direkte Zellenbearbeitung, welche durch den Doppelklick ausgelst wurde, fr folgende Bereiche deaktiviert werden:
Erfassen Sie nun das Ereignismakro, indem Sie folgende Arbeitsschritte befolgen:
349
1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen mchten, und whlen Sie aus dem Kontextmen den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung whlen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld whlen Sie das Ereignis BeforedoubleClick aus. 4. Ergnzen Sie den Ereignisrahmen wie folgt:
Listing 7.28: Die Mausklicks in mehreren Bereichen berwachen Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich1 As Range Dim Bereich2 As Range Dim Bereich3 As Range Dim Bereich4 As Range Dim Bereich As Range Set Set Set Set Bereich1 Bereich2 Bereich3 Bereich4 = = = = Range("B2:B10") Range("D3:D5") Range("F2:F7") Range("A1:F1")
Set Bereich = Union(Bereich1, Bereich2, Bereich3, Bereich4) If Intersect(Bereich, Target) Is Nothing Then Exit Sub Cancel = True End Sub
Deklarieren Sie im ersten Schritt genau fnf Objektvariablen vom Typ Range. In den ersten vier Objektvariablen geben Sie die Zellenkoordinaten der Bereiche bekannt, bei denen Sie die direkte Zellenbearbeitung deaktivieren mchten. Setzen Sie fr diesen Zweck die Anweisung Set ein. Im nchsten Schritt verbinden Sie die einzelnen Bereiche mithilfe der Methode Union zu einem Gesamtbereich, den Sie in der Objektvariablen Bereich speichern. Danach fragen Sie ber die Methode Intersect ab, ob die angeklickte Zelle in diesem Gesamtbereich liegt. Wenn nicht, dann beenden Sie das Makro, indem Sie ber die Anweisung Exit Sub direkt aus dem Ereignis springen. Liegt die doppelt angeklickte Zelle im defi-
350
nierten Zielbereich, dann setzen Sie das Argument Cancel auf den Wert True, um die direkte Zellenbearbeitung zu deaktivieren.
Abbildung 7.16: In den farbigen Flchen ist die direkte Zellenbearbeitung deaktiviert.
Mithilfe der Eigenschaft Address knnen Sie die genaue Zellenadresse der doppelt angeklickten Zelle abfragen. Entspricht diese Adresse der Zelle B5, dann addieren
351
Sie den momentanen Wert der Zelle mit dem Wert 1. Setzen Sie danach das Argument Cancel auf den Wert True, um die direkte Zellenbearbeitung fr diese Zelle zu deaktivieren.
Abbildung 7.17: Bei jedem Doppelklick auf Zelle B5 wird diese um den Wert 1 erhht.
352
Definieren Sie im ersten Schritt eine Objektvariable vom Typ Range, in der Sie mit Hilfe der Anweisung Set den Bereich angeben, in dem per Doppelklick Zufallszahlen erzeugt werden sollen. Danach prfen Sie ber die Methode Intersect, ob die doppelt angeklickte Zelle im definierten Zielbereich liegt. Wenn ja, wenden Sie die Funktion Rnd an, um eine Zufallszahl zu erzeugen. Den Wertebereich der Zufallszahl geben Sie zwischen 1 und 49 an. Mithilfe der Funktion Int sorgen Sie dafr, dass diese generierte Zufallszahl auch ganzzahlig ist.
7.6
In Excel haben Sie die Mglichkeit, Makros zu einem bestimmten Zeitpunkt zu starten. Des Weiteren knnen Sie Makros auch in bestimmten Intervallen wiederholt ausfhren. Fr diese Aufgabe setzen Sie die Methode OnTime ein. Die Syntax der Methode lautet:
OnTime(EarliestTime, Procedure, LatestTime, Schedule)
Das Argument EarliestTime gibt den Zeitpunkt an, an dem eine Prozedur ausgefhrt werden soll. Das Argument Procedure beinhaltet den Namen der auszufhrenden Prozedur. Das Argument LatestTime ist optional einsetzbar und gibt den letzten Zeitpunkt an, zu dem die Prozedur ausgefhrt werden kann. Das letzte Argument Schedule ist optional einsetzbar und fhrt eine neue OnTimeProzedur aus, sofern dieses Argument auf den Wert True gesetzt ist. Indem Sie das
353
Argument auf den Wert False setzen, lschen Sie eine vorher eingestellte Prozedur. Die Mglichkeiten, die Sie mit dieser Zeitsteuerung haben, werden in den nchsten Praxisaufgaben nher erlutert.
Mit der Funktion Now ermitteln Sie sowohl das aktuelle Tagesdatum als auch die aktuelle Uhrzeit. Zur Uhrzeit addieren Sie mithilfe der Funktion TimeValue eine Minute. Damit vergeht genau eine Minute bis zum Start des Makros Uhrzeit, welches Sie in Listing 7.32 sehen.
Listing 7.32: Die aktuelle Uhrzeit in der Statusleiste ausgeben Sub Uhrzeit() Application.DisplayStatusBar = True Application.StatusBar = Date & "," & Time Application.Wait (Now + TimeValue("0:00:05")) Application.StatusBar = False Call Zeitanzeige End Sub
Im ersten Schritt blenden Sie sicherheitshalber die Statusleiste ber die Eigenschaft DisplayStatusBar ein. Danach fllen Sie die Statusleiste mit dem aktuellen Tagesdatum, welches Sie ber die Funktion Date bekommen, und mit der aktuellen Uhrzeit, die ber die Funktion Time abgefragt werden kann. Im Anschluss daran sorgen Sie dafr, dass Excel diese Zeitansage fnf Sekunden lang in der Statusleiste stehen lsst. Dazu verwenden Sie die Methode Wait, die das Makro fr fnf Sekunden
354
anhlt. Danach geben Sie die Verwaltung der Statusleiste wieder an Excel zurck, was dazu fhrt, dass der Text BEREIT in der Leiste angezeigt wird. Im letzten Schritt sorgen Sie dafr, dass die Zeitansage regelmig ausgefhrt wird. Dazu rufen Sie das Makro Zeitanzeige erneut mit der Anweisung Call auf.
Abbildung 7.19: Das aktuelle Datum sowie die Uhrzeit in der Statusleiste anzeigen
Countdown in Excel
Wenn Sie mchten, knnen Sie in Excel auch einen Countdown einsetzen, um eine bestimmte Aufgabe auszufhren. So knnen Sie beispielsweise dafr sorgen, dass genau 60 Sekunden nach dem Start eines Makros alle offenen Arbeitsmappen geschlossen sind und Excel beendet wird. Erfassen Sie zu diesem Zweck zuerst einmal die Zeitsteuerung, welche Sie in Listing 7.33 sehen knnen.
Listing 7.33: Nach genau einer Minute wird das Makro ExcelEnde gestartet Sub CountdownEinstellen() Application.OnTime _ Now + TimeValue("00:00:60"), "ExcelEnde" End Sub
Mit der Funktion Now ermitteln Sie sowohl das aktuelle Tagesdatum als auch die aktuelle Uhrzeit. Zur Uhrzeit addieren Sie mithilfe der Funktion TimeValue 60 Sekunden. Damit vergehen genau 60 Sekunden bis zum Start des Makros Excel Ende, welches Sie in Listing 7.34 sehen.
355
Listing 7.34: Arbeitsmappen speichern und Excel beenden Sub ExcelEnde() Dim Mappe As Workbook Application.DisplayAlerts = False For Each Mappe In Workbooks Mappe.Save Next Mappe Application.DisplayAlerts = True Application.Quit End Sub
Indem Sie die Eigenschaft DisplayAlerts auf den Wert False setzen, verhindern Sie, dass Sie noch eine Rckfrage vor dem Beenden von Excel bekommen. In einer vorherigen Schleife stellen Sie sicher, dass alle geffneten Arbeitsmappen gespeichert werden. Dabei wenden Sie innerhalb der Schleife die Methode Save an. Anschlieend wird ber die Methode Quit Excel geschlossen.
Um das Makro aus Listing 7.35 korrekt ablaufen zu lassen, sollten Sie die Uhreinstellung in der Systemsteuerung von Windows berprfen und sicherstellen, dass Excel sowie die Arbeitsmappe, die diese Lsung enthlt, auch geffnet sind. Im Makro ZeitSteuerung wird um 16:00 Uhr das Makro Verarbeitung aufgerufen, welches Sie in Listing 7.36 sehen knnen.
356
Listing 7.36: Dieses Makro wird um 16:00 Uhr ausgefhrt Sub Verarbeitung() 'beliebige Aufgaben durchfhren... End Sub
7.7
F
Wie knnen Sie beim ffnen einer Arbeitsmappe dafr sorgen, dass alle PivotTabellen der Arbeitsmappe aktualisiert werden?
A
Setzen Sie die Methode RefreshAll ein, um alle Pivot-Tabellen in der Arbeitsmappe zu aktualisieren.
F
Wie knnen Sie den Namen einer Tabelle dynamisch aus einem Zelleninhalt bilden?
A
berprfen Sie ber die Eigenschaft Address, ob die genderte Zelle C1 lautet. Wenn ja, dann weisen Sie der Tabelle den Namen zu, der in Zelle C1 eingegeben wurde.
357
Wie knnen Sie die typischen Funktionen wie das Kopieren, Ausschneiden und Einfgen von Daten ber die Tastenkombinationen deaktivieren?
A
Sie knnen die Tastenkombinationen fr das Kopieren (Strg) + (C), Ausschneiden (Strg) + (X) und Einfgen (Strg) + (V) von Daten deaktivieren, indem Sie folgende Makros erfassen:
Listing 7.39: Die Tastenkombinationen wurden deaktiviert Sub TastenkombinationenDeaktivieren() Application.OnKey "^c", "KeineAktion" Application.OnKey "^v", "KeineAktion" Application.OnKey "^x", "KeineAktion" End Sub
In Anlehnung an die vorherige Fragestellung knnen Sie fr diesen Zweck das folgende Makro aus Listing 7.40 starten:
Listing 7.40: Tastenkombinationen wieder zurcksetzen Sub TastenkombinationenAktivieren() Application.OnKey "^c" Application.OnKey "^v" Application.OnKey "^x" End Sub
Wenn Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken, wird Ihnen ein Kontextmen angeboten, aus dem Sie Symbolleisten ein- und ausblenden knnen. Mit dem folgenden Makro aus Listing 7.41 verhindern Sie das Herunterklappen des Symbolleisten-Kontextmens:
358
Quiz
Listing 7.41: Symbolleisten-Kontextmen deaktivieren Sub KontextmenSymbolDeaktivieren() Application.CommandBars("Toolbar list").Enabled = False End Sub
Das Kontextmen fr die Symbolleisten heit Toolbar list. Geben Sie diesen Namen dem Auflistungsobjekt CommandBars bekannt und setzen Sie die Eigenschaft Enabled auf den Wert False, um das Kontextmen zu deaktivieren. Weisen Sie dieser Eigenschaft den Wert True zu, um das Kontextmen wieder zu aktivieren.
F
Wie knnen Sie einen vorher definierten Bereich per Doppelklick kopieren und auch auf anderen Tabellen einfgen?
A
Nehmen wir einmal an, Sie mchten einen bestimmten Bereich auf TABELLE1 kopieren und danach diesen Bereich wahlweise auf einer anderen Tabelle einfgen. Dazu setzen Sie das Ereignis Worksheet_Before DoubleClick ein, wie Sie es in Listing 7.42 sehen.
Listing 7.42: Definierten Bereich kopieren und weiter verwenden Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Excel.Range, Cancel As Boolean) Dim Bereich As Range Set Bereich = Worksheets("Tabelle1").Range("A1:C5") Bereich.Copy ActiveSheet.Paste End Sub
7.8
F F F
Quiz
Wie kann man die Ereignissteuerung kurzfristig ausschalten? Wird das Ereignis Change auch ausgelst, wenn man die Formatierung der Zelle ndert? Was muss man machen, wenn man das Ereignis Change nicht auf die ganze Tabelle, sondern nur auf eine einzige Zelle anwenden mchte?
359
F F F F
Wie kann man das Zellenkontextmen deaktivieren? Welchem Buchstaben ist das Sonderzeichen mit dem Flugzeug zugeordnet? Wie kann man per Doppelklick auf eine Zelle den Inhalt dieser Zelle mit den Schriftschnitten FETT und KURSIV sowie der Schriftfarbe ROT formatieren? Wie kann man ein Makro um 14:00 Uhr automatisch starten lassen?
7.9
bungen
Am Ende des Tages versuchen Sie die folgenden Aufgabenstellungen zu lsen. Die Ergebnisse dieser Aufgaben finden Sie im Anhang. 1. Stellen Sie sicher, dass beim Aktivieren einer bestimmten Tabelle die Neuberechnung ausgelst wird. 2. Wie muss das Ereignis lauten, wenn Sie vor dem Speichern einer Arbeitsmappe in der ersten Tabelle der Arbeitsmappe das aktuelle Tagesdatum erfassen mchten? 3. ffnen Sie die Demo-Arbeitsmappe Steuerung.xls und aktivieren die Tabelle BUNG. Ihre Aufgabe besteht nun darin, die beiden Maustasten zu programmieren. Fr den Bereich A1:E15 sollen dabei folgende Vorgnge ablaufen:
Klicken mit der rechten Maustaste: Addieren der Zelle um den Wert 10 Doppelklick mit der linken Maustaste: Subtrahieren der Zelle mit 10
360
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
362
Gestern haben Sie gelernt, was man unter Ereignissen in der Programmierung von Excel versteht. Sie haben Ereignisse fr Arbeitsmappen sowie fr einzelne Tabellen erstellt und knnen diese nun bei Bedarf einsetzen. Des Weiteren haben Sie Tastatureingaben ausgewertet und Makros zu bestimmten Zeitpunkten automatisch gestartet. Die Themen heute:
Daten filtern Pivot-Tabellen einsetzen Diagramme erstellen Alle Beispiele dieses Tages finden Sie auf der beiliegenden CD-ROM in den Arbeitsmappen Auswertung.xls und Diagramme.xls im Verzeichnis Kap08.
8.1
Daten filtern
Eine der schnellsten und wichtigsten Auswertungsfunktionen in Excel stellt der AutoFilter dar, den Sie im Men DATEN mit dem Befehl FILTER/AUTOFILTER aktivieren knnen. Beim Filtern von Daten stellen Sie ein Kriterium fr die Filterung ein, d.h. es werden nur die Zeilen angezeigt, die den Kriterien entsprechen, die Sie fr eine Spalte angeben. Andersherum gesehen werden beim Filtern alle Zeilen ausgeblendet, die nicht den eingestellten Kriterien entsprechen. Excel stellt zwei unterschiedliche Arten von Filtern zur Verfgung:
den AutoFilter mit der Mglichkeit, nach der ausgewhlten Zelle zu filtern, fr einfache Kriterien den Spezialfilter fr komplexere Aufgaben brigens werden beim Filtern die Daten nicht neu sortiert. Es werden lediglich die Zeilen ausgeblendet, die den eingestellten Kriterien nicht entsprechen.
364
Daten filtern
Vorsicht auch bei Leerzeilen in Excel-Tabellen! Der AutoFilter funktioniert nur einwandfrei, wenn Sie in Ihrer Tabelle keine Leerzeilen haben.
Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie den AutoFilter einsetzen mchten. Die Eigenschaft AutoFilterMode liefert den Wert True, wenn die Dropdown-Pfeile fr AutoFilter momentan auf dem Tabellenblatt sichtbar sind. Liefert diese Eigenschaft den Wert False zurck, dann blenden Sie die AutoFilter mithilfe der Methode AutoFilter ein. Um alle AutoFilter auf Ihrer Tabelle wieder auszublenden, setzen Sie diese Eigenschaft AutoFilterMode auf den Wert False.
365
Abbildung 8.1: Den AutoFilter einschalten Listing 8.2: Das Filterkriterium einstellen Sub MitarbeiterSindelfingen() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter _ Field:=5, Criteria1:="Sindelfingen" End Sub
Sie sollten immer sicherstellen, dass das richtige Tabellenblatt aktiviert und die AutoFilter-Pfeile angezeigt werden. Nur dann knnen Sie die Filterkriterien setzen. Um die Filterkriterien einzustellen, setzen Sie die Methode AutoFilter ein. Die Syntax dieser Methode lautet:
Ausdruck.AutoFilter(Field, Criteria1, Operator, Criteria2, VisibleDropDown)
Mit der AutoFilter-Methode haben Sie im Argument Field die Spalte E (Field:=5) als Spalte definiert, in der Sie ein Kriterium einstellen mchten.
366
Daten filtern
Das Anzeigekriterium fr die Zeilen haben Sie im Argument Criteria1 bekannt gegeben (Criteria1:="Sindelfingen"). Bei dem Argument Operator haben Sie die Auswahl aus mehreren Konstanten, die Sie Tabelle 8.1 entnehmen knnen.
Konstante
xlAnd xlOr
Erklrung Es mssen zwei Kriterien erfllt sein (Criteria1 und Criteria2). Es muss entweder das eine oder das andere Kriterium erfllt sein (Criteria1 oder Criteria2). Die n-hchsten Eintrge aus der Liste werden angezeigt (Absolutbetrachtung). Die n-hchsten Eintrge aus der Liste werden angezeigt (prozentuale Betrachtung). Die n-niedrigsten Eintrge aus der Liste werden angezeigt (Absolutbetrachtung). Die n-niedrigsten Eintrge aus der Liste werden angezeigt (prozentuale Betrachtung).
xlTop10Items
xlTop10Percent
xlBottom10Items
xlBottom10Percent
Das Argument Criteria2 stellt ein mgliches zweites Kriterium dar. Es wird zusammen mit Criteria1 und dem Argument Operator zum Erstellen von zusammengesetzten Kriterien verwendet. Das letzte Argument VisibleDropDown ist standardmig mit dem Wert True voreingestellt, was bedeutet, dass die Dropdown-Pfeile fr das gefilterte Feld angezeigt werden. Wenn das Argument auf den Wert False gesetzt wird, werden die Dropdown-Pfeile des AutoFilters fr das gefilterte Feld ausgeblendet.
367
In der folgenden Aufgabe sollen alle Mitarbeiter in TABELLE1 angezeigt werden, die im Standort Sindelfingen beschftigt sind und der Abteilung Einkauf angehren.
Listing 8.3: Mehrere Filter einsetzen Sub MitarbeiterSindelfingenEinkauf() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter With Selection .AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlAnd .AutoFilter Field:=4, Criteria1:="Einkauf", _ Operator:=xlAnd End With End Sub
Um mehrere Filter einzusetzen, die alle erfllt sein mssen, verbinden Sie die Filterkriterien mit dem Operator xlAnd. Im letzten Beispiel haben Sie je einen Filter fr die Spalten D und E eingestellt. Im folgenden Beispiel werden Sie ebenfalls zwei Filter verwenden. Allerdings werden Sie in einem Filter (Spalte E) zwei Kriterien formulieren. Folgende Aufgabe soll hierbei gelst werden:
368
Daten filtern
Abbildung 8.3: Zwei Filter (in den Spalten D und E) wurden eingesetzt.
Ermitteln Sie alle Mitarbeiter aus den Standorten Sindelfingen und Bblingen, die eine hhere Nummer als 40.000 haben. Das Makro fr diese Aufgabenbewltigung sehen Sie in Listing 8.4:
Listing 8.4: Mehrere Filter setzen Sub MitarbeiterSifiundBB() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter With Selection .AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlOr, Criteria2:="Bblingen", _ Operator:=xlAnd .AutoFilter Field:=2, Criteria1:=">40000" End With End Sub
Fr jeden einzelnen Filter setzen Sie die Methode AutoFilter ein, die die Kriterien zusammenstellt. Verbinden Sie die einzelnen Kriterien mit dem Operator xlAnd.
369
370
Daten filtern
Listing 8.6: Die Mitarbeiter mit den hchsten zehn Nummern werden angezeigt Sub TopTenFilterEinstellen() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlTop10Items End Sub
Stellen Sie im ersten Schritt sicher, dass Sie sich in der gewnschten Tabelle befinden. Danach prfen Sie, ob der AutoFilter bereits eingestellt ist. Danach fllen Sie den AutoFilter, indem Sie zuerst die Spalte angeben, in der gefiltert werden soll. Daraufhin geben Sie im Argument Criteria1 an, wie viele Eintrge angezeigt werden sollen. Da die zehn hchsten Werte angezeigt werden sollen, setzen Sie hier die Zahl 10 ein. Damit Excel wei, dass es die TopTen-Filterfunktion anwenden soll, weisen Sie dem Argument Operator die Konstante xlTop10Items zu. Um die zehn niedrigsten Eintrge in Spalte B anzuzeigen, lautet die entsprechende Zeile wie folgt:
Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlBottom10Items
Wie Sie sehen, werden nun wirklich nur die hchsten zehn Werte aus Spalte B angezeigt. Diese Zeilen liegen aber nicht sortiert vor. In diesem Fall knnen Sie die Sortierung ber einen VBA-Befehl nachholen, den Sie im Makro aus Listing 8.7 sehen knnen.
371
Listing 8.7: Filterung von Daten mit anschlieender Sortierung Sub TopTenFilterEinstellenErw() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlTop10Items ActiveSheet.UsedRange.Sort Key1:=Range("B1"), _ Order1:=xlDescending, Header:=xlYes End Sub
Wenden Sie die Methode Sort an, um einen Datenbereich zu sortieren. Den Datenbereich ermitteln Sie ber die Eigenschaft UsedRange. Bei der Methode Sort knnen Sie einige Argumente angeben. Unter anderem mssen Sie angeben, nach welchem Kriterium (Key1) sortiert werden soll. Auerdem ist natrlich auch von Interesse, ob absteigend (Order1:=xlDescending) oder aufsteigend (Order1:=xlAscending) sortiert werden soll. Ein weiteres wichtiges Argument ist Header. Damit geben Sie bekannt, ob die erste Zeile eine berschrift enthlt. In diesem Fall darf diese Zeile nicht mitsortiert werden. Setzen Sie dieses Argument auf den Wert xlYes, wenn der Bereich eine berschrift enthlt. Wenn nicht, dann weisen Sie diesem Argument die Konstante xlNo zu.
372
Daten filtern
Set Mappe = ThisWorkbook.Worksheets("Tabelle1") For i = 1 To ActiveSheet.Columns.Count On Error GoTo ende If Mappe.AutoFilterMode Then b = Mappe.AutoFilter.Filters(i).On Debug.Print "Filter in Spalte " & i & ": "; b End If Next i ende: End Sub
Definieren Sie im ersten Schritt ein paar Objektvariablen. In der Objektvariablen Mappe speichern Sie die Mappe sowie die Tabelle, auf der nach den gesetzten Autofiltern recherchiert werden soll. Setzen Sie danach eine Schleife auf, die beginnend von Spalte A alle Spalten abarbeitet. In einer Variablen vom Typ Boolean speichern Sie den Zustand des AutoFilters. Die Eigenschaft Filters liefert den Wert Falsch, wenn kein Filterkriterium in der jeweiligen Spalte eingestellt ist, bzw. den Wert Wahr, wenn ein Filterkriterium fr die Spalte festgelegt wurde. Mithilfe der Methode Debug.Print geben Sie den Spaltenindex sowie den Status des Filters im Direktfenster Ihrer Entwicklungsumgebung aus.
373
Nach dem Starten des Makros blenden Sie den Direktbereich ein, indem Sie in die Entwicklungsumgebung wechseln und aus dem Men ANSICHT den Befehl DIREKTFENSTER whlen.
374
Daten filtern
Abbildung 8.9: In dieser Liste soll jede Zahl nur einmal vorkommen.
Legen Sie zuerst in einer Objektvariablen ber die Anweisung Set fest, welcher Bereich mit dem Spezialfilter ausgewertet werden soll. Da Sie Ihre Tabelle auf doppelte Eintrge berprfen mchten, legen Sie den Bereich fr den Spezialfilter mit der Spalte A fest. Danach wenden Sie die Methode AdvancedFilter an, die folgende Syntax aufweist:
Ausdruck.AdvancedFilter(Action, CriteriaRange, CopyToRange, Unique)
Beim Argument Ausdruck muss es sich um ein Range-Objekt handeln. Im Beispiel aus Listing 8.9 ist das der Bereich der verwendeten Zellen in Spalte A. Das Argument Action ist vom Datentyp Long und muss angegeben werden. Es stellt die Filter-Operation dar. Dabei knnen Sie eine der folgenden xlFilterAction-Konstanten anwenden: xlFilterInPlace (an gleicher Stelle filtern) oder xlFilterCopy (Ergebnis des Filterns an anderer Stelle der Tabelle einfgen).
375
Das Argument CriteriaRange vom Datentyp Variant ist optional und stellt den Kriterienbereich fr die Filterung dar. Falls das Argument nicht angegeben wird, gibt es keine Kriterien. Das Argument CopyToRange vom Datentyp Variant ist optional und reprsentiert den Zielbereich fr die kopierten Zeilen, wenn das Argument Action den Wert xlFilterCopy aufweist. Andernfalls wird das Argument ignoriert.
Mithilfe der SpecialCells-Methode und der Eigenschaft CurrentRegion ermitteln Sie alle sichtbaren Zellen im umliegenden Bereich. Diese kopieren Sie mit der Methode Copy. Fgen Sie danach mithilfe der Methode Add eine neue Arbeitsmappe ein. Setzen Sie den Mauszeiger auf Zelle A1 und fgen den Inhalt der Zwi-
376
Daten filtern
schenablage mit der Methode PasteSpecial ein. Im Argument Paste setzen Sie die Konstante xlPasteAll ein, um die Werte und Formate einzufgen. Allerdings werden die Spaltenbreiten dadurch nicht korrekt eingestellt. Diese mssen noch korrigiert werden.
Mchten Sie die gefilterten Daten in eine Textdatei bertragen, dann fhren Sie zunchst eine Filterung der Daten durch. Sie kopieren diese auf ein neues Tabellenblatt und exportieren danach diese Tabelle in eine Textdatei. Im folgenden Makro aus Listing 8.11 wird die TABELLE1 gefiltert und in einer neuen Tabelle abgelegt. Danach wird diese neue Tabelle in eine Textdatei berfhrt.
Listing 8.11: Die gefilterten Daten in eine Textdatei berfhren Sub Dim Dim Dim Dim Dim GefilterteTabelleInTextdateiSpeichern() Zelle As Range i As Integer iZ As Integer e As Integer s As String
377
iZ = Range("A65536").End(xlUp).Row Open "C:\eigene Dateien\Ausgabe.txt" For Output As #1 For i = 1 To iZ For e = 1 To ActiveSheet.UsedRange.Columns.Count s = s & ";" & Cells(i, e).Value Next e s = Mid(s, 2, Len(s) - 1) Print #1, s s = "" Next i Close #1 MsgBox "Datenbertragung beendet!" End Sub
Mit der Methode Copy und der Eigenschaft UsedRange kopieren Sie den benutzten Bereich und fgen diesen auf dem Tabellenblatt TABELLE1 ein. Dort ermitteln Sie die letzte belegte Zelle in Spalte A. Dies gelingt Ihnen ber die Eigenschaft End, die die Zelle am Ende der Region darstellt, die den Quellbereich enthlt. Der Quellbereich stellt im Beispiel die Zahl 65536 dar, welches die maximale Anzahl von Zeilen in einer Excel-Tabelle darstellt. Dieser Eigenschaft bergeben Sie die Richtungskonstante xlUp. Neben xlUp knnen Sie auch xlToLeft, xlToRight oder xlDown verwenden, je nachdem, welche Zelle Sie ermitteln mchten. Danach ffnen Sie mithilfe der Anweisung Open eine Textdatei, ohne sie vorher anzulegen. Nun setzen Sie eine Schleife auf, die alle Zeilen der Tabelle durchluft. Innerhalb dieser Schleife basteln Sie sich eine zweite Schleife, welche die Spalten einer Zeile von links nach rechts durchluft. Die Anzahl der abzuarbeitenden Spalten ermitteln Sie ber die Anweisung ActiveSheet.UsedRange.Columns. Count. Innerhalb dieser zweiten Schleife speichern Sie die einzelnen Zelleninhalte in der String-Variablen s. Die Zelleninhalte werden durch das Semikolon voneinander getrennt. Setzen Sie die Anweisung Print ein, um die einzelnen Zeilen in die Textdatei zu schreiben. Schlieen Sie nach der bertragung der Daten die Textdatei mithilfe der Anweisung Close.
378
Pivot-Tabellen einsetzen
8.2
Pivot-Tabellen einsetzen
In Excel haben Sie die Mglichkeit, sehr schnell aussagekrftige Berichte zu erstellen. Die wohl beste und sicherste Methode, in Excel Daten auszuwerten und aufzubereiten, ist die Anwendung von Pivot-Tabellen. Diese Pivot-Tabellen knnen auch per VBA-Code erstellt werden.
Pivot-Tabellen erstellen
Die nchsten Beispiele werden anhand einer Artikel-Tabelle programmiert, die Sie in Abbildung 8.13 sehen knnen.
379
Im folgenden Beispiel soll eine Pivot-Tabelle erstellt werden, die Aussage darber gibt, welche Artikel sich an welchem Ort befinden.
Listing 8.12: Eine Pivot-Tabelle erstellen Sub ErstellenPivotTabelle() Dim Bereich As Range Sheets("Tabelle3").Activate Set Bereich = ActiveSheet.UsedRange Range(Bereich.Address).Select ActiveSheet.PivotTableWizard _ SourceType:=xlDatabase, SourceData:= _ Bereich, TableDestination:="", TableName:="Pivot" With ActiveSheet.PivotTables("Pivot") .PivotFields("Bezeichnung").Orientation = xlRowField .PivotFields("Ort").Orientation = xlColumnField .PivotFields("Preis").Orientation = xlDataField End With End Sub
Im ersten Schritt aktivieren Sie das Tabellenblatt, welches die Quelldaten fr die Auswertung enthlt, und legen den verwendeten Bereich in der Variablen Bereich fest. Danach markieren Sie den Quellbereich und wenden die Methode Pivot TableWizard an, die die Pivot-Tabelle erstellt. Die Methode PivotTableWizard hat folgende Syntax:
PivotTableWizard(SourceType, SourceData, _ TableDestination, TableName, RowGrand, _ ColumnGrand, SaveData, HasAutoFormat, AutoPage, _ Reserved, BackgroundQuery, OptimizeCache, _ PageFieldOrder, PageFieldWrapCount, ReadData, _ Connection)
Auf die wichtigsten Argumente der Methode PivotTableWizard wird nun nher eingegangen. Im Argument SourceType geben Sie die Quelle der Daten in dem Bericht an. Zulssig ist eine der in der folgenden Tabelle aufgefhrten Konstanten.
380
Pivot-Tabellen einsetzen
Konstante
xlConsolidation xlDatabase xlExternal xlPivotTable
Beschreibung Mehrere Konsolidierungsbereiche Microsoft Excel-Datenbank oder -Liste (Standard) Externe Datenquelle Gleiche Quelle wie ein anderer PivotTable-Bericht
Beim Argument SourceData legen Sie den Datenbereich fr den neuen Bericht fest. Hierfr haben Sie vorher den verwendeten Bereich auf dem Tabellenblatt in der Variablen Bereich definiert, welche Sie hier nun als Argument angeben. Im Argument TableDestination knnen Sie eine Zieltabelle inklusive der Position der ersten Zelle fr den Pivot-Tabellenbericht angeben. Belassen Sie dieses Argument leer, wenn der Pivot-Tabellenbericht auf einer neuen Tabelle, beginnend ab Zelle A1, eingefgt werden soll. Im Argument TableName geben Sie dem Pivot-Tabellenbericht einen Namen. Dies ist sehr wichtig, um spter bei der Anordnung der Pivot-Felder auf die richtige Pivot-Tabelle zuzugreifen. Wird dieses Argument nicht gesetzt, vergibt Excel eigene Namen fr die Pivot-Tabellen, die die Bezeichnung PIVOTTABLE enthalten, und eine fortlaufende Nummer. Gerade diese fortlaufende Nummer macht dann bei der weiteren Programmierung der Pivot-Tabelle Schwierigkeiten. Aus diesem Grund fllen Sie dieses Argument mit einem Namen, der konstant bleibt. Beginnen Sie jetzt mit der Anordnung Ihrer Datenfelder und nutzen Sie dazu das Auflistungsobjekt PivotFields. In diesem Auflistungsobjekt stehen alle verfgbaren Feldnamen der Pivot-Tabelle, die den Spaltenberschriften des Quellbereichs entsprechen. Mit der Eigenschaft Orientation legen Sie die Position des Feldnamens in der Pivot-Tabelle fest. Die Mglichkeiten, die Sie dabei haben, sehen Sie in der folgenden Tabelle.
381
Konstante
xlColumnField
Beschreibung Der Spaltenbereich der Pivot-Tabelle wird in unserem Beispiel mit dem Ort gefllt. Im Datenbereich der Pivot-Tabelle wird der Preis der einzelnen Artikel ausgegeben. Mit dieser Konstante knnen Sie einzelne Datenfelder ausblenden. Das Seitenfeld der Pivot-Tabelle bleibt in diesem Beispiel leer. Im Zeilenbereich wird die Bezeichnung der einzelnen Artikel aufgelistet.
xlDataField
xlHidden
xlPageField
xlRowField
Pivot-Tabellen aktualisieren
Bei der Arbeit mit Pivot-Tabellen gibt es zwei Punkte, die Sie beachten mssen:
Ist der Pivot-Tabellenbericht aktualisiert? Greift die Pivot-Tabelle wirklich auf den gewnschten Datenbereich zu? (Ist der Datenbereich nachtrglich vergrert worden?)
Um eine Pivot-Tabelle zu aktualisieren, starten Sie das Makro aus Listing 8.13.
382
Pivot-Tabellen einsetzen
Listing 8.13: Eine Pivot-Tabelle aktualisieren Sub EinzelnePivotTabelleAufBlattAktualisieren() On Error GoTo fehler Sheets("Tabelle11").PivotTables("Pivot").RefreshTable 'oder 'Sheets("Tabelle11").PivotTables(1).RefreshTable Exit Sub fehler: MsgBox "Es konnte keine Pivot-Tabelle gefunden werden!" End Sub
Auf der TABELLE11 in der aktiven Arbeitsmappe wird die Pivot-Tabelle Pivot mithilfe der Methode RefreshTable auf den neuesten Stand gebracht. Die Anweisung On Error ist eine reine Sicherheitsmanahme, die verhindern soll, dass das Makro abstrzt, wenn die richtige Pivot-Tabelle nicht gefunden werden kann. Sehr oft kommt es auch vor, dass der Bereich, auf den eine Pivot-Tabelle zugreift, erweitert wurde. Diese Anpassung bekommt die Pivot-Tabelle aber nicht automatisch mit. Erfassen Sie zu diesem Zweck das Makro aus Listing 8.14, welches den benutzten Bereich der TABELLE3 ermittelt und diesen Bereich der Pivot-Tabelle Pivot bergibt. Anschlieend erfolgt eine Aktualisierung der Pivot-Tabelle.
Listing 8.14: Eine Pivot-Tabelle dynamisch erweitern und aktualisieren Sub PivotTabellenDatenbereichErweitern() Dim pt As PivotTable Dim Bereich As Range Set Bereich = Sheets("Tabelle3").UsedRange ActiveWorkbook.Names.Add _ Name:="Pivot", _ RefersTo:=Bereich, Visible:=True Bereich.Select For Each pt In Sheets("Tabelle11").PivotTables With pt .PivotTableWizard SourceType:=xlDatabase, _ SourceData:="Pivot" End With
383
Ermitteln Sie zuerst einmal den verwendeten Bereich auf Ihrer TABELLE3 und speichern Sie diesen Bereich in der Objekt-Variablen Bereich. Benennen Sie danach den ermittelten Bereich, geben diesem den Namen Pivot und markieren Sie den Bereich im Anschluss. Mithilfe einer For-Each-Schleife greifen Sie auf alle Pivot-Tabellenberichte auf der TABELLE11 zu, erweitern den Datenbereich und aktualisieren die Pivot-Tabellenberichte. Das neue Thema lautet:
Diagrammtypen auswhlen
8.3
Diagramme erstellen
Der Spruch, dass ein Bild mehr aussagt als tausend Worte, wird immer wieder gerne verwendet. Gerade in Excel knnen Sie aus Zahlentabellen mit ein paar wenigen Handgriffen aussagekrftige Diagramme erstellen. Bei der Erstellung von Diagrammen haben Sie die Auswahl aus mehreren Diagrammtypen. Excel bietet Ihnen dabei ber den Diagramm-Assistenten eine Vielzahl an unterschiedlichen Diagrammen an.
Diagrammtypen auswhlen
In VBA wird fr den Diagrammtyp die Eigenschaft ChartType verwendet. In der nachfolgenden Tabelle sehen Sie exemplarisch eine kleine Auswahl an mglichen Diagrammtypen, die ber eine xlChartType-Konstante angesprochen werden knnen.
384
Diagramme erstellen
Diagrammtyp Sulendiagramm (gruppiert) Sulendiagramm (gestapelt) Sulendiagramm 3D-Darstellung Balkendiagramm (gruppiert) Balkendiagramm (gestapelt) Liniendiagramm Kreisdiagramm Punktdiagramm Blasendiagramm Flchendiagramm Ringdiagramm Netzdiagramm Oberflchendiagramm Kursdiagramm Tabelle 8.4: Mgliche Diagrammtypen in Excel
Konstante
xlColumnClustered xlColumnStacked xl3DColumn xlBarClustered xlBarStacked xlLine xlPie xlXYScatter xlBubble xlArea xlDoughnut xlRadar xlSurface xlStockHLC
Neben den in der Tabelle abgebildeten Diagrammtypen gibt es noch Zylinder-, Kegel- und Pyramidendiagramme sowie zu jedem Diagramm zahlreiche Untertypen. Eine komplette Liste der vorhandenen Diagramme in Excel bekommen Sie in der Online-Hilfe unter dem Stichwort ChartType.
385
In der folgenden Aufgabe gehen Sie von der nachfolgenden Datentabelle aus.
Aus dieser Datentabelle soll nun ein Diagramm erzeugt werden. Dabei soll der Name der Tabelle (Kostenvergleich 19982001) als Diagrammtitel verwendet werden. Das Makro fr diese Aufgabe lautet:
Listing 8.15: Das Sulendiagramm erstellen Sub SulenDiagrammErstellen() Dim Bereich As Range Dim s As String Set Bereich = Range("B2:F3") s = ActiveSheet.Name Charts.Add With ActiveChart .ChartType = xlColumnClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlRows .HasTitle = True .ChartTitle.Text = s End With End Sub
Im ersten Schritt legen Sie den Bereich fest, der die Datenbasis fr das Diagramm enthlt. Dazu speichern Sie die Adresse des Bereichs in der Range-Variablen Bereich. Danach ermitteln Sie den Namen des aktiven Tabellenblattes ber die Eigenschaften ActiveSheet und Name und speichern ihn in der Variablen s. Mit der Methode Add erstellen Sie zunchst ein neues, noch leeres Diagrammblatt.
386
Diagramme erstellen
Danach legen Sie das Aussehen des Diagramms fest. Mit der Eigenschaft ChartType bestimmen Sie den Diagrammtyp. ber die Methode SetSourceData geben Sie an, woher Excel die Daten fr das Diagramm bekommt. Diese Methode bentigt zwei Argumente. Dem ersten Argument Source bergeben Sie die Variable Bereich. Mit dem zweiten Argument PlotBy legen Sie fest, wie die Daten angezeigt werden sollen. Whlen Sie entweder die Konstante xlColumns oder xlRows. Bei der Konstanten xlRows werden die einzelnen Sulen in einer einheitlichen Farbe formatiert. Hingegen werden die einzelnen Sulen bei Verwendung der Konstanten xlColumns in unterschiedlichen Farben ausgegeben. Die Eigenschaft HasTitle mssen Sie auf den Wert True setzen, damit eine berschrift im Diagramm angezeigt werden kann. Die berschrift des Diagramms erstellen Sie mithilfe der Eigenschaft ChartTitle und der Eigenschaft Text, die Sie aus der Variablen s erfragen knnen.
Abbildung 8.16: Das erste Diagramm ber den Einsatz von VBA erstellen
387
In der folgenden Aufgabe sollen die Umstze von Arbeitsgruppen in einem bestimmten Monat verglichen werden. Als Ausgangstabelle gehen Sie dabei von der folgenden Abbildung aus.
388
Diagramme erstellen
Stellen Sie zuerst sicher, dass Sie sich auf dem gewnschten Tabellenblatt befinden, auf dem sich die Daten fr das Diagramm befinden. Diese Information geben Sie in der Objektvariablen Bereich mitsamt dem Zellenbereich ber die Anweisung Set an. Fgen Sie danach ein neues Diagrammobjekt ber die Methode Add ein. ber die Eigenschaft ChartType knnen Sie ein Diagramm Ihrer Wahl (siehe Tabelle 8.4) festlegen. Die Datenbasis fr das Diagramm ermitteln Sie mit der Methode SetSourceData, der Sie im Argument Source den vorher definierten Bereich bergeben.
389
Abbildung 8.19: Die Temperaturen werden zu jeder vollen Stunde aufgezeichnet. Listing 8.17: Temperaturverlufe in einem Liniendiagramm darstellen Sub Dim Dim Dim LinienDiagrammErstellen() Dia As ChartObject s As String i As Integer
Sheets("Temperaturen").Activate s = ActiveSheet.Name ActiveSheet.ChartObjects.Delete Set Dia = Sheets("Temperaturen").ChartObjects.Add _ (150, 10, 500, 300) Dia.Name = "Temperaturen von heute" i = ActiveSheet.Range("B1").End(xlDown).Row Range("A2:B" & i).Copy ActiveSheet.ChartObjects("Temperaturen von heute").Activate ActiveChart.SeriesCollection.Paste _ Rowcol:=xlColumns, SeriesLabels:=False, _ CategoryLabels:=True, Replace:=True, NewSeries:=True Application.CutCopyMode = False With ActiveChart
390
Diagramme erstellen
.ChartType = xlLineMarkers .HasLegend = False .HasTitle = True .ChartTitle.Text = s End With Range("A1").Select End Sub
Im ersten Schritt aktivieren Sie die Tabelle TEMPERATUR und schreiben den Tabellennamen der aktiven Tabelle in die Variable s. Dieser Tabellenname soll spter die berschrift des Diagramms werden. Da Sie ein eingebettetes Diagramm einfgen mchten, mssen Sie dafr Sorge tragen, dass bei mehrmaligem Starten des Makros nicht mehrere Diagramme bereinander eingefgt werden. Lschen Sie daher zu Beginn alle integrierten Diagramme auf dem Arbeitsblatt ber die Methode Delete. Danach fgen Sie ein noch leeres Chart-Objekt in Ihre Tabelle mit der Methode
Add ein. Dabei knnen Sie die Position des ChartObjekts genau festlegen. Die vier
Zahlenwerte entsprechen den Angaben linker Rand, oberer Rand, Breite und Hhe. Die Werte werden in Punkten angegeben und beziehen sich auf die obere linke Ecke der Zelle A1 oder auf die obere linke Ecke des Diagramms. Geben Sie als Nchstes dem eingebetteten Diagramm einen Namen. Jetzt mssen Sie herausbekommen, wie viele Messungen im Diagramm angezeigt werden sollen. Dazu ermitteln Sie die letzte belegte Zelle in Spalte B und speichern die Zeilennummer in der Variablen i. Markieren Sie den Bereich und kopieren Sie ihn mit der Methode Copy. Markieren Sie danach Ihr gerade eingefgtes Diagramm. Um die kopierten Daten einzufgen, verwenden Sie die Methode Paste der SeriesCollection-Auflistung. Die Syntax dieser Methode lautet:
Paste(Rowcol, SeriesLabels, CategoryLabels, Replace, _ NewSeries)
Im ersten Argument RowCol geben Sie Auskunft darber, ob sich die Daten in Zeilen oder Spalten befinden. Zulssig sind hierbei die Konstanten xlColumns oder xlRows. Das Argument SeriesLabels gibt an, woher Excel die Beschriftung fr die Datenreihen nehmen soll. Wird der Wert auf True gesetzt, wird der Inhalt der Zelle in der ersten Spalte jeder Zeile (bzw. der ersten Zeile jeder Spalte) als Name fr die Datenreihe in der betreffenden Zeile (bzw. Spalte) verwendet. Setzen Sie dieses Argument auf den Wert False, wenn der Inhalt der Zelle in der ersten Spalte jeder
391
Zeile (bzw. der ersten Zeile jeder Spalte) als erster Datenpunkt der Datenreihe verwendet werden soll. Das nchste Argument CategoryLabels weist den Wert True auf, wenn der Inhalt der ersten Zeile (bzw. Spalte) als Rubrik des Diagramms verwendet wird. Setzen Sie das Argument auf den Wert False, wenn der Inhalt der ersten Zeile (bzw. Spalte) als erste Datenreihe im Diagramm verwendet werden soll. Das Argument Replace ist standardmig auf den Wert True gesetzt. Dabei werden beim Ersetzen vorhandener Rubriken durch Informationen aus dem kopierten Bereich Rubriken angewendet. Das letzte Argument NewSeries hat dann den Wert True, wenn die Daten als eine neue Datenreihe eingefgt werden sollen. Setzen Sie das Argument auf den Wert False, wenn Sie die Daten als neue Datenpunkte in eine vorhandene Datenreihe einfgen mchten. Nach der Kopier- und Einfgeaktion ist nach wie vor der Kopierrahmen aktiv. Setzen Sie die Eigenschaft CutCopyMode auf den Wert False, um den Ausschneidebzw. Kopiermodus zu deaktivieren und den Laufrahmen zu entfernen. Als letzte Aufgabe weisen Sie dem Diagramm den gewnschten Diagrammtyp ber die Eigenschaft ChartType zu, verzichten auf eine Legende, indem Sie die Eigenschaft HasLegend auf den Wert False setzen, und zeigen die berschrift im Diagramm an, indem sie der Eigenschaft ChartTitle den Text Ihrer Variablen s zuweisen.
Wenn Sie sich die Abbildung 8.20 ansehen, dann stellen Sie fest, dass die Skalierung der Y-Achse von 0 bis 18 geht. Diese Skalierung wird von Excel automatisch beim Erstellen des Diagramms festgelegt. Selbstverstndlich haben Sie die Mglichkeit, die Skalierung auch selbst zu bestimmen.
392
Diagramme erstellen
Ermitteln Sie ber die beiden Tabellenfunktionen WorkSheetFunction Max und Min den hchsten sowie den niedrigsten Wert der Temperaturmessung. Diese beiden Werte weisen Sie danach den Eigenschaften MinimumScale sowie MaximumScale zu. Die Schrittweite der Skalierung legen Sie mithilfe der Eigenschaft MajorUnit fest.
Diagramme platzieren
Beim Einfgen von Diagrammen haben Sie die Auswahl, ob Sie das Diagramm unterhalb Ihrer Datentabelle oder als neues Diagrammblatt einfgen mchten. Sie haben jedoch jederzeit die Mglichkeit, Diagramme innerhalb von Arbeitsmappen und Tabellen hin und her zu schieben.
393
Im folgenden Beispiel soll das eingebettete Diagramm auf der Tabelle TEMPERATUREN in einem separaten Diagrammblatt mit dem Namen TEMPERATURENGROSS transferiert werden. Das Makro fr diese Aufgabe knnen Sie im nchsten Listing sehen:
Listing 8.19: Den Speicherort des Diagramms bestimmen Sub EingebettetesDiagrammZuDiagrammblatt() Sheets("Temperaturen").Activate ActiveSheet.ChartObjects(1).Activate ActiveChart.Location Where:=xlLocationAsNewSheet, _ Name:="Temperaturen-Gro" End Sub
Greifen Sie auf das erste eingebettete Diagramm auf Ihrer Tabelle zu und wenden Sie die Methode Location an, um das eingebettete Diagramm zu verschieben. Bei der Methode Location knnen Sie im Argument Where entweder die Konstanten xlLocationAsNewSheet, xlLocationAsObject oder xlLocationAutomatic verwenden. In Listing 8.19 wird das eingebettete Diagramm in ein neues Diagrammblatt verschoben. Aus diesem Grund verwenden Sie hier das Argument xlLocationAsNewSheet. Im Argument Name geben Sie an, wie das neue Diagrammblatt heien soll.
394
Diagramme erstellen
Diagramme formatieren
Excel whlt beim Erstellen von Diagrammen die Farben des Diagramms selbststndig aus. Diese Auswahl der Farben knnen Sie selbstverstndlich auch nach eigenem Geschmack durchfhren.
In der folgenden Aufgabe werden Sie ein Sulendiagramm einfgen. Im Sulendiagramm selbst werden Deckungsbeitrge angezeigt. Diese Deckungsbeitrge knnen entweder im negativen oder im positiven Bereich liegen. Ihre Aufgabe besteht nun darin, alle negativen Deckungsbeitrge mit der Fllfarbe ROT sowie alle positiven
395
Deckungsbeitrge mit der Fllfarbe BLAU zu formatieren. Gehen Sie zunchst von folgender Ausgangstabelle aus (siehe Abbildung 8.23). In Abbildung 8.23 sind alle Sulen mit der Fllfarbe BLAU formatiert. Erfassen Sie jetzt das folgende Makro aus Listing 8.20, um die negativen Deckungsbeitrge mit der Fllfarbe ROT zu formatieren.
Listing 8.20: Sulen unterschiedlich einfrben Sub Dim Dim Dim Dim SulenVerschiedenfarbig() Datenreihe As Series Punkt As Point i As Integer DArray As Variant
Sheets("Deckungsbeitrge").Activate Set Datenreihe = _ ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1) With Datenreihe DArray = .Values For Each Punkt In .Points i = i + 1 If DArray(i) < 0 Then Punkt.Interior.ColorIndex = 3 Else Punkt.Interior.ColorIndex = 5 End If Next End With End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Series. Nun lesen Sie alle YWerte in ein Datenfeld ein und durchlaufen danach eine For-Each-Schleife, in der Sie die einzelnen Datenpunkte kontrollieren. Die Werte entnehmen Sie dem Datenfeld DArray. Weist ein Datenpunkt einen Wert < 0 auf, wird der Innenbereich der Sule mit der Farbe ROT formatiert. Bei allen positiven Werten wird ein blauer Farbton gewhlt.
396
Diagramme erstellen
Diagramme exportieren
In Excel knnen Sie Diagramme ber einen Grafikfilter umwandeln und somit in ein anderes Format berfhren. Das bringt Vorteile, wenn Sie Diagramme an Personen ausliefern mchten, die kein Excel installiert haben. Erstellen Sie aus den Excel-Diagrammen Speicher schonende Grafikdateien im GIF-Format. Auch wenn Sie Diagramme in Ihrer Textverarbeitung verwenden und dabei keine Excel-Diagramme verknpfen mchten, ist das Einbinden von Diagramm-Grafiken eine gute Alternative. Allerdings knnen diese umgewandelten Diagramme dann nicht mehr aktualisiert werden. In der folgenden Aufgabe wird das gerade formatierte Diagramm aus Abbildung 8.24 in eine Grafikdatei umgewandelt. Erfassen Sie zu diesem Zweck das Makro aus Listing 8.21.
Listing 8.21: Diagramm als Grafik-Objekt exportieren Sub DiagrammeAlsGrafikSpeichern() Dim Dia As Chart Sheets("Deckungsbeitrge").Activate Set Dia = ActiveSheet.ChartObjects(1).Chart Dia.Export Filename:="c:\Eigene Dateien\Export.gif", _ FilterName:="GIF" End Sub
397
ber die Methode Export exportieren Sie das Diagramm in ein Grafikformat. Dabei verwendet die Methode Export die Argumente FileName und FilterName. Im Argument FileName geben Sie den Pfad sowie den Namen der Grafikdatei an. Im Argument FilterName wird der Name des Grafikfilters angegeben, der verwendet werden soll.
Abbildung 8.25: Die umgewandelte Datei kann im Photo Editor aufgerufen werden.
8.4
F A
398
i = Intersect(Bereich.SpecialCells(xlVisible), _ Bereich.Columns(1)).Count 1 MsgBox "Sie haben " & i & " Zeilen gefiltert", _ vbInformation, "Filterergebnis" End Sub
ber die Eigenschaft CurrentRegion ermitteln Sie den umliegenden Bereich, der von Leerzeilen bzw. Leerspalten umgeben wird. Es wird demnach der Block ermittelt, der sich, beginnend von der Zelle, in der der erste Filter angezeigt wird (A1), bis zur letzten gefllten Zeile ergibt. Mit der Eigenschaft Intersect prfen Sie, ob es im Bereich der Spalte A gefilterte Zeilen gibt. Dazu verwenden Sie die Methode SpecialCells, der Sie die Konstante xlVisible bergeben. Die Zhlung der ermittelten Zeilen erfolgt durch die Eigenschaft Count, von der Sie den Wert 1 subtrahieren mssen, da die berschriftenzeile nicht zum Ergebnis der gefilterten Daten gezhlt werden soll. Abschlieend geben Sie die Anzahl der gefilterten Zeilen in einem Meldungsfenster aus, welches Sie mit der Symbol-Info ausstatten. Dazu verwenden Sie die Konstante vbInformation.
F
Um diese Aufgabe zu lsen, setzen Sie das Makro aus Listing 8.23 ein:
Listing 8.23: Die erste gefilterte Zeile ermitteln Sub ErsteGefilterteZeileFinden() Dim l As Long Sheets("Tabelle1").Activate Range("A1").Select For l = 2 To ActiveSheet.UsedRange.Rows.Count If ActiveSheet.Rows(l).Hidden <> True Then MsgBox "Die erste gefilterte Zeile ist die Zeile " _ & l, vbInformation: Exit For End If Next End Sub
Da die eigentlichen Daten erst in Zeile 2 beginnen, setzen Sie die ForNext-Schleife mit einem Startwert von 2 auf und durchlaufen alle Zeilen im benutzten Bereich. Innerhalb der Schleife prfen Sie, ob die Eigenschaft Hidden der jeweiligen Zeile den Wert False liefert. Wird dieser Wert zum ersten Mal zurckgegeben, wird die aktuelle Zeilennummer auf dem
399
Bildschirm ausgegeben. Danach wird die Schleife ber die Anweisung Exit For direkt verlassen.
F
Um alle Diagrammbltter aus einer Arbeitsmappe zu entfernen, starten Sie das Makro aus Listing 8.24.
Listing 8.24: Alle Diagrammbltter aus Arbeitsmappe entfernen Sub DiagrammeEntfernen() Application.DisplayAlerts = False On Error Resume Next ActiveWorkbook.Charts.Delete Application.DisplayAlerts = True End Sub
Indem Sie die Eigenschaft DisplayAlerts auf den Wert False setzen, brauchen Sie die einzelnen Lschungen nicht zu besttigen. Die On-ErrorAnweisung sorgt dafr, dass die Verarbeitung sauber abgefangen wird, wenn berhaupt kein Diagrammblatt in der Arbeitsmappe enthalten ist. Die Eigenschaft Charts gibt eine Auflistung aller Diagrammbltter der aktiven Arbeitsmappe zurck, die Sie mithilfe der Methode Delete lschen.
F
Sie haben Zugriff auf die Legende eines Diagramms, indem Sie auf die Eigenschaft Legend von ActiveChart zugreifen. Im folgenden Makro aus Listing 8.25 formatieren Sie eine Legende mit der Schriftfarbe BLAU und dem Schriftschnitt FETT.
Listing 8.25: Die Legende formatieren Sub LegendeFormatieren() Sheets("Deckungsbeitrge").Activate ActiveSheet.ChartObjects(1).Select ActiveChart.HasLegend = True With ActiveChart.Legend.Font .Bold = True .ColorIndex = 5 End With End Sub
400
Quiz
Blenden Sie mithilfe der Eigenschaft HasLegend die Legende des Diagramms ein, indem Sie diese Eigenschaft auf den Wert True setzen. Im Anschluss daran wenden Sie die Eigenschaften Bold und ColorIndex auf das Schriftobjekt Font der Legende an, um den Schriftschnitt sowie die Schriftfarbe festzulegen.
8.5
F F F F F F F F
Quiz
Wie lautet die Anweisung, um den AutoFilter einzuschalten? Wie heit die Methode, um den SpezialFilter aufzurufen? Wie lautet die Methode, um eine Pivot-Tabelle zu aktualisieren? Wie kann man den Diagrammtyp bestimmen? Welchen ChartType mssen Sie whlen, um ein Kreisdiagramm einzufgen? ber welche Eigenschaft stellen Sie den grten Wert einer Skalierung ein? Welche Konstante mssen Sie bei der Eigenschaft Location angeben, um ein eingebettetes Diagramm in ein separates Diagrammblatt zu transferieren? Welche zwei Argumente mssen beim Export eines Diagramms bei der Methode Export angegeben werden?
8.6
bungen
Zum Ende dieses Tages versuchen Sie bitte, folgende Aufgaben zu lsen: 1. Formatieren Sie die Pivot-Tabelle auf TABELLE1 mit einem AutoFormat. 2. ffnen Sie die Demo-Arbeitsmappe Diagramme.xls und aktivieren die Tabelle BUNG. Ihre Aufgabe besteht nun darin, anhand des Datenmaterials ein Zylinderdiagramm zu erstellen. Das Ergebnis dieser Aufgabenstellungen finden Sie im Anhang A.
401
Am gestrigen Tag haben Sie gelernt, wie man groe Datenmengen ber den Einsatz von Pivot-Tabellen sowie der Datenfilterung schnell und sicher auswerten kann. Des Weiteren haben Sie erfahren, wie Sie mit Makros Diagramme einfgen und gestalten knnen. Die Themen heute:
Eigene Funktionen stricken Modulare Funktionen programmieren Funktionen dauerhaft verfgbar machen
Standardmig bietet Ihnen Excel einige hundert Funktionen an, die Sie fr Ihre tgliche Arbeit ntzen knnen. Dabei muss man zwischen den Funktionen unterscheiden:
Auf der einen Seite gibt es Funktionen, die Sie in einer Tabelle direkt in eine Zelle eingeben. Die populrste dieser Funktionen ist die Funktion SUMME(), die einen angegebenen Zellenbereich summiert. Weitere Funktionen knnen ber den Funktions-Assistenten elegant in Ihre Tabellen eingefgt werden. Daneben gibt es spezielle VBA-Standardfunktionen, die Sie in Ihren Makros einsetzen knnen, um bestimmte Aufgaben zu erledigen. Ein Beispiel fr eine solche Funktion stellt die Funktion Len dar, ber die Sie beispielsweise die Lnge eines Zelleninhaltes feststellen knnen. Diese und weitere Funktionen knnen Sie in der Online-Hilfe auf der Registerkarte INHALT unter der Rubrik FUNKTIONEN nachschlagen. In den meisten Fllen wird zu diesen Funktionen auch ein kleines Beispiel angeboten, welches Sie kopieren und in Ihre eigenen Makros mit einbauen knnen. Des Weiteren gibt es Funktionen, die Sie selbst schreiben, um sich Schreibarbeit zu sparen und Redundanz von Quellcode zu vermeiden. Ein Beispiel fr diese Art von Funktionen wre eine Funktion, die berprft, ob eine bestimmte Tabelle in einer Arbeitsmappe vorhanden ist. Da Sie so eine Aufgabe in der Programmierung bestimmt sehr oft durchfhren werden, empfiehlt es sich, eine solche Aufgabe in eine allgemeine Funktion zu packen und diese dann aus den verschiedenen Makros aufzurufen. Der Vorteil liegt auf der Hand: Wenn Sie die Funktion ndern mchten, dann mssen Sie dies nicht an vielen Stellen im Quellcode machen, sondern eben nur in dieser einen Funktion.
404
9.1
Sicher ist die Auswahl der standardmig angebotenen Tabellenfunktionen ganz betrchtlich und in den meisten Fllen auch ausreichend. Trotzdem gibt es hier und da noch Bedarf, eigene Tabellenfunktionen zu erstellen, um spezielle Aufgaben zu lsen. Die so erstellten neuen Tabellenfunktionen knnen Sie ebenso ber den Funktionsassistenten unter der Rubrik BENUTZERDEFINIERT einfgen.
Sehen Sie nun anhand einiger typischer Beispiele aus der Praxis, wie Sie neue Tabellenfunktionen erstellen und einsetzen knnen. Alle Beispiele heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Funktionen.xls im Verzeichnis Kap9.
405
Erfassen Sie nun die Funktion, die die blau und fett formatierten Zellen summiert. Sehen Sie sich dazu das Makro aus Listing 9.1 an.
Listing 9.1: Alle Zellen mit bestimmter Formatierung sollen summiert werden Function BUF(zelle As Range) Application.Volatile For Each zelle In zelle.Cells If IsNumeric(zelle) Then If zelle.Font.Bold = True And _ zelle.Font.ColorIndex = 5 Then BUF = BUF + zelle.Value End If End If Next zelle End Function
Jede Funktion beginnt mit dem Schlsselwort Function, gefolgt vom Namen der Funktion, der nahezu beliebig gewhlt werden kann. Da Sie den Namen dieser Funktion spter direkt in einer Tabellenzelle erfassen mssen, empfiehlt es sich, mglichst kurze Funktionsnamen zu verwenden. Der von mir gewhlte Name BUF steht dabei fr Blau und Fett. Nach dem Namen folgen in Klammern die Argumente, die der Funktion bergeben werden sollen. Da dieses Argument in unserem Beispiel Zellen sein sollen, bergeben Sie der Funktion eine Objektvariable vom Typ Range. Der Aufruf der Funktion in einer beliebigen Zelle einer Tabelle lautet danach beispielsweise =BUF(A1:A13).
406
Mit der Anweisung Application.Volatile sorgen Sie dafr, dass der Wert der Zelle neu berechnet wird, wenn ein neuer Wert in der Tabelle erfasst wird. Die Aktualisierung erfolgt nicht automatisch, wenn Sie nur die Formatierung einer Zelle ndern.
In einer anschlieenden Schleife arbeiten Sie alle Zellen nacheinander ab, die mit der Funktion bergeben wurden. Innerhalb dieser Schleife sollten Sie sicherstellen, dass es sich wirklich um Zellen handelt, die Zahlenwerte enthalten. Wenn nicht, dann meldet die VBA-Funktion IsNumeric den Wert False, was zur Folge hat, dass eine solche Zelle ignoriert wird. Neben dieser Prfung mssen Sie im Anschluss daran berprfen, ob der Schriftschnitt FETT ist. Diese Prfung erreichen Sie, indem Sie die Eigenschaft Bold des Font-Objektes abfragen. Meldet diese Prfung als Ergebnis den Wert True, dann ist die Zelle mit dem Schriftschnitt FETT formatiert. Damit noch nicht genug, es muss schlielich auch die richtige Farbe, nmlich BLAU, vorliegen. Die Farbe der Schriftart knnen Sie ber die Eigenschaft ColorIndex feststellen, welche fr die Farbe BLAU den Index 5 zurckmeldet. Nur wenn diese beiden Formatierungskriterien zutreffen, erfolgt eine Summierung. Achten Sie dabei darauf, dass Sie die bereits ermittelten Werte nicht berschreiben. Fr diesen Fall schreiben Sie die Anweisung BUF = BUF + zelle.Value, was bedeutet, dass der bisherige Wert, der momentan in BUF steht, um den Wert addiert wird, der in der aktuell berprften Zelle steht. Testen Sie nun die Funktion, indem Sie diese in eine beliebige Zelle der Tabelle eingeben, wie dies in Abbildung 9.3 durchgefhrt wurde. brigens knnen Sie die Funktion aus Listing 9.1 als Vorlage einsetzen, wenn es darum geht, anstatt der Summierung eine einfache Zhlung durchzufhren. In diesem Fall lautet die Funktion wie folgt:
Listing 9.2: Fett und blau formatierte Zellen zhlen Function BUFZ(zelle As Range) Application.Volatile For Each zelle In zelle.Cells If IsNumeric(zelle) Then If zelle.Font.Bold = True _ And zelle.Font.ColorIndex = 5 Then
407
ber die Anweisung ActiveWorkbook.Name knnen Sie den Namen der Arbeitsmappe ermitteln. Wenn Sie zustzlich zum Namen auch noch den Speicherpfad ermitteln mchten, dann erweitern Sie die Funktion aus Listing 9.3 wie folgt:
408
Listing 9.4: Den kompletten Speicherpfad sowie den Namen der aktiven Arbeitsmappe zurckgeben Function AktMapV() AktMapV = ActiveWorkbook.FullName End Function
ber die Eigenschaft FullName knnen Sie den Namen sowie den Pfad einer gespeicherten Arbeitsmappe ermitteln. Allerdings muss diese Arbeitsmappe vorher einmal gespeichert worden sein.
Formelcheck durchfhren
In der nchsten Aufgabe soll mit einer Funktion geprft werden, ob eine bestimmte Zelle eine Formel enthlt oder nicht. Dazu fgen Sie folgende Funktion ein. Die Funktion aus Listing 9.5 prft, ob eine Zelle eine Formel bzw. Verknpfung enthlt:
Listing 9.5: Zellen auf Formelinhalt berprfen Function FormelZ(zelle) Application.Volatile FormelZ = False If Left(zelle.Formula, 1) = "=" Then FormelZ = True End Function
Eine Formel bzw. eine Verknpfung oder auch eine Funktion erkennen Sie in Excel daran, dass diese mit einem Gleichheitszeichen beginnt. Genau dieses Verhalten prfen Sie, indem Sie in der Zielzelle das erste Zeichen auswerten. Setzen Sie zu diesem Zweck die Funktion Left ein und extrahieren Sie das erste Zeichen der angegebenen Zelle, indem Sie als zweites Argument fr diese Funktion die Zahl 1 einsetzen. Entspricht das erste Zeichen einem Gleichheitszeichen, dann geben Sie als Rckgabewert True zurck.
409
Testen Sie die Funktion, indem Sie in einer Tabelle ab Zelle B2 bis Zelle B4 ein paar Zahlenwerte eintragen und summieren danach diese Zellen in Zelle B5. Geben Sie dann die Funktion =FormelZ(B2) in Zelle C2 ein und kopieren Sie diese Funktion mit einem Doppelklick auf das Ausfllkstchen nach unten.
Diese Funktion bercksichtigt auch Zellen, welche Texte enthalten. Nachdem Sie zu Beginn der Funktion den Rckgabewert auf False gesetzt haben, gibt es diesbezglich keine Probleme.
Zelleninformationen abfragen
In der nchsten Aufgabe werden Sie eine Zelle mithilfe einer Funktion berprfen. Je nach Funktionsaufruf sollen dabei folgende Informationen ermittelt werden:
Alle diese Informationen knnen Sie ber die folgende Funktion aus Listing 9.6 abfragen:
Listing 9.6: Zelle abfragen ber eine Funktion Function INFOZ(zelle As Range, i As Integer) Select Case i Case 1 INFOZ = zelle.Address Case 2
410
INFOZ = zelle.Value Case 3 INFOZ = zelle.FormulaLocal Case Else INFOZ = "nicht vergeben" End Select End Function
Bei der Funktion aus Listing 9.6 knnen Sie sowohl die Zellenadresse, den Zellenwert sowie die Zellenformel abfragen. Um beispielsweise die Zellenadresse abzufragen, rufen Sie die Funktion in Ihrer Tabelle wie folgt auf: =INFOZ(B7;1). Innerhalb dieser Funktion werten Sie genau dieses zweite Argument aus. Um die Zellenadresse zurckzugeben, setzen Sie die Eigenschaft Address ein. Den Wert einer Zelle bekommen Sie ber die Eigenschaft Value und die Formel der Zelle erhalten Sie ber die Eigenschaft FormulaLocal.
Dateiname und Pfad nur Dateiname nur Pfad der Datei Dateityp
411
Dateigre Erstellungsdatum der Datei letzte nderung an der Datei letzter Zugriff auf die Datei
Fassen Sie diese Informationen nun in einer Funktion zusammen, welche Sie in Listing 9.7 sehen knnen:
Listing 9.7: Dokumenteigenschaften ber eine Funktion abfragen Function DokuEig(EigenschaftsNr As Integer) Dim fso As Object Dim tmp As String On Error Resume Next Set fso = CreateObject("Scripting.FileSystemObject") With fso.GetFile(ActiveWorkbook.FullName) Select Case EigenschaftsNr Case Is = 1: tmp = .Path Case Is = 2: tmp = Mid(.Path, 1, _ Len(.Path) - Len(.Name)) Case Is = 3: tmp = .Name Case Is = 4: tmp = .Type Case Is = 5: tmp = .Size Case Is = 6: tmp = .DateCreated Case Is = 7: tmp = .DateLastModified Case Is = 8: tmp = .DateLastAccessed Case Else tmp = "Ungltige EigenschaftsNr!" End Select End With DokuEig = tmp End Function
Erstellen Sie im ersten Schritt einen Verweis auf das FileSystemObject, um damit die Informationen bezglich der Arbeitsmappe zu erlangen. ber die Methode GetFile teilen Sie Excel mit, welche Datei Sie diesbezglich auswerten mchten. Danach werten Sie die bergebene Eigenschaftennummer in einer Select-CaseAnweisung aus:
412
Mithilfe der Eigenschaft Path ermitteln Sie den Namen sowie den kompletten Speicherpfad der aktiven Arbeitsmappe. Das Verzeichnis ermitteln Sie, indem Sie ber die Funktion Mid einen Teil aus der kompletten Pfadangabe herausschnippeln. Dabei subtrahieren Sie die Lnge des Gesamttextes von der Anzahl der Zeichen des Dateinamens, den Sie ber die Eigenschaft Name ermitteln. Den Namen der Datei ermitteln Sie direkt ber die Eigenschaft Name. Die Eigenschaft Type meldet Ihnen den Typ der Datei, d.h. Sie knnen diese Funktion auch anhand von Word-Dokumenten, Access-Datenbanken und weiteren Dateitypen anwenden. Die Eigenschaft Size gibt die Gre der Datei in Bytes an. Mithilfe der Eigenschaft DateCreated knnen Sie das Erstellungsdatum einer Datei ermitteln. ber die Eigenschaft DateLastModified gelangen Sie an das Datum inklusive der Uhrzeit der letzten nderung der Datei. Mit der Eigenschaft DateLastAccessed knnen Sie das letzte Zugangsdatum der Datei ermitteln, d.h. wann die Datei das letzte Mal geffnet wurde.
Abbildung 9.7: Die Funktion DokuEig mit unterschiedlichen Argumenten und Ergebnissen
413
Listing 9.8: Alle Buchstaben sollen aus einer Zelle entfernt werden Function BuchstRaus(Zelle) As Integer Dim i As Integer Application.Volatile For i = 1 To Len(Zelle) Select Case Asc(Mid(Zelle, i, 1)) Case 0 To 64, 123 To 197 BuchstRaus = BuchstRaus & Mid(Zelle, i, 1) End Select Next i End Function
Ermitteln Sie im ersten Schritt die Lnge der Zelle und setzen Sie dafr die Funktion Len ein. Danach prfen Sie mithilfe der Funktion Asc das jeweils aktuelle Zeichen der Zelle, indem Sie dieses in einen Integer-Wert umwandeln. Mit der Funktion Mid extrahieren Sie jeweils das nchste Zeichen aus der Zelle. Dabei entsprechen die Werte 65 bis 90 Kleinbuchstaben, die Werte 97 bis 122 den Grobuchstaben und die restlichen Werte den Sonderzeichen. Diese Wertbereiche grenzen Sie innerhalb der Select-Case-Anweisung aus. Wird ein Zeichen in der Zelle gefunden, welches numerisch ist bzw. einem Sonderzeichen entspricht, wird es gesammelt und bereits ermittelten Zahlen mit angehngt.
414
Sehen Sie sich zu diesem Zweck die Funktion aus Listing 9.9 an:
Listing 9.9: Die Position des ersten numerischen Zeichens ermitteln Function PosErsteZahl(Zelle) As Integer Dim i As Integer Application.Volatile For i = 1 To Len(Zelle) Select Case Asc(Mid(Zelle, i, 1)) Case 0 To 64, 123 To 197 PosErsteZahl = i Exit Function End Select Next i PosErsteZahl = 0 End Function
Ermitteln Sie im ersten Schritt die Lnge der Zelle und setzen Sie dafr die Funktion Len ein. Danach prfen Sie mithilfe de Funktion Asc das jeweils aktuelle Zeichen der Zelle, indem Sie dieses in einen Integer-Wert umwandeln. Mit der Funktion Mid extrahieren Sie jeweils das nchste Zeichen aus der Zelle. Dabei entsprechen die Werte 65 bis 90 Kleinbuchstaben, die Werte 97 bis 122 den Grobuchstaben sowie die restlichen Werte den Sonderzeichen. Diese Wertbereiche grenzen Sie innerhalb der Select-Case-Anweisung aus. Wird das erste Zeichen in der Zelle gefunden, welches numerisch ist, dann springen Sie mit der Anweisung Exit Function aus der Funktion. In der Variablen steht dann automatisch die richtige Position des Zeichens. Wurde kein numerisches Zeichen gefunden, dann meldet die Funktion den Wert 0 zurck.
Abbildung 9.9: Aus gemischten Zellen die Position der ersten Zahl ermitteln
415
9.2
Nachdem Sie gelernt haben, wie Sie benutzerdefinierte Tabellenfunktionen programmieren knnen, kommen wir nun zu den modularen Funktionen. Unter einer modularen Funktion fassen Sie Arbeitsschritte zusammen, die Sie immer wieder in gleicher oder hnlicher Form in Ihrem Quellcode durchfhren. Anstatt diese Arbeitsschritte in Form von Anweisungen immer wieder neu zu erfassen, schreiben Sie einmal eine Funktion und rufen diese immer wieder an verschiedenen Stellen im Quellcode auf. Dies macht den Quellcode einfacher lesbar und nderungen am Quellcode knnen so auch leichter durchgefhrt werden. Lernen Sie in den folgenden Beispielen, wie Sie diese modularen Funktionen effizient bei Ihrer Arbeit einsetzen knnen.
Arbeitsmappen-Existenz prfen
Bevor Sie eine bestimmte Arbeitmappe ber ein Makro ffnen, sollten Sie sicherstellen, ob diese Arbeitsmappe berhaupt existiert. Damit vermeiden Sie hssliche Makroabstrze, weil Sie dadurch die Mglichkeit haben, diesen Fehlerfall abzufangen. Erfassen Sie jetzt eine Funktion und bergeben dieser Funktion den Dateinamen mitsamt der Laufwerks- und Pfadangabe. Als Ergebnis dieser Funktion sollten Sie dann eine Rckmeldung bekommen, ob die angegebene Datei auch vorhanden ist.
Listing 9.10: Prfung auf Dateiexistenz Function DateiExist(s As String) As Boolean DateiExist = False If Len(s) > 0 Then DateiExist = _ (Dir(s) <> "") Exit Function End Function
Wie schon erwhnt, erwartet die Funktion den Namen der Datei, deren Existenz sie prfen soll. Die Prfung, ob berhaupt eine Zeichenfolge an die Funktion bergeben wurde, erfolgt ber die Funktion Len. Wird eine Lnge von 0 gemeldet, wurde keine Zeichenfolge an die Funktion bergeben. Ansonsten entspricht diese in jedem Fall einer Gre > 0. Die Funktion Dir versucht nun auf die Datei zuzugreifen. Ist die Datei nicht vorhanden, meldet die Funktion eine Leerfolge zurck.
416
Damit wird der Datentyp Boolean mit dem Wert False an das aufrufende Makro zurckgemeldet. Im anderen Falle liefert die Funktion den Wert True zurck. Erfassen Sie jetzt das Makro, welches die Funktion DateiExist aufruft und den Namen der zu berprfenden Datei bergibt.
Listing 9.11: Vor dem ffnen einer Datei deren Existenz prfen Sub Dateiffnen() Dim b As Boolean Const EDatei = "C:\Eigene Dateien\Mappe1.xls" b = DateiExist(EDatei) If b = True Then Workbooks.Open Edatei Else MsgBox "Die Datei " & EDatei & " ist nicht vorhanden!" End If End Sub
Im Makro aus Listing 9.11 wird der Name der zu ffnenden Datei in einer Konstanten zu Beginn des Makros festgelegt. Danach rufen Sie die Funktion Datei Exist auf und bergeben dieser Funktion den Namen der zu prfenden Datei, den Sie gerade in der Konstante angegeben haben. Das Ergebnis dieser berprfung durch die Funktion wird in der Variablen b abgelegt. Diese kann entweder False fr den Fall, dass die Datei gar nicht existiert, bzw. True sein, sofern die Prfung erfolgreich verlaufen ist. In diesem Fall ffnen Sie die Datei mithilfe der Methode Open.
Arbeitsmappen-Zustand prfen
Manche Fehler treten auf, wenn versucht wird, ber VBA Arbeitsmappen zu ffnen, die bereits in geffnetem Zustand sind. Gerade wenn Sie in einem greren Projekt Dateien immer wieder ffnen und schlieen, kann es durchaus vorkommen, dass eine Arbeitsmappe bereits geffnet ist. In der nchsten Funktion soll berprft werden, ob eine bestimmte Arbeitsmappe bereits geffnet wurde. Wenn ja, dann muss diese nicht noch einmal geffnet, sondern nur aktiviert werden. Die Funktion zur Lsung dieser Aufgabenstellung knnen Sie in Listing 9.12 sehen.
417
Listing 9.12: Prfung, ob Datei bereits geffnet ist Function DateiGeffnet(ByVal s As String) As Boolean Dim DatSchonGeffnet As Boolean On Error GoTo fehler DatSchonGeffnet = True Windows(s).Activate Exit Function fehler: DatSchonGeffnet = False End Function
Die Funktion aus Listing 9.12 erwartet als Argument den Namen der Datei, deren Status geprft werden soll. Danach wird versucht, die entsprechende Datei zu aktivieren. Schlgt dies fehl, sorgt die On-Error-Anweisung dafr, dass die Funktion nicht mit einer Fehlermeldung abbricht. In diesem Fall wird direkt zum Fehlerabschnitt fehler gesprungen. Dort wird der Variablen DatSchonGeffnet der Wert False zugewiesen. War die Aktion erfolgreich, wird die Funktion ber die Anweisung Exit Function direkt verlassen. Nachdem Sie schon zu Beginn der Funktion der Variablen DatSchonGeffnet den Wert True zugewiesen haben, knnen Sie direkt aus der Funktion springen. Das aufrufende Makro sieht wie folgt aus:
Listing 9.13: Aktivieren oder ffnen der Arbeitsmappe Sub ffnenOderAktivieren() Dim b As Boolean Const EDatei = "C:\Eigene Dateien\Mappe1.xls" b = DateiGeffnet(EDatei) If b = True Then Else Workbooks.Open Edatei End If End Sub
418
alle Inhalte entfernen alle Formatierungen entfernen alle Kommentare entfernen Formeln durch Festwerte ersetzen Hyperlinks lschen
Erfassen Sie jetzt die Funktion, die Sie in Listing 9.14 sehen knnen:
Listing 9.14: Durch unterschiedliche Lschnummern werden Lschaktionen gestartet Function LschenWas(Nr As Integer) Dim zelle As Range Select Case Nr Case 1 Cells.Clear Case 2 Cells.ClearFormats Case 3 Cells.ClearComments Case 4 For Each zelle In ActiveSheet.UsedRange zelle.Value = zelle.Value Next zelle Case 5 For Each zelle In ActiveSheet.UsedRange With zelle If .Hyperlinks.Count > 0 Then .Hyperlinks.Delete With .Font .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With
419
End If End With Next zelle Case Else MsgBox "Diese Nr ist nicht vergeben!" End Select End Function
Wird die Funktion LschenWas mit dem Argument 1 aufgerufen, wenden Sie die Methode Clear an, um alle Zellen der Tabelle zu lschen. Im Auflistungsobjekt Cells sind alle Zellen der Tabelle enthalten. Wird die Funktion LschenWas mit dem Argument 2 aufgerufen, wenden Sie die Methode ClearFormats an, um alle Formatierungen in der Tabelle zu entfernen. Dazu zhlen Formatierungen der Schrift, der Hintergrundfarbe der Ausrichtung der Daten und alle mglichen Rahmen und sonstigen Formatierungsmglichkeiten. Wird die Funktion LschenWas mit dem Argument 3 aufgerufen, wenden Sie die Methode ClearComments an, um alle in der Tabelle befindlichen Kommentare zu entfernen. Wird die Funktion LschenWas mit dem Argument 4 aufgerufen, sollen alle Formeln und Verknpfungen in Festwerte umgewandelt werden. In diesem Fall ist es nicht sinnvoll, alle Zellen der Tabelle ber das Auflistungsobjekt Cells abzuarbeiten. Schrnken Sie die Bearbeitung auf die Zellen ein, die in der Tabelle verwendet werden. Dazu setzen Sie die Eigenschaft UsedRange ein, die Sie auf die aktive Tabelle (ActiveSheet) anwenden. Innerhalb dieses verwendeten Bereiches durchlaufen Sie jede Zelle und ersetzen eventuell vorhandene Formeln bzw. Verknpfungen, indem Sie der jeweiligen Zelle den Wert der Eigenschaft Value zuweisen. Wird die Funktion LschenWas mit dem Argument 5 aufgerufen, sollen alle Hyperlinks in der Tabelle entfernt werden. Die Hyperlinktexte sollen aber erhalten bleiben. Auch fr diesen Zweck brauchen Sie nicht alle Zellen der Tabellen einzeln ber das Auflistungsobjekt Cells anzusprechen. Stattdessen ermitteln Sie ber die Anweisung ActiveSheet.UsedRange den verwendeten Bereich der Tabelle und durchlaufen danach in einer Schleife jede Zelle dieses Bereiches. Innerhalb der Schleife prfen Sie mithilfe der Eigenschaft Count, ob die jeweilige Zelle einen Hyperlink enthlt. Wenn ja, dann meldet diese Eigenschaft den Wert 1 zurck. In diesem Fall wenden Sie die Methode Delete an, um den Hyperlink aus der Zelle zu entfernen. Da aber auch nach
420
dem Entfernen des Hyperlinks die typische Hyperlinkformatierung (blaue Schriftfarbe und Unterstreichung) erhalten bleibt, mssen Sie diese jetzt entfernen. Weisen Sie hierzu der Eigenschaft UnderLine die Konstante xlUnderlineStyleNone zu, um die Unterstreichung zu entfernen. Der Eigenschaft ColorIndex weisen Sie die Konstante xlAutomatic zu, um die Festlegung der Schriftfarbe Excel zu berlassen. Rufen Sie jetzt beispielsweise die Funktion LschenWas auf und bergeben der Funktion die Lsch-Nr 5, um alle Hyperlinks aus der aktiven Tabelle zu entfernen.
Listing 9.15: ber die Lschnummer die Lschaktion festlegen Sub Lschen() Dim s As String Sheets("Tabelle8").Activate s = InputBox _ ("Geben Sie eine Lsch-Nr zwischen 1 und 5 ein!", _ "Lschaktion durchfhren", 1) If s <> "" Then LschenWas (s) Else End If End Sub
ber eine Eingabemaske legen Sie fest, welche Lschaktion durchgefhrt werden soll. Die Funktion Inputbox verwendet in diesem Beispiel drei Argumente. Im ersten Argument geben Sie an, welcher Text in der Eingabemaske angezeigt werden soll. Im zweiten Argument geben Sie den Fenstertitel der Eingabemaske bekannt. Im dritten Argument haben Sie die Mglichkeit, eine Eingabe bereits schon beim Aufruf der Maske vorzunehmen. In diesem Fall wurde die Lsch-Nr. 1, also das Entfernen aller Daten aus einer Tabelle, eingetragen.
421
Abbildung 9.10: In diesem Beispiel werden die Hyperlinks aus der Tabelle entfernt.
9.3
Bei den bisherigen Beispielen sind die Funktionen lediglich in der Arbeitsmappe verfgbar, in der sie in der Entwicklungsumgebung erfasst wurden. Wenn Sie Funktionen fr alle Arbeitsmappen, ob neue oder alte, anwenden mchten, haben Sie zwei Mglichkeiten:
Speichern in der persnlichen Arbeitsmappe Personl.xls oder Erstellung eines Add-Ins und Aktivierung ber den Add-In-Manager
422
4. Klicken Sie jetzt beispielsweise auf die Zelle A1. Der Makrorekorder wird die persnliche Arbeitsmappe nun erstellen und diesen Befehl aufzeichnen. Nun haben Sie die Voraussetzung geschaffen, um Ihre Funktionen in die persnliche Arbeitsmappe zu bertragen. 5. Beenden Sie die Makroaufzeichnung, indem Sie aus dem Men EXTRAS den Befehl MAKRO/AUFZEICHNUNG BEENDEN auswhlen. bertragen Sie nun Ihre Funktionen aus der Arbeitsmappe Funktionen.xls in die persnliche Arbeitsmappe Personl.xls. Dazu ist folgende Vorgehensweise notwendig: 1. ffnen Sie die Arbeitsmappe Funktionen.xls. 2. Wechseln Sie in die Entwicklungsumgebung. 3. Aktivieren Sie das MODUL1. 4. Markieren Sie alle Funktionen mit dem Menbefehl BEARBEITEN/ALLES AUSWHLEN. 5. Drcken Sie die Tastenkombination (Strg) + (C), um die Funktionen in die Zwischenablage zu kopieren. 6. Whlen Sie im Projekt-Explorer den Eintrag VBAPROJECT (PERSONL.XLS) aus. 7. Aktivieren Sie in diesem Projekt das MODUL1. 8. Fgen Sie Ihre Funktionen ein, indem Sie den Mauszeiger im Codefenster positionieren und die Tastenkombination (Strg) + (V) drcken. 9. Beenden Sie Excel und besttigen Sie beim Verlassen von Excel die nderungsabfrage mit JA.
423
Nun knnen Sie die benutzerdefinierten Tabellenfunktionen ber den FunktionsAssistenten in Ihre Tabellen einfgen.
424
Geben Sie einige zustzliche Informationen zu dem zuknftigen Add-In an und besttigen Sie Ihre Eingaben mit OK. Befolgen Sie jetzt die nachfolgenden Anweisungen: 1. Whlen Sie aus dem Men DATEI den Befehl SPEICHERN UNTER. 2. Stellen Sie im Kombinationsfeld DATEITYP den Eintrag MICROSOFT EXELADD-IN ein. Nun wird automatisch das Add-In-Verzeichnis von Excel eingestellt. 3. Klicken Sie auf die Schaltflche SPEICHERN. Das Add-In FUNKTIONEN.XLS wurde nun erstellt. Binden Sie das Add-In jetzt ein, indem Sie die nchsten Arbeitsschritte befolgen: 1. Whlen Sie aus dem Men EXTRAS den Befehl ADD-INS.
2. Aktivieren Sie das Add-In NTZLICHE FUNKTIONEN. Diese Information haben Sie vorher bei den Dokumenteigenschaften unter der Rubrik TITEL erfasst. 3. Besttigen Sie Ihre Aktion durch OK.
425
9.4
F
Wie knnen Sie ber eine benutzerdefinierte Tabellenfunktion den Namen des aktuellen Anwenders in einer Zelle ausgeben?
A
Die Eigenschaft UserName gibt den Namen des aktuellen Benutzers zurck. Rufen Sie die Funktion in einer beliebigen Zelle der Tabelle wie folgt auf:
=Anwender() F
Wie knnen Sie ber eine benutzerdefinierte Tabellenfunktion die Anzahl der Ziffern einer Zelle zhlen?
A
Diese Aufgabe lsen Sie, indem Sie die Funktion aus Listing 9.17 anwenden:
Listing 9.17: Die Anzahl der Ziffern einer Zelle zhlen Function AnzZahlen (zelle) As Integer Dim i As Integer Application.Volatile For i = 1 To Len(zelle) If Mid(zelle, i, 1) Like "#" Then AnzZahlen = AnzZahlen + 1 End If Next i End Function
Ermitteln Sie zuerst einmal die Gesamtlnge der Zelle ber die Funktion Len. Danach durchlaufen Sie eine Schleife und arbeiten mithilfe der Funktion Mid ein Zeichen nach dem anderen ab. Setzen Sie den Operator Like mit dem Zusatz # ein, um zu ermitteln, ob es sich bei dem Zeichen um einen Zahlenwert handelt. In diesem Fall meldet Ihnen dieser Opera-
426
Quiz
tor einen Wert zwischen 0 und 9 zurck. Addieren Sie dann den Wert 1 in Ihrer Funktion. Rufen Sie die Funktion in einer beliebigen Zelle der Tabelle wie folgt auf:
=AnzZahlen(A1) F
Wie knnen Sie ber eine Funktion prfen, ob ein Add-In bereits im Add-InManager eingebunden ist?
A
Um diese Aufgabe zu lsen, geben Sie folgende Funktion aus Listing 9.18 ein:
Listing 9.18: Ist das Add-In Ntzliche Funktionen bereits eingebunden? Sub AddInPrfung() Dim b As Boolean b = AddInAktiv("Ntzliche Funktionen") If b = True Then MsgBox "Add-In ist aktiv!" Else MsgBox "Das Add-In ist noch nicht aktiviert!" End If End Sub
Bei der Angabe des Add-Ins verwenden Sie den Namen des Add-Ins, den Sie im Dialogfeld ADD-INS vorfinden.
9.5
F F F F
Quiz
Wie muss die Anweisung lauten, damit eine benutzerdefinierte Funktion auch auf nderungen in der Tabelle reagieren kann? Wie muss die benutzerdefinierte Funktion lauten, wenn alle Zellen addiert werden sollen, die mit der Hintergrundfarbe Rot formatiert sind? ber welche Methode knnen Sie den Inhalt einer Zelle komplett lschen? Wie heit die persnliche Makroarbeitsmappe und wo befindet sich diese?
427
9.6
bung
Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe Funktionen.xls und schreiben eine modulare Funktion, die vor der Aktivierung einer Tabelle berprft, ob diese in der Arbeitsmappe berhaupt vorhanden ist. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.
428
0 1
Am gestrigen Tag haben Sie gelernt, wie Sie Excel durch zustzliche Tabellenfunktionen bereichern knnen. Dazu haben Sie einige benutzerdefinierte Funktionen programmiert und getestet. Des Weiteren haben Sie modulare Funktionen erstellt und durch Makros aufrufen lassen. Die Themen heute:
Arbeiten mit Hyperlinks E-Mails verschicken Kontakte mit Outlook austauschen Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Internet.xls im Verzeichnis Kap10.
430
Erfassen Sie jetzt das folgende Makro, um die Hyperlinks aus der Tabelle zu entfernen:
Listing 10.1: Hyperlinks entfernen Sub HyperlinksEntfernen() Dim zelle As Range Dim Bereich As Range Sheets("Tabelle1").Activate Set Bereich = ActiveSheet.UsedRange For Each zelle In Bereich With zelle If .Hyperlinks.Count > 0 Then .Hyperlinks.Delete With .Font .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With End If
431
Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Range. Danach geben Sie ber die Anweisung Set bekannt, in welchem Bereich der Tabelle die Entfernung von Hyperlinks durchgefhrt werden soll. Mithilfe der Anweisung ActiveSheet.UsedRange bestimmen Sie, dass alle Zellen im verwendeten Bereich der Tabelle verarbeitet werden sollen. In einer anschlieenden Schleife werden genau diese benutzten Zellen abgearbeitet. Innerhalb der Schleife berprfen Sie jede einzelne Zelle. Enthlt eine Zelle einen Hyperlink, dann knnen Sie dies ber die Anweisung Hyperlinks.Count feststellen. Meldet die Eigenschaft Count einen Wert > 0, dann enthlt die Zelle einen Hyperlink. In diesem Fall lschen Sie den Hyperlink mithilfe der Methode Delete. Da die Formatierung der Zellen aber auch noch nach der Entfernung der Hyperlinks beibehalten wird, mssen Sie die Unterstreichung sowie die blaue Schriftfarbe noch entfernen. Dazu greifen Sie auf das Objekt Font zu. Mithilfe der Eigenschaft Underline, welcher Sie die Konstante xlUnderlineStyleNone zuweisen, entfernen Sie die Unterstreichung. ber die Eigenschaft ColorIndex setzen Sie die Farbe der Schriftart auf den normalen Ausgangszustand zurck, indem Sie dieser Eigenschaft die Konstante xlAutomatic zuweisen.
432
Erfassen Sie jetzt das Makro aus Listing 10.2, um aus den Zelleninhalten Hyperlinks herzustellen.
Listing 10.2: Aus Zelleninhalten Hyperlinks herstellen Sub HyperlinksSetzen() Sheets("Tabelle1").Activate Range("A1").Select Do Until ActiveCell.Value = "" If Left(ActiveCell.Value, 7) = "http://" Then ActiveCell.Hyperlinks.Add ActiveCell,_ ActiveCell.Value, , _ "Klicken Sie hier, um die Verbindung herzustellen", _ ActiveCell.Value Else End If ActiveCell.Offset(1, 0).Select Loop End Sub
Aktivieren Sie im ersten Schritt die gewnschte Tabelle, welche die Daten enthlt, die Sie in Hyperlinks verwandeln mchten. Danach setzen Sie den Textcursor auf die Startzelle und setzen eine Schleife auf, die solange durchlaufen wird, bis die erste leere Zelle in Spalte A erreicht wird. Setzen Sie den Textcursor am Ende der Schleife immer um eine Zelle nach unten, indem Sie die Eigenschaft Offset einsetzen und dabei als erstes Argument den Wert 1 (Zeilenverschiebung) einsetzen. Innerhalb der Schleife knnen Sie zur Sicherheit berprfen, ob es sich dabei auch wirklich um eine Internet-kompatible Zelle handelt. Wenn ja, dann ergibt die Prfung der ersten sieben Zeichen der Zelle das Wort http://. In diesem Fall wenden Sie die Methode Add an, um einen Hyperlink einzufgen. Diese Methode in Bezug auf Hyperlinks hat folgende Syntax:
Ausdruck.Add(Anchor, Address, SubAddress, ScreenTip, TextToDisplay)
Im Argument Anchor legen Sie die Verankerung des Hyperlinks fest. Das Argument Address bildet die eigentliche Adresse des Hyperlinks. Beim Argument SubAddress handelt es sich um ein optionales Argument, das die Unteradresse des Hyperlinks festlegt. In diesem Argument knnen Sie beispielsweise
433
zustzlich eine bestimmte Zellenadresse angeben. In diesem Beispiel wird dieses Argument aber nicht bentigt. ber das optionale Argument ScreenTip knnen Sie die QuickInfo bestimmen, die angezeigt werden soll, wenn sich der Mauszeiger auf dem Hyperlink befindet. Im letzten Argument TextToDisplay legen Sie den Text fest, der fr den Hyperlink angezeigt werden soll.
Inhaltsverzeichnis erstellen
In der nchsten Aufgabe geht es darum, in einer Arbeitsmappe mit vielen Tabellenblttern ein Inhaltsverzeichnis auf einer separaten neuen Tabelle zu erstellen. Diese Tabelle enthlt alle Namen der Tabellen, die in dieser Arbeitsmappe vorhanden sind. Anschlieend sollen diese Tabellennamen in Hyperlinks gewandelt werden, damit diese ber einen Mausklick blitzschnell aktiviert werden knnen. Sehen Sie sich dazu das folgende Listing an:
Listing 10.3: Die Tabellennamen verlinken Sub InhaltsverzeichnisErstellen() Dim i As Integer ActiveWorkbook.Sheets.Add Before:=Worksheets(1) ActiveSheet.Name = "Inhalt" Range("A1").Value = "Inhaltsverzeichnis" ActiveCell.Offset(2, 0).Select
434
For i = 2 To ActiveWorkbook.Sheets.Count ActiveCell.Value = i-1 ActiveCell.Offset(0, 1).Value = Sheets(i).Name ActiveCell.Offset(1, 0).Select Next i Range("B3").Activate Do Until ActiveCell.Value = "" ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, _ Address:="", SubAddress:= ActiveCell.Value & "!A1", _ TextToDisplay:=ActiveCell.Value ActiveCell.Offset(1, 0).Select Loop End Sub
Fgen Sie im ersten Schritt mithilfe der Methode Add eine neue, noch leere Tabelle zu Beginn der Arbeitsmappe ein. Danach erfassen Sie in Zelle A1 den Titel der Tabelle (INHALTSVERZEICHNIS) und geben der Tabelle ber die Eigenschaft Name den Namen INHALT. Durchlaufen Sie anschlieend alle Tabellen, mit Ausnahme der ersten Tabelle der Arbeitsmappe, und tragen die Namen der einzelnen Tabellen in Ihre Tabelle INHALT ein. Danach setzen Sie eine erneute Schleife auf, die die einzelnen Tabellennamen in Hyperlinks umwandelt. Dabei setzen Sie die Methode Add ein und knnen in diesem Fall auch mal die Argumentnamen mit angeben. Auch diese Syntax ist in Excel erlaubt. Belassen Sie hierbei das Argument Address leer und setzen im Argument SubAddress sowohl den Namen der Tabelle, den Sie aus der aktuellen Zelle beziehen, als auch die Zellenadresse ein, an die gesprungen werden soll. Verbinden Sie diese beiden Informationen durch die Textfolge & "!.
Abbildung 10.4: Alle Tabellen knnen ber Hyperlinks schnell angesprungen werden.
435
436
E-Mails verschicken
Abbildung 10.5: Die Outlook-Bibliothek einbinden Listing 10.4: Eine E-Mail zusammenstellen Sub MailVersenden() Dim outl As Object Dim Mail As Object Set outl = CreateObject("Outlook.Application") Set Mail = outl.CreateItem(olMailItem) Mail.Subject = "Projekt-Status" Mail.Body = "Sehr geehrter Herr Held" & Chr(13) & _ "anbei erhalten Sie den aktuellen Projektbericht " & _ Chr(13) & " im aktuellen Monat " & Chr(13) & _ Chr(13) & " Mit freundlichen Gren" & Chr(13) & _ " Walter Kuhn " Mail.To = "Held-office@T-online.de" Mail.CC = "Machero@aol.com" Mail.Attachments.Add "C:\Eigene Dateien\Projekt.xls" Mail.Display Set outl = Nothing
437
Die Methode CreateObject setzen Sie ein, um ein Outlook-Objekt anzulegen. Damit knnen Sie auf alle VBA-Objekte, Methoden und Eigenschaften von Outlook zugreifen. Mithilfe der Methode CreateItem erstellen Sie ein neues Outlook-Objekt. Dabei geben Sie ber die Konstante OlMailItem bekannt, dass es sich hierbei um ein E-Mail-Objekt handeln soll. ber die Eigenschaft Subject legen Sie den Titel der E-Mail fest. Dieser Titel wird in der Zeile BETREFF angezeigt. Mithilfe der Eigenschaft Body geben Sie den Text an, der als Nachrichtentext in der E-Mail eingefgt werden soll. Die Eigenschaft To bestimmt, an welche Empfnger die E-Mail versendet werden soll. Sie haben dabei auch die Mglichkeit, mehrere E-Mail-Empfnger hintereinander anzugeben. Wenn Sie mchten, knnen Sie die Eigenschaft CC einsetzen, wenn Ihre E-Mail auch an andere Empfnger als Kopie gesendet werden soll. Ergnzend zu den beiden letztgenannten Eigenschaften knnen Sie die Eigenschaft BCC einsetzen. Diese Eigenschaft kommt dann zum Tragen, wenn Sie einem Anwender eine E-Mail als Kopie zustellen mchten, ohne dass der eigentliche Empfnger der E-Mail davon etwas wei. ber das Objekt Attachments legen Sie den Anhang der E-Mail fest. Dabei wird die Arbeitsmappe Projekt.xls ber die Methode Add eingefgt. Sie sollten darauf achten, dass die angegebene Datei sowie der Pfad auch existieren. Mithilfe der Methode Display zeigen Sie das E-Mail-Fenster auf dem Bildschirm an. Entfernen Sie die vorher definierten Outlook-Objekte wieder aus dem Speicher. Dazu dienen die Anweisungen: Set outl = Nothing bzw. Set Mail = Nothing. Sind Sie sich ganz sicher, dass alle Angaben stimmen, knnen Sie die E-Mail natrlich auch ber einen VBA-Befehl direkt abschicken. Ergnzen Sie Ihr Makro mit dem Befehl Mail.Send.
438
Kontakte austauschen
Abbildung 10.7: Die Adressdaten aus Excel sollen in den Kontaktordner von Outlook.
Transferieren Sie nun diese Excel-Tabelle mithilfe des Makros aus Listing 10.5 in den Kontaktordner von Outlook.
Listing 10.5: Kontaktdaten aus Excel nach Outlook bertragen Sub KontakteAdressenNachOutlook () Dim appOutLook As Outlook.Application Dim conoutlook As Outlook.ContactItem Sheets("Kontaktaustausch").Activate
439
Set appOutLook = CreateObject("Outlook.Application") Range("A2").Select Do Until ActiveCell.Value = "" Set conoutlook = appOutLook.CreateItem(olContactItem) With conoutlook .LastName = ActiveCell.Value .FirstName = ActiveCell.Offset(0, 1).Value .BusinessAddressStreet = _ ActiveCell.Offset(0, 2).Value .BusinessAddressCity = ActiveCell.Offset(0, 4).Value .BusinessAddressPostalCode = _ ActiveCell.Offset(0, 3).Value .BusinessAddressCountry = _ ActiveCell.Offset(0, 5).Value .BusinessAddressState = ActiveCell.Offset(0, 6).Value .Email1Address = ActiveCell.Offset(0, 7).Value .Save End With ActiveCell.Offset(1, 0).Select Loop Set conoutlook = Nothing Set appOutLook = Nothing End Sub
Wenden Sie zu Beginn des Makros die Methode CreateObject an, um ein Outlook-Objekt anzulegen. Damit gewinnen Sie den Zugriff auf alle VBA-Objekte, Methoden und Eigenschaften von Outlook. Mithilfe der Methode CreateItem erstellen Sie ein neues Outlook-Objekt. Da Sie ein Kontakt-Objekt bentigen, bergeben Sie dieser Methode die Konstante olContactItem. Anschlieend fllen Sie den noch leeren Kontakt mit den Daten aus Ihrer ExcelTabelle. Unter anderem verwenden Sie dabei folgende Eigenschaften:
LastName: Mit dieser Eigenschaft knnen Sie den Nachnamen, den Sie aus Ihrer Tabelle aus Spalte A holen, fllen. FirstName: Mit dieser Eigenschaft knnen Sie den Vornamen, den Sie aus Ihrer Tabelle aus Spalte B holen, fllen.
440
Kontakte austauschen
Spalte C (Strae).
Spalte E (Ort).
Spalte F (Bundesland).
Spalte G (Land).
Email1Address: Mit dieser Eigenschaft bergeben Sie den Inhalt der Spalte H
(E-Mail-Adresse). Mithilfe der Methode Save wird der Kontakt endgltig im Kontaktordner angelegt.
Auch der umgekehrte Vorgang, also Kontaktdaten aus Outlook in eine Tabelle zu transferieren, ist von Interesse. Im folgenden Beispiel wird der Inhalt des Kontaktordners in einer neuen Tabelle ausgegeben.
441
= .LastName = _ = _ = _ = _ = _ = .Email1Address
442
Fgen Sie im ersten Schritt ber die Anweisung Sheets.Add eine neue, noch leere Tabelle in Ihre Arbeitsmappe ein. Danach geben Sie dieser Tabelle ber die Eigenschaft Name den Namen KONTAKTDATEN und setzen den Mauszeiger auf die Startzelle. ber die Anweisung olMAPI.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts) gewinnen Sie Zugriff auf den Kontaktordner von Outlook. Setzen Sie nun eine Schleife auf, die alle angelegten Kontakte abarbeitet. bertragen Sie im Anschluss daran die einzelnen Informationen aus dem Kontakt in die dafr vorgesehenen Excel-Zellen. Setzen Sie am Ende des Makros die Methode AutoFit ein, um die Spaltenbreiten automatisch einzustellen, und heben Sie danach die Objektverweise ber die Anweisung Set Objektverweis = Nothing auf, um den reservierten Speicher wieder freizugeben.
Wenn Sie in einer Tabelle E-Mail-Adressen vorliegen haben, dann knnen Sie diese mit dem Makro aus Listing 10.7 in Hyperlinks setzen. Sehen Sie sich aber vorher Abbildung 10.10 an.
Listing 10.7: E-Mail-Adressen in Hyperlinks verwandeln Sub EMailLinksUmsetzen() Sheets("MailAdressen").Activate Range("A1").Select Do Until ActiveCell.Value = "" If InStr(ActiveCell.Value, "@") > 0 Then
443
ActiveCell.Hyperlinks.Add ActiveCell, _ "MailTo: " & ActiveCell.Value End If ActiveCell.Offset(1, 0).Select Loop End Sub
In einer Schleife durchlaufen Sie alle Zellen der Spalte A. Mit der Funktion InStr knnen Sie prfen, ob die Zelle eine E-Mail-Adresse enthlt. Ist dies der Fall, dann kommt das Zeichen @ automatisch darin vor. In diesem Fall fgen Sie ber die Methode Add einen Hyperlink ein. Als Zusatz mssen Sie noch den Text MAILTO ergnzen. Damit wei Excel, dass es sich dabei um eine E-Mail-Adresse handelt. Mit einem Klick auf diese Zelle wird dann das E-Mail-Fenster mit voreingestellter E-Mail-Adresse aufgerufen.
444
Im folgenden Makro wird eine Tabelle nach Hyperlinks durchforstet. berall dort, wo Excel Hyperlinks finden kann, wird in der Nebenzelle ein Eintrag vorgenommen:
Listing 10.8: Alle Hyperlinks werden dokumentiert Sub PrfenZelleAufHyperlink() Sheets("PrfungHyper").Activate Range("A1").Select Do Until ActiveCell.Value = "" If ActiveCell.Hyperlinks.Count > 0 Then ActiveCell.Offset(0, 1).Value = _ "Nebenzelle enthlt Hyperlink!" Else End If ActiveCell.Offset(1, 0).Select Loop End Sub
Indem Sie die Eigenschaft Count abfragen, knnen Sie ermitteln, ob eine Zelle einen Hyperlink enthlt. In diesem Fall meldet diese Eigenschaft einen Wert > 0.
445
Wie knnen Sie alle Hyperlinks einer Tabelle mit einer anderen Schriftfarbe ausstatten?
A
Erfassen Sie zu diesem Zweck das folgende Makro aus Listing 10.9. In diesem Listing werden alle Hyperlinks einer Tabelle mit der Schriftfarbe Rot formatiert:
Listing 10.9: Hyperlinks anders formatieren Sub HyperlinksFrben() Dim Hyper As Hyperlink Sheets("PrfungHyper").Activate For Each Hyper In ActiveSheet.Hyperlinks Hyper.Range.Font.ColorIndex = 3 Next Hyper End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Hyperlink. Danach durchlaufen Sie alle Hyperlinkzellen der aktiven Tabelle und frben diese ber das Font-Objekt und die Eigenschaft ColorIndex ein.
10.5 Quiz
F F F
ber welches Argument der Methode Add knnen Sie bestimmen, welche QuickInfo angezeigt wird, wenn Sie mit der Maus ber eine Hyperlinkzelle streichen? Mit welcher Anweisung knnen Sie ein leeres Outlook-Kontaktobjekt anlegen? Was muss beim Anlegen eines Outlook-Kontaktes aus Excel heraus beachtet werden?
10.6 bung
Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe Internet.xls und wechseln auf die Tabelle BUNG. Schreiben Sie ein Makro, das alle Zellenadressen der dort befindlichen Hyperlinks auf einer separaten Tabelle dokumentiert. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.
446
1 1
Am gestrigen Tag haben Sie gelernt, wie Sie Hyperlinks in Excel setzen, formatieren, dokumentieren und entfernen knnen. Auerdem haben Sie ber Excel-VBA E-Mails mit Dateianhngen verschickt und Kontaktdaten mit Outlook ausgetauscht. Die Themen heute:
Die Voraussetzung fr den Datenaustausch zw. Excel und Access Excel-Daten in eine Access-Datenbank transferieren Access-Daten in Excel-Tabellen berfhren Access-Tabellen manipulieren Zusammenarbeit zwischen Excel und Word vorbereiten Eine Word-Sitzung starten und bernehmen Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfgen Ganze Excel-Tabellen in ein Word-Dokument einfgen Word-Dokumente in einer Excel-Tabelle auflisten Alle Beispiele dieses Tages finden Sie auf der mitgelieferten CD-ROM in den Arbeitsmappen Access.xls und Word.xls sowie in der Datenbankdatei Buchungen.mdb im Verzeichnis Kap11.
448
Aus Aktualittsgrnden werden die folgenden Beispiele mithilfe von ADO programmiert. Bevor Sie mit der Programmierung beginnen, mssen Sie die Voraussetzung dafr schaffen, indem Sie die ADO-Bibliothek in Ihre Excel-Entwicklungsumgebung einbinden. Somit bekommen Sie Zugriff auf alle notwendigen Objekte, Methoden und Eigenschaften, die fr einen reibungslosen Datenaustausch zwischen Excel und Access verantwortlich sind. Ebenso sollten Sie die Access-VBA-Bibliothek einbinden. Damit stehen Ihnen alle Objekte, Methoden und Eigenschaften fr Access-Datenbanken zur Verfgung. Diese knnen dann auch ber die Taste (F1) in der Online-Hilfe nachgeblttert werden. Um diese Bibliotheken einzubinden, verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Whlen Sie aus dem Men EXTRAS den Befehl VERWEISE.
3. Im Listenfeld VERFGBARE VERWEISE aktivieren Sie die Bibliothek MICROSOFT ACTIVEX DATA OBJECTS 2.5 LIBRARY. 4. Im Listenfeld VERFGBARE VERWEISE aktivieren Sie wahlweise, je nach eingesetzter Version, die Bibliothek MICROSOFT ACCESS 8.0 OBJECT LIBRARY (fr Access 97), Bibliothek MICROSOFT ACCESS 9.0 OBJECT LIBRARY (fr Access
449
2000), Bibliothek MICROSOFT ACCESS 10.0 OBJECT LIBRARY (fr Access 2002) bzw. MICROSOFT ACCESS 11.0 OBJECT LIBRARY (fr Access 2003). 5. Besttigen Sie Ihre Einstellung mit OK. Sie haben nun die Mglichkeit, vorab die zur Verfgung stehenden Objekte, Methoden und Eigenschaften in Access-VBA einzusehen. Drcken Sie dazu in der Entwicklungsumgebung die Taste (F2) und stellen Sie im ersten Dropdown den Befehl ACCESS ein.
450
451
7. Geben Sie der Tabelle den Namen VERANSTALTUNG. 8. Beenden Sie nun Microsoft Access. Im zweiten Schritt haben Sie eine Excel-Tabelle nach folgendem Muster vorliegen:
bertragen Sie jetzt diese Veranstaltungsdaten aus der Excel-Tabelle in die Access-Datenbank. Setzen Sie zu diesem Zweck das Makro aus Listing 11.1 ein:
Listing 11.1: Excel-Daten nach Access transferieren Sub DatenbernahmeNachAccess() Dim ADOC As New ADODB.Connection Dim DBS As New ADODB.Recordset ADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0; _ Data Source=C:\Eigene Dateien\Buchungen.mdb;" DBS.Open "Veranstaltung", ADOC, adOpenKeyset, _ adLockOptimistic Sheets("Veranstaltungen").Activate Range("A2").Select On Error GoTo Fehler Do Until ActiveCell.Value = "" DBS.AddNew DBS!Bdatum = ActiveCell.Value DBS!Vdatum = ActiveCell.Offset(0, 1).Value DBS!Veranstaltung = ActiveCell.Offset(0, 2).Value DBS!V_Ort = ActiveCell.Offset(0, 3).Value DBS!Teilnehmer = ActiveCell.Offset(0, 4).Value DBS!Strae = ActiveCell.Offset(0, 5).Value DBS!PLZ = ActiveCell.Offset(0, 6).Value DBS!Ort = ActiveCell.Offset(0, 7).Value
452
DBS!Kosten = ActiveCell.Offset(0, 8).Value If ActiveCell.Offset(0, 9).Value = "Ja" Then DBS!Bezahlt = True Else DBS!Bezahlt = False DBS.Update ActiveCell.Offset(1, 0).Select Loop DBS.Close ADOC.Close Set ADOC = Nothing Set DBS = Nothing Exit Sub Fehler: MsgBox "Es trat ein Fehler auf!" DBS.Close ADOC.Close Set ADOC = Nothing Set DBS = Nothing End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Connection, um spter die Verbindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS bentigen Sie ein RekordSet-Objekt, welches nachher alle Datenstze der Datenquelle aufnehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, bentigen Sie zuerst einmal eine Verbindung zu Ihrem Provider, die Sie mit der Methode Open herstellen. Dieser Provider stellt alle Funktionen zur Verfgung, die notwendig sind, um auf die Access-Datenbank zuzugreifen. ffnen Sie die Access-Datenbank mit Hilfe des Objektes Connection. Zum ffnen einer Access-Datenbank brauchen Sie die Jet-Datenbank-Engine. Geben Sie daher mit der Eigenschaft Provider die Engine MICROSOFT JET 4.0 OLE DB-Provider an. ffnen Sie danach die Datenbank Buchungen.mdb. Definieren Sie darauf ein RecordSet-Objekt, das spter den gesuchten Datensatz enthalten soll. ffnen Sie jetzt ber die Methode Open die Tabelle VERANSTALTUNG. Diese Methode hat folgende Syntax:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
453
Im Argument Source geben Sie den Namen der Tabelle an, die Sie ffnen mchten. Im Argument ActiveConnection verweisen Sie auf das Connection-Objekt ADOC, welches Sie vorher angegeben haben. ber das Argument CursorType bestimmen Sie die Art des Cursors. Unter anderem wird dadurch der Zugriff auf Ihre Daten festgelegt. Dabei stehen Ihnen folgende Konstanten zur Verfgung:
adOpenForwardOnly: (Voreinstellung) ffnet einen Vorwrtscursor. Mit Hilfe dieses Cursors knnen Sie nur nach vorne blttern. adOpenKeyset: ffnet einen Cursor vom Typ Schlsselgruppen. Dieser Cursor
ist vergleichbar mit dem dynamischen Cursor. Jedoch werden bei diesem Cursor nderungen in der Tabelle, die von anderen Anwendern durchgefhrt werden, nicht angezeigt.
AdOpenDynamic: ffnet einen dynamischen Cursor. Damit haben Sie die Mg-
lichkeit, Tabelleneintrge anzuzeigen, zu ndern und zu lschen. Alle nderungen werden regelmig aktualisiert und angezeigt.
adOpenStatic: ffnet einen statischen Cursor. Bei diesem Cursor knnen die
Daten nur angezeigt, jedoch nicht gendert werden. Die Datenansicht ist als Momentaufnahme zu verstehen, der zum Zeitpunkt des ffnens der Tabelle vorgelegen hat. Mit Hilfe des Arguments LockType bestimmen Sie, welches Sperrverfahren der Provider beim ffnen der Tabelle einsetzen soll. Dabei stehen Ihnen folgende Konstanten zur Verfgung:
adLockPessimistic: Bei dieser Einstellung wird der Datensatz vollstndig gesperrt. Dabei wird das erfolgreiche Bearbeiten der Datenstze sichergestellt, indem der Provider Datenstze in der Datenquelle sofort beim Bearbeiten sperrt. adLockOptimistic: Diese Einstellung sorgt dafr, dass die Tabelle teilweise gesperrt wird, d.h. ein Datensatz wird nur sperrt, wenn Sie die Update-Methode aufrufen. adLockBatchOptimistic: Diese Einstellung lsst eine teilweise Stapelaktualisie-
rung zu.
454
Im letzten Argument Options knnen Sie festlegen, wie der Provider die Daten auswerten soll. Dieses Argument wird aber fr unser Beispiel nicht bentigt. Aktivieren Sie danach die Excel-Tabelle, die die zu bertragenden Daten enthlt und setzen den Mauszeiger auf die Startzelle. In einer anschlieenden Schleife werden alle Datenstze der Tabelle verarbeitet. Innerhalb der Schleife setzen Sie die Methode AddNew ein, um zunchst einen leeren Datenbanksatz anzulegen. Diesen fllen Sie im Anschluss mit den Inhalten Ihrer Excel-Tabelle. Vergessen Sie nicht, dieses Befllen des Datenbanksatzes mithilfe der Methode Update zu sichern. Am Ende des Makros schlieen Sie die Datenbank ber die Methode Close und beenden ebenfalls mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
Alle Datenstze sollen transferiert werden. Nur ganz bestimmte Datenstze sollen transferiert werden.
455
Listing 11.2: Daten aus einer Access-Tabelle transferieren Sub Dim Dim Dim DatenbertragenNachExcel() ADOC As New ADODB.Connection DBS As New ADODB.Recordset cmd As ADODB.Command
On Error GoTo Fehlerbehandlung ADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data _ Source=C:\Eigene Dateien\Buchungen.mdb;" DBS.Open "Veranstaltung", ADOC, adOpenKeyset, _ adLockOptimistic Set cmd = New ADODB.Command cmd.CommandText = "SELECT * from Veranstaltung" cmd.ActiveConnection = ADOC Set DBS = cmd.Execute Sheets("Import").Activate Range("A2").Select Do While Not DBS.EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Offset(0, 1).Value = DBS!Vdatum ActiveCell.Offset(0, 2).Value = DBS!Veranstaltung ActiveCell.Offset(0, 3).Value = DBS!V_Ort ActiveCell.Offset(0, 4).Value = DBS!Teilnehmer ActiveCell.Offset(0, 5).Value = DBS!Strae ActiveCell.Offset(0, 6).Value = DBS!PLZ ActiveCell.Offset(0, 7).Value = DBS!Ort ActiveCell.Offset(0, 8).Value = DBS!Kosten If DBS!Bezahlt = True Then ActiveCell.Offset(0, 9).Value = "Ja" Else ActiveCell.Offset(0, 9).Value = "Nein" End If DBS.MoveNext ActiveCell.Offset(1, 0).Select Loop Columns("A:J").AutoFit
456
DBS.Close ADOC.Close Set DBS = Nothing Set ADOC = Nothing Set DBS = Nothing Set cmd = Nothing Exit Sub Fehlerbehandlung: MsgBox "Es ist ein Fehler aufgetreten!" _ & Chr(13) & Err.Description End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Connection, um spter die Verbindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS bentigen Sie ein RekordSet-Objekt, welches nachher alle Datenstze der Datenquelle aufnehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, bentigen Sie zuerst eine Verbindung zu Ihrem Provider, die Sie mit der Methode Open herstellen. Dieser Provider stellt alle Funktionen zur Verfgung, die notwendig sind, um auf die Access-Datenbank zuzugreifen. Basteln Sie sich nun eine kleine SQL-Anweisung mithilfe des Schlsselwortes SELECT, welches Sie auf die Access-Tabelle Veranstaltung ansetzen. Der Stern (*) nach dem SELECT bedeutet, dass alle Datenstze genommen werden sollen. ber die Methode Execute fhren Sie diese SQL-Abfrage aus. Die ermittelten Datenstze stehen nun bereit. Aktivieren Sie das Zeilentabellenblatt in Excel und setzen den Mauszeiger auf die Startzelle. Arbeiten Sie in einer anschlieenden Schleife alle Datenstze der Datenbanktabelle ab. Das Ende der Verarbeitung wird ber die Anweisung EOF (End of File) angezeigt. Innerhalb der Schleife setzen Sie die Methode MoveNext ein, um jeweils zum nchsten Datensatz zu gelangen. Im RekordSet-Objekt DBS steht der komplette Datensatz. Sie haben daher die Mglichkeit, die einzelnen Felder in Ihre Excel-Tabelle zu bertragen. Lassen Sie die Spaltenbreite der Excel-Tabelle automatisch richtig anpassen, indem Sie die Methode AutoFit einsetzen und diese Methode auf die Spalten A-J anwenden. Am Ende des Makros schlieen Sie die Datenbank ber die Methode Close und beenden ebenfalls mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
457
458
If Not .EOF Then Do While Not .EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Value = Format(ActiveCell.Value, _ "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Vdatum ActiveCell.Offset(0, 1) = _ Format(ActiveCell.Offset(0, 1).Value, _ "dd.mm.yyyy") ActiveCell.Offset(0, 2).Value = DBS!Veranstaltung ActiveCell.Offset(0, 3).Value = DBS!V_Ort ActiveCell.Offset(0, 4).Value = DBS!Teilnehmer ActiveCell.Offset(0, 5).Value = DBS!Strae ActiveCell.Offset(0, 6).Value = DBS!PLZ ActiveCell.Offset(0, 7).Value = DBS!Ort ActiveCell.Offset(0, 8).Value = DBS!Kosten .Find Criteria:=s, SkipRecords:=1 ActiveCell.Offset(1, 0).Select Loop Else MsgBox "Datensatz nicht gefunden" End If .Close End With Columns("A:J").AutoFit ADOC.Close Set DBS = Nothing Set ADOC = Nothing End Sub
Stellen Sie wie vorher die Verbindung zum Provider her und ffnen Ihre Datenbank sowie die Access-Tabelle. In der Variablen s basteln Sie sich Ihr Suchkriterium zusammen, nach dem die Access-Tabelle durchsucht werden soll. Setzen Sie jetzt die Methode Find ein. Diese Methode sucht in der Tabelle nach dem Datensatz, der den angegebenen Kriterien entspricht. Ist das Kriterium erfllt, wird der gefundene Datensatz zum aktuellen Datensatz der Tabelle. Andernfalls wird der Zeiger auf das Ende des Tabelle festgelegt. Die Methode Find hat folgende Syntax.
Find (criteria, SkipRows, searchDirection, start)
459
Unter dem Argument criteria mssen Sie angeben, was Sie konkret in der Tabelle suchen mchten. Diese Information haben Sie bereits vorher in der Variablen s gespeichert. Dabei wurde der verwendete Spaltenname, der Vergleichsoperator sowie der Wert in der Variablen s zusammengebastelt. Beim Argument SkipRows knnen Sie den Abstand vom aktuelle Datensatz oder vom Argument start angeben. Das Argument SearchDirection gibt an, wie in der Tabelle gesucht werden soll. Dazu stehen Ihnen folgende Varianten zur Verfgung:
adSearchForward: fhrt die Suche vorwrts durch. Die Suche hrt am Ende der Tabelle auf, sofern kein entsprechender Datensatz gefunden wurde. adSearchBackward: fhrt die Suche rckwrts durch. Die Suche hrt am
Anfang der Tabelle auf, sofern kein entsprechender Datensatz gefunden wurde. Mit Hilfe des Arguments start knnen Sie einen numerischen Wert angeben, der angibt, bei welchem Datensatz die Suche in der Tabelle beginnen soll. In der ersten Verzweigung fragen Sie direkt nach, ob der gesuchte Satz gefunden wurde. Wenn nicht, dann wird die Bedingung EOF (End of file) erreicht. Wurde der gesuchte Datensatz gefunden, dann stehen alle Informationen hierber in der Objektvariablen DBS. bertragen Sie diese Informationen dann in Ihre ExcelTabelle. Um zum nchsten Datensatz zu gelangen, setzen Sie erneut die Methode Find ein. Haben Sie alle Datenstze erfolgreich in die Excel-Tabelle bertragen, dann schlieen Sie die Datenbank ber die Methode Close und beenden ebenfalls mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
Abbildung 11.7: Alle Teilnehmer von Veranstaltungen, die noch nicht bezahlt haben
460
Access-Tabellen manipulieren
Erfassen Sie nun das Makro, welches die Preise der Veranstaltungen um 10% erhht.
Listing 11.4: Die Preise wurden um 10% erhht Sub Dim Dim Dim DatenManipulieren() ADOC As ADODB.Connection DBS As ADODB.Recordset Erhhung As Single Erhhung = 1.1 Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic Do While Not .EOF DBS!Kosten = DBS!Kosten * Erhhung DBS.Update DBS.MoveNext
461
Loop .Close End With ADOC.Close Set DBS = Nothing Set ADOC = Nothing End Sub
Da die Methoden zum ffnen einer Tabelle bereits beschrieben wurden, gehen wir gleich mitten in die Schleife. Die Preiserhhung fhren Sie durch, indem Sie das Feld KOSTEN mit dem Faktor 1,1 multiplizieren. Gleich danach wenden Sie die Methode Update an, um diese nderung wirksam werden zu lassen. Mit Hilfe der Methode MoveNext gehen Sie zum nchsten Datensatz. Diese Vorgehensweise fhren Sie durch bis Sie am letzten Satz der Tabelle angelangt sind. Dann tritt die Schleifenbedingung EOF auf und die Schleife wird verlassen. Vergessen Sie dann nicht, die Tabelle ber die Methode Close zu schlieen und die Objektverweise wieder aufzuheben.
462
Datenstze lschen
Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset DBS.Open _ "Select * FROM Veranstaltung where (V_Ort = 'Stuttgart')", ADOC, adOpenKeyset, adLockOptimistic Do Until DBS.EOF DBS.Delete DBS.MoveNext Loop DBS.Close Set DBS = Nothing Set ADOC = Nothing End Sub
ffnen Sie die Access-Tabelle VERANSTALTUNGEN und geben ber die SQLAnweisung bekannt, welche Datenstze Sie beabsichtigen zu entfernen. Danach durchlaufen Sie in einer Schleife alle gefundenen Datenstze und lschen diese mithilfe der Methode Delete. Nach dem Lschen von Datenstzen aus einer Tabelle mssen Sie darauf achten, dass Sie mit Hilfe der Methode MoveNext jeweils zum nchsten Datensatz springen.
Abbildung 11.10: Alle Veranstaltungen in Stuttgart wurden aus der Datenbank entfernt.
463
3. Whlen Sie aus dem Listenfeld VERFGBARE VERWEISE wahlweise, je nach eingesetzter Word-Version, die Bibliothek MICROSOFT WORD 8.0 OBJECT LIBRARY (Word 97), MICROSOFT WORD 9.0 OBJECT LIBRARY (Word 2000), MICROSOFT WORD 10.0 OBJECT LIBRARY (Word 2002), MICROSOFT WORD 11.0 OBJECT LIBRARY (Word 2003) aus. 4. Besttigen Sie Ihre Einstellung mit OK.
464
Word-Sitzung starten
Sie haben nun die Mglichkeit, vorab die zur Verfgung stehenden Objekte, Methoden und Eigenschaften in Word-VBA einzusehen. Drcken Sie dazu in der Entwicklungsumgebung die Taste (F2) und stellen im ersten Dropdown-Feld den Befehl WORD ein.
465
Listing 11.6: Eine Word-Sitzung starten und ein Dokument ffnen Sub WordSitzungStarten() Dim WordApp As Object Set WordApp = CreateObject("Word.application") With WordApp .Application.Visible = True .Application.Documents.Open _ ("C:\Eigene Dateien\Brief.doc") 'Beliebige Aktionen durchfhren .ActiveDocument.Close SaveChanges:=False .Application.Quit End With Set WordApp = Nothing End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable. Danach wenden Sie die Funktion CreateObject an, um eine Word-Sitzung zu erffnen. Setzen Sie dann die Eigenschaft Visible auf den Wert True, um die neue Word-Sitzung anzuzeigen. ber die Word-VBA-Methode Open ffnen Sie das Dokument Brief.doc. Nun knnen beliebige Aktionen im Dokument durchgefhrt werden (dazu aber spter mehr). ber die Methode Close schlieen Sie das aktive Dokument. Indem Sie das Argument SaveChanges auf den Wert False setzen, sorgen Sie dafr, dass das Dokument direkt geschlossen wird. Eventuelle nderungen werden somit verworfen. Wenden Sie danach die Methode Quit an, um die Word-Sitzung zu beenden.
Abbildung 11.13: Die Sitzung ist gestartet und das Dokument geffnet.
466
Word-Sitzung bernehmen
Sie haben jetzt einen Makrorahmen, der eine Word-Sitzung startet, ein bestimmtes Word-Dokument ffnet, dieses danach wieder schliet und im Anschluss daran die Anwendung beendet.
Erzeugen Sie zuerst zwei Objektvariablen. Die erste Variable wird dabei die Anwendung Word verwalten. Die zweite Variable wird ein neues, noch leeres Word-Dokument verwalten. Zunchst einmal sollten Sie berprfen, ob bereits
467
eine Applikation in Word gestartet ist. Fr diesen Zweck verwenden Sie die Funktion GetObject und bergeben ihr die Textfolge Word.application. Kommt es dabei zu einem Fehler, dann ist die Applikation noch nicht begonnen und muss ber die Funktion CreateObject gestartet werden. ber die Methode Add, die Sie auf die Auflistung Documents anwenden, fgen Sie ein neues Dokument ein.
468
Im Zellen-Dropdown-Feld in Zelle A1 knnen die verfgbaren Namen dynamisch ausgewhlt werden. Daraufhin werden in den Zellen B1 bis E1 die entsprechenden Informationen aus der darunter liegenden Tabelle geholt. Um das ZellenDropdown zu erstellen, gehen Sie wie folgt vor: 1. Setzen Sie den Mauszeiger auf Zelle A1. 2. Whlen Sie aus dem Men DATEN den Befehl GLTIGKEIT.
3. Whlen Sie aus dem Dropdown-Feld ZULASSEN den Befehl LISTE. 4. Geben Sie als Quelle den Zellenbezug an, in dem Ihre Namen in der Tabelle aufgelistet werden. 5. Besttigen Sie Ihre Einstellung mit OK. Was jetzt noch fehlt, sind die Formeln in den Zellen B1 bis E1. Entnehmen Sie diese der folgenden Tabelle:
Zelle B1 C1 Formel/Funktion =SVERWEIS($A$1;$A$5:$E$13;2;FALSCH) =SVERWEIS($A$1;$A$5:$E$13;3;FALSCH)
469
Zelle D1 E1
Immer wenn Sie jetzt einen Namen aus dem Zellen-Dropdown in Zelle A1 auswhlen, sucht Excel die dazugehrigen Adressdaten. Diese sollen jetzt in das Word-Dokument Brief.doc transferiert werden. Das Makro fr diese Aufgabe knnen Sie in Listing 11.8 sehen:
Listing 11.8: Eine Adresse aus Excel in einen Word-Brief kopieren Sub Dim Dim Dim Dim Dim Dim BriefkopfZusammenSetzen() WordApp As Object Vorname As String Nachname As String Strae As String PLZ As String Ort As String
Sheets("Adressen").Activate Nachname = Range("A1").Value Vorname = Range("B1").Value Strae = Range("C1").Value PLZ = Range("D1").Value Ort = Range("E1").Value Set WordApp = CreateObject("Word.application") With WordApp .Application.Visible = True .Application.Documents.Open _ ("C:\Eigene Dateien\Brief.doc") With WordApp.Selection .WholeStory .Delete .TypeText Text:=Vorname & " " & Nachname .TypeParagraph
470
.TypeText Text:=Strae .TypeParagraph .TypeText Text:=PLZ & " " & Ort End With .ActiveDocument.Close savechanges:=True .Application.Quit (True) End With Set WordApp = Nothing End Sub
Aktivieren Sie im ersten Schritt die Tabelle in Excel, welche Ihre Adressen enthlt. Fllen Sie dann die Variablen, indem Sie die Werte der Zellen A1:E1 bertragen. Danach erffnen Sie mithilfe der Methode CreateObject eine neue Word-Sitzung und lassen diese anzeigen, indem Sie die Eigenschaft Visible auf den Wert True setzen. ffnen Sie danach ber die Methode Open das Dokument Brief.doc. Momentan steht der Textcursor im Dokument ganz links oben. Dies ist fr uns die richtige Position, um nun den Inhalt der Variablen dort einzufgen. Mit der Eigenschaft TypeText knnen Sie einen Text in das Dokument einfgen. Dies nutzen Sie fr die Erstellung der berschrift. Mit der Methode TypeParagraph fgen Sie eine leere Zeile im Dokument ein. Bevor Sie aber die neuen Daten einfgen, sollten Sie eventuell bereits eingefgte Adressen im Dokument lschen. Setzen Sie die Methode WholeStory ein, um den Text im Dokument zu markieren, und lschen diesen direkt im Anschluss, indem Sie die Methode Delete einsetzen.
471
Fhren Sie nun den Datentransfer durch, indem Sie das folgende Makro starten:
Listing 11.9: Eine Excel-Tabelle Zelle fr Zelle in ein Word-Dokument bertragen Sub Dim Dim Dim Dim Dim Dim Dim ExcelDatenNachWord() WordApp As Object WordDok As Object Bereich As Variant ExTab As Object i As Integer x As Integer y As Integer
472
Set WordDok = WordApp.Documents.Add With WordApp.Selection .TypeText Text:="Daten aus Excel " .TypeText Text:="vom " & Format(Now(), _ "dd-mmm-yyyy") .TypeParagraph End With Set ExTab = WordDok.Tables.Add _ (WordApp.Selection.Range, _ UBound(Bereich, 1), UBound(Bereich, 2)) With ExTab For x = 1 To UBound(Bereich, 1) For y = 1 To UBound(Bereich, 2) .Cell(x, y).Range.InsertAfter Bereich(x, y) Next y Next x End With Set Set Set End WordApp = Nothing WordDok = Nothing ExTab = Nothing Sub
Nachdem Sie den verwendeten Bereich in Ihrer Excel-Tabelle ber die Anweisung ActiveSheet.UsedRange ermittelt und diesen in einem Datenfeld gespeichert haben, rufen Sie Ihre Textverarbeitung Word auf. Dabei setzen Sie die Funktion CreateObject ein. ber die Eigenschaft Visible teilen Sie mit, dass die Textverarbeitung auch angezeigt werden soll. Dazu setzen Sie diese Eigenschaft auf den Wert True. Erstellen Sie nun mit der Methode Add ein neues Dokument. Mit der Eigenschaft TypeText knnen Sie einen Text in das Dokument einfgen. Dies nutzen Sie fr die Erstellung der berschrift. Mit der Methode TypeParagraph fgen Sie eine leere Zeile im Dokument ein. Setzen Sie die Methode Add ein, um eine noch leere Tabelle in das Dokument einzufgen, und fllen Sie diese Zelle fr Zelle, indem Sie das vorher gefllte Datenfeld schrittweise auslesen und mit der Methode InsertAfter in die Tabelle bertragen.
473
474
Range("A1").Select With Application.FileSearch .NewSearch .LookIn = verz .SearchSubFolders = False .FileType = msoFileTypeWordDocuments .Execute For i = 1 To .FoundFiles.Count ActiveCell.Value = .FoundFiles(i) ActiveCell.Offset(1, 0).Select Next i End With End Sub
Zu Beginn des Makros knnen Sie das zu durchsuchende Verzeichnis in einer Konstanten angeben. Wechseln Sie ber die Anweisung ChDir dann direkt in dieses Verzeichnis. Danach starten Sie die Suche und verwenden dabei das Objekt FileSearch, um die einzelnen Dateien im Verzeichnis zu ermitteln. Auf dieses Objekt knnen Sie einige Eigenschaften setzen: Die Eigenschaft NewSearch setzt alle Suchkriterien auf die Standardeinstellungen zurck. Mithilfe der Eigenschaft LookIn geben Sie bekannt, in welchem Verzeichnis die Suche beginnen soll. Die Eigenschaft SearchSubFolders bestimmt, ob die Suche auch in Unterverzeichnissen fortgesetzt werden soll. In diesem Fall mssen Sie diese Eigenschaft auf den
475
Wert True setzen. Die Eigenschaft FileType gibt den Typ der Datei in einer Konstanten an, nach der gesucht werden soll. Mchten Sie beispielsweise nicht nur Word-Dokumente suchen lassen, sondern alle Dateitypen, dann geben Sie die Konstante msoFileTypeAllFiles an. ber die Eigenschaft FoundFiles knnen Sie den Namen der gefundenen Datei abfragen. Schreiben Sie diesen direkt in Ihre Excel-Tabelle. Wandeln Sie jetzt die ermittelten Dokumentnamen in Hyperlinks um. Setzen Sie dazu das folgende Makro ein:
Listing 11.11: Hyperlinks einfgen Sub HyperlinksEinfgen() Sheets("Doku").Activate Range("A1").Select Do Until ActiveCell.Value = "" ActiveCell.Hyperlinks.Add ActiveCell, ActiveCell.Value ActiveCell.Offset(1, 0).Select Loop End Sub
Wenden Sie in einer Schleife die Methode Add an, um die einzelnen Hyperlinks einzufgen. In Kapitel 10 wurde diese Thematik bereits besprochen, sodass an dieser Stelle nicht nher darauf eingegangen wird.
476
Wie kann ich die fnf billigsten Veranstaltungen einer Access-Tabelle ermitteln und in eine Excel-Tabelle berfhren?
A
Listing 11.12: Die Top-Werte einer Access-Tabelle bertragen Sub Dim Dim Dim Top_DatenstzeAnzeigen() ADOC As New ADODB.Connection DBS As ADODB.Recordset s As String
Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With s = _ "SELECT TOP 5 Kosten, Veranstaltung, V_Ort, Vdatum FROM Veranstaltung ORDER BY Kosten" Set DBS = New ADODB.Recordset On Error GoTo fehler DBS.Open s, ADOC, adOpenKeyset, adLockOptimistic Sheets("TOP").Activate Range("A2").Select Do While Not DBS.EOF ActiveCell.Value = DBS!Vdatum ActiveCell.Value = _ Format(ActiveCell.Value, "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Veranstaltung ActiveCell.Offset(0, 2).Value = DBS!V_Ort ActiveCell.Offset(0, 3).Value = DBS!Kosten DBS.MoveNext ActiveCell.Offset(1, 0).Select Loop DBS.Close
477
ADOC.Close Set DBS = Nothing Set ADOC = Nothing Exit Sub fehler: MsgBox "Es ist ein Fehler aufgetreten!" & _ Chr(13) & Err.Description End Sub
Achten Sie darauf, dass Sie in der SQL-Anweisung SELECT die Felder mit bernehmen, auf die Sie spter auch zugreifen mchten. Die Sortierung der Liste knnen Sie ber das Schlsselwort ORDER bestimmen.
Wenn Sie das folgende Makro aus Listing 11.13 in Ihre Access-Entwicklungsumgebung eingeben und starten, dann erfolgt der Transfer in eine Excel-Datei noch schneller:
Listing 11.13: Der Transfer einer Access-Tabelle nach Excel Sub TabelleNachExcel() DoCmd.OutputTo acOutputTable, _ "Veranstaltung", acFormatXLS, _ "C:\Eigene Dateien\Veranstaltungen.xls", True End Sub
Mit Hilfe der Methode OutputTo knnen Sie die Daten in einem bestimmten Microsoft Access-Datenbankobjekt (einem Datenblatt, einem Formular, einem Bericht, einem Modul oder einer Datenzugriffsseite) in verschiedenen Formaten ausgeben. Dabei lautet die Syntax dieser Methode wie folgt:
OutputTo(ObjectType, ObjectName, OutputFormat, OutputFile, AutoStart, TemplateFile)
478
ber das Argument ObjectType legen Sie die Art des Access-Objektes fest, dessen Daten Sie exportieren mchten. Dabei haben Sie folgende Mglichkeiten.
acOutputForm:
Export der Daten eines Formulars Export einer Function zur Sicherung Export eines kompletten Moduls, inkl. aller Funktionen und
acOutputFunction: acOutputModule:
Makros
acOutputQuery:
Export der Ergebnisse eine Abfrage Export eines Berichts Export einer Serveransicht Export einer gespeicherten Prozedur
acOutputReport:
acOutputServerView:
acOutputStoredProcedure: acOutputTable:
Beim Argument ObjectName geben Sie den Namen des Objektes an, welches Sie exportieren mchten. Das Argument OutPutFormat legt fest, in welchem Datenformat Sie die Daten transferieren mchten. Die bekanntesten Formate heien dabei wie folgt:
acFormatHTML:
acFormatRTF: konvertiert die Daten in das Rich-Textfile-Format. Dieses Format kann beispielsweise sehr gut in Microsoft Word eingelesen werden. acFormatTXT: acFormatXLS:
Mit diesem Format ist das Textformat gemeint. konvertiert die Daten in das Microsoft Excel-Format.
Beim Argument OutputFile geben Sie den Pfad sowie den Dateinamen der Datei an, in welche Sie die Daten transferieren mchten. Dabei muss die Datei noch nicht vorhanden sein. Access legt diese bei Bedarf selber an. Mit Hilfe des Arguments AutoStart haben Sie die Mglichkeit die so erstellte Exportdatei gleich zu ffnen. Verwenden Sie den Wert True, um die entsprechende auf Windows basierende Anwendung sofort zu starten. Setzen Sie das Argument auf den Wert False oder lassen Sie es weg, wenn Sie die Exportdatei nicht ffnen mchten. Das Argument TemplateFile ist dann von Interesse, wenn Sie eine Vorlage beispielsweise fr die HTML-Datei verwenden mchten. In diesem Fall ist dann der komplette Pfad dieser Vorlagendatei anzugeben.
479
Wie kann ich ein Feld einer Access-Tabelle ansprechen, wenn dieses Feld im Namen ein Leerzeichen (z.B: Kosten Kurs) enthlt?
A
Setzen Sie um dieses Feld eckige Klammern. DBS![Kosten Kurs]. Erfassen Sie zu diesem Zweck das folgende Makro:
Listing 11.14: Einen Zellenbereich in ein Word-Dokument kopieren Sub Dim Dim Dim ExcelDatenNachWordKopieren() WordApp As Object WordDok As Object Bereich As Range
Wie knnen Sie einen Teil einer Excel-Tabelle in ein neues Dokument kopieren?
A
Set WordApp = CreateObject("Word.application") WordApp.Visible = True Set WordDok = WordObj.Documents.Add Set Bereich = Sheets("bung").Range("A1:C5") Range(Bereich.Address).Copy WordApp.Selection.Paste Application.CutCopyMode = False Set WordApp = Nothing Set WordDok = Nothing End Sub
Deklarieren Sie zu Beginn einige Objektvariablen. Erffnen Sie mithilfe der Funktion CreateObject eine neue Word-Sitzung. ber die Methode Add legen Sie danach ein neues, noch leeres Dokument an. Definieren Sie in der Objektvariablen Bereich den Bereich auf der Tabelle BUNG, den
480
Sie kopieren mchten. Wenden Sie danach die Methode Copy an, um den angegebenen Bereich zu kopieren. Innerhalb dieser Methode geben Sie die genaue Adresse des Zellenbereichs ber die Eigenschaft Address an. Mithilfe der Methode Paste holen Sie den kopierten Bereich, der sich momentan in der Zwischenablage befindet, direkt in Ihr Word-Dokument. Setzen Sie dann die Eigenschaft CutCopyMode auf den Wert False, um den noch existenten Laufbalken um den kopierten Bereich zu entfernen. Heben Sie am Ende die Objektverweise wieder auf, um den dafr reservierten Speicher wieder freizugeben.
F
Um diese Aufgabe zu lsen, legen Sie ein neues Word-Dokument (Word.doc) im Verzeichnis C:\Eigene Dateien an und fgen in dieses Dokument ein Makro namens WORDMAKRO ein. Starten Sie danach aus Ihrer Excel-Entwicklungsumgebung heraus das Makro aus Listing 11.15:
Listing 11.15: Ein Word-Makro starten Sub WordMakroStarten() Dim WordApp As Object Set WordApp = CreateObject("Word.Application") WordApp.Visible = True WordApp.Application.Documents.Open _ ("C:\Eigene Dateien\Word.doc") WordApp.Run "WordMakro" WordApp.Quit Set WordApp = Nothing End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable und setzen Sie die Funktion CreateObject ein, um eine neue Word-Sitzung zu erffnen. Blenden Sie danach die Word-Sitzung ein, indem Sie der Eigenschaft Visible den Wert True zuzuweisen. ffnen Sie daraufhin das Dokument Word.doc mithilfe der Methode Open. ber die Methode Run starten Sie das Makro WORDMAKRO. Beenden Sie die Word-Sitzung, indem Sie die Methode Quit einsetzen. Heben Sie am Ende den Objektverweis wieder auf, um den dafr reservierten Speicher wieder freizugeben.
481
Wie knnen Sie in eine Excel-Tabelle ein Word-Dokument als Symbol einfgen?
A
Mchten Sie ein Word-Dokument in eine Excel-Tabelle als Symbol einfgen, starten Sie das folgende Makro:
Listing 11.16: Ein Word-Dokument als Symbol einfgen Sub DokumentObjektEinfgen() Sheets("bung").Activate Range("B8").Select ActiveSheet.OLEObjects.Add _ (Filename:="C:\Eigene Dateien\Brief.doc", Link:= _ False, DisplayAsIcon:=True, IconFileName:= _ "C:\PROGRAMME\MICROSOFT OFFICE 97\OFFICE\WINWORD.EXE", _ IconIndex:=0, _ IconLabel:="C:\Eigene Dateien\Brief.doc").Select End Sub
ber die Methode Add erstellen Sie ein OLE-Objekt. Dabei hat diese Methode folgende Syntax:
Ausdruck.Add(ClassType, FileName, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height)
ber das Argument ClassType geben Sie den Namen der Anwendung bekannt, die zum Aktivieren des angegebenen OLE-Objekts verwendet werden soll. Im Argument FileName geben Sie den Dateinamen inklusive dem Dateipfad der Datei an, aus der das Objekt erstellt werden soll. Wenn dieses Argument fehlt, wird der aktuelle Ordner verwendet. Setzen Sie das Argument Link auf den Wert True, um das OLE-Objekt mit der Datei zu verknpfen, aus der es erstellt wurde. Weisen Sie dem Argument hingegen den Wert False zu, um das OLE-Objekt als separate Kopie der Datei anzulegen. Der Standardwert ist False. Mit dem Argument DisplayAsIcon knnen Sie das OLE-Objekt als Symbol anzeigen. Setzen Sie das Argument in diesem Fall auf True, um das Symbol anzuzeigen. Der Standardwert ist False. Unter dem Argument IconFileName mssen Sie die Datei angeben, welche das anzuzeigende Symbol enthlt.
482
Im Argument IconIndex ist die Indexnummer des Symbols innerhalb von IconFileName enthalten. Die Reihenfolge der Symbole in der angegebenen Datei entspricht der Reihenfolge, in der die Symbole im Dialogfeld ANDERES SYMBOL (Men EINFGEN, Dialogfeld OBJEKT) angezeigt werden, wenn das Kontrollkstchen ALS SYMBOL ANZEIGEN aktiviert ist. Im Argument IconLabel geben Sie die Beschriftung an, die unter dem Symbol angezeigt werden soll. In den Argumenten Left, Top, Width und Height knnen Sie die Position bzw. die Gre angeben, in der das OLE-Objekt in die Tabelle eingefgt wird.
483
11.13 Quiz
F F F F F F F F
Warum mssen Sie die ADO-Bibliothek in Ihre Entwicklungsumgebung einbinden? An was muss ich denken, wenn ich ber die Methode AddNew einen neuen Datensatz anlege? Welches Argument muss ich einsetzen, wenn ich eine Access-Tabelle vom Ende bis zum Anfang durchsuchen mchte? Wie heit die Methode, um in einer Access-Tabelle jeweils zum nchsten Datensatz zu springen? Wie heit die Funktion, um eine Applikations-Sitzung festzustellen? Welche Eigenschaft muss man einsetzen, wenn man eine Applikation starten, diese aber nicht am Bildschirm anzeigen mchte? Wie heit die Methode, um in einem Word-Dokument eine Leerzeile einzufgen? Welches Objekt knnen Sie einsetzen, um nach bestimmten Dateitypen auf Ihrem PC zu suchen?
11.14 bung
1. Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe ACCESS.XLS und wechseln Sie auf die Tabelle BUNG. Schreiben Sie ein Makro, dass alle Datenstze aus der Access-Tabelle VERANSTALTUNG in die Excel-Tabelle bertrgt, die einen Veranstaltungsbeginn nach dem 04.10.2002 haben. 2. ffnen Sie die Demo-Arbeitsmappe Word.xls und wechseln auf die Tabelle BUNG. Schreiben Sie ein Makro, welches den Zellenbereich A1:C5 in ein neues Dokument kopiert. Dabei sollen die beiden Dateien ber die Verknpfungseigenschaft miteinander verbunden bleiben. Die Lsung dieser Aufgaben knnen Sie im Anhang A nachlesen.
484
2 1
Am gestrigen Tag haben Sie gelernt, wie Sie innerhalb von Microsoft Office arbeiten knnen. Unter anderem haben Sie eine Word-Sitzung von Excel aus gestartet bzw. bernommen. Des Weiteren haben Sie auf Access-Datentabellen zugegriffen und Daten in Excel-Tabellen importiert bzw. exportiert. Die Themen heute:
Leistenart identifizieren Menleisten programmieren Symbolleisten programmieren Kontextmens programmieren Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Leisten.xls im Verzeichnis Kap12.
486
For i = 1 To CommandBars.Count Select Case CommandBars(i).Type Case 0 s = "Symbolleiste" Case 1 s = "Menleiste" Case 2 s = "Kontextmen" Case Else s = "nicht ermittelbar" End Select ActiveCell.Value = i ActiveCell.Offset(0, 1).Value = CommandBars(i).Name ActiveCell.Offset(0, 2).Value = s ActiveCell.Offset(1, 0).Select Next i Columns("A:C").AutoFit End Sub
Ermitteln Sie im Makro aus Listing 12.1 im ersten Schritt alle vorhandenen Leisten von Excel, indem Sie diese mithilfe der Methode Count zhlen. ber die Eigenschaft Type geben Sie die Art der Befehlsleiste zurck. Entnehmen Sie die mglichen Konstanten bzw. Indexwerte der nchsten Tabelle:
Index
0 1 2
Konstante
msoBarTypeNormal msoBarTypeMenuBar msoBarTypePopup
ber die Eigenschaft Name knnen Sie den Namen der Befehlsleiste ermitteln. Verteilen Sie diese Informationen in die Spalten AC. Mithilfe der Methode AutoFit knnen Sie dafr sorgen, dass die Spaltenbreiten automatisch eingestellt werden.
487
Wie Sie sehen, hat die Arbeitsblatt-Menleiste beispielsweise den Index 1, d.h., ber diesen Index knnen Sie diese Menleiste ansprechen, wie es im nchsten Abschnitt durchgefhrt wird.
488
Menleisten programmieren
Die Arbeitsblatt-Menleiste wird durch das CommandBars-Objekt mit dem Index 1 eindeutig identifiziert. Setzen Sie die Eigenschaft Enabled dieser Menleiste auf den Wert False, um diese auszublenden. Um die Arbeitsblatt-Menleiste wieder einzublenden, setzen Sie die Eigenschaft Enabled dieser Menleiste auf den Wert True.
brigens knnen Sie die Arbeitsblatt-Menleiste auch ber ihren Namen ansprechen. Die Namen der einzelnen Leisten knnen Sie in Abbildung 12.1 nachsehen. Im folgenden Makro wird die Arbeitsblatt-Menleiste ber ihren Namen ausgeblendet:
489
Listing 12.3: Die Arbeitsblatt-Menleiste ber den Namen ansprechen Sub ArbeitsblattMenleisteAusblendenVar02() Application.CommandBars("Worksheet Menu Bar").Enabled _ = False End Sub
i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ Before:=i_Hilfe, Temporary:=True) MenNeu.Caption = "TO&OLS" End Sub
Deklarieren Sie eine Objektvariable vom Typ CommandBarControl, um den neuen Menpunkt spter einzufgen. Mithilfe der Methode Count zhlen Sie die Anzahl der Mens in der Arbeitsblatt-Menleiste. Ermitteln Sie danach die Position des Hilfe-Mens, welches standardmig ganz rechts in der Arbeitsblatt-Menleiste steht. Die Arbeitsblatt-Menleiste knnen Sie direkt ber das Objekt CommandBars(1) ansprechen. Mithilfe der Eigenschaft Controls knnen Sie alle Steuerelemente der Arbeitsblatt-Menleiste abfragen. Wenden Sie die Methode Add an, um ein neues Men vor dem Hilfemen einzufgen. Die Methode Add hat die Syntax:
Add(Type, Id, Before, Temporary)
490
Menleisten programmieren
Das Argument Type legt die Art des Steuerelements ber eine Konstante fest, die Sie in Tabelle 12.2 sehen knnen.
Konstante
msoControlButton msoControlEdit msoControlDropdown msoControlComboBox msoControlPopup
Beschreibung ber diese Konstante wird eine Schaltflche eingefgt. ber diese Konstante wird ein Eingabefeld eingefgt. Mithilfe dieser Konstante wird ein Dropdown-Feld eingefgt. ber diese Konstante wird ein Combobox-Feld eingefgt. Mithilfe dieser Konstanten wird ein Dropdown-Men eingefgt.
ber das Argument ID haben Sie die Mglichkeit, neben dem Mentext auch noch ein Symbol anzuzeigen. Jede ID in Excel ist mit einem ganz bestimmten Symbol vorbelegt, dazu aber spter mehr. Mithilfe des Arguments Before geben Sie die genaue Position des Mens an. Diesem Argument bergeben Sie die vorher ermittelte Position des Hilfe-Mens. ber das Argument Temporary knnen Sie bestimmen, ob das Steuerelement temporr angelegt werden soll. Wenn Sie dieses Argument auf den Wert True setzen, wird das Steuerelement beim Beenden von Excel wieder gelscht.
Das kaufmnnische Und-Zeichen im Makro aus Listing 12.4 wird hier genau vor dem Buchstaben O eingefgt. Dies bedeutet, dass Sie das neue Men auch ber die Tastenkombination (Alt) + (O) aktivieren knnen. Im Men wird der so gekennzeichnete Buchstabe unterstrichen. Achten Sie dabei darauf, dass der ausgewhlte Buchstabe nicht schon in einem anderen Men verwendet wird.
491
Mchten Sie das neu eingefgte Men wieder aus der Arbeitsblatt-Menleiste entfernen, wenden Sie die Methode Delete an. Sehen Sie sich dazu das folgende Makro an:
Listing 12.5: Ein Men lschen Sub MenLschen() On Error Resume Next With Application.CommandBars(1) .Controls("TO&OLS").Delete End With End Sub
Die On-Error-Anweisung wird hier eingesetzt, um einen Makroabsturz zu verhindern, wenn versucht wird, das Men TOOLS zu lschen, dieses jedoch gar nicht mehr existiert.
Menbefehle einfgen
Das gerade neu angelegte Men TOOLS enthlt noch keine Menbefehle. Dies holen Sie jetzt nach, indem Sie das Makro aus Listing 12.4 erweitern. Dabei soll der Menbefehl Formeln> Festwerte eingefgt werden.
Listing 12.6: Einen Menbefehl einfgen Sub Dim Dim Dim Dim MenEinfgenUndFllen() i As Integer i_Hilfe As Integer MenNeu As CommandBarControl MB As CommandBarControl
i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ before:=i_Hilfe, Temporary:=True) MenNeu.Caption = "TO&OLS" Set MB = MenNeu.Controls.Add _ (Type:=msoControlButton)
492
Menleisten programmieren
With MB .Caption = _ "Formeln ---> Fe&stwerte" .Style = msoButtonIconAndCaption .OnAction = "FormelnInFestwerteWandeln" .FaceId = 350 .BeginGroup = True End With End Sub
Um den Menbefehl im Men TOOLS einfgen zu knnen, brauchen Sie eine Objektvariable vom Typ CommandBarControl. Setzen Sie die Methode Add ein, um den neuen Menbefehl dem Men TOOLS hinzuzufgen. Mit der Eigenschaft Caption bestimmen Sie die Beschriftung des Menbefehls. Das kaufmnnische Zeichen & wird hierbei eingesetzt, um den Shortcut fr diesen Befehl zu bestimmen. Bei aufgeklapptem Men TOOLS knnen Sie durch die Eingabe des Shortcut-Buchstabens den Menbefehl aktivieren. Mithilfe der Eigenschaft FaceId knnen Sie dem Menbefehl auch noch ein Symbol hinzufgen. Dabei drfen Sie aber nicht vergessen, dass hierzu die Eigenschaft Styles mit der Konstante msoButtonIconAndCaption angegeben werden muss. Wie aber sollen Sie wissen, welches Symbol hinter welcher FaceId steckt? Diese Frage wird zu einem spteren Zeitpunkt noch ausfhrlich beantwortet. Mchten Sie mehrere Befehle optisch schner darstellen, knnen Sie ber die Eigenschaft BeginGroup einen horizontalen Trennstreifen unter den jeweiligen Menbefehl setzen lassen. Damit knnen Sie Menbefehle, die funktionsgem zusammengehren, von anderen Menbefehlen absondern. ber die Eigenschaft OnAction geben Sie den Namen des Makros an, welches ausgefhrt werden soll, wenn der Anwender den Menbefehl auswhlt. Erfassen Sie nun das Makro, welches die Formeln einer Tabelle in Festwerte wandelt:
493
Listing 12.7: Alle Formelzellen in Festwert-Zellen wandeln Sub FormelnInFestwerteWandeln() Dim zelle As Range For Each zelle In ActiveSheet.UsedRange zelle.Value = zelle.Value Next zelle End Sub
ber die Eigenschaft UsedRange ermitteln Sie den verwendeten Bereich einer Tabelle. Durchlaufen Sie in einer Schleife alle Zellen dieses Bereiches und ersetzen Sie die Formeln, indem Sie die Anweisung zelle.Value = zelle.Value einsetzen.
494
Symbolleisten programmieren
ber die Methode Add fgen Sie eine neue Symbolleiste ein. Setzen Sie die Eigenschaft Visible auf den Wert True, damit die Symbolleiste auf dem Bildschirm angezeigt wird. ber die Eigenschaften Top und Left legen Sie die Einfgeposition (linke obere Ecke) fest.
Um eine Symbolleiste wieder zu entfernen, starten Sie das Makro wie folgt:
Listing 12.9: Eine Symbolleiste lschen Sub SymbolleisteLschen() Dim SB As CommandBar Set SB = CommandBars("FUNKTIONEN") On Error Resume Next SB.Delete End Sub
Definieren Sie im ersten Schritt mithilfe der Anweisung Set, welche Symbolleiste Sie lschen mchten. Zum Lschen einer Symbolleiste wenden Sie die Methode Delete an. Denken Sie daran, die Anweisung On Error Resume Next vor den Lschbefehl zu integrieren. Damit sorgen Sie dafr, dass das Makro nicht abstrzt, wenn versucht wird, die bereits gelschte Symbolleiste erneut zu lschen.
495
Symbole integrieren
Kommen wir nun zur nchsten Aufgabe. Es sollen Symbole in die neu angelegte Symbolleiste integriert werden. Jedes einzelne Symbol in Excel hat eine eindeutige Kennzeichnung. Die FaceIdEigenschaft bestimmt dabei das Aussehen, jedoch nicht die Funktion einer Befehlsleisten-Schaltflche. Um einen berblick ber die Vielfalt der Symbole in Excel zu bekommen, erstellen Sie im nachfolgenden Makro eine neue Symbolleiste mit dem Namen SYMBOLE und fgen die ersten 500 Symbole in diese Symbolleiste ein. Die FaceIDNummer soll dabei als Quickinfo fr jedes einzelne Symbol angezeigt werden.
Listing 12.10: Die Symbole mit der FaceId anzeigen Sub Dim Dim Dim FaceIdsErmitteln() symb As CommandBar Icon As CommandBarControl i As Integer
On Error Resume Next Set symb = Application.CommandBars.Add _ ("Symbole", msoBarFloating) For i = 1 To 500 Set Icon = symb.Controls.Add(msoControlButton) Icon.FaceId = i Icon.TooltipText = i Next i symb.Visible = True End Sub
Mithilfe der Methode Add fgen Sie jeweils ein Symbol in die Symbolleiste SYMBOLE ein. Da es sich um ein Symbol handelt, muss dabei die Konstante msoControlButton mit angegeben werden. Die Eigenschaft FaceId bestimmt das Aussehen des Symbols. ber die Eigenschaft ToolTipText knnen Sie diese FaceId als Quickinfo anzeigen lassen. Mithilfe der Eigenschaft Visible zeigen Sie die Symbolleiste am Bildschirm an. Setzen Sie dazu diese Eigenschaft auf den Wert True. Wenn Sie mit der Maus ber ein Symbol streichen, wird die FaceId des Symbols angezeigt.
496
Symbolleisten programmieren
Mchten Sie nicht das Aussehen, sondern die Funktion eines Symbols ntzen, dann mssen Sie wissen, welche ID zu welchem Symbol gehrt. Im Makro in Listing 12.11 wird die Symbolleiste STANDARD untersucht. Jedes Symbol wird dabei angesteuert und dessen Bezeichnung sowie dessen ID in eine neue Tabelle geschrieben. Das Makro fr diese Aufgabe lautet:
Listing 12.11: Die IDs fr die einzelnen Symbole herausschreiben Sub IDsErmitteln() Dim symb As CommandBar Dim Icon As CommandBarControl Sheets.Add Range("A1").Select On Error Resume Next Set symb = Application.CommandBars("Standard")
497
For Each Icon In symb.Controls ActiveCell.Value = Icon.TooltipText ActiveCell.Offset(0, 1).Value = Icon.ID ActiveCell.Offset(1, 0).Select Next Icon Columns("A:B").AutoFit End Sub
Mithilfe der Eigenschaft ToolTipText knnen Sie den Text ermitteln, der in der QuickInfo des angegebenen Befehlsleisten-Steuerelements angezeigt wird. ber die Eigenschaft ID knnen Sie die integrierte Aktion fr dieses Steuerelement abfragen.
Kommen wir nun auf unsere Symbolleiste FUNKTIONEN zurck, die momentan noch leer ist. Fgen Sie in diese Symbolleiste zwei Symbole ein:
ein benutzerdefiniertes Symbol mit der FaceId 350 und dem Quickinfo-Text
Formeln > Festwerte
das bereits standardmig zur Verfgung stehende Symbol SPEICHERN, welches Sie ber die ID 3 ansprechen knnen
498
Symbolleisten programmieren
Das Makro zum Lsen dieser Aufgabe sieht wie folgt aus:
Listing 12.12: Eine Symbolleiste mit Symbolen bestcken Sub NeueSymbolleisteAnlegenUndFllen() Dim SB As CommandBar Dim icon As CommandBarControl On Error Resume Next Set SB = CommandBars.Add("FUNKTIONEN") With SB .Visible = True .Top = 150 .Left = 80 End With Set icon = SB.Controls.Add(msoControlButton) With icon .FaceId = 350 .TooltipText = "Formeln ---> Festwerte" .OnAction = "FormelnInFestwerteWandeln" End With Set icon = SB.Controls.Add(msoControlButton, ID:=3) With icon .TooltipText = "Mappe speichern" End With End Sub
Der Unterschied beim Einfgen der beiden Symbole besteht darin, dass beim ersten Symbol noch das Makro angegeben werden muss, welches dem Symbol zugewiesen werden soll. Ebenso wird das Aussehen nach eigenem Wunsch ber die Eigenschaft FaceId festgelegt. Beim zweiten Symbol greifen Sie auf ein Standardsymbol zurck, bei dem das Aussehen bereits festgelegt ist. Geben Sie daher schon bei der Anlage ber die Methode Add als Argument die ID an.
499
Zellen-Kontextmen erweitern
Wenn Sie sich das Zellen-Kontextmen einmal ansehen, dann sehen Sie, dass die wichtigsten Befehle fr die Zelle schon darin enthalten sind. Trotzdem knnen Sie weitere Befehle in das Kontextmen einfgen. Im nchsten Beispiel werden Sie dem Zellen-Kontextmen eine neue Funktion hinzufgen. Bei dieser Funktion wird, wie schon bei der Menleiste sowie der Symbolleiste besprochen, die Funktion FormelnInWertwerteWandeln eingefgt.
Listing 12.13: Das Zellenkontextmen erweitern Sub ZellenkontextmenErgnzen() Dim MB As CommandBarControl Set MB = Application.CommandBars("Cell").Controls.Add With MB .Caption = "Formeln --> Festwerte"
500
Kontextmens programmieren
Wenden Sie die Methode Add an, um dem Kontextmen einen weiteren Menbefehl hinzuzufgen. ber die Eigenschaft Caption knnen Sie den Menbefehl beschriften. Die Eigenschaft OnAction sagt aus, welches Makro bei der Auswahl des Kontext-Menbefehls gestartet werden soll. Mithilfe der Eigenschaft FaceId knnen Sie dem Menbefehl ein zustzliches Symbol hinzufgen. ber die Eigenschaft BeginGroup knnen Sie einzelne Menbefehle gruppieren. Indem Sie diese Eigenschaft auf den Wert True setzen, sorgen Sie dafr, dass ein horizontaler Trennstreifen im Kontextmen eingefgt wird.
Kontextmenbefehle entfernen
Mithilfe der Methode Delete knnen Sie einzelne Menbefehle aus dem Kontextmen wieder lschen. Entfernen Sie nun den Kontextmenbefehl Fomeln > Festwerte, den Sie vorher dem Kontextmen hinzugefgt haben. Starten Sie zu diesem Zweck das folgende Makro:
501
Listing 12.14: Einen Kontextmenbefehl lschen Sub ZellenkontextmenBefehleLschen() Dim Men As CommandBar Set Men = Application.CommandBars("Cell") On Error Resume Next With Men .Controls("Formeln --> Festwerte").Delete End With End Sub
Geben Sie mithilfe der Anweisung Set bekannt, auf welche Leiste Sie zugreifen mchten. Danach sorgen Sie ber die Anweisung On Error Resume Next dafr, dass es zu keiner Fehlermeldung kommt, wenn versehentlich versucht wird, den Kontextmenbefehl zweimal hintereinander zu lschen. Wenden Sie die Methode Delete an, um den Kontextmenbefehl zu lschen. Greifen Sie dabei auf die Eigenschaft Controls zurck und geben Sie die Beschriftung des Befehls an.
Im folgenden Makro aus Listing 12.15 wird das Men TOOLS deaktiviert:
Listing 12.15: Ein Men deaktivieren Sub KomplettesMenDeaktivieren() On Error Resume Next Application.CommandBars(1).Controls("TO&OLS").Enabled _ = False End Sub
Mithilfe der Anweisung CommandBars(1) haben Sie Zugriff auf die Arbeitsblatt-Menleiste. ber die Eigenschaft Controls geben Sie an, welches Men Sie dort genau deaktivieren mchten. Setzen Sie die Eigenschaft Enabled fr dieses Men auf den Wert False, um es zu deaktivieren. Setzen Sie die Eigenschaft Enabled fr dieses Men auf den Wert True, um es wieder zu aktivieren.
502
Sie knnen Symbolleisten jeder Zeit anpassen, d.h. Sie knnen neue Symbole in die Symbolleiste aufnehmen oder Symbole aus den Leisten herausnehmen. Weiter knnen Sie die Position von Symbolleisten auf dem Bildschirm frei bestimmen. Mchten Sie all dies verhindern, so haben Sie die Mglichkeit, Ihre Symbolleisten zu schtzen. Im nchsten Makro in Listing 12.16 wird die Symbolleiste STANDARD geschtzt:
Listing 12.16: Die Symbolleiste Standard schtzen Sub SymbolleisteSchtzen() With Application.CommandBars("Standard") .Protection = _ msoBarNoChangeVisible + msoBarNoCustomize .Visible = True End With End Sub
ber die Eigenschaft Protection knnen Sie Ihre Symbolleisten schtzen. Die Konstante msoBarNoChangeVisible sorgt dafr, dass die Symbolleiste nicht im Kontextmen erscheint, wenn Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken. ber die Konstante msoBarNoCustomize knnen Sie ein Anpassen der Symbolleiste verhindern. Es knnen danach keine neuen Symbole hinzugefgt bzw. Symbole aus der Symbolleiste herausgelscht werden.
F
Wie knnen Sie das Aufklappen des Kontextmens verhindern, wenn Sie mit der rechten Maustaste auf eine Symbolleiste klicken?
A
Das Aufklappen dieses Kontextmens verhindern Sie, indem Sie die Anweisung Application.CommandBars("Toolbar list").Enabled = False einsetzen.
503
Wie knnen Sie das Aufklappen des Kontextmens verhindern, wenn Sie mit der rechten Maustaste auf die Registerkarte (unten) einer Tabelle klicken?
A
Das Aufklappen dieses Kontextmens verhindern Sie, indem Sie die Anweisung Application.CommandBars("Ply").Enabled = False einsetzen.
Wie knnen Sie das Zellen-Kontextmen von Excel auf den ursprnglichen Zustand zurcksetzen?
A
Dazu bedarf es nur eines einzigen Befehls. Dieser Befehl lautet: Application.CommandBars("Cell").Reset.
12.6 Quiz
F F F
Wie lautet die Eigenschaft, die das Aussehen eines Symbols bestimmt? Wie lautet die Eigenschaft, die die Funktion eines Symbols bestimmt? ber welche Eigenschaft wird die Beschriftung eines Menbefehls festgelegt?
12.7 bung
Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe Leisten.xls. Schreiben Sie ein Makro, welches die Menbefehle SPEICHERN und SPEICHERN UNTER im Men DATEI deaktiviert. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.
504
3 1
Am gestrigen Tag haben Sie gelernt, wie Sie Menleisten programmieren knnen. Dabei haben Sie neue Mens und Menbefehle eingefgt und wieder entfernt. Des Weiteren haben Sie Symbolleisten erstellt und Kontextmens programmiert. Die Themen heute:
Was sind UserForms? UserForms entwerfen UserForms programmieren Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe UserForm.xls im Verzeichnis Kap13.
Eingabe von Vokabeln (Deutsch-Englisch) Einordnen der Vokabeln in Kategorien (Sustantiv, Verb oder Adjektiv) Einfgen dieser Vokabeln in die UserForm ber einen Zufallsgenerator Abfrage der eingegebenen bersetzungen und Kontrollanzeige Auf Klick sollen jeweils drei neue Vokabeln in der UserForm angezeigt werden
506
UserForms entwerfen
Standardmig ist die neu eingefgte UserForm recht klein. Diese knnen Sie vergrern, indem Sie mit der linken Maustaste auf die rechte, untere Ecke klicken und die UserForm in der gewnschten Gre nach schrg unten aufziehen. Der Titel fr die UserForm, der in der Titelleiste oberhalb der UserForm steht, wird abgeleitet vom Namen der UserForm. Um einen anderen Titel einzustellen, setzen Sie den Mauszeiger im Eigenschaftenfenster in das Feld CAPTION und schreiben den gewnschten Titel dort hinein. Nachdem Sie die erste UserForm eingefgt haben, wird die Symbolleiste WERKZEUGSAMMLUNG eingeblendet. Diese Werkzeugsammlung nutzen Sie, um den noch leeren Dialog mit Elementen zu fllen. Entnehmen Sie der folgenden Tabelle die wichtigsten Steuerelemente der Symbolleiste WERKZEUGSAMMLUNG.
507
Symbol
Funktionsbeschreibung ber dieses Symbol wird das entsprechende Element in der UserForm markiert. ber dieses Symbol erfassen Sie Texte in UserForm. ber dieses Symbol fgen Sie Eingabefelder ein. ber dieses Symbol wird ein Kombinationsfeld eingefgt. Mit einem Klick auf das Pfeilsymbol werden Ihnen weitere Auswahlmglichkeiten angeboten. In einem Kombinationsfeld kann immer nur ein Eintrag gewhlt werden. ber dieses Symbol wird ein Listenfeld eingefgt. Das Listenfeld bentigt jedoch mehr Platz in Ihrer UserForm, weil mehrere Eintrge gleichzeitig angezeigt werden. Sind mehr Eintrge im Listenfeld vorhanden, als angezeigt werden knnen, dann wird dynamisch eine vertikale Steuerungsleiste eingebunden. ber dieses Symbol wird ein Rahmen in Ihre UserForm eingefgt. Das Rahmen-Steuerelement knnen Sie einsetzen, um einzelne Elemente in einer Gruppe zusammenzufassen. Wichtig bei der Erstellung eines Rahmens ist, dass dieser vor den einzelnen Steuerelementen, die darin platziert werden sollen, eingefgt wird. ber dieses Symbol knnen Sie Kontrollkstchen einfgen. Bei aktiviertem Zustand erscheint im Kstchen ein Hkchen. Wenn Sie Kontrollkstchen in einer Gruppe verwenden, knnen sowohl eines als auch mehrere Kontrollkstchen aktiviert sein. ber dieses Symbol fgen Sie ein Optionsfeld ein. Bei aktiviertem Zustand ist das Optionsfeld mit einem schwarzen Punkt ausgefllt. Wenn Sie mehrere Optionsfelder innerhalb einer Gruppe verwenden, kann immer nur eine Option aktiviert sein. ber dieses Symbol fgen Sie ein Umschaltfeld ein. ber dieses Umschaltfeld knnen Sie beispielsweise zwei Funktionen in nur einem Steuerelement unterbringen (z.B. Gitternetz ein/Gitternetz aus). ber dieses Symbol fgen Sie Befehlsschaltflchen ein, die Sie spter dann mit Makros bestcken.
508
UserForms entwerfen
Symbol
Funktionsbeschreibung ber dieses Symbol fgen Sie ein oder mehrere Register in Ihre UserForm ein. Damit knnen Sie Platz sparend viel Information in einer einzigen UserForm unterbringen. ber dieses Symbol werden Scroll-Elemente eingefgt. Dieses Steuerelement verwenden Sie bei greren UserForms, wenn Sie horizontal oder auch vertikal scrollen mssen, um bestimmte Elemente anzuzeigen. ber dieses Symbol fgen Sie ein Drehfeld ein. ber ein Drehfeld knnen Sie beispielsweise Zahlen schrittweise erhhen. Das Steuerelement wird meist in Verbindung mit einem Textfeld verwendet, in dem dann das Ergebnis des Schrittes angezeigt wird. ber dieses Symbol knnen Sie Grafiken, Logos oder Bilder in Ihre UserForm einfgen. ber dieses Symbol knnen Sie ber ein Eingabefeld einen Bereich markieren bzw. auch eigene Texte eingeben und an die UserForm bergeben.
Weitere Steuerelemente knnen Sie jederzeit einblenden, indem Sie mit der rechten Maustaste auf die Symbolleiste klicken und aus dem Kontextmen den Befehl ZUSTZLICHE STEUERELEMENTE auswhlen. Im Listenfeld VERFGBARE STEUERELEMENTE knnen Sie dann zustzliche Steuerelemente per Mausklick Ihrer Symbolleiste hinzufgen. Ein Steuerelement knnen Sie in Ihre UserForm einfgen, indem Sie das gewnschte Steuerelement mit der linken Maustaste in der Symbolleiste WERKZEUGSAMMLUNG anklicken und in der gewnschten Gre und Position auf Ihrer UserForm aufziehen. Fgen Sie nun fr die Erfassung der Vokabeln einige Steuerelemente ein. Orientieren Sie sich dabei an der folgenden Abbildung 13.2. Fangen Sie beim Einfgen der Steuerelemente immer mit den Gruppenfeldern (= Steuerelement RAHMEN) an. Danach legen Sie weitere Steuerelemente in das Gruppenfeld hinein.
509
510
UserForms entwerfen
Steuerelemente beschriften
Standardmig wird beim Einfgen der Steuerelemente schon eine Beschriftung vorgegeben, die aber noch gendert werden muss. Um ein Steuerelement wie z.B. eine Schaltflche zu beschriften, gehen Sie nach dem Einfgen des Steuerelements wie folgt vor: 1. Markieren Sie das Steuerelement, das Sie beschriften mchten. 2. Setzen Sie im Eigenschaftenfenster den Mauszeiger in das Feld CAPTION. 3. Erfassen Sie die gewnschte Beschriftung und drcken Sie die Taste ().
Aktivierreihenfolge festlegen
Standardmig werden die einzelnen Steuerelemente nach der Reihenfolge aktiviert, in der Sie in die UserForm eingefgt wurden, d.h. Sie springen ber die Taste () von einem Feld zum anderen. Gerade wenn Sie zu einem spteren
511
Zeitpunkt neue Steuerelemente hinzufgen, sollten Sie die Reihenfolge anpassen. Dazu whlen Sie den Menbefehl ANSICHT/AKTIVIERREIHENFOLGE. Ist dieser Menbefehl bei Ihnen deaktiviert, dann markieren Sie vorher eines der Textfelder oder Schaltflchen auf der UserForm.
Markieren Sie das entsprechende Element im Listenfeld AKTIVIERREIHENFOLGE und klicken Sie auf die Schaltflche NACH OBEN bzw. NACH UNTEN.
UserForm aufrufen
Um die UserForm einmal zu testen, markieren Sie diese und drcken die Taste (F5). Selbstverstndlich werden Sie die UserForm in Zukunft ber ein Makro starten. Legen Sie das Makro aus Listing 13.1 in einem neuen Modul MODUL1 an.
512
UserForms programmieren
Abbildung 13.4: Der erste Aufruf der UserForm Listing 13.1: Eine UserForm aufrufen Sub UserFormAnzeigen() UserForm1.Show End Sub
Die Methode Show aktiviert die UserForm mit dem Namen USERFORM1. Seit Excel 2000 ist es mglich, Dialoge auch ungebunden aufzurufen; d.h., ungebundene Dialoge mssen nicht beendet werden, um mit anderen Arbeiten in Excel fortzufahren, whrend die UserForm geffnet bleibt. Um eine ungebundene UserForm aufzurufen, setzen Sie die Anweisung UserForm1.Show vbModeless ein.
UserForm beenden
Mit einem Klick auf die Schaltflche ABBRECHEN in der USERFORM1 soll die Userform beendet werden. Zu diesem Zweck mssen Sie den entsprechenden Befehl hinter diese Schaltflche legen. Verfahren Sie hierfr wie folgt: 1. Fhren Sie in Ihrer UserForm einen Doppelklick auf die Schaltflche ABBRECHEN durch. 2. Ergnzen Sie den dadurch erzeugten Programm-Rahmen wie folgt:
513
Listing 13.2: Eine Userform beenden Private Sub CommandButton1_Click() UserForm1.Hide End Sub
Die Methode Hide blendet die UserForm aus. Damit steht die UserForm aber noch im Speicher fr weitere Aktionen bereit. Mchten Sie die UserForm richtig aus dem Speicher laden, verwenden Sie die Anweisung unload me.
Sie knnen das Makro, um die USERFORM1 aufzurufen, direkt ber eine Schaltflche Ihrer Tabelle VOKABELN starten. Blenden Sie zu diesem Zweck die Symbolleiste FORMULAR ein, klicken auf das Symbol SCHALTFLCHE und ziehen es in der gewnschten Gre und Position in Ihrer Tabelle auf. Danach wird automatisch das Dialogfeld MAKRO ZUWEISEN eingeblendet, in dem Sie das Makro USERFORMANZEIGEN aus dem Listenfeld auswhlen und mit OK besttigen. Nachdem Sie die Tabelle VOKABELN angelegt haben, wechseln Sie in die Entwicklungsumgebung von Excel und klicken auf Ihrer USERFORM1 die Schaltflche OK/ERFASSEN doppelt an. Ergnzen Sie dann das eingestellte Klick-Ereignis wie folgt:
514
UserForms programmieren
Listing 13.3: Die eingegebenen Vokabeln speichern Private Sub CommandButton2_Click() 'Vokabeln speichern Dim frm As UserForm Set frm = UserForm1 Sheets("Vokabeln").Activate Range("A65536").End(xlUp).Offset(1, 0).Select With frm ActiveCell.Value = .TextBox1.Value ActiveCell.Offset(0, 1).Value = .TextBox2.Value If .OptionButton1.Value = True Then ActiveCell.Offset(0, 2).Value = "Substantiv" Else If .OptionButton2.Value = True Then ActiveCell.Offset(0, 2).Value = "Verb" Else ActiveCell.Offset(0, 2).Value = "Adjektiv" End If End If .TextBox1.Value = "" .TextBox2.Value = "" .OptionButton1 = False .OptionButton2 = False .OptionButton3 = False End With End Sub
Bei dem Makro CommandButton2_Click handelt es sich um ein Ereignis, d.h., immer wenn die Schaltflche OK/ERFASSEN geklickt wird, luft obiges Makro ab. Als Erstes wird der Begriff USERFORM1, der ja nicht gerade kurz ist, durch ein Krzel ersetzt. Knftig knnen alle Elemente auf der UserForm krzer und damit auch schneller angesprochen werden. Jetzt wird das Tabellenblatt VOKABELN aktiviert. Mit der Eigenschaft End wird die Position ermittelt, welche die Zelle am Ende der Region darstellt, die den Quellbereich enthlt. Diese Vorgehensweise entspricht dem Drcken der Tastenkombination (Strg) + () auf dem Tabellenblatt. Die Zahl 65.536 steht fr die
515
maximale Anzahl Zeilen pro Excel-Tabellenblatt. Innerhalb dieses Bereiches wird nach der zuletzt verwendeten Zelle gesucht und der Zellenzeiger um eine Zeile nach unten (nchste freie Zelle) versetzt. Ist das Krzel frm einmal mit der Anweisung With angegeben, kann es weggelassen werden. In der Eigenschaft Value der Textfelder steht jeweils der vorgenommene Eintrag. Dieser Eintrag wird in die Tabelle bertragen. Dabei wird der Inhalt des ersten Textfeldes in die aktive Zelle bertragen, der Inhalt des zweiten Textfeldes wird eine Zelle weiter nach rechts verschoben eingefgt. Um festzuhalten, um welche Wortart es sich bei dem eingegebenen Wort handelt, verwenden Sie Optionsschaltflchen. Dabei kann jeweils nur eine Option mglich sein. Die Abfrage, welche Optionsschaltflche aktiviert ist, bekommen Sie ber eine If-Then-Else-Anweisung. Fragen Sie dazu die Value-Eigenschaft der ersten Optionsschaltflche ab. Liefert diese den Wert True, ist die Optionsschaltflche aktiviert. In diesem Fall schreiben Sie den Text SUBSTANTIV in die Spalte C, im anderen Fall schreiben Sie je nachdem den Text VERB bzw. ADJEKTIV in die Tabelle. Nach dem Speichern der Vokabel sollten Sie die Texteingabefelder lschen und die angeklickte Option im Gruppenfeld WORTART herausnehmen. Weisen Sie daher der Eigenschaft Value einen leeren Wert zu (Eingabefelder) bzw. den Wert False (Optionsfelder) (siehe Abbildung 13.6).
Vokabeln einfgen
Die Vokabeln sollen nach dem Zufallsprinzip abgefragt werden. Dabei sollen jeweils drei Vokabeln in einem Arbeitsgang abgefragt werden. Entwerfen Sie fr diesen Zweck die USERFORM2 in Abbildung 13.7. Direkt nach dem Aufruf der USERFORM2 sollen die Eingabefelder in der ersten Spalte mit drei zufllig ausgewhlten Vokabeln gefllt werden. Fr diesen Zweck knnen Sie das Ereignis UserForm_Initialize einsetzen, welches automatisch ausgefhrt wird, wenn Sie die UserForm aufrufen. Klicken Sie dazu auf eine freie Stelle Ihrer USERFORM2 und erfassen das folgende Ereignismakro in Listing 13.4 auf S. 518.
516
UserForms programmieren
Abbildung 13.6: Die ersten Eingaben in die Tabelle Vokabeln ber die UserForm eingeben
517
Listing 13.4: Die Vokabeln nach dem Zufallsprinzip einfgen Option Explicit Dim Trans1 As String Dim Trans2 As String Dim Trans3 As String Private Sub UserForm_Initialize() Dim l As Long Dim AnzVok As Long Dim frm As UserForm Dim Vok1 As String Dim Vok2 As String Dim Vok3 As String AnzVok = _ ThisWorkbook.Sheets("Vokabeln").UsedRange.Rows.Count Set frm = UserForm2 'Textfeld 1 l = Int((AnzVok * Rnd) + 2) Vok1 = Cells(l, 1).Value Trans1 = Cells(l, 2).Value 'Textfeld 3 l = Int((AnzVok * Rnd) + 2) Vok2 = Cells(l, 1).Value Trans2 = Cells(l, 2).Value 'Textfeld 5 l = Int((AnzVok * Rnd) + 2) Vok3 = Cells(l, 1).Value Trans3 = Cells(l, 2).Value With frm .TextBox1.Value = .TextBox1.Enabled .TextBox3.Value = .TextBox3.Enabled .TextBox5.Value = .TextBox5.Enabled End With End Sub
518
UserForms programmieren
Deklarieren Sie zuerst einmal die Variablen, um die Vokabeln und deren bersetzung speichern zu knnen. Dabei werden die Variablen Trans1 bis Trans3 auerhalb des Ereignisses zu Beginn des Codeblattes deklariert. Diese Variablen bentigen Sie spter noch fr die Prfung Ihrer eingegebenen bersetzungen. Ermitteln Sie im nchsten Schritt die Anzahl der bereits erfassten Vokabeln. Setzen Sie dazu die Eigenschaft UsedRange ein, die Sie auf die Zeilen (= Rows) der Tabelle VOKABELN anwenden. Diese Information bentigen Sie, um anschlieend ber die Anweisung l = Int((AnzVok * Rnd) + 2) eine zufllige Vokabel aus der Tabelle VOKABELN auszuwhlen. ber die Funktion Rnd erzeugen Sie diese Zufallszahl, die der Zeilennummer entspricht. Diese Zufallszahl liegt im Bereich 2 (ab Zeile 2) und der ermittelten grten Zeile, die vorher in der Variablen AnzVok gespeichert wurde. ber die Funktion Int wird diese Zufallszahl als Ganzzahl ausgegeben. Fllen Sie im Anschluss daran die Variablen Vok1 bis Vok3 und Trans1 bis Trans3 mit den ermittelten Vokabeln und deren bersetzung. Setzen Sie fr diese Aufgabe die Eigenschaft Cells ein. Im ersten Argument dieser Eigenschaft geben Sie die Zeile an, aus der die Vokabel bzw. die bersetzung derselben entnommen werden soll. Im zweiten Argument geben Sie die Spalte an. Im Falle der Vokabelfelder ist das die Spalte A, welche Sie ber den Index 1 ansprechen knnen. Im anderen Fall, wenn es sich um die bersetzten Vokabeln handelt, finden Sie diese Informationen in Spalte B der Tabelle VOKABELN. Setzen Sie dafr den Index 2 im zweiten Argument der Eigenschaft Cells ein. Weisen Sie danach den Eingabefeldern die Vokabeln zu und setzen die Eigenschaft Enabled auf den Wert False. Damit knnen diese Felder nicht mehr editiert werden.
Vokabeln prfen
In der nchsten Funktion sollen die Eingaben, die Sie in den Eingabefeldern der zweiten Spalte in der USERFORM2 vorgenommen haben, geprft werden. Haben Sie dabei die abgefragte Vokabel richtig bersetzt, dann wird das jeweilige Kontrollkstchen ganz rechts in der UserForm aktiviert. Um den dafr verantwortlichen Code zu erfassen, fhren Sie in der Entwicklungsumgebung einen Doppelklick auf die Schaltfche PRFEN durch.
519
Abbildung 13.8: Die Vokabeln ber das Zufallsprinzip anzeigen Listing 13.5: Die eingegebenen Vokabeln berprfen Private Sub CommandButton2_Click() 'Prfen der eingegebenen Vokabeln Dim frm As UserForm Dim Cb As Object Set frm = UserForm2 For Each Cb In frm.Controls If TypeName(Cb) = "CheckBox" Then Cb.Value = False Next Cb With frm If .TextBox2.Value = Trans1 _ Then .CheckBox1.Value = True Else .CheckBox2.Value = True End if If .TextBox4.Value = Trans2 _ Then .CheckBox3.Value = True _ Else .CheckBox4.Value = True End if If .TextBox6.Value = Trans3 _ Then .CheckBox5.Value = True _ Else .CheckBox6.Value = True End if
520
UserForms programmieren
Geben Sie ber die Anweisung Set an, welche UserForm Sie programmieren mchten. Sicherheitshalber sollten Sie zu Beginn des Makros alle Kreuze aus den Kontrollkstchen entfernen. Dazu durchlaufen Sie in einer Schleife alle Steuerelemente, die in der UserForm vorhanden sind. ber die Funktion TypeName knnen Sie die Kontrollkstchen in der Userform identifizieren. Diese Steuerelemente melden der Funktion TypeName den Text CheckBox. Achten Sie bei dieser Angabe auf die korrekte Schreibweise. Die Funktion TypeName unterscheidet zwischen Gro- und Kleinschreibung. berprfen Sie danach, ob die eingegebenen bersetzungen der Vokabeln, die Sie direkt aus den Eingabefeldern Textbox2, TextBox4 und Textbox6 bernehmen knnen, mit den vorher bereits ermittelten Inhalten der Variablen Trans1 bis Trans3 bereinstimmen. Um das entsprechende Kontrollkstchen anzukreuzen, setzen Sie die Eigenschaft Value des Kontrollkstchens auf den Wert True.
521
Fhren Sie zu diesem Zweck in der Entwicklungsumgebung einen Doppelklick auf die Schaltflche NCHSTE 3 durch und erfassen Sie folgendes Ereignismakro:
Listing 13.6: Drei neue Vokabeln einstellen Private Sub CommandButton3_Click() 'nchste 3 Vokabeln anzeigen Dim Cb As Object Dim Tb As Object For Each Tb In UserForm2.Controls If TypeName(Tb) = "TextBox" Then Tb.Value = "" Next Tb UserForm_Initialize For Each Cb In UserForm2.Controls If TypeName(Cb) = "CheckBox" Then Cb.Value = False Next Cb End Sub
Bevor Sie die nchsten drei Vokabeln in Ihrer UserForm anzeigen lassen, entfernen Sie die bisherigen Eingaben. Dazu durchlaufen Sie in einer Schleife alle Steuerelemente, die sich auf der UserForm befinden. ber die Funktion TypeName knnen Sie die Textfelder identifizieren und ber die Eigenschaft Value, der Sie eine leere Textfolge zuweisen, lschen. Danach rufen Sie das bereits vorher erfasste Ereignis UserForm_Initialize auf, welches die Vokabeln in die UserForm einfgt und die bersetzung der Vokabeln in Variablen schreibt. Vergessen Sie danach nicht, die Kreuze aus den Kontrollkstchen zu entfernen, wie Sie es bereits im Makro in Listing 13.5 gemacht haben.
522
Wie knnen Sie in einer UserForm in einem Listenfeld die Namen aller Tabellenbltter anzeigen lassen?
A
Fgen Sie eine neue UserForm mit einem Listenfeld ein. Erfassen Sie dann das Ereignis UserForm_Initialize, welches automatisch ausgefhrt wird, wenn die UserForm aufgerufen wird.
Listing 13.7: Tabellennamen in Listenfeld einlesen Private Sub UserForm_Initialize() Dim Blatt As Worksheet For Each Blatt In ThisWorkbook.Sheets ListBox1.AddItem Blatt.Name Next End Sub
Mit der Methode AddItem fgen Sie dem Listenfeld jeweils eine neue Zeile hinzu.
Wie knnen Sie erreichen, dass im soeben erstellten Listenfeld die angeklickte Tabelle aktiviert wird?
A
523
Listing 13.8: Den ausgewhlten Eintrag im Listenfeld auslesen Private Sub ListBox1_Click() ThisWorkbook.Sheets(ListBox1.Value).Activate Range("A1").Select Unload Me End Sub
Indem Sie ber die Eigenschaft Value des Listenfeldes auch die Position des Eintrages innerhalb des Listenfeldes bekommen, knnen Sie nun direkt im Hintergrund das entsprechende Tabellenblatt aktivieren, und im Anschluss daran die UserForm schlieen
F
Standardmig wird ein Text in einem Eingabefeld nicht markiert. Wenn Sie beispielsweise beim Aufruf einer UserForm den Inhalt eines Textfeldes markieren mchten, fgen Sie eine neue Userform mit einem Eingabefeld sowie einer Schaltflche ein und erfassen folgendes Ereignismakro, welches Sie direkt hinter die Schaltflche legen:
Listing 13.9: Einen Text in einem Eingabefeld komplett markieren Private Sub CommandButton1_Click() TextBox1.SetFocus TextBox1.SelStart = 0 TextBox1.SelLength = Len(TextBox1.Text) End Sub
Mithilfe der Methode SetFocus setzen Sie den Textcursor auf das Eingabefeld. Mit der Eigenschaft SelStart bestimmen Sie die Anfangsposition des zu markierenden Textes. Die Eigenschaft SelLength legt die Anzahl der zu markierenden Zeichen fest. Weisen Sie dieser Eigenschaft die Funktion Len zu, die die Gesamtzahl der eingegebenen Zeichen des Eingabefeldes ermittelt.
524
Quiz
13.5 Quiz
F F F F
Wie lautet die Methode, um eine UserForm aufzurufen? ber welche Eigenschaft knnen Sie die Beschriftung von Steuerelementen bestimmen? Wie kann ein Eingabefeld deaktiviert werden? Wie heit das Ereignis, welches beim Starten einer UserForm automatisch ausgefhrt wird?
13.6 bung
Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe UserForm.xls. Schreiben Sie ein Makro, welches die Ergebnisse der Vokabelabfragen in der separaten Tabelle BUNG dokumentiert. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.
525
4 1
Gestern haben Sie gelernt, wie Sie UserForms in Excel erstellen, mit Steuerelementen bestcken und automatisieren knnen. Sie haben dabei Schritt fr Schritt eine Lsung entwickelt, ber die Sie dialoggesteuert Vokabeln lernen knnen. Die Themen heute:
Was verbirgt sich hinter der VBE-Programmierung? Voraussetzung das Einbinden der VBE-Bibliothek Weitere Informationen zu Bibliotheken VBE-Bibliothek deaktivieren Objekte, Methoden und Eigenschaften der VBE Typische Aufgaben mit der VBE erledigen Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe VBE.xls im Verzeichnis Kap14.
528
1. Wechseln Sie ber die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung von Excel. 2. Whlen Sie aus dem Men EXTRAS den Befehl VERWEISE.
3. Aktivieren Sie im Listenfeld VERFGBARE VERWEISE die Bibliothek MICROSOFT VISUAL BASIC FOR APPLICATION EXTENSIBILTITY 5.3. 4. Besttigen Sie Ihre Einstellung mit OK. Nach dem Einbinden der VBE-Bibliothek knnen Sie ber den vollen Befehlssatz verfgen. brigens gibt es weitere Bibliotheken, die zustzliche VBA-Befehle zur Verfgung stellen. So stellt beispielsweise die Word-Bibliothek Befehle zur Verfgung, die es mglich machen, Ihre Textverarbeitung von Excel aus zu programmieren. Diese und andere Bibliotheken werden aber standardmig nicht eingebunden, um die Performance der Anwendung nicht zu beeintrchtigen. Hier gilt wie schon bei den Add-Ins der Grundsatz: Es wird erst etwas eingebunden, wenn es auch wirklich gebraucht wird! Diese manuelle Vorgehensweise zum Einbinden der VBE-Bibliothek knnen Sie brigens auch durch ein Makro ausfhren lassen. Dabei starten Sie das Makro aus Listing 14.1:
529
Listing 14.1: Die VBE-Bibliothek per Code einbinden Sub VBEAktivieren() Dim VBEObj As Object On Error Resume Next VBEObj = Application.VBE.ActiveVBProject.References. _ AddFromGuid("{0002E157-0000-0000-C000-000000000046}", _ 5, 3) End Sub
Die Methode AddFromGuid fgt der REFERENCES-Auflistung einen Verweis hinzu, wobei der global eindeutige Bezeichner (GUID) des Verweises verwendet wird. Die komplette Syntax lautet:
AddFromGuid(GUID, HauptNr, NebenNr) As Reference
Das Argument Guid gibt einen Wert vom Typ String zurck, der die Klassen-ID eines Objekts enthlt. Bei der Guid handelt es sich um eine eindeutige Nummer, welche die Bibliothek identifiziert. Das Argument HauptNr gibt einen Wert vom Typ Long zurck, der die Hauptversionsnummer der Klassenbibliothek, auf die verwiesen wird, enthlt. Das Argument NebenNr gibt einen Wert vom Typ Long zurck, der die Nebenversionsnummer der Klassenbibliothek, auf die verwiesen wird, anzeigt. Beide Nummern sind notwendig, um die Bibliothek richtig zu adressieren. Anhand dieser beiden Nummern durchsucht die Methode AddFromGuid die Registrierung, um den hinzuzufgenden Verweis zu ermitteln und einzubinden. Wie aber knnen Sie nun feststellen, welche GUID, HauptNr und NebenNr eine bestimmte Bibliothek hat? Klar ist, dass es eine Mglichkeit geben muss, diese GUID sowie die Haupt- und NebenNr automatisch auszulesen. Das folgende Makro aus Listing 14.2 schreibt alle diese Informationen in eine neue Tabelle. Binden Sie dazu vorher die gewnschten Bibliotheken manuell ein.
Listing 14.2: Alle gesetzten Verweise abfragen Sub VerweiseAbfragen() Dim ref As Reference Dim i As Integer
530
On Error Resume Next Sheets.Add Range("A1").Select i = 1 ActiveCell.Value = "Verweis" ActiveCell.Offset(0, 1).Value = "GUID" ActiveCell.Offset(0, 2).Value = "Major" ActiveCell.Offset(0, 3).Value = "Minor" For Each ref In Application.VBE.ActiveVBProject.References ActiveCell.Offset(i, 0).Value = ref.Name ActiveCell.Offset(i, 1).Value = ref.GUID ActiveCell.Offset(i, 2).Value = ref.Major ActiveCell.Offset(i, 3).Value = ref.Minor i = i + 1 Next ref End Sub
Fgen Sie zunchst eine neue, noch leere Tabelle ein, indem Sie die Methode Add einsetzen. Danach durchlaufen Sie in einer Schleife alle gesetzten Verweise in der Reference-Auflistung. ber die Eigenschaft Name knnen Sie den Namen des Verweises erfahren. Die Eigenschaft Guid gibt einen Wert vom Typ String zurck, der die Klassen-ID eines Objekts enthlt. Bei der Guid handelt es sich um eine eindeutige Nummer, welche die Bibliothek identifiziert. Das Argument Major gibt einen Wert vom Typ Long zurck, der die Hauptversionsnummer der Klassenbibliothek, auf die verwiesen wird, enthlt. Das Argument Minor gibt einen Wert vom Typ Long zurck, der die Nebenversionsnummer der Klassenbibliothek, auf die verwiesen wird, anzeigt.
531
Mithilfe dieser Tabelle knnen Sie jede Bibliothek auch ber den Einsatz eines Makros einbinden. Orientieren Sie sich dazu am Makro aus Listing 14.1 und setzen Sie die Argumente aus Abbildung 14.2 ein.
Durchlaufen Sie in einer Schleife alle gesetzten Verweise in der Entwicklungsumgebung. Mithilfe der Eigenschaft Description knnen Sie den beschreibenden
532
Text der jeweils eingebundenen Bibliothek abfragen. Die Eigenschaft FullPath liefert den Namen des Verzeichnisses zurck, in dem die Bibliothek gespeichert ist. ber die Eigenschaft Name knnen Sie ermitteln, wie die jeweils eingebundene Bibliothek heit. Kontrollieren Sie das Ergebnis, indem Sie in der Entwicklungsumgebung aus dem Men ANSICHT den Befehl DIREKTFENSTER auswhlen.
Anhand dieser Auflistung im Direktfenster knnen Sie Bibliotheken auch ber ihren Namen einbinden bzw. wieder deaktivieren. Im folgenden Beispiel wird die Bibliothek fr die OLE-Automatisierung zuerst eingebunden und danach wieder deaktiviert.
Listing 14.4: Die OLE-Bibliothek einbinden Sub OLEBiboEinbinden() Dim VBEObj As Object Set VBEObj = Application.VBE.ActiveVBProject.References On Error Resume Next VBEObj.AddFromFile "stdole2.tlb" End Sub
533
Mit der Methode AddFromFile fgen Sie dem Projekt einen Verweis aus einer Datei hinzu. Dazu muss allerdings der Name der Bibliothek bekannt sein. Diesen knnen Sie im Dialogfeld VERWEISE VBAPROJECT im Men EXTRAS und dem Befehl VERWEISE nachsehen bzw. das Ergebnis des Makros aus Listing 14.3 im Direktfenster kontrollieren. Um die OLE-Bibliothek wieder zu deaktivieren, starten Sie das Makro aus Listing 14.5:
Listing 14.5: Die OLE-Bibliothek deaktivieren Sub OLEBiboDeaktivieren() Dim VBEObj As Object On Error Resume Next Set VBEObj = Application.VBE.ActiveVBProject.References VBEObj.Remove VBEObj("stdole") End Sub
Setzen Sie die Methode Remove ein, um die Bibliothek OLE wieder zu deaktivieren. Orientieren Sie sich dabei am Ergebnis des Makros aus Listing 14.3 im Direktfenster. Dort knnen Sie den genauen Namen (STDOLE) der OLE-Bibliothek erfahren.
534
ber die Methode Remove entfernen Sie den Verweis auf die eingebundene Bibliothek aus der aktiven Arbeitsmappe. Geben Sie dabei den Namen der VBE-Bibliothek an.
535
Im Makro FormelnDokumentieren wird eine Textdatei mithilfe der Methode Open geffnet. Sollte die Textdatei zu diesem Zeitpunkt noch nicht existieren, dann wird diese selbststndig angelegt. In einer anschlieenden Schleife wird jede belegte Zelle der aktiven Tabelle durchlaufen. Innerhalb der Schleife findet eine berprfung statt, ob die jeweilige Zelle eine Formel enthlt. Wenn ja, dann wird
536
die Adresse der Zelle ber die Eigenschaft Address sowie der Inhalt der Formel ber die Eigenschaft FormulaLocal direkt in die Textdatei geschrieben. Erfassen Sie nun das Makro, welches im ersten Schritt ein neues Modul ModulNeu anlegt und danach den Inhalt der Textdatei Code.txt hineinkopiert.
Listing 14.7: Neues Modul anlegen und Code importieren Sub MakroAusTextdateiImportieren() Dim VBKomp As VBComponent Dim CodeModul As CodeModule Const ImportDatei = "C:\Eigene Dateien\Code.txt" Set VBKomp = _ ThisWorkbook.VBProject.VBComponents.Add _ (vbext_ct_StdModule) VBKomp.Name = "ModulNeu" Application.Visible = True Set CodeModul = _ ThisWorkbook.VBProject.VBComponents _ ("ModulNeu").CodeModule With CodeModul .AddFromFile ImportDatei End With End Sub
Legen Sie zu Beginn des Makros den Namen sowie den Pfad der Textdatei in einer Konstanten fest, in der der Quellcode gespeichert ist. Um einer Arbeitsmappe ein neues, noch leeres Modul hinzuzufgen, setzen Sie die Methode Add ein. Die Methode Add verwendet die Konstante vbext_ct_StdModule, welche ein normales Modul reprsentiert. Selbstverstndlich knnen Sie ebenso Klassenmodule und UserForms ber diese Methode in Ihr Projekt einfgen. Entnehmen Sie dazu die notwendigen Konstanten der folgenden Tabelle 14.1.
537
Konstante
vbext_ct_ClassModule vbext_ct_MSForm vbext_ct_StdModule
Erklrung Fgt der Auflistung ein Klassenmodul hinzu. Fgt der Auflistung ein Formular hinzu. Fgt der Auflistung ein Standardmodul hinzu.
Geben Sie im zweiten Schritt an, in welches Modul Sie den Inhalt der Textdatei Code.txt transferieren mchten. Verwenden Sie dazu die Anweisung Set und geben den Namen des neu eingefgten Moduls an. Wenden Sie danach die Methode AddFromFile an, um den Inhalt der Textdatei in das Modul einzufgen.
Abbildung 14.6: Das neue Modul wurde angelegt und der Quellcode importiert.
Gehen wir jetzt einen Schritt weiter und berfhren den Inhalt der Textdatei Code.txt in alle geffneten Arbeitsmappen. Den Code fr diese Aufgabe knnen Sie in Listing 14.8 sehen:
Listing 14.8: Alle geffneten Mappen mit Quellcode versorgen Sub TextdateiInAlleArbeitsmappenEinlesen() Dim Mappe As Workbook Dim VBKomp As VBComponent Const ImportDatei = "C:\Eigene Dateien\Code.txt" For Each Mappe In Application.Workbooks
538
Set VBKomp = _ Mappe.VBProject.VBComponents.Add _ (vbext_ct_StdModule) VBKomp.Name = "ModulNeu2" Application.Visible = True Mappe.VBProject.VBComponents("ModulNeu2").CodeModule.AddFromFile _ ImportDatei Next Mappe End Sub
Durchlaufen Sie in einer Schleife alle geffneten Arbeitsmappen. Innerhalb dieser Arbeitsmappen legen Sie ber die Methode Add ein neues, noch leeres Modul an. Anschlieend fgen Sie mithilfe der Methode AddFromFile den Inhalt der Textdatei in die neu angelegten Module ein.
Abbildung 14.7: Alle geffneten Mappen wurden mit dem Modul ModulNeu2 versorgt.
Fr etwas kleinere Makros knnen Sie Quellcode auch direkt in das Modul schreiben und anschlieend starten. Im folgenden Makro aus Listing 14.9 werden die Namen der in der Arbeitsmappe enthaltenen Tabellen im Direktfenster verzeichnet.
539
Listing 14.9: Ein Makro Zeile fr Zeile erfassen Sub MakroZeilenHinzufgen() Dim CodeModul As CodeModule Dim i As Long Set CodeModul = _ ThisWorkbook.VBProject.VBComponents _ ("Modul1").CodeModule With CodeModul i = .CountOfLines + 1 .InsertLines i, _ "Sub TabellenListen()" & Chr(13) & _ " Dim Tabelle as worksheet" & Chr(13) & _ " For each Tabelle in Activeworkbook.Worksheets " & Chr(13) & _ " Debug.Print Tabelle.name " & Chr(13) & _ " Next Tabelle " & Chr(13) & _ "End Sub" End With End Sub
Im Makro aus Listing 14.9 wird Zeile um Zeile bertragen. Die Eigenschaft Count OfLines ermittelt, wie viele Codezeilen im Modul bereits enthalten sind, und addiert den Wert 1 darauf. Diese Manahme ist notwendig, um eventuell bereits bestehende Makros nicht zu berschreiben. ber die Methode InsertLines fgen Sie die einzelnen Zeilen im Modul ein. Der Funktionsaufruf Chr(13) im obigen Listing sorgt jeweils fr den Zeilenvorschub.
540
Abbildung 14.8: Das neue Makro wird unterhalb des letzten Makros in Modul1 eingefgt.
Im Dialogfeld DATEI EXPORTIEREN whlen Sie das gewnschte Verzeichnis aus, geben der Sicherung einen Namen und besttigen mit einem Klick auf die Schaltflche SPEICHERN. Diesen Vorgang knnen Sie selbstverstndlich auch vollautomatisch ber ein Makro durchfhren, wie Sie es in Listing 14.10 sehen knnen.
541
Listing 14.10: Den Quellcode in einer Textdatei sichern Sub ModulInTextdateiSichern() Dim VBKomp As Object Const ExportDatei = "C:\Eigene Dateien\Sicherung.txt" On Error Resume Next Set VBKomp = _ ThisWorkbook.VBProject.VBComponents("Modul1") With VBKomp .Export ExportDatei End With End Sub
Legen Sie ber die Anweisung Set fest, welches Modul gesichert werden soll. Mit der Methode Export sichern Sie eine Komponente als Textdatei. Dabei geben Sie den Namen sowie den Pfad der Textdatei an, in die Ihr Quellcode exportiert werden soll. Sollte diese Datei noch nicht existieren, dann wird diese angelegt.
542
Module ausdrucken
Auch eine Art von Sicherung bietet der Ausdruck der Makros. Dazu knnen Sie manuell im Projekt-Explorer das gewnschte Modul mit der rechten Maustaste anklicken und aus dem Kontextmen den Befehl DRUCKEN auswhlen. Per Makro gehen Sie hierzu einen kleinen Umweg. Speichern Sie das gewnschte Modul zuerst in einer Textdatei, lesen diese in eine normale Excel-Tabelle ein, stellen die bevorzugte Schriftart sowie Schriftgre ein und drucken die Makros aus. Das Makro fr diese Aufgabe lautet:
Listing 14.11: Ein Modul mit allen Makros drucken Sub DruckenModul() Const ExportDatei = "C:\Eigene Dateien\Ausdruck.txt" ActiveWorkbook.VBProject.VBComponents("Modul1").Export ExportDatei Workbooks.OpenText ExportDatei With ActiveSheet.Cells .Font.Name = "Courier" .Font.Size = 10 .PrintOut End With Application.DisplayAlerts = False ActiveWorkbook.Close Kill ExportDatei Application.DisplayAlerts = True End Sub
Wenden Sie im ersten Schritt die Methode Export an, um das gewnschte Modul in einer Textdatei zu sichern. Danach ffnen Sie die Textdatei, indem Sie die Methode OpenText einsetzen. Jetzt befinden sich alle Makros in einer Tabelle. Diese Tabelle formatieren Sie nun, indem Sie die gewnschte Schriftart sowie Schriftgre einstellen. Dazu verwenden Sie die Eigenschaften Name und Size, die Sie auf das Font-Objekt anwenden. Drucken Sie die Tabelle danach ber die Methode PrintOut aus. Nach dem Ausdruck setzen Sie die Eigenschaft Display Alerts auf den Wert False, um beim Schlieen der Textdatei keine Rckfrage von Excel zuzulassen. ber die Anweisung Kill knnen Sie die Textdatei daraufhin lschen. Setzen Sie am Ende des Makros die Eigenschaft DisplayAlerts auf den Wert True, um Standardmeldungen in Excel wieder zuzulassen.
543
Mit der Methode Remove knnen Sie ein bestimmtes Modul lschen. Die On Error-Anweisung verhindert einen Makroabsturz, wenn das Modul nicht gefunden werden kann, weil es eventuell bereits gelscht wurde bzw. gar nicht existiert.
544
Wenn es darum geht, alle Module einer Arbeitsmappe zu entfernen, dann knnen Sie das Makro aus Listing 14.13 einsetzen:
Listing 14.13: Alle Module aus einer Arbeitsmappe entfernen Sub ModuleLschen() Dim VBKomp As VBComponent With Application.VBE.ActiveVBProject For Each VBKomp In .VBComponents If VBKomp.Type = 1 Then .VBComponents.Remove VBKomp Next VBKomp End With End Sub
In einer Schleife durchlaufen Sie alle VBE-Komponenten einer Arbeitsmappe. ber die Eigenschaft Type finden Sie heraus, ob es sich dabei um ein Modul, ein Klassenmodul oder eine UserForm handelt. Im Falle eines Moduls meldet diese Eigenschaft den Wert 1 zurck. Entfernen Sie in diesem Fall das entsprechende Modul mithilfe der Methode Remove.
545
With VBCodeModul i = .ProcStartLine("TabellenListen", vbext_pk_Proc) e = .ProcCountLines("TabellenListen", vbext_pk_Proc) .DeleteLines i, e End With End Sub
Geben Sie im ersten Schritt des Makros ber die Anweisung Set an, in welchem Modul sich das zu lschende Makro befindet. Danach ermitteln Sie ber die Methode ProcStartLine, an welcher Stelle das gesuchte Makro beginnt. Dabei bergeben Sie dieser Methode den Namen des Makros, welches Sie finden mchten. Im zweiten Argument legen Sie die Art der zu suchenden Prozedur fest. Da Eigenschaftenprozeduren mehrere Darstellungen im Modul haben knnen, mssen Sie die Art der zu suchenden Prozedur festlegen. Alle Prozeduren verwenden die Konstante vbext_pk_Proc. Die Methode ProcStartLine gibt die Zeilennummer in einer Integer-Variablen zurck. Damit haben Sie die genaue Startposition des zu lschenden Makros. Was jetzt noch fehlt, ist das Ende des zu lschenden Makros. Diese Zeilenposition knnen Sie mithilfe der Methode ProcCountLines ermitteln, der Sie wie schon vorher, den Namen des zu lschenden Makros bergeben und ber die Konstante vbext_pk_Proc dafr sorgen, dass nach Prozeduren gesucht werden soll. Entfernen Sie im nchsten Schritt die ermittelten Zeilen, indem Sie der Methode
DeleteLines die gerade eben ermittelten Positionen der Start- sowie Endezeile des
546
Da auch einzelne Tabellen in der Eigenschaft VBComponents verzeichnet sind, knnen Sie diese auch gezielt ansprechen. Mithilfe der Methode DeleteLines entfernen Sie alle Ereignisse, die sich hinter der TABELLE1 befinden. bergeben Sie dieser Methode als Argumente die Startzeile (= 1) sowie die Anzahl der Zeilen, die hinter dieser Tabelle erfasst wurden. Diese Information knnen Sie ber die Eigenschaft CountOfLines ermitteln. Auf eine ganz hnliche Weise knnen Sie brigens auch dynamisch Ereignisse hinter einzelne Tabellen legen. Das Makro aus Listing 14.16 stellt das Ereignis Worksheet_Change hinter der TABELLE1 ein.
Listing 14.16: Ein Ereignis dynamisch einstellen Sub EreignisEinstellen() With ThisWorkbook.VBProject.VBComponents("Tabelle1").CodeModule .InsertLines 1, _ "Private Sub Worksheet_Change(ByVal Target As Range)" & Chr(13) & _ " Msgbox ""Zellennderung durchgefhrt in Zelle: "" & _ Target.Address" & Chr(13) & _ "End Sub" End With End Sub
Geben Sie im ersten Schritt ber die Anweisung Set an, hinter welche Tabelle das Ereignis Worksheet_Change eingefgt werden soll. Danach setzen Sie die Methode InsertLines ein, um den Quellcode einzufgen. Dabei bergeben Sie dieser Methode zwei Argumente. Im ersten Argument legen Sie die Startzeile fest, ab der der Quellcode eingefgt werden soll. Im zweiten Argument bertragen Sie das Ereignis Zeile fr Zeile.
547
VBE aufrufen
Standardmig drcken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu wechseln. Diesen Vorgang knnen Sie aber auch ber ein Makro durchfhren. Dieses Makro knnen Sie dann beispielsweise einer Schaltflche in einer Excel-Tabelle zuweisen und somit mit einem Klick in die Entwicklungsumgebung wechseln.
Listing 14.17: Die Entwicklungsumgebung per Makro aufrufen Sub VBEEditorAufrufen() With Application.VBE.MainWindow .SetFocus .Visible = True End With End Sub
Die Eigenschaft MainWindow gibt ein Window-Objekt zurck, das das Hauptfenster der Entwicklungsumgebung von Visual Basic darstellt. ber die Methode SetFocus wird der Fokus auf das Entwicklungsfenster verschoben, d.h. alle folgenden Aktionen werden danach in diesem Fenster durchgefhrt. Mithilfe der Eigenschaft Visible machen Sie das Entwicklungsfenster sichtbar, indem Sie diese Eigenschaft auf den Wert True setzen.
Eine UserForm stellt wie auch ein Modul oder ein Klassenmodul eine VBE-Komponente dar, die Sie gezielt ansprechen und somit auch entfernen knnen. Das folgende Makro aus Listing 14.18 entfernt die USERFORM1 aus der aktiven Arbeitsmappe.
Listing 14.18: Eine UserForm lschen Sub UserformLschen() With Workbooks(ActiveWorkbook.Name).VBProject .VBComponents.Remove.VBComponents("Userform1") End With End Sub
548
Jede einzelne VBE-Komponente kann ber ihren Typ bestimmt werden. Im folgenden Makro aus Listing 14.19 werden alle in der Arbeitsmappe vorhandenen VBE-Komponenten aufgelistet.
Listing 14.19: Alle VBE-Komponenten der Arbeitsmappe auflisten Sub KomponentenAusgeben() Dim VBKomp As VBComponent For Each VBKomp In ThisWorkbook.VBProject.VBComponents Debug.Print "Name der Komponente: " & VBKomp.Name & _ Chr(13) & "Typ der Komponente: " & _ VBKomp.Type & Chr(13) Next VBKomp End Sub
Durchlaufen Sie in einer Schleife alle VBE-Komponenten der Arbeitsmappe und geben Sie die Namen der Komponenten ber die Eigenschaft Name sowie den Typ der Komponente ber die Eigenschaft Type mithilfe der Anweisung Debug.Print im Direktfenster der Entwicklungsumgebung aus.
549
Wie knnen Sie Ereignisse aus einer Arbeitsmappe entfernen, welche im ProjektExplorer hinter dem Eintrag DieseArbeitsmappe hinterlegt sind?
A
Sie knnen ein Arbeitsmappenereignis aus der Arbeitsmappe entfernen, indem Sie das Makro aus Listing 14.20 einsetzen.
Listing 14.20: Ein Arbeitsmappenereignis entfernen Sub ArbeitsmappenEreignisEntfernen() With ThisWorkbook.VBProject.VBComponents _ ("DieseArbeitsmappe").CodeModule .DeleteLines 1, .CountOfLines End With End Sub
Geben Sie als VBE-Komponente direkt den Namen DieseArbeitsmappe an, um Zugriff auf die dort eventuell eingefgten Ereignisse zu bekommen. Danach wenden Sie die Methode DeleteLines an, um die Ereignisse zu entfernen. bergeben Sie dieser Methode als Argumente die Startzeile (= 1) sowie die Anzahl der Zeilen, die hinter diesem Eintrag erfasst wurden. Diese Information knnen Sie ber die Eigenschaft CountOfLines ermitteln.
14.8 Quiz
F F F F
ber welche Eigenschaft knnen Sie den Namen sowie den Pfad eines Verweises herausfinden? Wie lautet die Methode, um eine Textdatei in ein VBA-Modul einzulesen? Schreiben Sie ein Makro, welches die beiden Module ModulNeu und ModulNeu2 aus der Arbeitsmappe entfernt. Erfassen Sie ein Makro, welches alle Module einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung ausgibt.
550
bung
14.9 bung
Zum Abschluss dieses Tages ffnen Sie die Demo-Arbeitsmappe VBE.xls und schreiben ein Makro, das alle Makros aus allen Modulen einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung auflistet. Die Lsung dieser Aufgabe knnen Sie im Anhang A nachlesen.
551
Tag 1
Aufgabe In einer Tabelle sollen die Nullwerte nicht angezeigt werden. Auerdem sollen die Gitternetzlinien sowie die Spalten- und Zeilenbeschriftungen im Ausdruck mit ausgedruckt werden. Lsen Sie diese Aufgabe mit Hilfe des Makrorekorders und entfernen Sie danach aus der Aufzeichnung die nicht bentigten Zeilen. Sehen Sie sich jedoch vorab einmal die Ausgangssituation an. Lsung Die Einstellungen fr den Ausdruck des Gitternetzes sowie der Spalten- und Zeilenbeschriftungen der Tabelle finden Sie im Men DATEI unter dem Befehl SEITE EINRICHTEN auf der Registerkarte TABELLE. Die Ansicht der Nullwerte knnen Sie im Men EXTRAS mithilfe des Befehls OPTIONEN auf der Registerkarte ANSICHT ein- bzw. ausblenden. Fhren Sie diese beiden einzelnen Schritte nacheinander durch und aktivieren vorher den Makrorekorder. Entfernen Sie aus der Aufzeichnung die nicht bentigten Zeilen. Als Ergebnis erhalten Sie dann folgendes Makro:
Listing A.1: Gitternetz sowie Zeilen- und Spaltenbeschriftungen vor dem Druck einstellen und Nullwerte ausblenden Sub Makro4() ' ' Makro4 Makro ' Makro am 24.08.2003 von Bernd Held aufgezeichnet ' With ActiveSheet.PageSetup .PrintHeadings = True .PrintGridlines = True End With ActiveWindow.DisplayZeros = False End Sub
Setzen Sie die Eigenschaften PrintHeadings und PrintGridlines auf den Wert True.
554
Tag 2
Tag 2
Aufgabe Die Namen der Tabellen einer Arbeitsmappe sollen auf der ersten Tabelle dieser Arbeitsmappe in Spalte A eingefgt werden. Lsen Sie diese Aufgabenstellung mithilfe einer For Each Next Schleife. Lsung Um die Namen alle Tabellen einer Arbeitsmappe auf der ersten Tabelle in Spalte A auszugeben, erfassen Sie folgendes Makro:
Listing A.2: Alle Tabellennamen in erste Tabelle schreiben Sub bung01() Dim Tabelle As Worksheet Sheets("Tabelle1").Activate Range("A1").Select For Each Tabelle In ActiveWorkbook.Worksheets ActiveCell.Value = Tabelle.Name ActiveCell.Offset(1, 0).Select Next Tabelle End Sub
Durch die Worksheets-Auflistung gewinnen Sie Zugriff auf alle in der aktiven Arbeitsmappe befindlichen Tabellenbltter. Die Namen dieser Tabellen knnen Sie ber die Eigenschaft Name abfragen und in die Tabelle schreiben.
Tag 3
Aufgabe berprfen Sie, ob das Add-In Solver bereits geladen ist.
555
Lsung Um zu ermitteln, ob das Add-In Solver bereits im Add-In-Manager eingebunden ist, starten Sie folgendes Makro:
Listing A.3: Add-In Prfung Sub AddInsPrfung() Dim AddI As AddIn Dim b As Boolean b = False For Each AddI In Application.AddIns If AddI.Name = "Solver" And AddI.Installed = True Then b = True Next If b = True Then MsgBox "Das Add-In Solver ist eingebunden!" _ Else MsgBox "Das Add-In Solver ist noch nicht eingebunden!" End Sub
In der AddIns-Auflistung sind alle Add-Ins von Excel verzeichnet. ber die Eigenschaft Installed knnen Sie prfen, ob ein bestimmtes Add-In bereits im Add-InManager eingebunden wurde.
Tag 4
Aufgabe Programmieren Sie ein Makro, welches alle Arbeitsmappen aus einem bestimmten Verzeichnis ffnet, das aktuelle Datum in Zelle A1 der ersten Tabelle schreibt und diese Arbeitsmappen speichert und schliet. Lsung Starten Sie das folgende Makro:
Listing A.4: Alle Mappen eines Verzeichnisses ffnen und manipulieren Sub ArbeitsmappenffnenUndBearbeiten() Dim Mappe As String Const Lw = "C:\" Const Pfad = "C:\Eigene Dateien\"
556
Tag 5
ChDrive Lw ChDir Pfad Mappe = Dir(Pfad & "*.xls") Do While Mappe <> "" Workbooks.Open Mappe Workbooks(Mappe).Sheets(1).Range("A1").Value = Date Workbooks(Mappe).Close SaveChanges:=True Mappe = Dir Loop End Sub
Bevor Sie die Arbeitsmappen nacheinander ffnen knnen, mssen Sie sicherstellen, dass das richtige Laufwerk sowie das gewnschte Verzeichnis eingestellt ist. Erst dann ermitteln Sie die Arbeitsmappen mithilfe der Funktion Dir, der Sie als Endung *.xls angeben. ffnen Sie danach die einzelnen Arbeitsmappen und schreiben in die erste Tabelle einer jeden Mappe in Zelle A1 das aktuelle Datum. Beim Schlieen der Arbeitsmappen speichern Sie diese Anpassung.
Tag 5
Aufgabe 1 Legen Sie eine neue Arbeitsmappe an und fgen darin genau 12 Tabellen ein, die Sie nach Monatsnamen benennen. Lsung Erfassen Sie folgendes Makro:
Listing A.5: Benannte Tabellen einfgen Sub TabellenEinfgenMitMonatsnamen() Dim i As Integer Workbooks.Add For i = 1 To 12 Worksheets.Add Before:=Worksheets(Worksheets.Count)
557
ber die Methode Add knnen Sie eine neue Arbeitsmappe anlegen. Danach wenden Sie wiederum die Methode Add an, um die einzelnen Tabellen einzufgen. Benennen Sie die eingefgten Tabellen, indem Sie die Eigenschaft Name verwenden. ber die Funktion MonthName knnen Sie die Monatsnamen (Januar bis Dezember) ermitteln. Aufgabe 2 Entfernen Sie aus einer Tabelle alle Formeln, und zwar so, dass daraus Festwerte werden. Lsung Geben Sie folgendes Makro ein:
Listing A.6: Alle Formelzellen aus Tabelle durch Festwerte ersetzen Sub FormelnAusTabelleEntfernen() Dim zelle As Range Sheets("Deckungsbeitrag").Activate Selection.SpecialCells(xlCellTypeFormulas).Select For Each zelle In Selection zelle.Value = zelle.Value Next zelle End Sub
Wenden Sie die Methode SpecialCells an, der Sie die Konstante xlCellTypeFormulas zuweisen. Damit werden alle Formelzellen in der aktiven Tabelle markiert. Diese Zellen stehen jetzt alle in der Auflistung Selection. Durchlaufen Sie im Anschluss daran alle Zellen innerhalb der Markierung und berschreiben die Formeln, indem Sie die Eigenschaft Value einsetzen.
558
Tag 6
Tag 6
Aufgabe 1 Erstellen Sie eine neue Tabelle und fgen dort im Bereich A1:D20 einige Zahlenwerte ein. Ihre Aufgabe besteht nun darin, alle Zellen zu kennzeichnen, die einen Wert grer als 500 aufweisen. Frben Sie diese Zellen mit der Hintergrundfarbe GELB. Lsung
Listing A.7: Alle Zellen > 500 werden gelb eingefrbt Erfassen Sie das folgende Makro: Sub ZellenInBereichFrben() Dim Bereich As Range Dim Zelle As Range Sheets("Tabelle14").Activate Set Bereich = Range("A1:D20") For Each Zelle In Bereich If Zelle.Value > 500 Then Zelle.Interior.ColorIndex = 6 Next Zelle End Sub
Aktivieren Sie im ersten Schritt die gewnschte Tabelle und legen den Bereich fest, indem Sie bestimmte Zellen frben mchten. In einer anschlieenden Schleife durchlaufen Sie alle Zellen, die innerhalb des definierten Bereichs liegen. Innerhalb der Schleife prfen Sie, ob der Zellwert (= Value) grer als 500 ist. Wenn ja, dann frben Sie den Hintergrund der Zelle (= Interior) mithilfe der Eigenschaft ColorIndex, der Sie den Wert 6 zuweisen. Aufgabe 2 Listen Sie die Zellenadressen aller verwendeten Namen einer Arbeitsmappe in einem Meldungsfenster auf. Lsung Erfassen Sie folgendes Makro:
559
Listing A.8: Alle Zellenadressen von Namen ermitteln und ausgeben Sub AlleNamenInMappeAuflisten() Dim BenannteBereiche As Object Dim s As String For Each BenannteBereiche In ActiveWorkbook.Names s = s & BenannteBereiche & Chr(13) Next MsgBox "Die Adressen der verwendeten Namen lauten: " & Chr(13) & s End Sub
In der Auflistung Names sind alle verwendeten Namen der aktiven Arbeitsmappe verzeichnet. ber die Objektvariable BenannteBereiche knnen Sie diese jetzt auslesen und am Ende des Makros in einer Bildschirmmeldung ausgeben. Aufgabe 3 Dokumentieren Sie alle verwendeten Namen einer Arbeitsmappe, indem Sie eine neue Tabelle einfgen und den Namen und dessen Zellenadresse ausgeben. Lsung Erfassen Sie folgendes Makro:
Listing A.9: Alle verwendeten Namen in Tabelle dokumentieren Sub AlleNamenProtokollieren() Dim BenannteBereiche As Object Sheets.Add Range("A1").Select For Each BenannteBereiche In ActiveWorkbook.Names ActiveCell.Value = BenannteBereiche.Name ActiveCell.Offset(0, 1).Value = _ ActiveWorkbook.Names.Item(BenannteBereiche.Name) ActiveCell.Offset(1, 0).Select Next End Sub
In dieser Lsung werden die eingesetzten Namen einer Arbeitsmappe dokumentiert. Dabei wird jeweils der Name des Namens sowie dessen Zellenadresse ausgegeben.
560
Tag 6
Aufgabe 4 Lschen Sie alle Gltigkeitsfestlegungen aus einer Tabelle. Lsung Erfassen Sie folgendes Makro:
Listing A.10: Alle Gltigkeiten aus einer Tabelle entfernen Sub GltigkeitLschen() ActiveCell.SpecialCells(xlCellTypeSameValidation).Select Selection.Validation.Delete End Sub
ber die Methode SpecialCells, der Sie die Konstante xlCellTypeSameValidation zuweisen, knnen Sie alle Zellen, die eine Gltigkeitsregel beinhalten, ermitteln. ber die Methode Select markieren Sie diese Zellen. Entfernen Sie die Gltigkeitsregeln, indem Sie die Methode Delete anwenden. Aufgabe 5 Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte. Lsung Starten Sie das folgende Makro:
Listing A.11: Formeln in Festwerte wandeln Sub FormelnInFestwerteWandeln() Dim Zelle As Range Sheets("Tabelle3").Activate ActiveCell.SpecialCells(xlCellTypeFormula).Select For Each Zelle In Selection Zelle.Value = Zelle.Value Next Zelle End Sub
ber die Methode SpecialCells, der Sie die Konstante xlCellTypeFormula zuweisen, knnen Sie alle Zellen, die eine Formel beinhalten, ermitteln. ber die Methode Select markieren Sie diese Zellen. Durchlaufen Sie anschlieend alle Zellen innerhalb der Markierung und berschreiben die Formeln mit Festwerten.
561
Tag 7
Aufgabe 1 Stellen Sie sicher, dass beim Aktivieren einer bestimmten Tabelle die Neuberechnung ausgelst wird. Lsung Fr diese Aufgabe setzen Sie das Ereignis Activate ein, das Sie im folgenden Listing sehen.
Listing A.12: Die Neuberechnung einer Tabelle beim Aktivieren der Tabelle sicherstellen Private Sub Worksheet_Activate() Application.Calculation = xlAutomatic End Sub
Weisen Sie der Eigenschaft Calculation die Konstante xlAutomatic zu. Damit wird die Tabelle neu berechnet. Aufgabe 2 Wie muss das Ereignis lauten, wenn Sie vor dem Speichern einer Arbeitsmappe in der ersten Tabelle der Arbeitsmappe das aktuelle Tagesdatum erfassen mchten? Lsung Das Ereignis heit WorkBook_BeforeSave, welches im folgenden Listing angezeigt wird.
Listing A.13: Das aktuelle Tagesdatum vor dem Speichern in Zelle A1 der Tabelle1 schreiben Private Sub Workbook_BeforeSave _ (ByVal SaveAsUI As Boolean, Cancel As Boolean) ThisWorkbook.Sheets(1).Range("A1").Value = Date End Sub
Indem Sie den Index 1 auf die Auflistung Sheets anwenden, verweisen Sie auf die erste Tabelle der Arbeitsmappe, in der dieser Code gespeichert ist. ber die Funktion Date ermitteln Sie das aktuelle Tagesdatum, das Sie der Zelle A1 zuweisen.
562
Tag 7
Aufgabe 3 Ihre Aufgabe besteht nun darin, auf einer bestimmten Tabelle die beiden Maustasten zu programmieren. Fr den Bereich A1:E15 sollen dabei folgende Vorgnge ablaufen:
Klicken mit der rechten Maus: Addieren der Zelle um den Wert 10 Doppelklick mit der linken Maus: Subtrahieren der Zelle mit 10
Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich As Range Set Bereich = Range("A1:E15") If Intersect(Bereich, Target) Is Nothing Then Exit Sub Target.Value = Target.Value + 10 Cancel = True End Sub
Bevor Sie die Rechenoperationen durchfhren, mssen Sie prfen, ob die angeklickten Zellen auch im definierten Bereich liegen. Dazu verwenden Sie die Methode Intersect. Liegt die angeklickte Zelle, die im Argument Target verzeichnet ist, im definierten Bereich, dann wird ein Range-Objekt zurckgegeben. In diesem Fall liegt die angeklickte Zelle im definierten Bereich. Andernfalls liefert diese Methode den Wert Nothing zurck.
563
Tag 8
Aufgabe 1 Formatieren Sie die Pivot-Tabelle auf TABELLE1 mit einem AutoFormat. Lsung Starten Sie zu diesem Zweck das folgende Makro aus Listing Anhang 15:
Listing A.15: Eine Pivot-Tabelle formatieren Sub PivotFormatEinstellen() Dim Pivot1 As PivotTable Set Pivot1 = Worksheets("Tabelle11").PivotTables(1) With Pivot1 .TableRange1.AutoFormat Format:=xlClassic3 End With End Sub
In der Auflistung PivotTables sind alle Pivot-Tabellen der Tabelle verzeichnet. Der Index 1 bedeutet, dass die zuerst eingefgte Pivot-Tabelle angesprochen werden soll. ber die Methode AutoFormat knnen Sie mittels einer Formatkonstanten ein gewnschtes Format zuweisen. Wie die einzelnen Konstanten heien, knnen Sie brigens feststellen, indem Sie die Online-Hilfe zu dieser Methode aufrufen. Aufgabe 2 Erstellen Sie ein Zylinderdiagramm auf Basis der Tabelle BUNGEN. Fgen Sie das Diagramm als separates Diagrammblatt ein. Lsung Erfassen Sie das Makro aus Listing 16:
Listing A.16: Ein Zylinderdiagramm einfgen Sub bungZylinder() Dim Bereich As Range Dim s As String Sheets("bung").Activate
564
Tag 9
Set Bereich = Range("B3:E7") s = ActiveSheet.Name Charts.Add With ActiveChart .ApplyCustomType _ ChartType:=xlCylinderColClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlRows End With End Sub
Legen Sie im ersten Schritt den Bereich fest, auf dem basierend Sie Ihr Diagramm erstellen mchten. Danach wenden Sie die Methode Add an, um ein neues Diagramm einzufgen. Geben Sie im nchsten Schritt an, welchen Diagrammtyp Sie einsetzen mchten. Dazu weisen Sie der Eigenschaft ChartType die gewnschte Diagrammkonstante zu. ber die Methode SetSourceData weisen Sie dem Diagramm nun den vorher definierten Bereich zu.
Tag 9
Aufgabe Schreiben Sie eine modulare Funktion, die vor der Aktivierung einer Tabelle berprft, ob die zu aktivierende Tabelle in der Arbeitsmappe berhaupt vorhanden ist. Lsung Erfassen Sie die Funktion sowie das aufrufende Makro aus Listing A.17:
Listing A.17: Vor dem Zugriff auf eine Tabelle deren Existenz prfen Function TabelleExist(ByVal s As String) As Boolean Dim b As Boolean On Error GoTo fehler Sheets(s).Activate TabelleExist = True Exit Function
565
Sub TabelleAktivieren() Dim b As Boolean b = TabelleExist("Tabelle1") If b = False Then MsgBox "Die Tabelle ist in der Arbeitsmappe nicht verfgbar!" End Sub
Innerhalb der Funktion TabelleExist versuchen Sie die angegebene Tabelle zu aktivieren. Wenn dies nicht gelingt, dann knnen Sie davon ausgehen, dass die angegebene Tabelle nicht in der Arbeitsmappe vorhanden ist. In diesem Fall wird ein Fehler provoziert, der ber die Funktion aber abgefangen werden kann. So liefert die Funktion in diesem Fall den Wert False. Mithilfe dieser Variablen, die an das Makro zurckgegeben wird, knnen Sie entscheiden, wie Sie weiter vorgehen mchten.
Tag 10
Aufgabe Schreiben Sie ein Makro, das alle Zellenadressen der Hyperlinks in einer separaten Tabelle dokumentiert. Lsung Erfassen Sie das Makro aus Listing A.18:
Listing A.18: Alle Hyperlinks einer Tabelle werden dokumentiert Sub Dim Dim Dim HyperlinksDokumentieren() Hyper As Hyperlink i As Integer Blatt As String
566
Tag 11
Blatt = ActiveSheet.Name Sheets("PrfungHyper").Activate i = 1 For Each Hyper In ActiveSheet.Hyperlinks Sheets(Blatt).Cells(i, 1) = Hyper.Range.Address Sheets(Blatt).Cells(i, 2) = Hyper.Range.Value i = i + 1 Next Hyper End Sub
Fgen Sie im ersten Schritt eine neue Tabelle ein und benennen diese. Wechseln sie dann auf die Tabelle, die die Hyperlinks enthlt. In der Auflistung Hyperlinks sind alle Hyperlinks der aktiven Tabelle enthalten. Auf diese Hyperlinks knnen Sie nun zugreifen und die Adresse sowie deren Hyperlinktext in die Tabelle DOKUHYPER schreiben.
Tag 11
Aufgabe 1 Schreiben Sie ein Makro, das alle Datenstze aus der Access-Tabelle VERANSTALTUNG in die Excel-Tabelle bertrgt, die einen Veranstaltungsbeginn nach dem 04.10.2002 haben. Lsung Erfassen Sie das Makro aus Listing A.19:
Listing A.19: Bestimmte Datenstze aus Access nach Excel bertragen Sub Dim Dim Dim DatenstzeSuchenUndbertragenbung() ADOC As ADODB.Connection DBS As ADODB.Recordset s As String s = "VDatum > '04.10.2002'" Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb"
567
End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic .Find Criteria:=s, SearchDirection:=adSearchForward Sheets("bung").Activate Range("A2").Select If Not .EOF Then Do While Not .EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Value = _ Format(ActiveCell.Value, "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Vdatum ActiveCell.Offset(0, 1) = Format _ (ActiveCell.Offset(0, 1).Value, "dd.mm.yyyy") ActiveCell.Offset(0, 2).Value = DBS!Veranstaltung ActiveCell.Offset(0, 3).Value = DBS!V_Ort ActiveCell.Offset(0, 4).Value = DBS!Teilnehmer ActiveCell.Offset(0, 5).Value = DBS!Strae ActiveCell.Offset(0, 6).Value = DBS!PLZ ActiveCell.Offset(0, 7).Value = DBS!Ort ActiveCell.Offset(0, 8).Value = DBS!Kosten .Find Criteria:=s, SkipRecords:=1 ActiveCell.Offset(1, 0).Select Loop Else MsgBox "Datensatz nicht gefunden" End If .Close End With Columns("A:J").AutoFit ADOC.Close Set DBS = Nothing Set ADOC = Nothing End Sub
568
Tag 12
Aufgabe 2 Schreiben Sie ein Makro, welches den Zellenbereich A1:C5 in ein neues Dokument kopiert. Dabei sollen die beiden Dateien ber die Verknpfungseigenschaft miteinander verbunden bleiben. Lsung Erfassen Sie das aufrufende Makro aus Listing A.20:
Listing A.20: Einen Zellenbereich verknpft in ein Word-Dokument einfgen Sub Dim Dim Dim ExcelDatenNachWordKopierenVernpft() WordApp As Object WordDok As Object Bereich As Range
Set WordApp = CreateObject("Word.application") WordApp.Visible = True Set WordDok = WordApp.Documents.Add Set Bereich = Sheets("bung").Range("A1:C5") Range(Bereich.Address).Copy WordApp.Selection.PasteSpecial Link:=True Application.CutCopyMode = False Set WordApp = Nothing Set WordDok = Nothing End Sub
Tag 12
Aufgabe Schreiben Sie ein Makro, welches die Menbefehl SPEICHERN und SPEICHERN UNTER im Men DATEI deaktiviert. Lsung Erfassen Sie das Makro aus Listing A.21:
569
Listing A.21: Menbefehle deaktivieren Sub MenBefehleDeaktivieren() Dim MenLeiste As CommandBar Dim ctrl As CommandBarControl Set MenLeiste = CommandBars(1) For Each ctrl In MenLeiste.Controls(1).Controls Debug.Print ctrl.Caption If ctrl.Caption = "&Speichern" Or _ ctrl.Caption = "Speichern &unter..." Then ctrl.Enabled = False Next ctrl End Sub
ber die Anweisung Debug.Print knnen Sie sich die genaue Beschriftung des Menbefehls vorab im Direktbereich ausgeben. ber die Eigenschaft Enabled knnen Sie einen Menbefehl deaktivieren, indem Sie diese Eigenschaft auf den Wert False setzen. Das Deaktivieren eines Menbefehls knnen Sie brigens auch ber die ID vornehmen. Den Menbefehl SPEICHERN knnten Sie demnach auch ber die Anweisung If ctrl.ID = 3 Then ctrl.Enabled = False deaktivieren.
Tag 13
Aufgabe Schreiben Sie ein Makro, welches die Ergebnisse der Vokabelabfragen in der separaten Tabelle BUNG dokumentiert. Lsung
Listing A.22: Die Ergebnisse der Vokabelabfrage sichern Private Sub CommandButton2_Click() 'Prfen Dim frm As UserForm Dim Cb As Object
570
Tag 13
Set frm = UserForm2 For Each Cb In frm.Controls If TypeName(Cb) = "CheckBox" Then Cb.Value = False Next Cb With frm If .TextBox2.Value = Trans1 Then .CheckBox1.Value = True _ Else .CheckBox2.Value = True If .TextBox4.Value = Trans2 Then .CheckBox3.Value = True _ Else .CheckBox4.Value = True If .TextBox6.Value = Trans3 Then .CheckBox5.Value = True _ Else .CheckBox6.Value = True 'Vokabeln speichern Sheets("bung").Activate Range("A65536").End(xlUp).Offset(1, 0).Select ActiveCell.Value = .TextBox1.Value ActiveCell.Offset(0, 1).Value = .TextBox2.Value If .CheckBox1.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).Select ActiveCell.Value = .TextBox3.Value ActiveCell.Offset(0, 1).Value = .TextBox4.Value If .CheckBox3.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).Select ActiveCell.Value = .TextBox5.Value ActiveCell.Offset(0, 1).Value = .TextBox6.Value If .CheckBox5.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).Select End With Sheets("Vokabeln").Activate End Sub
571
Tag 14
Aufgabe Schreiben Sie ein Makro, das alle Makros aus allen Modulen einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung auflistet. Lsung Erfassen Sie die beiden Makros aus Listing A.23:
Listing A.23: Alle Namen der Module im Direktfenster ausgeben Sub MakrosAuflisten() Dim VBCodeModul As CodeModule Dim i As Long Set VBCodeModul = _ ThisWorkbook.VBProject.VBComponents("Modul1").CodeModule With VBCodeModul i = .CountOfDeclarationLines + 1 Do Until i >= .CountOfLines Debug.Print .ProcOfLine(i, vbext_pk_Proc) i = i + .ProcCountLines(.ProcOfLine(i, _ vbext_pk_Proc), vbext_pk_Proc) Loop End With End Sub
Geben Sie im ersten Schritt an, in welchem Modul sich die Makros befinden. Danach durchlaufen Sie das angegebene Modul und geben die Namen der Makros im Direktfenster aus.
572
Wenn Sie die 14 Tage mit der Programmierung hinter sich haben, dann knnen Sie sich an dem in diesem Anhang vorgestellten Add-In orientieren, welche Funktionen Sie in welcher Weise derart organisieren knnen. So knnen Sie spter leicht eigene Funktionen in dieses Add-In mit integrieren oder gar ein ganz neues Add-In erstellen. Das Add-In und seine Funktionen werden brigens in meinem aktuellen ExcelVBA-Kompendium beschrieben. In diesem Buch reichte leider der Platz hierfr nicht aus, daher haben wir uns entschlossen, Ihnen wenigstens als Service die Listings sowie die Software auf CD-ROM mitzuliefern. Sie finden alle Makros, die auf den folgenden Seiten aufgelistet sind, auf der mitgelieferten CD-ROM im Verzeichnis ANHANG II in der Arbeitsmappe Macadd in.xls. Das fertige Add-In Macaddin.xla haben Sie ebenfalls in diesem Verzeichnis. Sie knnen es ber das Men EXTRAS und den Befehl ADD-INS-MANAGER einbinden. Folgende Funktionen werden Ihnen in meinem Add-In angeboten:
Umwandlung von Formeln und Funktionen in Festwerte in der aktiven Tabelle Umwandlung von Formeln und Funktionen in Festwerte als Kopie in einer neuen Datei Subern aller Zellen im markierten Bereich von nicht druckbaren Zeichen Setzen von Zellenumbrchen innerhalb einer Markierung Umwandlung von relativen Bezgen in absolute Bezge Aktives Tabellenblatt als E-Mail-Anhang versenden Aktive Tabelle in neuer Arbeitsmappe speichern Wochentag, Datum und Uhrzeit anzeigen Informationen zur aktuellen Arbeitsmappe anzeigen (Name der Arbeitsmappe, Autor, letzter Zugriff, letzte nderung, Speicherort der Arbeitsmappe) ffnen aller verknpften Arbeitsmappen Verknpfungen zu anderen Arbeitsmappen entfernen Suchen von Text mit der Ersetzen-Funktion Suchen von Text mit der Markierungsfunktion
574
Die Ereignisse
Markierung aller Zellen in der Tabelle, die Formeln, Kommentare, Konstanten, etc. enthalten. Lschen von bestimmten Zellen.
Das Add-In legt beim Aktivieren des Tools eine eigenes Men an, das wie folgt aussieht.
Beim Deaktivieren des Add-Ins sollte das zustzliche Men MACADDIN wieder entfernt werden. Dazu setzen Sie das Ereignis Workbook_AddinUninstall ein und rufen darin das Makro MENLSCHEN auf.
575
Listing B.2: Ereignis Workbook_AddinUninstall zum Entfernen eines eigenen Mens beim Deaktivieren eines Add-Ins Private Sub Workbook_AddinUninstall() MenLschen End Sub
Menerstellung
Listing B.3: Ein eigenes Men erstellen Sub Dim Dim Dim Dim MenErstellen() i As Integer i_Hilfe As Integer MenNeu As CommandBarControl Mb As CommandBarControl
i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ before:=i_Hilfe, Temporary:=True) MenNeu.Caption = "MacAdd&In" Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = _ "Formeln, F&unktionen in Festwerte umwandeln _ (aktuelles Blatt)" .Style = msoButtonIconAndCaption
576
Der Quellcode
.OnAction = "FormelnInWerteUmwandeln" .FaceId = 39 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = _ "Formeln, Fu&nktionen in Festwerte umwandeln _ (neue Mappe)" .Style = msoButtonIconAndCaption .OnAction = "FormelnInWerteUmwandelnNeueDatei" .FaceId = 159 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Zellen in Markierung subern" .Style = msoButtonIconAndCaption .OnAction = "ZellenSubern" .FaceId = 1552 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Zellenumbrche in Markierung setzen" .Style = msoButtonIconAndCaption .OnAction = "ZellenumbruchSetzen" .FaceId = 162 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Absolut-Bezge setzen" .Style = msoButtonIconAndCaption .OnAction = "BezugndernInAbsolut" .FaceId = 384 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Ak&tive Tabelle als E-Mail versenden" .Style = msoButtonIconAndCaption
577
.OnAction = "EmailAktivesTabellenblatt" .FaceId = 3738 .BeginGroup = True End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = _ "Akt&ive Tabelle in neuer Arbeitsmappe speichern" .Style = msoButtonIconAndCaption .OnAction = "AktivesTabellenblattAlsDatei" .FaceId = 3 End With Set Mb = MenNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Wo&chentag, Datum und Uhrzeit anzeigen" .Style = msoButtonIconAndCaption .OnAction = "DatumUndUhrzeit" .FaceId = 126 .BeginGroup