Excel-VBA
Bernd Held
Excel-VBA 쐽 Für Excel 97/ 97/2000/ 2000/2002 쐽 Rout outinea nearbei beiten automa omatisieren 쐽 Zeit sparen und Effi ffizienz enz steigern
eBook Die nicht autorisierte Weitergabe dieses eBooks an Dritte ist eine Verletzung des Urheberrechts!
Markt + Technik Verlag
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 Software-Bezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig auch eingetragene Marken oder sollten als solche betrachtet werden. Umwelthinweis: Dieses Buch wurde auf chlorfrei gebleichtem Papier gedruckt. Die Einschrumpffolie – zum Schutz vor Verschmutzung – ist aus umweltverträglichem und recyclingfähigem PE-Material.
10 9 8 7 6 5 4 3 2 1
06 05 04 03
ISBN 3-8272-6506-1
© 2003 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 Fachlektorat: Volker Hachtel, Esslingen/Danny Reinhold, Bremen Lektorat: Melanie Kasberger,
[email protected] Korrektorat: Bernd Basner, Rosenheim Herstellung: Philipp Burkart,
[email protected] Satz: reemers publishing services gmbh, Krefeld, (www.reemers.de) Einbandgestaltung: Grafikdesign Heinz H. Rauner, Gmund Druck und Verarbeitung: Bercker, Kevelaer Printed in Germany
Inhaltsverzeichnis Liebe Leserin, lieber Leser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
Woche 1 – Vorschau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
Tag 1
Die Entwicklungsplattform kennen lernen . . . . . . . . . . . . . . . . . . . . .
21
1.1 1.2
23 23 25 26 26 27 28 31 32 34 38 39 40 41 41 42 43 44 44 50 52 54 54 55 56 58 58
1.3 1.4
1.5
1.6
1.7
1.8
1.9
Der Projekt-Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Eigenschaften-Fenster. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen ein- und ausblenden. . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen spiegeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den zu bearbeitenden Bereich festlegen . . . . . . . . . . . . . . . . . . Das Code-Fenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Makros erfassen und starten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Der Makrorekorder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ein- und Ausschalten der Gitternetzlinien . . . . . . . . . . . . . . . . . Einheitliches Gestalten der Kopf- und Fußzeile. . . . . . . . . . . . . Der Objektkatalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Letztes Änderungsdatum einer Datei ermitteln . . . . . . . . . . . . . Monatsnamen ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Online-Hilfe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verwendete Befehle nachlesen . . . . . . . . . . . . . . . . . . . . . . . . . . Verfügbare Objekte ansehen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Befehle suchen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weitere praktische Helfer in der Entwicklungsumgebung . . . . . Die Symbolleiste Bearbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . Suchen & Ersetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schnelles Arbeiten über Tastenkombinationen . . . . . . . . . . . . . Entwicklungsumgebung einstellen . . . . . . . . . . . . . . . . . . . . . . . Editoreinstellungen anpassen . . . . . . . . . . . . . . . . . . . . . . . . . . . Editierformat festlegen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Allgemeine Einstellungen vornehmen . . . . . . . . . . . . . . . . . . . . Fenster verankern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Inhaltsverzeichnis
Tag 2
Datentypen, Variablen und Konstanten. . . . . . . . . . . . . . . . . . . . . . . .
61
2.1 2.2 2.3 2.4 2.5
62 63 65 67 68 68 68 69 70 71 73 74 76 78 79 80 82 84 85 87 88 88 89 93 94
2.6
2.7 2.8
2.9 Tag 3
Die Sprachelemente von VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1
3.2
6
Was sind Variablen? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablen deklarieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablendeklaration erzwingen . . . . . . . . . . . . . . . . . . . . . . . . . Vorsicht, Falle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variablentypen kennen lernen. . . . . . . . . . . . . . . . . . . . . . . . . . . Statische Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Öffentliche Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Private Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objektvariablen einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Den Office-Assistenten aufrufen . . . . . . . . . . . . . . . . . . . . . . . . . Schaltfläche einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Diagramm exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Menüleiste ein- und ausblenden . . . . . . . . . . . . . . . . . . . . . . . . . Textdatei als Symbol einfügen. . . . . . . . . . . . . . . . . . . . . . . . . . . Grafik einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Word starten und beenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variableninhalt in Zwischenablage befördern . . . . . . . . . . . . . . Add-Ins-Prüfung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zeichenobjekt einfügen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konstanten einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konstanten für die Datumsfomatierung . . . . . . . . . . . . . . . . . . . Datumsangaben formatiert ausgeben . . . . . . . . . . . . . . . . . . . . . Datumsteile extrahieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wochentag ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeiten mit Verzweigungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen im Leben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen in Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verzweigungen in Excel-VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . Zelleninhalte prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Auch eine Art von Verzweigung . . . . . . . . . . . . . . . . . . . . . . . . . Übersichtlichere Form mit Select Case. . . . . . . . . . . . . . . . . . . . Excel-Version feststellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zahlenwerte prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fensterstatus ermitteln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97 98 98 99 100 100 103 105 105 106 107
Inhaltsverzeichnis
3.3
3.4 Tag 4
108 108 113 119 123 126
Auf Fehlersuche mit VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 4.1 4.2
4.3
4.4 Tag 5
Schleifen programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . For...Next-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . For Each...Next-Schleifen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Schleife Do Until...Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Schleife Do While...Loop. . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Allgemeine Informationen zu Makros. . . . . . . . . . . . . . . . . . . . . Fehler finden und beseitigen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Code-Fenster. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Direktfenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Code im Einzelschritt durchlaufen lassen . . . . . . . . . . . . . . . . . Überwachung hinzufügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Lokal-Fenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Symbolleiste Debuggen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Typische Fehlerquellen in Excel-VBA. . . . . . . . . . . . . . . . . . . . . Buchstabendreher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nicht existente Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nicht verfügbare Eigenschaften und Methoden. . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
130 132 132 133 134 135 136 138 140 140 141 144 145
Einstellen und Anpassen der Excel-Anwendung . . . . . . . . . . . . . . . . . 147 5.1 5.2 5.3
5.4
5.5 5.6 5.7 5.8
5.9
Vollbildansicht einstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weitere Einstellungen der Ansicht . . . . . . . . . . . . . . . . . . . . . . . Lang laufende Makros schneller machen . . . . . . . . . . . . . . . . . . Bildschirmaktualisierung ein- und ausschalten. . . . . . . . . . . . . . Die Berechnung ein- und ausschalten . . . . . . . . . . . . . . . . . . . . Statuszeile einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Standardmeldungen abschalten . . . . . . . . . . . . . . . . . . . . . . . . . Automatische Listen generieren . . . . . . . . . . . . . . . . . . . . . . . . . Benutzerdefinierte Liste aus Makro erzeugen. . . . . . . . . . . . . . . Benutzerdefinierte Liste aus Zelleninhalten erzeugen . . . . . . . . Drag&Drop ein- und ausschalten . . . . . . . . . . . . . . . . . . . . . . . . Add-Ins überprüfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wiedervorlageliste bearbeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . Sonstige Einstellmöglichkeiten in Excel . . . . . . . . . . . . . . . . . . . Allgemeine Einstellungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zoom einstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aufenthaltsbereich festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
148 150 152 152 153 154 156 157 157 158 160 160 161 163 163 165 166 168
7
Inhaltsverzeichnis
Tag 6
Auf Arbeitsmappen zugreifen – Datei-Operationen . . . . . . . . . . . . . . 171 6.1
6.2
6.3
6.4 6.5 6.6 6.7
6.8
6.9 Tag 7
172 174 175 177 178 179 181 182 183 183 183 184 184 185 185 187 187 188 190 192 193 194 196
Tabellenblätter programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 7.1 7.2
7.3
7.4
8
Arbeitsmappen öffnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe öffnen (ohne Aktualisierung) . . . . . . . . . . . . . . . . Arbeitsmappe(n) öffnen über ein Dialogfeld . . . . . . . . . . . . . . . Geöffnete Arbeitsmappen identifizieren . . . . . . . . . . . . . . . . . . . Arbeitsmappen speichern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe speichern über das Dialogfeld . . . . . . . . . . . . . . . Alle geöffneten Arbeitsmappen speichern. . . . . . . . . . . . . . . . . . Arbeitsmappe speichern unter Datum/Uhrzeit. . . . . . . . . . . . . . Arbeitsmappe bedingt speichern . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen schließen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappe schließen – Änderungen speichern . . . . . . . . . . . Arbeitsmappe schließen – Änderungen verwerfen . . . . . . . . . . . Mehrere Arbeitsmappen schließen . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen zusammenführen . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen entfernen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften auslesen . . . . . . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften setzen. . . . . . . . . . . . . . . . . . . . . . . . . . Verknüpfungen in Arbeitsmappen . . . . . . . . . . . . . . . . . . . . . . . . Verknüpfungen dokumentieren . . . . . . . . . . . . . . . . . . . . . . . . . Verknüpfungen ändern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen anlegen und benennen. . . . . . . . . . . . . . . . . . . . . . . . . Blatt-Typ bestimmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellenblätter füllen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Blattprüfung vor Füllung vornehmen . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabelle als Textdatei exportieren. . . . . . . . . . . . . . . . . . . . . . . . . Tabelle in eine neue Arbeitsmappe kopieren . . . . . . . . . . . . . . . Tabelle in neue Arbeitsmappe übertragen . . . . . . . . . . . . . . . . . Tabelle in andere Arbeitsmappe kopieren/übertragen . . . . . . . .
198 200 201 202 202 202 203 203 204 205 205 207 208 209
Inhaltsverzeichnis
7.5
7.6
7.7
7.8
7.9 7.10 7.11
Tabellen importieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Textdatei-Import mit festen Datenfeldern. . . . . . . . . . . . . . . . . . Textdatei-Import mit variablen Datenfeldern . . . . . . . . . . . . . . . Tabellen ein- und ausblenden . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfaches Aus- und Einblenden einer Tabelle . . . . . . . . . . . . . . Mehrere Tabellen ausblenden . . . . . . . . . . . . . . . . . . . . . . . . . . Das sichere Ausblenden von Blättern . . . . . . . . . . . . . . . . . . . . . Blätter wieder einblenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Einfaches Gruppieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Komplexeres Gruppieren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
210 210 213 215 215 217 218 219 220 220 221 223 225 226 227 228 229 230 232
Woche 2 – Vorschau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Tag 8
Zellenbearbeitung mit VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 8.1
8.2
8.3
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 . . . . . . . . . . . . . . . . . . . . . Zellen füllen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen initialisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen abfragen und ändern . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hintergrundfarbe von Zellen festlegen . . . . . . . . . . . . . . . . . . . . Schriftart festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Schriftschnitte angeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen rahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zahlenformate festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
238 238 239 240 241 244 244 245 247 247 248 250 250 252 253 256 258
9
Inhaltsverzeichnis
8.4 8.5
8.6 Tag 9
9.2
9.3
9.4
9.5
Arbeiten mit Formeln. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Addition von bestimmten Sätzen. . . . . . . . . . . . . . . . . . . . . . . . . Subtraktion von Datumsangaben . . . . . . . . . . . . . . . . . . . . . . . . Preise erhöhen durch Multiplikation . . . . . . . . . . . . . . . . . . . . . DM-Umrechnung mit Division. . . . . . . . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . Formeln finden und dokumentieren . . . . . . . . . . . . . . . . . . . . . . Formelzellen finden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formelzellen dokumentieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Gültigkeitsprüfungen vornehmen . . . . . . . . . . . . . . . . . . . . . . . . Nur ganze Zahlen eingeben . . . . . . . . . . . . . . . . . . . . . . . . . . . . Datumsgrenzen einstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gültigkeitsliste erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
274 274 277 277 279 281 281 282 284 287 288 290 291 293 295 295 297 300 301 303 305 306
Aktionen und Benutzereingaben überwachen. . . . . . . . . . . . . . . . . . . 309 10.1 10.2
10
260 262 264 264 266 268 269 270
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 9.1
Tag 10
Datumsformate festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen benennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen kommentieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kommtarzellen auskundschaften . . . . . . . . . . . . . . . . . . . . . . . . Kommentare aus Zelleninhalten erstellen . . . . . . . . . . . . . . . . . Zellen aus Kommentaren füllen . . . . . . . . . . . . . . . . . . . . . . . . . Kommentare löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Was sind Ereignisse?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ereignisse auf Arbeitsmappenebene . . . . . . . . . . . . . . . . . . . . . . Das Ereignis Workbook_Open . . . . . . . . . . . . . . . . . . . . . . . . . . Das Ereignis Workbook_BeforeClose . . . . . . . . . . . . . . . . . . . . . Das Ereignis Workbook_BeforeSave . . . . . . . . . . . . . . . . . . . . . .
310 310 311 312 313
Inhaltsverzeichnis
10.3
10.4 Tag 11
11.2
11.3
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pivot-Tabellen einsetzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pivot-Tabellen erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pivot-Tabellen aktualisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
328 328 329 331 333 334 336 337 339 342 342 345 347
Daten grafisch darstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9
Tag 13
314 315 317 317 318 321 323 324 325
Große Datenmengen in VBA behandeln und auswerten . . . . . . . . . . 327 11.1
Tag 12
Das Ereignis Workbook_NewSheets . . . . . . . . . . . . . . . . . . . . . . Weitere Arbeitsmappenereignisse im Überblick. . . . . . . . . . . . . Ereignisse auf Tabellenblattebene . . . . . . . . . . . . . . . . . . . . . . . . Das Ereignis Activate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Ereignis Change . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Das Ereignis Selection_Change . . . . . . . . . . . . . . . . . . . . . . . . . Das Ereignis Calculate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Weitere Tabellenereignisse im Überblick. . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
350 351 353 355 359 360 361 362 364
Tastatur- und Zeitsteuerung in Excel . . . . . . . . . . . . . . . . . . . . . . . . . . 367 13.1
Excel über Tastenkombinationen bedienen . . . . . . . . . . . . . . . . Formeln und Verknüpfungen in Festwerte wandeln . . . . . . . . . Bestimmte Standardtastenkombinationen deaktivieren . . . . . . .
368 368 372
11
Inhaltsverzeichnis
13.2
13.3
13.4 Tag 14
Nur Werte einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sonderzeichen per Tastenkombination einfügen . . . . . . . . . . . . Programmieren mit der Maus . . . . . . . . . . . . . . . . . . . . . . . . . . . Kontextmenü aktivieren/deaktivieren . . . . . . . . . . . . . . . . . . . . . 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 per Doppelklick hochzählen . . . . . . . . . . . . . . . . . . . . . . Zufallszahlen per Doppelklick . . . . . . . . . . . . . . . . . . . . . . . . . . Excel zeitmäßig steuern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Die Uhr immer im Blick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Countdown in Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verarbeitung zu einer bestimmten Zeit beginnen . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
373 374 377 378 378 379 380 381 383 385 386 388 388 389 390 391
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 14.1 14.2 14.3 14.4 14.5 14.6
14.7
Was verbirgt sich hinter der VBE-Programmierung . . . . . . . . . . Voraussetzung – das Einbinden der VBE-Bibliothek . . . . . . . . . Weitere Informationen zu Bibliotheken . . . . . . . . . . . . . . . . . . . VBE-Bibliothek deaktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objekte, Methoden und Eigenschaften der VBE . . . . . . . . . . . . Typische Aufgaben mit der VBE erledigen . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
396 396 399 401 402 403 403 407 409 410 411 412 413 414
Woche 3 – Vorschau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 Tag 15
Funktionen einsetzen, um Excel zu automatisieren . . . . . . . . . . . . . . 419 15.1
12
Eigene Tabellenfunktionen stricken . . . . . . . . . . . . . . . . . . . . . . Zellen mit blauer, dicker Schriftfarbe summieren . . . . . . . . . . . Aktuelle Arbeitsmappe ermitteln . . . . . . . . . . . . . . . . . . . . . . . . .
420 421 423
Inhaltsverzeichnis
15.2
15.3
15.4 Tag 16
16.2 16.3 16.4
436 438 440
Arbeiten mit Hyperlinks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hyperlinks aus einer Tabelle entfernen . . . . . . . . . . . . . . . . . . . Hyperlinks aus Zelleninhalten herstellen . . . . . . . . . . . . . . . . . . Inhaltsverzeichnis erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-Mails verschicken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kontakte austauschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
444 444 446 447 449 452 457
Excel und Datenbankzugriffe in Access. . . . . . . . . . . . . . . . . . . . . . . . 461 17.1 17.2 17.3
17.4 17.5 17.6 Tag 18
424 425 427 429 430 431 431 432 433 436
Excel und das Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 16.1
Tag 17
Formelcheck durchführen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zelleninformationen abfragen. . . . . . . . . . . . . . . . . . . . . . . . . . . Dokumenteigenschaften per Funktion abfragen . . . . . . . . . . . . Buchstaben aus Zellen eliminieren. . . . . . . . . . . . . . . . . . . . . . . Das erste Auftreten einer Zahl ermitteln. . . . . . . . . . . . . . . . . . . Modulare Funktionen programmieren . . . . . . . . . . . . . . . . . . . . Arbeitsmappen-Existenz prüfen. . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsmappen-Zustand prüfen . . . . . . . . . . . . . . . . . . . . . . . . . . Eine mächtige Löschfunktion erstellen. . . . . . . . . . . . . . . . . . . . Funktionen dauerhaft verfügbar machen . . . . . . . . . . . . . . . . . . Speichern der Funktionen in der persönlichen Makroarbeitsmappe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Speichern der Funktionen in einem Add-In. . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Voraussetzung für den Datenaustausch. . . . . . . . . . . . . . . . . . . . Excel-Daten in eine Access-Datenbank transferieren . . . . . . . . . Access-Daten in Excel-Tabellen transferieren. . . . . . . . . . . . . . . Alle Datensätze nach Excel transferieren . . . . . . . . . . . . . . . . . . Nur bestimmte Datensätze nach Excel transferieren . . . . . . . . . Access-Tabellen manipulieren . . . . . . . . . . . . . . . . . . . . . . . . . . . Datensätze löschen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
462 464 468 468 470 472 474 475
Excel und Word im Zusammenspiel . . . . . . . . . . . . . . . . . . . . . . . . . . 481 18.1 18.2 18.3 18.4
Zusammenarbeit zwischen Excel und Word vorbereiten . . . . . . Word-Sitzung starten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Word-Sitzung übernehmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
482 484 485 486
13
Inhaltsverzeichnis
18.5 18.6 18.7 Tag 19
19.3
19.4
19.5
20.3
20.4
500 502 502 503 505 507 507 509 513 513 514 515
Was sind UserForms? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UserForms entwerfen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bilder in UserForms einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . Horizontale Trennstreifen einfügen . . . . . . . . . . . . . . . . . . . . . . Steuerelemente beschriften . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aktivierreihenfolge festlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . UserForms programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UserForm aufrufen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UserForm beenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Speichern der eingegebenen Daten . . . . . . . . . . . . . . . . . . . . . . Vokabeln einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vokabeln prüfen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anzeigen der nächsten 3 Vokabeln . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
518 518 521 522 522 523 523 524 524 525 527 530 532 533
Erstellen von Add-Ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537 21.1 21.2
14
Leistenart identifizieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Menüleisten programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitsblatt-Menüleiste ein- und ausblenden . . . . . . . . . . . . . . . Neue Menüs einfügen und löschen . . . . . . . . . . . . . . . . . . . . . . Menübefehle einfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Symbolleisten programmieren. . . . . . . . . . . . . . . . . . . . . . . . . . . Neue Symbolleiste anlegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Symbole integrieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kontextmenüs programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . Zellen-Kontextmenü erweitern . . . . . . . . . . . . . . . . . . . . . . . . . . Kontextmenübefehle entfernen. . . . . . . . . . . . . . . . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 20.1 20.2
Tag 21
489 491 494
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 19.1 19.2
Tag 20
Ganze Excel-Tabellen in ein Word-Dokument einfügen . . . . . . Word-Dokumente in einer Excel-Tabelle auflisten . . . . . . . . . . . Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Was ist ein Add-In? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Add-In planen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dokumentation aller Formeln und Verknüpfungen einer Arbeitsmappe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
538 538 539
Inhaltsverzeichnis
21.3 21.4
Dokumentation aller verwendeten Namen der aktiven Arbeitsmappe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dokumentation aller Kommentare einer Arbeitsmappe. . . . . . . Dokumentation aller Zellen mit Hyperlinks. . . . . . . . . . . . . . . . Dynamisches Anlegen eines Menüs . . . . . . . . . . . . . . . . . . . . . . Add-In erstellen und sichern . . . . . . . . . . . . . . . . . . . . . . . . . . . . Angabe der Dokumenteigenschaften . . . . . . . . . . . . . . . . . . . . . Quellcode schützen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Add-In erzeugen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Add-In einbinden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
540 541 542 543 545 545 546 547 547
Anhang A
Workshop-Lösungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Anhang B
Listingverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579 Stichwortverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
15
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. Mit Hilfe 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 haben viel mehr Zeit für andere Dinge zur Verfügung. 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 21 Kapitel gegliedert. Sie können es somit in drei Wochen durcharbeiten, wenn Sie sich jeden Tag ein Kapitel vornehmen. An den Kapitelende 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 Beispieldatei(en) öffnen und den Quellcode ansehen und testen. Sie brauchen daher nicht die einzelnen Listings abzutippen (wenngleich ich Ihnen das empfehle, weil dann der Lerneffekt höher ist). Am Ende des Buches werden Sie in der Lage sein, effektiv mit VBA-Makros umzugehen und eigene Lösungen zu entwickeln. Bei Nachfragen und allgemeinem Feedback zu meinem Buch erreichen Sie mich über meine Excel-Homepage http://held-Office.de oder über
[email protected]. So erreichen Sie gleichzeitig auch den Verlag. Besuchen Sie ruhig auch einmal das Excel-Diskussionsforum news:microsoft.public.de.excel oder das Excel Spotligt-Forum unter http://spotlight.de/zforen/mse/t/forum_ mse_1.html. Hier können Sie auf jeden Fall eine ganze Menge lernen. Nun aber viel Spaß beim Lesen und bei der Programmierung Ihrer Excel-Arbeitsmappen! – Bernd Held, MVP für Microsoft Excel
17
Tag 1
Die Entwicklungsplattform kennen lernen
21
Tag 2
Datentypen, Variablen und Konstanten
61
Tag 3
Die Sprachelemente von VBA
97
Tag 4
Auf Fehlersuche mit VBA
129
Tag 5
Einstellen und Anpassen der Excel-Anwendung
147
Tag 6
Auf Arbeitsmappen zugreifen – Datei-Operationen 171
Tag 7
Tabellenblätter programmieren
197
Tag 8
Zellenbearbeitung mit VBA
237
Tag 9
Aktionen und Benutzereingaben in Excel überwachen
309
Große Datenmengen in VBA behandeln und auswerten
327
Tag 11
Daten grafisch darstellen
349
Tag 12
Tastatur- und Zeitsteuerung in Excel
367
Tag 13
Tastatur- und Zeitsteuerung in Excel
367
Tag 14
Makros dynamisch erzeugen, importieren und exportieren über VBE-Programmierung
395
Tag 10
Tag 15
Funktionen einsetzen, um Excel zu automatisieren 419
Tag 16
Excel und das Internet
443
Tag 17
Excel und Datenbankzugriffe in Access
461
Tag 18
Excel und Word im Zusammenspiel
481
Tag 19
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
499
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
517
Erstellen von Add-Ins
537
Tag 20 Tag 21
W O C H E
W O C H E
W O C H E
Woche 1: Die wichtigsten Grundlagen 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. Am 2. Tag lernen Sie Datentypen, Variablen und Konstanten kennen. Dieser Tag wird etwas trockener, aber die Syntax der Sprache gehört eben dazu. Er bildet die Voraussetzung für den nächsten Tag. Der 3. 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. Am 4. Tag lernen Sie Fehler mithilfe des Editors aufzuspüren und zu beseitigen. Darüber hinaus erfahren Sie an diesem Tag, wie Sie Makros testen und schrittweise ausführen können. Am 5. Tag geht es um das Einstellen der Excel-Applikationen. So werden Sie lernen, wie Sie Excel individuell über den Einsatz von Makros konfigurieren können. Am 6. 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 letzten 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.
20
Die Entwicklungsplattform kennen lernen
1
Die Entwicklungsplattform 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
Der Projekt-Explorer
1.1
Der Projekt-Explorer
Auf der linken Seite sehen Sie den Projekt-Explorer. Er 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 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.xls 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 den beiden Add-Ins und der zentralen MakroArbeitsmappe Personl.xls eine weitere Arbeitsmappe Mappe2 angezeigt wird. Wenn Sie über das Plussymbol die einzelnen Elemente dieser Arbeitsmappe aufklappen, erscheinen die in der Mappe enthaltenen 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.
1.2
Das Eigenschaften-Fenster
Über das Menü ANSICHT und den Befehl EIGENSCHAFTEN können Sie das EigenschaftenFenster anzeigen, sofern es nicht bereits eingeblendet ist. Alternativ können Sie auch die Taste (F4) drücken, um dieses Fenster einzublenden.
23
Die Entwicklungsplattform kennen lernen
Abbildung 1.2: Das EigenschaftenFenster
Mithilfe dieses Fensters können Sie bestimmte Eigenschaften der im Projekt-Explorer markierten Objekte näher bestimmen. In diesem Beispiel ist im Projekt-Explorer der Eintrag Tabelle1 (Tabelle1) markiert. Im 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 ersten Teil des Namens anzupassen, können Sie den Mauszeiger im Eigenschaften-Fenster rechts neben die Rubrik (Name) setzen und den gewünschten Namen der Tabelle 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.
24
Das Eigenschaften-Fenster
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 nicht über das Menü FORMAT und den Befehl BLATT/EINBLENDEN wieder verfügbar machen. Wenn Sie sich für die sichere Variante, eine Tabelle auszublenden, 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 markieren und im EigenschaftenFenster unter der Rubrik Visible die Konstante -1 – xlVisible einstellen.
Abbildung 1.3: Die mit xlSheetVeryHidden ausgeblendete Tabelle1 kann über die normale Oberfläche von Excel nicht mehr eingeblendet werden.
25
Die Entwicklungsplattform kennen lernen
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 Tabelle2. 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.
Abbildung 1.4: Spalten gespiegelt – etwas anders als gewohnt
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 256 Spalten und 65536 Zeilen. Möchten Sie den Zugriff 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: 1. Markieren Sie im Projekt-Explorer den Eintrag Tabelle3. 2. Setzen Sie den Mauszeiger im Eigenschaften-Fenster rechts neben die Rubrik ScrollArea. 3. Erfassen Sie die Formel =A1:D50 und drücken Sie danach die Tabulator-Taste (ÿ).
26
Das Code-Fenster
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.
Leider bleibt diese Einstellung nicht dauerhaft bestehen. Sie müssen diese Einstellung nach jedem Öffnen der Arbeitsmappe neu vornehmen. Wie Sie diese Einstellung jedoch über einen Trick dauerhaft vornehmen, erfahren Sie am 10. 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 Makros einstellen. Dazu erfassen Sie den benötigten Code im Code-Fenster. Damit dieses Fenster angezeigt wird, fügen Sie zunächst ein noch leeres Modul ein. Dabei 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.
27
Die Entwicklungsplattform kennen lernen
Mit allen gerade beschriebenen Varianten wird das Code-Fenster angezeigt.
Abbildung 1.6: Das Code-Fenster wird angezeigt.
Makros erfassen und starten Nachdem Sie das Code-Fenster eingeblendet haben, können Sie darangehen, Ihr erstes Makro einzugeben. Jedes Makro beginnt in VBA mit der Anweisung Sub. Danach 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 (¢). Das Makro wird jetzt um die Anweisung End Sub ergänzt. Sub DasErsteMakro() End Sub
28
Das Code-Fenster
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 Application.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 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.
쐽
Wechseln Sie auf Ihre Excel-Arbeitsoberfläche und wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/MAKROS. Im nun angezeigten Dialogfeld wählen Sie das Makro aus und klicken auf die Schaltfläche 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. Der angezeigte Name kann übrigens im Menü EXTRAS und dem Befehl OPTIONEN auf der Registerkarte ALLGEMEIN im Feld BENUTZERNAMEN eingestellt werden.
Abbildung 1.7: Das erste Makro gibt den Anwendernamen auf dem Bildschirm aus.
29
Die Entwicklungsplattform kennen lernen
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: " & _ Application.UserName End Sub
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
Mehrzeilige Meldungen anzeigen Immer wieder gefragt sind auch mehrzeilige Meldungsfenster. Im folgenden Beispiel werden in einem Meldungsfenster mehrere Informationen angezeigt. Sub DasDritteMakro() MsgBox "Name: " & Application.UserName & Chr(13) & _ "Datum: " & Date & Chr(13) & _ "Uhrzeit: " & Time & Uhr" End Sub
30
Der Makrorekorder
Mithilfe der Anweisung Chr(13) 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: Mehrzeilige Meldungsfenster anzeigen
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 Code-Fenster 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:
31
Die Entwicklungsplattform kennen lernen
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. Wählen Sie in Excel aus dem Menü EXTRAS den Befehl 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. 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.xls 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.
32
Der Makrorekorder
7. Wählen Sie nun aus dem Menü EXTRAS den Befehl OPTIONEN. 8. Wechseln Sie im Dialogfeld OPTIONEN auf die Registerkarte ANSICHT. 9. Deaktivieren Sie das Kontrollkästchen GITTERNETZLINIEN. 10. Bestätigen Sie Ihre Aktion mit OK. 11. Beenden Sie die Aufzeichnung des Makrorekorders, indem Sie in der angezeigten kleinen Symbolleiste das Symbol AUFZEICHNUNG BEENDEN klicken.
Abbildung 1.11: Die Gitternetzlinien wurden ausgeblendet.
Kontrollieren Sie nun das Resultat der Aufzeichnung, indem Sie über die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung wechseln.
Abbildung 1.12: Der erste selbst aufgezeichnete Code
33
Die Entwicklungsplattform kennen lernen
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.
Einheitliches Gestalten der Kopf- und Fußzeile Für den Gebrauch des Makrorekorders werden Sie im zweiten Beispiel die Kopf- und Fußzeilen mit Informationen bestücken. Dabei sollen folgende Informationen erfasst werden: 쐽
Kopfzeile links: Autor der Tabelle
쐽
Kopfzeile Mitte: Titel der Tabelle
쐽
Kopfzeile rechts: Datum
쐽
Fußzeile links: Name der Arbeitsmappe und Tabellenblattname
쐽
Fußzeile Mitte: Firmenname
쐽
Fußzeile rechts: Seitennummerierung
Befolgen Sie nun die nächsten Arbeitsschritte, um das Makro aufzuzeichnen: 1. Wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/AUFZEICHNEN. 2. Geben Sie dem Makro einen Namen und wählen Sie als Speicherort den Eintrag DIESE ARBEITSMAPPE. 3. Starten Sie die Aufzeichnung mit OK. 4. Wählen Sie aus dem Menü DATEI den Befehl SEITE EINRICHTEN. 5. Wechseln Sie im Dialogfeld SEITE EINRICHTEN auf die Registerkarte KOPFZEILE/ FUSSZEILE. 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: 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: 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.
34
Der Makrorekorder
Abbildung 1.13: Die benutzerdefinierte Kopfzeile
Abbildung 1.14: Die benutzerdefinierte Fußzeile
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 KopfUndFuß() ' ' KopfUndFuß Makro ' Makro am 24.08.2002 von Bernd Held aufgezeichnet ' ' With ActiveSheet.PageSetup .PrintTitleRows = "" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup .LeftHeader = "Held" .CenterHeader = "Kosten und Leistung" .RightHeader = "&D" .LeftFooter = "&F / &A" .CenterFooter = "Held-Office"
35
Die Entwicklungsplattform kennen lernen
.RightFooter = "&P von &N" .LeftMargin = Application.InchesToPoints(0.787401575) .RightMargin = Application.InchesToPoints(0.787401575) .TopMargin = Application.InchesToPoints(0.984251969) .BottomMargin = Application.InchesToPoints(0.984251969) .HeaderMargin = Application.InchesToPoints(0.4921259845) .FooterMargin = Application.InchesToPoints(0.4921259845) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .PrintQuality = -3 .CenterHorizontally = False .CenterVertically = False .Orientation = xlPortrait .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = 100 .PrintErrors = xlPrintErrorsDisplayed End With End Sub
Wie Sie sehen, hat der Makrorekorder hier auch Dinge aufgezeichnet, die Sie gar nicht unbedingt brauchen. Dies ist nicht ungewöhnlich für den Makrorekorder. Er beschreibt einfach das, was er sieht. Dabei werden sämtliche Einstellungen des 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 KopfUndFuß() ' ' KopfUndFuß Makro ' Makro am 24.08.2002 von Bernd Held aufgezeichnet 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
36
Der Makrorekorder
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() ' ' KopfUndFuß Makro ' Makro am 24.08.2002 von Bernd Held aufgezeichnet ActiveSheet.PageSetup.PrintArea = "" ActiveSheet.PageSetup.LeftHeader = "Held" ActiveSheet.PageSetup.CenterHeader = "Kosten und Leistung" ActiveSheet.PageSetup.RightHeader = "&D" ActiveSheet.PageSetup.LeftFooter = "&F / &A" ActiveSheet.PageSetup.CenterFooter = "Held-Office" ActiveSheet.PageSetup.RightFooter = "&P von &N" End Sub
Abbildung 1.15: Die Fußzeile wurde per Makro erstellt.
37
Die Entwicklungsplattform kennen lernen
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 wählen Sie aus dem Menü DATEI den Befehl SEITENANSICHT.
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 das Symbol OBJEKTKATALOG.
Abbildung 1.16: Der Objektkatalog gibt Auskunft über die VBA-Syntax.
38
Der Objektkatalog
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. 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 ExcelArbeitsmappen interessant ist. Wenden Sie diese Funktion einmal an, indem Sie folgenden Quellcode erfassen:
39
Die Entwicklungsplattform kennen lernen
Listing 1.4: Das letzte Änderungsdatum einer Mappe ausgeben Sub LetztesÄnderungdatumAusgeben() MsgBox FileDateTime(ActiveWorkbook.FullName) End Sub
Die Funktion FileDateTime benötigt als Information den Namen sowie den 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. 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ÄnderungdatumAusgeben02() MsgBox FileDateTime("C:\Eigene Dateien\Mappe1.xls") End Sub
Abbildung 1.17: Das letzte Änderungsdatum einer Datei ermitteln
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 i As Integer i = Month(Date)
40
Die Online-Hilfe
MsgBox "Heute ist der " & Date & Chr(13) & _ "Wir sind momentan im Monat " & MonthName(i) 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. 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.18: 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 Online-Hilfe 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.
41
Die Entwicklungsplattform kennen lernen
Abbildung 1.19: Die Online-Hilfe von Excel
In der Online-Hilfe können Sie einige Hyperlinks finden: 쐽
Über den Hyperlink SIEHE AUCH finden Sie verwandte Befehle, die Sie somit schnell einsehen können.
쐽
Der Hyperlink BETRIFFT gibt Auskunft darüber, auf welches übergeordnete Objekt sich der Befehl bezieht. So bezieht sich die Eigenschaft LeftHeader auf das Objekt PageSetup.
쐽
Über den Hyperlink BEISPIELE wird Ihnen aufgezeigt, wie Sie den Befehl einsetzen können.
쐽
Hyperlinks im Text führen zu weiteren verwandten Themen, die Sie so schnell aufrufen können.
Die 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. 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ü.
Verfügbare Objekte ansehen Um alle verfügbaren Objekte in Excel in einer übersichtlichen Form anzuzeigen, wechseln Sie in der Online-Hilfe auf die Registerkarte INHALT, klappen die Rubrik MICROSOFT EXCEL VISUAL BASIC-REFERENZ auf und klicken den Eintrag MICROSOFT EXCELOBJEKTE an.
42
Die Online-Hilfe
Abbildung 1.20: Alle Excel-Objekte auf einen Blick
Befehle suchen Sind Sie auf der Suche nach einem bestimmten Befehl bzw. nach einer Funktion, dann rufen Sie die Online-Hilfe auf, indem Sie in der Online-Hilfe auf die Registerkarte INDEX wechseln. Geben Sie dort die gewünschte Aktion ein, die Sie ausführen möchten.
Arbeitsmappe speichern Im folgenden Beispiel möchten Sie eine Arbeitsmappe speichern und suchen daher nach dem dazu notwendigen VBA-Befehl. Geben Sie daher im Feld SCHLÜSSELWÖRTER EINGEBEN das Wort speichern ein.
Abbildung 1.21: VBA-Befehle suchen
43
Die Entwicklungsplattform kennen lernen
Im Listenfeld THEMA AUSWÄHLEN finden Sie eine ganze Reihe von Vorgängen, bei denen der gesuchte Vorgang mittelbar bzw. unmittelbar eine Rolle spielt. Aktivieren Sie den Eintrag Save-Methode und sehen Sie sich das Ergebnis auf der rechten Seite des Bildschirms an. Auch hier kann das Beispiel wieder in eigene Makros übernommen werden.
1.7
Weitere praktische Helfer in der Entwicklungsumgebung
In der Entwicklungsumgebung befinden sich einige interessante Features, die Sie bei der Programmierung gut gebrauchen 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. Abbildung 1.22: 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.
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 mittendrin: 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.
44
Weitere praktische Helfer in der Entwicklungsumgebung
Abbildung 1.23: Alle Methoden und Eigenschaften für das Objekt Application
Abbildung 1.24: Konstanten für die Schaltflächen anzeigen
45
Die Entwicklungsplattform kennen lernen
Selbstverständlich können Sie auch mehrere Schaltflächen kombinieren. Das komplette Makro zum Anzeigen einer Warnmeldung mit den Symbolen KRITISCH sowie einer OKSchaltfläche lautet: Listing 1.7: Eine benutzerdefinierte Meldung anzeigen Sub Warnmeldunganzeigen() MsgBox "Achtung", vbCritical + vbOKOnly, "Warnung" End Sub
Abbildung 1.25: 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 das Symbol QUICKINFO auf der Symbolleiste BEARBEITEN.
Abbildung 1.26: Die komplette Syntax wird angezeigt.
46
Weitere praktische Helfer in der Entwicklungsumgebung
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 danach auf das Symbol GANZES WORT oder drücken Sie die Tastenkombination (Strg) + (____). 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 und 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.
Abbildung 1.27: Einzug vergrößern nach rechts
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.
47
Die Entwicklungsplattform kennen lernen
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.28: Haltepunkt setzen
Das Makro läuft nun bis zu der Zeile mit dem gesetzten Haltepunkt und unterbricht es. 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 nochmals 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.
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 set-
48
Weitere praktische Helfer in der Entwicklungsumgebung
zen 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.29: 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 KopfUndFuß() '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ' Name: KopfUndFuß ' Datum: 24.08.2002 ' Autor: Bernd Held ' Dieses Makro stellt die Kopf- und Fußzeile in einer ' Tabelle zusammen. '-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ With ActiveSheet.PageSetup .LeftHeader = "Held" .CenterHeader = "Kosten und Leistung"
49
Die Entwicklungsplattform kennen lernen
.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.30: Lesezeichen setzen
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:
50
Weitere praktische Helfer in der Entwicklungsumgebung
쐽
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.31: 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.
Abbildung 1.32: Befehle suchen und ersetzen
Die Anweisung Chr(13) und die Konstante vbCr bewirken dieselbe Aktion. Es wird bei beiden Anweisungen eine neue Zeile begonnen. Gerade bei mehrzeiligen Meldungsfenstern kommen diese beiden Möglichkeiten oft zum Einsatz.
51
Die Entwicklungsplattform kennen lernen
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 Stunden lang 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. 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
Tabelle 1.1: Die wichtigsten Tastenkombinationen
52
Weitere praktische Helfer in der Entwicklungsumgebung
Tastenkombination
Beschreibung
(F3)
Weitersuchen
(ª) + (F3)
Vorheriges suchen
(Strg) + (¼)
Nächste Prozedur
(Strg) + (½)
Vorherige Prozedur
(ª) + (F2)
Definition anzeigen
(Strg) + (Bild_¼)
Einen Bildschirm nach unten
(Strg) + (Bild_½)
Einen Bildschirm nach oben
(Strg) + (ª) + (F2)
Zur letzten Position wechseln
(Strg) + (Pos1)
Anfang des Moduls
(Strg) + (Ende)
Ende des Moduls
(Strg) + (Æ)
Ein Wort nach rechts
(Strg) + (æ)
Ein Wort nach links
(Ende)
Zum Zeilenende wechseln
(Pos1)
Zum Zeilenanfang wechseln
(Strg) + (Z)
Letzten Befehl rückgängig machen
(Strg) + (C)
Code kopieren
(Strg) + (X)
Code ausschneiden
(Strg) + (V)
Code einfügen
(Strg) + (Y)
Aktuelle Zeile löschen
(Strg) + (Entf)
Bis zum Wortende löschen
(ÿ]
Einzug vergrößern
(ª) + (ÿ]
Einzug verkleinern
(Strg) + (ª) + (F9)
Alle Haltepunkte löschen
(ª) + (F10)
Kontextmenü anzeigen
Tabelle 1.1: Die wichtigsten Tastenkombinationen (Forts.)
53
Die Entwicklungsplattform kennen lernen
Tastenkombination
Beschreibung
(Strg) + (P)
Modul drucken
(Strg) + (E)
Modul/Formular exportieren
(Strg) + (S)
Modul speichern
Tabelle 1.1: Die wichtigsten Tastenkombinationen (Forts.)
1.8
Entwicklungsumgebung einstellen
In der Entwicklungsumgebung von Excel haben Sie die Möglichkeit, den Visual BasicEditor nach Ihren eigenen Wünschen anzupassen. Dazu wählen Sie in der Entwicklungsumgebung aus dem Menü EXTRAS den Befehl OPTIONEN.
Abbildung 1.33: Editor einstellen
Editoreinstellungen anpassen Im Gruppenfeld CODE-EINSTELLUNGEN finden Sie die folgenden Einstellungsmöglichkeiten: 쐽
54
AUTOMATISCHE SYNTAXÜBERPRÜFUNG: Mit dieser Einstellung sorgen Sie dafür, dass Ihr Editor nach der Eingabe einer Codezeile automatisch eine Syntaxprüfung vornimmt.
Entwicklungsumgebung einstellen
쐽
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.
쐽
AUTOMATISCHE DATEN-TIPPS: Diese Option ist lediglich im Haltemodus verfügbar und zeigt die 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 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. 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.
55
Die Entwicklungsplattform kennen lernen
Abbildung 1.34: Das Editierformat festlegen
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.35: Allgemeine Einstellungen vornehmen
56
Entwicklungsumgebung einstellen
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. 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 BasicEntwicklungsumgebung 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.
57
Die Entwicklungsplattform kennen lernen
Fenster verankern Auf der Registerkarte VERANKERN legen Sie fest, welche Fenster verankerbar sein sollen.
Abbildung 1.36: Fenster verankern
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.
1.9
Workshop
1.9.1 Fragen & Antworten F
Wie können Sie einen Befehl in der nächsten Zeile fortsetzen, ohne dass der Editor meckert? A
58
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 empfiehlt es sich, dem Editor über ein Trennzeichen mitzuteilen, dass der Befehl in der nächsten Zeile weitergehen soll.
Workshop
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 (____) und geben anschließend das Zeichen _ ein. Damit weiß der Editor, dass der Befehl in der nächsten Zeile fortgesetzt werden muss. F
Wie können Sie mehrere Befehle in eine einzige Zeile packen? A
Wenn Sie möchten, können Sie auch mehrere kleinere Befehle in einer einzigen Zeile darstellen. Dazu verwenden Sie den Doppelpunkt als Trennzeichen zwischen den einzelnen Befehlen.
1.9.2 Quiz 1. Wie rufen Sie die Entwicklungsumgebung auf? 2. Woher holt sich die Funktion Date das aktuelle Tagesdatum? 3. Wie kann man schnell komplette Code-Blöcke auskommentieren? 4. Welchen Befehl kann man alternativ für die Anweisung Chr(13) verwenden?
1.9.3 Übung Zum Abschluss dieses Tages 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.37: Die Ausgangssituation
59
Die Entwicklungsplattform kennen lernen
Die Demodatei Einstieg.xls finden Sie auf der CD-ROM im Verzeichnis Kap01. Die Lösung finden Sie im Anhang.
60
Datentypen, Variablen und Konstanten
2
Datentypen, Variablen und Konstanten
Am gestrigen Tag 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 heute: 쐽
Was sind Variablen?
쐽
Variablen deklarieren
쐽
Variablendeklaration erzwingen
쐽
Vorsicht, Falle
쐽
Variablentypen kennen lernen
쐽
Objektvariablen einsetzen
쐽
Konstanten einsetzen
쐽
Konstanten für die Datumsformatierung
2.1
Was sind Variablen?
Bevor Sie die einzelnen Variablen kennen lernen, soll ganz bewusst zu Anfang dieses Kapitels 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
62
Variablen deklarieren
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.
2.2
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. 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.
63
Datentypen, Variablen und Konstanten
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: 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 2.1: Die Datentypen für die Programmierung
Anbei ein paar typische korrekte Deklarationen von Variablen: 쐽
Dim MwSt as Single
쐽
Dim KalenderWoche as Integer
쐽
Dim Meldung as String
쐽
Dim Gehalt as Currency
64
Variablendeklaration erzwingen
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: Ausführlich
Kurzform
Dim Zähler as Integer
Dim Z%
Dim ZählerGroß as Long
Dim ZzGr&
Dim Betrag as Currency
Dim Bg@
Dim Meldung as String
Dim Meld$
Tabelle 2.2: 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.
2.3
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 aber bewirkt diese Einstellung 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
65
Datentypen, Variablen und Konstanten
Abbildung 2.1: Die Deklaration von Variablen erzwingen
wurden, kann kein Makro laufen. Ist eine Variable dem Editor unbekannt, meldet der Editor es Ihnen.
Abbildung 2.2: 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 die Variable und starten das Makro erneut.
66
Vorsicht, Falle
2.4
Vorsicht, Falle
Bei der Deklaration von Variablen gibt es einige wichtige Dinge zu beachten. Oft werden Variablen in folgender Form deklariert: Dim i, i2, i3 As Long
Dazu ist zu sagen, dass lediglich die erste Variable dem Typ Long zugeordnet wird. Alle anderen Variablen bekommen den Datentyp Variant. Wenn Sie einen Blick in die letzte Tabelle werfen, werden Sie erkennen, dass der Datentyp Variant 16 Byte 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 i As Long
왘
Dim i2 As Long
왘
Dim i3 As Long
oder 왘
Dim i As Long, i2 As Long, i3 As Long
Einen weiteren Vorteil der Deklaration von Variablen 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. 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.
67
Datentypen, Variablen und Konstanten
2.5
Variablentypen kennen lernen
In Excel haben Sie neben den lokalen und globalen Variablen weitere Möglichkeiten, um Variablen zu deklarieren.
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 Kap02 unter dem Namen Syntax.xls.
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 2.1: Variableninhalt bleibt nach Makroende erhalten Sub VariablenInhaltBleibtBestehen() Static Aufrufe As Long Aufrufe = Aufrufe + 1 MsgBox "Makro wurde " & Aufrufe & " 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 2.3: 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
68
Variablentypen kennen lernen
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 2.4: Der Einsatz einer öffentlichen Variablen
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.
69
Datentypen, Variablen und Konstanten
Abbildung 2.5: Kennwort verwalten
Deklarieren Sie zu Beginn im Modulblatt MODUL3 eine private Variable mit dem Namen Passw. 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 Passw zuzugreifen.
2.6
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. Alternativ dazu können Sie einfach mal mit der Deklaration einer Objektvariablen beginnen, indem Sie beispielsweise die Anweisung Dim Test As eingeben und dann die (____)-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
Objektvariablen einsetzen
Abbildung 2.6: Den Objektkatalog zur Hilfe einsetzen
Abbildung 2.7: Das Kontextmenü bietet Ihnen alle zur Verfügung stehenden Objekte an.
Den Office-Assistenten aufrufen Im folgenden Beispiel werden Sie den Office-Assistenten aufrufen und ein paar Sätze »sprechen« lassen. Dazu ist folgendes Makro notwendig:
71
Datentypen, Variablen und Konstanten
Listing 2.2: Den Office-Assistenten aufrufen und animieren Sub OfficeAssistentenAufrufen() Dim OffAss As Balloon Set OffAss = Assistant.NewBalloon With OffAss .Heading = "Office-Assistent" .Icon = msoIconTip .Mode = msoModeAutoDown .BalloonType = msoBalloonTypeButtons .Labels(1).Text = "Tag 1: Die Entwicklungsplattform" .Labels(2).Text = "Tag 2: Variablen und Konstanten" .Labels(3).Text = "Tag 3: VBA-Sprachelemente" .Animation = msoAnimationGreeting .Button = msoButtonSetOK .Show End With Set OffAss = Nothing End Sub
Wenn Sie eine Objektvariable deklarieren, wird Platz im Speicher reserviert, der Wert der Objektvariablen wird aber auf Nothing gesetzt, bis Sie ihr mit der Set-Anweisung einen Objektverweis zuweisen. Vergessen Sie nicht den Speicher am Ende über die Anweisung Set OffAss = Nothing wieder freizugeben.
Abbildung 2.8: Den Office-Assistenten über das Objekt Balloon aufrufen
72
Objektvariablen einsetzen
Schaltfläche einfügen Im nächsten Beispiel soll in eine Tabelle eine neue Schaltfläche an eine bestimmte 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 2.3: Eine Schaltfläche einfügen Sub SchaltflächeIntegrieren() Dim Schaltfläche As Button Set Schaltfläche = _ ActiveSheet.Buttons.Add(10, 20, 100, 50) With Schaltfläche .Caption = "Anwendung beenden" .OnAction = "ExcelBeenden" End With Set Schaltfläche = Nothing End Sub
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.
73
Datentypen, Variablen und Konstanten
Abbildung 2.9: Automatisch eine Schaltfläche einfügen
Was nun noch fehlt, ist das Makro ExcelBeenden, welches Sie bei der Eigenschaft OnAction angegeben haben. Listing 2.4: 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:
74
Objektvariablen einsetzen
Abbildung 2.10: Die Ausgangsbasis: eine Datentabelle und ein integriertes Diagramm
Ihre Aufgabe besteht nun darin, dieses Diagramm in einer separaten Grafikdatei zu speichern. Erfassen Sie zu diesem Zweck das folgende Makro: Listing 2.5: Ein eingebettetes Diagramm exportieren Sub DiagrammExportieren() Dim Diagramm As Chart Set Diagramm = _ Sheets("Tabelle3").ChartObjects(1).Chart Diagramm.Export _ Filename:="c:\Eigene Dateien\Diagramm.gif", _ FilterName:="GIF" Set Diagramm = Nothing End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Chart. Geben Sie mithilfe der Anweisung Set bekannt, wo sich das integrierte Diagramm befindet. Über das Auflistungsobjekt Sheets geben Sie den Namen der Tabelle exakt an. 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.
75
Datentypen, Variablen und Konstanten
Abbildung 2.11: Das Diagramm wurde in eine Grafikdatei exportiert
Wenden Sie im Anschluss daran die Methode Export an und geben dabei den Namen der zu erzeugenden Exportdatei inklusive des Verzeichnisses an. Im Argument FilterName geben Sie über die Endung der Grafikdatei das 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«.
Menüleiste ein- und ausblenden Die Menüleiste wird wie alle Symbolleisten und Kontextmenüs über das Objekt CommandBars angesprochen. Jede Leiste kann in Excel beispielsweise über einen eindeutigen Index angesprochen werden. Die Arbeitsblatt-Menüleiste hat den Index 1. Blenden Sie jetzt die Arbeitsblatt-Menüleiste aus, indem Sie das folgende Makro starten:
76
Objektvariablen einsetzen
Listing 2.6: Die Arbeitsblatt-Menüleiste ausblenden Sub ArbeitsplatzmenüLeisteAusblenden() Dim Leiste As CommandBar Set Leiste = Application.CommandBars(1) 'oder 'Set Leiste = Application.CommandBars("Worksheet Menu Bar") Leiste.Enabled = False Set Leiste = Nothing End Sub
Deklarieren Sie zuerst eine Objektvariable vom Typ CommandBar. Damit können Sie alle Menü- und Symbolleisten in Excel identifizieren und ansprechen. Geben Sie über die Anweisung Set bekannt, auf welche Menüleiste Sie zugreifen möchten. Wie schon gesagt, können Sie die Arbeitsblatt-Menüleiste über den eindeutigen Index 1 ansprechen. Möglich wäre auch folgende Zeile: Set Leiste = Application.CommandBars("Worksheet Menu Bar")
Setzen Sie die Eigenschaft Enabled auf den Wert False, um die Menüleiste auszublenden. Heben Sie danach den Objektverweis auf, indem Sie das Objekt mit dem Schlüsselwort Nothing bestücken.
Abbildung 2.12: Die Arbeitsblatt-Menüleiste wurde ausgeblendet.
Blenden Sie nun die Arbeitsblatt-Menüleiste ein, indem Sie folgendes Makro einsetzen: Listing 2.7: Die Arbeitsblatt-Menüleiste wieder einblenden Sub ArbeitsplatzmenüLeisteEinblenden() Dim Leiste As CommandBar Set Leiste = Application.CommandBars(1)
77
Datentypen, Variablen und Konstanten
'oder 'Set Leiste = Application.CommandBars("Worksheet Menu Bar") Leiste.Enabled = True Set Leiste = Nothing End Sub
Textdatei als Symbol einfügen In der folgenden Aufgabe kommen Sie mit dem Objekt OLEObject in Berührung. Unter einem OLEObject versteht man Steuerelemente oder auch eingebettete Objekte wie Grafiken. Erstellen Sie als kleine Vorarbeit eine Textdatei mithilfe des Editors des Windows-Zubehörs und geben Sie ein paar beliebige Daten ein. Speichern Sie diese Datei im Verzeichnis C:\Eigene Dateien\ unter dem Namen Beispiel.txt. Ihre Aufgabe besteht nun darin, diese Textdatei in eine Excel-Tabelle als Symbol einzufügen. Der Quellcode für diese Aufgabenstellung lautet: Listing 2.8: Textdatei als Symbol in eine Tabelle einfügen Sub TextDateiAlsSymbolEinfügen() Dim TextDatei As OLEObject Sheets("Tabelle2").Activate Set TextDatei = ActiveSheet.OLEObjects.Add( _ Filename:="c:\Eigene Dateien\Beispiel.txt", _ Link:=True, DisplayAsIcon:=True) Set TextDatei = Nothing End Sub
Definieren Sie eine Objektvariable vom Typ OLEObject. Wechseln Sie jetzt in die 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.
78
Objektvariablen einsetzen
Abbildung 2.13: 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: Listing 2.9: Eine Grafik wird in die Tabelle eingefügt Sub BildEinfügen() Dim Pic As Picture Sheets("Tabelle4").Activate Range("B3").Select Set Pic = ActiveSheet.Pictures.Insert _ ("c:\Windows\winlogo.gif") ActiveWindow.DisplayGridlines = False Set Pic = Nothing End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Picture. Danach wechseln Sie auf das gewünschte Tabellenblatt und selektieren die Zielzelle. Geben Sie danach über die Anweisung Set bekannt, dass die Grafik in die aktive Tabelle, nämlich die gerade aktivierte 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.
79
Datentypen, Variablen und Konstanten
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 2.14: Bild in Tabelle einfügen
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 2.10: 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 & " " & _
80
Objektvariablen einsetzen
Application.UserName .ActiveDocument.SaveAs "Test.doc" .Quit End With Set wdObjekt = Nothing End Sub
Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Object. Danach erstellen Sie mithilfe der Funktion CreateObject einen Verweis auf Ihre Word-Applikation. Die WordSitzung 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 aktuelle Datum über die Standardfunktion Date sowie den Benutzernamen des aktuellen Anwenders mithilfe der Eigenschaft Username hinzu.
Abbildung 2.15: 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 Word-Sitzung wieder beenden. Vergessen Sie nicht, den Objektverweis über die Anweisung Set WdObjekt = Nothing wieder aufzuheben.
81
Datentypen, Variablen und Konstanten
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.
Abbildung 2.16: Der Text aus A1 soll ohne Kopieraktion in die Zwischenablage
Der Quellcode sieht wie folgt aus: Listing 2.11: Den Inhalt einer Variablen in die Zwischenablage bringen Dim ZwischenAblage As DataObject Sub TextInZwischenablageEinfügen() Dim Text As String Set ZwischenAblage = New DataObject Text = Sheets("Tabelle5").Range("A1").Value With ZwischenAblage .SetText Text .PutInClipboard End With Set Zwischenablage = Nothing End Sub
Deklarieren Sie zuerst 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
82
Objektvariablen einsetzen
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 2.12: Den Inhalt der Zwischenablage in einer Zelle ausgeben Sub InhaltZwischenablageErmitteln() Set Zwischenablage = New DataObject Zwischenablage.GetFromClipboard Range("B3").Value = Zwischenablage.GetText Set Zwischenablage = Nothing End Sub
Über die Methode GetFromClipBoard 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 2.11 und gleich im Anschluss das Makro aus Listing 2.12 starten.
Abbildung 2.17: Zwischenablage füllen und abfragen
83
Datentypen, Variablen und Konstanten
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 aus dem Menü EXTRAS den Befehl ADD-INS auswählen.
Abbildung 2.18: Der Add-Ins-Manager von Excel
Im Add-Ins-Manager sind alle Add-Ins verzeichnet, die Excel anbietet. Sehen Sie sich die Namen der einzelnen Add-Ins an. Ihre Aufgabe besteht darin, das Add-In ANALYSE-FUNKTIONEN per VBA-Code einzubinden. Deaktivieren Sie also zu Testzwecken dieses Add-In und bestätigen Ihre Einstellung mit OK. Etwa in der Mitte des Listenfelds sehen Sie sogar ein eigenes Add-In (MACHERO’S ADD-IN- SAMMLUNG), welches ich für mein erstes Excel-VBAKompendium programmiert habe. Sie werden am 21. Tag ebenfalls Ihr eigenes Add-In programmieren. Erfassen Sie nun folgendes Makro, um das Add-In ANALYSE-FUNKTIONEN einzubinden.
84
Objektvariablen einsetzen
Listing 2.13: 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
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 die Symbolleiste ZEICHNEN 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 2.14: Zeichenobjekt über Zellenbereich legen Sub ZeichenObjektEinfügen() Dim Bereich As Range Set Bereich = Range("B5:F10")
85
Datentypen, Variablen und Konstanten
ActiveSheet.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 Range-Objekt 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. 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 2.19: 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 2.15: AutoForm aus Tabelle entfernen Sub ZeichenObjektEntfernen() Dim Rechteck As Shape Set Rechteck = Sheets("Tabelle1").Shapes(1) Rechteck.Delete Set Rechteck = Nothing End Sub
86
Konstanten einsetzen
Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Shape. Darunter fallen alle Objekte in der Zeichnungsebene, z.B. AutoFormen, Freihandobjekte, OLE-Objekte oder ein ganz normales Bild. Geben Sie über die Anweisung Set genau an, wo sich das ShapeObjekt befindet. Das Shape-Objekt mit dem Index 1 ist das 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.
2.7
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.16 EndDatum = #1/1/2002#
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 Speicher sparender: Const Const Const Const Const Const Const
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.16 EndDatum as Date = #1/1/2002#
87
Datentypen, Variablen und Konstanten
2.8
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 FormatDatTime 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 2.3: Die Datumskonstanten für die Formatierung
Im folgenden Beispiel wird das aktuelle Tagesdatum bzw. die momentane Uhrzeit auf verschiedene Arten ausgegeben.
88
Konstanten für die Datumsfomatierung
Listing 2.16: 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. Vergessen Sie dabei nicht den Verkettungsoperator.
Abbildung 2.20: 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: Einstellung
Beschreibung
yyyy
Jahr
q
Quartal
Tabelle 2.4: Die Intervall-Konstanten der Funktion DatePart
89
Datentypen, Variablen und Konstanten
Einstellung
Beschreibung
m
Monat
y
Tag des Jahres
d
Tag
w
Wochentag
ww
Woche
h
Stunde
n
Minute
s
Sekunde
Tabelle 2.4: Die Intervall-Konstanten der Funktion DatePart (Forts.)
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
vbTuesday
3
Dienstag
vbWednesday
4
Mittwoch
vbThursday
5
Donnerstag
vbFriday
6
Freitag
vbSaturday
7
Samstag
Tabelle 2.5: Die FirstDayOfWeek-Konstanten der Funktion DatePart
90
Konstanten für die Datumsfomatierung
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 2.6: 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 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 nachfolgenden Tabelle: Konstante
Wert
Beschreibung
VbUseSystem
0
Die NLS API-Einstellung wird verwendet
VbSunday
1
Sonntag (Voreinstellung)
VbMonday
2
Montag
vbTuesday
3
Dienstag
Tabelle 2.7: Die FirstDayOfWeek-Konstanten der Funktion DatePart
91
Datentypen, Variablen und Konstanten
Konstante
Wert
Beschreibung
vbWednesday
4
Mittwoch
vbThursday
5
Donnerstag
vbFriday
6
Freitag
vbSaturday
7
Samstag
Tabelle 2.7: Die FirstDayOfWeek-Konstanten der Funktion DatePart (Forts.)
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 Entscheidungen 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 2.8: Die FirstWeekOfYear-Konstanten der Funktion DatePart
Ermitteln Sie nun zur Übung das Quartal des aktuellen Datums! Die Lösung dieser Aufgabenstellung können Sie im nachfolgenden Listing sehen: Listing 2.17: Das Quartal des aktuellen Tagesdatums ermitteln Sub QuartalErmitteln() MsgBox "Das Datum von heute lautet: " & Date & Chr(13) & _ "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.
92
Konstanten für die Datumsfomatierung
Abbildung 2.21: Ende August gehört dem dritten Quartal an.
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 2.7 ermitteln können. In der nächsten Aufgabe soll anhand des aktuellen Tagesdatums der dazugehörige Wochentag herausgefunden werden. Das Lösungsmakro können Sie im folgenden Listing betrachten: Listing 2.18: Den aktuellen Wochentag bestimmen Sub WochentagErmitteln() MsgBox "Heute ist der " & Date & Chr(13) & _ "Dieses Datum entspricht einem " & Chr(13) & _ WeekdayName(Weekday(Date, vbUseSystemDayOfWeek), False) End Sub
Klar, Sie werden jetzt vielleicht sagen: »Den Wochentag des aktuellen Tagesdatums zu ermitteln. Da brauch ich ja wohl kein Makro!« Recht haben Sie! Aber wie ist es, wenn die Aufgabenstellung lautet: Welcher Tag ist in X Tagen von heute aus gesehen? In der folgenden Lösung wurde das Makro aus Listing 2.18 in eine Funktion überführt.
93
Datentypen, Variablen und Konstanten
Listing 2.19: Den Wochentag über eine Funktion ermitteln Function Wochentag(DatAngabe) Wochentag = WeekdayName _ (Weekday(DatAngabe, vbUseSystemDayOfWeek), False) End Function
Mehr zum Thema »Funktionen« erfahren Sie übrigens am 15. Tag.
Übergeben Sie der Funktion einen Datumswert. Im folgenden Makro wird die Funktion Wochentag aufgerufen und ein zukünftiger Datumswert übergeben: Listing 2.20: Einen zukünftigen Wochentag ermitteln Sub DatumPlus30() MsgBox "Heute ist der " & Date & Chr(13) & _ "In 30 Tagen ist der " & Date + 30 & Chr(13) & _ "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 der Funktion diesen Datumswert.
Abbildung 2.22: Der zukünftige Termin ist unter der Woche.
2.9
Workshop
2.9.1 Fragen & Antworten F
Über welche Objektvariable können Sie einen Kommentar einfügen? A
94
Deklarieren Sie eine Objektvariable vom Typ Comment. Im folgenden Makro aus Listing 2.21 wird ein Kommentar in die aktive Zelle Ihrer Tabelle eingefügt.
Workshop
Listing 2.21: Einen Kommentar einfügen Sub KommentarEinfügen() Dim Kommentar As Comment Set Kommentar = ActiveCell.AddComment Kommentar.Text "Kommentar zur Zelle" End Sub
Deklarieren Sie eine Objektvariable vom Typ Comment. Danach fügen Sie über die Methode AddComment einen Kommentar in die aktive Zelle Ihrer Tabelle ein. F
Wie können Sie einen Hyperlink in eine Zelle einfügen? A
Im folgenden Makro aus Listing 2.22 wird ein Hyperlink eingefügt, der auf meine Excel-Homepage verweist. Listing 2.22: Einen Hyperlink einfügen Sub HyperlinkEinfügen() Dim Hyper As Hyperlink Set Hyper = ActiveCell.Hyperlinks.Add _ (anchor:=Range("A1"), _ Address:="http://held-office.de") End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Hyperlink. Danach fügen Sie den Hyperlink über die Methode Add ein. Im 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.
2.9.2 Quiz 1. Wie kann man eine Deklaration von Variablen standardmäßig erzwingen? 2. Wie kann man am schnellsten sehen, welche Objektvariablen für die Programmierung zur Verfügung stehen? 3. Wie lautet der Code, um eine PowerPoint-Sitzung zu starten? 4. Wie kann man mithilfe der Funktion DatePart den Monatsnamen extrahieren?
95
Die Sprachelemente von VBA
3
Die Sprachelemente von VBA
Am gestrigen Tag haben Sie Datentypen, Variablen und den Einsatz von Konstanten kennen gelernt. Sie wissen nun, warum Sie Variablen einsetzen und wie Sie diese deklarieren können. Die Themen heute: 쐽
Arbeiten mit Verzweigungen
쐽
Übersichtlichere Form mit Select Case
쐽
Schleifen programmieren
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 Kap03 unter dem Namen Sprachelemente.xls.
3.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!« Bildlich dargestellt könnte das wie folgt aussehen:
98
Arbeiten mit Verzweigungen
Abbildung 3.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 anwenden, wie beispielsweise: »Wenn wir Geld haben und ein gutes Angebot bekommen, fahren wir in den Urlaub!« oder »Wir fahren in den Urlaub, wenn wir Geld und die Kinder Ferien haben!« 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.
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.
99
Die Sprachelemente von VBA
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. 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.
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 3.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
100
Arbeiten mit Verzweigungen
Überprüfen Sie zuerst, ob die aktive Zelle gefüllt ist. Alternativ zu der im Listing 3.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 3.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
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 3.3: Datumsprüfung vornehmen Sub Datumsprüfung() Dim d As Date On Error GoTo fehler
101
Die Sprachelemente von VBA
Beginn: d = InputBox("Geben Sie das Lieferdatum ein!", _ "Datum eingeben") If IsDate(d) And d >= "01.01.2002" Then Else MsgBox "Nur Eingaben im aktuellen Jahr möglich" GoTo 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
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.2002 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 3.2: Das Datum wurde korrekt eingegeben.
102
Arbeiten mit Verzweigungen
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 Marke 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. 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 ObjektVariable darstellt.
Tabelle 3.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)
103
Die Sprachelemente von VBA
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. 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 3.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 3.3: Zelleneintrag prüfen und Ergebnis in Nebenzelle ausgeben
104
Übersichtlichere Form mit Select Case
3.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 einem beliebigen 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 ExcelVersion Sie arbeiten. Für diese Aufgabe können Sie die Eigenschaft Version auswerten, die über einen numerischen Wert Ihre Excel-Installation identifiziert. Listing 3.5: Excel-Version ermitteln Sub ExcelVersionFeststellen() MsgBox Application.Version Select Case Left(Application.Version, 1) Case "5" MsgBox "Excel 5" Case "7" MsgBox "Excel 7/95"
105
Die Sprachelemente von VBA
Case "8" MsgBox "Excel 8/97" Case "9" MsgBox "Excel 2000" Case "1" MsgBox "Excel 2002" 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. Danach wird die Select-Case-Anweisung direkt beendet.
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: Listing 3.6: Zahlenwerte überprüfen Sub ZahlAuswerten() Dim i As Integer i = InputBox _ ("Geben Sie einen Wert zwischen 1 und 100 ein!") Select Case i Case 1 To 5 MsgBox "Wert liegt zwischen 1 und 5" Case 6, 7, 8 MsgBox "Wert ist entweder 6, 7 oder 8" Case 9 To 15 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
106
Übersichtlichere Form mit Select Case
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
=
gleich
ungleich
Tabelle 3.2: Die Vergleichsoperatoren in Excel
Fensterstatus ermitteln In der folgenden Aufgabe soll der Fensterstatus Ihrer Anwendung ermittelt werden. Dieser Status kann drei Werte aufweisen: 쐽
Fenster normal
쐽
Fenster maximiert
쐽
Fenster minimiert
Überprüfen Sie nun den Fensterstatus Ihrer Anwendung, indem Sie das folgende Makro starten: Listing 3.7: Fensterstatus der Anwendung ermitteln Sub WindowStatusErmitteln() Dim s As String Select Case Application.WindowState Case xlMaximized s = "Maximiert" Case xlMinimized
107
Die Sprachelemente von VBA
s = "Minimiert" Case xlNormal s = "Normal" End Select MsgBox "Der augenblickliche Window-Status lautet: " & s 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.
3.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 (0,75 l) trinken. Dabei dürfen Sie den Wein nicht direkt aus der Flasche trinken, sondern müssen diesen in ein 0,25-l-Glas einschenken. Diesen Vorgang müssen Sie genau dreimal wiederholen, um die Flasche leer zu trinken. Dies ist ein typisches Beispiel für eine Schleife, die solange 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...Next-Schleifen 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]
108
Schleifen programmieren
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. 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 3.4: Eine Zahlenkolonne in Spalte A
109
Die Sprachelemente von VBA
Erfassen Sie nun das Makro, welches die Werte um 15% erhöht und in Spalte B schreibt: Listing 3.8: Zahlen um einen bestimmten Prozentsatz erhöhen Sub Schleife01() Dim i As Long Sheets("Tabelle3").Activate Range("A1").Select For i = 1 To 10 ActiveCell.Offset(0, 1).Value = _ ActiveCell.Value * 1.15 ActiveCell.Offset(1, 0).Select Next i End Sub
Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie die prozentuale 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 3.5: Das Ergebnis der Operation sehen Sie in Spalte B
110
Schleifen programmieren
An dieser Stelle möchte ich Sie noch auf eine Schwachstelle in Listing 3.8 hinweisen. Diese Schleife ist leider nicht dynamisch, d.h. wenn Sie Ihre Tabelle erweitern, müssen Sie auch immer die Zählvariable i anpassen. 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 3.9 umgesetzt: Listing 3.9: Dynamische Schleife Sub Schleife01Dynamisch() Dim i As Long Sheets("Tabelle3").Activate Range("A1").Select For i = 1 To ActiveSheet.UsedRange.Rows.Count ActiveCell.Offset(0, 1).Value = _ ActiveCell.Value * 1.15 ActiveCell.Offset(1, 0).Select Next i End Sub
Mit der Anweisung ActiveSheet.UsedRange.Rows.Count ermitteln Sie die Anzahl der belegten Zeilen in Ihrer Tabelle. Dies bildet auch das Endkriterium für Ihre Schleife.
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 3.10: Liniertes Papier herstellen Sub Schleife02() Dim i As Long Sheets("Tabelle4").Activate Range("A1").Select For i = 1 To 20 Step 2 ActiveCell.Offset(i, 0).EntireRow.Interior.ColorIndex = 36 Next i End Sub
111
Die Sprachelemente von VBA
Die Schrittweite in Listing 3.9 ist dieses Mal nicht 1, sondern 2. Dabei verweisen Sie mithilfe der Eigenschaft OffSet, bei der Sie das Zeilenargument über die Variable i angeben, dynamisch. Während der ganzen Verarbeitung bleibt der Mauszeiger immer auf Zelle A1. Sie verweisen lediglich immer auf die gewünschte Zelle. Über die Eigenschaft EntireRow 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 8 erfahren Sie noch, wie Sie die einzelnen Farben und deren Farbindexe auslesen können.
Abbildung 3.6: Das Papier im Rechenzentren-Look
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 3.11: Tabellennamen sammeln und ausgeben Sub Schleife03() Dim i As Integer Dim s As String For i = 1 To ThisWorkbook.Worksheets.Count
112
Schleifen programmieren
s = s & Chr(13) & Worksheets(i).Name Next i MsgBox "In dieser Mappe befinden sich folgende Tabellen: " & _ Chr(13) & s, vbInformation + vbOKOnly End Sub
Die Schleife in Listing 3.11 ist dynamisch. Über die ThisWorkbook.Worksheets.CountAnweisung 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 s am Bildschirm aus.
Abbildung 3.7: Auflisten der Tabellennamen einer Mappe
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.
113
Die Sprachelemente von VBA
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 3.8: Die Ausgangslage – ein Bereich mit Zahlenwerten
Erfassen Sie jetzt das Makro, welches den Zellenbereich B2:E10 untersucht und die Werte > 80 mit dem Schriftschnitt FETT belegt:
Listing 3.12: Zellen in Zielbereich untersuchen Sub Schleife04() Dim Zelle As Range Dim Bereich As Range Set Bereich = Sheets("Tabelle5").Range("B2:E10") For Each Zelle In Bereich If Zelle.Value > 80 Then Zelle.Font.Bold = True Next Zelle End Sub
Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Range. Die Objektvariable Zelle symbolisiert jeweils eine Zelle. Die Objektvariable Bereich steht 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
114
Schleifen programmieren
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 zuzuwei-
sen.
Abbildung 3.9: Alle Zellenwerte > 80 wurden mit dem Schriftschnitt Fett formatiert
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 3.13: Listing 3.13: Einheitliche Kopf- und Fußzeilen erzeugen Sub Schleife05() Dim Tabelle As Worksheet Application.ScreenUpdating = False For Each Tabelle In ActiveWorkbook.Worksheets
115
Die Sprachelemente von VBA
With Tabelle.PageSetup .LeftHeader = "Firmennamen" .CenterHeader = "Tabellenname &A" .RightHeader = "&D" .LeftFooter = "Pfad : " & ActiveWorkbook.FullName .CenterFooter = "" .RightFooter = "Seite &P von &N" End With Next Tabelle Set Tabelle = Nothing Application.ScreenUpdating = True End Sub
Abbildung 3.10: Die Kopf- und Fußzeilen sind in allen Tabellen einheitlich.
116
Schleifen programmieren
Definieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. Schalten Sie danach die Bildschirmaktualisierung aus. Dies tun Sie, 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.
Excel-Arbeitsmappen zählen Im letzten Beispiel zur For Each...Next-Schleife sollen die Namen aller Excel-Arbeitsmappen eines Verzeichnisses und der darunter liegenden Verzeichnisse ermittelt und ausgegeben werden. Der Code dafür lautet: Listing 3.14: Alle Excel-Arbeitsmappen eines Verzeichnisses werden gezählt Sub Schleife06() Dim obj As Variant Const verz = "C:\Eigene Dateien\" On Error GoTo fehler ChDir verz With Application.FileSearch .NewSearch .LookIn = verz .Filename = "*.xls" .SearchSubFolders = True If .Execute() > 0 Then For Each obj In .FoundFiles Debug.Print obj Next obj End If MsgBox .FoundFiles.Count End With Exit Sub fehler: MsgBox "Es gibt kein Verzeichnis mit dem Namen " & verz End Sub
Zu Beginn des Makros können Sie das zu durchsuchende Verzeichnis in einer Konstanten angeben. Wechseln Sie über die Anweisung ChDir direkt in dieses Verzeichnis. Danach
117
Die Sprachelemente von VBA
starten Sie die Suche und verwenden dabei das Objekt FileSearch, um die einzelnen Dateien im Verzeichnis zu ermitteln. Auf dieses Objekt können Sie einige Eigenschaften anwenden: Die Eigenschaft NewSearch setzt die Einstellungen aller Suchkriterien auf die Standardeinstellungen zurück. Mithilfe der Eigenschaft LookIn geben Sie bekannt, in welchem Verzeichnis die Suche beginnen soll. Die Eigenschaft SearchSubFolders bestimmt, ob die Suche auch in Unterverzeichnissen fortgesetzt werden soll. In diesem Fall müssen Sie diese Eigenschaft auf den Wert True setzen. Die Eigenschaft FileType gibt den Typ der Datei in einer Konstanten an, nach der gesucht werden soll. Möchten Sie beispielsweise nicht nur Excel-Arbeitsmappen suchen lassen, sondern alle Dateitypen, dann geben Sie die Konstante msoFileTypeAllFiles an. Über die Anweisung FoundFiles.Count geben Sie dann den Namen der gefundenen Datei an und schreiben diesen in den Direktbereich Ihrer Entwicklungsumgebung.
Abbildung 3.11: Die Namen der ExcelArbeitsmappen werden im Direktbereich ausgegeben.
Den Direktbereich können Sie einblenden, indem Sie in Ihre Entwicklungsumgebung wechseln und aus dem Menü ANSICHT den Befehl DIREKTFENSTER wählen.
118
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 DoAnweisungen an beliebiger Stelle als Alternative zum Verlassen einer Do Until...LoopAnweisung 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 einiger ausgesuchter Beispiele.
Jede x-te Zeile löschen Im ersten Beispiel für die Do Until...Loop-Schleife werden Sie in einer Tabelle jede dritte Zeile löschen. Dabei gehen Sie von der in Abbildung 3.12 dargestellten Ausgangstabelle aus.
119
Die Sprachelemente von VBA
Abbildung 3.12: Die Ausgangstabelle
Erfassen Sie nun das Makro, welches jede dritte Zeile löscht: Listing 3.15: Jede dritte Zeile löschen Sub Schleife07() Const zz = 2 Dim i As Integer Sheets("Tabelle6").Activate Range("A1").Select i = 1 Do Until ActiveCell.Value = "" For i = 1 To zz ActiveCell.Offset(1, 0).Select Next i Selection.EntireRow.Delete i = 1 Loop End Sub
Durchlaufen Sie in einer Do Until...Loop-Schleife alle gefüllten Zellen der Spalte A. Als Endkriterium für die Schleife gilt die erste leere Zelle, auf die Excel stößt. Innerhalb dieser Schleife können Sie mit einer weiteren Schleife arbeiten, welche die Zeilen überspringt, die nicht gelöscht werden sollen. Über die Methode Delete löschen Sie jeweils jede dritte Zeile.
120
Schleifen programmieren
Abbildung 3.13: Jede dritte Zeile wurde gelöscht.
Bestimmte Zeichen austauschen Im nächsten Beispiel werden in einer Tabelle bestimmte Zeichen ausgetauscht. So sollen alle Bindestriche durch Slashes ersetzt werden. Sehen Sie sich vorher die Ausgangssituation für diese Aufgabenstellung an.
Abbildung 3.14: Die Bindestriche sollen durch das Zeichen Slash ersetzt werden.
121
Die Sprachelemente von VBA
Erfassen Sie dafür das folgende Makro: Listing 3.16: Alle Bindestriche wurden ersetzt Sub Schleife08() Sheets("Tabelle7").Activate Range("A1").Select Do Until ActiveCell.Value = "" If InStr(ActiveCell.Value, "-") Then ActiveCell.Value = _ Application.Substitute(ActiveCell.Value, "-", "/") End If ActiveCell.Offset(1, 0).Select Loop End Sub
Setzen Sie eine Do Until...Loop-Schleife ein, um alle Zellen der Spalte A abzuarbeiten. Innerhalb der Schleife prüfen Sie mithilfe der Funktion InStr, ob ein Bindestrich in der jeweiligen Zelle überhaupt vorkommt. Wenn ja, wenden Sie die Funktion Substitute an, um dieses Zeichen durch ein anderes auszutauschen. Vergessen Sie nicht, den Mauszeiger bei jedem Schleifendurchlauf über die Eigenschaft Offset eine Zeile weiter nach unten zu setzen.
Abbildung 3.15: Alle Bindestriche wurden entfernt.
122
Schleifen programmieren
Die Schleife Do While...Loop Die Do While...Loop-Schleife wiederholt einen Block mit Anweisungen, solange eine Bedingung den Wert True erhält. Die Prüfung der angegebenen Bedingung erfolgt immer zu Beginn der Schleife. 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. Die Syntax dieser Schleife sieht wie folgt aus: Do [{While} Bedingung] [Anweisungen] [Exit Do] [Anweisungen] Loop
Die Bedingung stellt einen numerischen Ausdruck oder Zeichenfolgenausdruck dar, der entweder 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 die Bedingung True erfüllt ist. Innerhalb einer Do While...Loop-Anweisung kann eine beliebige Anzahl von Exit Do-Anweisungen an beliebiger Stelle als Alternative zum Verlassen einer Do...Loop-Anweisung verwendet werden. Exit Do wird oft in Zusammenhang mit der Auswertung einer Bedingung (zum Beispiel If...Then) eingesetzt und hat zur Folge, dass die Ausführung mit der ersten Anweisung im Anschluss an Loop fortgesetzt wird. Üben Sie diese Art von Schleife:
Zellenlänge überprüfen Im ersten Beispiel zur Schleife Do While...Loop überprüfen Sie in einer Tabelle, ob in Spalte A gültige Eingaben vorgenommen wurden. So darf jeder Eintrag nur 8 Zeichen lang sein. Sehen Sie zur besseren Verständlichkeit die folgende Abbildung an:
Abbildung 3.16: Welche Eingaben sind korrekt?
123
Die Sprachelemente von VBA
Schreiben Sie jetzt das folgende Makro, welches die Längen der Zellen in Spalte A überprüft. Wird eine falsche Länge gefunden, wird ein Eintrag in Spalte B vorgenommen. Listing 3.17: Länge von Eingaben messen und reagieren Sub Schleife09() Sheets("Tabelle8").Activate Range("A1").Select Do While ActiveCell.Value "" If Len(ActiveCell.Value) 8 Then _ ActiveCell.Offset(0, 1).Value = "Falsche Länge!" ActiveCell.Offset(1, 0).Select Loop End Sub
Durchlaufen Sie über die Schleife Do While...Loop alle Zellen der Spalte A, solange Excel auf keine leere Zelle stößt. Innerhalb der Schleife prüfen Sie über die Funktion Len, ob die richtige Länge der Zelle, nämlich 8, vorliegt. Wenn nicht, dann schreiben Sie in die Nebenzelle in Spalte B einen Vermerk.
Abbildung 3.17: Falsche Eingaben wurden gekennzeichnet.
124
Schleifen programmieren
Bestimmte Zahlen summieren Im folgenden Beispiel sollen in einer Tabelle mit Zahlen nur diejenigen summiert werden, die mit der Schriftfarbe ROT und dem Schriftschnitt FETT formatiert sind. Das Makro für diese Aufgabe lautet: Listing 3.18: Alle roten und fetten Zahlen sollen summiert werden Sub Schleife10() Dim Betrag As Single Sheets("Tabelle9").Activate Range("A1").Select Do While ActiveCell.Value "" If ActiveCell.Font.ColorIndex = 3 And _ ActiveCell.Font.Bold = True And _ IsNumeric(ActiveCell) Then _ Betrag = Betrag + ActiveCell.Value ActiveCell.Offset(1, 0).Select Loop MsgBox "Die Summe der roten Zahlen lautet: " & Betrag End Sub
In einer Do While...Loop-Schleife durchlaufen Sie alle gefüllten Zellen der Spalte A. Überprüfen Sie dabei für jede Zelle deren Formatierung. Nur numerische Zellen, die mit der Schriftfarbe ROT und dem Schriftschnitt FETT formatiert sind, sollen summiert werden.
Abbildung 3.18: Alle roten, fetten Zahlen wurden summiert
125
Die Sprachelemente von VBA
3.4
Workshop
3.4.1 Fragen & Antworten F
Wie können Sie überprüfen, welche Arbeitsmappen gerade geöffnet sind? A
Diese Fragestellung können Sie über eine For Each...Next-Schleife beantworten. Im folgenden Makro werden die Namen der geöffneten Arbeitsmappen auf dem Bildschirm ausgegeben. Listing 3.19: Alle geöffneten Arbeitsmappen ausgeben Sub MappenNamenErmitteln() Dim Mappe As Workbook For Each Mappe In Workbooks MsgBox Mappe.Name Next Mappe End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Workbook. Danach greifen Sie in einer Schleife auf das Auflistungsobjekt Workbooks zu. In diesem Auflistungsobjekt sind alle geöffneten Arbeitsmappen verzeichnet, die Sie über die Eigenschaft Name auslesen und über die Funktion MsgBox auf dem Bildschirm anzeigen können. F
Wie können Sie mithilfe einer Schleife alle installierten, aktivierten Add-Ins ermitteln? A
Erfassen Sie das Makro aus Listing 3.20: Listing 3.20: Alle aktivierten Add-Ins ausgeben Sub AddInsAusgeben() Dim ADDI As AddIn For Each ADDI In Application.AddIns If ADDI.Installed = True Then MsgBox ADDI.Name Next End Sub
Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ AddIn. Danach greifen Sie in einer Schleife auf die AddIns-Auflistung zu und ermitteln die Namen der installierten Add-Ins über die Eigenschaft Name.
126
Workshop
3.4.2 Quiz 1. Über welche Funktion kann man prüfen, ob eine Zelle ein Datum enthält? 2. Wie kann man aus einer For Each...Next-Schleife springen?
3.4.3 Übung Zum Abschluss dieses Tages üben Sie das heute Gelernte. Dabei soll folgende Aufgabe gelöst werden: Die Namen der Tabellen einer Arbeitsmappe sollen auf der ersten Tabelle dieser Arbeitsmappe in Spalte A eingefügt werden. Lösen Sie diese Aufgabenstellung mithilfe einer For Each...Next-Schleife. Die Demodatei Sprschelemente.xls finden Sie auf der CD-ROM im Verzeichnis Kap03. Eine Musterlösung finden Sie im Anhang.
127
Auf Fehlersuche mit VBA
4
Auf Fehlersuche mit VBA
Am gestrigen Tag haben Sie typische Sprachelemente wie Verzweigungen und Schleifen kennen gelernt. Die Themen heute: 쐽
Allgemeine Informationen zu Makros
쐽
Fehler finden und beseitigen
쐽
Typische Fehlerquellen in Excel-VBA
Vielleicht werden Sie sich fragen, warum dieses Thema bereits so früh in diesem Buch behandelt wird. Nun, gerade am Anfang, beim Lernen einer Programmiersprache, macht man die meisten Fehler. Von daher ist es besser, gleich zu Beginn zu wissen, wie man Fehler finden und beseitigen kann und welche Hilfsmittel zu diesem Zweck zur Verfügung stehen.
4.1
Allgemeine Informationen zu Makros
Enthält eine Arbeitsmappe Makros, werden Sie bereits beim Öffnen über eine Bildschirmmeldung darauf hingewiesen.
Abbildung 4.1: Makrowarnmeldung beim Öffnen einer Datei
Sollten Sie eine Arbeitsmappe unbekannter Herkunft erhalten, empfiehlt es sich zunächst, diese Mappe ohne Makros zu öffnen. Eine fremde Arbeitsmappe könnte unter Umständen gefährliche Makroviren enthalten. Klicken Sie zu diesem Zweck die Schaltfläche MAKROS DEAKTIVIEREN. In der so geöffneten Arbeitsmappe können die Makros dann nicht ausgeführt werden. Bevor Sie eine unbekannte Arbeitsmappe öffnen, sollten Sie auf jeden Fall einmal ein Virensuchprogramm darüber laufen lassen. Danach können Sie die Arbeitsmappe öffnen und die Makros aktivieren, indem Sie die Schaltfläche MAKROS AKTIVIEREN klicken.
130
Allgemeine Informationen zu Makros
In Excel gibt es Auto-Makros, die beispielsweise direkt beim Öffnen einer Arbeitsmappe gestartet werden. Auch diese Makros bergen eine gewisse Gefahr in sich. Um das automatische Ausführen von Auto-Makros zu unterbinden, halten Sie während des Öffnens der Arbeitsmappe die Taste (ª) gedrückt. Sicher, es ist ein wenig lästig, bei jedem Öffnen einer Arbeitsmappe eine Meldung wegzuklicken, sofern die Arbeitsmappe Makros enthält. Wenn Sie ein sicheres Virensuchprogramm im Einsatz haben und Ihren »Lieferanten« vertrauen, können Sie diesen Automatismus auch abschalten, indem Sie wie folgt vorgehen: 1. Wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/SICHERHEIT.
Abbildung 4.2: Die Sicherheitsstufe anpassen
2. Aktivieren Sie die Sicherheitsstufe NIEDRIG. 3. Bestätigen Sie mit OK. In Excel haben Sie die Möglichkeit, Ihren Quellcode mit einer digitalen Signatur auszustatten. Damit können Ihre Makros eindeutig identifiziert werden. Darüber hinaus bestätigt die Signatur, dass am Quellcode keine Änderungen vorgenommen wurden. Beim Festlegen der Sicherheitsstufe für Makros können Sie einstellen, dass Makros, die von einem Entwickler aus der Liste der vertrauenswürdigen Quellen digital signiert wurden, ausgeführt werden. Mehr Infos zu diesem Thema finden Sie in der Online-Hilfe auf der Registerkarte INHALT unter der Rubrik SICHERHEIT/DIGITALE UNTERSCHRIFTEN UND ZERTIFIKATE.
131
Auf Fehlersuche mit VBA
Enthält eine Arbeitsmappe Makros, müssen diese nicht immer in Modulen abgelegt sein. Theoretisch können Makros hinter jeder einzelnen Tabelle, hinter dem Eintrag DIESEARBEITSMAPPE und hinter UserForms verborgen sein. Klicken Sie diese einzelnen Elemente in der Entwicklungsumgebung nacheinander einfach doppelt an, bis Sie das »versteckte« Makro finden.
4.2
Fehler finden und beseitigen
Im Verlauf der Programmierung wird es nicht ausbleiben, dass Programmierfehler auftreten. Wichtig ist aber immer zu wissen, wie weit und vor allem ob das Programm bis zum Fehler korrekt abgelaufen ist. Daher steht Ihnen in der Entwicklungsumgebung eine Testumgebung zur Verfügung, über die Sie Fehler schnell finden und beseitigen können.
Das Code-Fenster Im Code-Fenster erfassen und bearbeiten Sie Ihre VBA-Makros. Sollte dieses Fenster noch nicht eingeblendet sein, dann wählen Sie aus dem Menü ANSICHT den Befehl CODE. Das Code-Fenster enthält folgende Objekte: 쐽
Dropdown-Feld OBJEKT: Hier werden die Namen der markierten Objekte angezeigt. Klicken Sie auf den Pfeil rechts neben dem Listenfeld, um eine Liste aller mit dem Formular verknüpften Objekte anzuzeigen.
Abbildung 4.3: Schnell Makros auffinden über das Dropdown-Feld Prozedur
132
Fehler finden und beseitigen
쐽
Dropdown-Feld PROZEDUR: Listet alle Ereignisse auf, die von Visual Basic für das Formular oder das Steuerelement, das im Feld OBJEKT angezeigt wird, erkannt werden. Bei der Auswahl eines Ereignisses wird die mit diesem Ereignisnamen verknüpfte Ereignisprozedur im Code-Fenster angezeigt. Alle Prozeduren werden übrigens in alphabetischer Reihenfolge im Dropdown-Feld angezeigt. Dies erleichtert die Suche nach bestimmten Modulen sehr.
Wenn Sie auf den rechten, oberen Rand der vertikalen Bildlaufleiste des Codefensters sehen, erkennen Sie den Fensterteiler. Der Fensterteiler befindet sich direkt oberhalb des Pfeil-nach-oben-Symbols. Damit können Sie das Code-Fenster in zwei horizontale Bereiche unterteilen, in denen separate Bildläufe durchgeführt werden können. So können Sie unterschiedliche Teile wie zum Beispiel den Anfang und das Ende eines Makros gleichzeitig anzeigen. Die Informationen, die in den Feldern OBJEKT und PROZEDUR angezeigt werden, beziehen sich auf den Code in dem Fenster, das gerade aktiv ist. Mit einem Doppelklick auf den Fensterteiler wird ein Fenster geschlossen.
Das Direktfenster Das Direktfenster können Sie hervorragend dazu einsetzen, ein Makro zu testen. Dabei haben Sie die Möglichkeit, Inhalte von Variablen und Positionen im Code zu dokumentieren. Sie können beispielsweise bestimmte Inhalte von Variablen im Direktfenster ausgeben. Erfassen Sie zunächst einmal einen kleinen Beispielcode: Listing 4.1: Den Direktbereich von Excel füllen Sub Testlauf() Dim i As Integer For i = 1 To 10 Debug.Print "Schleifendurchlauf: " & i Next i End Sub
Im Makro aus Listing 4.1 wird eine Schleife genau zehnmal durchlaufen. Bei jedem Schleifendurchlauf wird mithilfe des Befehls Debug.Print ein Eintrag ins Direktfenster geschrieben, der den aktuellen Schleifendurchlauf festhält.
133
Auf Fehlersuche mit VBA
Setzen Sie die Einfügemarke in die erste Zeile des Makros und drücken Sie die Taste (F5), um das Makro zu starten. Kontrollieren Sie jetzt einmal das Ergebnis im Direktfenster. Dazu wählen Sie aus dem Menübefehl ANSICHT den Befehl DIREKTFENSTER oder drücken die Tastenkombination (Strg) + (G).
Abbildung 4.4: Die einzelnen Zustände des Makros werden festgehalten.
Code im Einzelschritt durchlaufen lassen Eine weitere Möglichkeit der Fehlersuche in Excel ist es, das Makro Zeile für Zeile abzuarbeiten. Dazu setzen Sie die Einfügemarke in die erste Zeile des Makros und drücken die Taste (F8). Alternativ dazu können Sie ebenso den Menübefehl DEBUGGEN/EINZELSCHRITT wählen. Das Makro hält nach jedem Befehl an. Sie können dann prüfen, ob die gewünschte Aktion ausführt wurde, indem Sie die Entwicklungsumgebung kurzfristig verlassen und in Ihrer Excel-Arbeitsmappe die Ergebnisse kontrollieren. Eine weitere Variante ist es, im obigen Makro die Einfügemarke in jene Zeile zu setzen, bis zu der das Makro durchlaufen werden soll. Setzen Sie beispielsweise die Einfügemarke in die Zeile, bis zu der Sie den Code durchlaufen möchten, und drücken Sie die Tastenkombination (Strg) + (F8). Der Code wird jetzt bis zu der momentan markierten Zeile durchlaufen und stoppt genau an dieser Position. Nun können Sie prüfen, ob das Makro auch korrekt funktioniert hat. Wenn alles soweit stimmt, können Sie durch die Taste (F5) dafür sorgen, dass das Makro bis zum Ende durchläuft. Sollte etwas mit dem Makro nicht stimmen, brechen Sie es ab, indem Sie den Menübefehl AUSFÜHREN/ZURÜCKSETZEN aufrufen.
134
Fehler finden und beseitigen
Überwachung hinzufügen Eine besonders wertvolle Funktion können Sie einsetzen, wenn Sie das Überwachungsfenster einblenden. Wählen Sie dazu aus dem Menü ANSICHT den Befehl ÜBERWACHUNGSFENSTER. Sie haben jetzt beispielsweise die Möglichkeit, zu überprüfen, wann sich eine bestimmte Variable ändert. Genau dann soll der Makroablauf unterbrochen werden. Im folgenden Beispiel wird eine Schleife genau zehnmal durchlaufen. Bei jedem Schleifendurchlauf wird die Variable i verändert. Der Logik zufolge muss das folgende Makro dann nach dem ersten Schleifendurchlauf gestoppt werden. Sehen Sie sich zu diesem Zweck einmal folgendes Listing an: Listing 4.2: Mehrere Schleifendurchläufe Sub Testmakro() Dim i As Integer For i = 1 To 10 Debug.Print "Schleifendurchlauf: " & i Next i End Sub
Um nun die Überwachung der Variablen i einzustellen, befolgen Sie die nächsten Schritte: 1. Wählen Sie aus dem Menü DEBUGGEN den Befehl ÜBERWACHUNG HINZUFÜGEN.
Abbildung 4.5: Überwachung hinzufügen
2. Geben Sie im Feld AUSDRUCK die Variable an, die Sie überwachen möchten.
135
Auf Fehlersuche mit VBA
3. Aktivieren Sie die Option UNTERBRECHEN, WENN WERT GEÄNDERT WURDE. 4. Bestätigen Sie Ihre Einstellungen mit OK.
Abbildung 4.6: Das Makro stoppt bei der ersten Änderung der Variablen i.
Der momentane Inhalt der Variablen wird im Überwachungsfenster angezeigt.
Das Lokal-Fenster Das Lokal-Fenster wird in der Entwicklungsumgebung standardmäßig nicht angezeigt. Über das Menü ANSICHT können Sie dieses Fenster jedoch einblenden. Das Lokal-Fenster zeigt alle deklarierten Variablen in der aktuellen Prozedur und deren Werte an. Sie haben daher die Möglichkeit, die Werte von Variablen übersichtlich zu prüfen. Um diese Funktion zu testen, erfassen Sie folgendes Makro, welches alle benutzten Zellen der TABELLE1 nach TABELLE2 überträgt: Listing 4.3: Daten von einer Tabelle auf eine andere übertragen Sub Dim Dim Dim
DatenTransferieren() TB1 As Worksheet TB2 As Worksheet i As Long
Set TB1 = Worksheets("Tabelle1") Set TB2 = Worksheets("Tabelle2")
136
Fehler finden und beseitigen
For i = 1 To TB1.UsedRange.Rows.Count TB2.Cells(i, 1) = TB1.Cells(i, 1) Next i End Sub
Deklarieren Sie im ersten Schritt zwei Objektvariablen vom Typ Worksheet. Danach geben Sie über die Anweisung Set bekannt, wie diese heißen. In einer anschließenden Schleife übertragen Sie dann alle Zellen der Spalte A in TABELLE1 in die Zieltabelle TABELLE2. Dabei setzen Sie die Eigenschaft Cells ein, die zwei Argumente benötigt. Im ersten Argument geben Sie die jeweils aktive Zeile wieder, im zweiten Argument die Spalte. Da die Spalte konstant bleibt (Spalte A) können Sie dieses Argument mit dem Wert 1 füllen und konstant belassen. Das Zeilenargument wird bei jedem Schleifendurchlauf erhöht. Gehen Sie jetzt wie folgt vor, um das Lokal-Fenster einsetzen zu können: 1. Setzen Sie den Mauszeiger auf die Zeile innerhalb der Schleife. 2. Drücken Sie die Taste (F9), um dort einen Haltepunkt zu setzen. 3. Starten Sie das Makro, indem Sie die Taste (F5) drücken. 4. Das Makro läuft bis zum Haltepunkt. Im Lokal-Fenster wird der Inhalt der Variablen nun angezeigt. Führen Sie noch einmal einen Schleifendurchlauf durch, indem Sie die Taste (F5) erneut drücken.
Abbildung 4.7: Der Variableninhalt wird im LokalFenster angezeigt.
137
Auf Fehlersuche mit VBA
Folgende Spalten werden im Lokal-Fenster angezeigt. 쐽
AUSDRUCK: Listet die Namen der Variablen auf. Die erste Variable in der Liste ist eine spezielle Modulvariable und kann erweitert werden, um alle Variablen auf Modulebene des aktuellen Moduls anzuzeigen. Globale Variablen und Variablen in anderen Projekten sind über das Lokal-Fenster nicht verfügbar.
쐽
WERT: Wenn Sie in der Spalte WERT direkt auf einen Eintrag klicken, nimmt der Cursor die Form eines I-Cursors an. Sie können diesen Wert bearbeiten und danach mit der Taste (¢) bestätigen. Sollte der Wert nicht zulässig sein, bleibt das Bearbeitungsfeld aktiv und der Wert wird markiert. Außerdem wird ein Meldungsfeld mit einer Beschreibung des Fehlers angezeigt. Durch Drücken von (Esc) werden Änderungen rückgängig gemacht. Auf unser Beispiel angewendet, könnten Sie den Wert der Variablen i auf 7 ändern. Excel würde dann nach dem siebten Schleifendurchlauf weitermachen.
쐽
TYP: In dieser Spalte wird der Datentyp der Variablen angezeigt. Diesen Typ können Sie aber nicht ändern.
쐽
AUFRUFLISTE: Ganz rechts oben im Lokal-Fenster finden Sie eine Schaltfläche mit einigen Punkten darauf. Nach einem Klick darauf wird eine Liste der derzeit aktiven Prozeduraufrufe im Haltemodus angezeigt. Beim Ausführen von Code in einer Prozedur wird diese einer Liste der aktiven Prozeduraufrufe hinzugefügt. Bei jedem Aufruf einer anderen Prozedur durch eine Prozedur wird diese der Liste hinzugefügt. Aufgerufene Prozeduren werden aus der Liste gelöscht, wenn die Ausführung an die aufrufende Prozedur übergeben wird. Übrigens können Sie den Haltepunkt auch während der Laufzeit wieder herausnehmen. Drücken Sie nach dem erneuten Stoppen des Makros die Taste (F9).
Die Symbolleiste Debuggen Die Symbolleiste DEBUGGEN stellt Ihnen Symbole zur Verfügung, die das schnelle Testen von Quellcode vereinfachen. Blenden Sie diese Symbolleiste ein, indem Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken und aus dem Kontextmenü die Symbolleiste DEBUGGEN auswählen. Abbildung 4.8: Die Symbolleiste Debuggen
138
Fehler finden und beseitigen
Folgende Symbole werden in dieser Symbolleiste von rechts nach links angeboten: 쐽
ENTWURFSMODUS: Aktiviert und deaktiviert den Entwurfsmodus.
쐽
SUB/USERFORM AUSFÜHREN: Führt die aktuelle Prozedur aus, falls sich der Cursor in einer Prozedur befindet; führt das UserForm-Formular aus, falls ein UserForm-Formular aktiv ist; führt ein Makro aus, falls weder ein Code-Fenster noch ein UserForm-Formular aktiv sind.
쐽
UNTERBRECHEN: Beendet die Ausführung eines Programms und wechselt in den Haltemodus. Stattdessen können Sie auch die Taste (Esc) drücken, um den Ablauf des Makros zu stoppen.
쐽
ZURÜCKSETZEN: Löscht die Aufrufliste und die Variablen auf Modulebene und beendet das Projekt.
쐽
HALTEPUNKT EIN/AUS: Setzt oder entfernt einen Haltepunkt in der aktuellen Zeile. Alternativ dazu genügt auch das Drücken der Taste (F9), um einen Haltepunkt zu setzen bzw. zu entfernen.
쐽
EINZELSCHRITT: Führt jeweils genau eine Anweisung im Code aus. Alternativ können Sie hier mit der Taste (F8) arbeiten, um einen Code Zeile für Zeile zu durchlaufen.
쐽
PROZEDURSCHRITT: Führt im Code-Fenster jeweils eine Prozedur oder eine Anweisung im Code aus.
쐽
PROZEDUR ABSCHLIESSEN: Führt die restlichen Zeilen einer Prozedur aus, in der sich der aktuelle Ausführungspunkt befindet.
쐽
LOKAL-FENSTER: Blendet das Lokal-Fenster ein.
쐽
DIREKTFENSTER: Blendet das Direktfenster ein. Alternativ dazu können Sie auch die Tastenkombination (Strg) + (G) drücken, um das Direktfenster einzublenden.
쐽
ÜBERWACHUNGSFENSTER: Blendet das Überwachungsfenster ein.
쐽
AKTUELLEN WERT ANZEIGEN: Zeigt das Dialogfeld AKTUELLEN WERT ANZEIGEN mit dem aktuellen Wert des ausgewählten Ausdrucks an.
쐽
AUFRUFLISTE: Zeigt das Dialogfeld AUFRUFLISTE an, in dem die derzeit aktiven Prozeduraufrufe (Prozeduren in der Anwendung, die gestartet, aber nicht abgeschlossen wurden) angezeigt werden.
139
Auf Fehlersuche mit VBA
4.3
Typische Fehlerquellen in Excel-VBA
Am Ende des Tages lernen Sie noch ein paar typische Fehler kennen, die sich ab und zu einschleichen.
Buchstabendreher Gerade wenn Sie viel und schnell Quellcode erfassen, dann kommen hin und wieder Buchstabendreher vor und der Editor kann dadurch die Befehle nicht erkennen. Eine kleine Kontrolle vorab: Wenn Sie sich angewöhnen, alle Befehle in Kleinschreibweise einzugeben, können Sie nach jedem Drücken der Taste (¢) am Ende einer Zeile prüfen, ob die Befehle vom Editor richtig erkannt werden. Die richtigen Befehle werden dann teilweise in Großbuchstaben umgesetzt. So wird aus der Eingabe activesheet.select
der Befehl ActiveSheet.Select
Sehen Sie sich nun einmal die folgende Abbildung an:
Abbildung 4.9: Eine recht häufige Meldung
140
Typische Fehlerquellen in Excel-VBA
Was stimmt hier nicht? Wenn Sie sich die Zeile im Makro betrachten, werden Sie feststellen, dass hier die Methode Activate falsch geschrieben wurde. Sie erkennen es daran, dass dieser Befehl nicht im ersten Buchstaben auf Groß konvertiert wurde. Dieselbe Meldung wird übrigens angezeigt, wenn Sie beispielsweise auf eine Tabelle zugreifen, die es gar nicht gibt.
Nicht existente Objekte Der Laufzeitfehler 1004 wird Sie auch des Öfteren begleiten. In einem solchen Fall versuchen Sie, auf ein Objekt zuzugreifen, welches es gar nicht gibt. Paradebeispiel hierfür wäre das Öffnen einer Arbeitsmappe, die auf Ihrer Festplatte nicht existiert.
Abbildung 4.10: Diese Arbeitsmappe existiert nicht.
In diesem Fall sagt Ihnen Excel ganz genau, worin der Fehler liegt. Dies muss aber nicht unbedingt immer zutreffen. Auf jeden Fall sollten Sie diese hässliche Fehlermeldung abfangen, indem Sie eine Fehlerbehandlung aufsetzen. So könnte das in Abbildung 4.10 abgebildete Makro wie folgt umgeschrieben werden:
141
Auf Fehlersuche mit VBA
Listing 4.4: Eine Fehlerbehandlungsroutine aufsetzen Sub MappeÖffnen() On Error GoTo fehler Workbooks.Open Filename:= _ ("C:\Eigene Dateien\MappeX.xls") 'Weitere Anweisungen
Exit Sub
fehler: MsgBox "Die Datei konnte nicht gefunden werden", _ vbCritical + vbOKOnly, "FEHLER" End Sub
Mit der Anweisung On Error GoTo fehler können Sie die standardmäßig angezeigte Fehlermeldung wie in Abbildung 4.10 abgebildet unterdrücken und stattdessen eine eigene Fehlermeldung anzeigen. Wird nun von Excel ein Fehler festgestellt, dann wird direkt in den Paragrafen FEHLER verzweigt und die dortigen Aktionen ausgeführt. Vor den Fehlerparagrafen setzen Sie die Anweisung Exit Sub ein. Dies ist wichtig für den Fall, dass kein Fehler festgestellt wird. In diesem Fall darf der Fehlerparagraf nicht ausgeführt werden, d.h. Sie beenden mit dieser Anweisung das Makro auf direktem Wege. Übrigens können Sie die Fehlernummer sowie die Fehlerbeschreibung auch über das Objekt Err und die Eigenschaften Number und Description abfragen. MsgBox Err.number & " " & Err.Description
Oft wird auch die Anweisung On Error Resume Next bei Befehlen verwendet, welche eventuell einen Fehler verursachen könnten. In diesem Fall wird nicht weiter auf einen auftretenden Fehler reagiert und dieser ignoriert. Dieser Befehl ist aber meiner Ansicht nach nur in Ausnahmefällen einzusetzen, wie es im folgenden Beispiel demonstriert wird. Stellen Sie sich vor, Sie erstellten eine eigene Symbolleiste per VBA, die Sie nun wieder löschen möchten. Das Erstellen sowie Löschen der Symbolleiste sehen Sie im folgenden Quellcode, der an dieser Stelle nicht weiter erklärt wird. Zum Thema Symbolleisten lernen Sie am 19. Tag mehr.
142
Typische Fehlerquellen in Excel-VBA
Listing 4.5: Eine eige Symbolleiste erstellen und wieder löschen Sub SymbolleisteAnlegen() With Application.CommandBars.Add("TEST") .Visible = True .Position = msoBarTop .Protection = msoBarNoMove + msoBarNoChangeVisible With .Controls With .Add(msoControlButton) .Style = msoButtonIconAndCaption .Caption = "Erster Befehl" .OnAction = "Test01" End With With .Add(msoControlButton) .Style = msoButtonIconAndCaption .Caption = "Zweiter Befehl" .OnAction = "Test02" .BeginGroup = True End With End With End With End Sub
Sub SymbolleisteLöschen() Application.CommandBars("TEST").Delete End Sub
Wenn Sie das Makro SymbolleisteLöschen zweimal hintereinander starten, dann bekommen Sie folgende Fehlermeldung angezeigt:
Abbildung 4.11: Eine ziemlich wenig aussagende Fehlermeldung
143
Auf Fehlersuche mit VBA
Nun, dieser Fehler tritt ein, wenn Sie versuchen, die Symbolleiste TEST zu löschen, obwohl sie schon gelöscht wurde. In diesem Fall könnte man das Makro SymbolleisteLöschen wie folgt ergänzen. Listing 4.6: Symbolleiste löschen ohne Fehlermeldung Sub SymbolleisteLöschen() On Error Resume Next Application.CommandBars("TEST").Delete End Sub
Nicht verfügbare Eigenschaften und Methoden Wenn Sie versuchen, für ein Objekt eine Eigenschaft bzw. eine Methode anzuwenden, die für dieses Objekt nicht zur Verfügung steht, dann wird diese Absicht mit folgender Fehlermeldung quittiert:
Abbildung 4.12: Eigenschaft steht nicht zur Verfügung
Was wurde hier falsch gemacht? Es wurde versucht, eine Zelle mit der Farbe Rot zu formatieren. In diesem Fall fehlt aber noch eine Kleinigkeit. Sie möchten den Hintergrund der Zelle färben. Der Hintergrund einer Zelle wird über das Objekt Interior angesprochen. Die korrekte Anweisung müsste also lauten: ActiveCell.Interior.ColorIndex = 3
144
Workshop
Die verfügbaren Eigenschaften und Methoden können Sie entweder direkt nach der Eingabe des Objekts mit anschließendem Punkt über das Kontextmenü ablesen oder im Objektkatalog nachblättern.
Abbildung 4.13: Die verfügbaren Eigenschaften und Methoden werden im Kontextmenü angezeigt.
4.4
Workshop
4.4.1 Fragen & Antworten F
Wie können Sie eine Fehlerbeschreibung anzeigen lassen? A
F
Tritt ein Fehler auf, dann können Sie die Beschreibung des Fehlers über die Anweisung Msgbox Err.Description auf dem Bildschirm ausgeben.
Wie können Sie im Direktfenster den Inhalt einer Variablen ausgeben? A
Dazu müssen Sie einen Haltepunkt im Quellcode setzen und das Makro bis an diesen Haltepunkt durchrennen lassen. Wechseln Sie dann in die Entwicklungsumgebung und geben Sie im Direktfenster die Zeichenfolge =?Variablenname ein.
4.4.2 Quiz 1. Über welche Anweisung kann man eine Meldung im Direktfenster ausgeben? 2. Unterscheidet der Code-Editor zwischen Groß- und Kleinschreibung?
145
Einstellen und Anpassen der ExcelAnwendung
5
Einstellen und Anpassen der Excel-Anwendung
Am gestrigen Tag haben Sie die Testumgebung von Excel-VBA kennen gelernt. Sie sind jetzt in der Lage, ein Makro Schritt für Schritt durchzugehen und die Zwischenstände zu überprüfen. Sie können mit dem Direktfenster umgehen und haben einen Einblick in häufige Fehlerquellen erhalten. Die Themen heute: 쐽
Vollbildansicht einstellen
쐽
Lang laufende Makros schneller machen
쐽
Automatische Listen generieren
쐽
Drag&Drop ein- und ausschalten
쐽
Add-Ins überprüfen
쐽
Wiedervorlageliste bearbeiten
쐽
Sonstige Einstellmöglichkeiten in Excel
Standardmäßig ist Excel so eingestellt, dass Sie die Anwendung für die meisten Zwecke optimal einsetzen können. Sie haben aber die Möglichkeit, die Anwendung nach Ihren Wünschen anzupassen. Dabei können Sie unter anderem das Erscheinungsbild in Excel ändern, indem Sie bestimmen, welche Objekte angezeigt werden und welche nicht. Kurzum, Sie können alle Einstellungen von Excel über den Einsatz von VBA anpassen, die Sie im Menü EXTRAS unter dem Befehl OPTIONEN finden. Alle Makros, die Sie an diesem Tag lernen, können Sie auf der mitgelieferten CDROM im Verzeichnis Kap05 in der Arbeitsmappe Applikation.xls nachblättern.
5.1
Vollbildansicht einstellen
Wenn Sie Daten in Excel eingeben möchten, sollten möglichst viel »Tabell« und wenige Symbolleisten sowie sonstiger Schnickschnack zu sehen sein. Sie können in Excel daher die Ansicht GANZER BILDSCHIRM aus dem Menü ANSICHT auswählen. Die Vollbildansicht können Sie über den Einsatz eines Makros aber auch wie folgt einstellen: Listing 5.1: Vollbildansicht einstellen Sub AnsichtGanzerBildschirm() Application.DisplayFullScreen = True End Sub
148
Vollbildansicht einstellen
Setzen Sie die Eigenschaft DisplayFullScreen auf den Wert True, um die Vollbildansicht in Excel anzuzeigen. Um die Ansicht wieder zu beenden, setzen Sie die Eigenschaft DisplayFullScreen wieder auf den Wert False. Listing 5.2: Vollbildansicht beenden Sub NormalAnsichtEinstellen() Application.DisplayFullScreen = False End Sub
Wie aber können Sie dieses Feature in der Praxis einsetzen? Nun, stellen Sie sich einmal vor, Sie haben in einer Arbeitsmappe ein Tabellenblatt, in das Sie immer wieder neue Daten eingeben müssen. Optimal wäre es nun, dass die Vollbildansicht immer dann eingestellt wird, wenn Sie diese Tabelle aktivieren. Beim Verlassen dieser Tabelle soll dann wieder die Normalansicht eingestellt werden. Um diesen Automatismus einzustellen, befolgen Sie die nachstehenden Arbeitsschritte: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Im Projekt-Explorer klicken Sie die Tabelle doppelt an, in die Sie diese Funktion einfügen möchten. 3. Wählen Sie im Code-Fenster aus dem ersten Dropdown-Feld den Befehl WorkSheet. 4. Aus dem zweiten Dropdown-Feld wählen Sie das Ereignis Activate. Danach wählen Sie zusätzlich das Ereignis Deactivate. 5. Ergänzen Sie nun die beiden Ereignisse wie folgt: Listing 5.3: Makros automatisch ausführen lassen bei Blatt(de)aktivierung Private Sub Worksheet_Activate() AnsichtGanzerBildschirm End Sub
Private Sub Worksheet_Deactivate() NormalAnsichtEinstellen End Sub
Das Ereignis Worksheet_Activate tritt automatisch ein, wenn Sie die Tabelle aktivieren. Innerhalb des Ereignisses rufen Sie das Makro AnsichtGanzerBildschirm auf, das Sie vorher im MODUL1 erfasst haben. Das Ereignis Worksheet_DeActivate tritt dann automatisch ein, wenn Sie die Tabelle verlassen. Innerhalb des Ereignisses rufen Sie das Makro NormalansichtEinstellen auf, das Sie vorher im MODUL1 erfasst haben.
149
Einstellen und Anpassen der Excel-Anwendung
Erfahren Sie mehr über die Ereignisprogrammierung am 10. Tag.
5.2
Weitere Einstellungen der Ansicht
Wie schon vorher erwähnt, können Sie selbst bestimmen, wie Excel bestimmte Objekte, z.B. Kommentare, Gitternetzlinien, Grafiken usw., anzeigt. Wählen Sie nun einmal das Dialogfeld OPTIONEN aus dem Menü EXTRAS und wechseln Sie auf die Registerkarte ANSICHT.
Abbildung 5.1: Die Registerkarte Ansicht
Alle Einstellungen, die Sie auf dieser Registerkarte sehen, können Sie über den Einsatz von VBA einstellen. Im Listing werden folgende Einstellungen getroffen: 쐽
Die Gitternetzlinien werden deaktiviert.
쐽
Die Zeilen- und Spaltenüberschriften werden ausgeblendet.
쐽
Die Nullwerte werden nicht angezeigt.
쐽
Beide Bildlaufleisten werden ausgeblendet.
쐽
Die Blattregisterkarten werden versteckt.
쐽
Die Statusleiste wird ausgeblendet.
150
Weitere Einstellungen der Ansicht
Sehen Sie sich vorab einmal die Ausgangssituation in Abbildung 5.2 an:
Abbildung 5.2: Die normale Ansicht auf eine Tabelle
Alle diese Einstellungen werden im folgenden Listing 5.4 vorgenommen: Listing 5.4: Die Ansicht von Excel bestimmen Sub AnsichtBestimmen() With ActiveWindow .DisplayGridlines = False .DisplayHeadings = False .DisplayZeros = False .DisplayHorizontalScrollBar = False .DisplayVerticalScrollBar = False .DisplayWorkbookTabs = False End With Application.DisplayStatusBar = False End Sub
Mithilfe der Eigenschaft DisplayGridLines können Sie die Anzeige der Gitternetzlinien in einer Tabelle ein- und ausschalten. Setzen Sie diese Eigenschaft auf den Wert True, um die Gitternetzlinien für die aktive Tabelle anzuzeigen. Über die Eigenschaft DisplayHeadings können Sie bestimmen, ob die Zeilen- und Spaltenüberschriften in der Tabelle angezeigt werden sollen. Setzen Sie diese Eigenschaft auf den Wert False, um die Zeilen- und Spaltenüberschriften auszublenden. Die Eigenschaft DisplayZeros sorgt dafür, dass Nullwerte in der aktiven Tabelle nicht angezeigt werden, sofern Sie diese Eigenschaft auf den Wert False setzen. Über die Eigenschaften DisplayHorizontalScrollBar bzw. DisplayVerticalScrollBar können Sie festlegen, ob die Bildlaufleisten angezeigt werden sollen.
151
Einstellen und Anpassen der Excel-Anwendung
Möchten Sie die Registerkarten in einer Arbeitsmappe verbergen, dann setzen Sie die Eigenschaft DisplayWorkbookTabs auf den Wert False. Sie können dann nur noch über die Tastenkombination (Strg) + (Bild_½) bzw. mit (Strg) + (Bild_¼) auf eine andere Tabelle gelangen. Diese Einstellung wird oft vorgenommen, wenn die Arbeitsmappe eine einzige Tabelle enthält. Mithilfe der Eigenschaft DisplayStatusBar können Sie festlegen, ob die Statusleiste am unteren Bildrand angezeigt werden soll. Wenn nicht, setzen Sie diese Eigenschaft auf den Wert False. Wie Sie sehen, sind einige Eigenschaften nur für die jeweils aktive Tabelle gültig, andere jedoch für die gesamte Arbeitsmappe.
Abbildung 5.3: Einige Standardelemente wurden ausgeblendet.
5.3
Lang laufende Makros schneller machen
Bei aufwändigen Makros – wenn beispielsweise mehrere Arbeitsmappen geöffnet sind und einige Tabellen mit Daten gefüllt werden – verlängert sich die Laufzeit, sofern Sie nicht eigene Einstellungen vornehmen.
Bildschirmaktualisierung ein- und ausschalten Standardmäßig ist in Excel die Bildschirmaktualisierung eingeschaltet, d.h. alle Aktionen, wie beispielsweise ein Tabellenwechsel oder das Abarbeiten von Zeilen, werden während des Makroablaufs am Bildschirm angezeigt. Dies kostet Zeit und durch die ständige Aktualisierung des Bildschirms leiden Ihre Augen und der Bildschirm. Schalten Sie daher zu Beginn des Makros die Bildschirmaktualisierung aus und am Ende des Makros wieder ein. Der Makrorahmen dafür sieht wie folgt aus:
152
Lang laufende Makros schneller machen
Listing 5.5: Bildschirmaktualisierung ein- und ausschalten Sub Bildschirmaktualisierung() Application.ScreenUpdating = False 'Weitere Anweisungen
Application.ScreenUpdating = True End Sub
Setzen Sie die Eigenschaft ScreenUpdating auf den Wert False, um die Aktualisierung des Bildschirms abzuschalten. Während die Bildschirmaktualisierung ausgeschaltet ist, wird lediglich eine Sanduhr am Bildschirm angezeigt. Alle Aktionen des Makros werden im Hintergrund ausgeführt. Weisen Sie der Eigenschaft ScreenUpdating den Wert True zu, um die Bildschirmaktualisierung wieder zuzulassen. In der Praxis können Sie die Bildschirmaktualisierung in einem Makro auf mehrere Male ein- und ausschalten, um bestimmte Zwischenstände im Makro anzuzeigen. Damit beugen Sie auch einer evtl. Nervosität des Anwenders vor, wenn dieser minutenlang nur die Sanduhr angezeigt bekommt und der Eindruck entstehen könnte, das Makro bzw. die Anwendung sei abgestürzt.
Die Berechnung ein- und ausschalten Jede Eingabe in eine Excel-Tabelle bedeutet automatisch, dass die Tabelle neu berechnet wird. Diese Funktion ist auch dann sinnvoll, wenn sich mehrere Zellen über Formeln aufeinander beziehen. Bei der Programmierung ist dieser Automatismus aber ein recht starker Bremser. Es empfiehlt sich daher, die automatische Berechnung zu Beginn des Makros ausund am Ende des Makros wieder einzuschalten. Makros laufen somit erheblich schneller! In Listing 5.6 sehen Sie den Makrorahmen für die Aus- und Einschaltung der automatischen Berechnung in Excel: Listing 5.6: Die automatische Berechnung aus- und einschalten Sub BerechnungAusUndEin() Application.Calculation = xlManual 'Weitere Aktionen
153
Einstellen und Anpassen der Excel-Anwendung
Application.CalculateBeforeSave = True Application.Calculation = xlAutomatic End Sub
Weisen Sie der Eigenschaft Calculation zu Beginn des Makros die Konstante xlManual zu, um die automatische Neuberechnung von Excel zu unterdrücken. Setzen Sie die Eigenschaft CalculateBeforeSave auf den Wert True, damit die Arbeitsmappe, auch wenn die Eigenschaft Calculation auf xlManual gesetzt ist, vor dem Speichern neu berechnet wird. Am Ende des Makros weisen Sie der Eigenschaft Calculation die Konstante xlAutomatic zu, um die Berechnung wieder zu aktivieren.
Statuszeile einsetzen Gerade bei länger laufenden Makros ist es wichtig, den Anwender während der Laufzeit des Makros nicht »im Regen stehen« zu lassen. Da während eines Makros kein paralleles Arbeiten mit Excel möglich ist, sollten Sie den Anwender durch die Statusleiste über die einzelnen Schritte des Makros informieren. Das Makro in Listing 5.7 zeigt, wie Sie die Statusleiste einsetzen können: Listing 5.7: Die Statusleiste benutzen Sub StatusBarAnsprechen() Dim l As Long Application.DisplayStatusBar = True Application.StatusBar = "Makrosverarbeitung beginnt..." For l = 1 To 30000000 'erste Aufgabe Next l Application.StatusBar = "Erste Aufgabe wurde beendet!" For l = 1 To 30000000 'zweite Aufgabe Next l Application.StatusBar = "Makroverarbeitung fast abgeschlossen!" For l = 1 To 30000000
154
Lang laufende Makros schneller machen
'Kurz vor Ende des Makros Next l Application.StatusBar = False End Sub
Sorgen Sie im ersten Schritt dafür, dass die Statusleiste sicherheitshalber auch eingeblendet wird. Dazu setzen Sie die Eigenschaft DisplayStatusBar auf den Wert True. Danach geben Sie über die Eigenschaft StatusBar einen beliebigen Text ein, der in der Statusleiste angezeigt werden soll. Im Anschluss daran arbeiten Sie eine Schleife ab, die in diesem Fall für eine beliebige Aufgabe stehen soll. Danach ändern Sie den Text der Statuszeile, indem Sie der Eigenschaft StatusBar einen neuen Text zuweisen. Setzen Sie am Ende des Makros die Eigenschaft StatusBar auf den Wert False, um die Steuerung der Statusleiste wieder an Excel zurückzugeben. Im nächsten Beispiel werden Sie die Statuszeile einsetzen, um eine Suche nach ExcelDateien zu dokumentieren. Dabei werden Excel-Arbeitsmappen in einem bestimmten Verzeichnis gesucht und die Namen der gefundenen Arbeitsmappen in der Statusleiste angezeigt. Den Code für diese Aufgabenstellung sehen Sie in Listing 5.8: Listing 5.8: Die Suchergebnisse in der Statusleiste anzeigen Sub DateienListen() Dim NächsteDatei As String Dim i As Integer Const DateiSuche = "C:\Eigene Dateien" Application.StatusBar = "Suchen in " & DateiSuche & "\" NächsteDatei = Dir(DateiSuche & "\" & "*.xls") i = 0 Do Until NächsteDatei = "" i = i + 1 Cells(i, 1).Value = DateiSuche & "\" & NächsteDatei Application.StatusBar = DateiSuche & "\" & NächsteDatei NächsteDatei = Dir() Loop Application.StatusBar = False End Sub
Definieren Sie zu Beginn des Makros das zu durchsuchende Verzeichnis in einer Konstanten. Danach geben Sie den Namen des Verzeichnisses in der Statusleiste aus. Über die Funktion Dir suchen Sie jetzt die erste Excel-Datei. Dabei übergeben Sie der Funktion die Information, in welchem Verzeichnis gesucht werden soll, und die Dateiendung *.xls. Damit wird die erste Excel-Datei im angegebenen Verzeichnis ermittelt.
155
Einstellen und Anpassen der Excel-Anwendung
In einer anschließenden Schleife wiederholen Sie den Suchvorgang, bis Sie alle ExcelDateien im angegebenen Verzeichnis gefunden haben. Innerhalb der Schleife geben Sie den Namen der jeweils gefundenen Arbeitsmappe in der Tabelle über die Eigenschaft Cells aus, wobei Sie das erste Argument dieser Eigenschaft dynamisch halten und bei jedem Schleifendurchlauf um den Wert 1 erhöhen. Das Spaltenargument dieser Eigenschaft wird konstant auf dem Wert 1 gehalten, was soviel bedeutet, dass die Spalte A angesprochen wird. Zusätzlich schreiben Sie die Namen der gefundenen Arbeitsmappen über die Eigenschaft StatusBar in die Statusleiste. Wiederholen Sie den Suchvorgang, indem Sie die Funktion Dir erneut am Ende der Schleife einsetzen. Dabei müssen Sie die Argumente der Funktion Dir nicht erneut formulieren. Setzen Sie am Ende des Makros die Eigenschaft StatusBar auf den Wert False, um die Steuerung der Statusleiste wieder an Excel zurückzugeben.
Abbildung 5.4: Die Suchergebnisse werden in der Tabelle sowie in der Statusleiste vermerkt.
Standardmeldungen abschalten Wenn Sie beispielsweise eine Tabelle aus Ihrer Arbeitsmappe entfernen möchten, werden Sie gefragt, ob Sie diesen Vorgang wirklich durchführen möchten. Gerade solche Standardmeldungen sollten Sie beim Starten von Makros unterdrücken, damit Sie diese nicht wegklicken müssen.
156
Automatische Listen generieren
Im folgenden Beispiel wird eine Tabelle ohne Rückfrage gelöscht: Listing 5.9: Das aktive Tabellenblatt wird ohne Nachfrage gelöscht Sub MeldungenUnterdrücken() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub
Setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um Standardmeldungen in Excel zu unterdrücken. Am Ende des Makros sollten Sie diese Einstellung jedoch wieder rückgängig machen, weil Excel dies nicht automatisch macht.
5.4
Automatische Listen generieren
Sicher kennen Sie in Excel das Ausfüllkästchen, über das Sie blitzschnell ganze Datenreihen anlegen können. Ein Beispiel für eine Liste, welche bereits fest in Excel integriert ist, ist die Tagesliste. Schreiben Sie einmal das Wort Montag in eine Zelle und ziehen Sie das Ausfüllkästchen dieser Zelle nach rechts.
Abbildung 5.5: Die automatisch integrierte Liste mit den Tagesnamen
Weitere benutzerdefinierte Listen können Sie per Makro einfügen.
Benutzerdefinierte Liste aus Makro erzeugen Im nächsten Beispiel wird eine kleine Länderliste als benutzerdefinierte Liste angelegt. Dabei werden die einzelnen Listeneinträge direkt im Makro angegeben. Der Quellcode:
157
Einstellen und Anpassen der Excel-Anwendung
Listing 5.10: Eine benutzerdefinierte Liste anlegen Sub ListeEinfügen01() Application.AddCustomList Array _ ("Deutschland", "Spanien", "Italien", "Frankreich", "Polen") End Sub
Legen Sie mit der Methode AddCustomList eine neue benutzerdefinierte Liste in Excel an. Dabei geben Sie die einzelnen Listeneinträge über die Funktion Array bekannt. Trennen Sie jeden einzelnen Listeneintrag mit einem Komma und setzen Sie die einzelnen Listeneinträge in doppelte Hochkommas. Starten Sie das Makro aus Listing 5.10. und überprüfen Sie das Ergebnis, indem Sie aus dem Menü EXTRAS den Befehl OPTIONEN wählen und auf die Registerkarte BENUTZERDEFINIERTE LISTEN wechseln.
Abbildung 5.6: Die benutzerdefinierte Liste wurde angelegt.
Benutzerdefinierte Liste aus Zelleninhalten erzeugen Um eine benutzerdefinierte Liste zu erstellen, können Sie auch auf eine bereits erfasste Liste in einer Tabelle zugreifen und diese dann als benutzerdefinierte Liste angeben. Um diese Möglichkeit nachzuvollziehen, geben Sie in einer neuen Tabelle einmal in Spalte A ein paar Namen ein. Orientieren Sie sich dabei an Abbildung 5.7.
158
Automatische Listen generieren
Abbildung 5.7: Diese Namen sollen in eine benutzerdefinierte Liste transferiert werden.
Erfassen Sie nun das folgende Makro, um diese Namen in eine benutzerdefinierte Liste einzufügen: Listing 5.11: Eine Liste über einen Zellenbezug anlegen Sub ListeEinfügen02() Application.AddCustomList _ ListArray:=Sheets("Tabelle5").Columns("A:A") End Sub
Wenden Sie die Methode AddCustomList an, um eine benutzerdefinierte Liste anzulegen. Damit Excel weiß, dass es in diesem Fall die einzelnen Einträge aus einer Tabelle übernehmen soll, geben Sie im Argument ListArry die Spalte A der TABELLE5 an. Starten Sie das Makro aus Listing 5.11 und kontrollieren Sie das Ergebnis.
Abbildung 5.8: Die benutzerdefinierte Liste wurde aus einer Tabelle übernommen und angelegt.
159
Einstellen und Anpassen der Excel-Anwendung
5.5
Drag&Drop ein- und ausschalten
Die gerade beschriebene Funktion des Auto-Ausfüllens über benutzerdefinierte Listen ist nur dann möglich, wenn Sie im Menü EXTRAS unter dem Befehl OPTIONEN auf der Registerkarte BEARBEITEN die Drag&Drop-Funktion aktiviert haben. Möchten Sie Drag&Drop nicht zulassen, können Sie diese Einstellung auch dynamisch über das folgende VBA-Makro erfassen: Listing 5.12: Drag&Drop ausschalten Sub AusschaltenDragUndDrop() Application.CellDragAndDrop = False End Sub
Setzen Sie die Eigenschaft CellDragAndDrop auf den Wert False, wenn Sie verhindern möchten, dass das Ziehen und Ablegen von Zellen durchgeführt werden kann. Indem Sie diese Eigenschaft auf den Wert True setzen, wird diese Art der Zellenbearbeitung wieder zugelassen.
5.6
Add-Ins überprüfen
Bestimmte Tabellenfunktionen sind standardmäßig in Excel nicht direkt verfügbar. Nur über das Einbinden von zusätzlichen Add-Ins können Sie diese Funktionen einsetzen. Daher sollten Sie vor dem Gebrauch einer Tabellenfunktion aus einem Add-In prüfen, ob es bereits eingebunden ist. Im folgenden Makro werden alle zurzeit eingebundenen Add-Ins in einer Bildschirmmeldung angezeigt: Listing 5.13: Auflistung der eingebundenen Add-Ins Sub WelcheAddInsSindInstalliert() Dim AddI As AddIn Dim s As String For Each AddI In Application.AddIns If AddI.Installed = True Then s = s & Chr(13) _ & AddI.Name & " --> " & AddI.FullName Next MsgBox "Folgende Add-Ins sind derzeit installiert:" & _ Chr(13) & s, vbInformation + vbOKOnly End Sub
160
Wiedervorlageliste bearbeiten
Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ AddIn. In einer Schleife arbeiten Sie das Auflistungsobjekt AddIns ab, in dem alle Add-Ins verzeichnet sind, die sich momentan im Add-Ins-Manager befinden. Über eine If-Abfrage und der Eigenschaft Installed überprüfen Sie, ob das jeweilige Add-In eingebunden ist. Wenn ja, dann sammeln Sie die Namen sowie deren Speicherpfad in der Variablen s. Um diese beiden Informationen zu erhalten, setzen Sie die Eigenschaften Name und FullName ein. Geben Sie die so gesammelten Informationen am Ende des Makros auf dem Bildschirm aus.
Abbildung 5.9: Ausgabe von Add-Ins und deren Installationspfaden
5.7
Wiedervorlageliste bearbeiten
Wenn Sie in Excel das Menü DATEI herunterklappen, sehen Sie ganz unten im Menü eine Auflistung der zuletzt geöffneten Arbeitsmappen.
Abbildung 5.10: Die Wiedervorlageliste von Excel
161
Einstellen und Anpassen der Excel-Anwendung
Die Liste der zuletzt geöffneten Dateien können Sie verändern. So können Sie beispielsweise dafür sorgen, dass dort überhaupt keine Arbeitsmappen mehr angezeigt werden. Wie das genau aussieht, können Sie im folgenden sehen: Listing 5.14: Die Wiedervorlageliste verbergen Sub WiedervorlageListeZurücksetzen() With Application .DisplayRecentFiles = False End With End Sub
Setzen Sie die Eigenschaft DisplayRecentFiles auf den Wert False, um die Liste der zuletzt geöffneten Dateien im Menü DATEI nicht anzuzeigen. Möchten Sie die Wiedervorlageliste in Zukunft wieder anzeigen und bestimmen, wie viele Arbeitsmappen dort maximal angezeigt werden sollen, dann starten Sie das Makro aus Listing 5.15: Listing 5.15: Die Wiedervorlageliste festlegen Sub WiedervorlageListeFestlegen() With Application .DisplayRecentFiles = True .RecentFiles.Maximum = 4 End With End Sub
Über die Auflistung RecentFiles bekommen Sie Zugriff auf die zuletzt geöffneten Arbeitsmappen. Die maximale Anzahl der Einträge in der Wiedervorlageliste der zuletzt geöffneten Dateien kann zwischen 0-9 eingestellt werden. Ein wenig problematisch ist Folgendes: Wird eine Arbeitsmappe in der Wiedervorlageliste angezeigt, die Sie in der Zwischenzeit gelöscht bzw. in ein anderes Verzeichnis verschoben haben, dann erhalten Sie eine Fehlermeldung, wenn Sie versuchen, diese Arbeitsmappe über die Wiedervorlageliste zu öffnen.
Abbildung 5.11: Die Arbeitsmappe kann nicht gefunden werden.
162
Sonstige Einstellmöglichkeiten in Excel
Schreiben Sie daher ein Makro, welches jeden einzelnen Eintrag in der Wiedervorlageliste überprüft. Sollte die dort angegebene Arbeitsmappe nicht mehr auffindbar sein, wird der dazugehörige Eintrag aus der Wiedervorlageliste entfernt. Das Makro für die Lösung dieser Aufgabenstellung sehen Sie in Listing 5.16: Listing 5.16: Die Vorlageliste bereinigen Sub VorlageListeLöschen() Dim Wiedervorlage As RecentFile For Each Wiedervorlage In Application.RecentFiles If Dir(Wiedervorlage.Name) = "" Then Wiedervorlage.Delete End If Next Wiedervorlage End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ RecentFile. Danach durchlaufen Sie jeden einzelnen Eintrag in der Wiedervorlageliste und überprüfen mithilfe der Funktion Dir, ob die so verzeichnete Arbeitsmappe überhaupt noch verfügbar ist. Wenn nicht, meldet die Funktion Dir eine leere Zeichenfolge zurück. In diesem Fall wenden Sie die Methode Delete an, um den Eintrag aus der Wiedervorlageliste zu entfernen.
5.8
Sonstige Einstellmöglichkeiten in Excel
Zum Abschluss dieses Tages lernen Sie noch ein paar weitere Einstellungen in Excel kennen, die Sie über den Einsatz von VBA einstellen können.
Allgemeine Einstellungen Rufen Sie zu diesem Zweck einmal das Dialogfeld OPTIONEN aus dem Menü EXTRAS auf und wechseln Sie auf die Registerkarte ALLGEMEIN. Im unteren Abschnitt des Dialogs können Sie ganz allgemeine Dinge, wie die Anzahl der Tabellen, die mit jeder neuen Arbeitsmappe angeboten werden sollen, die Standardschriftart, den Standardspeicherort von Dateien und mehr einstellen.
163
Einstellen und Anpassen der Excel-Anwendung
Abbildung 5.12: Allgemeine Optionen einstellen
Nun sollen die folgenden Einstellungen per VBA durchgeführt werden: 쐽
12 Blätter in jeder neuen Arbeitsmappe anbieten
쐽
Die Standardschriftart lautet COURIER in der Schriftgröße 11
쐽
Der Standardspeicherort lautet: C:\Eigene Dateien\Excel
쐽
Der Benutzername lautet HELD
Das entsprechende Makro sehen Sie in Listing 5.17: Listing 5.17: Allgemeine Einstellungen vornehmen Sub AllgemeineEinstellungenVornehmen() With Application .UserName = "Held" .StandardFont = "Courier" .StandardFontSize = "11" .DefaultFilePath = "C:\Eigene Dateien\Excel" .SheetsInNewWorkbook = 12 End With End Sub
Mithilfe der Eigenschaft UserName können Sie den Anwendernamen in Excel bekannt geben. Dieser Name erscheint dann auch in den Dokumenteigenschaften jeder Arbeitsmappe, die Sie zukünftig anlegen. Die Dokumenteigenschaften können Sie abrufen, indem Sie aus dem Menü DATEI den Befehl EIGENSCHAFTEN auswählen. Über die Eigenschaft StandardFont können Sie die Standardschriftart von Excel festlegen. Die Eigenschaft StandardFontSize bestimmt die Standardschriftgröße. Bereits anders for-
164
Sonstige Einstellmöglichkeiten in Excel
matierte Zellen bleiben von dieser Einstellung unberührt. Diese Einstellung gilt lediglich für neue Arbeitsmappen. Die Eigenschaft DefaultFilePath gibt Aufschluss darüber, welches Verzeichnis beim Öffnen von Arbeitsmappen standardmäßig angesteuert und im Dialogfeld ÖFFNEN angezeigt werden soll. Über die Eigenschaft SheetsInNewBook können Sie die Anzahl der Tabellen festlegen, die beim Einfügen einer neuen Arbeitsmappe standardmäßig angeboten werden. Sie haben dabei die Möglichkeit, einen Wert zwischen 1 und 255 einzutragen. Die Einstellungen werden erst nach einem erneuten Excel-Start wirksam!
Zoom einstellen In Excel haben Sie die Möglichkeit, Ihre Tabellen über ein eingebautes Zoom zu vergrößern bzw. zu verkleinern. Dazu setzen Sie die Eigenschaft Zoom ein, der Sie einen Zoomfaktor zwischen 10% und 400% übergeben können. Ein eingestelltes Zoom von 100% entspricht dabei einer Ansicht der Tabelle im Verhältnis 1:1. Im folgenden Makro werden alle Tabellenblätter einer Arbeitsmappe einheitlich auf den Zoomfaktor 80% eingestellt. Listing 5.18: Einheitliches Zoom auf allen Tabellen einstellen Sub ZoomEinstellen() Dim i As Integer For i = 1 To ActiveWorkbook.Sheets.Count Sheets(i).Select ActiveWindow.Zoom = 80 Next i End Sub
Aktivieren Sie in einer Schleife eine Tabelle nach der anderen und stellen Sie das Zoom einheitlich auf 80% ein.
165
Einstellen und Anpassen der Excel-Anwendung
Abbildung 5.13: Das Zoom wurde auf allen Tabellen gleich eingestellt
Aufenthaltsbereich festlegen Über die Eigenschaft ScrollArea können Sie den Aufenthaltsbereich eines Anwenders in einer Tabelle genau festlegen. Sie haben dabei die Möglichkeit, einen ganz bestimmten Zellenbereich anzugeben. Im folgenden Beispiel darf ein Anwender sich nur im Bereich B4:G15 auf der TABELLE6 aufhalten. Es wird ihm nicht gelingen, den Mauszeiger auf eine Zelle außerhalb dieses Bereiches zu setzen. Auch das Betätigen der Bildlaufleisten wird über diesen Bereich hinaus nicht mehr funktionieren. Listing 5.19: Den Aufenthaltsbereich bestimmen Sub AufenthaltsbereichFestlegen() Worksheets("Tabelle6").ScrollArea = "B4:G15" End Sub
Legen Sie den Aufenthaltsbereich für Ihren Anwender fest, indem Sie der Eigenschaft ScrollArea die genauen Zellenkoordinaten sowie den Tabellennamen bekannt geben. Der Aufenthaltsbereich muss nach jedem Öffnen der Arbeitsmappe neu eingestellt werden. Leider behält Excel diese Einstellung nach dem Beenden und Speichern der Arbeitsmappe nicht bei. Sie können Excel aber austricksen! Befolgen Sie nun die folgenden Arbeitsschritte, um den Aufenthaltsbereich dauerhaft einzustellen: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Führen Sie im Projekt-Explorer einen Doppelklick auf den Eintrag DIESE ARBEITSMAPPE durch.
166
Sonstige Einstellmöglichkeiten in Excel
3. Im Code-Fenster wählen Sie aus dem ersten Dropdown-Menü den Eintrag WORKBOOK. 4. Nun wird das Ereignis Workbook_Open eingefügt, welches Sie wie folgt ergänzen. Listing 5.20: Den Aufenthaltsbereich immer wieder neu einstellen Private Sub Workbook_Open() AufenthaltsbereichFestlegen End Sub
Das Ereignis Workbook_Open wird bei jedem Öffnen der Arbeitsmappe automatisch ausgeführt. Ein idealer Zeitpunkt, um die ScrollArea festzulegen!
Abbildung 5.14: Nach dem Öffnen der Arbeitsmappe können Sie sich nur im Bereich B4:G15 aufhalten.
Erfahren Sie mehr über den Einsatz von Ereignissen am 10. Tag.
167
Einstellen und Anpassen der Excel-Anwendung
5.9
Workshop
5.9.1 Fragen & Antworten F
Wie können Sie auf die Wiedervorlageliste von Excel zugreifen? A
Über das folgende Makro werden alle Arbeitsmappen, die in der Vorlageliste stehen, in einem Meldungsfenster angezeigt: Listing 5.21: Alle Arbeitsmappen der Vorlageliste werden ausgegeben Sub VorlageListeAnzeigen() Dim Wiedervorlage As RecentFile Dim s As String For Each Wiedervorlage In Application.RecentFiles s = s & Wiedervorlage.Name & Chr(13) Next Wiedervorlage MsgBox s End Sub
F
Wie können Sie den Pfad der aktiven Arbeitsmappe ausgeben? A
Starten Sie dazu das Makro aus Listing 5.22: Listing 5.22: Den Speicherpfad einer Mappe ermitteln Sub VerzeichnisZurückgeben() Dim s As String s = Application.ActiveWorkbook.Path MsgBox s End Sub
Über die Eigenschaft Path können Sie den Speicherpfad der aktiven Arbeitsmappe ermitteln. F
Wie können Sie die Registerkarten der Tabellen verstecken? A
168
Über die Anweisung ActiveWindow.DisplayWorkbookTabs = False
Workshop
5.9.2 Quiz 1. Wie kann man die Bildschirmaktualisierung abschalten? 2. Was muss man beachten, wenn man die Statuszeile einsetzen und eigene Meldungen dort ausgeben möchte? 3. Wie kann man Standardmeldungen in Excel abschalten?
5.9.3 Übung Überprüfen Sie doch mal, ob das Add-In SOLVER bereits geladen ist. Die Lösung finden Sie im Anhang.
169
Auf Arbeitsmappen zugreifen – Datei-Operationen
6
Auf Arbeitsmappen zugreifen – Datei-Operationen
Am gestrigen Tag haben Sie einen Einblick darin erhalten, welche Einstellungen Sie in Excel vornehmen können. Unter anderem haben Sie gelernt, wie Sie Makros noch schneller machen und bestimmte Objekte in der Excel-Anwendung ein- und ausblenden können. Die Themen heute: 쐽
Arbeitsmappen öffnen
쐽
Arbeitsmappen speichern
쐽
Arbeitsmappen schließen
쐽
Arbeitsmappen anlegen
쐽
Arbeitsmappen zusammenführen
쐽
Arbeitsmappen entfernen
쐽
Dokumenteigenschaften
쐽
Verknüpfungen in Arbeitsmappen
Die Arbeitsmappe wird durch das Objekt Workbook angesprochen. Für dieses Objekt stehen die zu erwartenden Methoden wie das Öffnen, Speichern, Schließen, Löschen und weitere zur Verfügung. Lernen Sie nun anhand einiger Praxisaufgaben den Einsatz dieser Methoden kennen. Alle Makrobeispiele können Sie in der Arbeitsmappe Mappe.xls im Verzeichnis Kap06 auf der beiliegenden CD-ROM nachschlagen.
6.1
Arbeitsmappen öffnen
Als Erstes werden Sie erfahren, wie Sie eine Arbeitsmappe öffnen können. Um eine Arbeitsmappe zu öffnen, setzen Sie die Methode Open ein. Die wichtigsten Argumente der Methode Open lauten: Workbooks.Open(FileName, UpdateLinks, ReadOnly, _ Format, Password, Origin, Delimiter, Editable, _ Notify, Converter)
Über das Argument FileName können Sie den Namen der Arbeitsmappe angeben, welche Sie öffnen möchten. Das Argument UpdateLinks legt fest, ob evtl. in der Arbeitsmappe enthaltene Verknüpfungen aktualisiert werden sollen oder nicht. Sicher haben Sie auch schon einmal beim Öffnen einer Arbeitsmappe die Meldung erhalten, ob Sie die Verknüpfungen in der
172
Arbeitsmappen öffnen
Arbeitsmappe aktualisieren möchten oder nicht. Diese Abfrage können Sie unterdrücken, indem Sie ein entsprechendes Argument 0-3 einsetzen. Die Bedeutung der verschiedenen Werte entnehmen Sie der folgenden Tabelle: Konstante
Bedeutung
0
Keine Aktualisierung von Bezügen
1
Aktualisierung von externen Bezügen, jedoch nicht von Fernbezügen
2
Aktualisierung von Fernbezügen, jedoch nicht von externen Bezügen
3
Aktualisierung von externen Bezügen und Fernbezügen
Tabelle 6.1: Die Konstanten für das Argument UpdateLinks
Setzen Sie das Argument ReadOnly auf den Wert True, wenn Sie die Arbeitsmappe schreibgeschützt öffnen möchten. Der Anwender hat dann keine Chance, Änderungen an dieser Arbeitsmappe vorzunehmen. Das Argument Format kommt zum Einsatz, wenn Sie eine Textdatei öffnen möchten. Über dieses Argument geben Sie das Trennzeichen an, welches in der Textdatei verwendet wird. Wenn dieses Argument nicht angegeben ist, wird das aktuelle Trennzeichen verwendet. Folgende Möglichkeiten stehen dabei zur Verfügung: Wert
Trennzeichen
1
Tabstopp
2
Komma
3
Leerzeichen
4
Semikolon
5
Keine
6
Benutzerdefiniertes Trennzeichen
Tabelle 6.2: Die Konstanten für das Argument Format
Das Argument Password muss dann gesetzt werden, wenn Sie versuchen, eine kennwortgeschützte Arbeitsmappe zu öffnen. In diesem Argument geben Sie das Passwort ein. Wird dieses Argument nicht angegeben, so erscheint beim Öffnen einer kennwortgeschützten Arbeitsmappe ein Dialogfeld, in dem Sie das Passwort eingeben müssen. Ohne Kenntnis dieses Passworts haben Sie keine Möglichkeit, die Arbeitsmappe zu öffnen.
173
Auf Arbeitsmappen zugreifen – Datei-Operationen
Das Argument Origin kommt dann zum Einsatz, wenn es sich bei der zu öffnenden Datei um eine Textdatei handelt. Dabei wird der Dateiursprung angegeben. In den meisten Fällen wird dies die Konstante xlWindows sein. Das Argument Delimiter wird nur gesetzt, wenn es sich um eine Textdatei handelt und das Argument Format den Wert 6 (benutzerdefiniert) hat. Dabei gibt das Argument Delimiter die Zeichenfolge des zu verwendenden Trennzeichens an. Die restlichen Argumente der Methode Open sind in der Praxis eher weniger im Einsatz und können bei Bedarf in der Online-Hilfe nachgelesen werden. Üben Sie nun den Einsatz der Methode Open anhand einiger ausgesuchter Praxisbeispiele.
Arbeitsmappe öffnen (ohne Aktualisierung) In der folgenden Aufgabe soll eine Arbeitsmappe in einem bestimmten Verzeichnis geöffnet werden. Dabei sollen die in der Arbeitsmappe enthaltenen Verknüpfungen beim Öffnen nicht aktualisiert werden. Das Makro für diese Aufgabe sehen Sie in Listing 6.1: Listing 6.1: Eine Arbeitsmappe ohne Aktualisierung von Verknüpfungen öffnen Sub ArbeitsmappeÖffnen() Const LW = "C:\" Const Pfad = "C:\Eigene Dateien" ChDrive LW ChDir Pfad On Error GoTo fehler Workbooks.Open Filename:="Mappe1.xls", UpdateLinks:=0 Exit Sub fehler: MsgBox "Die angegebene Arbeitsmappe konnte nicht gefunden werden!" End Sub
Hinweis: Sollte das angegebene Verzeichnis, welches Sie in der Konstanten Pfad angegeben haben, nicht exisitieren, dann liefert das Makro aus Listing 6.1 einen Fehler. Im ersten Schritt legen Sie über den Einsatz von Konstanten fest, auf welchem Laufwerk bzw. in welchem Verzeichnis sich die zu öffnende Arbeitsmappe befindet. Über die Anweisung ChDrive wechseln Sie auf das gewünschte Laufwerk. Sie können sich nicht sicher sein, dass Sie automatisch schon im richtigen Verzeichnis stehen, und setzen daher die Anweisung ChDir ein, um ein bestimmtes Verzeichnis einzustellen.
174
Arbeitsmappen öffnen
Wenden Sie anschließend die Methode Open an, um die Arbeitsmappe zu öffnen. Im Argument UpdateLinks geben Sie den Wert 0 an, was bedeutet, dass die Verknüpfungen zu anderen Arbeitsmappen beim Öffnen nicht aktualisiert werden. Über die Anweisung On Error GoTo fehler stellen Sie sicher, dass das Makro nicht abstürzt, sollte die angegebene Arbeitsmappe nicht im vorgegebenen Verzeichnis existieren. In diesem Fall läuft Excel auf einen Fehler, den Sie aber abfangen. Im Fehlerfall wird direkt in den Paragrafen fehler verzweigt und ihre eigene Meldung auf dem Bildschirm angezeigt.
Arbeitsmappe(n) öffnen über ein Dialogfeld Um in einem Dialogfeld elegant die Arbeitsmappe(n), die Sie öffnen möchten, auszuwählen, können Sie mithilfe der Methode GetOpenFileName den Dialog ÖFFNEN anzeigen und auswerten. Im folgenden Beispiel wird der Dialog ÖFFNEN angezeigt. Sie haben dabei die Möglichkeit, eine Arbeitsmappe im Dialogfeld auszuwählen und zu öffnen. Listing 6.2: Den Dialog Öffnen anzeigen Sub ArbeitsmappeÖffnenDialog() Dim DatOP As Variant DatOP = Application.GetOpenFilename("Excel-Dateien(*.xls),*.xls") If DatOP = False Then Exit Sub Workbooks.Open Filename:=DatOP End Sub
Geben Sie bei der Methode GetOpenFilename den Filter an, nachdem Dateien im Dialogfeld ÖFFNEN angezeigt werden. Da Sie Excel-Dateien im Dialogfeld anzeigen möchten, geben Sie die Endung .xls an. Nach dem Aufruf des Dialogs müssen Sie prüfen, ob das Dialogfeld ÖFFNEN mit der Schaltfläche ABBRECHEN wieder verlassen wurde. In diesem Fall wird in der Variablen DatOP der Wert False zurückgegeben, was mit einem Verlassen des Makros über die Anweisung Exit Sub quittiert wird. Im anderen Fall öffnen Sie mithilfe der Methode Open die ausgewählte Arbeitsmappe, die in der Variablen DatOP verzeichnet ist. Über dasselbe Dialogfeld haben Sie auch die Möglichkeit, mehrere Excel-Arbeitsmappen auf einmal zu öffnen. Für diesen Zweck müssen Sie das Makro aus Listing 6.2 ein wenig umschreiben.
175
Auf Arbeitsmappen zugreifen – Datei-Operationen
Abbildung 6.1: Das Dialogfeld Öffnen
Listing 6.3: Mehrere Mappen können im Dialog Öffnen markiert werden Sub ArbeitsmappenÖffnenDialog() Dim i As Integer Dim DatOP As Variant i = 0 DatOP = Application.GetOpenFilename("Excel-Dateien(*.xls),*.xls", _ MultiSelect:=True) If IsArray(DatOP) Then For i = LBound(DatOP) To UBound(DatOP) Workbooks.Open DatOP(i) Next i Else MsgBox "Sie haben keine Arbeitsmappe ausgewählt" End If End Sub
Zeigen Sie das Dialogfeld ÖFFNEN an, indem Sie die Methode GetOpenFileName einsetzen. Damit Sie die Möglichkeit haben, mehrere Arbeitsmappen im Dialogfeld über die Taste (Strg) zu markieren, müssen Sie hierbei das Argument MultiSelect auf den Wert True setzen.
176
Arbeitsmappen öffnen
Abbildung 6.2: Das Dialogfeld Öffnen mit Mehrfachauswahl anzeigen
Im nächsten Schritt müssen Sie überprüfen, ob überhaupt eine Arbeitsmappe im Dialogfeld ÖFFNEN markiert wurde. Wenn ja, dann meldet die Funktion IsArray den Wert True. In diesem Fall stehen die markierten Namen der Arbeitsmappen im Datenfeld DatOP. Dieses Datenfeld wird anschließend über den Einsatz einer Schleife abgearbeitet. Dabei repräsentiert die Funktion LBound den ersten Eintrag (die erste markierte Arbeitsmappe) und die Funktion UBound den letzten Eintrag im Datenfeld DatOP (letzte markierte Arbeitsmappe). Innerhalb dieser Schleife wenden Sie die Methode Open an, um die markierten Arbeitsmappen nacheinander zu öffnen. Über die Zählvariable sprechen Sie dabei eine Arbeitsmappe nach der anderen an.
Geöffnete Arbeitsmappen identifizieren Wenn Sie mit mehreren geöffneten Arbeitsmappen arbeiten, müssen Sie genau wissen, welche Arbeitsmappen derzeit geöffnet sind. Im folgenden Makro werden alle zurzeit geöffneten Arbeitsmappen in einem Meldungsfenster am Bildschirm angezeigt: Listing 6.4: Alle geöffneten Arbeitsmappen im Überblick Sub MappenGeöffnetErmitteln() Dim Mappe As Workbook Dim s As String For Each Mappe In Workbooks s = Mappe.Name & Chr(13) & s Next Mappe
177
Auf Arbeitsmappen zugreifen – Datei-Operationen
MsgBox "Folgende Mappen sind derzeit geöffnet: " & _ Chr(13) & s, vbInformation + vbOKOnly End Sub
Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Workbook und eine Variable vom Typ String, die die Namen der geöffneten Arbeitsmappen aufnehmen soll. Danach setzen Sie eine Schleife auf und arbeiten alle geöffneten Arbeitsmappen ab. Diese werden Ihnen über das Auflistungsobjekt Workbooks zur Verfügung gestellt. Speichern Sie die Namen der Arbeitsmappen mithilfe der Eigenschaft Name in der String-Variablen s. Nach jedem ermittelten Namen erzeugen Sie über die Anweisung Chr(13) eine neue Zeile. Nach dem Verlassen der Schleife geben Sie die ermittelten Namen der geöffneten Arbeitsmappen am Bildschirm aus.
Abbildung 6.3: Diese Arbeitsmappen sind derzeit geöffnet.
Bei dieser Lösung werden auch ausgeblendete Arbeitsmappen wie die Mappe PERSONL.XLS aufgelistet. Die Mappe PERSONL.XLS ist die zentrale Makroarbeitsmappe, in der Sie Makros ablegen können, die Sie auch für alle anderen Arbeitsmappen gebrauchen können.
6.2
Arbeitsmappen speichern
Beim Speichern einer Arbeitsmappe müssen Sie wissen, wo Sie die Mappe speichern möchten. Dazu verwenden Sie die ChDrive-Anweisung, um das Laufwerk zu bestimmen, sowie die Anweisung ChDir, um das richtige Verzeichnis einzustellen. Jetzt fehlt nur noch der Name. Im folgenden Beispiel führen Sie die Speicherung durch. Listing 6.5: Eine Arbeitsmappe speichern Sub ArbeitsmappeSpeichern() Dim s As String Const LW = "c:\" Const Pfad = "c:\Eigene Dateien"
178
Arbeitsmappen speichern
s = ActiveWorkbook.Name ChDrive LW ChDir Pfad ActiveWorkbook.SaveAs Filename:=s, FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=True End Sub
Die wichtigsten Argumente der Methode SaveAs lauten: ActiveWorkbook.SaveAs(Filename, FileFormat, Password, _ CreateBackup)
Das Argument FileName haben Sie im Makro aus Listing 6.5 in der Variablen s über die Eigenschaft Name ermittelt. Beim Argument FileFormat können Sie angeben, in welchem Format Sie Ihre Mappe speichern möchten. Mit dem nächsten Argument Password können Sie ein Passwort festlegen, welches der Anwender beim Öffnen der Datei eingeben muss, um die Datei laden zu können. Im Beispiel aus Listing 6.5 wurde eine Leerzeichenfolge übergeben, was bedeutet, dass kein Passwort beim Öffnen der Datei abgefragt wird. Das Argument CreateBackup setzen Sie auf den Wert True, wenn Excel von der Mappe eine Sicherungskopie anlegen soll. Excel legt dann eine Sicherungskopie unter demselben Namen mit dem Zusatz SICHERUNGSKOPIE VON... und der Endung WLK an. Die übrigen Argumente sind in der Praxis nicht so relevant und werden an dieser Stelle nicht weiter beschrieben. Eine Beschreibung können Sie aber in der Online-Hilfe nachlesen.
Arbeitsmappe speichern über das Dialogfeld Genauso wie schon beim Öffnen einer Arbeitsmappe beschrieben, gibt es in VBA auch eine Methode, um das Dialogfeld SPEICHERN UNTER anzuzeigen. Diese Methode heißt GetSaveAsFilename. Im folgenden Beispiel wird die momentan aktive Arbeitsmappe im Dialogfeld SPEICHERN UNTER angezeigt. Listing 6.6: Eine Arbeitsmappe im Dialogfeld Speichern unter anzeigen Sub ArbeitsmappeSpeichernDialog() Dim DATCl As Variant Const LW = "C:\" Const Pfad = "C:\Eigene Dateien" ChDrive LW ChDir Pfad
179
Auf Arbeitsmappen zugreifen – Datei-Operationen
DATCl = Application.GetSaveAsFilename _ (, "Excel-Dateien (*.xls),*.xls") If DATCl = False Then Else ActiveWorkbook.Save End If End Sub
Bevor Sie das Dialogfeld SPEICHERN UNTER aufrufen, sorgen Sie dafür, dass das gewünschte Laufwerk bzw. das Verzeichnis gewechselt wird. Setzen Sie dazu die Anweisungen ChDrive und ChDir ein. Danach rufen Sie über die Methode GetSaveAsFilename das Dialogfeld SPEICHERN UNTER auf. Als Filter stellen Sie die Excel-Dateien mit der Endung xls ein. Vor diesem Filter haben Sie die Möglichkeit, einen Namen bereits vorzugeben. Im Beispiel aus Listing 6.6 wurde bewusst darauf verzichtet, um den Dateinamen von Excel selbst vorschlagen zu lassen.
Abbildung 6.4: Arbeitsmappe speichern
Im folgenden Beispiel werden Sie selbst einen Namen für die Arbeitsmappe festlegen: Listing 6.7: Einen eigenen Namen bestimmen Sub EigenerNamen() Dim DATCl As Variant DATCl = Application.GetSaveAsFilename _ ("NEUEDATEI.XLS", "Excel-Dateien (*.xls),*.xls")
180
Arbeitsmappen speichern
If DATCl = False Then Else ActiveWorkbook.Save End If End Sub
In beiden Makros aus Listing 6.6 und 6.7 müssen Sie prüfen, ob nicht eventuell auch die Schaltfläche ABBRECHEN geklickt wurde. In diesem Fall würde die Variable DATCl den Wert False zurückmelden. Andernfalls speichern Sie die Arbeitsmappe, indem Sie die Methode Save anwenden.
Abbildung 6.5: Das Dialogfeld Speichern unter mit voreingestelltem Namen aufrufen
Alle geöffneten Arbeitsmappen speichern Im nächsten Beispiel sollen alle derzeit geöffneten Arbeitsmappen gespeichert werden. Das Makro sieht so aus: Listing 6.8: Alle geöffneten Arbeitsmappen speichern Sub AlleMappenSpeichern() Dim Mappe As Workbook For Each Mappe In Workbooks Mappe.Save Next Mappe End Sub
181
Auf Arbeitsmappen zugreifen – Datei-Operationen
Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Workbook. Danach setzen Sie eine Schleife auf und arbeiten alle geöffneten Arbeitsmappen ab. Innerhalb der Schleife setzen Sie die Methode Save ein, um die Arbeitsmappen zu speichern.
Arbeitsmappe speichern unter Datum/Uhrzeit Möchten Sie für Arbeitsmappen das aktuelle Tagesdatum sowie die momentane Uhrzeit als Dateinamen verwenden, dann können Sie das folgende Makro dafür einsetzen: Listing 6.9: Arbeitsmappe mit Datum/Uhrzeit benennen Sub MappeSpeichernMitDatumUndUhrzeit() Const LW = "C:\" Const Pfad = "C:\Eigene Dateien" ChDrive LW ChDir Pfad ActiveWorkbook.SaveAs _ (Date & "_" & Hour(Time) & "_" & Minute(Time) & ".xls") End Sub
Das aktuelle Tagesdatum für den Dateinamen bekommen Sie über die Funktion Date. Da im Dateinamen kein Doppelpunkt (Uhrzeit z.B. 12:30) vorkommen darf, müssen Sie die Zeitangabe mit den Funktionen Hour sowie Minute extrahieren und neu zusammensetzen.
Abbildung 6.6: Die Arbeitsmappe nach Datum und Uhrzeit benennen
182
Arbeitsmappen schließen
Arbeitsmappe bedingt speichern Eine Arbeitsmappe sollte nur dann gespeichert werden, wenn Änderungen an ihr vorgenommen wurden. Wenn Sie wissen möchten, ob seit dem letzten Öffnen der Arbeitsmappe Änderungen durchgeführt wurden, sei es durch Verknüpfungen oder Benutzereingaben, dann steht Ihnen hierfür die Eigenschaft Saved zur Verfügung. Sehen Sie sich nun das folgende Listing an: Listing 6.10: Prüfung durchführen, ob Arbeitsmappe geändert wurde Sub ÄnderungArbeitsmappe() If ActiveWorkbook.Saved = False Then MsgBox "Die Mappe wurde geändert!" ActiveWorkbook.Save Else MsgBox "Arbeitsmappe ist unverändert!" End If End Sub
Die Eigenschaft Saved liefert den Wert True, wenn die aktive Arbeitsmappe seit der letzten Speicherung nicht mehr geändert wurde. Gibt die Eigenschaft den Wert False zurück, wurden Änderungen in der Arbeitsmappe vorgenommen.
6.3
Arbeitsmappen schließen
Für das Schließen einer Arbeitsmappe steht Ihnen die Methode Close zur Verfügung. Möchten Sie eine Arbeitsmappe wieder schließen, müssen Sie standardmäßig eine Meldung mit »Ja« bestätigen, wenn Sie Änderungen in der Mappe durchgeführt haben. Diese Meldung können Sie aber unterdrücken, wenn Sie in der Methode Close ein zusätzliches Argument angeben.
Arbeitsmappe schließen – Änderungen speichern Im folgenden Beispiel wird die aktive Arbeitsmappe ohne weitere Rückfrage geschlossen. Die Änderungen in der Mappe werden dabei gesichert. Listing 6.11: Aktive Mappe schließen – Änderungen speichern Sub ArbeitsmappeSchließen() ActiveWorkbook.Close SaveChanges:=True End Sub
Die Methode Close schließt die Arbeitsmappe. Wird das Argument SaveChanges auf den Wert True gesetzt, werden Änderungen in der Arbeitsmappe gespeichert.
183
Auf Arbeitsmappen zugreifen – Datei-Operationen
Arbeitsmappe schließen – Änderungen verwerfen Sie können eine Arbeitsmappe schließen und die Änderungen in dieser Arbeitsmappe verwerfen, indem Sie folgendes Makro aus Listing 6.12 starten: Listing 6.12: Aktive Mappe schließen – Änderungen verwerfen Sub ArbeitsmappeSchließenÄnderungenVerwerfen() ActiveWorkbook.Close SaveChanges:=False End Sub
Mehrere Arbeitsmappen schließen Wenn Sie mehrere Arbeitsmappen in Excel geöffnet haben, können Sie ganz schnell mit der Tastenkombination (Strg) + (F6) zwischen den einzelnen Arbeitsmappen hin- und herspringen. Möchten Sie jetzt alle Arbeitsmappen schließen – mit Ausnahme der Arbeitsmappe, in der das Makro aus Listing 6.13 untergebracht ist –, dann starten Sie das folgende Makro: Listing 6.13: Alle Mappen bis auf eine schließen Sub MehrereMappenSchließen() Dim Mappe As Workbook For Each Mappe In Application.Workbooks If Mappe.Name ThisWorkbook.Name Then _ Mappe.Close SaveChanges:=True Next End Sub
Im Auflistungsobjekt Workbooks sind alle zurzeit geöffneten Arbeitsmappen verzeichnet. Dies können Sie in einer For Each-Schleife nützen, welche den Namen der Arbeitsmappe, die den Code aus Listing 6.13 enthält, mit den Namen der Arbeitsmappen vergleicht, die in der Auflistung stehen. Mit der Methode Close schließen Sie dann alle Arbeitsmappen bis auf die Arbeitsmappe, die das Listing 6.13 enthält. An dieser Stelle muss auf den Unterschied zwischen den Anweisungen ActiveWorkbook
und ThisWorkbook
hingewiesen werden.
184
Arbeitsmappen anlegen
Die Arbeitsmappe, welche mit der Eigenschaft ActiveWorkbook angesprochen wird, ist die Arbeitsmappe, die momentan aktiv ist, d.h. wenn Sie aus der Entwicklungsumgebung herausspringen und in die normale Arbeitsoberfläche von Excel wechseln. Mit der Eigenschaft ThisWorkbook ist die Arbeitsmappe gemeint, in die Sie die Makros eingeben. Halten Sie diese beiden Eigenschaften auseinander und klären Sie immer genau ab, was Sie mit welcher Arbeitsmappe anstellen möchten.
6.4
Arbeitsmappen anlegen
Möchten Sie neue Arbeitsmappen einfügen, dann verwenden Sie die Methode Add. Die Anzahl der Tabellenblätter, welche Excel in der neuen Arbeitsmappe zur Verfügung stellen soll, regeln Sie über die Eigenschaft SheetsInNewWorkbook. Achten Sie darauf, dass die Obergrenze der Tabellenblätter den Wert 255 nicht übersteigen darf. Legen Sie im folgenden Beispiel eine neue Arbeitsmappe mit drei Tabellenblättern an: Listing 6.14: Neue Arbeitsmappe einfügen Sub NeueArbeitsmappeAnlegen() Application.SheetsInNewWorkbook = 3 Workbooks.Add End Sub
6.5
Arbeitsmappen zusammenführen
In der folgenden etwas größeren Aufgabe werden Sie einige bereits gelernte Dinge nacheinander durchführen. Sie werden unter anderem eine neue Arbeitsmappe mit zunächst einem Tabellenblatt einfügen. Danach greifen Sie auf ein bestimmtes Verzeichnis zu und öffnen dort eine Arbeitsmappe nach der anderen. Übertragen Sie dann die einzelnen Tabellen in die gerade neu erstellte Arbeitsmappe. Das Makro zur Lösung dieser Aufgabenstellung können Sie im folgenden Listing sehen: Listing 6.15: Alle Mappen aus einem Verzeichnis werden zusammenkopiert Sub KonsolidierenAlleDateienEinesVerz() Dim Mappe As String Dim i As Integer Const LW = "C:\"
185
Auf Arbeitsmappen zugreifen – Datei-Operationen
Const Pfad = "C:\Eigene Dateien\Excel\" ChDrive LW ChDir Pfad Application.SheetsInNewWorkbook = 1 Workbooks.Add ActiveWorkbook.SaveAs ("C:\Eigene Dateien\Konsolidierung.xls") Mappe = Dir(Pfad & "*.xls") ChDir (Pfad) Do While Mappe "" Workbooks.Open Mappe For i = 1 To Workbooks(Mappe).Sheets.Count Workbooks(Mappe).Sheets(i).Copy _ Before:=Workbooks("Konsolidierung.xls").Sheets(1) Next i Workbooks(Mappe).Close SaveChanges:=False Mappe = Dir Loop End Sub
Wechseln Sie im ersten Schritt auf das gewünschte Laufwerk bzw. das Verzeichnis, in dem die zu konsolidierenden Arbeitsmappen stehen. Danach bestimmen Sie über die Eigenschaft SheetsInNewWorkbook, wie viele Tabellen in der neuen Arbeitsmappe enthalten sein sollen. Legen Sie direkt im Anschluss diese neue Arbeitsmappe über die Methode Add an. Speichern Sie die gerade neu erstellte Arbeitsmappe im Verzeichnis C:\Eigene Dateien. Basteln Sie sich nun den Suchbegriff zusammen und übergeben diesen der Funktion Dir. Stellen Sie danach wieder das Verzeichnis über die Anweisung ChDir ein, in dem die zu konsolidierenden Arbeitsmappen gespeichert sind. Setzen Sie jetzt eine Do while-Schleife auf, die solange durchlaufen wird, wie Arbeitsmappen im angegebenen Verzeichnis gefunden werden können. Innerhalb dieser Schleife öffnen Sie die einzelnen Arbeitmappen mithilfe der Methode Open. Jetzt benötigen Sie eine zweite Schleife, die die Tabellen der einzelnen Arbeitsmappen zählt. Über die Methode Copy kopieren Sie nun die einzelnen Tabellen in Ihre Konsolidierungsarbeitsmappe. Sind alle Tabellen der jeweiligen Arbeitsmappe übertragen, dann wenden Sie die Methode Close an, um die Arbeitsmappe wieder zu schließen. Setzen Sie dabei das Argument SaveChanges auf den Wert False, um diese Mappen ohne Rückfrage zu schließen. Suchen Sie danach über die Funktion Dir nach weiteren Arbeitsmappen.
186
Arbeitsmappen entfernen
6.6
Arbeitsmappen entfernen
Wenn Sie eine Arbeitsmappe ohne den Datei-Explorer von Windows löschen möchten, können Sie Arbeitsmappen über die Anweisung Kill entfernen. Dabei darf die zu löschende Arbeitsmappe selbstverständlich nicht geöffnet sein. Im folgenden Beispiel aus Listing 6.16 wird eine bestimmte Arbeitsmappe aus einem vorgegebenen Verzeichnis unwiederbringlich entfernt: Listing 6.16: Arbeitsmappe ohne Rückfrage löschen Sub ArbeitsmappeLöschen() Const Lw = "C:\" Const Pfad = "C:\Eigene Dateien" Const Datei = "Mappe1.xls" On Error GoTo fehler: Kill Datei MsgBox "Arbeitsmappe " & Datei & " wurde gelöscht!" Exit Sub fehler: MsgBox "Es konnte keine Datei mit dem Namen " & _ Datei & " gefunden werden!" End Sub
Beachten Sie hierbei die Fehlerbehandlung von Excel. Wenn Sie z.B. zweimal hintereinander versuchen, das Makro ArbeitsmappeLöschen auszuführen, bekommen Sie beim ersten Mal die Bestätigung, dass die Datei gelöscht wurde. Wenn Sie ein zweites Mal versuchen, die Arbeitsmappe zu löschen, liefert Excel Ihnen die Fehlermeldung, welche unter der Zeilenmarke Fehler steht.
6.7
Dokumenteigenschaften
Die Dokumenteigenschaften einer Arbeitsmappe können Sie eingeben oder auch ansehen, indem Sie aus dem Menü DATEI den Befehl EIGENSCHAFTEN wählen. Wie Sie sehen, sind die momentan verfügbaren Eigenschaften doch etwas rar gesät. Diese Dokumenteigenschaften können Sie über den Einsatz von VBA setzen.
187
Auf Arbeitsmappen zugreifen – Datei-Operationen
Abbildung 6.7: Die Dokumenteigenschaften der Arbeitsmappe
Dokumenteigenschaften auslesen Es existiert eine ganze Reihe von Dokumenteigenschaften für eine Arbeitsmappe. Wie aber können Sie wissen, wie Sie diese Dokumenteigenschaften ansprechen sollen? Die Antwort auf diese Frage können Sie im Makro in Listing 6.17 ablesen. Listing 6.17: Alle Dokumenteigenschaften auslesen Sub Dim Dim i =
DokumentEigenschaftenAuslesen() i As Integer obj As Object 1
Sheets.Add For Each obj In ActiveWorkbook.BuiltinDocumentProperties
188
Dokumenteigenschaften
Cells(i, 1).Value = obj.Name On Error Resume Next Cells(i, 2).Value = obj.Value i = i + 1 Next End Sub
Mit dem Befehl Sheets.Add fügen Sie eine neue Tabelle in Ihrer Arbeitsmappe ein. Danach bilden Sie eine Schleife, die nacheinander alle Dokumenteigenschaften der Arbeitsmappe durchläuft und deren Namen sowie deren momentane Inhalte in die Tabelle schreibt. Mithilfe der Eigenschaft BuiltinDocumentProperties wird Ihnen eine Auflistung aller Dokumenteigenschaften zur Verfügung gestellt.
Abbildung 6.8: Alle verfügbaren Dokumenteigenschaften
189
Auf Arbeitsmappen zugreifen – Datei-Operationen
Dokumenteigenschaften setzen Nachdem Sie nun wissen, wie die einzelnen Dokumenteigenschaften heißen, werden Sie die folgenden Dokumenteigenschaften setzen: 쐽
Der Titel soll gesetzt werden (z.B. VBA-Demos).
쐽
Das Thema soll ebenfalls gesetzt werden (z.B. Arbeitsmappenbeispiele).
쐽
Die Kategorie soll mit dem Begriff »VBA« gesetzt werden.
쐽
Als Stichwörter sollen die Begriffe VBA, Makros und Programmierung aufgeführt werden.
쐽
Ebenso soll ein mehrzeiliger Kommentar als Dokumenteigenschaft gesetzt werden.
Realisieren Sie diese Anforderungen, indem Sie das Makro aus Listing 6.18 starten. Listing 6.18: Nahezu alle Dokumenteigenschaften wurden gesetzt Sub DokuEigenschaftenSetzen() With ThisWorkbook .BuiltinDocumentProperties("Title").Value = "VBA-Demos" .BuiltinDocumentProperties("Subject").Value = _ "Arbeitsmappenbeispiele" .BuiltinDocumentProperties("Category").Value = "VBA" .BuiltinDocumentProperties("Keywords").Value = _ "VBA, Makros, Programmierung" .BuiltinDocumentProperties("Comments").Value = _ "Beispiele zur Programmierung mit Excel-VBA " & _ Chr(13) & "Mehr Demos finden Sie auf meiner Homepage unter der URL: " & _ "http://Held-office.de" End With End Sub
Füllen Sie die einzelnen Dokumenteigenschaften, indem Sie die Eigenschaft BuiltinDocumentProperties mit dem richtigen Namen ansprechen und den gewünschten Inhalt übergeben. Kontrollieren Sie das Ergebnis, indem Sie aus dem Menü DATEI den Befehl EIGENSCHAFTEN wählen und die Registerkarte ZUSAMMENFASSUNG aktivieren. Wechseln Sie nun auf die Registerkarte ALLGEMEIN.
190
Dokumenteigenschaften
Abbildung 6.9: Die Dokumenteigenschaften wurden gefüllt
Abbildung 6.10: Die Registerkarte Statistik
191
Auf Arbeitsmappen zugreifen – Datei-Operationen
Auf dieser Registerkarte sehen Sie einige Datumsangaben, die Sie wie folgt auslesen können: Listing 6.19: Das Erstellungsdatum und das letzte Änderungsdatum ausgeben Sub DatumsAngabenAuslesen() With ThisWorkbook Debug.Print "Erstelldatum: " & _ .BuiltinDocumentProperties("Creation date").Value Debug.Print "Letztes Speicherdatum " & _ .BuiltinDocumentProperties("Last Save Time").Value End With End Sub
Über die Anweisung Debug.Print geben Sie die momentan gesetzten Dokumenteigenschaften im Direktfenster aus. Blenden Sie das Direktfenster ein, indem Sie in die Entwicklungsumgebung wechseln und aus dem Menü ANSICHT den Befehl DIREKTFENSTER auswählen.
Abbildung 6.11: Dokumenteigenschaften im Direktbereich ausgeben
6.8
Verknüpfungen in Arbeitsmappen
Wenn Sie eine Arbeitsmappe öffnen, die Verknüpfungen enthält, werden Sie durch eine Bildschirmmeldung darauf aufmerksam gemacht, dass Verknüpfungen enthalten sind. Sie haben dann die Möglichkeit, diese Verknüpfungen zu aktualisieren. Dabei bleiben die verknüpften Arbeitsmappen aber geschlossen. Die Zeit, die vergeht, bis die Verknüpfungen alle aktualisiert sind, ist abhängig von der Anzahl der verknüpften Zellen bzw. der verknüpften Arbeitsmappen. Es empfiehlt sich, bei Änderungen immer die beteiligten Arbeitsmappen zu öffnen. Verknüpfte Arbeitsmappen können Sie in Excel öffnen, indem Sie aus dem Menü BEARBEITEN den Befehl VERKNÜPFUNGEN wählen, im Listenfeld QUELLDATEI die entsprechenden verknüpften Arbeitsmappen markieren und die Schaltfläche QUELLE ÖFFNEN klicken.
192
Verknüpfungen in Arbeitsmappen
Abbildung 6.12: Verknüpfte Arbeitsmappen anzeigen
Verknüpfungen dokumentieren Die Verknüpfungen zu anderen Arbeitsmappen können Sie auch über ein Makro auf einer separaten Tabelle dokumentieren. Im folgenden Makro wird eine neue Tabelle eingefügt und alle Verknüpfungen zu anderen Arbeitsmappen dokumentiert. Listing 6.20: Alle verknüpften Arbeitsmappen dokumentieren Sub Dim Dim Dim
VerknüpfungenAusgeben() Mappe As Workbook VLink As Variant i As Integer
Set Mappe = ThisWorkbook VLink = Mappe.LinkSources(xlExcelLinks) Sheets.Add Range("A1").Select If Not IsEmpty(VLink) Then For i = 1 To UBound(VLink) ActiveCell.Value = i ActiveCell.Offset(0, 1).Value = VLink(i) ActiveCell.Offset(1, 0).Select Next i End If End Sub
Definieren Sie zuerst ein Objekt vom Typ Workbook. Danach definieren Sie ein Datenfeld vom Datentyp Variant, indem Sie die Namen und die Pfade der verknüpften Arbeitsmappen speichern. Mit der Anweisung Set geben Sie das Objekt Mappe an, das die momentan aktive
193
Auf Arbeitsmappen zugreifen – Datei-Operationen
Arbeitsmappe repräsentieren soll. Fügen Sie ein neues Tabellenblatt mit der Methode Add ein. Füllen Sie jetzt das Datenfeld VLink mit allen Excel-Verknüpfungen dieser Arbeitsmappe. Dazu setzen Sie die Methode LinkSources mit der Xlink-Konstanten xlExcelLinks ein. Über diese Konstante geben Sie an, dass nach Excel-Verknüpfungen gesucht werden soll. Die Methode LinkSources gibt eine Matrix mit Verknüpfungen der Arbeitsmappe zurück. Die Namen in der Matrix entsprechen dabei den Namen der verknüpften ExcelArbeitsmappen. Wenn keine Verknüpfung besteht, wird der Wert IsEmpty zurückgegeben. Setzen Sie danach eine For Next-Schleife ein, um die einzelnen Verknüpfungen in die neue Tabelle zu schreiben. In der ersten Spalte erfolgt eine Nummerierung der einzelnen Verknüpfungen. In Spalte B schreiben Sie die Namen und den dazugehörigen Pfad der verknüpften Arbeitsmappen.
Abbildung 6.13: Alle verknüpften Arbeitsmappen wurden dokumentiert.
Verknüpfungen ändern Möchten Sie eine bestimmte Verknüpfung in der Arbeitsmappe ändern, können Sie die Methode ChangeLink einsetzen. Stellen Sie sich vor, Sie haben eine Arbeitsmappe mit anderen Mappen aus einem bestimmten Verzeichnis verknüpft. In der Zwischenzeit haben Sie die verknüpften Arbeitsmappen in ein anderes Verzeichnis kopiert und diese dann abgeändert. Jetzt sollen die Verknüpfungen so geändert werden, dass sie auf das neue Verzeichnis zeigen. Ihre Aufgabe besteht nun darin, alle Verknüpfungen auf das neue Verzeichnis anzupassen. Das Makro für diese Aufgabe können Sie Listing 6.1 entnehmen.
194
Verknüpfungen in Arbeitsmappen
Listing 6.21: Verknüpfungen ändern Sub Dim Dim Dim Dim Dim
VerknüpfungÄndern() Mappe As Workbook VLink As Variant i As Integer e As Integer s As String
Set Mappe = ThisWorkbook VLink = Mappe.LinkSources(xlExcelLinks) If Not IsEmpty(VLink) Then For i = 1 To UBound(VLink) e = InStrRev(VLink(i), "\") + 1 s = Mid(VLink(i), e, 20) ThisWorkbook.ChangeLink VLink(i), _ "C:\Eigene Dateien\Excel\" & s, xlExcelLinks Next i End If End Sub
Wie schon in Listing 6.20 definieren und füllen Sie ein Datenfeld mit den zurzeit aktiven Verknüpfungen. In einer Schleife ändern Sie die Verknüpfungen. Für diesen Zweck müssen Sie zuerst aus der Verknüpfungsadresse, die ja den kompletten Pfad beinhaltet, den Namen der verknüpften Arbeitsmappe extrahieren. Diese Aufgabe können Sie mithilfe der Funktion InStrRev lösen, die die Position des letzten Zeichens \ ermittelt. Über die Funktion Mid können Sie jetzt ganz gezielt den Namen der verknüpften Arbeitsmappe extrahieren. Wenden Sie danach die Methode ChangeLink an, bei der Sie zuerst die momentane Verknüpfung angeben und dann die gewünschte Verknüpfung, die sich aus dem neuen Pfad und dem Namen der ermittelten Arbeitsmappe ergibt. Kontrollieren Sie das Ergebnis dieser Aktion, indem Sie aus dem Menü BEARBEITEN den Befehl VERKNÜPFUNGEN auswählen.
Abbildung 6.14: Die Verknüpfungspfade wurden angepasst.
195
Auf Arbeitsmappen zugreifen – Datei-Operationen
6.9
Workshop
6.9.1 Fragen & Antworten F
Über welche Anweisung können Sie den Namen der aktiven Arbeitsmappe sowie den kompletten Speicherpfad am Bildschirm ausgeben? A
F
Wie kann man den Namen des Benutzers einer Arbeitsmappe ermitteln? A
F
Die Anweisung lautet: Msgbox ActiveWorkbook.FullName. Über die Anweisung Msgbox Application.UserName.
Wie kann man den aktuell eingestellten Pfad ermitteln? A
Über die Anweisung MsgBox "Der aktuelle Pfad lautet: " & CurDir.
6.9.2 Quiz 1. Wie kann man verhindern, dass beim Öffnen einer Arbeitsmappe die Verknüpfungen zu anderen Arbeitsmappen aktualisiert werden? 2. Was ist der Unterschied zwischen dem Befehl ActiveWorkbook und ThisWorkbook? 3. Wie kann man beim Schließen einer Arbeitsmappe dafür sorgen, dass Änderungen automatisch ohne weitere Rückfrage gespeichert werden? 4. Wie kann man bei einer Neuanlage einer Arbeitsmappe die Anzahl der Tabellen bestimmen? 5. Was muss man beachten, wenn man die Anweisung Kill einsetzt, um eine Arbeitsmappe zu entfernen?
6.9.3 Übung Programmieren Sie ein Makro, welches alle Arbeitsmappen aus einem bestimmten Verzeichnis öffnet, das aktuelle Datum in Zelle A1 der ersten Tabelle schreibt und diese Arbeitsmappen speichert und schließt. Die Lösung finden Sie wie immer im Anhang.
196
Tabellenblätter programmieren
7
Tabellenblätter programmieren
Am gestrigen Tag haben Sie gelernt, wie Sie Arbeitsmappen anlegen, öffnen, speichern, schließen und löschen können. Darüber hinaus haben Sie auf die Dokumenteigenschaften von Arbeitsmappen zugegriffen sowie Verknüpfungen zu anderen Arbeitsmappen ausgelesen und geändert. Die Themen heute: 쐽
Tabellen anlegen und benennen
쐽
Blatt-Typ bestimmen
쐽
Tabellen entfernen
쐽
Tabellen exportieren
쐽
Tabellen importieren
쐽
Tabellen ein- und ausblenden
쐽
Tabellen gruppieren
쐽
Tabellen schützen
쐽
Tabellen sortieren
쐽
Kopf- und Fußzeilen programmieren
7.1
Tabellen anlegen und benennen
In Excel können Sie standardmäßig bis zu 255 Tabellen pro Arbeitsmappe einfügen, wenn Sie diese Einstellung im Menü EXTRAS unter dem Befehl OPTIONEN auf der Registerkarte ALLGEMEIN auswählen. Über den Einsatz eines Makros können Sie diese standardmäßig gesetzte Obergrenze aber locker sprengen. Im folgenden Makro fügen Sie 365 neue Tabellenblätter in eine neue Arbeitsmappe ein. Die Benennung der Tabellen sollte gleich nach deren Einfügung erfolgen. Als Namen wählen Sie die Bezeichnung Tag 1, Tag 2 usw. bis zum Tag 365. Listing 7.1: Tabellen einfügen und benennen Sub TabellenEinfügen() Dim i As Integer Workbooks.Add For i = 1 To 365 Worksheets.Add ActiveSheet.Name = "Tag " & i Next i End Sub
198
Tabellen anlegen und benennen
Fügen Sie im ersten Schritt eine neue Arbeitsmappe über die Methode Add ein. Danach durchlaufen Sie eine Schleife genau 365-mal. Innerhalb der Schleife wenden Sie die Methode Add an, um eine Tabelle einzufügen. Den Namen der jeweiligen Tabelle legen Sie fest, indem Sie der Eigenschaft Name das Wort Tag sowie die fortlaufende Variable i zuweisen.
Abbildung 7.1: Tabellen einfügen und benennen
Wie Sie sehen, wurden die neuen Tabellen immer zu Beginn der Arbeitsmappe eingefügt und dann mit jeder neuen Tabelle um eine Position nach hinten verschoben. So kommt es, dass die zuletzt eingefügte Tabelle am Beginn der Arbeitsmappe steht. Um die zuerst eingefügte Tabelle auch am Beginn der Arbeitsmappe zu positionieren, geben Sie bei der Methode Add noch ein zusätzliches Argument an. Listing 7.2: Tabellen einfügen und Reihenfolge beibehalten Sub TabellenEinfügen02() Dim i As Integer Workbooks.Add For i = 1 To 365 Worksheets.Add Before:=Worksheets(Worksheets.Count) ActiveSheet.Name = "Tag " & i Next i Worksheets(1).Activate End Sub
199
Tabellenblätter programmieren
Das einzufügende Tabellenblatt wird jeweils ans Ende der Arbeitsmappe gehängt. Für diesen Zweck müssen Sie mithilfe der Eigenschaft Count die Anzahl der Tabellen der Arbeitsmappe zählen und dem Argument Before übergeben. Aktivieren Sie am Ende des Makros über die Methode Activate das erste Tabellenblatt der Arbeitsmappe.
7.2
Blatt-Typ bestimmen
In Excel haben Sie die Möglichkeit, neben Tabellen auch Diagrammblätter, alte Excel-4Makroblätter und Dialoge einzufügen. Dabei können alle Blätter über die Eigenschaft Sheets angesprochen werden. Möchten Sie ausschließlich auf Tabellen zugreifen, dann setzen Sie wie in den ersten beiden Listings beschrieben die Eigenschaft Worksheets ein. Bestimmte Befehle in VBA können Sie nur auf Worksheets anwenden, andere haben auch Gültigkeit für andere Blätter. Von daher ist es wichtig, genau zu wissen, was für eine Art von Blatt man gerade mit einem Makro anpackt. Im folgenden Makro werden die Namen aller Tabellen sowie deren Typ im Direktfenster der Entwicklungsumgebung ausgegeben: Listing 7.3: Blätter einer Arbeitsmappe identifizieren Sub TabellenIdentifizieren() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count Debug.Print Sheets(i).Name & " --> " & TypeName(Sheets(i)) Next i End Sub
In einer Schleife durchlaufen Sie alle Tabellenblätter der Arbeitsmappe, in der Sie das Makro aus Listing 7.3 eingegeben haben (ThisWorkbook). Innerhalb der Schleife geben Sie mithilfe der Eigenschaft Name den Namen des Blattes über den Befehl Debug.Print im Direktbereich aus. Des Weiteren ermitteln Sie über die Funktion TypeName, um welchen Blatt-Typ es sich dabei handelt. Es wird unter folgenden Blatt-Typen unterschieden: 쐽
WorkSheet = Tabellenblatt bzw. alte Makro-4-Vorlage
쐽
Chart = Diagrammblatt
쐽
DialogSheet = Microsoft Excel 5.0 Dialog
200
Blatt-Typ bestimmen
Kontrollieren Sie das Ergebnis von Listing 7.3, indem Sie in die Entwicklungsumgebung wechseln und aus dem Menü ANSICHT den Befehl DIREKTFENSTER wählen.
Abbildung 7.2: Die Blatt-Typen einer Arbeitsmappe im Direktfenster ausgeben
In einer Arbeitsmappe soll auf jedem Tabellenblatt in Zelle A1 das heutige Datum erfasst werden. Um diese Aufgabe zu lösen, gibt es zwei Lösungsansätze: 쐽
Entweder Sie springen ganz gezielt nur die Tabellenblätter der Arbeitsmappe an
쐽
oder Sie prüfen vorher, um welchen Typ eine Blattes es sich handelt.
Beide Varianten werden nun realisiert.
Tabellenblätter füllen Im folgenden Makro in Listing 7.4 werden alle Tabellenblätter einer Arbeitsmappe in einer Schleife nacheinander abgearbeitet: Listing 7.4: Das aktuelle Datum in allen Tabellenblättern eintragen Sub TabellenblätterEditieren() Dim Tabelle As Worksheet For Each Tabelle In ThisWorkbook.Worksheets Tabelle.Range("A1").Value = Date Next Tabelle End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. Damit können nur reine Tabellenblätter angesprochen werden. In einer darauf folgenden Schleife füllen Sie jeweils die Zelle A1 in allen Tabellenblättern mit dem aktuellen Tagesdatum.
201
Tabellenblätter programmieren
Blattprüfung vor Füllung vornehmen Im folgenden Makro prüfen Sie vor jedem Einfügen des aktuellen Datums, ob es sich dabei auch wirklich um eine Tabelle handelt: Listing 7.5: Tabellenblätter überprüfen Sub TabellenblätterPrüfen() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count Sheets(i).Select If TypeName(Sheets(i)) = "Worksheet" Then _ Sheets(i).Range("A1").Value = Date Next i End Sub
Ermitteln Sie über die Anweisung ThisWorkbook.Sheets.Count, wie viele Blätter in der Arbeitsmappe sind. Diese Anzahl bildet auch das Endkriterium für Ihre Schleife. Innerhalb der Schleife fügen Sie über die Funktion Date das aktuelle Tagesdatum in Zelle A1 ein.
7.3
Tabellen entfernen
Um Tabellen aus einer Arbeitsmappe zu entfernen, setzen Sie die Methode Delete ein, welche Sie auf das Auflistungsobjekt Sheets anwenden.
Tabelle nach Rückfrage löschen Im folgenden Beispiel soll die TABELLE1 aus Ihrer Arbeitsmappe entfernt werden. Das Makro für diesen Zweck lautet: Listing 7.6: Eine Tabelle löschen Sub TabelleEntfernen() Sheets("Tabelle1").Delete End Sub
Wenn Sie das Makro aus Listing 7.6 starten, werden Sie von Excel gefragt, ob Sie diese Aktion wirklich durchführen möchten.
202
Tabellen entfernen
Abbildung 7.3: Die Löschen-Rückfrage beantworten
Rückfrage bei Tabellenlöschung unterdrücken Möchten Sie die Rückfrage unterdrücken, um die gewünschte Tabelle ohne weitere Rückfrage zu löschen, dann erweitern Sie das Makro aus Listing 7.6 wie folgt: Listing 7.7: Eine Tabelle ohne Rückfrage löschen Sub TabelleEntfernenBesser() Application.DisplayAlerts = False Sheets("Tabelle1").Delete Application.DisplayAlerts = True End Sub
Setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um die Standardmeldungen in Excel kurzfristig auszuschalten. Führen Sie dann die Methode Delete aus, um die gewünschte Tabelle zu entfernen. Setzen Sie danach die Eigenschaft DisplayAlerts auf den Wert True, um Standardmeldungen in Excel wieder zuzulassen.
Eigene Rückfrage programmieren Möchten Sie neben der Standardmeldung von Excel eine eigene Meldung beim Versuch, eine Tabelle zu entfernen, anzeigen, dann können Sie dies über den Einsatz eines Meldungsfensters tun. Dabei erfassen Sie folgenden Quellcode aus Listing 7.8: Listing 7.8: Eine eigene Löschmeldung anzeigen Sub TabelleEntfernenEigeneMeldung() Dim i As Integer i = MsgBox("Möchten Sie wirklich die Tabelle löschen?", _ vbYesNo + vbQuestion, "Tabelle löschen") If i = 6 Then Sheets("Tabelle1").Delete End Sub
203
Tabellenblätter programmieren
Die Funktion MsgBox können Sie einsetzen, um vom Anwender durch das Klicken von Schaltflächen eine Entscheidung zu bekommen. Klickt der Anwender auf die Schaltfläche JA, dann können Sie dies über den Wert 6 erkennen, der in der Variablen i steht. In diesem Fall wenden Sie die Methode Delete an, um die Tabelle zu entfernen.
Abbildung 7.4: Eine Möglichkeit, eine Aktion noch einmal abzubrechen
Vor dem Löschen prüfen Die letzten drei Listings haben noch einen kleinen Schönheitsfehler. Was ist denn, wenn Sie versuchen, eine Tabelle zu entfernen, die es gar nicht mehr in der Arbeitsmappe gibt, weil Sie entweder bereits gelöscht wurde oder der Name der Tabelle nicht korrekt angegeben wurde? In diesem Fall stürzt das Makro mit folgender Fehlermeldung ab, die Sie nachvollziehen können, wenn Sie das Listing 7.7 zweimal hintereinander ausführen.
Abbildung 7.5: Der Versuch, eine nicht existente Tabelle zu entfernen, scheitert.
Eine solche Fehlermeldung sollte vermieden werden. Prüfen Sie daher vor dem Löschen einer Tabelle, ob die zu löschende Tabelle überhaupt in der Arbeitsmappe vorhanden ist. Wie das funktioniert, verrät Ihnen Listing 7.9: Listing 7.9: Erst nach einer Überprüfung die Tabelle löschen Function TabelleDa(s As String) As Boolean On Error Resume Next TabelleDa = Worksheets(s).Select
204
Tabellen exportieren
End Function
Sub LöschenTabelleNachPrüfung() Dim s As String Dim b As Boolean s = "Tabelle1" b = TabelleDa(s) If b = True Then Application.DisplayAlerts = False Sheets(s).Delete Application.DisplayAlerts = True Else MsgBox (s & " konnte nicht gefunden werden!") End If End Sub
Bei dieser Lösung nehmen wir ein wenig vom 15. Tag vorweg. Wir verwenden eine Funktion, die überprüft, ob die übergebene Tabelle auch wirklich in der Arbeitsmappe existiert. Sie übergeben der Funktion TabelleDa den Namen der zu prüfenden Tabelle. Die Funktion ihrerseits prüft, ob sie eine Tabelle mit dem Namen selektieren kann. Wenn nicht, wird die Variable den Wert False an das Makro LöschenTabelleNachPrüfung zurückgeben. In diesem Fall wird der Anwender über eine Bildschirmmeldung darauf aufmerksam gemacht. Ist die Funktion in der Lage, das übergebene Tabellenblatt zu selektieren, gibt sie dem Makro den Wert True zurück. In diesem Fall können Sie die Standardmeldungen temporär abschalten, die Tabelle löschen und danach die Standardmeldungen wieder zulassen.
7.4
Tabellen exportieren
In manchen Fällen muss eine Tabelle in ein anderes Format bzw. in eine andere oder neue Arbeitsmappe überführt werden.
Tabelle als Textdatei exportieren Im ersten Export-Beispiel soll folgende Tabelle in eine Textdatei überführt werden. Als Trennzeichen der einzelnen Spalten wird hierbei das Semikolon eingesetzt.
205
Tabellenblätter programmieren
Abbildung 7.6: Die zu exportierende Tabelle
Erfassen Sie jetzt folgendes Makro, um diese Liste in einer Textdatei auszugeben: Listing 7.10: Eine Tabelle in eine Textdatei transferieren Sub Dim Dim Dim Dim
TabelleAlsTextExportieren() Bereich As Range Zeile As Range Zelle As Range s As String
Sheets("Tabelle2").Activate Set Bereich = ActiveSheet.UsedRange Open "c:\Eigene Dateien\Liste.txt" For Output As #1 For Each Zeile In Bereich.Rows For Each Zelle In Zeile.Cells s = s & Zelle.Text & ";" Next s = Left(s, Len(s) - 1) Print #1, s s = "" Next Close #1 End Sub
206
Tabellen exportieren
Aktivieren Sie zuerst einmal die Tabelle, welche die zu exportierenden Daten enthält. Danach ermitteln Sie den verwendeten Bereich der Tabelle, den Sie über die Eigenschaft UsedRange ermitteln können. Legen Sie danach eine Textdatei an, indem Sie die Methode Open anwenden. Dabei muss die so aktivierte Textdatei keinesfalls schon vorhanden sein. Excel legt diese selbstständig an. Setzen Sie daraufhin eine Schleife auf, die Zeile für Zeile die Liste abarbeitet. In einer weiteren Schleife arbeiten Sie die Zellen von links nach rechts einer Zeile ab und speichern Sie in der Variablen s. Fügen Sie nach jeder Zelle, die Sie auf diese Weise abarbeiten, als Trennzeichen das Semikolon ein. Bevor Sie die Zeile komplett in die Textdatei schreiben, müssen Sie das letzte Semikolon wieder entfernen. Dazu setzen Sie die Funktion Left ein, die eine bestimmte Anzahl von Zeichen von links überträgt. Da das letzte Semikolon entfernt werden soll, können Sie von der Gesamtlänge der Variablen, die Sie über die Funktion Len ermitteln können, den Wert 1 subtrahieren. Schließen Sie am Ende des Makros die Textdatei mithilfe der Methode Close.
Abbildung 7.7: Die Tabelle wurde in eine Textdatei exportiert
Tabelle in eine neue Arbeitsmappe kopieren Im nächsten Beispiel soll dieselbe Tabelle in eine neue Arbeitsmappe kopiert werden. Das Makro für diese Aufgabe sehen Sie in Listing 7.11. Listing 7.11: Tabelle in neue Arbeitsmappe kopieren Sub TabelleInNeueArbeitsmappeKopieren() Dim Mappe As Workbook Dim Tabelle As Worksheet Set Tabelle = ThisWorkbook.Sheets("Tabelle2") Set Mappe = Workbooks.Add Tabelle.Copy Before:=Mappe.Worksheets(Worksheets.Count) End Sub
207
Tabellenblätter programmieren
Deklarieren Sie zu Beginn des Makros zwei Objektvariablen vom Typ Workbook und Worksheet. Danach geben Sie über die Anweisung Set bekannt, welche Tabelle Sie später in eine neue Arbeitsmappe kopieren möchten. Legen Sie im nächsten Schritt eine neue Arbeitsmappe an und weisen Sie diese gleich der Objektvariablen zu. Danach können Sie mithilfe der Methode Copy die Tabelle kopieren und in die neue Arbeitsmappe einfügen.
Abbildung 7.8: Die Tabelle wurde in eine neue Arbeitsmappe kopiert.
Tabelle in neue Arbeitsmappe übertragen Möchten Sie eine Tabelle aus Ihrer ursprünglichen Arbeitsmappe herausnehmen und in einer neuen Arbeitsmappe ablegen, dann können Sie das Makro aus Listing 7.11 aufgreifen und eine Stelle ändern. Listing 7.12: Tabelle in neue Arbeitsmappe übertragen Sub TabelleInNeueArbeitsmappeTransferieren() Dim Mappe As Workbook Dim Tabelle As Worksheet Set Tabelle = ThisWorkbook.Sheets("Tabelle2") Set Mappe = Workbooks.Add Tabelle.Move Before:=Mappe.Worksheets(Worksheets.Count) End Sub
208
Tabellen exportieren
Deklarieren Sie zu Beginn des Makros zwei Objektvariablen vom Typ Workbook und Worksheet. Danach geben Sie über die Anweisung Set bekannt, welche Tabelle Sie später in eine neue Arbeitsmappe übertragen möchten. Legen Sie im nächsten Schritt eine neue Arbeitsmappe an und weisen Sie diese gleich der Objektvariablen zu. Danach können Sie mithilfe der Methode Move die Tabelle ausschneiden und in die neue Arbeitsmappe einfügen.
Tabelle in andere Arbeitsmappe kopieren/übertragen Soll das Ziel für die Tabelle keine neue, sondern eine bereits bestehende Arbeitsmappe sein, dann starten Sie das Makro aus Listing 7.13. Listing 7.13: Eine Tabelle in eine bereits bestehende Arbeitsmappe kopieren/übertragen Sub TabelleInAndereArbeitsmappeTransferieren() Dim Mappe As Workbook Dim Tabelle As Worksheet Const LW = "C:\" Const Pfad = "C:\Eigene Dateien" ChDrive LW ChDir Pfad Set Tabelle = ThisWorkbook.Sheets("Tabelle2") Set Mappe = Workbooks.Open("Mappe1.xls") Tabelle.Copy Before:=Mappe.Worksheets(Worksheets.Count) 'Tabelle.Move Before:=Mappe.Worksheets(Worksheets.Count) End Sub
Deklarieren Sie zu Beginn des Makros zwei Objektvariablen vom Typ Workbook und Worksheet. Außerdem geben Sie in zwei Konstanten bekannt, wo sich die Zielarbeitsmappe befindet. Danach geben Sie über die Anweisung Set bekannt, welche Tabelle Sie später in eine neue Arbeitsmappe übertragen möchten. Im nächsten Schritt öffnen Sie die Arbeitsmappe, welche die Tabelle erhalten soll, und weisen diese Arbeitsmappe gleich der Objektvariablen Mappe zu. Danach können Sie mithilfe der Methode Move bzw. Copy die Tabelle ausschneiden/kopieren und in die neue Arbeitsmappe einfügen.
209
Tabellenblätter programmieren
7.5
Tabellen importieren
Selbstverständlich können Sie neben dem Export von Tabellen auch Textdateien in Excel einlesen.
Textdatei-Import mit festen Datenfeldern Im nachstehenden Beispiel haben Sie eine Textdatei mit festen Datenfeldern nach folgendem Aufbau zusammengestellt: 쐽
Kostenstelle (Position 1 bis 4)
쐽
Personal-Nr (Position 5-10)
쐽
Name (Position 11-36)
쐽
Abteilung (ab Position 37)
Abbildung 7.9: Die Textdatei zum Einlesen in Excel
Sie haben in der Textdatei namens PersonalListe.txt einige Daten erfasst und möchten diese nun in Excel über ein VBA-Makro einlesen. Wie das genau aussehen könnte, sehen Sie in diesem Makro: Listing 7.14: Eine Textdatei in Excel einlesen Sub TextdateiImportieren() Workbooks.OpenText Filename:= _ "C:\Eigene Dateien\PersonalListe.txt", _ DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(5, 1), _ Array(11, 1), Array(37, 1)), _ StartRow:=2
210
Tabellen importieren
Columns("A:A").ColumnWidth Columns("B:B").ColumnWidth Columns("C:C").ColumnWidth Columns("D:D").ColumnWidth End Sub
= = = =
6 7 30 20
Um eine Textdatei in Excel einzulesen, verwenden Sie die Methode OpenText. Im ersten Argument dieser Methode müssen Sie angeben, wo sich die einzulesende Textdatei befindet und wie diese heißt. Im Argument DataType geben Sie an, ob es sich um eine Textdatei mit immer gleichlangen Feldern handelt (XlFixedWidth) oder ob ein Trennzeichen zwischen den einzelnen Feldern verwendet wird (XlDemimited). In unserem ersten Beispiel wird eine konstante Feldlänge für die einzelnen Informationen verwendet. Im Argument FieldInfo geben Sie dann die genaue Startposition sowie den Datentyp des einzelnen Feldes an. Dabei müssen hierbei zwei Argumente angeben. Im ersten Feld geben Sie wie schon gesagt die genaue Spaltennummer, an dem das Datenfeld beginnt an. Im zweiten Argument legen Sie den Datentyp über eine Konstante oder Index fest. Entnehmen Sie der folgenden Tabelle die dafür verwendbaren Konstanten bzw. Indexe. Index
Konstante
Bedeutung
0
xlGeneralFormat
Allgemein
1
xlTextFormat
Text
2
xlMDYFormat
MDY date
3
xlDMYFormat
DMY date
4
xlYMDFormat
YMD date
5
xlMYDFormat
MYD date
6
xlDYMFormat
DYM date
7
xlYDMFormat
YDM date
8
xlEMDFormat
EMD date
9
xlSkipColumn
Spalte überspringen
Tabelle 7.1: Die Konstanten des Arguments FieldInfo
Im Argument StartRow können Sie bestimmen, ab welcher Zeile in der Textdatei der Import beginnen soll. Da Sie in unserem Beispiel eine Überschriftenzeile haben, die Sie nicht unbedingt in der Excel-Tabelle haben möchten, setzen Sie dieses Argument auf den Wert 2.
211
Tabellenblätter programmieren
Diese Argumente reichen aus, um die Textdatei erfolgreich in eine Excel-Tabelle einzulesen. Im letzten Schritt des Makros sorgen Sie dafür, dass die Breiten der einzelnen Spalten ausreichen und dass alle Daten in der Tabelle vollständig angezeigt werden können. Für diese Aufgabe setzen Sie die Eigenschaft ColumnWidth ein, bei der Sie die exakte Spaltenbreite angeben.
Abbildung 7.10: Die Textdatei wurde erfolgreich in Excel eingelesen.
Möchten Sie die Spaltenbreiteneinstellung Excel überlassen, können Sie die Methode AutoFit einsetzen. Die Anweisung dafür lautet: ActiveSheet.Columns("A:D").AutoFit
Im folgenden, etwas abgewandelten Beispiel sollen aus der Textdatei PersonalListe.txt nur die Spalten PERSONAL-NR sowie der Name des Mitarbeiters in eine Tabelle eingelesen werden. Das Makro für die Lösung dieser Aufgabenstellung können Sie in Listing 7.15 sehen. Listing 7.15: Nur bestimmte Spalten aus der Textdatei einlesen Sub TextdateiImportierenNichtAlles() Workbooks.OpenText Filename:= _ "C:\Eigene Dateien\PersonalListe.txt", _ DataType:=xlFixedWidth, _ FieldInfo:=Array (Array(0, 9), Array(5, 1), _ Array(11, 1), Array(37, 9)), _ StartRow:=2 ActiveSheet.Columns("A:D").AutoFit End Sub
212
Tabellen importieren
Für das bedingte Einlesen einer Textdatei setzen Sie das Argument FieldInfo im zweiten Argument für die Spalten, die Sie nicht einlesen möchten, auf den Wert 9. Wenden Sie am Ende des Makros aus Listing 7.15 die Methode AutoFit ein, damit Excel die automatische Spaltenanpassung vornimmt.
Abbildung 7.11: Nur bestimmte Datenfelder aus der Textdatei wurden eingelesen.
Textdatei-Import mit variablen Datenfeldern Viele Textdateien haben aber auch variable Satzlängen, d.h. die einzelnen Felder haben nicht gleich lange Feldlängen, sondern können X- bis Y-Zeichen aufweisen. Bei diesen Textdateien wird das Ende eines Feldes über ein Trennzeichen bestimmt. Meistens ist dies das Semikolon, welches die einzelnen Felder voneinander abtrennt. Schauen Sie sich zur besseren Verständlichkeit die Abbildung 7.12 an.
Abbildung 7.12: Eine Textdatei mit variabler Satzlänge
213
Tabellenblätter programmieren
Bei der Textdatei PersonalListe2.txt wird das Semikolon als Trennzeichen der einzelnen Felder verwendet. Möchten Sie diese Textdatei in eine Excel-Tabelle einlesen, dann setzen Sie das Makro aus Listing 7.16 ein: Listing 7.16: Einlesen einer Textdatei mit variabler Satzlänge Sub TextdateiImportierenVariableSL() Workbooks.OpenText _ Filename:="C:\Eigene Dateien\PersonalListe2.txt", _ DataType:=xlDelimited, Semicolon:=True, _ StartRow:=2 ActiveSheet.Columns("A:D").AutoFit End Sub
Um eine Textdatei mit variabler Satzlänge einzulesen, müssen Sie unbedingt bei der Methode OpenText im Argument DataType die Konstante XlDelimited angeben. Danach müssen Sie bekannt geben, dass Sie mit dem Semikolon als Trennzeichen arbeiten möchten, indem Sie das Argument Semicolon auf den Wert True setzen. Weitere Trennzeichen wären der Tabulator (Tab:=True), das Komma (Comma:=True) oder das Leerzeichen (Space:=True).
Sollte keines der standardmäßig angebotenen Trennzeichen mit Ihrer Textdatei übereinstimmen, wie in Abbildung 7.13 angezeigt, dann müssen Sie das Makro aus Listing 7.16 etwas abändern.
Abbildung 7.13: Hier wurde das Trennzeichen * verwendet.
Die Textdatei PersonalListe3.txt soll nun in eine Excel-Tabelle importiert werden. Das dazu notwendige Makro können Sie in Listing 7.17 einsehen:
214
Tabellen ein- und ausblenden
Listing 7.17: Eine Textdatei mit alternativem Trennzeichen wird eingelesen Sub TextdateiImportierenVariableSL_Var02() Workbooks.OpenText _ Filename:="C:\Eigene Dateien\PersonalListe3.txt", _ DataType:=xlDelimited, Other:=True, _ OtherChar:="*", StartRow:=2 ActiveSheet.Columns("A:D").AutoFit End Sub
Wird ein nicht standardmäßig angebotenes Trennzeichen für eine Textdatei eingesetzt, dann setzen Sie das Argument Other auf den Wert True und geben im Argument OtherChar das Trennzeichen, welches Sie verwenden, in doppelten Hochkommas ein.
Abbildung 7.14: Auch die Textdatei mit »anderem« Trennzeichen konnte erfolgreich eingelesen werden.
7.6
Tabellen ein- und ausblenden
Um mehr Ordnung in Ihre Arbeitsmappen zu bringen, können Sie selten benötigte Tabellen aus- und bei Bedarf wieder einblenden.
Einfaches Aus- und Einblenden einer Tabelle Das Ein- und Ausblenden von Tabellenblättern erzielen Sie mit der Eigenschaft Visible. Setzen Sie diese Eigenschaft auf den Wert False, um eine Tabelle auszublenden.
215
Tabellenblätter programmieren
Im folgenden Beispiel blenden Sie die TABELLE1 aus: Listing 7.18: Eine Tabelle ausblenden Sub TabelleAusblenden() On Error GoTo fehler Sheets("Tabelle1").Visible = False Exit Sub fehler: MsgBox "Die Tabelle ist nicht vorhanden!", vbCritical + vbOKOnly End Sub
Beim Ausblenden einer Tabelle sollten Sie eine Sicherheitsfunktion einbauen, die folgenden Fall berücksichtigt: »Was passiert, wenn versucht wird, eine Tabelle auszublenden, die in der Arbeitsmappe gar nicht vorhanden ist?« In diesem Fall würde ein Makro ohne Fehlerbehandlungsfunktion abstürzen. Setzen Sie daher die Anweisung On Error goTo Fehler ein, um im Fehlerfall diekt in den Paragrafen fehler zu springen. Dort geben Sie eine Meldung aus. Verläuft das Ausblenden einer Tabelle erfolgreich, dann müssen Sie mithilfe der Anweisung Exit Sub dafür sorgen, dass der Fehlerparagraf nicht ausgeführt wird. Mit dieser Anweisung beenden Sie das Makro auf direktem Weg. Nachdem Sie das Makro TabelleAusblenden ausgeführt haben, wird die Tabelle in der Arbeitsmappe nicht mehr angezeigt. Der Anwender kann aber jederzeit über den Befehl BLATT/EINBLENDEN aus dem Menü FORMAT die ausgeblendeten Tabellenblätter wieder verfügbar machen. Möchten Sie die Tabelle wieder einblenden, starten Sie das folgende Makro: Listing 7.19: Eine Tabelle wieder einblenden Sub TabelleEinblenden() On Error GoTo fehler Sheets("Tabelle1").Visible = True Exit Sub fehler: MsgBox "Die Tabelle ist nicht vorhanden!", vbCritical + vbOKOnly End Sub
Setzen Sie die Eigenschaft Visible wieder auf den Wert True, um die Tabelle einzublenden. Fangen Sie auch hier den Fehlerfall über die On Error-Anweisung ab.
216
Tabellen ein- und ausblenden
Mehrere Tabellen ausblenden Da es manuell nicht geht, gleich mehrere Tabellen gleichzeitig aus- bzw. einzublenden, ist bei dieser Aufgabenstellung ein Makro eine feine Sache. Im folgenden Beispiel sollen alle Tabellen mit Ausnahme der Tabelle INHALT ausgeblendet werden. Den Quellcode für diese Aufgabe können Sie in Listing 7.20 sehen. Listing 7.20: Alle Tabellen bis auf eine ausblenden Sub TabellenAusblenden() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count If Sheets(i).Name "Inhalt" Then Sheets(i).Visible = False Next i End Sub
Setzen Sie eine Schleife auf, die sooft durchlaufen wird, bis alle Blätter der Arbeitsmappe durchlaufen worden sind. Dazu ermitteln Sie über die Eigenschaft Count, die Sie auf das Auflistungsobjekt Sheets anwenden, die Anzahl der Blätter in der Arbeitsmappe. Innerhalb der Schleife prüfen Sie mithilfe der Eigenschaft Name, ob der Name des einzelnen Blattes mit der Tabelle INHALT übereinstimmt. Wenn nicht, blenden Sie die Tabelle aus, indem Sie die Eigenschaft Visible auf den Wert False setzen.
Abbildung 7.15: Alle Tabellen bis auf die Tabelle Inhalt wurden ausgeblendet.
217
Tabellenblätter programmieren
Alle so ausgeblendeten Blätter können Sie jederzeit wieder verfügbar machen, indem Sie aus dem Menü FORMAT den Befehl BLATT/EINBLENDEN wählen. Da dies nicht immer im Sinn des Programmierers ist, können Sie die einzelnen Blätter auch so ausblenden, dass diese über die Standardoberfläche nicht mehr eingeblendet werden können.
Das sichere Ausblenden von Blättern Um Blätter einer Arbeitsmappe auf die »sichere« Methode auszublenden, damit diese vom Anwender über die Standardoberfläche von Excel nicht mehr eingeblendet werden können, starten Sie das Makro aus Listing 7.21. Listing 7.21: Blätter sicher bis auf das letzte ausblenden Sub TabellenAusblendenSicher() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count If Sheets(i).Name "Inhalt" Then Sheets(i).Visible = xlVeryHidden Next i End Sub
Übergeben Sie der Eigenschaft Visible die Konstante xlVeryHidden, um die Blätter sicher auszublenden. Wenn Sie jetzt versuchen, die so ausgeblendeten Blätter über den Menübefehl FORMAT/BLATT/EINBLENDEN wieder verfügbar zu machen, stellen Sie fest, dass dieser Menübefehl deaktiviert ist und überhaupt nicht ausgewählt werden kann.
Abbildung 7.16: Es gibt keine Möglichkeit, über die Standardoberfläche sicher ausgeblendete Blätter wieder verfügbar zu machen.
218
Tabellen ein- und ausblenden
Blätter wieder einblenden Egal, wie Sie Ihre Blätter ausgeblendet haben, sei es auf normale oder sichere Weise, können Sie Ihre Blätter wieder einblenden, indem Sie das Makro aus Listing 7.22 starten: Listing 7.22: Alle versteckten Blätter wieder einblenden Sub TabellenEinblenden() Dim i As Integer For i = 1 To ThisWorkbook.Sheets.Count Sheets(i).Visible = True Next i End Sub
In einer Schleife durchlaufen Sie alle Blätter der Arbeitsmappe und setzen die Eigenschaft Visible auf den Wert True, um die ausgeblendeten Blätter wieder einzublenden.
Abbildung 7.17: Alle Blätter sind nun wieder verfügbar.
219
Tabellenblätter programmieren
7.7
Tabellen gruppieren
In Excel haben Sie die Möglichkeit, Ihre Arbeit an einem Tabellenblatt automatisch auch für andere Tabellenblätter, ähnlich einer Blaupause, gültig zu machen. Dazu gruppieren Sie die einzelnen Tabellenblätter. Manuell klappt das, indem Sie die (Strg)-Taste gedrückt halten und die einzelnen Tabellenregister mit der linken Maustaste anklicken.
Einfaches Gruppieren In der folgenden Aufgabe sollen einige Tabellen einer Arbeitsmappe gruppiert werden. Das Makro dafür sieht so aus: Listing 7.23: Bestimmte Tabellen gruppieren Sub MehrereTabellenblätterMarkieren() On Error GoTo fehler Sheets(Array("Tabelle1", "Tabelle2", _ "Tabelle3")).Select Exit Sub fehler: MsgBox "Es ist ein Fehler beim Gruppieren aufgetreten!" End Sub
Die Funktion Array ermöglicht es Ihnen, eine durch Kommas getrennte Liste von Werten (hier Tabellennamen) anzugeben. Sorgen Sie auch hier wieder für die On Error-Anweisung, um eine Fehlermeldung zu vermeiden, falls eines der Tabellenblätter nicht vorhanden ist.
Abbildung 7.18: Gruppieren von mehreren Tabellenblättern
220
Tabellen gruppieren
Übrigens können Sie anstatt der Namen der einzelnen Tabellen auch Indexwerte angeben. Der Index 1 entspricht dabei dem Tabellenblatt, das ganz vorne in der Arbeitsmappe steht. Die Indexwerte 2 und 3 repräsentieren die Tabellen, die dann von links nach rechts folgen. Achten Sie jedoch darauf, dass das Ergebnis ein anderes sein kann als erwartet. Listing 7.24: Tabellen über ihren Index gruppieren Sub MehrereTabellenblätterMarkieren02() On Error GoTo fehler Sheets(Array(1, 2, 3)).Select Exit Sub fehler: MsgBox "Es ist ein Fehler beim Gruppieren aufgetreten!" End Sub
Abbildung 7.19: Die ersten drei Tabellen gruppieren
Im Gegensatz zu Abbildung 7.18 wurden in Abbildung 7.19 die ersten drei Tabellen der Arbeitsmappe gruppiert. Die Gruppierung können Sie wieder aufheben, indem Sie auf einen Tabellenreiter klicken, der nicht in der Gruppierung enthalten ist.
Komplexeres Gruppieren Etwas aufwändiger wird es, wenn Sie nur bestimmte Tabellen bzw. auch alle Tabellen einer Arbeitsmappe gruppieren möchten. Die Lösung für das Gruppieren aller Tabellenblätter einer Arbeitsmappe muss beispielsweise dynamisch sein, d.h. wenn einzelne Tabel-
221
Tabellenblätter programmieren
len neu hinzukommen bzw. Tabellen umbenannt werden, muss die folgende Lösung in Listing 7.25 noch funktionieren. Des Weiteren sollen selbstverständlich keine Diagrammoder alte Makro4-Tabellenblätter mit in die Gruppierung aufgenommen werden. Listing 7.25: Alle Tabellen einer Mappe gruppieren Sub Dim Dim Dim
AlleTabellenBlätterGruppieren() i As Integer i2 As Integer TabArray() As Integer i = ThisWorkbook.Worksheets.Count ReDim TabArray(1 To i) For i2 = 1 To i TabArray(i2) = i2 Next i2
ThisWorkbook.Worksheets(TabArray).Select End Sub
Da Sie zu Beginn noch nicht exakt wissen, wie groß das Datenfeld TabArray werden soll, müssen Sie es ganz allgemein mit dem Datentyp Integer deklarieren. Danach ermitteln Sie über die Eigenschaft Count, die Sie auf die Auflistung Worksheets anwenden, die Anzahl der in der Arbeitsmappe befindlichen Tabellenblätter. Jetzt wissen Sie genau, wie groß Sie das Datenfeld TabArray definieren müssen. Dies erreichen Sie über die Anweisung ReDim. Füllen Sie das Datenfeld im Anschluss daran über eine Schleife, in der Sie jedes einzelne Feld des Datenfelds bestücken. Markieren Sie im Anschluss daran die so gesammelten Tabellenblätter mithilfe der Methode Select.
Abbildung 7.20: Alle Tabellenblätter wurden gruppiert.
222
Tabellen schützen
7.8
Tabellen schützen
Seit der Excel-Version 2002 haben Sie die Möglichkeit, Tabellen zwar zu schützen, jedoch bestimmte Aktionen wie das Sortieren von Daten, den AutoFilter und sonstige Dinge trotzdem noch zuzulassen. In den vorherigen Versionen von Excel waren nach dem Anbringen eines Tabellenschutzes bestimmte Aktionen generell überhaupt nicht mehr möglich. Den Tabellenschutz stellen Sie über die Methode Protect her. Die Syntax dieser Methode lautet dabei: ActiveSheet.Protect _ (Password, DrawingObjects, Contents, _ Scenarios, UserInterfaceOnly)
Im Argument Passwort geben Sie das Kennwort für das Blatt oder die Arbeitsmappe an. Wenn Sie dieses Argument weglassen, kann der Schutz des Blattes oder der Arbeitsmappe ohne Angabe eines Kennworts aufgehoben werden. Mit dem Argument DrawingObjects bestimmen Sie, ob Sie zusätzlich zu Ihren Zellen auch noch Formen, wie z.B. Blockpfeile, Sterne oder Banner, schützen möchten. Diese Formen werden standardmäßig jedoch nicht geschützt. Wenn Sie Formen schützen möchten, setzen Sie das Argument auf den Wert True. Beim Argument Contents, welches standardmäßig auf True gesetzt ist, werden die Zellen eines Tabellenblattes geschützt. Das Argument Scenarios gilt nur für Arbeitsblätter und bedeutet, dass bestimmte Ansichten und Einstellungen, wie z.B. das eingestellte Zoom, geschützt werden. Die Standardeinstellung ist dabei ebenfalls True. Das letzte Argument UserInterFaceOnly gibt über den Wert True an, dass die Benutzeroberfläche, jedoch keine Makros geschützt werden. Ab der Excel-Version 2002 gibt es folgende zusätzliche Argumente, die den Tabellenschutz geradezu revolutionieren: 쐽
AllowFormattingCells: Setzen Sie dieses Argument auf den Wert True, wenn Sie die Formatierung in geschützten Zellen zulassen möchten.
쐽
AllowFormattingColumns: Bei dieser Einstellung darf der Benutzer Spalten formatieren, sofern dieses Argument auf den Wert True gesetzt wird.
쐽
AllowFormattingRows: Bei dieser Einstellung darf der Benutzer Zeilen formatieren, sofern dieses Argument auf den Wert True gesetzt wird.
쐽
AllowInsertingRows: Setzen Sie dieses Argument auf den Wert True, wenn Sie zulassen möchten, dass der Benutzer neue Zeilen in eine geschützte Tabelle einfügen darf.
쐽
AllowInsertingHyperlinks: Um das Einfügen von Hyperlinks in geschützten Tabellen zuzulassen, setzen Sie dieses Argument auf den Wert True.
223
Tabellenblätter programmieren
쐽
AllowDeletingColumns: Möchten Sie zulassen, dass in einer geschützten Tabelle Spalten gelöscht werden dürfen, dann setzen Sie dieses Argument auf den Wert True.
쐽
AllowDeletingRows: Möchten Sie zulassen, dass in einer geschützten Tabelle Zeilen gelöscht werden dürfen, dann setzen Sie dieses Argument auf den Wert True.
쐽
AllowSorting: Setzen Sie dieses Argument auf den Wert True, um eine Sortierung des geschützten Arbeitsblattes zu ermöglichen. Für jede Zelle im Sortierbereich muss die Sperre oder der Schutz aufgehoben werden.
쐽
AllowFiltering: Setzen Sie dieses Argument auf den Wert True, um zu ermöglichen, Filter für das geschützte Arbeitsblatt festzulegen. Die Benutzer können Filterkriterien ändern, jedoch keinen AutoFilter aktivieren oder deaktivieren.
쐽
AllowUsingPivotTables: Setzen Sie dieses Argument auf den Wert True, um es dem
Benutzer zu ermöglichen, auf einer geschützten Tabelle mit Pivot-Tabellen zu arbeiten. Im folgenden Beispiel wird TABELLE1 mit dem Kennwort HERO geschützt. Listing 7.26: Die Tabelle1 wird geschützt Sub TabelleSchützen() Sheets("Tabelle1").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
Wenn Sie versuchen, eine Änderung in der so geschützten Tabelle vorzunehmen, wird Ihnen dies nicht gelingen.
Abbildung 7.21: Alle Zellen werden in der Tabelle1 geschützt.
Selbstverständlich müssen nicht immer alle Zellen einer Tabelle geschützt werden, wie es im Makro aus Listing 7.26 vorgenommen wurde.
224
Tabellen schützen
Nur bestimmte Zellen vor Veränderung schützen Bei Tabellen, in denen Sie Formeln und Berechnungen durchführen, empfiehlt es sich, diese wichtigen Formeln zu schützen. Alle anderen Nicht-Formelzellen können dabei vom Tabellenschutz ausgenommen werden.
Abbildung 7.22: Nur Formelzellen sollen geschützt werden.
Standardmäßig sind alle Zellen einer Tabelle von vornherein mit dem Geschützt-Kennzeichen ausgestattet, d.h. wenn Sie eine Tabelle mit einem Schutz belegen, sind alle Zellen nicht mehr veränderbar. Folgende Arbeitsschritte müssen nun durchgeführt werden: 1. Generell für alle Zellen der Tabelle das Geschützt-Kennzeichen entfernen. 2. Ermittlung der Zellen, die Formeln enthalten. 3. Für diese Zellen das Geschützt-Kennzeichen setzen. 4. Den Schutz für die Tabelle einstellen. Diese vier Arbeitsschritte führen Sie im Makro aus Listing 7.27 durch.
225
Tabellenblätter programmieren
Listing 7.27: Nur Formelzellen wurden geschützt Sub TeileDerTabelleSchützen() Sheets("DB").Activate Cells.Select Selection.Locked = False Selection.SpecialCells(xlCellTypeFormulas).Select Selection.Locked = True Sheets("DB").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
Aktivieren Sie im ersten Schritt die gewünschte Tabelle, in der Sie die Formelzellen schützen möchten. Danach markieren Sie über die Anweisung Cells.Select alle Zellen der Tabelle. In der Cells-Auflistung sind alle Zellen einer Tabelle verzeichnet. Setzen Sie danach die Eigenschaft Locked auf den Wert False, um zuerst einmal das Geschützt-Kennzeichen für alle Zellen der Tabelle auszuschalten. Ermitteln Sie über die Methode SpecialCells, der Sie die Konstante xlCellTypeFormulas mitgeben, alle Formelzellen der Tabelle und markieren diese mithilfe der Methode Select. Schalten Sie für diese Zellen danach das Geschützt-Kennzeichen wieder ein, indem Sie die Eigenschaft Locked auf den Wert True setzen. Nun können Sie die Methode Protect einsetzen, um die Tabelle zu schützen. Danach können Formelzellen in dieser Tabelle nicht mehr geändert werden.
Temporären Schutz einstellen In der Praxis kommt es oft vor, dass Sie als Programmierer zwar den Schutz von Tabellen verwenden, aber trotzdem hin und wieder eine Änderung an der Tabelle vornehmen möchten, ohne jedes Mal den Schutz aufzuheben, die Änderung einzuarbeiten und den Tabellenschutz wieder einzustellen. Für diesen Fall können Sie alle Teilschritte auch über ein Makro durchführen lassen. Dieses Makro können Sie in Listing 7.28 sehen. Listing 7.28: Änderungen an geschützten Tabellen vornehmen Sub SchutzausÄnderungSchutzEin() 'Dokuschutz aufheben Sheets("DB").Unprotect Password:="hero"
226
Tabellen schützen
'Änderung durchführen Range("B2").Value = Date 'Dokuschutz wieder einstellen Sheets("DB").Protect Password:="hero", _ DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub
Bestimmte Bereiche vom Schutz ausnehmen Neu in der Version Excel 2002 ist auch die Funktion, dass Sie gezielt Bereiche in Ihrer Tabelle definieren können, für die ein eingestellter Blattschutz nicht gelten soll.
Abbildung 7.23: Der Bereich B3:E13 soll trotz Blattschutz frei editierbar bleiben.
Im folgenden Beispiel soll auf der TABELLE3 ein Bereich definiert werden, in dem der Anwender trotz eingestelltem Blattschutz Änderungen durchführen darf. Das Makro für diese Aufgabe sehen Sie in Listing 7.29: Listing 7.29: Einen eingabefreien Bereich trotz Blattschutz definieren Sub FreieBereicheFestlegen() Sheets("Tabelle3").Activate On Error GoTo fehler Sheets("Tabelle3").Protection.AllowEditRanges.Add _
227
Tabellenblätter programmieren
Title:="Bereich1", Range:=Range("B3:E13") Sheets("Tabelle3").Protect Password:="hero" Exit Sub fehler: MsgBox "Es ist ein Fehler aufgetreten!" End Sub
Mithilfe der Methode Add, die Sie auf die AllowEditRanges-Auflistung anwenden, können Sie einen Bereich definieren, der auch trotz eingestelltem Blattschutz weiter editierbar sein soll. Geben Sie dazu im Argument Title einen Namen für den Bereich ein. Des Weiteren geben Sie im Argument Range bekannt, wo der gewünschte Bereich in der Tabelle sein soll. Schützen Sie danach Ihre Tabelle über die Methode Protect.
7.9
Tabellen sortieren
Leider gibt es noch keine Standardfunktion in Excel, welche es erlaubt, Tabellenblätter nach ihrem Namen zu sortieren. Das folgende Makro sortiert alle Tabellenblätter nach aufsteigender alphabetischer Reihenfolge: Listing 7.30: Die Blätter einer Arbeitsmappe sortieren Sub Dim Dim Dim
BlätterSortieren() iMax As Integer Ibl As Integer ibl2 As Integer
Application.ScreenUpdating = False iMax = ThisWorkbook.Sheets.Count For Ibl = 1 To iMax For ibl2 = Ibl To iMax If UCase(Sheets(ibl2).Name) _ < UCase(Sheets(Ibl).Name) Then Sheets(ibl2).Move before:=Sheets(Ibl) End If Next ibl2 Next Ibl Application.ScreenUpdating = True End Sub
Um das Sortieren von Arbeitsblättern durchzuführen, müssen Sie zwei verschachtelte For Next-Schleifen durchlaufen. Beide haben als Endbedingung immer die Anzahl der Blätter, die in der Mappe enthalten sind. Innerhalb der zweiten Schleife werden die Namen der
228
Kopf- und Fußzeilen programmieren
Blätter verglichen. Beim Vergleich der Blattnamen werden diese erst einmal in Großbuchstaben gewandelt, um sicherzustellen, dass die Groß- und Kleinschreibung beim Sortiervorgang keine Rolle spielt. Je nach Vergleichsergebnis werden die einzelnen Blätter dann innerhalb der Arbeitsmappe mithilfe der Methode Move verschoben oder auch nicht.
Abbildung 7.24: Die Blätter liegen sortiert in der Arbeitsmappe vor.
7.10 Kopf- und Fußzeilen programmieren Auch die automatische Generierung von Kopf- und Fußzeilen macht Sinn. Standardmäßig können Sie manuell immer nur eine Tabelle nach der anderen mit Kopf- und Fußzeilen bestücken. Diese zeitraubende wie auch lästige Arbeit können Sie schneller mit dem Einsatz eines VBA-Makros erledigen. In der Excel-Version 2002 ist es erstmals möglich, Grafiken in die Kopf- und Fußzeile zu integrieren. In früheren Excel-Versionen konnte man sich zumindest bei den Kopfzeilen mit einem Trick behelfen. Man fügte eine Grafik in die erste Zeile der Tabelle ein und deklarierte diese Zeile als Wiederholungszeile. So wurde die so eingefügte Grafik auf jeder neuen Seite wiederholt.
229
Tabellenblätter programmieren
Kopf- und Fußzeilen füllen Beim Befüllen der Kopf- und Fußzeilen einer Tabelle können Sie zum einen auf bereits existierende Funktionen wie den Namen der Tabelle, die Seitennummerierung sowie das Datum zurückgreifen, die Sie in der normalen Excel-Oberfläche über Schaltflächen hinzufügen können. Des Weiteren können Sie über Dokumenteigenschaften oder auch Zellenbezüge weitere Informationen in Ihre Kopf- und Fußzeilen bringen. Die nächste Makrolösung wird die folgenden Einstellungen an der Kopf- und Fußzeile einer Tabelle vornehmen: 쐽
Kopfzeile links: das Thema der Tabelle (aus Zelleninhalt A1)
쐽
Kopfzeile Mitte: der Firmenname (aus den Dokumenteigenschaften)
쐽
Kopfzeile rechts: das Datum (mit ausgeschriebenem Monat und vierstelliger Jahresangabe)
쐽
Fußzeile links: der Name der Mappe/Tabelle
쐽
Fußzeile Mitte: der Autor der Tabelle (aus Dokumenteigenschaften)
쐽
Fußzeile rechts: die Seitennummerierung (Seite X von Y Seiten)
Außerdem soll am Ende die Seitenansicht automatisch aufgerufen werden. Listing 7.31: Die Kopf- und Fußzeile festlegen Sub KopfUndFußzeileFestlegen() With ActiveSheet.PageSetup .LeftHeader = ActiveSheet.Range("A1").Value .CenterHeader = _ ThisWorkbook.BuiltinDocumentProperties("Company") .RightHeader = Format(Date, "DD. MMMM YYYY") .LeftFooter = "&F/&A" .CenterFooter = ThisWorkbook.BuiltinDocumentProperties("Author") .RightFooter = "&P von &N Seiten" End With ActiveWindow.SelectedSheets.PrintPreview End Sub
Um die Kopf- und Fußzeile festlegen zu können, setzen Sie das Objekt PageSetup ein. Nun können Sie ganz gezielt auf die einzelnen Komponenten zugreifen, indem Sie diese mit den gewünschten Informationen füllen. In der linken Kopfzeile (LeftHeader) fügen Sie den Inhalt ein, der momentan in Zelle A1 steht. In der Mitte der Kopfzeile (CenterHeader), greifen Sie auf die Dokumenteigenschaft Company zu, die den Firmennamen zurückmeldet. In der rechten Kopfzeile (RightHeader) fügen Sie das aktuelle Tagesdatum ein und for-
230
Kopf- und Fußzeilen programmieren
matieren es mithilfe der Funktion Format nach Ihren Wünschen. In der linken Fußzeile (LeftFooter) fügen Sie den Namen der Arbeitsmappe sowie den Tabellennahmen über die Kopf- und Fußzeilenkürzel &F und &A ein. In der Mitte der Fußzeile (CenterFooter) zeigen Sie den Namen des Autors an, welchen Sie aus den Dokumenteigenschaften holen. Am rechten Rand der Fußzeile (RightFooter) geben Sie die Seitennummerierung über die Formatkürzel &P und &N an.
Abbildung 7.25: Die fertige Kopf- und Fußzeile
Möchten Sie das Makro aus Listing 7.31 nicht nur für die aktuelle Tabelle, sondern für alle Tabellen der Arbeitsmappe einsetzen, dann erweitern Sie dieses Makro. Das Ergebnis daraus können Sie in Listing 7.32 sehen: Listing 7.32: Die Einstellungen für die Kopf- und Fußzeile für alle Tabellen der Arbeitsmappe übernehmen Sub KopfUndFußzeileFestlegenAlleTabellen() Dim Tabelle As Worksheet For Each Tabelle In ThisWorkbook.Worksheets With Tabelle.PageSetup .LeftHeader = Tabelle.Range("A1").Value .CenterHeader = _ ThisWorkbook.BuiltinDocumentProperties("Company") .RightHeader = Format(Date, "DD. MMMM YYYY") .LeftFooter = "&F/&A" .CenterFooter = ThisWorkbook.BuiltinDocumentProperties("Author") .RightFooter = "&P von &N Seiten" End With Next Tabelle End Sub
231
Tabellenblätter programmieren
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Worksheet. Setzen Sie danach eine Schleife auf, in der Sie alle Tabellen der Arbeitsmappe abarbeiten. Innerhalb dieser Schleife füllen Sie die einzelnen Komponenten des Objekts PageSetup wie bereits in Listing 7.31 beschrieben.
7.11 Workshop 7.11.1 Fragen & Antworten F
Wie können Sie die voraussichtliche Druckseiten-Anzahl einer Tabelle ermitteln? A
Über die Anweisung: MsgBox ExecuteExcel4Macro("Get.Document(50)").
F
Wie können Sie eine Tabelle ans Ende der Arbeitsmappe verschieben? A
Für diese Aufgabe setzen Sie die Methode Move ein. Sheets("Tabelle1").Move After:=Sheets(Sheets.Count)
F
Wie können Sie eine Tabelle schützen, danach aber noch die Filterfunktion einsetzen? A
Starten Sie das Makro aus Listing 7.33 Listing 7.33: Die Filterfunktion trotz Blattschutz erhalten Sub FilternAuchBeiBlattschutz() ActiveSheet.Protect userinterfaceonly:=True ActiveSheet.EnableAutoFilter = True End Sub
Geben Sie bei der Methode Protect als Argument userinterfaceonly den Wert True an. Damit können Sie auch in einer geschützten Tabelle noch den AutoFilter verwenden.
7.11.2 Quiz 1. Wie kann man die Standardmeldungen von Excel abschalten? Gerade beim Löschen von Tabellen ist die dabei angezeigte Bestätigungsmeldung unerwünscht. 2. Was müssen Sie machen, wenn Sie eine Tabelle so ausblenden möchte, dass ein Anwender diese ohne den Einsatz eines Makros nicht wieder einblenden kann?
232
Workshop
3. Wie können Sie eine Grafik in die Kopfzeile Ihrer Tabelle bringen? 4. Welche Formatkürzel können Sie für die Generierung von Kopf- und Fußzeilen einsetzen?
7.11.3 Übungen Zum Abschluss dieses Tages versuchen Sie einmal, die folgenden beiden Aufgaben über den Einsatz eines VBA-Makros zu lösen: 1. Legen Sie eine neue Arbeitsmappe an und fügen Sie darin genau 12 Tabellen ein, die Sie nach Monatsnamen benennen. 2. Entfernen Sie aus einer Tabelle alle Formeln, und zwar so, dass die Formeln in Festwerte umgewandelt werden. Die Lösung finden Sie wie immer im Anhang.
233
Tag 1
Die Entwicklungsplattform kennen lernen
21
Tag 2
Datentypen, Variablen und Konstanten
61
Tag 3
Die Sprachelemente von VBA
97
Tag 4
Auf Fehlersuche mit VBA
129
Tag 5
Einstellen und Anpassen der Excel-Anwendung
147
Tag 6
Auf Arbeitsmappen zugreifen – Datei-Operationen 171
Tag 7
Tabellenblätter programmieren
197
Tag 8
Zellenbearbeitung mit VBA
237
Tag 9
Aktionen und Benutzereingaben in Excel überwachen
309
Große Datenmengen in VBA behandeln und auswerten
327
Tag 11
Daten grafisch darstellen
349
Tag 12
Tastatur- und Zeitsteuerung in Excel
367
Tag 13
Tastatur- und Zeitsteuerung in Excel
367
Tag 14
Makros dynamisch erzeugen, importieren und exportieren über VBE-Programmierung
395
Tag 10
Tag 15
Funktionen einsetzen, um Excel zu automatisieren 419
Tag 16
Excel und das Internet
443
Tag 17
Excel und Datenbankzugriffe in Access
461
Tag 18
Excel und Word im Zusammenspiel
481
Tag 19
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
499
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
517
Erstellen von Add-Ins
537
Tag 20 Tag 21
W O C H E
W O C H E
W O C H E
Woche 2: Der Kern von VBA Nachdem Sie die erste Woche hinter sich haben, stoßen Sie in dieser Woche in den inneren Kern von Excel vor. Am 8. 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. Auch am 9. Tag verbleiben wir noch bei diesem Zellenthema. Inhalt dieses Tages wird sein, Formeln und Tabellenfunktionen anzuwenden. Am 10. 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. Der 11. 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. Am 12. Tag werden Sie Ihre Daten optisch in Diagrammen darstellen. Dabei werden Sie Diagramme unterschiedlichster Art erstellen. Am 13. Tag 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. 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.
236
Zellenbearbeitung mit VBA
8
Zellenbearbeitung mit VBA
Die Zellenbearbeitung in Excel ist meiner Ansicht nach das wichtigste Thema der Programmierung. Auf dieser untersten Ebene laufen die wichtigsten Aktionen ab. Auf dieser Ebene werden Zellen markiert, mit Daten gefüllt, ausgelesen, formatiert und vieles mehr. Die Themen heute: 쐽
Zellen markieren
쐽
Zellen füllen
쐽
Zellen formatieren
쐽
Zellen benennen
쐽
Zellen kommentieren Alle Makrobeispiele können Sie in der Arbeitsmappe Zellen.xls im Verzeichnis Kap08 auf der beiliegenden CD-ROM nachschlagen.
8.1
Zellen markieren
Als erste Tagesaufgabe lernen Sie heute, wie Sie Zellen in Excel markieren können. Für das Markieren von Zellen verwenden Sie die Methode Select. Diese Methode wenden Sie auf das Objekt Range an, welches entweder für eine einzelne Zelle oder einen Zellenbereich steht.
Zelle markieren und Koordinaten ausgeben Im folgenden Beispiel aus Listing 8.1 wird die Zelle A10 markiert. Des Weiteren werden die Koordinaten in einer Bildschirmmeldung ausgegeben. Listing 8.1: Zelle markieren und Koordinaten ausgeben Sub ZelleMarkieren() Sheets("Tabelle1").Activate Range("A10").Select MsgBox "Sie haben die Zelle " & _ ActiveCell.Address & " markiert!", vbInformation End Sub
238
Zellen markieren
Aktivieren Sie im ersten Schritt des Makros das gewünschte Tabellenblatt, in dem Sie die Zelle A10 markieren möchten. Wenden Sie danach die Methode Select an, um die Zelle zu markieren. Über die Anweisung ActiveCell.Address können Sie die genauen Koordinaten der Zelle bestimmen.
Abbildung 8.1: Die Koordinaten der aktiven Zelle werden ausgegeben.
Zellenbereich markieren und Koordinaten ausgeben Im nächsten Beispiel wird ein ganzer Zellenbereich markiert und im Anschluss daran werden die Koordinaten ausgegeben: Listing 8.2: Einen Zellenbereich markieren und ausgeben Sub ZellenMarkieren() Sheets("Tabelle1").Activate Range("A10:C15").Select MsgBox "Sie haben die Zellen " & _ Selection.Address & " markiert!", vbInformation End Sub
Markieren Sie über die Methode Select den gewünschten Bereich und ermitteln Sie die Koordinaten des markierten Bereichs über die Anweisung Selection.Address.
239
Zellenbearbeitung mit VBA
Abbildung 8.2: Die Koordinaten des markierten Bereichs ausgeben
Mehrere Zellenbereiche markieren Einen Schritt weiter geht das folgende Makro. Es markiert mehrere Bereiche in einer Tabelle: Listing 8.3: Mehrere Bereiche markieren und ausgeben Sub Dim Dim Dim Dim
BereicheMarkieren() Bereich1 As Range Bereich2 As Range Bereich3 As Range Gesamtbereich As Range
Sheets("Tabelle1").Activate Set Bereich1 = Range("A5:C8") Set Bereich2 = Range("E5:G8") Set bereich3 = Range("A10:C12") Set Gesamtbereich = Union(Bereich1, Bereich2, Bereich3) Gesamtbereich.Select MsgBox "Sie haben die Zellen " & _ Gesamtbereich.Address & " markiert!", vbInformation
240
Zellen markieren
Set Set Set Set End
Bereich1 = Nothing Bereich2 = Nothing Bereich3 = Nothing Gesamtbereich = Nothing Sub
Deklarieren Sie im ersten Schritt einige Objektvariablen vom Typ Range. In diesen Objektvariablen sollen die einzelnen Bereichskoordinaten gespeichert werden. Mit der Anweisung Set definieren Sie zuerst die einzelnen Zellbereiche Bereich1 bis Bereich3. Danach vereinen Sie diese Einzelbereiche mithilfe der Methode Union zu einem Block, welcher den Namen Gesamtbereich trägt. Diesen Block können Sie über die Methode Select komplett markieren. Über die Anweisung Gesamtbereich.Address ermitteln Sie die Koordinaten der einzelnen Bereiche. Am Ende des Makros sollten Sie den reservierten Speicher, den Sie für die Objektvariablen in Beschlag genommen haben, wieder freigeben. Dies erreichen Sie, indem Sie den Objektvariablen mit der Set-Anweisung den Wert Nothing zuweisen.
Abbildung 8.3: Die Koordinaten aller Bereiche ausgeben
Relative Markierungsformen Bis jetzt haben Sie lediglich absolute Markierungen vorgenommen, d.h. die Zellenadressen wurden bei der Markierung in der A1-Form vorgenommen. Oft müssen aber Markierungen auch relativ angegeben werden. Ein Beispiel für eine relative Markierungsform wäre Folgendes: Geben Sie die Koordinaten der momentan aktiven Zelle aus und markieren Sie ausgehend von dieser Zelle drei weitere Zellen nach rechts!
241
Zellenbearbeitung mit VBA
Für den Fall, dass die aktive Zelle momentan die Zelle B5 ist, müssten dann die Zellen C5, D5 und E5 zusätzlich markiert werden. Die Lösung dieser Aufgabenstellung sehen Sie im Makro aus Listing 8.4. Listing 8.4: Drei weitere Zellen nach rechts werden in die Auswahl mit aufgenommen Sub RelativeMarkierung() Worksheets("Tabelle1").Activate Range(ActiveCell, ActiveCell.Offset(0, 3)).Select MsgBox "Aktive Zelle: " & ActiveCell.Address & Chr(13) & _ "Weitere Zellen: " & Selection.Address, vbInformation End Sub
Bei der Anweisung Range(ActiveCell, ActiveCell.Offset(0,3)).Select werden ausgehend von der aktiven Zelle, drei weitere Nebenzellen markiert. Für diesen Zweck wird die Eigenschaft OffSet verwendet. Diese Eigenschaft hat zwei Argumente: 쐽
Im ersten Argument wird die Anzahl der Zeilen (positiv, negativ oder 0 (Null)), um die der Bereich versetzt werden soll, angegeben. Bei positiven Werten erfolgt ein Versatz nach unten, bei negativen Werten ein Versatz nach oben. Da in unserem Beispiel die Markierung in derselben Zeile verbleiben soll, setzen Sie dieses Argument auf den Wert 0.
쐽
Im zweiten Argument wird die Anzahl der Spalten (positiv, negativ oder 0 (Null)), um die der Bereich versetzt werden soll, angegeben. Bei positiven Werten erfolgt ein Versatz nach rechts, bei negativen Werten ein Versatz nach links. Da in unserem Beispiel die Markierung der drei Spalten nach rechts verbleiben soll, setzen Sie dieses Argument auf den Wert 3.
Abbildung 8.4: Relative Markierungsformen
242
Zellen markieren
Im nächsten Beispiel wird eine Markierung ausgehend von der aktiven Zelle um vier Zeilen nach unten und zwei Spalten nach links erweitert: Listing 8.5: Relative Markierung mit Fehlerbehandlung Sub RelativeMarkierung2() Worksheets("Tabelle1").Activate On Error GoTo fehler Range(ActiveCell, ActiveCell.Offset(3, -2)).Select MsgBox "Relative Markierung: " & Selection.Address, _ vbInformation Exit Sub fehler: MsgBox "Die Markierung kann nicht vorgenommen werden!" End Sub
Ausgehend von der aktiven Zelle in unserem Beispiel markieren Sie vor dem Makrostart die Zelle C5, wird die Markierung mithilfe der Eigenschaft OffSet um drei Zeilen nach unten und zwei Spalten nach links erweitert. Die Fehlerbehandlung für dieses Beispiel ist wichtig, da Sie sicherstellen müssen, dass der Offset auch durchgeführt werden kann. Für den Fall, dass die aktive Zelle beispielsweise die Zelle A5 ist, kann der Offset nicht erfolgreich durchgeführt werden, da es keine weiteren Spalten links neben der Spalte A gibt. Vorsicht auch bei ausgeblendeten Zeilen oder Spalten. Bei der Eigenschaft Offset werden diese ausgeblendeten Objekte mitgezählt. Die Problematik wird in Abbildung 8.5 ersichtlich.
Abbildung 8.5: Wie lautet der Offset?
243
Zellenbearbeitung mit VBA
Auf den ersten Blick würden Sie sagen: Der Offset ausgehend von der Zelle D2 lautet: ActiveCell.Offset(5, -1).Select
Diese Bestimmung ist falsch! Beachten Sie, dass hier einige ausgeblendete Zeilen und Spalten vorliegen, die Sie mitzählen müssen. Der richtige Offset lautet daher: ActiveCell.Offset(12, -2).Select
Zellen über einen Index ansprechen Seither haben Sie eine Zelle in der A1-Bezugsform angesprochen. Sie können eine Zelle aber auch über einen Index, der aus einem Zeilen- und einem Spaltenindex besteht ansprechen. Im folgenden Makro wird die Zelle C10 selektiert und die Koordinaten werden ausgegeben: Listing 8.6: Ansteuern einer Zelle über die Eigenschaft Cells Sub ZellenAnsprechen() Cells(10, 3).Select MsgBox "Die Zelle " & Cells(10, 3).Address & _ " wurde markiert!", vbInformation End Sub
Mithilfe der Eigenschaft Cells können Sie eine bestimmte Zelle ansteuern. Dabei weist diese Eigenschaft zwei Argumente auf. Das erste Argument steht für die Zeile, das zweite Argument für die Spalte. Der Schnittpunkt aus Zeile und Spalte ergibt dann die exakte Adresse der Zelle. Über die Eigenschaft Cells können selbstverständlich auch Bereiche angesprochen werden. Im Makro aus Listing 8.7 wird der Bereich C10:E10 markiert. Listing 8.7: Einen Bereich über die Eigenschaft Cells markieren Sub BereicheAnsprechen() Range(Cells(10, 3), Cells(10, 5)).Select End Sub
Den verwendeten Bereich ermitteln In Excel haben Sie die Möglichkeit, den verwendeten Bereich einer Tabelle zu ermitteln. Diese Aufgabe lösen Sie, indem Sie die Eigenschaft UsedRange einsetzen. Im folgenden Makro wird der verwendete Bereich der TABELLE3 herausgefunden und markiert.
244
Zellen markieren
Listing 8.8: Den verwendeten Bereich einer Tabelle ermitteln Sub VerwendetenBereichErmitteln() Sheets("Tabelle3").Activate ActiveSheet.UsedRange.Select End Sub
Die Eigenschaft UsedRange gibt den verwendeten Teil eines Tabellenblattes zurück.
Abbildung 8.6: Der verwendete Bereich einer Tabelle wird markiert.
Den umliegenden Bereich ermitteln Nicht immer ist es erwünscht, gleich den ganzen Bereich einer Tabelle zu ermitteln und zu markieren. Oft reicht es auch aus, den umliegenden Bereich einer Zelle auszukundschaften und zu markieren. Mithilfe der Eigenschaft CurrentRegion können Sie beispielsweise den umliegenden Bereich einer Zelle ermitteln. Der ermittelte Bereich wird durch die erste Leerzeile bzw. -spalte begrenzt.
245
Zellenbearbeitung mit VBA
Im nächsten Beispiel soll in einer Tabelle ein ganz bestimmter Bereich lokalisiert und markiert werden: Listing 8.9: Den umliegenden Bereich einer Zelle markieren Sub UmliegendenBereichErmitteln() Sheets("Tabelle4").Activate Range("B9").Select ActiveCell.CurrentRegion.Select End Sub
Über die Eigenschaft CurrentRegion haben Sie die Möglichkeit, den umliegenden Bereich einer Zelle zu ermitteln. Diese Eigenschaft wird in Abbildung 8.7 klar.
Abbildung 8.7: Der umliegende Bereich um die Zelle B9 wird markiert.
246
Zellen füllen
8.2
Zellen füllen
Da Sie nun wissen, wie Sie Zellen und Bereiche markieren können, gehen wir einen Schritt weiter und füllen Zellen mit Inhalten.
Zellen initialisieren Viele Fehler in Makros werden dadurch hervorgerufen, dass Variablen zu Beginn nicht sauber gesetzt werden. Ähnlich ist es beim Füllen von Zellen. Zu Beginn einer Füllaktion ist es oft angebracht, den zu füllenden Bereich vorher zu löschen und dann neu zu befüllen. Warum? Es ist durchaus möglich, dass vor dem Starten des Makros bereits Werte vorhanden sind, d.h. Sie können nachher nur schwer feststellen, welche Werte nun neu vom Makro selbst gesetzt wurden. Im folgenden Beispiel wird ein Bereich komplett mit Nullen gelöscht. Diese Bereiche sollen jeden Tag mit aktuellen Daten gefüllt werden. Sehen Sie sich dazu das Makro aus Listing 8.10 an: Listing 8.10: Bereiche initialisieren Sub Dim Dim Dim Dim
BereicheInitialisieren() Bereich1 As Range Bereich2 As Range Bereich3 As Range Gesamtbereich As Range
Sheets("Tabelle5").Activate Set Bereich1 = Range("C7:C8") Set Bereich2 = Range("C13:C14") Set Bereich3 = Range("C19:C20") Set Gesamtbereich = Union(Bereich1, Bereich2, Bereich3) Gesamtbereich.Value = 0 Set Bereich1 = Nothing Set Bereich2 = Nothing Set Bereich3 = Nothing Set Gesamtbereich = Nothing End Sub
247
Zellenbearbeitung mit VBA
Deklarieren Sie im ersten Schritt einige Objektvariablen vom Typ Range. In diesen Objektvariablen sollen die einzelnen Bereichskoordinaten gespeichert werden. Mit der Anweisung Set definieren Sie zuerst die einzelnen Zellbereiche Bereich1 bis Bereich3. Danach vereinen Sie diese Einzelbereiche mithilfe der Methode Union in einem Block, welcher den Namen Gesamtbereich trägt. Diesem Block können Sie nun über die Eigenschaft Value den Wert 0 zuweisen. Am Ende des Makros sollten Sie den reservierten Speicher, den Sie für die Objektvariablen in Beschlag genommen haben, wieder freigeben. Dies erreichen Sie, indem Sie den Objektvariablen mit der Set-Anweisung den Wert Nothing zuweisen.
Abbildung 8.8: Die Bereiche wurden auf Null gesetzt.
Zellen abfragen und ändern Genau den umgekehrten Vorgang, nämlich den momentanen Wert einer Zelle abfragen, können Sie ebenfalls mit der Eigenschaft Value durchführen. Im nächsten Beispiel soll eine Liste mit Buchungen abgearbeitet werden. Dabei sollen alle Positionen, die wertmäßig über 2500 Euro liegen, in der Nebenspalte mit dem Buchstaben A gekennzeichnet werden. Sehen Sie sich zunächst die Ausgangslage in Abbildung 8.9 an.
248
Zellen füllen
Abbildung 8.9: Die Liste nach dem Datum sortiert
Abbildung 8.10: Alle höheren Buchungen wurden in Spalte C gekennzeichnet.
249
Zellenbearbeitung mit VBA
Kennzeichnen Sie nun die Buchungen, indem Sie das Makro aus Listing 8.11 einsetzen: Listing 8.11: Buchungspositionen kennzeichnen Sub ListeAbarbeiten() Sheets("Tabelle6").Activate Range("B2").Select Do Until ActiveCell.Value = "" If ActiveCell.Value > 2500 Then ActiveCell.Offset(0, 1).Value = "A" ActiveCell.Offset(1, 0).Select Loop End Sub
Aktivieren Sie im ersten Schritt die gewünschte Zelle und setzen Sie den Mauszeiger auf die Startadresse. Danach 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 Nebenzelle den Buchstaben A. Setzen Sie für diese Aufgabe die Offset-Eigenschaft ein, bei der Sie den Zeilen-Offset auf 0 setzen und den Spalten-Offset auf den Wert 1. Vergessen Sie nicht am Ende der Schleife den Mauszeiger jeweils eine Zeile nach unten zu setzen. Die Schleife wird verlassen, sobald die erste leere Zelle in Spalte B erreicht wird.
8.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. Listing 8.12 erstellt eine neue Tabelle und gibt die Farben bzw. deren Index in einer Liste aus.
250
Zellen formatieren
Listing 8.12: Farbindex und Farbe ermitteln Sub FarbenAusgeben() Dim i As Integer Sheets.Add Range("A1").Value = "Index" Range("B1").Value = "Farbe" Range("A2").Select For i = 1 To 56 ActiveCell.Value = i ActiveCell.Offset(0, 1).Interior.ColorIndex = i ActiveCell.Offset(1, 0).Select Next i End Sub
Fügen Sie mithilfe der Anweisung Sheets.Add eine neue Tabelle in Ihre Arbeitsmappe ein. 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. Vergessen Sie nicht am Ende der Schleife den Mauzeiger eine Zelle weiter nach unten zu setzen.
Abbildung 8.11: Alle verfügbaren Farben und deren Indexwerte in einer Tabelle
251
Zellenbearbeitung mit VBA
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: Listing 8.13: Den aktuellen Zellfarbenindex bestimmen Sub FarbeAktiveZelle() MsgBox "Die aktive Zelle " & ActiveCell.Address & _ " hat den Farbindex: " & ActiveCell.Interior.ColorIndex End Sub
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 mit einem einzigen Befehl beseitigt: Listing 8.14: Alle Hintergrundfarben von Zellen in einer Tabelle entfernen Sub FarbenEntfernen() Sheets("Tabelle7").Activate Cells.Interior.ColorIndex = xlColorIndexNone End Sub
Über die Eigenschaft Cells, die Sie ohne weitere Argumente angeben, haben Sie Zugriff auf alle Zellen der aktiven Tabelle. Diese Zellen können Sie entfärben, 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 einer anderen Schriftart in der Schriftgröße 14 formatiert werden. Das Makro für diese Aufgabe sehen Sie in Listing 8.15: Listing 8.15: Eine andere Schriftart bzw. Schriftgröße einstellen Sub SchriftArtEinstellen() Dim Zelle As Range Dim Bereich As Range
252
Zellen formatieren
Sheets("Tabelle5").Activate Set Bereich = Range("A1:E20") With Bereich.Font .Name = "Garamond" .Size = 14 End With Set Bereich = Nothing End Sub
Aktivieren Sie zuerst einmal die Tabelle, auf der Sie eine andere Schriftart einstellen möchten. Auf dieser Tabelle definieren Sie mithilfe der Anweisung Set einen Bereich. Dieser Bereich wird mit der Schriftart GARAMOND 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 beiden Eigenschaften Name und Size 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.
Abbildung 8.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.
253
Zellenbearbeitung mit VBA
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.
Shadow
Diese Eigenschaft liefert den Wert True, wenn ein Text als schattierte Schriftart formatiert wird.
Strikethrough Diese Eigenschaft liefert den Wert True, wenn ein Text als horizontal durchstrichen
dargestellt wird. Subscript
Diese Eigenschaft liefert den Wert True, wenn ein Text 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 8.1: Die wichtigsten Eigenschaften für das Objekt Font
Nun zu etwas Neuem. Erstellen Sie als kleine Vorarbeit eine neue Tabelle und erzeugen Sie 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) + (¢) 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 8.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 8.16.
254
Zellen formatieren
Abbildung 8.13: Die Ausgangstabelle mit den Zufallszahlen
Listing 8.16: Die Schriftschnitte Fett und Kursiv bei Bedarf zuweisen Sub WerteÜberprüfenUndKennzeichnen() Dim Zelle As Range Dim Bereich As Range Sheets("Tabelle9").Activate Set Bereich = Range("B2:E20") For Each Zelle In Bereich If Zelle.Value > 600 Then Zelle.Font.Bold = True Zelle.Font.Italic = True Else End If Next Zelle End Sub
255
Zellenbearbeitung mit VBA
Abbildung 8.14: Alle Zellen > 600 wurden im Schriftschnitt geändert.
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.
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.
256
Zellen formatieren
Konstante
Beschreibung
xlContinuous
Durchgezogene Linie
xlDash
Gestrichelte Linie
xlDashDot
Linie aus Strichen und Punkten
xlDashDotDot
Linie aus Strich-Punkt-Punkt
xlDot
Gepunktete Linie
xlDouble
Linie doppelt
xlSlantDashDot
Linie aus Wellenzeichen und Punkt
xlLineStyleNone
Keine Linie
Tabelle 8.2: Die verschiedenen Rahmentypen in Excel
Im folgenden Beispiel werden Sie die aktuelle Auswahl mit einem gestrichelten roten Rahmen belegen. Dabei spielt es keine Rolle, ob die Auswahl eine oder mehrere Zellen enthält. Die Lösung dieser Aufgabenstellung können Sie in Listing 8.17 sehen: Listing 8.17: Einen Bereich mit einem Rahmen versehen Sub RahmenBestimmen() Dim Bereich As Range Sheets("Tabelle10").Activate On Error GoTo fehler Set Bereich = _ Application.InputBox("Markieren Sie einen Bereich", Type:=8) With Bereich.Borders .ColorIndex = 3 .LineStyle = xlDash End With Set Bereich = Nothing Exit Sub fehler: MsgBox "Der Vorgang wurde abgebrochen!" End Sub
257
Zellenbearbeitung mit VBA
Fragen Sie mithilfe der Funktion InputBox einen Bereich vom Anwender ab, den dieser über eine Eingabemaske direkt auf der Tabelle markieren soll. Wird dieser Markierungsvorgang über die 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 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 8.2 kennen.
Abbildung 8.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. Angenommen, es soll ein Bereich mit recht hohen Zahlen mit dem Tausenderpunkt formatiert werden. Sehen Sie sich vorerst die Abbildung 8.16 an. Erhöhen Sie die Übersichtlichkeit und weisen Sie diesen Zahlen das Tausender-Trennzeichen mithilfe des Makros aus Listing 8.18 zu.
258
Zellen formatieren
Abbildung 8.16: Diese Zahlen sind schwer lesbar.
Listing 8.18: Den Tausenderpunkt in das Zahlenformat einbauen Sub FormatierungTausenderPunkt() Sheets("Tabelle11").Activate Range("B2:E5").Select Selection.NumberFormat = "#,##0" End Sub
Das Zahlenformat wird in Excel über die Eigenschaft NumberFormat zugewiesen. Da Sie vorher den gewünschten Datenbereich markiert haben, können Sie diese Eigenschaft direkt auf das Auflistungsobjekt Selection anwenden, in welchem alle Zellen der Markierung verzeichnet sind.
Abbildung 8.17: Die Lesbarkeit der Zahlenwerte ist um ein Vielfaches besser.
259
Zellenbearbeitung mit VBA
Möchten Sie jegliche Formatierung Ihrer Daten löschen, setzen Sie die Methode ClearFormats ein. In Listing 8.19 werden über diese Methode die gerade eben gesetzten Tausenderpunkte wieder entfernt. Listing 8.19: Jegliche Formatierung innerhalb der Markierung wird gelöscht Sub FormatierungLöschen() Sheets("Tabelle11").Activate Range("B2:E5").Select Selection.ClearFormats End Sub
Datumsformate festlegen In Excel werden Datumswerte intern in Zahlenwerte umgesetzt, damit Sie damit rechnen 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 10.09.2002 eingeben und diese Zelle dann mit dem Format STANDARD belegen, so liefert Ihnen dieses Datum die Zahl 37509. Excel bietet noch ein zweites Datumssystem an, das 1904-Datumssystem. Beim 1904-Datumssystem beginnt die Zeitrechnung in Excel am 01.01.1904. Das Datum 10.09.2002 entspricht in diesem Fall der Zahl 36047. Die Entscheidung, welches Datumssystem Sie 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 8.18 an. 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 8.20: Datumsformat zuweisen Sub DatumsformatZuweisen() Sheets("Tabelle12").Activate Range("A1:A12").NumberFormat = "DD. MMMM YYYY" End Sub
260
Zellen formatieren
Abbildung 8.18: Unterschiedliche Datumsformate sollen auf einen Stand gebracht werden.
Bei der Eigenschaft NumberFormat können Sie mit Formatkürzeln arbeiten. Beim Beispiel aus Listing 8.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 8.19: Datumsangaben vereinheitlichen
261
Zellenbearbeitung mit VBA
8.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. 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 8.21: Namen vergeben Sub BereichBenennen() Dim Bereich As Range Dim Bereich2 As Range Set Bereich = Sheets("Tabelle3").Range("C5:C24") ActiveWorkbook.Names.Add _ Name:="Kosten", _ RefersTo:=Bereich, Visible:=True Set Bereich2 = Sheets("Tabelle3").Range("D5:D24") ActiveWorkbook.Names.Add _ Name:="Leistung", _ RefersTo:=Bereich2, Visible:=True Bereich.Select Set Bereich = Nothing Set Bereich2 = Nothing End Sub
In Listing 8.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.
262
Zellen benennen
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 Zellbereich 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. 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 8.20: Die Blöcke Kosten und Leistung wurden benannt.
263
Zellenbearbeitung mit VBA
Möchten Sie die gerade eingefügten Namen wieder löschen, dann starten Sie das Makro aus Listing 8.22. Listing 8.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 8.22 wird dieser Fehlerfall einfach ignoriert.
8.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 unter EXTRAS/OPTIONEN/ANSICHT in Excel eingestellt ist. Wenn Sie den Mauszeiger auf eine Zelle positionieren, wird automatisch ein kleines Textfenster eingeblendet, welches den Kommentar beinhaltet.
Kommtarzellen 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 Makro aus Listing 8.23 ein. Listing 8.23: Kommentare auflisten Sub KommentareAuflisten() Dim Notiz As Comment Dim Tabelle As Worksheet
264
Zellen kommentieren
Dim DokuBlatt As String Dim i As Integer Sheets.Add DokuBlatt = ActiveSheet.Name i = 1 For Each Tabelle In ThisWorkbook.Worksheets For Each Notiz In Tabelle.Comments Sheets(DokuBlatt).Cells(i, 1).Value = Notiz.Text Sheets(DokuBlatt).Cells(i, 2).Value = Notiz.Parent.Address & _ " in " & Tabelle.Name i = i + 1 Next Notiz Next Tabelle Sheets(DokuBlatt).Activate With Columns("A") .ColumnWidth = 40 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With With Columns("B") .ColumnWidth = 10 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With End Sub
Deklarieren Sie zuerst einmal eine Objektvariable vom Typ Comment, um die Notizen der Arbeitsmappe ansprechen zu können. Des Weiteren benötigen Sie eine Objektvariable vom Typ Worksheet sowie eine String- und 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. Den Namen der neu eingefügten Tabelle speichern Sie in der Stringvariablen DokuBlatt. Setzen Sie die Zählvariable i 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
265
Zellenbearbeitung mit VBA
das übergeordnete Objekt des Objekts Comment 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.
Abbildung 8.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 8.24 wird auf die TABELLE3 zugegriffen. In dieser Tabelle werden alle Zelleneinträge aus dem Bereich C5:D24 herausgenommen und als Kommentare eingefügt.
266
Zellen kommentieren
Listing 8.24: Kommentare aus Zelleninhalten bilden Sub KommentareAusZellen() Dim Kom As Comment Dim Zelle As Range Sheets("Tabelle3").Activate Range("C5:D24").Select For Each Zelle In Selection On Error Resume Next Set Kom = Zelle.AddComment Kom.Text Date & Chr(10) & Zelle.Value Next Zelle End Sub
Deklarieren Sie im ersten Schritt eine Objektvariable vom Typ Comment sowie eine vom Typ Range. Danach aktivieren Sie die gewünschte Tabelle und markieren den Bereich, 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 8.22: Alle Zellen im markierten Bereich wurden mit Kommentaren ausgestattet.
267
Zellenbearbeitung mit VBA
Zellen aus Kommentaren füllen 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 8.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. Listing 8.25: Kommentare in Zellen überführen Sub ZellenMitKommentarenFüllen() Dim Kom As Comment Sheets("Tabelle3").Activate For Each Kom In ThisWorkbook.Sheets("Tabelle3").Comments Range(Kom.Parent.Address).Offset(0, 3).Value = Kom.Text Next Kom End Sub
Abbildung 8.23: Die Kommentare aus den Spalten C und D wurden in die Spalten F und G eingefügt.
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 ein-
268
Zellen kommentieren
zelne Kommentar in der Zelle genau 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 SpaltenOffset 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.
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 8.26 bis 8.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 8.26: Kommentare löschen im markierten Bereich Sub KommentareInTabelleLöschen() Sheets("Tabelle3").Activate Range("C5:D24").Select Selection.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 8.27. Listing 8.27: Alle Kommentare aus einer Tabelle entfernen Sub KommentareAusTabelleLöschen() Dim Kom As Comment For Each Kom In ThisWorkbook.Sheets("Tabelle3").Comments Kom.Delete Next Kom End Sub
269
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 8.28 werden alle Kommentare, die sich in der Arbeitsmappe befinden, entfernt. Listing 8.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 mithilfe der Methode Delete.
8.6
Workshop
8.6.1 Fragen & Antworten F
Wie können Sie die letzten fünf Zellen einer Spalte markieren? A
Mit folgendem Makro: Listing 8.29: Die letzten fünf Zellen einer Spalte markieren Sub Letzte5ZeilenInSpalteMarkieren() Sheets("Tabelle14").Activate Range("A65536").End(xlUp).Select Range(Selection, ActiveCell.Offset(-4, 0)).Select End Sub
Über die Eigenschaft End ermitteln Sie die letzte belegte Zelle der Spalte A. Von da ab markieren Sie über die Methode Select die darüber liegenden vier Zellen, indem Sie den Zellen-Offset auf den Wert –4 setzen.
270
Workshop
F
Wie können Sie aus allen benutzten Zellen einer Tabelle die Leerzeichen eliminieren? A
Starten Sie zu diesem Zweck das folgende Makro: Listing 8.30: Leerzeichen aus Zellen entfernen Sub LeerzeichenAusZellenEntfernen() Dim zelle As Range Worksheets("Tabelle16").Activate For Each zelle In ActiveSheet.UsedRange zelle.Value = Application.Trim(zelle.Value) Next zelle End Sub
Über die Anweisung ActiveSheet.Usedrange 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.
8.6.2 Quiz 1. Wie kann man mithilfe der Eigenschaft Cells eine Zelle ansteuern? 2. Wie können Sie den verwendeten Bereich einer Tabelle bestimmen? 3. Welche Methode muss man einsetzen, wenn man mehrere Bereiche vereinen möchte? 4. Wie können Sie die Hintergrundfarbe der aktiven Zelle am schnellsten bestimmen? 5. Was muss man bei der Vergabe von Namen mit VBA beachten?
8.6.3 Übungen Zum Abschluss des Tages versuchen Sie die folgenden drei Ü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.
271
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
9
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Gestern 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 heute: 쐽
Arbeiten mit Formeln
쐽
Tabellenfunktionen einsetzen
쐽
Formeln finden und dokumentieren
쐽
Gültigkeitsprüfungen vornehmen
9.1
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-Strich-Regel. Es folgen nun ein paar praktische Beispiele, in denen diese Rechenoperationen demonstriert werden. Alle Makrobeispiele können Sie in der Arbeitsmappe ZellenProg.xls im Verzeichnis Kap09 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. Nun 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 9.1 an.
274
Arbeiten mit Formeln
Abbildung 9.1: Eine Tabelle mit alphanumerischen und numerischen Werten
In dieser Tabelle soll die Anzahl der numerischen Werte ermittelt und addiert werden. Das Makro dafür lautet: Listing 9.1: Numerische Zellen werden gezählt und summiert Sub Dim Dim Dim
WerteZählenUndAddieren() i As Integer z As Integer Summe As Single
Sheets("Tabelle1").Activate Range("A1").Select z = 0 Summe=0 For i = 1 To ActiveSheet.UsedRange.Rows.Count If IsNumeric(ActiveCell) Then z = z + 1 Summe = Summe + ActiveCell.Value Else End If ActiveCell.Offset(1, 0).Select
275
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Next i MsgBox "Es wurden " & z & " numerische Werte gefunden!" & _ Chr(13) & _ "Die Summe der numerischen Werte beträgt: " & Summe End Sub
Definieren Sie zu Beginn des Makros zwei Zählvariablen vom Typ Integer. Die eine davon wird für die Schleifensteuerung benötigt, die zweite wird die Anzahl der numerischen Werte in der Tabelle ermitteln. Jetzt benötigen Sie eine Variable vom Typ Single, in der Sie die Summe der numerischen Zelleninhalte speichern können. Dabei haben Sie mit diesem Datentyp die Möglichkeit, auch Nachkommastellen mitzuverarbeiten. Setzen Sie die Variablen z und Summe zu Beginn sicherheitshalber auf den Wert 0. Die Variable i wird in der anschließenden Schleife auf den Startwert 1 gesetzt. Die Schleife wird solange durchlaufen, bis die letzte gefüllte Zeile in der Tabelle erreicht ist. Diese letzte Zeile ermitteln Sie mit der Anweisung ActiveSheet.UsedRange.Rows.Count. Innerhalb der Schleife prüfen Sie mithilfe der Funktion IsNumeric, ob in der aktiven Zelle ein numerischer Wert steht. Wenn ja, dann addieren Sie die Zählvariable z um den Wert 1 und speichern den Zellenwert in der Variablen Summe. Setzen Sie danach den Mauszeiger eine Zeile weiter nach unten und arbeiten Sie die Schleife Satz für Satz ab. Geben Sie die Anzahl sowie die Summe der ermittelten Sätze am Ende des Makros über die Funktion MsgBox auf dem Bildschirm aus.
Abbildung 9.2: Addition von Zellen
276
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 9.2: 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 9.3: 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.
277
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Abbildung 9.4: 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 9.3: Preise erhöhen und runden Sub PreisAnpassung() Dim Faktor As Single Sheets("Tabelle2").Activate Range("C2").Select Faktor = Range("F1").Value Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.Round(ActiveCell.Value * Faktor, 2) ActiveCell.Offset(1, 0).Select Loop End Sub
Deklarieren Sie zu Beginn des Makros eine Variable vom Typ Single, in der Sie den Faktor aus Zelle F1 speichern, mit dem Sie Ihre Preise anpassen möchten. Nachdem Sie die gewünschte Tabelle und die Startzelle aktiviert haben, durchlaufen Sie eine Schleife, die solange läuft, bis sie auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife füllen Sie die Nebenspalte D mit den neu kalkulierten Preisen. Dabei multiplizieren Sie den aktuellen Zellenwert aus Spalte C mit dem Faktor und runden das Ergebnis über die Funktion Round. Geben Sie bei dieser Funktion noch an, nach wie vielen Stellen hinterm Komma gerundet werden soll.
278
Arbeiten mit Formeln
Abbildung 9.5: Die Preise wurden um 10% erhöht
DM-Umrechnung mit Division Wenn Sie noch Excel-Arbeitsmappen haben, die Sie auf die Eurowährung umstellen möchten, dann können Sie diese alten DM-Beträge mit dem Faktor 1,95583 dividieren, um den Betrag in Euro zu erhalten. Sehen Sie sich dazu einmal Abbildung 9.6 an.
Abbildung 9.6: Die alte Artikelliste in DM-Beträgen
Die DM-Beträge sollen jetzt über ein Makro umgerechnet, und in der Spalte D eingefügt werden. Die Lösung dieser Aufgabe sehen Sie in Listing 9.4.
279
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Listing 9.4: Alte DM-Beträge in Euro umrechnen Sub WährungUmrechnen() Sheets("Tabelle3").Activate Range("C2").Select Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.Round(ActiveCell.Value / 1.95583, 2) ActiveCell.Offset(1, 0).Select Loop End Sub
Nachdem Sie die gewünschte Tabelle und die Startzelle aktiviert haben, durchlaufen Sie eine Schleife, die solange läuft, bis sie auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife füllen Sie die Nebenspalte D mit den umgerechneten Preisen. Dabei dividieren Sie den aktuellen Zellenwert aus Spalte C mit dem Faktor 1,95583 und runden das Ergebnis über die Funktion Round auf zwei Stellen hinterm Komma.
Abbildung 9.7: Die Währungsumrechnung wurde durchgeführt.
280
Tabellenfunktionen einsetzen
9.2
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 und liefert Ihnen eine Excel-Tabelle mit aus, 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.
Abbildung 9.8: Eine Gegenüberstellung von Tabellenfunktionen
281
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
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 9.5: Die Summe der neuen Preise werden ermittelt Sub SummeEinsetzen() Sheets("Tabelle2").Activate Range("D11").Value = _ Application.WorksheetFunction.Sum(Range("D2:D9")) End Sub
Aktivieren Sie im ersten Schritt die gewünschte Tabelle. Danach weisen Sie der Ergebniszelle direkt über die Eigenschaft WorksheetFunction die Funktion Sum (=Summe) zu. Diese Funktion verlangt als Argument den Bereich, den sie summieren soll.
Abbildung 9.9: Die neuen Preise wurden summiert.
Wie Sie in Abbildung 9.9 sehen, wird nur das Ergebnis der Tabellenfunktion in Zelle D11 eingefügt. Im nächsten Makro aus Listing 9.6 wird die Tabellenfunktion so eingefügt, dass diese nicht als Wert, sondern als wirkliche Funktion hinterlegt wird.
282
Tabellenfunktionen einsetzen
Listing 9.6: Eine Tabellenfunktion in eine Zelle einfügen (Var. 1, mit deutschen Befehlen) Sub SummeEinsetzenAlsTabFunktion() Sheets("Tabelle2").Activate Range("D11").FormulaLocal = _ "=Summe(D2:D9)" End Sub
Mithilfe der Eigenschaft FormulaLocal haben Sie die Möglichkeit, die 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 9.7 sehen können. Listing 9.7: Eine Tabellenfunktion in eine Zelle einfügen (Var. 2, mit englischen Befehlen) Sub SummeEinsetzenAlsTabFunktionEng () Sheets("Tabelle2").Activate Range("D11").Formula = _ "=Sum(D2:D9)" End Sub
In diesem Fall setzen Sie die Eigenschaft Formula ein und geben die Tabellenfunktion in der englischen Schreibweise ein. Dieses Makro funktioniert dann auch in allen Sprachversionen.
Abbildung 9.10: Die Summe wird als Tabellenfunktion erfasst
283
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
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 Aufgabenstellung 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 9.11 an.
Abbildung 9.11: Die Ausgangssituation
Füllen Sie jetzt die Spalte C, indem Sie die Tabellenfunktion DATEDIF einsetzen. Sehen Sie sich dazu das Makro aus Listing 9.8 an.
284
Tabellenfunktionen einsetzen
Listing 9.8: Das Alter mithilfe der Tabellenfunktion DATEDIF ermitteln Sub AlterErmitteln() Sheets("Tabelle4").Activate Range("B4").Select Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).FormulaLocal = _ "=DATEDIF(" & ActiveCell.Address & ";B1;""Y"")" ActiveCell.Offset(1, 0).Select Loop End Sub
In einer Schleife 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 aktiven 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 9.12: Das Alter in Jahren wurde ermittelt.
285
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Im nächsten Schritt sollen die ältesten Personen ermittelt werden. Erfassen Sie zu diesem Zweck das Makro aus Listing 9.9: Listing 9.9: Die ältesten Personen über die Funktion Rank bestimmen Sub RangErmitteln() Dim Bereich As Range Sheets("Tabelle4").Activate Set Bereich = Range("C4:C15") Range("C4").Select Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ Application.WorksheetFunction.Rank(ActiveCell, Bereich) ActiveCell.Offset(1, 0).Select Loop End Sub
Deklarieren Sie zu Beginn des Makros eine Objektvariable vom Typ Range. In dieser Variablen geben Sie mithilfe der Anweisung Set bekannt, welcher Zellenbereich für die Rangfolgenbestimmung herangezogen werden soll. Setzen Sie danach den Mauszeiger auf die Startzelle und durchlaufen eine Schleife, die solange durchlaufen wird, bis das Makro auf die erste leere Zelle in Spalte C trifft. Innerhalb der Schleife fügen Sie die Tabellenfunktion Rank über die Eigenschaft WorksheetFunction ein und übergeben dieser Funktion die aktive Zelle sowie den vorher definierten Bereich.
Abbildung 9.13: Wilhelm ist die älteste Person in der Liste
286
Tabellenfunktionen einsetzen
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 9.10: Die bedingte Summierung von Werten Sub BedingteSummierung() Dim Betrag As Single Sheets("Tabelle3").Activate Betrag = Application.WorksheetFunction.SumIf(Range("D2:D9"), ">500") MsgBox "Die Summe der Werte > 500 _ beträgt:" & _ Chr(13) & Format(Betrag, "#,##0.00 _"), vbInformationsgBox End Sub
Übergeben Sie der Tabellenfunktion zuerst 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.
Abbildung 9.14: Alle Werte größer als 500 wurden summiert.
287
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Soll diese Funktion nicht als Ergebnis, sondern als Tabellenfunktion selbst in die TABELLE3 eingefügt werden, starten Sie das folgende Makro aus Listing 9.11. Listing 9.11: Die Tabellenfunktion bleibt als Funktion in der Tabelle erhalten Sub BedingteSummierungAlsFunktion() Sheets("Tabelle3").Activate 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.
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ählen, wenn) ein, mithilfe derer Sie die bedingte Zählung durchführen können. Listing 9.12: Eine bedingte Zählung durchführen Sub BedingteZählung() Dim i As Integer Sheets("Tabelle4").Activate i = Application.WorksheetFunction.CountIf(Range("C4:C15"), ">60") MsgBox "Die Anzahl der Personen, die älter als 60 sind, lautet:" & _ Chr(13) & i, vbInformation End Sub
Übergeben Sie der Funktion CountIf den Bereich, in dem Sie die Personen zählen möchten, die älter als 60 Jahre sind. Die Bedingung >60 formulieren Sie gleich im Anschluss daran.
288
Tabellenfunktionen einsetzen
Abbildung 9.15: 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 9.13. Listing 9.13: Die Tabellenfunktion wird als Funktion eingefügt Sub BedingteZählungAlsFunktion() Sheets("Tabelle4").Activate Range("C18").Formula = "=CountIf(C4:C15, "">60"")" End Sub
Weisen Sie der Eigenschaft Formula die Tabellenfunktion CountIf zu und 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.
289
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Abbildung 9.16: 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 9.14 an. Listing 9.14: Alle numerischen Werte einer Liste zählen Sub ZählenNumerischeWerte() Dim i As Integer Sheets("Tabelle1").Activate i = Application.WorksheetFunction.Count(Range("A1:A17")) MsgBox "Die Anzahl der numerischen Werte, lautet:" & _ Chr(13) & i, vbInformation End Sub
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.
290
Tabellenfunktionen einsetzen
Abbildung 9.17: 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 9.15 sehen können. Listing 9.15: Alle gefüllten Zellen werden gezählt Sub ZählenAlleZellen() Dim i As Integer Sheets("Tabelle1").Activate i = Application.WorksheetFunction.CountA(Range("A1:A17")) MsgBox "Die Anzahl der gefüllten Zellen, lautet:" & _ Chr(13) & i, vbInformation End Sub
Möchten Sie nicht das Ergebnis der Tabellenfunktionen, sondern eben die Tabellenfunktionen selbst einfügen, starten Sie das Makro aus Listing 9.16.
291
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Listing 9.16: Die Zählfunktionen in die Tabelle einfügen Sub ZählungAlsFunktionen() Sheets("Tabelle1").Activate Range("A19").Formula = "=Count(A1:A17)" Range("B19").Formula = "'=Count(A1:A17)" Range("A20").Formula = "=CountA(A1:A17)" Range("B20").Formula = "'=CountA(A1:A17)" End Sub
Abbildung 9.18: 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. 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.
292
Tabellenfunktionen einsetzen
Listing 9.17: Zählen von alphanumerischen Zellen Sub ZählenAlphanumerischeZellen() Dim i As Integer Sheets("Tabelle1").Activate i = Application.WorksheetFunction.CountA(Range("A1:A17")) _ - Application.WorksheetFunction.Count(Range("A1:A17")) MsgBox "Die Anzahl der alphanumerischen Zellen, lautet:" & _ Chr(13) & i, vbInformation End Sub
Durch die Subtraktion beider Tabellenfunktionen erhalten Sie die korrekte Anzahl der alphanumerischen Zellen.
Die Tabellenfunktion CountBlank Neben den beiden Tabellenfunktionen Count und CountA gibt es die Möglichkeit, in Excel auch leere Zellen eines Bereiches zu zählen. Setzen Sie für diesen Zweck die Tabellenfunktion CountBlank (=Anzahl leere Zellen) ein. Im folgenden Beispiel aus Listing 9.18 greifen Sie wiederum auf die TABELLE1 zu und ermitteln im Bereich A1:A18 die Anzahl der leeren Zellen. Listing 9.18: Die Anzahl der leeren Zellen eines Bereichs ermitteln Sub ZählenLeereZellen() Dim i As Integer i = Application.WorksheetFunction.CountBlank(Range("A1:A18")) MsgBox "Die Anzahl der leeren Zellen, lautet:" & _ Chr(13) & i, vbInformation 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.
293
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Um solche »leeren« Zellen besser sehen zu können, können Sie aus dem Menü EXTRAS den Befehl OPTIONEN wählen und auf das Registerblatt UMSTEIGEN wechseln. Aktivieren Sie dort das Kontrollkästchen ALTERNATIVE BEWEGUNGSTASTEN und bestätigen Sie mit OK. Nun werden leere Zellen, sofern diese aktiviert wurden, in der Bearbeitungsleiste dadurch gekennzeichnet, dass dort ein Apostroph angezeigt wird.
Abbildung 9.19: Leerzeichen in Zellen werden nun in der Bearbeitungsleiste angezeigt.
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 9.19: 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.
294
Formeln finden und dokumentieren
9.3
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 9.20: Alle Formelzellen der Tabelle aktivieren
4. Bestätigen Sie mit OK. Als Ergebnis werden nun alle Formelzellen der aktuellen Tabelle markiert. Mit der Taste (ÿ) können Sie dann von Zelle zu Zelle springen und die Formel in der Bearbeitungsleiste ansehen.
295
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Diese gerade durchgeführte Aufgabe können Sie auch über den Einsatz eines VBA-Makros erledigen, welches Sie in Listing 9.20 sehen können: Listing 9.20: 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 9.21: Alle Formelzellen sind in der Tabelle markiert worden.
Über die Methode SpecialCells können Sie mithilfe der folgenden Konstanten aus Tabelle 9.1 auch andere Zellen markieren.
296
Formeln finden und dokumentieren
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 9.1: 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
쐽
Zellenadresse der Formel oder Funktion
쐽
Formel oder Funktion
쐽
Ergebnis der Formel oder Funktion
Erfassen Sie das Makro aus Listing 9.21: Listing 9.21: Alle Formeln und Funktionen werden in einer neuen Tabelle dokumentiert Sub Dim Dim Dim Dim
FormelnUndFunktionenDokumentieren() i As Integer Zelle As Range s As String l As Long
297
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Sheets.Add Before:=Worksheets(1) s = ActiveSheet.Name l = 1 Sheets(s).Cells(l, 1).Value = "Tabelle" Sheets(s).Cells(l, 2).Value = "Zelle" Sheets(s).Cells(l, 3).Value = "Formel/Funktion" Sheets(s).Cells(l, 4).Value = "Inhalt" Range(Cells(l, 1), Cells(l, 4)).Font.Bold = True l = l + 1 For i = 2 To ThisWorkbook.Worksheets.Count Worksheets(i).Activate On Error Resume Next Selection.SpecialCells(xlCellTypeFormulas).Select For Each Zelle In Selection Sheets(s).Cells(l, 1).Value = Worksheets(i).Name Sheets(s).Cells(l, 2).Value = Zelle.Address Sheets(s).Cells(l, 3).Value = "'" & Zelle.FormulaLocal Sheets(s).Cells(l, 4).Value = Zelle.Value l = l + 1 Next Zelle Next i Sheets(s).Columns("A:D").AutoFit 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. Danach speichern Sie den Namen dieser Tabelle mithilfe der Eigenschaft Name in der Variablen s. Erfassen Sie nun die Überschriftenzeile dieser neuen Tabelle und verwenden dabei die Eigenschaft Cells, der Sie als Zeilenargument die Variable l übergeben, die Sie zuvor auf den Wert 1 gesetzt haben. Damit sprechen Sie also die erste Zeile dieser Tabelle an. Als Spaltenargument setzen Sie je nach Spalte den Wert 1 bis 4 ein, um die Spalten A bis D anzusprechen. Markieren Sie direkt im Anschluss diese vier gefüllten Überschriftenzellen 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 durchsucht. Innerhalb dieser Schleife aktivieren Sie das jeweilige Tabellenblatt über die Methode Activate und markieren dabei 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.
298
Formeln finden und dokumentieren
Sind nun alle Formelzellen der momentan aktiven Tabelle markiert, dann durchlaufen Sie in einer weiteren Schleife alle markierten Zellen. Innerhalb dieser Schleife, schreiben Sie den Namen der momentanen Tabelle in das Dokumentationsblatt in Spalte A. Um den Namen zu ermitteln, setzen Sie die Eigenschaft Name ein, die Sie auf das Auflistungsobjekt Worksheets anwenden. Der Index dieses Auflistungsobjekts, den Sie über die Variable i »variabel« halten, gibt Ihnen Auskunft 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.
Abbildung 9.22: Eine Auflistung aller Formeln/Funktionen der Arbeitsmappe.
299
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
9.4
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 aus dem Menü DATEN den Befehl GÜLTIGKEIT auswählen.
Abbildung 9.23: Aus einer Liste können Einträge ausgewählt werden
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. 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.
300
Gültigkeitsprüfungen vornehmen
Abbildung 9.24: Elegante Auswahl aus einem Zellendropdown
Lernen Sie nun einige Gültigkeitseinstellungen kennen, die Sie über den Einsatz von VBA-Makros in Ihre Tabellen einfügen.
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 9.22. Listing 9.22: Nur ganze Zahlen zwischen 1 bis 10 dürfen eingegeben werden Sub GültigkeitHinzufügen() Sheets("Tabelle5").Activate With 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
301
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
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 9.2. Type
Index
Beschreibung
xlValidateInputOnly
0
Jede Eingabe ist erlaubt.
xlValidateWholeNumber
1
Nur ganze Zahlen im definierten Zahlenbereich sind erlaubt.
xlValidateDecimal
2
Nur Dezimalzahlen im definierten Wertbereich werden zugelassen.
xlValidateList
3
Es sind nur Eingaben aus einer vorher definierten Liste möglich.
xlValidateDate
4
Es sind nur Datumswerte im definierten 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 9.2: Die verfügbaren Gültigkeitskonstanten
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 9.3: 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 ...
Tabelle 9.3: Die Konstanten für den Operator
302
Gültigkeitsprüfungen vornehmen
Operator-Konstante
Beschreibung
xlGreaterEqual
Zellenwert ist größer oder gleich ...
xlLess
Zellenwert ist kleiner ...
xlLessEqual
Zellenwert ist kleiner oder gleich ...
Tabelle 9.3: Die Konstanten für den Operator (Forts.)
Die beiden letzten Argumente Formula1 und Formula2 beinhalten die Wertgrenzen. Sehen Sie nun das Ergebnis des Makros in Abbildung 9.25.
Abbildung 9.25: 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.2002 bis zum 31.12.2002 gemacht werden dürfen. Das Makro für diese Aufgabe können Sie in Listing 9.23 sehen.
303
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Listing 9.23: Datumsgrenzen als Gültigkeit festlegen Sub Datumsgrenzen() Sheets("Tabelle5").Activate Range("C4").Select With Selection.Validation .Delete .Add Type:=xlValidateDate, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, _ Formula1:=CDate("1/1/2002"), _ Formula2:=CDate("31/12/2002") .IgnoreBlank = True .InputTitle = "Datum eingeben" .ErrorTitle = "Falsches Datum" .InputMessage = _ "Gültiges Datum zw. dem 1.1.2002 und dem 31.12.2002 eingeben" .ErrorMessage = _ "Sie haben kein gültiges Datum eingegeben!" .ShowInput = True .ShowError = True End With End Sub
Vorsorglich löschen Sie eine eventuell schon bestehende Gültigkeitsregel mit 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/2002") 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.
304
Gültigkeitsprüfungen vornehmen
Abbildung 9.26: Datumseingaben überprüfen
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 9.24 wird auf der TABELLE5 in der Zelle C5 ein Zellendropdown eingefügt, welches verfügbare Kostenstellen anbietet. Listing 9.24: Eine Gültigkeitsliste erstellen Sub ListeDefinieren() Sheets("Tabelle5").Activate Range("C5").Select With Selection.Validation .Delete .Add Type:=xlValidateList, _ AlertStyle:=xlValidAlertStop, _ Operator:=xlEqual, _ Formula1:="1790, 1800, 1830, 1850, 1900" .InputMessage = _ "Bitte Kostenstelle auswählen" End With End Sub
305
Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung
Um eine Gültigkeitsliste zusammenstellen zu können, müssen Sie über die Methode Add Gültigkeit 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 9.27: Ein Zellendropdown zur Verfügung stellen
9.5
Workshop
9.5.1 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 9.25: Die zweitgrößte Zahl in einem Bereich ausgeben Sub ZweitGrößteZahlErmitteln() Dim i As Single Sheets("Tabelle1").Activate i = Application.WorksheetFunction.Large(Range("A1:A17"), 2) MsgBox "Die zweit-größte Zahl lautet: " & _ Chr(13) & i, vbInformation End Sub
306
Workshop
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. F
Wie können Sie die Anzahl der Formelzellen auf einer Tabelle zählen? A
Geben Sie dazu das Makro aus Listing 9.26 ein: Listing 9.26: 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
Ü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.
9.5.2 Quiz 1. Was ist der Unterschied zwischen den beiden Eigenschaften Formula bzw. FormulaLocal? 2. Wie heißt die Arbeitsmappe, in der eine Gegenüberstellung von englischen und deutschen Tabellenfunktionen angeboten wird? 3. Mit welcher Methode kann man sich bestimmte Zellen in einer Tabelle markieren lassen? 4. Was müssen Sie bei der Gültigkeitsprüfung in Bezug auf Datumseingaben beachten?
9.5.3 Übungen Zum Abschluss des Tages versuchen Sie die folgenden beiden Übungen zu lösen. Die Lösungen dazu finden Sie im Anhang. 1. Löschen Sie alle Gültigkeitsfestlegungen aus einer Tabelle! 2. Finden und ersetzen Sie alle Formeln einer Tabelle in Festwerte!
307
Aktionen und Benutzereingaben überwachen
0 1
Aktionen und Benutzereingaben überwachen
Am gestrigen Tag haben Sie gelernt, wie Sie Formeln in Excel-VBA erstellen und Tabellenfunktionen einsetzen. 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
10.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 20. Tag kennen lernen werden. Alle Beispiele dieses Tages finden Sie auf der beiliegenden CD-ROM in der Arbeitsmappe Ereignisse.xls im Verzeichnis Kap10.
10.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.
310
Ereignisse auf Arbeitsmappenebene
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.
Abbildung 10.1: Das Ereignis Workbook_Open einstellen
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
311
Aktionen und Benutzereingaben überwachen
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 10.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. 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 (ª).
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 10.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.
312
Ereignisse auf Arbeitsmappenebene
4. Im zweiten Kombinationsfeld, rechts oben, wählen Sie den Eintrag BeforeClose aus. 5. Ergänzen Sie das Ereignis wie folgt: Listing 10.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
Nur wenn in der Zelle C1 ein Wert ungleich »OK« steht, kann die Arbeitsmappe geschlossen werden. In diesem Fall wird das Argument Cancel auf den Wert False gesetzt, die Arbeitsmappe über die Methode Save gespeichert und geschlossen. Im andern Fall bleibt die Arbeitsmappe 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:
313
Aktionen und Benutzereingaben überwachen
Listing 10.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 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. 5. Ergänzen Sie das Ereignis wie folgt: Listing 10.4: Die Neuanlage von Tabellen überwachen Private Sub Workbook_NewSheet _ (ByVal Sh As Object) Dim s As String
314
Ereignisse auf Arbeitsmappenebene
s = InputBox("Wie heißt das Kennwort?") If s "Test" Then Application.DisplayAlerts = False Sh.Delete Application.DisplayAlerts = True Else End If End Sub
Fragen Sie zu Beginn des Ereignisses ein Kennwort ab und werten Sie die Eingabe des Benutzers aus. Er kann zwar die Tabelle neu anlegen, diese wird aber wieder über die Methode Delete entfernt, sofern er das falsche Kennwort eingegeben hat. Damit beim 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 10.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 wieder sehen. Ereignis
Beschreibung
Workbook_Activate
Tritt ein, sobald eine Arbeitsmappe aktiviert wird.
Workbook_AddinInstall
Tritt ein, wenn ein Add-In eingebunden wird. Dies kann entweder durch direktes Öffnen des Add-Ins erfolgen oder auch durch das Einbinden im Add-Ins-Manager.
Workbook_AddinUninstall
Tritt ein, wenn ein Add-In aus dem Add-Ins-Manager deaktiviert wird.
Workbook_BeforePrint
Tritt vor dem Druck einer Arbeitsmappe oder auch nur einzelner Tabellen ein.
Workbook_BeforeSave
Tritt vor dem Speichern-Vorgang ein. Dabei spielt es keine Rolle, ob Sie über Menübefehle, Symbolleiste oder Tastenkombination speichern.
Workbook_Deactivate
Tritt ein, wenn eine Arbeitsmappe deaktiviert wird. Beispielsweise wenn eine Arbeitsmappe minimiert wird.
Tabelle 10.1: Alle Arbeitsmappenereignisse im Überblick
315
Aktionen und Benutzereingaben überwachen
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 10.1: Alle Arbeitsmappenereignisse im Überblick (Forts.)
316
Ereignisse auf Tabellenblattebene
10.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_½) bzw. (Strg) + (Bild_¼) 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 (siehe Abbildung 10.2). 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: Listing 10.5: Das letzte Zugangsdatum der Tabelle festhalten Private Sub Worksheet_Activate() Range("A1").Value = Format(Time, "hh:mm") End Sub
317
Aktionen und Benutzereingaben überwachen
Abbildung 10.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 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. Im Verlauf eines Monats können sich einige Dinge ändern, wie beispielsweise folgende: 쐽
Ein Mitarbeiter kann das Unternehmen verlassen.
쐽
Ein Mitarbeiter kann heiraten und dadurch den Namen ändern.
318
Ereignisse auf Tabellenblattebene
쐽
Ein Mitarbeiter kann an einen anderen Standort versetzt werden.
쐽
Eine Mitarbeiterin kann einer anderen Kostenstelle zugeordnet werden.
쐽
Ein neuer Mitarbeiter kann eingestellt werden.
Abbildung 10.3: Die Ausgangsliste
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. 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 10.6: Alle Änderungen in der Tabelle einfärben Private Sub Worksheet_Change(ByVal Target As Range) Target.Interior.ColorIndex = 3 End Sub
319
Aktionen und Benutzereingaben überwachen
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 10.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.
Abbildung 10.5: Im Formular soll auf Eingaben reagiert werden.
320
Ereignisse auf Tabellenblattebene
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 10.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 in, um die eingegebenen Buchstaben in Großbuchstaben umzuwandeln. Um Buchstaben in Kleinbuchstaben zu wandeln, setzen Sie die Funktion LCase ein.
Abbildung 10.6: Eingaben im Bereich C4:C8 werden automatisch nach Drücken der Taste (¢] in Großbuchstaben umgesetzt.
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 die-
321
Aktionen und Benutzereingaben überwachen
sem Grund können Sie das Ereignis Worksheet_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 10.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 10.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.
Abbildung 10.7: Ein automatischer Zeilenzeiger
322
Ereignisse auf Tabellenblattebene
Danach markieren Sie die komplette Zeile und sorgen dafür, dass der Mauszeiger trotzdem wieder auf der ursprünglich markierten Zelle positioniert wird. Setzen Sie daraufhin die Eigenschaft EnableEvent wieder auf den Wert True, um die Ereignissteuerung zuzulassen.
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. Sehen Sie sich einmal Abbildung 10.8 an.
Abbildung 10.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. 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.
323
Aktionen und Benutzereingaben überwachen
4. Im zweiten Kombinationsfeld wählen Sie dann das Ereignis Calculate aus. 5. Ergänzen Sie das noch leere Ereignismakro wie folgt: Listing 10.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.
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 10.2: Alle Tabellenereignisse im Überblick
324
Workshop
10.4 Workshop 10.4.1 Fragen & Antworten F
Wie können Sie beim Öffnen einer Arbeitsmappe dafür sorgen, dass alle Pivot-Tabellen der Arbeitsmappe aktualisiert werden? A
Starten Sie dazu das Makro aus Listing 10.10: Listing 10.10: Alle Pivot-Tabellen der Arbeitsmappe werden beim Öffnen aktualisiert Private Sub Workbook_Open() ThisWorkbook.RefreshAll End Sub
Setzen Sie die Methode RefreshAll ein, um alle Pivot-Tabellen in der Arbeitsmappe zu aktualisieren. F
Wie können Sie den Namen einer Tabelle dynamisch aus einem Zelleninhalt bilden? A
Erfassen Sie das Ereignis Worksheet_change wie folgt: Listing 10.11: 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
Ü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.
10.4.2 Quiz 1. Wie kann man die Ereignissteuerung kurzfristig ausschalten? 2. Wird das Ereignis Change auch ausgelöst, wenn man die Formatierung der Zelle ändere? 3. Was muss man machen, wenn man das Ereignis Change nicht auf die ganze Tabelle, sondern nur auf eine einzige Zelle anwenden möchte?
325
Aktionen und Benutzereingaben überwachen
10.4.3 Übungen Versuchen Sie die folgenden Aufgabenstellungen zu lösen. Die Ergebnisse dieser Aufgabe 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?
326
Große Datenmengen in VBA behandeln und auswerten
1 1
Große Datenmengen in VBA behandeln und auswerten
Gestern 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. Die Themen heute: 쐽
Daten filtern
쐽
Pivot-Tabellen einsetzen
11.1 Daten filtern Eine der schnellsten und wichtigsten Auswertungsfunktionen in Excel stellt der AutoFilter dar, den Sie im Menü DATEN mit dem Befehl FILTER/AUTOFILTER aktivieren 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.
Den AutoFilter aktivieren Den AutoFilter können Sie auf Ihrer Tabelle aktivieren, indem Sie aus dem Menü DATEN den Befehl FILTER/AUTOFILTER wählen. Danach wird für jede Spalte 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.
328
Daten filtern
Beim folgenden Makro wird der Auto-Filter eingeblendet. Listing 11.1: Den AutoFilter aktivieren Sub AutoFilterAktivieren() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter End Sub
Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie den AutoFilter einsetzen 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.
Abbildung 11.1: Den AutoFilter einschalten
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.
329
Große Datenmengen in VBA behandeln und auswerten
Im folgenden Makro sollen nur Mitarbeiter in TABELLE1 angezeigt werden, die am Standort Sindelfingen beschäftigt sind. Listing 11.2: Das Filterkriterium einstellen Sub MitarbeiterSindelfingen() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter _ Field:=5, Criteria1:="Sindelfingen" End Sub
Sie sollten immer sicherstellen, dass das richtige Tabellenblatt aktiviert und die AutoFilter-Pfeile angezeigt werden. Nur dann 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)
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 11.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 10 höchsten Einträge aus der Liste werden angezeigt (Absolutbetrachtung).
xlTop10Percent
Die 10 höchsten Einträge aus der Liste werden angezeigt (prozentuale Betrachtung).
Tabelle 11.1: Die Operatoren für die Filterung von Daten
330
Daten filtern
Konstante
Erklärung
xlBottom10Items
Die 10 niedrigsten Einträge aus der Liste werden angezeigt (Absolutbetrachtung).
xlBottom10Percent
Die 10 niedrigsten Einträge aus der Liste werden angezeigt (prozentuale Betrachtung).
Tabelle 11.1: Die Operatoren für die Filterung von Daten (Forts.)
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.
Abbildung 11.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 gleichzeitig Filterkriterien zu setzen. Es sollen nun alle Mitarbeiter in TABELLE1 angezeigt werden, die im Standort Sindelfingen beschäftigt sind und der Abteilung Einkauf angehören.
331
Große Datenmengen in VBA behandeln und auswerten
Listing 11.3: Mehrere Filter einsetzen Sub MitarbeiterSindelfingenEinkauf() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter With Selection .AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlAnd .AutoFilter Field:=4, Criteria1:="Einkauf", _ Operator:=xlAnd End With End Sub
Um mehrere Filter einzusetzen, die beide erfüllt sein müssen, verbinden Sie die Filterkriterien mit dem Operator xlAnd.
Abbildung 11.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 dafür sehen Sie in Listing 11.4: Listing 11.4: Mehrere Filter setzen Sub MitarbeiterSifiundBB() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter With Selection
332
Daten filtern
.AutoFilter Field:=5, Criteria1:="Sindelfingen", _ Operator:=xlOr, Criteria2:="Böblingen", _ Operator:=xlAnd .AutoFilter Field:=2, Criteria1:=">40000" End With End Sub
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 11.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 das Makro aus Listing 11.5. Listing 11.5: Filterkriterium aus Zelle beziehen Sub FilterkriteriumausZelle() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter _ Field:=5, Criteria1:=Range("E34").Value End Sub
Übergeben Sie als Filterkriterium den Inhalt der Zelle E34.
333
Große Datenmengen in VBA behandeln und auswerten
Abbildung 11.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 11.6: Die Mitarbeiter mit den höchsten 10 Nummern werden angezeigt Sub TopTenFilterEinstellen() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlTop10Items End Sub
Stellen Sie im ersten Schritt sicher, dass Sie sich in der gewünschten Tabelle befinden. Danach prüfen Sie, ob der AutoFilter bereits eingestellt ist. Danach füllen Sie den AutoFilter, indem Sie zuerst die Spalte angeben, in der gefiltert 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.
334
Daten filtern
Um die 10 niedrigsten Einträge in Spalte B anzuzeigen, lautet die entsprechende Zeile wie folgt: Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlBottom10Items
Abbildung 11.6: Die 10 höchsten Wert 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 11.7 sehen können. Listing 11.7: Filterung von Daten mit anschließender Sortierung Sub TopTenFilterEinstellenErw() Sheets("Tabelle1").Activate If Not ActiveSheet.AutoFilterMode = True _ Then Range("A1").AutoFilter Selection.AutoFilter Field:=2, Criteria1:="10", _ Operator:=xlTop10Items ActiveSheet.UsedRange.Sort Key1:=Range("B1"), _ Order1:=xlDescending, Header:=xlYes End Sub
Wenden Sie die Methode Sort an, um einen Datenbereich zu sortieren. Den Datenbereich ermitteln Sie über die Eigenschaft UsedRange. Bei der Methode Sort 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
335
Große Datenmengen in VBA behandeln und auswerten
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 11.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? Im folgenden Makro wird diese Frage beantwortet. Dabei wurde im Voraus das Makro aus Listing 11.7 gestartet, welches in Spalte B die 10 höchsten Einträge filtert. Listing 11.8: Die eingestellten (aktiven) Filter ermitteln Sub Dim Dim Dim
WoSteckenDieFilter() Mappe As Worksheet b As Boolean i As Integer
Set Mappe = ThisWorkbook.Worksheets("Tabelle1") For i = 1 To ActiveSheet.Columns.Count On Error GoTo ende If Mappe.AutoFilterMode Then b = Mappe.AutoFilter.Filters(i).On Debug.Print "Filter in Spalte " & i & ": "; b End If Next i ende: End Sub
336
Daten filtern
Definieren Sie im ersten Schritt ein paar Objektvariablen. In der Objektvariablen Mappe speichern Sie die Mappe sowie die Tabelle, auf der nach den gesetzten Autofiltern recherchiert werden soll. Setzen Sie danach eine Schleife auf, die beginnend von Spalte A alle Spalten abarbeitet. In einer Variablen von 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.
Abbildung 11.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 Menü DATEN den Befehl FILTER/SPEZIALFILTER wählen und die Kriterien des Spezialfilters einstellen.
337
Große Datenmengen in VBA behandeln und auswerten
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.
Abbildung 11.9: In dieser Liste soll jede Zahl nur einmal vorkommen.
Erfassen Sie nun das Makro aus Listing 11.9. Listing 11.9: Eine Unikatsliste erstellen Sub DatenSpezialfilter() Dim Bereich As Range Sheets("Tabelle2").Activate Set Bereich = ActiveSheet.UsedRange.Columns(1) Bereich.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Bereich, CopyToRange:=Range("E1"), _ Unique:=True End Sub
Legen Sie zuerst in einer Objektvariablen über die Anweisung Set fest, welcher Bereich mit dem Spezialfilter ausgewertet werden soll. Da Sie Ihre Tabelle auf doppelte 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 11.9 ist das der Bereich der verwendeten Zellen in Spalte A.
338
Daten filtern
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. 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 11.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 11.10: Gefilterte Daten in neue Arbeitsmappe kopieren Sub GefilterteDatenKopieren() Sheets("Tabelle1").Activate ActiveCell.CurrentRegion.SpecialCells(xlVisible).Copy Workbooks.Add Range("A1").Select ActiveCell.PasteSpecial Paste:=xlPasteAll End Sub
339
Große Datenmengen in VBA behandeln und auswerten
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. Setzen Sie den Mauszeiger auf Zelle A1 und fügen den Inhalt der Zwischenablage mit der Methode PasteSpecial ein. Im Argument 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 11.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 11.11 wird die TABELLE1 gefiltert und in einer neuen Tabelle abgelegt. Danach wird diese neue Tabelle in eine Textdatei überführt. Listing 11.11: Die gefilterten Daten in eine Textdatei überführen Sub Dim Dim Dim Dim Dim
340
GefilterteTabelleInTextdateiSpeichern() Zelle As Range i As Integer iZ As Integer e As Integer s As String
Daten filtern
Sheets("Tabelle1").Activate ActiveSheet.UsedRange.Copy Sheets.Add Range("A1").Select ActiveSheet.Paste iZ = Range("A65536").End(xlUp).Row Open "C:\eigene Dateien\Ausgabe.txt" For Output As #1 For i = 1 To iZ For e = 1 To ActiveSheet.UsedRange.Columns.Count s = s & ";" & Cells(i, e).Value Next e s = Mid(s, 2, Len(s) - 1) Print #1, s s = "" Next i Close #1 MsgBox "Datenübertragung beendet!" 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 Zelle in Spalte A. Dies gelingt Ihnen über die Eigenschaft End, die die Zelle am Ende der Region darstellt, die den Quellbereich enthält. Der Quellbereich stellt im Beispiel die Zahl 65536 dar, welches die maximale Anzahl von Zeilen in einer Excel-Tabelle darstellt. Dieser Eigenschaft übergeben Sie die Richtungskonstante xlUp. Neben xlUp können Sie auch xlToLeft, xlToRight oder xlDown verwenden, je nachdem, welche Zelle Sie ermitteln möchten. 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 s. Jeder Zelleninhalt wird 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.
341
Große Datenmengen in VBA behandeln und auswerten
Abbildung 11.12: Die gefilterten Daten liegen in einer Textdatei vor
11.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 11.13: Die Ausgangstabelle mit Artikeldaten
Im folgenden Beispiel soll eine Pivot-Tabelle erstellt werden, die Aussage darüber gibt, welche Artikel sich an welchem Ort befinden.
342
Pivot-Tabellen einsetzen
Listing 11.12: Eine Pivot-Tabelle erstellen Sub ErstellenPivotTabelle() Dim Bereich As Range Sheets("Tabelle3").Activate Set Bereich = ActiveSheet.UsedRange Range(Bereich.Address).Select ActiveSheet.PivotTableWizard _ SourceType:=xlDatabase, SourceData:= _ Bereich, TableDestination:="", TableName:="Pivot" With ActiveSheet.PivotTables("Pivot") .PivotFields("Bezeichnung").Orientation = xlRowField .PivotFields("Ort").Orientation = xlColumnField .PivotFields("Preis").Orientation = xlDataField End With End Sub
Im ersten Schritt aktivieren Sie das Tabellenblatt, welches die Quelldaten 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 SourceTyp geben Sie die Quelle der Daten in dem Bericht an. Zulässig ist eine der in der folgenden Tabelle aufgeführten Konstanten. Konstante
Beschreibung
xlConsolidation
Mehrere Konsolidierungsbereiche
xlDatabase
Microsoft Excel-Datenbank oder -Liste (Standard)
xlExternal
Externe Datenquelle
xlPivotTable
Gleiche Quelle wie ein anderer PivotTable-Bericht
Tabelle 11.2: Die Konstanten des Arguments SourceTyp
343
Große Datenmengen in VBA behandeln und auswerten
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 PivotTabellen, 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 PivotTabelle fest. Die Möglichkeiten, die Sie dabei haben, sehen Sie in der folgenden Tabelle. 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 11.3: Die verschiedenen Konstanten des Arguments Orientation
344
Pivot-Tabellen einsetzen
Abbildung 11.14: Die fertige Pivot-Tabelle
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 11.13. Listing 11.13: Eine Pivot-Tabelle aktualisieren Sub EinzelnePivotTabelleAufBlattAktualisieren() On Error GoTo fehler Sheets("Tabelle11").PivotTables("Pivot").RefreshTable 'oder 'Sheets("Tabelle11").PivotTables(1).RefreshTable Exit Sub fehler: MsgBox "Es konnte keine Pivot-Tabelle gefunden werden!" End Sub
Auf der TABELLE11 in der aktiven Arbeitsmappe wird die Pivot-Tabelle Pivot mithilfe der Methode RefreshTable auf den neuesten Stand gebracht. Die Anweisung On Error ist eine reine Sicherheitsmaßnahme, die verhindern soll, dass das Makro abstürzt, wenn die richtige Pivot-Tabelle nicht gefunden werden kann.
345
Große Datenmengen in VBA behandeln und auswerten
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 11.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 11.14: Eine Pivot-Tabelle dynamisch erweitern und aktualisieren Sub PivotTabellenDatenbereichErweitern() Dim pt As PivotTable Dim Bereich As Range Set Bereich = Sheets("Tabelle3").UsedRange ActiveWorkbook.Names.Add _ Name:="Pivot", _ RefersTo:=Bereich, Visible:=True Bereich.Select For Each pt In Sheets("Tabelle11").PivotTables With pt .PivotTableWizard SourceType:=xlDatabase, _ SourceData:="Pivot" End With pt.RefreshTable Next pt End Sub
Ermitteln Sie zuerst einmal den verwendeten Bereich auf Ihrer TABELLE3 und speichern Sie diesen Bereich in der Objekt-Variablen Bereich. Benennen Sie danach den ermittelten Bereich, geben diesem den Namen Pivot und markieren Sie den Bereich im Anschluss. Mithilfe einer For Each-Schleife greifen Sie auf alle Pivot-Tabellenberichte auf der TABELLE11 zu, erweitern den Datenbereich und aktualisieren die Pivot-Tabellenberichte.
346
Workshop
11.3 Workshop 11.3.1 Fragen & Antworten F
Wie können Sie feststellen, wie viele Zeilen gefiltert sind? A
Starten Sie das Makro aus Listing 11.15. Listing 11.15: Die gefilterten Zeilen zählen Sub ZeilenGefiltert() Dim Bereich As Range Dim i As Integer Sheets("Tabelle1").Activate Set Bereich = Range("A1").CurrentRegion i = Intersect(Bereich.SpecialCells(xlVisible), _ Bereich.Columns(1)).Count – 1 MsgBox "Sie haben " & i & " Zeilen gefiltert", _ vbInformation, "Filterergebnis" End Sub
Über die Eigenschaft CurrentRegion ermitteln Sie den umliegenden Bereich, der von Leerzeilen bzw. Leerspalten umgeben wird. Es wird demnach der Block ermittelt, der sich, beginnend von der Zelle, in der der erste Filter angezeigt wird (A1), bis zur letzten 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. F
Wie können Sie die erste gefilterte Zeile ermitteln? A
Setzen Sie das Makro aus Listing 11.16 ein: Listing 11.16: Die erste gefilterte Zeile ermitteln Sub ErsteGefilterteZeileFinden() Dim l As Long Sheets("Tabelle1").Activate Range("A1").Select
347
Große Datenmengen in VBA behandeln und auswerten
For l = 2 To ActiveSheet.UsedRange.Rows.Count If ActiveSheet.Rows(l).Hidden True Then MsgBox "Die erste gefilterte Zeile ist die Zeile " _ & l, vbInformation: Exit For End If Next End Sub
Da die eigentlichen Daten erst in Zeile 2 beginnen, setzen Sie die 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.
11.3.2 Quiz 1. Wie lautet die Anweisung, um den AutoFilter einzuschalten? 2. Wie heißt die Methode, um den SpezialFilter aufzurufen? 3. Wie lautet die Methode, um eine Pivot-Tabelle zu aktualisieren?
11.3.3 Übung Zum Ende dieses Tages versuchen Sie die bitte, folgende Aufgabe zu lösen. Das Ergebnis finden Sie im Anhang. Formatieren Sie die Pivot-Tabelle auf TABELLE1 mit einem AutoFormat.
348
Daten grafisch darstellen
2 1
Daten grafisch darstellen
Gestern haben Sie gelernt, wie Sie große Datenmengen mithilfe von Filtern und PivotTabellen blitzschnell auswerten können. Die Themen heute: 쐽
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 Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Diagramm.xls im Verzeichnis Kap12.
12.1 Diagrammtypen auswählen 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. 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
Tabelle 12.1: Mögliche Diagrammtypen in Excel
350
Der Standard – das Säulendiagramm
Diagrammtyp
Konstante
Balkendiagramm (gruppiert)
xlBarClustered
Balkendiagramm (gestapelt)
xlBarStacked
Liniendiagramm
xlLine
Kreisdiagramm
xlPie
Punktdiagramm
xlXYScatter
Blasendiagramm
xlBubble
Flächendiagramm
xlArea
Ringdiagramm
xlDoughnut
Netzdiagramm
xlRadar
Oberflächendiagramm
xlSurface
Kursdiagramm
xlStockHLC
Tabelle 12.1: 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.
12.2 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 (siehe Abbildung 12.1). Aus einer Datentabelle (siehe Abbildung 12.1) soll nun ein Diagramm erzeugt werden. Dabei soll der Name der Tabelle (Kostenvergleich 1998-2001) als Diagrammtitel verwendet werden. Das Makro für diese Aufgabe lautet:
351
Daten grafisch darstellen
Abbildung 12.1: Die Ausgangstabelle mit den Rohdaten
Listing 12.1: Das Säulendiagramm erstellen Sub SäulenDiagrammErstellen() Dim Bereich As Range Dim s As String Set Bereich = Range("B2:F3") s = ActiveSheet.Name Charts.Add With ActiveChart .ChartType = xlColumnClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlRows .HasTitle = True .ChartTitle.Text = s End With End Sub
Im ersten Schritt legen Sie den Bereich fest, der die Datenbasis für das Diagramm enthält. Dazu speichern Sie die Adresse des Bereichs in der Range-Variablen Bereich. Danach ermitteln Sie den Namen des aktiven Tabellenblattes über die Eigenschaften ActiveSheet und Name und speichern ihn in der Variablen s. Mit der Methode Add erstellen Sie 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
352
Ergebnisse vergleichen über das Balkendiagramm
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 aus der Variablen s erfragen können.
Abbildung 12.2: Das erste Diagramm über den Einsatz von VBA erstellen
12.3 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.
353
Daten grafisch darstellen
Abbildung 12.3: Arbeitsgruppen miteinander vergleichen
Erstellen Sie anhand dieser Vorgabetabelle nun ein Balkendiagramm. Listing 12.2: Ein Balkendiagramm erstellen Sub BalkenDiagrammErstellen() Dim Bereich As Range Dim s As String Set Bereich = Sheets("Arbeitsgruppen-Vergleich").Range("A3:B13") s = ActiveSheet.Name Charts.Add With ActiveChart .ChartType = xl3DbarClustered .SetSourceData _ Source:=Bereich, _ PlotBy:=xlColumns .HasTitle = True .ChartTitle.Text = s End With End Sub
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
354
Tagesgenaue Auswertungen über das Liniendiagramm
Sie danach ein neues Diagrammobjekt über die Methode Add ein. Über die Eigenschaft ChartType können Sie ein Diagramm Ihrer Wahl (siehe Tabelle 12.1) festlegen. Die Datenbasis für das Diagramm ermitteln Sie mit der Methode SetSourceData, der Sie im Argument Source den vorher definierten Bereich übergeben.
Abbildung 12.4: Die Arbeitsgruppen wurden in einem übersichtlichen Diagramm dargestellt.
12.4 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 Übung werden Temperaturen innerhalb eines Tages gemessen und zu jeder vollen Stunde in eine Tabelle geschrieben. Die Temperaturtabelle sieht dabei wie folgt aus:
355
Daten grafisch darstellen
Abbildung 12.5: Die Temperaturen werden zu jeder vollen Stunde aufgezeichnet.
Erfassen Sie nun das Makro, welches die Temperaturverläufe in einem Liniendiagramm darstellt. Listing 12.3: Temperaturverläufe in einem Liniendiagramm darstellen Sub Dim Dim Dim
LinienDiagrammErstellen() Dia As ChartObject s As String i As Integer
Sheets("Temperaturen").Activate s = ActiveSheet.Name ActiveSheet.ChartObjects.Delete Set Dia = Sheets("Temperaturen").ChartObjects.Add _ (150, 10, 500, 300) Dia.Name = "Temperaturen von heute" i = ActiveSheet.Range("B1").End(xlDown).Row Range("A2:B" & i).Copy ActiveSheet.ChartObjects("Temperaturen von heute").Activate ActiveChart.SeriesCollection.Paste _ Rowcol:=xlColumns, SeriesLabels:=False, _
356
Tagesgenaue Auswertungen über das Liniendiagramm
CategoryLabels:=True, Replace:=True, NewSeries:=True Application.CutCopyMode = False With ActiveChart .ChartType = xlLineMarkers .HasLegend = False .HasTitle = True .ChartTitle.Text = s End With Range("A1").Select End Sub
Im ersten Schritt aktivieren Sie die Tabelle TEMPERATUR und schreiben den Tabellennamen der aktiven Tabelle in die Variable s. Dieser Tabellenname soll 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 Auflistung SeriesCollection. 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 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.
357
Daten grafisch darstellen
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 Ausschneide- bzw. 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 Text Ihrer Variablen s zuweisen.
Abbildung 12.6: Die Temperaturen werden übersichtlich in einem Liniendiagramm dargestellt.
Wenn Sie sich die Abbildung 12.6 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.
358
Daten richtig skalieren
12.5 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 12.3 wie folgt an. (Es werden nur die Änderungen im folgenden Listing aufgeführt.) Listing 12.4: 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 niegrigsten 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.
Abbildung 12.7: Die Skalierung der Daten selbst bestimmen
359
Daten grafisch darstellen
12.6 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 hinund herzuschieben. Im folgenden Beispiel soll das eingebettete Diagramm auf der Tabelle TEMPERATUREN in einem separaten Diagrammblatt mit dem Namen TEMPERATUREN-GROSS transferiert werden. Das Makro dafür: Listing 12.5: Den Speicherort des Diagramms bestimmen Sub EingebettetesDiagrammZuDiagrammblatt() Sheets("Temperaturen").Activate ActiveSheet.ChartObjects(1).Activate ActiveChart.Location Where:=xlLocationAsNewSheet, _ Name:="Temperaturen-Groß" End Sub
Greifen Sie auf das erste eingebettete Diagramm auf Ihrer Tabelle zu und wenden Sie die Methode Location an, um das eingebettete Diagramm zu verschieben. Bei der Methode Location können Sie im Argument Where entweder die Konstanten xlLocationAsNewSheet, xlLocationAsObject oder xlLocationAutomatic verwenden. In Listing 12.5 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 12.8: Das Diagramm wurde in ein separates Diagrammblatt verschoben.
360
Diagramme formatieren
12.7 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:
Abbildung 12.9: Das Ausgangsdiagramm
In der Abbildung 12.9 sind alle Säulen mit der Füllfarbe BLAU formatiert. Erfassen Sie jetzt das folgende Makro aus Listing 12.6, um die negativen Deckungsbeiträge mit der Füllfarbe ROT zu formatieren. Listing 12.6: Säulen unterschiedlich einfärben Sub Dim Dim Dim Dim
SäulenVerschiedenfarbig() Datenreihe As Series Punkt As Point i As Integer DArray As Variant
Sheets("Deckungsbeiträge").Activate Set Datenreihe = _
361
Daten grafisch darstellen
ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1) With Datenreihe DArray = .Values For Each Punkt In .Points i = i + 1 If DArray(i) < 0 Then Punkt.Interior.ColorIndex = 3 Else Punkt.Interior.ColorIndex = 5 End If Next End With End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Series. Nun lesen Sie alle Y-Werte 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 12.10: Unterschiedliche Farben der Säulen
12.8 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
362
Diagramme exportieren
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 12.10 in eine Grafikdatei umgewandelt. Erfassen Sie zu diesem Zweck das Makro aus Listing 12.7. Listing 12.7: Diagramm als Grafik-Objekt exportieren Sub DiagrammeAlsGrafikSpeichern() Dim Dia As Chart Sheets("Deckungsbeiträge").Activate Set Dia = ActiveSheet.ChartObjects(1).Chart Dia.Export Filename:="c:\Eigene Dateien\Export.gif", _ FilterName:="GIF" End Sub
Über 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 12.11: Die umgewandelte Datei kann im Photo Editor aufgerufen werden.
363
Daten grafisch darstellen
12.9 Workshop 12.9.1 Fragen & Antworten 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 12.8. Listing 12.8: Alle Diagrammblätter aus Arbeitsmappe entfernen Sub DiagrammeEntfernen() Application.DisplayAlerts = False On Error Resume Next ActiveWorkbook.Charts.Delete Application.DisplayAlerts = True End Sub
Indem Sie die Eigenschaft DisplayAlerts auf den Wert False setzen, brauchen Sie die einzelnen Löschungen nicht zu bestätigen. Die On Error-Anweisung sorgt dafür, dass die Verarbeitung sauber abgefangen wird, wenn überhaupt kein Diagrammblatt in der Arbeitsmappe enthalten ist. Die Eigenschaft Charts gibt eine Auflistung aller Diagrammblätter der aktiven Arbeitsmappe zurück, die Sie mithilfe der Methode Delete löschen. F
Wie können Sie die Schriftart einer Legende anpassen? A
Sie haben Zugriff auf die Legende eines Diagramms, indem Sie auf die Eigenschaft Legend von ActiveChart zugeifen. Im folgenden Makro aus Listing 12.9 formatieren Sie eine Legende mit der Schriftfarbe BLAU und dem Schriftschnitt FETT. Listing 12.9: Die Legende formatieren Sub LegendeFormatieren() Sheets("Deckungsbeiträge").Activate ActiveSheet.ChartObjects(1).Select ActiveChart.HasLegend = True With ActiveChart.Legend.Font .Bold = True .ColorIndex = 5 End With End Sub
364
Workshop
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.
12.9.2 Quiz 1. Wie kann man den Diagrammtyp bestimmen? 2. Welchen ChartType müssen Sie wählen, um ein Kreisdiagramm einzufügen? 3. Über welche Eigenschaft stellen Sie den größten Wert einer Skalierung ein? 4. Welche Konstante müssen Sie bei der Eigenschaft Location angeben, um ein eingebettetes Diagramm in ein separates Diagrammblatt zu transferieren? 5. Welche zwei Argumente müssen beim Export eines Diagramms bei der Methode Export angegeben werden?
12.9.3 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Diagramme.xls und aktivieren die Tabelle ÜBUNG. Ihre Aufgabe besteht nun darin, anhand des Datenmaterials ein Zylinderdiagramm zu erstellen.
365
Tastatur- und Zeitsteuerung in Excel
3 1
Tastatur- und Zeitsteuerung in Excel
Am gestrigen Tag haben Sie erfahren, wie Sie aus Datentabellen blitzschnell Diagramme verschiedenster Art erstellen können. Des Weiteren haben Sie gelernt, wie Sie die Skalierung von Diagrammen anpassen und eigene Formatierungen anwenden können. Zum Abschluss des letzten Tages haben Sie gesehen, wie Sie Diagramme aus Excel in ein Grafikformat exportieren können, um diese Diagramme auch für andere Programme zur Verfügung zu stellen. Die Themen heute: 쐽
Excel über Tastenkombinationen steuern
쐽
Programmieren mit der Maus
쐽
Excel zeitmäßig steuern
13.1 Excel über Tastenkombinationen bedienen Viele Standardfunktionen in Excel können Sie über Tastenkombinationen bzw. F-Tasten 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 Nun 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.
368
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. Eine 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. Gehen Sie von der Situation in Abbildung 13.1 aus.
Abbildung 13.1: Eine Tabelle, die einige Formeln enthält
Im ersten Schritt erfassen Sie das Makro, welches die Formelzellen in Festwert-Zellen 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 13.1: Alle Formelzellen in Markierung durch Festwerte ersetzen Sub FormelnFest() Dim Zelle As Range For Each Zelle In Selection Zelle.Value = Zelle.Value Next Zelle End Sub
369
Tastatur- und Zeitsteuerung in Excel
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 13.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 13.2: 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. 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 13.1 alle möglichen Tasten und deren Codebelegung, die Sie für die Programmierung einsetzen können.
370
Excel über Tastenkombinationen bedienen
Taste
Codebelegung
(æ__)
{BACKSPACE} oder {BS}
(Pause)
{BREAK}
(º), Hochstelltaste
{CAPSLOCK}
(Entf)
{CLEAR}
(Entf)
{DELETE} oder {DEL}
(Pfeil_¼)
{DOWN}
(Ende)
{END}
(¢) Zehnertastatur
{ENTER}
(~)
~ (Tilde)
(Esc)
{ESCAPE} oder {ESC}
(Hilfe)
{HELP}
(Pos1)
{HOME}
(Einfg)
{INSERT}
(Pfeil_æ)
{LEFT}
(Num)
{NUMLOCK}
(Bild_¼)
{PGDN}
(Bild_½)
{PGUP}
(¢)
{RETURN}
(Pfeil_Æ)
{RIGHT}
(Rollen)
{SCROLLOCK}
(ÿ)
{TAB}
(Pfeil_½)
{UP}
(F1) bis (F15)
{F1} bis {F15}
Tabelle 13.1: Die verfügbaren Tasten in Excel-VBA
371
Tastatur- und Zeitsteuerung in Excel
In jeder Anwendung von Windows können die Tasten aus Tabelle 13.1 auch mit den Tasten (Alt), (Strg) oder (ª) kombiniert werden. Entnehmen Sie Tabelle 13.2 die Kodierung dieser Zusatztasten. Zusatztaste
Vorangestelltes Zeichen
(ª)
+ (Pluszeichen)
(Strg)
^ (Caret-Zeichen)
(Alt)
% (Prozentzeichen)
Tabelle 13.2: 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. 4. Im zweiten Dropdown-Feld wählen Sie den Eintrag BeforeClose aus und ergänzen das Ereignis wie folgt: Listing 13.3: 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.
372
Excel über Tastenkombinationen bedienen
Im folgenden Beispiel wird der Zugriff auf die Entwicklungsumgebung über die Tastenkombination (Alt) + (F11) deaktiviert. Listing 13.4: Die Tastenkombination (Alt) + (F11) wird deaktiviert Sub DeaktivierenTastenkombination() Application.OnKey "%{F11}", "" End Sub
Testen Sie die Funktion, indem Sie aus der Entwicklungsumgebung auf Ihre Exceloberflä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 folgendes Makro: Listing 13.5: 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. Übrigens können Sie die Makros aus den Listings 13.4 und 13.5 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:
373
Tastatur- und Zeitsteuerung in Excel
Listing 13.6: 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) + (ª) + (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 13.6 nun der Tastenkombination (Strg) + (ª) + (V) zu. Auch hierzu können Sie wieder das Ereignis Workbook_Open einsetzen, um diese Funktion gleich nach dem Öffnen der Arbeitsmappe zur Verfügung zu stellen. Listing 13.7: Beim Öffnen der Arbeitsmappe wird die Tastenkombination festgelegt Private Sub Workbook_Open() Application.OnKey "^+v", "WerteEinfügen" End Sub
Achten Sie auch bei diesem Schritt darauf, dass Sie die gerade definierte 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 13.8 sehen. Listing 13.8: 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 einzusetzen. 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 13.2 abgearbeitet werden.
374
Excel über Tastenkombinationen bedienen
Abbildung 13.2: Die To Do-Liste muss abgearbeitet werden
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 13.9: 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 13.10: Die Tastenkombinationen beim Öffnen der Arbeitsmappe festlegen Private Sub Workbook_Open() Application.OnKey "^ö", "SmileyLachend" Application.OnKey "^ä", "SmileyTraurig" End Sub
375
Tastatur- und Zeitsteuerung in Excel
Abbildung 13.3: Listen mit Sonderzeichen ausstatten
Die Frage, die sich nun geradezu aufdrängt, lautet: Wie kann ich herausbekommen, welches Symbol der Schriftart Wingdings welchem Zeichen zugeordnet ist? Die Antwort finden Sie in Listing 13.11. Dort wird eine Liste erstellt, in der alle Zeichenbelegungen verzeichnet sind. Listing 13.11: Die einzelnen Zeichen einer Schriftart abfragen Sub Schrifttest() Dim i As Integer Sheets.Add Range("A1").Select For i = 1 To 255 ActiveCell.Font.Name = "Wingdings" If i >= 32 Then ActiveCell.Value = Chr(i) ActiveCell.Offset(0, 1).Value = Chr(i) ActiveCell.Offset(0, 2).Value = i ActiveCell.Offset(1, 0).Select End If Next i End Sub
Die normalen Zeichen einer Schriftart liegen im Bereich von 0 bis 256. Die Zahlen von 0 bis 31 entsprechen den nicht darstellbaren Standard-ASCII-Codes. Daher kann innerhalb der Schleife auf die Dokumentation dieser Zeichen verzichtet werden. Formatieren Sie
376
Programmieren mit der Maus
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.
Abbildung 13.4: Alle Belegungen der Schriftart Wingdings in eine Tabelle schreiben
13.2 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 ansatzweise schon in Kapitel 10 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.
377
Tastatur- und Zeitsteuerung in Excel
Kontextmenü aktivieren/deaktivieren 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 13.12: 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 13.13 wird das Kontextmenü für den Zellenbereich B2:D10 ausgeschaltet. Ergänzen Sie dazu Listing 13.12 wie folgt:
378
Programmieren mit der Maus
Listing 13.13: 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 13.5: 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 einzelne Tabelle einstellen. In diesem Fall setzen Sie besser das Arbeitsmappenereignis Workbook_SheetBeforeRightClick ein. Um dieses Ereignis einzustellen, gehen Sie wie folgt vor:
379
Tastatur- und Zeitsteuerung in Excel
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 13.14: 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: Listing 13.15: Deaktivierung des Kontextmenüs nur in bestimmten Tabellen zulassen Private Sub Workbook_SheetBeforeRightClick _ (ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Select Case Sh.Name Case "Tabelle1", "Tabelle2", "Tabelle12" Cancel = True Case Else Cancel = 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.
380
Programmieren mit der Maus
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 diese wieder entfärbt. Zur Lösung dieser Aufgabenstellung gehen Sie wie folgt vor: 1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, 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 13.16: Ü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
381
Tastatur- und Zeitsteuerung in Excel
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 13.6: Schnelles Färben und Entfärben über Mausklicks
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 13.11, ü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 Übung soll aber zuerst geprüft werden, ob nicht bereits ein Haken in die Zelle eingefügt wurde. Wenn ja, soll dieser wieder entfernt werden. 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 13.17: Das Haken-Symbol per rechtem Mausklick einfügen Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean)
382
Programmieren mit der Maus
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.
Abbildung 13.7: 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
383
Tastatur- und Zeitsteuerung in Excel
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 Übung wird die direkte Zellenbearbeitung nach dem Ausführen eines Doppelklicks auf eine Zelle deaktiviert. Listing 13.18: 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, 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. Nun 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: 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 13.19: 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
384
Programmieren mit der Maus
Set Set Set Set
Bereich1 Bereich2 Bereich3 Bereich4
= = = =
Range("B2:B10") Range("D3:D5") Range("F2:F7") Range("A1:F1")
Set Bereich = Union(Bereich1, Bereich2, Bereich3, Bereich4) If Intersect(Bereich, Target) Is Nothing Then Exit Sub Cancel = True End Sub
Deklarieren Sie im ersten Schritt genau 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 13.8: In den farbigen Flächen ist die direkte Zellenbearbeitung deaktiviert
Werte per Doppelklick hochzählen Nun 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:
385
Tastatur- und Zeitsteuerung in Excel
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 13.20: 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 13.9: 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. Tun Sie am Besten Folgendes:
386
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 13.21: 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 mithilfe 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 13.10: Im gefärbten Bereich werden Zufallszahlen per Doppelklick erzeugt.
387
Tastatur- und Zeitsteuerung in Excel
13.3 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. Setzen Sie dafür 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 OnTime-Prozedur 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 13.22. Listing 13.22: Die Zeitansage in Excel Sub Zeitanzeige() Application.OnTime Now + TimeValue("00:01:00"), _ "Uhrzeit" End Sub
Mit der Funktion Now ermitteln Sie sowohl das aktuelle Tagesdatum als auch die aktuelle Uhrzeit. Zur Uhrzeit addieren Sie mithilfe der Funktion TimeValue eine Minute. Damit vergeht genau eine Minute bis zum Start des Makros Uhrzeit, welches Sie in Listing 13.23 sehen.
388
Excel zeitmäßig steuern
Listing 13.23: 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
Zunächst blenden Sie die Statusleiste über die Eigenschaft DisplayStatusBar sicherheitshalber 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 13.11: Das aktuelle Datum sowie die Uhrzeit in der Statusleiste anzeigen
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 13.24 sehen können.
389
Tastatur- und Zeitsteuerung in Excel
Listing 13.24: 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 13.25 sehen. Listing 13.25: 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.
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 13.26: Listing 13.26: Um 16:00 Uhr wird die Verarbeitung gestartet Sub ZeitSteuerung() Application.OnTime TimeValue("16:00:00"), "Verarbeitung" End Sub
Um das Makro aus Listing 13.26 korrekt ablaufen zu lassen, sollten Sie die Uhreinstellung in der Systemsteuerung von Windows überprüfen und sicherstellen, dass Excel sowie die
390
Workshop
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 13.27 sehen können. Listing 13.27: Dieses Makro wird um 16:00 ausgeführt Sub Verarbeitung() 'beliebige Aufgaben durchführen... End Sub
13.4 Workshop 13.4.1 Fragen & Antworten F
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 13.28: 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
In Anlehnung an die vorherige Fragestellung können Sie für diesen Zweck das folgede Makro starten:
391
Tastatur- und Zeitsteuerung in Excel
Listing 13.29: Tastenkombinationen wieder zurücksetzen Sub TastenkombinationenAktivieren() Application.OnKey "^c" Application.OnKey "^v" Application.OnKey "^x" End Sub
F
Wie können Sie das Kontextmenü für die Symbolleisten deaktivieren? A
Wenn Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken, wird Ihnen ein Kontextmenü angeboten, aus dem Sie Symbolleisten ein- und ausblenden können. Mit dem folgenden Makro aus Listing 13.30 verhindern Sie das Herunterklappen des Symbolleisten-Kontextmenüs: Listing 13.30: Symbolleisten-Kontextmenü deaktivieren Sub KontextmenüSymbolDeaktivieren() Application.CommandBars("Toolbar list").Enabled = False End Sub
Das Kontextmenü für die Symbolleisten heißt Toolbar list. Geben Sie diesen Namen dem Auflistungsobjekt CommandBars bekannt und setzen Sie die Eigenschaft Enabled auf den Wert False, um das Kontextmenü zu deaktivieren. Weisen Sie dieser Eigenschaft den Wert True zu, um das Kontextmenü wieder zu aktivieren. F
Wie können Sie einen vorher definierten Bereich per Doppelklick kopieren und auch in 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 13.31 sehen. Listing 13.31: 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
392
Workshop
13.4.2 Quiz 1. Wie kann man das Zellenkontextmenü deaktivieren? 2. Welchem Buchstaben ist das Sonderzeichen mit dem Flugzeug zugeordnet? 3. Wie kann man per Doppelklick auf eine Zelle den Inhalt dieser Zelle mit den Schriftschnitten FETT und KURSIV sowie der Schriftfarbe ROT formatieren? 4. Wie kann man ein Makro um 14:00 Uhr automatisch starten lassen?
13.4.3 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Steuerung.xls und aktivieren 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. 쐽
Klicken mit der rechten Maustaste: Addieren der Zelle um den Wert 10.
쐽
Doppelklick mit der linken Maustaste: Subtrahieren der Zelle mit 10.
Eine Musterlösung finden Sie im Anhang.
393
Makros mit VBEProgrammierung dynamisch erzeugen, importieren und exportieren
4 1
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Gestern haben Sie gelernt, wie Sie Excel mithilfe von Tastenkombinationen automatisieren können. Des Weiteren haben Sie erfahren, wie Sie die beiden Tasten der Maus ansprechen, abfragen und steuern und Makros zu bestimmten Zeitpunkten automatisch starten können. Die Themen heute: 쐽
Was verbirgt sich hinter der VBE-Programmierung?
쐽
Voraussetzung – das Einbinden der VBE-Bibliothek
쐽
Weitere Informationen zu Bibliotheken
쐽
VBE-Bibliothek deaktivieren
쐽
Objekte, Methoden und Eigenschaften der VBE
쐽
Typische Aufgaben mit der VBE erledigen Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe VBE.xls im Verzeichnis Kap14.
14.1 Was verbirgt sich hinter der VBE-Programmierung Die VBE stellt die Entwicklungsumgebung dar, in der Sie Ihre Makros erfassen. Auf diese Entwicklungsumgebung haben Sie auch Zugriff über den Einsatz von VBA-Makros. Damit können Sie Makros dynamisch einfügen und starten lassen. Des Weiteren können Sie ganze Module exportieren bzw. importieren sowie Arbeitsmappen von jeglichem Quellcode säubern lassen. Das und mehr werden Sie an diesem Tag kennen lernen.
14.2 Voraussetzung – das Einbinden der VBEBibliothek Um die VBE überhaupt programmieren zu können, müssen Sie vorher eine zusätzliche Bibliothek in der Entwicklungsumgebung einbinden, welche die dazu nötigen Befehle bereitstellt: 1. Wechseln Sie über die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebung von Excel. 2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.
396
Voraussetzung – das Einbinden der VBE-Bibliothek
Abbildung 14.1: Die VBE-Bibliothek einbinden
3. Aktivieren Sie im Listenfeld VERFÜGBARE VERWEISE die Bibliothek MICROSOFT VISUAL BASIC FOR APPLICATION EXTENSIBILTITY 5.3. 4. Bestätigen Sie Ihre Einstellung mit OK. Nach dem Einbinden der VBE-Bibliothek können Sie über den vollen Befehlssatz verfügen. Übrigens gibt es weitere Bibliotheken, die zusätzliche VBA-Befehle zur Verfügung stellen. So stellt beispielsweise die Word-Bibliothek Befehle zur Verfügung, die es möglich machen, Ihre Textverarbeitung von Excel aus zu programmieren. Diese und andere Bibliotheken werden aber standardmäßig nicht eingebunden, um die Performance der Anwendung nicht zu beeinträchtigen. Hier gilt wie schon bei den Add-Ins der Grundsatz: »Es wird erst etwas eingebunden, wenn es auch wirklich gebraucht wird!« Diese manuelle Vorgehensweise zum Einbinden der VBE-Bibliothek können Sie übrigens auch durch ein Makro ausführen lassen. Dabei starten Sie das Makro aus Listing 14.1: Listing 14.1: Die VBE-Bibliothek per Code einbinden Sub VBEAktivieren() Dim VBEObj As Object On Error Resume Next VBEObj = Application.VBE.ActiveVBProject.References. _ AddFromGuid("{0002E157-0000-0000-C000-000000000046}", _ 5, 3) End Sub
Die Methode AddFromGuid fügt der REFERENCES-Auflistung einen Verweis hinzu, wobei der global eindeutige Bezeichner (GUID) des Verweises verwendet wird.
397
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Die komplette Syntax lautet: AddFromGuid(GUID, HauptNr, NebenNr) As Reference
Das Argument Guid gibt einen Wert vom Typ String zurück, der die Klassen-ID eines Objekts enthält. Bei der Guid handelt es sich um eine eindeutige Nummer, welche die Bibliothek identifiziert. Das Argument HauptNr gibt einen Wert vom Typ Long zurück, der die Hauptversionsnummer der Klassenbibliothek, auf die verwiesen wird, enthält. Das Argument NebenNr gibt einen Wert vom Typ Long zurück, der die Nebenversionsnummer der Klassenbibliothek, auf die verwiesen wird, anzeigt. Beide Nummern sind notwendig, um die Bibliothek richtig zu adressieren. Anhand dieser beiden Nummern durchsucht die Methode AddFromGuid die Registrierung, um den hinzuzufügenden Verweis zu ermitteln und einzubinden. Wie aber können Sie nun feststellen, welche GUID, HauptNr und NebenNr eine bestimmte Bibliothek hat? Klar ist, dass es eine Möglichkeit geben muss, diese GUID sowie die Haupt- und NebenNr automatisch auszulesen. Das folgende Makro aus Listing 14.2 schreibt alle diese Informationen in eine neue Tabelle. Binden Sie dazu vorher die gewünschten Bibliotheken manuell ein. Listing 14.2: Alle gesetzten Verweise abfragen Sub VerweiseAbfragen() Dim ref As Reference Dim i As Integer On Error Resume Next Sheets.Add Range("A1").Select i = 1 ActiveCell.Value = "Verweis" ActiveCell.Offset(0, 1).Value = "GUID" ActiveCell.Offset(0, 2).Value = "Major" ActiveCell.Offset(0, 3).Value = "Minor" For Each ref In Application.VBE.ActiveVBProject.References ActiveCell.Offset(i, 0).Value = ref.Name ActiveCell.Offset(i, 1).Value = ref.GUID ActiveCell.Offset(i, 2).Value = ref.Major ActiveCell.Offset(i, 3).Value = ref.Minor i = i + 1 Next ref End Sub
398
Weitere Informationen zu Bibliotheken
Fügen Sie zunächst eine neue, noch leere Tabelle ein, indem Sie die Methode Add einsetzen. Danach durchlaufen Sie in einer Schleife alle gesetzten Verweise in der ReferenceAuflistung. Über die Eigenschaft Name können Sie den Namen des Verweises erfahren. Die Eigenschaft Guid gibt einen Wert vom Typ String zurück, der die Klassen-ID eines Objekts enthält. Bei der Guid handelt es sich um eine eindeutige Nummer, welche die Bibliothek identifiziert. Das Argument Major gibt einen Wert vom Typ Long zurück, der die Hauptversionsnummer der Klassenbibliothek, auf die verwiesen wird, enthält. Das Argument Minor gibt einen Wert vom Typ Long zurück, der die Nebenversionsnummer der Klassenbibliothek, auf die verwiesen wird, anzeigt.
Abbildung 14.2: Diese Bibliotheken sind derzeit eingebunden
Mithilfe dieser Tabelle können Sie jede Bibliothek auch über den Einsatz eines Makros einbinden. Orientieren Sie sich dazu am Makro aus Listing 14.1 und setzen Sie die Argumente aus Abbildung 14.2 ein.
14.3 Weitere Informationen zu Bibliotheken Um zu sehen, welche Verweise auf Bibliotheken in Ihrer Arbeitsmappe gesetzt sind, wie die Bibliotheken heißen und wo diese gespeichert sind, wenden Sie das folgende Makro aus Listing 14.3 an. Dabei schreiben Sie all diese Informationen in das Direktfenster der Entwicklungsumgebung. Bevor Sie das folgende Makro jedoch starten, müssen Excel 2002-Anwender vorher noch eine Einstellung in Excel vornehmen. Dabei wählen Sie auf Ihrem Excel-Arbeitsblatt aus dem Menü EXTRAS den Befehl MAKRO/SICHERHEIT. Wechseln Sie auf die Registerkarte VERTRAUENSWÜRDIGE QUELLEN und aktivieren Sie das Kontrollkästchen ZUGRIFF AUF VISUAL BASIC-PPROJEKT VERTRAUEN. Bestätigen Sie diese Einstellungen mit OK. Seit der Version Excel
399
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
2002 ist es aus Sicherheitsgründen nicht mehr standardmäßig möglich, auf Eigenschaften und Methoden des Objektes VBE zuzugreifen. Daher müssen Sie diese Einstellung vorab vornehmen. Listing 14.3: Informationen zu den gesetzten Verweisen ermitteln Sub InfosZuBibliothekenAusgeben() Dim Verweis As Reference On Error Resume Next For Each Verweis In _ Application.VBE.ActiveVBProject.References Debug.Print "Bezeichnung: " & Verweis.Description & _ Chr(13) & "Speicherort: " & Verweis.FullPath _ & Chr(13) & "Name: " & _ Verweis.Name & Chr(13) & Chr(13) Next Verweis End Sub
Durchlaufen Sie in einer Schleife alle gesetzten Verweise in der Entwicklungsumgebung. Mithilfe der Eigenschaft Description können Sie den beschreibenden Text der jeweils eingebundenen Bibliothek abfragen. Die Eigenschaft FullPath liefert den Namen des Verzeichnisses zurück, in dem die Bibliothek gespeichert ist. Über die Eigenschaft Name können Sie ermitteln, wie die jeweils eingebundene Bibliothek heißt. Kontrollieren Sie das Ergebnis, indem Sie in der Entwicklungsumgebung aus dem Menü ANSICHT den Befehl DIREKTFENSTER auswählen.
Abbildung 14.3: Informationen über die gesetzten Bibliotheken
400
VBE-Bibliothek deaktivieren
Anhand dieser Auflistung im Direktfenster können Sie Bibliotheken auch über ihren Namen einbinden bzw. wieder deaktivieren. Im folgenden Beispiel wird die Bibliothek für die OLE-Automatisierung zuerst eingebunden und danach wieder deaktiviert. Listing 14.4: Die OLE-Bibliothek einbinden Sub OLEBiboEinbinden() Dim VBEObj As Object Set VBEObj = Application.VBE.ActiveVBProject.References On Error Resume Next VBEObj.AddFromFile "stdole2.tlb" End Sub
Mit der Methode AddFromFile fügen Sie dem Projekt einen Verweis aus einer Datei hinzu. Dazu muss allerdings der Name der Bibliothek bekannt sein. Diesen können Sie im Dialogfeld VERWEISE VBAPROJECT im Menü EXTRAS und dem Befehl VERWEISE nachsehen bzw. das Ergebnis des Makros aus Listing 14.3 im Direktfenster kontrollieren. Um die OLE-Bibliothek wieder zu deaktivieren, starten Sie das Makro aus Listing 14.5: Listing 14.5: Die OLE-Bibliothek deaktivieren Sub OLEBiboDeaktivieren() Dim VBEObj As Object On Error Resume Next Set VBEObj = Application.VBE.ActiveVBProject.References VBEObj.Remove VBEObj("stdole") End Sub
Setzen Sie die Methode Remove ein, um die Bibliothek OLE wieder zu deaktivieren. Orientieren Sie sich dabei am Ergebnis des Makros aus Listing 14.3 im Direktfenster. Dort können Sie den genauen Namen (STDOLE) der OLE-Bibliothek erfahren.
14.4 VBE-Bibliothek deaktivieren Analog zum Makro aus Listing 14.1 können Sie den Verweis auf die VBE-Bibliothek auch wieder entfernen, indem Sie das Makro aus Listing 14.6 starten. Damit beseitigen Sie unnötigen Ballast aus der Arbeitsmappe.
401
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Listing 14.6: Die VBE-Bibliothek deaktivieren Sub VBEDeaktivieren() Dim VBEObj As Object On Error Resume Next Set VBEObj = Application.VBE.ActiveVBProject.References VBEObj.Remove VBEObj("VBIDE") End Sub
Über die Methode Remove entfernen Sie den Verweis auf die eingebundene Bibliothek aus der aktiven Arbeitsmappe. Geben Sie dabei den Namen der VBE-Bibliothek an.
14.5 Objekte, Methoden und Eigenschaften der VBE Nachdem Sie die VBE-Bibliothek eingebunden haben, sollten Sie erst einmal einen Blick auf die verfügbaren Objekte, Methoden und Eigenschaften dieser Bibliothek werfen. Dazu wechseln Sie in die Entwicklungsumgebung und drücken die Taste (F2), um den Objektkatalog zu starten.
Abbildung 14.4: Der Befehlssatz der Bibliothek VBE
402
Typische Aufgaben mit der VBE erledigen
14.6 Typische Aufgaben mit der VBE erledigen Nachdem Sie die Voraussetzung für die Programmierung in und mit der VBE hergestellt haben, indem Sie die VBE-Bibliothek eingebunden sowie Informationen zu Bibliotheken erhalten haben, gehen Sie jetzt daran, typische Aufgaben für die Praxis zu lösen.
Arbeitsmappe mit Quellcode bestücken Wenn Sie Makros in den Codebereich Ihrer Entwicklungsumgebung schreiben, so stellt dies den normalen Vorgang in der Programmierung dar. Stellen Sie sich jedoch vor, Sie müssten mehrere Arbeitsmappen mit demselben Code versorgen. Haben Sie da Lust, die Makros für jede Arbeitsmappe neu zu erfassen bzw. hineinzukopieren? Für diesen Zweck gibt es eine Möglichkeit des Imports von Quellcode. Dieser Quellcode wird erst in einer Textdatei geschrieben und anschließend in die gewünschte Arbeitsmappe per Makro eingelesen. Für die nächste Aufgabe kopieren Sie einmal ein Makro in eine Textdatei und speichern diese im Verzeichnis C:\Eigene Dateien unter dem Namen Code.txt.
Abbildung 14.5: Alle Formeln sollen in einer Textdatei dokumentiert werden.
Im Makro FormelnDokumentieren wird eine Textdatei mithilfe der Methode Open geöffnet. Sollte die Textdatei zu diesem Zeitpunkt noch nicht existieren, dann wird diese selbstständig angelegt. In einer anschließenden Schleife wird jede belegte Zelle der aktiven Tabelle durchlaufen. Innerhalb der Schleife findet eine Überprüfung statt, ob die jeweilige Zelle eine Formel enthält. Wenn ja, dann wird die Adresse der Zelle über die Eigenschaft Address sowie der Inhalt der Formel über die Eigenschaft FormulaLocal direkt in die Textdatei geschrieben. Erfassen Sie nun das Makro, welches im ersten Schritt ein neues Modul ModulNeu anlegt und danach den Inhalt der Textdatei Code.txt hineinkopiert.
403
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Listing 14.7: Neues Modul anlegen und Code importieren Sub MakroAusTextdateiImportieren() Dim VBKomp As VBComponent Dim CodeModul As CodeModule Const ImportDatei = "C:\Eigene Dateien\Code.txt" Set VBKomp = _ ThisWorkbook.VBProject.VBComponents.Add _ (vbext_ct_StdModule) VBKomp.Name = "ModulNeu" Application.Visible = True Set CodeModul = _ ThisWorkbook.VBProject.VBComponents _ ("ModulNeu").CodeModule With CodeModul .AddFromFile ImportDatei End With End Sub
Legen Sie zu Beginn des Makros den Namen sowie den Pfad der Textdatei in einer Konstanten fest, in der der Quellcode gespeichert ist. Um einer Arbeitsmappe ein neues, noch leeres Modul hinzuzufügen, setzen Sie die Methode Add ein. Die Methode Add verwendet die Konstante vbext_ct_StdModule, welche ein normales Modul repräsentiert. Selbstverständlich können Sie über diese Methode ebenso Klassenmodule und UserForms in Ihr Projekt einfügen. Entnehmen Sie dazu die notwendigen Konstanten der folgenden Tabelle 14.1. Konstante
Erklärung
vbext_ct_ClassModule
Fügt der Auflistung ein Klassenmodul hinzu.
vbext_ct_MSForm
Fügt der Auflistung ein Formular hinzu.
vbext_ct_StdModule
Fügt der Auflistung ein Standardmodul hinzu.
Tabelle 14.1: Die Konstanten der Methode Add
Geben Sie im zweiten Schritt an, in welches Modul Sie den Inhalt der Textdatei Code.txt transferieren möchten. Verwenden Sie dazu die Anweisung Set und geben den Namen des neu eingefügten Moduls an. Wenden Sie danach die Methode AddFromFile an, um den Inhalt der Textdatei in das Modul einzufügen.
404
Typische Aufgaben mit der VBE erledigen
Abbildung 14.6: Das neue Modul wurde angelegt und der Quellcode importiert.
Gehen wir jetzt einen Schritt weiter und überführen den Inhalt der Textdatei Code.txt in alle geöffneten Arbeitsmappen. Den Code für diese Aufgabe können Sie in Listing 14.8 sehen: Listing 14.8: Alle geöffneten Mappen mit Quellcode versorgen Sub TextdateiInAlleArbeitsmappenEinlesen() Dim Mappe As Workbook Dim VBKomp As VBComponent Const ImportDatei = "C:\Eigene Dateien\Code.txt" For Each Mappe In Application.Workbooks Set VBKomp = _ Mappe.VBProject.VBComponents.Add _ (vbext_ct_StdModule) VBKomp.Name = "ModulNeu2" Application.Visible = True Mappe.VBProject.VBComponents("ModulNeu2").CodeModule.AddFromFile _ ImportDatei Next Mappe End Sub
Durchlaufen Sie in einer Schleife alle geöffneten Arbeitsmappen. Innerhalb dieser Arbeitsmappen legen Sie über die Methode Add ein neues, noch leeres Modul an. Anschließend fügen Sie mithilfe der Methode AddFromFile den Inhalt der Textdatei in die neu angelegten Module ein. Für etwas kleinere Makros können Sie Quellcode auch direkt in das Modul schreiben und anschließend starten. Im folgenden Makro aus Listing 14.9 werden die Namen der in der Arbeitsmappe enthaltenen Tabellen im Direktfenster verzeichnet.
405
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Abbildung 14.7: Alle geöffneten Mappen wurden mit dem Modul ModulNeu2 versorgt.
Listing 14.9: Ein Makro Zeile für Zeile erfassen Sub MakroZeilenHinzufügen() Dim CodeModul As CodeModule Dim i As Long Set CodeModul = _ ThisWorkbook.VBProject.VBComponents _ ("Modul1").CodeModule With CodeModul i = .CountOfLines + 1 .InsertLines i, _ "Sub TabellenListen()" & Chr(13) & _ " Dim Tabelle as worksheet" & Chr(13) & _ " For each Tabelle in Activeworkbook.Worksheets " & Chr(13) & _ " Debug.Print Tabelle.name " & Chr(13) & _ " Next Tabelle " & Chr(13) & _ "End Sub" End With End Sub
Im Makro aus Listing 14.9 wird Zeile um Zeile übertragen. Die Eigenschaft CountOfLines ermittelt, wie viele Codezeilen im Modul bereits enthalten sind, und addiert den Wert 1 darauf. Diese Maßnahme ist notwendig, um eventuell bereits bestehende Makros nicht zu überschreiben. Über die Methode InsertLines fügen Sie die einzelnen Zeilen im Modul ein. Der Funktionsaufruf Chr(13) im obigen Listing sorgt jeweils für den Zeilenvorschub.
406
Typische Aufgaben mit der VBE erledigen
Abbildung 14.8: Das neue Makro wird unterhalb des letzten Makros in Modul1 eingefügt.
Quellcode sichern über den Export Sehr wichtig ist es ab und zu, seinen VBA-Code in Textdateien zu sichern. Da die Gefahr von Viren sehr groß ist, die Ihre Makros vernichten können, ist diese Maßnahme zu empfehlen. Dabei sichern Sie Ihren Quellcode in Textdateien. Standardmäßig können Sie diese Aufgabe manuell durchführen, indem Sie das entsprechende Modul, welches Sie sichern möchten, im Projekt-Explorer mit der rechten Maustaste anklicken und aus dem Kontextmenü den Befehl DATEI EXPORTIEREN anklicken.
Abbildung 14.9: Einzelne Module per Hand sichern
Im Dialogfeld DATEI EXPORTIEREN wählen Sie das gewünschte Verzeichnis aus, geben der Sicherung einen Namen und bestätigen mit einem Klick auf die Schaltfläche SPEICHERN.
407
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Diesen Vorgang können Sie selbstverständlich auch vollautomatisch über ein Makro durchführen, wie Sie es in Listing 14.10 sehen können. Listing 14.10: Den Quellcode in einer Textdatei sichern Sub ModulInTextdateiSichern() Dim VBKomp As Object Const ExportDatei = "C:\Eigene Dateien\Sicherung.txt" On Error Resume Next Set VBKomp = _ ThisWorkbook.VBProject.VBComponents("Modul1") With VBKomp .Export ExportDatei End With End Sub
Legen Sie über die Anweisung Set fest, welches Modul gesichert werden soll. Mit der Methode Export sichern Sie eine Komponente als Textdatei. Dabei geben Sie den Namen sowie den Pfad der Textdatei an, in die Ihr Quellcode exportiert werden soll. Sollte diese Datei noch nicht existieren, dann wird diese angelegt.
Abbildung 14.10: Alle Makros aus Modul1 wurden erfolgreich gesichert.
408
Typische Aufgaben mit der VBE erledigen
Module ausdrucken Auch eine Art von Sicherung bietet der Ausdruck der Makros. Dazu können Sie manuell im Projekt-Explorer das gewünschte Modul mit der rechten Maustaste anklicken und aus dem Kontextmenü den Befehl DRUCKEN auswählen. Per Makro gehen Sie hierzu einen kleinen Umweg. Speichern Sie das gewünschte Modul zuerst in einer Textdatei, lesen diese in eine normale Excel-Tabelle ein, stellen die bevorzugte Schriftart sowie -größe ein und drucken die Makros aus. Das Makro für diese Aufgabe lautet: Listing 14.11: Ein Modul mit allen Makros drucken Sub DruckenModul() Const ExportDatei = "C:\Eigene Dateien\Ausdruck.txt" ActiveWorkbook.VBProject.VBComponents("Modul1").Export ExportDatei Workbooks.OpenText ExportDatei With ActiveSheet.Cells .Font.Name = "Courier" .Font.Size = 10 .PrintOut End With Application.DisplayAlerts = False ActiveWorkbook.Close Kill ExportDatei Application.DisplayAlerts = True End Sub
Wenden Sie im ersten Schritt die Methode Export an, um das gewünschte Modul in einer Textdatei zu sichern. Danach öffnen Sie die Textdatei, indem Sie die Methode OpenText einsetzen. Jetzt befinden sich alle Makros in einer Tabelle. Diese Tabelle formatieren Sie nun, indem Sie die gewünschte Schriftart sowie Schriftgröße einstellen. Dazu verwenden Sie die Eigenschaften Name und Size, die Sie auf das Font-Objekt anwenden. Drucken Sie die Tabelle danach über die Methode PrintOut aus. Nach dem Ausdruck setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um beim Schließen der Textdatei keine Rückfrage von Excel zuzulassen. Über die Anweisung Kill können Sie die Textdatei daraufhin löschen. Setzen Sie am Ende des Makros die Eigenschaft DisplayAlerts auf den Wert True, um Standardmeldungen in Excel wieder zuzulassen.
409
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Abbildung 14.11: Die Tabelle kurz vor dem Ausdrucken
Arbeitsmappen von Modulen befreien Wenn Sie bereits vorhandene Module in einer Arbeitsmappe löschen möchten, um beispielsweise einem Kunden eine von Quellcode bereinigte Arbeitsmappe zur Verfügung zu stellen, dann starten Sie das Makro aus Listing 14.12. Listing 14.12: Ein bestimmtes Modul löschen Sub LöschenModul() On Error Resume Next With ActiveWorkbook.VBProject .VBComponents.Remove .VBComponents("ModulNeu") End With End Sub
Mit der Methode Remove können Sie ein bestimmtes Modul löschen. Die On Error-Anweisung verhindert einen Makroabsturz, wenn das Modul nicht gefunden werden kann, weil es eventuell bereits gelöscht wurde bzw. gar nicht existiert. Wenn es darum geht, alle Module einer Arbeitsmappe zu entfernen, dann können Sie das Makro aus Listing 14.13 einsetzen:
410
Typische Aufgaben mit der VBE erledigen
Listing 14.13: Alle Module aus einer Arbeitsmappe entfernen Sub ModuleLöschen() Dim VBKomp As VBComponent With Application.VBE.ActiveVBProject For Each VBKomp In .VBComponents If VBKomp.Type = 1 Then .VBComponents.Remove VBKomp Next VBKomp End With End Sub
In einer Schleife durchlaufen Sie alle VBE-Komponenten einer Arbeitsmappe. Über die Eigenschaft Type finden Sie heraus, ob es sich dabei um ein Modul, ein Klassenmodul oder eine UserForm handelt. Im Falle eines Moduls meldet diese Eigenschaft den Wert 1 zurück. Entfernen Sie in diesem Fall das entsprechende Modul mithilfe der Methode Remove.
Ein bestimmtes Makro entfernen Einen Schritt weiter geht die nächste Aufgabe. In dieser Aufgabe soll aus einem bestimmten Modul ein Makro entfernt werden. Das Problem bei dieser Aufgabe ist, dass Sie dieses eine Makro unter den vielen anderen erst einmal finden müssen. In der folgenden Aufgabe soll das Makro TabellenListen im MODUL1 gefunden und gelöscht werden. Die Lösung dieser Aufgabenstellung können Sie im folgenden Makro aus Listing 14.14 sehen. Listing 14.14: Ein bestimmtes Makro finden und löschen Sub Dim Dim Dim
MakroLöschen() VBCodeModul As CodeModule i As Long e As Long
Set VBCodeModul = _ ThisWorkbook.VBProject.VBComponents("Modul1").CodeModule With VBCodeModul i = .ProcStartLine("TabellenListen", vbext_pk_Proc) e = .ProcCountLines("TabellenListen", vbext_pk_Proc) .DeleteLines i, e End With End Sub
411
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Geben Sie zuerst über die Anweisung Set an, in welchem Modul sich das zu löschende Makro befindet. Danach ermitteln Sie über die Methode ProcStartLine, an welcher Stelle das gesuchte Makro beginnt. Dabei übergeben Sie dieser Methode den Namen des Makros, welches Sie finden möchten. Im zweiten Argument legen Sie die Art der zu suchenden Prozedur fest. Da Eigenschaftenprozeduren mehrere Darstellungen im Modul haben können, müssen Sie die Art der zu suchenden Prozedur festlegen. Alle Prozeduren verwenden die Konstante vbext_pk_Proc. Die Methode ProcStartLine gibt die Zeilennummer in einer Integer-Variablen zurück. Damit haben Sie die genaue Startposition des zu löschenden Makros. Was jetzt noch fehlt ist das Ende des zu löschenden Makros. Diese Zeilenposition können Sie mithilfe der Methode ProcCountLines ermitteln, der Sie wie schon vorher, den Namen des zu löschenden Makros übergeben und über die Konstante vbext_pk_Proc dafür sorgen, dass nach Prozeduren gesucht werden soll. Entfernen Sie im nächsten Schritt die ermittelten Zeilen, indem Sie der Methode DeleteLines die gerade eben ermittelten Positionen der Start- sowie Endezeile des zu löschenden Makros übergeben.
Ein Ereignis löschen Sie wissen jetzt, wie Sie Module und einzelne Makros löschen, die in Modulen untergebracht sind. Was aber machen Sie, wenn Sie beispielsweise Ereignisse entfernen möchten, welche hinter einer Tabelle im Projekt-Explorer verborgen sind? In diesem Fall starten Sie das Makro aus Listing 14.15: Listing 14.15: Alle Ereignisse, die hinter der Tabelle1 stehen, werden gelöscht Sub EntfernenEreignisse() With ActiveWorkbook.VBProject.VBComponents("Tabelle1").CodeModule .DeleteLines 1, .CountOfLines End With End Sub
Da auch einzelne Tabellen in der Eigenschaft VBComponents verzeichnet sind, können Sie diese auch gezielt ansprechen. Mithilfe der Methode DeleteLines entfernen Sie alle Ereignisse, die sich hinter der TABELLE1 befinden. Übergeben Sie dieser Methode als Argumente die Startzeile (=1) sowie die Anzahl der Zeilen, die hinter dieser Tabelle erfasst wurden. Diese Information können Sie über die Eigenschaft CountOfLines ermitteln. Auf eine ganz ähnliche Weise können Sie übrigens auch dynamisch Ereignisse hinter einzelne Tabellen legen. Das Makro aus Listing 14.16 stellt das Ereignis Worksheet_Change hinter der TABELLE1 ein.
412
Typische Aufgaben mit der VBE erledigen
Listing 14.16: Ein Ereignis dynamisch einstellen Sub EreignisEinstellen() With ThisWorkbook.VBProject.VBComponents("Tabelle1").CodeModule .InsertLines 1, _ "Private Sub Worksheet_Change(ByVal Target As Range)" & Chr(13) & _ " Msgbox ""Zellenänderung durchgeführt in Zelle: "" & _ Target.Address" & Chr(13) & _ "End Sub" End With End Sub
Geben Sie im ersten Schritt über die Anweisung Set an, hinter welche Tabelle das Ereignis Worksheet_Change eingefügt werden soll. Danach setzen Sie die Methode InsertLines ein, um den Quellcode einzufügen. Dabei übergeben Sie dieser Methode zwei Argumente. Im ersten Argument legen Sie die Startzeile fest, ab der der Quellcode eingefügt werden soll. Im zweiten Argument übertragen Sie das Ereignis Zeile für Zeile.
Abbildung 14.12: Das Ereignis wurde per Makro eingestellt.
VBE aufrufen Standardmäßig drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zu wechseln. Diesen Vorgang können Sie aber auch über ein Makro durchführen. Dieses Makro können Sie dann beispielsweise einer Schaltfläche in einer Excel-Tabelle zuweisen und somit mit einem Klick in die Entwicklungsumgebung wechseln. Listing 14.17: Die Entwicklungsumgebung per Makro aufrufen Sub VBEEditorAufrufen() With Application.VBE.MainWindow .SetFocus .Visible = True End With End Sub
413
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
Die Eigenschaft MainWindow gibt ein Window-Objekt zurück, das das Hauptfenster der Entwicklungsumgebung von Visual Basic darstellt. Über die Methode SetFocus wird der Fokus auf das Entwicklungsfenster verschoben, d.h. alle folgenden Aktionen werden danach in diesem Fenster durchgeführt. Mithilfe der Eigenschaft Visible machen Sie das Entwicklungsfenster sichtbar, indem Sie diese Eigenschaft auf den Wert True setzen.
14.7 Workshop 14.7.1 Fragen & Antworten F
Wie können Sie eine UserForm aus einer Arbeitsmappe entfernen? A
Eine UserForm stellt wie auch ein Modul oder ein Klassenmodul eine VBE-Komponente dar, die Sie gezielt ansprechen und somit auch entfernen können. Das folgende Makro entfernt die USERFORM1 aus der aktiven Arbeitsmappe. Listing 14.18: Eine UserForm löschen Sub UserformLöschen() With Workbooks(ActiveWorkbook.Name).VBProject .VBComponents.Remove.VBComponents("Userform1") End With End Sub
F
Wie kann ich die einzelnen VBE-Komponenten in einer Arbeitsmappe identifizieren? A
Jede einzelne VBE-Komponente kann über ihren Typ bestimmt werden. Im folgenden Makro werden alle in der Arbeitsmappe vorhandenen VBE-Komponenten aufgelistet. Listing 14.19: Alle VBE-Komponenten der Arbeitsmappe auflisten Sub KomponentenAusgeben() Dim VBKomp As VBComponent For Each VBKomp In ThisWorkbook.VBProject.VBComponents Debug.Print "Name der Komponente: " & VBKomp.Name & _ Chr(13) & "Typ der Komponente: " & _ VBKomp.Type & Chr(13) Next VBKomp End Sub
414
Workshop
Durchlaufen Sie in einer Schleife alle VBE-Komponenten der Arbeitsmappe und geben Sie die Namen der Komponenten über die Eigenschaft Name sowie den Typ der Komponente über die Eigenschaft Type mithilfe der Anweisung Debug.Print im Direktfenster der Entwicklungsumgebung aus.
Abbildung 14.1: Name und Typ der einzelnen VBE-Komponenten ausgeben
F
Wie können Sie Ereignisse aus einer Arbeitsmappe entfernen, welche im Projekt-Explorer hinter dem Eintrag DieseArbeitsmappe hinterlegt sind? A
Sie können ein Arbeitsmappenereignis aus der Arbeitsmappe entfernen, indem Sie folgendes Makro einsetzen. Listing 14.20: Ein Arbeitsmappenereignis entfernen Sub ArbeitsmappenEreignisEntfernen() With ThisWorkbook.VBProject.VBComponents _ ("DieseArbeitsmappe").CodeModule .DeleteLines 1, .CountOfLines End With End Sub
Geben Sie als VBE-Komponente direkt den Namen DieseArbeitsmappe an, um Zugriff auf die dort eventuell eingefügten Ereignisse zu bekommen. Danach wenden Sie die Methode DeleteLines an, um die Ereignisse zu entfernen. Übergeben Sie dieser Methode als Argumente die Startzeile (=1) sowie die Anzahl der Zeilen, die hinter diesem Eintrag erfasst wurden. Diese Information können Sie über die Eigenschaft CountOfLines ermitteln.
415
Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren
14.7.2 Quiz 1. Über welche Eigenschaft können Sie den Namen sowie den Pfad eines Verweises herausfinden? 2. Wie lautet die Methode, um eine Textdatei in ein VBA-Modul einzulesen? 3. Schreiben Sie ein Makro, welches die beiden Module MODULNEU und MODULNEU2 aus der Arbeitsmappe entfernt. 4. Erfassen Sie ein Makro, welches alle Module einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung ausgibt.
14.7.3 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe VBE.xls und schreiben ein Makro, das alle Makros aus allen Modulen einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung auflistet. Die Lösung können Sie im Anhang nachlesen.
416
Tag 1
Die Entwicklungsplattform kennen lernen
21
Tag 2
Datentypen, Variablen und Konstanten
61
Tag 3
Die Sprachelemente von VBA
97
Tag 4
Auf Fehlersuche mit VBA
129
Tag 5
Einstellen und Anpassen der Excel-Anwendung
147
Tag 6
Auf Arbeitsmappen zugreifen – Datei-Operationen 171
Tag 7
Tabellenblätter programmieren
197
Tag 8
Zellenbearbeitung mit VBA
237
Tag 9
Aktionen und Benutzereingaben in Excel überwachen
309
Große Datenmengen in VBA behandeln und auswerten
327
Tag 11
Daten grafisch darstellen
349
Tag 12
Tastatur- und Zeitsteuerung in Excel
367
Tag 13
Tastatur- und Zeitsteuerung in Excel
367
Tag 14
Makros dynamisch erzeugen, importieren und exportieren über VBE-Programmierung
395
Tag 10
Tag 15
Funktionen einsetzen, um Excel zu automatisieren 419
Tag 16
Excel und das Internet
443
Tag 17
Excel und Datenbankzugriffe in Access
461
Tag 18
Excel und Word im Zusammenspiel
481
Tag 19
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
499
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
517
Erstellen von Add-Ins
537
Tag 20 Tag 21
W O C H E
W O C H E
W O C H E
Woche 3: Weitere Automatisierung und Zusammenarbeit mit anderen Office-Komponenten Nachdem Sie jetzt die zweite Woche jetzt hinter sich haben, lernen Sie nun, wie Sie Excel weiter automatisieren und die Zusammenarbeit mit anderen Office-Komponenten herstellen können. Am 15. 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. Auch am 16. 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 17. 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. Der 18. Tag beschäftigt sich mit dem Thema, 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 19. Tag manipulieren Sie die vorhandenen Menü- und Symbolleisten von Excel und erstellen eigene Menü- und Symbolleisten. Auch die Programmierung von Kontextmenüs bildet einen Schwerpunkt an diesem Tag. Am 20. Tag lernen Sie, wie Sie in Excel Dialoge (= UserForms) zeichnen, mit Steuerelementen wie Schaltflächen und Eingabefeldern bestücken und diese dann automatisieren. Am 21. Tag erstellen Sie Schritt für Schritt ein eigenes Add-In, welches wichtige Funktionen für die tägliche Arbeit in einem separaten Menü zur Verfügung stellt.
418
Funktionen einsetzen, um Excel zu automatisieren
5 1
Funktionen einsetzen, um Excel zu automatisieren
Standardmäßig bietet Ihnen Excel 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 FunktionsAssistenten 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.
15.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. 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.xls im Verzeichnis Kap15.
420
Eigene Tabellenfunktionen stricken
Abbildung 15.1: Benutzerdefinierte Funktionen
Zellen mit blauer, dicker Schriftfarbe summieren Sie haben 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 15.2 an.
Abbildung 15.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 15.1 an.
421
Funktionen einsetzen, um Excel zu automatisieren
Listing 15.1: Alle Zellen mit bestimmter Formatierung sollen summiert werden Function BUF(zelle As Range) Application.Volatile For Each zelle In zelle.Cells If IsNumeric(zelle) Then If zelle.Font.Bold = True And _ zelle.Font.ColorIndex = 5 Then BUF = BUF + zelle.Value End If End If Next zelle End Function
Jede Funktion beginnt mit dem 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 VBAFunktion 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.
422
Eigene Tabellenfunktionen stricken
Testen Sie nun die Funktion, indem Sie diese in eine beliebige Zelle der Tabelle eingeben, wie dies in Abbildung 15.3 durchgeführt wurde.
Abbildung 15.3: Die Funktion liefert das richtige Ergebnis.
Übrigens können Sie die Funktion aus Listing 15.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 15.2: Fett und blau formatierte Zellen zählen Function BUFZ(zelle As Range) Application.Volatile For Each zelle In zelle.Cells If IsNumeric(zelle) Then If zelle.Font.Bold = True _ And zelle.Font.ColorIndex = 5 Then BUFZ = BUFZ + 1 End If End If Next zelle End Function
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 können Sie in Listing 15.3 sehen:
423
Funktionen einsetzen, um Excel zu automatisieren
Listing 15.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 15.3 wie folgt: Listing 15.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 15.4: Beide Funktionen im Einsatz
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 15.5 prüft, ob eine Zelle eine Formel bzw. Verknüpfung enthält:
424
Eigene Tabellenfunktionen stricken
Listing 15.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 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 15.5: Die Zelle B5 enthält eine Formel.
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 Nun werden Sie eine Zelle mithilfe einer Funktion überprüfen. Je nach Funktionsaufruf sollen dabei folgende Informationen ermittelt werden:
425
Funktionen einsetzen, um Excel zu automatisieren
쐽
Zellenadresse
쐽
Zellenwert
쐽
Zellenformel
Alle diese Informationen können Sie über die folgende Funktion aus Listing 15.6 abfragen: Listing 15.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 15.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.
Abbildung 15.6: Unterschiedliche Ergebnisse je nach Funktionsaufruf
426
Eigene Tabellenfunktionen stricken
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: Listing 15.7: Dokumenteigenschaften über eine Funktion abfragen Function DokuEig(EigenschaftsNr As Integer) Dim fso As Object Dim tmp As String On Error Resume Next Set fso = CreateObject("Scripting.FileSystemObject") With fso.GetFile(ActiveWorkbook.FullName) Select Case EigenschaftsNr Case Is = 1: tmp = .Path Case Is = 2: tmp = Mid(.Path, 1, _ Len(.Path) - Len(.Name)) Case Is = 3: tmp = .Name Case Is = 4: tmp = .Type Case Is = 5: tmp = .Size Case Is = 6: tmp = .DateCreated Case Is = 7: tmp = .DateLastModified Case Is = 8: tmp = .DateLastAccessed Case Else tmp = "Ungültige EigenschaftsNr!"
427
Funktionen einsetzen, um Excel zu automatisieren
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 Case-Anweisung 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.
쐽
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 15.7: Die Funktion DokuEig mit unterschiedlichen Argumenten und Ergebnissen
428
Eigene Tabellenfunktionen stricken
Buchstaben aus Zellen eliminieren Aus einer Zelle, die sowohl Buchstaben als auch Zahlen enthält, sollen alle Buchstaben rausgeworfen werden. Listing 15.8: Alle Buchstaben sollen aus einer Zelle entfernt werden Function BuchstRaus(Zelle) As Integer Dim i As Integer Application.Volatile For i = 1 To Len(Zelle) Select Case Asc(Mid(Zelle, i, 1)) Case 0 To 64, 123 To 197 BuchstRaus = BuchstRaus & Mid(Zelle, i, 1) End Select Next i End Function
Ermitteln Sie im ersten Schritt die 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 15.8: Aus »gemischten« Zellen Zahlen herstellen
429
Funktionen einsetzen, um Excel zu automatisieren
Das erste Auftreten einer Zahl ermitteln Die nächste Funktion ist der Funktion aus Listing 15.8 ähnlich. Nun 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 15.9 an: Listing 15.9: Die Position des ersten numerischen Zeichens ermitteln Function PosErsteZahl(Zelle) As Integer Dim i As Integer Application.Volatile For i = 1 To Len(Zelle) Select Case Asc(Mid(Zelle, i, 1)) Case 0 To 64, 123 To 197 PosErsteZahl = i Exit Function End Select Next i PosErsteZahl = 0 End Function
Ermitteln Sie im ersten Schritt die Länge der Zelle und setzen Sie dafür die Funktion Len ein. Danach prüfen Sie mithilfe de Funktion Asc das jeweils aktuelle Zeichen der Zelle, indem Sie dieses in einen Integer-Wert umwandeln. Mit der Funktion Mid extrahieren Sie jeweils das 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 15.9: Aus »gemischten« Zellen die Position der ersten Zahl ermitteln
430
Modulare Funktionen programmieren
15.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 dieser Funktion den Dateinamen mitsamt der Laufwerksund Pfadangabe. Als Ergebnis dieser Funktion sollten Sie dann eine Rückmeldung bekommen, ob die angegebene Datei auch vorhanden ist. Listing 15.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. 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.
431
Funktionen einsetzen, um Excel zu automatisieren
Listing 15.11: Vor dem Öffnen einer Datei deren Existenz prüfen Sub DateiÖffnen() Dim b As Boolean Const EDatei = "C:\Eigene Dateien\Mappe1.xls" b = DateiExist(EDatei) If b = True Then Workbooks.Open Edatei Else MsgBox "Die Datei " & EDatei & " ist nicht vorhanden!" End If End Sub
Im Makro aus Listing 15.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: Listing 15.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
432
Modulare Funktionen programmieren
fehler: DatSchonGeöffnet = False End Function
Die Funktion aus Listing 15.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 15.13: Aktivieren oder Öffnen der Arbeitsmappe Sub ÖffnenOderAktivieren() Dim b As Boolean Const EDatei = "C:\Eigene Dateien\Mappe1.xls" b = DateiGeöffnet(EDatei) If b = True Then Else Workbooks.Open Edatei End If End Sub
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 15.14 sehen können:
433
Funktionen einsetzen, um Excel zu automatisieren
Listing 15.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 .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.
434
Modulare Funktionen programmieren
쐽
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, meldet 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 der Funktion die Lösch-Nr 5, um alle Hyperlinks aus der aktiven Tabelle zu entfernen. Listing 15.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
435
Funktionen einsetzen, um Excel zu automatisieren
Ü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.
Abbildung 15.10: In diesem Beispiel werden die Hyperlinks aus der Tabelle entfernt.
15.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.xls 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.xls ablegen, welche sich im Office-Verzeichnis XLSTART befindet. Sollte diese Arbeitsmappe noch nicht existieren, legen Sie eine an:
436
Funktionen dauerhaft verfügbar machen
1. Wählen Sie in der Tabellenansicht den Menübefehl EXTRAS/MAKRO/AUFZEICHNEN. 2. Wählen Sie im Dialogfeld MAKRO AUFZEICHNEN aus dem Kombinationsfeld den Eintrag PERSÖNLICHE MAKROARBEITSMAPPE.
Abbildung 15.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 aus dem Menü EXTRAS den Befehl MAKRO/AUFZEICHNUNG BEENDEN auswählen. Übertragen Sie nun Ihre Funktionen aus der Arbeitsmappe Funktionen.xls in die persönliche Arbeitsmappe Personl.xls. Dazu ist folgende Vorgehensweise notwendig: 1. Öffnen Sie die Arbeitsmappe Funktionen.xls. 2. Wechseln Sie in die Entwicklungsumgebung. 3. Aktivieren Sie das MODUL1. 4. Markieren Sie alle Funktionen mit dem Menübefehl BEARBEITEN/ALLES 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.XLS) aus. 7. Aktivieren Sie in diesem Projekt das MODUL1. 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 Funktions-Assistenten in Ihre Tabellen einfügen.
437
Funktionen einsetzen, um Excel zu automatisieren
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.xls 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.xls 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.xls öffnen und aus dem Menü DATEI den Befehl EIGENSCHAFTEN wählen.
Abbildung 15.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. Dann: 1. Wählen Sie aus dem Menü DATEI den Befehl SPEICHERN UNTER. 2. Stellen Sie im Kombinationsfeld DATEITYP den Eintrag MICROSOFT EXCEL-ADDIN ein. Nun wird automatisch das Add-In-Verzeichnis von Excel eingestellt.
438
Funktionen dauerhaft verfügbar machen
3. Klicken Sie auf die Schaltfläche SPEICHERN. Das Add-In FUNKTIONEN.XLS wurde nun erstellt. Binden Sie das Add-In jetzt ein: 1. Wählen Sie aus dem Menü EXTRAS den Befehl ADD-INS.
Abbildung 15.13: Add-Ins einbinden
2. Aktivieren Sie das Add-In NÜTZLICHE FUNKTIONEN. Diese Information haben Sie vorher bei den Dokumenteigenschaften unter der Rubrik TITEL erfasst. 3. Bestätigen Sie Ihre Aktion durch OK. Erfahren Sie mehr zum Thema Add-In in Kapitel 21 dieses Buches.
439
Funktionen einsetzen, um Excel zu automatisieren
15.4 Workshop 15.4.1 Fragen & Antworten F
Wie können Sie über eine benutzerdefinierte Tabellenfunktion den Namen des aktuellen Anwenders in einer Zelle ausgeben? A
Erfassen Sie zu diesem Zweck die Funktion aus Listing 15.16: Listing 15.16: Den Namen des Anwenders in einer Zelle ausgeben Function Anwender() Application.Volatile Anwender = Application.UserName End Function
Die Eigenschaft UserName gibt den Namen des aktuellen Benutzers 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 folgendermaßen: Listing 15.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 End If Next i End Function
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)
440
Workshop
F
Wie können Sie über eine Funktion prüfen, ob ein Add-In bereits im Add-In-Manager eingebunden ist? A
Geben Sie folgende Funktion ein: Listing 15.18: Ist das Add-In »Nützliche Funktionen« bereits eingebunden? Sub AddInPrüfung() Dim b As Boolean b = AddInAktiv("Nützliche Funktionen") If b = True 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.
15.4.2 Quiz 1. Wie muss die Anweisung lauten, damit eine benutzerdefinierte Funktion auch auf Änderungen in der Tabelle reagieren kann? 2. Wie muss die benutzerdefinierte Funktion lauten, wenn alle Zellen addiert werden sollen, die mit der Hintergrundfarbe ROT formatiert sind? 3. Über welche Methode können Sie den Inhalt einer Zelle komplett löschen? 4. Wie heißt die persönliche Makroarbeitsmappe und wo befindet sich diese?
15.4.3 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Funktionen.xls und schreiben eine modulare Funktion, die vor der Aktivierung einer Tabelle überprüft, ob diese in der Arbeitmappe überhaupt vorhanden ist.
441
Excel und das Internet
6 1
Excel und das Internet
Sie wissen nun, 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.xls im Verzeichnis Kap16.
16.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 die Eingabe in einen Hyperlink umwandeln soll. So werden URLs von Internetseiten, E-Mail-Adressen und Netzwerkverbindungen automatisch mit der Hyperlinkfunktion und deren typischen Formatierung ausgestattet. Lernen Sie im Anschluss an diese Einführung ein paar typische Aufgaben aus der Praxis kennen.
Hyperlinks aus einer Tabelle entfernen Sie haben 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 16.1 an.
444
Arbeiten mit Hyperlinks
Abbildung 16.1: Eine Tabelle mit Hyperlinks
Erfassen Sie jetzt das folgende Makro, um die Hyperlinks der Tabelle zu entfernen: Listing 16.1: Hyperlinks entfernen Sub HyperlinksEntfernen() Dim zelle As Range Dim Bereich As Range Sheets("Tabelle1").Activate Set Bereich = ActiveSheet.UsedRange For Each zelle In Bereich With zelle If .Hyperlinks.Count > 0 Then .Hyperlinks.Delete With .Font .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With End If 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 ActiveSheet.UsedRange bestimmen Sie, dass alle Zellen im verwendeten Bereich der Tabelle verarbeitet werden
445
Excel und das Internet
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 16.2: Die Hyperlinks wurden aus der Tabelle entfernt.
Hyperlinks aus Zelleninhalten herstellen Gerade haben Sie gelernt, wie Sie Hyperlinks aus Tabellen entfernen. Aber auch der umgekehrte Vorgang ist von Interesse. Bilden Sie daher in der folgenden Aufgabe aus den Zelleninhalten der Zellen A1:A11 (Abbildung 16.2) Hyperlinks. Erfassen Sie das Makro aus Listing 16.2, um aus den Zelleninhalten Hyperlinks herzustellen. Listing 16.2: Aus Zelleninhalten Hyperlinks herstellen Sub HyperlinksSetzen() Sheets("Tabelle1").Activate Range("A1").Select
446
Arbeiten mit Hyperlinks
Do Until ActiveCell.Value = "" If Left(ActiveCell.Value, 7) = "http://" Then ActiveCell.Hyperlinks.Add ActiveCell,_ ActiveCell.Value, , _ "Klicken Sie hier, um die Verbindung herzustellen", _ ActiveCell.Value Else End If ActiveCell.Offset(1, 0).Select Loop End Sub
Aktivieren Sie die gewünschte Tabelle, welche die Daten enthält, die Sie in Hyperlinks verwandeln möchten. Danach setzen Sie den Textcursor auf die Startzelle und setzen eine Schleife auf, die solange durchlaufen wird, bis die erste leere Zelle in Spalte A erreicht wird. Setzen Sie den Textcursor am Ende der Schleife immer um eine Zelle nach unten, indem Sie die Eigenschaft Offset einsetzen und dabei als erstes Argument den Wert 1 (Zeilenverschiebung) einsetzen. Innerhalb der Schleife 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. 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. Bei 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.
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.
447
Excel und das Internet
Abbildung 16.3: Hyperlinks aus Zelleninhalten bilden
Sehen Sie sich dazu das folgende Listing an: Listing 16.3: Die Tabellennamen »verlinken« Sub InhaltsverzeichnisErstellen() Dim i As Integer ActiveWorkbook.Sheets.Add Before:=Worksheets(1) ActiveSheet.Name = "Inhalt" Range("A1").Value = "Inhaltsverzeichnis" ActiveCell.Offset(2, 0).Select For i = 2 To ActiveWorkbook.Sheets.Count ActiveCell.Value = i-1 ActiveCell.Offset(0, 1).Value = Sheets(i).Name ActiveCell.Offset(1, 0).Select Next i Range("B3").Activate Do Until ActiveCell.Value = "" ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, _ Address:="", SubAddress:= ActiveCell.Value & "!A1", _ TextToDisplay:=ActiveCell.Value ActiveCell.Offset(1, 0).Select Loop End Sub
448
E-Mails verschicken
Fügen Sie 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 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 im Argument SubAddress sowohl den Namen der Tabelle, den Sie aus der aktuellen Zelle beziehen, auch die Zellenadresse ein, an die gesprungen werden soll. Verbinden Sie diese beiden Informationen durch die Textfolge & "!.
Abbildung 16.4: Alle Tabellen können über Hyperlinks schnell angesprungen werden.
16.2 E-Mails verschicken Standardmäßig können Sie die aktive Arbeitsmappe versenden, indem Sie aus dem Menü DATEI den Befehl SENDEN AN/E-MAIL-EMPFÄNGER 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 E-Mail-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.
449
Excel und das Internet
Selbstverständlich haben Sie noch weitere Möglichkeiten, das Aussehen von E-Mails zu ändern. So können Sie beispielsweise schon vorab einen vorgefertigten Text sowie die Empfänger-E-Mail-Adresse 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-Mail-Anhang 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: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.
Abbildung 16.5: Die Outlook-Bibliothek einbinden
3. Aktivieren Sie im Listenfeld VERFÜGBARE VERWEISE die Bibliothek MICROSOFT OUTLOOK 10.0 OBJECT LIBRARY. 4. Bestätigen Sie Ihre Aktion mit OK. Erfassen Sie jetzt den Quellcode, um die Datei Projekt.xls aus dem Verzeichnis C:\Eigene Dateien an einen bestimmten Empfänger
[email protected] zu versenden.
450
E-Mails verschicken
Listing 16.4: Eine E-Mail zusammenstellen Sub MailVersenden() Dim outl As Object Dim Mail As Object Set outl = CreateObject("Outlook.Application") Set Mail = outl.CreateItem(olMailItem) Mail.Subject = "Projekt-Status" Mail.Body = "Sehr geehrter Herr Held" & Chr(13) & _ "anbei erhalten Sie den aktuellen Projektbericht " & _ Chr(13) & " im aktuellen Monat " & Chr(13) & _ Chr(13) & " Mit freundlichen Grüßen" & Chr(13) & _ " Walter Kuhn " Mail.To = "
[email protected]" Mail.CC = "
[email protected]" Mail.Attachments.Add "C:\Eigene Dateien\Projekt.xls" Mail.Display Set outl = Nothing 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 E-Mail-Objekt handeln soll. Über die Eigenschaft Subject legen Sie den Titel der E-Mail fest. Dieser Titel wird in der Zeile BETREFF angezeigt. Mithilfe der Eigenschaft Body geben Sie den Text an, der als Nachrichtentext in der E-Mail 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 können Sie die Eigenschaft BCC einsetzen. Sie kommt dann zum Tragen, wenn Sie einem Anwender eine
451
Excel und das Internet
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. 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 E-Mail natürlich auch über einen VBA-Befehl direkt abschicken. Ergänzen Sie Ihr Makro mit dem Befehl Mail.Send.
Abbildung 16.6: Mit einem Klick wird die E-Mail versendet.
16.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 16.7 an. Transferieren Sie nun diese Excel-Tabelle mithilfe des Makros aus Listing 16.5 in den Kontaktordner von Outlook.
452
Kontakte austauschen
Abbildung 16.7: Die Adressdaten aus Excel sollen in den Kontaktordner von Outlook
Listing 16.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
453
Excel und das Internet
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. Anschließend füllen Sie den noch leeren Kontakt mit den Daten aus Ihrer Excel-Tabelle. Unter anderem verwenden Sie dabei folgende Eigenschaften: 쐽
LastName: Mit dieser Eigenschaft können Sie den Nachnamen, den Sie 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 16.8: Die Kontakte wurden erfolgreich übertragen.
454
Kontakte austauschen
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: Listing 16.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
= .LastName = _ = _ = _ = _ = _ = .Email1Address
Set objItem = Nothing Set olMAPI = Nothing End Sub
455
Excel und das Internet
Fügen Sie ü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 16.9: Die aus Outlook importierten Kontaktdaten
456
Workshop
16.4 Workshop 16.4.1 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 16.7 in Hyperlinks setzen. Sehen Sie sich aber vorher Abbildung 16.10 an.
Abbildung 16.1: Diese E-Mail-Adressen sollen in Hyperlinks gewandelt werden.
Listing 16.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
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
457
Excel und das Internet
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.
Abbildung 16.2: 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 16.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
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.
458
Workshop
Abbildung 16.3: 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. In diesem Listing werden alle Hyperlinks einer Tabelle mit der Schriftfarbe ROT formatiert: Listing 16.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
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.
16.4.2 Quiz 1. Über welches Argument der Methode Add können Sie bestimmen, welche QuickInfo angezeigt wird, wenn Sie mit der Maus über eine Hyperlinkzelle streichen? 2. Mit welcher Anweisung können Sie ein leeres Outlook-Kontaktobjekt anlegen? 3. Was muss beim Anlegen eines Outlook-Kontaktes aus Excel heraus beachtet werden?
459
Excel und das Internet
16.4.3 Ü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.
460
Excel und Datenbankzugriffe in Access
7 1
Excel und Datenbankzugriffe in Access
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: 쐽
Voraussetzung für den Datenaustausch
쐽
Excel-Daten in eine Access-Datenbank transferieren
쐽
Access-Daten in Excel-Tabellen transferieren
쐽
Access-Tabellen manipulieren
쐽
Datensätze löschen
17.1 Voraussetzung für den Datenaustausch Die Zusammenarbeit zwischen Excel und Access bietet interessante Möglichkeiten in der Praxis. Das Datenbankprogramm Access eignet sich gerade für die Verwaltung von Massendaten sehr gut. So können Sie die Daten in einer Access-Datenbank speichern und über Excel darauf zugreifen. Diese Access-Datenbank können Sie dann beispielsweise auf einem allgemein zugänglichen Netzlaufwerk zentral ablegen, auf die die einzelnen ExcelAnwender Zugriff haben. Für den Datenzugriff stehen zwei verschiedene Methoden zur Verfügung: entweder die ältere Zugriffsmethode DAO (Data Access Object) oder die neue Methode ADO (ActiveX Data Object). Aus Aktualitätsgründen werden die folgenden Beispiele mithilfe von ADO programmiert. 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.
462
Voraussetzung für den Datenaustausch
1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.
Abbildung 17.1: Die ADO-Bibliothek einbinden
3. Im Listenfeld VERFÜGBARE VERWEISE aktivieren Sie die Bibliothek MICROSOFT ACTIVEX DATA OBJECTS 2.5 LIBRARY. 4. Nun aktivieren Sie im Listenfeld VERFÜGBARE VERWEISE die Bibliothek MICROSOFT ACCESS 10.0 OBJECT LIBRARY. 5. Bestätigen Sie Ihre Einstellungen mit OK. Wenn Sie mit Office 2000 arbeiten, dann lautet der Name der Bibliothek MICROSOFT ACCESS 9.0 OBJECT LIBRARY. Anwender, die Office 97 im Einsatz haben, müssen die Bibliothek MICROSOFT ACCESS 8.0 OBJECT LIBRARY einbinden. Sie haben nun die Möglichkeit, vorab 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-Feld den Befehl ACCESS ein.
463
Excel und Datenbankzugriffe in Access
Abbildung 17.2: Alle Objekte, Methoden und Eigenschaften von Access-VBA
17.2 Excel-Daten in eine Access-Datenbank transferieren Im folgenden Praxisbeispiel soll eine Excel-Tabelle in eine noch leere Access-Datenbank transferiert werden. Dafür müssen Sie die Datenbank zuerst noch anlegen: 1. Starten Sie Microsoft Access. 2. Legen Sie eine neue Datenbank an und geben Sie dieser den Namen BUCHUNGEN. 3. Erstellen Sie jetzt eine neue Tabelle, indem Sie aus dem Menü EINFÜGEN den Befehl TABELLE auswählen. 4. Im Dialogfeld NEUE TABELLE markieren Sie das Listenfeld ENTWURFSANSICHT. 5. Bestätigen Sie mit OK. 6. Legen Sie jetzt den Aufbau der Tabelle fest, so wie Sie ihn in Abbildung 17.3 sehen.
464
Excel-Daten in eine Access-Datenbank transferieren
Abbildung 17.3: Der Aufbau der Tabelle
7. Geben Sie der Tabelle den Namen VERANSTALTUNG. 8. Beenden Sie nun Microsoft Access. Nun haben Sie eine Excel-Tabelle nach folgendem Muster vorliegen:
Abbildung 17.4: Die Veranstaltungsdaten in Excel
Übertragen Sie jetzt diese Veranstaltungsdaten aus der Excel-Tabelle in die Access-Datenbank: Listing 17.1: Excel-Daten nach Access transferieren Sub DatenübernahmeNachAccess() Dim ADOC As New ADODB.Connection Dim DBS As New ADODB.Recordset
465
Excel und Datenbankzugriffe in Access
ADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0; _ Data Source=C:\Eigene Dateien\Buchungen.mdb;" DBS.Open "Veranstaltung", ADOC, adOpenKeyset, _ adLockOptimistic Sheets("Veranstaltungen").Activate Range("A2").Select On Error GoTo Fehler Do Until ActiveCell.Value = "" DBS.AddNew DBS!Bdatum = ActiveCell.Value DBS!Vdatum = ActiveCell.Offset(0, 1).Value DBS!Veranstaltung = ActiveCell.Offset(0, 2).Value DBS!V_Ort = ActiveCell.Offset(0, 3).Value DBS!Teilnehmer = ActiveCell.Offset(0, 4).Value DBS!Straße = ActiveCell.Offset(0, 5).Value DBS!PLZ = ActiveCell.Offset(0, 6).Value DBS!Ort = ActiveCell.Offset(0, 7).Value DBS!Kosten = ActiveCell.Offset(0, 8).Value If ActiveCell.Offset(0, 9).Value = "Ja" Then DBS!Bezahlt = True Else DBS!Bezahlt = False DBS.Update ActiveCell.Offset(1, 0).Select Loop DBS.Close ADOC.Close Set ADOC = Nothing Set DBS = Nothing Exit Sub Fehler: MsgBox "Es trat ein Fehler auf!" DBS.Close ADOC.Close Set ADOC = Nothing Set DBS = Nothing End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Connection, um später die Verbindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS benötigen Sie ein RecordSetObjekt, welches nachher alle Datensätze der Datenquelle aufnehmen soll. Um die Verbindung zur Access-Datenbank herzustellen, verbinden Sie sich zuerst einmal mittels der Methode Open mit Ihrem Provider. Dieser Provider stellt alle nötigen Funktionen zur Verfügung, um auf die Access-Datenbank zuzugreifen.
466
Excel-Daten in eine Access-Datenbank transferieren
Öffnen Sie die Access-Datenbank mithilfe des Objektes Connection. Dazu brauchen Sie die Jet-Datenbank-Engine. Unter einer Engine kann man eine ganze Reihe von SoftwareFunktionen verstehen, die bestimmte Aufgaben übernehmen. Geben Sie daher mit der Eigenschaft Provider die Engine Microsoft Jet 4.0 OLE DB-Provider an. Öffnen Sie danach die Datenbank Buchungen.mdb. Erstellen Sie ein RecordSet-Objekt, welches später den gesuchten Datensatz enthalten soll. Öffnen Sie über die Methode Open die Tabelle VERANSTALTUNG. Die Syntax der Methode lautet: RecordSet.Open Source, ActiveConnection, CursorType, LockType, Options
Das Argument Source liefert den Namen der Tabelle, die Sie öffnen möchten. Im Argument ActiveConnection geben Sie das Connection-Objekt ADOC an. Über das Argument CursorType legen Sie über eine Konstante die Art des Zugriffs fest. Über die Konstante adOpenKeyset: verwenden Sie einen Cursor, der Tabellenänderungen von anderen Anwendern nicht anzeigt. Mithilfe des Arguments LockType legen Sie fest, welches Sperrverfahren der Provider beim Öffnen der Datentabelle einsetzen soll. Dabei bedeutet die Konstante adLockOptimistic: dass die Tabelle teilweise gesperrt wird, d.h. ein Datensatz wird nur gesperrt, wenn Sie die Update-Methode aufrufen. Über das Argument Options können Sie festlegen, wie der Provider die Daten auswerten soll. Dieses Argument wird aber für unser Beispiel nicht benötigt. Aktivieren Sie danach die Excel-Tabelle, die die zu übertragenden Daten enthält, und setzen Sie den Mauszeiger auf die Startzelle. 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 Excel-Tabelle. Vergessen Sie nicht, das Ganze mithilfe der Methode Update zu sichern. Am Ende des Makros schließen Sie die Datenbank über die Methode Close und beenden ebenfalls mit derselben Methode die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
Abbildung 17.5: Die Daten wurden erfolgreich nach Access übertragen.
467
Excel und Datenbankzugriffe in Access
17.3 Access-Daten in Excel-Tabellen transferieren 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 Makro aus Listing 17.2 ein: Listing 17.2: Daten aus einer Access-Tabelle transferieren Sub Dim Dim Dim
DatenÜbertragenNachExcel() ADOC As New ADODB.Connection DBS As New ADODB.Recordset cmd As ADODB.Command
On Error GoTo Fehlerbehandlung ADOC.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data _ Source=C:\Eigene Dateien\Buchungen.mdb;" DBS.Open "Veranstaltung", ADOC, adOpenKeyset, _ adLockOptimistic Set cmd = New ADODB.Command cmd.CommandText = "SELECT * from Veranstaltung" cmd.ActiveConnection = ADOC Set DBS = cmd.Execute Sheets("Import").Activate Range("A2").Select Do While Not DBS.EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Offset(0, 1).Value ActiveCell.Offset(0, 2).Value ActiveCell.Offset(0, 3).Value ActiveCell.Offset(0, 4).Value ActiveCell.Offset(0, 5).Value ActiveCell.Offset(0, 6).Value ActiveCell.Offset(0, 7).Value
468
= = = = = = =
DBS!Vdatum DBS!Veranstaltung DBS!V_Ort DBS!Teilnehmer DBS!Straße DBS!PLZ DBS!Ort
Access-Daten in Excel-Tabellen transferieren
ActiveCell.Offset(0, 8).Value = DBS!Kosten If DBS!Bezahlt = True Then ActiveCell.Offset(0, 9).Value = "Ja" Else ActiveCell.Offset(0, 9).Value = "Nein" End If DBS.MoveNext ActiveCell.Offset(1, 0).Select Loop Columns("A:J").AutoFit DBS.Close ADOC.Close Set DBS = Nothing Set ADOC = Nothing Set DBS = Nothing Set cmd = Nothing Exit Sub Fehlerbehandlung: MsgBox "Es ist ein Fehler aufgetreten!" _ & Chr(13) & Err.Description End Sub
Definieren Sie zuerst eine Objektvariable vom Typ Connection, um später die Verbindung zur Datenquelle herzustellen. Als zweite Objektvariable DBS benötigen Sie ein RecordSetObjekt, welches nachher alle Datensätze der Datenquelle aufnehmen soll. Zuerst verbinden Sie sich mittels der Methode Open mit Ihrem Provider, um die Verbindung zur AccessDatenbank herzustellen. Dieser Provider stellt alle notwendigen Funktionen zur Verfügung, 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 Spalten in die Ergebnistabelle genommen werden sollen. Über die Methode Execute führen Sie diese SQL-Abfrage aus. Die ermittelten Datensätze stehen nun bereit. Aktivieren Sie das Zieltabellenblatt in Excel und setzen Sie den Mauszeiger auf die Startzelle. 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 DBS 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.
469
Excel und Datenbankzugriffe in Access
Am Ende des Makros schließen Sie die Datenbank über die Methode Close und beenden ebenfalls durch die Methode Close die Verbindung zum Provider. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisungen Set Objektvariable = Nothing einsetzen.
Abbildung 17.6: Die Daten kamen korrekt an
Nur bestimmte Datensätze nach Excel transferieren Im nächsten Beispiel werden Sie eine Datenbankabfrage durchführen und nur solche Sätze nach Excel transferieren, die bestimmten Kriterien entsprechen. So werden Sie jetzt alle Datensätze nach Excel exportieren, bei denen die Teilnahmegebühr noch nicht bezahlt wurde: Listing 17.3: Nur bestimmte Datensätze aus Access nach Excel übernehmen Sub Dim Dim Dim
DatensätzeSuchenUndÜbertragen() ADOC As ADODB.Connection DBS As ADODB.Recordset s As String
s = "Bezahlt=false" Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic
470
Access-Daten in Excel-Tabellen transferieren
.Find Criteria:=s, SearchDirection:=adSearchForward Sheets("Offene").Activate Range("A2").Select If Not .EOF Then Do While Not .EOF ActiveCell.Value = DBS!Bdatum ActiveCell.Value = Format(ActiveCell.Value, _ "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Vdatum ActiveCell.Offset(0, 1) = _ Format(ActiveCell.Offset(0, 1).Value, _ "dd.mm.yyyy") ActiveCell.Offset(0, 2).Value = DBS!Veranstaltung ActiveCell.Offset(0, 3).Value = DBS!V_Ort ActiveCell.Offset(0, 4).Value = DBS!Teilnehmer ActiveCell.Offset(0, 5).Value = DBS!Straße ActiveCell.Offset(0, 6).Value = DBS!PLZ ActiveCell.Offset(0, 7).Value = DBS!Ort ActiveCell.Offset(0, 8).Value = DBS!Kosten .Find Criteria:=s, SkipRecords:=1 ActiveCell.Offset(1, 0).Select Loop Else MsgBox "Datensatz nicht gefunden" End If .Close End With Columns("A:J").AutoFit ADOC.Close Set DBS = Nothing Set ADOC = Nothing End Sub
Stellen Sie wie vorher die Verbindung zum Provider her und öffnen Ihre Datenbank sowie die Access-Tabelle. In der Variablen s stellen Sie sich das Suchkriterium zusammen, nach dem die Access-Tabelle durchsucht werden soll. Im Anschluss daran kommt die Methode Find zum Einsatz. Diese Methode sucht in der Tabelle nach dem Datensatz, der den angegebenen Kriterien entspricht. Werden diese erfüllt, dann wird der gefundene Datensatz zum aktuellen Datensatz der Tabelle. Im anderen Fall wird der Zeiger auf das Ende der Tabelle festgelegt. Die Syntax der Methode Find lautet: Find (criteria, SkipRows, searchDirection, start)
471
Excel und Datenbankzugriffe in Access
Über das Argument criteria legen Sie fest, welchen Text bzw. welche Zahl Sie in der Datentabelle suchen möchten. Diesen Suchbegriff haben Sie gerade in der Variablen s zusammengepackt. Über das Argument SkipRows können Sie den Abstand vom aktuellen Datensatz oder vom Argument start angeben. Im Argument SearchDirection legen Sie fest, nach welcher Methodik 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.
Über das Argument start haben Sie die Möglichkeit, einen numerischen Wert anzugeben, bei welchem Datensatz die Suche in der Tabelle beginnen soll. In der ersten If-Abfrage überprüfen Sie, ob der gesuchte Satz gefunden wurde. Wenn nicht, ist die Bedingung EOF (End of File) erfüllt. Kann der gesuchte Datensatz ermittelt werden, stehen alle Informationen hierüber in der Objektvariablen DBS. Übertragen Sie nun diese Informationen in Ihre Excel-Tabelle. 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, schließen Sie die Datenbank sowie die Datentabelle über die Methode Close. Heben Sie die Objektverweise im Speicher auf, indem Sie die Anweisung Set Objektvariable = Nothing einsetzen.
Abbildung 17.7: Alle Teilnehmer von Veranstaltungen, die noch nicht bezahlt haben
17.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.
472
Access-Tabellen manipulieren
Abbildung 17.8: Originalzustand vor der Preiserhöhung.
Erfassen Sie nun das Makro, welches die Preise der Veranstaltungen um 10% erhöht: Listing 17.4: Die Preise wurden um 10% erhöht Sub Dim Dim Dim
DatenManipulieren() ADOC As ADODB.Connection DBS 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 "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Veranstaltung", _ ActiveConnection:=ADOC, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic Do While Not .EOF DBS!Kosten = DBS!Kosten * Erhöhung DBS.Update DBS.MoveNext Loop .Close End With ADOC.Close Set DBS = Nothing Set ADOC = Nothing End Sub
473
Excel und Datenbankzugriffe in Access
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. Mithilfe 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 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 17.9: Die Preise wurden erhöht.
17.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. Hier das Makro: Listing 17.5: Entfernen von bestimmten Datensätzen Sub DatensätzeLöschen() Dim ADOC As New ADODB.Connection Dim DBS As ADODB.Recordset Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With Set DBS = New ADODB.Recordset DBS.Open _ "Select * FROM Veranstaltung where (V_Ort = 'Stuttgart')", ADOC, adOpenKeyset, adLockOptimistic Do Until DBS.EOF DBS.Delete DBS.MoveNext Loop DBS.Close
474
Workshop
Set DBS = Nothing Set ADOC = Nothing End Sub
Öffnen Sie die Access-Tabelle VERANSTALTUNGEN und geben Sie über die SQL-Anweisung bekannt, welche Datensätze Sie entfernen möchten. 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 mithilfe der Methode MoveNext jeweils zum nächsten Datensatz springen.
Abbildung 17.10: Alle Veranstaltungen in Stuttgart wurden aus der Datenbank entfernt.
17.6 Workshop 17.6.1 Fragen & Antworten F
Wie können Sie die fünf billigsten Veranstaltungen einer Access-Tabelle ermitteln und in eine Excel-Tabelle transferieren? A
Setzen Sie zu diesem Zweck die SQL-Anweisung TOP ein. Listing 17.6: Die Top-Werte einer Access-Tabelle übertragen Sub Dim Dim Dim
Top_DatensätzeAnzeigen() ADOC As New ADODB.Connection DBS As ADODB.Recordset s As String
Set ADOC = New ADODB.Connection With ADOC .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\Buchungen.mdb" End With s = _ "SELECT TOP 5 Kosten, Veranstaltung, V_Ort, Vdatum FROM Veranstaltung ORDER BY Kosten"
475
Excel und Datenbankzugriffe in Access
Set DBS = New ADODB.Recordset On Error GoTo fehler DBS.Open s, ADOC, adOpenKeyset, adLockOptimistic Sheets("TOP").Activate Range("A2").Select Do While Not DBS.EOF ActiveCell.Value = DBS!Vdatum ActiveCell.Value = _ Format(ActiveCell.Value, "dd.mm.yyyy") ActiveCell.Offset(0, 1).Value = DBS!Veranstaltung ActiveCell.Offset(0, 2).Value = DBS!V_Ort ActiveCell.Offset(0, 3).Value = DBS!Kosten DBS.MoveNext ActiveCell.Offset(1, 0).Select Loop DBS.Close ADOC.Close Set DBS = Nothing Set ADOC = Nothing Exit Sub fehler: MsgBox "Es ist ein Fehler aufgetreten!" & _ Chr(13) & Err.Description End Sub
Achten Sie darauf, dass Sie in der SQL-Anweisung SELECT die Felder mit übernehmen, auf die Sie später auch zugreifen möchten. Die Sortierung der Liste können Sie über das Schlüsselwort ORDER BY bestimmen.
Abbildung 17.11: Die Top-Werte aus Access zusammentragen
F
Welche spezielle Möglichkeit haben Sie, eine Access-Tabelle in Excel zu importieren? A
476
Wenn Sie das folgende Makro in Ihre Access-Entwicklungsumgebung eingeben und starten, dann erfolgt der Transfer in eine Excel-Datei noch schneller:
Workshop
Listing 17.7: Der Transfer einer Access-Tabelle nach Excel Sub TabelleNachExcel() DoCmd.OutputTo acOutputTable, _ "Veranstaltung", acFormatXLS, _ "C:\Eigene Dateien\Veranstaltungen.xls", True End Sub
Mithilfe 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, ObjectName, OutputFormat, OutputFile, AutoStart, TemplateFile)
Ü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 Funktion zur Sicherung
왘
acOutputModule: Export eines kompletten Moduls, inkl. aller Funktionen und
Makros 왘
acOutputQuery: Export der Ergebnisse von Abfrageergebnissen
왘
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 Format kann beispielsweise sehr gut in Microsoft Word eingelesen werden.
왘
acFormatTXT: Mit diesem Format ist das Textformat (*.TXT) gemeint.
왘
acFormatXLS: Konvertiert die Daten in das Microsoft Excel-Format.
477
Excel und Datenbankzugriffe in Access
Beim Argument OutputFile geben Sie den Pfad sowie den Namen 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. Mithilfe des Arguments AutoStart haben Sie die Möglichkeit, die so erstellte Exportdatei gleich zu öffnen. Verwenden Sie den Wert True, um die entsprechende, auf Windows basierende Anwendung sofort zu starten. Setzen Sie das Argument auf den Wert False oder lassen Sie es weg, wenn Sie die Exportdatei nicht öffnen 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 17.12: Access-Tabelle wurde erfolgreich nach Excel transferiert
F
Wie kann man das Feld einer Access-Tabelle ansprechen, wenn dieses Feld im Namen ein Leerzeichen (z.B: Kosten Kurs) enthält? A
Setzen Sie um dieses Feld eckige Klammern. DBS![Kosten Kurs].
17.6.2 Quiz 1. Warum müssen Sie die ADO-Bibliothek in Ihre Entwicklungsumgebung einbinden? 2. An was müssen Sie denken, wenn Sie über die Methode AddNew einen neuen Datensatz anlegen? 3. Welches Argument müssen Sie einsetzen, wenn Sie eine Access-Tabelle vom Ende bis zum Anfang durchsuchen möchten? 4. Wie heißt die Methode, um in einer Access-Tabelle jeweils zum nächsten Datensatz zu springen?
478
Workshop
17.6.3 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Access.xls und wechseln auf die Tabelle ÜBUNG. Schreiben Sie ein Makro, welches alle Datensätze aus der AccessTabelle VERANSTALTUNG in die Excel-Tabelle überträgt, die einen Veranstaltungsbeginn nach dem 04.10.2002 haben. Die Lösung können Sie im Anhang nachlesen.
479
Excel und Word im Zusammenspiel
8 1
Excel und Word im Zusammenspiel
Gestern haben Sie gelernt, wie Sie Daten aus Access-Datenbanken in Excel-Tabellen überführen können. Dabei haben Sie sowohl ganze Datenbestände als auch nur ganz bestimmte Datensätze übernommen. Ebenso haben Sie Excel-Tabellen in eine AccessDatentabelle transferiert und, ausgehend von Excel, bestimmte Operationen wie das Einfügen und Entfernen von Datensätzen in Access-Tabellen durchgeführt. Die Themen heute: 쐽
Zusammenarbeit zwischen Excel und Word vorbereiten
쐽
Word-Sitzung starten
쐽
Word-Sitzung ü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 von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Word.xls sowie in der Datenbankdatei Buchungen.doc im Verzeichnis Kap18.
18.1 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: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE. 3. Wählen Sie aus dem Listenfeld VERFÜGBARE VERWEISE die Bibliothek MICROSOFT WORD 10.0 OBJECT LIBRARY aus. 4. Bestätigen Sie Ihre Einstellung mit OK. Wenn Sie mit Office 2000 arbeiten, lautet der Name der Bibliothek MICROWORD 9.0 OBJECT LIBRARY. Anwender, die Office 97 im Einsatz haben, müssen die Bibliothek MICROSOFT WORD 8.0 OBJECT LIBRARY einbinden. SOFT
482
Zusammenarbeit zwischen Excel und Word vorbereiten
Abbildung 18.1: Die Word-Bibliothek einbinden
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 im ersten Dropdown-Feld den Befehl WORD ein.
Abbildung 18.2: Alle Objekte, Methoden und Eigenschaften von Word-VBA
483
Excel und Word im Zusammenspiel
18.2 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 dafür lautet: Listing 18.1: Eine Word-Sitzung starten und ein Dokument öffnen Sub WordSitzungStarten() Dim WordApp As Object Set WordApp = CreateObject("Word.application") With WordApp .Application.Visible = True .Application.Documents.Open _ ("C:\Eigene Dateien\Brief.doc") 'Beliebige Aktionen durchführen .ActiveDocument.Close SaveChanges:=False .Application.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-VBAMethode Open öffnen Sie das Dokument Brief.doc. 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 WordDokument öffnet, dieses danach wieder schließt und im Anschluss daran die Anwendung beendet.
484
Word-Sitzung übernehmen
Abbildung 18.3: Die Sitzung ist gestartet und das Dokument ist geöffnet.
18.3 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. Die Lösung: Listing 18.2: 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
485
Excel und Word im Zusammenspiel
Erzeugen Sie zuerst zwei Objektvariablen. Die erste wird die Anwendung Word, die zweite 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.
Abbildung 18.4: Die Word-Sitzung wurde übernommen.
18.4 Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen Nun soll eine bestimmte Adresse aus einer Excel-Tabelle für den Briefkopf in Word verwendet werden. Sehen Sie sich dazu einmal die Tabelle in Abbildung 18.4 an.
Abbildung 18.5: Die Adressentabelle
486
Briefkopf aus Excel-Tabelle erstellen und in ein Dokument einfügen
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 Zellen-Dropdown zu erstellen, gehen Sie wie folgt vor: 1. Setzen Sie den Mauszeiger auf Zelle A1. 2. Wählen Sie aus dem Menü DATEN den Befehl GÜLTIGKEIT.
Abbildung 18.6: 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 18.1: Die benötigten Formeln für die Adressen-Tabelle
487
Excel und Word im Zusammenspiel
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.doc transferiert werden. Das Makro für diese Aufgabe können Sie in Listing 18.3 sehen: Listing 18.3: 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
Sheets("Adressen").Activate Nachname = Range("A1").Value Vorname = Range("B1").Value Straße = Range("C1").Value PLZ = Range("D1").Value Ort = Range("E1").Value Set WordApp = CreateObject("Word.application") With WordApp .Application.Visible = True .Application.Documents.Open _ ("C:\Eigene Dateien\Brief.doc") With WordApp.Selection .WholeStory .Delete .TypeText Text:=Vorname & " " & Nachname .TypeParagraph .TypeText Text:=Straße .TypeParagraph .TypeText Text:=PLZ & " " & Ort End With .ActiveDocument.Close savechanges:=True .Application.Quit (True) End With Set WordApp = Nothing End Sub
Aktivieren Sie im ersten Schritt die Tabelle in Excel, welche Ihre Adressen 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
488
Ganze Excel-Tabellen in ein Word-Dokument einfügen
anzeigen, indem Sie die Eigenschaft Visible auf den Wert True setzen. Öffnen Sie danach über die Methode Open das Dokument Brief.doc. Momentan steht der Textcursor im Dokument ganz links oben. Dies ist 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 diesen direkt im Anschluss, indem Sie die Methode Delete einsetzen.
Abbildung 18.7: Die Adresse wurde erfolgreich eingefügt.
18.5 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 18.8 aus.
Abbildung 18.8: Die Ausgangssituation
489
Excel und Word im Zusammenspiel
Führen Sie nun den Datentransfer durch: Listing 18.4: 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 Bereich As Variant ExTab As Object i As Integer x As Integer y As Integer
Sheets("Tabelle1").Activate Bereich = ActiveSheet.UsedRange Set WordApp = CreateObject("Word.Application") WordApp.Visible = True Set WordDok = WordApp.Documents.Add With WordApp.Selection .TypeText Text:="Daten aus Excel " .TypeText Text:="vom " & Format(Now(), _ "dd-mmm-yyyy") .TypeParagraph End With Set ExTab = WordDok.Tables.Add _ (WordApp.Selection.Range, _ UBound(Bereich, 1), UBound(Bereich, 2)) With ExTab For x = 1 To UBound(Bereich, 1) For y = 1 To UBound(Bereich, 2) .Cell(x, y).Range.InsertAfter Bereich(x, y) Next y Next x End With Set Set Set End
490
WordApp = Nothing WordDok = Nothing ExTab = Nothing Sub
Word-Dokumente in einer Excel-Tabelle auflisten
Nachdem Sie nun den verwendeten Bereich in Ihrer Excel-Tabelle über die Anweisung ActiveSheet.UsedRange ermittelt und diesen in einem Datenfeld gespeichert haben, rufen Sie Ihre Textverarbeitung Word auf. Dabei setzen Sie die Funktion CreateObject ein. Über die Eigenschaft Visible teilen Sie mit, dass die Textverarbeitung auch angezeigt werden soll. Dazu setzen Sie diese Eigenschaft auf den Wert True. Erstellen Sie nun mit der Methode Add ein neues Dokument. Mit der Eigenschaft TypeText 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. 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.
Abbildung 18.9: Die Excel-Tabelle wurde erfolgreich transferiert.
18.6 Word-Dokumente in einer Excel-Tabelle auflisten Nun 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 18.5 werden die Namen der gefundenen Word-Dokumente in eine neue Tabelle geschrieben:
491
Excel und Word im Zusammenspiel
Listing 18.5: Word-Dokumente suchen und in einer Excel-Tabelle dokumentieren Sub WordDokumenteSuchen() Dim i As Integer Const verz = "C:\Eigene Dateien\" Sheets.Add ActiveSheet.Name = "Doku" ChDir verz Range("A1").Select With Application.FileSearch .NewSearch .LookIn = verz .SearchSubFolders = False .FileType = msoFileTypeWordDocuments .Execute For i = 1 To .FoundFiles.Count ActiveCell.Value = .FoundFiles(i) ActiveCell.Offset(1, 0).Select Next i End With End Sub
Zu Beginn des Makros können Sie das zu durchsuchende Verzeichnis in einer Konstanten angeben. Wechseln Sie über die Anweisung ChDir dann direkt in dieses Verzeichnis. Danach starten Sie die Suche und verwenden dabei das Objekt FileSearch, um die einzelnen Dateien im Verzeichnis zu ermitteln. Auf dieses Objekt können Sie einige Eigenschaften setzen: Die Eigenschaft NewSearch setzt alle Suchkriterien auf die Standardeinstellungen zurück. Mithilfe der Eigenschaft LookIn geben Sie bekannt, in welchem Verzeichnis die Suche beginnen soll. Die Eigenschaft SearchSubFolders bestimmt, ob die Suche auch in Unterverzeichnissen fortgesetzt werden soll. In diesem Fall müssen Sie diese Eigenschaft auf den Wert True setzen. Die Eigenschaft FileType gibt den Typ der Datei in einer Konstanten an, nach der gesucht werden soll. Möchten Sie beispielsweise nicht nur Word-Dokumente suchen lassen, sondern alle Dateitypen, dann geben Sie die Kontante msoFileTypeAllFiles an. Über die Eigenschaft FoundFiles können Sie den Namen der gefundenen Datei abfragen. Schreiben Sie diesen direkt in Ihre Excel-Tabelle. Wandeln Sie jetzt die ermittelten Dokumentnamen in Hyperlinks um (siehe Listing 18.6).
492
Word-Dokumente in einer Excel-Tabelle auflisten
Abbildung 18.10: Alle gefundenen WordDokumente
Listing 18.6: Hyperlinks einfügen Sub HyperlinksEinfügen() Sheets("Doku").Activate Range("A1").Select Do Until ActiveCell.Value = "" ActiveCell.Hyperlinks.Add ActiveCell, ActiveCell.Value ActiveCell.Offset(1, 0).Select Loop End Sub
Wenden Sie in einer Schleife die Methode Add an, um die einzelnen Hyperlinks einzufügen. In Kapitel 16 wurde diese Thematik bereits besprochen, sodass an dieser Stelle nicht näher darauf eingegangen wird.
493
Excel und Word im Zusammenspiel
Abbildung 18.11: Mit einem Klick das entsprechende Dokument öffnen
18.7 Workshop 18.7.1 Fragen & Antworten F
Wie können Sie einen Teil einer Excel-Tabelle in ein neues Dokument kopieren? A
Erfassen Sie zu diesem Zweck das folgende Makro: Listing 18.7: 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")
494
Workshop
Range(Bereich.Address).Copy WordApp.Selection.Paste Application.CutCopyMode = False Set WordApp = Nothing Set WordDok = Nothing End Sub
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. F
Wie können Sie ein Word-Makro von Excel heraus starten? A
Legen Sie ein neues Word-Dokument (Word.doc) im Verzeichnis C:\Eigene Dateien an und fügen in dieses Dokument ein Makro namens WORDMAKRO ein. Starten Sie danach aus Ihrer Excel-Entwicklungsumgebung heraus das Makro aus Listing 18.8: Listing 18.8: Ein Word-Makro starten Sub WordMakroStarten() Dim WordApp As Object Set WordApp = CreateObject("Word.Application") WordApp.Visible = True WordApp.Application.Documents.Open _ ("C:\Eigene Dateien\Word.doc") WordApp.Run "WordMakro" WordApp.Quit Set WordApp = Nothing End Sub
Deklarieren Sie 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 Visible den Wert True zuzuweisen. Öffnen
495
Excel und Word im Zusammenspiel
Sie daraufhin das Dokument Word.doc mithilfe der Methode Open. Über die Methode Run starten Sie das Makro WORDMAKRO. Beenden Sie die Word-Sitzung, indem Sie die Methode Quit einsetzen. Heben Sie am Ende den Objektverweis wieder auf, um den 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 18.9: Ein Word-Dokument als Symbol einfügen Sub DokumentObjektEinfügen() Sheets("Übung").Activate Range("B8").Select ActiveSheet.OLEObjects.Add _ (Filename:="C:\Eigene Dateien\Brief.doc", Link:= _ False, DisplayAsIcon:=True, IconFileName:= _ "C:\PROGRAMME\MICROSOFT OFFICE 97\OFFICE\WINWORD.EXE", _ IconIndex:=0, _ IconLabel:="C:\Eigene Dateien\Brief.doc").Select End Sub
Über die Methode Add erstellen Sie ein OLE-Objekt. Dabei hat diese Methode folgende Syntax: Ausdruck.Add(ClassType, FileName, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height)
Über das Argument ClassType geben Sie den Namen der Anwendung bekannt, die zum Aktivieren des angegebenen OLE-Objekts verwendet werden soll. Im Argument FileName geben Sie den Dateinamen inklusive dem Dateipfad der Datei an, aus der das Objekt erstellt werden soll. Wenn dieses Argument fehlt, wird der aktuelle Ordner verwendet. Setzen Sie das Argument Link auf den Wert True, um das OLE-Objekt mit der Datei zu 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. 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.
496
Workshop
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 18.12: Word-Dokument wurde als Symbol in die Tabelle eingefügt.
18.7.2 Quiz 1. Wie heißt die Funktion, um eine Applikations-Sitzung festzustellen? 2. Welche Eigenschaft muss man einsetzen, wenn man eine Applikation starten, diese aber nicht am Bildschirm anzeigen möchte? 3. Wie heißt die Methode, um in einem Word-Dokument eine Leerzeile einzufügen? 4. Welches Objekt können Sie einsetzen, um nach bestimmten Dateitypen auf Ihrem PC zu suchen?
497
Excel und Word im Zusammenspiel
18.7.3 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Word.xls und wechseln auf die Tabelle ÜBUNG. Schreiben Sie ein Makro, welches den Zellenbereich A1:C5 in ein neues Dokument kopiert. Dabei sollen die beiden Dateien über die Verknüpfungseigenschaft miteinander verbunden bleiben. Die Lösung können Sie im Anhang nachlesen.
498
Arbeiten an der Oberfläche – Menüund Symbolleisten programmieren
9 1
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
Am gestrigen Tag haben Sie gelernt, wie Sie eine Word-Sitzung von Excel aus starten bzw. übernehmen. Danach haben Sie Daten aus Excel-Tabellen direkt in ein Word-Dokument transferiert. Des Weiteren haben Sie Word-Dokumente in Tabellen aufgelistet und verlinkt. Die Themen heute: 쐽
Leistenart identifizieren
쐽
Menüleisten programmieren
쐽
Symbolleisten programmieren
쐽
Kontextmenüs programmieren Alle Beispiele von heute finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Leisten.xls sowie in der Datenbankdatei Buchungen.doc im Verzeichnis Kap19.
19.1 Leistenart identifizieren Standardmäßig wird in Excel die Arbeitsblatt-Menüleiste sowie die Symbolleisten STANDARD und FORMAT angezeigt. Alle Leisten können über das Objekt CommandBars angesprochen werden. Um zu wissen, ob es sich bei der jeweiligen Leiste um eine Symbolleiste, Menüleiste oder gar um ein Kontextmenü handelt, können Sie die Eigenschaft Type abfragen. Eine Symbolleiste gibt den Wert 0 zurück, eine Menüleiste den Index 1 und ein Kontextmenü den Index 2. Im nächsten Beispiel listen Sie alle Leisten von Excel in einer Tabelle auf und ermitteln über die Eigenschaft Type, ob es sich um Menüleisten, Symbolleisten oder um Kontextmenüs handelt. Hier das Makro: Listing 19.1: Leisten anhand ihres Typs identifizieren Sub ArtenVonLeisten() Dim i As Integer Dim s As String Sheets.Add Range("A1").Select For i = 1 To CommandBars.Count Select Case CommandBars(i).Type
500
Leistenart identifizieren
Case 0 s = "Symbolleiste" Case 1 s = "Menüleiste" Case 2 s = "Kontextmenü" Case Else s = "nicht ermittelbar" End Select ActiveCell.Value = i ActiveCell.Offset(0, 1).Value = CommandBars(i).Name ActiveCell.Offset(0, 2).Value = s ActiveCell.Offset(1, 0).Select Next i Columns("A:C").AutoFit End Sub
Ermitteln Sie im Makro aus Listing 19.1 zunächst alle vorhandenen Leisten von Excel, indem Sie diese mithilfe der Methode Count zählen. Über die Eigenschaft Type geben Sie die Art der Befehlsleiste zurück. Entnehmen Sie die möglichen Konstanten bzw. Indexwerte der nächsten Tabelle: Index
Konstante
Leiste
0
msoBarTypeNormal
Symbolleiste
1
msoBarTypeMenuBar
Menüleiste
2
msoBarTypePopup
Kontextmenü
Tabelle 19.1: Die möglichen Typen von Befehlsleisten
Über die Eigenschaft Name können Sie den Namen der Befehlsleiste ermitteln. Verteilen Sie diese Informationen in die Spalten A-C. Mithilfe der Methode AutoFit können Sie dafür sorgen, dass die Spaltenbreiten automatisch eingestellt werden. Wie Sie sehen, hat die Arbeitsblatt-Menüleiste beispielsweise den Index 1, d.h. über diesen Index können Sie diese Menüleiste ansprechen, wie es im nächsten Abschnitt durchgeführt wird.
501
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
Abbildung 19.1: Leisten identifizieren
19.2 Menüleisten programmieren Wenn es um die Programmierung von Menüleisten geht, dann wird in den meisten Fällen die bereits standardmäßig eingeblendete Arbeitsblatt-Menüleiste angepasst. Dabei haben Sie die Möglichkeit, neue Menübefehle in bereits bestehende Menüs einzufügen bzw. ein neues Menü innerhalb der Arbeitsblatt-Menüleiste anzubieten. Des Weiteren können Sie bestimmte Menübefehle bei Bedarf deaktivieren oder gar die ganze Menüleiste temporär aus- bzw. wieder einblenden.
Arbeitsblatt-Menüleiste ein- und ausblenden Die Arbeitsblatt-Menüleiste werden Sie dann kurzfristig ausblenden, wenn Sie bei der Arbeit mit Excel möglichst viel »Bildschirmplatz« benötigen, wie z.B. bei der Datenerfassung. In Listing 19.2 wird die Arbeitsblatt-Menüleiste ausgeblendet:
502
Menüleisten programmieren
Listing 19.2: Die Arbeitsblatt-Menüleiste ausblenden Sub ArbeitsblattMenüleisteAusblenden() Application.CommandBars(1).Enabled = False End Sub
Die Arbeitsblatt-Menüleiste wird durch das CommandBars-Objekt mit dem Index 1 eindeutig identifiziert. Setzen Sie die Eigenschaft Enabled dieser Menüleiste auf den Wert False, um diese auszublenden. Um die Arbeitsblatt-Menüleiste wieder einzublenden, setzen Sie die Eigenschaft Enabled dieser Menüleiste auf den Wert True.
Abbildung 19.2: Die Arbeitsblatt-Menüleiste wurde ausgeblendet
Übrigens können Sie die Arbeitsblatt-Menüleiste auch über ihren Namen ansprechen. Die Namen der einzelnen Leisten können Sie in Abbildung 19.1 nachsehen. Hier wird die Arbeitsblatt-Menüleiste über ihren Namen ausgeblendet: Listing 19.3: Die Arbeitsblatt-Menüleiste über den Namen ansprechen Sub ArbeitsblattMenüleisteAusblendenVar02() Application.CommandBars("Worksheet Menu Bar").Enabled _ = False End Sub
Neue Menüs einfügen und löschen Im nächsten Beispiel soll ein zusätzliches Menü in die Arbeitsblatt-Menüleiste integriert werden. Die Position des neuen Menüs soll dabei genau vor dem Hilfemenü (?) sein. Starten Sie zu diesem Zweck dieses Makro:
503
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
Listing 19.4: Ein neues Menü einfügen Sub Dim Dim Dim
MenüAnfügen() i As Integer i_Hilfe As Integer MenüNeu As CommandBarControl
i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenüNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ Before:=i_Hilfe, Temporary:=True) MenüNeu.Caption = "TO&OLS" End Sub
Deklarieren Sie eine Objektvariable vom Typ CommandBarControl, um den neuen Menüpunkt später einzufügen. Mithilfe der Methode Count zählen Sie die Anzahl der Menüs in der Arbeitsblatt-Menüleiste. Ermitteln Sie danach die Position des Hilfe-Menüs, welches standardmäßig ganz rechts in der Arbeitsblatt-Menüleiste steht. Die Arbeitsblatt-Menüleiste können Sie direkt über das Objekt CommandBars(1) ansprechen. Mithilfe der Eigenschaft Controls können Sie alle Steuerelemente der Arbeitsblatt-Menüleiste abfragen. Wenden Sie die Methode Add an, um ein neues Menü vor dem Hilfemenü einzufügen. Die Methode Add hat die Syntax: Add(Type, Id, Before, Temporary)
Das Argument Type legt die Art des Steuerelements über eine Konstante fest, die Sie in Tabelle 19.2 sehen können. Konstante
Beschreibung
msoControlButton
Über diese Konstante wird eine Schaltfläche eingefügt.
msoControlEdit
Über diese Konstante wird ein Eingabefeld eingefügt.
msoControlDropdown
Mithilfe dieser Konstante wird ein Dropdown-Feld eingefügt.
msoControlComboBox
Über diese Konstante wird ein Combobox-Feld eingefügt.
msoControlPopup
Mithilfe dieser Konstanten wird ein Dropdown-Menü eingefügt.
Tabelle 19.2: Die möglichen Steuerelemente für Leisten
Über das Argument ID haben Sie die Möglichkeit, neben dem Menütext auch noch ein Symbol anzuzeigen. Jede ID in Excel ist mit einem ganz bestimmten Symbol vorbelegt, dazu aber später mehr. Mithilfe des Arguments Before geben Sie die genaue Position des
504
Menüleisten programmieren
Menüs an. Diesem Argument übergeben Sie die vorher ermittelte Position des HilfeMenüs. Über das Argument Temporary können Sie bestimmen, ob das Steuerelement »temporär« angelegt werden soll.Wenn Sie dieses Argument auf den Wert True setzen, wird das Steuerelement beim Beenden von Excel wieder gelöscht.
Abbildung 19.3: Das neue Menü wurde angelegt
Das kaufmännische Und-Zeichen & im Makro aus Listing 19.4 wird hier genau vor dem Buchstaben O eingefügt. Dies bedeutet, dass Sie das neue Menü auch über die Tastenkombination (Alt) + (O) aktivieren können. Im Menü wird der so gekennzeichnete Buchstabe unterstrichen. Achten Sie dabei darauf, dass der ausgewählte Buchstabe nicht schon in einem anderen Menü verwendet wird. Möchten Sie das neu eingefügte Menü wieder aus der Arbeitsblatt-Menüleiste entfernen, wenden Sie die Methode Delete an. Sehen Sie sich dazu das folgende Makro an: Listing 19.5: Ein Menü löschen Sub MenüLöschen() On Error Resume Next With Application.CommandBars(1) .Controls("TO&OLS").Delete End With End Sub
Die On Error-Anweisung wird hier eingesetzt, um einen Makroabsturz zu verhindern, wenn versucht wird, das Menü TOOLS zu löschen, dieses jedoch gar nicht mehr existiert.
Menübefehle einfügen Das gerade neu angelegte Menü TOOLS enthält noch keine Menübefehle. Dies holen Sie jetzt nach, indem Sie das Makro aus Listing 19.4 erweitern. Dabei soll der Menübefehl Formeln—> Festwerte eingefügt werden.
505
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
Listing 19.6: Einen Menübefehl einfügen Sub Dim Dim Dim Dim
MenüEinfügenUndFüllen() i As Integer i_Hilfe As Integer MenüNeu As CommandBarControl MB As CommandBarControl
i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenüNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ before:=i_Hilfe, Temporary:=True) MenüNeu.Caption = "TO&OLS" Set MB = MenüNeu.Controls.Add _ (Type:=msoControlButton) With MB .Caption = _ "Formeln ---> Fe&stwerte" .Style = msoButtonIconAndCaption .OnAction = "FormelnInFestwerteWandeln" .FaceId = 350 .BeginGroup = True End With End Sub
Abbildung 19.4: Der erste Menübefehl wurde eingefügt.
Um den Menübefehl im Menü TOOLS einfügen zu können, brauchen Sie eine Objektvariable vom Typ CommandBarControl. Setzen Sie die Methode Add ein, um den neuen Menübefehl dem Menü TOOLS hinzuzufügen. Mit der Eigenschaft Caption bestimmen Sie die Beschriftung des Menübefehls. Das kaufmännische Zeichen & wird hierbei eingesetzt, um den Shortcut für diesen Befehl zu bestimmen. Bei aufgeklapptem Menü TOOLS können Sie durch die Eingabe des ShortcutBuchstabens den Menübefehl aktivieren.
506
Symbolleisten programmieren
Mithilfe der Eigenschaft FaceId können Sie dem Menübefehl auch noch ein Symbol hinzufügen. Dabei dürfen Sie aber nicht vergessen, dass hierzu die Eigenschaft Styles mit der Konstante msoButtonIconAndCaption angegeben werden muss. Wie aber sollen Sie wissen, welches Symbol hinter welcher FaceId steckt? Diese Frage wird zu einem späteren Zeitpunkt noch ausführlich beantwortet. Möchten Sie mehrere Befehle optisch schöner darstellen, können Sie über die Eigenschaft BeginGroup einen horizontalen Trennstreifen unter den jeweiligen Menübefehl setzen lassen. Damit können Sie Menübefehle, die funktionsgemäß zusammengehören, von anderen Menübefehlen absondern. Über die Eigenschaft OnAction geben Sie den Namen des Makros an, welches ausgeführt werden soll, wenn der Anwender den Menübefehl auswählt. Erfassen Sie nun das Makro, welches die Formeln einer Tabelle in Festwerte wandelt: Listing 19.7: Alle Formelzellen in Festwert-Zellen wandeln Sub FormelnInFestwerteWandeln() Dim zelle As Range For Each zelle In ActiveSheet.UsedRange zelle.Value = zelle.Value Next zelle End Sub
Über die Eigenschaft UsedRange ermitteln Sie den verwendeten Bereich einer Tabelle. Durchlaufen Sie in einer Schleife alle Zellen dieses Bereiches und ersetzen Sie die Formeln, indem Sie die Anweisung zelle.Value = zelle.Value einsetzen.
19.3 Symbolleisten programmieren Als Nächstes gehen Sie an die Programmierung von Symbolleisten heran. Auch dies wird kein Problem für Sie darstellen.
Neue Symbolleiste anlegen Wie auch schon bei der Vorgehensweise bezüglich der Menüleiste werden Sie nun Schritt für Schritt zuerst eine Symbolleiste anlegen und danach die noch leere Symbolleiste mit Symbolen füllen. Legen Sie im nächsten Beispiel in Listing 19.8 eine neue Symbolleiste an und geben Sie dieser den Namen FUNKTIONEN:
507
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
Listing 19.8: Eine neue, noch leere Symbolleiste anlegen Sub NeueSymbolleisteAnlegen() Dim SB As CommandBar On Error Resume Next Set SB = CommandBars.Add("FUNKTIONEN") With SB .Visible = True .Top = 150 .Left = 80 End With End Sub
Über die Methode Add fügen Sie eine neue Symbolleiste ein. Setzen Sie die Eigenschaft Visible auf den Wert True, damit die Symbolleiste auf dem Bildschirm angezeigt wird. Über die Eigenschaften Top und Left legen Sie die Einfügeposition (linke obere Ecke) fest.
Abbildung 19.5: Die neue Symbolleiste wurde angelegt
Um eine Symbolleiste wieder zu entfernen, starten Sie das Makro wie folgt: Listing 19.9: Eine Symbolleiste löschen Sub SymbolleisteLöschen() Dim SB As CommandBar Set SB = CommandBars("FUNKTIONEN") On Error Resume Next SB.Delete End Sub
508
Symbolleisten programmieren
Definieren Sie zunächst mithilfe der Anweisung Set, welche Symbolleiste Sie löschen möchten. Zum Löschen einer Symbolleiste wenden Sie die Methode Delete an. Denken Sie daran, die Anweisung On Error Resume Next vor den Löschbefehl zu integrieren. Damit sorgen Sie dafür, dass das Makro nicht abstürzt, wenn versucht wird, die bereits gelöschte Symbolleiste erneut zu löschen.
Symbole integrieren Kommen wir nun zur nächsten Aufgabe. Es sollen Symbole in die neu angelegte Symbolleiste integriert werden. Jedes einzelne Symbol in Excel hat eine eindeutige Kennzeichnung. Die FaceId-Eigenschaft bestimmt dabei das Aussehen, jedoch nicht die Funktion einer Befehlsleisten-Schaltfläche. Um einen Überblick über die Vielfalt der Symbole in Excel zu bekommen, erstellen Sie im nachfolgenden Makro eine neue Symbolleiste mit dem Namen SYMBOLE und fügen die ersten 500 Symbole in diese Symbolleiste ein. Die FaceID-Nummer soll dabei als Quickinfo für jedes einzelne Symbol angezeigt werden. Listing 19.10: Die Symbole mit der FaceId anzeigen Sub Dim Dim Dim
FaceIdsErmitteln() symb As CommandBar Icon As CommandBarControl i As Integer
On Error Resume Next Set symb = Application.CommandBars.Add _ ("Symbole", msoBarFloating) For i = 1 To 500 Set Icon = symb.Controls.Add(msoControlButton) Icon.FaceId = i Icon.TooltipText = i Next i symb.Visible = True End Sub
Mithilfe der Methode Add fügen Sie jeweils ein Symbol in die Symbolleiste SYMBOLE ein. Da es sich um ein Symbol handelt, muss dabei die Konstante msoControlButton mit angegeben werden. Die Eigenschaft FaceId bestimmt das Aussehen des Symbols. Über die Eigenschaft ToolTipText können Sie diese FaceId als Quickinfo anzeigen lassen. Mithilfe
509
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
der Eigenschaft Visible zeigen Sie die Symbolleiste am Bildschirm an. Setzen Sie dazu diese Eigenschaft auf den Wert True.
Abbildung 19.6: Die verfügbaren Symbole mit FaceId anzeigen
Wenn Sie mit der Maus über ein Symbol streichen, wird die FaceId des Symbols angezeigt. Möchten Sie nicht das Aussehen, sondern die Funktion eines Symbols nützen, dann müssen Sie wissen, welche ID zu welchem Symbol gehört. Im Makro in Listing 19.11 wird die Symbolleiste STANDARD untersucht. Jedes Symbol wird dabei angesteuert und dessen Bezeichnung sowie dessen ID in eine neue Tabelle geschrieben: Listing 19.11: Die IDs für die einzelnen Symbole herausschreiben Sub IDsErmitteln() Dim symb As CommandBar Dim Icon As CommandBarControl Sheets.Add Range("A1").Select On Error Resume Next Set symb = Application.CommandBars("Standard")
510
Symbolleisten programmieren
For Each Icon In symb.Controls ActiveCell.Value = Icon.TooltipText ActiveCell.Offset(0, 1).Value = Icon.ID ActiveCell.Offset(1, 0).Select Next Icon Columns("A:B").AutoFit End Sub
Mithilfe der Eigenschaft ToolTipText können Sie den Text ermitteln, der in der QuickInfo des angegebenen Befehlsleisten-Steuerelements angezeigt wird. Über die Eigenschaft ID können Sie die integrierte Aktion für dieses Steuerelement abfragen.
Abbildung 19.7: Die ID für ein Symbol bestimmen
Kommen wir nun auf unsere Symbolleiste FUNKTIONEN zurück, die momentan noch leer ist. Fügen Sie in diese Symbolleiste zwei Symbole ein: 쐽
Ein benutzerdefiniertes Symbol mit der FaceId 350 und dem Quickinfo-Text Formeln —> Festwerte
쐽
Das bereits standardmäßig zur Verfügung stehende Symbol SPEICHERN, welches Sie über die ID 3 ansprechen können
Das Makro zur Lösung sieht wie folgt aus:
511
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
Listing 19.12: Eine Symbolleiste mit Symbolen bestücken Sub NeueSymbolleisteAnlegenUndFüllen() Dim SB As CommandBar Dim icon As CommandBarControl On Error Resume Next Set SB = CommandBars.Add("FUNKTIONEN") With SB .Visible = True .Top = 150 .Left = 80 End With Set icon = SB.Controls.Add(msoControlButton) With icon .FaceId = 350 .TooltipText = "Formeln ---> Festwerte" .OnAction = "FormelnInFestwerteWandeln" End With Set icon = SB.Controls.Add(msoControlButton, ID:=3) With icon .TooltipText = "Mappe speichern" End With End Sub
Der Unterschied beim Einfügen der beiden Symbole besteht darin, dass beim ersten Symbol noch das Makro angegeben werden muss, welches dem Symbol zugewiesen werden soll. Ebenso wird das Aussehen nach eigenem Wunsch über die Eigenschaft FaceId festgelegt. Beim zweiten Symbol greifen Sie auf ein Standardsymbol zurück, bei dem das Aussehen bereits festgelegt ist. Geben Sie daher schon bei der Anlage über die Methode Add als Argument die ID an.
Abbildung 19.8: Zwei unterschiedliche Arten von Symbolen einfügen
512
Kontextmenüs programmieren
19.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. 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 FormelnInWertwerteWandeln eingefügt. Listing 19.13: 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 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.
513
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
Abbildung 19.9: 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 Fomeln —> Festwerte, den Sie vorher dem Kontextmenü hinzugefügt haben. Starten Sie zu diesem Zweck das folgende Makro: Listing 19.14: Einen Kontextmenübefehl löschen Sub ZellenkontextmenüBefehleLöschen() Dim Menü As CommandBar Set Menü = Application.CommandBars("Cell") On Error Resume Next With Menü .Controls("Formeln --> Festwerte").Delete End With End Sub
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.
514
Workshop
19.5 Workshop 19.5.1 Fragen & Antworten F
Wie können Sie ein komplettes Menü deaktivieren? A
Im folgenden Makro wird das Menü TOOLS deaktiviert: Listing 19.15: Ein Menü deaktivieren Sub KomplettesMenüDeaktivieren() On Error Resume Next Application.CommandBars(1).Controls("TO&OLS").Enabled _ = False End Sub
Mithilfe der Anweisung CommandBars(1) haben Sie Zugriff auf die ArbeitsblattMenüleiste. Über die Eigenschaft Controls geben Sie an, welches Menü Sie dort genau deaktivieren möchten. Setzen Sie die Eigenschaft Enabled für dieses Menü auf den Wert False, um es zu deaktivieren.
Abbildung 19.1: Das Menü Tools wurde deaktiviert
Setzen Sie die Eigenschaft Enabled für dieses Menü auf den Wert True, um es wieder zu aktivieren. F
Wie können Sie eine Symbolleiste vor Veränderungen schützen? A
Sie können Symbolleisten jeder Zeit anpassen, d.h. Sie können neue Symbole in die Symbolleiste aufnehmen oder Symbole aus den Leisten herausnehmen. Weiter können Sie die Position von Symbolleisten auf dem Bildschirm frei bestimmen. Möchten Sie all dies verhindern, so haben Sie die Möglichkeit, Ihre Symbolleisten zu schützen. Im nächsten Makro in Listing 19.16 wird die Symbolleiste STANDARD geschützt:
515
Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren
Listing 19.16: Die Symbolleiste Standard schützen Sub SymbolleisteSchützen() With Application.CommandBars("Standard") .Protection = _ msoBarNoChangeVisible + msoBarNoCustomize .Visible = True End With End Sub
Über die Eigenschaft Protection können Sie Ihre Symbolleisten schützen. Die Konstante msoBarNoChangeVisible sorgt dafür, dass die Symbolleiste nicht im Kontextmenü erscheint, wenn Sie mit der rechten Maustaste auf eine beliebige Symbolleiste klicken. Über die Konstante msoBarNoCustomize können Sie ein Anpassen der Symbolleiste verhindern. Es können danach keine neuen Symbole hinzugefügt bzw. Symbole aus der Symbolleiste herausgelöscht werden. F
Wie können Sie das Aufklappen des Kontextmenüs verhindern, wenn Sie mit der rechten Maustaste auf eine Symbolleiste klicke? A
F
Das Aufklappen dieses Kontextmenüs verhindern Sie, indem Sie die Anweisung Application.CommandBars("Toolbar list").Enabled = False einsetzen.
Wie können Sie das Aufklappen des Kontextmenüs verhindern, wenn Sie mit der rechten Maustaste auf die Registerkarte (unten) einer Tabelle klicken? A
Das Aufklappen dieses Kontextmenüs verhindern Sie, indem Sie die Anweisung Application.CommandBars("Ply").Enabled = False einsetzen.
F
Wie können Sie das Zellen-Kontextmenü von Excel auf den ursprünglichen Zustand zurücksetzen? A
Dazu bedarf es nur eines einzigen Befehls. Dieser Befehl lautet: Application.CommandBars("Cell").Reset.
19.5.2 Quiz 1. Wie lautet die Eigenschaft, die das Aussehen eines Symbols bestimmt? 2. Wie lautet die Eigenschaft, die die Funktion eines Symbols bestimmt? 3. Über welche Eigenschaft wird die Beschriftung eines Menübefehls festgelegt?
19.5.3 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe Leisten.xls. Schreiben Sie ein Makro, welches die Menübefehle SPEICHERN und SPEICHERN UNTER im Menü DATEI deaktiviert.
516
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
0 2
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
Am gestrigen Tag haben Sie gelernt, wie Sie Menüleisten programmieren können. Dabei haben Sie neue Menüs und Menübefehle eingefügt und wieder entfernt. Des Weiteren haben Sie Symbolleisten erstellt und Kontextmenüs programmiert. Die Themen heute: 쐽
Was sind UserForms?
쐽
UserForms entwerfen
쐽
UserForms programmieren
20.1 Was sind UserForms? Als UserForms werden in Excel Dialoge bezeichnet, die Sie selbst entwerfen, mit Steuerelementen bestücken und automatisieren können. Dabei stehen Ihnen unter anderem Steuerelemente wie Eingabe- und Textfelder, Listenfelder, Kombinationslistenfelder, Optionschaltflächen, Kontrollkästchen zur Verfügung. Mithilfe von Dialogen können Sie anwenderfreundliche Lösungen realisieren, bei denen Sie z.B. Daten erfassen und abfragen können. Heute werden Sie ein Vokabel-Lernprogramm entwerfen und programmieren. Dabei sollen u.a. folgende Funktionen integriert werden: 쐽
Eingabe von Vokabeln (Deutsch-Englisch)
쐽
Einordnen der Vokabeln in Kategorien (Sustantiv, Verb oder Adjektiv)
쐽
Einfügen dieser Vokabeln in die UserForm über einen Zufallsgenerator
쐽
Abfrage der eingegebenen Übersetzungen und Kontrollanzeige
쐽
Auf Klick sollen jeweils drei neue Vokabeln in der UserForm angezeigt werden
Dieses Vokabel-Lernprogramm werden Sie nun Schritt für Schritt erstellen.
20.2 UserForms entwerfen Im ersten Schritt werden Sie zunächst eine UserForm einfügen und mit Steuerelementen bestücken. Um die erste UserForm einzufügen, verfahren Sie wie folgt: 1. Wechseln Sie in die Entwicklungsumgebung von Excel. 2. Wählen Sie aus dem Menü EINFÜGEN den Befehl USERFORM.
518
UserForms entwerfen
Abbildung 20.1: Die erste UserForm einfügen
Standardmäßig ist die neu eingefügte UserForm recht klein. Diese können Sie vergrößern, indem Sie mit der linken Maustaste auf die rechte, untere Ecke klicken und die UserForm in der gewünschten Größe nach schräg unten aufziehen. Der Titel für die UserForm, der in der Titelleiste oberhalb der UserForm steht, wird abgeleitet vom Namen der UserForm. Um einen anderen Titel einzustellen, setzen Sie den Mauszeiger im Eigenschaften-Fenster in das Feld CAPTION und schreiben den gewünschten Titel dort hinein. Nachdem Sie die erste UserForm eingefügt haben, wird die Symbolleiste WERKZEUGSAMMLUNG eingeblendet. Diese Werkzeugsammlung nutzen Sie, um den noch leeren Dialog mit Elementen zu füllen. Entnehmen Sie der folgenden Tabelle die wichtigsten Steuerelemente der Symbolleiste WERKZEUGSAMMLUNG. Symbol
Funktionsbeschreibung Über dieses Symbol wird das entsprechende Element in der UserForm markiert. Über dieses Symbol erfassen Sie Texte in UserForm. Über dieses Symbol fügen Sie Eingabefelder ein. Über dieses Symbol wird ein Kombinationsfeld eingefügt. Mit einem Klick auf das Pfeilsymbol werden Ihnen weitere Auswahlmöglichkeiten angeboten. In einem Kombinationsfeld kann immer nur ein Eintrag gewählt werden.
Tabelle 20.1: Die wichtigsten Steuerelemente für UserForms
519
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
Symbol
Funktionsbeschreibung Über dieses Symbol wird ein Listenfeld eingefügt. Das Listenfeld benötigt jedoch mehr Platz in Ihrer UserForm, weil mehrere Einträge gleichzeitig angezeigt werden. Sind mehr Einträge im Listenfeld vorhanden, als angezeigt werden können, dann wird dynamisch eine vertikale Steuerungsleiste eingebunden. Über dieses Symbol wird ein Rahmen in Ihre UserForm eingefügt. Das Rahmen-Steuerelement können Sie einsetzen, um einzelne Elemente in einer Gruppe zusammenzufassen. Wichtig bei der Erstellung eines Rahmens ist, dass dieser vor den einzelnen Steuerelementen, die darin platziert werden sollen, eingefügt wird. Über dieses Symbol können Sie Kontrollkästchen einfügen. Bei aktiviertem Zustand erscheint im Kästchen ein Häkchen. Wenn Sie Kontrollkästchen in einer Gruppe verwenden, können sowohl eines als auch mehrere Kontrollkästchen aktiviert sein. Über dieses Symbol fügen Sie ein Optionsfeld ein. Bei aktiviertem Zustand ist das Optionsfeld mit einem schwarzen Punkt ausgefüllt. Wenn Sie mehrere Optionsfelder innerhalb einer Gruppe verwenden, kann immer nur eine Option aktiviert sein. Über dieses Symbol fügen Sie ein Umschaltfeld ein. Über dieses Umschaltfeld können Sie beispielsweise zwei Funktionen in nur einem Steuerelement unterbringen (z.B. Gitternetz ein/Gitternetz aus). Über dieses Symbol fügen Sie Befehlsschaltflächen ein, die Sie später dann mit Makros bestücken. Über dieses Symbol fügen Sie ein oder mehrere Register in Ihre UserForm ein. Damit können Sie Platz sparend viel Information in einer einzigen UserForm unterbringen. Über dieses Symbol werden Scroll-Elemente eingefügt. Dieses Steuerelement verwenden Sie bei größeren UserForms, wenn Sie horizontal oder auch vertikal scrollen müssen, um bestimmte Elemente anzuzeigen. Über dieses Symbol fügen Sie ein Drehfeld ein. Über ein Drehfeld können Sie beispielsweise Zahlen schrittweise erhöhen. Das Steuerelement wird meist in Verbindung mit einem Textfeld verwendet, in dem dann das Ergebnis des Schrittes angezeigt wird. Über dieses Symbol können Sie Grafiken, Logos oder Bilder in Ihre UserForm einfügen. Über dieses Symbol können Sie über ein Eingabefeld einen Bereich markieren bzw. auch eigene Texte eingeben und an die UserForm übergeben.
Tabelle 20.1: Die wichtigsten Steuerelemente für UserForms (Forts.)
520
UserForms entwerfen
Weitere Steuerelemente können Sie jederzeit einblenden, indem Sie mit der rechten Maustaste auf die Symbolleiste klicken und aus dem Kontextmenü den Befehl ZUSÄTZLICHE STEUERELEMENTE auswählen. Im Listenfeld VERFÜGBARE STEUERELEMENTE können Sie dann zusätzliche Steuerelemente per Mausklick Ihrer Symbolleiste hinzufügen. Ein Steuerelement können Sie in Ihre UserForm einfügen, indem Sie das gewünschte Steuerelement mit der linken Maustaste in der Symbolleiste WERKZEUGSAMMLUNG anklicken und in der gewünschten Größe und Position auf Ihrer UserForm aufziehen. Fügen Sie nun für die Erfassung der Vokabeln einige Steuerelemente ein. Orientieren Sie sich dabei an der Abbildung 20.2. Fangen Sie beim Einfügen der Steuerelemente immer mit den Gruppenfeldern (= Steuerelement RAHMEN) an. Danach legen Sie weitere Steuerelemente in das Gruppenfeld hinein.
Abbildung 20.2: Die UserForm zum Erfassen der Vokabeln
Bilder in UserForms einfügen Um ein Bild in eine UserForm zu integrieren, so wie Sie es in Abbildung 20.2 sehen können, gehen Sie wie folgt vor: 1. Klicken Sie in der Symbolleiste WERKZEUGSAMMLUNG auf das Symbol ANZEIGE. 2. Ziehen Sie dieses Steuerelement in der gewünschten Größe auf Ihrer UserForm auf. 3. Setzen Sie im Eigenschaften-Fenster den Mauszeiger in das Feld PICTURE.
521
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
4. Klicken Sie auf das Symbol mit den drei Punkten, welches ganz rechts im Feld PICTURE steht. 5. Weisen Sie im Dialogfeld BILD LADEN die gewünschte Bilddatei zu und klicken auf die Schaltfläche ÖFFNEN. Das Bild wird nun direkt in die UserForm kopiert. Momentan wird das Bild noch im umrahmten Zustand dargestellt, was in den meisten Fällen nicht sehr schön aussieht. Setzen Sie daher den Mauszeiger im Eigenschaften-Fenster in das Feld BORDERSTYLE und wählen aus dem Dropdown den Befehl 0 – FMBORDERSTYLENONE.
Horizontale Trennstreifen einfügen Wenn Sie sich Abbildung 20.2 ansehen, entdecken Sie direkt oberhalb der Schaltflächen einen horizontalen Trennstreifen. Für diesen optischen Effekt gibt es kein gesondertes Steuerelement. Sie können sich aber mit einem Trick behelfen: 1. Klicken Sie in der Symbolleiste WERKZEUGSAMMLUNG auf das Symbol RAHMEN. 2. Ziehen Sie den Rahmen in der gewünschten Größe sowie Position in Ihrer UserForm auf. 3. Im Eigenschaften-Fenster setzen Sie den Mauszeiger in das Feld CAPTION und löschen den momentanen Inhalt. 4. Im Eigenschaften-Fenster setzen Sie den Mauszeiger in das Feld HEIGHT und legen die Höhe des Rahmens fest. Da es sich um einen horizontalen Trennstreifen handelt, wählen Sie eine Höhe zwischen 8 und 10. Im Eigenschaften-Fenster können Sie über das Feld SPECIALEFFECT noch einen speziellen optischen Effekt auswählen. Dabei können Sie unter anderem entscheiden, ob der Trennstreifen hervorgehoben, versenkt oder eingefräst werden soll.
Steuerelemente beschriften Standardmäßig wird beim Einfügen der Steuerelemente schon eine Beschriftung vorgegeben, die aber noch geändert werden muss. Um ein Steuerelement wie z.B. eine Schaltfläche zu beschriften, gehen Sie nach dem Einfügen des Steuerelements wie folgt vor: 1. Markieren Sie das Steuerelement, das Sie beschriften möchten. 2. Setzen Sie im Eigenschaften-Fenster den Mauszeiger in das Feld CAPTION. 3. Erfassen Sie die gewünschte Beschriftung und drücken Sie die Taste (ÿ).
522
UserForms programmieren
Aktivierreihenfolge festlegen Standardmäßig werden die einzelnen Steuerelemente nach der Reihenfolge aktiviert, in der Sie in die UserForm eingefügt wurden, d.h. Sie springen über die Taste (ÿ) von einem Feld zum anderen. Gerade wenn Sie zu einem späteren Zeitpunkt neue Steuerelemente hinzufügen, sollten Sie die Reihenfolge anpassen. Dazu wählen Sie den Menübefehl ANSICHT/AKTIVIERREIHENFOLGE. Ist dieser Menübefehl bei Ihnen deaktiviert, dann markieren Sie vorher eines der Textfelder oder Schaltflächen auf der UserForm.
Abbildung 20.3: Die Aktivierreihenfolge ändern
Markieren Sie das entsprechende Element im Listenfeld AKTIVIERREIHENFOLGE und klicken Sie auf die Schaltfläche NACH OBEN bzw. NACH UNTEN.
20.3 UserForms programmieren Nachdem Sie im ersten Schritt die UserForm eingefügt und mit Steuerelementen bestückt haben, können Sie nun darangehen, die UserForm zu programmieren. Dabei müssen unter anderem Makros erstellt werden, die die UserForm aufrufen, die eingegebenen Daten in einer Tabelle speichern und die UserForm wieder beenden.
523
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
UserForm aufrufen Um die UserForm einmal zu testen, markieren Sie diese und drücken die Taste (F5).
Abbildung 20.4: Der erste Aufruf der UserForm
Selbstverständlich werden Sie die UserForm in Zukunft über ein Makro starten. Legen Sie das Makro aus Listing 20.1 in einem neuen Modul MODUL1 an. Listing 20.1: Eine UserForm aufrufen Sub UserFormAnzeigen() UserForm1.Show End Sub
Die Methode Show aktiviert die UserForm mit dem Namen USERFORM1. Seit Excel 2000 ist es möglich, Dialoge auch ungebunden aufzurufen, d.h. ungebundene Dialoge müssen nicht beendet werden, um mit anderen Arbeiten in Excel fortzufahren, während die UserForm geöffnet bleibt. Um eine ungebundene UserForm aufzurufen, setzen Sie die Anweisung UserForm1.Show vbModeless ein.
UserForm beenden Mit einem Klick auf die Schaltfläche ABBRECHEN in der USERFORM1 soll die Userform beendet werden. Zu diesem Zweck müssen Sie den entsprechenden Befehl hinter diese Schaltfläche legen. Verfahren Sie hierfür wie folgt: 1. Führen Sie in Ihrer UserForm einen Doppelklick auf die Schaltfläche ABBRECHEN durch. 2. Ergänzen Sie den dadurch erzeugten Programm-Rahmen wie folgt:
524
UserForms programmieren
Listing 20.2: Eine Userform beenden Private Sub CommandButton1_Click() UserForm1.Hide End Sub
Die Methode Hide blendet die UserForm aus. Damit steht die UserForm aber noch im Speicher für weitere Aktionen bereit. Möchten Sie die UserForm richtig aus dem Speicher laden, verwenden Sie die Anweisung unload me.
Speichern der eingegebenen Daten Für die nächste Funktion, das Speichern der eingegebenen Daten, müssen Sie zunächst eine kleine Vorarbeit erledigen. Sie müssen eine Tabelle anlegen, in die Sie die eingegebenen Vokabeln speichern. Erstellen Sie daher eine Tabelle nach folgendem Aufbau.
Abbildung 20.5: Die noch leere Tabelle für die Vokabeln
Sie können das Makro, um die USERFORM1 aufzurufen, direkt über eine Schaltfläche Ihrer Tabelle VOKABELN starten. Blenden Sie zu diesem Zweck die Symbolleiste FORMULAR ein, klicken auf das Symbol SCHALTFLÄCHE und ziehen es in der gewünschten Größe und Position in Ihrer Tabelle auf. Danach wird automatisch das Dialogfeld MAKRO ZUWEISEN eingeblendet, in dem Sie das Makro USERFORMANZEIGEN aus dem Listenfeld auswählen und mit OK bestätigen. Nachdem Sie die Tabelle VOKABELN angelegt haben, wechseln Sie in die Entwicklungsumgebung von Excel und klicken auf Ihrer USERFORM1 die Schaltfläche OK/ERFASSEN doppelt an. Ergänzen Sie dann das eingestellte Klick-Ereignis wie folgt:
525
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
Listing 20.3: Die eingegebenen Vokabeln speichern Private Sub CommandButton2_Click() 'Vokabeln speichern Dim frm As UserForm Set frm = UserForm1 Sheets("Vokabeln").Activate Range("A65536").End(xlUp).Offset(1, 0).Select With frm ActiveCell.Value = .TextBox1.Value ActiveCell.Offset(0, 1).Value = .TextBox2.Value If .OptionButton1.Value = True Then ActiveCell.Offset(0, 2).Value = "Substantiv" Else If .OptionButton2.Value = True Then ActiveCell.Offset(0, 2).Value = "Verb" Else ActiveCell.Offset(0, 2).Value = "Adjektiv" End If End If .TextBox1.Value = "" .TextBox2.Value = "" .OptionButton1 = False .OptionButton2 = False .OptionButton3 = False End With End Sub
Bei dem Makro CommandButton2_Click handelt es sich um ein Ereignis, d. h., immer wenn die Schaltfläche OK/ERFASSEN geklickt wird, läuft obiges Makro ab. Als Erstes wird der Begriff USERFORM1, der ja nicht gerade kurz ist, durch ein Kürzel ersetzt. Künftig können alle Elemente auf der UserForm kürzer und damit auch schneller angesprochen werden. Jetzt wird das Tabellenblatt VOKABELN aktiviert. Mit der Eigenschaft End wird die Position ermittelt, welche die Zelle am Ende der Region darstellt, die den Quellbereich enthält. Diese Vorgehensweise entspricht dem Drücken der Tastenkombination (Strg) + (¼) auf dem Tabellenblatt. Die Zahl 65.536 steht für die maximale Anzahl Zeilen pro Excel-Tabellenblatt. Innerhalb dieses Bereiches wird nach der zuletzt verwendeten Zelle gesucht und der Zellenzeiger um eine Zeile nach unten (nächste freie Zelle) versetzt. Ist das Kürzel frm einmal mit der Anweisung With angegeben, kann es weggelassen werden.
526
UserForms programmieren
In der Eigenschaft Value der Textfelder steht jeweils der vorgenommene Eintrag. Dieser Eintrag wird in die Tabelle übertragen. Dabei wird der Inhalt des ersten Textfeldes in die aktive Zelle übertragen, der Inhalt des zweiten Textfeldes wird eine Zelle weiter nach rechts verschoben eingefügt. Um festzuhalten, um welche Wortart es sich bei dem eingegebenen Wort handelt, verwenden Sie Optionsschaltflächen. Dabei kann jeweils nur eine Option möglich sein. Die Abfrage, welche Optionsschaltfläche aktiviert ist, bekommen Sie über eine If-ThenElse-Anweisung. Fragen Sie dazu die Value-Eigenschaft der ersten Optionsschaltfläche ab. Liefert diese den Wert True, ist die Optionsschaltfläche aktiviert. In diesem Fall schreiben Sie den Text SUBSTANTIV in die Spalte C, im anderen Fall schreiben Sie je nachdem den Text VERB bzw. ADJEKTIV in die Tabelle. Nach dem Speichern der Vokabel sollten Sie die Texteingabefelder löschen und die angeklickte Option im Gruppenfeld WORTART herausnehmen. Weisen Sie daher der Eigenschaft Value einen leeren Wert zu (Eingabefelder) bzw. den Wert False (Optionsfelder).
Abbildung 20.6: Die ersten Eingaben in die Tabelle Vokabeln über die UserForm eingeben
Vokabeln einfügen Die Vokabeln sollen nach dem Zufallsprinzip abgefragt werden. Dabei sollen jeweils drei Vokabeln in einem Arbeitsgang abgefragt werden. Entwerfen Sie für diesen Zweck die USERFORM2 in Abbildung 20.7.
527
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
Abbildung 20.7: Vokabeln abfragen
Direkt nach dem Aufruf der USERFORM2 sollen die Eingabefelder in der ersten Spalte mit drei zufällig ausgewählten Vokabeln gefüllt werden. Für diesen Zweck können Sie das Ereignis UserForm_Initialize einsetzen, welches automatisch ausgeführt wird, wenn Sie die UserForm aufrufen. Klicken Sie dazu auf eine freie Stelle Ihrer USERFORM2 und erfassen das folgende Ereignismakro: Listing 20.4: Die Vokabeln nach dem Zufallsprinzip einfügen Option Explicit Dim Trans1 As String Dim Trans2 As String Dim Trans3 As String Private Sub UserForm_Initialize() Dim l As Long Dim AnzVok As Long Dim frm As UserForm Dim Vok1 As String Dim Vok2 As String Dim Vok3 As String AnzVok = _ ThisWorkbook.Sheets("Vokabeln").UsedRange.Rows.Count Set frm = UserForm2 'Textfeld 1
528
UserForms programmieren
l = Int((AnzVok * Rnd) + 2) Vok1 = Cells(l, 1).Value Trans1 = Cells(l, 2).Value 'Textfeld 3 l = Int((AnzVok * Rnd) + 2) Vok2 = Cells(l, 1).Value Trans2 = Cells(l, 2).Value 'Textfeld 5 l = Int((AnzVok * Rnd) + 2) Vok3 = Cells(l, 1).Value Trans3 = Cells(l, 2).Value With frm .TextBox1.Value = .TextBox1.Enabled .TextBox3.Value = .TextBox3.Enabled .TextBox5.Value = .TextBox5.Enabled End With End Sub
Vok1 = False Vok2 = False Vok3 = False
Deklarieren Sie zuerst einmal die Variablen, um die Vokabeln und deren Übersetzung speichern zu können. Dabei werden die Variablen Trans1 bis Trans3 außerhalb des Ereignisses zu Beginn des Codeblattes deklariert. Diese Variablen benötigen Sie später noch für die Prüfung Ihrer eingegebenen Übersetzungen. Ermitteln Sie im nächsten Schritt die Anzahl der bereits erfassten Vokabeln. Setzen Sie dazu die Eigenschaft UsedRange ein, die Sie auf die Zeilen (=Rows) der Tabelle VOKABELN anwenden. Diese Information benötigen Sie, um anschließend über die Anweisung l = Int((AnzVok * Rnd) + 2) eine zufällige Vokabel aus der Tabelle VOKABELN auszuwählen. Über die Funktion Rnd erzeugen Sie diese Zufallszahl, die der Zeilennummer entspricht. Diese Zufallszahl liegt im Bereich 2 (ab Zeile 2) und der ermittelten größten Zeile, die vorher in der Variablen AnzVok gespeichert wurde. Über die Funktion Int wird diese Zufallszahl als Ganzzahl ausgegeben. Füllen Sie im Anschluss daran die Variablen Vok1 bis Vok3 und Trans1 bis Trans3 mit den ermittelten Vokabeln und deren Übersetzung. Setzen Sie für diese Aufgabe die Eigenschaft Cells ein. Im ersten Argument dieser Eigenschaft geben Sie die Zeile an, aus der die Vokabel bzw. die Übersetzung derselben entnommen werden soll. Im zweiten Argument geben Sie die Spalte an. Im Falle der Vokabelfelder ist das die Spalte A, welche Sie über den Index 1 ansprechen können. Im anderen Fall, wenn es sich um die übersetzten Vokabeln handelt, finden Sie diese Informationen in Spalte B der Tabelle VOKABELN. Setzen Sie dafür den Index 2 im zweiten Argument der Eigenschaft Cells ein.
529
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
Weisen Sie danach den Eingabefeldern die Vokabeln zu und setzen Sie die Eigenschaft Enabled auf den Wert False. Damit können diese Felder nicht mehr editiert werden.
Abbildung 20.8: Die Vokabeln über das Zufallsprinzip anzeigen
Vokabeln prüfen In der nächsten Funktion sollen die Eingaben, die Sie in den Eingabefeldern der zweiten Spalte in der USERFORM2 vorgenommen haben, geprüft werden. Haben Sie dabei die abgefragte Vokabel richtig übersetzt, dann wird das jeweilige Kontrollkästchen ganz rechts in der UserForm aktiviert. Um den dafür verantwortlichen Code zu erfassen, führen Sie in der Entwicklungsumgebung einen Doppelklick auf die Schaltfäche PRÜFEN durch. Listing 20.5: Die eingegebenen Vokabeln überprüfen Private Sub CommandButton2_Click() 'Prüfen der eingegebenen Vokabeln Dim frm As UserForm Dim Cb As Object Set frm = UserForm2 For Each Cb In frm.Controls If TypeName(Cb) = "CheckBox" Then Cb.Value = False Next Cb With frm If .TextBox2.Value = Trans1 _ Then .CheckBox1.Value = True
530
UserForms programmieren
Else .CheckBox2.Value = True End if If .TextBox4.Value = Trans2 _ Then .CheckBox3.Value = True _ Else .CheckBox4.Value = True End if If .TextBox6.Value = Trans3 _ Then .CheckBox5.Value = True _ Else .CheckBox6.Value = True End if End With End Sub
Geben Sie über die Anweisung Set an, welche UserForm Sie programmieren möchten. Sicherheitshalber sollten Sie zu Beginn des Makros alle Kreuze aus den Kontrollkästchen entfernen. Dazu durchlaufen Sie in einer Schleife alle Steuerelemente, die in der UserForm vorhanden sind. Über die Funktion TypeName können Sie die Kontrollkästchen in der Userform identifizieren. Diese Steuerelemente melden der Funktion TypeName den Text CheckBox. Achten Sie bei dieser Angabe auf die korrekte Schreibweise. Die Funktion TypeName unterscheidet zwischen Groß- und Kleinschreibung. Überprüfen Sie danach, ob die eingegebenen Übersetzungen der Vokabeln, die Sie direkt aus den Eingabefeldern Textbox2, TextBox4 und Textbox6 übernehmen können, mit den vorher bereits ermittelten Inhalten der Variablen Trans1 bis Trans3 übereinstimmen. Um das entsprechende Kontrollkästchen anzukreuzen, setzen Sie die Eigenschaft Value des Kontrollkästchens auf den Wert True.
Abbildung 20.9: Richtig oder Falsch?
531
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
Anzeigen der nächsten 3 Vokabeln Die nächste Funktion stellt sicher, dass durch einen Klick auf die Schaltfläche NÄCHSTE 3 der USERFORM2 drei neue Vokabeln in der UserForm angezeigt werden. Führen Sie zu diesem Zweck in der Entwicklungsumgebung einen Doppelklick auf die Schaltfläche NÄCHSTE 3 durch und erfassen Sie folgendes Ereignismakro: Listing 20.6: Drei neue Vokabeln einstellen Private Sub CommandButton3_Click() 'nächste 3 Vokabeln anzeigen Dim Cb As Object Dim Tb As Object For Each Tb In UserForm2.Controls If TypeName(Tb) = "TextBox" Then Tb.Value = "" Next Tb UserForm_Initialize For Each Cb In UserForm2.Controls If TypeName(Cb) = "CheckBox" Then Cb.Value = False Next Cb End Sub
Bevor Sie die nächsten drei Vokabeln in Ihrer UserForm anzeigen lassen, entfernen Sie die bisherigen Eingaben. Dazu durchlaufen Sie in einer Schleife alle Steuerelemente, die sich auf der UserForm befinden. Über die Funktion TypeName können Sie die Textfelder identifizieren und über die Eigenschaft Value, der Sie eine leere Textfolge zuweisen, löschen. Danach rufen Sie das bereits vorher erfasste Ereignis UserForm_Initialize auf, welches die Vokabeln in die UserForm einfügt und die Übersetzung der Vokabeln in Variablen schreibt. Vergessen Sie danach nicht, die Kreuze aus den Kontrollkästchen zu entfernen, wie Sie es bereits im Makro in Listing 20.5 gemacht haben.
532
Workshop
20.4 Workshop 20.4.1 Fragen & Antworten F
Wie können Sie in einer UserForm in einem Listenfeld die Namen aller Tabellenblätter anzeigen lassen? A
Fügen Sie eine neue UserForm mit einem Listenfeld ein. Erfassen Sie dann das Ereignis UserForm_Initialize, welches automatisch ausgeführt wird, wenn die UserForm aufgerufen wird. Listing 20.7: Tabellennamen in Listenfeld einlesen Private Sub UserForm_Initialize() Dim Blatt As Worksheet For Each Blatt In ThisWorkbook.Sheets ListBox1.AddItem Blatt.Name Next End Sub
Mit der Methode AddItem fügen Sie dem Listenfeld jeweils eine neue Zeile hinzu.
Abbildung 20.10: Einträge in ein Listenfeld einfügen
F
Wie können Sie erreichen, dass im soeben erstellten Listenfeld die angeklickte Tabelle aktiviert wird? A
Erfassen Sie zu diesem Zweck das folgende Ereignismakro:
533
Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren
Listing 20.8: Den ausgewählten Eintrag im Listenfeld auslesen Private Sub ListBox1_Click() ThisWorkbook.Sheets(ListBox1.Value).Activate Range("A1").Select Unload Me End Sub
Indem Sie über die Eigenschaft Value des Listenfeldes auch die Position des Eintrages innerhalb des Listenfeldes bekommen, können Sie nun direkt im Hintergrund das entsprechende Tabellenblatt aktivieren, und im Anschluss daran die UserForm schließen. F
Wie können Sie den Inhalt eines Eingabefeldes markieren? A
Standardmäßig wird ein Text in einem Eingabefeld nicht markiert. Wenn Sie beispielsweise beim Aufruf einer UserForm den Inhalt eines Textfeldes markieren möchten, fügen Sie eine neue Userform mit einem Eingabefeld sowie einer Schaltfläche ein und erfassen folgendes Ereignismakro, welches Sie direkt hinter die Schaltfläche legen: Listing 20.9: Einen Text in einem Eingabefeld komplett markieren Private Sub CommandButton1_Click() TextBox1.SetFocus TextBox1.SelStart = 0 TextBox1.SelLength = Len(TextBox1.Text) End Sub
Mithilfe der Methode SetFocus setzen Sie den Textcursor auf das Eingabefeld. Mit der Eigenschaft SelStart bestimmen Sie die Anfangsposition des zu markierenden Textes. Die Eigenschaft SelLength legt die Anzahl der zu markierenden Zeichen fest. Weisen Sie dieser Eigenschaft die Funktion Len zu, die die Gesamtzahl der eingegebenen Zeichen des Eingabefeldes ermittelt.
Abbildung 20.11: Text markieren durch Klick auf Schaltfläche
534
Workshop
20.4.2 Quiz 1. Wie lautet die Methode, um eine UserForm aufzurufen? 2. Über welche Eigenschaft können Sie die Beschriftung von Steuerelementen bestimmen? 3. Wie kann ein Eingabefeld deaktiviert werden? 4. Wie heißt das Ereignis, welches beim Starten einer UserForm automatisch ausgeführt wird?
20.4.3 Übung Zum Abschluss dieses Tages öffnen Sie die Demo-Arbeitsmappe UserForm.xls. Schreiben Sie ein Makro, welches die Ergebnisse der Vokabelabfragen in der separaten Tabelle ÜBUNG dokumentiert.
535
Erstellen von Add-Ins
1 2
Erstellen von Add-Ins
Gestern Sie gelernt, wie Sie UserForms in Excel erstellen, mit Steuerelementen bestücken und automatisieren können. Sie haben dabei Schritt für Schritt eine Lösung entwickelt, über die Sie Dialoggesteuert Vokabeln lernen können. Die Themen heute: 쐽
Was ist ein Add-In?
쐽
Add-In planen
쐽
Dynamische Anlage eines Menüs
쐽
Add-In erstellen und sichern Alle Beispiele dieses Tages finden Sie auf der mitgelieferten CD-ROM in der Arbeitsmappe Tools.xls im Verzeichnis Kap21.
21.1 Was ist ein Add-In? Add-Ins gibt es in Excel schon von Haus aus. Diese Add-Ins enthalten Zusatzfunktionen für Excel, die bei Bedarf dynamisch aktiviert werden können. Wenn Sie aus dem Menü EXTRAS den Befehl ADD-INS wählen, wird Ihnen der Add-Ins-Manager angezeigt, der einige Add-Ins zur Verfügung stellt. Diese Add-Ins können mit einem Klick aktiviert werden und die darin enthaltenen Funktionen stehen Ihnen sodann zur Verfügung. Die so eingebundenen Add-Ins bleiben auch nach dem Beenden von Excel weiterhin eingebunden. Erst wenn Sie ein Add-In über den Add-Ins-Manager deaktivieren, wird das Add-In aus der Oberfläche von Excel wieder verbannt.
21.2 Add-In planen Bevor Sie ein Add-In erstellen, legen Sie fest, welche Funktionen Sie in dieses Add-In integrieren möchten. Zu Beginn geben Sie diese Funktionen in Form von Makros in Ihrer Entwicklungsumgebung ein. Erst später wird daraus dann ein Add-In gemacht. Folgende Funktionen sollen dabei in einem separaten Menü TOOLS angeboten werden: 쐽
Dokumentation aller Formeln und Verknüpfungen einer Arbeitsmappe
쐽
Dokumentation aller verwendeten Namen einer Arbeitsmappe
쐽
Dokumentation aller Kommentare einer Arbeitsmappe
쐽
Dokumentation aller Zellen mit Hyperlinks
538
Add-In planen
Bei der Dokumentation wird jeweils eine separate Tabelle angelegt, in der die einzelnen Elemente, wie beispielsweise die Zellenadresse oder der Zelleninhalt, dokumentiert werden. Im ersten Schritt erfassen Sie die gerade genannten Makros in der Entwicklungsumgebung von Excel.
Dokumentation aller Formeln und Verknüpfungen einer Arbeitsmappe Zuerst schreiben Sie ein Makro, welches in der aktiven Arbeitsmappe alle Zellen, die entweder Formeln, Funktionen oder Verknüpfungen enthalten, auf einer separaten Tabelle dokumentiert. Dabei sollen folgende Angaben dokumentiert werden: 쐽
Zellenadresse der Formelzelle
쐽
Zelleninhalt der Formelzelle
쐽
Die Formel, Funktion oder Verknüpfung, die in der Zelle eingesetzt wird
Erfassen Sie zu diesem Zweck das nachstehende Makro: Listing 21.1: Formeln und Verknüpfungen dokumentieren Sub Dim Dim Dim Dim
FormelnDokumentieren() Tabelle As Worksheet DokuBlatt As String i As Integer zelle As Range
Worksheets.Add DokuBlatt = ActiveSheet.Name i = 1 For Each Tabelle In ActiveWorkbook.Worksheets For Each zelle In Tabelle.UsedRange If zelle.HasFormula Then With Sheets(DokuBlatt) .Cells(i, 1).Value = Tabelle.Name .Cells(i, 2).Value = zelle.Address .Cells(i, 3).Value = zelle.Value .Cells(i, 4).Value = "'" & zelle.FormulaLocal i = i + 1 End With Else End If
539
Erstellen von Add-Ins
Next zelle Next Tabelle Sheets(DokuBlatt).Activate End Sub
Fügen Sie zunächst über die Methode Add eine neue Tabelle in die aktive Arbeitsmappe ein. Danach speichern Sie den Namen der neuen Tabelle mithilfe der Eigenschaft Name in der Variablen DokuBlatt. In einer Schleife durchlaufen Sie jetzt alle Tabellenblätter, die sich in der aktiven Arbeitsmappe befinden. In einer weiteren Schleife ermitteln Sie über die Eigenschaft UsedRange den benützten Bereich der jeweiligen Tabelle. Direkt im Anschluss daran durchlaufen Sie in einer weiteren Schleife jede Zelle des benützten Bereichs. Über eine Abfrage, in der Sie die Eigenschaft HasFormula der jeweiligen Zelle abfragen, ermitteln Sie, ob die Zelle eine Formel, Funktion oder auch eine Verknüpfung enthält. Wenn ja, dann übertragen Sie den Namen der jeweiligen Tabelle (Eigenschaft Name), die Zellenadresse (Eigenschaft Address), den Zellenwert (Eigenschaft Value) und die eigentliche Formel, Funktion oder Verknüpfung (Eigenschaft FormulaLocal). Gerade bei der letzten Eigenschaft müssen Sie einen Platzhalter einsetzen, da diese sonst als Formel eingefügt wird, was in unserem Beispiel nicht gewünscht ist.
Dokumentation aller verwendeten Namen der aktiven Arbeitsmappe Im nächsten Makro ermitteln Sie die verwendeten Namen in der aktiven Arbeitsmappe und geben diese auf einer separaten Tabelle aus. Sehen Sie sich dazu das Makro in Listing 21.2 an: Listing 21.2: Alle Namen der aktiven Arbeitsmappe dokumentieren Sub AlleNamenProtokollieren() Dim BenannteBereiche As Object Worksheets.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
540
Add-In planen
Fügen Sie im ersten Schritt eine neue Tabelle über die Methode Add ein und setzen den Textcursor auf die erste Zelle A1. Danach durchlaufen Sie in einer Schleife alle verwendeten Namen, die im Auflistungsobjekt Names verzeichnet sind. Innerhalb der Schleife ermitteln Sie den Namen sowie dessen Zellenbezug, den Sie über die Methode Item abfragen können.
Dokumentation aller Kommentare einer Arbeitsmappe Im nächsten Makro werden alle Kommentare einer Arbeitsmappe in einer separaten Tabelle dokumentiert. Es lautet: Listing 21.3: Alle Kommentarzellen dokumentieren Sub Dim Dim Dim Dim
KommentareAuflisten() Notiz As Comment Tabelle As Worksheet DokuBlatt As String i As Integer
Worksheets.Add DokuBlatt = ActiveSheet.Name i = 1 For Each Tabelle In ActiveWorkbook.Worksheets For Each Notiz In Tabelle.Comments Sheets(DokuBlatt).Cells(i, 1).Value = Notiz.Text Sheets(DokuBlatt).Cells(i, 2).Value = _ Notiz.Parent.Address & " in " & Tabelle.Name i = i + 1 Next Notiz Next Tabelle Sheets(DokuBlatt).Activate With Columns("A") .ColumnWidth = 40 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With With Columns("B") .ColumnWidth = 10 .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With End Sub
541
Erstellen von Add-Ins
Fügen Sie zunächst über die Methode Add eine neue Tabelle in die aktive Arbeitsmappe ein. Danach speichern Sie den Namen der neuen Tabelle mithilfe der Eigenschaft Name in der Variablen DokuBlatt. In einer Schleife durchlaufen Sie jetzt alle Tabellenblätter, die sich in der aktiven Arbeitsmappe befinden. In einer weiteren Schleife durchlaufen Sie alle Kommentare der aktiven Tabelle, welche Sie im Auflistungsobjekt Comments finden können. Innerhalb dieser Schleife schreiben Sie den Text des Kommentars (Eigenschaft Text), die Zellenadresse des Kommentars (Eigenschaft Address) sowie den Namen der Tabelle (Eigenschaft Name) in Ihre Dokumentationstabelle. Führen Sie am Ende des Makros noch einige Anpassungen der Spalten A und B durch, indem Sie die Spaltenbreite über die Eigenschaft ColumnWidth festlegen. Die Ausrichtung dieser Spalten wird über die Eigenschaften HorizontalAlignment und VerticalAlignment über Konstanten bestimmt.
Dokumentation aller Zellen mit Hyperlinks Im letzten Makro für unser Add-In dokumentieren wir alle Hyperlinkzellen. Das Makro dafür: Listing 21.4: Alle Hyperlinkzellen dokumentieren Sub Dim Dim Dim Dim
HyperlinksAuflisten() hyper As Hyperlink Tabelle As Worksheet DokuBlatt As String i As Integer
Worksheets.Add DokuBlatt = ActiveSheet.Name i = 1 For Each Tabelle In ActiveWorkbook.Worksheets For Each hyper In Tabelle.Hyperlinks Sheets(DokuBlatt).Cells(i, 1).Value = Tabelle.Name Sheets(DokuBlatt).Cells(i, 2).Value = _ hyper.Range.Address Sheets(DokuBlatt).Cells(i, 3).Value = hyper.Address i = i + 1 Next hyper Next Tabelle Sheets(DokuBlatt).Activate End Sub
542
Dynamisches Anlegen eines Menüs
Fügen Sie zunächst über die Methode Add eine neue Tabelle in die aktive Arbeitsmappe ein. Danach speichern Sie den Namen der neuen Tabelle mithilfe der Eigenschaft Name in der Variablen DokuBlatt. In einer Schleife durchlaufen Sie jetzt alle Tabellenblätter, die sich in der aktiven Arbeitsmappe befinden. In einer weiteren Schleife durchlaufen Sie alle Hyperlinks der aktiven Tabelle. Diese Hyperlinks sind alle im Auflistungsobjekt Hyperlinks verzeichnet. Innerhalb dieser zweiten Schleife schreiben Sie den Namen der jeweiligen Tabelle (Eigenschaft Name), die Zellenadresse des Hyperlinks (Anweisung Hyper.Range.Address) sowie das angegebene Ziel des Hyperlinks (Anweisung hyper.Address) in Ihre Dokumentationstabelle.
21.3 Dynamisches Anlegen eines Menüs Da Sie jetzt die Makros bereits erfasst haben, die Sie für das Add-In bereitstellen möchten, erstellen Sie für das Add-In ein eigenes Menü, welches Sie automatisch erzeugen, wenn Sie das Add-In im Add-Ins-Manager einbinden. Für diesen Zweck können Sie das Ereignis Workbook_Open verwenden. Denken Sie auch daran, dass Sie das Menü wieder entfernen, sobald Sie die Arbeitsmappe schließen. Für diese Aufgabe können Sie das Ereignis Workbook_BeforeClose einsetzen. Beide Ereignisse erfassen Sie im Projekt-Explorer der Entwicklungsumgebung hinter dem Eintrag DIESEARBEITSMAPPE. Erfassen Sie nun die beiden Ereignisse: Listing 21.5: Das Menü Tools automatisch erzeugen Private Sub Workbook_Open() Dim i As Integer Dim i_Hilfe As Integer Dim MenüNeu As CommandBarControl Dim Mb As CommandBarControl i = Application.CommandBars(1).Controls.Count i_Hilfe = Application.CommandBars(1).Controls(i).Index Set MenüNeu = Application.CommandBars(1). _ Controls.Add(Type:=msoControlPopup, _ before:=i_Hilfe, Temporary:=True) MenüNeu.Caption = "TO&OLS" Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "&Formeln dokumentieren"
543
Erstellen von Add-Ins
.Style = msoButtonIconAndCaption .OnAction = "FormelnDokumentieren" .FaceId = 202 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Namen dokumentieren" .Style = msoButtonIconAndCaption .OnAction = "AlleNamenDokumentieren" .FaceId = 162 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Kommentare dokumentieren" .Style = msoButtonIconAndCaption .OnAction = "KommentareAuflisten" .FaceId = 48 End With Set Mb = MenüNeu.Controls.Add _ (Type:=msoControlButton) With Mb .Caption = "Hyperlinks auflisten" .Style = msoButtonIconAndCaption .OnAction = "Hyperlinks auflisten" .FaceId = 610 End With End Sub
Gleich im Anschluss erfassen Sie das Ereignis aus Listung 21.6, welches das Menü TOOLS beim Deaktivieren bzw. Schließen der Arbeitsmappe wieder entfernt. Listing 21.6: Das Menü Tools entfernen Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Application.CommandBars(1).Controls("TO&OLS").Delete End Sub
Da die Anlage eines eigenen Menüs im 19. Kapitel ausführlich besprochen wurde, entfällt an dieser Stelle eine nähere Erläuterung der Befehls-Syntax.
544
Add-In erstellen und sichern
Abbildung 21.1: Das neue Menü für das Add-In
21.4 Add-In erstellen und sichern Das Add-In erstellen Sie in vier Schritten: 쐽
Angabe der Dokumenteigenschaften
쐽
Quellcode schützen
쐽
Add-In erzeugen
쐽
Add-In einbinden
Angabe der Dokumenteigenschaften Zunächst pflegen Sie aber noch die Dokumenteigenschaften, indem Sie aus dem Menü DATEI den Befehl EIGENSCHAFTEN wählen und auf die Registerkarte ZUSAMMENFASSUNG wechseln.
Abbildung 21.2: Die Dokumenteigenschaften pflegen
545
Erstellen von Add-Ins
Die Eingabe der Dokumenteigenschaften ist wichtig, da diese Informationen später im Add-Ins-Manager angezeigt werden.
Quellcode schützen Möchten Sie den Quellcode schützen, sodass er nicht mehr angezeigt werden kann, dann befolgen Sie die nächsten Arbeitsschritte: 1. Wechseln Sie in die Entwicklungsumgebung. 2. Klicken Sie Ihr VBA-Projekt mit der rechten Maustaste an und wählen Sie den Befehl EIGENSCHAFTEN VON VBA-PROJECT aus dem Kontextmenü. 3. Wechseln Sie auf die Registerkarte SCHUTZ.
Abbildung 21.3: Das zukünftige Add-In schützen
4. Aktivieren Sie das Kontrollkästchen PROJEKT FÜR DIE ANZEIGE SPERREN. 5. Geben Sie ein Kennwort ein (z.B. »tool«). 6. Bestätigen Sie das Kennwort im darunter liegenden Feld. 7. Bestätigen Sie Ihre Aktion mit OK. Der Kennwortschutz wird beim nächsten Öffnen der Arbeitsmappe aktiv. Speichern und schließen Sie daher die Arbeitsmappe und öffnen Sie erneut.
546
Add-In erstellen und sichern
Add-In erzeugen Erstellen Sie nun aus Ihrer Arbeitsmappe Tools.xls ein Add-In. Dabei befolgen Sie folgende Arbeitsschritte: 1. Wählen Sie aus dem Menü DATEI den Befehl SPEICHERN UNTER. 2. Im Dialogfeld SPEICHERN UNTER wählen Sie aus dem Dropdown-Feld DATEITYP den Eintrag MICROSOFT EXCEL-ADD-IN(*.XLA). 3. Klicken Sie auf die Schaltfläche SPEICHERN. Nun haben Sie Ihre Arbeitsmappe Tools.xls in ein Add-In mit dem Namen TOOLS.XLA umgewandelt. Heben Sie bitte die originale Arbeitsmappe (Tools.xls) auf. Nur in dieser Arbeitsmappe können Sie Änderungen durchführen. Das daraus erstellte AddIn lässt keine Änderung des Quellcodes zu.
Add-In einbinden Binden Sie im letzten Schritt das soeben erstellte Add-In ein. Dabei verfahren Sie wie folgt: 1. Wählen Sie aus dem Menü EXTRAS den Befehl ADD-INS.
Abbildung 21.4: Das Add-In einbinden
2. Im Listenfeld VERFÜGBARE ADD-INS aktivieren Sie Ihr Add-In.
547
Erstellen von Add-Ins
3. Bestätigen Sie Ihre Wahl mit OK. Nach diesen Arbeitsschritten wird das Menü TOOLS dynamisch erzeugt. Beim Deaktivieren des Add-Ins wird dieses Menü wieder dynamisch entfernt.
548
Workshop-Lösungen
Workshop-Lösungen
Tag 1 Quiz 1. Wie rufen Sie die Entwicklungsumgebung auf? Mithilfe der Tastenkombination (Alt) + (F11). 2. Woher holt sich die Funktion Date das aktuelle Tagesdatum? Aus der Systemsteuerung von Windows. Dort finden Sie das aktuell eingestellte Tagesdatum. Anpassen können Sie das Datum, indem Sie einen Doppelklick auf die angezeigte Uhrzeit rechts unten in der Taskleiste von Windows durchführen. 3. Wie kann man schnell komplette Code-Blöcke auskommentieren? Markieren Sie den gewünschten Code-Block und klicken Sie auf der Symbolleiste BEARBEITEN das Symbol BLOCK AUSKOMMENTIEREN. 4. Welchen Befehl kann man alternativ für die Anweisung Chr(13) verwenden? Mithilfe der Konstanten VbCr können Sie ebenso einen Zeilenumbruch in einem Meldungsfenster erreichen. Sub DasDritteMakro() MsgBox "Name: " & Application.UserName & vbCr & _ "Datum: " & Date & vbCr & _ "Uhrzeit: " & Time & " Uhr" End Sub
Übung Die Einstellungen für den Ausdruck des Gitternetzes sowie der Spalten- und Zeilenbeschriftungen der Tabelle finden Sie im Menü DATEI unter dem Befehl SEITE EINRICHTEN auf der Registerkarte TABELLE. Die Ansicht der Nullwerte können Sie im Menü EXTRAS mithilfe des Befehls OPTIONEN auf der Registerkarte ANSICHT ein- bzw. ausblenden. Führen Sie diese beiden einzelnen Schritte nacheinander durch und aktivieren Sie vorher den Makrorekorder. Entfernen Sie aus der Aufzeichnung die nicht benötigten Zeilen. Als Ergebnis erhalten Sie dann folgendes Makro: Sub Makro4() ' ' Makro4 Makro ' Makro am 24.08.2002 von Bernd Held aufgezeichnet ' With ActiveSheet.PageSetup
550
Tag 2
.PrintHeadings = True .PrintGridlines = True End With ActiveWindow.DisplayZeros = False End Sub
Setzen Sie die Eigenschaften PrintHeadings und PrintGridlines auf den Wert True.
Tag 2 Quiz 1. Wie kann man eine Deklaration von Variablen standardmäßig erzwingen? Wechseln Sie in die Entwicklungsumgebung. Wählen Sie danach aus dem Menü EXTRAS den Befehl OPTIONEN. Wechseln Sie anschließend im Dialog OPTIONEN auf die Registerkarte EDITOR. Aktivieren Sie das Kontrollkästchen VARIABLENDEKLARATION ERFORDERLICH. Bestätigen Sie Ihre Einstellung mit OK. Von nun an wird die Anweisung Option Explicit in jedes Modul eingefügt, welches Sie neu einfügen. 2. Wie kann man am schnellsten sehen, welche Objektvariablen für die Programmierung zur Verfügung stehen? 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. 3. Wie lautet der Code, um eine PowerPoint-Sitzung zu starten? Den dazu notwendigen Code entnehmen Sie dem folgenden Listing: Sub PowerPointSitzungStarten() Dim PPObjekt As Object Set PPObjekt = CreateObject("PowerPoint.Application") PPObjekt.Visible = True Set PPObjekt = Nothing End Sub
551
Workshop-Lösungen
4. Wie kann man mithilfe der Funktion DatePart den Monatsnamen extrahieren? Der Quellcode für diese Aufgabe lautet wie folgt: Sub MonatsnameErmitteln() MsgBox "Das Datum von heute lautet: " & Date & Chr(13) & _ "Wir befinden uns im Monat: " & _ MonthName(DatePart("m", Date)) End Sub
Mithilfe der Funktion MonthName können Sie den Monatsnamen ausgeben. Übergeben Sie dieser Funktion den bei DatePart ermittelten Monatswert (1-12).
Tag 3 Quiz 1. Über welche Funktion kann man prüfen, ob eine Zelle ein Datum enthält? Mithilfe der Funktion IsDate können Sie überprüfen, ob eine Zelle ein Datum enthält. So lautet beispielsweise die Anweisung, um eine Zelle auf Datumsinhalt zu prüfen, wie folgt: If IsDate(ActiveCell.Value) Then MsgBox "Die Zelle enthält ein Datum" Else MsgBox "Die Zelle enthält kein Datum" End If
2. Wie kann man aus einer For...Each-Next-Schleife springen? Über die Anweisung Exit For können Sie aus einer Schleife springen, wenn eine bestimmte Bedingung auftritt.
Übung Um die Namen alle Tabellen einer Arbeitsmappe auf der ersten Tabelle in Spalte A auszugeben, erfassen Sie folgendes Makro: Sub Übung01() Dim Tabelle As Worksheet Sheets("Tabelle1").Activate Range("A1").Select
552
Tag 4
For Each Tabelle In ActiveWorkbook.Worksheets ActiveCell.Value = Tabelle.Name ActiveCell.Offset(1, 0).Select Next Tabelle End Sub
Durch die Worksheets-Auflistung gewinnen Sie Zugriff auf alle in der aktiven Arbeitsmappe befindlichen Tabellenblätter. Die Namen dieser Tabellen können Sie über die Eigenschaft Name abfragen und in die Tabelle schreiben.
Tag 4 Quiz 1. Über welche Anweisung kann man eine Meldung im Direktfenster ausgeben? Die Anweisung lautet: Debug.Print "Variableninhalt " & i. Setzen Sie Texte in Anführungszeichen, die Inhalte von Variablen können Sie direkt über den Namen der Variablen ausgeben. 2. Unterscheidet der Code-Editor zwischen Groß- und Kleinschreibung? Nein, das tut er nicht. Befehle, die klein eingegeben werden, werden automatisch teilweise in Großbuchstaben gewandelt. So wird aus der Eingabe activesheet.name der Befehl ActiveSheet.Name.
Tag 5 Quiz 1. Wie kann man die Bildschirmaktualisierung abschalten? Über die Anweisung Application.Screenupdating = False kann man die Bildschirmaktualisierung in Excel abschalten. 2. Was muss man beachten, wenn man die Statuszeile einsetzen und eigene Meldungen dort ausgeben möchte? In erster Linie muss die Statuszeile eingeblendet sein, bevor Sie diese füllen. Dies erreichen Sie, indem Sie die Anweisung Application.DisplayStatusBar = True einset-
553
Workshop-Lösungen
zen. Am Ende sollten Sie die Verwaltung der Statusleiste wieder in die Hände von Excel übergeben. Dies erreichen Sie, indem Sie die Anweisung Application.StatusBar = False einsetzen. 3. Wie kann man Standardmeldungen in Excel abschalten? Über die Anweisung Application.DisplayAlerts = False können Sie Standardmeldungen in Excel, wie beispielsweise die Meldung beim Schließen einer Arbeitsmappe, ob Änderungen gespeichert werden sollen, ausschalten. Achten Sie aber darauf, dass die so eingestellte Option auch nach dem Makroende noch von Bestand ist. Es empfiehlt sich daher, am Ende des Makros diese Option wieder auszuschalten.
Übung Um zu ermitteln, ob das Add-In Solver bereits im Add-Ins-Manager eingebunden ist, starten Sie folgendes Makro: Sub AddInsPrüfung() Dim AddI As AddIn Dim b As Boolean b = False For Each AddI In Application.AddIns If AddI.Name = "Solver" And AddI.Installed = True Then b = True Next If b = True Then MsgBox "Das Add-In Solver ist eingebunden!" _ Else MsgBox "Das Add-In Solver ist noch nicht eingebunden!" End Sub
In der AddIns-Auflistung sind alle Add-Ins von Excel verzeichnet. Über die Eigenschaft Installed können Sie prüfen, ob ein bestimmtes Add-In bereits im Add-Ins-Manager eingebunden wurde.
554
Tag 6
Tag 6 Quiz 1. Wie kann man verhindern, dass beim Öffnen einer Arbeitsmappe die Verknüpfungen zu anderen Arbeitsmappen aktualisiert werden? Sie können verhindern, dass Verknüpfungen beim Öffnen einer Arbeitsmappe aktualisiert werden, indem Sie das Argument UpdateLinks der Methode Open auf den Wert 0 setzen. 2. Was ist der Unterschied zwischen dem Befehl ActiveWorkbook und ThisWorkbook? Die Arbeitsmappe, die mit der Eigenschaft ActiveWorkbook angesprochen wird, ist jene, die momentan aktiv ist, d.h. wenn Sie aus der Entwicklungsumgebung herausspringen und in die normale Arbeitsoberfläche von Excel wechseln. Mit der Eigenschaft ThisWorkbook ist die Arbeitsmappe gemeint, in die Sie die Makros eingeben. 3. Wie kann man beim Schließen einer Arbeitsmappe dafür sorgen, dass Änderungen automatisch ohne weitere Rückfrage gespeichert werden? Geben Sie bei der Methode Close das Argument SaveChanges:=True an. Damit werden Änderungen an der Arbeitsmappe beim Schließen derselben ohne weitere Rückfrage gespeichert. 4. Wie kann man bei einer Neuanlage einer Arbeitsmappe die Anzahl der Tabellen bestimmen? Mithilfe der Eigenschaft SheetsInNewWorkbook legen Sie fest, wie viele Tabellen in einer neuen Arbeitsmappe eingefügt werden sollen. Sie haben dabei die Möglichkeit, einen Wert zwischen 1 und 255 anzugeben. 5. Was muss man beachten, wenn man die Anweisung Kill einsetzt, um eine Arbeitsmappe zu entfernen? Wenn Sie eine Arbeitsmappe mithilfe der Anweisung Kill löschen, muss diese vorher geschlossen werden. Nach dem Ausführen dieser Anweisung ist die Arbeitsmappe von Ihrer Festplatte verschwunden. Sie haben keine Möglichkeit, diese Arbeitsmappe wieder zurückzuholen.
555
Workshop-Lösungen
Übung Starten Sie das folgende Makro: Sub ArbeitsmappenÖffnenUndBearbeiten() Dim Mappe As String Const Lw = "C:\" Const Pfad = "C:\Eigene Dateien\" ChDrive Lw ChDir Pfad Mappe = Dir(Pfad & "*.xls") Do While Mappe "" Workbooks.Open Mappe Workbooks(Mappe).Sheets(1).Range("A1").Value = Date Workbooks(Mappe).Close SaveChanges:=True Mappe = Dir Loop End Sub
Bevor Sie die Arbeitsmappen nacheinander öffnen können, müssen Sie sicherstellen, dass das richtige Laufwerk sowie das gewünschte Verzeichnis eingestellt sind. Erst dann ermitteln Sie die Arbeitsmappen mithilfe der Funktion Dir, der Sie als Endung *.xls angeben. Öffnen Sie danach die einzelnen Arbeitsmappen und schreiben in die erste Tabelle einer jeden Mappe in Zelle A1 das aktuelle Datum. Beim Schließen der Arbeitsmappen speichern Sie diese Anpassung.
Tag 7 Quiz 1. Wie kann man die Standardmeldungen von Excel abschalten? Gerade beim Löschen von Tabellen ist die dabei angezeigte Bestätigungsmeldung unerwünscht. Setzen Sie die Eigenschaft DisplayAlerts auf den Wert False, um Standardmeldungen in Excel kurzfristig auszuschalten. Führen Sie dann die Methode Delete aus, um die gewünschte Tabelle zu entfernen. Setzen Sie danach die Eigenschaft DisplayAlerts auf den Wert True, um Standardmeldungen in Excel wieder zuzulassen.
556
Tag 7
2. Was müssen Sie machen, wenn Sie eine Tabelle so ausblenden möchten, dass ein Anwender diese ohne den Einsatz eines Makros nicht wieder einblenden kann? Um beispielsweise die aktive Tabelle sicher auszublenden, setzen Sie die Anweisung ActiveSheet.Visible = xlVeryHidden ein.
3. Wie können Sie eine Grafik in die Kopfzeile Ihrer Tabelle bringen? Diese Aufgabe erledigen Sie, indem Sie das folgende Makro einsetzen: Sub GrafikInKopfzeileEinfügen() With ActiveSheet.PageSetup .RightHeaderPicture.Filename = _ "C:\Eigene Dateien\Beispiel.jpg" .LeftHeader = "&G" End With End Sub
Über die Eigenschaft LeftHeaderPicture weisen Sie der linken Kopfzeile Ihrer Tabelle die angegebene Grafik zu. Neben dieser Eigenschaft gibt es weitere fünf Eigenschaften, die Sie der folgenden Tabelle entnehmen können: Eigenschaft
Beschreibung
RightHeaderPicture
Bild in der rechten Kopfzeile
CenterHeaderPicture
Bild in der Mitte der Kopfzeile
LeftFooterPicture
Bild in der linken Fußzeile
CenterFooterPicture
Bild in der Mitte der Fußzeile
RightFooterPicture
Bild in der rechten Fußzeile
Mithilfe der Eigenschaft FileName geben Sie bekannt, wo die Grafik zu finden ist und wie diese heißt. Mit der Eigenschaft RightHeader bestimmen Sie über ein Formatkürzel, was konkret passieren soll. Das Kürzel &G beispielsweise kopiert eine Grafik in die Kopf- bzw. Fußzeile. 4. Welche Formatkürzel können Sie für die Generierung von Kopf- und Fußzeilen einsetzen? Entnehmen Sie der folgenden Tabelle die möglichen Formatcodes und deren Bedeutung:
557
Workshop-Lösungen
558
Formatcode
Beschreibung
&L
Richtet nachfolgende Zeichen links aus
&C
Zentriert das nachfolgende Zeichen
&G
Kopiert eine Grafik in die Kopf- bzw. Fußzeile
&R
Richtet nachfolgende Zeichen rechts aus
&E
Schaltet Doppeltunterstreichen ein oder aus
&X
Schaltet Hochstellen ein oder aus
&Y
Schaltet Tiefstellen ein oder aus
&B
Schaltet Fettdruck ein oder aus
&I
Schaltet Kursivdruck ein oder aus
&U
Schaltet Unterstreichen ein oder aus
&S
Schaltet Durchstreichen ein oder aus
&D
Zeigt das aktuelle Datum an
&T
Druckt die aktuelle Zeit
&F
Druckt den Namen des Dokuments
&A
Druckt den Namen des Registers einer Arbeitsmappe
&P
Druckt die Seitenzahl
&P+Zahl
Druckt die Seitenzahl zuzüglich der angegebenen Zahl
&&
Druckt ein einzelnes kaufmännisches Und-Zeichen
&"Schriftart"
Druckt die nachfolgenden Zeichen in der angegebenen Schriftart; diese muss von Anführungszeichen eingeschlossen sein
&nn
Druckt die nachfolgenden Zeichen im angegebenen Schriftgrad; geben Sie eine zweistellige Zahl an, um den Schriftgrad anzugeben
&N
Druckt die Gesamtanzahl der Seiten eines Dokumentes
Tag 7
Übungen 1. Erfassen Sie folgendes Makro: Sub TabellenEinfügenMitMonatsnamen() Dim i As Integer Workbooks.Add For i = 1 To 12 Worksheets.Add Before:=Worksheets(Worksheets.Count) ActiveSheet.Name = MonthName(i) Next i End Sub
Über die Methode Add können Sie eine neue Arbeitsmappe anlegen. Danach wenden Sie wiederum die Methode Add an, um die einzelnen Tabellen einzufügen. Benennen Sie die eingefügten Tabellen, indem Sie die Eigenschaft Name verwenden. Über die Funktion MonthName können Sie die Monatsnamen (Januar bis Dezember) ermitteln. 2. Geben Sie folgendes Makro ein: Sub FormelnAusTabelleEntfernen() Dim zelle As Range Sheets("Deckungsbeitrag").Activate Selection.SpecialCells(xlCellTypeFormulas).Select For Each zelle In Selection zelle.Value = zelle.Value Next zelle End Sub
Wenden Sie die Methode SpecialCells an, der Sie die Konstante xlCellTypeFormulas zuweisen. Damit werden alle Formelzellen in der aktiven Tabelle markiert. Diese Zellen stehen jetzt alle in der Auflistung Selection. Durchlaufen Sie im Anschluss daran alle Zellen innerhalb der Markierung und überschreiben Sie die Formeln, indem Sie die Eigenschaft Value einsetzen.
559
Workshop-Lösungen
Tag 8 Quiz 1. Wie kann man mithilfe der Eigenschaft Cells eine Zelle ansteuern? Mithilfe der Eigenschaft Cells können Sie eine bestimmte Zelle ansteuern. Dabei weist diese Eigenschaft zwei Argumente auf. Das erste Argument steht für die Zeile, das zweite für die Spalte. Der Schnittpunkt aus Zeile und Spalte ergibt dann die exakte Adresse der Zelle. So repräsentiert die Anweisung Cells(1,3).Address die Zellenadresse C1. 2. Wie können Sie den verwendeten Bereich einer Tabelle bestimmen? Den verwendeten Bereich einer Tabelle bestimmen und markieren Sie über die Anweisung: ActiveSheet.UsedRange.Select. 3. Welche Methode muss man einsetzen, wenn man mehrere Bereiche vereinen möchte? Die gesuchte Methode heißt Union und hat folgende Syntax:
Union(Bereich1,
Bereich2, usw.).
4. Wie können Sie die Hintergrundfarbe der aktiven Zelle am schnellsten bestimmen? Setzen Sie den Mauszeiger auf die gewünschte Zelle und starten Sie folgendes Makro: Sub HintergrundfarbeErkennen() MsgBox "Der Farbindex lautet: " & _ ActiveCell.Interior.ColorIndex End Sub
5. Was muss man bei der Vergabe von Namen mit VBA beachten? 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 jedoch keine Rolle.
560
Tag 8
Übungen 1. 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. 2. Erfassen Sie folgendes Makro: Sub AlleNamenInMappeAuflisten() Dim BenannteBereiche As Object Dim s As String For Each BenannteBereiche In ActiveWorkbook.Names s = s & BenannteBereiche & Chr(13) Next MsgBox "Die Adressen der verwendeten Namen lauten: " & Chr(13) & s End Sub
In der Auflistung Names sind alle verwendeten Namen der aktiven Arbeitsmappe verzeichnet. Über die Objektvariable BenannteBereiche können Sie diese jetzt auslesen und am Ende des Makros in einer Bildschirmmeldung ausgeben. 3. Erfassen Sie folgendes Makro: Sub AlleNamenProtokollieren() Dim BenannteBereiche As Object Sheets.Add Range("A1").Select For Each BenannteBereiche In ActiveWorkbook.Names ActiveCell.Value = BenannteBereiche.Name
561
Workshop-Lösungen
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.
Tag 9 Quiz 1. Was ist der Unterschied zwischen den beiden Eigenschaften Formula bzw. FormulaLocal? Bei der Eigenschaft Formula wird eine Formel in der englischen Syntax zurückgegeben. Mithilfe der Eigenschaft FormulaLocal wird eine Funktion in der eingestellten Landessprache ausgegeben. Im Beispiel für die Tabellenfunktion Summe() würde die Eigenschaft Formula die Funktion Sum und die Eigenschaft FormulaLocal die Funktion Summe melden. 2. Wie heißt die Arbeitsmappe, in der eine Gegenüberstellung von englischen und deutschen Tabellenfunktionen angeboten wird? Diese Arbeitsmappe heißt VBALISTE.XLS und befindet sich in einem Unterverzeichnis von Office. 3. Mit welcher Methode kann man sich bestimmte Zellen in einer Tabelle markieren lassen? Die Methode heißt SpecialCells und Sie bestimmen über eine Konstante, welche Zellen Sie markiert haben möchten. 4. Was müssen Sie bei der Gültigkeitsprüfung in Bezug auf Datumseingaben beachten? Bei der Eingabe einer Datumsgültigkeit müssen Sie auf alle Fälle die Funktion CDate verwenden. Sie sorgt dafür, dass eine Datumsangabe wie beispielsweise ("1/1/2002") in ein gültiges Datumsformat konvertiert wird.
562
Tag 10
Übungen 1. Erfassen Sie folgendes Makro: Sub GültigkeitLöschen() ActiveCell.SpecialCells(xlCellTypeSameValidation).Select Selection.Validation.Delete End Sub
Ü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. 2. Starten Sie das folgende Makro: 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 10 Quiz 1. Wie kann man die Ereignissteuerung kurzfristig ausschalten? Setzen Sie die Eigenschaft EnableEvents auf den Wert False, um die Ereignissteuerung auszuschalten. Weisen Sie dieser Eigenschaft den Wert True zu, um die Ereignissteuerung wieder einzuschalten.
563
Workshop-Lösungen
2. Wird das Ereignis Change auch ausgelöst, wenn man die Formatierung der Zelle ändert? Nein, auf Formatierungsänderungen reagiert kein Ereignis in Excel. 3. Was muss man machen, wenn man das Ereignis Change nicht auf die ganze Tabelle, sondern nur auf eine einzige Zelle anwenden möchte? Möchten Sie nur auf eine Veränderung einer bestimmten Zelle reagieren, dann sieht die Syntax dafür wie folgt aus: Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address "$B$10" Then Exit Sub MsgBox "Änderung!" End Sub
In diesem Fall wird das Ereignis Change nur ausgeführt, wenn Sie eine Änderung in Zelle B10 vornehmen.
Übungen 1. Setzen Sie das Ereignis Activate ein, das Sie im folgenden Listing sehen: Private Sub Worksheet_Activate() Application.Calculation = xlAutomatic End Sub
Weisen Sie der Eigenschaft Calculation die Konstante xlAutomatic zu. Damit wird die Tabelle neu berechnet. 2. Das Ereignis heißt WorkBook_BeforeSave, welches im folgenden Listing angezeigt wird: 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.
564
Tag 11
Tag 11 Quiz 1. Wie lautet die Anweisung, um den AutoFilter einzuschalten? Die Anweisung lautet: ActiveSheet.AutoFilterMode = True. 2. Wie heißt die Methode, um den SpezialFilter aufzurufen? Die Methode lautet: AdvancedFilter. 3. Wie lautet die Methode, um eine Pivot-Tabelle zu aktualisieren? Die Methode lautet RefreshTable.
Übung 1. Starten Sie das folgende Makro: 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 Formatkonstante 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.
Tag 12 Quiz 1. Wie kann man den Diagrammtyp bestimmen? Über die Eigenschaft ChartType können Sie den Diagrammtyp bestimmen. Dabei weisen Sie dieser Eigenschaft eine Konstante zu, die Sie in Tabelle 12.1 einsehen können.
565
Workshop-Lösungen
2. Welchen ChartType müssen Sie wählen, um ein Kreisdiagramm einzufügen? Um ein Kreisdiagramm einzufügen, setzen Sie die Konstante xlPie ein. 3. Über welche Eigenschaft stellen Sie den größten Wert einer Skalierung ein? Die Eigenschaft lautet MaximumScale, welches Sie auf das Objekt Axes anwenden. 4. Welche Konstante müssen Sie bei der Eigenschaft Location angeben, um ein eingebettetes Diagramm in ein separates Diagrammblatt zu transferieren? Die Konstante dafür lautet: xlLocationAsNewSheet. 5. Welche zwei Argumente müssen beim Export eines Diagramms bei der Methode Export angegeben werden? Die Methode Export verwendet 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.
Übung 1. Erfassen Sie das Makro aus folgendem Listing: 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 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.
566
Tag 13
Tag 13 Quiz 1. Wie kann man das Zellenkontextmenü deaktivieren? Das Zellenkontextmenü können Sie deaktivieren, indem Sie das Ereignis Worksheet_BeforeRightClick verwenden und dabei das Argument Cancel auf den Wert True setzen. 2. Welchem Buchstaben ist das Sonderzeichen mit dem Flugzeug zugeordnet? Das Flugzeug-Symbol bekommen Sie, indem Sie den Buchstaben Q eingeben und die Zelle mit der Schriftart WINGDINGS formatieren. Das Makro, welches alle Belegungen der Schriftart WINGDINGS auflistet, finden Sie im nächsten Listing: Sub Schrifttest() Dim i As Integer Sheets.Add Range("A1").Select For i = 1 To 255 ActiveCell.Font.Name = "Wingdings" If i >= 32 Then ActiveCell.Value = Chr(i) ActiveCell.Offset(0, 1).Value = Chr(i) ActiveCell.Offset(0, 2).Value = i ActiveCell.Offset(1, 0).Select End If Next i End Sub
3. Wie kann man per Doppelklick auf eine Zelle den Inhalt dieser Zelle mit den Schriftschnitten FETT und KURSIV sowie der Schriftfarbe ROT formatieren? Um diese Aufgabe zu lösen, setzen Sie das Ereignis Worksheet_BeforeDoubleClick ein, welches Sie im folgenden Listing sehen können: Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) Target.Font.Bold = True Target.Font.Italic = True Target.Font.ColorIndex = 3 candel = True End Sub
567
Workshop-Lösungen
4. Wie kann man ein Makro um 14:00 Uhr automatisch starten lassen? Zu diesem Zweck erfassen Sie folgenden beiden Makros: Sub ZeitSteuerung02() Application.OnTime TimeValue("14:00:00"), "Aufgabe" End Sub Sub Aufgabe() 'beliebige Aufgaben durchführen... End Sub
Übung Erfassen Sie die beiden folgenden Makros: 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.
568
Tag 14
Tag 14 Quiz 1. Über welche Eigenschaft können Sie den Namen sowie den Pfad eines Verweises herausfinden? Die Eigenschaft für diese Aufgabe lautet: FullPath. 2. Wie lautet die Methode, um eine Textdatei in ein VBA-Modul einzulesen? Die Methode zum Einlesen von Textdateien in die Entwicklungsumgebung lautet: AddFromFile. Dieser Methode muss der Name der Textdatei sowie deren Speicherort
übergeben werden. 3. Schreiben Sie ein Makro, welches die beiden Module ModulNeu und ModulNeu2 aus der Arbeitsmappe entfernt. Das Makro für diese Aufgabe können Sie in folgendem Listing sehen: Sub LöschenModule() On Error Resume Next With ActiveWorkbook.VBProject .VBComponents.Remove .VBComponents("ModulNeu") .VBComponents.Remove .VBComponents("ModulNeu2") End With End Sub
4. Erfassen Sie ein Makro, welches alle Module einer Arbeitsmappe im Direktfenster der Entwicklungsumgebung ausgibt. Das Makro zur Lösung diese Aufgabe lautet: Sub ModuleAuflisten() Dim VBComp As VBComponent For Each VBComp In ThisWorkbook.VBProject.VBComponents If VBComp.Type = 1 Then Debug.Print VBComp.Name Next VBComp End Sub
569
Workshop-Lösungen
Übung Erfassen Sie das folgende Makro: 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.
Tag 15 Quiz 1. Wie muss die Anweisung lauten, damit eine benutzerdefinierte Funktion auch auf Änderungen in der Tabelle reagieren kann? Mit der Anweisung Application.Volatile sorgen Sie dafür, dass die Tabellenfunktion aktualisiert wird, wenn ein neuer Wert in der Tabelle erfasst wird. 2. Wie muss die benutzerdefinierte Funktion lauten, wenn alle Zellen addiert werden sollen, die mit der Hintergrundfarbe ROT formatiert sind? Erfassen Sie die folgende Funktion: Function ROTHD(zelle As Range) Application.Volatile For Each zelle In zelle.Cells
570
Tag 15
If IsNumeric(zelle) Then If zelle.Interior.ColorIndex = 3 Then ROTHD = ROTHD + zelle.Value End If End If Next zelle End Function
Rufen Sie die Funktion in einer beliebigen Zelle der Tabelle wie folgt auf: =ROTHD(A1:A10)
3. Über welche Methode können Sie den Inhalt einer Zelle komplett löschen? Die Methode für die aktive Zelle lautet: ActiveCell.Clear. 4. Wie heißt die persönliche Makroarbeitsmappe und wo befindet sich diese? Die persönliche Makroarbeitsmappe heißt Personl.xls und befindet sich in einem Unterverzeichnis XLStart Ihrer Office-Installation.
Übung Erfassen Sie die Funktion sowie das aufrufende Makro: 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") If b = False Then MsgBox "Die Tabelle ist in der Arbeitsmappe nicht verfügbar!" End Sub
571
Workshop-Lösungen
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 16 Quiz 1. Über welches Argument der Methode Add können Sie bestimmen, welche QuickInfo angezeigt wird, wenn Sie mit der Maus über eine Hyperlinkzelle streichen? Das Argument der Methode Add heißt ScreenTip. 2. Mit welcher Anweisung können Sie ein leeres Outlook-Kontaktobjekt anlegen? Die Anweisung dafür lautet: Set conoutlook = appOutLook.CreateItem(olContactItem)
3. Was muss beim Anlegen eines Outlook-Kontaktes aus Excel heraus beachtet werden? Erst mithilfe der Methode Save wird der Kontakt endgültig im Kontaktordner angelegt. Wenn diese Methode vergessen wird, kann der Kontakt nicht angelegt werden.
Übung Erfassen Sie das folgende Makro: 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
572
Tag 17
i = i + 1 Next Hyper End Sub
Fügen Sie im ersten Schritt eine neue Tabelle ein und benennen 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 17 Quiz 1. Warum müssen Sie die ADO-Bibliothek in Ihre Entwicklungsumgebung einbinden? 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. 2. An was müssen Sie denken, wenn Sie über die Methode AddNew einen neuen Datensatz anlegen? Nach dem Füllen des Datensatzes mit Daten müssen Sie die Methode Update einsetzen, damit der Datensatz endgültig gesichert wird. 3. Welches Argument müssen Sie einsetzen, wenn Sie eine Access-Tabelle vom Ende bis zum Anfang durchsuchen möchten? Setzen Sie das Argument Searchdirection der Methode Find auf den Wert adSearchBackward.
4. Wie heißt die Methode, um in einer Access-Tabelle jeweils zum nächsten Datensatz zu springen? Die Methode heißt: MoveNext.
Übung Erfassen Sie das folgende Makro: Sub Dim Dim Dim
DatensätzeSuchenUndÜbertragenÜbung() ADOC As ADODB.Connection DBS As ADODB.Recordset s As String
573
Workshop-Lösungen
s = "VDatum > '04.10.2002'" 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 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
574
Tag 18
Set DBS = Nothing Set ADOC = Nothing End Sub
Tag 18 Quiz 1. Wie heißt die Funktion, um eine Applikationssitzung festzustellen? Die Funktion heißt GetObject. Um beispielsweise zu prüfen, ob eine Word-Sitzung bereits gestartet wurde, setzen Sie die Anweisung Set WordApp = GetObject (, "Word.application")ein. 2. Welche Eigenschaft müssen Sie einsetzen, wenn Sie eine Applikation starten, diese aber nicht am Bildschirm anzeigen möchten? Möchten Sie eine Applikation zwar starten, diese aber im Hintergrund ablaufen lassen, dann setzen Sie die Eigenschaft Visible für diese Anwendung auf den Wert False. 3. Wie heißt die Methode, um in einem Word-Dokument eine Leerzeile einzufügen? Mit der Methode TypeParagraph fügen Sie eine leere Zeile im Dokument ein. 4. Welches Objekt können Sie einsetzen, um nach bestimmten Dateitypen auf Ihrem PC zu suchen? Für diese Aufgabenstellung können Sie das Objekt FileSearch einsetzen. Es bietet Ihnen eine ganze Reihe von Einstellungsmöglichkeiten, um die Suche näher zu bestimmen.
Übung Erfassen Sie das folgende Makro: 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
575
Workshop-Lösungen
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 19 Quiz 1. Wie lautet die Eigenschaft, die das Aussehen eines Symbols bestimmt? Die Eigenschaft lautet: FaceId. 2. Wie lautet die Eigenschaft, die die Funktion eines Symbols bestimmt? Die Eigenschaft lautet: ID. 3. Über welche Eigenschaft wird die Beschriftung eines Menübefehls festgelegt? Die Eigenschaft, die die Beschriftung eines Menübefehls festlegt, lautet: Caption.
Übung Erfassen Sie das folgende Makro: Sub MenüBefehleDeaktivieren() Dim MenüLeiste As CommandBar Dim ctrl As CommandBarControl Set MenüLeiste = CommandBars(1) For Each ctrl In MenüLeiste.Controls(1).Controls Debug.Print ctrl.Caption If ctrl.Caption = "&Speichern" Or _ ctrl.Caption = "Speichern &unter..." Then ctrl.Enabled = False Next ctrl End Sub
576
Tag 20
Über die Anweisung Debug.Print können Sie die genaue Beschriftung des Menübefehls vorab im Direktbereich ausgeben. Über die Eigenschaft Enabled können Sie einen Menübefehl deaktivieren, indem Sie diese Eigenschaft auf den Wert False setzen. Das Deaktivieren eines Menübefehls können Sie übrigens auch über die ID vornehmen. Den Menübefehl SPEICHERN könnten Sie demnach auch über die Anweisung If ctrl.ID = 3 Then ctrl.Enabled = False deaktivieren.
Tag 20 Quiz 1. Wie lautet die Methode, um eine UserForm aufzurufen? Die Methode lautet: Show. 2. Über welche Eigenschaft können Sie die Beschriftung von Steuerelementen bestimmen? Mithilfe der Eigenschaft Caption können Sie die Beschriftung von Steuerelemente festlegen. 3. Wie kann ein Eingabefeld deaktiviert werden? Sie können ein Eingabefeld deaktivieren, sodass keine Eingabemöglichkeit mehr möglich ist, indem Sie die Eigenschaft Enabled für dieses Feld auf den Wert False setzen. 4. Wie heißt das Ereignis, welches beim Starten einer UserForm automatisch ausgeführt wird? Das Ereignis lautet: UserForm_Initialize.
Übung Erfassen Sie das folgende Makro: Private Sub CommandButton2_Click() 'Prüfen Dim frm As UserForm Dim Cb As Object Set frm = UserForm2 For Each Cb In frm.Controls
577
Workshop-Lösungen
If TypeName(Cb) = "CheckBox" Then Cb.Value = False Next Cb With frm If .TextBox2.Value = Trans1 Then .CheckBox1.Value = True _ Else .CheckBox2.Value = True If .TextBox4.Value = Trans2 Then .CheckBox3.Value = True _ Else .CheckBox4.Value = True If .TextBox6.Value = Trans3 Then .CheckBox5.Value = True _ Else .CheckBox6.Value = True 'Vokabeln speichern Sheets("Übung").Activate Range("A65536").End(xlUp).Offset(1, 0).Select ActiveCell.Value = .TextBox1.Value ActiveCell.Offset(0, 1).Value = .TextBox2.Value If .CheckBox1.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).Select ActiveCell.Value = .TextBox3.Value ActiveCell.Offset(0, 1).Value = .TextBox4.Value If .CheckBox3.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).Select ActiveCell.Value = .TextBox5.Value ActiveCell.Offset(0, 1).Value = .TextBox6.Value If .CheckBox5.Value = True Then _ ActiveCell.Offset(0, 2).Value = "OK" Else _ ActiveCell.Offset(0, 2).Value = "FALSCH" ActiveCell.Offset(1, 0).Select End With Sheets("Vokabeln").Activate
End Sub
578
Listingverzeichnis
Listingverzeichnis
Hier finden Sie, nach Kapiteln zusammengefasst, alle Listings des Buches – zum Überschriftenvergleich, zum Nachschlagen
B.1 Die Entwicklungsplattform kennen lernen Listing 1.1: Listing 1.2: Listing 1.3: Listing 1.4: Listing 1.5: Listing 1.6: Listing 1.7: Listing 1.8:
Kopf- und Fußzeilen per Makro einrichten Das bereinigte Makro für die Erstellung der Kopf- und Fußzeilen Die etwas längere Form Das letzte Änderungsdatum einer Mappe ausgeben Das letzte Änderungsdatum einer geschlossenen Datei ausgeben Den Monatsnamen ausgeben Eine benutzerdefinierte Meldung anzeigen Ein Makro mit Dokumentation
35 36 37 40 40 40 46 49
B.2 Datentypen, Variablen und Konstanten Listing 2.1: Listing 2.2: Listing 2.3: Listing 2.4: Listing 2.5: Listing 2.6: Listing 2.7: Listing 2.8: Listing 2.9: Listing 2.10: Listing 2.11: Listing 2.12: Listing 2.13: Listing 2.14: Listing 2.15: Listing 2.16: Listing 2.17: Listing 2.18: Listing 2.19: Listing 2.20: Listing 2.21: Listing 2.22:
Variableninhalt bleibt nach Makroende erhalten Den Office-Assistenten aufrufen und animieren Eine Schaltfläche einfügen Excel ohne Rückfrage beenden Ein eingebettetes Diagramm exportieren Die Arbeitsblatt-Menüleiste ausblenden Die Arbeitsblatt-Menüleiste wieder einblenden Textdatei als Symbol in eine Tabelle einfügen Eine Grafik wird in die Tabelle eingefügt Word-Sitzung starten und Dokument anlegen Den Inhalt einer Variablen in die Zwischenablage bringen Den Inhalt der Zwischenablage in einer Zelle ausgeben Das Add-In Analyse-Funktionen wird bei Bedarf installiert Zeichenobjekt über Zellenbereich legen AutoForm aus Tabelle entfernen Verschiedene Datums- und Zeitformate Das Quartal des aktuellen Tagesdatums ermitteln Den aktuellen Wochentag bestimmen Den Wochentag über eine Funktion ermitteln Einen zukünftigen Wochentag ermitteln Einen Kommentar einfügen Einen Hyperlink einfügen
68 72 73 74 75 77 77 78 79 80 82 83 85 85 86 89 92 93 94 94 95 95
B.3 Die Sprachelemente von VBA Listing 3.1: Listing 3.2:
580
Prüfen, ob Zelle leer oder gefüllt ist Überprüfen des genauen Zelleninhalts
100 101
Listingverzeichnis
Listing 3.3: Listing 3.4: Listing 3.5: Listing 3.6: Listing 3.7: Listing 3.8: Listing 3.9: Listing 3.10: Listing 3.11: Listing 3.12: Listing 3.13: Listing 3.14: Listing 3.15: Listing 3.16: Listing 3.17: Listing 3.18: Listing 3.19: Listing 3.20:
Datumsprüfung vornehmen Numerisch oder alphanumerisch Excel-Version ermitteln Zahlenwerte überprüfen Fensterstatus der Anwendung ermitteln Zahlen um einen bestimmten Prozentsatz erhöhen Dynamische Schleife Liniertes Papier herstellen Tabellennamen sammeln und ausgeben Zellen in Zielbereich untersuchen Einheitliche Kopf- und Fußzeilen erzeugen Alle Excel-Arbeitsmappen eines Verzeichnisses werden gezählt Jede dritte Zeile löschen Alle Bindestriche wurden ersetzt Länge von Eingaben messen und reagieren Alle roten und fetten Zahlen sollen summiert werden Alle geöffneten Arbeitsmappen ausgeben Alle aktivierten Add-Ins ausgeben
101 104 105 106 107 110 111 111 112 114 115 117 120 122 124 125 126 127
B.4 Auf Fehlersuche mit VBA Listing 4.1: Listing 4.2: Listing 4.3: Listing 4.4: Listing 4.5: Listing 4.6:
Den Direktbereich von Excel füllen Mehrere Schleifendurchläufe Daten von einer Tabelle auf eine andere übertragen Eine Fehlerbehandlungsroutine aufsetzen Eine eige Symbolleiste erstellen und wieder löschen Symbolleiste löschen ohne Fehlermeldung
133 135 136 142 143 144
B.5 Einstellen und Anpassen der Excel-Anwendung Listing 5.1: Listing 5.2: Listing 5.3: Listing 5.4: Listing 5.5: Listing 5.6: Listing 5.7: Listing 5.8: Listing 5.9: Listing 5.10: Listing 5.11: Listing 5.12:
Vollbildansicht einstellen Vollbildansicht beenden Makros automatisch ausführen lassen bei Blatt(de)aktivierung Die Ansicht von Excel bestimmen Bildschirmaktualisierung ein- und ausschalten Die automatische Berechnung aus- und einschalten Die Statusleiste benutzen Die Suchergebnisse in der Statusleiste anzeigen Das aktive Tabellenblatt wird ohne Nachfrage gelöscht Eine benutzerdefinierte Liste anlegen Eine Liste über einen Zellenbezug anlegen Drag&Drop ausschalten
148 149 149 151 153 153 154 155 157 158 159 160
581
Listingverzeichnis
Listing 5.13: Listing 5.14: Listing 5.15: Listing 5.16: Listing 5.17: Listing 5.18: Listing 5.19: Listing 5.20: Listing 5.21: Listing 5.22:
Auflistung der eingebundenen Add-Ins Die Wiedervorlageliste verbergen Die Wiedervorlageliste festlegen Die Vorlageliste bereinigen Allgemeine Einstellungen vornehmen Einheitliches Zoom auf allen Tabellen einstellen Den Aufenthaltsbereich bestimmen Den Aufenthaltsbereich immer wieder neu einstellen Alle Arbeitsmappen der Vorlageliste werden ausgegeben Den Speicherpfad einer Mappe ermitteln
160 162 162 163 164 165 166 167 168 168
B.6 Auf Arbeitsmappen zugreifen – Datei-Operationen Listing 6.1: Listing 6.2: Listing 6.3: Listing 6.4: Listing 6.5: Listing 6.6: Listing 6.7: Listing 6.8: Listing 6.9: Listing 6.10: Listing 6.11: Listing 6.12: Listing 6.13: Listing 6.14: Listing 6.15: Listing 6.16: Listing 6.17: Listing 6.18: Listing 6.19: Listing 6.20: Listing 6.21:
Eine Arbeitsmappe ohne Aktualisierung von Verknüpfungen öffnen Den Dialog Öffnen anzeigen Mehrere Mappen können im Dialog Öffnen markiert werden Alle geöffneten Arbeitsmappen im Überblick Eine Arbeitsmappe speichern Eine Arbeitsmappe im Dialogfeld Speichern unter anzeigen Einen eigenen Namen bestimmen Alle geöffneten Arbeitsmappen speichern Arbeitsmappe mit Datum/Uhrzeit benennen Prüfung durchführen, ob Arbeitsmappe geändert wurde Aktive Mappe schließen – Änderungen speichern Aktive Mappe schließen – Änderungen verwerfen Alle Mappen bis auf eine schließen Neue Arbeitsmappe einfügen Alle Mappen aus einem Verzeichnis werden zusammenkopiert Arbeitsmappe ohne Rückfrage löschen Alle Dokumenteigenschaften auslesen Nahezu alle Dokumenteigenschaften wurden gesetzt Das Erstellungsdatum und das letzte Änderungsdatum ausgeben Alle verknüpften Arbeitsmappen dokumentieren Verknüpfungen ändern
174 175 176 177 178 179 180 181 182 183 183 184 184 185 185 187 188 190 192 193 195
B.7 Tabellenblätter programmieren Listing 7.1: Listing 7.2: Listing 7.3: Listing 7.4:
582
Tabellen einfügen und benennen Tabellen einfügen und Reihenfolge beibehalten Blätter einer Arbeitsmappe identifizieren Das aktuelle Datum in allen Tabellenblättern eintragen
198 199 200 201
Listingverzeichnis
Listing 7.5: Listing 7.6: Listing 7.7: Listing 7.8: Listing 7.9: Listing 7.10: Listing 7.11: Listing 7.12: Listing 7.13: Listing 7.14: Listing 7.15: Listing 7.16: Listing 7.17: Listing 7.18: Listing 7.19: Listing 7.20: Listing 7.21: Listing 7.22: Listing 7.23: Listing 7.24: Listing 7.25: Listing 7.26: Listing 7.27: Listing 7.28: Listing 7.29: Listing 7.30: Listing 7.31: Listing 7.32: Listing 7.33:
Tabellenblätter überprüfen Eine Tabelle löschen Eine Tabelle ohne Rückfrage löschen Eine eigene Löschmeldung anzeigen Erst nach einer Überprüfung die Tabelle löschen Eine Tabelle in eine Textdatei transferieren Tabelle in neue Arbeitsmappe kopieren Tabelle in neue Arbeitsmappe übertragen Eine Tabelle in eine bereits bestehende Arbeitsmappe kopieren/übertragen Eine Textdatei in Excel einlesen Nur bestimmte Spalten aus der Textdatei einlesen Einlesen einer Textdatei mit variabler Satzlänge Eine Textdatei mit alternativem Trennzeichen wird eingelesen Eine Tabelle ausblenden Eine Tabelle wieder einblenden Alle Tabellen bis auf eine ausblenden Blätter sicher bis auf das letzte ausblenden Alle versteckten Blätter wieder einblenden Bestimmte Tabellen gruppieren Tabellen über ihren Index gruppieren Alle Tabellen einer Mappe gruppieren Die Tabelle1 wird geschützt Nur Formelzellen wurden geschützt Änderungen an geschützten Tabellen vornehmen Einen eingabefreien Bereich trotz Blattschutz definieren Die Blätter einer Arbeitsmappe sortieren Die Kopf- und Fußzeile festlegen Die Einstellungen für die Kopf- und Fußzeile für alle Tabellen der Arbeitsmappe übernehmen Die Filterfunktion trotz Blattschutz erhalten
202 202 203 203 204 206 207 208 209 210 212 214 215 216 216 217 218 219 220 221 222 224 226 226 227 228 230 231 232
B.8 Zellenbearbeitung mit VBA Listing 8.1: Listing 8.2: Listing 8.3: Listing 8.4: Listing 8.5: Listing 8.6: Listing 8.7:
Zelle markieren und Koordinaten ausgeben Einen Zellenbereich markieren und ausgeben Mehrere Bereiche markieren und ausgeben Drei weitere Zellen nach rechts werden in die Auswahl mit aufgenommen Relative Markierung mit Fehlerbehandlung Ansteuern einer Zelle über die Eigenschaft Cells Einen Bereich über die Eigenschaft Cells markieren
238 239 240 242 243 244 244
583
Listingverzeichnis
Listing 8.8: Listing 8.9: Listing 8.10: Listing 8.11: Listing 8.12: Listing 8.14: Listing 8.15: Listing 8.16: Listing 8.17: Listing 8.18: Listing 8.19: Listing 8.20: Listing 8.21: Listing 8.22: Listing 8.23: Listing 8.24: Listing 8.25: Listing 8.26: Listing 8.27: Listing 8.28: Listing 8.29: Listing 8.30:
Den verwendeten Bereich einer Tabelle ermitteln Den umliegenden Bereich einer Zelle markieren Bereiche initialisieren Buchungspositionen kennzeichnen Farbindex und Farbe ermitteln Alle Hintergrundfarben von Zellen in einer Tabelle entfernen Eine andere Schriftart bzw. Schriftgröße einstellen Die Schriftschnitte Fett und Kursiv bei Bedarf zuweisen Einen Bereich mit einem Rahmen versehen Den Tausenderpunkt in das Zahlenformat einbauen Jegliche Formatierung innerhalb der Markierung wird gelöscht Datumsformat zuweisen Namen vergeben Namen aus der Arbeitsmappe entfernen Kommentare auflisten Kommentare aus Zelleninhalten bilden Kommentare in Zellen überführen Kommentare löschen im markierten Bereich Alle Kommentare aus einer Tabelle entfernen Alle Kommentare aus der Arbeitsmappe entfernen Die letzten fünf Zellen einer Spalte markieren Leerzeichen aus Zellen entfernen
245 246 247 250 251 252 252 255 257 259 260 260 262 264 264 267 268 269 269 270 270 271
B.9 Formeln, Tabellenfunktionen und Sonstiges rund um die Zellenprogrammierung Listing 9.1: Listing 9.2: Listing 9.3: Listing 9.4: Listing 9.5: Listing 9.6: Listing 9.7: Listing 9.8: Listing 9.9: Listing 9.10: Listing 9.11: Listing 9.12: Listing 9.13: Listing 9.14:
584
Numerische Zellen werden gezählt und summiert Eine Subtraktion von Datumswerten Preise erhöhen und runden Alte DM-Beträge in Euro umrechnen Die Summe der neuen Preise werden ermittelt Eine Tabellenfunktion in eine Zelle einfügen (Var. 1, mit deutschen Befehlen) Eine Tabellenfunktion in eine Zelle einfügen (Var. 2, mit englischen Befehlen) Das Alter mithilfe der Tabellenfunktion DATEDIF ermitteln Die ältesten Personen über die Funktion Rank bestimmen Die bedingte Summierung von Werten Die Tabellenfunktion bleibt als Funktion in der Tabelle erhalten Eine bedingte Zählung durchführen Die Tabellenfunktion wird als Funktion eingefügt Alle numerischen Werte einer Liste zählen
275 277 278 280 282 283 283 285 286 287 288 288 289 290
Listingverzeichnis
Listing 9.15: Listing 9.16: Listing 9.17: Listing 9.18: Listing 9.19: Listing 9.20: Listing 9.21: Listing 9.22: Listing 9.23: Listing 9.24: Listing 9.25: Listing 9.26:
Alle gefüllten Zellen werden gezählt Die Zählfunktionen in die Tabelle einfügen Zählen von alphanumerischen Zellen Die Anzahl der leeren Zellen eines Bereichs ermitteln Leerzeichen aus markierten Zellen entfernen Formelzellen in einer Tabelle markieren Alle Formeln und Funktionen werden in einer neuen Tabelle dokumentiert Nur ganze Zahlen zwischen 1 bis 10 dürfen eingegeben werden Datumsgrenzen als Gültigkeit festlegen Eine Gültigkeitsliste erstellen Die zweitgrößte Zahl in einem Bereich ausgeben Formelzellen in einer Tabelle zählen
291 292 293 293 294 296 297 301 304 305 306 307
B.10 Aktionen und Benutzereingaben überwachen Listing 10.1: Listing 10.2: Listing 10.3: Listing 10.4: Listing 10.5: Listing 10.6: Listing 10.7: Listing 10.8: Listing 10.9: Listing 10.10: Listing 10.11:
Beim Öffnen eine bestimmte Tabelle aktivieren Das Schließen einer Arbeitsmappe verhindern Speichern ist nur über eine Bedingung möglich Die Neuanlage von Tabellen überwachen Das letzte Zugangsdatum der Tabelle festhalten Alle Änderungen in der Tabelle einfärben Einen Bereich überwachen Einen dynamischen Zeilenzeiger programmieren Das Ereignis Calculate wird bei Änderungen in der Tabelle ausgeführt Alle Pivot-Tabellen der Arbeitsmappe werden beim Öffnen aktualisiert Den Namen einer Tabelle aus der Zelle C1 beziehen
312 313 314 314 317 319 321 322 324 325 325
B.11 Große Datenmengen in VBA behandeln und auswerten Listing 11.1: Listing 11.2: Listing 11.3: Listing 11.4: Listing 11.5: Listing 11.6: Listing 11.7: Listing 11.8: Listing 11.9:
Den AutoFilter aktivieren Das Filterkriterium einstellen Mehrere Filter einsetzen Mehrere Filter setzen Filterkriterium aus Zelle beziehen Die Mitarbeiter mit den höchsten 10 Nummern werden angezeigt Filterung von Daten mit anschließender Sortierung Die eingestellten (aktiven) Filter ermitteln Eine Unikatsliste erstellen
329 330 332 332 333 334 335 336 338
585
Listingverzeichnis
Listing 11.10: Listing 11.11: Listing 11.12: Listing 11.13: Listing 11.14: Listing 11.15: Listing 11.16:
Gefilterte Daten in neue Arbeitsmappe kopieren Die gefilterten Daten in eine Textdatei überführen Eine Pivot-Tabelle erstellen Eine Pivot-Tabelle aktualisieren Eine Pivot-Tabelle dynamisch erweitern und aktualisieren Die gefilterten Zeilen zählen Die erste gefilterte Zeile ermitteln
339 340 343 345 346 347 347
B.12 Daten grafisch darstellen Listing 12.1: Listing 12.2: Listing 12.3: Listing 12.4: Listing 12.5: Listing 12.6: Listing 12.7: Listing 12.8: Listing 12.9:
Das Säulendiagramm erstellen Ein Balkendiagramm erstellen Temperaturverläufe in einem Liniendiagramm darstellen Die Skalierung des Diagramms selbst bestimmen Den Speicherort des Diagramms bestimmen Säulen unterschiedlich einfärben Diagramm als Grafik-Objekt exportieren Alle Diagrammblätter aus Arbeitsmappe entfernen Die Legende formatieren
352 354 356 359 360 361 363 364 364
B.13 Tastatur- und Zeitsteuerung in Excel Listing 13.1: Listing 13.2: Listing 13.3: Listing 13.4: Listing 13.5: Listing 13.6: Listing 13.7: Listing 13.8: Listing 13.9: Listing 13.10: Listing 13.11: Listing 13.12: Listing 13.13: Listing 13.14: Listing 13.15:
586
Alle Formelzellen in Markierung durch Festwerte ersetzen Die Tastenkombination (Strg) + (Ü) ist somit aktiviert Die Tastenkombination (Strg) + (Ü) wieder deaktivieren Die Tastenkombination (Alt) + (F11) wird deaktiviert Die Tastenkombination (Alt) + (F11) wird wieder aktiviert Lediglich Werte werden eingefügt Beim Öffnen der Arbeitsmappe wird die Tastenkombination festgelegt Beim Schließen der Arbeitsmappe wird die Tastenkombination deaktiviert Sonderzeichen einfügen Die Tastenkombinationen beim Öffnen der Arbeitsmappe festlegen Die einzelnen Zeichen einer Schriftart abfragen Das Kontextmenü wird nicht heruntergeklappt Das Kontextmenü in einem vorgegebenen Bereich deaktivieren Das Zellenkontextmenü für alle Tabellen ausschalten Deaktivierung des Kontextmenüs nur in bestimmten Tabellen zulassen
369 370 372 373 373 374 374 374 375 375 376 378 379 380 380
Listingverzeichnis
Listing 13.16: Listing 13.17: Listing 13.18: Listing 13.19: Listing 13.20: Listing 13.21: Listing 13.22: Listing 13.23: Listing 13.24: Listing 13.25: Listing 13.26: Listing 13.27: Listing 13.28: Listing 13.29: Listing 13.30: Listing 13.31:
Über das Klicken mit der rechten Maustaste wird die Zelle gefärbt/ entfärbt Das Haken-Symbol per rechtem Mausklick einfügen Den Doppelklick deaktivieren Die Mausklicks in mehreren Bereichen überwachen Eine Zelle aufaddieren Zufallszahlen erzeugen per Doppelklick Die Zeitansage in Excel Die aktuelle Uhrzeit in der Statusleiste ausgeben Nach genau einer Minute wird das Makro ExcelEnde gestartet Arbeitsmappen speichern und Excel beenden Um 16:00 Uhr wird die Verarbeitung gestartet Dieses Makro wird um 16:00 ausgeführt Die Tastenkombinationen wurden deaktiviert Tastenkombinationen wieder zurücksetzen Symbolleisten-Kontextmenü deaktivieren Definierten Bereich kopieren und weiter verwenden
381 382 384 384 386 387 388 389 390 390 390 391 391 392 392 392
B.14 Makros mit VBE-Programmierung dynamisch erzeugen, importieren und exportieren Listing 14.1: Listing 14.2: Listing 14.3: Listing 14.4: Listing 14.5: Listing 14.6: Listing 14.7: Listing 14.8: Listing 14.9: Listing 14.10: Listing 14.11: Listing 14.12: Listing 14.13: Listing 14.14: Listing 14.15: Listing 14.16: Listing 14.17: Listing 14.18: Listing 14.19: Listing 14.20:
Die VBE-Bibliothek per Code einbinden Alle gesetzten Verweise abfragen Informationen zu den gesetzten Verweisen ermitteln Die OLE-Bibliothek einbinden Die OLE-Bibliothek deaktivieren Die VBE-Bibliothek deaktivieren Neues Modul anlegen und Code importieren Alle geöffneten Mappen mit Quellcode versorgen Ein Makro Zeile für Zeile erfassen Den Quellcode in einer Textdatei sichern Ein Modul mit allen Makros drucken Ein bestimmtes Modul löschen Alle Module aus einer Arbeitsmappe entfernen Ein bestimmtes Makro finden und löschen Alle Ereignisse, die hinter der Tabelle1 stehen, werden gelöscht Ein Ereignis dynamisch einstellen Die Entwicklungsumgebung per Makro aufrufen Eine UserForm löschen Alle VBE-Komponenten der Arbeitsmappe auflisten Ein Arbeitsmappenereignis entfernen
397 398 400 401 401 402 404 405 406 408 409 410 411 411 412 413 413 414 414 415
587
Listingverzeichnis
B.15 Funktionen einsetzen, um Excel zu automatisieren Listing 15.1: Listing 15.3: Listing 15.4: Listing 15.5: Listing 15.6: Listing 15.7: Listing 15.8: Listing 15.9: Listing 15.10: Listing 15.11: Listing 15.12: Listing 15.13: Listing 15.14: Listing 15.15: Listing 15.16: Listing 15.17: Listing 15.18:
Alle Zellen mit bestimmter Formatierung sollen summiert werden Den Namen der aktiven Arbeitsmappe in einer Zelle zurückgeben Den kompletten Speicherpfad sowie den Namen der aktiven Arbeitsmappe zurückgeben Zellen auf Formelinhalt überprüfen Zelle abfragen über eine Funktion Dokumenteigenschaften über eine Funktion abfragen Alle Buchstaben sollen aus einer Zelle entfernt werden Die Position des ersten numerischen Zeichens ermitteln Prüfung auf Dateiexistenz Vor dem Öffnen einer Datei deren Existenz prüfen Prüfung, ob Datei bereits geöffnet ist Aktivieren oder Öffnen der Arbeitsmappe Durch unterschiedliche Löschnummern werden dementsprechende Löschaktionen gestartet Über die Lösch-Nr festlegen, welche Löschaktion durchgeführt werden soll Den Namen des Anwenders in einer Zelle ausgeben Die Anzahl der numerischen Ziffern einer Zelle zählen Ist das Add-In »Nützliche Funktionen« bereits eingebunden?
422 424 424 425 426 427 429 430 431 432 432 433 434 435 440 440 441
B.16 Excel und das Internet Listing 16.1: Listing 16.2: Listing 16.3: Listing 16.4: Listing 16.5: Listing 16.6: Listing 16.7: Listing 16.8: Listing 16.9:
Hyperlinks entfernen Aus Zelleninhalten Hyperlinks herstellen Die Tabellennamen »verlinken« Eine E-Mail zusammenstellen Kontaktdaten aus Excel nach Outlook übertragen Kontaktdaten aus Outlook ziehen E-Mail-Adressen in Hyperlinks verwandeln Alle Hyperlinks werden dokumentiert Hyperlinks anders formatieren
445 446 448 451 453 455 457 458 459
B.17 Excel und Datenbankzugriffe in Access Listing 17.1: Listing 17.2: Listing 17.3:
588
Excel-Daten nach Access transferieren Daten aus einer Access-Tabelle transferieren Nur bestimmte Datensätze aus Access nach Excel übernehmen
465 468 470
Listingverzeichnis
Listing 17.4: Listing 17.5: Listing 17.6: Listing 17.7:
Die Preise wurden um 10% erhöht Entfernen von bestimmten Datensätzen Die Top-Werte einer Access-Tabelle übertragen Der Transfer einer Access-Tabelle nach Excel
473 474 475 477
B.18 Excel und Word im Zusammenspiel Listing 18.1: Listing 18.2: Listing 18.3: Listing 18.4: Listing 18.5: Listing 18.6: Listing 18.7: Listing 18.8: Listing 18.9:
Eine Word-Sitzung starten und ein Dokument öffnen Eine Word-Sitzung übernehmen Eine Adresse aus Excel in einen Word-Brief kopieren Eine Excel-Tabelle Zelle für Zelle in ein Word-Dokument übertragen Word-Dokumente suchen und in einer Excel-Tabelle dokumentieren Hyperlinks einfügen Einen Zellenbereich in ein Word-Dokument kopieren Ein Word-Makro starten Ein Word-Dokument als Symbol einfügen
484 485 488 490 492 493 494 495 496
B.19 Arbeiten an der Oberfläche – Menü- und Symbolleisten programmieren Listing 19.1: Listing 19.2: Listing 19.3: Listing 19.4: Listing 19.5: Listing 19.6: Listing 19.7: Listing 19.8: Listing 19.9: Listing 19.10: Listing 19.11: Listing 19.12: Listing 19.13: Listing 19.14: Listing 19.15: Listing 19.16:
Leisten anhand ihres Typs identifizieren Die Arbeitsblatt-Menüleiste ausblenden Die Arbeitsblatt-Menüleiste über den Namen ansprechen Ein neues Menü einfügen Ein Menü löschen Einen Menübefehl einfügen Alle Formelzellen in Festwert-Zellen wandeln Eine neue, noch leere Symbolleiste anlegen Eine Symbolleiste löschen Die Symbole mit der FaceId anzeigen Die IDs für die einzelnen Symbole herausschreiben Eine Symbolleiste mit Symbolen bestücken Das Zellenkontextmenü erweitern Einen Kontextmenübefehl löschen Ein Menü deaktivieren Die Symbolleiste Standard schützen
500 503 503 504 505 506 507 508 508 509 510 512 513 514 515 516
589
Listingverzeichnis
B.20 Dialoge entwerfen, mit Steuerelementen bestücken und automatisieren Listing 20.1: Listing 20.2: Listing 20.3: Listing 20.4: Listing 20.5: Listing 20.6: Listing 20.7: Listing 20.8: Listing 20.9:
Eine UserForm aufrufen Eine Userform beenden Die eingegebenen Vokabeln speichern Die Vokabeln nach dem Zufallsprinzip einfügen Die eingegebenen Vokabeln überprüfen Drei neue Vokabeln einstellen Tabellennamen in Listenfeld einlesen Den ausgewählten Eintrag im Listenfeld auslesen Einen Text in einem Eingabefeld komplett markieren
524 525 526 528 530 532 533 534 534
B.21 Erstellen von Add-Ins Listing 21.1: Listing 21.2: Listing 21.3: Listing 21.4: Listing 21.5: Listing 21.6:
590
Formeln und Verknüpfungen dokumentieren Alle Namen der aktiven Arbeitsmappe dokumentieren Alle Kommentarzellen dokumentieren Alle Hyperlinkzellen dokumentieren Das Menü Tools automatisch erzeugen Das Menü Tools entfernen
539 540 541 542 543 544
Stichwortverzeichnis A
Access-Daten, einlesen 468 Access-Tabellen, manipulieren 472 Access-VBA-Bibliothek, einbinden 462 Action 339 Activate 141, 298 ActiveCell 239 ActiveSheet 38, 352 ActiveWorkbook 424 Add 78, 86, 95, 185, 194, 199, 404 AddComment 95, 267 AddCustomList 158f. AddFromFile 401, 404f., 569 AddFromGuid 397 AddIns 84f., 126 –, einbinden 547 –, erstellen 438 –, erzeugen 547 –, installieren 85 –, planen 538 –, prüfen 84 –, speichern 547 –, überprüfen 160 –, vorbereiten 545 AddItem 533 AddNew 467 Address 239, 269, 299, 386, 426, 447, 449 adLockOptimistic 467 ADO-Bibliothek, einbinden 462 adOpenKeyset 467 adSearchBackward 472 adSearchForward 472 AdvancedFilter 338, 565 Änderungsdatum –, abfragen 427 –, ermitteln 39 Aktivierreihenfolge, festlegen 523
AlertStyle 302 AllowDeletingColumns 224 AllowDeletingRows 224 AllowEditRanges 228 AllowFiltering 224 AllowFormatingCells 223 AllowFormattingColumns 223 AllowFormattingRows 223 AllowInsertingHyperlinks 223 AllowInsertingRows 223 AllowSorting 224 AllowUsingPivotTables 224 Anchor 447 Anwendernamen, ausgeben 29 Arbeitsblatt-Menüleiste –, ausblenden 502 –, einblenden 502 Arbeitsmappen –, anlegen 185, 340 –, entfernen 187 –, Existenz prüfen 431 –, identifizieren 177, 423 –, konsolidieren 185 –, löschen 187 –, öffnen 172, 174, 432 –, schließen 183f., 186 –, speichern 178, 181f. –, verknüpfen 192 –, zusammenführen 185 –, Zustand prüfen 432 Array 158, 220 Asc 429 Attachments 452 Aufenthaltsbereich, festlegen 166 AutoFilter 329f., 333 –, aktivieren 328 AutoFilterMode 329, 565 AutoFit 212f., 299, 456, 469, 501
B
Balkendiagramm, erstellen 353 BCC 451 Befehle, suchen 43 Befehlsleistenamen, ermitteln 501 Before 504 BeforeDoubleClick 324, 383 BeforeRightClick 324, 378, 382, 384 BeginGroup 507, 513 benutzerdefinierte Liste –, erstellen 158 –, generieren 157 Benutzernamen –, ausgeben 81 –, einstellen 164 benutzten Bereich markieren 341 Berechnung –, ausschalten 153 –, einschalten 153 Bereiche –, festlegen 253 –, schützen 228 –, verbinden 385 –, zusammenfassen 241 Beschriftung, festlegen 73 Bibliothek –, einbinden 396 –, entfernen 401 Bilder, einfügen 521 Bildlaufleisten, ausblenden 150 Bildschirmaktualisierung –, ausschalten 117, 152 –, einschalten 117, 152 Blätter, zählen 202, 217 Blattprüfung, vornehmen 202 Blatt-Typ, bestimmen 200 Block, auskommentieren 48 Body 451 Bold 115, 254, 256, 365 Boolean 64
591
Stichwortverzeichnis
Borders 258 Briefkopf, erstellen 486 Buchstaben, eliminieren 429 BuiltInDocumentProperties 18 9f. BusinessAddressCity 454 BusinessAddressCountry 454 BusinessAddressPostalCode 45 4 BusinessAddressState 454 BusinessAddressStreet 454 Button 73 Byte 64
C
Calculate 323f. CalculateBeforeSave 154 Calculation 154 Call 389 Cancel 378f., 384f. Caption 73, 506, 513, 519, 522 CategoryLabels 358 CC 451 CDate 304 CellDragAndDrop 160 Cells 137, 226, 244, 252, 298, 434, 529 CenterFooter 231 CenterHeader 230 Change 318 ChangeLink 194 ChartObject 75 ChartTitle 353, 358 ChartType 350, 352, 355, 358, 565 ChDir 117, 174, 178, 180, 186, 492 ChDrive 174, 178, 180 Chr 31, 89, 377, 406 ClassType 496 Clear 434 ClearComments 269, 434 ClearFormats 260, 434 Close 183f., 186, 207, 341, 467, 470, 472 Code, anzeigen 22 Code-Fenster –, aufrufen 27 –, einblenden 132 –, teilen 133 Codezeilen, zählen 406
592
Color 254 ColorIndex 112, 251, 254, 258, 320, 365, 381, 422, 435, 446 Columns.Count 341 ColumnWidth 542 CommandBarControl 504, 506 CommandBars 76, 392, 500, 513 Comment 94, 267f., 542 Connection 466, 469 Contents 223 Controls 504, 514f. Controls.Add 504 Copy 186, 208f., 340f., 357, 495 CopyToRange 339 Count 113, 202, 217, 222, 290, 292, 435, 446, 458, 501 Count down, einstellen 389 CountA 291f. CountBlank 293 CountIf 288 CountOfLines 406, 412 CreateBackup 179 CreateItem 451, 454 CreateObject 81, 451, 454, 484, 486, 488 criteria 472 Criteria1 330 CriteriaRange 339 Currency 64 CurrentRegion 245, 340, 347 CursorType 467 CutCopyMode 358, 374, 495
D
DataObject 82 DataType 211 Date 31, 41, 64, 81, 182, 389 DateCreated 428 Dateien, suchen 118 Dateigröße, abfragen 427 Dateiname, abfragen 427 Dateityp, abfragen 427 DateLastAccessed 428 DateLastModified 428 Daten –, einfügen 357 –, filtern 328 –, kopieren 357 –, skalieren 359 –, speichern 525
Datenbank –, öffnen 467 –, schließen 467 Datenbanksatz, anlegen 467 Datenbereich –, angeben 344 –, angeben (Diagramm) 352 –, sortieren 335 Datenfeld –, füllen 362 –, programmieren 177 Datensatz –, aktivieren 469 –, finden 471 –, löschen 474 –, suchen 471 DatePart 89, 552 Datumsangaben –, formatieren 88 –, subtrahieren 277 Datumsformat –, festlegen 260 –, konvertieren 304 Datumsgrenzen, einstellen 303 Datumsprüfung, vornehmen 102 Datumsteile, extrahieren 89 Debug.Print 133, 192, 337 Decimal 64 DefaultFilePath 165 Definition –, Add-In 538 –, ADO 462 –, Eigenschaften 39 –, Ereignisse 39, 310 –, Methoden 39 –, modulare Funktionen 431 –, Objekte 39 –, UserForms 518 –, Variablen 62 –, VBE-Programmierung 396 Delete 87, 120, 163, 204, 264, 270, 315, 357, 435, 446, 475, 489, 505, 509 DeleteLines 412 Delimiter 174 Description 400 Diagrammblätter, entfernen 364
Stichwortverzeichnis
Diagramme –, Balkendiagramm (gestapelt) 351 –, Balkendiagramm (gruppiert) 351 –, Blasendiagramm 351 –, exportieren 74, 362 –, Flächendiagramm 351 –, formatieren 361 –, Kreisdiagramm 351 –, Kursdiagramm 351 –, Liniendiagramm 351 –, löschen 357 –, Netzdiagramm 351 –, Oberflächendiagramm 351 –, platzieren 360 –, Punktdiagramm 351 –, Ringdiagramm 351 –, Säulendiagramm 350 –, Säulendiagramm 3DDarstellung 350 Diagrammobjekt, exportieren 75 Diagrammposition, festlegen 357 Diagrammtypen, auswählen 350 Diagrammüberschrift –, anzeigen 353 –, festlegen 353 Dim 63 Dir 155, 163, 186 Direktfenster –, einblenden 133 –, einsetzen 133 –, füllen 133, 192 Display 452 DisplayAlerts 74, 157, 315, 390, 409, 556 DisplayAsIcon 78, 496 DisplayFullScreen 149 DisplayGridLines 34, 80, 151 DisplayHeadings 151 DisplayHorizontalScrollBar 151 DisplayRecentFiles 162 DisplayStatusBar 389 DisplayStatusbar 155 DisplayVerticalScrollBar 151 DisplayWorkbookTabs 152 DisplayZeros 151
Do Until...Loop-Schleife, programmieren 119 Do while 186 Do While...Loop-Schleife, programmieren 123 Documents 81, 486 Documents.Add 486 Dokument –, einfügen 486 –, öffnen 484, 489 –, speichern 81 Dokumenteigenschaften –, abfragen 427 –, angeben 545 –, ansprechen 188 –, auflisten 189 –, auslesen 188 –, füllen 190 –, programmieren 188 –, setzen 190 Doppelklick –, aktivieren 383 –, deaktivieren 383 Double 64 Drag&Drop –, ausschalten 160 –, einschalten 160 DrawingObjects 223 Dropdown-Pfeile, anzeigen 331 Druckseiten-Anzahl, ermitteln 232 Duplikate, entfernen 338
E
EarliestTime 388 Editierformat, festlegen 55 Editoreinstellungen, anpassen 54 Eigenschaften, anzeigen 44 Eigenschaftenfenster, anzeigen 23 Eingabefelder, sperren 530 Eingabemaske, aufrufen 258 Eingabemeldung, anzeigen 304 Einzug –, vergrößern 47 –, verkleinern 47 E-Mail –, Empfänger angeben 451
–, Fenster anzeigen 452 –, senden 452 –, Text angeben 451 –, Titel festlegen 451 –, verschicken 449 Enabled 77, 392, 503, 515, 530 EnableEvents 322 End 341, 526 End With 38 EntireRow 112 Entwicklungsumgebung –, aufrufen 22, 413 –, einstellen 54 EOF 469, 472, 474 Ereignis –, Activate 317 –, Calculate 323 –, Change 318 –, einfügen 413 –, entfernen 415 –, löschen 412 –, Selection_Change 321 –, UserForm_Initialize 532 –, Workbook_BeforeClose 312, 543 –, Workbook_BeforeSave 313 –, Workbook_NewSheets 314 –, Workbook_Open 311, 543 –, Workbook_SheetBeforeRightClick 379 –, Worksheet_BeforeDoubleClick 383 –, Worksheet_BeforeRightClick 378 Ereignissteuerung –, ausschalten 322 –, einschalten 322 Ergebnis, runden 278 Err 142 Erstellungsdatum abfragen 427 Excel beenden 74, 390 Excel-Arbeitsmappen zählen 117 Excel-Dateien suchen 155 Excel-Daten exportieren 464 Excel-Version feststellen 105 Execute 469 Exit Function 430 Exit Sub 142, 216 Export 76, 408
593
Stichwortverzeichnis
F
FaceId 507, 509, 512f. Farbe ausgeben 250 Farbe zuweisen 254 Fehler –, beseitigen 132 –, finden 132 Fehlerbeschreibung anzeigen 142 Fehlermeldung anzeigen 304 Fehlernummer anzeigen 142 Fehlerparagraphen anspringen 103 Fehlerquellen ausschließen 140 Fenster verankern 58 Fensterstatus ermitteln 107 Fensterteiler betätigen 133 Fett-Druck zuweisen 254 Field 330 FieldInfo 211 FileDateTime 39 FileFormat 179 FileName 172, 179, 363, 496 FileSearch 118, 492 FileSystemObject 428 FileType 118, 492 Filter 363 –, aufspüren 336 –, TopTen 334 Filterkriterium –, einstellen (aus Zelle) 333 –, festlegen 331 –, setzen 329 FilterName 363 Filteroperatoren, einsetzen 330 Filters 337 Find 471f. FirstName 454 Font 115, 252f., 256, 375, 383, 446 FontStyle 254 For Each 184, 346, 362 For Each...Next-Schleifen einsetzen 113 For Next 228 For...Next-Schleifen programmieren 108 Format 173, 231, 287 –, löschen 260 FormatDateTime 88
594
formatierte Zellen markieren 297 Formelcheck durchführen 424 Formeln –, dokumentieren 295, 539 –, finden 295 –, wandeln (Festwerte) 368 Formelzellen –, dokumentieren 297 –, finden 295 –, markieren 226, 297 Formula 283, 289 Formula1 303 Formula2 303 FormulaLocal 283, 299, 426, 540 Formular einfügen 404 FoundFiles 118, 492 FullName 40, 161, 424 FullPath 400, 569 Function 422 Funktionen –, speichern 436 –, verfügbar machen 436 Funktionsliste aufrufen 281 Fußzeile –, gestalten 34, 115 –, programmieren 229
G
gefilterte Daten exportieren 339 GetDefaultFolder 456 GetFile 428 GetNamespace 456 GetObject 486 GetOpenFileName 175f. GetSaveAsFilename 179 Gitternetzlinien –, anzeigen 32, 80 –, ausblenden 32, 80 –, deaktivieren 150 GoTo 103 Grafik einfügen 79 Großbuchstaben wandeln 321 Gültigkeit –, alles erlaubt 302 –, benutzerdefiniert 302 –, nur Datumswerte 302 –, nur Dezimalzahlen 302 –, nur ganze Zahlen 302
–, nur Listeneinträge 302 –, nur Zeitwerte 302 Gültigkeitsliste erstellen 305 Gültigkeitsoperatoren auswählen 302 Gültigkeitsprüfungen vornehmen 300 Gültigkeitsregel hinzufügen 302 Gültigkeitszellen markieren 297 Guid 398f.
H
Haltepunkt –, ausschalten 47 –, einfügen 47 HasFormula 540 HasLegend 358, 365 HasTitle 353 HauptNr 398 Header 335 Height 497, 522 Hidden 348 Hide 525 Hintergrundfarbe festlegen 250 HorizontalAlignment 542 horizontale Trennstreifen einfügen 522 Hour 182 Hyperlinks 95, 543 –, dokumentieren 542 –, einfügen 95 –, entfernen 444 –, erstellen 446 –, formatieren 459 –, programmieren 444 –, prüfen 457 –, zählen 446, 458 Hyperlinks.Add 447 Hyperlinktext festlegen 447 Hyperlink-Zellenadresse ermitteln 543
I
IconFileName 496 IconIndex 497 IconLabel 497 ID 504, 511 If 100, 161 IgnoreBlank 304
Stichwortverzeichnis
IIf 103 Inhaltsverzeichnis erstellen 447 InputBox 258 InsertAfter 491 InsertLines 413 Installed 85, 161 InStr 122, 457 InStrRev 195 Int 387 Integer 64 Interior 251, 320, 381 Intersect 321, 379, 385, 387 IsArray 103, 177 IsDate 102f. IsEmpty 101, 103, 194 IsError 103 IsNull 103 IsNumeric 103, 422 IsObject 103 Italic 254, 256 Item 541
Kontakte –, anlegen 454 –, austauschen 452 Kontextmenü –, aktivieren 378 –, deaktivieren 378 –, erweitern 513 Kontextmenübefehle –, entfernen 514 –, löschen 514 Kontextmenüs –, deaktivieren 516 –, programmieren 513 Konturschriftschnitt zuweisen 254 Koordinaten ermitteln 238 Kopfzeile –, gestalten 34, 115 –, programmieren 229 Kopierrahmen entfernen 358 Kursiv-Druck zuweisen 254
K
L
Key 370 Key1 335 Kill 187 Klassenmodul einfügen 404 Kleinbuchstaben wandeln 321 Kommentaradresse, ermitteln 269 Kommentare –, auslesen 268 –, dokumentieren 541 –, einfügen 94, 264 –, entfernen 269 –, erstellen 266 –, löschen 269 Kommentarnamen ermitteln 542 Kommentartext –, ermitteln 542 –, festlegen 267 Kommentarzellen –, auskundschaften 264 –, markieren 297 Kommentierung aufheben 48 Konstanten –, anzeigen 44 –, einsetzen 87 –, global 87 –, lokal 87
Large 306 LastName 454 LatestTime 388 Laufwerk, wechseln 174 Laufzeitfehler 1004 141 Laufzeitfehler 438 144 LCase 321 Leerzeichen, entfernen 271, 294 Leerzellen –, ignorieren 304 –, markieren 297 Left 106, 425, 497, 508 LeftFooter 231 LeftHeader 41, 230 Legende anpassen 365 Leisten –, identifizieren 500 –, zählen 501 Len 207, 430, 534 Lesezeichen –, aktivieren 50 –, löschen 50 –, setzen 50 letzte Zelle –, ermitteln 341 –, markieren 297 Liniendiagramm erstellen 355
Link 496 LinkSources 194 Listen generieren 157 Listenfeld –, auslesen 534 –, füllen 533 Location 360, 365, 566 Locked 226 LockType 467 Löschen –, alle Formatierungen 433 –, alle Inhalte 433 –, alle Kommentare 433 –, Formeln 433 –, Hyperlinks 433 Löschfunktion erstellen 433 Lokal-Fenster einblenden 136 Long 64 LookIn 118, 492
M
MainWindow 414 Major 399 MajorUnit 359 Makro –, auflisten 416, 569 –, aufrufen 389 –, aufzeichnen 32 –, entfernen 411 –, löschen 411 –, speichern 32 –, zuweisen 370 Makrorekorder einsetzen 31 Makros –, aktivieren 130 –, benennen 28 –, deaktivieren 130 –, debuggen 134 –, einfügen 28, 42, 52 –, kopieren 42, 52 –, übernehmen 42 –, zurücksetzen 134 –, zuweisen 73 Makrosicherheit einstellen 131 markierte Zellen ansprechen 370 Markierung, relativ 242 Maus programmieren 377 Max 359 MaximimScale 359 MaximumScale 566
595
Stichwortverzeichnis
Meldungsfenster, ausgeben 30 Menü –, aktivieren 515 –, deaktivieren 515 –, entfernen 505 –, löschen 505 Menübefehle einfügen 505 Menübefehlsymbol festlegen 507 Menübefehltext festlegen 506 Menüleiste –, ausblenden 76 –, einblenden 76 –, programmieren 502 Menüs –, anlegen 543 –, einfügen 503 –, löschen 503 Methoden, anzeigen 44 Mid 195, 428ff. Min 359 MinimumScale 359 Minor 399 Minute 182 Minuten ermitteln 182 Modul einfügen 27 modulare Funktionen programmieren 431 Module –, drucken 409 –, entfernen 410, 416, 569 –, löschen 410, 416, 569 Monatsnamen ermitteln 40 Month 40 MonthName 40, 552 Move 209, 229, 232 MoveNext 469, 474f. MsgBox 29, 46, 126, 204 msoBarNoCustomize 516 msoBarTypeMenuBar 501 msoBarTypeNormal 501 msoBarTypePopup 501 msoControlButton 504 msoControlComboBox 504 msoControlDropdown 504 msoControlEdit 504 msoControlPopup 504 MultiSelect 176
596
N
Namen 126, 161, 178f., 200, 217, 253, 298, 409, 424, 428, 501, 540f. –, dokumentieren 540 –, löschen 264 Names.Add 263 NebenNr 398 NewSearch 118, 492 NewSeries 358 Nothing 72 Notizen einfügen 265 Now 388, 390 Nullwerte ausblenden 150 Number 142 NumberFormat 259, 261
O
Object 64, 81 ObjectType 477 Objektkatalog aufrufen 38 Objektvariablen –, auflösen 241 –, deklarieren 75 –, einsetzen 70 Objektverweis aufheben 81, 86 Öffnen-Dialog anzeigen 175 Office-Assistenten aufrufen 71 Offset 104, 110, 242, 250, 447 olContactItem 454 OLE-Objekt, einfügen 496 On Error 103, 142, 220, 345, 410, 433, 505 –, goTo 142 –, Resume next 142 OnAction 73, 507, 513 OnKey 373 Online-Hilfe aufrufen 41 OnTime 388 Open 172, 175, 207, 341, 432, 466, 484 OpenText 211, 214, 409 Operator 330 Option Explicit 65 Optionsschaltfläche auslesen 527 Order1 335 Orientation 344 Origin 174 OutLineFont 254 OutputTo 477
P
PageSetup 38, 230 Parameterinfo, anzeigen 46 Passwort 173, 179, 223 Paste 340, 357, 495 PasteSpecial 340, 374 Path 428 Pfad, abfragen 427 Picture 79 PivotFields 344 Pivot-Tabellen –, aktualisieren 325, 345 –, erstellen 342 –, programmieren 342 PivotTableUpdate 324 PivotTableWizard 343 PlotBy 352 Position ermitteln (erste Zahl) 430 PowerPoint starten 95, 551 Preise erhöhen 277 Primärfarbe zuweisen 254 Print 341 PrintOut 409 ProcCountLines 412 Procedure 370, 388 ProcStartLine 412 Protect 223, 226, 228, 232 Protection 516 Prozeduren anzeigen 133 PutInClipBoard 83
Q
Quellcode –, exportieren 407 –, importieren 403 –, schützen 546 QuickInfo –, anzeigen 46, 509 –, festlegen 447 Quit 74, 390, 484
R
Rahmenart festlegen 258 Rahmentypen festlegen 257 Range 86, 238, 370 ReadOnly 173 RecentFiles 162f. ReDim 222 Reference 399 RefersTo 263
Stichwortverzeichnis
RefreshTable 345, 565 Remove 401, 410 Replace 358 RightFooter 231 RightHeader 230 Rnd 387, 529 Round 278 RowCol 357 Rows.Count 276 Rückfrage –, programmieren 203 –, unterdrücken 203
S
Säulendiagramm einfügen 351 Save 181f., 454 SaveAs 81, 179 SaveChanges 183, 484 Saved 183 Scenarios 223 Schaltfläche einfügen 73 Schedule 388 Schleifen programmieren 108 Schreibarbeit sparen 37 Schriftart –, einstellen 375, 409 –, festlegen 252 –, schattieren 254 Schriftgröße –, einstellen 409 –, festlegen 253 Schriftschnitt –, einsetzen 253 –, festlegen 115 –, zuweisen 254 ScreenTip 447 ScreenUpdating 117, 153 ScrollArea 166 –, angeben 26 –, festlegen 166 SearchDirection 472 SearchSubFolders 118, 492 Seitennummerierung angeben 231 Select 222, 226, 238f. Select Case 105, 380, 428ff. Selection 239, 259, 370 SelLength 534 SelStart 534 Send 452
Series 362 SeriesLabels 357 Set 75, 193, 404 SetFocus 414, 534 SetSourceData 352, 355 Shadow 254 SheetBeforeRightClick 380 Sheets 75, 200, 217, 251 Sheets.Add 251, 456 SheetsInNewBook 165 SheetsInNewWorkbook 185f. Show 524 ShowError 304 ShowInput 304 Sicherungskopie anlegen 179 sichtbare Zellen markieren 297, 340 Single 64, 278 Size 253, 409, 428 Skalierung vornehmen 359 SkipRows 472 Sonderzeichen einfügen 374 Sort 335 Source 355, 467 SourceData 344 SourceType 343 Spalten zählen 341 Spaltenausrichtung festlegen 542 Spaltenbreite –, einstellen 212, 299 –, festlegen 542 Spaltenüberschriften ausblenden 150 SpecialCells 226, 296, 340, 347 SpecialEffect 522 Speicher freigeben 72, 456 Speicher-Dialog aufrufen 179 Speicherpfad ermitteln 40 Spezialfilter einsetzen 337 SQL-Abfrage durchführen 469 StandardFont 164 StandardFontSize 164 Standardmeldungen abschalten 74, 156 Standardmodul einfügen 404 Standardschriftart einstellen 164 Standardspeicherort einstellen 164
Standardtastenkombinationen –, aktivieren 391 –, deaktivieren 372 start 472 StartRow 211 StatusBar 155 Statusleiste –, ausblenden 150 –, einblenden 155 –, programmieren 388 Statuszeile programmieren 154 Steuerelemente –, beschriften 522 –, einsetzen 519 –, hinzufügen 519 –, identifizieren 531 Strikethrough 254 String 64 Stunden ermitteln 182 Styles 507 SubAddress 447 SubAdress 449 Subject 451 Subscript 254 Substitute 122 SumIf 287 Superscript 254 Symbolaussehen bestimmen 509 Symbole –, auflisten 509 –, einfügen 509 –, integrieren 509 Symbolfunktion bestimmen 510 Symbolleiste –, anlegen 507, 509 –, einblenden 44 –, entfernen 508 –, löschen 508 –, programmieren 507 –, schützen 516 Symbolleistenkontextmenü deaktivieren 392 Symbolleistenposition festlegen 508
597
Stichwortverzeichnis
T
Tabelle –, berechnen 323 –, einfügen 189, 456 –, löschen 202 –, Prüffunktionen 103 –, sortieren 335 Tabellen –, anlegen 198 –, ausblenden 25, 215, 217 –, ausblenden (sicher) 218 –, auswählen 222, 226 –, benennen 198 –, einblenden 215, 219 –, einfügen 251 –, entfernen 202 –, exportieren 205 –, gruppieren 220 –, importieren 210 –, kopieren 186, 207 –, schützen 223, 226 –, sortieren 228 –, spiegeln 26 –, übertragen 208 –, zählen 113 Tabellenanzahl einstellen 164 Tabellenblätter füllen 201 Tabellenblätteranzahl festlegen 185 Tabellenblatt aktivieren 298 Tabellenfunktion –, COUNT 290 –, COUNTA 291 –, COUNTBLANK 293 –, COUNTIF 288 –, DATEDIF 284 –, einfügen 282 –, einsetzen 281 –, erstellen 420 –, LARGE 306 –, MAX 359 –, MIN 359 –, RANK 284 –, SUM 282 –, SUMIF 287 Tabellennamen ermitteln 112 TableDestination 344 TableName 344 Tagesdatum ausgeben 31 Target 320, 378f.
598
Tastenkombination –, bekannt geben 370 –, einsetzen 52 –, verwenden 368 –, zuweisen 370 Temporary 505 Text 267, 353, 542 –, ausgeben 30 –, durchstreichen 254 –, höherstellen 254 –, tieferstellen 254 –, unterstreichen 254 Textdatei –, einfügen (als Symbol) 78 –, öffnen 341 –, schließen 341 Textteile –, ersetzen 50 –, suchen 50 TextToDisplay 447 ThisWorkbook 113, 200 Time 31 TimeValue 388, 390 To 451 ToolTipText 509, 511 Top 497, 508 Trim 271, 294 Type 304, 428, 500, 504 TypeName 200, 531 TypeParagraph 489 TypeText 81, 491
U
UBound 177 UCase 321 Überwachung hinzufügen 135 Uhrzeit ausgeben 31 umliegenden Bereich –, ermitteln 245 –, markieren 340 UnderLine 435 Underline 254, 446 Union 241, 385 unload me 525 Unterstreichung entfernen 435 Update 467, 474 UpdateLinks 172 UsedRange 207, 244, 335, 341, 507, 529
UserForm –, aufrufen 524 –, beenden 524 –, benennen 519 –, einfügen 518 –, entfernen 414 –, starten 524 –, testen 524 –, Titel festlegen 519 –, vergrößern 519 UserForms –, entwerfen 518 –, programmieren 523 UserInterFaceOnly 223 UserName 81, 164
V
Validation.Add 302 Value 248, 299, 426, 527, 531, 534, 540 Variablen –, deklarieren 63 –, global 63 –, lokal 63 –, öffentlich 68 –, privat 69 –, Regeln 63 –, statisch 68 Variablendeklaration erzwingen 65 Variablenlänge ermitteln 207 Variablentypen –, auswählen 64 –, kennen lernen 68 Variant 64 VBComponents 412 vbCr 51 VBE –, aufrufen 413 –, Eigenschaften 402 –, Methoden 402 –, Objekte 402 VBE-Bibliothek deaktivieren 401 VBE-Komponenten auflisten 414 vbext_ct_ClassModule 404 vbext_ct_MSForm 404 vbext_ct_StdModule 404 vbext_pk_Proc 412
Stichwortverzeichnis
VBE-Zugriff zulassen 400 vbInformation 347 Veränderungen verhindern 225 verfügbare Objekte ansehen 42 Vergleichsoperatoren einsetzen 107 Verknüpfungen –, ändern 194 –, dokumentieren 193 –, wandeln (Festwerte) 368 Version 105 VerticalAlignment 542 Verweis erstellen 81 verwendeten Bereich ermitteln 207, 244 verwendeten Bereich markieren 341 Verzeichnis wechseln 174 Verzweigungen einsetzen 98 Visible 81, 215, 219, 263, 414, 484, 489, 510 VisibleDropDown 331 Vokabel-Lernprogramm programmieren 518 Vokabeln –, einfügen 527 –, prüfen 530 Volatile 422 Vollbildansicht einstellen 148
W
Wait 389 WeekDayName 93 Werkzeugsammlung einsetzen 519 Werte –, addieren 385 –, einfügen 373 Where 360 WholeStory 489 Width 497 Wiedervorlageliste –, anzeigen 162 –, ausblenden 162 –, bearbeiten 161 –, überprüfen 163 WindowState 108 With 37, 73, 526 Wochentag ermitteln 93 Worbook_BeforeClose 374
Word –, beenden 80 –, starten 80 Word-Dokumente –, auflisten 491 –, suchen 492 Word-Sitzung –, beenden 484 –, starten 484 –, übernehmen 485 Word-VBA-Bibliothek einbinden 482 Workbook 126, 172, 178 Workbook_Activate 315 Workbook_AddinInstall 315 Workbook_AddinUninstall 315 Workbook_BeforeClose 312 Workbook_BeforePrint 315 Workbook_BeforeSave 313, 315 Workbook_Deactivate 315 Workbook_NewSheet 316 Workbook_Open 311, 374 Workbook_SheetActivate 316 Workbook_SheetBeforeDoubleClick 316 Workbook_SheetBeforeRightClick 316 Workbook_SheetCalculate 316 Workbook_SheetChange 316 Workbook_SheetDeactivate 316 Workbook_SheetFollowHyperlink 316 Workbook_SheetSelectionChange 316 Workbook_WindowActivate_ 316 Workbook_WindowDeactivate 316 Workbook_WindowResize 316 Workbooks 126, 178 Workbooks.Add 340 Worksheet 117 Worksheet_Activate 324 Worksheet_BeforeRightClick 378 Worksheet_Calculate 324 Worksheet_Change 324 Worksheet_Deactivate 324
Worksheet_FollowHyperlink 324 Worksheet_SelectionChange 322, 324 WorksheetFunction 282, 286 Worksheets 113, 200
X
xl3DColumn 350 xlAnd 330 xlArea 351 xlAscending 335 xlAutomatic 435, 446 xlBarClustered 351 xlBarStacked 351 xlBetween 302 xlBottom10Items 331 xlBottom10Percent 331 xlBubble 351 xlCellTypeAllFormatConditions 297 xlCellTypeAllValidation 297 xlCellTypeBlanks 297 xlCellTypeComments 297 xlCellTypeFormulas 226, 296 xlColorIndexNone, 382 xlColumnClustered 350 xlColumnField 344 xlColumns 353, 357 xlColumnStacked 350 xlConsolidation 343 xlContinuous 257 xlDash 257 xlDashDot 257 xlDashDotDot 257 xlDatabase 343 xlDataField 344 xlDescending 335 xlDot 257 xlDouble 257 xlDoughnut 351 xlDown 341 xlEqual 302 xlExternal 343 xlFilterCopy 339 xlFilterInPlace 339 xlGreater 302 xlGreaterEqual 303 xlHidden 344 xlLess 303
599
Stichwortverzeichnis
xlLessEqual 303 xlLine 351 xlLineStyleNone 257 xlLocationAsNewSheet 360 xlLocationAsObject 360 xlLocationAutomatic 360 xlNo 336 xlNotBetween 302 xlNotEqual 302 xlOr 330 xlPageField 344 XLPasteAll 340 xlPie 351 xlPivotTable 343 xlRadar 351 xlRowField 344 xlRows 353, 357 xlSheetHidden 25 xlSheetVeryHidden 25 xlSlantDashDot 257 xlStockHLC 351 xlSurface 351 xlToLeft 341 xlTop10Items 330, 334 xlTop10Percent 330 xlToRight 341 xlUnderlineStyleNone 435, 446 xlUp 341 xlValidAlertInformation 302 xlValidAlertStop 302 xlValidAlertWarning 302 XlValidateCustom 302 xlValidateDate 302 xlValidateDecimal 302 xlValidateInputOnly 302 xlValidateList 302 XlValidateTextLength 302
600
XlValidateTime 302 xlValidateWholeNumber xlValues 374 xlVeryHidden 218 xlVisible 25, 347 xlXYScatter 351 xlYes 336
Z
302
Zahlen summieren 125 Zahlenformate festlegen 258 Zahlenwerte prüfen 106 Zeichen –, austauschen 121 –, ersetzen 122 Zeichen-Belegung herausfinden 377 Zeichen-Code ermitteln 377 Zeichenfolge –, ersetzen 122 –, extrahieren 195 Zeichenobjekt –, einfügen 85 –, entfernen 87 Zeichenposition ermitteln 195 Zeichenprüfung durchführen 122 Zeilen –, abarbeiten 109 –, einfärben 111 –, löschen 119 –, zählen 276 Zeilenüberschriften ausblenden 150 Zeilenvorschub einfügen 51 Zeitsteuerung programmieren 388 Zelle füllen 137
Zellen –, abfragen 248 –, addieren 274 –, ändern 248 –, auswerten 114 –, benennen 262 –, dividieren 279 –, einfügen 340 –, formatieren 250 –, füllen 247 –, initialisieren 247 –, kommentieren 264 –, kopieren 340 –, markieren 238 –, multiplizieren 277 –, rahmen 256 –, summieren 421 Zellenadresse abfragen 426 Zellenbereich markieren 239f. Zellenformel abfragen 426 Zellenhintergrund –, auslesen 251 –, formatieren 381 –, löschen 252 Zelleninformationen abfragen 425 Zelleninhalte prüfen 100 Zellenlänge überprüfen 123 Zellenverschiebung angeben 104 Zellenwert abfragen 426 Zoom einstellen 165 Zufallszahlen bilden 386, 529 Zugriffsdatum abfragen 427 Zwischenablage –, ansprechen 82 –, füllen 82f. –, leeren 83
Copyright Daten, Texte, Design und Grafiken dieses eBooks, sowie die eventuell angebotenen eBook-Zusatzdaten sind urheberrechtlich geschützt. Dieses eBook stellen wir lediglich als Einzelplatz-Lizenz zur Verfügung! Jede andere Verwendung dieses eBooks und zugehöriger Materialien und Informationen, einschliesslich der Reproduktion, der Weitergabe, des Weitervertriebs, der Plazierung auf anderen Websites, der Veränderung und der Veröffentlichung bedarf der schriftlichen Genehmigung des Verlags. Bei Fragen zu diesem Thema wenden Sie sich bitte an: mailto:
[email protected] Zusatzdaten Möglicherweise liegt dem gedruckten Buch eine CD-ROM mit Zusatzdaten bei. Die Zurverfügungstellung dieser Daten auf der Website ist eine freiwillige Leistung des Verlags. Der Rechtsweg ist ausgeschlossen.
Hinweis Dieses und andere eBooks können Sie rund um die Uhr und legal auf unserer Website
(http://www.informit.de) herunterladen