154 2 30MB
German Pages 606 Year 2007
24128.book Seite 1 Mittwoch, 7. Februar 2007 12:06 12
Excel-VBA in 14 Tagen
24128.book Seite 2 Mittwoch, 7. Februar 2007 12:06 12
Unser Online-Tipp für noch mehr Wissen ...
... aktuelles Fachwissen rund um die Uhr — zum Probelesen, Downloaden oder auch auf Papier.
www.InformIT.de
24128.book Seite 3 Freitag, 9. Februar 2007 10:08 10
Excel-VBA AKTUELL ZU EXCEL 2007
BERND HELD
24128.book Seite 4 Freitag, 9. Februar 2007 10:08 10
Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über abrufbar. Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge 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 zulässig. Fast alle Hardware- und Softwarebezeichnungen und weitere Stichworte und sonstige Angaben, die in diesem Buch verwendet werden, sind als eingetragene Marken geschützt. Da es nicht möglich ist, in allen Fällen zeitnah zu ermitteln, ob ein Markenschutz besteht, wird das ®-Symbol in diesem Buch nicht verwendet. Umwelthinweis: Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt.
10 9 8 7 6 5 4 3 2 1 10 09 08 07
ISBN 978-3-8272-4128-3
© 2007 by Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH, Martin-Kollar-Straße 10–12, D–81829 München/Germany Alle Rechte vorbehalten Lektorat: Brigitte Bauer-Schiewek, [email protected] Herstellung: Philipp Burkart, [email protected] Korrektur: Simone Meißner Satz: reemers publishing services gmbh, Krefeld, (www.reemers.de) Druck und Verarbeitung: Bercker, Kevelaer Printed in Germany
24128.book Seite 5 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis Tag 1
Inhaltsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Liebe Leserin, lieber Leser . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
Wochenvorschau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1 Der Projekt-Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Das Eigenschaften-Fenster . . . . . . . . . . . . . . . . . . . . . . . . . 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 Fußzeile . . . . . . . . 1.5 Der Objektkatalog. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Letztes Änderungsdatum einer Datei ermitteln . . . . . . . . . Monatsnamen ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6 Die Online-Hilfe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verwendete Befehle nachlesen . . . . . . . . . . . . . . . . . . . . . Verfügbare Objekte ansehen . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21 23 24 25 26 26 28 29 33 33 35 40 42 43 44 44 45 46 46 53 54 56 57 58 59 60
5
24128.book Seite 6 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
1.9
Tag 2
6
Datentypen, Variablen und Konstanten . . . . . . . . . . . . . . . Was sind Variablen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablen deklarieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablendeklaration erzwingen. . . . . . . . . . . . . . . . . . . . . Vorsicht, Falle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Statische Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Öffentliche Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Private Variablen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objektvariablen einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . Konstanten einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konstanten für die Datumsfomatierung. . . . . . . . . . . . . . . 1.10 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.11 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.12 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61 62 62 65 66 67 68 69 70 88 89 95 97 98
Die Sprachelemente von VBA . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 Arbeiten mit Verzweigungen. . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen im Leben. . . . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen in Excel. . . . . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen in Excel-VBA . . . . . . . . . . . . . . . . . . . . . . Zelleninhalte prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auch eine Art von Verzweigung. . . . . . . . . . . . . . . . . . . . . 2.2 Übersichtlichere Form mit Select Case . . . . . . . . . . . . . . . Excel-Version feststellen . . . . . . . . . . . . . . . . . . . . . . . . . . . Zahlenwerte prüfen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . Fehler finden und beseitigen . . . . . . . . . . . . . . . . . . . . . . . Typische Fehlerquellen in Excel-VBA. . . . . . . . . . . . . . . . 2.5 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.7 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99 100 100 102 102 103 106 108 108 109 111 112 112 118 123 126 130 131 139 143 145 145
24128.book Seite 7 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
Tag 3
Einstellen und Anpassen der Excel-Anwendung . . . . . . . . . . . . 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 überprüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7 Wiedervorlageliste bearbeiten. . . . . . . . . . . . . . . . . . . . . . . 3.8 Sonstige Einstellmöglichkeiten in Excel . . . . . . . . . . . . . . Allgemeine Einstellungen . . . . . . . . . . . . . . . . . . . . . . . . . Zoom einstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aufenthaltsbereich festlegen. . . . . . . . . . . . . . . . . . . . . . . . 3.9 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.10 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.11 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
147 148 150 152 153 154 155 157 158 159 160 161 162 163 165 165 167 168 170 171 171
Tag 4
Auf Arbeitsmappen zugreifen – Datei-Operationen . . . . . . . . . 4.1 Arbeitsmappen öffnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe öffnen (ohne Aktualisierung). . . . . . . . . . . . Arbeitsmappe(n) öffnen über einen Dialog . . . . . . . . . . . . Geöffnete Arbeitsmappen identifizieren . . . . . . . . . . . . . . 4.2 Arbeitsmappen speichern . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe speichern über Dialog . . . . . . . . . . . . . . . . . Alle geöffneten Arbeitsmappen speichern . . . . . . . . . . . . . Arbeitsmappe speichern unter Datum/Uhrzeit . . . . . . . . . Arbeitsmappe bedingt speichern . . . . . . . . . . . . . . . . . . . . 4.3 Arbeitsmappen schließen . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe schließen – Änderungen speichern. . . . . . . Arbeitsmappe schließen – Änderungen verwerfen. . . . . . . Mehrere Arbeitsmappen schießen . . . . . . . . . . . . . . . . . . . 4.4 Arbeitsmappen anlegen. . . . . . . . . . . . . . . . . . . . . . . . . . . .
173 174 176 177 180 181 182 184 185 186 186 187 187 187 188
7
24128.book Seite 8 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
Tag 5
8
4.5 4.6 4.7
Arbeitsmappen zusammenführen. . . . . . . . . . . . . . . . . . . . Arbeitsmappen entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . Die Dokumenteigenschaften . . . . . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften auslesen . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften setzen . . . . . . . . . . . . . . . . . . . . . 4.8 Verknüpfungen in Arbeitsmappen . . . . . . . . . . . . . . . . . . . Verknüpfungen dokumentieren . . . . . . . . . . . . . . . . . . . . . Verknüpfungen ändern. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
189 191 191 192 193 196 197 198 200 200 201
Tabellenblätter programmieren . . . . . . . . . . . . . . . . . . . . . . . . . 5.1 Tabellen anlegen und benennen . . . . . . . . . . . . . . . . . . . . 5.2 Blatt-Typ bestimmen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellenblätter füllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blattprüfung vor Füllung vornehmen . . . . . . . . . . . . . . . . 5.3 Tabellen entfernen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabelle nach Rückfrage löschen . . . . . . . . . . . . . . . . . . . . Rückfrage bei Tabellenlöschung unterdrücken. . . . . . . . . Eigene Rückfrage programmieren . . . . . . . . . . . . . . . . . . . Vor dem Löschen prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Blättern. . . . . . . . . . . . . . . . . Blätter wieder einblenden. . . . . . . . . . . . . . . . . . . . . . . . . . 5.7 Tabellen gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfaches Gruppieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Komplexeres Gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . .
203 204 206 208 208 209 209 210 210 211 213 213 215 216 217 217 217 221 223 224 225 226 227 228 229 230
24128.book Seite 9 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
5.8
Tabellen schützen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nur bestimmte Zellen vor Veränderung schützen . . . . . . Temporären Schutz einstellen . . . . . . . . . . . . . . . . . . . . . . Bestimmte Bereiche vom Schutz ausnehmen . . . . . . . . . . Tabellen sortieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kopf- und Fußzeilen programmieren. . . . . . . . . . . . . . . . . Kopf- und Fußzeilen füllen . . . . . . . . . . . . . . . . . . . . . . . . Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
232 234 236 236 238 239 239 242 243 243
Zellenbearbeitung 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 füllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . Zellen füllen aus Kommentaren. . . . . . . . . . . . . . . . . . . . . Kommentare löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
245 246 247 247 248 249 252 253 254 255 255 257 259 259 262 263 266 268 269 271 274 274 276 277 279
5.9 5.10 5.11 5.12 5.13 Tag 6
9
24128.book Seite 10 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
Tag 7
10
6.6
Arbeiten mit Formeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Addition von bestimmten Sätzen . . . . . . . . . . . . . . . . . . . . Subtraktion von Datumsangaben . . . . . . . . . . . . . . . . . . . . Preise erhöhen durch Multiplikation . . . . . . . . . . . . . . . . . 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 Gültigkeitsprüfungen vornehmen . . . . . . . . . . . . . . . . . . . Nur ganze Zahlen eingeben . . . . . . . . . . . . . . . . . . . . . . . . Datumsgrenzen einstellen . . . . . . . . . . . . . . . . . . . . . . . . . Gültigkeitsliste erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.10 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.11 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.12 Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
281 281 283 283 285 285 286 288 292 293 295 296 298 300 300 302 305 307 309 311 312 314 314
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Ereignis Selection_Change. . . . . . . . . . . . . . . . . . . . . Das Ereignis Calculate . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weitere Tabellenereignisse im Überblick . . . . . . . . . . . . .
315 316 317 317 319 320 321 322 324 324 325 328 330 331
24128.book Seite 11 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
7.4
7.5
7.6
7.7 7.8 7.9
Excel über Tastenkombinationen bedienen. . . . . . . . . . . . Formeln und Verknüpfungen in Festwerte wandeln. . . . . Bestimmte Standardtastenkombinationen deaktivieren. . . Nur Werte einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sonderzeichen per Tastenkombination einfügen . . . . . . . Programmieren mit der Maus . . . . . . . . . . . . . . . . . . . . . . Kontextmenü deaktivieren/aktivieren. . . . . . . . . . . . . . . . . Kontextmenü für bestimmte Bereiche deaktivieren . . . . . Kontextmenü in allen Tabellen deaktivieren. . . . . . . . . . . Kontextmenü in bestimmten Tabellen deaktivieren . . . . . Eigene Funktionen mit der rechten Maustaste starten . . . Doppelklick deaktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . Werte hochzählen per Doppelklick . . . . . . . . . . . . . . . . . . Zufallszahlen per Doppelklick . . . . . . . . . . . . . . . . . . . . . . Excel zeitmäßig steuern . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Uhr immer im Blick . . . . . . . . . . . . . . . . . . . . . . . . . . Countdown in Excel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verarbeitung zu einer bestimmten Zeit beginnen. . . . . . . Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
332 332 337 338 339 342 343 343 344 345 346 349 351 352 354 354 356 357 357 359 360
Wochenvorschau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 Tag 8
Große 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . Pivot-Tabellen erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . Pivot-Tabellen aktualisieren . . . . . . . . . . . . . . . . . . . . . . . .
363 364 365 366 368 370 371 373 375 377 380 380 383
11
24128.book Seite 12 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
8.3
Diagramme erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagrammtypen auswählen . . . . . . . . . . . . . . . . . . . . . . . . Der Standard – das Säulendiagramm. . . . . . . . . . . . . . . . . Ergebnisse vergleichen über das Balkendiagramm . . . . . . Tagesgenaue Auswertungen über das Liniendiagramm . . Daten richtig skalieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagramme platzieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagramme formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagramme exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
385 385 386 388 390 394 395 396 398 400 402 403
Funktionen einsetzen, um Excel zu automatisieren . . . . . . . . . 9.1 Eigene Tabellenfunktionen stricken . . . . . . . . . . . . . . . . . Zellen mit blauer, dicker Schriftfarbe summieren. . . . . . . Aktuelle Arbeitsmappe ermitteln . . . . . . . . . . . . . . . . . . . . Formelcheck durchführen . . . . . . . . . . . . . . . . . . . . . . . . . Zelleninformationen abfragen . . . . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften per Funktion abfragen . . . . . . . . Buchstaben aus Zellen eliminieren . . . . . . . . . . . . . . . . . . Das erste Auftreten einer Zahl ermitteln . . . . . . . . . . . . . . 9.2 Modulare Funktionen programmieren . . . . . . . . . . . . . . . Arbeitsmappen-Existenz prüfen . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen-Zustand prüfen . . . . . . . . . . . . . . . . . . . . . Eine mächtige Löschfunktion erstellen . . . . . . . . . . . . . . . 9.3 Funktionen dauerhaft verfügbar machen. . . . . . . . . . . . . . Speichern der Funktionen in der persönlichen Makroarbeitsmappe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Speichern der Funktionen in einem Add-In . . . . . . . . . . . 9.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.6 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
405 407 408 411 412 413 414 416 417 419 419 420 422 425
Excel und das Internet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.1 Arbeiten mit Hyperlinks . . . . . . . . . . . . . . . . . . . . . . . . . . . Hyperlinks aus einer Tabelle entfernen . . . . . . . . . . . . . . . Hyperlinks aus Zelleninhalten herstellen. . . . . . . . . . . . . . Inhaltsverzeichnis erstellen. . . . . . . . . . . . . . . . . . . . . . . . .
433 434 435 437 438
8.4 8.5 8.6 Tag 9
Tag 10
12
425 427 429 431 431
24128.book Seite 13 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
10.2 10.3 10.4 10.5 10.6 Tag 11
Tag 12
E-Mails verschicken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kontakte austauschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
440 443 447 451 451
Excel und Datenzugriffe auf Access und Word . . . . . . . . . . . . . 11.1 Die Voraussetzung für den Datenaustausch . . . . . . . . . . . 11.2 Excel-Daten in eine Access-Datenbank überführen . . . . . 11.3 Access-Daten in Excel-Tabellen überführen . . . . . . . . . . . Alle Datensätze nach Excel transferieren. . . . . . . . . . . . . . Nur bestimmte Datensätze nach Excel transferieren . . . . 11.4 Access-Tabellen manipulieren . . . . . . . . . . . . . . . . . . . . . . 11.5 Datensätze löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.10 Ganze Excel-Tabellen in ein Word-Dokument einfügen . 11.11 Word-Dokumente in einer Excel-Tabelle auflisten . . . . . . 11.12 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.13 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.14 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
453 454 456 461 461 464 467 469 471 472 474
Arbeiten an der Oberfläche – Ribbons programmieren . . . . . . 12.1 Der »Custom UI Editor« . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Weitere wichtige Quellen und Hilfen . . . . . . . . . . . . . . . . 12.3 Eigene Ribbons programmieren. . . . . . . . . . . . . . . . . . . . . Ribbon mit Schaltflächen erstellen . . . . . . . . . . . . . . . . . . Ribbon mit ComboBox erstellen . . . . . . . . . . . . . . . . . . . . Ribbon mit bereits verfügbaren Funktionen bestücken. . . 12.4 Kontextmenüs programmieren. . . . . . . . . . . . . . . . . . . . . . Zellen-Kontextmenü erweitern. . . . . . . . . . . . . . . . . . . . . . Kontextmenübefehle entfernen . . . . . . . . . . . . . . . . . . . . .
491 492 494 496 497 498 501 503 503 504
475 478 481 483 489 490
13
24128.book Seite 14 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
12.5 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 12.6 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 12.7 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Tag 13
Tag 14
14
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1 Was sind UserForms? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.2 UserForms entwerfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bilder in UserForms einfügen . . . . . . . . . . . . . . . . . . . . . . Horizontale Trennstreifen einfügen. . . . . . . . . . . . . . . . . . Steuerelemente beschriften . . . . . . . . . . . . . . . . . . . . . . . . Aktivierreihenfolge festlegen. . . . . . . . . . . . . . . . . . . . . . . . 13.3 UserForms programmieren. . . . . . . . . . . . . . . . . . . . . . . . . UserForm aufrufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UserForm beenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Speichern der eingegebenen Daten . . . . . . . . . . . . . . . . . . Vokabeln einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vokabeln prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anzeigen der nächsten 3 Vokabeln . . . . . . . . . . . . . . . . . . 13.4 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.5 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.6 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
507 508 509 512 513 513 513 514 514 515 516 519 521 523 524 527 527
Makros dynamisch erzeugen, importieren und exportieren über VBE-Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.1 Was verbirgt sich hinter der 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 bestücken . . . . . . . . . . . . . . Quellcode sichern über den Export . . . . . . . . . . . . . . . . . . Module ausdrucken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen von Modulen befreien. . . . . . . . . . . . . . . . Ein bestimmtes Makro entfernen . . . . . . . . . . . . . . . . . . . . Ein Ereignis löschen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VBE aufrufen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
529 530 531 534 537 538 538 538 543 544 546 547 548 550
24128.book Seite 15 Mittwoch, 7. Februar 2007 12:06 12
Inhaltsverzeichnis
14.7 Fragen & Antworten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 14.8 Quiz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 14.9 Übung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 Anhang A Lösungen der Tages-Übungen. . . . . . . . . . . . . . . . . . . . . . . . . . . 555 Anhang B Wichtige Funktionen in einem eigenen Add-In ablegen . . . . . 575 Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
15
24128.book Seite 16 Mittwoch, 7. Februar 2007 12:06 12
24128.book Seite 17 Mittwoch, 7. Februar 2007 12:06 12
Liebe Leserin, lieber Leser Das Programm Excel ist technisch sehr ausgereift und Sie werden auf den ersten Blick nicht viel vermissen, was Sie für Ihre tägliche Arbeit brauchen. Mithilfe von VBA-Makros lassen sich aber gerade tägliche lästige Routinearbeiten weitestgehend automatisieren. Sie haben einmalig den Aufwand mit der Erstellung der dazu benötigten Makros. Später profitieren Sie jedoch davon und es bleibt Ihnen viel mehr Zeit für andere Dinge. Außerdem werden Sie zunehmend auf programmierte Excel-Lösungen stoßen. Nur wenn Sie selbst mit VBA programmieren können, verstehen Sie diese Lösungen wirklich und können sie selbst auf Ihre Bedürfnisse hin abändern, ohne auf externe Dienstleister zurückgreifen zu müssen. Dieses Buch ist in 14 Kapitel gegliedert. Sie können es somit in zwei Wochen durcharbeiten, wenn Sie sich jeden Tag ein Kapitel vornehmen. An den Kapitelenden finden Sie nahezu immer einen Workshop mit Fragen & Antworten, einem Quiz und einer oder auch mehreren Übungen. Sie sollen Ihnen zur persönlichen Erfolgskontrolle dienen. Ich habe mich bemüht, die wichtigsten und interessantesten Lösungen im Buch vorzustellen. Zu jedem Kapitel können Sie auf der mitgelieferten CD-ROM die entsprechende(n) Beispieldatei(en) öffnen und den Quellcode ansehen und testen. Sie brauchen daher nicht die einzelnen Listings abzutippen (wenngleich ich Ihnen das empfehle, weil dadurch der Lerneffekt größer ist). Am Ende des Buches werden Sie in der Lage sein, effektiv mit VBA-Makros umzugehen und eigene Lösungen zu entwickeln. Für Nachfragen und allgemeines Feedback zu meinem Buch erreichen Sie mich über meine Excel-Homepage http://held-Office.de. Auf der Homepage von Markt & Technik finden Sie ein eigenes VBA-Forum, in dem Sie Ihre VBA-Fragen loswerden können. Ich moderiere dieses Forum und antworte dort nahezu täglich. Auch Sie sind natürlich herzlich eingeladen, Ihre Erfahrung und Ihr Wissen in diesem VBA-Forum einzubringen. Besuchen Sie darüber hinausmal das Excel-Diskussionsforum news:microsoft. public.de.excel oder das Excel Spotlight-Forum unter http://spotlight.de/zforen/mse/t/ forum_mse_1.html. Hier können Sie auf jeden Fall eine ganze Menge lernen.
17
24128.book Seite 18 Mittwoch, 7. Februar 2007 12:06 12
Möchten Sie einen VBA-Kurs besuchen, so finden Sie auf meiner Homepage regelmäßig Schulungsangebote. Diese Angebote reichen von Einzelschulungen bei mir zu Hause über Hotel- bis zu 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
18
24128.book Seite 19 Mittwoch, 7. Februar 2007 12:06 12
Tag 1
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
21
Tag 2
Die Sprachelemente von VBA
99
Tag 3
Einstellen und Anpassen der Excel-Anwendung
Tag 4
Auf Arbeitsmappen zugreifen – Datei-Operationen 173
Tag 5
Tabellenblätter programmieren
203
Tag 6
Zellenbearbeitung mit VBA
245
Tag 7
Aktionen und Benutzereingaben in Excel überwachen
315
Große Datenmengen in VBA behandeln und auswerten
363
Tag 8
147
Tag 9
Funktionen einsetzen, um Excel zu automatisieren 405
Tag 10
Excel und das Internet
433
Tag 11
Excel und Datenzugriffe auf Access und Word
453
Tag 12
Arbeiten an der Oberfläche – Ribbons programmieren
491
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
507
Makros dynamisch erzeugen, importieren und exportieren über VBE-Programmierung
529
Tag 13 Tag 14
Wochenvorschau
W O C H E
W O C H E
24128.book Seite 20 Mittwoch, 7. Februar 2007 12:06 12
Die wichtigsten Grundlagen und Objekte in VBA für Excel In der ersten Woche werden Sie am 1. Tag mit der Entwicklungsumgebung von Excel bekannt gemacht. Sie werden einige Makros eingeben und ablaufen lassen. Bei der Eingabe der Makros werden Sie tatkräftig unterstützt durch spezielle Funktionen und Features der Entwicklungsumgebung, mit deren Hilfe Sie Codes schnell erfassen und optisch hervorheben können. Des Weiteren lernen Sie Datentypen, Variablen und Konstanten kennen. Der 2. Tag stellt Ihnen die wichtigsten Sprachelemente, wie Schleifen, Verzweigungen und Abfragen, welche in jeder Programmiersprache vorkommen, vor. Schon an diesem Tag lernen Sie, wie Sie diese Sprachelemente anhand von Beispielen aus der Praxis einsetzen können. Der 3. Tag hat als Ausbildungsziel das Einstellen der Excel-Applikationen. So werden Sie lernen, wie Sie Excel individuell über den Einsatz von Makros konfigurieren können. Am 4. Tag beginnen Sie mit Excel-Arbeitsmappen zu arbeiten. Sie werden u.a. neue Arbeitsmappen anlegen und speichern, Arbeitsmappen drucken, umbenennen oder nach bestimmten Mappen auf Ihrer Festplatte oder auf einem Netzwerk suchen. Am 5. Tag der ersten Woche werden Sie sich intensiv mit Tabellenblättern beschäftigen. Unter anderem werden Sie Tabellenblätter einfügen und mit Daten füllen, Tabellen entfernen oder umbenennen bzw. bestimmte Daten auf Tabellen suchen und kennzeichnen. Am 6. Tag lernen Sie, wie Sie die kleinste Einheit in Excel, die Zelle, ansprechen und programmieren können. Unter anderem werden Sie Zellen auslesen, füllen, einfärben, einfügen, löschen und vieles mehr. Am 7. Tag steigen Sie in die Welt der Ereignisse von Excel ein. Mit ein paar wenigen Handgriffen werden Sie dabei erstaunliche Features in Excel programmieren. Unter anderem lernen Sie, wie Sie auf Benutzereingaben automatisch reagieren und wie Sie Änderungen an Ihren Tabellen dokumentieren können. Des Weiteren lernen Sie, wie Sie Excel über Tastatur bzw. Zeitfunktionen steuern können. Unter anderem werden Sie an diesem Tag Makrolösungen erstellen, die zu bestimmten Zeitpunkten automatisch starten.
20
24128.book Seite 21 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen 1
24128.book Seite 22 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Die Entwicklungsumgebung von Excel ist in der Anwendung integriert. Allerdings ist sie nicht gleich für jedermann sichtbar. In die Entwicklungsumgebung gelangen Sie, indem Sie eine der folgenden alternativen Vorgehensweisen wählen: 쐽
Drücken Sie die Tastenkombination (Alt) + (F11).
쐽
Wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/VISUAL BASIC-EDITOR.
쐽
Klicken Sie mit der rechten Maustaste auf einen beliebigen Tabellenreiter (unten) und wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN.
쐽
Blenden Sie die Symbolleiste VISUAL BASIC ein und klicken Sie das Symbol VISUAL BASIC-EDITOR an. Wie Sie sehen, haben Sie eine Menge von Möglichkeiten, in die Entwicklungsumgebung von Excel zu gelangen. Persönlich bevorzuge ich die erste Variante, also das Drücken der Tastenkombination (Alt) + (F11), da dies am schnellsten geht.
Egal, für welche Variante Sie sich entscheiden – alle Varianten führen zum selben Ziel. Sehen Sie sich nun die nächste Abbildung an.
Abbildung 1.1: Der erste Aufruf der Entwicklungsumgebung
22
24128.book Seite 23 Mittwoch, 7. Februar 2007 12:06 12
Der Projekt-Explorer
1.1
Der Projekt-Explorer
Auf der linken Seite sehen Sie den Projekt-Explorer. Dieser Explorer beinhaltet die momentan geöffneten Arbeitsmappen. Darüber 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 bzw. .xlam erkennen können, lassen sich über das Plussymbol leider nicht öffnen, es sei denn, Sie wissen das Kennwort, mit dem diese Add-Ins von Microsoft geschützt wurden. Alle anderen im Projekt-Explorer angezeigten Elemente können Sie aufklappen. In der Arbeitsmappe Personl.xlsb können Sie Makros speichern, die Sie in Zukunft für alle weiteren Excel-Arbeitsmappen einsetzen möchten. Wie Sie diese wichtige Arbeitsmappe anlegen und mit Makros bestücken, lernen Sie im weiteren Verlauf des Tages. Vergleichbar ist diese Datei übrigens mit der zentralen Dokumentvorlage Normal.dot, die Sie eventuell schon von Word kennen. Auch dort werden Makros hinterlegt, um sie für alle weiteren Dokumente benutzen zu können. In Abbildung 1.1 sehen Sie, dass neben dem Add-In Funcres (Analyse-Funktionen) und der zentralen Makro-Arbeitsmappe Personl.xlsb eine weitere Arbeitsmappe Mappe1 angezeigt wird. Wenn Sie über das Plussymbol die einzelnen Elemente dieser Arbeitsmappe aufklappen, erscheinen die in der Mappe enthaltenen Tabellenblätter (Tabelle1 bis Tabelle3) sowie der Eintrag DieseArbeitsmappe. Hinter jedem dieser Elemente können Sie so genannte Ereignisse einstellen. Unter einem Ereignis versteht man in Excel Vorgänge wie das Öffnen oder Schließen einer Arbeitsmappe, die Eingabe von Daten in Zellen, das Drucken oder Speichern von Mappen und vieles mehr. Ereignisse können Sie entweder auf Tabellenebene oder auf Arbeitsmappenebene einstellen. Sie haben somit die Möglichkeit, bestimmte Vorgänge in Ihren Excel-Tabellen separat zu überwachen und auf Veränderungen individuell zu reagieren. Auf dieses Spezialthema wird an diesem Tag nicht weiter eingegangen. Lernen Sie am 10. Tag praktische Einsatzmöglichkeiten für Ereignisse kennen.
23
24128.book Seite 24 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
1.2
Das Eigenschaften-Fenster
Über das Menü ANSICHT und den Befehl EIGENSCHAFTEN können Sie das Eigenschaften-Fenster anzeigen, sofern es nicht bereits eingeblendet ist. Alternativ dazu können Sie auch die Taste (F4) drücken, um dieses Fenster einzublenden.
Abbildung 1.2: Das Eigenschaften-Fenster
Mithilfe dieses Fensters können Sie bestimmte Eigenschaften der im ProjektExplorer markierten Objekte näher bestimmen. In diesem Beispiel ist im ProjektExplorer der Eintrag Tabelle1 (Tabelle1) markiert. Im Eigenschaften-Fenster werden daraufhin die verfügbaren Eigenschaften für dieses Objekt angezeigt. Die Namen der einzelnen Tabellen entsprechen im ersten Teil dem Namen der zeitlichen Reihenfolge, nach der die Tabellen in die Arbeitsmappe eingefügt wurden. So werden standardmäßig bei der Neuanlage einer Arbeitsmappe genau drei Tabellen eingefügt. 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 tatsächliche Name in Klammern angezeigt. Um den internen Namen anzupassen, können Sie den Mauszeiger im Eigenschaften-Fenster rechts neben die Rubrik (Name) setzen und den gewünschten Namen der Tabelle
24
24128.book Seite 25 Mittwoch, 7. Februar 2007 12:06 12
Das Eigenschaften-Fenster
direkt erfassen. Den zweiten Teil des Namens, der auf dem Tabellenreiter der Tabelle angezeigt wird, können Sie anpassen, indem Sie den Mauszeiger im Eigenschaften-Fenster rechts neben die Rubrik Name setzen und den gewünschten Namen der Tabelle direkt erfassen. Es empfiehlt sich bei der Programmierung von Tabellen immer mit dem internen Namen, dem so genannten Codenamen zu arbeiten.
Tabellen ein- und ausblenden Über das Eigenschaften-Fenster können Sie die Tabelle1 ausblenden. Dazu befolgen Sie die folgenden Arbeitsschritte: 1. Markieren Sie im Projekt-Explorer den Eintrag Tabelle1 (Tabelle1). 2. Setzen Sie den Mauszeiger im Eigenschaften-Fenster rechts neben das Feld Visible. 3. Dort wird nun ein Dropdown-Menü angeboten, aus dem Sie eine der folgenden Einstellmöglichkeiten auswählen können. 왘
-1 – xlSheetVisible: Das Einstellen dieser Konstante bewirkt, dass sich die Tabelle im eingeblendeten Zustand befindet (Standardeinstellung).
왘
0 – xlSheetHidden: Wählen Sie diese Einstellung, um die Tabelle auszublenden. Wenn Sie danach aus der Entwicklungsumgebung heraus in die normale Arbeitsoberfläche von Excel wechseln, wird die Tabelle nicht mehr angezeigt. Sie haben bei dieser Einstellung aber noch die Möglichkeit, die ausgeblendete Tabelle über das Menü FORMAT und den Befehl BLATT/EINBLENDEN wieder verfügbar zu machen.
왘
2 – xlSheetVeryHidden: Über diese Einstellung sorgen Sie dafür, dass die Tabelle sicher ausgeblendet wird, d.h. der Anwender kann die so ausgeblendete Tabelle über die Excel-Arbeitsoberfläche jederzeit wieder verfügbar machen. Wenn Sie sich für die sichere Variante, eine Tabelle auszublenden, entschieden haben, dann können Sie die so ausgeblendete Tabelle wieder über den Projekt-Explorer und das Eigenschaften-Fenster verfügbar machen, indem Sie die ausgeblendete Tabelle im Projekt-Explorer mar-
25
24128.book Seite 26 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
kieren und im Eigenschaften-Fenster unter der Rubrik Visible die Konstante -1 – xlVisible einstellen. Selbstverständlich können Sie eine sicher ausgeblendete Tabelle auch über ein Makro wieder einblenden.
Abbildung 1.3: Die mit xlSheetVeryHidden ausgeblendete Tabelle1 kann über die normale Oberfläche von Excel nicht mehr eingeblendet werden.
Eine sicher ausgeblendete Tabelle kann nicht über den Befehl Format / Ausblenden & Einblenden / Blatt einblenden im Ribbon Start wieder verfügbar gemacht werden.
Tabellen spiegeln Möchten Sie einen anderen Anwender verwirren, dann drehen Sie die gewohnte Ansicht einer Tabelle einfach herum. Dabei stellen Sie die gespiegelte Ansicht über das Eigenschaften-Fenster wie folgt ein: 1. Markieren Sie im Projekt-Explorer Tabelle 2. 2. Im Eigenschaften-Fenster setzen Sie den Mauszeiger rechts neben die Rubrik DisplayRightToLeft. 3. Wählen Sie aus dem Dropdown-Feld den Eintrag True. 4. Wechseln Sie auf die Arbeitsoberfläche von Excel.
Den zu bearbeitenden Bereich festlegen Standardmäßig kann ein Anwender auf alle Zellen einer Tabelle zugreifen. Dabei hat er in einer Tabelle Zugriff auf maximal 16000 Spalten und über 1 Million Zeilen ab der Version Excel 2007. Anwender der vorherigen Versionen müssen sich mit 65536 Zeilen und 256 Spalten begnügen. Möchten Sie den Zugriff auf eine Tabelle ein wenig einschränken, können Sie gezielt über das Eigenschaften-Fenster den Bereich abstecken, in dem sich ein Anwender aufhalten darf. Dazu befolgen Sie die nächsten Arbeitsschritte:
26
24128.book Seite 27 Mittwoch, 7. Februar 2007 12:06 12
Das Eigenschaften-Fenster
Abbildung 1.4: Spalten gespiegelt – etwas anders als gewohnt
1. Markieren Sie im Projekt-Explorer den Eintrag Tabelle 3. 2. Setzen Sie den Mauszeiger im Eigenschaften-Fenster rechts neben die Rubrik ScrollArea. 3. Erfassen Sie die Formel =A1:D10 und drücken Sie danach die Taste (Tab). 4. Wechseln Sie nun auf Ihre Excel-Arbeitsoberfläche und versuchen Sie, den Mauszeiger über die Pfeiltasten außerhalb dieses Bereiches zu positionieren. Es wird Ihnen nicht gelingen!
Abbildung 1.5: Der Zugriff ist nur in einem bestimmten Bereich möglich.
27
24128.book Seite 28 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Leider bleibt diese Einstellung nicht dauerhaft bestehen. Sie müssen sie nach jedem Öffnen der Arbeitsmappe neu vornehmen. Wie Sie diese Einstellung jedoch über einen Trick dauerhaft vornehmen, 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 Eigenschaften-Fenster eingestellt. Diese Eigenschaften können Sie aber auch über so genannte Makros einstellen. Laut Wikipedia versteht man unter einem Makro Folgendes: »Ein Makro in der Programmierung ist eine Art Textbaustein, also ein kleines Stück Programmcode, das von einem Interpreter oder Präprozessor durch ein größeres Stück Programmcode ersetzt wird. Damit ist es möglich oft wiederkehrende Programmstrukturen durch Kürzel zu vereinfachen.« Diese Makros werden in der Programmiersprache VBA (Visual Basic for Application) geschrieben. Ein Makro erfassen Sie im Code-Fenster. Damit dieses Fenster angezeigt wird, fügen Sie zunächst ein noch leeres Modul ein. Ein Modul ist ein Baustein, der Makros aufnehmen kann. Um ein Modul einzufügen, haben Sie folgende alternativen Möglichkeiten: 쐽
In der Entwicklungsumgebung von Excel wählen Sie aus dem Menü EINFÜGEN den Befehl MODUL.
쐽
Wählen Sie auf der Symbolleiste VOREINSTELLUNG das Dropdown-Symbol und daraus den Befehl MODUL.
쐽
Klicken Sie direkt auf dem Projekt-Explorer mit der rechten Maustaste und wählen Sie aus dem Kontextmenü den Befehl EINFÜGEN/MODUL.
Mit allen gerade beschriebenen Varianten wird das Code-Fenster angezeigt.
28
24128.book Seite 29 Mittwoch, 7. Februar 2007 12:06 12
Das Code-Fenster
Abbildung 1.6: Das Code-Fenster wird angezeigt.
Makros erfassen und starten Nachdem Sie das Code-Fenster eingeblendet haben, können Sie daran gehen, Ihr erstes Makro einzugeben. Jedes Makro beginnt in VBA mit der Anweisung Sub. Der Begriff kommt aus dem Englischen und bedeutet soviel wie »Unter-(titel)«, was bedeutet, dass ein Makro unterhalb eines Moduls angesiedelt ist. Nach dem Schlüsselwort Sub folgt ein Leerzeichen. Direkt im Anschluss daran können Sie einen Namen für das Makro angeben. Bedenken Sie dabei, dass für die Benennung von Makros folgende Punkte beachtet werden müssen: 쐽
Das erste Zeichen muss ein alphanumerisches Zeichen sein.
쐽
Der Makroname darf keine Leerzeichen enthalten.
쐽
Es dürfen keine Sonderzeichen wie /, %, –, $, [, ], ?, ! oder ähnliche verwendet werden.
Nach dem Namen geben Sie ein rundes Klammernpaar ein und drücken die Taste (Enter). Das Makro wird jetzt um die Anweisung End Sub ergänzt. Sub DasErsteMakro() End Sub
29
24128.book Seite 30 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Anwendernamen am Bildschirm ausgeben Momentan ist das Makro noch leer. Alle Anweisungen, die Sie innerhalb dieses Rahmens schreiben, werden abgearbeitet und nacheinander ausgeführt. Ergänzen Sie das Makro nun wie folgt, um beispielsweise den Namen des Anwenders auf dem Bildschirm auszugeben: Sub DasErsteMakro() MsgBox Environ("Username") End Sub
Möchten Sie das Makro starten, haben Sie dafür folgende Möglichkeiten: 쐽
Setzen Sie den Mauszeiger auf die erste Zeile des Makros und drücken Sie die Taste (F5).
쐽
Setzen Sie den Mauszeiger auf die erste Zeile des Makros und wählen Sie aus dem Menü AUSFÜHREN den Befehl SUB/USERFORM ausführen.
쐽
Setzen Sie den Mauszeiger auf die erste Zeile des Makros und klicken Sie in der Symbolleiste VOREINSTELLUNG auf das Symbol SUB/USERFORM ausführen. 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.
Zusätzlichen Text mit ausgeben Um neben dem Anwendernamen noch zusätzlichen Text auszugeben, verwenden Sie in VBA den Verkettungsoperator &. Das angepasste Makro sieht dann wie folgt aus: Sub DasZweiteMakro() MsgBox "Momentan arbeitet der Benutzer: " & _ Environ("Username") End Sub
30
24128.book Seite 31 Mittwoch, 7. Februar 2007 12:06 12
Das Code-Fenster
Abbildung 1.7: Das erste Makro gibt den Anwendernamen auf dem Bildschirm aus.
Beachten Sie nach dem Zeichen & den Unterstrich. Damit geben Sie bekannt, dass Sie die Anweisung in der nächsten Zeile fortsetzen möchten. Diese Methode wird sehr oft angewendet, um die Lesbarkeit des Codes zu erhöhen. Selbstverständlich hätten Sie auch die Möglichkeit, die Anweisung in einer Zeile zu schreiben, was letztendlich aber zur Folge hat, dass Sie mit der horizontalen Navigationsleiste am unteren Rand des Code-Fensters scrollen müssen, um die Anweisung lesen zu können.
Abbildung 1.8: Zusätzlichen Text in der Meldung anzeigen
31
24128.book Seite 32 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Mehrzeilige Meldungen anzeigen Immer wieder gefragt sind auch mehrzeilige Meldungsfenster. Im folgenden Beispiel werden in einem Meldungsfenster mehrere Informationen angezeigt. Sub DasDritteMakro() MsgBox "Name: " & Environ("Username") & vbLf & _ "Datum: " & Date & vbLf & _ "Uhrzeit: " & Time & " Uhr" End Sub
Mithilfe der Konstante vblf können Sie eine neue Zeile im Meldungsfenster ausgeben lassen. Die einzelnen Informationen werden über den Verkettungsoperator & miteinander verknüpft. Über die Standardfunktionen Date und Time können Sie das aktuelle Tagesdatum und die momentane Uhrzeit ermitteln. Sollte das Datum bzw. die Uhrzeit nicht stimmen, müssen Sie diese Einstellung in der Systemsteuerung von Windows ändern. Excel orientiert sich nämlich bei diesen beiden Funktionen an den Einstellungen von Windows.
Abbildung 1.9: Mehrzeiliges Meldungsfenster anzeigen
32
24128.book Seite 33 Mittwoch, 7. Februar 2007 12:06 12
Der Makrorekorder
1.4
Der Makrorekorder
Zu Beginn der Programmierung mit Excel-VBA wird es Ihnen schwer fallen, sich die Syntax einiger Befehle anzueignen. Eine hervorragende Möglichkeit, sich schnell mit den einzelnen Befehlen vertraut zu machen, besteht darin, den Makrorekorder einzusetzen. Mithilfe des Makrorekorders können Sie Aktionen, die Sie manuell in Excel vornehmen, im Hintergrund aufzeichnen lassen. Dabei wird jede einzelne Aktion mit den dafür notwendigen Befehlen direkt in das CodeFenster geschrieben. Sie können sich diesen aufgezeichneten Quellcode danach ansehen und ihn noch weiter anpassen. Üben Sie sich im Gebrauch des Makrorekorders, indem Sie die folgenden Aufgaben durchführen:
Ein- und Ausschalten der Gitternetzlinien In der ersten Aufgabe werden Sie die Gitternetzlinien für eine Tabelle aus- und wieder einschalten. Setzen Sie den Makrorekorder ein, indem Sie die nächsten Arbeitsschritte befolgen: 1. Klicken Sie in Excel im Ribbon ANSICHT auf das Symbol MAKROS / MAKRO AUFZEICHNEN.
Abbildung 1.10: Name und Speicherort des Makros angeben
2. Geben Sie dem Makro im Feld MAKRONAME einen Namen oder übernehmen Sie den von Excel vorgeschlagenen Namen.
33
24128.book Seite 34 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
3. Im Feld TASTENKOMBINATION können Sie dem Makro eine Tastenkombination zuweisen. Geben Sie in dieses Feld einmal den Buchstaben ü ein. 4. Im Dropdown-Feld MAKRO SPEICHERN IN haben Sie drei Auswahlmöglichkeiten: 왘
DIESE ARBEITSMAPPE: Das Makro wird in der aktuellen Arbeitsmappe gespeichert. Es ist dann nur für diese Arbeitsmappe einsetzbar.
왘
NEUE ARBEITSMAPPE: Das aufgezeichnete Makro wird in einer neuen Arbeitsmappe gespeichert.
왘
PERSÖNLICHE MAKROARBEITSMAPPE: Das aufgezeichnete Makro wird in der zentralen Makroarbeitsmappe PERSONL.XLS abgelegt, die mit jedem Excel-Start geladen wird, aber im Hintergrund bleibt. Somit können Makros, die in dieser Mappe gespeichert werden, für alle anderen Arbeitsmappen eingesetzt werden. Die Datei Personl.xlsb finden Sie übrigens im Office-Unterverzeichnis OFFICE/XLSTART. Standardmäßig ist diese Arbeitsmappe nach der Installation noch nicht angelegt. Die Mappe wird aber automatisch für Sie angelegt, wenn Sie ein Makro aufzeichnen und als Speicherort für das Makro die persönliche Makroarbeitsmappe auswählen. Entscheiden Sie sich hier für diese Variante.
5. Im Feld BESCHREIBUNG können Sie eine optionale Beschreibung für das Makro erfassen, welches beispielsweise die Aufgabe, den Autor und das Erstellungsdatum beinhalten kann. 6. Bestätigen Sie Ihre Eingaben mit OK. 7. Klicken Sie im Ribbon ANSICHT auf das Symbol EINBLENDEN/AUSBLENDEN. 8. Deaktivieren Sie das Kontrollkästchen GITTERNETZLINIEN. 9. Beenden Sie die Aufzeichnung des Makrorekorders, indem Sie im Ribbon ANSICHT das Symbol MAKROS / AUFZEICHNUNG BEENDEN klicken. Kontrollieren Sie nun das Resultat der Aufzeichnung, indem Sie über die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung wechseln. Für das Ausschalten der Gitternetzlinien ist lediglich eine Anweisung notwendig. Setzen Sie für 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
24128.book Seite 35 Mittwoch, 7. Februar 2007 12:06 12
Der Makrorekorder
Abbildung 1.11: Die Gitternetzlinien wurden ausgeblendet.
Abbildung 1.12: Der erste selbst aufgezeichnete Code
Einheitliches Gestalten der Kopf- und Fußzeile Für den Gebrauch des Makrorekorders werden Sie im zweiten Beispiel die Kopfund Fußzeilen mit Informationen bestücken. Dabei sollen folgende Informationen erfasst werden: 쐽
Kopfzeile links: Autor der Tabelle
쐽
Kopfzeile Mitte: Titel der Tabelle
쐽
Kopfzeile rechts: Datum
35
24128.book Seite 36 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
쐽
Fußzeile links: Name der Arbeitsmappe und Tabellenblattname
쐽
Fußzeile Mitte: Firmenname
쐽
Fußzeile rechts: Seitennummerierung
Befolgen Sie nun die nächsten Arbeitsschritte, um das Makro aufzuzeichnen: 1. Klicken Sie in Excel im Ribbon ANSICHT auf das Symbol MAKROS / MAKRO AUFZEICHNEN. 2. Geben Sie dem Makro einen Namen und wählen Sie als Speicherort den Eintrag DIESE ARBEITSMAPPE. 3. Starten Sie die Aufzeichnung mit OK. 4. Klicken Sie im Ribbon SEITENLAYOUT das kleine Symbol rechts neben der Beschriftung SEITE EINRICHTEN. 5. Wechseln Sie im Dialogfeld SEITE EINRICHTEN auf die Registerkarte KOPFZEILE/FUßZEILE. 6. Klicken Sie auf die Schaltfläche BENUTZERDEFINIERTE KOPFZEILE. 7. Füllen Sie das Dialogfeld mithilfe der Symbole und einigen manuell eingegebenen Texten wie folgt aus:
Abbildung 1.13: Die benutzerdefinierte Kopfzeile
8. Bestätigen Sie Ihre Einstellungen für die Kopfzeile mit OK. 9. Klicken Sie nun auf die Schaltfläche BENUTZERDEFINIERTE FUSSZEILE. 10. Orientieren Sie sich bei der Fußzeile an der folgenden Abbildung:
36
24128.book Seite 37 Mittwoch, 7. Februar 2007 12:06 12
Der Makrorekorder
Abbildung 1.14: Die benutzerdefinierte Fußzeile
11. Bestätigen Sie die Einstellungen für die Fußzeile mit OK. 12. Beenden Sie das Dialogfeld SEITE EINRICHTEN mit OK. 13. Beenden Sie die Aufzeichnung des Makrorekorders. Sehen Sie sich nun das Ergebnis der Aufzeichnung an, indem Sie mithilfe der Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung wechseln: Listing 1.1: Kopf- und Fußzeilen per Makro einrichten Sub KopfUndFuss() ' ' Makro3 Makro ' ' With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup .LeftHeader = "Bernd Held" .CenterHeader = "Kosten und Leistung 2006" .RightHeader = "&D" .LeftFooter = "&F / &A" .CenterFooter = "Held-Office" .RightFooter = "Seite &P von &N Seiten" .LeftMargin = Application.InchesToPoints(0.708661417322835)
37
24128.book Seite 38 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
.RightMargin = Application.InchesToPoints(0.708661417322835) .TopMargin = Application.InchesToPoints(0.78740157480315) .BottomMargin = Application.InchesToPoints(0.78740157480315) .HeaderMargin = Application.InchesToPoints(0.31496062992126) .FooterMargin = Application.InchesToPoints(0.31496062992126) .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 .OddAndEvenPagesHeaderFooter = False .DifferentFirstPageHeaderFooter = False .ScaleWithDocHeaderFooter = True .AlignMarginsHeaderFooter = True .EvenPage.LeftHeader.Text = "" .EvenPage.CenterHeader.Text = "" .EvenPage.RightHeader.Text = "" .EvenPage.LeftFooter.Text = "" .EvenPage.CenterFooter.Text = "" .EvenPage.RightFooter.Text = "" .FirstPage.LeftHeader.Text = "" .FirstPage.CenterHeader.Text = "" .FirstPage.RightHeader.Text = "" .FirstPage.LeftFooter.Text = "" .FirstPage.CenterFooter.Text = "" .FirstPage.RightFooter.Text = "" End With End Sub
Wie Sie sehen, hat der Makrorekorder hier auch Dinge aufgezeichnet, die Sie gar nicht unbedingt brauchen. Dies ist nicht ungewöhnlich für den Makrorekorder. Er beschreibt einfach das, was er sieht. Dabei werden sämtliche Einstellungen des
38
24128.book Seite 39 Mittwoch, 7. Februar 2007 12:06 12
Der Makrorekorder
Dialogs SEITE EINRICHTEN mit aufgezeichnet. Wenn Sie das Makro nur auf die Dinge beschränken möchten, auf die es Ihnen ankommt, dann bliebe danach folgender Code noch übrig: Listing 1.2: Das bereinigte Makro für die Erstellung der Kopf- und Fußzeilen Sub KopfUndFuss() With ActiveSheet.PageSetup .LeftHeader = "Bernd Held" .CenterHeader = "Kosten und Leistung 2006" .RightHeader = "&D" .LeftFooter = "&F / &A" .CenterFooter = "Held-Office" .RightFooter = "Seite &P von &N Seiten" End With End Sub
Wenn Sie sich das letzte Makro ansehen, dann werden Sie feststellen, dass Excel bei der Erstellung von Kopf- und Fußzeilen mit Buchstabenkürzeln arbeitet. Diese Kürzel werden im Zusammenspiel mit dem Verkettungsoperator & verwendet. Enthält 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 Fällen muss das &-Zeichen zweimal hintereinander erfasst werden (wie z.B. Schmidt GmbH && Co.). Ein erstes Stilmittel der Programmierung können Sie bereits aus dem aufgezeichneten Listing sehen. Mithilfe der Anweisung With können 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 längere Form Sub KopfUndFuß Lang() ' ActiveSheet.PageSetup.PrintArea = "" ActiveSheet.PageSetup.LeftHeader = "Held" ActiveSheet.PageSetup.CenterHeader = "Kosten und Leistung 2006"
39
24128.book Seite 40 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
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 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 abschließen. Kontrollieren Sie das Ergebnis dieses Makros, indem Sie die Seitenansicht von Excel aufrufen. Dazu klicken Sie im Ribbon ANSICHT auf das Symbol SEITENLAYOUT.
Abbildung 1.15: Die Fußzeile wurde per Makro erstellt.
1.5
Der Objektkatalog
Eine weitere Möglichkeit, sich schnell in die Entwicklungsumgebung einzuarbeiten und VBA-Befehle kennen zu lernen, bietet der Objektkatalog. Dieser Katalog enthält alle verfügbaren VBA-Befehle, die Sie bei der Programmierung einsetzen können. Sie starten den Objektkatalog, indem Sie wie folgt in der Entwicklungsumgebung vorgehen: 1. Drücken Sie die Taste (F2). 2. Wählen Sie aus dem Menü ANSICHT den Befehl OBJEKTKATALOG. 3. Klicken Sie in der Symbolleiste VOREINSTELLUNG auf das Symbol OBJEKTKATALOG.
40
24128.book Seite 41 Mittwoch, 7. Februar 2007 12:06 12
Der Objektkatalog
Abbildung 1.16: Der Objektkatalog gibt Auskunft über die VBASyntax.
Die Entwicklungsumgebung stellt Ihnen einen Objektkatalog zur Verfügung, in dem Sie sich über Objekte, Methoden, Ereignisse und Eigenschaften informieren können. Über das entsprechende Symbol können Sie erkennen, ob es sich um ein Objekt, eine Eigenschaft, eine Methode oder ein Ereignis handelt.
OBJEKTE Als Objekt bezeichnet man alle Teile, die Sie in Excel sehen können. 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 können. Angewandt auf eine Arbeitsmappe wären die Methoden das Öffnen, Drucken, Speichern und Schließen.
41
24128.book Seite 42 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
EREIGNIS Unter einem Ereignis versteht man in Excel Vorgänge wie das Öffnen oder Schließen einer Arbeitsmappe, die Eingabe von Daten in Zellen, das Drucken oder Speichern von Mappen und vieles mehr. Ereignisse können Sie entweder auf Tabellenebene oder auch auf Arbeitsmappenebene einstellen. Sie haben somit die Möglichkeit, bestimmte Vorgänge in Ihren Excel-Tabellen separat zu überwachen und auf Veränderungen in Ihren Tabellen individuell zu reagieren. Alle in VBA zur Verfügung stehenden Objekte werden in Bibliotheken verwaltet. Standardmäßig ist im ersten Dropdown-Menü der Eintrag ALLE BIBLIOTHEKEN ausgewählt. Wenn Sie die Anzeige ein wenig einschränken und die Inhalte einzelner Bibliotheken einsehen möchten, wählen Sie die gewünschte Bibliothek im Dropdown aus. So können Sie sich z.B. in der Bibliothek VBA ansehen, welche Objekte nicht nur auf die Tabellenkalkulation Excel beschränkt sind, sondern im gesamten Office-Paket eingesetzt werden können.
Letztes Änderungsdatum einer Datei ermitteln Die Bibliothek VBA enthält beispielsweise die Funktion FileDateTime, welche das Datum der letzten Änderung einer Datei ausgibt. Klar, dass diese Funktion nicht nur für Excel-Arbeitsmappen interessant ist. Wenden Sie diese Funktion einmal an, indem Sie folgenden Quellcode erfassen: Listing 1.4: Das letzte Änderungsdatum einer Mappe ausgeben Sub LetztesÄnderungsdatumAusgeben() MsgBox FileDateTime(ActiveWorkbook.FullName) End Sub
Die Funktion FileDateTime benötigt als Information den Namen sowie den kompletten Pfad der Arbeitsmappe, deren letztes Änderungsdatum Sie ermitteln können. Für die aktuelle Arbeitsmappe, die momentan geöffnet ist, können Sie sich diese Angabe über die Eigenschaft FullName beschaffen.
42
24128.book Seite 43 Mittwoch, 7. Februar 2007 12:06 12
Der Objektkatalog
Möchten Sie stattdessen das letzte Änderungsdatum einer momentan nicht geöffneten Arbeitsmappe anzeigen lassen, dann lautet die Syntax für diese Aufgabe wie folgt: Listing 1.5: Das letzte Änderungsdatum einer geschlossenen Datei ausgeben Sub LetztesÄnderungsdatumAusgeben02() MsgBox FileDateTime("C:\Eigene Dateien\Mappe1.xls") End Sub
Monatsnamen ermitteln Im nächsten Beispiel werden Sie anhand eines Datums den Monatsnamen ermitteln. Dabei kommen die Funktionen Month und MonthName aus der Bibliothek VBA zum Einsatz. Die Funktion Month gibt anhand eines Datums den dazugehörigen Monat in Form eines Wertes 1-12 zurück. Die Funktion MonthName gibt mithilfe eines Wertes 1-12 den dazugehörigen 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 intMonat As Integer intMonat = Month(Date) MsgBox "Heute ist der " & Date & Chr(13) & _ "Wir sind momentan im Monat " & MonthName(intMonat) End Sub
Deklarieren Sie zu Beginn einmal eine Variable vom Typ Integer. Diese Variable kann ganzzahlige Werte aufnehmen. Am zweiten Tag erfahren Sie mehr über den Einsatz von Variablen.
43
24128.book Seite 44 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Mithilfe der Funktion Date können Sie das momentane Tagesdatum ermitteln, welches Sie der Funktion Month übergeben. Die Funktion Month macht daraus eine Zahl zwischen 1 und 12. Wäre momentan der 24. August, dann würde die Funktion daraus den Zahlenwert 8 (für den 8. Monat im Jahr) machen. Übergeben Sie danach den Inhalt der Variablen i der Funktion MonthName.
Abbildung 1.17: Den Monatsnamen ermitteln und ausgeben
1.6
Die Online-Hilfe
Die dritte Möglichkeit, schnell Fortschritte in der Programmierung mit Excel-VBA zu machen, besteht darin, fleißig die Online-Hilfe einzusetzen. Gerade im Zusammenspiel mit dem Makrorekorder können Sie eine Menge lernen. Im ersten Schritt zeichnen Sie einen Quellcode auf und erkunden danach mit der OnlineHilfe die dabei verwendeten Befehle.
Verwendete Befehle nachlesen Greifen Sie jetzt beispielsweise auf das Makro zur Erstellung der Kopf- und Fußzeilen zurück, welches Sie vorher aufgezeichnet haben. Setzen Sie den Mauszeiger auf die Eigenschaft LeftHeader und drücken Sie die Taste (F1), um die Online-Hilfe aufzurufen. Die Online-Hilfe sucht nun eigenständig den Hilfetext zu dem Befehl, auf den Sie vorher den Mauszeiger gesetzt und die Taste (F1) gedrückt haben. Hier wird der Befehl beschrieben und oft in einem zusätzlichen Beispiel näher erklärt. Die in der Online-Hilfe gezeigten Beispiele können Sie übrigens für 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 wählen Sie aus dem Kontextmenü den Befehl KOPIEREN.
44
24128.book Seite 45 Mittwoch, 7. Februar 2007 12:06 12
Die Online-Hilfe
3. Wechseln Sie in das Code-Fenster und setzen Sie den Mauszeiger auf die Stelle, an der Sie das Beispiel einfügen möchten. 4. Klicken Sie mit der rechten Maustaste und wählen Sie den Befehl EINFÜGEN aus dem Kontextmenü.
Abbildung 1.18: Die Online-Hilfe von Excel
Verfügbare Objekte ansehen Um alle verfügbaren Objekte in Excel in einer übersichtlichen Form anzuzeigen, klicken Sie in der Online-Hilfe auf das Symbol START, klicken den Hyperlink EXCEL 2007-ENTWICKLERREFERENZ?. Klicken Sie danach den Hyperlink OBJEKTMODELLREFERENZ FÜR EXCEL an.
45
24128.book Seite 46 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Abbildung 1.19: Alle Excel-Objekte auf einen Blick
1.7
Weitere praktische Helfer in der Entwicklungsumgebung
In der Entwicklungsumgebung befinden sich einige interessante Features, die Sie bei der Programmierung gut gebrauchen können. Einige davon sollen nun beschrieben werden.
Die Symbolleiste Bearbeiten Die Symbolleiste BEARBEITEN enthält Funktionen, die Ihnen helfen sollen, den Programmcode schnell und sicher zu bearbeiten.
46
24128.book Seite 47 Mittwoch, 7. Februar 2007 12:06 12
Weitere praktische Helfer in der Entwicklungsumgebung
Abbildung 1.20: Die Symbolleiste Bearbeiten
Auf die Funktionen dieser Symbolleiste soll im Folgenden kurz eingegangen werden:
Eigenschaften/Methoden anzeigen Wenn Sie beispielsweise die Anweisung Application eingeben und dann direkt dahinter einen Punkt setzen, bietet Ihnen Excel für dieses Objekt alle verfügbaren Eigenschaften und Methoden an. Möchten Sie aber bereits eingegebenen Quellcode nachträglich nach verfügbaren Eigenschaften und Methoden checken, setzen Sie den Mauszeiger auf den Befehl hinter dem Punkt und klicken das Symbol EIGENSCHAFTEN/METHODEN ANZEIGEN.
Abbildung 1.21: Alle Methoden und Eigenschaften für das Objekt Application
Konstanten anzeigen Viele Befehle enthalten so genannte Konstanten, die Sie einsetzen können. So können Sie beispielsweise für eine Bildschirmmeldung über den Einsatz von Konstanten die Schaltflächentypen festlegen. Im folgenden Beispiel soll eine Warnmeldung angezeigt werden. Erfassen Sie zu diesem Zweck die folgenden Zeilen und stoppen Sie mittendrin:
47
24128.book Seite 48 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Abbildung 1.22: Konstanten für die Schaltflächen anzeigen
Klicken Sie nach der Eingabe des Kommas auf das Symbol KONSTANTEN ANZEIGEN. In einer Dropdown-Liste bekommen Sie nun die verfügbaren Schaltflächen angezeigt. Selbstverständlich können Sie auch mehrere Schaltflächen kombinieren. Das komplette Makro zum Anzeigen einer Warnmeldung mit den Symbolen KRITISCH sowie einer OK-Schaltfläche lautet: Listing 1.7: Eine benutzerdefinierte Meldung anzeigen Sub WarnmeldungAnzeigen() MsgBox "Achtung", vbCritical + vbOKOnly, "Warnung" End Sub
Abbildung 1.23: Die Symbole und Schaltflächen können nahezu beliebig kombiniert werden
QuickInfo oder Parameterinfo Mithilfe des Symbols QUICKINFO bzw. des Symbols PARAMETERINFO können Sie sich die komplette Syntax des Befehls in einem Fensterchen anzeigen lassen. Setzen Sie dazu im vorherigen Beispiel den Mauszeiger auf die Funktion MsgBox und klicken Sie das Symbol QUICKINFO auf der Symbolleiste BEARBEITEN.
48
24128.book Seite 49 Mittwoch, 7. Februar 2007 12:06 12
Weitere praktische Helfer in der Entwicklungsumgebung
Abbildung 1.24: Die komplette Syntax wird angezeigt.
Ganzes Wort Über den Einsatz dieses Symbols können Sie sich ein wenig Schreibarbeit sparen. Geben Sie beispielsweise einmal die ersten drei Buchstaben von MsgBox ein und klicken Sie danach auf das Symbol GANZES WORT oder drücken Sie die Tastenkombination (Strg) + (Leertaste). Der Befehl wird augenblicklich um die noch fehlenden Buchstaben ergänzt. Diese Funktion funktioniert aber nur, wenn schon nach den ersten Buchstaben klar wird, dass es sich hierbei nur um den Befehl Msgbox handeln kann. Diese Funktion wird demnach erst verfügbar, sobald anhand der ersten Buchstaben ein eindeutiger Befehl von Excel erkannt werden kann.
Einzug vergrößern bzw. Einzug verkleinern Mit der Funktion EINZUG VERGRÖSSERN können Sie einzelne Zeilen oder auch mehrere Zeilen blockweise nach links einrücken. Dies macht den Programmcode leichter lesbar. Analog zur vorherigen Funktion können Sie mit der Funktion EINZUG VERKLEINERN eingerückte Programmteile wieder nach links rücken und pro Klick jeweils den markierten Text um einen Tabstopp versetzen.
Haltepunkt ein/aus Wenn Sie ein Makro starten, welches einen Haltepunkt aufweist, dann stoppt es genau an diesem Haltepunkt. Auf diese Weise können Sie Programm-Zwischenstände überprüfen.
49
24128.book Seite 50 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Abbildung 1.25: Einzug vergrößern nach rechts
Setzen Sie zum Beispiel einmal einen Haltepunkt im Listing 1.2 in der 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 drücken Sie die Taste (F5), um das Makro zu starten.
Abbildung 1.26: Haltepunkt setzen
Das Makro läuft nun bis zu der Zeile mit dem gesetzten Haltepunkt und unterbricht es(sie??). Sie können über die Seitenansicht prüfen, dass momentan nur der linke und der mittlere Teil der Kopfzeile fertig gestellt wurde. Wenn Sie in der Entwicklungsumgebung noch mal die Taste (F5) drücken, wird der Code bis zum Ende ausgeführt. Möchten Sie das Makro abbrechen, dann wählen Sie aus dem Menü Ausführen den Befehl Zurücksetzen. Das Setzen und Entfernen von Haltepunkten können Sie übrigens noch schneller erledigen, indem Sie den Mauszeiger in die gewünschte Zeile setzen und die Taste (F9) drücken.
50
24128.book Seite 51 Mittwoch, 7. Februar 2007 12:06 12
Weitere praktische Helfer in der Entwicklungsumgebung
Block auskommentieren bzw. Auskommentierung des Blocks aufheben Standardmäßig können Sie einzelne Zeilen deaktivieren, indem Sie als erstes Zeichen der jeweiligen Zeile ein einfaches Apostroph eingeben. Excel quittiert diese Aktion, indem es die komplette Zeile mit der Schriftfarbe GRÜN einfärbt. Die so auskommentierten Zeilen werden nun nicht mehr abgearbeitet. Selbstverständlich ist es recht mühselig, wenn Sie ganze Blöcke, also mehrere Zeilen auf einmal, in Kommentar setzen möchten. Aus diesem Grund wurde die Funktion BLOCK AUSKOMMENTIEREN in die Symbolleiste BEARBEITEN integriert. Somit können Sie blitzschnell ganze Blöcke vorübergehend in Kommentar setzen bzw. auskommentierte Blöcke schnell wieder verfügbar machen. Gerade wenn Sie einen Code testen und dazu mehrere Varianten überprüfen möchten, empfiehlt es sich, mit dieser Funktion zu arbeiten.
Abbildung 1.27: Schnelles Auskommentieren von ganzen Codeblöcken
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« eine nicht unwichtige Sache. Befehle prägen sich so schneller und leichter ein. So könnte ein typisches Intro für ein Makro wie folgt aussehen: Listing 1.8: Ein Makro mit Dokumentation Sub KopfUndFuss() '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ' Name: KopfUndFuss
51
24128.book Seite 52 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
' Datum: 26.12.2006 ' Autor: Bernd Held ' Dieses Makro stellt die Kopf- und Fußzeile in einer ' Tabelle zusammen. '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ With ActiveSheet.PageSetup .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 können, kann schnell einmal der Überblick verloren gehen. Sie haben daher die Möglichkeit, Lesezeichen zu setzen und diese blitzschnell bei Bedarf anzuspringen.
Abbildung 1.28: Lesezeichen setzen
52
24128.book Seite 53 Mittwoch, 7. Februar 2007 12:06 12
Weitere praktische Helfer in der Entwicklungsumgebung
Ein Lesezeichen erkennen Sie daran, dass ein hellblaues abgerundetes Viereck an der linken Leiste angezeigt wird. Über die Symbole NÄCHSTES LESEZEICHEN bzw. VORHERIGES LESEZEICHEN können Sie von Lesezeichen zu Lesezeichen springen. Mit einem Klick auf das Symbol ALLE LESEZEICHEN LÖSCHEN entfernen Sie alle gesetzten Lesezeichen.
Suchen & Ersetzen Genau wie auch in anderen Programmen gibt es in der Entwicklungsumgebung eine Möglichkeit, Textteile zu finden und zu ersetzen. Dabei haben Sie die Möglichkeit, bestimmte Texte bzw. Befehle nicht nur im aktuellen Modul, sondern auch in allen Modulen des Projekts zu finden. Aufgerufen werden kann diese Funktion über drei Wege: 쐽
Klicken Sie auf das Symbol SUCHEN in der Symbolleiste VOREINSTELLUNG.
쐽
Alternativ dazu können Sie die Tastenkombination (Strg) + (F) drücken.
쐽
Wählen Sie aus dem Menü BEARBEITEN den Befehl SUCHEN aus.
Bei allen drei Varianten wird das Dialogfeld SUCHEN angezeigt.
Abbildung 1.29: Befehle im Quellcode suchen
Im Feld SUCHEN NACH geben Sie den Befehl bzw. die Textfolge ein, nach der Sie suchen möchten. 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 Möglichkeit, Ihre Suche über Ihr aktuelles Modul hinaus auszudehnen. Standardmäßig unterscheidet Excel nicht zwischen Groß- und Kleinschreibung. Ist dies erwünscht, müssen Sie das entsprechende Kontrollkästchen aktivieren. Die Suchrichtung legen Sie im gleichnamigen Dropdown-Feld fest. Standardmäßig wird in beide Richtungen gesucht, also abwärts sowie aufwärts. Mit einem Klick auf die Schaltfläche ERSETZEN wird das folgende Dialogfeld angezeigt.
53
24128.book Seite 54 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Abbildung 1.30: Befehle suchen und ersetzen
Die Anweisung Chr(13) und die Konstante vbLF bewirken dieselbe Aktion. Es wird bei beiden Anweisungen eine neue Zeile begonnen. Gerade bei mehrzeiligen Meldungsfenstern kommen diese beiden Möglichkeiten oft zum Einsatz. Möchten Sie einen Text durch einen anderen ersetzen, müssen Sie noch einen Text im Feld ERSETZEN DURCH angeben. Mit einem Klick auf die Schaltfläche 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 möglichst den gesuchten Text vollständig an. Es kann zu katastrophalen Resultaten führen, wenn Sie einzelne Texteile 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 müssen, um Ihre Makros wieder zum Laufen zu bringen. Das ist zum Teil ein fast unmögliches Unterfangen und kann unter Umständen stundenlang dauern.
Schnelles Arbeiten über Tastenkombinationen Wohl die wenigsten VBA-Entwickler werden ihre Makros immer neu schreiben. Mit dem Symbol KOPIEREN aus der Symbolleiste VOREINSTELLUNG kopieren Sie Makros oder einzelne Befehle in die Zwischenablage. Schneller geht es allerdings, wenn Sie das Makro bzw. die Zeile(n) mit der Maus markieren und die Tastenkombination (Strg) + (C) drücken.
54
24128.book Seite 55 Mittwoch, 7. Februar 2007 12:06 12
Weitere praktische Helfer in der Entwicklungsumgebung
Setzen Sie die Einfügemarke an die Einfügestelle und klicken Sie in der Symbolleiste VOREINSTELLUNG auf das Symbol EINFÜGEN. Alternativ dazu können Sie auch die Tastenkombination (Strg) + (V) drücken. Diese beiden Tastenkombinationen für das Kopieren und Einfügen von Texten dürften wohl zu den am häufigsten eingesetzten Tastenkombinationen bei Entwicklern zählen. Entnehmen Sie weitere Tastenkombinationen fürs schnellere Arbeiten der nächsten Tabelle: Tastenkombination
Beschreibung
(F7)
Code-Fenster anzeigen
(F2)
Objektkatalog anzeigen
(Strg) + (F)
Suchen
(Strg) + (H)
Ersetzen
(F3)
Weitersuchen
(Umschalt) + (F3)
Vorheriges suchen
(Strg) + (¼)
Nächste Prozedur
(Strg) + (½)
Vorherige Prozedur
(Umschalt) + (F2)
Definition anzeigen
(Strg) + (Bild_¼)
Einen Bildschirm nach unten
(Strg) + (Bild_½)
Einen Bildschirm nach oben
(Strg) + (Umschalt) + (F2)
Zur letzten Position wechseln
(Strg) + (Pos1)
Anfang des Moduls
(Strg) + (Ende)
Ende des Moduls
(Strg) + (Æ)
Ein Wort nach rechts
(Strg) + (æ)
Ein Wort nach links
Tabelle 1.1: Die wichtigsten Tastenkombinationen für den Entwickler
55
24128.book Seite 56 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Tastenkombination
Beschreibung
(Ende)
Zum Zeilenende wechseln
(Pos1)
Zum Zeilenanfang wechseln
(Strg) + (Z)
Letzten Befehl rückgängig machen
(Strg) + (C)
Code kopieren
(Strg) + (X)
Code ausschneiden
(Strg) + (V)
Code einfügen
(Strg) + (Y)
Aktuelle Zeile löschen
(Strg) + (Entf)
Bis zum Wortende löschen
(Tab)
Einzug vergrößern
(Umschalt) + (Tab)
Einzug verkleinern
(Strg) + (Umschalt) + (F9)
Alle Haltepunkte löschen
(Umschalt) + (F10)
Kontextmenü anzeigen
(Strg) + (P)
Modul drucken
(Strg) + (E)
Modul/Formular exportieren
(Strg) + (S)
Modul speichern
Tabelle 1.1: Die wichtigsten Tastenkombinationen für den Entwickler
1.8
Entwicklungsumgebung einstellen
In der Entwicklungsumgebung von Excel haben Sie die Möglichkeit, den Visual Basic-Editor nach Ihren eigenen Wünschen anzupassen. Dazu wählen Sie in der Entwicklungsumgebung aus dem Menü EXTRAS den Befehl OPTIONEN.
56
24128.book Seite 57 Mittwoch, 7. Februar 2007 12:06 12
Entwicklungsumgebung einstellen
Abbildung 1.31: Editor einstellen
Editoreinstellungen anpassen Im Gruppenfeld CODE-EINSTELLUNGEN finden Sie die folgenden Einstellungsmöglichkeiten: 쐽
AUTOMATISCHE SYNTAXÜBERPRÜFUNG: Mit dieser Einstellung sorgen Sie dafür, dass Ihr Editor nach der Eingabe einer Codezeile automatisch eine Syntaxprüfung vornimmt.
쐽
VARIABLENDEKLARATION ERFORDERLICH: Wenn Sie diese Option aktivieren, wird die Anweisung Option Explicit den allgemeinen Deklarationen in allen neuen Modulen hinzugefügt. Damit müssen 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 ausgeführt, in dem nicht alle verwendeten Variablen definiert sind.
쐽
ELEMENTE AUTOMATISCH AUFLISTEN: Zeigt eine Liste mit den Informationen an, die die Anweisung an der aktuellen Einfügemarke logisch vervollständigen würden.
쐽
AUTOMATISCHE QUICKINFO: Wird diese Option aktiviert, werden bei der Eingabe eines Befehls die dazugehörigen Funktionen bzw. Parameter angezeigt.
57
24128.book Seite 58 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
쐽
AUTOMATISCHE DATEN-TIPPS: Diese Option ist lediglich im Haltemodus verfügbar und zeigt den Wert der Variablen an, auf der der Mauszeiger sich gerade befindet.
쐽
AUTOMATISCH EINZUG VERGRÖSSERN: Zur besseren Übersichtlichkeit sollten Sie sich angewöhnen, Ihren Quellcode einzurücken. Die dafür zur Verfügung gestellte Option ermöglicht, für 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.
Im Gruppenfeld FENSTEREINSTELLUNGEN können 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, können Sie die Darstellung Ihres Quellcodes anpassen.
Abbildung 1.32: Das Editierformat festlegen
58
24128.book Seite 59 Mittwoch, 7. Februar 2007 12:06 12
Entwicklungsumgebung einstellen
Im Listenfeld CODE-FARBEN werden die Textelemente angezeigt, für die die Farben angepasst werden können. Darunter befinden sich drei Dropdown-Felder, in denen Sie das Format für den Vorder- bzw. Hintergrund der einzelnen Elemente sowie das Kennzeichen in der Kennzeichenleiste bestimmen können. Darüber hinaus haben Sie die Möglichkeit, die Schriftart sowie deren Größe zu bestimmen. Die Kennzeichenleiste kommt dann zur Geltung, wenn Sie häufiger mit Haltepunkten oder Lesezeichen arbeiten.
Allgemeine Einstellungen vornehmen Wechseln Sie nun zur Registerkarte ALLGEMEIN. Dort werden die Einstellungen, die Fehlerbehandlung und die Kompilierungseinstellungen für das aktuelle Visual Basic-Projekt festgelegt.
Abbildung 1.33: Allgemeine Einstellungen vornehmen
Im Gruppenfeld EINSTELLUNGEN FÜR FORMULAR-RASTER können Sie die Darstellungsart des Formulars beim Bearbeiten festlegen. Sie können ein Raster anzeigen, die Rastereinheiten sowie die Rasterung selbst für das Formular festlegen und eingefügte Steuerelemente automatisch am Raster ausrichten lassen. Die Einstellung QUICKINFO ANZEIGEN bezieht sich lediglich auf die QuickInfos für die Symbolschaltflächen und kann deaktiviert werden, wenn Sie etwas mehr Übung haben und die Symbole in den Symbolleisten kennen.
59
24128.book Seite 60 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Aktivieren Sie das Kontrollkästchen 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 für ein laufendes Projekt zurückgesetzt werden. 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 wurden. Sie haben dabei drei Möglichkeiten: 쐽
BEI JEDEM FEHLER: Bei jedem Fehler wird für das Projekt der Haltemodus aktiviert, unabhängig 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 läuft, wird der Fehler behandelt, ohne den Haltemodus zu aktivieren. Sollte keine Fehlerbehandlungsroutine vorhanden sein, bewirkt der Fehler, dass der Haltemodus für das Projekt aktiviert wird.
Im Gruppenfeld KOMPILIEREN legen Sie fest, ob ein Projekt vor dem Start vollständig 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. 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 beibehält. Wählen Sie die Fenster aus, die verankerbar sein sollen, und deaktivieren Sie die Kontrollkästchen für die anderen Fenster.
60
24128.book Seite 61 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Abbildung 1.34: Fenster verankern
1.9
Datentypen, Variablen und Konstanten
Gerade haben Sie sich mit der Entwicklungsumgebung von Excel vertraut gemacht. Sie haben erste Makros mithilfe des Makrorekorders aufgezeichnet, eigene Makros erfasst und gestartet. Die Themen nun: 쐽
Was sind Variablen?
쐽
Variablen deklarieren
쐽
Variablendeklaration erzwingen
쐽
Vorsicht, Falle
쐽
Variablentypen kennen lernen
쐽
Objektvariablen einsetzen
쐽
Konstanten einsetzen
쐽
Konstanten für die Datumsformatierung
61
24128.book Seite 62 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Was sind Variablen? Bevor Sie die einzelnen Variablen kennen lernen, soll ganz bewusst zu Anfang die Frage gestellt werden, was sich hinter dem Begriff Variablen verbirgt und warum diese eingesetzt werden müssen. Variablen werden u.a. dazu benötigt, Daten zwischenzuspeichern. Wenn Sie beispielsweise daran denken, Daten aus einer Tabelle zu lesen, um diese zu bearbeiten, und dann wieder in eine andere Tabelle zurückzuschreiben, dann ist der Einsatz ohne Variablen nur über die Zwischenablage recht unsicher. Man könnte Variablen beispielsweise mit einem Schokoladen-Adventskalender vergleichen. Dieser Kalender enthält 24 Türchen (Variablen), die mit Schokolade (Daten) gefüllt sind. Der erste Schritt, also die Türchen mit Schokolade zu füllen (Variablen füllen), ist demnach schon getan. Während der Lebenszeit eines Adventkalenders ist die Schokolade sicher in den Türchen verstaut, d.h. ohne Ihr Zutun bleiben diese Variablen an ihrem sicheren Ort. Wenn Sie sich entschließen, vorab ein Türchen zu öffnen, um zu sehen, welches Schokoladensymbol dahinter verborgen ist, prüfen Sie den Inhalt der »Variablen«. Indem Sie die Schokolade essen, wird der Inhalt des Türchens entfernt (Variablen löschen). Aus diesem Schokoladen-Beispiel wird klar, dass Sie mit Variablen dauerhaft arbeiten können, d.h. Sie können jederzeit darauf zugreifen, diese abfragen oder verändern und zum Schluss ausgeben. Dabei wird für die Variablen bei ihrer Definition ein bestimmter Bereich im Arbeitsspeicher reserviert. Auf diesen eindeutigen Teil des Arbeitsspeichers können Sie über den Namen der Variablen immer wieder zugreifen. Nach dem Ablauf eines Makros werden die Variablen standardmäßig gelöscht, sofern diese nicht global definiert wurden. Aber dazu später mehr.
Variablen deklarieren Variablen werden immer zu Beginn eines Makros deklariert, also nach der Anweisung Sub. In diesem Fall spricht man von lokalen Variablen. Diese Variablen können nur in dem Makro verwendet werden, in dem sie deklariert wurden. Nachdem ein Makro durchgelaufen ist, wird diese Variable wieder aus dem Speicher gelöscht. Von globalen Variablen spricht man, wenn Sie diese allgemein gültig, also in mehreren Makros verwenden möchten. Dann muss die Variablendeklaration vor der Sub-Anweisung stattfinden.
62
24128.book Seite 63 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Globale Variablen können gleich für mehrere Makros verwendet werden. Diese werden nach dem Ende eines Makros auch nicht gelöscht und behalten ihren aktuellen Wert bei. Es gibt Beispiele, in denen diese Vorgehensweise sinnvoll ist. In den meisten Fällen sollten globale Variablen aber weitestgehend 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 wählen können. Danach geben Sie mit dem Schlüsselwort As an, welchen Datentyp die Variable erhalten soll. Wenn Sie Variablen einsetzen, müssen Sie sich dabei an bestimmte Konventionen für deren Benennung halten:
Regeln für Variablen 쐽
Das erste Zeichen muss aus einem Buchstaben bestehen. Als folgende Zeichen können Sie Buchstaben, Zahlen und einige Sonderzeichen verwenden.
쐽
Sie dürfen keine Leerzeichen in einem Variablennamen verwenden. Wenn Sie einzelne Wörter trennen möchten, verwenden Sie dazu den Unterstrich, wie z.B. Dim Kosten_Juli as Currency.
쐽
Sonderzeichen wie #, %, &, ! oder ? sind nicht erlaubt.
Die verfügbaren Datentypen Die wichtigsten Variablentypen sind zum einen die Variable vom Typ String und zum anderen die Integer-Variable. In einer Variablen vom Typ String können Sie Texte bzw. Zeichen zwischenspeichern, manipulieren und ausgeben. Mit einer Variablen vom Typ Integer führen Sie mathematische Berechnungen aus. Integer-Variablen werden oft als Zähler in Schleifen verwendet, die Sie im weiteren Verlauf des Buches noch kennen lernen werden. Entnehmen Sie der nachfolgenden Tabelle die gängigsten Variablentypen und deren Speicherbedarf:
63
24128.book Seite 64 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Variablentyp
Wertebereich/Speicherbedarf
Byte
Ganze Zahlen zwischen 0 und 255 (1Byte)
Boolean
Wahrheitswert, entweder True oder False (2 Byte)
Currency
Währungs-Datentyp: Festkommazahlen mit 15 Stellen vor und 4 Stellen nach dem Komma (8 Byte)
Date
Datums- und Zeit-Datentyp (8 Byte)
Decimal
Dezimalzahlen (14 Bytes)
Double
Fließkommazahlen mit einer Genauigkeit von 16 Stellen hinterm Komma (8 Bytes)
Integer
Ganze Zahlen zwischen –32.768 und +32.767 (2 Byte)
Long
Ganze Zahlen im Wertebereich von –2.147.483.648 und +2.147.483.647 (4 Byte)
Object
Datentyp gibt einen Verweis auf ein Objekt wieder (4 Byte)
Single
Fließkommazahlen mit einer Genauigkeit von 8 Stellen hinterm Komma (4 Byte)
String
Der Datentyp für alle Texte (10 Byte)
Variant
Standarddatentyp, wird automatisch gewählt, wenn kein anderer Datentyp definiert ist (16 Byte)
Tabelle 1.2: Die Datentypen für die Programmierung
Anbei ein paar typische korrekte Deklarationen von Variablen: Dim Dim Dim Dim
sngMwSt as Single intKalenderWoche as Integer strMeldung as String CurGehalt as Currency
Den Gebrauch von Variablen werden Sie später noch zur Genüge üben. Wenn Sie nach und nach geübter in der Programmierung werden, möchten Sie möglicherweise die Variablennamen nicht mehr ganz so lang schreiben und auch bei der Datentyp-Anweisung weniger Schreibarbeit haben. Sehen Sie sich dazu einmal die folgende Tabelle an:
64
24128.book Seite 65 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Ausführlich
Kurzform
Dim intZaehler as Integer
Dim Z%
Dim lngZählerGross as Long
Dim ZzGr&
Dim CurBetrag as Currency
Dim Bg@
Dim strMeldung as String
Dim Meld$
Tabelle 1.3: Variablen noch kürzer definieren
Für jeden in der Tabelle aufgeführten Datentyp gibt es ein Kurzzeichen, welches Sie einsetzen können, um den Programmiercode zu verkürzen. Sie sollten aber zumindest am Anfang bei den sprechenden Variablenbenennungen bleiben.
Variablendeklaration erzwingen Sie können die Entwicklungsumgebung von Excel so einstellen, dass jede Variable vor deren ersten Verwendung deklariert werden muss. Vorher läuft 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. Wählen Sie aus dem Menü EXTRAS den Befehl OPTIONEN. 3. Wechseln Sie im Dialogfeld OPTIONEN auf die Registerkarte EDITOR. 4. Aktivieren Sie das Kontrollkästchen VARIABLENDEKLARATION ERFORDERLICH. 5. Bestätigen Sie Ihre Einstellung mit OK. Was bewirkt diese Einstellung aber genau? Immer wenn Sie ein neues Modul einfügen, wird automatisch die Anweisung Option Explicit in die erste Zeile Ihres Modulblattes eingetragen. Diese Anweisung können Sie selbstverständlich auch von Hand erfassen. Sie bedeutet nichts anderes, als dass verwendete Variablen im Code vor deren Aufruf deklariert werden müssen. Solange verwendete Variablen im Code nicht ordnungsgemäß deklariert wurden, kann kein Makro laufen. Ist eine Variable dem Editor unbekannt, meldet der Editor es Ihnen.
65
24128.book Seite 66 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Abbildung 1.35: Variable wurde noch nicht definiert
Sollten Sie so eine Meldung nach dem Start eines Makros erhalten, dann markiert Excel die Variable im Quellcode und färbt die erste Zeile des Makros mit der Hintergrundfarbe Gelb. Wählen Sie in einem solchen Fall aus dem Menü AUSFÜHREN den Befehl ZURÜCKSETZEN, deklarieren Sie die Variable und starten Sie 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 int1, int2, int3 As Integer
Dazu ist zu sagen, dass lediglich die letzte Variable dem Typ Integer 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 benötigt, wogegen der Datentyp Integer gerade mal 2 Byte beansprucht. Sie können sich sicher vorstellen, dass es eine gewaltige Verschwendung von wertvollem Speicherplatz ist, wenn Sie Ihre Variablen falsch deklarieren. Richtig wäre hier: Dim int1 As Integer Dim int2 As Integer Dim int3 As Integer
oder Dim int1 As Integer, int2 As Integer, int3 As Integer
66
24128.book Seite 67 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Einen weiteren Vorteil der Deklaration von Variablen möchte 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 für eine Variable kein Datentyp angegeben, wird automatisch der Datentyp Variant verwendet. Wegen seines hohen Speicherbedarfs von 16 Byte ist er aber nicht zu empfehlen. Nicht so gut sind Variablen wie I, l, 1. Der Großbuchstabe »I«, der Kleinbuchstabe »l« sowie die Zahl »1« sehen nahezu identisch aus und werden daher in der Praxis leicht verwechselt. Verwenden Sie deshalb diese Zeichen nicht einzeln. Die Entwicklungsumgebung von Excel bietet Ihnen eine hilfreiche Möglichkeit, zu prüfen, wo verwendete Variablen definiert sind. Klicken Sie die zu überprüfende Variable mit der rechten Maustaste an und wählen 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 Standardmäßig wird der Variableninhalt nach jedem Makroende gelöscht. Sie haben jedoch auch die Möglichkeit, Variablen so zu definieren, dass deren »Haltbarkeit« nach jedem Makroende erhalten bleibt. Alle folgenden Listings finden Sie auf der CD-ROM im Verzeichnis Kap01 unter dem Namen Syntax.xlsm. Im folgenden Beispiel können Sie ein Makro mehrere Male hintereinander aufrufen. Das Makro selbst zählt die Aufrufe und speichert diese in der Variablen Aufrufe. Listing 1.9: Variableninhalt bleibt nach Makroende erhalten Sub VariablenInhaltBleibtBestehen() Static lngAufrufe As Long
67
24128.book Seite 68 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
lngAufrufe = lngAufrufe + 1 MsgBox "Makro wurde " & lngAufrufe & " Mal ausgeführt!" End Sub
Wenn Sie das letzte Makro mehrmals hintereinander aufrufen, dann werden Sie sehen, dass der Inhalt der Variablen Aufrufe auch nach jedem Makrodurchlauf erhalten bleibt.
Abbildung 1.36: Makro mehrmalig aufrufen
Öffentliche Variablen In der Entwicklungsumgebung von Excel können Sie mehrere Module anlegen. Um Variablen modulübergreifend abfragen oder ändern zu können, müssen Sie eine solche Variable als öffentlich deklarieren. Diese Variablen werden mit der Anweisung Public deklariert. Damit haben Sie die Möglichkeit, 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. Fügen Sie für diese Aufgabe zwei neue Modulblätter (MODUL2 und MODUL3) ein und erfassen Sie folgende Makros:
Abbildung 1.37: Der Einsatz einer öffentlichen Variablen
68
24128.book Seite 69 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Deklarieren Sie in MODUL2 die öffentliche Variable. Danach füllen 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 Möchten Sie die Gültigkeit einer Variablen für alle Makros auf ein bestimmtes Modul beschränken, z.B. MODUL1, dann müssen 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 geschützt werden. Für diesen Zweck speichern Sie das Kennwort in einer privaten Variablen. Es wird dadurch nicht möglich, das Kennwort über Makros aus anderen Modulblättern auszulesen.
Abbildung 1.38: Kennwort verwalten
Deklarieren Sie zu Beginn im Modulblatt MODUL3 eine private Variable mit dem Namen StrPassw. Im Makro TabelleSchützen geben Sie das Kennwort bekannt und wenden die Methode Protect an, um die aktive Tabelle zu schützen. Das Makro TabelleEntsperren hebt den Schutz der aktiven Tabelle auf, indem es die Methode Unprotect einsetzt und dabei das Kennwort übergibt. Von einem anderen Modulblatt haben Sie in diesem Beispiel keine Chance, auf die Variable StrPassw zuzugreifen.
69
24128.book Seite 70 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
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 Verfügung stehen, können Sie ermitteln, wenn Sie in der Entwicklungsumgebung den Objektkatalog aufrufen. Dies geht am schnellsten, indem Sie die Taste (F2) drücken.
Abbildung 1.39: Den Objektkatalog zur Hilfe einsetzen
Alternativ dazu können Sie einfach mal beginnen mit der Deklaration einer Objektvariablen, indem Sie beispielsweise die Anweisung Dim rangBereich As eingeben und dann die (Leertaste)-Taste drücken. Augenblicklich wird Ihnen ein Kontextmenü angeboten, welches die zur Verfügung 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 können.
70
24128.book Seite 71 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Abbildung 1.40: Das Kontextmenü bietet Ihnen alle zur Verfügung stehenden Objekte an.
Einen Bereich definieren Im folgenden Beispiel werden Sie den Bereich A1:D10 aus Tabelle1 festlegen und danach den Bereich einfärben. Dazu ist folgendes Makro notwendig: Listing 1.10: Einen Bereich definieren und einfärben Sub BereichFestlegen() Dim rngBereich As Range Set rngBereich = Tabelle1.Range("A1:D10") rngBereich.Interior.ColorIndex = 4 End Sub
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. Geben Sie bei der Range-Variablen den Bereich sowie die Tabelle an, auf der sich der Bereich befindet. Färben Sie danach den Hintergrund des Zellenbereichs, indem Sie dem Objekt Interior (= Hintergrund) die Farbnummer 4 (= Grün) mit Hilfe der Eigenschaft ColorIndex zuweisen.
71
24128.book Seite 72 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Abbildung 1.41: Der Bereich wurde festgelegt und eingefärbt
Schaltfläche einfügen Im nächsten Beispiel soll in eine Tabelle eine neue Schaltfläche an einer bestimmten Position eingefügt und beschriftet werden. Danach soll ein bereits erfasstes Makro der Schaltfläche zugewiesen werden. Nach dem Klicken dieser Schaltfläche soll dieses Makro ausgeführt werden. Listing 1.11: Eine Schaltfläche einfügen Sub SchaltflächeIntegrieren() Dim Schaltfläche As Button Set Schaltfläche = _ Tabelle1.Buttons.Add(10, 20, 100, 50) With Schaltfläche .Caption = "Anwendung beenden" .OnAction = "ExcelBeenden" End With Set Schaltfläche = Nothing End Sub
72
24128.book Seite 73 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Button. Danach fügen Sie eine Schaltfläche ein, indem Sie die Methode Add einsetzen. Die vier Argumente in der Klammer stehen für die genaue Einfügeposition der Schaltfläche in der Tabelle. Dabei ergeben die ersten beiden Argumente den linken, oberen Punkt (in Millimetern) der Einfügeposition in der Tabelle. Das dritte Argument steht für die Breite, das vierte Argument für die Höhe der einzufügenden Schaltfläche. Setzen Sie danach die Anweisung With ein, um sich ein wenig Schreibarbeit zu ersparen. Über die Eigenschaft Caption legen Sie die Beschriftung der Schaltfläche fest. Mithilfe der Eigenschaft OnAction legen Sie den Namen des Makros fest, das ausgeführt werden soll, wenn diese Schaltfläche angeklickt wird. Vergessen Sie 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 Schaltfläche = Nothing einsetzen.
Abbildung 1.42: Automatisch eine Schaltfläche einfügen
Was nun noch fehlt, ist das Makro ExcelBeenden, welches Sie bei der Eigenschaft OnAction angegeben haben.
73
24128.book Seite 74 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Listing 1.12: Excel ohne Rückfrage beenden Sub ExcelBeenden() Application.DisplayAlerts = False Application.Quit End Sub
Mithilfe der Eigenschaft DisplayAlerts können Sie die Standardmeldungen von Excel, wie beispielsweise die Abfrage vor dem Beenden von Excel, ob die Änderungen gespeichert werden sollen, unterdrücken. Indem Sie die Methode Quit einsetzen, beenden Sie Microsoft Excel.
Diagramm exportieren Wenn Sie Diagramme in Excel erstellen, dann werden diese Diagramme als Chart-Objekt in VBA angesprochen. Diagramme können Sie übrigens auch in das GIF-Format exportieren. In der folgenden Lösung haben Sie eine Datentabelle und ein integriertes Diagramm vorliegen. Orientieren Sie sich dabei an der folgenden Abbildung:
Abbildung 1.43: Die Ausgangsbasis: eine Datentabelle und ein integriertes Diagramm
74
24128.book Seite 75 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
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 = Tabelle3.ChartObjects(1).Chart Diagramm.Export Filename:="c:\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 den internen Codenamen der Tabelle geben Sie den Namen der Tabelle exakt an. Dieser interne Tabellenname ist unempfindlich, wenn der »normale« Blattname in der Excel-Oberfläche geändert wird. Im Auflistungsobjekt ChartObject sind alle Diagrammobjekte der aktiven Tabelle verzeichnet. Über den Index können Sie ein Diagrammobjekt ansprechen. Der Index 1 steht für das zuerst eingefügte 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 Sie dabei den Namen der zu erzeugenden Exportdatei inklusive des Verzeichnisses an. Im Argument FilterName geben Sie über die Endung der Grafikdatei das gewünschte Grafikformat an. Mit dieser Endung ist der sprachenunabhängige 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 enthält keinerlei Verbindung mehr zu den Daten der Ursprungstabelle. Das Diagramm wurde auf diese Art und Weise ausgelagert und »eingefroren«.
75
24128.book Seite 76 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Abbildung 1.44: Das Diagramm wurde in eine Grafikdatei exportiert
Textdatei als Symbol einfügen In der folgenden Aufgabe kommen Sie mit dem Objekt OLEObject in Berührung. Unter einem OLEObject versteht man Steuerelemente oder auch eingebettete Objekte wie Grafiken. Erstellen Sie als kleine Vorarbeit eine Textdatei mithilfe des Editors des WindowsZubehörs und geben Sie ein paar beliebige Daten ein. Speichern Sie diese Datei im Verzeichnis C:\ unter dem Namen susi.txt. Ihre Aufgabe besteht nun darin, diese Textdatei in eine Excel-Tabelle als Symbol einzufügen. Der Quellcode für diese Aufgabenstellung lautet: Listing 1.14: Textdatei als Symbol in eine Tabelle einfügen Sub TextDateiAlsSymbolEinfügen() Dim TextDatei As OLEObject Set TextDatei = Tabelle4.OLEObjects.Add( _ Filename:="c:\susi.txt", _ Link:=False, DisplayAsIcon:=False) Set TextDatei = Nothing End Sub
76
24128.book Seite 77 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Definieren Sie eine Objektvariable vom Typ OLEObject. Wechseln Sie jetzt auf die gewünschte Tabelle, in die Sie das Symbol einfügen möchten. Danach geben Sie über die Anweisung Set bekannt, wo sich die Textdatei auf Ihrer Festplatte befindet und wie diese heißt. Über die Methode Add fügen 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 verknüpft wird. Indem Sie das Argument DisplayAsIcon mit dem Wert True versehen, wird das OLE-Objekt als Symbol in der Tabelle angezeigt. Nach dem Einfügen des OLE-Objektes sollten Sie die Speicherreservierung durch die Objektvariable wieder freigeben.
Abbildung 1.45: Textdatei wurde in Excel-Tabelle als Symbol eingefügt.
Mit einem Doppelklick auf das Textblock-Symbol wird die Textdatei geöffnet.
Grafik einfügen Im nächsten Beispiel wird eine Grafik in eine Tabelle eingefügt. Auch für diesen Zweck benötigen Sie eine Objektvariable, dieses Mal vom Typ Picture. Fügen Sie jetzt die Datei Winlogo.gif aus dem Verzeichnis C:\Windows\ in eine Tabelle ein, indem Sie das folgende Makro starten:
77
24128.book Seite 78 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Listing 1.15: Eine Grafik wird in die Tabelle eingefügt Sub BildEinfügen() Dim Pic As Picture Set Pic = Tabelle4.Pictures.Insert _ ("c:\Windows\Kaffeetasse.bmp") ActiveWindow.DisplayGridlines = False Set Pic = Nothing End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Picture. Geben Sie danach über die Anweisung Set bekannt, dass die Grafik in Tabelle4 mithilfe der Methode Insert eingefügt werden soll. Geben Sie bei dieser Methode genau an, wie die Grafkdatei heißt und wo diese gespeichert ist. Setzen Sie die Eigenschaft DisplayGridLines, die Sie gestern ja bereits kennen gelernt haben, auf den Wert False, um die Gitternetzlinien für diese Tabelle auszublenden. Heben Sie am Ende des Makros den Objektverweis auf, um den reservierten Speicher wieder freizugeben.
Abbildung 1.46: Bild in Tabelle einfügen
78
24128.book Seite 79 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Word starten und beenden VBA können Sie Office-weit einsetzen, d.h. Sie können beispielsweise von Excel aus eine Word-Sitzung starten, ein neues Dokument anlegen, etwas dort hineinschreiben, das Dokument speichern und am Ende die Word-Sitzung wieder beenden. 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 anschließend die Word-Sitzung wieder beendet. Das Makro für diese Aufgabe sieht wie folgt aus: Listing 1.16: 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 "c:\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 geöffnet. Indem Sie die Eigenschaft Visible auf den Wert True setzen, sehen Sie auch was davon. Möchten Sie diesen Vorgang komplett im Hintergrund durchführen, dann setzen Sie diese Eigenschaft auf den Wert False. Wenden Sie die Methode Add an, um dem Auflistungsobjekt Documents ein neues Dokument hinzuzufügen. Im Auflistungsobjekt Documents sind übrigens alle momentan geöffneten Word-Dokumente verzeichnet. Über die Eigenschaft TypeText können Sie dem Dokument einen Text hinzufügen. Dabei fügen Sie das
79
24128.book Seite 80 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
aktuelle Datum über die Standardfunktion Date sowie den Benutzernamen des aktuellen Anwenders mithilfe der Eigenschaft Username hinzu.
Abbildung 1.47: Ein Word-Dokument anlegen und speichern
Nun wenden Sie darauf die Methode SaveAs an, um das Dokument unter dem angegebenen Namen zu speichern. Über die Methode Quit können Sie die WordSitzung wieder beenden. Vergessen Sie nicht, den Objektverweis über die Anweisung Set WdObjekt = Nothing wieder aufzuheben.
Variableninhalt in Zwischenablage befördern Im folgenden Beispiel werden Sie eine Variable mit einem Zelleninhalt füllen. Diesen Variableninhalt befördern Sie dann direkt in die Zwischenablage. Sehen Sie sich zuerst einmal folgende Ausgangssituation an. Um eine Schaltfläche in einer Tabelle einzufügen, müssen Sie zuerst die Schnellzugriffsleiste anpassen. 1. Klicken Sie mit der rechten Maustaste auf den Ribbon START. 2. Wählen Sie aus dem Kontextmenü den Befehl SYMBOLLEISTE FÜR DEN SCHNELLZUGRIFF ANPASSEN. 3. Markieren Sie das Register ANPASSEN.
80
24128.book Seite 81 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Abbildung 1.48: Der Text aus A1 soll ohne Kopieraktion in die Zwischenablage
Abbildung 1.49: Die Schnellzugriffsleiste anpassen
4. Wählen Sie aus dem Dropdown Befehle auswählen den Befehl Steuerelemente einfügen. 5. Klicken Sie die Schaltfläche Hinzufügen. 6. Beenden Sie die Anpassung mit OK.
81
24128.book Seite 82 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
7. Klicken Sie in der Schnellzugriffsleiste das Symbol Steuerelemente einfügen. 8. Klicken Sie in der Leiste das Symbol Schaltfläche (Formularsteuerelement). 9. Ziehen Sie die Schaltfläche auf der Tabelle auf.
Abbildung 1.50: Makro zuweisen
10. Weisen Sie das Makro TextInZwischenablageEinfügen zu. 11. Bestätigen Sie mit OK. 12. Beschriften Sie die Schaltfläche. Der Quellcode für die Aufgabenstellung sieht wie folgt aus: Listing 1.17: Den Inhalt einer Variablen in die Zwischenablage bringen Dim ZwischenAblage As DataObject Sub TextInZwischenablageEinfügen() Dim Text As String Set ZwischenAblage = New DataObject Text = Tabelle5.Range("A1").Value
82
24128.book Seite 83 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
With ZwischenAblage .SetText Text .PutInClipboard End With Set Zwischenablage = Nothing End Sub
Bevor Sie das Makro starten, binden Sie in der Entwicklungsumgebung unter dem Befehl EXTRAS/VERWEISE die Bibliothek MICROSOFT FORMS 2.0 OBJECT LIBRARY ein. Deklarieren Sie danach eine globale Variable vom Typ DataObject. Über die Anweisung Set New DataObject gewinnen Sie Zugriff auf die Zwischenablage. Füllen 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 dafür, dass der Inhalt der Variablen Zwischenablage in die Zwischenablage eingefügt wird. Kontrollieren können Sie dieses Makro, indem Sie es starten, danach den Mauszeiger auf eine beliebige Zelle setzen und die Tastenkombination (Strg) + (V) drücken. Der Inhalt der Zelle muss dann lauten: »Franz jagt im komplett verwahrlosten Taxi quer durch Bayern.« Ähnlich wie gerade eben speichern Sie nun den augenblicklichen Inhalt der Zwischenablage in einer Variablen und geben den Inhalt der Variablen in Zelle B3 der TABELLE5 aus. Der Code hierfür lautet: Listing 1.18: Den Inhalt der Zwischenablage in einer Zelle ausgeben Sub InhaltZwischenablageErmitteln() Set Zwischenablage = New DataObject Zwischenablage.GetFromClipboard Tabelle5.Range("B3").Value = Zwischenablage.GetText Set Zwischenablage = Nothing End Sub
83
24128.book Seite 84 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Über die Methode GetFromClipBoard transferien Sie Daten aus der Zwischenablage in die Objektvariable Zwischenablage. Mithilfe der Methode GetText können Sie den Inhalt der Objektvariablen Zwischenablage ermitteln. Testen Sie beide Makros noch einmal, indem Sie zuerst das Makro aus Listing 1.19 und gleich im Anschluss das Makro aus Listing 1.20 starten.
Abbildung 1.51: Zwischenablage füllen und abfragen
Add-Ins-Prüfung Zu Excel gibt es einige Add-Ins, die Zusatzfunktionen enthalten. Damit diese Funktionen eingesetzt werden können, muss das entsprechende Add-In, welches die gewünschte Funktion enthält, über den Add-Ins-Manager eingebunden werden. Mithilfe von Excel-VBA können Sie aber auch auf Add-Ins zugreifen. Jedes Add-In kann über die Objektvariable AddIn angesprochen werden. Dabei müssen Sie aber wissen, wie das Add-In genau heißt. Sehen Sie also mal kurz nach, indem Sie die runde Schaltfläche links oben anklicken und anschließend die Schaltfläche ExcelOptionen klicken. Markieren Sie danach am linken Bildrand die Option Add-Ins. 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.
84
24128.book Seite 85 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Abbildung 1.52: Der Add-InsManager von Excel
Erfassen Sie nun folgendes Makro, um das Add-In ANALYSE-FUNKTIONEN einzubinden. Listing 1.19: Das Add-In Analyse-Funktionen wird bei Bedarf installiert Sub AddInPrüfung() Dim a As AddIn Set a = AddIns("Analyse-Funktionen") 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
85
24128.book Seite 86 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ AddIn. Danach geben Sie über die Anweisung Set an, welches Add-In Sie überprüfen und ggf. installieren möchten. Mithilfe der Eigenschaft Installed können Sie jetzt überprüfen, ob das Add-In bereits installiert ist. Wenn ja, dann meldet diese Eigenschaft den Wert True zurück. Wenn nicht, dann gibt diese Eigenschaft den Wert False zurück. 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 einfügen Über den Ribbon EINFÜGEN können Sie Ihre Tabellen verschönern, indem Sie Symbole, Pfeile und sonstige AutoFormen einfügen. In der nächsten Aufgabe soll ein bestimmter Zellenbereich definiert werden. Genau auf diesen Bereich soll dynamisch ein Rechteck darüber gelegt und wieder weggenommen werden. Listing 1.20: Zeichenobjekt über Zellenbereich legen Sub ZeichenObjektEinfügen() Dim Bereich As Range Set Bereich = Tabelle6.Range("B5:F10") Tabelle6.Rectangles.Add _ Bereich.Left, Bereich.Top, _ Bereich.Width, Bereich.Height Set Bereich = Nothing End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Range. Unter einem RangeObjekt können 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.
86
24128.book Seite 87 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Wenden Sie danach die Methode Add auf das Objekt Rectangles an, welches Ihnen ein Rechteck in die Tabelle einfügt. Als Einfügekoordinaten übergeben Sie der Methode die Eckkoordinaten Ihres definierten Bereichs, die Sie über die Eigenschaften Left, Top, Width und Height angeben können. Vergessen Sie nicht, den Objektverweis über die Anweisung Set Bereich = Nothing wieder aufzuheben.
Abbildung 1.53: Das Rechteck wurde genau über den definierten Bereich gelegt.
Der Vollständigkeit halber anbei noch das Makro, welches dieses Rechteck wieder aus der Tabelle entfernt. Listing 1.21: AutoForm aus Tabelle entfernen Sub ZeichenObjektEntfernen() Dim Rechteck As Shape Set Rechteck = Tabelle6.Shapes(1) Rechteck.Delete Set Rechteck = Nothing End Sub
Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Shape. Darunter fallen alle Objekte in der Zeichnungsebene, z.B. AutoFormen, Freihandobjekte, OLEObjekte oder ein ganz normales Bild. Geben Sie über die Anweisung Set genau an, wo sich das Shape-Objekt befindet. Das Shape-Objekt mit dem Index 1 ist das
87
24128.book Seite 88 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Shape-Objekt, welches als Erstes in Ihre Tabelle eingefügt wurde. Mithilfe der Methode Delete löschen 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 während der Programmausführung immer konstant. Auch hier wird zwischen lokalen und globalen Konstanten unterschieden. Globale Konstanten werden außerhalb der einzelnen Makros definiert und sind damit für 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.19 EndDatum = #1/1/2007#
Was kann hier noch verbessert werden? Was für die Variablen gilt, hat auch bei den Konstanten Konsequenzen. In den obigen Beispielen ist noch nicht erklärt worden, welche Datentypen verwendet werden sollen. Zum aktuellen Zeitpunkt wird in allen gerade genannten Beispielen der Datentyp Variant eingesetzt. Es geht auch etwas genauer und speichersparender: Const Const Const Const Const Const Const
88
Laufwerk1 as String = "C:\" Laufwerk2 as String = "D:\" Verzeichnis1 as String = "C:\Eigene Dateien" Verzeichnis2 as String = "D:\Sicherung" Euro as Single = 1.95583 MwSt as Single = 1.19 EndDatum as Date = #1/1/2007#
24128.book Seite 89 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Konstanten für die Datumsfomatierung Für das Anzeigen von Datums- und Zeitangaben stehen Ihnen fertige Systemkonstanten zur Verfügung, die die Formatierung des Datums bzw. des Zeitwerts für Sie übernehmen.
Datumsangaben formatiert ausgeben Die Datums-/Zeitkonstanten werden unter anderem im Zusammenspiel mit der Funktion FormatDateTime verwendet. Dabei haben Sie die Möglichkeit, eine Datums- bzw. Zeitangabe auf mehrere Weisen zu formatieren. Die Funktion FormatDateTime hat folgende Syntax: FormatDateTime(Datum[,BenanntesFormat])
Im Argument Datum übergeben Sie der Funktion einen Datumswert. Im Argument BenanntesFormat wählen Sie eine der in der Tabelle folgenden Datums-/Zeitkonstanten. Konstante
Wert
Beschreibung
vbGeneralDate
0
Zeigt ein Datum und/oder eine Uhrzeit an. Wenn es ein Datum gibt, wird es in Kurzform angezeigt. Wenn es eine Uhrzeit gibt, wird sie im langen Format angezeigt. Falls vorhanden, werden beide Teile angezeigt.
vbLongDate
1
Zeigt ein Datum im langen Datumsformat an, das in den Ländereinstellungen des Computers festgelegt ist.
VbShortDate
2
Zeigt ein Datum im kurzen Datumsformat an, das in den Ländereinstellungen des Computers festgelegt ist.
vbLongTime
3
Zeigt eine Uhrzeit in dem Zeitformat an, das in den Ländereinstellungen des Computers festgelegt ist.
vbShortTime
4
Zeigt eine Uhrzeit im 24-Stunden-Format (hh:mm) an.
Tabelle 1.4: Die Datumskonstanten für die Formatierung
Im folgenden Beispiel wird das aktuelle Tagesdatum bzw. die momentane Uhrzeit auf verschiedene Arten ausgegeben.
89
24128.book Seite 90 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Listing 1.22: 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 gewünschten Zeile die Anweisung Chr(13) einsetzen. Anstatt dieser Anweisung können Sie auch die Kontante vblf einsetzen, um einen »Zeilenvorschub« zu erreichen. Vergessen Sie dabei nicht den Verkettungsoperator.
Abbildung 1.54: Die Datums- und Zeitformate in einer mehrzeiligen Meldung
Datumsteile extrahieren Möchten Sie einen ganz bestimmten Teil aus einem Datum herausziehen, beispielsweise den Tag, Monat, Quartal oder das Jahr, dann setzen Sie die Funktion DatePart ein. Die Syntax dieser Funktion lautet: DatePart(inter,date [,firstdayofweek[,firstweekofyear]])
Im Argument Inter müssen Sie genau angeben, welchen Teil des Datums Sie extrahieren möchten. Die einzelnen Möglichkeiten sehen Sie in der folgenden Tabelle:
90
24128.book Seite 91 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Einstellung
Beschreibung
yyyy
Jahr
q
Quartal
m
Monat
y
Tag des Jahres
d
Tag
w
Wochentag
ww
Woche
h
Stunde
n
Minute
s
Sekunde
Tabelle 1.5: Die Intervall-Konstanten der Funktion DatePart
Im Argument Date geben Sie das Datum an bzw. einen Zellenbezug, der ein Datum enthält. Im Argument firstdayofweek müssen Sie den ersten Tag der Woche angeben. Denken Sie beispielsweise daran, dass der jüdische Kalender mit dem Sonntag als erstem Tag der Woche beginnt. Für unseren europäischen Bereich müssen Sie daher den Wert 2 bzw. die Konstante vbMonday einsetzen. Wenn Sie die ganze Sache etwas variabler halten möchten, dann setzen Sie die Konstante vbUseSystem 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
Wert
Beschreibung
VbUseSystem
0
Die NLS API-Einstellung wird verwendet
VbSunday
1
Sonntag (Voreinstellung)
VbMonday
2
Montag
Tabelle 1.6: Die FirstDayOfWeek-Konstanten der Funktion DatePart
91
24128.book Seite 92 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Konstante
Wert
Beschreibung
vbTuesday
3
Dienstag
vbWednesday
4
Mittwoch
vbThursday
5
Donnerstag
vbFriday
6
Freitag
vbSaturday
7
Samstag
Tabelle 1.6: Die FirstDayOfWeek-Konstanten der Funktion DatePart
Im letzten Argument firstweekofyear legen Sie die erste Woche eines Jahres fest. Danach richtet sich auch jeweils die Nummerierung der Kalenderwoche. Dabei können Sie folgende Einstellungen treffen: Einstellung
Beschreibung
yyyy
Jahr
q
Quartal
m
Monat
y
Tag des Jahres
d
Tag
w
Wochentag
ww
Woche
h
Stunde
n
Minute
s
Sekunde
Tabelle 1.7: Die Intervall-Konstanten der Funktion DatePart
Im Argument firstdayofweek müssen Sie den ersten Tag der Woche angeben. Denken Sie beispielsweise daran, dass der jüdische Kalender mit dem Sonntag als erstem Tag der Woche beginnt. Für unseren europäischen Bereich müssen Sie daher den
92
24128.book Seite 93 Mittwoch, 7. Februar 2007 12:06 12
Datentypen, Variablen und Konstanten
Wert 2 bzw. die Konstante vbMonday einsetzen. Wenn Sie die ganze Sache etwas variabler halten möchten, 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 Nummerierung der Kalenderwoche. Dabei können Sie folgende Einstellungen treffen: Konstante
Wert
Beschreibung
VbUseSystem
0
Die NLS API-Einstellung aus der Systemsteuerung von Windows wird verwendet
vbFirstJan1
1
Anfang in der Woche mit dem 1. Januar (Voreinstellung)
vbFirstFourDays
2
Anfang in der ersten Woche, die mindestens vier Tage im neuen Jahr enthält
VbFirstFullWeek
3
Anfang in der ersten vollen Woche des Jahres
Tabelle 1.8: Die FirstWeekOfYear-Konstanten der Funktion DatePart
Üben Sie die Funktion nun an folgender Aufgabe: Ermitteln Sie das Quartal des aktuellen Datums! Die Lösung dieser Aufgabenstellung können Sie im nachfolgenden Listing sehen: Listing 1.23: Das Quartal des aktuellen Tagesdatums ermitteln Sub QuartalErmitteln() MsgBox "Das Datum von heute lautet: " & Date & vblf & _ "Wir befinden uns im Quartal: " & DatePart("q", Date) End Sub
Mit dem Kürzel q können Sie über die Funktion DatePart das momentane Quartal des Jahres ermitteln.
Abbildung 1.55: Ende Dezember gehört dem vierten Quartal an.
93
24128.book Seite 94 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
Wochentag ermitteln Mithilfe der Funktion WeekDayName können Sie auf ähnliche Konstanten wie gerade beschrieben zurückgreifen. Die Syntax dieser Funktion lautet: WeekdayName(Wochentag, abkürzen, ErsterWochentag)
Das Argument Wochentag gibt die numerische Bezeichnung des Wochentages wieder, die abhängig ist von der Wahl des Arguments ErsterWochentag. Das Argument abkürzen legt fest, ob der Name des Tages abgekürzt werden soll oder nicht. Setzen Sie dieses Argument auf den Wert True, wenn Sie den ermittelten Wochentag abkürzen möchten. 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 können. In der nächsten Aufgabe soll anhand des aktuellen Tagesdatums der dazugehörige Wochentag ermittelt werden. Das Lösungsmakro können Sie im folgenden Listing betrachten: Listing 1.24: Den aktuellen Wochentag bestimmen Sub WochentagErmitteln() MsgBox "Heute ist der " & Date & vblf & _ "Dieses Datum entspricht einem " & vblf & _ WeekdayName(Weekday(Date, vbUseSystemDayOfWeek), False) End Sub
Klar, Sie werden jetzt vielleicht sagen: »Den Wochentag des aktuellen Tagesdatums zu ermitteln –a 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 Lösung wurde das Makro aus Listing 1.26 in eine Funktion überführt. Listing 1.25: Den Wochentag über eine Funktion ermitteln Function Wochentag(DatAngabe) Wochentag = WeekdayName _
94
24128.book Seite 95 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
(Weekday(DatAngabe, vbUseSystemDayOfWeek), False) End Function
Mehr zum Thema der Funktionen erfahren Sie übrigens am 9. Tag.
Übergeben Sie der Funktion einen Datumswert. Im folgenden Makro wird die Funktion Wochentag aufgerufen und ein zukünftiger Datumswert übergeben: Listing 1.26: Einen zukünftigen Wochentag ermitteln Sub DatumPlus30() MsgBox "Heute ist der " & Date & vblf & _ "In 30 Tagen ist der " & Date + 30 & vblf & _ "Dieses Datum fällt auf einen: " & Wochentag(Date + 30) End Sub
Addieren Sie zum aktuellen Datum, welches Sie über die Standardfunktion Date bekommen, einfach den Wert 30 und übergeben Sie der Funktion diesen Datumswert.
Abbildung 1.56: Der zukünftige Termin ist unter der Woche.
1.10 Fragen & Antworten F
Wie können Sie einen Befehl in der nächsten Zeile fortsetzen, ohne dass der Editor meckert? A
Selbstverständlich können Sie längere Befehlsketten in einer Zeile eingeben. Der Nachteil daran ist, dass Sie irgendwann so weit nach rechts scrollen müssen, dass Sie den Anfang der Zeile nicht mehr sehen. Hier
95
24128.book Seite 96 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
empfiehlt sich, über ein Trennzeichen dem Editor mitzuteilen, dass der Befehl in der nächsten Zeile weitergehen soll. A
F
Wie können Sie mehrere Befehle in eine einzige Zeile packen? A
F
Auch hier leistet die automatische Syntaxprüfung in Excel hervorragende Hilfe, denn nicht jeder Befehl lässt sich an einer beliebigen Stelle trennen. Um einen Befehl in der nächsten Zeile fortzusetzen, drücken Sie am Ende der Zeile zunächst die Taste (Leertaste) und geben anschließend das Zeichen _ ein. Damit weiß der Editor, dass der Befehl in der nächsten Zeile fortgesetzt werden muss. Wenn Sie möchten, können Sie auch mehrere kleinere Befehle in einer einzigen Zeile darstellen. Dazu verwenden Sie den Doppelpunkt als Trennzeichen zwischen den einzelnen Befehlen.
Über welche Objektvariable können Sie einen Kommentar einfügen? A
Deklarieren Sie eine Objektvariable vom Typ Comment. Im folgenden Makro aus Listing 1.27 wird ein Kommentar in die aktive Zelle Ihrer Tabelle eingefügt.
Listing 1.27: Einen Kommentar einfügen Sub KommentarEinfügen() Dim Kommentar As Comment Set Kommentar = ActiveCell.AddComment Kommentar.Text "Kommentar zur Zelle" End Sub A
F
Wie können Sie einen Hyperlink in eine Zelle einfügen? A
96
Deklarieren Sie eine Objektvariable vom Typ Comment. Danach fügen Sie über die Methode AddComment einen Kommentar in die aktive Zelle Ihrer Tabelle ein. Im folgenden Makro aus Listing 1.28 wird ein Hyperlink eingefügt, der auf meine Excel-Homepage verweist.
24128.book Seite 97 Mittwoch, 7. Februar 2007 12:06 12
Quiz
Listing 1.28: Einen Hyperlink einfügen
Sub HyperlinkEinfügen() Dim Hyper As Hyperlink Set Hyper = ActiveCell.Hyperlinks.Add _ (anchor:=Range("A1"), _ Address:="http://held-office.de") End Sub A
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Hyperlink. Danach fügen Sie den Hyperlink über die Methode Add ein. Im ersten Argument geben Sie an, wohin der Hyperlink eingefügt werden soll. Im zweiten Argument geben Sie die Adresse an, die angesprungen werden soll, wenn auf den Hyperlink geklickt wird.
1.11 Quiz F
Wie rufen Sie die Entwicklungsumgebung auf?
F
Woher holt sich die Funktion Date das aktuelle Tagesdatum?
F
Wie kann man schnell komplette Code-Blöcke auskommentieren?
F
Wie kann man eine Deklaration von Variablen standardmäßig erzwingen?
F
Wie kann man am schnellsten sehen, welche Objektvariablen für die Programmierung zur Verfügung stehen?
F
Wie lautet der Code, um eine PowerPoint-Sitzung zu starten?
F
Wie kann man mithilfe der Funktion DatePart den Monatsnamen extrahieren?
97
24128.book Seite 98 Mittwoch, 7. Februar 2007 12:06 12
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
1.12 Übung Zum Abschluss dieses Tages üben Sie das heute Gelernte. Dabei soll folgende Aufgabenstellung gelöst werden: In einer Tabelle sollen die Nullwerte nicht angezeigt werden. Außerdem sollen die Gitternetzlinien sowie die Spalten- und Zeilenbeschriftungen im Ausdruck mit ausgedruckt werden. Lösen Sie diese Aufgabe mithilfe des Makrorekorders und entfernen Sie danach aus der Aufzeichnung die nicht benötigten Zeilen. Sehen Sie sich jedoch vorab einmal die Ausgangssituation an:
Abbildung 1.57: Die Ausgangssituation
Die Demodateien Einstieg.xlsm und Syntax.xlsm finden Sie auf der CD-ROM im Verzeichnis Kap01, die Lösung für diese Aufgabe im Anhang.
98
24128.book Seite 99 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
2
24128.book Seite 100 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
Am gestrigen Tag haben Sie die Entwicklungsumgebung von Excel sowie Datentypen, Variablen und den Einsatz von Konstanten kennen gelernt. Sie wissen nun, wie Sie sich in der Entwicklungsumgebung zurechtfinden können und warum Sie Variablen einsetzen bzw. deklarieren können. Die Themen heute: 쐽
Arbeiten mit Verzweigungen
쐽
Übersichtlichere Form mit Select Case
쐽
Schleifen programmieren
쐽
Allgemeine Informationen zu Makros
쐽
Fehler finden und beseitigen
쐽
Typische Fehlerquellen in Excel-VBA
Das Wesentliche einer Programmiersprache sind ihre Sprachelemente. In diesem Kapitel erfahren Sie, wie Sie mithilfe von Verzweigungen, Schleifen und anderen Anweisungen Ihre Programme flexibel gestalten können. Diese Sprachelemente lassen sich leider nicht mit dem Makrorekorder aufzeichnen und müssen 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.xlsm.
2.1
Arbeiten mit Verzweigungen
Unter einer Verzweigung versteht man ganz allgemein eine Prüfung. Diese Prüfung kann entweder das eine oder das andere Ergebnis bringen. Je nach Ergebnis werden Sie einen bestimmten Weg einschlagen.
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 müssen wir zu Hause bleiben und sparen!«
100
24128.book Seite 101 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Verzweigungen
Bildlich dargestellt könnte das wie folgt aussehen:
Abbildung 2.1: Eine einfache Entscheidung
Oft sind Verzweigungen aber noch von weiteren Bedingungen abhängig, d.h. auf unser Beispiel angewendet könnte man noch weitere Kriterien anführen, 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!« Prüfungen können selbstverständlich auch geschachtelt werden, d.h. ein Zweig könnte weitergeführt werden und weitere Verzweigungen enthalten. Angewendet auf unser Beispiel würde das bedeuten: »Also wir fahren jetzt in den Urlaub! Aber wohin? Sollen wir nach Frankreich oder nach Italien fahren?« Eine weitere Schachtelung wäre dann: »Wir haben uns für Frankreich entschieden! Aber sollen wir nach Paris oder nach Nizza?« Wie Sie sehen, können Sie auf diese Weise zig Bedingungen formulieren und zu Papier bringen.
101
24128.book Seite 102 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
Verzweigungen in Excel Verzweigungen kennen Sie übrigens bereits aus der normalen Arbeitsoberfläche von Excel. Dort können Sie die Tabellenfunktion WENN() einsetzen, um entweder die eine oder die andere Aktion in Abhängigkeit von einem Zellenwert einzuleiten.
Verzweigungen in Excel-VBA Mit Verzweigungen können Sie in Excel-VBA bestimmte Zustände abfragen und je nach Zustand anders reagieren. Die allgemeine Syntax für eine solche Verzweigung lautet: If Bedingung Then [Anweisungen] [Else elseAnweisungen]
Alternativ können Sie die Block-Syntax verwenden: If Bedingung Then [Anweisungen] [ElseIf Bedingung-n Then [elseifAnweisungen] ... [Else [elseAnweisungen]] End If
Unter dem Argument Bedingung bzw. Bedingung-n geben Sie die Bedingung(en) an, die erfüllt werden muss (müssen). Unter dem Argument Anweisungen werden jene Anweisungen aufgeführt, die durchgeführt werden sollen, wenn die erste Bedingung erfüllt wird. Unter dem Argument elseifBedingungen können Sie weitere Bedingungen formulieren und somit die Abfrage weiter schachteln. Über das Argument ElseIfAnweisungen lassen Sie dabei die Anweisungen folgen, sofern die elseIfBedingung erfüllt ist. Über das Argument elseAnweisungen können Sie eine oder mehrere Anweisungen folgen lassen, welche ausgeführt werden sollen, wenn die erste Bedingung nicht erfüllt wird. Lassen Sie uns nun diese etwas theoretische Syntaxbeschreibung auf einige Beispiele aus der Praxis anwenden.
102
24128.book Seite 103 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Verzweigungen
Zelleninhalte prüfen Im folgenden Beispiel soll der Inhalt der momentan aktivierten Zelle geprüft werden. Im ersten Schritt werden Sie testen, ob überhaupt etwas in der Zelle steht. Das Makro für diese Aufgabe lautet: Listing 2.1: Prüfen, ob Zelle leer oder gefüllt ist Sub Verzweigung() If ActiveCell.Value = "" Then _ MsgBox "Zelle ist leer" Else MsgBox "Zelle ist gefüllt!" End Sub
Überprüfen Sie zuerst, ob die aktive Zelle gefüllt ist. Alternativ zu der im Listing 2.1 aufgeführten Abfrage könnten Sie auch die Zeile If IsEmpty(ActiveCell.Value) Then
verwenden. Beide Bedingungen liefern das gewünschte Ergebnis. Für den Fall, dass die Zelle einen Inhalt enthält, wird der Then-Zweig ausgeführt, andernfalls der Else-Zweig. Im nächsten Schritt möchten Sie prüfen, ob der Zelleninhalt, sofern die Zelle gefüllt ist, entweder numerisch oder alphanumerisch ist. Dazu müssen Sie die Verzweigung schachteln. Das könnte dann wie folgt aussehen: Listing 2.2: Überprüfen des genauen Zelleninhalts Sub VerzweigungDaten() If IsEmpty(ActiveCell.Value) Then MsgBox "Zelle ist leer" Else If IsNumeric(ActiveCell) Then MsgBox "Zelle enthält eine Zahl" Else MsgBox "Zelle enthält einen Text" End If End If End Sub
103
24128.book Seite 104 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
In der ersten Verzweigung überprüfen Sie, ob die Zelle leer ist. Wenn ja, geben Sie eine Meldung auf dem Bildschirm aus. Wenn die Zelle gefüllt ist, müssen Sie eine zweite Verzweigung einbauen, die prüft, ob es sich um einen numerischen oder alphanumerischen Zellenwert handelt. Mithilfe der Funktion IsNumeric können Sie diese Aufgabe erledigen. Vergessen Sie bei beiden Verzweigungen nicht, diese mit End if abzuschließen. Bei dieser Gelegenheit möchte ich Ihnen eine weitere Funktion vorstellen, die Ihnen dabei hilft, herauszufinden, ob ein Datumswert vorliegt. Sehr oft werden solche Datumsüberprüfungen in Excel durchgeführt. Insbesondere bei Berechnungen von Lieferterminen oder Zahlungszielen müssen Sie als Entwickler sicherstellen, dass auch wirklich Datumseingaben vorgenommen wurden. Im nächsten Beispiel werden Sie vom Anwender eine Datumseingabe über eine Eingabemaske verlangen. Das Makro für diesen Zweck lautet: Listing 2.3: Datumsprüfung vornehmen Sub Datumsprüfung() Dim d As Date On Error GoTo fehler Beginn: d = InputBox("Geben Sie das Lieferdatum ein!", _ "Datum eingeben") If IsDate(d) And d >= "01.01.2007" Then Else MsgBox "Nur Eingaben im aktuellen Jahr möglich" GoTo Beginn End If d = d + 14 MsgBox "Das Zahlungsziel ist der: " & d Exit Sub fehler: MsgBox "Sie haben kein gültiges Datum eingegeben!" GoTo Beginn End Sub
104
24128.book Seite 105 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Verzweigungen
Im ersten Schritt fordern Sie den Anwender auf, ein Datum einzugeben. Danach kontrollieren Sie mithilfe einer Verzweigung, ob das Datum im gültigen Bereich liegt. Es werden nur Datumseingaben akzeptiert, die größer oder gleich dem Datum 01.01.2007 sind. Prüfen Sie zusätzlich, ob es sich überhaupt um einen gültigen Datumswert handelt. Dazu verwenden Sie die Funktion IsDate. Diese Funktion meldet den Wert True, wenn es sich um ein Datum handelt. Wurde ein gültiges Datum eingegeben, dann rechnen Sie mit diesem Datum. Dabei können Sie genauso vorgehen, wie Sie es auch bei numerischen Werten machen würden. Addieren Sie zum Liefertermin einfach die Zahl 14 (14 Tage), um einen gängigen Zahlungstermin zu errechnen. Geben Sie diesen Termin dann auf dem Bildschirm aus.
Abbildung 2.2: Das Datum wurde korrekt eingegeben.
Sollte ein ungültiger Wert in der Eingabemaske erfasst werden, wird diese erneut aufgerufen. Zu Beginn des Listings finden Sie eine On Error-Anweisung. Damit stellen Sie sicher, dass Ihr Makro nicht abstürzt, wenn ein Text eingegeben wird. Sollte ein Anwender in diesem Beispiel einen Text eingeben, wird die Sprungmarke fehler angesprungen. Dort erhält der Benutzer eine Nachricht, dass ihm bei der Eingabe ein Fehler unterlaufen ist. Mit dem Befehl GoTo geben Sie ihm aber die Möglichkeit, seine Eingabe zu wiederholen. Als Sprungziel geben Sie dort die Sprungmarke Beginn an.
105
24128.book Seite 106 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
Sie haben bereits mehrere typische VBA-Funktionen kennen gelernt, die häufig eingesetzt werden, um Eingaben zu überprüfen. In der folgenden Tabelle finden Sie die gängigsten Prüffunktionen in VBA. Funktion
Beschreibung
IsEmpty
Gibt einen Wert vom Typ Boolean zurück, der angibt, ob eine Variable initialisiert wurde.
IsArray
Gibt einen Wert vom Typ Boolean zurück, der angibt, ob eine Variable ein Datenfeld ist.
IsDate
Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Ausdruck in ein Datum umgewandelt werden kann.
IsError
Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Ausdruck ein Fehlerwert ist.
IsNull
Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Ausdruck keine gültigen Daten (Null) enthält.
IsNumeric
Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Ausdruck als Zahl ausgewertet werden kann.
IsObject
Gibt einen Wert vom Typ Boolean zurück, der angibt, ob ein Bezeichner eine Objekt-Variable darstellt.
Tabelle 2.1: Die wichtigsten Prüffunktionen von VBA
Auch eine Art von Verzweigung Neben der Verzweigung If...Then...Else gibt es eine weitere Möglichkeit, um Werte zu überprüfen. Die Funktion lautet IIF. Die Funktion IIF hat folgende Syntax: IIf(expr, truepart, falsepart)
Mit dem Argument expr geben Sie den auszuwertenden Ausdruck an. Das Argument truepart liefert den zurückgegebenen Wert oder Ausdruck, wenn expr den Wert True ergibt. Das Argument falsepart stellt den zurückgegebenen Wert oder Ausdruck dar, wenn expr den Wert False liefert.
106
24128.book Seite 107 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Verzweigungen
Diese Funktion wertet immer sowohl den Teil truepart als auch den Teil falsepart aus, auch dann, wenn nur einer von beiden Teilen zurückgegeben wird. In einem Beispiel angewendet, überprüfen 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 möchten, 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 bestückt.
Abbildung 2.3: Zelleneintrag prüfen und Ergebnis in Nebenzelle ausgeben
107
24128.book Seite 108 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
2.2
Übersichtlichere Form mit Select Case
Wenn Sie mehrere Verzweigungen ineinander schachteln bzw. mehrere Verzweigungen hintereinander durchführen möchten, gibt es dafür eine bessere und übersichtlichere Lösung. Setzen Sie für solche Aufgaben die Anweisung Select Case ein. Die Syntax für Select Case lautet: Select Case Testausdruck [Case Ausdrucksliste-n [Anweisungen-n]] ... [Case Else [elseAnw]] End Select
Unter dem Argument Testausdruck wird ein beliebiger numerischer Ausdruck oder Zeichenfolgenausdruck erfasst, den Sie auswerten möchten. Im Argument Ausdrucksliste-n spezifizieren Sie den zu untersuchenden Ausdruck näher. Dabei können Sie Vergleichsoperatoren, wie To, Is oder Like, verwenden. Unter dem Argument Anweisungen-n können Sie eine oder mehrere Anweisungen angeben, welche ausgeführt werden sollen, wenn Testausdruck mit irgendeinem Teil in Ausdrucksliste-n übereinstimmt. Das Argument elseAnw ist optional einsetzbar. Damit können Sie darauf reagieren, wenn Testausdruck mit keinem der Ausdrücke im Case-Abschnitt übereinstimmen sollte. Sehen Sie nun ein paar typische Beispiele für den Einsatz von Select Case.
Excel-Version feststellen In der ersten Aufgabe für dieses Sprachelement sollen Sie feststellen, mit welcher Excel-Version Sie arbeiten. Für diese Aufgabe können 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)
108
24128.book Seite 109 Mittwoch, 7. Februar 2007 12:06 12
Übersichtlichere Form mit Select Case
Case "5" MsgBox Case "7" MsgBox Case "8" MsgBox Case "9" MsgBox Case "1"
"Excel 5" "Excel 7/95" "Excel 8/97" "Excel 2000"
Select Case Case 10 MsgBox Case 11 MsgBox Case 12 MsgBox End Select
Left(Application.Version, 2) "Excel 2002" "Excel 2003" "Excel 2007"
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 überprüfen Sie die Versionsnummern. Trifft eine Bedingung zu, wird eine Meldung am Bildschirm ausgegeben, die Ihnen die Excel-Version meldet. Da die drei letzten aktuellen Excel-Versionen alle die Zahl 1 haben (Excel 2000 mit Versionsnummer 10, Excel 2003 mit der Versionsnummer 11 und Excel 2007 die Versionsnummer 12), bauen Sie innerhalb der Case-Anweisung noch mal eine Select case-Anweisung ein, um den Unterschied der Versionen anhand der Versionsnummer festzustellen. Extrahieren Sie dabei von der Versionsnummer die beiden ersten Ziffern von links.
Zahlenwerte prüfen Im nächsten Beispiel werden Eingaben geprüft. Dabei soll ermittelt werden, in welchem Wertbereich die Eingabe vorgenommen wurde. Sehen Sie sich dazu das folgende Listing an:
109
24128.book Seite 110 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
Listing 2.6: Zahlenwerte überprüfen Sub ZahlAuswerten() Dim intEingabe As Integer intEingabe = InputBox _ ("Geben Sie einen Wert zwischen 1 und 100 ein!") Select Case intEingabe 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 MsgBox "Wert liegt zwischen 9 und 15" Case 16 To 100 MsgBox "Wert liegt zwischen 16 und 100" Case Else MsgBox "Es wurde kein gültiger Wert eingegeben!" End Select End Sub
Wenden Sie die Select Case-Anweisung an, um die eingegebenen Werte zu überprüfen. In der ersten Abfrage kontrollieren Sie, ob der eingegebene Wert zwischen 1 und 5 liegt. In diesem Fall können Sie den Vergleichsoperator To einsetzen. In der zweiten Abfrage haben Sie die Zahlenwerte durch Komma getrennt eingegeben. Wurde kein gültiger Zahlenwert eingegeben, kommt die Anweisung Case Else zum Tragen. Dort geben Sie eine Fehlermeldung auf dem Bildschirm aus. Die folgende Tabelle enthält eine Liste der Vergleichsoperatoren und die Bedingungen, unter denen das Ergebnis True, False oder 0 wird: Vergleichsoperator
Erklärung
=
größer oder gleich
Tabelle 2.2: Die Vergleichsoperatoren in Excel
110
24128.book Seite 111 Mittwoch, 7. Februar 2007 12:06 12
Übersichtlichere Form mit Select Case
Vergleichsoperator
Erklärung
=
gleich
ungleich
Tabelle 2.2: Die Vergleichsoperatoren in Excel (Forts.)
Fensterstatus ermitteln In der folgenden Aufgabe soll der Fensterstatus Ihrer Anwendung ermittelt werden. Dieser Status kann drei Werte aufweisen: 쐽
Fenster normal
쐽
Fenster maximiert
쐽
Fenster minimiert
Überprüfen Sie nun den Fensterstatus Ihrer Anwendung, indem Sie das folgende Makro starten: Listing 2.7: Fensterstatus der Anwendung ermitteln Sub WindowStatusErmitteln() Dim strStatus As String Select Case Application.WindowState Case xlMaximized strStatus = "Maximiert" Case xlMinimized strStatus = "Minimiert" Case xlNormal strStatus = "Normal" End Select MsgBox "Der augenblickliche Window-Status lautet: " & strStatus End Sub
Über die Eigenschaft WindowState können Sie den Status Ihres Anwendungsfensters feststellen. Werten Sie diesen anschließend ü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 möchten, dass Sie die größtmögliche Ansicht haben.
111
24128.book Seite 112 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
2.3
Schleifen programmieren
Schleifen werden in Excel dazu verwendet, um Abläufe mehrmals hintereinander durchzuführen. 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 Abbruchprüfung am Anfang bzw. am Ende der Schleife statt. Das war nun zugegeben etwas abstrakt: Stellen Sie sich vor, Sie müssten eine Flasche Wein trinken. Dabei dürfen Sie den Wein nicht direkt aus der Flasche trinken, sondern müssen diesen in ein 0,24-l-Glas einschenken. Diesen Vorgang müssen Sie genau viermal wiederholen, um die Flasche leer zu trinken. Dies ist ein typisches Beispiel für eine Schleife, die so lange durchlaufen wird, bis die Endbedingung eintrifft. Die Geschwindigkeit bei Excel-Schleifen ist natürlich um ein 1000faches schneller als bei diesem Beispiel aus dem täglichen Leben. Lernen Sie auf den nächsten Seiten die zur Verfügung stehenden Schleifen und einfache Beispiele für den Einsatz von Schleifen kennen.
For...Next-Schleifen Sie können die Schleife For...Next verwenden, um einen Block von Anweisungen eine unbestimmte Anzahl von Wiederholungen ausführen zu lassen. For...NextSchleifen verwenden eine Zählervariable, deren Wert mit jedem Schleifendurchlauf erhöht oder verringert wird. Sie brauchen daher nicht daran zu denken, den Zähler selbst hoch- oder herunterzusetzen. Die Syntax dieser Schleife lautet: For Zähler = Anfang To Ende [Step Schritt] [Anweisungen] [Exit For] [Anweisungen] Next [Zähler]
Das Argument Zähler ist erforderlich und besteht aus einer numerischen Variablen, die als Schleifenzähler dient. Das Argument Anfang repräsentiert den Startwert von Zähler. Mit dem Argument Ende legen Sie den Endwert von Zähler fest. Das Argument Schritt ist optional. Hier können Sie den Betrag bestimmen, um den Zähler bei jedem Schleifendurchlauf verändert wird. Falls kein Wert angegeben wird, ist die Voreinstellung 1.
112
24128.book Seite 113 Mittwoch, 7. Februar 2007 12:06 12
Schleifen programmieren
Unter Anweisungen stehen eine oder mehrere Anweisungen zwischen For und Next, die so oft wie angegeben ausgeführt werden. Innerhalb einer Schleife kann eine beliebige Anzahl von Exit For-Anweisungen an beliebiger Stelle als alternative Möglichkeit zum Verlassen der Schleife verwendet werden. Üben Sie diese Art von Schleife anhand der nächsten Aufgaben:
Zeilen abarbeiten Im ersten Beispiel zur For...Next-Schleife sollen einige Zeilen abgearbeitet werden. Diese Aufgabe gehört zu den wichtigsten Aufgaben in Excel überhaupt. In vielen Fällen müssen Sie in einer Tabelle alle Datensätze nacheinander abarbeiten, wie z.B. Artikellisten, Preislisten oder Kundenlisten. In der nächsten Aufgabe sollen die Werte aus Spalte A in Spalte B übertragen und um den Faktor 15% erhöht werden. Sehen Sie sich vorab einmal folgende Abbildung an:
Abbildung 2.4: Eine Zahlenkolonne in Spalte A
Erfassen Sie nun das Makro, welches die Werte um 15% erhöht und in Spalte B schreibt: Listing 2.8: Zahlen um einen bestimmten Prozentsatz erhöhen Sub Schleife01() Dim intZeile As Integer
113
24128.book Seite 114 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
Sheets("Tabelle3").Activate Range("A1").Select For intZeile = 1 To 10 ActiveCell.Offset(0, 1).Value = ActiveCell.Value * 1.15 ActiveCell.Offset(1, 0).Select Next intZeile End Sub
Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie die prozentuale Erhöhung durchführen möchten. 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 fügen diesen Wert über die Eigenschaft OffSet in die Nebenzelle ein. Die Nebenzelle erreichen Sie, indem Sie das erste Argument von OffSet, die Zeilenverschiebung, auf den Wert 0 setzen, und das zweite Argument, die Spaltenverschiebung, auf den Wert 1. Vergessen Sie nicht, nach jedem Schleifendurchlauf den Mauszeiger über die Anweisung ActiveCell.Offset(1, 0).Select eine Zeile weiter nach unten zu setzen, da Sie sonst eine Endlosschleife produzieren.
Abbildung 2.5: Das Ergebnis der Operation sehen Sie in Spalte B
An dieser Stelle möchte ich Sie noch auf eine Schwachstelle im Listing 2.7 hinweisen. Diese Schleife ist leider nicht dynamisch, d.h. wenn Sie Ihre Tabelle erweitern, müssen Sie auch immer die Zählvariable intZeile anpassen.
114
24128.book Seite 115 Mittwoch, 7. Februar 2007 12:06 12
Schleifen programmieren
In diesem Fall ist es besser, zu ermitteln, wie viele Zeilen in der Tabelle benötigt werden, und in Abhängigkeit davon die Schleife aufzubauen. Dies wurde im folgenden Makro in Listing 2.8 umgesetzt: Listing 2.9: Dynamische Schleife Sub Schleife01Dynamisch() Dim intZeile As Integer With Tabelle3 For intZeile = 1 To .UsedRange.Rows.Count .Cells(intZeile, 2).Value = _ .Cells(intZeile, 1).Value * 1.15 Next intZeile End With End Sub
Mit der Anweisung .UsedRange.Rows.Count ermitteln Sie die Anzahl der belegten Zeilen in Ihrer Tabelle. Dies bildet auch das Endkriterium für Ihre Schleife. Innerhalb der Schleife können 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. Da Sie ganz zu Beginn des Makros die Tabelle in der With-Anweisung angegeben haben, setzen Sie jeweils einen Punkt vor die Cells-Auflistung. Excel setzt dann zur Laufzeit des Makros die angegebene Tabelle direkt ein. So sparen Sie Schreibarbeit.
Zeilen einfärben Vielleicht haben Sie schon einmal einen Blick in ein Rechenzentrum geworfen. Dort gibt es riesige Papierrollen, auf denen Papier auf die Drucker geleitet wird. Dieses Papier ist oft liniert, d.h. eine Zeile weiß und eine Zeile grün. Stellen Sie im folgenden Makro ein solches Papier her: Listing 2.10: Liniertes Papier herstellen Sub Schleife02() Dim intZeile As Long
115
24128.book Seite 116 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
With Tabelle4 For intZeile = 1 To 20 Step 2 .Rows(intZeile).Interior.ColorIndex = 36 Next intZeile End With End Sub
Wenn Sie die Eigenschaft ColorIndex des Objektes Interior verwenden, dann läuft dieses Makro auch für die Excel-Versionen 97-2003! Wenn Sie ausschließlich für Excel 2007 Programmieren möchten, dann zeichnen Sie einmal über den Makrorekorder Eine normale Formatierung des Hintergrunds einer Zelle auf. Wie Sie sehen wird dabei die Eigenschaft Color verwendet. Die Schrittweite in Listing 2.9 ist dieses Mal nicht 1, sondern 2. Dabei geben Sie beim Argument Step die Zahl 2 an. Während der ganzen Verarbeitung bleibt der Mauszeiger ruhig. Sie verweisen lediglich immer auf die gewünschte Zelle. Über die Eigenschaft Rows gewinnen Sie Zugriff auf die komplette Zeile, die Sie über die Eigenschaft ColorIndex einfärben. Jeder Farbwert in Excel hat einen eindeutigen Farbindex. So hat die Farbe HELLGELB den Farbindex 36. In Kapitel 6 erfahren Sie noch, wie Sie die einzelnen Farben und deren Farbindexe auslesen können.
Abbildung 2.6: Das Papier im RechenzentrenLook
116
24128.book Seite 117 Mittwoch, 7. Februar 2007 12:06 12
Schleifen programmieren
Tabellennamen ermitteln Im nächsten Beispiel sollen Sie die Namen der Tabellen ermitteln, die sich in der aktiven Arbeitsmappe befinden. Dies ist wichtig, damit Sie die einzelnen Tabellen aktivieren und ansprechen können. Das Makro für diese Aufgabe lautet: Listing 2.11: Tabellennamen sammeln und ausgeben Sub Schleife03() Dim intTab As Integer Dim strName As String For intTab = 1 To ThisWorkbook.Worksheets.Count strName = strName & vbLf & Worksheets(intTab).Name Next intTab MsgBox "In dieser Mappe befinden sich folgende Tabellen: " & _ vbLf & strName, vbInformation + vbOKOnly End Sub
Die Schleife in Listing 2.10 ist dynamisch. Über die Anweisung ThisWorkbook.Worksheets.Count zählen 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 strName am Bildschirm aus.
Abbildung 2.7: Auflisten der Tabellennamen einer Mappe
117
24128.book Seite 118 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
For Each...Next-Schleifen Die Schleife For Each...Next wiederholt eine Gruppe von Anweisungen für jedes Element in einem Datenfeld oder einer Auflistung. Die Syntax dieser Schleife lautet: For Each Element In Gruppe [Anweisungen] [Exit For] [Anweisungen] Next [Element]
Das Argument Element stellt die Variable zum Durchlauf durch die Elemente der Auflistung oder des Datenfeldes dar. Bei Auflistungen sind für Element nur eine Variable vom Typ Variant, eine allgemeine Objektvariable oder eine beliebige spezielle Objektvariable zulässig. Bei Datenfeldern ist für Element nur eine Variable vom Typ Variant zulässig. Das nächste Argument Gruppe steht für den Namen einer Objektauflistung oder eines Datenfeldes. Das letzte Argument Anweisungen ist optional und führt eine oder mehrere Anweisungen durch, die für jedes Element in Gruppe ausgeführt werden sollen. Auch dieser wichtige Schleifentyp wird nun anhand praxisnaher Aufgaben geübt.
Zellen auswerten Im ersten Beispiel für die For Each...Next-Schleife sollen Sie Zellen eines vorher definierten Bereichs auswerten. Alle Zellen in diesem Bereich, die einen Wert > 80 aufweisen, sollen mit dem Schriftschnitt FETT belegt werden. Sehen Sie sich vorher die Ausgangssituation in der folgenden Abbildung an:
Abbildung 2.8: Die Ausgangslage – ein Bereich mit Zahlenwerten
118
24128.book Seite 119 Mittwoch, 7. Februar 2007 12:06 12
Schleifen programmieren
Erfassen Sie jetzt das Makro, welches den Zellenbereich B2:E10 untersucht und die Werte > 80 mit dem Schriftschnitt FETT belegt: Listing 2.12: Zellen in Zielbereich untersuchen Sub Schleife04() Dim Zelle As Range Dim Bereich As Range Set Bereich = 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 für 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 prüfen 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
119
24128.book Seite 120 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
Einheitliche Kopf- und Fußzeilen Im nächsten Beispiel werden Sie für eine einheitliche Gestaltung der Kopf- und Fußzeilen sorgen. Dabei arbeiten Sie alle Tabellen einer Arbeitsmappe ab, rufen die Seitenansicht auf und stellen die gewünschten Kopf- und Fußzeilen ein. Dabei werden folgende Informationen gewünscht: 쐽
Kopfzeile links: der Firmenname
쐽
Kopfzeile Mitte: der Name des Tabellenblattes
쐽
Kopfzeile rechts: das aktuelle Datum
쐽
Fußzeile links: der komplette Speicherpfad inkl. Dateinamen
쐽
Fußzeile Mitte: bleibt leer
쐽
Fußzeile rechts: Seitennummerierung
Erfassen Sie nun das Makro aus Listing 2.12: Listing 2.13: Einheitliche Kopf- und Fußzeilen erzeugen Sub Schleife05() Dim Tabelle As Worksheet Application.ScreenUpdating = False For Each Tabelle In ActiveWorkbook.Worksheets With Tabelle.PageSetup .LeftHeader = "Firmennamen" .CenterHeader = "&A" .RightHeader = "&D" .LeftFooter = "Pfad : " & ActiveWorkbook.FullName .CenterFooter = "" .RightFooter = "Seite &P von &N" End With Next Tabelle Set Tabelle = Nothing Application.ScreenUpdating = True End Sub
120
24128.book Seite 121 Mittwoch, 7. Februar 2007 12:06 12
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 durchläuft und über das Objekt PageSetup einheitliche Kopf- und Fußzeilen 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 Fußzeilen sind auf allen Tabellen einheitlich.
Excel-Arbeitsmappen zählen 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 für diese Aufgabe lautet: Listing 2.14: Alle Excel-Arbeitsmappen eines Verzeichnisses werden gezählt Sub Dim Dim Dim Dim Dim
Schleife06() fs As Object fVerz As Object fDatei As Object fDateien As Object strDat As String
121
24128.book Seite 122 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
Set fs = CreateObject("Scripting.FileSystemObject") Set fVerz = fs.GetFolder("C:\") Set fDateien = fVerz.Files For Each fDatei In fDateien If InStr(fDatei, "xl") > 0 Then strDat = strDat & fDatei.Name & vbLf End If Next fDatei MsgBox strDat End Sub
Zu Beginn des Makros erstellen Sie einen Verweis auf die Bibliothek FileSystemObject. Diese Bibliothek enthält alle Befehle, die notwendig sind, Verzeichnisse und Dateien auszulesen. Über die Anweisung GetFolder geben Sie bekannt, in welchem Verzeichnis Sie die Suche durchführen möchten. Das Auflistungsobjekt Files enthält automatisch alle Dateien, die im angegebenen Verzeichnis vorhanden sind. Über die Funktion Instr können Sie überprüfen, ob das Kürzel xl (Excel) im Dateinamen vorkommt. Wenn ja, dann sammeln Sie die Dateinamen dieser Dateien in einer String-Variablen und geben diese am Ende des Makros über die Funktion MsgBox am Bildschirm aus.
Abbildung 2.11: Die Namen der Excel-Arbeitsmappen werden am Bildschirm ausgegeben.
122
24128.book Seite 123 Mittwoch, 7. Februar 2007 12:06 12
Schleifen programmieren
Die Schleife Do Until...Loop Die Do Until...Loop-Schleife wiederholt einen Block mit Anweisungen, solange eine Bedingung den Wert True erhält. Die Bedingung wird jeweils am Ende der Schleife geprüft. Als Abbruchbedingung können Sie alles Mögliche abfragen; so können Sie z.B. eine Abbruchbedingung festlegen, wenn ein bestimmter Wert erreicht ist oder eine Zelle einen bestimmten Text aufweist. Beispielsweise könnten Sie eine solche Schleife so oft wiederholen, solange die Zellenformatierung der Zellen sich nicht ändert. Die Syntax dieser Schleife sieht wie folgt aus: Do [{Until} Bedingung] [Anweisungen] [Exit Do] [Anweisungen] Loop
Die Bedingung stellt einen numerischen Ausdruck oder Zeichenfolgenausdruck dar, der entweder erfüllt (True) oder nicht erfüllt (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 erfüllt ist. Innerhalb einer Do Until…Loop-Anweisung kann eine beliebige Anzahl von Exit Do-Anweisungen an beliebiger Stelle als Alternative zum Verlassen einer Do Until…Loop-Anweisung verwendet werden. Exit Do wird oft in Zusammenhang mit der Auswertung einer Bedingung (zum Beispiel If...Then) eingesetzt und hat zur Folge, dass die Ausführung mit der ersten Anweisung im Anschluss an Loop fortgesetzt wird. Üben Sie den Einsatz dieser Schleife mittels ein paar ausgesuchter Beispiele.
Jede x-te Zeile verstecken Im ersten Beispiel für die Do Until...Loop-Schleife werden Sie in einer Tabelle jede zweite Zeile ausblenden. Dabei gehen Sie von folgender Ausgangstabelle aus.
123
24128.book Seite 124 Mittwoch, 7. Februar 2007 12:06 12
Die Sprachelemente von VBA
Abbildung 2.12: Die Ausgangstabelle
Erfassen Sie nun das Makro, welches jede zweite Zeile ausblendet: Listing 2.15: Jede zweite Zeile ausblenden Sub Schleife07() Dim intZeile As Integer With Tabelle6 intZeile = .UsedRange.Rows.Count Do Until intZeile 2500 Then .Cells(intZeile, 3).Value = "A" End If intZeile = intZeile + 1 Loop End With End Sub
Definieren Sie im ersten Schritt eine so genannte Laufvariable vom Typ Integer, die Sie auf den Startwert 2 setzen, um die Verarbeitung ab der zweiten Zeile zu beginnen. Mit Hilfe dieser Laufvariablen arbeiten Sie sich Zeile für Zeile nach unten. So durchlaufen Sie in einer Schleife alle Buchungspositionen und führen eine Wertprüfung durch. Liegt die Buchung wertmäßig über 2500 Euro, dann schreiben Sie in die zweite Spalte den Buchstaben A. Setzen Sie für diese Aufgabe die Cells-Eigenschaft ein, bei der Sie das Zeilen-Argument mit der Variablen intZeile setzen und im Spaltenargument den Wert 2 angeben. Vergessen Sie nicht am Ende der Schleife die Laufvariable jeweils um den Wert 1 zu erhöhen, damit jeweils eine Zeile weiter nach unten angesprochen werden kann. Die Schleife wird verlassen, sobald die erste leere Zelle in Spalte B erreicht wird.
258
24128.book Seite 259 Mittwoch, 7. Februar 2007 12:06 12
Zellen formatieren
Abbildung 6.10: Alle höheren Buchungen wurden in Spalte C gekennzeichnet.
6.3
Zellen formatieren
Beim Formatieren von Zellen und Bereichen in Excel bieten sich Ihnen viele Möglichkeiten. Sie können Zelleneingaben in beliebiger Schriftart, Schriftgrad sowie Schriftschnitt vornehmen, Zahlen benutzerdefiniert formatieren, Zelleneinträge optisch ausrichten, Rahmen setzen, Muster hinzufügen und vieles mehr.
Hintergrundfarbe von Zellen festlegen Für die Formatierung des Zellenhintergrunds stehen Ihnen 56 Farben zur Verfügung. Jede dieser Farben hat einen eindeutigen Index, über den Sie die Farbe einstellen. Das folgende Makro aus Listing 6.12 erstellt eine neue Tabelle und gibt die Farben bzw. deren Index in einer Liste aus.
259
24128.book Seite 260 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Listing 6.12: Farbindex und Farbe ermitteln Sub FarbenAusgeben() Dim intZeile As Integer Dim tblZiel As Worksheet Set tblZiel = Sheets.Add With tblZiel .Range("A1").Value = "Index" .Range("B1").Value = "Farbe" For intZeile = 1 To 56 .Cells(intZeile, 1).Value = intZeile .Cells(intZeile, 2).Interior.ColorIndex = intZeile Next intZeile End With End Sub
Fügen Sie mithilfe der Anweisung Sheets.Add eine neue Tabelle in Ihre Arbeitsmappe ein. Gleichzeitig mit der Neuanlage der Tabelle weisen Sie mit der Anweisung Set der Tabelle einen Namen zu, über den Sie die Tabelle im weiteren Verlauf des Makros leichter ansprechen können. Danach füllen Sie die Zelle A1 und B1 mit der gewünschten Überschrift für 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 dazugehörige Farbe wenden Sie in Spalte B an, indem Sie die Eigenschaft ColorIndex auf das Objekt Interior anwenden. Das Objekt Interior steht für den Zellenhintergrund, den Sie mithilfe der Eigenschaft ColorIndex einfärben. Um auf schnelle Art und Weise zu erfahren, welcher Farbindex für welche Farbe steht, weisen Sie einer Zelle eine Farbe zu, setzen den Mauszeiger darauf und starten folgendes Makro:
260
24128.book Seite 261 Mittwoch, 7. Februar 2007 12:06 12
Zellen formatieren
Listing 6.13: Den aktuellen Zellfarbenindex bestimmen Sub FarbeAktiveZelle()
MsgBox "Die aktive Zelle " & ActiveCell.Address & _ " hat den Farbindex: " & ActiveCell.Interior.ColorIndex End Sub
Abbildung 6.11: Alle verfügbaren Farben und deren Indexwerte in einer Tabelle
Um die Färbung einer Zelle wieder zu entfernen, setzen Sie bitte nicht den ColorIndex = 2 ein, der für die Farbe WEISS steht. Weisen Sie stattdessen der Eigenschaft ColorIndex die Konstante XlColorIndexNone zu. Im folgenden Beispiel werden die Farben aller Zellen der TABELLE7 mit einem einzigen Befehl beseitigt: Listing 6.14: Alle Hintergrundfarben von Zellen in einer Tabelle entfernen Sub FarbenEntfernen() Tabelle7.Cells.Interior.ColorIndex = xlColorIndexNone End Sub
261
24128.book Seite 262 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Über die Eigenschaft Cells, die Sie ohne weitere Argumente angeben, haben Sie Zugriff auf alle Zellen der aktiven Tabelle. Diese Zellen entfärben Sie, indem Sie die Eigenschaft ColorIndex mit der Konstante XlColorIndexNone bestücken und auf das Objekt Interior anwenden.
Schriftart festlegen Wie Sie die Standardschriftart von Excel ändern können, haben Sie bereits am fünften Tag erfahren. Diese Änderung gilt dann für alle neuen Arbeitsmappen. Um die Schriftart bei allen anderen Arbeitsmappen zu ändern, muss diese über das Objekt Font angepasst werden. Im nächsten Beispiel soll auf einer bestimmten Tabelle ein vorgegebener Bereich mit der Schriftart Arial in der Schriftgröße 14 sowie dem Schriftschnitt Kursiv formatiert werden. Das Makro für diese Aufgabe sehen Sie in Listing 6.15: Listing 6.15: Eine andere Schriftart bzw. Schriftgröße einstellen Sub SchriftArtEinstellen() Dim zelle As Range Dim Bereich As Range Set Bereich = Tabelle5.Range("A1:E20") With Bereich.Font .Name = "Arial" .Size = 14 .Italic = True End With End Sub
Definieren Sie mithilfe der Anweisung Set einen Bereich auf einer bestimmten Tabelle. Dieser Bereich wird mit der Schriftart ARIAL sowie der Schriftgröße 14 formatiert. Das Objekt Font hat eine ganze Reihe von Eigenschaften, die Sie anwenden können. Für die eben gestellte Aufgabe werden die drei Eigenschaften Name, Size und Italic gebraucht. Bei der Angabe der Schriftart ist die korrekte Schreibweise der gewünschten Schriftart wichtig. Bei der Eigenschaft Size geben Sie eine gewünschte Größe für die Schrift an. Setzen Sie die Eigenschaft Italic auf den Wert True, um die Schrift in den Zellen kursiv zu stellen.
262
24128.book Seite 263 Mittwoch, 7. Februar 2007 12:06 12
Zellen formatieren
Abbildung 6.12: Ein definierter Bereich wurde mit einer anderen Schriftart formatiert
Die Schriftschnitte angeben Nachdem Sie die Schriftart und die Schriftgröße eingestellt haben, kommen wir nun zu den Schriftschnitten sowie sonstigen Formatierungsmöglichkeiten von Schriften. Alle Formatierungen werden anhand des Objekts Font vorgenommen. Entnehmen Sie weitere wichtige Eigenschaften des Objekts Font der folgenden Tabelle. Eigenschaft
Beschreibung
Bold
Diese Eigenschaft liefert den Wert True, wenn ein Text FETT formatiert ist.
Color
Diese Eigenschaft gibt die Primärfarbe des Objektes wieder. Möglich sind hierbei folgende Konstanten: vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan und vbWhite.
ColorIndex
Diese Eigenschaft gibt die Farbe des Rahmens, der Schriftart oder des Innenraums zurück. Es existieren in Excel genau 56 Farben.
FontStyle
Diese Eigenschaft sagt aus, welcher Schriftschnitt verwendet wird. Möglich sind u.a. Fett- und Kursivdruck.
Italic
Diese Eigenschaft liefert den Wert True, wenn ein Text KURSIV formatiert ist.
OutLineFont
Diese Eigenschaft liefert den Wert True, wenn ein Text als Konturschriftart formatiert wird.
Tabelle 6.1: Die wichtigsten Eigenschaften für das Objekt Font
263
24128.book Seite 264 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Eigenschaft
Beschreibung
Shadow
Diese Eigenschaft liefert den Wert True, wenn ein Text als schattierte Schriftart formatiert wird.
Strikethrough Diese Eigenschaft liefert den Wert True, wenn ein Text als horizontal
durchgestrichen dargestellt wird. Subscript
Diese Eigenschaft liefert den Wert True, wenn ein Text tiefergestellt formatiert wird.
Superscript
Diese Eigenschaft liefert den Wert True, wenn ein Text hochgestellt formatiert wird.
Underline
Diese Eigenschaft liefert den Wert True, wenn ein Text unterstrichen formatiert wird. Dabei können Sie u.a. Text einfach oder doppelt unterstreichen.
Tabelle 6.1: Die wichtigsten Eigenschaften für das Objekt Font (Forts.)
In der folgenden Aufgabe erstellen Sie als kleine Vorarbeit eine neue Tabelle und erzeugen im Zellenbereich B2:E20 einige Zufallszahlen. Dabei können Sie den Bereich markieren und die Formel =Ganzzahl(Zufallszahl()*1000) einfügen. Schließen Sie diese Formel ab, indem Sie die Tastenkombination (Strg) + (Enter) drücken. Die gerade erfasste Formel wird nun in jeder Zelle des markierten Bereiches eingefügt. Wenn Sie nun einige Male die Taste (F9) drücken, werden die Zahlen jedes Mal neu gebildet. Ersetzen Sie nun diese Formelzellen in Festwerte, indem Sie den Bereich markieren, kopieren und als Wert einfügen. Sie haben nun Zahlen vorliegen, die zwischen 0 und 999 liegen können. Ihre Beispieltabelle müsste nun in etwa wie in Abbildung 6.13 aussehen. Ihre Aufgabe besteht nun darin, alle Zellen, die einen Wert größer 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 WerteÜberprüfenUndKennzeichnen() Dim Zelle As Range Dim Bereich As Range Set Bereich = Tabelle9.Range("B2:E20")
264
24128.book Seite 265 Mittwoch, 7. Februar 2007 12:06 12
Zellen formatieren
For Each Zelle In Bereich If Zelle.Value > 600 Then Zelle.Font.Bold = True Zelle.Font.Italic = True End If Next Zelle End Sub
Abbildung 6.13: Die Ausgangstabelle mit den Zufallszahlen
Zu Beginn des Makros deklarieren Sie zwei Objektvariablen vom Typ Range. Danach aktivieren Sie die Tabelle, auf der Sie die Prüfung vornehmen möchten, und definieren den Bereich, um den es geht. Jetzt durchlaufen Sie jede einzelne Zelle im definierten Bereich und fragen deren Inhalt ab. Sind die Zahlenwerte größer als der Wert 600, dann weisen Sie dem Objekt Font über die Eigenschaften Bold und Italic die entsprechenden Schriftschnitte FETT und KURSIV zu.
265
24128.book Seite 266 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Abbildung 6.14: Alle Zellen > 600 wurden im Schriftschnitt geändert.
Zellen rahmen Für die Rahmengestaltung von Zellen steht Ihnen in Excel eine ganze Reihe von Möglichkeiten zur Verfügung. Welche Rahmentypen dies im Einzelnen sind, können Sie aus der folgenden Tabelle erfahren. Konstante
Beschreibung
xlContinuous
Durchgezogene Linie
xlDash
Gestrichelte Linie
xlDashDot
Linie aus Strichen und Punkten
xlDashDotDot
Linie aus Strich-Punkt-Punkt
xlDot
Gepunktete Linie
xlDouble
Linie doppelt
Tabelle 6.2: Die verschiedenen Rahmentypen in Excel
266
24128.book Seite 267 Mittwoch, 7. Februar 2007 12:06 12
Zellen formatieren
Konstante
Beschreibung
xlSlantDashDot
Linie aus Wellenzeichen und Punkt
xlLineStyleNone
Keine Linie
Tabelle 6.2: Die verschiedenen Rahmentypen in Excel (Forts.)
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 enthält. Die Lösung dieser Aufgabenstellung können 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 Exit Sub fehler: MsgBox "Der Vorgang wurde abgebrochen!" End Sub
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 Schaltfläche ABBRECHEN abgebrochen, dann wird eine Fehlerbehandlungsroutine durchgeführt. Markiert der Anwender wie geplant über die Eingabemaske den Bereich und klickt auf die Schaltfläche OK, dann wenden Sie die Eigenschaft ColorIndex auf das Objekt Borders (= Rahmen) an, um die Rahmenfarbe zu bestimmen. Ebenfalls
267
24128.book Seite 268 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
auf das gleiche Objekt angewendet wird die Eigenschaft LineStyle, die Sie mit der Konstanten xlDash belegen, um einen gestrichelten Rahmen zu erzeugen. Weitere Rahmenarten lernten Sie ja bereits in Tabelle 6.2 kennen.
Abbildung 6.15: Der gestrichelte rote Rahmen
Zahlenformate festlegen In Excel können Sie über das Dialogfeld FORMAT aus zahlreichen Zahlenformaten die passende Formatierung für Ihre Daten auswählen. Des Weiteren sind Sie in der Lage, eigene, benutzerdefinierte Formate anzulegen. In der nächsten Aufgabe soll ein Bereich mit recht hohen Zahlen mit dem Tausenderpunkt formatiert werden. Sehen Sie sich vorerst aber die Abbildung 6.16 an.
Abbildung 6.16: Diese Zahlen sind schwer lesbar.
268
24128.book Seite 269 Mittwoch, 7. Februar 2007 12:06 12
Zellen formatieren
Erhöhen 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() Tabelle11.Range("B2:E5").NumberFormat = "#,##0" End Sub
Das Zahlenformat wird in Excel über die Eigenschaft NumberFormat zugewiesen.
Abbildung 6.17: Die Lesbarkeit der Zahlenwerte ist um ein Vielfaches leichter.
Möchten Sie jegliche Formatierung Ihrer Daten löschen, 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 gelöscht Sub FormatierungLöschen() Tabelle11.Range("B2:E5").ClearFormats End Sub
Datumsformate festlegen In Excel werden Datumswerte intern in Zahlenwerte umgesetzt, damit Sie damit rechnen können. Die Zeitzählung beginnt bei Excel standardmäßig am 01.01.1900, was der Zahl 1 entspricht. Wenn Sie z.B. das Datum 27.12.2006
269
24128.book Seite 270 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
eingeben und diese Zelle dann mit dem Format STANDARD belegen, so liefert Ihnen dieses Datum die Zahl 39078. Excel bietet noch ein zweites Datumssystem an, das 1904-Datumssystem. Beim 1904-Datumssystem beginnt die Zeitrechnung in Excel am 01.01.1904. Das Datum 27.12.2006 entspricht in diesem Fall der Zahl 37616. Die Entscheidung, welches Datumssystem Sie wählen, liegt bei Ihnen. Wichtig dabei ist nur, dass Sie durchgängig dasselbe Datumssystem verwenden. Wechseln Sie niemals nachträglich 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 nächsten Aufgabe liegen in einer Tabelle unterschiedliche Datumsformatierungen vor. Sehen Sie sich hierfür 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 für alle anderen Zellen der Spalte A gültig werden. Listing 6.20: Datumsformat zuweisen Sub DatumsformatZuweisen() Tabelle12.Range("A1:A12").NumberFormat = "DD. MMMM YYYY" End Sub
270
24128.book Seite 271 Mittwoch, 7. Februar 2007 12:06 12
Zellen benennen
Bei der Eigenschaft NumberFormat können Sie mit Formatkürzeln arbeiten. Beim Beispiel aus Listing 6.20 steht der Buchstabe D für den Tag, der Buchstabe M für den Monat und der Buchstabe Y für das Jahr. Über die Anzahl der einzelnen Buchstaben können Sie die Formatierung des Datums bestimmen.
Abbildung 6.19: Datumsangaben vereinheitlichen
6.4
Zellen benennen
Selbstverständlich können Sie zur leichteren Navigation auf Tabellenblättern 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 müssen 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 Zellenbezüge benannt werden dürfen. Bei der Länge eines Namens können Sie bis zu 255 Zeichen verwenden, was in der Programmierung jedoch eher umständlich ist. Hier sollten Sie sich auf kurze, aber sprechende Namen verständigen. Eine weitere Einschränkung bei der Namensvergebung ist, dass Sie Namen nicht aus mehreren Wörtern bilden dürfen, d.h. konkret, dass Sie keine Leerzeichen verwenden dürfen. Die Groß- und Kleinschreibung spielt bei der Vergabe von Namen keine Rolle.
271
24128.book Seite 272 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
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 können. Listing 6.21: Namen vergeben Sub BereichBenennen() Dim Bereich As Range Dim Bereich2 As Range Set Bereich = Tabelle3.Range("C5:C24") ActiveWorkbook.Names.Add _ Name:="Kosten", RefersTo:=Bereich, Visible:=True Set Bereich2 = Tabelle3.Range("D5:D24") ActiveWorkbook.Names.Add _ Name:="Leistung", RefersTo:=Bereich2, Visible:=True Tabelle3.Activate Bereich.Select 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 gewünschten Namen an, unter dem Sie später den Zellbereich ansprechen möchten. Dabei können Sie den Namen frei wählen. Sie müssen allerdings darauf achten, dass Sie bei der Namensgebung die vorher beschriebenen Namenskonventionen einhalten. Den gewählten Namen müssen Sie in Anführungszeichen setzen.
쐽
Das Argument RefersTo gibt an, auf welchen Zellenbereich sich der Name beziehen soll.
쐽
Das Argument Visible bestimmt, ob der Name für den Anwender sichtbar sein soll oder nicht. Verwendete Namen können Sie in Excel anzeigen lassen, indem Sie den Befehl NAME/DEFINIEREN aus dem Menü EINFÜGEN wählen. Setzen Sie das Argument Visible auf den Wert False, wenn Sie verhindern möchten, dass der Anwender den von Ihnen gewählten Namen einsehen kann.
272
24128.book Seite 273 Mittwoch, 7. Februar 2007 12:06 12
Zellen benennen
Die Standardeinstellung für dieses Argument ist jedoch True, was bedeutet, dass sowohl die verwendeten Namen als auch deren Zellenadressen vom Anwender eingesehen werden können.
Abbildung 6.20: Die Blöcke Kosten und Leistung wurden benannt.
Möchten Sie die gerade eingefügten Namen wieder löschen, 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. Für alle Fälle sollten Sie eine Fehlerbehandlung integrieren, die den Fall abfängt, dass ein Name gelöscht wird, der bereits nicht mehr in der Arbeitsmappe vorhanden ist. Bei der Fehlerbehandlung in Listing 6.22 wird dieser Fehlerfall einfach ignoriert.
273
24128.book Seite 274 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
6.5
Zellen kommentieren
Kommentare können Sie in Excel u.a. einsetzen, um wichtige Vermerke zu bestimmten Zelleninhalten zu setzen, oder auch, um Änderungen an Zellen zu dokumentieren. Ob für eine Zelle ein Kommentar vorgenommen wurde, erkennen Sie normalerweise am roten Dreieck in der rechten oberen Ecke der Zelle, sofern die Ansicht dieses Indikators in Excel eingestellt ist. Diese Einstellung finden Sie bei den Excel-Optionen in der Rubrik Erweitert. Wenn Sie den Mauszeiger auf eine Zelle positionieren, wird automatisch ein kleines Textfenster eingeblendet, welches den Kommentar beinhaltet.
Kommentarzellen auskundschaften Wenn Sie mit sehr großen Tabellen arbeiten, die viele Kommentare enthalten, so ist es mitunter übersichtlicher, wenn Sie alle Kommentare am Stück in eine Liste schreiben und die dazugehörigen 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 Worksheet intZ As Integer
Set DokuBlatt = Worksheets.Add intZ = 1 For Each Tabelle In ThisWorkbook.Worksheets For Each Notiz In Tabelle.Comments DokuBlatt.Cells(intZ, 1).Value = Notiz.Text DokuBlatt.Cells(intZ, 2).Value = Notiz.Parent.Address & _ " in " & Tabelle.Name intZ = intZ + 1 Next Notiz Next Tabelle
274
24128.book Seite 275 Mittwoch, 7. Februar 2007 12:06 12
Zellen kommentieren
With DokuBlatt.Columns("A") .ColumnWidth = 40 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With With DokuBlatt.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 können. Des Weiteren benötigen Sie zwei Objektvariablen vom Typ Worksheet sowie eine Zählvariable vom Typ Integer. Über die Methode Add fügen Sie eine neue Tabelle ein. Auf dieser Tabelle sollen alle Kommentare, sowohl der Kommentartext als auch die Zellenadresse des Kommentars, dokumentiert werden. Setzen Sie die Zählvariable intZ auf den Startwert 1. Dieser Startwert steht für die erste Zeile der Tabelle. Setzen Sie jetzt eine Schleife auf, die alle Tabellen der Arbeitsmappe durchläuft. Eine weitere Schleife arbeitet alle Kommentare der einzelnen Tabellen ab. Innerhalb dieser zweiten Schleife füllen Sie das DokuBlatt in der ersten Spalte mit dem Text des jeweiligen Kommentars, den Sie über die Eigenschaft Text ermitteln können. Bei der Ermittlung der Zellenadresse eines Kommentars müssen Sie auf die Eigenschaft Parent zurückgreifen, die das übergeordnete Objekt des Objekts Comment, nämlich die Zelle, in der Kommentar steckt, zurückgibt. Mithilfe der Eigenschaft Address gelingt es Ihnen schließlich, 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 für die richtige Formatierung. Dabei definieren Sie über die Eigenschaft ColumnWidth die Spaltenbreite und kümmern sich mithilfe der Eigenschaften HorizontalAlignment bzw. VerticalAlignment um die Textausrichtung in den Zellen der Spalten A und B.
275
24128.book Seite 276 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Abbildung 6.21: Alle Kommentare der Arbeitsmappe sind auf einem separaten Blatt aufgelistet.
Kommentare aus Zelleninhalten erstellen Als Kommentare können Sie auch Zelleninhalte verwenden. Dies macht dann Sinn, wenn Sie beispielsweise anschließend Daten aus Zellen löschen, aber noch eine »Sicherung« als Kommentar dieser alten Werte behalten möchten. Im folgenden Makro aus Listing 6.24 wird auf die TABELLE3 zugegriffen. In dieser Tabelle werden alle Zelleneinträge aus dem Bereich C5:D24 herausgenommen und als Kommentare eingefügt. Listing 6.24: Kommentare aus Zelleninhalten bilden Sub Dim Dim Dim
KommentareAusZellen() Kom As Comment Bereich As Range Zelle As Range
Set Bereich = Tabelle3.Range("C5:D24") For Each Zelle In Bereich On Error Resume Next
276
24128.book Seite 277 Mittwoch, 7. Februar 2007 12:06 12
Zellen kommentieren
Set Kom = Zelle.AddComment Kom.Text Date & Chr(10) & Zelle.Value Next Zelle End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Comment sowie zwei vom Typ Range. Danach geben Sie die gewünschte Tabelle sowie den Bereich an, dessen Zellen Sie als Kommentare einfügen möchten. In einer anschließenden Schleife schieben Sie den Inhalt der einzelnen Zellen jeweils in ein Kommentarfenster. Dazu erzeugen Sie über die Anweisung Set Kom = Zelle.AddComment ein neues, noch leeres Kommentarfenster. Über die Eigenschaft Text erfassen Sie den Inhalt des Kommentars, der sich aus dem aktuellen Tagesdatum (Date) und dem Zelleninhalt ergibt.
Abbildung 6.22: Alle Zellen im markierten Bereich wurden mit Kommentaren ausgestattet.
Zellen füllen aus Kommentaren Gerade haben Sie gelernt, wie Sie aus Zelleninhalten Kommentare machen können. Auch der umgekehrte Vorgang ist interessant und von praktischer Bedeutung. Im nächsten Makro aus Listing 6.25 wird auf die TABELLE3 zugegriffen. Auf dieser Tabelle werden alle Kommentartexte gesammelt und versetzt um drei Spalten nach rechts wieder in die Zellen eingefügt.
277
24128.book Seite 278 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Listing 6.25: Kommentare in Zellen überführen Sub ZellenMitKommentarenFüllen() Dim Kom As Comment With Tabelle3 For Each Kom In .Comments .Range(Kom.Parent.Address).Offset(0, 3).Value = Kom.Text Next Kom End With 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 durchläuft und diese um drei Spalten verschoben in die Zellen der Spalten F und G einfügt. Wo der einzelne Kommentar in der Zelle steckt, ermitteln Sie über die Anweisung Kom.Parent.Address. Die Verschiebung bekommen Sie über die Eigenschaft Offset hin, 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 eingefügt.
278
24128.book Seite 279 Mittwoch, 7. Februar 2007 12:06 12
Zellen kommentieren
Kommentare löschen Oftmals dienen Kommentare lediglich als individuelle Gedankenstütze 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 möchten, dann starten Sie eines der drei Makros aus Listing 6.26 bis 6.28, welche folgende Funktionen erfüllen: 쐽
Löschen von Kommentaren, die sich in einem bestimmten Bereich einer Tabelle befinden
쐽
Löschen von allen Kommentaren, die sich in einer Tabelle befinden
쐽
Löschen aller Kommentare, die sich in der Arbeitsmappe befinden
Listing 6.26: Kommentare löschen im markierten Bereich Sub KommentareInTabelleLöschen() Sheets("Tabelle3").Activate Range("C5:D24").ClearComments End Sub
Für das Löschen von Kommentaren setzen Sie die Methode ClearComments ein. Um alle Kommentare einer Tabelle zu entfernen, starten Sie das Makro aus Listing 6.27. Listing 6.27: Alle Kommentare aus einer Tabelle entfernen Sub KommentareAusTabelleLöschen() Dim Kom As Comment For Each Kom In Tabelle3.Comments Kom.Delete Next Kom End Sub
279
24128.book Seite 280 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Deklarieren Sie zuerst eine Objektvariable vom Typ Comment, die Sie in einer anschließenden Schleife einsetzen, um alle Kommentare der TABELLE3 abzuarbeiten. Innerhalb der Schleife wenden Sie die Methode Delete an, um die Kommentare zu löschen. 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 KommentareAusMappeLöschen() Dim Tabelle As Worksheet Dim Kom As Comment For Each Tabelle In ThisWorkbook.Worksheets For Each Kom In Tabelle.Comments Kom.Delete Next Kom Next Tabelle End Sub
Um alle Kommentare aus einer Arbeitsmappe zu entfernen, benötigen Sie zwei Schleifen. Die erste Schleife arbeitet alle Tabellen der Arbeitsmappe ab. Die zweite Schleife durchläuft alle Kommentarzellen der jeweiligen Tabelle und entfernt die Kommentare mit Hilfe der Methode Delete. Gerade haben Sie gelernt, wie Sie Zellen ansteuern und auslesen können. Des Weiteren erfuhren Sie die Möglichkeiten, Zellen zu formatieren, zu benennen und mit Kommentaren zu belegen. Die Themen nun: 쐽
Arbeiten mit Formeln
쐽
Tabellenfunktionen einsetzen
쐽
Formeln finden und dokumentieren
쐽
Gültigkeitsprüfungen vornehmen
280
24128.book Seite 281 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Formeln
6.6
Arbeiten mit Formeln
Wenn wir von Formeln in VBA sprechen, dann meinen wir in erster Linie einmal die vier Grundrechenarten, die Sie vom Taschenrechner her kennen. Auch bei den Rechenregeln rechnet Excel nach der allgemein gültigen Punkt-vor-StrichRegel. Es folgen nun ein paar praktische Beispiele, in denen diese Rechenoperationen demonstriert werden. Alle Makrobeispiele können Sie in der Arbeitsmappe ZellenProg.xlsm im Verzeichnis Kap06 auf der beiliegenden CD-ROM nachschlagen.
Addition von bestimmten Sätzen Wenn Sie eine Zählschleife verwenden, dann wird jeder Schleifendurchlauf in einer Zählvariablen festgehalten. Bei einer solchen Schleife müssen Sie sich aber nicht um das Hochzählen der Zählvariablen kümmern. Diese Aufgabe erledigt Excel intern selbst. In der folgenden Aufgabe soll eine Tabelle Satz für Satz abgearbeitet werden. Dabei sollen Sätze gezählt werden, die einer bestimmten Bedingung (numerischer Inhalt) entsprechen. Sehen Sie sich vorher Abbildung 6.24 an.
Abbildung 6.24: Eine Tabelle mit alphanumerischen und numerischen Werten
281
24128.book Seite 282 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
In dieser Tabelle soll die Anzahl der numerischen Werte ermittelt und diese addiert werden. Das Makro dafür lautet: Listing 6.29: Numerische Zellen werden gezählt und summiert Sub WerteZählenUndAddieren() With Tabelle1 MsgBox "Summe der Werte aus Spalte A: " & _ Application.WorksheetFunction.Sum(Tabelle1.Columns(1)) & vbLf & _ "Anzahl der Werte der Spalte A: " & _ Application.WorksheetFunction.Count(Tabelle1.Columns(1)) End With End Sub
Zur Lösung dieser Aufgabenstellung sind keinerlei Schleifen notwendig. Sie können sich mit Hilfe der Tabellenfunktionen SUMME und ANZAHL, die so oder so in Excel bereits vorhanden sind, behelfen. Diese Funktionen können genauso gut in VBA über ein Makro mittels der Eigenschaft WorksheetFunction aufgerufen werden. Übergeben Sie diesen beiden Tabellenfunktionen einfach die komplette Spalte A und geben Sie das Ergebnis der Funktionen über die Funktion MsgBox am Bildschirm aus.
Abbildung 6.25: Addition von Zellen
282
24128.book Seite 283 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Formeln
Subtraktion von Datumsangaben Anhand einer Berechnung, die vom aktuellen Tagesdatum in die Vergangenheit geht, wird im folgenden Makro eine typische Subtraktion demonstriert. Ausgehend vom aktuellen Datum werden genau 30 Tage subtrahiert und das Ergebnis auf dem Bildschirm angezeigt. Listing 6.30: Eine Subtraktion von Datumswerten Sub DatumsBerechnung() Dim DatumVer As Date DatumVer = Date – 30 MsgBox "Heute ist der " & Date & Chr(13) & _ "Vor 30 Tagen war der " & DatumVer, vbInformation End Sub
Da Excel intern Datumsangaben in Zahlen umrechnet, ist es kein Problem, Datumsangaben miteinander zu verrechnen. Deklarieren Sie zu Beginn des Makros eine Variable vom Typ Date. Danach wenden Sie die Funktion Date an, die Ihnen das aktuelle Tagesdatum meldet, und subtrahieren Sie davon die Zahl 30. Geben Sie das Ergebnis auf dem Bildschirm über die Funktion MsgBox aus.
Abbildung 6.26: Datumssubtraktion durchführen
Preise erhöhen durch Multiplikation Mit der Multiplikation können Sie z.B. Werte in einer Tabelle anpassen. Durch die Multiplikation eines Preises mit dem Faktor 1,1 findet eine Preiserhöhung um 10% statt. Möchten Sie stattdessen Ihre Preise senken, dann multiplizieren Sie Ihre Preise mit dem Faktor 0,9, um die Preise um 10% zu senken. In der folgenden Abbildung sehen Sie eine Artikelliste, die mit dem Faktor 1,1 erhöht werden soll.
283
24128.book Seite 284 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Abbildung 6.27: Die Ausgangspreisliste
Ihre Aufgabe besteht nun darin, die Preise um den Faktor, der in Zelle F1 angegeben ist, zu erhöhen. Dabei sollen die alten Preise in Spalte C erhalten bleiben. Schreiben Sie die neuen Preise in Spalte D. Listing 6.31: Preise erhöhen und runden Sub PreisAnpassung() Dim Faktor As Single Dim intZeile As Integer With Tabelle2 intZeile = 2 Faktor = .Range("F1").Value Do Until .Cells(intZeile, 3).Value = "" .Cells(intZeile, 4).Value = _ Application.Round(.Cells(intZeile, 3).Value * Faktor, 2) intZeile = intZeile + 1 Loop End With 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 möchten. Nachdem Sie die gewünschte Tabelle und die Startzelle angegeben haben, durchlaufen Sie eine Schleife, die so lange läuft, bis sie auf die erste leere Zelle in Spalte C trifft.
284
24128.book Seite 285 Mittwoch, 7. Februar 2007 12:06 12
Tabellenfunktionen einsetzen
Innerhalb der Schleife füllen 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 hinter dem Komma gerundet werden soll.
Abbildung 6.28: Die Preise wurden um 10% erhöht
6.7
Tabellenfunktionen einsetzen
In Excel haben Sie die Möglichkeit, mehrere hundert verschiedene Funktionen über die normale Arbeitsoberfläche einzusetzen. Sehr viele dieser Tabellenfunktionen können Sie auch in VBA einsetzen.
Die Funktionsliste Alle VBA-Tabellenfunktionen müssen in der englischen Syntax angegeben werden, was nicht unbedingt leicht ist, wenn Sie täglich mit den deutschen Tabellenfunktionen in der normalen Arbeitsoberfläche arbeiten. Microsoft bietet Ihnen aber eine Hilfe an, indem Ihnen eine Excel-Tabelle mit ausgeliefert wird, in der Sie eine Gegenüberstellung der deutschen und englischen Funktionen finden. Diese Arbeitsmappe heißt VBAListe.xls und befindet sich in einem Unterverzeichnis von Office. Suchen Sie diese Arbeitsmappe am besten mit der Windows Suchen-Funktion.
285
24128.book Seite 286 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Abbildung 6.29: Eine Gegenüberstellung von Tabellenfunktionen
Mit dieser Liste können Sie sich daranmachen, die ersten Tabellenfunktionen über VBA zu benutzen.
Die Tabellenfunktion Sum Im ersten Beispiel für den Einsatz von Tabellenfunktionen in Excel-VBA werden Sie alle Preise der TABELLE2 summieren und das Ergebnis der Summation in Zelle D11 einfügen. Listing 6.32: Die Summe der neuen Preise wird ermittelt Sub SummeEinsetzen() Tabelle2.Range("D11").Value = _ Application.WorksheetFunction.Sum(Range("D2:D9")) End Sub
Aktivieren Sie im ersten Schritt die gewünschte 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.
286
24128.book Seite 287 Mittwoch, 7. Februar 2007 12:06 12
Tabellenfunktionen einsetzen
Abbildung 6.30: Die neuen Preise wurden summiert.
Wie Sie in Abbildung 6.32 sehen, wird nur das Ergebnis der Tabellenfunktion in Zelle D11 eingefügt. Im nächsten Makro aus Listing 6.33 wird die Tabellenfunktion so eingefügt, dass diese nicht als Wert, sondern als wirkliche Funktion hinterlegt wird. Listing 6.33: Eine Tabellenfunktion in eine Zelle einfügen (Var. 1, mit deutschen Befehlen) Sub SummeEinsetzenAlsTabFunktion() Tabelle2.Range("D11").FormulaLocal = "=Summe(D2:D9)" End Sub
Mithilfe der Eigenschaft FormulaLocal haben Sie die Möglichkeit, die Tabellenfunktionen so anzugeben, wie Sie es von der Standardoberfläche her kennen. Sollten Sie mit anderssprachigen Anwendern Makros austauschen, empfiehlt sich aber doch die englische Variante, welche Sie in Listing 6.34 sehen können. Listing 6.34: Eine Tabellenfunktion in eine Zelle einfügen (Var. 2, mit englischen Befehlen) Sub SummeEinsetzenAlsTabFunktionEng () Tabelle2.Range("D11").Formula = "=Sum(D2:D9)" End Sub
287
24128.book Seite 288 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
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.
Abbildung 6.31: Die Summe wird als Tabellenfunktion erfasst
Die Tabellenfunktionen DATEDIF und Rank Als zweites Beispiel für den Einsatz von Tabellenfunktionen habe ich mich für die Tabellenfunktionen DATEDIF und Rang entschieden. Mithilfe der Funktion DATEDIF können Sie Datumsberechnungen durchführen. Die Tabellenfunktion Rang, die in der englischen Syntax Rank heißt, legt, wie der Name sagt, den Rang einer Zelle innerhalb einer Liste fest. In der folgenden Aufgabe sollen die drei ältesten Personen aus einer Liste ermittelt werden. Dabei wird das Geburtsdatum der Personen in Spalte B erfasst. Ihre Aufgabe gliedert sich nun in zwei Teilaufgaben: 쐽
Ermitteln des Alters der Personen in Jahren
쐽
Ermitteln der drei ältesten Personen
Sehen Sie sich zu Beginn einmal Abbildung 6.34 an. Füllen Sie jetzt die Spalte C, indem Sie die Tabellenfunktion DATEDIF einsetzen. Sehen Sie sich dazu das Makro aus Listing 6.35 an.
288
24128.book Seite 289 Mittwoch, 7. Februar 2007 12:06 12
Tabellenfunktionen einsetzen
Abbildung 6.32: Die Ausgangssituation Listing 6.35: Das Alter mithilfe der Tabellenfunktion DATEDIF ermitteln Sub AlterErmitteln() Dim intZeile As Integer Dim intZeileMax As Integer With Tabelle4 intZeileMax = .UsedRange.Rows.Count For intZeile = 4 To intZeileMax .Cells(intZeile, 3).FormulaLocal = _ "=DATEDIF(" & .Cells(intZeile, 2).Address & ";B1;""Y"")" Next intZeile End With End Sub
Ermitteln Sie zuerst einmal, wie viele Zeilen Sie in der Tabelle verarbeiten müssen. Dazu zählen Sie vom benutzten Bereich die Zeilen, indem Sie die Anweisung UsedRange.Rows.Count verwenden. Die dort ermittelte Anzahl der zu verarbeiten-
289
24128.book Seite 290 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
den Zeilen bildet auch das Endkriterium für Ihre Schleife. In dieser Schleife füllen Sie die Spalte C mit dem Alter der jeweiligen Personen. Dabei setzen Sie die Tabellenfunktion DATEDIF ein, der Sie im ersten Argument die Adresse der jeweiligen Zelle übergeben müssen und im zweiten Argument das aktuelle Tagesdatum, welches in Zelle B1 steht. Im dritten Argument legen Sie über ein Formatkürzel fest, in welcher Einheit Sie das Alter haben möchten (Tag = D, Monat = M und Jahr = Y). Nachdem das Kürzel in doppelten Anführungsstrichen eingegeben werden muss, müssen Sie in diesem Fall noch zwei weitere doppelte Anführungsstriche setzen, damit der VBA-Editor die Eingabe richtig auswerten kann.
Abbildung 6.33: Das Alter in Jahren wurde ermittelt.
Im nächsten Schritt sollen die ältesten Personen ermittelt werden. Erfassen Sie zu diesem Zweck das Makro aus Listing 6.36: Listing 6.36: Die ältesten Personen über die Funktion Rank bestimmen Sub Dim Dim Dim
290
RangErmitteln() Bereich As Range intZeile As Integer intZeileMax As Integer
24128.book Seite 291 Mittwoch, 7. Februar 2007 12:06 12
Tabellenfunktionen einsetzen
With Tabelle4 intZeileMax = .UsedRange.Rows.Count Set Bereich = .Range("C4:C15") For intZeile = 4 To intZeileMax .Cells(intZeile, 4).FormulaLocal = _ Application.WorksheetFunction.Rank(.Cells(intZeile, 3), Bereich) Next intZeile End With 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 für die Rangfolgenbestimmung herangezogen werden soll. Setzen Sie danach den Mauszeiger auf die Startzelle und durchlaufen Sie eine Schleife, die so lange durchlaufen wird, bis das Makro auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife fügen Sie die Tabellenfunktion Rank über die Eigenschaft WorksheetFunction ein und übergeben dieser Funktion die aktive Zelle sowie den vorher definierten Bereich.
Abbildung 6.34: Wilhelm ist die älteste Person in der Liste,
291
24128.book Seite 292 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Die Tabellenfunktion SumIf Im nächsten Beispiel sollen aus einer Liste in TABELLE3 all diejenigen Positionen summiert werden, die einen Wert von 500 Euro oder mehr aufweisen. Für diese Aufgabe können Sie die Worksheet-Funktion SumIf (= Summewenn) einsetzen. Mithilfe dieser Tabellenfunktion können Sie also eine bedingte Summierung durchführen. Listing 6.37: Die bedingte Summierung von Werten Sub BedingteSummierung() Dim Betrag As Single With Tabelle3 Betrag = Application.WorksheetFunction.SumIf _ (.Range("C2:C9"), ">500") MsgBox "Die Summe der Werte > 500 _ beträgt:" & _ Chr(13) & Format(Betrag, "#,##0.00 _"), vbInformation End With 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 gewünschte Format zu. Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in die TABELLE3 eingefügt werden, starten Sie das folgende Makro aus Listing 6.38. Listing 6.38: Die Tabellenfunktion bleibt als Funktion in der Tabelle erhalten Sub BedingteSummierungAlsFunktion() Sheets("Tabelle3").Range("D12").Formula = "=SumIf(D2:D9,"">500"" )" End Sub
Weisen Sie der Eigenschaft Formula die Tabellenfunktion SumIf zu und achten Sie dabei darauf, dass Sie um die Bedingung ein doppeltes Anführungszeichen zusätzlich einfügen müssen, damit der VBA-Editor dies so erkennen kann.
292
24128.book Seite 293 Mittwoch, 7. Februar 2007 12:06 12
Tabellenfunktionen einsetzen
Abbildung 6.35: Alle Werte größer als 500 wurden summiert.
Die Tabellenfunktion CountIf Im folgenden Beispiel sollen auf TABELLE4 alle Personen gezählt werden, die älter als 60 Jahre sind. Für diese Aufgabe setzen Sie die Worksheet-Funktion Countif (= Zählenwenn) ein, mithilfe derer Sie die bedingte Zählung durchführen können. Listing 6.39: Eine bedingte Zählung durchführen Sub BedingteZählung() Dim intZ As Integer With Tabelle4 intZ = Application.WorksheetFunction.CountIf _ (.Range("C4:C15"), ">60") MsgBox "Die Anzahl der Personen, die älter als 60 sind, lautet:" & _ intZ, vbInformation End With End Sub
293
24128.book Seite 294 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Übergeben Sie der Funktion CountIf den Bereich, in dem Sie die Personen zählen möchten, die älter als 60 Jahre sind. Die Bedingung >60 formulieren Sie gleich im Anschluss daran.
Abbildung 6.36: Alle Personen, die älter als 60 sind, werden gezählt und ausgegeben.
Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in die TABELLE4 eingefügt werden, dann starten Sie das folgende Makro aus Listing 6.40. Listing 6.40: Die Tabellenfunktion wird als Funktion eingefügt Sub BedingteZählungAlsFunktion() Tabelle4.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 doppeltes Anführungszeichen zusätzlich einfügen müssen, damit der VBA-Editor dies so erkennen kann.
294
24128.book Seite 295 Mittwoch, 7. Februar 2007 12:06 12
Tabellenfunktionen einsetzen
Abbildung 6.37: Die Funktion wurde eingefügt.
Die Tabellenfunktion Count Mithilfe der Worksheet-Funktion Count (= Anzahl) können Sie alle numerischen Werte in einer Liste zählen. Im folgenden Beispiel sollen dabei alle numerischen Werte der Spalte A gezählt und ausgegeben werden. Sehen Sie sich dazu das Makro aus Listing 6.41 an. Listing 6.41: Alle numerischen Werte einer Liste zählen Sub ZählenNumerischeWerte() Dim intZ As Integer With Tabelle1 intZ = Application.WorksheetFunction.Count(.Range("A1:A17")) MsgBox "Die Anzahl der numerischen Werte, lautet: " & _ intZ, vbInformation End With End Sub
295
24128.book Seite 296 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Wenden Sie die Tabellenfunktion Count (= Anzahl) an, um numerische Werte einer Liste zu zählen. Den Bereich, der dabei überprüft werden soll, geben Sie direkt im Anschluss an diese Tabellenfunktion an.
Abbildung 6.38: Die Tabellenfunktion Count zählt numerische Werte.
Die Tabellenfunktion CountA Ist es Ihnen egal, was in einer Zelle steht, sei es nun ein numerischer oder ein alphanumerischer Wert, dann müssen Sie zur Zählung dieser Zellen die Tabellenfunktion CountA (= Anzahl2) einsetzen, wie Sie dies im nächsten Makro aus Listing 6.42 sehen können. Listing 6.42: Alle gefüllten Zellen werden gezählt Sub ZählenAlleZellen() Dim intz As Integer With Tabelle1
296
24128.book Seite 297 Mittwoch, 7. Februar 2007 12:06 12
Tabellenfunktionen einsetzen
intz = Application.WorksheetFunction.CountA(.Range("A1:A17")) MsgBox "Die Anzahl der gefüllten Zellen, lautet:" & _ intz, vbInformation End With End Sub
Möchten Sie nicht das Ergebnis der Tabellenfunktionen, sondern eben die Tabellenfunktionen selbst einfügen, starten Sie das Makro aus Listing 6.43. Listing 6.43: Die Zählfunktionen in die Tabelle einfügen Sub ZählungAlsFunktionen() With Tabelle1 .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 With End Sub
Abbildung 6.39: Funktionen auch als Text einfügen
In der Spalte B werden die eingesetzten Funktionen aus Dokumentationszwecken noch mal als Text eingefügt. Wie Sie sehen, setzen Sie zwar englische Funktionen zum Füllen 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 für die jeweilige Zelle einen Apostroph gesetzt und somit diese Zelle als Text definiert haben.
297
24128.book Seite 298 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Sie haben gerade gelernt, wie Sie die Anzahl der numerischen Zellen sowie die Anzahl aller gefüllten Zellen eines Bereiches zählen können. Wie aber können Sie die alphanumerischen Zellen eines Bereiches zählen? Für diese Aufgabenstellung gibt es keine eigene Tabellenfunktion in Excel. Sie können aber die beiden Tabellenfunktionen CountA und Count voneinander subtrahieren, um die Anzahl der alphanumerischen Zellen zu erhalten, wie Sie das im folgenden Makro sehen können. Listing 6.44: Zählen von alphanumerischen Zellen Sub ZählenAlphanumerischeZellen() Dim intz As Integer With Tabelle1 intz = Application.WorksheetFunction.CountA(.Range("A1:A17")) _ - Application.WorksheetFunction.Count(Range("A1:A17")) MsgBox "Die Anzahl der alphanumerischen Zellen, lautet: " & _ intz, vbInformation End With End Sub
Durch die Subtraktion beider Tabellenfunktionen erhalten Sie die korrekte Anzahl der alphanumerischen Zellen.
Die Tabellenfunktion CountBlank Neben den beiden Tabellenfunktionen Count und CountA gibt es die Möglichkeit, in Excel auch leere Zellen eines Bereiches zu zählen. Setzen Sie für diesen Zweck die Tabellenfunktion CountBlank (= AnzahlLeereZellen) ein. Im folgenden Beispiel aus Listing 6.45 greifen Sie wiederum auf die TABELLE1 zu und ermitteln im Bereich A1:A18 die Anzahl der leeren Zellen.
298
24128.book Seite 299 Mittwoch, 7. Februar 2007 12:06 12
Tabellenfunktionen einsetzen
Listing 6.45: Die Anzahl der leeren Zellen eines Bereichs ermitteln Sub ZählenLeereZellen() Dim intZ As Integer With Tabelle1 intZ = Application.WorksheetFunction.CountBlank(.Range("A1:A18")) MsgBox "Die Anzahl der leeren Zellen, lautet:" & _ intZ, vbInformation End With End Sub
Übergeben Sie der Tabellenfunktion CountBlank den Bereich, den Sie nach leeren Zellen absuchen möchten. Enthält eine Zelle lediglich ein Leerzeichen, dann meldet die Funktion CountBlank diese Zelle nicht als leer. Sie ist für Ihre Augen zwar optisch leer, für Excel aber ist das Leerzeichen eben auch ein gültiger Wert. Da führende 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.46: 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.
299
24128.book Seite 300 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
6.8
Formeln finden und dokumentieren
In umfangreichen Tabellen ist es gar nicht mal so einfach, den Überblick zu bewahren. Vor allem wenn darin viele Formeln und Funktionen verwendet werden.
Formelzellen finden Eine Möglichkeit, sich Formeln, Funktionen und Verknüpfungen anzeigen zu lassen, besteht darin, die Tastenkombination (Strg) + (#) zu drücken, um in die Formelansicht zu wechseln. Durch erneutes Drücken dieser Tastenkombination wird die Normalansicht von Excel wiederhergestellt. Eine andere Hilfe wäre, alle Formeln und Verknüpfungen der aktuellen Tabelle zu markieren. Dabei gehen Sie wie folgt vor: 1. Drücken Sie die Taste (F5), um das Dialogfeld GEHE ZU aufzurufen. 2. Klicken Sie danach auf die Schaltfläche INHALTE. 3. Im Dialogfeld INHALTE AUSWÄHLEN aktivieren Sie die Optionsschaltfläche FORMELN.
Abbildung 6.40: Alle Formelzellen der Tabelle aktivieren
4. Bestätigen Sie mit OK.
300
24128.book Seite 301 Mittwoch, 7. Februar 2007 12:06 12
Formeln finden und dokumentieren
Als Ergebnis werden nun alle Formelzellen der aktuellen Tabelle markiert. Mit der Taste (Tab) können Sie dann von Zelle zu Zelle springen und die Formel in der Bearbeitungsleiste ansehen. Diese gerade durchgeführte Aufgabe können Sie auch über den Einsatz eines VBA-Makros erledigen, welches Sie in Listing 6.47 sehen können: Listing 6.47: 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 Verknüpfungen enthalten.
Abbildung 6.41: Alle Formelzellen sind in der Tabelle markiert worden.
301
24128.book Seite 302 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Über die Methode SpecialCells können Sie mithilfe der folgenden Konstanten aus Tabelle 6.3 auch andere Zellen markieren. Konstante
Beschreibung
xlCellTypeAllFormatConditions
Markiert alle formatierten Zellen
xlCellTypeAllValidation
Zellen mit Gültigkeitsregeln werden markiert
xlCellTypeBlanks
Gibt alle leere Zellen an
xlCellTypeComments
Zellen mit Kommentaren werden markiert
xlCellTypeConstants
Zellen mit Konstanten werden markiert
xlCellTypeFormulas
Zellen mit Formeln werden markiert
xlCellTypeLastCell
Letzte Zelle im benutzten Bereich wird angesteuert
xlCellTypeSameFormatConditions
Zellen mit gleichem Format werden markiert
xlCellTypeSameValidation
Zellen mit gleichen Gültigkeitskriterien werden markiert
xlCellTypeVisible
Alle sichtbaren Zellen werden markiert
Tabelle 6.3: Die Konstanten der Methode SpecialCells
Formelzellen dokumentieren Wir werden jetzt einen Schritt weiter gehen. Nachdem Sie gerade erfahren haben, wie Sie die Formelzellen der aktiven Tabelle ermitteln können, werden Sie jetzt alle verwendeten Formeln und Funktionen der Arbeitsmappe auf einer neuen Tabelle dokumentieren. Dabei sind folgende Informationen für die Dokumentation von Interesse: 쐽
Name des Tabellenblattes
쐽
die Zellenadresse der Formel oder Funktion
쐽
die Formel oder Funktion
쐽
das Ergebnis der Formel oder Funktion
302
24128.book Seite 303 Mittwoch, 7. Februar 2007 12:06 12
Formeln finden und dokumentieren
Um diese Aufgabe zu lösen, erfassen Sie das Makro aus Listing 6.48: Listing 6.48: Alle Formeln und Funktionen werden in einer neuen Tabelle dokumentiert Sub Dim Dim Dim Dim
FormelnUndFunktionenDokumentieren() intTab As Integer zelle As Range ZielTab As Worksheet intZ As Integer
Set ZielTab = Worksheets.Add(Before:=Worksheets(1)) With ZielTab .Cells(1, 1).Value = .Cells(1, 2).Value = .Cells(1, 3).Value = .Cells(1, 4).Value = .Range(.Cells(1, 1),
"Tabelle" "Zelle" "Formel/Funktion" "Inhalt" .Cells(1, 4)).Font.Bold = True
intZ = 2 For intTab = 2 To ThisWorkbook.Worksheets.Count Worksheets(intTab).Activate On Error Resume Next Selection.SpecialCells(xlCellTypeFormulas).Select For Each zelle In Selection .Cells(intZ, 1).Value = Worksheets(intTab).Name .Cells(intZ, 2).Value = zelle.Address .Cells(intZ, 3).Value = "'" & zelle.FormulaLocal .Cells(intZ, 4).Value = zelle.Value intZ = intZ + 1 Next zelle Next intTab .Columns("A:D").AutoFit End With End Sub
Im ersten Schritt des Makros fügen Sie über die Methode Add ein neues, noch leeres Tabellenblatt an die erste Position der Mappe ein.
303
24128.book Seite 304 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Erfassen Sie nun die Überschriftenzeile dieser neuen Tabelle und verwenden Sie dabei die Eigenschaft Cells, der Sie als Zeilenargument die Variable 1 übergeben. 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. Sprechen Sie direkt im Anschluss diese vier gefüllten Überschriftenzellen an und formatieren Sie mit dem Schriftschnitt FETT, indem Sie die Eigenschaft Bold auf das Objekt Font anwenden. Im nächsten Schritt durchlaufen Sie eine Schleife, die jede einzelne Tabelle der Arbeitsmappe durchläuft. 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 dafür, dass es zu keinem Makroabsturz kommt. Enthält eine 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 intTab »variabel« halten, gibt Ihnen Auskunft darüber, welche Tabelle gerade aktiv ist. Die Zellenadresse der jeweiligen Formelzelle können 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, müssen Sie dabei als erstes Zeichen ein Apostroph einfügen, damit die Formel als Text angezeigt wird. Den Wert der markierten Formelzelle bekommen Sie über die Eigenschaft Value, die Sie im Dokumentationsblatt in Spalte D schreiben. Stellen Sie am Ende des Makros die Spalten noch so ein, dass alle Einträge auch auf einen Blick angezeigt werden. Verwenden Sie zu diesem Zweck die Methode AutoFit, die Sie für die Spalten A bis D anwenden.
304
24128.book Seite 305 Mittwoch, 7. Februar 2007 12:06 12
Gültigkeitsprüfungen vornehmen
Abbildung 6.42: Eine Auflistung aller Formeln/ Funktionen der Arbeitsmappe
6.9
Gültigkeitsprüfungen vornehmen
Seit der Version 97 ist es in Excel standardmäßig möglich, für bestimmte Zellen und Bereiche eine Gültigkeitsfunktion anzuwenden. Sie haben dabei die Möglichkeit zu bestimmen, welche Eingaben in einem Bereich gemacht werden dürfen und welche nicht. Bei Falscheingaben können Sie dem Anwender mittels einer Bildschirmmeldung mitteilen, wie er die Eingabe zu machen hat. Wenn Sie möchten, können Sie den Anwender sogar schon vor der Eingabe beim Positionieren des Cursors im Gültigkeitsbereich durch eine QuickInfo-Meldung auf die richtige Eingabesyntax aufmerksam machen. Die Funktion GÜLTIGKEIT können Sie einstellen, indem Sie im Ribbon DATEN das Symbol DATENÜBERPRÜFUNG klicken. Standardmäßig sehen Sie es den Zellen nicht an, ob diese mit einem Gültigkeitskriterium ausgestattet sind oder nicht. Erst wenn Sie den Mauszeiger auf eine Zelle mit eingestellten Gültigkeitskriterien positionieren und vorher eine Eingabemeldung definiert haben, erkennen Sie die Zellen mit Gültigkeitsfunktion.
305
24128.book Seite 306 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Abbildung 6.43: Aus einer Liste können Einträge ausgewählt werden
Abbildung 6.44: Elegante Auswahl aus einem Zellendropdown
Eine kleine Ausnahme bildet das Auswahlkriterium LISTE. Damit können Sie für eine Zelle gleich mehrere mögliche Eingaben akzeptieren, die auf eine Liste verweisen. In diesem Fall erscheint nach dem Positionieren des Mauszeigers ein Dropdown-Symbol am rechten unteren Rand der Gültigkeitszelle, welches Ihnen nach einem Klick ein Auswahlfenster mit den möglichen Eingabewerten der Liste anbietet. Lernen Sie nun einige Gültigkeitseinstellungen kennen, die Sie über den Einsatz von VBA-Makros in Ihre Tabellen einfügen.
306
24128.book Seite 307 Mittwoch, 7. Februar 2007 12:06 12
Gültigkeitsprüfungen vornehmen
Nur ganze Zahlen eingeben Erstellen Sie nun ein Gültigkeitskriterium für eine Zelle mithilfe von VBA. Auf dem Tabellenblatt TABELLE5 sollen in Zelle C3 nur ganze Zahlen zwischen 1 und 10 zugelassen werden. Dazu erstellen Sie das Makro aus Listing 6.49. Listing 6.49: Nur ganze Zahlen zwischen 1 bis 10 dürfen eingegeben werden Sub GültigkeitHinzufügen() With Tabelle5.Range("C3").Validation .Add Type:=xlValidateWholeNumber, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:="1", _ Formula2:="10" .InputTitle = "Zahl eingeben!" .ErrorTitle = "Keine gültige Zahl!" .InputMessage = _ "Geben Sie eine Zahl zwischen 1 und 10 ein." .ErrorMessage = _ "Sie müssen eine Zahl zwischen 1 und 10 eingeben." End With End Sub
Mithilfe der Methode Add fügen Sie der Zelle C3 eine Gültigkeitsregel hinzu. Im ersten Argument Type legen Sie das Gültigkeitskriterium fest. Die möglichen Gültigkeitskriterien entnehmen Sie Tabelle 6.4. Type
Index
Beschreibung
xlValidateInputOnly
0
Jede Eingabe ist erlaubt.
xlValidateWholeNumber
1
Nur ganze Zahlen im definierten Zahlenbereich sind erlaubt.
xlValidateDecimal
2
Nur Dezimalzahlen im definierten Wertbereich werden zugelassen.
xlValidateList
3
Es sind nur Eingaben aus einer vorher definierten Liste möglich.
Tabelle 6.4: Die verfügbaren Gültigkeitskonstanten
307
24128.book Seite 308 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
Type
Index
Beschreibung
xlValidateDate
4
Es sind nur Datumswerte im definierten Datumsbereich erlaubt.
XlValidateTime
5
Es sind nur Zeitwerte im definierten Rahmen zulässig.
XlValidateTextLength
6
Es werden nur Eingaben mit bestimmten Längen zugelassen.
XlValidateCustom
7
Benutzerdefiniertes Gültigkeitskriterium
Tabelle 6.4: Die verfügbaren Gültigkeitskonstanten (Forts.)
Das zweite Argument AlertStyle legt den Stil der Gültigkeitsmeldung fest. Möglich sind hierbei xlValidAlertInformation, xlValidAlertStop oder xlValidAlertWarning. Je nach gewähltem Stil wird ein anderes Symbol in der Meldung angezeigt bzw. wird entsprechend auf Falscheingaben reagiert. Der AlertStyle xlValidAlertStop lässt 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 nächsten Argument, dem Operator, orientieren Sie sich an Tabelle 6.5: Operator-Konstante
Beschreibung
xlBetween
Zellenwert ist zwischen ...
xlNotBetween
Zellenwert ist nicht zwischen ...
xlEqual
Zellenwert ist gleich ...
xlNotEqual
Zellenwert ist ungleich ...
xlGreater
Zellenwert ist größer ...
xlGreaterEqual
Zellenwert ist größer oder gleich ...
xlLess
Zellenwert ist kleiner ...
xlLessEqual
Zellenwert ist kleiner oder gleich ...
Tabelle 6.5: Die Konstanten für den Operator
308
24128.book Seite 309 Mittwoch, 7. Februar 2007 12:06 12
Gültigkeitsprüfungen vornehmen
Die beiden letzten Argumente Formula1 und Formula2 beinhalten die Wertgrenzen. Sehen Sie nun das Ergebnis des Makros in Abbildung 6.48.
Abbildung 6.45: Falsche Eingaben werden verworfen.
Datumsgrenzen einstellen Mithilfe der Gültigkeitsfunktion in Excel können Sie auch Datumsgrenzen festlegen. So sollen beispielsweise in Zelle C4 nur Datumsangaben vom 1.1.2006 bis zum 31.12.2006 gemacht werden dürfen. Das Makro für diese Aufgabe können Sie in Listing 6.50 sehen. Listing 6.50: Datumsgrenzen als Gültigkeit festlegen Sub Datumsgrenzen() With Tabelle5.Range("C4").Validation .Delete .Add Type:=xlValidateDate, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, _ Formula1:=CDate("1/1/2006"), _ Formula2:=CDate("31/12/2006") .IgnoreBlank = True .InputTitle = "Datum eingeben" .ErrorTitle = "Falsches Datum" .InputMessage = _ "Gültiges Datum zw. dem 1.1.2006 und dem 31.12.2006 eingeben" .ErrorMessage = _
309
24128.book Seite 310 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
"Sie haben kein gültiges Datum eingegeben!" .ShowInput = True .ShowError = True End With End Sub
Vorsorglich löschen Sie eine eventuell schon bestehende Gültigkeitsregel mit der Methode Delete. Danach fügen Sie eine neue Gültigkeitsregel über die Methode Add ein und legen den Gültigkeitstyp über die Eigenschaft Type fest. Bei der Eingabe des Gültigkeitskriteriums müssen Sie auf alle Fälle die Funktion CDate verwenden. Sie sorgt dafür, dass die String-Angabe ("1/1/2006") in ein gültiges Datumsformat konvertiert wird. Die Eigenschaft IgnoreBlank setzen Sie auf den Wert True, wenn Sie leere Werte zulassen möchten. Danach definieren Sie zuerst den Eingabetitel sowie die Fehlertitel und anschließend die beiden Meldungen. Bei den beiden Eigenschaften ShowInput und ShowError handelt es sich um eine Art Schalter, den Sie setzen können. Standardmäßig sind diese beiden Schalter jedoch gesetzt. Indem Sie einen Schalter auf den Wert False setzen, wird die definierte Meldung als QuickInfo nicht mehr angezeigt.
Abbildung 6.46: Datumseingaben überprüfen
310
24128.book Seite 311 Mittwoch, 7. Februar 2007 12:06 12
Gültigkeitsprüfungen vornehmen
Gültigkeitsliste erstellen Um dem Anwender mögliche Eingaben anzubieten, können Sie diese auch in einer Liste zusammenstellen und ihm als Zellendropdown anbieten. In der folgenden Aufgabe aus Listing 6.51 wird auf der TABELLE5 in der Zelle C5 ein Zellendropdown eingefügt, welches verfügbare Kostenstellen anbietet. Listing 6.51: Eine Gültigkeitsliste erstellen Sub ListeDefinieren() With Tabelle5.Range("C5").Validation .Delete .Add Type:=xlValidateList, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlEqual, _ Formula1:="1790, 1800, 1830, 1850, 1900" .InputMessage = _ "Bitte Kostenstelle auswählen" End With End Sub
Um eine Gültigkeitsliste zusammenstellen zu können, müssen Sie eine Gültigkeit über die Methode Add vom Typ xlValidateList einfügen. Danach geben Sie im Argument Operator die Konstante XlEqual an und im Argument Formula1 die einzelnen möglichen Kostenstellen, jeweils getrennt durch ein Komma, ein.
Abbildung 6.47: Ein Zellendropdown zur Verfügung stellen
311
24128.book Seite 312 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
6.10 Fragen & Antworten F
Wie können Sie die letzten fünf Zellen einer Spalte markieren? A
Diese Aufgabe können Sie mit folgendem Makro lösen:
Listing 6.52: Die letzten fünf Zellen einer Spalte markieren
Sub Letzte5ZeilenInSpalteMarkieren() Sheets("Tabelle4").Activate Range("A1048576").End(xlUp).Select Range(Selection, ActiveCell.Offset(-4, 0)).Select End Sub A
F
Über die Eigenschaft End ermitteln Sie die letzte belegte Zelle der Spalte A. Von da ab markieren Sie über die Methode Select die darüber liegenden vier Zellen, indem Sie den Zellen-Offset auf den Wert –4 setzen.
Wie können Sie aus allen benutzten Zellen einer Tabelle die Leerzeichen eliminieren? A
Starten Sie zu diesem Zweck das folgende Makro:
Listing 6.53: Leerzeichen aus Zellen entfernen
Sub LeerzeichenAusZellenEntfernen() Dim zelle As Range For Each zelle In ActiveSheet.UsedRange zelle.Value = Application.Trim(zelle.Value) Next zelle End Sub A
312
Über die Anweisung ActiveSheet.Usedrange bekommen Sie den benützten Bereich Ihrer Tabelle heraus. Durchlaufen Sie danach jede einzelne Zelle dieses Bereichs und setzen Sie die Funktion Trim ein, um die Leerzeichen in den Zellen zu entfernen.
24128.book Seite 313 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
F
Wie können Sie über den Einsatz einer Tabellenfunktion in VBA den zweitgrößten Wert in einem Bereich ermitteln? A
Setzen Sie für diese Aufgabe die Funktion Large ein.
Listing 6.54: Die zweitgrößte Zahl in einem Bereich ausgeben Sub ZweitGrößteZahlErmitteln() Dim sngZahl As Single sngZahl = Application.WorksheetFunction.Large _ (Tabelle1.Range("A1:A17"), 2) MsgBox "Die zweit-größte Zahl lautet: " & _ Chr(13) & sngZahl, vbInformation End Sub A
F
Die Funktion Large benötigt zwei Argumente. Im ersten Bereich geben Sie die Adresse des Bereichs an, in dem Sie nach der zweithöchsten Zahl suchen möchten. Das zweite Argument gibt den Rang wieder.
Wie können Sie die Anzahl der Formelzellen auf einer Tabelle zählen? A
Geben Sie dazu das Makro aus Listing 6.55 ein:
Listing 6.55: Formelzellen in einer Tabelle zählen Sub FormelnZählen() Dim l As Long Dim zelle As Range For Each zelle In ActiveSheet.Cells.SpecialCells(xlFormulas) l = l + 1 Next zelle MsgBox "Die Anzahl der Formelzellen lautet: " & l End Sub A
Über die Methode SpecialCells, der Sie die Konstante xlFormulas mitgeben, können Sie die Formelzellen in einer Tabelle ermitteln. Diese markieren Sie über die Methode Select. Innerhalb der Schleife zählen Sie die markierten Zellen.
313
24128.book Seite 314 Mittwoch, 7. Februar 2007 12:06 12
Zellenbearbeitung mit VBA
6.11 Quiz F
Wie kann man mithilfe der Eigenschaft Cells eine Zelle ansteuern?
F
Wie können Sie den verwendeten Bereich einer Tabelle bestimmen?
F
Welche Methode muss man einsetzen, wenn man mehrere Bereiche vereinen möchte?
F
Wie können Sie die Hintergrundfarbe der aktiven Zelle am schnellsten bestimmen?
F
Was muss man bei der Vergabe von Namen mit VBA beachten?
F
Was ist der Unterschied zwischen den beiden Eigenschaften Formula bzw. FormulaLocal?
F
Wie heißt die Arbeitsmappe, in der eine Gegenüberstellung von englischen und deutschen Tabellenfunktionen angeboten wird?
F
Mit welcher Methode kann man sich bestimmte Zellen in einer Tabelle markieren lassen?
F
Was müssen Sie bei der Gültigkeitsprüfung in Bezug auf Datumseingaben beachten?
6.12 Übungen Zum Abschluss des Tages versuchen Sie die folgenden fünf Übungen zu lösen. Die Lösungsmakros können Sie im Anhang nachblättern: 1. Erstellen Sie eine neue Tabelle und fügen Sie dort im Bereich A1:D20 einige Zahlenwerte ein. Ihre Aufgabe besteht nun darin, alle Zellen zu kennzeichnen, die einen Wert größer 500 aufweisen. Färben 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 einfügen und den Namen und dessen Zellenadresse ausgeben. 4. Löschen Sie alle Gültigkeitsfestlegungen aus einer Tabelle! 5. Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte!
314
24128.book Seite 315 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen 7
24128.book Seite 316 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Am gestrigen Tag haben Sie gelernt, wie Sie mit Formaten, Formeln und Tabellenfunktionen in VBA-Excel umgehen. Auch das Aufspüren von Formeln und deren Konvertierung in Festwerte sowie die Gültigkeitsprüfung waren weitere wichtige Themen des gestrigen Tages. Die Themen heute: 쐽
Was sind Ereignisse?
쐽
Ereignisse auf Arbeitsmappenebene
쐽
Ereignisse auf Tabellenblattebene
쐽
Excel über Tastenkombinationen steuern
쐽
Programmieren mit der Maus
쐽
Excel zeitmäßig steuern
7.1
Was sind Ereignisse?
Die Programmierung von Ereignissen ist eines meiner Lieblingsthemen in der VBA-Programmierung. Was steckt dahinter? Nun, unter einem Ereignis können Sie alle möglichen Vorgänge 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 Vorgänge in Excel, die auch Ereignisse genannt werden. Sie haben die Möglichkeit, weitere Aktionen diesen Ereignissen anzuhängen, d.h. Sie können beispielsweise dafür sorgen, dass beim Ereignis Öffnen einer Arbeitsmappe weitere VBA-Befehle ausgeführt werden sollen. Sie haben somit die Möglichkeit, auf jedes Ereignis in Excel individuell zu reagieren. Bei den Ereignissen unterscheidet man in erster Linie zwischen Ereignissen, die für die gesamte Arbeitsmappe gelten, und Ereignissen, die nur auf bestimmten Tabellenblättern Geltung haben. Ereignisse für eine Arbeitsmappe wären beispielsweise das Öffnen, Speichern, Drucken oder Schließen einer Arbeitsmappe. Ein Beispiel für ein Tabellenereignis wäre z.B. die Erfassung von Daten in einer Tabelle oder das Aktivieren bzw. Verlassen einer Tabelle. Selbstverständlich gibt es noch viele weitere Ereignisse, wie z.B. Ereignisse bei UserForms (Dialogen) und Steuerelementen, die Sie am 13. Tag kennen lernen werden.
316
24128.book Seite 317 Mittwoch, 7. Februar 2007 12:06 12
Ereignisse auf Arbeitsmappenebene
Alle Beispiele dieses Tages finden Sie auf der beiliegenden CD-ROM in den Arbeitsmappen Ereignisse.xlsm und Steuerung.xlsm im Verzeichnis Kap07.
7.2
Ereignisse auf Arbeitsmappenebene
Wichtige Ereignisse, welche für die Arbeitsmappe gelten, sind zum einen das Ereignis Workbook_Open, das eintritt, sobald die Arbeitsmappe geöffnet wird, und zum anderen das Ereignis Workbook_BeforeClose, welches automatisch ausgelöst wird, sobald die Arbeitsmappe geschlossen wird.
Das Ereignis Workbook_Open Das Ereignis Workbook_Open (beim Öffnen) wird in der Praxis meist eingesetzt, um Meldungen anzuzeigen, um benutzerdefinierte Arbeitsumgebungen einzurichten, um Sachverhalte zu prüfen oder auch um viele verschiedene Aufgaben zu erledigen, die einen vorbereitenden Charakter haben. Im nächsten Beispiel werden Sie beim Öffnen einer Arbeitsmappe dafür sorgen, dass eine bestimmte Tabelle aktiviert wird. Standardmäßig stellt Excel beim Öffnen einer Arbeitsmappe immer die Tabelle ein, die direkt vor der letzten Speicherung der Arbeitsmappe aktiviert war. Wenn Sie daran denken, dass Sie beispielsweise eine Art Inhaltsverzeichnis für die Arbeitsmappe in TABELLE1 erstellt haben, wäre es nun eine tolle Sache, diese Tabelle standardmäßig beim Öffnen der Arbeitsmappe einzustellen. Um das Ereignis Workbook_Open einzustellen, gehen Sie wie folgt vor: 1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an. 3. Klicken Sie im Codefenster auf den Pfeil des linken Kombinationsfeldes und wählen Sie den Eintrag Workbook aus. Excel stellt Ihnen nun standardmäßig ein schon vorgefertigtes Ereignismakro zur Verfügung. Private Sub Workbook_Open() End Sub
317
24128.book Seite 318 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Abbildung 7.1: Das Ereignis Workbook_Open einstellen
Mit einem Klick auf das zweite Kombinationsfeld bekommen Sie alle verfügbaren Ereignisse angezeigt, welche für die Arbeitsmappe einsetzbar sind. Ergänzen Sie nun den eingestellten Rahmen des Ereignisses um folgende Zeilen: Listing 7.1: Beim Öffnen eine bestimmte Tabelle aktivieren Private Sub Workbook_Open() On Error GoTo fehler Worksheets("Tabelle1").Activate Exit Sub fehler: MsgBox "Die Tabelle ist nicht vorhanden!" End Sub
Bauen Sie sicherheitshalber eine Fehlerbehandlung in ein Ereignis ein. Für den Fall, dass das gewünschte Tabellenblatt umbenannt bzw. gelöscht wurde, haben Sie somit verhindert, dass das Makro abstürzt.
318
24128.book Seite 319 Mittwoch, 7. Februar 2007 12:06 12
Ereignisse auf Arbeitsmappenebene
Möchten Sie eine Arbeitsmappe mit hinterlegten Ereignissen öffnen und dabei auf deren Ausführung verzichten, so drücken Sie beim Öffnen der Datei die Taste (Shift).
Das Ereignis Workbook_BeforeClose Das Ereignis Workbook_BeforeClose (vor dem Schließen) tritt genau dann ein, wenn Sie versuchen, eine Arbeitsmappe zu schließen. Dieses Ereignis kann aber auch so eingestellt werden, dass es abgebrochen wird, d.h. über einen Trick können Sie verhindern, dass eine Arbeitsmappe geschlossen wird. Sie können dabei aber eine versteckte Möglichkeit bereithalten, die es Ihnen dennoch erlaubt, die Arbeitsmappe zu schließen. Im folgenden Beispiel in Listing 7.2 kann eine Arbeitsmappe nur dann geschlossen werden, wenn in TABELLE1 in Zelle C1 der Text OK steht. Um dieses Ereignis einzustellen, verfahren Sie wie folgt: 1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und wählen Sie den Eintrag Workbook aus. 4. Im zweiten Kombinationsfeld, rechts oben, wählen Sie den Eintrag BeforeClose aus. 5. Ergänzen Sie das Ereignis wie folgt: Listing 7.2: Das Schließen einer Arbeitsmappe verhindern Private Sub Workbook_BeforeClose(Cancel As Boolean) If Worksheets("Tabelle1").Range("C1").Value "OK" Then MsgBox "Arbeitsmappe kann nicht geschlossen werden!" Cancel = True Else Cancel = False ThisWorkbook.Save End If End Sub
319
24128.book Seite 320 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
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 anderen Fall bleibt die Arbeitsmappe geöffnet. Das Speichern der Arbeitsmappe ist aber weiterhin möglich!
Das Ereignis Workbook_BeforeSave Beim Ereignis Workbook_BeforeSave (vor dem Speichern) können Sie gezielt darauf reagieren, wenn eine Arbeitsmappe gespeichert wird. Im folgenden Beispiel wird verhindert, dass eine Arbeitsmappe gespeichert werden kann. Damit können Sie Ihre Arbeitsmappe vor Veränderungen schützen, ohne die Arbeitsmappe durch ein Kennwort zu schützen. Die Speicherung soll aber in einem bestimmten Fall doch möglich sein, und zwar vereinbaren Sie, dass die Arbeitsmappe gespeichert werden darf, wenn das Datum in Zelle A1 der TABELLE1 dem aktuellen Datum entspricht. Setzen Sie diese Aufgabenstellung nun um, indem Sie die nächsten Arbeitsschritte befolgen: 1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und wählen Sie den Eintrag Workbook aus. 4. Im zweiten Kombinationsfeld, rechts oben, wählen Sie den Eintrag BeforeSave aus. 5. Ergänzen Sie das Ereignis wie folgt: Listing 7.3: Speichern ist nur über eine Bedingung möglich Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) If Worksheets("Tabelle1").Range("A1").Value Date Then MsgBox "Arbeitsmappe kann nicht gespeichert werden!" Cancel = True Else
320
24128.book Seite 321 Mittwoch, 7. Februar 2007 12:06 12
Ereignisse auf Arbeitsmappenebene
Cancel = False End If End Sub
Nur wenn in der Zelle A1 ein Datumswert steht, der dem aktuellen Tagesdatum entspricht, kann die Arbeitsmappe gespeichert werden. In diesem Fall wird das Argument Cancel auf den Wert False gesetzt und die Arbeitsmappe gespeichert.
Das Ereignis Workbook_NewSheets Mit dem Ereignis Workbook_NewSheets (beim Einfügen einer neuen Tabelle), das erst ab der Excel-Version 2002 verfügbar ist, können Sie auf das Einfügen neuer Tabellenblätter in eine Arbeitsmappe reagieren. Im folgenden Beispiel können Sie neue Tabellenblätter nur einfügen, wenn Sie ein bestimmtes Kennwort wissen. Setzen Sie diese Aufgabenstellung nun um, indem Sie die nächsten Arbeitsschritte befolgen: 1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie den Eintrag DIESEARBEITSMAPPE doppelt an. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und wählen Sie den Eintrag Workbook aus. 4. Im zweiten Kombinationsfeld, rechts oben, wählen Sie den Eintrag NewSheet aus. Ergänzen Sie das Ereignis wie folgt: Listing 7.4: Die Neuanlage von Tabellen überwachen Private Sub Workbook_NewSheet _ (ByVal Sh As Object) Dim s As String s = InputBox("Wie heißt das Kennwort?") If s "Test" Then Application.DisplayAlerts = False Sh.Delete
321
24128.book Seite 322 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
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 Löschvorgang der Tabelle keine Rückfragemeldung von Excel angezeigt wird, setzen Sie die Eigenschaft DisplayAlerts auf den Wert False. Nach dem Löschen der Tabelle setzen Sie diese Eigenschaft wieder auf den Wert True.
Weitere Arbeitsmappenereignisse im Überblick Entnehmen Sie aus der Tabelle 7.1 alle möglichen Ereignisse, die Sie für die Arbeitsmappe anwenden können. Das eine oder andere Ereignis werden Sie im Laufe der nächsten Tage wiedersehen. Ereignis
Beschreibung
Workbook_Activate
Tritt ein, sobald eine Arbeitsmappe aktiviert wird.
Workbook_AddinInstall
Tritt ein, wenn ein Add-In eingebunden wird. Dies kann entweder durch direktes Öffnen des Add-Ins erfolgen oder auch durch das Einbinden im Add-Ins-Manager.
Workbook_AddinUninstall
Tritt ein, wenn ein Add-In aus dem Add-InsManager deaktiviert wird.
Workbook_BeforePrint
Tritt vor dem Druck einer Arbeitsmappe oder auch nur einzelner Tabellen ein.
Workbook_BeforeSave
Tritt vor dem Speichern-Vorgang ein. Dabei spielt es keine Rolle, ob Sie über Menübefehle, Symbolleiste oder Tastenkombination speichern.
Workbook_Deactivate
Tritt ein, wenn eine Arbeitsmappe deaktiviert wird. Beispielsweise wenn eine Arbeitsmappe minimiert wird.
Tabelle 7.1: Alle Arbeitsmappenereignisse im Überblick
322
24128.book Seite 323 Mittwoch, 7. Februar 2007 12:06 12
Ereignisse auf Arbeitsmappenebene
Ereignis
Beschreibung
Workbook_NewSheet
Tritt ein, wenn eine neue Tabelle in die Arbeitsmappe eingefügt wird.
Workbook_SheetActivate
Tritt ein, wenn ein beliebiges Tabellen- oder Diagrammblatt in der Arbeitsmappe aktiviert wird.
Workbook_SheetBeforeDoubleClick
Tritt ein, wenn an einer beliebigen Stelle der Arbeitsmappe ein Doppelklick mit der linken Maustaste durchgeführt wird.
Workbook_SheetBeforeRightClick
Tritt ein, wenn an einer beliebigen Stelle der Arbeitsmappe ein Klick mit der rechten Maustaste durchgeführt wird.
Workbook_SheetCalculate
Tritt nach Neuberechnung jedes Tabellenblattes auf.
Workbook_SheetChange
Tritt ein, wenn sich auf einem beliebigen Tabellenblatt etwas ändert, sei es durch eine Verknüpfung oder durch den Anwender.
Workbook_SheetDeactivate
Tritt ein, sobald ein beliebiges Tabellenblatt in der Arbeitsmappe verlassen wird.
Workbook_SheetFollowHyperlink
Tritt ein, wenn der Anwender auf einen Hyperlink in einer Tabelle klickt.
Workbook_SheetSelectionChange
Tritt ein, wenn sich die Markierung auf einem Tabellenblatt ändert.
Workbook_WindowActivate
Tritt ein, wenn ein Arbeitsmappenfenster aktiviert wird.
Workbook_WindowDeactivate
Tritt ein, wenn ein Arbeitsmappenfenster deaktiviert wird.
Workbook_WindowResize
Tritt ein, wenn eine Änderung an der Größe des Arbeitsmappenfensters durchgeführt wurde.
Tabelle 7.1: Alle Arbeitsmappenereignisse im Überblick (Forts.)
323
24128.book Seite 324 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
7.3
Ereignisse auf Tabellenblattebene
Im Gegensatz zu Arbeitsmappenereignissen, die für alle Tabellen einer Arbeitsmappe gleichermaßen gelten, können Sie über Tabellenereignisse ganz gezielt Ereignisse für bestimmte Tabellenblätter einstellen. Ein wichtiges Ereignis, das für das Tabellenblatt gilt, ist z.B. das Ereignis Worksheet_Activate, mit dem Sie bestimmen können, was passieren soll, wenn ein bestimmtes Tabellenblatt aktiviert wird. Auch das Ereignis Worksheet_Change ist von großer Bedeutung in der Praxis: Mithilfe dieses Ereignisses können Sie auf Änderungen in Ihren Tabellen reagieren. Dabei haben Sie die Möglichkeit, Änderungen in der gesamten Tabelle oder ganz gezielt in einzelnen Zellen oder Bereichen zu überwachen.
Das Ereignis Activate Das Ereignis Activate (beim Aktivieren) tritt dann ein, wenn Sie eine Tabelle aktivieren. Dabei ist es egal, ob Sie die Tabelle über die Registerlaschen, über die Tastenkombination (Strg) + (Bild_o) bzw. (Strg) + (Bild_u) oder gar über einen Fensterwechsel ansteuern. In allen Fällen wird dieses Ereignis ausgeführt, sofern Sie es in der Entwicklungsumgebung eingestellt haben. Im folgenden Beispiel wird beim Aktivieren der TABELLE2 automatisch die aktuelle Uhrzeit in Zelle A1 eingetragen. Um das Ereignis Activate für diese Aufgabe einzustellen, verfahren Sie wie folgt: 1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen möchten, doppelt an. In unserem Beispiel ist das die TABELLE2. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und wählen Sie den Eintrag Worksheet aus. 4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Activate aus. 5. Ergänzen Sie das noch leere Ereignismakro wie folgt:
324
24128.book Seite 325 Mittwoch, 7. Februar 2007 12:06 12
Ereignisse auf Tabellenblattebene
Listing 7.5: Das letzte Zugangsdatum der Tabelle festhalten Private Sub Worksheet_Activate() Range("A1").Value = Format(Time, "hh:mm") End Sub
Abbildung 7.2: Das Ereignis Activate einstellen
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 Formatkürzel hh für Stunden und mm für Minuten übergeben. Möchten Sie zusätzlich noch die Sekunden mitanzeigen, dann ändern Sie die Zeile wie folgt: Range("A1").Value = Format(Time, "hh:mm,ss")
Das Ereignis Change Das wohl am häufigsten eingesetzte Ereignis lautet Change (bei Änderung) und kann eingesetzt werden, um auf Änderungen in Ihrer Tabelle zu reagieren. Sie haben dabei die Möglichkeit, die gesamte Tabelle, einen Teil davon oder einzelne Zellen auf Veränderungen hin zu überwachen. Im folgenden Beispiel werden alle zukünftigen Änderungen der TABELLE3 sofort kenntlich gemacht, indem der Hintergrund dieser Zellen mit der Farbe ROT
325
24128.book Seite 326 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
belegt wird. Gehen Sie dabei von einer Personalliste aus, welche täglich aktualisiert und am Ende eines Monats zu Auswertungszwecken herangezogen wird. Die Änderungen an dieser Liste sollen dann nachvollzogen werden können. Schauen Sie sich dazu einmal die Ausgangsliste in Abbildung 10.3 an.
Abbildung 7.3: Die Ausgangsliste
Im Verlauf eines Monats können 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 Gründe, eine Personalliste zu ändern, gibt es in Hülle und Fülle. Machen Sie nun die Veränderungen sichtbar, indem Sie das Ereignis Worksheet_Change einstellen. Dabei verfahren Sie wie folgt: 1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen möchten, doppelt an. In unserem Beispiel ist das die TABELLE3.
326
24128.book Seite 327 Mittwoch, 7. Februar 2007 12:06 12
Ereignisse auf Tabellenblattebene
3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und wählen Sie den Eintrag Worksheet aus. 4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Change aus. 5. Ergänzen Sie das noch leere Ereignismakro wie folgt: Listing 7.6: Alle Änderungen in der Tabelle einfärben Private Sub Worksheet_Change(ByVal Target As Range) Target.Interior.ColorIndex = 3 End Sub
Wenden Sie die Eigenschaft ColorIndex auf das Objekt Interior (= Hintergrund der Zelle) an und färben Sie das Objekt Target (= Zelle) rot, indem Sie den Farbindex 3 einsetzen.
Abbildung 7.4: Die Änderungen werden sofort ersichtlich.
Haben Sie am Ende des Monats alle Ihre Änderungen nachvollzogen, können Sie die Färbungen wieder entfernen, ohne dass dadurch das Ereignis Change ausgelöst wird. Ereignisse reagieren allgemein nicht auf Formatänderungen. Im nächsten Beispiel wird das Ereignis Change in TABELLE4 nur ausgelöst, wenn Änderungen in einem bestimmten Bereich C4:C8 durchgeführt werden. Sehen Sie sich vorab einmal Abbildung 10.5 an.
327
24128.book Seite 328 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Abbildung 7.5: Im Formular soll auf Eingaben reagiert werden.
Alle Eingaben im Bereich C4 bis C8 sollen sofort in Großbuchstaben umgewandelt werden. Erfassen Sie zu diesem Zweck das Ereignis Change hinter der TABELLE4. 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 prüfen Sie, ob die geänderte Zelle im definierten Zielbereich Bereich liegt. Wenn ja, setzen Sie die Funktion UCase ein, um die eingegebenen Buchstaben in Großbuchstaben umzuwandeln. Um Buchstaben in Kleinbuchstaben zu wandeln, setzen Sie die Funktion LCase ein.
Das Ereignis Selection_Change Wenn Sie auf der Suche nach einer bestimmten Information in einer Tabelle sind und diese auch gefunden haben, interessiert Sie nicht nur der Inhalt der gefundenen Zelle, sondern oft auch die Informationen, die in den übrigen Zellen der Zeile stecken. Aus diesem Grund können Sie das Ereignis Worksheet_
328
24128.book Seite 329 Mittwoch, 7. Februar 2007 12:06 12
Ereignisse auf Tabellenblattebene
Abbildung 7.6: Eingaben im Bereich C4:C8 werden automatisch nach Drücken der Taste (Enter) in Großbuchstaben umgesetzt. SelectionChange (bei Auswahländerung) auch einsetzen, um die Markierung einer Zelle auf die Markierung der ganzen Zeile auszuweiten.
Stellen Sie das Ereignis Selection_Change nun ein, indem Sie wie folgt vorgehen: 1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen möchten, doppelt an. In unserem Beispiel ist das die TABELLE4. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und wählen Sie den Eintrag Worksheet aus. 4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Selection_Change aus. 5. Ergänzen Sie das noch leere Ereignismakro wie folgt: Listing 7.8: Einen dynamischen Zeilenzeiger programmieren Private Sub Worksheet_SelectionChange _ (ByVal Target As Excel.Range) Application.EnableEvents = False Rows(Target.Row).Select Target.Activate Application.EnableEvents = True End Sub
Im Listing 7.8 müssen 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 dafür, dass der Mauszeiger trotzdem wieder auf der ursprünglich markierten Zelle positioniert wird. Setzen
329
24128.book Seite 330 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Sie daraufhin die Eigenschaft EnableEvent wieder auf den Wert True, um die Ereignissteuerung zuzulassen.
Abbildung 7.7: Ein automatischer Zeilenzeiger
Das Ereignis Calculate Das Ereignis Calculate (bei Neuberechnung) wird automatisch ausgelöst, wenn die Tabelle neu berechnet wird. Dies ist immer dann der Fall, wenn sich Formeln bzw. Funktionen aktualisieren. Im folgenden Beispiel sehen Sie sich einmal Abbildung 10.8 an.
Abbildung 7.8: Das einfache Summierungsbeispiel
Wenn Sie jetzt die Zelle B10 überwachen möchten, dann können Sie dies nicht über das Ereignis Change durchführen, da diese Zelle eine Formel beinhaltet, die sich automatisch anpasst, wenn Änderungen in den Zellen B5:B9 durchgeführt werden.
330
24128.book Seite 331 Mittwoch, 7. Februar 2007 12:06 12
Ereignisse auf Tabellenblattebene
Sie müssen daher entweder die Zellen B5:B9 überwachen oder ganz allgemein das Ereignis Calculate einsetzen, das automatisch ausgelöst wird, wenn eine Neuberechnung durchgeführt wird. Um das Ereignis Calculate einzustellen, verfahren Sie wie folgt: 1. Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu gelangen. 2. Im Projekt-Explorer klicken Sie die Tabelle, welcher Sie das Ereignis zuweisen möchten, doppelt an. In unserem Beispiel ist das die TABELLE6. 3. Klicken Sie im Code-Fenster auf den Pfeil des linken Kombinationsfeldes und wählen Sie den Eintrag Worksheet aus. 4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Calculate aus. Ergänzen Sie das noch leere Ereignismakro wie folgt: Listing 7.9: Das Ereignis Calculate wird bei Änderungen in der Tabelle ausgeführt Private Sub Worksheet_Calculate() MsgBox "Es wurde eine Neuberechnung der Tabelle durchgeführt!" End Sub
Weitere Tabellenereignisse im Überblick Entnehmen Sie aus der folgenden Tabelle alle Ereignisse, die Sie auf Tabellenebene einsetzen können. Ereignis
Beschreibung
Worksheet_Activate
Tritt ein, wenn ein Tabellenblatt aktiviert wird.
Worksheet_Change
Tritt ein, wenn sich der Wert in einer Zelle ändert.
Worksheet_Calculate
Tritt ein, wenn eine Tabelle neu berechnet wird.
Worksheet_Deactivate
Tritt ein, wenn ein Tabellenblatt deaktiviert wird. Beispielsweise wenn ein Tabellenblatt verlassen wird.
Tabelle 7.2: Alle Tabellenereignisse im Überblick
331
24128.book Seite 332 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Ereignis
Beschreibung
Worksheet_FollowHyperlink
Tritt ein, wenn der Anwender auf einen Hyperlink in einer Tabelle klickt.
Worksheet_SelectionChange
Tritt ein, wenn sich die Markierung auf einem Tabellenblatt ändert.
BeforeDoubleClick
Tritt ein, wenn an einer beliebigen Stelle der Tabelle ein Doppelklick mit der linken Maustaste durchgeführt wird.
BeforeRightClick
Tritt ein, wenn an einer beliebigen Stelle der Tabelle ein Klick mit der rechten Maustaste durchgeführt wird.
Calculate
Tritt nach Neuberechnung eines Tabellenblattes auf.
PivotTableUpdate
Tritt auf, wenn Sie eine Pivot-Tabelle aktualisieren.
Tabelle 7.2: Alle Tabellenereignisse im Überblick (Forts.)
7.4
Excel über Tastenkombinationen bedienen
Viele Standardfunktionen in Excel können Sie über Tastenkombinationen bzw. FTasten abrufen. Am vorhergehenden Tag haben Sie beispielsweise erfahren, dass Sie über die Taste (F11) ein Standarddiagramm in Excel einfügen können. Auch die Tastenkombinationen (Strg) + (C) und (Strg) + (V), um Daten zu kopieren bzw. einzufügen, gehören zum Standard von Excel. Darüber hinaus haben Sie die Möglichkeit, eigene Tastenkombinationen zu definieren, hinter die Sie dann Ihre eigenen Makros legen. Sie können somit Ihre Arbeit in Excel optimieren und Arbeiten noch schneller erledigen. Lernen Sie nun auf den nächsten Seiten ein paar typische Beispiele aus der Praxis kennen, bei denen Sie eigene Tastenkombinationen einsetzen können.
Formeln und Verknüpfungen in Festwerte wandeln Im ersten Beispiel werden Sie über eine vorher definierte Tastenkombination alle Formeln, Funktionen bzw. Verknüpfungen im markierten Bereich durch Festwerte ersetzen. Dies stellt eine nützliche Funktion dar, da Sie auf diese Weise am schnellsten Formeln in Festwerte umsetzen können.
332
24128.book Seite 333 Mittwoch, 7. Februar 2007 12:06 12
Excel über Tastenkombinationen bedienen
Stellen Sie sich beispielsweise vor, Sie müssten eine Tabelle, die Verknüpfungen zu anderen Tabellen oder Arbeitsmappen enthält, an jemanden per E-Mail schicken. In diesem Fall ist es besser, alle Verknüpfungen aus der Arbeitsmappe zu entfernen, um nicht alle verknüpften Arbeitsmappen mit ausliefern zu müssen und den Anwender nicht durch unnötigen Ballast zu belästigen. Ein weiteres Anwendungsbeispiel für die Praxis stellt folgendes Szenario dar: Sie haben einige Berechnungen über Funktionen und Formeln in Excel durchgeführt. Die Arbeit ist soweit beendet. Nun möchten Sie sicherheitshalber eine Kopie der Arbeitsmappe ohne Formeln abspeichern. Sie können somit sicherstellen, dass diese Arbeitsmappe nicht mehr durch Formeln oder Funktionen verändert werden kann, da die Mappe nur noch Festwerte enthält. In der folgenden Aufgabe gehen Sie von der Ausgangssituation in Abbildung 7.9 aus.
Abbildung 7.9: Eine Tabelle, die einige Formeln enthält
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 können. Das Makro für die Umsetzung lautet: Listing 7.10: Alle Formelzellen in Markierung durch Festwerte ersetzen Sub FormelnFest() Dim Zelle As Range For Each Zelle In Selection
333
24128.book Seite 334 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Zelle.Value = Zelle.Value Next Zelle End Sub
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. Für 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.1 starten. Das Makro funktioniert! Nun soll das Starten des Makros über eine Tastenkombination durchgeführt werden. Dies spart Zeit und ist darüber 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 verfügbar und nun kann auch das der Tastenkombination zugewiesene Makro gestartet werden. Für 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 nächsten Arbeitsschritte: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Führen Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Wählen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook aus. 4. Ergänzen Sie das Workbook_Open-Ereignis wie folgt: Listing 7.11: Die Tastenkombination (Strg) + (Ü) ist somit aktiviert Private Sub Workbook_Open() Application.OnKey "^ü", "FormelnFest" End Sub
Legen Sie eine Tastenkombination fest, indem Sie die Methode OnKey einsetzen. Die Methode OnKey führt die angegebene Prozedur aus, wenn eine bestimmte Taste oder Tastenkombination gedrückt wird.
334
24128.book Seite 335 Mittwoch, 7. Februar 2007 12:06 12
Excel über Tastenkombinationen bedienen
Die Syntax der Methode lautet: Application.OnKey(Key, Procedure) Das Argument Key entspricht der Tastenkombination, die gedrückt wird. Das Argument Procedure ist optional. Es entspricht dem Makro, welches Sie der Tastenkombination zuweisen möchten. Bleibt dieses Argument leer (""), dann hat das Drücken der Taste keine Wirkung. Entnehmen Sie Tabelle 7.3 alle möglichen Tasten und deren Codebelegung, die Sie für die Programmierung einsetzen können. Taste
Codebelegung
(Backspace)
{BACKSPACE} oder {BS}
(Pause)
{BREAK}
(CapsLock)
{CAPSLOCK}
(Entf)
{CLEAR}
(Entf)
{DELETE} oder {DEL}
(¼)
{DOWN}
(Ende)
{END}
(Enter) Zehnertastatur
{ENTER}
(~)
~ (Tilde)
(Esc)
{ESCAPE} oder {ESC}
(Hilfe)
{HELP}
(Pos1)
{HOME}
(Einfg)
{INSERT}
(æ)
{LEFT}
(Num)
{NUMLOCK}
(Bild_¼)
{PGDN}
(Bild_½)
{PGUP}
Tabelle 7.3: Die verfügbaren Tasten in Excel-VBA
335
24128.book Seite 336 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Taste
Codebelegung
(Enter)
{RETURN}
(Æ)
{RIGHT}
(Rollen)
{SCROLLOCK}
(Tab)
{TAB}
(½)
{UP}
(F1) bis (F15)
{F1} bis {F15}
Tabelle 7.3: Die verfügbaren Tasten in Excel-VBA (Forts.)
In jeder Anwendung von Windows können die Tasten aus Tabelle 7.3 auch mit den Tasten (Alt), (Strg) oder (Shift) kombiniert werden. Entnehmen Sie der nachfolgenden Tabelle 7.4 die Kodierung dieser Zusatztasten. Zusatztaste
Vorangestelltes Zeichen
(Shift)
+ (Pluszeichen)
(Strg)
^ (Caret-Zeichen)
(Alt)
% (Prozentzeichen)
[BEFEHLSTASTE]
* (Sternchen)
Tabelle 7.4: Die Zusatztasten
Nachdem Sie die Tastenkombination (Strg) + (Ü) dem Makro FormelnFest zugewiesen haben, sollten Sie beim Schließen der Arbeitsmappe Steuerung.xls dafür sorgen, dass diese Tastenkombination wieder aufgehoben wird. Dabei verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Führen Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Wählen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook aus.
336
24128.book Seite 337 Mittwoch, 7. Februar 2007 12:06 12
Excel über Tastenkombinationen bedienen
4. Im zweiten Dropdown-Feld wählen Sie den Eintrag BeforeClose aus und ergänzen das Ereignis wie folgt: Listing 7.12: Die Tastenkombination (Strg) + (Ü) wieder deaktivieren Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.OnKey "^ü" End Sub
Bestimmte Standardtastenkombinationen deaktivieren In Excel sind bereits einige Standardfunktionen auf Tastenkombinationen gelegt worden. So können Sie beispielsweise über die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung von Excel springen. Diese und andere Tastenkombinationen können Sie aber jederzeit lahm legen. Im folgenden Beispiel wird der Zugriff auf die Entwicklungsumgebung über die Tastenkombination (Alt) + (F11) deaktiviert. Listing 7.13: Die Tastenkombination (Alt) + (F11) wird deaktiviert Sub DeaktivierenTastenkombination() Application.OnKey "%{F11}", "" End Sub
Testen Sie die Funktion, indem Sie aus der Entwicklungsumgebung auf Ihre Excel-Oberfläche wechseln und die Tastenkombination (Alt) + (F11) drücken. Es wird Ihnen nicht gelingen, auf diesem Wege in die Entwicklungsumgebung zu gelangen. Möchten 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 standardmäßig vorgesehene Funktion, nämlich das Springen in die Entwicklungsumgebung, wieder aktiviert.
337
24128.book Seite 338 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Übrigens können 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. Schließen der Arbeitsmappe dynamisch einzubinden.
Nur Werte einfügen Wenn Sie in Excel Zellen mit Formeln kopieren und danach einfügen möchten, werden die Formeln ebenso eingefügt. Oftmals ist dieser Automatismus aber nicht erwünscht, d.h. in den meisten Fällen reicht es, wenn lediglich die Werte eingefügt werden. Standardmäßig müssen Sie dazu in Excel aus dem Menü BEARBEITEN den Befehl INHALTE EINFÜGEN wählen. Danach aktivieren Sie im Dialog INHALTE EINFÜGEN die Option WERTE und bestätigen mit OK. Diese Schritte können Sie über ein Makro bzw. eine Tastenkombination automatisch ablaufen lassen. Erfassen Sie nun das Makro, welches lediglich die Werte aus kopierten Zellen einfügt: Listing 7.15: Lediglich Werte werden eingefügt Sub WerteEinfügen() Selection.PasteSpecial Paste:=xlValues Application.CutCopyMode = False End Sub
Um nur die Inhalte, also die Werte einzufügen, setzen Sie die Methode PasteSpecial ein. Im Paste-Argument geben Sie die Konstante xlValues an. Da nach dem Drücken der Tastenkombination (Strg) + (Umschalt) + (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) + (Umschalt) + (V) zu. Auch hierzu können Sie wieder das Ereignis Workbook_Open einsetzen, um diese Funktion gleich nach dem Öffnen der Arbeitsmappe zur Verfügung zu stellen. Listing 7.16: Beim Öffnen der Arbeitsmappe wird die Tastenkombination festgelegt Private Sub Workbook_Open() Application.OnKey "^+v", "WerteEinfügen" End Sub
338
24128.book Seite 339 Mittwoch, 7. Februar 2007 12:06 12
Excel über Tastenkombinationen bedienen
Achten Sie auch bei diesem Schritt darauf, dass Sie die gerade definierte Tastenkombination beim Schließen der Arbeitsmappe wieder deaktivieren. Setzen Sie für diesen Zweck das Arbeitsmappen-Ereignis Workbook_BeforeClose ein, wie Sie es in Listing 7.17 sehen. Listing 7.17: Beim Schließen der Arbeitsmappe wird die Tastenkombination deaktiviert Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.OnKey "^+v" End Sub
Sonderzeichen per Tastenkombination einfügen Eine besonders interessante Lösung ist, Sonderzeichen per Tastenkombinationen einzufügen. Dabei können Sie beispielsweise Zeichen aus der Schriftart WINGDINGS einsetzen, um Sonderzeichen einzufügen. Der Buchstabe Ü entspricht in dieser Schriftart einem Häkchen. Der Buchstabe J entspricht einem grinsenden Gesicht und der Buchstabe L einem mürrischen Gesicht. Im folgenden Beispiel soll die To-Do-Liste aus Abbildung 7.10 abgearbeitet werden.
Abbildung 7.10: Die To-Do-Liste muss abgearbeitet werden
339
24128.book Seite 340 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Die Spalte C soll mit Sonderzeichen über Tastenkombinationen gefüllt werden. Dabei stehen zwei mögliche Tastenkombinationen zur Verfügung: 쐽
ein grinsendes Gesicht für erledigte Aufgaben (Buchstabe J)
쐽
ein mürrisches Gesicht für noch offene Aufgaben (Buchstabe L)
Schreiben Sie jetzt die beiden Makros, die die Sonderzeichen in die jeweils aktive Zelle schreiben: Listing 7.18: Sonderzeichen einfügen Sub SmileyLachend() ActiveCell.Value = "J" ActiveCell.Font.Name = "Wingdings" End Sub Sub SmileyTraurig() ActiveCell.Value = "L" ActiveCell.Font.Name = "Wingdings" End Sub
Schreiben Sie im ersten Schritt den Buchstaben direkt in die aktive Zelle. Danach formatieren Sie die aktive Zelle über das Font-Objekt mit der Schriftart WINGDINGS. Für die erledigten Aufgaben definieren wir die Tastenkombination (Strg) + (Ä), für offene Aufgaben (Strg) + (Ö). Der Quellcode für 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 aufdrängt, lautet wie folgt: Wie kann ich herausbekommen, welches Symbol der Schriftart Wingdings welchem Zeichen zugeordnet ist? Die Beantwortung dieser Frage können Sie Listing 7.20 entnehmen. Dort wird eine Liste erstellt, in der alle Zeichenbelegungen verzeichnet sind.
340
24128.book Seite 341 Mittwoch, 7. Februar 2007 12:06 12
Excel über Tastenkombinationen bedienen
Abbildung 7.11: Listen mit Sonderzeichen ausstatten Listing 7.20: Die einzelnen Zeichen einer Schriftart abfragen Sub Schrifttest() Dim intZ As Integer Sheets.Add For intZ = 1 To 255 Cells(intZ, 1).Font.Name = "Wingdings" If intZ >= 32 Then Cells(intZ, 1) = Chr(intZ) Cells(intZ, 2).Value = Chr(intZ) Cells(intZ, 3).Value = intZ End If Next intZ 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 möchten. Über die Funktion chr können Sie einen Wert vom Typ String zurückgeben, der das Zeichen enthält, das dem angegebenen Zeichencode zugeordnet ist.
341
24128.book Seite 342 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Abbildung 7.12: Alle Belegungen der Schriftart Wingdings in eine Tabelle schreiben
7.5
Programmieren mit der Maus
Nachdem Sie nun wissen, wie Sie einzelne Tasten programmieren können, gehen wir zum nächsten Thema über. Auf den folgenden Seiten wird beschrieben, wie Sie mithilfe von VBA Ihre Maustasten abfragen und programmieren können. Für die Programmierung Ihrer Maustasten stehen Ihnen zwei Ereignisse zur Verfügung, die Sie bereits in diesem Kapitel kennen gelernt haben. Über das eine Ereignis können 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 können Sie dann weitere Befehle hinzufügen, welche beim Eintreffen des Ereignisses zusätzlich ausgeführt werden sollen.
342
24128.book Seite 343 Mittwoch, 7. Februar 2007 12:06 12
Programmieren mit der Maus
Kontextmenü deaktivieren/aktivieren Standardmäßig wird beim Drücken der rechten Maustaste ein Kontextmenü in Excel aufgerufen. Beispielsweise wird das Zellenkontextmenü aktiviert, wenn Sie 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 Kontextmenüs unterbunden, sobald Sie eine beliebige Zelle einer bestimmten Tabelle mit der rechten Maustaste anklicken. Um dieses Ereignis einzustellen, befolgen Sie die nächsten Arbeitsschritte: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, mit der Sie die Funktion belegen möchten, und wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforeRightClick aus. 4. Ergänzen Sie den Ereignisrahmen wie folgt: Listing 7.21: Das Kontextmenü wird nicht heruntergeklappt Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub
Das Ereignis Worksheet_BeforeRightClick hat zwei Argumente: Im Argument Target können Sie die Überwachung der rechten Maustaste auf einen bestimmten Bereich Ihrer Tabelle beschränken. Im Argument Cancel haben Sie die Möglichkeit, die Standardfunktion, das Herunterklappen des Kontextmenüs, zu unterbinden, indem Sie dieses Argument auf den Wert True setzen.
Kontextmenü für bestimmte Bereiche deaktivieren Um die Überwachung der rechten Maustaste nur auf einen bestimmten Bereich der Tabelle zuzulassen, können Sie wie schon gesagt das Argument Target einsetzen. Im folgenden Makro aus Listing 7.22 wird das Kontextmenü für den Zellenbereich B2:D10 ausgeschaltet. Ergänzen Sie dazu Listing 7.21 wie folgt:
343
24128.book Seite 344 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Listing 7.22: Das Kontextmenü in einem vorgegebenen Bereich deaktivieren Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich As Range Set Bereich = Range("B2:D10") If Intersect(Target, Bereich) Is Nothing Then Exit Sub Cancel = True End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Range. Danach geben Sie über die Anweisung Set dieser Objektvariablen bekannt, welchen Bereich der Tabelle Sie überwachen möchten. Mithilfe der Methode Intersect können Sie überprüfen, ob die angeklickte Zelle (Target) sich im definierten Bereich (Bereich) befindet. Wenn nicht, dann springen Sie über die Anweisung Exit Sub direkt aus dem Makro heraus. Im anderen Fall setzen Sie das Argument Cancel auf den Wert True, um das Zellenkontextmenü zu deaktivieren.
Abbildung 7.13: Beim Klicken mit der rechten Maustaste im definierten Bereich passiert nichts.
Kontextmenü in allen Tabellen deaktivieren In den beiden letzten Beispielen haben Sie in einer bestimmten Tabelle das Zellenkontextmenü deaktiviert. Dabei haben Sie das Ereignis BeforeRightClick für diese Tabelle eingestellt. Möchten Sie jetzt die Deaktivierung des Kontextmenüs in allen Tabellenblättern erreichen, müssen Sie keinesfalls dieses Ereignis für jede
344
24128.book Seite 345 Mittwoch, 7. Februar 2007 12:06 12
Programmieren mit der Maus
einzelne Tabelle einstellen. In diesem Fall setzen Sie besser das Arbeitsmappenereignis Workbook_SheetBeforeRightClick ein. Um dieses Ereignis einzustellen, gehen Sie wie folgt vor: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Führen Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch. 3. Wählen Sie im Codebereich oben aus dem ersten Dropdown-Feld den Eintrag Workbook. 4. Wählen Sie aus dem zweiten Dropdown-Feld das Ereignis SheetBeforeRightClick. 5. Ergänzen Sie den noch leeren Ereignisrahmen wie folgt: Listing 7.23: Das Zellenkontextmenü für alle Tabellen ausschalten Private Sub Workbook_SheetBeforeRightClick _ (ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub
Bei diesem Arbeitsmappenereignis haben Sie gegenüber dem Tabellenereignis ein Argument mehr zur Verfügung. Standardmäßig wird dieses Ereignis in allen Tabellenblättern der Arbeitsmappe ausgeführt. Im Argument Sh können Sie einschränken, in welchen Tabellenblättern die Mausklicks überwacht werden sollen.
Kontextmenü in bestimmten Tabellen deaktivieren Im folgenden Beispiel soll das Deaktivieren des Zellenkontextmenüs nur in den Tabellen TABELLE1, TABELLE2 und TABELLE12 ausgeführt werden. Die Lösung dieser Aufgabenstellung können Sie in Listing 7.24 sehen. Listing 7.24: Deaktivierung des Kontextmenüs nur in bestimmten Tabellen zulassen Private Sub Workbook_SheetBeforeRightClick _ (ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Select Case Sh.Name Case "Tabelle1", "Tabelle2", "Tabelle12" Cancel = True
345
24128.book Seite 346 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Case Else Cancel = False End Select End Sub
Überprüfen Sie mithilfe einer Select Case-Anweisung, ob der Name der jeweils aktiven Tabelle, auf der Sie den rechten Mausklick durchführen, dem innerhalb der Case-Anweisung entspricht. Wenn ja, dann setzen Sie das Argument Cancel auf den Wert True, um das Zellenkontextmenü zu deaktivieren.
Eigene Funktionen mit der rechten Maustaste starten Wie Sie gerade erfahren haben, ist der rechten Maustaste ein Kontextmenü zugeordnet. Je nachdem, wo Sie in Ihrer Excel-Tabelle mit der rechten Maustaste klicken, wird ein bestimmtes Kontextmenü zur Verfügung gestellt, welches die wichtigsten Befehle für das angeklickte Objekt bereithält. Wenn Sie eine Zelle anklicken, sind das Funktionen wie das Ausschneiden, Kopieren und Einfügen von Zelleninhalten. Sie wissen bereits, wie Sie das Zellenkontextmenü deaktivieren. Was aber machen Sie, wenn Sie dem Klicken mit der rechten Maustaste eine eigene Funktion zuordnen möchten? Im folgenden Beispiel wird durch das Klicken mit der rechten Maustaste auf eine Zelle diese mit der Hintergrundfarbe ROT belegt. Beim erneuten Klick mit der rechten Maustaste auf diese gefärbte Zelle wird sie wieder entfärbt. Zur Lösung dieser Aufgabenstellung gehen Sie wie folgt vor: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforeRightClick aus. 4. Ergänzen Sie den Ereignisrahmen wie folgt:
346
24128.book Seite 347 Mittwoch, 7. Februar 2007 12:06 12
Programmieren mit der Maus
Listing 7.25: Über das Klicken mit der rechten Maustaste wird die Zelle gefärbt/entfärbt Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) If Target.Interior.ColorIndex = 3 Then Target.Interior.ColorIndex = xlColorIndexNone Else Target.Interior.ColorIndex = 3 End If Cancel = True End Sub
Überprüfen 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 entfärbt 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 Fällen deaktivieren Sie anschließend das Herunterklappen des Kontextmenüs, indem Sie das Argument Cancel auf den Wert True setzen.
Abbildung 7.14: Schnelles Färben und Entfärben über Mausklicks
347
24128.book Seite 348 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
In einem weiteren Beispiel soll in einer Tabelle über die rechte Maustaste ein bestimmtes Sonderzeichen eingefügt 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. Für unser Beispiel entscheiden wir uns für das Haken-Symbol, welches über den Buchstaben Ü in der Schriftart WINGDINGS eingefügt werden kann. In Anlehnung an die vorherige Aufgabe soll aber zuerst geprüft werden, ob nicht bereits ein Haken in die Zelle eingefügt 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 möchten, und wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforeRightClick aus. 4. Ergänzen Sie den Ereignisrahmen wie folgt: Listing 7.26: Das Haken-Symbol per rechtem Mausklick einfügen Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) If Target.Value = "ü" Then Target.Value = "" Target.Font.Name = "Courier" Else Target.Value = "ü" Target.Font.Name = "Wingdings" End If Cancel = True End Sub
Überprüfen Sie, ob nicht bereits schon ein Haken-Symbol in der Zelle steht. Wenn ja, dann nehmen Sie den Haken wieder raus, indem Sie den Zelleninhalt löschen. Vergessen Sie dabei aber nicht, die Schriftart wieder auf eine »lesbare« Schrift umzustellen. Im anderen Fall schreiben Sie den Buchstaben Ü in die angeklickte Zelle und formatieren diese mit der Schriftart WINGDINGS, indem Sie dem Objekt Font über die Eigenschaft Name den Namen der Schriftart bekannt geben.
348
24128.book Seite 349 Mittwoch, 7. Februar 2007 12:06 12
Programmieren mit der Maus
Abbildung 7.15: Eine Einkaufsliste schnell abhaken
Doppelklick deaktivieren Nachdem Sie erfahren haben, wie Sie die rechte Maustaste programmieren können, lernen Sie nun, wie Sie die linke Maustaste steuern können. Standardmäßig 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 Möglichkeit, Zeichen einzugeben bzw. bereits gemachte Eingaben zu korrigieren. Zum Abfangen von Doppelklicks mit der linken Maustaste steht Ihnen ein eigenes Ereignis BeforeDoubleClick zur Verfügung. Wie schon bei der rechten Maustaste gelernt, haben Sie auch bei diesem Ereignis die Möglichkeit, die standardmäßig zugewiesene Funktion zu deaktivieren. In der folgenden Aufgabe wird die direkte Zellenbearbeitung nach dem Ausführen 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,
349
24128.book Seite 350 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
können Sie auch bei diesem Ereignis dafür sorgen, dass das Deaktivieren der Standardfunktion (direkte Zellenbearbeitung) nur für einen bestimmten Bereich gelten soll. Im nächsten Beispiel soll die direkte Zellenbearbeitung, welche durch den Doppelklick ausgelöst wurde, für folgende Bereiche deaktiviert werden: 쐽
B2:B10
쐽
D3:D5
쐽
F2:F7
쐽
A1:F1
Erfassen Sie nun das Ereignismakro, indem Sie folgende Arbeitsschritte befolgen: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforedoubleClick aus. 4. Ergänzen Sie den Ereignisrahmen wie folgt: Listing 7.28: Die Mausklicks in mehreren Bereichen überwachen Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich1 As 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)
350
24128.book Seite 351 Mittwoch, 7. Februar 2007 12:06 12
Programmieren mit der Maus
If Intersect(Bereich, Target) Is Nothing Then Exit Sub Cancel = True End Sub
Deklarieren Sie im ersten Schritt genau fünf Objektvariablen vom Typ Range. In den ersten vier Objektvariablen geben Sie die Zellenkoordinaten der Bereiche bekannt, bei denen Sie die direkte Zellenbearbeitung deaktivieren möchten. Setzen Sie für diesen Zweck die Anweisung Set ein. Im nächsten 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 definierten Zielbereich, dann setzen Sie das Argument Cancel auf den Wert True, um die direkte Zellenbearbeitung zu deaktivieren.
Abbildung 7.16: In den farbigen Flächen ist die direkte Zellenbearbeitung deaktiviert
Werte hochzählen per Doppelklick In der nächsten Praxisaufgabe soll eine bestimmte Zelle in einer Tabelle bei jedem Doppelklick auf diese Zelle um den Wert 1 addiert werden. Um diese Lösung einzustellen, verfahren Sie wie folgt: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN.
351
24128.book Seite 352 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforedoubleClick aus. 4. Ergänzen Sie den Ereignisrahmen wie folgt: Listing 7.29: Eine Zelle aufaddieren Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Excel.Range, Cancel As Boolean) If Target.Address = "$B$5" Then Target.Value = Target.Value + 1 Cancel = True End If End Sub
Mithilfe der Eigenschaft Address können Sie die genaue Zellenadresse der doppelt angeklickten Zelle abfragen. Entspricht diese Adresse der Zelle B5, dann addieren Sie den momentanen Wert der Zelle mit dem Wert 1. Setzen Sie danach das Argument Cancel auf den Wert True, um die direkte Zellenbearbeitung für diese Zelle zu deaktivieren.
Abbildung 7.17: Bei jedem Doppelklick auf Zelle B5 wird diese um den Wert 1 erhöht.
Zufallszahlen per Doppelklick Im folgenden Beispiel spielen Sie Lotto. Im Zellenbereich C6:E10 soll bei jedem Doppelklick eine Zufallszahl im Bereich zwischen 1 und 49 erzeugt werden. Um diese Aufgabe zu lösen, befolgen Sie die nächsten Arbeitsschritte:
352
24128.book Seite 353 Mittwoch, 7. Februar 2007 12:06 12
Programmieren mit der Maus
1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, hinter der Sie die Funktion hinterlegen möchten, und wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN. 2. In der Entwicklungsumgebung wählen Sie im Codebereich aus dem ersten, oberen Dropdown-Feld den Befehl Worksheet. 3. Im zweiten Dropdown-Feld wählen Sie das Ereignis BeforedoubleClick aus. 4. Ergänzen Sie den Ereignisrahmen wie folgt: Listing 7.30: Zufallszahlen erzeugen per Doppelklick Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich As Range Set Bereich = Range("C6:E10") If Intersect(Bereich, Target) Is Nothing Then Exit Sub Target.Value = Int((49 * Rnd) + 1) Cancel = True End Sub
Definieren Sie im ersten Schritt eine Objektvariable vom Typ Range, in der Sie mit Hilfe der Anweisung Set den Bereich angeben, in dem per Doppelklick Zufallszahlen erzeugt werden sollen. Danach prüfen 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 dafür, dass diese generierte Zufallszahl auch ganzzahlig ist.
Abbildung 7.18: Im gefärbten Bereich werden Zufallszahlen per Doppelklick erzeugt.
353
24128.book Seite 354 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
7.6
Excel zeitmäßig steuern
In Excel haben Sie die Möglichkeit, Makros zu einem bestimmten Zeitpunkt zu starten. Des Weiteren können Sie Makros auch in bestimmten Intervallen wiederholt ausführen. Für diese Aufgabe setzen Sie die Methode OnTime ein. Die Syntax der Methode lautet: OnTime(EarliestTime, Procedure, LatestTime, Schedule)
Das Argument EarliestTime gibt den Zeitpunkt an, an dem eine Prozedur ausgeführt werden soll. Das Argument Procedure beinhaltet den Namen der auszuführenden Prozedur. Das Argument LatestTime ist optional einsetzbar und gibt den letzten Zeitpunkt an, zu dem die Prozedur ausgeführt werden kann. Das letzte Argument Schedule ist optional einsetzbar und führt eine neue OnTimeProzedur aus, sofern dieses Argument auf den Wert True gesetzt ist. Indem Sie das Argument auf den Wert False setzen, löschen Sie eine vorher eingestellte Prozedur. Die Möglichkeiten, die Sie mit dieser Zeitsteuerung haben, werden in den nächsten Praxisaufgaben näher erläutert.
Die Uhr immer im Blick Die Methode OnTime können Sie einsetzen, um regelmäßig die aktuelle Uhrzeit in der Statusleiste anzeigen zu lassen. Dabei definieren Sie das Intervall von 60 Sekunden. Jede Minute soll dann die aktuelle Uhrzeit in der Statusleiste angezeigt werden, danach soll die Zeitansage genau fünf Sekunden in der Statusleiste sichtbar sein und danach wieder ausgeblendet werden. Dazu erfassen Sie folgendes Makro aus Listing 7.31. Listing 7.31: Die Zeitansage in Excel Sub Zeitanzeige() Application.OnTime Now + TimeValue("00:01:00"), _ "Uhrzeit" End Sub
354
24128.book Seite 355 Mittwoch, 7. Februar 2007 12:06 12
Excel zeitmäßig steuern
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 füllen 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 dafür, dass Excel diese Zeitansage fünf Sekunden lang in der Statusleiste stehen lässt. Dazu verwenden Sie die Methode Wait, die das Makro für fünf Sekunden anhält. Danach geben Sie die Verwaltung der Statusleiste wieder an Excel zurück, was dazu führt, dass der Text BEREIT in der Leiste angezeigt wird. Im letzten Schritt sorgen Sie dafür, dass die Zeitansage regelmäßig ausgeführt 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
355
24128.book Seite 356 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
Countdown in Excel Wenn Sie möchten, können Sie in Excel auch einen Countdown einsetzen, um eine bestimmte Aufgabe auszuführen. So können Sie beispielsweise dafür 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 können. Listing 7.33: Nach genau einer Minute wird das Makro ExcelEnde gestartet Sub CountdownEinstellen() Application.OnTime _ Now + TimeValue("00:00:60"), "ExcelEnde" End Sub
Mit der Funktion Now ermitteln Sie sowohl das aktuelle Tagesdatum als auch die aktuelle Uhrzeit. Zur Uhrzeit addieren Sie mithilfe der Funktion TimeValue 60 Sekunden. Damit vergehen genau 60 Sekunden bis zum Start des Makros ExcelEnde, welches Sie in Listing 7.34 sehen. 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 Rückfrage vor dem Beenden von Excel bekommen. In einer vorherigen Schleife stellen Sie sicher, dass alle geöffneten Arbeitsmappen gespeichert werden. Dabei wenden Sie innerhalb der Schleife die Methode Save an. Anschließend wird über die Methode Quit Excel geschlossen.
356
24128.book Seite 357 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
Verarbeitung zu einer bestimmten Zeit beginnen Im letzten Beispiel zur Zeitsteuerung mit Excel werden Sie ein Makro zu einer ganz bestimmten Uhrzeit starten. Erfassen Sie zu diesem Zweck das Makro aus Listing 7.35: Listing 7.35: Um 16:00 Uhr wird die Verarbeitung gestartet Sub ZeitSteuerung() Application.OnTime TimeValue("16:00:00"), "Verarbeitung" End Sub
Um das Makro aus Listing 7.35 korrekt ablaufen zu lassen, sollten Sie die Uhreinstellung in der Systemsteuerung von Windows überprüfen und sicherstellen, dass Excel sowie die Arbeitsmappe, die diese Lösung enthält, auch geöffnet sind. Im Makro ZeitSteuerung wird um 16:00 Uhr das Makro Verarbeitung aufgerufen, welches Sie im Listing 7.36 sehen können. Listing 7.36: Dieses Makro wird um 16:00 ausgeführt Sub Verarbeitung() 'beliebige Aufgaben durchführen... End Sub
7.7 F
Fragen & Antworten
Wie können Sie beim Öffnen einer Arbeitsmappe dafür sorgen, dass alle PivotTabellen der Arbeitsmappe aktualisiert werden? A
Starten Sie dazu das Makro aus Listing 7.37:
Listing 7.37: Alle Pivot-Tabellen der Arbeitsmappe werden beim Öffnen aktualisiert Private Sub Workbook_Open() ThisWorkbook.RefreshAll End Sub A
Setzen Sie die Methode RefreshAll ein, um alle Pivot-Tabellen in der Arbeitsmappe zu aktualisieren.
357
24128.book Seite 358 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
F
Wie können Sie den Namen einer Tabelle dynamisch aus einem Zelleninhalt bilden? A
Erfassen Sie das Ereignis Worksheet_change wie folgt:
Listing 7.38: Den Namen einer Tabelle aus der Zelle C1 beziehen Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address "$C$1" Then Exit Sub ActiveSheet.Name = Range("C1").Value End Sub A
F
Überprüfen Sie über die Eigenschaft Address, ob die geänderte Zelle C1 lautet. Wenn ja, dann weisen Sie der Tabelle den Namen zu, der in Zelle C1 eingegeben wurde.
Wie können Sie die typischen Funktionen wie das Kopieren, Ausschneiden und Einfügen von Daten über die Tastenkombinationen deaktivieren? A
Sie können die Tastenkombinationen für das Kopieren (Strg) + (C), Ausschneiden (Strg) + (X) und Einfügen (Strg) + (V) von Daten deaktivieren, indem Sie folgende Makros erfassen:
Listing 7.39: Die Tastenkombinationen wurden deaktiviert Sub TastenkombinationenDeaktivieren() Application.OnKey "^c", "KeineAktion" Application.OnKey "^v", "KeineAktion" Application.OnKey "^x", "KeineAktion" End Sub
Sub KeineAktion() 'keine weiteren Befehle End Sub F
Wie können Sie deaktivierte Standard-Tastenkombinationen wieder verfügbar machen? A
358
In Anlehnung an die vorherige Fragestellung können Sie für diesen Zweck das folgende Makro aus Listing 7.40 starten:
24128.book Seite 359 Mittwoch, 7. Februar 2007 12:06 12
Quiz
Listing 7.40: Tastenkombinationen wieder zurücksetzen Sub TastenkombinationenAktivieren() Application.OnKey "^c" Application.OnKey "^v" Application.OnKey "^x" End Sub F
Wie können Sie einen vorher definierten Bereich per Doppelklick kopieren und auch auf anderen Tabellen einfügen? A
Nehmen wir einmal an, Sie möchten einen bestimmten Bereich auf TABELLE1 kopieren und danach diesen Bereich wahlweise auf einer anderen Tabelle einfügen. Dazu setzen Sie das Ereignis Worksheet_ BeforeDoubleClick ein, wie Sie es in Listing 7.42 sehen.
Listing 7.41: 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
Quiz
F
Wie kann man die Ereignissteuerung kurzfristig ausschalten?
F
Wird das Ereignis Change auch ausgelöst, wenn man die Formatierung der Zelle ändert?
F
Was muss man machen, wenn man das Ereignis Change nicht auf die ganze Tabelle, sondern nur auf eine einzige Zelle anwenden möchte?
F
Wie kann man das Zellenkontextmenü deaktivieren?
F
Welchem Buchstaben ist das Sonderzeichen mit dem Flugzeug zugeordnet?
359
24128.book Seite 360 Mittwoch, 7. Februar 2007 12:06 12
Aktionen und Benutzereingaben in Excel überwachen
F
Wie kann man per Doppelklick auf eine Zelle den Inhalt dieser Zelle mit den Schriftschnitten FETT und KURSIV sowie der Schriftfarbe ROT formatieren?
F
Wie kann man ein Makro um 14:00 Uhr automatisch starten lassen?
7.9
Übungen
Am Ende des Tages versuchen Sie die folgenden Aufgabenstellungen zu lösen. Die Ergebnisse dieser Aufgaben finden Sie im Anhang. 1. Stellen Sie sicher, dass beim Aktivieren einer bestimmten Tabelle die Neuberechnung ausgelöst wird! 2. Wie muss das Ereignis lauten, wenn Sie vor dem Speichern einer Arbeitsmappe in der ersten Tabelle der Arbeitsmappe das aktuelle Tagesdatum erfassen möchten? 3. Öffnen Sie die Demo-Arbeitsmappe Steuerung.xlsx und aktivieren Sie die Tabelle ÜBUNG. Ihre Aufgabe besteht nun darin, die beiden Maustasten zu programmieren. Für den Bereich A1:E15 sollen dabei folgende Funktionen hinterlegt werden.
360
왘
Klicken mit der rechten Maustaste: addieren der Zelle um den Wert 10
왘
Doppelklick mit der linken Maustaste: subtrahieren der Zelle mit 10
24128.book Seite 361 Mittwoch, 7. Februar 2007 12:06 12
Tag 1
Die Entwicklungsplattform, Variablen und Konstanten kennen lernen
21
Tag 2
Die Sprachelemente von VBA
99
Tag 3
Einstellen und Anpassen der Excel-Anwendung
Tag 4
Auf Arbeitsmappen zugreifen – Datei-Operationen 173
Tag 5
Tabellenblätter programmieren
203
Tag 6
Zellenbearbeitung mit VBA
245
Tag 7
Aktionen und Benutzereingaben in Excel überwachen
315
Große Datenmengen in VBA behandeln und auswerten
363
Tag 8
147
Tag 9
Funktionen einsetzen, um Excel zu automatisieren 405
Tag 10
Excel und das Internet
433
Tag 11
Excel und Datenzugriffe auf Access und Word
453
Tag 12
Arbeiten an der Oberfläche – Ribbons programmieren
491
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
507
Makros dynamisch erzeugen, importieren und exportieren über VBE-Programmierung
529
Tag 13 Tag 14
Wochenvorschau
W O C H E
W O C H E
24128.book Seite 362 Mittwoch, 7. Februar 2007 12:06 12
Auswertungen, Kommunikation, Automatisierung und Funktionen Der 8. Tag beschäftigt sich mit dem Thema, wie Sie Ihre Daten in Excel auswerten können. Hierfür stehen Ihnen unter anderem die Filterfunktionen sowie die Pivot-Tabellentechnik zur Verfügung. Des Weiteren werden Sie Ihre Daten optisch in Diagrammen darstellen, wobei Sie Diagramme unterschiedlichster Art erstellen. Am 9. Tag lernen Sie, wie Sie Excel um weitere zusätzliche Funktionen bereichern können. Ein Thema dieses Tages wird auch sein, modulare Funktionen zu schreiben, sodass Sie diese elegant in verschiedene Makros einbauen und wieder anpassen können. Am 10. Tag dreht sich alles um das Thema Internet & Co. Dabei lernen Sie u.a., wie Sie mit Hyperlinks arbeiten und E-Mails über Outlook verschicken können. Am 11. Tag erfahren Sie, wie Sie Excel-Daten in eine Access-Datenbank überführen können. Aber auch der umgekehrte Vorgang, also die Datenübernahme aus einer fertigen Access-Datenbank in eine Excel-Tabelle, wird an diesem Tag ausführlich beschrieben. Des Weiteren erfahren Sie, wie Sie die Zusammenarbeit zwischen Excel und Word gestalten können. Unter anderem übertragen Sie dabei Excel-Tabellen in Word-Dokumente, fügen bestimmte Zelleninhalte an bestimmte Textmarken eines Dokuments ein und einiges anderes mehr. Am 12. Tag erstellen Sie mithilfe des Tools »Custom UI Editor« eigene Ribbons. Dabei werden Sie Schaltflächen und ComboBoxen einfügen. Am 13. Tag lernen Sie, wie Sie in Excel Dialoge (= UserForms) zeichnen, mit Steuerelementen wie Schaltflächen und Eingabefeldern bestücken und diese dann automatisieren. Am 14. Tag greifen Sie auf die Entwicklungsumgebung über Makros zu. Sie werden dabei unter anderem neue Makros dynamisch erstellen bzw. vorhandene Makros einer Arbeitsmappe gezielt löschen.
362
24128.book Seite 363 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten 8
24128.book Seite 364 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Am gestrigen Tag haben Sie gelernt, was man unter Ereignissen in der Programmierung von Excel versteht. Sie haben Ereignisse für Arbeitsmappen sowie für einzelne Tabellen erstellt und können 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.xlsm und Diagramme.xlsm im Verzeichnis Kap08.
8.1
Daten filtern
Eine der schnellsten und wichtigsten Auswertungsfunktionen in Excel stellt der AutoFilter dar, den Sie im Ribbon DATEN mit dem Befehl FILTERN aktivieren können. Beim Filtern von Daten stellen Sie ein Kriterium für die Filterung ein, d.h. es werden nur die Zeilen angezeigt, die den Kriterien entsprechen, die Sie für eine Spalte angeben. Andersherum gesehen werden beim Filtern alle Zeilen ausgeblendet, die nicht den eingestellten Kriterien entsprechen. Excel stellt zwei unterschiedliche Arten von Filtern zur Verfügung: 쐽
den AutoFilter mit der Möglichkeit, nach der ausgewählten Zelle zu filtern, für einfache Kriterien
쐽
den Spezialfilter für komplexere Aufgaben Übrigens werden beim Filtern die Daten nicht neu sortiert. Es werden lediglich die Zeilen ausgeblendet, die den eingestellten Kriterien nicht entsprechen. Vorsicht auch bei Leerzeilen in Excel-Tabellen. Der AutoFilter funktioniert nur einwandfrei, wenn Sie in Ihrer Tabelle keine Leerzeilen haben.
364
24128.book Seite 365 Mittwoch, 7. Februar 2007 12:06 12
Daten filtern
Den AutoFilter aktivieren Den AutoFilter können Sie auf Ihrer Tabelle aktivieren, indem Sie im Ribbon DATEN auf das Symbol FILTERN klicken. Danach wird für jede Spalte im benutzten Bereich ein AutoFilter eingeblendet. Jetzt befindet sich der AutoFilter noch im Ruhezustand, d.h. es wurde noch keine Filterung vorgenommen, was Sie auch an den schwarzen Pfeilen der AutoFilter erkennen können. AutoFilter, bei denen schon Filterkriterien eingestellt sind, werden durch einen blauen Pfeil gekennzeichnet. Beim folgenden Makro in Listing 8.1 wird der Auto-Filter eingeblendet. Listing 8.1: Den AutoFilter aktivieren Sub AutoFilterAktivieren() If Not Tabelle1.AutoFilterMode = True Then Tabelle1.Range("A1").AutoFilter End If End Sub
Abbildung 8.1: Den AutoFilter einschalten
365
24128.book Seite 366 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie den AutoFilter einsetzen möchten. Die Eigenschaft AutoFilterMode liefert den Wert True, wenn die Dropdown-Pfeile für AutoFilter momentan auf dem Tabellenblatt sichtbar sind. Liefert diese Eigenschaft den Wert False zurück, dann blenden Sie die AutoFilter mithilfe der Methode AutoFilter ein. Um alle AutoFilter auf Ihrer Tabelle wieder auszublenden, setzen Sie diese Eigenschaft AutoFilterMode auf den Wert False.
Ein Filterkriterium einsetzen Nachdem Sie gerade den AutoFilter aktiviert haben, können Sie nun die Kriterien einstellen, nach dem der AutoFilter Ihre Tabelle filtern soll. In der folgenden Aufgabe sollen nur Mitarbeiter in TABELLE1 angezeigt werden, die am Standort Sindelfingen beschäftigt sind. Listing 8.2: Das Filterkriterium einstellen Sub MitarbeiterSindelfingen() With Tabelle1 If Not .AutoFilterMode = True Then .Range("A1").AutoFilter .Range("A1").AutoFilter Field:=5, Criteria1:="Sindelfingen" End If End With End Sub
Sie sollten immer sicherstellen, dass das richtige Tabellenblatt aktiviert und die AutoFilter-Pfeile angezeigt werden. Nur dann können 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)
366
24128.book Seite 367 Mittwoch, 7. Februar 2007 12:06 12
Daten filtern
Mit der AutoFilter-Methode haben Sie im Argument Field die Spalte E (Field:=5) als Spalte definiert, in der Sie ein Kriterium einstellen möchten. Das Anzeigekriterium für die Zeilen haben Sie im Argument Criteria1 bekannt gegeben (Criteria1:="Sindelfingen"). Bei dem Argument Operator haben Sie die Auswahl aus mehreren Konstanten, die Sie aus Tabelle 8.1 entnehmen können. Konstante
Erklärung
xlAnd
Es müssen zwei Kriterien erfüllt sein (Criteria1 und Criteria2).
xlOr
Es muss entweder das eine oder das andere Kriterium erfüllt sein (Criteria1 oder Criteria2).
xlTop10Items
Die n-höchsten Einträge aus der Liste werden angezeigt (Absolutbetrachtung).
xlTop10Percent
Die n-höchsten Einträge aus der Liste werden angezeigt (prozentuale Betrachtung).
xlBottom10Items
Die n-niedrigsten Einträge aus der Liste werden angezeigt (Absolutbetrachtung).
xlBottom10Percent
Die n-niedrigsten Einträge aus der Liste werden angezeigt (prozentuale Betrachtung).
Tabelle 8.1: Die Operatoren für die Filterung von Daten
Das Argument Criteria2 stellt ein mögliches zweites Kriterium dar. Es wird zusammen mit Criteria1 und dem Argument Operator zum Erstellen von zusammengesetzten Kriterien verwendet. Das letzte Argument VisibleDropDown ist standardmäßig mit dem Wert True voreingestellt, was bedeutet, dass die Dropdown-Pfeile für das gefilterte Feld angezeigt werden. Wenn das Argument auf den Wert False gesetzt wird, werden die Dropdown-Pfeile des AutoFilters für das gefilterte Feld ausgeblendet.
367
24128.book Seite 368 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Abbildung 8.2: Nur die Mitarbeiter aus Sindelfingen werden angezeigt.
Mehrere Filterkriterien festlegen Gerade haben Sie ein Filterkriterium für die Spalte E festgelegt. Sie haben aber die Möglichkeit, für mehrere Spalten Filterkriterien zu setzen. In der folgenden Aufgabe sollen alle Mitarbeiter in TABELLE1 angezeigt werden, die im Standort Sindelfingen beschäftigt sind und der Abteilung Einkauf angehören. Listing 8.3: Mehrere Filter einsetzen Sub MitarbeiterSindelfingenEinkauf() With Tabelle1 If Not .AutoFilterMode = True Then .Range("A1").AutoFilter .Range("A1").AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlAnd .Range("A1").AutoFilter Field:=4, Criteria1:="Einkauf", _ Operator:=xlAnd End If End With End Sub
368
24128.book Seite 369 Mittwoch, 7. Februar 2007 12:06 12
Daten filtern
Um mehrere Filter einzusetzen, die beide erfüllt sein müssen, verbinden Sie die Filterkriterien mit dem Operator xlAnd.
Abbildung 8.3: Zwei Filter (in den Spalten D und E) wurden eingesetzt.
Im letzten Beispiel haben Sie je einen Filter für die Spalten D und E eingestellt. Im folgenden Beispiel werden Sie ebenfalls zwei Filter verwenden. Allerdings werden Sie in einem Filter (Spalte E) zwei Kriterien formulieren. Folgende Aufgabe soll hierbei gelöst werden: Ermitteln Sie alle Mitarbeiter aus den Standorten Sindelfingen und Böblingen, die eine höhere Nummer als 40000 haben. Das Makro für diese Aufgabenbewältigung sehen Sie in Listing 8.4: Listing 8.4: Mehrere Filter setzen Sub MitarbeiterSifiundBB() With Tabelle1 If Not .AutoFilterMode = True Then .Range("A1").AutoFilter .Range("A1").AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlOr, Criteria2:="Böblingen", _ Operator:=xlAnd .Range("A1").AutoFilter Field:=2, Criteria1:=">40000" End If End With End Sub
369
24128.book Seite 370 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Für jeden einzelnen Filter setzen Sie die Methode AutoFilter ein, die die Kriterien zusammenstellt. Verbinden Sie die einzelnen Kriterien mit dem Operator xlAnd.
Abbildung 8.4: Mehrere Filterkriterien einstellen
Filterkriterium aus Zelle beziehen Im folgenden Beispiel werden Sie das Filterkriterium aus einer Zelle beziehen. Geben Sie hierfür in Zelle E34 den Stadtnamen Stuttgart ein und erfassen Sie das Makro aus Listing 8.5. Listing 8.5: Filterkriterium aus Zelle beziehen Sub FilterkriteriumausZelle() With Tabelle1 If Not .AutoFilterMode = True Then .Range("A1").AutoFilter .Range("A1").AutoFilter Field:=5, _ Criteria1:=.Range("E34").Value End If End With End Sub
Übergeben Sie als Filterkriterium den Inhalt der Zelle E34.
370
24128.book Seite 371 Mittwoch, 7. Februar 2007 12:06 12
Daten filtern
Abbildung 8.5: Die Zelle E34 bildet das Filterkriterium in Spalte E.
Der Filter TopTen Innerhalb des AutoFilters können Sie auf einen ganz speziellen Filter zugreifen, den man als Top-Ten-Filter bezeichnet. Mithilfe dieses Filters können Sie die wertmäßig höchsten bzw. niedrigsten Werte aus einer Spalte filtern. Im folgenden Beispiel filtern Sie in TABELLE1 aus der Spalte B die wertmäßig höchsten Nummern. Listing 8.6: Die Mitarbeiter mit den höchsten 10 Nummern werden angezeigt Sub TopTenFilterEinstellen() With Tabelle1 If Not .AutoFilterMode = True Then .Range("A1").AutoFilter .Range("A1").AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlTop10Items End If End With End Sub
Stellen Sie im ersten Schritt sicher, dass Sie sich in der gewünschten Tabelle befinden. Danach prüfen Sie, ob der AutoFilter bereits eingestellt ist. Anschließend füllen Sie den AutoFilter, indem Sie zuerst die Spalte angeben, in der gefil-
371
24128.book Seite 372 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
tert werden soll. Daraufhin geben Sie im Argument Criteria1 an, wie viele Einträge angezeigt werden sollen. Da die 10 höchsten Werte angezeigt werden sollen, setzen Sie hier die Zahl 10 ein. Damit Excel weiß, dass es die Top-Ten-Filterfunktion anwenden soll, weisen Sie dem Argument Operator die Konstante xlTop10Items zu. Um die 10 niedrigsten Einträge in Spalte B anzuzeigen, lautet die entsprechende Zeile wie folgt: .Range("A1").AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlBottom10Items
Abbildung 8.6: Die 10 höchsten Werte in Spalte B anzeigen
Wie Sie sehen, werden nun wirklich nur die höchsten 10 Werte aus Spalte B angezeigt. Diese Zeilen liegen aber nicht sortiert vor. In diesem Fall können Sie die Sortierung über einen VBA-Befehl nachholen, den Sie im Makro aus Listing 8.7 sehen können. Listing 8.7: Filterung von Daten mit anschließender Sortierung Sub TopTenFilterEinstellenErw() With Tabelle1 If Not .AutoFilterMode = True Then .Range("A1").AutoFilter .Range("A1").AutoFilter Field:=2, Criteria1:="10", _
372
24128.book Seite 373 Mittwoch, 7. Februar 2007 12:06 12
Daten filtern
Operator:=xlTop10Items .UsedRange.Sort Key1:=.Range("B1"), _ Order1:=xlDescending, Header:=xlYes End If End With 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 können Sie einige Argumente angeben. Unter anderem müssen Sie angeben, nach welchem Kriterium (Key1) sortiert werden soll. Außerdem ist natürlich 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 enthält. In diesem Fall darf diese Zeile nicht mitsortiert werden. Setzen Sie dieses Argument auf den Wert xlYes, wenn der Bereich eine Überschrift enthält. Wenn nicht, dann weisen Sie diesem Argument die Konstante xlNo zu.
Abbildung 8.7: Die Daten liegen nun sortiert vor.
Wo stecken die Filter? Die eingestellten Filter sehen Sie ganz deutlich an den blauen Filterpfeilen. Wie aber können Sie über den Einsatz eines Makros prüfen, in welcher Spalte ein AutoFilter eingestellt ist und in welcher Spalte nicht?
373
24128.book Seite 374 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Im folgenden Makro wird diese Frage beantwortet. Dabei wurde im Voraus das Makro aus Listing 8.7 gestartet, welches in Spalte B die 10 höchsten Einträge filtert. Listing 8.8: Die eingestellten (aktiven) Filter ermitteln Sub Dim Dim Dim
WoSteckenDieFilter() Blatt As Worksheet b As Boolean intSpalten As Integer
Set Blatt = Tabelle1 For intSpalten = 1 To Blatt.Columns.Count On Error GoTo ende If Blatt.AutoFilterMode Then b = Blatt.AutoFilter.Filters(intSpalten).On Debug.Print "Filter in Spalte " & intSpalten & ": "; b End If Next intSpalten ende: End Sub
Definieren Sie im ersten Schritt ein paar Objektvariablen. In der Objektvariablen Blatt speichern Sie den Namen der 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 für die Spalte festgelegt wurde. Mithilfe der Methode Debug.Print geben Sie den Spaltenindex sowie den Status des Filters im Direktfenster Ihrer Entwicklungsumgebung aus. Nach dem Starten des Makros blenden Sie den Direktbereich ein, indem Sie in die Entwicklungsumgebung wechseln und aus dem Menü ANSICHT den Befehl DIREKTFENSTER wählen.
374
24128.book Seite 375 Mittwoch, 7. Februar 2007 12:06 12
Daten filtern
Abbildung 8.8: In Spalte B ist der AutoFilter eingestellt.
Den Spezialfilter einsetzen Wenn Sie in einem großen Datenbestand versehentlich Duplikate eingegeben haben und nun eine Liste erstellen möchten, bei der jeder Satz nur einmal vorkommt, dann verwenden Sie den Spezialfilter in Excel. Den Spezialfilter können Sie aufrufen, indem Sie aus dem Ribbon DATEN mit dem Symbol ERWEITERT wählen und die Kriterien des Spezialfilters einstellen. In der nächsten Aufgabe sind in Spalte A der TABELLE2 einige Zahlenwerte eingegeben. Ihre Aufgabe besteht nun darin, aus dieser Liste eine Unikatsliste in Spalte E zu erstellen. Sehen Sie sich zunächst einmal die Ausgangssituation in Abbildung 11.9 an. Erfassen Sie nun das Makro aus Listing 8.9. Listing 8.9: Eine Unikatsliste erstellen Sub DatenSpezialfilter() Dim Bereich As Range With Tabelle2 Set Bereich = .UsedRange.Columns(1) Bereich.AdvancedFilter Action:=xlFilterCopy, _
375
24128.book Seite 376 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
CriteriaRange:=Bereich, CopyToRange:=.Range("E1"), _ Unique:=True End With End Sub
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 Einträge überprüfen möchten, legen Sie den Bereich für 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 können Sie eine der folgenden xlFilterAction-Konstanten anwenden: xlFilterInPlace (an gleicher Stelle filtern) oder xlFilterCopy (Ergebnis des Filterns an anderer Stelle der Tabelle einfügen). Das Argument CriteriaRange vom Datentyp Variant ist optional und stellt den Kriterienbereich für die Filterung dar. Falls das Argument nicht angegeben wird, gibt es keine Kriterien.
376
24128.book Seite 377 Mittwoch, 7. Februar 2007 12:06 12
Daten filtern
Das Argument CopyToRange vom Datentyp Variant ist optional und repräsentiert den Zielbereich für die kopierten Zeilen, wenn das Argument Action den Wert xlFilterCopy aufweist. Andernfalls wird das Argument ignoriert.
Abbildung 8.10: Die Unikatsliste sehen Sie in Spalte E.
Gefilterte Daten exportieren Haben Sie Ihre Daten gefiltert und möchten Sie diese in eine neue Arbeitsmappe übertragen, dann starten Sie das folgende Makro: Listing 8.10: Gefilterte Daten in neue Arbeitsmappe kopieren Sub GefilterteDatenKopieren() With Tabelle1 .Range("A1").CurrentRegion.SpecialCells(xlVisible).Copy Workbooks.Add Range("A1").PasteSpecial Paste:=xlPasteAll End With End Sub
Mithilfe der SpecialCells-Methode und der Eigenschaft CurrentRegion ermitteln Sie alle sichtbaren Zellen im umliegenden Bereich. Diese kopieren Sie mit der Methode Copy. Fügen Sie danach mithilfe der Methode Add eine neue Arbeitsmappe ein. Verweisen Sie mit dem Mauszeiger auf Zelle A1 und fügen Sie den Inhalt der Zwischenablage mit der Methode PasteSpecial ein. Im Argument
377
24128.book Seite 378 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Paste setzen Sie die Konstante xlPasteAll ein, um die Werte und Formate einzufügen. Allerdings werden die Spaltenbreiten dadurch nicht korrekt eingestellt. Diese müssen noch korrigiert werden.
Abbildung 8.11: Die gefilterten Daten wurden übertragen.
Möchten Sie die gefilterten Daten in eine Textdatei übertragen, dann führen Sie zunächst 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 überführt. Listing 8.11: Die gefilterten Daten in eine Textdatei überführen Sub Dim Dim Dim Dim
GefilterteTabelleInTextdateiSpeichern() intZeile As Integer intMax As Integer intSpalte As Integer strText As String
With Tabelle1 .UsedRange.Copy Worksheets.Add Range("A1").Select ActiveSheet.Paste
378
24128.book Seite 379 Mittwoch, 7. Februar 2007 12:06 12
Daten filtern
intMax = Activesheet.Usedrange.Rows.Count Open "C:\Ausgabe.txt" For Output As #1 For intZeile = 1 To intMax For intSpalte = 1 To ActiveSheet.UsedRange.Columns.Count strText = strText & ";" & Cells(intZeile, intSpalte).Value Next intSpalte strText = Mid(strText, 2, Len(strText) - 1) Print #1, strText strText = "" Next intZeile Close #1 MsgBox "Datenübertragung beendet!" End With End Sub
Mit der Methode Copy und der Eigenschaft UsedRange kopieren Sie den benutzten Bereich und fügen diesen auf dem Tabellenblatt TABELLE1 ein. Dort ermitteln Sie die letzte belegte Zeile der neuen Tabelle. Dies gelingt Ihnen über die Eigenschaft UsedRange. Diese Eigenschaft repräsentiert den verwendeten Bereich einer Tabelle. Aus diesem Bereich zählen Sie mit Hilfe der Funktion Count die darin enthaltenen Zeilen (Rows). Danach öffnen Sie mithilfe der Anweisung Open eine Textdatei, ohne sie vorher anzulegen. Nun setzen Sie eine Schleife auf, die alle Zeilen der Tabelle durchläuft. Innerhalb dieser Schleife basteln Sie sich eine zweite Schleife zusammen, welche die Spalten einer Zeile von links nach rechts durchläuft. 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 strText. Die Zelleninhalte werden durch das Semikolon voneinander getrennt. Setzen Sie die Anweisung Print ein, um die einzelnen Zeilen in die Textdatei zu schreiben. Schließen Sie nach der Übertragung der Daten die Textdatei mithilfe der Anweisung Close.
379
24128.book Seite 380 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Abbildung 8.12: Die gefilterten Daten liegen in einer Textdatei vor
8.2
Pivot-Tabellen einsetzen
In Excel haben Sie die Möglichkeit, sehr schnell aussagekräftige Berichte zu erstellen. Die wohl beste und sicherste Methode, in Excel Daten auszuwerten und aufzubereiten, ist die Anwendung von Pivot-Tabellen. Diese Pivot-Tabellen können auch per VBA-Code erstellt werden.
Pivot-Tabellen erstellen Die nächsten Beispiele werden anhand einer Artikel-Tabelle programmiert, die Sie in Abbildung 11.13 sehen können.
Abbildung 8.13: Die Ausgangstabelle mit Artikeldaten
380
24128.book Seite 381 Mittwoch, 7. Februar 2007 12:06 12
Pivot-Tabellen einsetzen
Im folgenden Beispiel soll eine Pivot-Tabelle erstellt werden, die Auskunft darüber gibt, welche Artikel sich an welchem Ort befinden. Listing 8.12: Eine Pivot-Tabelle erstellen Sub ErstellenPivotTabelle() Dim Bereich As Range With Tabelle3 Set Bereich = .UsedRange .PivotTableWizard _ SourceType:=xlDatabase, SourceData:= _ Bereich, TableDestination:="", TableName:="Pivot" End With 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 für die Auswertung enthält, und legen den verwendeten Bereich in der Variablen Bereich fest. Danach markieren Sie den Quellbereich und wenden die Methode PivotTableWizard an, die die Pivot-Tabelle erstellt. Die Methode PivotTableWizard hat folgende Syntax: PivotTableWizard(SourceType, SourceData, _ TableDestination, TableName, RowGrand, _ ColumnGrand, SaveData, HasAutoFormat, AutoPage, _ Reserved, BackgroundQuery, OptimizeCache, _ PageFieldOrder, PageFieldWrapCount, ReadData, _ Connection)
Auf die wichtigsten Argumente der Methode PivotTableWizard wird nun näher eingegangen. Im Argument SourceType geben Sie die Quelle der Daten in dem Bericht an. Zulässig ist eine der in der folgenden Tabelle aufgeführten Konstanten.
381
24128.book Seite 382 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Konstante
Beschreibung
xlConsolidation
Mehrere Konsolidierungsbereiche
xlDatabase
Microsoft Excel-Datenbank oder -Liste (Standard)
xlExternal
Externe Datenquelle
xlPivotTable
Gleiche Quelle wie ein anderer PivotTable-Bericht
Tabelle 8.2: Die Konstanten des Arguments SourceType
Beim Argument SourceData legen Sie den Datenbereich für den neuen Bericht fest. Hierfür haben Sie vorher den verwendeten Bereich auf dem Tabellenblatt in der Variablen Bereich definiert, welche Sie hier nun als Argument angeben. Im Argument TableDestination können Sie eine Zieltabelle inklusive der Position der ersten Zelle für den Pivot-Tabellenbericht angeben. Belassen Sie dieses Argument leer, wenn der Pivot-Tabellenbericht auf einer neuen Tabelle, beginnend ab Zelle A1, eingefügt werden soll. Im Argument TableName geben Sie dem Pivot-Tabellenbericht einen Namen. Dies ist sehr wichtig, um später bei der Anordnung der Pivot-Felder auf die richtige Pivot-Tabelle zuzugreifen. Wird dieses Argument nicht gesetzt, vergibt Excel eigene Namen für 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 füllen 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 verfügbaren Feldnamen der Pivot-Tabelle, die den Spaltenüberschriften des Quellbereichs entsprechen. Mit der Eigenschaft Orientation legen Sie die Position des Feldnamens in der Pivot-Tabelle fest. Die Möglichkeiten, die Sie dabei haben, sehen Sie in der folgenden Tabelle.
382
24128.book Seite 383 Mittwoch, 7. Februar 2007 12:06 12
Pivot-Tabellen einsetzen
Konstante
Beschreibung
xlColumnField
Der Spaltenbereich der Pivot-Tabelle wird in unserem Beispiel mit dem Ort gefüllt.
xlDataField
Im Datenbereich der Pivot-Tabelle wird der Preis der einzelnen Artikel ausgegeben.
xlHidden
Mit dieser Konstante können Sie einzelne Datenfelder ausblenden.
xlPageField
Das Seitenfeld der Pivot-Tabelle bleibt in diesem Beispiel leer.
xlRowField
Im Zeilenbereich wird die Bezeichnung der einzelnen Artikel aufgelistet.
Tabelle 8.3: Die verschiedenen Konstanten des Arguments Orientation
Pivot-Tabellen aktualisieren Bei der Arbeit mit Pivot-Tabellen gibt es zwei Punkte, die Sie beachten müssen: 쐽
Ist der Pivot-Tabellenbericht aktualisiert?
쐽
Greift die Pivot-Tabelle wirklich auf den gewünschten Datenbereich zu? (Ist der Datenbereich nachträglich vergrößert worden?)
Um eine Pivot-Tabelle zu aktualisieren, starten Sie das Makro aus Listing 8.13. Listing 8.13: Eine Pivot-Tabelle aktualisieren Sub EinzelnePivotTabelleAufBlattAktualisieren() On Error GoTo fehler Tabelle11.PivotTables("Pivot").RefreshTable 'oder '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
383
24128.book Seite 384 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
On Error ist eine reine Sicherheitsmaßnahme, die verhindern soll, dass das Makro abstürzt, wenn die richtige Pivot-Tabelle nicht gefunden werden kann.
Sehr oft kommt es auch vor, dass der Bereich, auf den eine Pivot-Tabelle zugreift, erweitert wurde. Diese Anpassung bekommt die Pivot-Tabelle aber nicht 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. Anschließend 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 = Tabelle3.UsedRange ActiveWorkbook.Names.Add _ Name:="Pivot", _ RefersTo:=Bereich, Visible:=True For Each pt In Tabelle11.PivotTables With pt .PivotTableWizard SourceType:=xlDatabase, _ SourceData:="Pivot" End With pt.RefreshTable Next pt End Sub
Ermitteln Sie zuerst einmal den verwendeten Bereich auf Ihrer TABELLE3 und speichern Sie diesen Bereich in der Objekt-Variablen Bereich. Benennen Sie danach den ermittelten Bereich, geben Sie diesem den Namen Pivot. Mithilfe einer For Each-Schleife greifen Sie auf alle Pivot-Tabellenberichte auf der TABELLE11 zu, erweitern den Datenbereich und aktualisieren die Pivot-Tabellenberichte. Am gestrigen Tag haben Sie gelernt, wie Sie große Datenmengen mithilfe von Filtern und Pivot-Tabellen blitzschnell auswerten können.
384
24128.book Seite 385 Mittwoch, 7. Februar 2007 12:06 12
Diagramme erstellen
8.3
Diagramme erstellen
Der oft verwendete Spruch, dass ein Diagramm mehr aussagt als 1000 Worte, wird immer wieder gerne verwendet. Gerade in Excel können Sie aus Zahlentabellen mit ein paar wenigen Handgriffen aussagekräftige 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 auswählen In VBA wird für den Diagrammtyp die Eigenschaft ChartType verwendet. In der nachfolgenden Tabelle sehen Sie exemplarisch eine kleine Auswahl an möglichen Diagrammtypen, die über eine xlChartType-Konstante angesprochen werden können. Diagrammtyp
Konstante
Säulendiagramm (gruppiert)
xlColumnClustered
Säulendiagramm (gestapelt)
xlColumnStacked
Säulendiagramm 3D-Darstellung
xl3DColumn
Balkendiagramm (gruppiert)
xlBarClustered
Balkendiagramm (gestapelt)
xlBarStacked
Liniendiagramm
xlLine
Kreisdiagramm
xlPie
Punktdiagramm
xlXYScatter
Blasendiagramm
xlBubble
Flächendiagramm
xlArea
Ringdiagramm
xlDoughnut
Netzdiagramm
xlRadar
Tabelle 8.4: Mögliche Diagrammtypen in Excel
385
24128.book Seite 386 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Diagrammtyp
Konstante
Oberflächendiagramm
xlSurface
Kursdiagramm
xlStockHLC
Tabelle 8.4: Mögliche Diagrammtypen in Excel (Forts.)
Neben den in der Tabelle abgebildeten Diagrammtypen gibt es noch Zylinder-, Kegel- und Pyramidendiagramme sowie zu jedem Diagramm zahlreiche Untertypen. Eine komplette Liste der vorhandenen Diagramme in Excel bekommen Sie in der Online-Hilfe unter dem Stichwort ChartType.
Der Standard – das Säulendiagramm Standardmäßig wird in Excel das Säulendiagramm verwendet. Wenn Sie dazu den Datenbereich markieren, aus dem Sie ein Diagramm erstellen möchten, und dann die Taste (F11) drücken, wird blitzschnell automatisch ein Säulendiagramm eingefügt. Dieser Standardtyp wird in der Praxis oft verwendet, um Kosten oder Leistungen über Monate hinweg darzustellen. In der folgenden Aufgabe gehen Sie von der nachfolgenden Datentabelle aus.
Abbildung 8.14: Die Ausgangstabelle mit den Rohdaten
Aus dieser Datentabelle soll nun ein Diagramm erzeugt werden. Dabei soll der Name der Tabelle (Kostenvergleich 2003-2006) als Diagrammtitel verwendet werden. Das Makro für diese Aufgabe lautet:
386
24128.book Seite 387 Mittwoch, 7. Februar 2007 12:06 12
Diagramme erstellen
Listing 8.15: Das Säulendiagramm erstellen Sub SäulenDiagrammErstellen() Dim Bereich As Range Set Bereich = Tabelle1.Range("B2:F3") Charts.Add With ActiveChart .ChartType = xlColumnClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlRows .HasTitle = True .ChartTitle.Text = Bereich.Parent.Name End With End Sub
Im ersten Schritt legen Sie den Bereich fest, der die Datenbasis für das Diagramm enthält. Dazu speichern Sie die Adresse des Bereichs in der Range-Variablen Bereich. Mit der Methode Add erstellen Sie zunächst ein neues, noch leeres Diagrammblatt. 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 für das Diagramm bekommt. Diese Methode benötigt 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. Wählen Sie entweder die Konstante xlColumns oder xlRows. Bei der Konstanten xlRows werden die einzelnen Säulen in einer einheitlichen Farbe formatiert. Hingegen werden die einzelnen Säulen bei Verwendung der Konstante xlColumns in unterschiedlichen Farben ausgegeben. Die Eigenschaft HasTitle müssen 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 über den Befehl Bereich.Parent.Name erfragen können. Da die Variable Bereich eine Range-Variable ist, müssen Sie über die Eigenschaft Parent auf das »Vaterelement« (eine Hirarchie weiter oben) zugreifen. Mit Hilfe der Eigenschaft Name fragen Sie den Namen dieses übergeordneten Elements ab.
387
24128.book Seite 388 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Abbildung 8.15: Das erste Diagramm über den Einsatz von VBA erstellen
Ergebnisse vergleichen über das Balkendiagramm Ein weiteres sehr oft eingesetztes Diagramm ist das Balkendiagramm. Damit können Sie einzelne Informationen wie Umsatz, Kosten oder Leistungen auf einen Blick miteinander vergleichen. In der folgenden Aufgabe sollen die Umsätze von Arbeitsgruppen in einem bestimmten Monat verglichen werden. Als Ausgangstabelle gehen Sie dabei von der folgenden Abbildung aus. Erstellen Sie nun anhand dieser Vorgabetabelle ein Balkendiagramm. Listing 8.16: Ein Balkendiagramm erstellen Sub BalkenDiagrammErstellen() Dim Bereich As Range Set Bereich = Sheets("Arbeitsgruppen-Vergleich").Range("A3:B13") Charts.Add With ActiveChart
388
24128.book Seite 389 Mittwoch, 7. Februar 2007 12:06 12
Diagramme erstellen
.ChartType = xl3DbarClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlColumns .HasTitle = True .ChartTitle.Text = Bereich.Parent.Name End With End Sub
Abbildung 8.16: Arbeitsgruppen miteinander vergleichen
Stellen Sie zuerst sicher, dass Sie sich auf dem gewünschten Tabellenblatt befinden, auf dem sich die Daten für das Diagramm befinden. Diese Information geben Sie in der Objektvariablen Bereich mitsamt dem Zellenbereich über die Anweisung Set an. Fügen Sie danach ein neues Diagrammobjekt über die Methode Add ein. Über die Eigenschaft ChartType können Sie ein Diagramm Ihrer Wahl (siehe Tabelle 8.4) festlegen. Die Datenbasis für das Diagramm ermitteln Sie mit der Methode SetSourceData, der Sie im Argument Source den vorher definierten Bereich übergeben.
389
24128.book Seite 390 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
Abbildung 8.17: Die Arbeitsgruppen wurden in einem übersichtlichen Diagramm dargestellt.
Tagesgenaue Auswertungen über das Liniendiagramm Haben Sie Datenmaterial vorliegen, das sich über einen größeren Zeitraum erstreckt, und sind dabei die einzelnen Intervalle recht kurz, dann können Sie ein Liniendiagramm einsetzen. So können Sie in der Praxis beispielsweise Temperaturschwankungen innerhalb eines Tages oder Kurse von Aktien über einen bestimmten Zeitraum hinweg darstellen. In der folgenden Aufgabe werden Temperaturen innerhalb eines Tages gemessen und zu jeder vollen Stunde in eine Tabelle geschrieben. Die Temperaturtabelle sieht dabei wie folgt aus. Erfassen Sie nun das Makro, welches die Temperaturverläufe in einem Liniendiagramm darstellt.
390
24128.book Seite 391 Mittwoch, 7. Februar 2007 12:06 12
Diagramme erstellen
Abbildung 8.18: Die Temperaturen werden zu jeder vollen Stunde aufgezeichnet. Listing 8.17: Temperaturverläufe in einem Liniendiagramm darstellen Sub Dim Dim Dim Dim
LinienDiagrammErstellen() Dia As ChartObject i As Integer i_min As Integer i_max As Integer
With Sheets("Temperaturen") On Error Resume Next .ChartObjects.Delete Set Dia = .ChartObjects.Add(150, 10, 500, 300) Dia.Name = "Temperaturen von heute" i = .Range("B1").End(xlDown).Row .Range("A2:B" & i).Copy .ChartObjects("Temperaturen von heute").Activate ActiveChart.SeriesCollection.Paste _ Rowcol:=xlColumns, SeriesLabels:=False, _ CategoryLabels:=True, Replace:=True, NewSeries:=True Application.CutCopyMode = False End With
391
24128.book Seite 392 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
With ActiveChart .ChartType = xlLineMarkers .HasLegend = False .HasTitle = True .ChartTitle.Text = Dia.Name End With End Sub
Im ersten Schritt aktivieren Sie die Tabelle TEMPERATUR. Dieser Tabellenname soll später die Überschrift des Diagramms werden. Da Sie ein eingebettetes Diagramm einfügen möchten, müssen Sie dafür Sorge tragen, dass bei mehrmaligem Starten des Makros nicht mehrere Diagramme übereinander eingefügt werden. Löschen Sie daher zu Beginn alle integrierten Diagramme auf dem Arbeitsblatt über die Methode Delete. Danach fügen Sie ein noch leeres Chart-Objekt in Ihre Tabelle mit der Methode Add ein. Dabei können Sie die Position des ChartObjekts genau festlegen. Die vier Zahlenwerte entsprechen den Angaben linker Rand, oberer Rand, Breite und Höhe. 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 Nächstes dem eingebetteten Diagramm einen Namen. Jetzt müssen 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 eingefügtes Diagramm. Um die kopierten Daten einzufügen, 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 darüber, ob sich die Daten in Zeilen oder Spalten befinden. Zulässig sind hierbei die Konstanten xlColumns oder xlRows. Das Argument SeriesLabels gibt an, woher Excel die Beschriftung für 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 für die Datenreihe in der betreffenden Zeile (bzw. Spalte) verwendet. Setzen Sie dieses
392
24128.book Seite 393 Mittwoch, 7. Februar 2007 12:06 12
Diagramme erstellen
Argument auf den Wert False, wenn der Inhalt der Zelle in der ersten Spalte jeder Zeile (bzw. der ersten Zeile jeder Spalte) als erster Datenpunkt der Datenreihe verwendet werden soll. Das nächste 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 standardmäßig 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 eingefügt werden sollen. Setzen Sie das Argument auf den Wert False, wenn Sie die Daten als neue Datenpunkte in eine vorhandene Datenreihe einfügen möchten. Nach der Kopier- und Einfügeaktion 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 gewünschten 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 Namen des Diagramms zuweisen.
Abbildung 8.19: Die Temperaturen werden übersichtlich in einem Liniendiagramm dargestellt.
393
24128.book Seite 394 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
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. Selbstverständlich haben Sie die Möglichkeit, die Skalierung auch selbst zu bestimmen.
Daten richtig skalieren Greifen wir das gerade erstellte Beispiel mit den Temperaturen noch einmal auf. Die Skalierung soll jetzt angepasst werden. Dabei sollen der größte Wert der Temperaturtabelle (17°) und der niedrigste Wert (9°) für die Skalierung herangezogen werden. Die Skalierung soll beim niedrigsten Punkt beginnen und beim höchsten Punkt enden. Passen Sie das Makro aus Listing 8.18 wie folgt an. (Es werden nur die Änderungen im folgenden Listing aufgeführt.) Listing 8.18: Die Skalierung des Diagramms selbst bestimmen Sub LinienDiagrammErstellen() Dim i_min As Integer Dim i_max As Integer i_min = Application.WorksheetFunction.Min(Range("B2:B" & i)) i_max = Application.WorksheetFunction.Max(Range("B2:B" & i)) With ActiveChart.Axes(xlValue) .MinimumScale = i_min .MaximumScale = i_max .MajorUnit = 1 End With End Sub
Ermitteln Sie über die beiden Tabellenfunktionen WorkSheetFunction Max und Min den höchsten 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.
394
24128.book Seite 395 Mittwoch, 7. Februar 2007 12:06 12
Diagramme erstellen
Abbildung 8.20: Die Skalierung der Daten selbst bestimmen
Diagramme platzieren Beim Einfügen von Diagrammen haben Sie die Auswahl, ob Sie das Diagramm unterhalb Ihrer Datentabelle oder als neues Diagrammblatt einfügen möchten. Sie haben jedoch jederzeit die Möglichkeit, Diagramme innerhalb von Arbeitsmappen und Tabellen hin- und herzuschieben. Im folgenden Beispiel soll das eingebettete Diagramm auf der Tabelle TEMPERATUREN in einem separaten Diagrammblatt mit dem Namen TEMPERATURENGROSS transferiert werden. Das Makro für diese Aufgabe können Sie im nächsten Listing sehen: Listing 8.19: Den Speicherort des Diagramms bestimmen Sub EingebettetesDiagrammZuDiagrammblatt() Worksheets("Temperaturen").ChartObjects(1).Chart.Location _ xlLocationAsNewSheet, "Temperaturen-Diagramm" 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 können Sie im Argument Where entweder die Konstanten xlLocationAsNewSheet, xlLocationAsObject oder xlLocationAutomatic verwen-
395
24128.book Seite 396 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
den. 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 heißen soll.
Abbildung 8.21: Das Diagramm wurde in ein separates Diagrammblatt verschoben.
Diagramme formatieren Excel wählt beim Erstellen von Diagrammen die Farben des Diagramms selbstständig aus. Diese Auswahl der Farben können Sie selbstverständlich auch nach eigenem Geschmack durchführen. In der folgenden Aufgabe werden Sie ein Säulendiagramm einfügen. Im Säulendiagramm selbst werden Deckungsbeiträge angezeigt. Diese Deckungsbeiträge können entweder im negativen oder im positiven Bereich liegen. Ihre Aufgabe besteht nun darin, alle negativen Deckungsbeiträge mit der Füllfarbe ROT sowie alle positiven Deckungsbeiträge mit der Füllfarbe BLAU zu formatieren. Gehen Sie zunächst von folgender Ausgangstabelle aus: In der Abbildung 8.23 sind alle Säulen mit der Füllfarbe BLAU formatiert. Erfassen Sie jetzt das folgende Makro aus Listing 8.20, um die negativen Deckungsbeiträge mit der Füllfarbe ROT zu formatieren.
396
24128.book Seite 397 Mittwoch, 7. Februar 2007 12:06 12
Diagramme erstellen
Abbildung 8.22: Das Ausgangsdiagramm Listing 8.20: Säulen unterschiedlich einfärben Sub Dim Dim Dim Dim
SäulenVerschiedenfarbig() Datenreihe As Series Punkt As Point i As Integer DArray As Variant
Set Datenreihe = _ Sheets("Deckungsbeiträge").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 = 33 End If Next Punkt End With End Sub
397
24128.book Seite 398 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
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 Säule mit der Farbe ROT formatiert. Bei allen positiven Werten wird ein blauer Farbton gewählt.
Abbildung 8.23: Unterschiedliche Farben der Säulen
Diagramme exportieren In Excel können Sie Diagramme über einen Grafikfilter umwandeln und somit in ein anderes Format überführen. Das bringt Vorteile, wenn Sie Diagramme an Personen ausliefern möchten, 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 verknüpfen möchten, ist das Einbinden von Diagramm-Grafiken eine gute Alternative. Allerdings können 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.
398
24128.book Seite 399 Mittwoch, 7. Februar 2007 12:06 12
Diagramme erstellen
Listing 8.21: Diagramm als Grafik-Objekt exportieren Sub DiagrammeAlsGrafikSpeichern() Dim Dia As Chart Set Dia = Sheets("Deckungsbeiträge").ChartObjects(1).Chart Dia.Export Filename:="c:\Export.gif", FilterName:="GIF" End Sub
Ü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.24: Die umgewandelte Datei kann im Photo Editor aufgerufen werden.
399
24128.book Seite 400 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
8.4 F
Fragen & Antworten
Wie können Sie feststellen, wie viele Zeilen gefiltert sind? A
Um diese Aufgabe zu lösen, starten Sie das Makro aus Listing 8.22.
Listing 8.22: Die gefilterten Zeilen zählen Sub ZeilenGefiltert() Dim Bereich As Range Dim i As Integer With Tabelle1 Set Bereich = .Range("A1").CurrentRegion i = Intersect(Bereich.SpecialCells(xlVisible), _ Bereich.Columns(1)).Count – 1 MsgBox "Sie haben " & i & " Zeilen gefiltert", _ vbInformation, "Filterergebnis" End With End Sub A
F
Wie können Sie die erste gefilterte Zeile ermitteln? A
400
Ü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 gefüllten Zeile ergibt. Mit der Eigenschaft Intersect prüfen Sie, ob es im Bereich der Spalte A gefilterte Zeilen gibt. Dazu verwenden Sie die Methode SpecialCells, der Sie die Konstante xlVisible übergeben. Die Zählung der ermittelten Zeilen erfolgt durch die Eigenschaft Count, von der Sie den Wert 1 subtrahieren müssen, da die Überschriftenzeile nicht zum Ergebnis der gefilterten Daten gezählt werden soll. Abschließend geben Sie die Anzahl der gefilterten Zeilen in einem Meldungsfenster aus, welches Sie mit der Symbol-Info ausstatten. Dazu verwenden Sie die Konstante vbInformation. Um diese Aufgabe zu lösen, setzen Sie das Makro aus Listing 8.23 ein:
24128.book Seite 401 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
Listing 8.23: Die erste gefilterte Zeile ermitteln Sub ErsteGefilterteZeileFinden() Dim intZeile As Integer With Tabelle1 For intZeile = 2 To .UsedRange.Rows.Count If .Rows(intZeile).Hidden True Then MsgBox "Die erste gefilterte Zeile ist die Zeile " _ & intZeile, vbInformation Exit For End If Next intZeile End With End Sub
Da die eigentlichen Daten erst in Zeile 2 beginnen, setzen Sie die For NextSchleife mit einem Startwert von 2 auf und durchlaufen alle Zeilen im benutzten Bereich. Innerhalb der Schleife prüfen Sie, ob die Eigenschaft Hidden der jeweiligen Zeile den Wert False liefert. Wird dieser Wert zum ersten Mal zurückgegeben, wird die aktuelle Zeilennummer auf dem Bildschirm ausgegeben. Danach wird die Schleife über die Anweisung Exit For direkt verlassen. F
Wie können Sie alle Diagrammblätter aus Ihrer Arbeitsmappe entfernen? A
Um alle Diagrammblätter aus einer Arbeitsmappe zu entfernen, starten Sie das Makro aus Listing 8.24.
Listing 8.24: Alle Diagrammblätter aus Arbeitsmappe entfernen Sub DiagrammeEntfernen() Application.DisplayAlerts = False On Error Resume Next ActiveWorkbook.Charts.Delete Application.DisplayAlerts = True End Sub
401
24128.book Seite 402 Mittwoch, 7. Februar 2007 12:06 12
Große Datenmengen in VBA behandeln und auswerten
A
F
Indem Sie die Eigenschaft DisplayAlerts auf den Wert False setzen, brauchen Sie die einzelnen Löschungen nicht zu bestätigen. Die On ErrorAnweisung sorgt dafür, dass die Verarbeitung sauber abgefangen wird, wenn überhaupt kein Diagrammblatt in der Arbeitsmappe enthalten ist. Die Eigenschaft Charts gibt eine Auflistung aller Diagrammblätter der aktiven Arbeitsmappe zurück, die Sie mithilfe der Methode Delete löschen.
Wie können Sie die Schriftart einer Legende anpassen? A
Sie haben Zugriff auf die Legende eines Diagramms, indem Sie auf die Eigenschaft Legend von ActiveChart zugeifen. 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("Deckungsbeiträge").ChartObjects(1).Select ActiveChart.HasLegend = True With ActiveChart.Legend.Font .Bold = True .ColorIndex = 5 End With End Sub
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
Quiz
F
Wie lautet die Anweisung, um den AutoFilter einzuschalten?
F
Wie heißt die Methode, um den SpezialFilter aufzurufen?
F
Wie lautet die Methode, um eine Pivot-Tabelle zu aktualisieren?
F
Wie kann man den Diagrammtyp bestimmen?
402
24128.book Seite 403 Mittwoch, 7. Februar 2007 12:06 12
Übungen
F
Welchen ChartType müssen Sie wählen, um ein Kreisdiagramm einzufügen?
F
Über welche Eigenschaft stellen Sie den größten Wert einer Skalierung ein?
F
Welche Konstante müssen Sie bei der Eigenschaft Location angeben, um ein eingebettetes Diagramm in ein separates Diagrammblatt zu transferieren?
F
Welche zwei Argumente müssen beim Export eines Diagramms bei der Methode Export angegeben werden?
8.6
Übungen
Zum Ende dieses Tages versuchen Sie bitte, folgende Aufgaben zu lösen: Formatieren Sie die Pivot-Tabelle auf TABELLE1 mit einem AutoFormat. Öffnen Sie die Demo-Arbeitsmappe Diagramme.xls und aktivieren Sie die Tabelle ÜBUNG. Ihre Aufgabe besteht nun darin, anhand des Datenmaterials ein Zylinderdiagramm zu erstellen. Das Ergebnis dieser Aufgabenstellungen finden Sie im Anhang.
403
24128.book Seite 404 Mittwoch, 7. Februar 2007 12:06 12
24128.book Seite 405 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
9
24128.book Seite 406 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Am gestrigen Tag haben Sie gelernt, wie man große Datenmengen über den Einsatz von Pivot-Tabellen sowie die Datenfilterung schnell und sicher auswerten kann. Des Weiteren haben Sie erfahren, wie Sie mit Makros Diagramme einfügen und gestalten können. Die Themen heute: 쐽
Eigene Funktionen stricken
쐽
Modulare Funktionen programmieren
쐽
Funktionen dauerhaft verfügbar machen
Standardmäßig bietet Excel Ihnen einige hundert Funktionen an, die Sie für Ihre tägliche Arbeit nützen können. 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 populärste dieser Funktionen ist die Funktion SUMME(), die einen angegebenen Zellenbereich summiert. Weitere Funktionen können über den Funktions-Assistenten elegant in Ihre Tabellen eingefügt werden.
쐽
Daneben gibt es spezielle VBA-Standardfunktionen, die Sie in Ihren Makros einsetzen können, um bestimmte Aufgaben zu erledigen. Ein Beispiel für eine solche Funktion stellt die Funktion Len dar, über die Sie die Länge beispielsweise eines Zelleninhaltes feststellen können. Diese und weitere Funktionen können Sie in der Online-Hilfe auf der Registerkarte INHALT unter der Rubrik FUNKTIONEN nachschlagen. In den meisten Fällen wird zu diesen Funktionen auch ein kleines Beispiel angeboten, welches Sie kopieren und in Ihre eigenen Makros mit einbauen können.
쐽
Des Weiteren gibt es Funktionen, die Sie selbst schreiben, um sich Schreibarbeit zu sparen und Redundanz von Quellcode zu vermeiden. Ein Beispiel für diese Art von Funktionen wäre eine Funktion, die überprüft, ob eine bestimmte Tabelle in einer Arbeitsmappe vorhanden ist. Da Sie so eine Aufgabe in der Programmierung bestimmt sehr oft durchführen 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 möchten, dann müssen Sie dies nicht an zig Stellen im Quellcode machen, sondern eben nur in dieser einen Funktion.
406
24128.book Seite 407 Mittwoch, 7. Februar 2007 12:06 12
Eigene Tabellenfunktionen stricken
9.1
Eigene Tabellenfunktionen stricken
Sicher ist die Auswahl der standardmäßig angebotenen Tabellenfunktionen ganz beträchtlich und in den meisten Fällen auch ausreichend. Trotzdem gibt es hier und da noch Bedarf, eigene Tabellenfunktionen zu erstellen, um spezielle Aufgaben zu lösen. Die so erstellten neuen Tabellenfunktionen können Sie ebenso über den Funktions-Assistenten unter der Rubrik BENUTZERDEFINIERT einfügen. Den Funktions-Assistenten rufen Sie am schnellsten über die Tastenkombination (Umschalt) + (F3) auf.
Abbildung 9.1: Benutzerdefinierte Funktionen
Sehen Sie nun anhand einiger typischer Beispiele aus der Praxis, wie Sie neue Tabellenfunktionen erstellen und einsetzen können. Alle Beispiele heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Funktionen.xlsm im Verzeichnis Kap9.
407
24128.book Seite 408 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Zellen mit blauer, dicker Schriftfarbe summieren In der ersten Aufgabe haben Sie eine Tabelle mit Zahlenwerten vorliegen. Ihre Aufgabe besteht nun darin, aus dieser Tabelle alle die Zahlen zu summieren, deren Schriftfarbe BLAU und deren Schriftschnitt FETT ist. Sehen Sie sich dazu einmal die Ausgangssituation in Abbildung 9.2 an.
Abbildung 9.2: Eine Tabelle mit unterschiedlich formatierten Zahlenwerten
Erfassen Sie nun die Funktion, die die blau und fett formatierten Zellen summiert. Sehen Sie sich dazu das Makro aus Listing 9.1 an. Listing 9.1: Alle Zellen mit bestimmter Formatierung sollen summiert werden Function BUF(Bereich As Range) Dim Zelle As Range Application.Volatile For Each Zelle In Bereich 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
408
24128.book Seite 409 Mittwoch, 7. Februar 2007 12:06 12
Eigene Tabellenfunktionen stricken
Jede Funktion beginnt mit dem Schlüsselwort Function, gefolgt vom Namen der Funktion, der nahezu beliebig gewählt werden kann. Da Sie den Namen dieser Funktion später direkt in einer Tabellenzelle erfassen müssen, empfiehlt es sich, möglichst kurze Funktionsnamen zu verwenden. Der von mir gewählte Name BUF steht dabei für »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). Mit der Anweisung Application.Volatile sorgen Sie dafür, 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 anschließenden 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 Prüfung müssen Sie im Anschluss daran überprüfen, ob der Schriftschnitt FETT ist. Diese Prüfung erreichen Sie, indem Sie die Eigenschaft Bold des Font-Objektes abfragen. Meldet diese Prüfung als Ergebnis den Wert True, dann ist die Zelle mit dem Schriftschnitt FETT formatiert. Damit noch nicht genug, es muss schließlich auch die richtige Farbe, nämlich BLAU, vorliegen. Die Farbe der Schriftart können Sie über die Eigenschaft ColorIndex feststellen, welche für die Farbe BLAU den Index 5 zurückmeldet. Nur wenn diese beiden Formatierungskriterien zutreffen, erfolgt eine Summierung. Achten Sie dabei darauf, dass Sie die bereits ermittelten Werte nicht überschreiben. Für 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 überprüften Zelle steht. Testen Sie nun die Funktion, indem Sie diese in eine beliebige Zelle der Tabelle eingeben, wie dies in Abbildung 9.3 durchgeführt wurde.
409
24128.book Seite 410 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Abbildung 9.3: Die Funktion liefert das richtige Ergebnis.
Übrigens können Sie die Funktion aus Listing 9.1 als Vorlage einsetzen, wenn es darum geht, anstatt der Summierung eine einfache Zählung durchzuführen. In diesem Fall lautet die Funktion wie folgt: Listing 9.2: Fett und blau formatierte Zellen zählen Function BUFZ(Bereich As Range) Dim Zelle As Range
Application.Volatile For Each Zelle In Bereich If IsNumeric(Zelle) Then If Zelle.Font.Bold = True _ And Zelle.Font.ColorIndex = 5 Then BUFZ = BUFZ + 1 End If End If Next Zelle
End Function
410
24128.book Seite 411 Mittwoch, 7. Februar 2007 12:06 12
Eigene Tabellenfunktionen stricken
Aktuelle Arbeitsmappe ermitteln Um zu prüfen, welchen Namen die momentan aktive Arbeitsmappe hat, können Sie eine benutzerdefinierte Funktion schreiben, die den Namen der Arbeitsmappe in eine Zelle schreibt. Die Funktion für diese Aufgabe können Sie in Listing 9.3 sehen: Listing 9.3: Den Namen der aktiven Arbeitsmappe in einer Zelle zurückgeben Function AktMap() AktMap = ActiveWorkbook.Name End Function
Über die Anweisung ActiveWorkbook.Name können Sie den Namen der Arbeitsmappe ermitteln. Wenn Sie zusätzlich zum Namen auch noch den Speicherpfad ermitteln möchten, dann erweitern Sie die Funktion aus Listing 9.3 wie folgt: Listing 9.4: Den kompletten Speicherpfad sowie den Namen der aktiven Arbeitsmappe zurückgeben Function AktMapV() AktMapV = ActiveWorkbook.FullName End Function
Über die Eigenschaft FullName können Sie den Namen sowie den Pfad einer gespeicherten Arbeitsmappe ermitteln. Allerdings muss diese Arbeitsmappe vorher einmal gespeichert worden sein.
Abbildung 9.4: Beide Funktionen im Einsatz
411
24128.book Seite 412 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Formelcheck durchführen In der nächsten Aufgabe soll mit einer Funktion geprüft werden, ob eine bestimmte Zelle eine Formel enthält oder nicht. Dazu fügen Sie folgende Funktion ein. Die Funktion aus Listing 9.5 prüft, ob eine Zelle eine Formel bzw. Verknüpfung enthält: Listing 9.5: Zellen auf Formelinhalt überprüfen Function FormelZ(zelle) Application.Volatile FormelZ = False If Left(zelle.Formula, 1) = "=" Then FormelZ = True End Function
Eine Formel bzw. eine Verknüpfung oder auch eine Funktion erkennen Sie in Excel daran, dass diese mit einem Gleichheitszeichen beginnt. Genau dieses Verhalten prüfen 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 für diese Funktion die Zahl 1 einsetzen. Entspricht das erste Zeichen einem Gleichheitszeichen, dann geben Sie als Rückgabewert True zurück. Testen Sie die Funktion, indem Sie in einer Tabelle ab Zelle B2 bis Zelle B4 ein paar Zahlenwerte eintragen, und summieren Sie 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 Ausfüllkästchen nach unten.
Abbildung 9.5: Die Zelle B5 enthält eine Formel.
412
24128.book Seite 413 Mittwoch, 7. Februar 2007 12:06 12
Eigene Tabellenfunktionen stricken
Diese Funktion berücksichtigt auch Zellen, welche Texte enthalten. Nachdem Sie zu Beginn der Funktion den Rückgabewert auf False gesetzt haben, gibt es diesbezüglich keine Probleme.
Zelleninformationen abfragen In der nächsten Aufgabe werden Sie eine Zelle mithilfe einer Funktion überprüfen. Je nach Funktionsaufruf sollen dabei folgende Informationen ermittelt werden: 쐽
die Zellenadresse
쐽
der Zellenwert
쐽
die Zellenformel
Alle diese Informationen können Sie über die folgende Funktion aus Listing 9.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 INFOZ = zelle.Value Case 3 INFOZ = zelle.FormulaLocal Case Else INFOZ = "nicht vergeben" End Select End Function
Bei der Funktion aus Listing 9.6 können 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 zurückzugeben, 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.
413
24128.book Seite 414 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Abbildung 9.6: Unterschiedliche Ergebnisse je nach Funktionsaufruf
Dokumenteigenschaften per Funktion abfragen Das folgende Beispiel ähnelt dem gerade besprochenen. Auch in diesem Beispiel stricken Sie eine Funktion, die mithilfe eines flexiblen Arguments unterschiedliche Ergebnisse bringt. So sollen unter anderem folgende Dokumenteigenschaften über eine Tabellenfunktion abgefragt werden: 쐽
Dateiname und Pfad
쐽
nur Dateiname
쐽
nur Pfad der Datei
쐽
Dateityp
쐽
Dateigröße
쐽
Erstellungsdatum der Datei
쐽
letzte Änderung an der Datei
쐽
letzter Zugriff auf die Datei
Fassen Sie diese Informationen nun in einer Funktion zusammen, welche Sie in Listing 9.7 sehen können: Listing 9.7: Dokumenteigenschaften über eine Funktion abfragen Function DokuEig(EigenschaftsNr As Integer) Dim fso As Object Dim tmp As String
414
24128.book Seite 415 Mittwoch, 7. Februar 2007 12:06 12
Eigene Tabellenfunktionen stricken
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 = "Ungültige EigenschaftsNr!" End Select End With DokuEig = tmp End Function
Erstellen Sie im ersten Schritt einen Verweis auf das FileSystemObject, um damit die Informationen bezüglich der Arbeitsmappe zu erlangen. Über die Methode GetFile teilen Sie Excel mit, welche Datei Sie diesbezüglich auswerten möchten. Danach werten Sie die übergebene Eigenschaften-Nummer in einer Select CaseAnweisung aus: 쐽
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 Länge des Gesamttextes von der Anzahl der Zeichen des Dateinamens, den Sie über die Eigenschaft Name ermitteln.
쐽
Den Namen der Datei ermitteln Sie direkt über die Eigenschaft Name.
쐽
Die Eigenschaft Type meldet Ihnen den Typ der Datei, d.h. Sie können diese Funktion auch anhand von Word-Dokumenten, Access-Datenbanken und weiteren Dateitypen anwenden.
쐽
Die Eigenschaft Size gibt die Größe der Datei in Bytes an.
415
24128.book Seite 416 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
쐽
Mithilfe der Eigenschaft DateCreated können 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 können Sie das letzte Zugangsdatum der Datei ermitteln, d.h. wann die Datei das letzte Mal geöffnet wurde.
Abbildung 9.7: Die Funktion DokuEig mit unterschiedlichen Argumenten und Ergebnissen
Buchstaben aus Zellen eliminieren Bei der nächsten Aufgabe sollen aus einer Zelle, die sowohl Buchstaben als auch Zahlen enthält, alle Buchstaben rausgeworfen werden. Diese Aufgabe lösen Sie mit der Funktion aus Listing 9.8: 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
416
24128.book Seite 417 Mittwoch, 7. Februar 2007 12:06 12
Eigene Tabellenfunktionen stricken
Ermitteln Sie im ersten Schritt die Länge der Zelle und setzen Sie dafür die Funktion Len ein. Danach prüfen 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 nächste Zeichen aus der Zelle. Dabei entsprechen die Werte 65 bis 90 Kleinbuchstaben, die Werte 97 bis 122 den Großbuchstaben 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 angehängt.
Abbildung 9.8: Aus »gemischten« Zellen Zahlen herstellen
Das erste Auftreten einer Zahl ermitteln Die nächste Funktion ist der Funktion aus Listing 9.8 ähnlich. Bei der nächsten Aufgabe soll die Position des ersten Auftretens einer Zahl in einer Zelle ermittelt und ausgegeben werden. 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))
417
24128.book Seite 418 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
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 Länge der Zelle und setzen Sie dafür die Funktion Len ein. Danach prüfen 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 nächste Zeichen aus der Zelle. Dabei entsprechen die Werte 65 bis 90 Kleinbuchstaben, die Werte 97 bis 122 den Großbuchstaben 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 zurück.
Abbildung 9.9: Aus »gemischten« Zellen die Position der ersten Zahl ermitteln
418
24128.book Seite 419 Mittwoch, 7. Februar 2007 12:06 12
Modulare Funktionen programmieren
9.2
Modulare Funktionen programmieren
Nachdem Sie gelernt haben, wie Sie benutzerdefinierte Tabellenfunktionen programmieren können, 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 durchführen. 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 können so auch leichter durchgeführt werden. Lernen Sie in den folgenden Beispielen, wie Sie diese modularen Funktionen effizient bei Ihrer Arbeit einsetzen können.
Arbeitsmappen-Existenz prüfen Bevor Sie eine bestimmte Arbeitmappe über ein Makro öffnen, sollten Sie sicherstellen, ob diese Arbeitsmappe überhaupt existiert. Damit vermeiden Sie hässliche Makroabstürze, weil Sie dadurch die Möglichkeit haben, diesen Fehlerfall abzufangen. Erfassen Sie jetzt eine Funktion und übergeben Sie dieser Funktion den Dateinamen mitsamt der Laufwerks- und Pfadangabe. Als Ergebnis dieser Funktion sollten Sie dann eine Rückmeldung bekommen, ob die angegebene Datei auch vorhanden ist. Listing 9.10: Prüfung auf Dateiexistenz Function DateiExist(s As String) As Boolean DateiExist = False If Len(s) > 0 Then DateiExist = (Dir(s) "") Exit Function End Function
Wie schon erwähnt, erwartet die Funktion den Namen der Datei, deren Existenz sie prüfen soll. Die Prüfung, ob überhaupt eine Zeichenfolge an die Funktion übergeben wurde, erfolgt über die Funktion Len. Wird eine Länge von 0 gemeldet, wurde keine Zeichenfolge an die Funktion übergeben. Ansonsten entspricht diese in jedem Fall einer Größe > 0. Die Funktion Dir versucht nun auf die Datei zuzugreifen. Ist die Datei nicht vorhanden, meldet die Funktion eine Leerfolge zurück.
419
24128.book Seite 420 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Damit wird der Datentyp Boolean mit dem Wert False an das aufrufende Makro zurückgemeldet. Im anderen Falle liefert die Funktion den Wert True zurück. Erfassen Sie jetzt das Makro, welches die Funktion DateiExist aufruft und den Namen der zu überprüfenden Datei übergibt. Listing 9.11: Vor dem Öffnen einer Datei deren Existenz prüfen Sub DateiÖffnen() Dim b As Boolean Const EDatei = "C:\ Daten\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 DateiExist auf und übergeben dieser Funktion den Namen der zu prüfenden Datei, den Sie gerade in der Konstante angegeben haben. Das Ergebnis dieser Überprüfung durch die Funktion wird in der Variablen b abgelegt. Diese kann entweder False für den Fall, dass die Datei gar nicht existiert, bzw. True sein, sofern die Prüfung erfolgreich verlaufen ist. In diesem Fall öffnen Sie die Datei mithilfe der Methode Open.
Arbeitsmappen-Zustand prüfen Manche Fehler treten auf, wenn versucht wird, über VBA Arbeitsmappen zu öffnen, die bereits in geöffnetem Zustand sind. Gerade wenn Sie in einem größeren Projekt Dateien immer wieder öffnen und schließen, kann es durchaus vorkommen, dass eine Arbeitsmappe bereits geöffnet ist. In der nächsten Funktion soll überprüft werden, ob eine bestimmte Arbeitsmappe bereits geöffnet wurde. Wenn ja, dann muss diese nicht noch einmal geöffnet, sondern nur aktiviert werden. Die Funktion zur Lösung dieser Aufgabenstellung können Sie in Listing 9.12 sehen.
420
24128.book Seite 421 Mittwoch, 7. Februar 2007 12:06 12
Modulare Funktionen programmieren
Listing 9.12: Prüfung, ob Datei bereits geöffnet ist Function DateiGeöffnet(ByVal s As String) As Boolean Dim DatSchonGeöffnet As Boolean On Error GoTo fehler DatSchonGeöffnet = True Windows(s).Activate Exit Function fehler: DatSchonGeöffnet = False End Function
Die Funktion aus Listing 9.12 erwartet als Argument den Namen der Datei, deren Status geprüft werden soll. Danach wird versucht, die entsprechende Datei zu aktivieren. Schlägt dies fehl, sorgt die On Error-Anweisung dafür, dass die Funktion nicht mit einer Fehlermeldung abbricht. In diesem Fall wird direkt zum Fehlerabschnitt fehler gesprungen. Dort wird der Variablen DatSchonGeöffnet 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 DatSchonGeöffnet den Wert True zugewiesen haben, können 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:\Daten\Mappe1.xls" b = DateiGeöffnet(EDatei) If b = True Then Else Workbooks.Open Edatei End If End Sub
421
24128.book Seite 422 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Eine mächtige Löschfunktion erstellen In der letzten Funktion packen wir eine gewaltige Menge an einzelnen Funktionen hinein. Über eine Funktion soll es möglich sein, folgende Elemente einer Tabelle zu entfernen: 쐽
alle Inhalte
쐽
alle Formatierungen
쐽
alle Kommentare
쐽
Formeln durch Festwerte ersetzen
쐽
Hyperlinks löschen
Erfassen Sie jetzt die Funktion, die Sie in Listing 9.14 sehen können: Listing 9.14: Durch unterschiedliche Löschnummern werden dementsprechende Löschaktionen gestartet Function LöschenWas(Nr As Integer) Dim zelle As Range Select Case Nr Case 1 Cells.Clear Case 2 Cells.ClearFormats Case 3 Cells.ClearComments Case 4 For Each zelle In ActiveSheet.UsedRange zelle.Value = zelle.Value Next zelle Case 5 For Each zelle In ActiveSheet.UsedRange With zelle If .Hyperlinks.Count > 0 Then .Hyperlinks.Delete With .Font .Underline = xlUnderlineStyleNone
422
24128.book Seite 423 Mittwoch, 7. Februar 2007 12:06 12
Modulare Funktionen programmieren
.ColorIndex = xlAutomatic End With End If End With Next zelle Case Else MsgBox "Diese Nr ist nicht vergeben!" End Select End Function 쐽
Wird die Funktion LöschenWas mit dem Argument 1 aufgerufen, wenden Sie die Methode Clear an, um alle Zellen der Tabelle zu löschen. Im Auflistungsobjekt Cells sind alle Zellen der Tabelle enthalten.
쐽
Wird die Funktion LöschenWas mit dem Argument 2 aufgerufen, wenden Sie die Methode ClearFormats an, um alle Formatierungen in der Tabelle zu entfernen. Dazu zählen Formatierungen der Schrift, der Hintergrundfarbe, der Ausrichtung der Daten und alle möglichen Rahmen und sonstigen Formatierungsmöglichkeiten.
쐽
Wird die Funktion LöschenWas mit dem Argument 3 aufgerufen, wenden Sie die Methode ClearComments an, um alle in der Tabelle befindlichen Kommentare zu entfernen.
쐽
Wird die Funktion LöschenWas mit dem Argument 4 aufgerufen, sollen alle Formeln und Verknüpfungen in Festwerte umgewandelt werden. In diesem Fall ist es nicht sinnvoll, alle Zellen der Tabelle über das Auflistungsobjekt Cells abzuarbeiten. Schränken 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. Verknüpfungen, indem Sie der jeweiligen Zelle den Wert der Eigenschaft Value zuweisen.
쐽
Wird die Funktion LöschenWas mit dem Argument 5 aufgerufen, sollen alle Hyperlinks in der Tabelle entfernt werden. Die Hyperlinktexte sollen aber erhalten bleiben. Auch für 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 prüfen Sie mithilfe der Eigenschaft Count, ob die jeweilige Zelle einen Hyperlink enthält. Wenn ja, dann meldet
423
24128.book Seite 424 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
diese Eigenschaft den Wert 1 zurück. In diesem Fall wenden Sie die Methode Delete an, um den Hyperlink aus der Zelle zu entfernen. Da aber auch nach dem Entfernen des Hyperlinks die typische Hyperlinkformatierung (blaue Schriftfarbe und Unterstreichung) erhalten bleibt, müssen 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 LöschenWas auf und übergeben Sie der Funktion die Lösch-Nr 5, um alle Hyperlinks aus der aktiven Tabelle zu entfernen. Listing 9.15: Über die Lösch-Nr festlegen, welche Löschaktion durchgeführt werden soll Sub Löschen() Dim s As String Sheets("Tabelle8").Activate s = InputBox _ ("Geben Sie eine Lösch-Nr zwischen 1 und 5 ein!", _ "Löschaktion durchführen", 1) If s "" Then LöschenWas (s) Else End If End Sub
Über eine Eingabemaske legen Sie fest, welche Löschaktion durchgeführt 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 Möglichkeit, eine Eingabe bereits schon beim Aufruf der Maske vorzunehmen. In diesem Fall wurde die Lösch-Nr 1, also das Entfernen aller Daten aus einer Tabelle, eingetragen.
424
24128.book Seite 425 Mittwoch, 7. Februar 2007 12:06 12
Funktionen dauerhaft verfügbar machen
Abbildung 9.10: In diesem Beispiel werden die Hyperlinks aus der Tabelle entfernt.
9.3
Funktionen dauerhaft verfügbar machen
Bei den bisherigen Beispielen sind die Funktionen lediglich in der Arbeitsmappe verfügbar, in der sie in der Entwicklungsumgebung erfasst wurden. Wenn Sie Funktionen für alle Arbeitsmappen, ob neue oder alte, anwenden möchten, haben Sie zwei Möglichkeiten: 쐽
Speichern in der persönlichen Arbeitsmappe Personl.xlsb oder
쐽
Erstellung eines Add-Ins und Aktivierung über den Add-Ins-Manager
Speichern der Funktionen in der persönlichen Makroarbeitsmappe Um die Funktionen für alle Arbeitsmappen zur Verfügung zu haben, können Sie die Funktionen in Ihrer persönlichen Makroarbeitsmappe Personl.xlsb ablegen, welche sich im Office-Verzeichnis XLSTART befindet. Sollte diese Arbeitsmappe noch nicht existieren, legen Sie eine an, indem Sie wie folgt vorgehen: 1. Klicken Sie in der Tabellenansicht im Ribbon ANSICHT das Symbol MAKROS und wählen Sie danach den Befehl MAKRO AUFZEICHNEN. 2. Wählen Sie im Dialogfeld MAKRO AUFZEICHNEN aus dem Kombinationsfeld den Eintrag PERSÖNLICHE MAKROARBEITSMAPPE.
425
24128.book Seite 426 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Abbildung 9.11: Die persönliche Makroarbeitsmappe anlegen
3. Klicken Sie auf OK. 4. Klicken Sie jetzt beispielsweise auf die Zelle A1. Der Makrorekorder wird die persönliche Arbeitsmappe nun erstellen und diesen Befehl aufzeichnen. Nun haben Sie die Voraussetzung geschaffen, um Ihre Funktionen in die persönliche Arbeitsmappe zu übertragen. 5. Beenden Sie die Makroaufzeichnung, indem Sie im Ribbon ANSICHT das Symbol MAKROS klicken und danach den Befehl AUFZEICHNUNG BEENDEN auswählen. Übertragen Sie nun Ihre Funktionen aus der Arbeitsmappe Funktionen.xlsm in die persönliche Arbeitsmappe Personl.xlsb. Dazu ist folgende Vorgehensweise notwendig: 1. Öffnen Sie die Arbeitsmappe Funktionen.xlsm. 2. Wechseln Sie in die Entwicklungsumgebung. 3. Aktivieren Sie das MODUL1. 4. Markieren Sie alle Funktionen mit dem Menübefehl BEARBEITEN/ALLES AUSWÄHLEN. 5. Drücken Sie die Tastenkombination (Strg) + (C), um die Funktionen in die Zwischenablage zu kopieren. 6. Wählen Sie im Projekt-Explorer den Eintrag VBAPROJECT (PERSONL.XLSB) aus. 7. Aktivieren Sie in diesem Projekt das MODUL1.
426
24128.book Seite 427 Mittwoch, 7. Februar 2007 12:06 12
Funktionen dauerhaft verfügbar machen
8. Fügen Sie Ihre Funktionen ein, indem Sie den Mauszeiger im Codefenster positionieren und die Tastenkombination (Strg) + (V) drücken. 9. Beenden Sie Excel und bestätigen Sie beim Verlassen von Excel die Änderungsabfrage mit JA. Nun können Sie die benutzerdefinierten Tabellenfunktionen über den FunktionsAssistenten in Ihre Tabellen einfügen.
Speichern der Funktionen in einem Add-In Die zweite Möglichkeit, um Funktionen allgemein verfügbar zu machen und auch noch an andere Anwender weiterzugeben, ist die Erstellung eines Add-Ins. Ein Add-In können Sie direkt aus der Datei Funktionen.xlsm erstellen und bei Bedarf im Add-Ins-Manager einbinden und, wenn Sie Ihre Funktionen zeitweise nicht benötigen, wieder deaktivieren. Bevor Sie das Add-In erstellen, sollten Sie die Dokumenteigenschaften der Datei Funktionen.xlsm pflegen. Diese Informationen sind später wichtig, um Zusatzinformationen zum Add-In zu hinterlegen. Geben Sie jetzt die Dokumenteigenschaften an, indem Sie die Datei Funktionen.xlsm öffnen und die Schaltfläche Office klicken. Wählen Sie danach den Befehl VORBEREITEN / EIGENSCHAFTEN.
Abbildung 9.12: Die Dokumenteigenschaften erfassen
Geben Sie einige zusätzliche Informationen zu dem zukünftigen Add-In an und bestätigen Sie Ihre Eingaben mit OK.
427
24128.book Seite 428 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
Befolgen Sie jetzt die nachfolgenden Anweisungen: 1. Klicken Sie die runde Schaltfläche OFFICE und wählen Sie den Befehl SPEICHERN UNTER / ANDERE FORMATE. 2. Stellen Sie im Kombinationsfeld DATEITYP den Eintrag EXCEL-97-2003 ADD-IN ein. Nun wird automatisch das Add-In-Verzeichnis von Excel eingestellt. 3. Klicken Sie auf die Schaltfläche SPEICHERN. Das Add-In FUNKTIONEN.XLAM wurde nun erstellt. Binden Sie das Add-In jetzt ein, indem Sie die nächsten Arbeitsschritte befolgen: 1. Klicken Sie die Schaltfläche OFFICE. 2. Klicken Sie die Schaltfläche EXCEL-OPTIONEN. 3. Aktivieren Sie die Rubrik ADD-INS.
Abbildung 9.13: Add-Ins einbinden
4. Aktivieren Sie das Add-In NÜTZLICHE FUNKTIONEN. Diese Information haben Sie vorher bei den Dokumenteigenschaften unter der Rubrik TITEL erfasst. 5. Klicken Sie die Schaltfläche GEHE ZU.
428
24128.book Seite 429 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
6. Aktivieren Sie das Add-In im Dialog ADD-INS. 7. Bestätigen Sie Ihre Aktion durch OK. Bei jedem Start von Excel wird das Add-In im Hintergrund geöffnet, sodass Sie auf die Funktionen, die darin enthalten sind, jederzeit zugreifen können. Über die Tastenkombination (Umschalt) + (F3) können Sie die Funktionen dieses Add-Ins unter der Kategorie Benutzerdefiniert finden und einsetzen.
9.4 F
Fragen & Antworten
Wie können Sie über eine benutzerdefinierte Tabellenfunktion den Namen des in Excel eingetragenen Anwenders in einer Zelle ausgeben? A
Erfassen Sie zu diesem Zweck die Funktion aus Listing 9.16:
Listing 9.16: Den Namen des Anwenders in einer Zelle ausgeben Function Anwender() Application.Volatile Anwender = Application.UserName End Function A
Die Eigenschaft UserName gibt den Namen des aktuellen Benutzers zurück. Rufen Sie die Funktion in einer beliebigen Zelle der Tabelle wie folgt auf: =Anwender()
F
Wie können Sie über eine benutzerdefinierte Tabellenfunktion die Anzahl der Ziffern einer Zelle zählen? A
Diese Aufgabe lösen Sie, indem Sie die Funktion aus Listing 9.17 anwenden:
Listing 9.17: Die Anzahl der numerischen Ziffern einer Zelle zählen 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
429
24128.book Seite 430 Mittwoch, 7. Februar 2007 12:06 12
Funktionen einsetzen, um Excel zu automatisieren
End If Next i End Function A
Ermitteln Sie zuerst einmal die Gesamtlänge 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 Operator einen Wert zwischen 0 und 9 zurück. 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 können Sie über eine Funktion prüfen, ob ein Add-In bereits im Add-InsManager eingebunden ist? A
Um diese Aufgabe zu lösen, geben Sie folgende Funktion aus Listing 9.18 ein:
Listing 9.18: Ist das Add-In »Nützliche Funktionen« bereits eingebunden? Function AddInAktiv(ByVal s As String) As Boolean Dim addI As addIn AddInAktiv = False For Each addI In Application.AddIns If addI.Name = s And addI.Installed = True Then AddInAktiv = True Exit Function End If Next addI End Function
Sub AddInPrüfung() Dim b As Boolean b = AddInAktiv("Funktionen.xlam")
430
24128.book Seite 431 Mittwoch, 7. Februar 2007 12:06 12
Quiz
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
Quiz
F
Wie muss die Anweisung lauten, damit eine benutzerdefinierte Funktion auch auf Änderungen in der Tabelle reagieren kann?
F
Wie muss die benutzerdefinierte Funktion lauten, wenn alle Zellen addiert werden sollen, die mit der Hintergrundfarbe ROT formatiert sind?
F
Über welche Methode können Sie den Inhalt einer Zelle komplett löschen?
F
Wie heißt die persönliche Makroarbeitsmappe und wo befindet sich diese?
9.6
Übung
Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Funktionen.xlsm und schreiben eine modulare Funktion, die vor der Aktivierung einer Tabelle überprüft, ob diese in der Arbeitsmappe überhaupt vorhanden ist. Die Lösung dieser Aufgabe können Sie im Anhang nachlesen.
431
24128.book Seite 432 Mittwoch, 7. Februar 2007 12:06 12
24128.book Seite 433 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
10
24128.book Seite 434 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
Am gestrigen Tag haben Sie gelernt, wie Sie Excel durch zusätzliche Tabellenfunktionen bereichern können. 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.xlsm im Verzeichnis Kap10.
10.1 Arbeiten mit Hyperlinks Hyperlinks kennen Sie schon aus dem Internet. Damit können Sie einzelne Internetseiten über Sprungmarken miteinander verbinden, um somit schnell von Seite zu Seite zu gelangen. Auch in Excel-Tabellen können Sie mit Hyperlinks arbeiten, um beispielsweise einzelne Tabellen sinnvoll miteinander zu verknüpfen. Hyperlinks werden standardmäßig in blauer Schriftfarbe und mit einer einfachen Unterstreichung formatiert. Daran können Sie Hyperlinks auch in einer Excel-Tabelle erkennen. Zellen, die einen Hyperlink enthalten, sind »Klick-sensibel«, d.h. wenn Sie mit der linken Maustaste auf eine solche Zelle klicken, werden Sie zum Ziel des Hyperlinks weitergeleitet. Excel erkennt über seine AutoKorrektur-Option automatisch schon bei der Eingabe, ob es diese Eingabe in einen Hyperlink umwandeln soll. So werden URLs von Internetseiten, E-Mail-Adressen und Netzwerkverbindungen automatisch mit der Hyperlinkfunktion und deren typischen Formatierung ausgestattet. Lernen Sie im Anschluss an diese Einführung ein paar typische Aufgaben aus der Praxis kennen.
434
24128.book Seite 435 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Hyperlinks
Hyperlinks aus einer Tabelle entfernen In der ersten Praxisaufgabe haben Sie eine Tabelle vorliegen, die einige Hyperlinks enthält. Ihre Aufgabe besteht nun darin, diese Hyperlinks zu entfernen. Die Hyperlinktexte sollen aber erhalten bleiben. Sehen Sie sich zuerst einmal die Abbildung 10.1 an.
Abbildung 10.1: Eine Tabelle mit Hyperlinks
Erfassen Sie jetzt das folgende Makro, um die Hyperlinks der Tabelle zu entfernen: Listing 10.1: Hyperlinks entfernen Sub HyperlinksEntfernen() Dim Zelle As Range Dim Bereich As Range Set Bereich = Tabelle1.UsedRange For Each Zelle In Bereich With Zelle If .Hyperlinks.Count > 0 Then .Hyperlinks.Delete With .Font .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With
435
24128.book Seite 436 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
End If End With Next Zelle End Sub
Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Range. Danach geben Sie über die Anweisung Set bekannt, in welchem Bereich der Tabelle die Entfernung von Hyperlinks durchgeführt werden soll. Mithilfe der Anweisung Tabelle1.UsedRange bestimmen Sie, dass alle Zellen im verwendeten Bereich der Tabelle verarbeitet werden sollen. In einer anschließenden Schleife werden genau diese benutzten Zellen abgearbeitet. Innerhalb der Schleife überprüfen Sie jede einzelne Zelle. Enthält eine Zelle einen Hyperlink, dann können Sie dies über die Anweisung Hyperlinks.Count feststellen. Meldet die Eigenschaft Count einen Wert > 0, dann enthält die Zelle einen Hyperlink. In diesem Fall löschen Sie den Hyperlink mithilfe der Methode Delete. Da die Formatierung der Zellen aber auch noch nach der Entfernung der Hyperlinks beibehalten wird, müssen 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 zurück, indem Sie dieser Eigenschaft die Konstante xlAutomatic zuweisen.
Abbildung 10.2: Die Hyperlinks wurden aus der Tabelle entfernt.
436
24128.book Seite 437 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Hyperlinks
Hyperlinks aus Zelleninhalten herstellen Gerade haben Sie gelernt, wie Sie Hyperlinks aus Tabellen entfernen. Aber auch der umgekehrte Vorgang ist von Interesse. Bilden Sie daher in der folgenden Aufgabe aus den Zelleninhalten der Zellen A1:A11 (Abbildung 10.2) Hyperlinks. Erfassen Sie jetzt das Makro aus Listing 10.2, um aus den Zelleninhalten Hyperlinks herzustellen. Listing 10.2: Aus Zelleninhalten Hyperlinks herstellen Sub HyperlinksSetzen() Dim intZeile As Integer Dim intZeileMax As Integer With Tabelle1 intZeileMax = .UsedRange.Rows.Count For intZeile = 1 To intZeileMax If Left(.Cells(intZeile, 1).Value, 7) = "http://" Then .Cells(intZeile, 1).Hyperlinks.Add .Cells(intZeile, 1), _ .Cells(intZeile, 1).Value, , _ "Klicken Sie hier, um die Verbindung herzustellen", _ .Cells(intZeile, 1).Value End If Next intZeile End With End Sub
Definieren Sie im ersten Schritt zwei Laufvariablen vom Typ Integer, über die Sie die Tabelle Zeile für Zeile verarbeiten können. In der Variablen intZeileMax ermitteln Sie, wie viele Zeilen der Tabelle befüllt sind. Danach setzen Sie die For Next-Schleife auf. Innerhalb der Schleife können Sie zur Sicherheit überprüfen, ob es sich dabei auch wirklich um eine »Internet-kompatible« Zelle handelt. Wenn ja, dann ergibt die Prüfung der ersten sieben Zeichen der Zelle das Wort http://. In diesem Fall wenden Sie die Methode Add an, um einen Hyperlink einzufügen.
437
24128.book Seite 438 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
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 können Sie beispielsweise zusätzlich eine bestimmte Zellenadresse angeben. In diesem Beispiel wird dieses Argument aber nicht benötigt. Über das optionale Argument ScreenTip können Sie die QuickInfo bestimmen, die angezeigt werden soll, wenn sich der Mauszeiger auf dem Hyperlink befindet. Im letzten Argument TextToDisplay legen Sie den Text fest, der für den Hyperlink angezeigt werden soll.
Abbildung 10.3: Hyperlinks aus Zelleninhalten bilden
Inhaltsverzeichnis erstellen In der nächsten Aufgabe geht es darum, in einer Arbeitsmappe mit vielen Tabellenblättern ein Inhaltsverzeichnis auf einer separaten neuen Tabelle zu erstellen. Diese Tabelle enthält alle Namen der Tabellen, die in dieser Arbeitsmappe vorhanden sind. Anschließend sollen diese Tabellennamen in Hyperlinks gewandelt werden, damit diese über einen Mausklick blitzschnell aktiviert werden können.
438
24128.book Seite 439 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten mit Hyperlinks
Sehen Sie sich dazu das folgende Listing an: Listing 10.3: Die Tabellennamen »verlinken« Sub Dim Dim Dim
InhaltsverzeichnisErstellen() intTab As Integer intZeile As Integer Blatt As Worksheet
Set Blatt = Worksheets.Add(Before:=Worksheets(1)) With Blatt .Name = "Inhalt" .Range("A1").Value = "Inhaltsverzeichnis" intZeile = 2 For intTab = 2 To ActiveWorkbook.Sheets.Count .Cells(intZeile, 1).Value = intZeile – 1 .Cells(intZeile, 2).Value = Worksheets(intTab).Name .Hyperlinks.Add Anchor:=.Cells(intZeile, 2), _ Address:="", SubAddress:= _ .Cells(intZeile, 2).Value & "!A1" intZeile = intZeile + 1 Next intTab End With End Sub
Fügen 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 anschließend alle Tabellen, mit Ausnahme der ersten Tabelle der Arbeitsmappe, und tragen Sie 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 können 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 Sie 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 & "!.
439
24128.book Seite 440 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
Abbildung 10.4: Alle Tabellen können über Hyperlinks schnell angesprungen werden.
10.2 E-Mails verschicken Standardmäßig können Sie die aktive Arbeitsmappe versenden, indem Sie aus über die runde Office-Schaltfläche gehen und den Befehl SENDEN /E-MAIL auswählen. Excel zeigt danach das E-Mail-Fenster an. Standardmäßig wird der Name der aktiven Arbeitsmappe als Titel der E-Mail eingetragen. Mit einem Klick auf die Schaltfläche AN haben Sie direkten Zugriff auf Ihre in Outlook gespeicherten EMail-Adressen, die Sie somit leicht übernehmen können. Sie müssen jetzt nur noch einen begleitenden Text ins E-Mail-Fenster eintippen und die E-Mail mit einem Klick auf die Schaltfläche SENDEN abschicken. Selbstverständlich haben Sie noch weitere Möglichkeiten, das Aussehen von EMails zu ändern. So können Sie beispielsweise schon einen vorgefertigten Text sowie die Empfänger-E-Mail-Adresse vorab eintragen. Um diese Funktion in Excel zu integrieren, müssen Sie ein VBA-Makro schreiben. Im nächsten Beispiel soll eine andere Arbeitsmappe, also nicht die aktive, mit einem bestimmten Titel und einem vorher definierten Text an einen bestimmten E-Mail-Empfänger versendet werden. Diese Arbeitsmappe wird dann als E-MailAnhang per VBA automatisch in die E-Mail eingebunden. Um diese Aufgabe auszuführen, müssen Sie zuerst einmal eine zusätzliche Bibliothek in Ihre Entwicklungsumgebung einbinden. Da Sie die E-Mail über Outlook versenden möchten, brauchen Sie die VBA-Outlook-Bibliothek. Um diese Bibliothek einzubinden, verfahren Sie wie folgt:
440
24128.book Seite 441 Mittwoch, 7. Februar 2007 12:06 12
E-Mails verschicken
1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.
Abbildung 10.5: Die Outlook-Bibliothek einbinden
3. Aktivieren Sie im Listenfeld VERFÜGBARE VERWEISE die Bibliothek MICROSOFT OUTLOOK 10.0 OBJECT LIBRARY für Outlook 2002, MICROSOFT OUTLOOK 11.0 OBJECT LIBRARY für Outlook 2003 und MICROSOFT OUTLOOK 12.0 OBJECT LIBRARY für Outlook 2007. 4. Bestätigen Sie Ihre Aktion mit OK. Erfassen Sie jetzt den Quellcode, um die Datei Projekt.xls aus dem Verzeichnis C:\ Daten an einen bestimmten Empfänger [email protected] zu versenden. 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) & _
441
24128.book Seite 442 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
"anbei erhalten Sie den aktuellen Projektbericht " & _ Chr(13) & " im aktuellen Monat " & Chr(13) & _ Chr(13) & " Mit freundlichen Grüßen" & Chr(13) & _ " Walter Kuhn " Mail.To = "[email protected]" Mail.CC = "[email protected]" Mail.Attachments.Add "C:\Daten\Projekt.xls" Mail.Display Set outl = Nothing Set Mail = Nothing End Sub
Die Methode CreateObject setzen Sie ein, um ein Outlook-Objekt anzulegen. Damit können Sie auf alle VBA-Objekte, Methoden und Eigenschaften von 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 EMail-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 eingefügt werden soll. Die Eigenschaft To bestimmt, an welche Empfänger die E-Mail versendet werden soll. Sie haben dabei auch die Möglichkeit, mehrere E-Mail-Empfänger hintereinander anzugeben. Wenn Sie möchten, können Sie die Eigenschaft CC einsetzen, wenn Ihre E-Mail auch an andere Empfänger als Kopie gesendet werden soll. Ergänzend zu den beiden letztgenannten Eigenschaften können Sie die Eigenschaft BCC einsetzen. Diese Eigenschaft kommt dann zum Tragen, wenn Sie einem Anwender eine E-Mail als Kopie zustellen möchten, ohne dass der eigentliche Empfänger 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 eingefügt. 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.
442
24128.book Seite 443 Mittwoch, 7. Februar 2007 12:06 12
Kontakte austauschen
Entfernen Sie die vorher definierten Outlook-Objekte wieder aus dem Speicher. Dazu dienen die Anweisungen: Set outl = Nothing bzw. Set Mail = Nothing. Sind Sie sich ganz sicher, dass alle Angaben stimmen, können Sie die EMail natürlich auch über einen VBA-Befehl direkt abschicken. Ergänzen Sie Ihr Makro mit dem Befehl Mail.Send.
Abbildung 10.6: Mit einem Klick wird die E-Mail versendet.
10.3 Kontakte austauschen Im Folgenden liegt Ihnen eine Tabelle mit Adressdaten in Excel vor. Ihre Aufgabe besteht nun darin, diese Adressen in den Kontaktordner von Outlook zu transferieren. Sehen Sie sich vorerst einmal die Ausgangssituation in Abbildung 10.7 an.
Abbildung 10.7: Die Adressdaten aus Excel sollen in den Kontaktordner von Outlook
Transferieren Sie nun diese Excel-Tabelle mithilfe des Makros aus Listing 10.5 in den Kontaktordner von Outlook.
443
24128.book Seite 444 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
Listing 10.5: Kontaktdaten aus Excel nach Outlook übertragen Sub KontakteAdressenNachOutlook () Dim appOutLook As Outlook.Application Dim conoutlook As Outlook.ContactItem Sheets("Kontaktaustausch").Activate 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 benötigen, übergeben Sie dieser Methode die Konstante olContactItem.
444
24128.book Seite 445 Mittwoch, 7. Februar 2007 12:06 12
Kontakte austauschen
Anschließend füllen Sie den noch leeren Kontakt mit den Daten aus Ihrer ExcelTabelle. Unter anderem verwenden Sie dabei folgende Eigenschaften: 쐽
LastName: Mit dieser Eigenschaft können Sie den Nachnamen, den Sie aus Ihrer Tabelle aus Spalte A holen, füllen.
쐽
FirstName: Mit dieser Eigenschaft können Sie den Vornamen, den Sie aus
Ihrer Tabelle aus Spalte B holen, füllen. 쐽
BusinessAddressStreet: Mit dieser Eigenschaft übergeben Sie den Inhalt der
Spalte C (Straße). 쐽
BusinessAddressCity: Mit dieser Eigenschaft übergeben Sie den Inhalt der
Spalte E (Ort). 쐽
BusinessAddressPostalCode: Mit dieser Eigenschaft übergeben Sie den Inhalt
der Spalte D (PLZ). 쐽
BusinessAddressCountry: Mit dieser Eigenschaft übergeben Sie den Inhalt der
Spalte F (Bundesland). 쐽
BusinessAddressState: Mit dieser Eigenschaft übergeben Sie den Inhalt der
Spalte G (Land). 쐽
Email1Address: Mit dieser Eigenschaft übergeben Sie den Inhalt der Spalte H
(E-Mail-Adresse). Mithilfe der Methode Save wird der Kontakt endgültig im Kontaktordner angelegt.
Abbildung 10.8: Die Kontakte wurden erfolgreich übertragen.
445
24128.book Seite 446 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
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: Erfassen Sie zu diesem Zweck das folgende Makro: Listing 10.6: Kontaktdaten aus Outlook ziehen Sub Dim Dim Dim Dim
KontakteVonOutlook() Verz As Object i As Integer olMAPI As New Outlook.Application objItem As Object
Sheets.Add ActiveSheet.Name = "Kontaktdaten" Range("A1").Select Set Verz = _ olMAPI.GetNamespace("MAPI") _ . GetDefaultFolder(olFolderContacts) For i = 1 To Verz.Items.Count Set objItem = Verz.Items(i) With objItem ActiveCell.Value = .FirstName ActiveCell.Offset(0, 1).Value ActiveCell.Offset(0, 2).Value .BusinessAddressStreet ActiveCell.Offset(0, 3).Value .BusinessAddressPostalCode ActiveCell.Offset(0, 4).Value .BusinessAddressCity ActiveCell.Offset(0, 5).Value .BusinessAddressCountry ActiveCell.Offset(0, 6).Value .BusinessAddressState ActiveCell.Offset(0, 7).Value End With ActiveCell.Offset(1, 0).Select Next i Columns("A:H").AutoFit
446
= .LastName = _ = _ = _ = _ = _ = .Email1Address
24128.book Seite 447 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
Set objItem = Nothing Set olMAPI = Nothing End Sub
Fügen 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 dafür vorgesehenen Excel-Zellen. Setzen Sie am Ende des Makros die Methode AutoFit ein, um die Spaltenbreiten automatisch einzustellen, und heben Sie danach die Objektverweise über die Anweisung Set Objektverweis = Nothing auf, um den reservierten Speicher wieder freizugeben.
Abbildung 10.9: Die aus Outlook importierten Kontaktdaten
10.4 Fragen & Antworten F
Wie können Sie E-Mail-Adressen mit Hyperlinks ausstatten? A
Wenn Sie in einer Tabelle E-Mail-Adressen vorliegen haben, dann können Sie diese mit dem Makro aus Listing 10.7 in Hyperlinks setzen. Sehen Sie sich aber vorher Abbildung 10.10 an.
447
24128.book Seite 448 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
Abbildung 10.10: Diese E-MailAdressen sollen in Hyperlinks gewandelt werden. 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 ActiveCell.Hyperlinks.Add ActiveCell, _ "MailTo: " & ActiveCell.Value End If ActiveCell.Offset(1, 0).Select Loop End Sub A
448
In einer Schleife durchlaufen Sie alle Zellen der Spalte A. Mit der Funktion InStr können Sie prüfen, ob die Zelle eine E-Mail-Adresse enthält. Ist dies der Fall, dann kommt das Zeichen @ automatisch darin vor. In diesem Fall fügen Sie über die Methode Add einen Hyperlink ein. Als Zusatz müssen Sie noch den Text MAILTO ergänzen. 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.
24128.book Seite 449 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
Abbildung 10.11: Die Hyperlinks wurden erfolgreich gesetzt. F
Wie können Sie überprüfen, ob eine Zelle einen Hyperlink hat? A
Im folgenden Makro wird eine Tabelle nach Hyperlinks durchforstet. Überall dort, wo Excel Hyperlinks finden kann, wird in der Nebenzelle ein Eintrag vorgenommen:
Listing 10.8: Alle Hyperlinks werden dokumentiert
Sub PrüfenZelleAufHyperlink() Sheets("PrüfungHyper").Activate Range("A1").Select Do Until ActiveCell.Value = "" If ActiveCell.Hyperlinks.Count > 0 Then ActiveCell.Offset(0, 1).Value = _ "Nebenzelle enthält Hyperlink!" Else End If ActiveCell.Offset(1, 0).Select Loop End Sub A
Indem Sie die Eigenschaft Count abfragen, können Sie ermitteln, ob eine Zelle einen Hyperlink enthält. In diesem Fall meldet diese Eigenschaft einen Wert > 0.
449
24128.book Seite 450 Mittwoch, 7. Februar 2007 12:06 12
Excel und das Internet
Abbildung 10.12: Aufspüren von Hyperlinks F
Wie können 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 HyperlinksFärben() Dim Hyper As Hyperlink Sheets("PrüfungHyper").Activate For Each Hyper In ActiveSheet.Hyperlinks Hyper.Range.Font.ColorIndex = 3 Next Hyper End Sub A
450
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Hyperlink. Danach durchlaufen Sie alle Hyperlinkzellen der aktiven Tabelle und färben diese über das Font-Objekt und die Eigenschaft ColorIndex ein.
24128.book Seite 451 Mittwoch, 7. Februar 2007 12:06 12
Quiz
10.5 Quiz F
Über welches Argument der Methode Add können Sie bestimmen, welche QuickInfo angezeigt wird, wenn Sie mit der Maus über eine Hyperlinkzelle streichen?
F
Mit welcher Anweisung können Sie ein leeres Outlook-Kontaktobjekt anlegen?
F
Was muss beim Anlegen eines Outlook-Kontaktes aus Excel heraus beachtet werden?
10.6 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Internet.xls und wechseln auf die Tabelle ÜBUNG. Schreiben Sie ein Makro, das alle Zellenadressen der dort befindlichen Hyperlinks auf einer separaten Tabelle dokumentiert. Die Lösung dieser Aufgabe können Sie im Anhang nachlesen.
451
24128.book Seite 452 Mittwoch, 7. Februar 2007 12:06 12
24128.book Seite 453 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
11
24128.book Seite 454 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Am gestrigen Tag haben Sie gelernt, wie Sie Hyperlinks in Excel setzen, formatieren, dokumentieren und entfernen können. Außerdem haben Sie über Excel-VBA E-Mails mit Dateianhängen verschickt und Kontaktdaten mit Outlook ausgetauscht. Die Themen heute: 쐽
Die Voraussetzung für den Datenaustausch zwischen Excel und Access
쐽
Excel-Daten in eine Access-Datenbank transferieren
쐽
Access-Daten in Excel-Tabellen überführen
쐽
Access-Tabellen manipulieren
쐽
Zusammenarbeit zwischen Excel und Word vorbereiten
쐽
Eine Word-Sitzung starten und übernehmen
쐽
Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen
쐽
Ganze Excel-Tabellen in ein Word-Dokument einfügen
쐽
Word-Dokumente in einer Excel-Tabelle auflisten Alle Beispiele des heutigen Tags finden Sie auf der mitgelieferten CDROM in den Arbeitsmappen ACCESS.XLSM und WORD.XLSM sowie in der Datenbankdatei BUCHUNGEN.MDB im Verzeichnis KAP11.
11.1 Die Voraussetzung für den Datenaustausch Die Zusammenarbeit zwischen Excel und Access bietet interessante Möglichkeiten in der Praxis. Das Datenbankprogramm Access bewährt sich gerade in der Verwaltung von Massendaten sehr gut. So können Sie die Daten in einer AccessDatenbank speichern und über Excel darauf zugreifen. Diese Access-Datenbank können Sie dann beispielsweise auf einem allgemein zugänglichen Netzlaufwerk zentral ablegen, auf das die einzelnen Excel-Anwender zugreifen können. Für den Datenzugriff stehen zwei verschiedene Methoden zur Verfügung. Diesen Zugriff können Sie entweder mit der älteren Zugriffsmethode DAO (Data Access Object) oder mit der neuen Methode ADO (ActiveX Data Object) bewerkstelligen. Aus Aktualitätsgründen werden die folgenden Beispiele mithilfe von ADO programmiert werden.
454
24128.book Seite 455 Mittwoch, 7. Februar 2007 12:06 12
Die Voraussetzung für den Datenaustausch
Bevor Sie mit der Programmierung beginnen, müssen Sie die Voraussetzung dafür schaffen, indem Sie die ADO-Bibliothek in Ihre Excel-Entwicklungsumgebung einbinden. Somit bekommen Sie Zugriff auf alle notwendigen Objekte, Methoden und Eigenschaften, die für 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 für Access-Datenbanken zur Verfügung. Diese können dann auch über die Taste (F1) in der Online-Hilfe nachgeblättert werden. Um diese Bibliotheken einzubinden, verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel 2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.
Abbildung 11.1: Die ADO-Bibliothek einbinden
3. Im Listenfeld VERFÜGBARE VERWEISE aktivieren Sie die Bibliothek MICROSOFT ACTIVEX DATA OBJECTS 2.8 LIBRARY. 4. Im Listenfeld VERFÜGBARE VERWEISE aktivieren Sie wahlweise, je nach eingesetzter Version, die Bibliothek MICROSOFT ACCESS 8.0 OBJECT LIBRARY (für Access 97), die Bibliothek MICROSOFT ACCESS 9.0 OBJECT LIBRARY (für Access 2000), die Bibliothek MICROSOFT ACCESS 10.0 OBJECT LIBRARY (für Access 2002) bzw. MICROSOFT ACCESS 11.0 OBJECT LIBRARY (für ACCESS 2003) SOWIE MICROSOFT ACCESS 12.0 OBJECT LIBRARY (für ACCESS 2007) 5. Bestätigen Sie Ihre Einstellung mit OK.
455
24128.book Seite 456 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Sie haben nun die Möglichkeit vorab einmal die zur Verfügung stehenden Objekte, Methoden und Eigenschaften in Access-VBA einzusehen. Drücken Sie dazu in der Entwicklungsumgebung die Taste (F2) und stellen Sie im ersten Dropdown den Befehl ACCESS ein.
Abbildung 11.2: Alle Objekte, Methoden und Eigenschaften von Access-VBA
11.2 Excel-Daten in eine Access-Datenbank überführen Im folgenden Praxisbeispiel soll eine Excel-Tabelle in eine noch leere AccessDatenbank transferiert werden. Dabei müssen Sie die Datenbank zuerst noch anlegen. Gehen Sie dabei wie folgt vor: 1. Starten Sie Microsoft Access. 2. Legen Sie eine neue Datenbank an und geben Sie dieser Datenbank den Namen BUCHUNGEN. 3. Erstellen Sie jetzt eine neue Tabelle, indem Sie aus dem Ribbon ERSTELLEN den Befehl TABELLE auswählen.
456
24128.book Seite 457 Mittwoch, 7. Februar 2007 12:06 12
Excel-Daten in eine Access-Datenbank überführen
4. Im Ribbon ANSICHT wählen Sie den Befehl ENTWURFSANSICHT. 5. Legen Sie jetzt den Aufbau der Tabelle fest, so wie Sie ihn in Abbildung 11.3 sehen.
Abbildung 11.3: Der Aufbau der Tabelle
6. Geben Sie der Tabelle den Namen VERANSTALTUNG. 7. Beenden Sie nun Microsoft Access. Im zweiten Schritt haben Sie eine Excel-Tabelle nach folgendem Muster vorliegen:
Abbildung 11.4: Die Veranstaltungsdaten in Excel
Übertragen Sie jetzt diese Veranstaltungsdaten aus der Excel-Tabelle in die Access-Datenbank. Setzen Sie zu diesem Zweck das Makro aus Listing 11.01 ein:
457
24128.book Seite 458 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Listing 11.1: Excel-Daten nach Access transferieren Sub Dim Dim Dim Dim
DatenübernahmeNachAccess() ADOC As New ADODB.Connection rst As New ADODB.Recordset intZeile As Integer intZeilemax As Integer
ADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ ThisWorkbook.Path & "\Buchungen.mdb;" rst.Open "Veranstaltung", ADOC, adOpenKeyset, adLockOptimistic With Sheets("Veranstaltungen") intZeilemax = .UsedRange.Rows.Count On Error GoTo fehler For intZeile = 2 To intZeilemax rst.AddNew rst!Bdatum = .Cells(intZeile, 1).Value rst!Vdatum = .Cells(intZeile, 2).Value rst!Veranstaltung = .Cells(intZeile, 3).Value rst!V_Ort = .Cells(intZeile, 4).Value rst!Teilnehmer = .Cells(intZeile, 5).Value rst!Straße = .Cells(intZeile, 6).Value rst!PLZ = .Cells(intZeile, 7).Value rst!Ort = .Cells(intZeile, 8).Value rst!Kosten = .Cells(intZeile, 9).Value If .Cells(intZeile, 10).Value = "Ja" Then rst!Bezahlt = True Else rst!Bezahlt = False End If rst.Update Next intZeile rst.Close ADOC.Close Set ADOC = Nothing Set rst = Nothing Exit Sub
458
24128.book Seite 459 Mittwoch, 7. Februar 2007 12:06 12
Excel-Daten in eine Access-Datenbank überführen
fehler: MsgBox "Es trat ein Fehler auf!" End With End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Connection, um später die Verbindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS benötigen Sie ein RecordSet-Objekt, welches nachher alle Datensätze der Datenquelle aufnehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, benötigen Sie zuerst einmal eine Verbindung zu Ihrem Provider, die Sie mit der Methode Open herstellen. Dieser Provider stellt alle Funktionen zur Verfügung, 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 später 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
Im Argument Source geben Sie den Namen der Tabelle an, die Sie öffnen möchten. 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 Verfügung: 쐽
adOpenForwardOnly: (Voreinstellung) Öffnet einen Vorwärtscursor. Mit Hilfe
dieses Cursors können Sie nur nach vorne blättern. 쐽
adOpenKeyset: Öffnet einen Cursor vom Typ Schlüsselgruppen. Dieser Cursor
ist vergleichbar mit dem dynamischen Cursor. Jedoch werden bei Ersterem Änderungen in der Tabelle, die von anderen Anwendern durchgeführt werden, nicht angezeigt werden.
459
24128.book Seite 460 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
쐽
AdOpenDynamic: Öffnet einen dynamischen Cursor. Damit haben Sie die Mög-
lichkeit, Tabelleneinträge anzuzeigen, zu ändern und zu löschen. Alle Änderungen werden regelmäßig aktualisiert und angezeigt. 쐽
adOpenStatic: Öffnet einen statischen Cursor. Bei diesem Cursor können die
Daten nur angezeigt, jedoch nicht geändert werden. Die Datenansicht ist als Momentaufnahme zu verstehen, die zum Zeitpunkt des Öffnens der Tabelle vorgelegen hat. Mithilfe des Arguments LockType bestimmen Sie, welches Sperrverfahren der Provider beim Öffnen der Tabelle einsetzen soll. Dabei stehen Ihnen folgende Konstanten zur Verfügung: 쐽
adLockReadOnly: Bei dieser Standardeinstellung können Sie die Daten in der Tabelle nicht ändern.
쐽
adLockPessimistic: Bei dieser Einstellung wird der Datensatz vollständig
gesperrt. Dabei wird das erfolgreiche Bearbeiten der Datensätze sichergestellt, indem der Provider Datensätze in der Datenquelle sofort beim Bearbeiten sperrt. 쐽
adLockOptimistic: Diese Einstellung sorgt dafür, dass die Tabelle teilweise gesperrt wird, d.h. ein Datensatz wird nur sperrt, wenn Sie die Update-Methode
aufrufen. 쐽
adLockBatchOptimistic: Diese Einstellung lässt eine teilweise Stapelaktualisie-
rung zu. Im letzten Argument Options können Sie festlegen, wie der Provider die Daten auswerten soll. Dieses Argument wird aber für unser Beispiel nicht benötigt. Geben Sie die Excel-Tabelle an, die die zu übertragenden Daten enthält. In einer anschließenden Schleife werden alle Datensätze der Tabelle verarbeitet. Innerhalb der Schleife setzen Sie die Methode AddNew ein, um zunächst einen leeren Datenbanksatz anzulegen. Diesen füllen Sie im Anschluss mit den Inhalten Ihrer ExcelTabelle. Vergessen Sie nicht dieses Befüllen des Datenbanksatzes mithilfe der Methode Update zu sichern. Am Ende des Makros schließen Sie die Datenbank über die Methode Close und beenden mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
460
24128.book Seite 461 Mittwoch, 7. Februar 2007 12:06 12
Access-Daten in Excel-Tabellen überführen
Abbildung 11.5: Die Daten wurden erfolgreich nach Access übertragen
11.3 Access-Daten in Excel-Tabellen überführen Im nächsten Beispiel wird genau der gegensätzliche Vorgang durchgeführt. Aus einer Access-Datenbank BUCHUNGEN.MDB sollen Daten nach Excel übertragen werden. Dabei wird der Transfer auf zwei verschiedene Arten durchgeführt: 쐽
Alle Datensätze sollen transferiert werden
쐽
Nur ganz bestimmte Datensätze sollen transferiert werden.
Alle Datensätze nach Excel transferieren Um alle Datensätze aus der Tabelle VERANSTALTUNG der Datenbank BUCHUNGEN.MDB nach Excel zu transferieren, setzen Sie das notwendige Makro aus Listing 11.02 ein: Listing 11.2: Daten aus einer Access-Tabelle transferieren Sub Dim Dim Dim Dim
DatenÜbertragenNachExcel() ADOC As New ADODB.Connection rst As New ADODB.Recordset cmd As ADODB.Command intZeile As Integer
461
24128.book Seite 462 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
On Error GoTo Fehlerbehandlung ADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ ThisWorkbook.Path & "\Buchungen.mdb;" rst.Open "Veranstaltung", ADOC, adOpenKeyset, adLockOptimistic Set cmd = New ADODB.Command cmd.CommandText = "SELECT * from Veranstaltung" cmd.ActiveConnection = ADOC Set rst = cmd.Execute With Sheets("Import") intZeile = 2 Do While Not rst.EOF .Cells(intZeile, 1).Value = .Cells(intZeile, 2).Value = .Cells(intZeile, 3).Value = .Cells(intZeile, 4).Value = .Cells(intZeile, 5).Value = .Cells(intZeile, 6).Value = .Cells(intZeile, 7).Value = .Cells(intZeile, 8).Value = .Cells(intZeile, 9).Value = If rst!Bezahlt = True Then .Cells(intZeile, 10).Value Else .Cells(intZeile, 10).Value End If rst.MoveNext intZeile = intZeile + 1 Loop .Columns("A:J").AutoFit rst.Close ADOC.Close Set rst = Nothing Set ADOC = Nothing Set cmd = Nothing Exit Sub
462
CDate(rst!Bdatum) CDate(rst!Vdatum) rst!Veranstaltung rst!V_Ort rst!Teilnehmer rst!Straße rst!PLZ rst!Ort rst!Kosten = "Ja" = "Nein"
24128.book Seite 463 Mittwoch, 7. Februar 2007 12:06 12
Access-Daten in Excel-Tabellen überführen
Fehlerbehandlung: MsgBox "Es ist ein Fehler aufgetreten!" & Chr(13) & _ Err.Description End With End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Connection, um später die Verbindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS benötigen Sie ein RecordSet-Objekt, welches nachher alle Datensätze der Datenquelle aufnehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, benötigen Sie zuerst einmal eine Verbindung zu Ihrem Provider, die Sie mit der Methode Open herstellen. Dieser Provider stellt alle Funktionen zur Verfügung, die notwendig sind, um auf die Access-Datenbank zuzugreifen. Basteln Sie sich nun eine kleine SQL-Anweisung mithilfe des Schlüsselwortes SELECT, welches Sie auf die Access-Tabelle Veranstaltung ansetzen. Der Stern (*) nach dem SELECT bedeutet, dass alle Datensätze genommen werden sollen. Über die Methode Execute führen Sie diese SQL-Abfrage aus. Die ermittelten Daten-
sätze stehen nun bereit. Arbeiten Sie in einer anschließenden Schleife alle Datensätze 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 nächsten Datensatz zu gelangen. Im RecordSet-Objekt rst steht der komplette Datensatz. Sie haben daher die Möglichkeit, 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. Die ersten beiden Felder sind Datumsfelder. Mit Hilfe der Funktion CDate wandeln Sie diese Datumsangaben in ein Excelinterpretierbares Datumsformat um. Am Ende des Makros schließen Sie die Datenbank über die Methode Close und beenden mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
463
24128.book Seite 464 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Abbildung 11.6: Die Daten kamen korrekt an
Nur bestimmte Datensätze nach Excel transferieren Im nächsten Beispiel werden Sie nur ganz bestimmte Sätze nach Excel transferieren, d.h. Sie werden eine Datenbankabfrage durchführen und nur Sätze nach Excel übertragen, die bestimmten Kriterien entsprechen. So werden Sie jetzt alle Datensätze nach Excel importieren, bei denen die Teilnahmegebühr noch nicht bezahlt wurde. Das Makro für diese Aufgabe lautet: Listing 11.3: Nur bestimmte Datensätze aus Access nach Excel übernehmen Sub Dim Dim Dim Dim
DatensätzeSuchenUndÜbertragen() ADOC As ADODB.Connection rst As ADODB.Recordset s As String intZeile As Integer
s = "Bezahlt=false" Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open ThisWorkbook.Path & "\Buchungen.mdb" End With Set rst = New ADODB.Recordset With rst .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _
464
24128.book Seite 465 Mittwoch, 7. Februar 2007 12:06 12
Access-Daten in Excel-Tabellen überführen
CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic .Find Criteria:=s, SearchDirection:=adSearchForward Sheets("Offene").Activate intZeile = 2 If Not .EOF Then Do While Not .EOF Cells(intZeile, 1).Value = _ Format(rst!Bdatum, "DD.MM.YYYY") Cells(intZeile, 2).Value = _ Format(rst!Vdatum, "DD.MM.YYYY") Cells(intZeile, 3).Value = rst!Veranstaltung Cells(intZeile, 4).Value = rst!V_Ort Cells(intZeile, 5).Value = rst!Teilnehmer Cells(intZeile, 6).Value = rst!Straße Cells(intZeile, 7).Value = rst!PLZ Cells(intZeile, 8).Value = rst!Ort Cells(intZeile, 9).Value = rst!Kosten .Find Criteria:=s, SkipRecords:=1 intZeile = intZeile + 1 Loop Else MsgBox "Datensatz nicht gefunden" End If .Close End With Columns("A:J").AutoFit ADOC.Close Set rst = Nothing Set ADOC = Nothing End Sub
Stellen Sie wie vorher die Verbindung zum Provider her und öffnen Sie Ihre Datenbank sowie die Access-Tabelle. In der Variablen s basteln Sie sich Ihr Suchkriterium zusammen, nachdem die Access-Tabelle durchsucht werden soll.
465
24128.book Seite 466 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Setzen Sie jetzt die Methode Find ein. Diese Methode sucht in der Tabelle nach dem Datensatz, der den angegebenen Kriterien entspricht. Ist das Kriterium erfüllt, wird der gefundene Datensatz zum aktuellen Datensatz der Tabelle. Andernfalls wird der Zeiger auf das Ende der Tabelle festgelegt. Die Methode Find hat folgende Syntax. Find (criteria, SkipRows, searchDirection, start)
Unter dem Argument criteria müssen Sie angeben, was Sie konkret in der Tabelle suchen möchten. Diese Information haben Sie bereits vorher in der Variablen s gespeichert. Dabei wurden der verwendete Spaltenname, der Vergleichsoperator sowie der Wert in der Variablen s zusammengebastelt. Beim Argument SkipRows können 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 Verfügung: 쐽
adSearchForward: Führt die Suche vorwärts durch. Die Suche hört am Ende der Tabelle auf, sofern kein entsprechender Datensatz gefunden wurde.
쐽
adSearchBackward: Führt die Suche rückwärts durch. Die Suche hört am
Anfang der Tabelle auf, sofern kein entsprechender Datensatz gefunden wurde. Mit Hilfe des Arguments start können Sie einen numerischen Wert angeben, der festlegt, 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 hierüber in der Objektvariablen rst. Übertragen Sie diese Informationen dann in Ihre ExcelTabelle. Um zum nächsten Datensatz zu gelangen, setzen Sie erneut die Methode Find ein. Haben Sie alle Datensätze erfolgreich in die Excel-Tabelle übertragen, dann schließen Sie die Datenbank über die Methode Close und beenden mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
466
24128.book Seite 467 Mittwoch, 7. Februar 2007 12:06 12
Access-Tabellen manipulieren
Abbildung 11.7: Alle Teilnehmer von Veranstaltungen, die noch nicht bezahlt haben
11.4 Access-Tabellen manipulieren Im nächsten Beispiel greifen Sie von Excel aus auf eine Access-Tabelle zu und passen die Preise an. Dabei sollen die Preise für die Veranstaltungen um 10% erhöht werden.
Abbildung 11.8: Originalzustand vor der Preiserhöhung
Erfassen Sie nun das Makro, welches die Preise der Veranstaltungen um 10% erhöht.
467
24128.book Seite 468 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Listing 11.4: Die Preise wurden um 10% erhöht Sub Dim Dim Dim
DatenManipulieren() ADOC As ADODB.Connection rst As ADODB.Recordset Erhöhung As Single
Erhöhung = 1.1 Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open ThisWorkbook.Path & "\Buchungen.mdb" End With Set rst = New ADODB.Recordset With rst .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic Do While Not .EOF rst!Kosten = rst!Kosten * Erhöhung rst.Update rst.MoveNext Loop .Close End With ADOC.Close Set rst = Nothing Set ADOC = Nothing End Sub
Da die Methoden zum Öffnen einer Tabelle bereits beschrieben wurden, gehen wir gleich mitten in die Schleife. Die Preiserhöhung führen 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 nächsten Datensatz. Diese Vorgehensweise führen Sie durch, bis Sie am letzten Satz der Tabelle angelangt sind. Dann tritt die
468
24128.book Seite 469 Mittwoch, 7. Februar 2007 12:06 12
Datensätze löschen
Schleifenbedingung EOF auf und die Schleife wird verlassen. Vergessen Sie dann nicht die Tabelle über die Methode Close zu schließen und die Objektverweise wieder aufzuheben.
Abbildung 11.9: Die Preise wurden erhöht
11.5 Datensätze löschen Im letzten Beispiel sollen in einer Access-Tabelle alle Datensätze gelöscht werden, bei denen der Veranstaltungsort STUTTGART ist. Diese Manipulation soll von Excel heraus durchgeführt werden. Das Makro zur Lösung dieser Aufgabenstellung lautet: Listing 11.5: Entfernen von bestimmten Datensätzen Sub DatensätzeLöschen() Dim ADOC As New ADODB.Connection Dim rst As ADODB.Recordset Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open ThisWorkbook.Path & "\Buchungen.mdb" End With
469
24128.book Seite 470 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Set rst = New ADODB.Recordset rst.Open _ "Select * FROM Veranstaltung where (V_Ort = 'Stuttgart')", _ ADOC, adOpenKeyset, adLockOptimistic Do Until rst.EOF rst.Delete rst.MoveNext Loop rst.Close Set rst = Nothing Set ADOC = Nothing End Sub
Öffnen Sie die Access-Tabelle VERANSTALTUNGEN und geben Sie über die SQLAnweisung bekannt, welche Datensätze Sie beabsichtigen zu entfernen. Danach durchlaufen Sie in einer Schleife alle gefundenen Datensätze und löschen diese mithilfe der Methode Delete. Nach dem Löschen von Datensätzen aus einer Tabelle müssen Sie darauf achten, dass Sie mit Hilfe der Methode MoveNext jeweils zum nächsten Datensatz springen.
Abbildung 11.10: Alle Veranstaltungen in Stuttgart wurden aus der Datenbank entfernt
470
24128.book Seite 471 Mittwoch, 7. Februar 2007 12:06 12
Zusammenarbeit zwischen Excel und Word vorbereiten
11.6 Zusammenarbeit zwischen Excel und Word vorbereiten Wenn Sie beschließen, mit Excel und Word im Duett zu arbeiten und für diesen Zweck Makros programmieren möchten, müssen Sie Zugriff auf alle Objekte, Methoden und Eigenschaften von Word-VBA haben. Daher müssen Sie in Ihre Excel-Entwicklungsumgebung die Word-VBA-Bibliothek einbinden. Dazu verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.
Abbildung 11.11: Die Word-Bibliothek einbinden
3. Wählen Sie aus dem Listenfeld VERFÜGBARE 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) oder MICROSOFT WORD 12.0 OBJECT LIBRARY (Word 2007) aus. 4. Bestätigen Sie Ihre Einstellung mit OK.
471
24128.book Seite 472 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Sie haben nun die Möglichkeit, vorab die zur Verfügung stehenden Objekte, Methoden und Eigenschaften in Word-VBA einzusehen. Drücken Sie dazu in der Entwicklungsumgebung die Taste (F2) und stellen Sie im ersten Dropdown-Feld den Befehl WORD ein.
Abbildung 11.12: Alle Objekte, Methoden und Eigenschaften von Word-VBA
11.7 Word-Sitzung starten Im ersten Beispiel werden Sie eine neue Word-Sitzung starten, dann ein bestimmtes Dokument öffnen. Danach können beliebige Aktionen im Dokument durchgeführt werden. In diesem Beispiel wird das Dokument wieder geschlossen und die Sitzung beendet. Das Makro für diese Aufgabe lautet: Listing 11.6: Eine Word-Sitzung starten und ein Dokument öffnen Sub WordSitzungStarten() Dim WordApp As Object Set WordApp = CreateObject("Word.application")
472
24128.book Seite 473 Mittwoch, 7. Februar 2007 12:06 12
Word-Sitzung starten
With WordApp .Application.Visible = True .Application.Documents.Open _ ("C:\Daten\Brief.docx") 'Beliebige Aktionen durchführen .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 eröffnen. 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.docx. Nun können beliebige Aktionen im Dokument durchgeführt werden (dazu aber später mehr). Über die Methode Close schließen Sie das aktive Dokument. Indem Sie das Argument SaveChanges auf den Wert False setzen, sorgen Sie dafür, dass das Dokument direkt geschlossen wird. Eventuelle Änderungen werden somit verworfen. Wenden Sie danach die Methode Quit an, um die Word-Sitzung zu beenden. Sie haben jetzt einen Makrorahmen, der eine Word-Sitzung startet, ein bestimmtes Word-Dokument öffnet, dieses danach wieder schließt und im Anschluss daran die Anwendung beendet.
Abbildung 11.13: Die Sitzung ist gestartet und das Dokument geöffnet.
473
24128.book Seite 474 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
11.8 Word-Sitzung übernehmen Nicht immer muss aber eine neue Sitzung von Word gestartet werden. Vor allem dann nicht, wenn bereits eine Word-Sitzung eröffnet ist. In dem Fall muss Excel dies erkennen und somit muss diese Sitzung nur noch aktiviert werden. Im folgenden Beispiel soll geprüft werden, ob eine Word-Sitzung bereits eröffnet wurde. Wenn ja, soll diese Sitzung übernommen und im Anschluss daran ein neues Dokument eingefügt werden. Das Makro zur Lösung dieser Aufgabenstellung können Sie in Listing 11.7 sehen: Listing 11.7: Eine Word-Sitzung übernehmen Sub WordSitzungÜbernehmen() Dim WordApp As Object Dim WordDok As Object On Error GoTo SitzungEröffnen Set WordApp = GetObject(, "Word.Application") GoTo weiter SitzungEröffnen: Set WordApp = CreateObject("Word.Application") weiter: WordApp.Visible = True Set WordDok = WordApp.Documents.Add Set WordApp = Nothing Set WordDok = Nothing End Sub
Erzeugen Sie zuerst zwei Objektvariablen. Die erste Variable wird dabei die Anwendung Word verwalten. Die zweite Variable wird ein neues, noch leeres Word-Dokument verwalten. Zunächst einmal sollten Sie überprüfen, ob bereits eine Applikation in Word gestartet ist. Für 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, fügen Sie ein neues Dokument ein.
474
24128.book Seite 475 Mittwoch, 7. Februar 2007 12:06 12
Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen
Abbildung 11.14: Die Word-Sitzung wurde übernommen.
11.9 Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen In der nächsten Aufgabe soll eine bestimmte Adresse aus einer Excel-Tabelle für den Briefkopf in Word verwendet werden. Sehen Sie sich dazu einmal die folgende Tabelle in Abbildung 11.15 an.
Abbildung 11.15: Die Adressentabelle
Im Zellen-Dropdown-Feld in Zelle A1 können die verfügbaren Namen dynamisch ausgewählt 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. Klicken Sie im Ribbon DATEN auf das Symbol DATENÜBERPRÜFUNG.
475
24128.book Seite 476 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Abbildung 11.16: Das Zellen-Dropdown erstellen
3. Wählen Sie aus dem Dropdown-Feld ZULASSEN den Befehl LISTE. 4. Geben Sie als Quelle den Zellenbezug an, in dem Ihre Namen in der Tabelle aufgelistet werden. 5. Bestätigen 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
Formel/Funktion
B1
=SVERWEIS($A$1;$A$5:$E$13;2;FALSCH)
C1
=SVERWEIS($A$1;$A$5:$E$13;3;FALSCH)
D1
=SVERWEIS($A$1;$A$5:$E$13;4;FALSCH)
E1
=SVERWEIS($A$1;$A$5:$E$13;5;FALSCH)
Tabelle 11.1: Die benötigten Formeln für die Adressen-Tabelle
Immer wenn Sie jetzt einen Namen aus dem Zellen-Dropdown in Zelle A1 auswählen, sucht Excel die dazugehörigen Adressdaten. Diese sollen jetzt in das Word-Dokument Brief.docx transferiert werden. Das Makro für diese Aufgabe können Sie in Listing 11.8 sehen:
476
24128.book Seite 477 Mittwoch, 7. Februar 2007 12:06 12
Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen
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 Straße As String PLZ As String Ort As String
With Sheets("Adressen") Nachname = .Range("A1").Value Vorname = .Range("B1").Value Straße = .Range("C1").Value PLZ = .Range("D1").Value Ort = .Range("E1").Value End With Set WordApp = CreateObject("Word.application") With WordApp .Application.Visible = True .Application.Documents.Open ("C:\Daten\Brief.docx") With WordApp.Selection .WholeStory .Delete .TypeText Text:=Vorname & " " & Nachname .TypeParagraph .TypeText Text:=Straße .TypeParagraph .TypeText Text:=PLZ & " " & Ort End With .ActiveDocument.Close savechanges:=True .Application.Quit End With Set WordApp = Nothing End Sub
477
24128.book Seite 478 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Aktivieren Sie im ersten Schritt die Tabelle in Excel, welche Ihre Adressen enthält. Füllen Sie dann die Variablen, indem Sie die Werte der Zellen A1:E1 übertragen. Danach eröffnen Sie mithilfe der Methode CreateObject eine neue Word-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.docx. Momentan steht der Textcursor im Dokument ganz links oben. Dies ist für uns die richtige Position, um nun den Inhalt der Variablen dort einzufügen. Mit der Eigenschaft TypeText können Sie einen Text in das Dokument einfügen. Dies nutzen Sie für die Erstellung der Überschrift. Mit der Methode TypeParagraph fügen Sie eine leere Zeile im Dokument ein. Bevor Sie aber die neuen Daten einfügen, sollten Sie eventuell bereits eingefügte Adressen im Dokument löschen. Setzen Sie die Methode WholeStory ein, um den Text im Dokument zu markieren, und löschen Sie diesen direkt im Anschluss, indem Sie die Methode Delete einsetzen.
Abbildung 11.17: Die Adresse wurde erfolgreich eingefügt.
11.10 Ganze Excel-Tabellen in ein Word-Dokument einfügen Im nächsten Beispiel soll eine Excel-Tabelle in ein neues Word-Dokument übertragen werden. Dabei sollen die Daten Zelle für Zelle übertragen und anschließend in eine Word-Tabelle eingefügt werden. Gehen Sie bei dieser Aufgabe von der Excel-Tabelle in Abbildung 11.18 aus.
478
24128.book Seite 479 Mittwoch, 7. Februar 2007 12:06 12
Ganze Excel-Tabellen in ein Word-Dokument einfügen
Abbildung 11.18: Die Ausgangssituation
Führen Sie nun den Datentransfer durch, indem Sie das folgende Makro starten: Listing 11.9: Eine Excel-Tabelle Zelle für Zelle in ein Word-Dokument übertragen Sub Dim Dim Dim Dim Dim Dim Dim
ExcelDatenNachWord() WordApp As Object WordDok As Object VarBereich As Variant ExTab As Object i As Integer x As Integer y As Integer
VarBereich = Tabelle1.UsedRange Set WordApp = CreateObject("Word.Application") WordApp.Visible = True 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(VarBereich, 1), UBound(VarBereich, 2)) With ExTab
479
24128.book Seite 480 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
For x = 1 To UBound(VarBereich, 1) For y = 1 To UBound(VarBereich, 2) .Cell(x, y).Range.InsertAfter VarBereich(x, y) Next y Next x End With Set WordApp = Nothing Set WordDok = Nothing Set ExTab = Nothing End 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.
Abbildung 11.19: Die Excel-Tabelle wurde erfolgreich transferiert.
Mit der Eigenschaft TypeText können Sie einen Text in das Dokument einfügen. Dies nutzen Sie für die Erstellung der Überschrift. Mit der Methode TypePara-
480
24128.book Seite 481 Mittwoch, 7. Februar 2007 12:06 12
Word-Dokumente in einer Excel-Tabelle auflisten
graph fügen Sie eine leere Zeile im Dokument ein. Setzen Sie die Methode Add
ein, um eine noch leere Tabelle in das Dokument einzufügen, und füllen Sie diese Zelle für Zelle, indem Sie das vorher gefüllte Datenfeld schrittweise auslesen und mit der Methode InsertAfter in die Tabelle übertragen.
11.11 Word-Dokumente in einer Excel-Tabelle auflisten In der nächsten Aufgabe soll ein Verzeichnis nach Word-Dokumenten durchsucht werden. Dabei sollen die Namen der Dokumente in eine Excel-Tabelle eingefügt und direkt im Anschluss verlinkt werden. Sie haben dann die Möglichkeit, mit einem Klick auf den jeweiligen Hyperlink das entsprechende Word-Dokument zu öffnen. Diese beiden Arbeitsschritte werden getrennt voneinander ausgeführt. Im ersten Makro in Listing 11.10 werden die Namen der gefundenen Word-Dokumente in eine neue Tabelle geschrieben: Listing 11.10: Word-Dokumente suchen und in einer Excel-Tabelle dokumentieren Sub Dim Dim Dim Dim Dim Dim
WordDokumenteSuchen() Zieltab As Worksheet intZeile As Integer fs As Object fVerz As Object fDatei As Object fDateien As Object
Set Zieltab = Worksheets.Add Zieltab.Name = "Doku" intZeile = 1 Set fs = CreateObject("Scripting.FileSystemObject") Set fVerz = fs.GetFolder("C:\") Set fDateien = fVerz.Files For Each fDatei In fDateien If InStr(fDatei, "doc") > 0 Then Zieltab.Cells(intZeile, 1).Value = fDatei.Name
481
24128.book Seite 482 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Zieltab.Cells(intZeile, 1).Hyperlinks.Add _ Zieltab.Cells(intZeile, 1), Zieltab.Cells(intZeile, 1) intZeile = intZeile + 1 End If Next fDatei End Sub
Zu Beginn des Makros erstellen Sie einen Verweis auf die Bibliothek FileSystemObject. Diese Bibliothek enthält alle Befehle, die notwendig sind, Verzeichnisse und Dateien auszulesen. Über die Anweisung GetFolder geben Sie bekannt, in welchem Verzeichnis Sie die Suche durchführen möchten. Das Auflistungsobjekt Files enthält automatisch alle Dateien, die im angegebenen Verzeichnis vorhanden sind. Über die Funktion Instr können Sie überprüfen, ob das Kürzel doc (Word) im Dateinamen vorkommt. Wenn ja, dann sammeln Sie die Dateinamen dieser Dateien. Schreiben Sie diesen direkt in Ihre Excel-Tabelle. Wenden Sie in einer Schleife die Methode Add an, um die einzelnen Hyperlinks einzufügen. In Kapitel 10 wurde diese Thematik bereits besprochen, sodass an dieser Stelle nicht näher darauf eingegangen wird.
Abbildung 11.20: Alle gefundenen Word-Dokumente
482
24128.book Seite 483 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
11.12 Fragen & Antworten Wie kann ich die 5 billigsten Veranstaltungen einer Access-Tabelle ermitteln und in eine Excel-Tabelle überführen?
F
A
Setzen Sie zu diesem Zweck die SQL-Anweisung TOP ein.
Listing 11.11: Die Top-Werte einer Access-Tabelle übertragen Sub Dim Dim Dim Dim
Top_DatensätzeAnzeigen() ADOC As New ADODB.Connection rst As ADODB.Recordset s As String intZeile As Integer
Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open ThisWorkbook.Path & "\Buchungen.mdb" End With s = _ "SELECT TOP 5 Kosten, Veranstaltung, V_Ort, Vdatum, Teilnehmer FROM Veranstaltung ORDER BY Kosten" Set rst = New ADODB.Recordset On Error GoTo fehler rst.Open s, ADOC, adOpenKeyset, adLockOptimistic With Sheets("Teuer") intZeile = 1 Do While Not rst.EOF .Cells(intZeile, 1).Value = Format(rst!Vdatum, "DD.MM.YYYY") .Cells(intZeile, 2).Value = rst!Veranstaltung .Cells(intZeile, 3).Value = rst!V_Ort .Cells(intZeile, 4).Value = rst!Kosten .Cells(intZeile, 5).Value = rst!Teilnehmer rst.MoveNext intZeile = intZeile + 1 Loop End With
483
24128.book Seite 484 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
rst.Close ADOC.Close Set rst = Nothing Set ADOC = Nothing Exit Sub
fehler: MsgBox "Die Tabelle konnte nicht gefunden werden!" End Sub
Achten Sie darauf, dass Sie in der SQL-Anweisung SELECT die Felder mit übernehmen, auf die Sie später auch zugreifen möchten. Die Sortierung der Liste können Sie über das Schlüsselwort ORDER bestimmen.
Abbildung 11.21: Die Top-Werte aus Access zusammentragen F
Welche spezielle Möglichkeit habe ich eine Access-Tabelle in Excel zu importieren? A
Wenn Sie das folgende Makro aus Listing 11.13 in Ihre Access-Entwicklungsumgebung eingeben und starten, dann erfolgt der Transfer in eine Excel-Datei noch schneller:
Listing 11.12: Der Transfer einer Access-Tabelle nach Excel Sub TabelleNachExcel() DoCmd.OutputTo acOutputTable, _ "Veranstaltung", acFormatXLS, _ "C:\Daten\Veranstaltungen.xls", True End Sub
484
24128.book Seite 485 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
Mit Hilfe der Methode OutputTo können 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, TemplateFile)
ObjectName,
OutputFormat,
OutputFile,
AutoStart,
Über das Argument ObjectType legen Sie die Art des Access-Objektes fest, dessen Daten Sie exportieren möchten. Dabei haben Sie folgende Möglichkeiten: 쐽
acOutputForm: Export der Daten eines Formulars
쐽
acOutputFunction: Export einer Function zur Sicherung
쐽
acOutputModule: Export eines kompletten Moduls, inkl. aller Funktionen und Makros
쐽
acOutputQuery: Export der Ergebnisse eine Abfrage
쐽
acOutputReport: Export eines Berichts
쐽
acOutputServerView: Export einer Serveransicht
쐽
acOutputStoredProcedure: Export einer gespeicherten Prozedur
쐽
acOutputTable: Export einer Tabelle
Beim Argument ObjectName geben Sie den Namen des Objektes an, welches Sie exportieren möchten. Das Argument OutputFormat legt fest, in welchem Datenformat Sie die Daten transferieren möchten. Die bekanntesten Formate heißen dabei wie folgt: 쐽
acFormatHTML: Konvertiert die Daten in das HTML-Format.
쐽
acFormatRTF: Konvertiert die Daten in das Rich-Textfile-Format. Dieses For-
mat kann beispielsweise sehr gut in Microsoft Word eingelesen werden. 쐽
acFormatTXT: Mit diesem Format ist das Textformat gemeint.
쐽
acFormatXLS: Konvertiert die Daten in das Microsoft Excel-Format.
Beim Argument OutputFile geben Sie den Pfad sowie den Dateinamen der Datei an, in welche Sie die Daten transferieren möchten. Dabei muss die Datei noch nicht vorhanden sein. Access legt diese bei Bedarf selber an. Mit Hilfe des Arguments AutoStart haben Sie die Möglichkeit die so erstellte Exportdatei gleich zu öffnen. Verwenden Sie den Wert True, um die entspre-
485
24128.book Seite 486 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
chende 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 möchten. Das Argument TemplateFile ist dann von Interesse, wenn Sie eine Vorlage beispielsweise für die HTML-Datei verwenden möchten. In diesem Fall ist dann der komplette Pfad dieser Vorlagendatei anzugeben.
Abbildung 11.22: Access-Tabelle wurde erfolgreich nach Excel transferiert
Wie kann ich ein Feld einer Access-Tabelle ansprechen, wenn dieses Feld im Namen ein Leerzeichen (z.B: Kosten Kurs) enthält?
F
A
Setzen Sie um dieses Feld eckige Klammern. DBS![Kosten Kurs].
Wie können Sie einen Teil einer Excel-Tabelle in ein neues Dokument kopieren?
F
A
Erfassen Sie zu diesem Zweck das folgende Makro:
Listing 11.13: Einen Zellenbereich in ein Word-Dokument kopieren Sub Dim Dim Dim
ExcelDatenNachWordKopieren() WordApp As Object WordDok As Object Bereich As Range
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
486
24128.book Seite 487 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
Set WordApp = Nothing Set WordDok = Nothing End Sub A
F
Deklarieren Sie zu Beginn einige Objektvariablen. Eröffnen 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 Sie kopieren möchten. 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 dafür reservierten Speicher wieder freizugeben.
Wie können Sie ein Word-Makro von Excel heraus starten? A
Um diese Aufgabe zu lösen, legen Sie ein neues Word-Dokument (Word.docx) im Verzeichnis C:\Daten an und fügen Sie in dieses Dokument ein Makro namens WORDMAKRO ein. Starten Sie danach aus Ihrer Excel-Entwicklungsumgebung heraus das Makro aus Listing 11.15:
Listing 11.14: Ein Word-Makro starten Sub WordMakroStarten() Dim WordApp As Object Set WordApp = CreateObject("Word.Application") WordApp.Visible = True WordApp.Application.Documents.Open _ ("C:\Daten\Word.doc") WordApp.Run "WordMakro" WordApp.Quit Set WordApp = Nothing End Sub A
Deklarieren Sie im ersten Schritt eine Objektvariable und setzen Sie die Funktion CreateObject ein, um eine neue Word-Sitzung zu eröffnen. Blenden Sie danach die Word-Sitzung ein, indem Sie der Eigenschaft
487
24128.book Seite 488 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
Visible den Wert True zuweisen. Öffnen Sie daraufhin das Dokument Word.docx 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 dafür reservierten Speicher wieder freizugeben. F
Wie können Sie in eine Excel-Tabelle ein Word-Dokument als Symbol einfügen? A
Möchten Sie ein Word-Dokument in eine Excel-Tabelle als Symbol einfügen, starten Sie das folgende Makro:
Listing 11.15: Ein Word-Dokument als Symbol einfügen Sub DokumentObjektEinfügen() Sheets("Übung").OLEObjects.Add _ (Filename:="C:\Daten\Brief.docx", Link:= _ False, DisplayAsIcon:=True, IconFileName:= _ "C:\PROGRAMME\MICROSOFT OFFICE 2007\OFFICE12\WINWORD.EXE", _ IconIndex:=0, _ IconLabel:="C:\Daten\Brief.docx").Select End Sub A
Ü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 den 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 verknüpfen, 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.
488
24128.book Seite 489 Mittwoch, 7. Februar 2007 12:06 12
Quiz
Mit dem Argument DisplayAsIcon können 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 müssen Sie die Datei angeben, welche das anzuzeigende Symbol enthält. 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ü EINFÜGEN, Dialogfeld OBJEKT) angezeigt werden, wenn das Kontrollkästchen ALS SYMBOL ANZEIGEN aktiviert ist. Im Argument IconLabel geben Sie die Beschriftung an, die unter dem Symbol angezeigt werden soll. In den Argumenten Left, Top, Width und Height können Sie die Position bzw. die Größe angeben, in der das OLE-Objekt in die Tabelle eingefügt wird.
Abbildung 11.23: Word-Dokument wurde als Symbol in die Tabelle eingefügt.
11.13 Quiz F
Warum müssen Sie die ADO-Bibliothek in Ihre Entwicklungsumgebung einbinden? A
Um auf Access-Datenbanken zuzugreifen muss diese Bibliothek eingebunden werden. Damit haben Sie Zugriff auf alle Objekte, Methoden und Eigenschaften, die notwendig sind, um Access-Datenbanken zu verarbeiten.
489
24128.book Seite 490 Mittwoch, 7. Februar 2007 12:06 12
Excel und Datenzugriffe auf Access und Word
F
An was muss ich denken, wenn ich über die Methode AddNew einen neuen Datensatz anlege? A
F
Nach dem Füllen des Datensatzes mit Daten müssen Sie die Methode Update einsetzen, damit der Datensatz endgültig gesichert wird.
Welches Argument muss ich einsetzen, wenn ich eine Access-Tabelle vom Ende bis zum Anfang durchsuchen möchte? A
Setzen Sie das Argument Searchdirection der Methode Find auf den Wert adSearchBackward.
F
Wie heißt die Methode, um in einer Access-Tabelle jeweils zum nächsten Datensatz zu springen? A
Die Methode heißt: MoveNext.
F
Wie heißt die Funktion, um eine Applikations-Sitzung festzustellen?
F
Welche Eigenschaft muss man einsetzen, wenn man eine Applikation starten, diese aber nicht am Bildschirm anzeigen möchte?
F
Wie heißt die Methode, um in einem Word-Dokument eine Leerzeile einzufügen?
F
Welches Objekt können Sie einsetzen, um nach bestimmten Dateitypen auf Ihrem PC zu suchen?
11.14 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe ACCESS.XLS und wechseln Sie auf die Tabelle ÜBUNG. Schreiben Sie ein Makro, das alle Datensätze aus der Access-Tabelle VERANSTALTUNG in die Excel-Tabelle überträgt, die einen Veranstaltungsbeginn nach dem 04.10.2002 haben. Öffnen Sie die Demo-Arbeitsmappe Word.xlsx und wechseln Sie 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 Verknüpfungseigenschaft miteinander verbunden bleiben. Die Lösung dieser Aufgaben können Sie im Anhang nachlesen.
490
24128.book Seite 491 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten an der Oberfläche – Ribbons programmieren
12
24128.book Seite 492 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten an der Oberfläche – Ribbons programmieren
Am gestrigen Tag haben Sie gelernt, wie Sie innerhalb von Microsoft Office arbeiten können. 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: 쐽
Installation und erste Schritte mit dem »Custom UI Editor«
쐽
Ribbons mit XML programmieren und in VBA einbinden Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in den Arbeitsmappen Demo.xlsm, Ribbons.xlsm, Ribbons2.xlsm, Ribbons3. xlsm, Ribbons4.xlsm und Kontextmenü.xls im Verzeichnis Kap12.
12.1 Der »Custom UI Editor« Ab dieser Excel-Version gibt es leider standardmäßig keine Menü- und Symbolleisten mehr. Diese Elemente wurden durch die so genannten Ribbons ersetzt und können Stand heute nicht mehr direkt mit VBA programmiert werden. Alte VBALösungen, bei denen dynamisch Menüs und Symbolleisten erzeugt wurden, werden in der neuen Version separat in einem Ribbon mit dem Namen Add-Ins abgelegt. Sie können dies schön im Anhang II dieses Buches sehen. Dort wird mein »Machero-Add-In« komplett in diesem Ribbon abgelegt, ohne dass eine einzige Änderung am Quellcode notwendig wird. Die neuen Ribbons werden auf Basis von xml-Dateien programmiert. Dazu gibt es ein Tool, das Sie aus dem Internet herunterladen können. Auf der Homepage http://openxmldeveloper.org/ gibt es das Tool »CUSTOM UI EDITOR«, mit dem Sie Excel-Dateien öffnen, mit XML-Code bestücken und wieder speichern können. So können Sie relativ gut eigene Ribbons mit Funktionen Ihrer Wahl zusammenstellen. Anhand der mit installierten Beispiele können Sie sich zunächst einen Überblick über die Programmierung von Ribbons verschaffen. XML ähnelt ein wenig der HTML-Sprache, bei der Anweisungen mit einer Start-Kennzeichnung begonnen und ebenso wieder über eine spezielle Kennzeichnung abgeschlossen werden müssen. Sehen Sie sich beispielsweise dazu das Schlüsselwort TAB an. Beginn mit Ende mit
492
24128.book Seite 493 Mittwoch, 7. Februar 2007 12:06 12
Der »Custom UI Editor«
Abbildung 12.1: Die Beispieldatei für einen neuen Ribbon mit dem Namen Contoso
In einer XML-Datei wird genau beschrieben, welche Elemente im neuen Ribbon CONTOSO eingesetzt werden sollen. Das Ribbon-Element enthält eines oder auch mehrere TABS-Elemente. Diese Elemente entsprechen den Registerseiten eines Ribbons. Innerhalb einer Registerseite kann es wiederum eine oder mehrere TABElemente geben. Darunter wird über den Begriff GROUPS ein Bereich angegeben, der die eigentlichen Steuerelemente des Ribbons aufnehmen soll. Bei den Steuerelementen haben Sie Zugriff auf Schaltflächen, Listenfelder, Textfelder, Dropdowns, Kontrollkästchen und vieles mehr. Jedes Steuerelement hat eine ganze Reihe von Eigenschaften, über die Sie das Aussehen und die Funktion des Steuerelements näher bestimmen können. Im gezeigten Beispiel wird auf fertige Bausteine wie beispielsweise die Zwischenablage (GROUPCLIPBOARD) und die Gruppe Schriftart (GROUPFONT) zurückgegriffen sowie auch eine eigene Gruppe mit dem Namen CONTOSO TOOLS erstellt. Innerhalb dieser Gruppe werden drei Schaltflächen eingefügt, die beschriftet und mit einem Symbol bestückt werden. Des Weiteren wird der Makroname beim Schlüsselwort onaction angegeben. Das dort angegeben Makro muss in der Excelmappe vorhanden sein. In dieser XML-Datei wird neben der Optik im Prinzip noch der Aufruf der Makros geregelt. Fügen Sie nun dieses XML-Schema ein, indem Sie wie folgt vorgehen: 1. Starten Sie das Tool »CUSTOM UI EDITOR«. 2. Wählen Sie aus dem Menü FILE den Befehl OPEN. 3. Wählen Sie im Listenfeld OPEN MICROSOFT OFFICE 2007 DOCUMENT eine Excelmappe aus.
493
24128.book Seite 494 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten an der Oberfläche – Ribbons programmieren
4. Klicken Sie die Schaltfläche ÖFFNEN. 5. Wählen Sie danach aus dem Menü SAMPLE das Beispiel EXCEL – A CUSTOM TAB. Das XML-Schema wird jetzt angezeigt. 6. Speichern Sie die Datei und beenden Sie das Tool. 7. Starten Sie Microsoft Excel 2007 und öffnen Sie die gerade mit dem XMLSchema versehene Arbeitsmappe.
Abbildung 12.2: Der neue Ribbon mit dem Namen Contoso steht bereit
Wie Sie sehen wurde der Ribbon CONTOSO dynamisch angelegt. Dieser Ribbon verschwindet automatisch wieder, wenn Sie die Arbeitsmappe schließen. Ebenso wird er immer dann verschwinden, wenn Sie eine andere Mappe öffnen bzw. in eine bereits geöffnete Mappe wechseln. Was Sie jetzt noch machen müssen, ist die Makros, die in der XML-Datei angegeben wurden, in der Arbeitsmappe anzulegen.
12.2 Weitere wichtige Quellen und Hilfen Damit Sie genau wissen, wie die Elemente für die Ribbons heißen, können Sie sich eine Dokumentation (2007OFFICECONTROLIDSEXCEL2007.EXE) mit den Namen der Elemente, die Sie in die Ribbons einfügen möchten, aus dem Internet herunterladen.
494
24128.book Seite 495 Mittwoch, 7. Februar 2007 12:06 12
Weitere wichtige Quellen und Hilfen
http://www.microsoft.com/downloads/details.aspx?familyid=4329d9e9-4d11-46a5898d-23e4f331e9ae&displaylang=en. In der Datei EXCELRIBBONCONTROLS.XLSX finden Sie eine Auflistung aller Elemente.
Abbildung 12.3: Die Auflistung der verfügbaren Ribboncontrols
Insgesamt existieren 1731 verschiedene Steuerelemente, die Sie verwenden können. Eine weitere Informationsquelle bietet die Datei OFFICE2007ICONSGALLERY. EXE, die Sie bei Microsoft herunterladen können. Sie enthält die eindeutigen Bezeichnungen für Bildsymbole. Anders als in den Vorversionen wurden als Bezeichnungen keine eindeutigen Nummern, sondern sprechende Namen wie FILTER AUTODIAL, HAPPYFACE usw. verwendet. Die URL zu diesem Download lautet: http://www.microsoft.com/downloads/details.aspx?familyid=12B99325-93E8-4ED48385-74D0F7661318&displaylang=en
495
24128.book Seite 496 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten an der Oberfläche – Ribbons programmieren
Nach dem Download entpacken Sie die Datei und installieren die dahinter steckende Excel-Arbeitsmappe. Öffnen Sie die Datei OFFICE2007ICONSGALLERY. XLSM und gehen Sie danach wie folgt vor: Klicken Sie die Schaltfläche OFFICE. 1. Klicken Sie danach auf die Schaltfläche EXCEL-OPTIONEN. 2. Aktivieren Sie die Rubrik HÄUFIG VERWENDET. 3. Aktivieren Sie das Kontrollkästchen ENTWICKLERREGISTERKARTE IN DER MULTIFUNKTIONSLEISTE ANZEIGEN. 4. Bestätigen Sie mit OK. 5. Wechseln Sie auf den Ribbon ENTWICKLERTOOLS und klappen Sie exemplarisch das Dropdown GALLERY 1 herunter.
Abbildung 12.4: Die Auflistung der verfügbaren Bildelemente
Wenn Sie mit der Maus über die einzelnen Symbole streichen, wird der dazugehörige Name des Symbols in der QuickInfo angezeigt.
12.3 Eigene Ribbons programmieren Auf den folgenden Seiten werden Sie ein paar Beispiele kennen lernen, die Ihnen den Zugang in diese neue Thematik näher bringen sollen.
496
24128.book Seite 497 Mittwoch, 7. Februar 2007 12:06 12
Eigene Ribbons programmieren
Ribbon mit Schaltflächen erstellen Bei der folgenden Aufgabe liegen zwei Makros in einer Arbeitsmappe vor, die dem Anwender über einen neuen Ribbon mit den Namen EIGENE FUNKTIONEN übersichtlich zur Verfügung gestellt werden sollen. Bestücken Sie dazu zuerst einmal eine neue Arbeitsmappe mit den folgenden zwei Makros. Listing 12.1: Tabellen schützen und entsperren Sub AlleTabellenSchützen(control As IRibbonControl) Dim Blatt As Worksheet For Each Blatt In ThisWorkbook.Worksheets Blatt.Protect Next Blatt End Sub
Sub AlleTabellenEntsperren(control As IRibbonControl) Dim Blatt As Worksheet For Each Blatt In ThisWorkbook.Worksheets Blatt.Unprotect Next Blatt End Sub
Wenn Sie diese Makros erfasst haben und die Mappe beispielsweise unter dem Namen RIBBONS.XLSM gespeichert haben, dann starten Sie das Tool »CUSTOM UI EDITOR« und öffnen die Mappe RIBBONS.XLSM. Fügen Sie danach das folgende XML-Schema ein. Der neue Ribbon mit dem Namen NEUE FUNKTIONEN soll genau hinter dem letzten Ribbon ANSICHT (= View) eingefügt werden. Dazu wird der Befehl insertAfterMso eingesetzt. Danach erfolgt die Definition der beiden Schaltflächen CUSTOMBUTTON1 und CUSTOMBUTTON2. Die Beschriftung derselben wird über das Schlüsselwort label durchgeführt. Über den Befehl Size können Sie die Größe der Schaltfläche bestimmen. Über die Anweisung onaction geben Sie das Makro an, das Sie über den Klick auf die jeweilige Schaltfläche ausführen möchten. Unter dem Bezeichner imageMso können Sie noch eine gewünschte Grafik hinterlegen. So wird beispielsweise über das eindeutige Symbol SheetProtect ein typisches Symbol, welches zu dem hinterlegten Makro passt, hinterlegt. Wird dieser Bezeichner nicht angegeben, dann wird kein Symbol auf der Schaltfläche angezeigt.
497
24128.book Seite 498 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten an der Oberfläche – Ribbons programmieren
Abbildung 12.5: Das XML-Schema für den neuen Ribbon Eigene Funktionen
Ob Sie das XML-Schema syntaktisch richtig erfasst haben, können Sie prüfen, indem Sie die Schaltfläche VALIDATE klicken. Ist soweit alles korrekt, dann speichern Sie die Datei über das Menü FILE über den Befehl SAVE. Starten Sie danach Excel und öffnen Sie die gerade mit XML-Daten angereicherte Arbeitsmappe RIBBONS.XLSM. Aktivieren Sie danach den Ribbon EIGENE FUNKTIONEN.
Abbildung 12.6: Das XML-Schema für den neuen Ribbon Eigene Funktionen
Ribbon mit ComboBox erstellen Bei der folgenden Aufgabe soll ein neuer Ribbon mit dem Namen Planmonat erstellt werden. Dieser Ribbon soll eine Combobox enthalten, die mit den Monatsnamen gefüllt wird. Bei der Auswahl eines bestimmten Monats aus der Combobox
498
24128.book Seite 499 Mittwoch, 7. Februar 2007 12:06 12
Eigene Ribbons programmieren
soll eine neue Tabelle mit dem Namen des Monats erstellt werden, sofern diese Monatstabelle in der Arbeitsmappe noch nicht vorliegt. Existiert die Monatstabelle in der Mappe bereits, dann soll diese lediglich aktiviert werden. Legen Sie zunächst eine neue Mappe mit dem Namen RIBBONS2.XLSM an. Starten Sie danach das Tool »CUSTOM UI EDITOR«und öffnen Sie diese Mappe darin. Erfassen Sie folgendes XML-Schema.
Abbildung 12.7: Das XMLSchema für den neuen Ribbon Planmonat
Da auf die Auswahl eines Monats aus der ComboBox reagiert werden muss, klicken Sie das Symbol Generate Callbacks. Dadurch wird automatisch ein Makro erstellt, welches Sie danach in Ihrer Mappe einfügen und ausbauen können.
Abbildung 12.8: Über dieses Makro können Sie auf die Auswahl aus der ComboBox reagieren
499
24128.book Seite 500 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten an der Oberfläche – Ribbons programmieren
Kopieren Sie dieses noch leere Makro in die Zwischenablage und beenden Sie danach das Tool. Öffnen Sie die Arbeitsmappe RIBBONS2.XLSM in Excel, gehen Sie in die Entwicklungsumgebung, fügen Sie das gerade kopierte Makro in einem Modul ein und ergänzen Sie es wie folgt. Listing 12.2: Auf die Auswahl in der ComboBox reagieren Function TabExists(strTabName As String) As Boolean Dim Blatt As Worksheet TabExists = False For Each Blatt In ThisWorkbook.Worksheets If Blatt.Name = strTabName Then TabExists = True Exit Function End If Next Blatt End Function
Sub PlanMonat(control As IRibbonControl, text As String) If TabExists(text) = True Then Worksheets(text).Activate Else Worksheets.Add ActiveSheet.Name = text End If End Sub
Das Makro PlanMonat liefert im Argument Text den ausgewählten Eintrag aus der ComboBox. Diesen Eintrag übergeben Sie an die Funktion TabExists. In dieser Funktion wird geprüft, ob sich eine Tabelle mit dem Namen Text in der Mappe finden lässt. Wenn ja, dann wird die Tabelle lediglich über die Methode Activate aktiviert. Im anderen Fall wird die Methode Add eingesetzt, um eine neue Tabelle einzufügen. Der Name für diese neue Tabelle wird direkt aus der ComboBox gelesen.
500
24128.book Seite 501 Mittwoch, 7. Februar 2007 12:06 12
Eigene Ribbons programmieren
Abbildung 12.9: Neuanlage oder Aktivierung von Tabellen
Ribbon mit bereits verfügbaren Funktionen bestücken Im folgenden Beispiel wird in der Arbeitsmappe RIBBONS3.XLSM ein neuer Ribbon mit dem Namen VIP genau vor dem ersten Ribbon START erstellt. Darin sollen häufig verwendete Funktionen gesammelt werden. Diese Befehle sind thematisch in bestimmten Gruppen eingeteilt und können in der Arbeitsmappe EXCELRIBBONCONTROLS.XLSX eingesehen werden.
Abbildung 12.10: Die verfügbaren Funktionsgruppen
501
24128.book Seite 502 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten an der Oberfläche – Ribbons programmieren
Setzen Sie den Filter ein und filtern Sie die Gesamtliste in Spalte B nach der Rubrik GROUP. Stellen Sie sich nun die gewünschten Funktionsgruppen zusammen und geben Sie diese in einem neuen XLM-Schema im Tool CUSTOM UI EDITOR an.
Abbildung 12.11: Das Schema für oft verwendete Excel-Funktionen
Binden Sie das XML-Schema wie schon beschrieben in die Mappe RIBBONS3. XLSM ein und öffnen Sie danach diese Mappe in Excel.
Abbildung 12.12: Der neue Ribbon VIP
Bei so einer Zusammenstellung wird kein einziges VBA-Makro benötigt, da über die eindeutige Benennung der Gruppen Excel genau weiß, wie es die darin enthaltenen Funktionen ansprechen muss.
502
24128.book Seite 503 Mittwoch, 7. Februar 2007 12:06 12
Kontextmenüs programmieren
12.4 Kontextmenüs programmieren Ein Kontextmenü wird dann automatisch heruntergeklappt, wenn Sie mit der rechten Maustaste auf ein beliebiges Excel-Objekt klicken. Ein Kontextmenü enthält dann die wichtigsten Befehle zu dem angeklickten Objekt. Die Kontextmenüs sind in der neuen Version von Excel als einzigstes Leistenelement übrig geblieben. Alle anderen wurden durch die Ribbons mehr oder weniger ersatzlos ausgetauscht. Das am meisten eingesetzte Kontextmenü ist das Zellen-Kontextmenü, welches über das Objekt CommandBars("Cell") angesprochen werden kann. Aus diesem Grund werden wir uns auf dieses wichtige Kontextmenü beschränken.
Zellen-Kontextmenü erweitern Wenn Sie sich das Zellen-Kontextmenü einmal ansehen, dann sehen Sie, dass die wichtigsten Befehle für die Zelle schon darin enthalten sind. Trotzdem können Sie weitere Befehle in das Kontextmenü einfügen. Im nächsten Beispiel werden Sie dem Zellen-Kontextmenü eine neue Funktion hinzufügen. Bei dieser Funktion wird, wie schon bei der Menüleiste sowie der Symbolleiste besprochen, die Funktion FormelnInFestwerteWandeln eingefügt. Listing 12.3: Das Zellenkontextmenü erweitern Sub ZellenkontextmenüErgänzen() Dim MB As CommandBarControl Set MB = Application.CommandBars("Cell").Controls.Add With MB .Caption = "Formeln --> Festwerte" .OnAction = "FormelnInFestwerteWandeln" .FaceId = 350 End With End Sub
Wenden Sie die Methode Add an, um dem Kontextmenü einen weiteren Menübefehl hinzuzufügen. Über die Eigenschaft Caption können Sie den Menübefehl beschriften. Die Eigenschaft OnAction sagt aus, welches Makro bei der Auswahl des Kontext-Menübefehls gestartet werden soll. Mithilfe der Eigenschaft FaceId
503
24128.book Seite 504 Mittwoch, 7. Februar 2007 12:06 12
Arbeiten an der Oberfläche – Ribbons programmieren
können Sie dem Menübefehl ein zusätzliches Symbol hinzufügen. Über die Eigenschaft BeginGroup können Sie einzelne Menübefehle gruppieren. Indem Sie diese Eigenschaft auf den Wert True setzen, sorgen Sie dafür, dass ein horizontaler Trennstreifen im Kontextmenü eingefügt wird.
Abbildung 12.13: Das Kontextmenü erweitern
Kontextmenübefehle entfernen Mithilfe der Methode Delete können Sie einzelne Menübefehle aus dem Kontextmenü wieder löschen. Entfernen Sie nun den Kontextmenübefehl Formeln —> Festwerte, den Sie vorher dem Kontextmenü hinzugefügt haben. Starten Sie zu diesem Zweck das folgende Makro: Listing 12.4: Einen Kontextmenübefehl löschen Sub ZellenkontextmenüBefehleLöschen() Dim Menü As CommandBar Set Menü = Application.CommandBars("Cell") On Error Resume Next With Menü .Controls("Formeln --> Festwerte").Delete End With End Sub
504
24128.book Seite 505 Mittwoch, 7. Februar 2007 12:06 12
Fragen & Antworten
Geben Sie mithilfe der Anweisung Set bekannt, auf welche Leiste Sie zugreifen möchten. Danach sorgen Sie über die Anweisung On Error Resume Next dafür, dass es zu keiner Fehlermeldung kommt, wenn versehentlich versucht wird, den Kontextmenübefehl zweimal hintereinander zu löschen. Wenden Sie die Methode Delete an, um den Kontextmenübefehl zu löschen. Greifen Sie dabei auf die Eigenschaft Controls zurück und geben Sie die Beschriftung des Befehls an.
12.5 Fragen & Antworten F
Wie kann man das QuickInfo-Fester für eine Schaltfläche in einem Ribbon programmieren? A
Dafür verantwortlich ist die Anweisung screentip 500 werden gelb eingefärbt Erfassen Sie das folgende Makro: Sub ZellenInBereichFärben() 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 gewünschte Tabelle und legen Sie den Bereich fest, indem Sie bestimmte Zellen färben möchten. In einer anschließenden Schleife durchlaufen Sie alle Zellen, die innerhalb des definierten Bereichs liegen. Innerhalb der Schleife prüfen Sie, ob der Zellwert (= Value) größer als 500 ist. Wenn ja, dann färben Sie den Hintergrund der Zelle (= Interior) mithilfe der Eigenschaft ColorIndex, der Sie den Wert 6 zuweisen. Aufgabe Listen Sie die Zellenadressen aller verwendeten Namen einer Arbeitsmappe in einem Meldungsfenster auf. Lösung Erfassen Sie folgendes Makro: 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
561
24128.book Seite 562 Mittwoch, 7. Februar 2007 12:06 12
Lösungen der Tages-Übungen
In der Auflistung Names sind alle verwendeten Namen der aktiven Arbeitsmappe verzeichnet. Über die Objektvariable BenannteBereiche können Sie diese jetzt auslesen und am Ende des Makros in einer Bildschirmmeldung ausgeben. Aufgabe Dokumentieren Sie alle verwendeten Namen einer Arbeitsmappe, indem Sie eine neue Tabelle einfügen und den Namen und dessen Zellenadresse ausgeben. Lösung Erfassen Sie folgendes Makro: Listing A.9: Alle verwendeten Namen in Tabelle dokumentieren Sub AlleNamenProtokollieren() Dim BenannteBereiche As Object Sheets.Add Range("A1").Select For Each BenannteBereiche In ActiveWorkbook.Names ActiveCell.Value = BenannteBereiche.Name ActiveCell.Offset(0, 1).Value = _ ActiveWorkbook.Names.Item(BenannteBereiche.Name) ActiveCell.Offset(1, 0).Select Next End Sub
In dieser Lösung werden die eingesetzten Namen einer Arbeitsmappe dokumentiert. Dabei wird jeweils der Name sowie dessen Zellenadresse ausgegeben. Aufgabe Löschen Sie alle Gültigkeitsfestlegungen aus einer Tabelle! Lösung Erfassen Sie folgendes Makro: Listing A.10: Alle Gültigkeiten aus einer Tabelle entfernen Sub GültigkeitLöschen() ActiveCell.SpecialCells(xlCellTypeSameValidation).Select Selection.Validation.Delete End Sub
562
24128.book Seite 563 Mittwoch, 7. Februar 2007 12:06 12
Tag 7
Über die Methode SpecialCells, der Sie die Konstante xlCellTypeSameValidation zuweisen, können Sie alle Zellen, die eine Gültigkeitsregel beinhalten, ermitteln. Über die Methode Select markieren Sie diese Zellen. Entfernen Sie die Gültigkeitsregeln, indem Sie die Methode Delete anwenden. Aufgabe Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte! Lösung Starten Sie das folgende Makro: Listing A.11: Formeln in Festwerte wandeln Sub FormelnInFestwerteWandeln() Dim Zelle As Range Sheets("Tabelle3").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, können Sie alle Zellen, die eine Formel beinhalten, ermitteln. Über die Methode Select markieren Sie diese Zellen. Durchlaufen Sie anschließend alle Zellen innerhalb der Markierung und überschreiben Sie die Formeln mit Festwerten.
Tag 7 Aufgabe Stellen Sie sicher, dass beim Aktivieren einer bestimmten Tabelle die Neuberechnung ausgelöst wird! Lösung Für diese Aufgabe setzen Sie das Ereignis Activate ein, das Sie im folgenden Listing sehen.
563
24128.book Seite 564 Mittwoch, 7. Februar 2007 12:06 12
Lösungen der Tages-Übungen
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 Wie muss das Ereignis lauten, wenn Sie vor dem Speichern einer Arbeitsmappe in der ersten Tabelle der Arbeitsmappe das aktuelle Tagesdatum erfassen möchten? Lösung Das Ereignis heißt 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. Aufgabe Ihre Aufgabe besteht nun darin, auf einer bestimmten Tabelle die beiden Maustasten zu programmieren. Für den Bereich A1:E15 sollen dabei folgende Funktionen hinterlegt werden. 쐽
Klicken mit der rechten Maus: Addieren der Zelle um den Wert 10
쐽
Doppelklick mit der linken Maus: Subtrahieren der Zelle mit 10
Lösung Erfassen Sie die beiden Makros aus Listing 14:
564
24128.book Seite 565 Mittwoch, 7. Februar 2007 12:06 12
Tag 8
Listing A.14: Addieren und Subtrahieren per Mausklick Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich As Range Set Bereich = Range("A1:E15") If Intersect(Bereich, Target) Is Nothing Then Exit Sub Target.Value = Target.Value – 10 Cancel = True End Sub
Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Dim Bereich As Range Set Bereich = Range("A1:E15") If Intersect(Bereich, Target) Is Nothing Then Exit Sub Target.Value = Target.Value + 10 Cancel = True End Sub
Bevor Sie die Rechenoperationen durchführen, müssen Sie prüfen, 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 zurückgegeben. In diesem Fall liegt die angeklickte Zelle im definierten Bereich. Andernfalls liefert diese Methode den Wert Nothing zurück.
Tag 8 Aufgabe Formatieren Sie die Pivot-Tabelle auf TABELLE1 mit einem AutoFormat. Lösung Starten Sie zu diesem Zweck das folgende Makro aus Listing Anhang 15:
565
24128.book Seite 566 Mittwoch, 7. Februar 2007 12:06 12
Lösungen der Tages-Übungen
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 eingefügte Pivot-Tabelle angesprochen werden soll. Über die Methode AutoFormat können Sie mittels einer Formatkonstanten ein gewünschtes Format zuweisen. Wie die einzelnen Konstanten heißen, können Sie übrigens feststellen, indem Sie die Online-Hilfe zu dieser Methode aufrufen. Aufgabe Erstellen Sie ein Zylinderdiagramm auf Basis der Tabelle Übungen. Fügen Sie das Diagramm als separates Diagrammblatt ein. Lösung Erfassen Sie das Makro aus Listing 16: Listing A.16: Ein Zylinderdiagramm einfügen Sub ÜbungZylinder() Dim Bereich As Range Dim s As String Sheets("Übung").Activate Set Bereich = Range("B3:E7") s = ActiveSheet.Name Charts.Add With ActiveChart .ApplyCustomType _ ChartType:=xlCylinderColClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlRows
566
24128.book Seite 567 Mittwoch, 7. Februar 2007 12:06 12
Tag 9
End With End Sub
Legen Sie im ersten Schritt den Bereich fest, auf dem basierend Sie Ihr Diagramm erstellen möchten. Danach wenden Sie die Methode Add an, um ein neues Diagramm einzufügen. Geben Sie im nächsten Schritt an, welchen Diagrammtyp Sie einsetzen möchten. Dazu weisen Sie der Eigenschaft ChartType die gewünschte 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 überprüft, ob die zu aktivierende Tabelle in der Arbeitmappe überhaupt vorhanden ist. Lösung Erfassen Sie die Funktion sowie das aufrufende Makro aus Listing Anhang 17: Listing A.17: Vor dem Zugriff auf eine Tabelle deren Existenz prüfen Function TabelleExist(ByVal s As String) As Boolean Dim b As Boolean On Error GoTo fehler Sheets(s).Activate TabelleExist = True Exit Function fehler: TabelleExist = False End Function
Sub TabelleAktivieren() Dim b As Boolean b = TabelleExist("Tabelle1")
567
24128.book Seite 568 Mittwoch, 7. Februar 2007 12:06 12
Lösungen der Tages-Übungen
If b = False Then MsgBox "Die Tabelle ist in der Arbeitsmappe nicht verfügbar!" End Sub
Innerhalb der Funktion TabelleExist versuchen Sie einfach einmal die angegebene Tabelle zu aktivieren. Wenn dies nicht gelingt, dann können 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 zurückgegeben wird, können Sie entscheiden, wie Sie weiter vorgehen möchten.
Tag 10 Aufgabe Schreiben Sie ein Makro, das alle Zellenadressen der dort befindlichen Hyperlinks auf einer separaten Tabelle dokumentiert. Lösung Erfassen Sie das Makro aus Listing Anhang 18: Listing A.18: Alle Hyperlinks einer Tabelle werden dokumentiert Sub Dim Dim Dim
HyperlinksDokumentieren() Hyper As Hyperlink i As Integer Blatt As String
Worksheets.Add ActiveSheet.Name = "DokuHyper" Blatt = ActiveSheet.Name Sheets("PrüfungHyper").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
568
24128.book Seite 569 Mittwoch, 7. Februar 2007 12:06 12
Tag 11
Fügen Sie im ersten Schritt eine neue Tabelle ein und benennen Sie diese. Wechseln Sie dann auf die Tabelle, die die Hyperlinks enthält. In der Auflistung Hyperlinks sind alle Hyperlinks der aktiven Tabelle enthalten. Auf diese Hyperlinks können Sie nun zugreifen und die Adresse sowie deren Hyperlinktext in die Tabelle DOKUHYPER schreiben.
Tag 11 Aufgabe Schreiben Sie ein Makro, das alle Datensätze aus der Access-Tabelle VERANSTALTUNG in die Excel-Tabelle überträgt, die einen Veranstaltungsbeginn nach dem 24.09.2006 haben. Lösung Erfassen Sie das Makro aus Listing Anhang 19: Listing A.19: Bestimmte Datensätze aus Access nach Excel übertragen Sub Dim Dim Dim
DatensätzeSuchenUndÜbertragenÜbung() ADOC As ADODB.Connection DBS As ADODB.Recordset s As String
s = "VDatum > '24.09.2006'" Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic .Find Criteria:=s, SearchDirection:=adSearchForward Sheets("Übung").Activate Range("A2").Select
569
24128.book Seite 570 Mittwoch, 7. Februar 2007 12:06 12
Lösungen der Tages-Übungen
If Not .EOF Then Do While Not .EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Value = _ Format(ActiveCell.Value, "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Vdatum ActiveCell.Offset(0, 1) = Format _ (ActiveCell.Offset(0, 1).Value, "dd.mm.yyyy") ActiveCell.Offset(0, 2).Value = DBS!Veranstaltung ActiveCell.Offset(0, 3).Value = DBS!V_Ort ActiveCell.Offset(0, 4).Value = DBS!Teilnehmer ActiveCell.Offset(0, 5).Value = DBS!Straße ActiveCell.Offset(0, 6).Value = DBS!PLZ ActiveCell.Offset(0, 7).Value = DBS!Ort ActiveCell.Offset(0, 8).Value = DBS!Kosten .Find Criteria:=s, SkipRecords:=1 ActiveCell.Offset(1, 0).Select Loop Else MsgBox "Datensatz nicht gefunden" End If .Close End With Columns("A:J").AutoFit ADOC.Close Set DBS = Nothing Set ADOC = Nothing End Sub
Aufgabe Schreiben Sie ein Makro, welches den Zellenbereich A1:C5 in ein neues Dokument kopiert. Dabei sollen die beiden Dateien über die Verknüpfungseigenschaft miteinander verbunden bleiben. Lösung Erfassen Sie das aufrufende Makro aus Listing Anhang 20:
570
24128.book Seite 571 Mittwoch, 7. Februar 2007 12:06 12
Tag 12
Listing A.20: Einen Zellenbereich verknüpft in ein Word-Dokument einfügen Sub Dim Dim Dim
ExcelDatenNachWordKopierenVernüpft() 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 alle Formelzellen in Festzellen wandelt. Lösung Erfassen Sie das Makro aus Listing Anhang 21: Listing A.21: Formelzellen in Festwerte wandeln Sub FormelnWandeln(control As IRibbonControl) Dim Zelle As Range For Each Zelle In ActiveSheet.UsedRange If Zelle.HasFormula Then Zelle.Value = Zelle.Value Next Zelle End Sub
571
24128.book Seite 572 Mittwoch, 7. Februar 2007 12:06 12
Lösungen der Tages-Übungen
Über eine For Each Next-Schleife durchlaufen Sie alle verwendeten Zellen der aktiven Tabelle. Über die Funktion HasFormula können Sie prüfen, ob die jeweilige Zelle eine Formel enthält. Wenn ja, dann überschreiben Sie diese, indem Sie der Zelle einen neuen Zellewert zuweisen. Das XML-Schema sieht dabei wie folgt aus.
Abbildung 1.1: Das ExcelSchema für das Makro FormelnWandeln
Tag 13 Aufgabe Schreiben Sie ein Makro, welches die Ergebnisse der Vokabelabfragen in der separaten Tabelle ÜBUNG dokumentiert. Lösung Listing A.22: Die Ergebnisse der Vokabelabfrage sichern Private Sub CommandButton2_Click() 'Prüfen 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
572
24128.book Seite 573 Mittwoch, 7. Februar 2007 12:06 12
Tag 13
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
573
24128.book Seite 574 Mittwoch, 7. Februar 2007 12:06 12
Lösungen der Tages-Übungen
Tag 14 Aufgabe Schreiben Sie ein Makro, das alle Makros aus allen Modulen einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung auflistet. Lösung Erfassen Sie die beiden Makros aus Listing Anhang 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.
574
24128.book Seite 575 Mittwoch, 7. Februar 2007 12:06 12
Wichtige Funktionen in einem eigenen Add-In ablegen B
24128.book Seite 576 Mittwoch, 7. Februar 2007 12:06 12
Wichtige Funktionen in einem eigenen Add-In ablegen
Wenn Sie die 14 Tage mit der Programmierung hinter sich haben, dann können Sie sich an dem in diesem Anhang vorgestellten Add-In orientieren, welche Funktionen Sie in welcher Weise in einem Add-In organisieren können. So können Sie später 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 VBAKompendium beschrieben. In diesem Buch reichte leider der Platz hierfür nicht aus, daher haben wir uns entschlossen, Ihnen wenigstens als Service die Listings sowie die Software auf CD-ROM mitzuliefern. Folgende Funktionen werden Ihnen in meinem Add-In angeboten: 1. Umwandlung von Formeln und Funktionen in Festwerte in der aktiven Tabelle 2. Umwandlung von Formeln und Funktionen in Festwerte als Kopie in einer neuen Datei 3. Säubern aller Zellen im markierten Bereich von nicht druckbaren Zeichen 4. Setzen von Zellenumbrüchen innerhalb einer Markierung 5. Umwandlung von relativen Bezügen in absolute Bezüge 6. Aktives Tabellenblatt als E-Mail-Anhang versenden 7. Aktive Tabelle in neuer Arbeitsmappe speichern 8. Wochentag, Datum und Uhrzeit anzeigen 9. Informationen zur aktuellen Arbeitsmappe anzeigen (Name der Arbeitsmappe, Autor, letzter Zugriff, letzte Änderung, Speicherort der Arbeitsmappe) 10. Öffnen aller verknüpften Arbeitsmappen 11. Verknüpfungen zu anderen Arbeitsmappen entfernen 12. Suchen von Text mit der Ersetzen-Funktion 13. Suchen von Text mit der Markierungsfunktion 14. Markierung aller Zellen in der Tabelle, die Formeln, Kommentare, Konstanten etc. enthalten. 15. Löschen von bestimmten Zellen.
576
24128.book Seite 577 Mittwoch, 7. Februar 2007 12:06 12
Der Quellcode
Das Add-In legt beim Aktivieren des Tools ein eigenes Menü im Ribbon ADD-INS an, das wie folgt aussieht.
Abbildung 2.1: Das Add-In des Autors
B.1 Der Quellcode Die folgenden Makros werden an dieser Stelle nicht ausführlich erklärt. Ausführliche Erklärungen zu diesen und weiteren 1000 Makros können Sie in meinem aktuellen VBA-Kompendium nachlesen, welches im zweiten Quartal 2007 auf den Markt kommen wird. Sehen Sie sich nun den Quellcode der Makros an, die im Add-In MACADDIN enthalten sind.
Formeln in Festwerte umwandeln Listing B.1: Alle Formelzellen der aktiven Tabelle werden in Festwerte umgesetzt. Sub FormelnInWerteUmwandeln() Cells.Copy Range("A1").Select Selection.PasteSpecial Paste:=xlValues, _ Operation:=xlNone, SkipBlanks:= _
577
24128.book Seite 578 Mittwoch, 7. Februar 2007 12:06 12
Wichtige Funktionen in einem eigenen Add-In ablegen
False, Transpose:=False Application.CutCopyMode = False End Sub
Soll das Ergebnis in einer neuen Tabelle abgelegt werden, dann kommt das Makro aus Listing 6 zum Einsatz. Listing B.2: Alle Formelzellen werden in Festwerte umgewandelt. Das Ergebnis daraus wird in eine neue Arbeitsmappe kopiert. Sub FormelnInWerteUmwandelnNeueDatei() ActiveSheet.Copy Cells.copy Range("A1").Select Selection.PasteSpecial Paste:=xlValues, _ Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False Range("A1").Select End Sub
Aktive Tabelle als E-Mail verschicken Listing B.3: Aktive Tabelle als E-Mail mit Anhang versenden Sub EmailAktivesTabellenblatt() Dim s As String Dim s2 As String ActiveWorkbook.Worksheets(ActiveSheet.Name).Copy s = InputBox _ ("Bitte geben Sie den Adressaten ein!", "Adressat") If s = "" Then MsgBox "Sie haben abgebrochen!" _ : Exit Sub s2 = InputBox _ ("Bitte geben Sie den Titel der E-Mail ein!", "Titel") If s2 = "" Then MsgBox "Sie haben abgebrochen!" : Exit Sub Application.Dialogs(xlDialogSendMail).Show s, s2 ActiveWorkbook.Close savechanges:=False End Sub
578
24128.book Seite 579 Mittwoch, 7. Februar 2007 12:06 12
Der Quellcode
Aktive Tabelle in neuer Arbeitsmappe speichern Listing B.4: Die aktive Tabelle wird in einer neuen Arbeitsmappe gespeichert. Sub AktivesTabellenblattAlsDatei() ActiveSheet.Copy End Sub
Informationen zu Datum und Zeit Listing B.5: Datum, Wochentag und Uhrzeit auf dem Bildschirm ausgeben Sub DatumUndUhrzeit() Dim i As Integer Dim wota As String i = Application.Weekday(Date) Select Case i Case 1 wota = "Sonntag" Case 2 wota = "Montag" Case 3 wota = "Dienstag" Case 4 wota = "Mittwoch" Case 5 wota = "Donnerstag" Case 6 wota = "Freitag" Case 7 wota = "Samstag" End Select MsgBox "Heute ist " & wota & ", der " & Date _ & ", " & Time & " Uhr!" End Sub
579
24128.book Seite 580 Mittwoch, 7. Februar 2007 12:06 12
Wichtige Funktionen in einem eigenen Add-In ablegen
Informationen zur aktiven Arbeitsmappe Listing B.6: Alle Informationen zur aktiven Arbeitsmappe sollen ausgegeben werden. Sub Dim Dim Dim Dim
InfoZurAktuellenDatei() fsO As Object sName As Object sMeldung As String s As String
s = Application.ActiveWorkbook.Path Set fsO = CreateObject("Scripting.FileSystemObject") Set sName = fsO.GetFile(ActiveWorkbook.Name) MsgBox ("Dateiname: " & ActiveWorkbook.Name & _ VbLf & "Autor: " & ActiveWorkbook.Author & _ VbLf & "angelegt am: " & sName.DateCreated & _ VbLf & "Letzter Zugriff: " & _ sName.DateLastAccessed & VbLf & _ "Letzte Änderung: " & sName.DateLastModified) & _ "Speicherort: " & s & VbLf _ , vbInformation, "Datei-Info" End Sub
Öffnen aller verknüpften Arbeitsmappen Listing B.7: Alle verknüpften Arbeitsmappen werden geöffnet. Sub ÖffnenVerknüpfteMappen() Dim V_Mappen As Variant Dim i As Integer V_Mappen = ActiveWorkbook.LinkSources(xlExcelLinks) If Not IsEmpty(Links) Then For i = 1 To UBound(V_Mappen) Workbooks.Open V_Mappen(i) Next i Else MsgBox _ "In der Mappe sind keine Verknüpfungen enthalten!" End If End Sub
580
24128.book Seite 581 Mittwoch, 7. Februar 2007 12:06 12
Der Quellcode
Verknüpfungen zu anderen Arbeitsmappen entfernen Listing B.8: Externe Verknüpfungen zu anderen Arbeitsmappen löschen Sub ExterneLinksInFestwerteUmsetzen() Dim Blatt As Worksheet Dim Zelle As Range For Each Blatt In ActiveWorkbook.Worksheets Blatt.Activate Set Zelle = Cells.Find(what:="[", After:=ActiveCell, _ LookIn:=xlFormulas, lookat:=xlPart, _ searchorder:=xlByRows, _ searchdirection:=xlNext, MatchCase:=False) While TypeName(Zelle) "Nothing" Zelle.Activate Zelle.Formula = Zelle.Value Set Zelle = Cells.FindNext(After:=ActiveCell) Wend Next Blatt End Sub
Suchen von Texten in Arbeitsmappen Listing B.9: Suchen und Ersetzen von Texten in Arbeitsmappen Sub Dim Dim Dim Dim Dim
TextInArbeitsmappeSuchenUndErsetzen() s_Such As String s_Ersetz As String Blatt As Worksheet Treffer As Range Treffer1 As Variant
s_Such = InputBox("Geben Sie den Suchbegriff ein!") s_Ersetz = InputBox _ ("Geben Sie den Ersetzbegriff ein!") For Each Blatt In Worksheets Blatt.Activate Set Treffer = Blatt.Cells.Find(s_Such) If Not Treffer Is Nothing Then Treffer1 = Treffer.Address
581
24128.book Seite 582 Mittwoch, 7. Februar 2007 12:06 12
Wichtige Funktionen in einem eigenen Add-In ablegen
Do Treffer.Activate Treffer.Value = s_Ersetz Set Treffer = Cells.FindNext(After:=ActiveCell) On Error Resume Next If Treffer.Address = Treffer1 Then Exit Do Treffer.Value = s_Ersetz Loop End If Next Blatt End Sub
Soll der gesuchte Text in der gesamten Arbeitsmappe gesucht und ersetzt werden, dann kommt das Makro aus Listing 14 zum Einsatz. Listing B.10: Suche nach bestimmten Texten in der aktiven Arbeitsmappe und Kennzeichnung der gefundenen Zellen Sub Dim Dim Dim Dim
TextInArbeitsmappeSuchenUndKennzeichnen() s As String i As Integer Erg1 As Variant Erg2 As Variant
s = InputBox _ ("Geben Sie den Suchbegriff ein!", "Textsuche") If s = "" Then Exit Sub For i = 1 To ActiveWorkbook.WorkSheets.Count Sheets(i).Activate Set Erg1 = Sheets(i).Cells.Find(s) If Not Erg1 Is Nothing Then Erg2 = Erg1.Address Do With Erg1 .Activate .Interior.ColorIndex = 4 End With Set Erg1 = Cells.FindNext(After:=ActiveCell) On Error Resume Next If Erg1.Address = Erg2 Then Exit Do Erg1.Interior.ColorIndex = 4 Loop
582
24128.book Seite 583 Mittwoch, 7. Februar 2007 12:06 12
Der Quellcode
End If Next i End Sub
Zellen bearbeiten Im ersten Makro aus dieser Gruppe werden alle nicht druckbaren Zeichen aus den Zellen, die markiert sind, entfernt. Löscht alle nicht druckbaren Zeichen aus einem Text. Verwendet wird diese Funktion für Texte, die aus anderen Anwendungen importiert wurden und eventuell Zeichen enthalten, die das von Ihnen verwendete Betriebssystem nicht drucken kann. Listing B.11: Alle Zellen in der Markierung werden gesäubert. Sub ZellenSäubern() Dim Zelle As Range For Each Zelle In Selection If Zelle.HasFormula = False Then Zelle.Value =_ Application.WorksheetFunction.Clean(Zelle.Value) End If Next Zelle End Sub
Das folgende Makro aus Listing 16 setzt automatisch einen Zeilenumbruch für alle Zellen, die momentan markiert sind. Listing B.12: Zellenumbruch in allen Zellen innerhalb einer Markierung einstellen Sub ZellenumbruchSetzen() Dim Zelle As Range For Each Zelle In Selection Zelle.WrapText = True Next Zelle End Sub
Eine sehr nützliche Funktion ist auch die folgende Funktion aus Listing 17. Dort werden alle relativen Zellenbezüge in absolute Zellenbezüge umgesetzt, die momentan markiert sind. Diese Arbeit manuell durchzuführen wäre eine Tortur.
583
24128.book Seite 584 Mittwoch, 7. Februar 2007 12:06 12
Wichtige Funktionen in einem eigenen Add-In ablegen
Listing B.13: Alle Zellenbezüge innerhalb einer Markierung werden in absolute Bezüge umgewandelt. Sub BezugÄndernInAbsolut() Dim Zelle As Range For Each Zelle In Selection If Zelle.HasFormula = True Then Zelle.Formula = _ Application.ConvertFormula(Formula:=Zelle.Formula, _ fromreferencestyle:=xlA1, _ toreferencestyle:=xlA1, _ toabsolute:=xlAbsolute) Else End If Next Zelle End Sub
Zellen markieren Im folgenden Listing werden alle Formelzellen der aktiven Tabelle markiert. Listing B.14: Alle Formelzellen der aktiven Tabelle werden markiert. Sub FormelnMarkieren() On Error GoTo fehlerm Selection.SpecialCells(xlCellTypeFormulas).Select Exit Sub fehlerm: MsgBox "Dieses Tabellenblatt enthält keine Formeln!" End Sub
Das nächste Listing markiert alle Zellen einer Tabelle, die Kommentare enthalten. Listing B.15: Alle Kommentarzellen der aktiven Tabelle werden markiert. Sub KommentarzellenMarkieren() On Error GoTo fehler Selection.SpecialCells(xlCellTypeComments).Select Exit Sub fehler:
584
24128.book Seite 585 Mittwoch, 7. Februar 2007 12:06 12
Der Quellcode
MsgBox "Es gibt keine Kommentare in der Tabelle!", _ vbInformation End Sub
Im folgenden Listing werden alle Zellen, die eine Gültigkeitsregel enthalten, markiert. Listing B.16: Alle Zellen mit Gültigkeitsregel werden markiert. Sub GültigkeitszellenMarkieren() On Error GoTo fehler Selection.SpecialCells(xlCellTypeAllValidation).Select Exit Sub fehler: MsgBox "Keine Gültigkeiten in dieser Tabelle!", _ vbInformation End Sub
Im nächsten Listing werden alle Zellen, die mit einer bedingten Formatierung formatiert wurden, markiert. Listing B.17: Listing 21: Alle Zellen mit bedingter Formatierung werden markiert. Sub BedingteFormatzellenMarkieren() On Error GoTo fehler Selection.SpecialCells _ (xlCellTypeAllFormatConditions).Select Exit Sub fehler: MsgBox "Keine bedingten formatierten Zellen!", _ vbInformation End Sub
Zellen löschen Im letzten Menüpunkt werden verschiedene Löschoperationen angeboten. Im folgenden Listing werden alle Kommentare aus der aktiven Tabelle gelöscht.
585
24128.book Seite 586 Mittwoch, 7. Februar 2007 12:06 12
Wichtige Funktionen in einem eigenen Add-In ablegen
Listing B.18: Alle Kommentare aus der aktiven Tabelle löschen Sub KommentareLöschen() Dim Notiz As Comment On Error GoTo fehler For Each Notiz In ActiveSheet.Comments Notiz.Delete Next Notiz Exit Sub fehler: MsgBox "Keine Kommentare in der Tabelle!", vbInformation End Sub
Im nächsten Listing werden alle Zellen mit Formeln mit Festwerten ersetzt, die sich innerhalb der Markierung befinden. Listing B.19: Alle Formeln einer Tabelle in Festwerte umsetzen Sub FormelnLöschen() Dim zelle As Range On Error GoTo fehler Selection.SpecialCells(xlCellTypeFormulas).Select For Each zelle In Selection zelle.Value = zelle.Value Next zelle Exit Sub fehler: MsgBox "Keine Formeln in der Tabelle!", vbInformation End Sub
Übrigens werden ebenso wie Formeln auch Funktionen und externe Verknüpfungen in Festwerte umgesetzt. Im folgenden Listing werden alle Gültigkeitsregeln einer Tabelle entfernt. Listing B.20: Alle Gültigkeitsregeln in einer Tabelle werden entfernt Sub GültigkeitLöschen() Dim zelle As Range
586
24128.book Seite 587 Mittwoch, 7. Februar 2007 12:06 12
Der Quellcode
On Error GoTo fehler Selection.SpecialCells(xlCellTypeAllValidation).Select For Each zelle In Selection zelle.Validation.Delete Next zelle Exit Sub fehler: MsgBox "Keine Zellen mit Gültigkeiten in Tabelle!", _ vbInformation End Sub
Im nächsten Listing werden alle bedingten Formate aus einer Tabelle entfernt. Listing B.21: Alle bedingten Formate in einer Tabelle werden entfernt Sub BedFormateLöschen() Dim zelle As Range On Error GoTo fehler Selection.SpecialCells _ (xlCellTypeAllFormatConditions).Select For Each zelle In Selection zelle.FormatConditions.Delete Next zelle Exit Sub fehler: MsgBox "Keine Zellen mit bedingten Formaten!", _ vbInformation End Sub
Im Gegensatz zum vorherigen Listing werden im folgenden Listing alle Formatierungen einer Tabelle entfernt. Listing B.22: Alle Formatierungen in einer Tabelle werden entfernt Sub FormateLöschen() Dim zelle As Range ActiveSheet.UsedRange.Select Selection.ClearFormats End Sub
587
24128.book Seite 588 Mittwoch, 7. Februar 2007 12:06 12
Wichtige Funktionen in einem eigenen Add-In ablegen
Im letzten Listing werden alle Zellen einer Tabelle, die Festwerte aufweisen, gelöscht. Listing B.23: Alle Zellen, die Festwerte enthalten, werden gelöscht Sub InhalteLöschen() On Error GoTo fehler Selection.SpecialCells(xlCellTypeConstants).Select Selection.ClearContents Exit Sub fehler: End Sub
588
24128.book Seite 589 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis A Access-Daten – einlesen 461 Access-Tabellen – manipulieren 467 Access-VBA-Bibliothek – einbinden 455 Action 376 Activate 140, 304 ActiveCell 247 ActiveSheet 40 ActiveWorkbook 411 Add 77, 87, 97, 188, 198, 205, 540 AddComment 96, 277 AddCustomList 159, 160 AddFromFile 536, 540, 541 AddFromGuid 532 Add-In – erstellen 427 – installieren 86 AddIn 84, 86, 144 Add-Ins – prüfen 84 – überprüfen 162 AddIns 144 AddItem 525 AddNew 460 Address 247, 248, 278, 304, 352, 413, 438, 439 adLockBatchOptimistic 460 adLockOptimistic 460 adLockPessimistic 460 adLockReadOnly 460 ADO-Bibliothek – einbinden 455 AdOpenDynamic 460 adOpenForwardOnly 459 adOpenKeyset 459
adOpenStatic 460 adSearchBackward 466 adSearchForward 466 AdvancedFilter 376 Änderungsdatum – abfragen 414 – ermitteln 42 Aktivierreihenfolge – festlegen 513 AlertStyle 308 AllowDeletingColumns 233 AllowDeletingRows 233 AllowEditRanges 237 AllowFiltering 233 AllowFormatingCells 232 AllowFormattingColumns 232 AllowFormattingRows 232 AllowInsertingHyperlinks 233 AllowInsertingRows 233 AllowSorting 233 AllowUsingPivotTables 233 Anchor 438 Anwendernamen – ausgeben 30 Arbeitsmappe – anlegen 377 – identifizieren 411 – öffnen 420 – schließen 190 Arbeitsmappen – anlegen 188 – entfernen 191 – identifizieren 180 – konsolidieren 189 – löschen 191 – öffnen 174, 176 – schließen 186, 187 – speichern 181, 184, 185
589
24128.book Seite 590 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
– verknüpfen 196 – zusammenführen 189 Arbeitsmappen-Existenz – prüfen 419 Arbeitsmappen-Zustand – prüfen 420 Array 159, 229 Asc 417 Attachments 442 Aufenthaltsbereich – festlegen 168 AutoFilter 366, 366, 370 – aktivieren 365 AutoFilterMode 366 AutoFit 220, 221, 304, 447, 463
B Balkendiagramm – erstellen 388 BCC 442 BeforeDoubleClick 332, 349 BeforeRightClick 332, 343, 348, 349 BeginGroup 504 Benutzerdefinierte Liste – erstellen 160 – generieren 159 Benutzernamen – ausgeben 80 – einstellen 166 Benutzten Bereich – markieren 379 Berechnung – ausschalten 154 – einschalten 154 Bereich – festlegen 262 – schützen 237 Bereiche – verbinden 351 – zusammenfassen 249 Beschriftung – festlegen 73 Bibliothek – einbinden 531 – entfernen 537
590
Bilder – einfügen 512 Bildlaufleisten – ausblenden 151 Bildschirmaktualisierung – ausschalten 121, 153 – einschalten 121, 153 Blätter – zählen 209, 226 Blattprüfung – vornehmen 208 Blatt-Typ – bestimmen 206 Block – auskommentieren 51 Body 442 Bold 119, 263, 265, 402 Boolean 64 Borders 267 Briefkopf – erstellen 475 Buchstaben – eliminieren 416 BuilInDocumentProperties 193 BuiltInDocumentProperties 194 BusinessAddressCity 445 BusinessAddressCountry 445 BusinessAddressPostalCode 445 BusinessAddressState 445 BusinessAddressStreet 445 Button 73 Byte 64
C Calculate 330, 332 CalculateBeforeSave 155 Calculation 154 Call 355 Cancel 343, 344, 349, 351 Caption 73, 503, 509, 513 CategoryLabels 393 CC 442 CDate 310 CellDragAndDrop 162 Cells 136, 235, 253, 258, 262, 304, 423, 521
24128.book Seite 591 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
CenterFooter 240 CenterHeader 240 Change 325 ChangeLink 198 ChartObject 75 ChartTitle 387, 393 ChartType 385, 387, 389, 393 ChDir 177, 181, 183 ChDrive 177, 181, 183 Chr 90 chr 341 Chr(13) 543 ClassType 488 Clear 423 ClearComments 279, 423 ClearFormats 269, 423 Close 186, 188, 190, 215, 379, 460, 463, 466 Code – anzeigen 22 Code-Fenster – einblenden 131 – teilen 131 Codefenster – aufrufen 28 Codezeilen – zählen 542 Color 263 ColorIndex 116, 260, 263, 267, 327, 402, 409, 424, 436 – 347 Columns.Count 379 CommandBars 503 Comment 96, 277, 278 Connection 459, 463 Contents 232 Controls 505 Copy 190, 215, 217, 377, 379, 392, 487 CopyToRange 377 Count 117, 209, 226, 231, 295, 298, 423, 436, 449 Count down – einstellen 356 CountA 296, 298 CountBlank 298
CountIf 294 CountOfLines 542, 549 CreateBackup 182 CreateItem 442, 444 CreateObject 79, 442, 444, 473, 474, 478 criteria 466 Criteria1 367 CriteriaRange 376 Currency 64 CurrentRegion 254, 377, 400 CursorType 459 Custom UI Editor – anwenden 492 CutCopyMode 338, 393, 487
D DataObject 83 DataType 219 Date 32, 44, 64, 80, 185, 355 DateCreated 416 Dateigröße – abfragen 414 Dateiname – abfragen 414 Dateityp – abfragen 414 DateLastAccessed 416 DateLastModified 416 Daten – einfügen 392 – filtern 364 – kopieren 392 – skalieren 394 – speichern 516 Datenbank – öffnen 459 – schließen 460 Datenbanksatz – anlegen 460 – speichern 460 Datenbereich – angeben 382 – angeben (Diagramm) 387 – sortieren 373
591
24128.book Seite 592 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Datenfeld – füllen 398 – programmieren 180 Datensätze – löschen 469 Datensatz – aktivieren 463 – finden 466 – suchen 466 DatePart 90 Datumsangaben – formatieren 89 – subtrahieren 283 Datumsformat – konvertieren 310 Datumsformate – festlegen 269 Datumsgrenzen – einstellen 309 Datumsprüfung – vornehmen 105 Datumsteile – extrahieren 90 Debug.Print 133, 196, 374 Decimal 64 DefaultFilePath 167 Definition – ADO 454 – Eigenschaften 41 – Ereignisse 42, 316 – Methoden 41 – modulare Funktionen 419 – Objekte 41 – UserForms 508 – Variablen 62 – VBE-Programmierung 530 Delete 88, 165, 211, 273, 280, 322, 392, 424, 436, 470, 478 DeleteLines 548 Delimiter 176 Description 535 Diagramm – exportieren 74 – löschen 392
592
Diagrammblätter – entfernen 401 Diagramme – Balkendiagramm (gestapelt) 385 – Balkendiagramm (gruppiert) 385 – Blasendiagramm 385 – exportieren 398 – Flächendiagramm 385 – formatieren 396 – Kreisdiagramm 385 – Kursdiagramm 386 – Liniendiagramm 385 – Netzdiagramm 385 – Oberflächendiagramm 386 – platzieren 395 – Punktdiagramm 385 – Ringdiagramm 385 – Säulendiagramm 385 – Säulendiagramm 3D-Darstellung 385 Diagrammobjekt – exportieren 75 Diagrammposition – festlegen 392 Diagrammtypen – auswählen 385 Diagrammüberschrift – anzeigen 387 – festlegen 387 Dim 63 Dir 157, 165, 190 Direktfenster – einblenden 132 – einsetzen 133 – füllen 133, 196 Display 442 DisplayAlerts 74, 158, 322, 356, 546 DisplayAsIcon 77, 489 DisplayFullScreen 149 DisplayGridLines 34, 78, 152 DisplayHeadings 152 DisplayHorizontalScrollBar 152 DisplayRecentFiles 164 DisplayStatusBar 355 DisplayStatusbar 156
24128.book Seite 593 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
DisplayVerticalScrollBar 152 DisplayWorkbookTabs 152 DisplayZeros 152 Do Until...Loop-Schleife – programmieren 123 Do while 190 Do While...Loop-Schleife – programmieren 126 Documents 79, 474 Documents.Add 474 Dokument – einfügen 474 – öffnen 473, 478 – speichern 80 Dokumenteigenschaften – abfragen 414 – ansprechen 192 – auflisten 193 – auslesen 192 – füllen 193 – programmieren 192 – setzen 193 Doppelklick – aktivieren 349 – deaktivieren 349 Double 64 Drag&Drop – ausschalten 161 – einschalten 161 DrawingObjects 232 Dropdown-Pfeile – anzeigen 367 Druckseiten-Anzahl – ermitteln 242 Duplikate – entfernen 376
E EarliestTime 354 Editierformat – festlegen 58 Editoreinstellungen – anpassen 57 Eigenschaften – anzeigen 47
Eigenschaftenfenster – anzeigen 24 Eingabefelder – sperren 521 Eingabemaske – aufrufen 267 Eingabemeldung – anzeigen 310 Einzug – vergrößern 49 – verkleinern 49 E-Mail – senden 443 E-Mail Empfänger – angeben 442 E-Mail Text – angeben 442 Email1Address 445 E-Mail-Fenster – anzeigen 442 E-Mails – verschicken 440 E-Mail-Titel – festlegen 442 Enabled 521 EnableEvents 329 End With 40 Entwicklungsumgebung – aufrufen 22, 550 – einstellen 56 EOF 463, 466, 469 Ereignis – Activate 324 – Calculate 330 – Change 325 – einfügen 549 – entfernen 552 – löschen 548 – Selection_Change 328 – UserForm_Initialize 524 – Workbook_BeforeClose 319 – Workbook_BeforeSave 320 – Workbook_NewSheets 321 – Workbook_Open 317
593
24128.book Seite 594 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
– Workbook_SheetBeforeRightClick 345 – Worksheet_BeforeDoubleClick 349 – Worksheet_BeforeRightClick 343 Ereignissteuerung – ausschalten 329 – einschalten 329 Ergebnis – runden 285 Err 142 Erstellungsdatum – abfragen 414 Excel – beenden 74, 356 Excel-Arbeitsmappen – zählen 121 Excel-Dateien – suchen 157 Excel-Daten – exportieren 456 Excel-Version – feststellen 108 Execute 463 Exit Function 418 Exit Sub 142, 224 Export 75, 544
F FaceId 503 Farbe – zuweisen 263 Farben – ausgeben 259 Fehler – beseitigen 131 – finden 131 Fehlerbeschreibung – anzeigen 142 Fehlermeldung – anzeigen 310 Fehlernummer – anzeigen 142 Fehlerparagraphen – anspringen 105 Fehlerquellen – ausschließen 139
594
Fenster – verankern 60 Fensterstatus – ermitteln 111 Fensterteiler – betätigen 131 Fett-Druck – zuweisen 263 Field 367 FieldInfo 219 FileDateTime 42 FileFormat 182 FileName 174, 182, 399, 488 FileSystemObject 415 Filter 399 – aufspüren 373 – TopTen 371 Filterkriterien – festlegen 368 Filterkriterium – einstellen (aus Zelle) 370 – setzen 366 FilterName 399 Filteroperatoren – einsetzen 367 Filters 374 Find 466, 466 FirstName 445 Font 119, 262, 263, 265, 340, 348, 436 FontStyle 263 For Each 188, 384, 398 For Each...Next-Schleifen – einsetzen 118 For Next 238 For...Next-Schleifen – programmieren 112 Format 175, 240, 292 FormatDatTime 89 Formate – löschen 269 Formatierte Zellen – markieren 302 Formatierung – löschen 269
24128.book Seite 595 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Formelcheck – durchführen 412 Formeln – dokumentieren 300 – finden 300 – wandeln (Festwerte) 332 Formelzellen – dokumentieren 302 – finden 300 – markieren 235, 302 Formula 288, 294 Formula1 309 Formula2 309 FormulaLocal 287, 304, 413 Formular – einfügen 540 FullName 42, 163, 411 FullPath 535 Function 409 Funktionen – speichern 425 – verfügbar machen 425 Funktionsliste – aufrufen 285 Fußzeile – programmieren 239 Fußzeilen – gestalten 35, 120
G Gefilterte Daten – exportieren 377 GetDefaultFolder 447 GetFile 415 GetNamespace 447 GetObject 474 GetOpenFileName 177, 179 GetSaveAsFilename 182 Gitternetzlinien – anzeigen 33, 78 – ausblenden 33, 78 – deaktivieren 151 GoTo 105 Grafik – einfügen 77
Großbuchstaben – wandeln 328 Gültigkeit – Alles erlaubt 307 – Benutzerdefiniert 308 – nur Datumswerte 308 – nur Dezimalzahlen 307 – nur ganze Zahlen 307 – nur Listeneinträge 307 – nur Zeitwerte 308 Gültigkeitsliste – erstellen 311 Gültigkeitsoperatoren – auswählen 308 Gültigkeitsprüfungen – vornehmen 305 Gültigkeitsregel – hinzufügen 307 Gültigkeitszellen – markieren 302 Guid 532, 533
H Haltepunkt – ausschalten 49 – einfügen 49 HasLegend 393, 402 HasTitle 387 HauptNr 532 Header 373 Height 489, 513 Hidden 401 Hide 516 Hintergrundfarbe – festlegen 259 Horizontale Trennstreifen – einfügen 513 Hour 185 Hyperlink 97 – einfügen 96 Hyperlinks – entfernen 435 – erstellen 437 – formatieren 450 – programmieren 434
595
24128.book Seite 596 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
– prüfen 448 – zählen 436, 449 Hyperlinks.Add 438 Hyperlinktext – festlegen 438
I IconFileName 489 IconIndex 489 IconLabel 489 If 102, 162 IgnoreBlank 310 IgnoreReadOnlyRecommended IIf 106 Inhaltsverzeichnis – erstellen 438 InputBox 267 InsertAfter 481 InsertLines 549 Installed 86, 162 InStr 126, 448 InStrRev 199 Int 353 Integer 63, 64 Interior 260, 327 – 347 Intersect 328, 344, 351, 353 IsArray 106, 180 IsDate 105, 106 IsEmpty 103, 106, 198 IsError 106 IsNull 106 IsNumeric 106, 409 IsObject 106 Italic 263, 265
K Key 335 Key1 373 Kill 191 Klassenmodul – einfügen 540 Kleinbuchstaben – wandeln 328
596
176
Kommentar – einfügen 96 Kommentaradresse – ermitteln 278 Kommentare – auslesen 277 – einfügen 274 – entfernen 279 – erstellen 276 – löschen 279 Kommentarenzellen – markieren 302 Kommentartext – festlegen 277 Kommentierung – aufheben 51 Kommtarzellen – auskundschaften 274 Konstanten – anzeigen 47 – einsetzen 88 – global 88 – lokal 88 Kontakt – anlegen 445 Kontakte – austauschen 443 Kontextmenü – aktivieren 343 – deaktivieren 343 – erweitern 503 Kontextmenübefehle – entfernen 504 – löschen 504 Kontextmenüs – programmieren 503 Konturschriftschnitt – zuweisen 263 Koordinaten – ermitteln 247 Kopfzeile – programmieren 239 Kopfzeilen – gestalten 35, 120
24128.book Seite 597 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Kopierrahmen – entfernen 393 Kursiv-Druck – zuweisen 263
L Large 313 LastName 445 LatestTime 354 Laufwerk – wechseln 177 Laufzeitfehler 1004 141 Laufzeitfehler 438 142 LCase 328 Leerstellen – entfernen 299 Leerzeichen – entfernen 312 Leerzellen – ignorieren 310 – markieren 302 Left 109, 412, 489 LeftFooter 240 LeftHeader 44, 240 Legende – anpassen 402 Len 215, 418, 526 Lesezeichen – aktivieren 53 – löschen 53 – setzen 52 Letzte Zelle – markieren 302 LetzteZelle – ermitteln 379 Liniendiagramm – erstellen 390 Link 488 LinkSources 198 Listen – generieren 158 Listenfeld – auslesen 525 – füllen 524
Location 395, 403 Locked 235 LockType 460 Löschen – Alle Formatierungen 422 – Alle Inhalte 422 – Alle Kommentare 422 – Formeln 422 – Hyperlinks 422 Löschfunktion – erstellen 422 Lokal-Fenster – einblenden 135 Long 64
M MainWindow 550 Major 533 MajorUnit 394 Makro – auflisten 553 – aufrufen 355 – aufzeichnen 33 – entfernen 547 – löschen 547 – speichern 34 – zuweisen 335 Makrorekorder – einsetzen 33 Makros – benennen 29 – debuggen 133 – einfügen 29, 44, 55 – kopieren 44, 54 – übernehmen 44 – zurücksetzen 134 – zuweisen 73 Markierte Zellen – ansprechen 334 Markierung – relativ 250 Maus – programmieren 342 Max 394
597
24128.book Seite 598 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
MaximimScale 394 Meldungsfenster – ausgeben 32 Methoden – anzeigen 47 Mid 199, 415, 417, 418 Min 394 MinimumScale 394 Minor 533 Minute 185 Minuten – ermitteln 185 Modul – einfügen 28 Modulare Funktionen – programmieren 419 Module – drucken 544 – entfernen 546, 553 – löschen 546, 553 Monatsnamen – ermitteln 43 Month 43 MonthName 43 Move 216, 217, 238, 242 MoveNext 463, 468, 470 MsgBox 30, 48, 144, 211 MultiSelect 179
N Name 144, 163, 180, 182, 207, 226, 262, 411, 415, 546 Namen – löschen 273 Names.Add 272 NebenNr 532 NewSeries 393 Notizen – einfügen 275 Now 355, 356 Nullwerte – ausblenden 151 Number 142 NumberFormat 269, 271
598
O Object 64, 79 ObjectType 485 Objektkatalog – aufrufen 40 Objektvariable – deklarieren 75 Objektvariablen – auflösen 249 – einsetzen 70 Objektverweis – aufheben 80, 87 Öffnen-Dialog – anzeigen 177 OffSet 114, 250 Offset 107 olContactItem 444 OLE-Objekt – einfügen 488 On Error 105, 142, 229, 384, 421, 547 – goTo 142 OnAction 73, 503 OnKey 337 Online-Hilfe – aufrufen 44 OnTime 354, 354 Open 174, 174, 177, 178, 214, 379, 420, 459, 463, 473 OpenText 218, 222, 546 Operator 367 Option Explicit 65 Optionsschaltfläche – auslesen 518 Order1 373 Orientation 382 Origin 176 OutLineFont 263 OutputTo 485
P PageSetup 40, 240 Parameterinfo – anzeigen 48 Password 176, 182
24128.book Seite 599 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Passwort 232 Paste 378, 392, 487 PasteSpecial 338, 377 Path 415 Pfad – abfragen 414 Picture 77 PivotFields 382 Pivot-Tabellen – aktualisieren 357, 383 – erstellen 380 – programmieren 380 PivotTableUpdate 332 PivotTableWizard 381 PlotBy 387 Position – ermitteln (erste Zahl) 417 PowerPoint – starten 97 Preise – erhöhen 283 Primärfarbe – zuweisen 263 Print 379 PrintOut 546 ProcCountLines 548 Procedure 335, 354 ProcStartLine 548, 548 Protect 232, 235, 237, 242 Prozeduren – anzeigen 131 PutInClipBoard 83
Q Quellcode – exportieren 543 – importieren 538 QuickInfo – anzeigen 48 – festlegen 438 Quit 74, 356, 473
R Rahmenart – festlegen 268 Rahmentypen – festlegen 266 Range 86, 246, 334 ReadOnly 175 ReadOnlyRecommended RecentFile 165 RecentFiles 164 ReDim 231 Reference 533 RefersTo 272 RefreshTable 383 Remove 537, 547 Replace 393 Ribbons – programmieren 491 RightFooter 241 RightHeader 240 Rnd 353, 520 Round 285 RowCol 392 Rows 116 Rückfrage – programmieren 210 – unterdrücken 210
182
S Säulendiagramm – einfügen 386 Save 184, 185, 445 SaveAs 80, 182 SaveChanges 187, 473 Saved 186 Scenarios 232 Schaltfläche – einfügen 72 Schedule 354 Schleifen – programmieren 112 Schreibarbeit – sparen 39
599
24128.book Seite 600 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Schriftart – einstellen 340, 546 – festlegen 262 – schattieren 264 Schriftgröße – einstellen 546 – festlegen 262 Schriftschnitt – festlegen 119 – zuweisen 263 Schriftschnitte – einsetzen 263 ScreenTip 438 ScreenUpdating 121, 153 ScrollArea 168 – angeben 27 – festlegen 168 SearchDirection 466 Seitennummerierung – angeben 241 Select 231, 235, 246, 248 Select Case 108, 415, 417, 418 – 346 Selection 248, 334 SelLength 526 SelStart 526 Send 443 Series 398 SeriesLabels 392 Set 75, 198, 540 SetFocus 526, 550 SetSourceData 387, 389 Shadow 264 SheetBeforeRightClick – 345 Sheets 206, 226, 260 Sheets.Add 260, 447 SheetsInNewBook 167 SheetsInNewWorkbook 188, 190 Show 515 ShowError 310 ShowInput 310 Sicherungskopie – anlegen 182
600
Sichtbare Zellen – markieren 302 sichtbare Zellen – markieren 377 Single 64, 284 Size 262, 415, 546 Skalierung – vornehmen 394 SkipRows 466 Sonderzeichen – einfügen 339 Sort 373 Source 389, 459 SourceData 382 SourceTyp 381 Spalten – zählen 379 Spaltenbreite – einstellen 304 Spaltenbreiteneinstellung – vornehmen 220 Spaltenüberschriften – ausblenden 151 SpecialCells 235, 301, 377, 400 SpecialEffect 513 Speicher – freigeben 447 Speicher-Dialog – aufrufen 182 Speicherpfad – ermitteln 42 Spezialfilter – einsetzen 375 SQL-Abfrage – durchführen 463 StandardFont 167 StandardFontSize 167 Standardmeldungen – abschalten 157 – ausschalten 74 Standardmodul – einfügen 540 Standardschriftart – einstellen 166
24128.book Seite 601 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Standardspeicherort – einstellen 166 Standardtastenkombinationen – aktivieren 358 – deaktivieren 337 start 466 StartRow 219 StatusBar 156 Statusleiste – ausblenden 151 – einblenden 156 – programmieren 354 Statuszeile – programmieren 155 Steuerelemente – beschriften 513 – einsetzen 509 – hinzufügen 509 – identifizieren 523 Strikethrough 264 String 63, 64 Stunden – ermitteln 185 SubAddress 438 SubAdress 439 Subject 442 Subscript 264 Substitute 126 SumIf 292 Superscript 264 Symbolleiste – einblenden 46
T Tabelle – berechnen 330 – einfügen 193, 447 – löschen 209 – Prüffunktionen 106 – sortieren 373 Tabellen – anlegen 204 – ausblenden 25, 223, 225 – ausblenden (sicher) 226
– auswählen 231, 235 – benennen 204 – einblenden 223, 227 – einfügen 260 – entfernen 209 – exportieren 213 – gruppieren 228 – importieren 217 – kopieren 190, 215 – schützen 232, 235 – sortieren 238 – spiegeln 26 – übertragen 216 – zählen 117 Tabellenanzahl – einstellen 166 Tabellenblätter – füllen 208 Tabellenblätteranzahl – festlegen 188 Tabellenblatt – aktivieren 304 Tabellenfunktion – COUNT 295 – COUNTA 296 – COUNTBLANK 298 – COUNTIF 293 – DATEDIF 288 – einfügen 286 – LARGE 313 – MAX 394 – MIN 394 – RANK 288 – SUM 286 – SUMIF 292 Tabellenfunktionen – einsetzen 285 – erstellen 407 Tabellennamen – ermitteln 117 TableDestination 382 TableName 382 Tagesdatum – ausgeben 32
601
24128.book Seite 602 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Target 327, 343, 344 Tastenkombination – bekannt geben 334 – zuweisen 334 Tastenkombinationen – einsetzen 54 – verwenden 332 Text 277, 387 – ausgeben 30 – durchstreichen 264 – höherstellen 264 – tieferstellen 264 – unterstreichen 264 Textdatei – einfügen (als Symbol) 76 – öffnen 379 – schließen 379 Textteile – ersetzen 53 – suchen 53 TextToDisplay 438 ThisWorkbook 117, 207 Time 32 TimeValue 355, 356 To 442 Top 489 Trim 299, 312 Type 310, 415 TypeName 207, 523 TypeParagraph 478 TypeText 79, 480
U UBound 180 UCase 328 Überwachung – hinzufügen 134 Uhrzeit – ausgeben 32 Umliegenden Bereich – ermitteln 254 – markieren 377 UnderLine 424 Underline 264, 436
602
Union 249, 351 unload me 516 Unterstreichung – entfernen 424 Update 460, 468 UpdateLinks 175 UsedRange 214, 253, 373, 379, 379, 520 UserForm – aufrufen 514 – beenden 515 – benennen 509 – einfügen 509 – entfernen 551 – starten 514 – testen 514 – Titel festlegen 509 – vergrößern 509 UserForms – entwerfen 509 – programmieren 514 UserInterFaceOnly 232 UserName 167 Username 80
V Validation.Add 307 Value 257, 304, 413, 518, 523, 525 Variablen – deklarieren 62 – global 62 – lokal 62 – öffentlich 68 – privat 69 – Regeln 63 – statisch 67 Variablendeklaration – erzwingen 65 Variablenlänge – ermitteln 215 Variablentypen – auswählen 63 Variant 64 VBComponents 549 vbCr 54
24128.book Seite 603 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
VBE – aufrufen 550 – Eigenschaften 538 – Methoden 538 – Objekte 538 VBE-Bibliothek – deaktivieren 537 VBE-Komponenten – auflisten 551 vbext_ct_ClassModule 540 Vbext_ct_MSForm 540 Vbext_ct_StdModule 540 vbext_ct_StdModule 540 vbext_pk_Proc 548 VBE-Zugriff – zulassen 534 vbInformation 400 Veränderungen – verhindern 234 Verfügbare Objekte – ansehen 45 Vergleichsoperatoren – einsetzen 110 Verknüpfungen – ändern 198 – dokumentieren 197 – wandeln (Festwerte) 332 Version 108 Verweis – erstellen 79 Verwendeten Bereich – ermitteln 214, 253 – markieren 379 Verzeichnis – wechseln 177 Verzweigungen – einsetzen 100 Visible 79, 224, 228, 272, 473, 478, 550 VisibleDropDown 367 Vokabel-Lernprogramm – programmieren 508 Vokabeln – einfügen 519 – prüfen 521
Volatile 409 Vollbildansicht – einstellen 148
W Wait 355 WeekDayName 94 Werkzeugsammlung – einsetzen 509 Werte – addieren 351 – einfügen 338 Where 395 WholeStory 478 Width 489 Wiedervorlageliste – anzeigen 163 – ausblenden 163 – bearbeiten 163 – überprüfen 164 WindowState 111 With 39, 73 Wochentag – ermitteln 94 Worbook_BeforeClose 339 Word – beenden 79 – starten 79 Word-Dokumente – auflisten 481 Word-Sitzung – beenden 473 – starten 472 – übernehmen 474 Word-VBA Bibliothek – einbinden 471 WorkBook 180 Workbook 144, 174 Workbook_Activate 322 Workbook_AddinInstall 322 Workbook_AddinUninstall 322 Workbook_BeforeClose 319 Workbook_BeforePrint 322 Workbook_BeforeSave 320, 322
603
24128.book Seite 604 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Workbook_Deactivate 322 Workbook_NewSheet 323 Workbook_Open 317, 338 Workbook_SheetActivate 323 Workbook_SheetBeforeDoubleClick 323 Workbook_SheetBeforeRightClick 323 Workbook_SheetCalculate 323 Workbook_SheetChange 323 Workbook_SheetDeactivate 323 Workbook_SheetFollowHyperlink 323 Workbook_SheetSelectionChange 323 Workbook_WindowActivate_ 323 Workbook_WindowDeactivate 323 Workbook_WindowResize 323 Workbooks 144, 180 Workbooks.Add 377 Worksheet 121 Worksheet_Activate 331 Worksheet_BeforeRightClick 343 Worksheet_Calculate 331 Worksheet_Change 331 Worksheet_Deactivate 331 Worksheet_FollowHyperlink 332 WorkSheet_SelectionChange 332 Worksheet_SelectionChange 329 WorksheetFunction 286, 291 WorkSheets 207 Worksheets 117 WriteResPassword 176, 182
X xl3DColumn 385 xlAnd 367 xlArea 385 xlAscending 373 xlAutomatic 424, 436 xlBarClustered 385 xlBarStacked 385 xlBetween 308 xlBottom10Items 367 xlBottom10Percent 367 xlBubble 385 xlCellTypeAllFormatConditions xlCellTypeAllValidation 302
604
302
xlCellTypeBlanks 302 xlCellTypeComments 302 xlCellTypeFormulas 235, 301 xlColorIndexNone – 347 xlColumnClustered 385 xlColumnField 383 xlColumns 387, 392 xlColumnStacked 385 xlConsolidation 382 xlContinuous 266 xlDash 266 xlDashDot 266 xlDashDotDot 266 xlDatabase 382 xlDataField 383 xlDescending 373 xlDot 266 xlDouble 266 xlDoughnut 385 xlEqual 308 xlExternal 382 xlFilterCopy 376, 377 xlFilterInPlace 376 xlGreater 308 xlGreaterEqual 308 xlHidden 383 xlLess 308 xlLessEqual 308 xlLine 385 xlLineStyleNone 267 xlLocationAsNewSheet 395 xlLocationAsObject 395 xlLocationAutomatic 395 xlNo 373 xlNotBetween 308 xlNotEqual 308 xlOr 367 xlPageField 383 XLPasteAll 378 xlPie 385 xlPivotTable 382 xlRadar 385 xlRowField 383
24128.book Seite 605 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
xlRows 387, 392 xlSheetHidden 25 xlSheetVeryHidden 25 xlSlantDashDot 267 xlStockHLC 386 xlSurface 386 xlTop10Items 367, 372 xlTop10Percent 367 xlUnderlineStyleNone 424, 436 xlValidAlertInformation 308 xlValidAlertStop 308 xlValidAlertWarning 308 XlValidateCustom 308 xlValidateDate 308 xlValidateDecimal 307 xlValidateInputOnly 307 xlValidateList 307 XlValidateTextLength 308 XlValidateTime 308 xlValidateWholeNumber 307 xlValues 338 xlVeryHidden 227 xlVisible 25, 400 xlXYScatter 385 xlYes 373
Z Zahlen – summieren 129 Zahlenformate – festlegen 268 Zahlenwerte – prüfen 109 Zeichen – austauschen 125 – ersetzen 126 Zeichen-Belegung – herausfinden 341 Zeichen-Code – ermitteln 341 Zeichenfolge – ersetzen 126 – extrahieren 199
Zeichenobjekt – einfügen 86 – entfernen 87 Zeichenposition – ermitteln 199 Zeichenprüfung – durchführen 126 Zeilen – abarbeiten 113 – einfärben 115 – löschen 123 Zeilenüberschriften – ausblenden 151 Zeilenvorschub – einfügen 54 Zeitsteuerung – programmieren 354 Zelle – füllen 136 Zellen – abfragen 257 – addieren 281 – ändern 257 – auswerten 118 – benennen 271 – einfügen 378 – formatieren 259 – füllen 255 – initialisieren 255 – kommentieren 274 – kopieren 377 – markieren 246 – multiplizieren 283 – rahmen 266 – summieren 408 Zellenadresse – abfragen 413 Zellenbereich – markieren 247 Zellenbereiche – markieren 248 Zellenformel – abfragen 413
605
24128.book Seite 606 Mittwoch, 7. Februar 2007 12:06 12
Stichwortverzeichnis
Zellenhintergrund – auslesen 260 – formatieren 347 – löschen 261 Zelleninformationen – abfragen 413 Zelleninhalte – prüfen 103 Zellenlänge – überprüfen 127 Zellenverschiebung – angeben 107 Zellenwert – abfragen 413
606
Zoom – einstellen 167 Zufallszahl – erzeugen 521 Zufallszahlen – bilden 352 Zugriffsdatum – abfragen 414 Zwischenablage – ansprechen 80 – füllen 80, 83 – leeren 83