vba-programmierung fur word, excel und access

554
Bernd Held Know-how ist blau. > Ergänzen Sie Microsoft Office durch selbst programmierte Funktionen > Erstellen Sie Meldungen und Dialoge, Menü- und Symbolleisten > Tauschen Sie Daten zwischen den Office-Applikationen aus VBA -Programmierung für Word, Excel und Access Studienausgabe Das Praxisbuch für Microsoft-Office-Entwickler

Upload: bernd-held

Post on 22-Dec-2016

484 views

Category:

Documents


19 download

TRANSCRIPT

Page 1: VBA-Programmierung fur Word, Excel und Access

Bernd HeldKnow-how

ist blau.

> Ergänzen Sie Microsoft Office durch selbst programmierte Funktionen

> Erstellen Sie Meldungen und Dialoge, Menü- und Symbolleisten

> Tauschen Sie Daten zwischen den Office-Applikationen aus

VBA-Programmierungfür Word, Excel und Access

Studienausgabe

Das Praxisbuch für Microsoft-Office-Entwickler

Page 2: VBA-Programmierung fur Word, Excel und Access

Bernd Held

VBA-Programmierungfür Word, Excel und Access

Page 3: VBA-Programmierung fur Word, Excel und Access

Mit 323 Abbildungen

Bernd Held

VBA-Programmierungfür Word, Excel und Access

Studienausgabe

Page 4: VBA-Programmierung fur Word, Excel und Access

Bibliografische Information der Deutschen Bibliothek

Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;

detaillierte Daten sind im Internet über http://dnb.ddb.de abrufbar.

Alle Angaben in diesem Buch wurden vom Autor mit größter Sorgfalt erarbeitet bzw. zusammengestellt und unter Einschaltung wirksamer

Kontrollmaßnahmen reproduziert. Trotzdem sind Fehler nicht ganz auszuschließen. Der Verlag und der Autor sehen sich deshalb gezwungen,

darauf hinzuweisen, dass sie weder eine Garantie noch die juristische Verantwortung oder irgendeine Haftung für Folgen, die auf fehlerhafte

Angaben zurückgehen, übernehmen können. Für die Mitteilung etwaiger Fehler sind Verlag und Autor jederzeit dankbar. Internetadressen

oder Versionsnummern stellen den bei Redaktionsschluss verfügbaren Informationsstand dar. Verlag und Autor übernehmen keinerlei

Verantwortung oder Haftung für Veränderungen, die sich aus nicht von ihnen zu vertretenden Umständen ergeben. Evtl. beigefügte oder

zum Download angebotene Dateien und Informationen dienen ausschließlich der nicht gewerblichen Nutzung. Eine gewerbliche Nutzung

ist nur mit Zustimmung des Lizenzinhabers möglich.

© 2010 Franzis Verlag GmbH, 85586 Poing

Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Das Erstellen und

Verbreiten von Kopien auf Papier, auf Datenträgern oder im Internet, insbesondere als PDF, ist nur mit ausdrücklicher Genehmigung des

Verlags gestattet und wird widrigenfalls strafrechtlich verfolgt.

Die meisten Produktbezeichnungen von Hard- und Software sowie Firmennamen und Firmenlogos, die in diesem Werk genannt werden,

sind in der Regel gleichzeitig auch eingetragene Warenzeichen und sollten als solche betrachtet werden. Der Verlag folgt bei den Produkt-

bezeichnungen im Wesentlichen den Schreibweisen der Hersteller.

Herausgeber: Franz Graser

Satz: DTP-Satz A. Kugge, München

art & design: www.ideehoch2.de

Druck: Bercker, 47623 Kevelaer

Printed in Germany

ISBN 978-3-645-60070-5

Page 5: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 6: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang5

VorwortEine der Stärken des Office-Pakets von Microsoft ist, dass Sie es über den Einsatz von VisualBasic for Applications (VBA) erweitern und sogar noch verbessern können. Überall entste-hen somit Office-Lösungen in Eigenregie, die den großen, bereits existierenden und oft sehrteuren Standardsoftwareprogrammen trotzen. Diese programmierten Office-Anwendungenkönnen flexibler erstellt und auch jederzeit gepflegt werden. Dabei ist den Anwendern dieOffice-Oberfläche schon bekannt und die Einführung solcher Lösungen wird dadurcherleichtert.

In diesem Buch werden die wichtigsten Office-Applikationen Excel, Word und Access aus-führlich behandelt. Zusätzlich werden Lösungen mit Outlook und PowerPoint präsentiert.

Das Buch ist in drei Teile gegliedert:

• Teil I: Die allgemeinen Office-Themen

• Teil II: Die wichtigsten Office-Komponenten und der Datenaustausch zwischen deneinzelnen Office-Programmen

• Teil III: Fehlersuche, Tuning und Office-VBA-FAQ (Frequently Asked Questions, alsohäufig gestellte Fragen)

Im ersten Teil werden Office umfassende Themen behandelt, die Sie mit kleinen Anpassun-gen für nahezu alle Office-Komponenten einsetzen können. So lernen Sie im ersten Kapitel,wie Sie die Entwicklungsumgebung in den Office-Komponenten einsetzen können. Im zwei-ten Kapitel lernen Sie die wichtigsten Sprachelemente wie beispielsweise Schleifen, Ver-zweigungen und Abfragen kennen. In Kapitel 3 werden VBA-Standardfunktionen desOffice-Pakets anhand von Aufgaben aus der täglichen Praxis vorgestellt. Im folgenden Kapi-tel erfahren Sie, wie Sie Office durch die Programmierung eigener Funktionen weiter berei-chern können. In Kapitel 5 erstellen und programmieren Sie benutzerfreundliche UserFormsund erfahren, wie Sie bereits integrierte Dialoge im Office-Paket für Ihre Programme einset-zen können. Die Programmierung von Kontextmenüs, Menü- und Symbolleisten ist Themavon Kapitel 6. Dort erfahren Sie, wie Sie diese Objekte ansprechen und programmieren kön-nen, um Ihre VBA-Projekte noch benutzerfreundlicher zu machen. In Kapitel 7 dreht sichalles um das Internet. Unter anderem erfahren Sie dort, wie Sie Hyperlinks programmieren,E-Mails verschicken und Web-Abfragen ausführen können. In Kapitel 8 greifen Sie mithilfevon VBA-Makros auf VBA-Projekte zu. Durch diese so genannten VBE-Zugriffe können SieQuellcode sichern oder entfernen. Des Weiteren besteht die Möglichkeit, Quellcode zuimportieren bzw. zu exportieren. Selbstverständlich können Sie über ein Makro auch weitereMakros Zeile für Zeile automatisch erstellen.

Im zweiten Teil wird der Fokus auf die wichtigsten Office-Komponenten gerichtet. In Kapitel9 lernen Sie die wichtigsten Objekte in Excel wie Zellen, Zeilen, Spalten, Tabellen undArbeitsmappen anhand zahlreicher Beispiele aus der täglichen Praxis kennen. In Kapitel 10erstellen Sie Makros in Ihrer Textverarbeitung Word. Unter anderem fügen Sie Bilder inDokumente ein, erstellen und füllen Tabellen und vieles mehr. In Kapitel 11 lernen Sie dieProgrammierung der wichtigsten Elemente von Access kennen. Sie erstellen unter anderem

Page 7: VBA-Programmierung fur Word, Excel und Access

Links

Vorwort6

Tabellen und führen Abfragen durch. Eines der wichtigsten Kapitel dieses Buchs stellt dasKapitel 12 dar. Es behandelt den Datenaustausch zwischen den einzelnen Office-Komponen-ten. In diesem Kapitel steht die Zusammenarbeit der einzelnen Office-Komponenten im Vor-dergrund. Unter anderem greifen Sie ausgehend von Word auf eine Access-Tabelle zu undübertragen Adressdaten in Ihre Textverarbeitung. Des Weiteren füllen Sie den Kontaktordnervon Outlook mit Daten, die Sie aus einer Excel-Tabelle beziehen.

Im dritten Teil des Buchs erfahren Sie in Kapitel 13, wie Sie Fehler in Makros aufspüren undbeseitigen können. Allgemeine Ratschläge für das Verhalten im Fehlerfall ergänzen denInhalt dieses Kapitels. In Kapitel 14 messen Sie die Geschwindigkeit von einzelnen Makros.Schritt für Schritt erfahren Sie, wie Sie Makros noch schneller und benutzerfreundlichermachen können. Im letzten Kapitel dieses Buchs präsentiere ich Ihnen eine Office-FAQ mitFragen, die in den letzten Jahren an mich gestellt wurden und für die ich eine Lösung zur Ver-fügung stellen konnte.

In Anhang A des Buchs finden Sie eine Auflistung der Dateien, die Sie auf der Websitewww.buch.cd finden können. Des Weiteren werden im Anhang B alle Listingbeschriftungenin einer Liste zum schnellen Nachschlagen angeboten. Im Index sind alle im Buch verwen-deten Methoden, Funktion, Eigenschaften und Anweisungen aufgenommen worden. Sie kön-nen somit schnell herausfinden, auf welchen Seiten des Buchs die Befehle verwendet undbeschrieben wurden.

In diesem Buch wurden Praxislösugnen in ca. 360 Makros beschrieben. Zögern Sie nicht,mich bei Fragen zum Buch über meine E-Mail-Adresse [email protected] zukontaktieren.

Ich wünsche Ihnen beim Lesen des Buchs viel Spass und hoffe, dass ich damit einen Beitragleisten konnte, der Ihnen hilft, erfolgreich Office-Lösungen zu entwickeln.

Bernd Held

Über den Autor:

Bernd Held ist gelernter Informatiker und programmierte drei Jahre lang bei einer Firma derAutomobilbranche Warenwirtschafts- und Suchsysteme für den Kfz-Bereich. Danach arbei-tete er sechs Jahre beim debis Systemhaus im Controlling. Dort war er verantwortlich für dasBerichtswesen, die Leistungsverrechnung, das Erstellen von betrieblichen Auswertungenund Wirtschaftlichkeitsrechnungen sowie für die Entwicklung neuer Controlling-Tools aufder Basis von Microsoft Office. Seit dem 1. Januar 2002 ist Herr Held selbstständig. Erschreibt Fachartikel in renommierten Zeitschriften, verfasst Computerbücher, führt Soft-ware-Schulungen durch und programmiert im Auftrag von Kunden. Sein Spezialgebiet istMicrosoft Office. Dort hat er sich auf den Bereich Excel und die Office-VBA-Programmie-rung spezialisiert. Aber auch über Microsoft Works, FrontPage, Windows und diverse ande-rer Themen hat er schon viele Bücher geschrieben.

Page 8: VBA-Programmierung fur Word, Excel und Access

RechtsVorwort 7

Vor drei Jahren wurde Bernd Held als MVP (Most Valuable Professional) von der FirmaMicrosoft ausgezeichnet. Dieser Titel wird für besondere fachliche Kompetenz, überdurch-schnittlichen Einsatz in den Diskussionsforen und für außergewöhnliches Kommunikations-talent verliehen. Im deutschsprachigen Excel-Forum von Microsoft (news:micro-soft.public.de.excel) können Sie Bernd Held des öfternen antreffen, wenn Sie Fragen zuExcel oder zur VBA-Programmierung haben. Dort hilft er Ihnen gerne weiter.

Page 9: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 10: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang9

Inhaltsverzeichnis

Vorwort ................................................................................................................ 5

1 Die Entwicklungsumgebung von VBA............................................................ 131.1 Makros einfügen ................................................................................................. 131.2 Makros starten .................................................................................................... 151.3 Den Makrorekorder einsetzen ............................................................................ 151.4 Die Arbeitsumgebung ......................................................................................... 201.5 Wertvolle Helfer bei der Programmierung .......................................................... 281.6 Weitere Einstellungen ......................................................................................... 35

2 Die Sprachelemente von VBA.......................................................................... 412.1 Variablen und Konstanten .................................................................................. 412.2 Operatoren .......................................................................................................... 442.3 Verzweigungen ................................................................................................... 462.4 Die Anweisung Select Case ............................................................................... 502.5 Schleifen ............................................................................................................. 58

3 VBA-Standardfunktionen nutzen..................................................................... 913.1 Textfunktionen einsetzen .................................................................................... 913.2 Mit Verzeichnissen und Laufwerken arbeiten ................................................... 1083.3 Datums- und Zeitfunktionen einsetzen ............................................................. 1123.4 Prüffunktionen ................................................................................................... 1263.5 Sonstige Funktionen ......................................................................................... 136

4 Eigene Funktionen programmieren .............................................................. 1474.1 Farbige Zellen addieren .................................................................................... 1474.2 Dateiprüfung ..................................................................................................... 1494.3 Daten bereinigen .............................................................................................. 1504.4 Aktive Zelle im Zielbereich? .............................................................................. 1534.5 Dokumentschutz aufheben und neu setzen ..................................................... 1544.6 Römische Zahlen wandeln ............................................................................... 1564.7 Eingefügte Objekte in PowerPoint-Folien ermitteln .......................................... 1584.8 Läuft eine Anwendung bereits? ........................................................................ 1624.9 Hyperlinks auf Shape-Objekten identifizieren ................................................... 1674.10 Ist Dokument passwortgeschützt? .................................................................... 1704.11 Ist Arbeitsmappe passwortgeschützt? .............................................................. 1714.12 Wo bin ich? ....................................................................................................... 1734.13 Das älteste Dokument in einem Verzeichnis ermitteln ..................................... 1764.14 Die Dokumenteigenschaften ermitteln .............................................................. 1784.15 Wie viele Tage hat ein Monat? ......................................................................... 1804.16 Initialen aus Namen bilden ............................................................................... 180

Page 11: VBA-Programmierung fur Word, Excel und Access

Links

Inhaltsverzeichnis10

4.17 Automatisch E-Mail-Adressen generieren ........................................................ 1834.18 Ist Add-In bereits eingebunden ........................................................................ 1844.19 Wo steckt der größte Wert? ............................................................................. 1854.20 Wird Name bereits verwendet? ........................................................................ 188

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren.... 1915.1 Meldungen programmieren .............................................................................. 1915.2 Eingabemasken programmieren ...................................................................... 1945.3 Integrierte Dialoge verwenden ......................................................................... 1975.4 UserForms programmieren .............................................................................. 203

6 Menü- und Symbolleisten programmieren ................................................... 2316.1 Allgemeine Anmerkungen zu Leisten ............................................................... 2316.2 Menüleisten programmieren ............................................................................ 2336.3 Symbolleisten programmieren ......................................................................... 2516.4 Kontextmenüs programmieren ......................................................................... 260

7 »Internette« Funktionen in Office programmieren ...................................... 2657.1 Inhaltsverzeichnis einer Arbeitsmappe erstellen .............................................. 2657.2 Inhaltsverzeichnis eines Verzeichnisses erstellen ........................................... 2677.3 E-Mail-Links einfügen ....................................................................................... 2697.4 URL-Links einfügen .......................................................................................... 2737.5 Aktienkurse abfragen ....................................................................................... 2767.6 E-Mails per VBA verschicken ........................................................................... 278

8 VBE-Programmierung in Office ..................................................................... 2918.1 Die Voraussetzung ........................................................................................... 2918.2 Bibliotheken einbinden ..................................................................................... 2928.3 Die VBE-Komponenten .................................................................................... 2968.4 VBE-Komponenten auflisten ............................................................................ 2988.5 VBE-Komponenten entfernen .......................................................................... 3008.6 VBE-Komponenten exportieren ....................................................................... 3008.7 VBE-Komponenten importieren ....................................................................... 3018.8 Alle VBE-Komponenten aus Dokument entfernen ........................................... 3048.9 VBE aufrufen .................................................................................................... 3058.10 Codezeilen auflisten ......................................................................................... 305

9 Excel-Programmierung .................................................................................. 3099.1 Zellen programmieren ...................................................................................... 3099.2 Zeilen und Spalten programmieren .................................................................. 3289.3 Tabellen programmieren .................................................................................. 3439.4 Arbeitsmappen programmieren ........................................................................ 355

10 Die Programmierung mit Word...................................................................... 36710.1 Dokument(e) identifizieren ............................................................................... 36810.2 Dokumentvorlage ermitteln .............................................................................. 36910.3 Dokumentvorlage wechseln ............................................................................. 37010.4 Einstellungen am Dokument durchführen ........................................................ 371

Page 12: VBA-Programmierung fur Word, Excel und Access

RechtsInhaltsverzeichnis 11

10.5 Schriftarten ermitteln ......................................................................................... 37210.6 Dokumenteigenschaften auslesen und setzen ................................................. 37410.7 Kommentare aufspüren und auslesen .............................................................. 38010.8 Texte/Formate suchen und ersetzen ................................................................ 38310.9 Arbeiten mit Hyperlinks ..................................................................................... 39710.10 Bilder in Dokumenten verarbeiten .................................................................... 40110.11 Arbeiten mit Tabellen ........................................................................................ 406

11 Programmierung mit Access ......................................................................... 41111.1 Das Programmieren von Tabellen .................................................................... 41111.2 Das Programmieren von Abfragen ................................................................... 43611.3 Das Programmieren von Formularen ............................................................... 450

12 Office im Zusammenspiel .............................................................................. 45912.1 Adressen nach Outlook transferieren ............................................................... 45912.2 E-Mail-Verkehr in Word protokollieren .............................................................. 46212.3 Access-DB in Word verfügbar machen ............................................................. 46412.4 Objekte in Word-Dokumente integrieren .......................................................... 47012.5 Excel-Daten nach Word kopieren ..................................................................... 47312.6 Der Datenaustausch zwischen Access und Excel ............................................ 477

13 Auf Fehlersuche in Office .............................................................................. 48113.1 Typische Fehlerquellen ..................................................................................... 48113.2 Die Fehlerbehandlung ...................................................................................... 48813.3 Allgemeine Punkte zur Programmierung .......................................................... 490

14 Tuning der VBA-Programme.......................................................................... 49114.1 Makros schneller ablaufen lassen .................................................................... 49114.2 VBA-Abläufe sichtbar machen .......................................................................... 499

15 Die Office-VBA-FAQ........................................................................................ 50315.1 Office-Animationen erstellen ............................................................................. 50315.2 Termine in den Outlook-Kalender übertragen .................................................. 50915.3 Excel-Auswertungen nach PowerPoint transportieren ..................................... 51115.4 Das Steuerelement TreeControl ....................................................................... 51315.5 Diagramme als Grafiken speichern .................................................................. 51515.6 Das Kalendersteuerelement einsetzen ............................................................. 51615.7 Zugriff auf Microsoft Graph programmieren ...................................................... 518

A Die Dateien zum Buch .................................................................................... 521

B Anhang............................................................................................................. 523

Stichwortverzeichnis ...................................................................................... 535

Page 13: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 14: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang13

1 Die Entwicklungsumgebung von VBA

Egal, in welcher Office-Komponente Sie sich gerade befinden – über die Tastenkombination(Alt)+(F11) gelangen Sie direkt in die Entwicklungsumgebung. Da diese Entwicklungsum-gebung in nahezu allen Office-Programmen identisch ist, werde ich Ihnen diese Umgebungam Beispiel von Microsoft Word 2002 beschreiben und auf die Besonderheiten der jewei-ligen Office-Komponenten eingehen.

Abb. 1.1 Die Entwicklungsumgebung von Word 2002

1.1 Makros einfügen

Um ein Makro anzulegen, müssen Sie zuerst einmal ein neues Modul anlegen. Dazu wählenSie in der Entwicklungsumgebung von Word 2002 aus dem Menü EINFÜGEN den BefehlMODUL. Auf der rechten Seite Ihrer Entwicklungsumgebung erscheint nun das so genannteCode-Fenster, in welches Sie Ihre Makros eintippen.

Page 15: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA14

Legen Sie nun Ihr erstes Makro an, indem Sie in das Codefenster das Schlüsselwort Subschreiben. Erfassen Sie danach nach einem Leerschritt einen beliebigen Namen für IhrMakro, welcher allerdings keine Leer- und Sonderzeichen enthalten darf. Außerdem darf dererste Buchstaben keine Zahl sein. Nach der Benennung des Makros setzen Sie eine öffnendensowie direkt im Anschluss eine schließende runde Klammer hinter den Namen und bestätigenmit (¢). Die erste Zeile Ihres Makros wird sogleich mit einer End-Sub-Zeile vervollständigt.Sie haben somit den Rumpf für Ihr erstes Makro.

Abb. 1.2 Das erste Makro in Word

Sie können jetzt im ersten Makro ein paar Leerzeilen einfügen, wenn Sie möchten. Dazu set-zen Sie den Mauszeiger ans Ende der ersten Zeile des Makros und drücken ein paar Mal dieTaste (¢). Das Makro macht im Moment noch nichts. Als Einstiegsaufgabe werden Sie nunden Namen des Anwenders, den Sie übrigens im Menü EXTRAS unter dem Befehl OPTIONEN

auf der Registerkarte BENUTZERINFORMATIONEN wiederfinden, auf dem Bildschirm aus. DerCode für diese Aufgabe lautet:

Sub AnwendernamenErmitteln()

Page 16: VBA-Programmierung fur Word, Excel und Access

Rechts1.2 Makros starten 15

Mithilfe der Funktion Msgbox können Sie eine Meldung auf dem Bildschirm anzeigen. DieEigenschaft Application gibt Ihnen Zugriff auf Ihre Word-Anwendung. Sie haben somitdie Möglichkeit, auf die Eigenschaft UserName zurückzugreifen, die Ihnen den Namen desAnwenders ermittelt.

1.2 Makros starten

Zum Starten eines Makros haben Sie mehrere Möglichkeiten:

1. In der Entwicklungsumgebung in der Symbolleiste VOREINSTELLUNG mit einem Klickauf das Symbol SUB/USERFORM AUSFÜHREN.

2. Starten eines Makros vom Dokument aus über das Menü EXTRAS und den Befehl MAKRO/MAKROS und die Auswahl des Makros im Listenfeld mit abschließendem Klick auf dieSchaltfläche AUSFÜHREN.

3. Starten eines Makros direkt aus der Entwicklungsumgebung im Codefenster, indem Sieden Mauszeiger auf die erste Zeile des Makros setzen und die Taste (F5) drücken.

1.3 Den Makrorekorder einsetzen

Haben Sie bisher noch nicht viel mit VBA gemacht, wird es am Anfang nicht einfach sein,den Aufbau der einzelnen Befehle zu erkennen. Um den Einstieg in die VBA-Programmie-rung zu erleichtern, stehen Ihnen für die Anwendungsprogramme Word und Excel sogenannte Makrorekorder zur Verfügung. Mithilfe dieser Makrorekorder können Sie automa-tisch Quellcode erzeugen und anhand dieser Umsetzung schnell Fortschritte in der Program-mierung mit VBA machen. Dabei führen Sie einige Arbeitsschritte manuell aus und lassenden Makrorekorder im Hintergrund mitlaufen. Nach der Aufzeichnung springen Sie in denQuellcode und passen diesen an.

1.3.1 Makro aufzeichnen

Als kleine Vorarbeit legen Sie zunächst einmal ein neues, noch leeres Dokument an underfassen einen kleinen Beispieltext. Möchten Sie diesen Beispieltext automatisch von Wordselbst erzeugen lassen, dann schreiben Sie die Formel =Rand(3,2) und bestätigen mit (¢).

MsgBox Application.UserNameEnd Sub

Page 17: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA16

Abb. 1.3 Beispieltext automatisch erzeugen

Wenn Sie sich den Beispielsatz ansehen, dann werden Sie feststellen, dass jeder Buchstabedes Alphabets mindestens einmal darin enthalten ist. Dieser Text ist in diesem Beispiel in derSchriftart TIMES NEW ROMAN eingetragen worden. Ihre Aufgabe ist es nun, die Schriftart desTextes zu ändern. Dabei werden Sie diesen Vorgang mit dem Makrorekorder aufzeichnenlassen. Befolgen Sie dazu die nächsten Arbeitsschritte:

1. Wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/AUFZEICHNEN.

Abb. 1.4 Makro aufzeichnen

Page 18: VBA-Programmierung fur Word, Excel und Access

Rechts1.3 Den Makrorekorder einsetzen 17

2. Geben Sie dem Makro im Feld MAKRONAME einen beschreibenden Namen.

3. Sie haben die Möglichkeit, dieses Makro einem Symbol in einer Symbolleiste bzw. dasMakro einer Tastenkombination zuzuweisen. Diese Möglichkeit sollten Sie jedoch beimTesten bzw. bei der Neuanlage des Makros noch nicht einsetzen.

4. Wählen Sie im Dropdownfeld MAKRO SPEICHERN Ihr aktuelles Dokument aus, sofern Siedas Makro nur für dieses Dokument einsetzen möchten. Entscheiden Sie sich hingegenfür den Befehl ALLE DOKUMENTE (NORMAL.DOT), dann wird das Makro in der zentralenDokumentdatei von Word gesichert. Damit kann das Makro für alle Dokumente einge-setzt werden. Sie sollten aber wirklich nur Makros dort hineinnehmen, die Sie wirklichfür alle oder zumindest viele Dokumente gebrauchen können.

5. Starten Sie Ihre Aufzeichnung mit OK.

6. Weisen Sie jetzt dem Text im Dokument eine andere Schriftart zu, indem Sie die Tasten-kombination (Strg)+(A) drücken, um den Text des ganzen Dokuments zu markieren.Wählen Sie danach aus dem Menü FORMAT den Befehl ZEICHEN. Auf der RegisterkarteSCHRIFT entscheiden Sie sich für die Schrift ARIAL und bestätigen mit OK. Achtung:Wenn Sie übrigens die Schriftart über die Symbolleiste FORMAT und dem DropdownfeldSCHRIFTART ändern, dann zeichnet der Makrorekorder diese Aktion nicht auf.

7. Beenden Sie die Aufzeichnung, indem Sie aus dem Menü EXTRAS den Befehl MAKRO/AUFZEICHNUNG BEENDEN wählen.

1.3.2 Resultate des Makrorekorders ansehen

Nun aber zurück zu unserem Word-Beispiel. Sehen Sie sich jetzt den aufgezeichneten Quell-code an, indem Sie über die Tastenkombination (Alt)+(F11) in die Entwicklungsumgebungwechseln.

Tipp:

Übrigens gibt es in Excel ebenso eine zentrale Arbeitsmappe, in der Sie Makros speichernkönnen, die Sie auch für andere Arbeitsmappen und nicht nur für die aktuelle Mappe ver-wenden können. Diese Arbeitsmappe heißt PERSONL.XLS und befindet sich im Unterver-zeichnis von Office im Ordner XLSTART. Standardmäßig wird diese Arbeitsmappe jedochnicht automatisch nach der Installation von Office angelegt. Diese Arbeitsmappe könnenSie aber recht schnell selbst anlegen, indem Sie ein Makro aufzeichnen und als Speicherortim Dialog MAKRO AUFZEICHNEN aus dem Dropdownfeld MAKRO SPEICHERN den BefehlPERSÖNLICHE MAKROARBEITSMAPPE auswählen.

Page 19: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA18

Abb. 1.5 Die Arbeit des Makrorekorders begutachten

Der Makrorekorder hat eine ganze Menge Befehle aufgezeichnet, die eigentlich gar nichtunbedingt gebraucht werden, um die gestellte Aufgabe auszuführen. Standardmäßig werdenin den ersten paar Zeilen Informationen über den Anwender eingetragen, der das Makro auf-gezeichnet hat sowie der Zeitpunkt der Aufnahme. Diese Informationen beginnen mit einemeinfachen Apostroph und werden somit von Word als Kommentar interpretiert. Diese Kom-mentarzeilen werden beim Makroablauf ignoriert.

Danach wird der Text des gesamten Dokuments mithilfe der Eigenschaft Selection mar-kiert, welches Ihnen das Objekt Selection (= Markierung) liefert. Auf dieses Objekt wer-den dann einige Eigenschaften gesetzt, die das Objekt näher beschreiben. So wird beispiels-weise die Eigenschaft Name abgefragt, um die gewünschte Schriftart des Textes in derMarkierung zu bestimmen. Neben der Schriftgröße, die über die Eigenschaft Size festgelegtwird, werden Informationen zum Schriftschnitt über die Eigenschaften Italic und Bold(kursiv und fett) vorgenommen, die für diese Aufgabe nicht benötigt und zu diesem Zweckmit dem Wert False ausgestattet werden. Weitere Eigenschaften wie Underline undUnderlineColor (Unterstreichung und Farbe für die Unterstreichung) werden mit so

Page 20: VBA-Programmierung fur Word, Excel und Access

Rechts1.3 Den Makrorekorder einsetzen 19

genannten Konstanten belegt. Diese Konstanten sind in VBA festgelegt und müssen dahergenauso angegeben werden.

Mithilfe der Anweisung With können Sie sich eine ganze Menge Schreibarbeit sparen. Überdiese Anweisung können Sie eine Reihe von Anweisungen für ein nachfolgendes Objekt aus-führen, ohne dieses immer wieder zu benennen. Sie benennen das Objekt Font im Beispieleinmal zu Beginn und setzen danach anstatt des Objekts einfach einen Punkt. Schließen Siedie Gültigkeit von with mit dem Befehl End With ab.

1.3.3 Zusatzinformationen anzeigen

Nachdem Sie den aufgezeichneten Quellcode einmal näher angesehen haben, würde ichIhnen empfehlen, die Online-Hilfe heranzuziehen, um noch mehr Informationen über die ver-wendeten Befehle, Objekte und Eigenschaften zu bekommen. Setzen Sie zu diesem Zweckden Mauszeiger auf das Wort, zu dem Sie nähere Informationen wünschen und drücken dieTaste (F1).

Abb. 1.6 Hilfetexte zur Eigenschaft Font

Die so aufgerufene Hilfe bietet Ihnen eine detaillierte Erklärung des Befehls sowie auch sehroft ein Beispielmakro an, welches Sie aus der Hilfe kopieren und in Ihr Modul einfügen kön-

Page 21: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA20

nen, indem Sie das Beispiel markieren und dann einen Klick mit der rechten Maustaste aufdas markierte Beispiel durchführen. Sie wählen aus dem Kontextmenü den Befehl Kopieren,setzen den Mauszeiger an die gewünschte Einfügeposition in Ihrem Makro und drücken dieTastenkombination (Strg)+(V), um das Beispielmakro einzufügen.

1.4 Die Arbeitsumgebung

Nachdem Sie Ihr erstes Makro ins Code-Fenster geschrieben und den Makrorekorder einge-setzt haben, lernen Sie jetzt die einzelnen Komponenten der Entwicklungsumgebung kennen.

1.4.1 Der Projekt-Explorer

Den Projekt-Explorer finden Sie standardmäßig am linken oberen Rand Ihrer Entwicklungs-umgebung. Dort sind alle momentan geöffneten Dokumente verzeichnet.

Abb. 1.7 Der Projekt-Explorer

Ganz zu Beginn sehen Sie die globale Vorlagendatei NORMAL.DOT, in der Sie Makros able-gen können, die Sie für alle Dokumente einsetzen können. Mit einem Klick auf die Plus-Sym-bole öffnen Sie weitere Unterordner in diesem Explorer. Hinter den Rubriken THISDOCU-MENT und NEWMACROS können Sie Quellcode hinterlegen. Klicken Sie dazu einfach dieentsprechende Rubrik doppelt an.

In der Rubrik ThisDocument haben Sie die Möglichkeit, Ereignisse einzustellen. Untereinem Ereignis versteht man einen Vorgang wie beispielsweise das Öffnen oder Schließeneines Dokuments. Dies Ereignisse können Sie abfangen und zusätzlichen Quellcode hinzufü-

Page 22: VBA-Programmierung fur Word, Excel und Access

Rechts1.4 Die Arbeitsumgebung 21

gen. So haben Sie beispielsweise die Möglichkeit, beim Öffnen eines Dokuments bestimmteVorgänge automatisch ablaufen zu lassen. So könnten Sie sich beispielsweise ein Beispielaus der Praxis vorstellen, bei dem beim Öffnen eines Dokuments automatisch eine E-Mail aneine bestimmte Person versendet wird.

Um die Ereignisse, auch als Events bezeichnet, in Word zu aktivieren, befolgen Sie die näch-sten Arbeitsschritte:

1. Wechseln Sie in die Entwicklungsumgebung von Word.

2. Führen Sie einen Doppelklick auf den Eintrag THISDOCUMENT im Projekt-Explorerdurch.

3. Wählen Sie aus dem ersten Dropdownfeld den Befehl DOCUMENT.

4. Wählen Sie aus dem zweiten Dropdownfeld das gewünschte Ereignis bzw. auch mehrerenacheinander aus.

Abb. 1.8 Word-Ereignisse einstellen

Das Ereignis Document_Close wird dann ausgeführt, wenn Sie Ihr Dokument schließen.Das Ereignis Document_New wird gestartet, wenn Sie ein neues Dokument einfügen. DasEreignis Document_Open wird automatisch ausgeführt, wenn Sie Ihr Dokument öffnen.

Page 23: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA22

Innerhalb dieser Ereignisse können Sie zusätzliche VBA-Anweisungen angeben, die beimentsprechenden Ereignis mit ausgeführt werden sollen.

Abb. 1.9 Die Arbeitsmappenereignisse von Excel

1.4.2 Das Eigenschaftsfenster

Das Eigenschaftsfenster finden Sie standardmäßig unterhalb des Projekt-Explorers. Es ent-hält nähere Festlegungen zum Dokument. Diese Eigenschaften können Sie entweder in die-sem Fenster einstellen oder auch per VBA-Code im Code-Fenster programmieren.

Tipp:

In Excel gibt es eine ganze Reihe weitere Ereignisse, die Sie entweder für die kompletteArbeitsmappe oder auch nur für spezielle Tabellen einstellen können. Sie finden die Ereig-nisse in Excel, die für die ganze Arbeitsmappe Gültigkeit haben, hinter der Rubrik DIESE-ARBEITSMAPPE. Möchten Sie hingegen ein Ereignis nur für eine einzelne Tabelle einstel-len, dann klicken Sie die gewünschte Tabelle im Projekt-Explorer doppelt an und wählendas Ereignis aus dem zweiten Dropdownfeld aus.

Page 24: VBA-Programmierung fur Word, Excel und Access

Rechts1.4 Die Arbeitsumgebung 23

Abb. 1.10 Das Eigenschaftsfenster

1.4.3 Das Code-Fenster

Im Code-Fenster erfassen und bearbeiten Sie Ihre VBA-Makros. Sollte dieses Fenster nochnicht eingeblendet sein, dann wählen Sie aus dem Menü ANSICHT den Befehl CODE.

Das Code-Fenster enthält folgende Objekte:

• Dropdownfeld OBJEKT: Hier werden die Namen der markierten Objekte angezeigt. Klik-ken Sie auf den Pfeil rechts neben dem Listenfeld, um eine Liste aller mit dem Formularverknüpften Objekte anzuzeigen.

• Dropdownfeld PROZEDUR: Hier werden alle Ereignisse und Prozeduren aufgelistet, diedem im Objekt-Feld angezeigten Objekt zugeordnet sind. Bei der Auswahl eines Ereig-nisses wird die mit diesem Ereignisnamen verknüpfte Ereignisprozedur im Code-Fensterangezeigt.

Page 25: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA24

Alle Prozeduren werden übrigens in alphabetischer Reihenfolge im Dropdownfeld angezeigt.Dies erleichtert die Suche nach bestimmten Modulen.

1.4.4 Das Direktfenster

Das Direktfenster setzen Sie ein, um beispielsweise bestimmte Inhalte von Variablen imDirektfenster ausgeben zu lassen, um beispielsweise das Ergebnis eines Makros zu testen.Erfassen Sie zunächst einmal in einer beliebigen Office-Anwendung das folgende Beispiel:

Das Makro wird eine Schleife genau fünfzehnmal durchlaufen. Bei jedem Schleifendurchlaufwird mithilfe des Befehls Debug.Print ein Eintrag ins Direktfenster geschrieben, der denaktuellen Schleifendurchlauf festhält. Setzen Sie die Einfügemarke in die erste Zeile desMakros und drücken Sie die Taste (F5), um das Makro zu starten. Kontrollieren Sie jetzt ein-mal das Ergebnis im Direktfenster. Dazu wählen Sie den Menübefehl ANSICHT/DIREKTFEN-STER oder drücken die Tastenkombination (Strg) + (G).

Hinweis:

Wenn Sie auf den rechten oberen Rand des Codefensters sehen, erkennen Sie einen Fen-sterteiler. Damit können Sie das Code-Fenster in zwei horizontale Bereiche unterteilen, indenen separate Bildläufe durchgeführt werden können. So können Sie unterschiedlicheTeile des Codes gleichzeitig angezeigen. Die Informationen, die im Feld OBJEKT und Pro-zedur angezeigt werden, beziehen sich auf den Code in dem Fenster, das gerade aktiv ist.Mit einem Doppelklick auf den Fensterteiler wird ein Fenster geschlossen.

Sub Schleifendurchläufe()Dim i_Zähler As IntegerFor i_Zähler = 1 To 15 Debug.Print "Schleifendurchlauf: " & i_ZählerNext i_ZählerEnd Sub

Listing 1.1: Schleifendurchläufe aufzeichnen

Page 26: VBA-Programmierung fur Word, Excel und Access

Rechts1.4 Die Arbeitsumgebung 25

Abb. 1.11 Bildunterschrift eintragen

Möchten Sie Ihren Quellcode schrittweise durchlaufen, dann setzen Sie beispielsweise dieEinfügemarke in die Zeile, bis zu der Sie den Code durchlaufen möchten, und drücken Siedie Taste (F9). Auf diese Weise haben Sie einen Haltepunkt im Quellcode gesetzt. Der Codewird jetzt bis zu dieser braun gekennzeichneten Zeile durchlaufen und stoppt genau an dieserPosition. Nun können Sie prüfen, ob das Makro auch korrekt funktioniert hat. Wenn allessoweit stimmt, können Sie durch die Taste (F5) dafür sorgen, dass das Makro bis zum Endedurchläuft. Sollte etwas bei dem Makro nicht stimmen, brechen Sie es ab, indem Sie aus demMenü AUSFÜHREN den Befehl ZURÜCKSETZEN wählen.

1.4.5 Das Überwachungsfenster

Eine nützliche Funktion können Sie einsetzen, wenn Sie das Überwachungsfenster einblenden.Wählen Sie dazu aus dem Menü ANSICHT den Befehl ÜBERWACHUNGSFENSTER. Sie habenjetzt beispielsweise die Möglichkeit zu überprüfen, wann sich eine bestimmte Variable ändert.Genau dann soll der Makroablauf unterbrochen werden. Im folgenden Beispiel wird eineSchleife genau fünfzehnmal durchlaufen. Bei jedem Schleifendurchlauf wird die Variable

Page 27: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA26

i_zähler verändert. Nach dem fünften Schleifendurchlauf soll das Makro stoppen. ErfassenSie zunächst das folgende Makro:

Stellen Sie jetzt die Überwachung ein, indem Sie wie folgt vorgehen:

1. Blenden Sie das Überwachungsfenster ein, indem Sie aus dem Menü ANSICHT den BefehlÜBERWACHUNGSFENSTER auswählen.

2. Wählen Sie aus dem Menü DEBUGGEN den Befehl ÜBERWACHUNG HINZUFÜGEN.

Abb. 1.12 Überwachung hinzufügen

3. Geben Sie im Feld AUSDRUCK den Überwachungsausdruck I_ZÄHLER=5 ein.

4. Stellen Sie sicher, dass im Dropdownfeld PROZEDUR das richtige Makro eingestellt ist.

5. Aktivieren Sie die Option UNTERBRECHEN, WENN DER WERT TRUE IST.

6. Bestätigen Sie Ihre Einstellung mit OK.

7. Starten Sie nun das Makro.

Sub Schleifendurchläufe()Dim i_Zähler As IntegerFor i_Zähler = 1 To 15 Debug.Print "Schleifendurchlauf: " & i_ZählerNext i_ZählerEnd Sub

Page 28: VBA-Programmierung fur Word, Excel und Access

Rechts1.4 Die Arbeitsumgebung 27

Abb. 1.13 Makro bei bestimmter Bedingung stoppen

Das Makro läuft genau so lange, bis es fünfmal die Schleife durchlaufen hat. Dann entschei-den Sie, wie weiter verfahren wird. Sie können entweder das Makro fortsetzen, indem Sie dieTaste (F5) drücken oder das Makro abbrechen, indem Sie aus dem Menü AUSFÜHREN denBefehl ZURÜCKSETZEN wählen.

1.4.6 Das Lokal-Fenster

Das Lokal-Fenster wird in der Entwicklungsumgebung standardmäßig nicht angezeigt. Überdas Menü ANSICHT können Sie dieses Fenster jedoch einblenden. Das Lokal-Fenster zeigtalle deklarierten Variablen in der aktuellen Prozedur und deren Werte an. Sie haben damit dieMöglichkeit, die Werte von Variablen übersichtich zu prüfen.

Wenden Sie nun das Lokal-Fenster anhand unseres letzten Beispiels an. Dabei gehen Sie wiefolgt vor:

1. Blenden Sie das Lokal-Fenster ein, indem Sie aus dem Menü ANSICHT den BefehlLOKAL-FENSTER wählen.

2. Setzen Sie den Mauszeiger auf die Zeile next i_zähler und drücken Sie die Taste (F9),um einen Haltepunkt zu setzen.

Page 29: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA28

3. Setzen Sie den Mauszeiger auf die erste Zeile Ihres Makros und drücken Sie die Taste(F5), um das Makro zu starten.

Abb. 1.14 Variablen mit dem Lokalfenster überwachen

Das Makro stoppt nun genau nach dem ersten Schleifendurchlauf. Sie können sich den augen-blicklichen Wert der Variablen nun im Lokal-Fenster ansehen.

1.5 Wertvolle Helfer bei der Programmierung

Um schnellstmöglich programmieren zu können, stehen Ihnen bestimmte Hilfsmittel in derEntwicklungsumgebung zur Verfügung. So können Sie beispielsweise mithilfe von Symbol-leisten noch schneller Standardbefehle anwenden.

1.5.1 Die Symbolleiste Bearbeiten

Diese Symbolleiste ist standardmäßig in der Entwicklungsumgebung nicht eingeblendet.Holen Sie das jetzt nach, indem Sie im Menü ANSICHT den Befehl SYMBOLLEISTEN/BEAR-BEITEN aufrufen.

Page 30: VBA-Programmierung fur Word, Excel und Access

Rechts1.5 Wertvolle Helfer bei der Programmierung 29

Abb. 1.15 Die Symbolleiste Bearbeiten

Die wichtigsten Funktionen werden nun erklärt. Wenn Sie den Mauszeiger auf ein beliebigesSymbol setzen, wird der Name der Funktion in einem kleinen QuickInfo-Fenster angezeigt.

Einzug vergrößern bzw. verkleinern

Mit der Funktion EINZUG VERGRÖSSERN können Sie einzelne Zeilen oder auch mehrere Zei-len blockweise nach rechts einrücken. Dies macht den Programmcode leichter lesbar. Analogzu dieser Funktion können Sie mit der Funktion EINZUG VERKLEINERN eingerückte Pro-grammteile wieder nach links rücken und pro Klick jeweils den markierten Text um einenTabstopp nach links versetzen.

Haltepunkt ein/aus

Setzen Sie den Mauszeiger auf die Zeile im Code, bis zu der das Makro laufen soll. Wenn Sienun das Makro starten, stoppt es genau an diesem Haltepunkt. Hiermit können Sie Pro-gramm-Zwischenstände überprüfen. Sie werden somit auch erstklassig bei der Fehlersucheunterstützt. Einen Haltepunkt können Sie auch setzen, wenn Sie die Taste (F9) drücken.

Block auskommentieren

Hinterlegen Sie ausreichend Kommentare in Ihren Makros. Es fällt Ihnen dadurch späterleichter, die einzelnen Befehle nachzuvollziehen. Auch Änderungen am Makro selbst könnenauf diese Art und Weise festgehalten werden.

Um einen Kommentar zu hinterlegen, haben Sie mehrere Möglichkeiten:

• Geben Sie ein einfaches Anführungszeichen (') vor dem eigentlichen Befehl oder Text einoder

• erfassen Sie etwas altertümlicher die Anweisung Rem, gefolgt von einem Leerzeichenund dem Befehl oder Text.

Der Kommentar nimmt in beiden Fällen standardmäßig die Schriftfarbe GRÜN an. Diese sokommentierten Zeilen werden beim Ablauf des Makros nicht ausgewertet. Sie können ganzeKommentarzeilen anlegen oder auch innerhalb einer Zeile am Ende einen Kommentar anfü-gen. Möchten Sie innerhalb einer Zeile einen Kommentar im Anschluss eines Befehls erfas-

Page 31: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA30

sen, fügen Sie nach dem eigentlichen Befehl ein einfaches Anführungszeichen (') ein undschreiben Ihren Kommentar dazu.

Eigenschaften/Methoden anzeigen

Möchten Sie ganz schnell die zur Verfügung stehenden Eigenschaften und Methoden einerAnweisung einsehen, markieren Sie den gewünschten Befehl im Code und klicken auf dasSymbol EIGENSCHAFTEN/METHODEN ANZEIGEN.

In der folgenden Abbildung werden für das Objekt Selection die zur Verfügung stehendenMethoden und Eigenschaften in einem Kontextmenü angezeigt.

Abb. 1.16 Verfügbare Eigenschaften und Methoden anzeigen

Hinweis:

Möchten Sie nicht nur einzelne Zeilen, sondern ganze Textblöcke in Kommentar setzen,dann markieren Sie den Bereich, den Sie auskommentieren möchten, und klicken auf dasSymbol BLOCK AUSKOMMENTIEREN. Um einzelne Zeilen oder auch einen ganzen Blockwieder zu aktivieren, markieren Sie die entsprechende(n) Zeile(n) und klicken auf dasSymbol AUSKOMMENTIERUNG DES BLOCKS AUFHEBEN.

Page 32: VBA-Programmierung fur Word, Excel und Access

Rechts1.5 Wertvolle Helfer bei der Programmierung 31

Übrigens können Sie die zur Verfügung stehenden Methoden und Eigenschaften auch überdie Tastenkombination (Strg)+(J) abrufen. Geben Sie davor das Objekt ein, zudem Sie dieverfügbaren Methoden und Eigenschaften abrufen möchten.

Parameterinfo

Wenn Sie einen Befehl im Code-Bereich eingeben und danach die Taste (Leer) drücken,wird dynamisch ein QuickInfo-Fenster angezeigt, in dem Sie die zur Verfügung stehendenArgumente ablesen können. Die QuickInfo hilft Ihnen schnell weiter, die Befehle in der rich-tigen Syntax und mit den zur Verfügung stehenden Argumenten einzugeben. Möchten Siebereits erfasste Befehle mit weiteren Argumenten bestücken, setzen Sie die Einfügemarke indie Anweisung (nicht auf den Befehl) und klicken in der Symbolleiste BEARBEITEN auf dasSymbol PARAMETERINFO.

In der folgenden Abbildung wird für die Methode GoTo des Objekts Selection die erforderli-che Syntax ermittelt und in einem QuickInfo-Fenster angezeigt.

Abb. 1.17 Parameterinfos anzeigen

Konstanten anzeigen

Einige VBA-Befehle bieten Ihnen so genannte Konstanten an. Solche Konstanten finden Siebeispielsweise beim Befehl MsgBox. Dieser Befehl zeigt ein normales Meldungsfenster mit

Page 33: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA32

einer OK-Schaltfläche an. Diesem Standarddialog können Sie weitere Schaltflächen bzw.Symbole hinzufügen. Genau diese sind als Konstanten hinterlegt.

Abb. 1.18 Verfügbare Konstanten anzeigen

QuickInfo

Wenn Sie die Einfügemarke in einen Befehl setzen und danach auf das Symbol QUICKINFO

klicken, wird Ihnen die komplette Syntax des Befehls angezeigt. Diese QuickInfo können Sienoch schneller anzeigen, wenn Sie die Tastenkombination (Strg) + (I) drücken.

Lesezeichen setzen/zurücksetzen

Wenn Sie VBA-Makros schreiben, die sehr umfangreich werden, hilft es Ihnen vielleichtweiter, wenn Sie Lesezeichen in Ihrem Code setzen, um später schneller darauf zurückgreifenzu können. Dazu setzen Sie die Einfügemarke auf die Stelle im Code, an der Sie ein Lesezei-chen setzen möchten, und klicken auf das Symbol LESEZEICHEN/ZURÜCKSETZEN. Am Beginnder Zeile wird nun ein hellblaues abgerundetes Vierecksymbol eingefügt. Betätigen Sie die-ses Symbol erneut, wird das Lesezeichen wieder entfernt.

Mit dem Einsatz von Lesezeichen können Sie schneller von einer Stelle an eine andere sprin-gen. Somit sind Sie auch in der Lage, bestimmte Codestücke miteinander zu vergleichen,ohne lange über die Bildlaufleisten die richtige Stelle im Code suchen zu müssen.

Sobald Sie ein oder auch mehrere Lesezeichen in Ihrem Quellcode gesetzt haben, werdenweitere Symbole in der Symbolleiste BEARBEITEN aktiviert. Damit können Sie zum nächsten

Page 34: VBA-Programmierung fur Word, Excel und Access

Rechts1.5 Wertvolle Helfer bei der Programmierung 33

bzw. vorherigen Lesezeichen springen. Nachdem Sie Ihre Makros fertig gestellt haben, kön-nen Sie mit einem Klick alle gesetzten Lesezeichen wieder entfernen.

Ganzes Wort

Hinter diesem Symbol verbirgt sich eine Erleichterung bei der Eingabe von Befehlen. GebenSie hierfür die ersten paar Buchstaben eines Befehls ein. Der VBA-Editor ergänzt dann auto-matisch die restlichen Buchstaben des Befehls, sofern er ihn erkennt. Geben Sie beispiels-weise einmal die Buchstaben Sel ein und klicken Sie danach auf das Symbol GANZESWORT. Der VBA-Editor schlägt daraufhin den Befehl Selection vor.

Abb. 1.19 VBA-Befehle automatisch vervollständigen

1.5.2 Die Symbolleiste Debuggen

Die Symboleiste DEBUGGEN stellt Ihnen Symbole zur Verfügung, die das schnelle Testen vonQuellcode vereinfachen.

Hinweis:

Schneller geht es allerdings, wenn Sie die ersten Buchstaben eines Befehls eingeben unddann die Tastenkombination (Strg) + (Leer) drücken.

Page 35: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA34

Abb. 1.20 Die Symbolleiste Debuggen

Die Symbole haben folgende Bedeutung (von links nach rechts):

• ENTWURFSMODUS: Aktiviert bzw. Deaktiviert den Entwurfsmodus. Im Entwurdsmoduskönnen Sie beispielsweise Einstellungen für Steuerelemente wie Schaltflächen und Text-felder festlegen.

• SUB/USERFORM AUSFÜHREN: Führt die aktuelle Prozedur aus, falls sich der Cursor ineiner Prozedur befindet; führt das UserForm-Formular aus, falls ein UserForm-Formularaktiv ist; führt ein Makro aus, falls weder ein Code-Fenster noch ein UserForm-Formularaktiv ist.

• UNTERBRECHEN: Beendet die Ausführung eines Programms und wechselt in den Halte-modus. Stattdessen können Sie auch die Taste (Esc) drücken, um den Ablauf des Makroszu stoppen.

• ZURÜCKSETZEN: Löscht die Aufrufeliste und die Variablen auf Modulebene und beendetdas Projekt. Dieses Symbol klicken Sie an, wenn Ihr VBA-Editor einen Fehler im Makrofestgestellt hat und die »Fehlerzeile« gelb hinterlegt.

• HALTEPUNKT EIN/AUS: Setzt oder entfernt einen Haltepunkt in der aktuellen Zeile. Alter-nativ dazu genügt auch das Drücken der Taste (F9), um einen Haltepunkt zu setzen bzw.zu entfernen. Eine Zeile, die einen Haltepunkt enthält wird standardmäßig braun hinter-legt.

• EINZELSCHRITT: Führt jeweils genau eine Anweisung im Code aus. Alternativ können Siehier 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 Anweisungim Code aus.

• PROZEDUR ABSCHLIESSEN: Führt die restlichen Zeilen einer Prozedur aus.

• LOKAL-FENSTER: Blendet das Lokal-Fenster ein.

• DIREKTFENSTER: Blendet das Direktfenster ein.

• ÜBERWACHUNGSFENSTER: Blendet das Überwachungsfenster ein.

• AKTUELLEN WERT ANZEIGEN: Zeigt das Dialogfeld AKTUELLEN WERT ANZEIGEN mitdem aktuellen Wert des ausgewählten Ausdrucks an.

• AUFRUFLISTE: Zeigt das Dialogfeld AUFRUFELISTE an, in dem die derzeit aktiven Proze-duraufrufe (Prozeduren in der Anwendung, die gestartet, aber nicht abgeschlossen wur-den) angezeigt werden.

Page 36: VBA-Programmierung fur Word, Excel und Access

Rechts1.6 Weitere Einstellungen 35

1.6 Weitere Einstellungen

In der Entwicklungsumgebung haben Sie die Möglichkeit, den Visual-Basic-Editor nachIhren eigenen Wünschen hin anzupassen. Dazu wählen Sie aus dem Menü EXTRAS denBefehl OPTIONEN.

1.6.1 Registerkarte Editor

Wechseln Sie auf die Registerkarte EDITOR. Dort können Sie die Einstellungen für das Code-und das Projektfenster festlegen.

Abb. 1.21 Editoreinstellungen vornehmen

Im Gruppenfeld CODE-EINSTELLUNGEN finden Sie die folgenden Einstellungsmöglich-keiten:

• AUTOMATISCHE SYNTAXÜBERPRÜFUNG: Mit dieser Einstellung sorgen Sie dafür, dass IhrEditor nach der Eingabe einer Codezeile automatisch eine Syntaxprüfung vornimmt.

• VARIABLENDEKLARATION ERFORDERLICH: Wenn Sie diese Option aktivieren, wird dieAnweisung Option Explicit den allgemeinen Deklarationen in allen neuen Modulenhinzugefügt. Damit müssen alle im Code verwendeten Variablen zu Beginn eines Makrosdefiniert werden. Wird dies vergessen, weist Sie Ihre Office-Anwendung automatischdarauf hin. Es wird auf jeden Fall kein Makro ausgeführt, in dem nicht alle verwendetenVariablen definiert sind.

Page 37: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA36

• ELEMENTE AUTOMATISCH AUFLISTEN: Zeigt eine Liste mit den Informationen an, die dieAnweisung an der aktuellen Einfügemarke logisch vervollständigen würden.

• AUTOMATISCHE QUICKINFO: Wird diese Option aktiviert, werden bei der Eingabe einesBefehls die dazugehörigen Funktionen bzw. Parameter angezeigt.

• AUTOMATISCHE DATEN-TIPPS: Diese Option ist lediglich im Haltemodus verfügbar undzeigt den Wert der Variablen an, auf der der Mauszeiger sich gerade befindet.

• AUTOMATISCH EINZUG VERGRÖSSERN: Zur besseren Übersichtlichkeit können Sie IhrenQuellcode einrücken. Die dafür zur Verfügung gestellte Option ermöglicht, für die ersteCodezeile einen Tabulator festzulegen.

• TAB-SCHRITTWEITE: In diesem Eingabefeld stellen Sie die Tab-Schrittweite auf einenWert zwischen 1 und 32 Leerzeichen ein.

Im Gruppenfeld FENSTEREINSTELLUNGEN können Sie das Drag & Drop im Code-Fenster aus-schalten, automatisch eine Trennlinie zwischen den einzelnen Prozeduren ziehen lassen unddas Erscheinungsbild von neuen Modulen beeinflussen.

1.6.2 Registerkarte Editorformat

Wenn Sie zur Registerkarte EDITORFORMAT wechseln, können Sie die Darstellung IhresQuellcodes anpassen.

Abb. 1.22 Editierformat anpassen

Page 38: VBA-Programmierung fur Word, Excel und Access

Rechts1.6 Weitere Einstellungen 37

Im Listenfeld CODE-FARBEN werden die Textelemente angezeigt, für die die Farben ange-passt werden können. Darunter befinden sich drei Dropdown-Felder, in denen Sie das Formatfür den Vorder- bzw. Hintergrund der einzelnen Elemente sowie das Kennzeichen in derKennzeichenleiste bestimmen können. Darüber hinaus haben Sie die Möglichkeit, dieSchriftart sowie deren Größe zu bestimmen. Die Kennzeichenleiste kommt dann zur Geltung,wenn Sie häufiger mit Haltepunkten oder Lesezeichen arbeiten.

1.6.3 Registerkarte Allgemein

Auf der Registerkarte ALLGEMEIN können Sie Einstellungen vornehmen, die die Fehler-behandlung und die Kompilierungseinstellungen für das aktuelle Visual Basic-Projekt fest-legen.

Abb. 1.23 Allgemeine Einstellungen vornehmen

Auf der Registerkarte ALLGEMEIN finden Sie folgende Einstellmöglichkeiten:

• Im Gruppenfeld EINSTELLUNGEN FÜR DAS FORMULAR-RASTER können Sie die Darstel-lungsart des Formulars bzw. einer USERFORM beim Bearbeiten festlegen. Sie können einRaster anzeigen, die Rastereinheiten sowie die Rasterung selbst für das Formular festle-gen und eingefügte Steuerelemente automatisch am Raster ausrichten lassen.

• Die Einstellung QUICKINFO ANZEIGEN bewirkt, dass die QuickInfos für die Symbolschalt-flächen angezeigt werden.

Page 39: VBA-Programmierung fur Word, Excel und Access

Links

1 Die Entwicklungsumgebung von VBA38

• Aktivieren Sie das Kontrollkästchen AUSBLENDEN DES PROJEKT SCHLIEßT FENSTER,wenn Projekt-, UserForm-, Objekt- oder Modulfenster automatisch geschlossen werdensollen, sobald ein Projekt im Projekt-Explorer ausgeblendet wird.

• Im Gruppenfeld BEARBEITEN UND FORTFAHREN bestimmen Sie, ob eine Benachrichti-gung erfolgen soll, wenn durch eine angeforderte Aktion alle Variablen auf Modulebenefür ein laufendes Projekt zurückgesetzt werden.

• Das Gruppenfeld UNTERBRECHEN BEI FEHLERN bestimmt, wie Fehler in der Visual-Basic-Entwicklungsumgebung verarbeitet werden sollen. Das Aktivieren dieser Optionwirkt sich auf alle Instanzen von Visual Basic aus, die nach dem Ändern dieser Einstel-lung gestartet wurden. Sie haben dabei folgende 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 Codein einem Klassenmodul befindet. Die fehlerhafte Zeile wird dann mit einer gelbenHintergrundfarbe hinterlegt.

• IN KLASSENMODUL: Mit dieser Einstellung werden alle nicht verarbeiteten Fehler ineinem 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 Fehlerbe-handlungsroutine vorhanden sein, bewirkt der Fehler, dass der Haltemodus für dasProjekt aktiviert wird.

• Im Gruppenfeld KOMPILIEREN legen Sie fest, ob ein Projekt vor dem Start vollständigkompiliert oder ob der Code bei Bedarf kompiliert wird, wodurch die Anwendung schnel-ler gestartet werden kann.

1.6.4 Registerkarte Verankern

Auf der Registerkarte VERANKERN legen Sie fest, welche Fenster verankerbar sein sollen.

Page 40: VBA-Programmierung fur Word, Excel und Access

Rechts1.6 Weitere Einstellungen 39

Abb. 1.24 Fenster verankern

Ein Fenster ist verankert, wenn es mit einer Kante eines anderen verankerbaren Fensters odereines Anwendungsfensters verbunden ist. Ein verankerbares Fenster wird beim Verschiebenautomatisch ausgerichtet. Ein Fenster ist nicht verankerbar, wenn es an eine beliebige Posi-tion auf dem Bildschirm verschoben werden kann und diese Position beibehält. Wählen Siedie Fenster aus, die verankerbar sein sollen, und deaktivieren Sie die Kontrollkästchen für dieanderen Fenster.

Page 41: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 42: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang41

2 Die Sprachelemente von VBA

Jede Programmiersprache weist einen bestimmten Satz an Befehlen auf, die in den meistenFällen in englischer Sprache sind. Trotzdem kann man nicht allgemein sagen, dass jederBefehl in verschiedenen Sprachen auch gleich lauten muss. Was aber in jeder Sprache exi-stiert, sind die so genannten Sprachelemente wie Schleifen und Verzweigungen. Lernen Siein diesem Kapitel anhand von allgemeinen Aufgaben in Office die Syntax sowie die Einsatz-möglichkeiten dieser Sprachelemente kennen. Ein weiterer Inhalt dieses Kapitels sindSprachbestandteile wie Datentypen, Variablen, Konstanten und Operatoren.

2.1 Variablen und Konstanten

Mithilfe von Variablen speichern Sie Informationen dauerhaft während der Laufzeit einesMakros, d.h., Sie können Variablen auch mehrmals im Makro benutzen, indem Sie Variablenfüllen und Werte hoch zählen oder subtrahieren. Mit Konstanten legen Sie Informationenfest, die sich nicht ändern. Microsoft Office bietet für die Deklaration von Variablen undKonstanten eine ganze Reihe von Datentypen an. Je nach Aufgabe setzen Sie dazu die vor-gesehenen Datentypen ein.

Bei der Vergabe von Variablennamen müssen Sie einige Regeln befolgen:

• Das erste Zeichen muss ein Buchstabe sein. Nachfolgende Zeichen können Buchstaben,Zahlen und einige Sonderzeichen sein.

• Verwenden Sie keine Leerzeichen in einem Variablennamen. Wenn Sie einzelne Wörtertrennen möchten, verwenden Sie dazu den Unterstrich, wie z.B. Dim Kosten_Februar asCurrency.

• Sonderzeichen wie #, %, &, ! oder ? sind nicht erlaubt.

Global kontra lokal

Variablen werden immer zu Beginn eines Makros deklariert, also nach der Sub-Anweisung.In diesem Fall spricht man von lokalen Variablen. Diese Variablen können nur in dem Makroverwendet werden, in dem sie deklariert wurden. Nachdem ein Makro durchgelaufen ist, wirddiese Variable wieder aus dem Speicher gelöscht.

Von globalen Variablen spricht man, wenn Sie diese allgemein gültig, also in mehrerenMakros verwenden möchten. Dann muss die Variablendeklaration vor der Sub-Anweisungstattfinden.

Page 43: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA42

Globale Variablen können gleich für mehrere Makros verwendet werden. Diese werden nachdem Ende eines Makros auch nicht gelöscht und behalten ihren aktuellen Wert bei. In derRegel sollten globale Variablen aber weitestgehend vermieden werden, da sie wertvollenSpeicherplatz belegen, was sich negativ auf das Laufzeitverhalten von Makros auswirkenkann.

Variablen deklarieren

Eine Variablendeklaration beginnt stets mit der Anweisung Dim, gefolgt von einem Varia-blennamen, den Sie frei unter Berücksichtigung der obigen Regeln wählen können. Danachgeben Sie mit dem Schlüsselwort As an, welchen Datentyp die Variable erhalten soll. Die fol-gende Tabelle listet die gängigsten Datentypen auf.

Variablentypen

Je nachdem, für welchen Zweck Sie eine Variable einsetzen möchten, gibt es in der Program-mierung folgende Variablentypen:

• Statische Variablen: Bei den statischen Variablen bleiben die Inhalte nach dem Makro-ende erhalten. Statische Variablen werden mit dem Schlüsselwort Static deklariert, bei-spielsweise Dim Static Betrag as Currency.

• Private Variablen: Bei diesem Variablentyp ist deren Gültigkeit auf alle im Projektbefindlichen Makros gültig. Private Variablen werden über das Schlüsselwort Privatedeklariert, z.B. Private i as integer.

• Öffentliche Variablen: Bei diesem Variablentyp haben Sie die Möglichkeit, auch aufVariablen zuzugreifen, die in anderen Modulen definiert wurden. Diese Variablen werdenmit der Anweisung Public deklariert, beispielsweise Public s as string.

Variablentyp Wertebereich/Speicherbedarf

Byte Ganze Zahlen zwischen 0 und 255 (1 Byte)

Boolean Wahrheitswert, entweder True oder False (2 Bytes)

Currency Währungs-Datentyp: Festkommazahlen mit 15 Stellen vor und 4 Stellen nach dem Komma (8 Bytes)

Date Datums- und Zeit-Datentyp (8 Bytes)

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 Bytes)

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 Bytes)

Single Fließkommazahlen mit einer Genauigkeit von 8 Stellen hinter dem Komma (4 Bytes)

String Der Datentyp für alle Texte (10 Bytes)

Variant Standarddatentyp, wird automatisch gewählt, wenn kein anderer Datentyp definiert ist (16 Bytes)

Page 44: VBA-Programmierung fur Word, Excel und Access

Rechts2.1 Variablen und Konstanten 43

Variablendeklaration erzwingen

Sie können Ihre Entwicklungsumgebung so einstellen, dass jede Variable vor deren erstenVerwendung deklariert werden muss. Vorher läuft kein einziges Makro an, sofern es mitVariablen arbeitet, die zuvor nicht deklariert wurden. Um diese wichtige Einstellung vorzu-nehmen, gehen Sie wie folgt vor:

• Wechseln Sie in die Entwicklungsumgebung.

• Wählen Sie aus dem Menü EXTRAS den Befehl OPTIONEN.

• Wechseln Sie auf die Registerkarte EDITOR.

• Aktivieren Sie das Kontrollkästchen VARIABLENDEKLARATION ERFORDERLICH.

• Bestätigen Sie mit OK.

Wenn Sie in Zukunft ein neues Modul einfügen, wird automatisch die Anweisung OptionExplicit in die erste Zeile Ihres Modulblatts eingetragen. Diese Anweisung können Sieselbstverständlich auch von Hand erfassen.

Konstanten deklarieren

Bei der Deklaration von Konstanten gelten dieselben Syntaxregeln wie schon bei den Varia-blen. Im Gegensatz zu den Variablen ändern die Konstanten ihre Werte nie und bleiben wäh-rend der Programmausführung immer konstant. Auch hier wird zwischen lokalen und globa-len Konstanten unterschieden. Globale Konstanten werden außerhalb der einzelnen Makros

Variablencheck vornehmen:

Die Entwicklungsumgebung bietet Ihnen eine Möglichkeit zu prüfen, wo verwendeteVariablen definiert sind. Klicken Sie die zu überprüfende Variable mit der rechten Mau-staste an und wählen Sie im Kontextmenü den Befehl DEFINITION aus. Der Mauszeigerspringt danach direkt an die Stelle im Code, an der die Variable definiert wurde.

Variablendeklaration noch kürzer:

Bei der Deklaration von Variablen haben Sie die Möglichkeit, die Variablennamen inKurzform anzugeben, um sich Schreibarbeit zu ersparen. Sehen Sie sich dazu einmal diefolgende Tabelle an:

Langform Kurzform

Dim i as integer Dim i%

Dim l as long Dim l&

Dim Kosten as Currency Dim Kosten@

Dim s as string Dim s$

Page 45: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA44

definiert und sind damit für alle Makros im Modul verwendbar. Lokale Konstanten hingegengelten nur in dem Makro, in welchem sie definiert wurden.

Konstanten werden durch das Schlüsselwort Const, gefolgt von einem Namen für die Kon-stante und dem dazugehörigen Wert deklariert. Einige Beispiele hierfür lauten:

2.2 Operatoren

Als Voraussetzung für das Arbeiten mit Verzweigungen und Schleifen brauchen Sie die Ope-ratoren von VBA. Damit führen Sie unter anderem Rechenoperationen und Vergleiche durch.

Folgende Typen von Operatoren gibt es in VBA:

• arithmetische Operatoren

• Vergleichsoperatoren

• Verkettungsoperatoren

• logische Operatoren

Arithmetische Operatoren

Beim Rechnen in VBA verwenden Sie dieselben Operatoren, die Sie vom Taschenrechnerher schon kennen. Auch bei den Rechenregeln rechnet Office nach der allgemein gültigenPunkt-vor-Strich-Regel.

Entnehmen Sie der folgenden Tabelle die zur Verfügung stehenden arithmetischen Operatoren.

Const Datei as String = "Mappe10.xls"Const DatumBeginn As Date = #1/5/2002#Const Rückfrage as String = _ "Wollen Sie den Vorgang wirklich durchführen?"Const MWST as Single = 1.16

Operator Erklärung

+ Addiert Zahlen miteinander

- Subtrahiert Zahlen voneinander

* Multipliziert Zahlenwerte

/ Dividiert Zahlenwerte

\ Dient zur Division zweier Zahlen und gibt ein ganzzahliges Ergebnis zurück

^ Potenziert eine Zahl mit einem Exponenten

Page 46: VBA-Programmierung fur Word, Excel und Access

Rechts2.2 Operatoren 45

Vergleichsoperatoren

Die folgende Tabelle enthält eine Liste der verfügbaren Vergleichsoperatoren.

Verkettungsoperator

Mit dem Verkettungsoperator verketten Sie Zeichenfolgen miteinander. Der Verkettungsope-rator lautet &.

MsgBox "Heute ist der " & Date

Abb. 2.1 Texte miteinander verketten

Logische Operatoren

Mithilfe der logischen Operatoren können Sie beispielsweise Bedingungen für Schleifenbzw. Verzweigungen oder Bedingungen für deren Abbruch formulieren.

Entnehmen Sie der folgenden Tabelle die verfügbaren logischen Operatoren in VBA.

Operator Erklärung

< kleiner als

<= kleiner oder gleich

> größer als

>= größer oder gleich

= gleich

<> ungleich

Operator Erklärung

And Hier müssen beide Bedingungen zutreffen.

Or Es muss eine der beiden Bedingungen zutreffen.

Xor Dient zum Durchführen einer logischen Exklusion zwischen zwei Ausdrücken.

Eqv Dient zum Bestimmen einer logischen Äquivalenz zwischen zwei Ausdrükken. Hat einer der beiden Ausdrücke den Wert 0, so ist das Ergebnis ebenfalls Null.

Not Führt eine logische Negation eines Ausdrucks durch.

Page 47: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA46

2.3 Verzweigungen

Nachdem Sie Variablen, Datentypen, Konstanten und Operatoren kennen gelernt haben, wer-den Sie nun weitere Sprachbestandteile kennen lernen.

Mit Verzweigungen können Sie in VBA bestimmte Zustände abfragen und je nach Zustandanders reagieren.

Die Syntax für eine solche Verzweigung lautet:

If Bedingung Then [Anweisungen] [Else Anweisungen]

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 müssen Sie entweder einen numeri-schen Ausdruck oder ein Zeichenfolgenausdruck eingeben, der True oder False ergibt.Wenn die Bedingung den Wert 0 zurückmeldet, wird Bedingung als False interpretiert.

Unter dem Argument Anweisungen werden jene Anweisungen aufgeführt, die durchgeführtwerden sollen, wenn die Bedingung den Wert True liefert.

Mit elseifAnweisungen sind eine oder mehrere Anweisungen gemeint, die ausgeführtwerden, wenn die zugehörige Bedingung (bzw. Bedingung-n) den Wert True meldet.

Das Argument elseAnweisungen meint eine oder mehrere Anweisungen, die ausgeführtwerden sollen, wenn keine der Bedingungen (Bedingung-Ausdruck oder Bedingung-n-Aus-druck) den Wert True melden.

Diese Syntax werden Sie jetzt an typischen Praxisbeispielen erkennen.

2.3.1 Office-Version erkennen

Wenn Sie Office-Anwendungen programmieren, dann müssen Sie unbedingt vorher festle-gen, für welche Versionen Ihre Lösung lauffähig sein soll. Möglicherweise müssen Sie auchmehrere Versionen abdecken. Dann können Sie über das folgende Makro prüfen, welche Ver-sion von Office installiert ist.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Page 48: VBA-Programmierung fur Word, Excel und Access

Rechts2.3 Verzweigungen 47

Mithilfe des Objekts Application haben Sie Zugriff auf alle Methoden und Eigenschaften,die sich unterhalb dieses Objekts befinden. Dabei repäsentiert das Objekt Application dasoberste Objekt der Hierarchie, nämlich die Anwendung selbst. Eine Eigenschaft, welche Siefür das Objekt Application abfragen können, ist Version. Die Eigenschaft Version gibtIhnen die im Moment geöffnete Office-Anwendung mit genauer Versionsbezeichnungzurück.

Bei dem Befehl Like handelt es sich um einen Operator, mit dem Sie zwei Zeichenfolgenvergleichen können. Über das Platzhalterzeichen * können Sie einen Mustervergleich derZeichenfolgen durchführen. Dabei steht der Platzhalter für ein bzw. auch für mehrere belie-bige Zeichen. So kann beispielsweise das Ergebnis in der ersten Zeile lauten 7.0, 7,1 oder 7.Sie legen in diesem Fall fest, dass die 7 in der Versionsbezeichnung vorhanden sein muss.

Abb. 2.2 Office-Version ermitteln

Vergessen Sie nicht den letzten Zweig der If-Anweisung. Dort sehen Sie vor, was passierensoll, wenn es nicht gelingt, die aktuelle Office-Version zu ermitteln.

Sub VersionErmitteln()If Application.Version Like "*7*" Then MsgBox "Office-Version = 95" ElseIf Application.Version Like "*8*" Then MsgBox "Office-Version = 97" ElseIf Application.Version Like "*9*" Then MsgBox "Office-Version = 2000" ElseIf Application.Version Like "10*" Then MsgBox "Office-Version = XP" Else MsgBox "Version kann nicht ermittelt werden!", _ vbCritical End IfEnd Sub

Listing 2.1: Office-Version ermitteln

Page 49: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA48

2.3.2 Rückfrage einholen

Oft werden Verzweigungen auch eingesetzt, um Rückfragen wie »Wollen Sie wirklich dieAnwendung beenden?« Bei solchen Abfragen werden Sie dann über eine Bildschirmmeldungabgefragt, ob Sie die gewünschte Aktion auch wirklich durchführen möchten.

Im folgenden Beispiel wird die aktive Office-Anwendung, sei es nun Excel, Access oderWord, nach einer Rückfrage geschlossen.

In diesem Beispiel setzen Sie die Funktion Msgbox ein, um einen Rückfragedialog auf demBildschirm anzuzeigen. Über die Konstante vbYesNo legen Sie fest, dass in diesem Dialogdie Schaltflächen Ja und Nein angezeigt werden sollen.

Abb. 2.3 Rückfrage einholen und auswerten

Um überprüfen zu können, welche Schaltfläche angeklickt wurde, müssen Sie wissen, dassdie Schaltfläche Ja über den Index 6 und die Schaltfläche Nein über den Index 7 identifiziertwerden kann. Klickt der Anwender also die Schaltfläche Nein, dann erhalten Sie als Rück-meldung den Index 7. Diesen Index können Sie direkt nach dem Klicken der Schaltflächeabfragen, indem Sie die Variable i überprüfen, in der der entsprechende Index steht.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.doc.

Sub AnwendungBeenden()Dim i As Integeri = MsgBox("Wollen Sie wirklich die Anwendung beenden?", vbYesNo)If i = 7 Then Exit SubApplication.QuitEnd Sub

Listing 2.2: Rückfragedialog auswerten

Hinweis:

Welche Möglichkeiten Sie mit Meldungsboxen und Eingabeboxen haben, erfahren Sie inKapitel 5 dieses Buchs.

Page 50: VBA-Programmierung fur Word, Excel und Access

Rechts2.3 Verzweigungen 49

2.3.3 Datei nach bestimmter Zeit löschen

Mithilfe einer If-Abfrage können Sie sich eine Lösung programmieren, bei der einebestimmte Datei nach einer vorher festgelegten Zeit automatisch von Ihrer Festplatte gelöschtwird. Das Makro für diese Aufgabe können Sie im nächsten Listing sehen. Das Makro löschteine bestimmte Datei nach 14 Tagen, falls diese Datei mindestens 14 Tage nicht modifiziertwurde und älter als 14 Tage ist.

Geben Sie zu Beginn des Makros den Namen der Datei an, die gelöscht werden soll. Ebensohinterlegen Sie die Anzahl der Tage, nach der die Datei entfernt werden soll.

Über die Funktion FileDateTime können Sie das Datum der Erstellung bzw. das letzteÄnderungsdatum einer Datei ermitteln. Bringen Sie dieses Datum über die Funktion Formatin das gewünschte Format. Mithilfe der Funktion Now können Sie das aktuelle Datum ermit-teln. Dabei ist diese Funktion abhängig davon, welches Datum Sie in der Systemsteuerungvon Windows eingestellt haben. Errechnen Sie nun das Löschdatum der Datei, indem Sievom aktuellen Datum die vorher definierten »Verweil-Tage« subtrahieren. Die beidenDatumswerte vergleichen Sie über eine If-Anweisung. Ist dabei das Datum der letzten Ände-rung kleiner als das ermittelte Löschdatum für die Datei, dann wenden Sie die AnweisungKill an, um die Datei ohne weitere Rückfrage zu enfernen.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.doc.

Sub Dateien_Löschen()Dim DatName As StringDim DatumDatei As DateDim DatumEntf As DateDim Tage As Integer

DatName = "C:\Eigene Dateien\Status.doc"Tage = 14

DatumDatei = Format(FileDateTime(DatName), "00000")DatumEntf = Format(Now - Tage, "00000")If DatumDatei < DatumEntf Then Kill (DatName)End Sub

Listing 2.3: Datei nach 14 Tagen löschen

Page 51: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA50

2.3.4 Existiert eine bestimmte Datei?

Im folgenden Beispiel soll geprüft werden, ob eine bestimmte Datei in einem definierten Ver-zeichnis überhaupt existiert. Der Code für diese Aufgabe lautet:

Möglicherweise ist Ihnen die Funktion Dir noch aus alten DOS-Tagen geläufig. Diese Funk-tion gibt es auch in VBA. Über die Funktion Dir können Sie eine bestimmte Datei im ange-gebenen Ordner suchen. Wird die gesuchte Datei gefunden, steht dieser Dateiname in derVariablen s. Wird die gesuchte Datei nicht gefunden, dann bleibt die Variable s leer.

2.4 Die Anweisung Select Case

Wenn Sie mehrere Verzweigungen ineinander schachteln bzw. mehrere Verzweigungen hin-tereinander 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 Zei-chenfolgenausdruck erfasst, den Sie auswerten möchten. Im Argument Ausdruckslisten

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub DateiDa()Dim s As string s = Dir("C:\Eigene Dateien\test.xls") If s <> "" Then MsgBox "Datei vorhanden!" _ Else MsgBox "Die Datei gibt es nicht!"End Sub

Listing 2.4: Existenzprüfung von Dateien vornehmen

Page 52: VBA-Programmierung fur Word, Excel und Access

Rechts2.4 Die Anweisung Select Case 51

spezifizieren Sie den zu untersuchenden Ausdruck näher. Dabei können Sie Vergleichsopera-toren verwenden. So stehen Ihnen Vergleichsoperatoren wie To, Is oder Like zur Ver-fügung.

Unter dem Argument Anweisungen-n können Sie eine oder mehrere Anweisungen ange-ben, die ausgeführt werden sollen, wenn Testausdruck mit irgendeinem Teil in Ausdrucks-liste-n übereinstimmt.

Das Argument elseAnw ist optional einsetzbar. Damit können Sie darauf reagieren, wennTestausdruck mit keinem der Ausdrücke im Case-Abschnitt übereinstimmen sollte.

Wenden Sie nun diese Anweisungen anhand einiger Praxisbeispiele an.

2.4.1 Fensterstatus ermitteln

Möchten Sie den Fensterstatus Ihrer Word-Anwendung ermitteln, dann setzen Sie die Eigen-schaft WindowState ein. Der Fensterstatus bestimmt, wie Ihr Anwendungsfenster gerade amBildschirm angezeigt wird. Sie haben dabei drei verschiedene Möglichkeiten, die über Kon-stanten identifiziert werden können:

• wdWindowStateMaximize: Zeigt das Anwendungsfenster in der Vollbildansicht an.

• wdWindowStateMinimize: Zeigt das Anwendungsfenster in der Taskleiste von Win-dows über ein Symbol an.

• wdWindowStateNormal: Kennzeichnet ein Fenster, das nicht maximiert oder minimiertist.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.doc.

Sub FensterStatusErmitteln()Dim s As String Select Case Application.WindowState Case wdWindowStateMaximize s = "Maximum" Case wdWindowStateMinimize s = "Minimum" Case wdWindowStateNormal s = "Normal" End Select MsgBox "Der Festerstatus ist " & sEnd Sub

Listing 2.5: Windows-Status in Word abfragen

Page 53: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA52

Fragen Sie über die Anweisung Select Case ganz gezielt den Fensterstatus Ihrer Anwen-dung ab, indem Sie die Konstanten der Eigenschaft WindowState ermitteln.

Dasselbe Makro können Sie übrigens nicht in Excel laufen lassen. Dort lautet das Makro wiefolgt:

2.4.2 Steuerelemente identifizieren

In der folgenden Aufgabe werden Steuerelemente wie Schaltflächen, Kontrollkästchen undTextfelder, die sich auf einer Tabelle befinden, identifiziert. Fügen Sie als kleine Vorarbeit ineiner neuen Excel-Tabelle aus der Symbolleiste STEUERELEMENT-TOOLBOX einmal ein paarSteuerelemente ein.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub FensterStatusExcel() Dim s As String Select Case Application.WindowState Case xlMaximized s = "Maximum" Case xlMinimized s = "Minimum" Case xlNormal s = "Normal" End Select MsgBox "Der Fensterstatus ist: " & sEnd Sub

Listing 2.6: Fensterstatus in Excel erkennen

Page 54: VBA-Programmierung fur Word, Excel und Access

Rechts2.4 Die Anweisung Select Case 53

Abb. 2.4 Steuerelemente in Tabelle einfügen

Fügen Sie nun das folgende Makro ein, um die Steuerelemente zu identifizieren.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub SteuerelementeInTabelleIdentifizieren()Dim obj As ObjectDim i As IntegerDim i_Kenn As Integer

Listing 2.7: Steuerelemente identifizieren

Page 55: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA54

Das Auflistungsobjekt OLEObjects enthält alle Steuerelemente, die in einer Excel-Tabelleeingefügt wurden. Diese werten Sie mithilfe der Funktion TypeName aus. Diese Funktion lie-fert Ihnen eine Zeichenfolge zurück, über die Sie den Typ des jeweiligen Steuerelementsbestimmen können.

Achten Sie bei der Abfrage bitte auf die genaue Schreibweise der einzelnen Steuerelemente.So wird beispielsweise die Zeichenfolge Textbox nicht gefunden. Hier muss wirklich diegenaue Schreibweise mit Unterscheidung von Groß- und Kleinschreibung, also TextBox,angegeben werden.

i = 0For Each obj In ActiveSheet.OLEObjectsi = i + 1 Select Case TypeName(obj.Object) Case "TextBox" i_Kenn = 1 Case "CheckBox" i_Kenn = 2 Case "ListBox" i_Kenn = 3 Case "ComboBox" i_Kenn = 4 Case "OptionButton" i_Kenn = 5 Case "ToggleButton" i_Kenn = 6 Case "ScrollBar" i_Kenn = 7 Case "Label" i_Kenn = 8 Case "SpinButton" i_Kenn = 9 Case "CommandButton" i_Kenn = 10 Case Else i_Kenn = 0 End Select Debug.Print i, i_Kenn, TypeName(obj.Object), obj.NameNextEnd Sub

Listing 2.7: Steuerelemente identifizieren (Forts.)

Page 56: VBA-Programmierung fur Word, Excel und Access

Rechts2.4 Die Anweisung Select Case 55

Abb. 2.5 Informationen über die Steuerelemente im Direktbereich ausgeben

2.4.3 Zahlenformate ermitteln

Ein weiteres Beispiel für den Einsatz der Select Case-Anweisung liefert das folgende Bei-spiel. In diesem Beispiel werden in einer Excel-Tabelle die verwendeten Zahlenformateermittelt. Formatieren Sie einen beliebigen Zellenbereich mit verschiedenen Zahlenformaten,markieren Sie diesen und starten Sie das nächste Makro:

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub ZahlenFormateErmitteln()Dim zelle As Range

For Each zelle In SelectionSelect Case zelle.NumberFormat Case "0.00" MsgBox "Zahl mit 2 Nachkommastellen" Case "#,##0.00" MsgBox "Zahl mit 2 Nachkommastellen u. 1000-er Tz" Case "@" MsgBox "Textformat" Case "dd. mmm yy" MsgBox "Datumsformat" Case Else MsgBox "unbekanntes Format"End SelectNext zelleEnd Sub

Listing 2.8: Zahlenformate erkennen und ausgeben

Page 57: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA56

Definieren Sie im ersten Schritt eine Objektvariable vom Typ Range. Damit können Sie eineeinzelne Zelle oder auch mehrere Zellen, also ganze Zellenbereiche, ansprechen. Mithilfe derEigenschaft Selection werden alle Zellen, die momentan markiert sind, ermittelt. DieAnweisung Select Case wertet also in diesem Fall alle momentan markierten Zellen derExcel-Tabelle aus. Über die Eigenschaft Numberformat fragen Sie danach diese Zellen nachIhrem Zahlenformat ab und geben es durch die Funktion MsgBox auf dem Bildschirm aus.

Abb. 2.6 Zahlenformate erkennen

2.4.4 Eingaben überprüfen

Oft wird die Select-Case-Anweisung auch eingesetzt, um Eingaben des Benutzers abzufragenund dementsprechend reagieren zu können. Im folgenden Beispiel wird eine Eingabe desAnwenders ausgewertet.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub ZahlenwerteÜberprüfen()Dim i As Integer

Listing 2.9: Benutzereingaben erkennen und ausgeben

Page 58: VBA-Programmierung fur Word, Excel und Access

Rechts2.4 Die Anweisung Select Case 57

Setzen Sie die Select-Case-Anweisung ein, um die eingegebenen Werte zu überprüfen. In derersten Abfrage kontrollieren Sie, ob der eingegebene Wert zwischen 1 und 3 liegt. In diesemFall können Sie den Vergleichsoperator To einsetzen. In der zweiten Abfrage haben Sie dieZahlenwerte durch Komma getrennt eingegeben. Wurde kein gültiger Zahlenwert eingege-ben, schlägt die Anweisung Case Else zu. Geben Sie in diesem Fall eine Fehlermeldungauf dem Bildschirm aus.

Abb. 2.7 Benutzereingaben auswerten

i = InputBox _("Geben Sie einen Wert zwischen 1 und 15 ein!")

Select Case i Case 1 To 3 MsgBox "Wert liegt zwischen 1 und 3" Case 4, 5, 6 MsgBox "Wert ist entweder 4, 5 oder 6" Case 7 To 10 MsgBox "Wert liegt zwischen 9 und 15" Case 11 To 15 MsgBox "Wert liegt zwischen 11 und 15" Case Else MsgBox "Kein gültiger Wert!"End SelectEnd Sub

Listing 2.9: Benutzereingaben erkennen und ausgeben (Forts.)

Page 59: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA58

2.5 Schleifen

Schleifen werden in der Programmierung dann eingesetzt, wenn Abläufe mehrmals hinterein-ander durchgeführt werden müssen. Die Schleifen werden so lange durchlaufen, bis eine odermehrere Bedingungen zutreffen, die dann einen Abbruch der Schleife bewirken. Je nach ver-wendeter Schleife findet die Abbruchprüfung am Anfang bzw. am Ende der Schleife statt.Lernen Sie auf den nächsten Seiten die zur Verfügung stehenden Schleifen und einfache Bei-spiele für den Einsatz von Schleifen kennen.

2.5.1 Die Schleife For...Next

Sie können die Schleife For...Next einsetzen, um einen Block von Anweisungen einebestimmte Anzahl von Wiederholungen ausführen zu lassen. For...Next-Schleifen ver-wenden eine Zählervariable, deren Wert mit jedem Schleifendurchlauf erhöht oder verringertwird. Sie brauchen daher nicht daran zu denken, den Zähler zu setzen bzw. nach jedemSchleifendurchlauf anzupassen.

Die Syntax der For...Next-Schleife lautet:

For Zähler = Anfang To Ende [Step Schritt]

[Anweisungen]

[Exit For]

[Anweisungen]

Next [Zähler]

Das Argument Zähler ist erforderlich und besteht aus einer numerischen Variable, die alsSchleifenzä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 Schrittist optional. Hier können Sie den Betrag bestimmen, um den der Zähler bei jedem Schleifen-durchlauf verändert wird. Falls kein Wert angegeben wird, ist die Voreinstellung eins.

Unter Anweisungen stehen eine oder mehrere Anweisungen zwischen For und Next, dieso oft wie angegeben ausgeführt werden.

Innerhalb einer Schleife kann eine beliebige Anzahl von Exit For-Anweisungen an belie-biger Stelle als alternative Möglichkeit zum Verlassen der Schleife verwendet werden.

2.5.2 Tabellen anlegen

Im ersten Beispiel für den Einsatz der For...Next-Schleife werden Sie in Excel genau 30Tabellen automatisch anlegen und nach Datumsangaben benennen. Setzen Sie dazu das fol-gende Listing ein.

Page 60: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 59

Setzen Sie zu Beginn der Schleife den Startwert des Zählers auf den Wert 1. Dieser wird stan-dardmäßig, sofern nicht anders angegeben, bei jedem Schleifendurchlauf um den Wert 1 solange erhöht, bis er das Endekriterium für die Schleife, den Wert 30, erreicht. Innerhalb derSchleife wenden Sie die Methode Add an, um jeweils ein neues Tabellenblatt in die Arbeits-mappe einzufügen. Mithilfe der Eigenschaft Name benennen Sie diese neu eingefügten Tabel-len. Die Funktion Format bringt den Namen in das gewünschte Format. Diese Funktionarbeitet mit Formatkürzel, die Sie in der folgenden Tabelle einsehen können.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub TabellenAnlegenUndBenennen()Dim i As Integer

For i = 1 To 30 Worksheets.Add ActiveSheet.Name = Format(DateSerial _ (2002, 6, i), "dd.mm.yy") Next iEnd Sub

Listing 2.10: Tabellen anlegen und benennen

Kürzel Bedeutung

c Vordefiniertes Standarddatum.

d Monatstag mit einer oder zwei Ziffern (1 bis 31)

dd Monatstag mit zwei Ziffern (01 bis 31)

ddd Die ersten drei Buchstaben des Wochentags (Son bis Sam)

dddd Vollständiger Name des Wochentags (Sonntag bis Samstag)

w Wochentag (1 bis 7)

ww Kalenderwoche (1 bis 53)

m Monat des Jahres mit einer oder zwei Ziffern (1 bis 12)

mm Monat des Jahres mit zwei Ziffern (01 bis 12)

mmm Die ersten drei Buchstaben des Monats (Jan bis Dez)

mmmm Vollständiger Name des Monats (Januar bis Dezember)

q Datum als Quartal angezeigt (1 bis 4)

y Kalendertag (1 bis 366)

yy Die letzten zwei Ziffern der Jahreszahl (01 bis 99)

yyyy Vollständige Jahreszahl (0100 bis 9999)

h Stunde mit einer oder zwei Ziffern (0 bis 23)

hh Stunde mit zwei Ziffern (00 bis 23)

n Minute mit einer oder zwei Ziffern (0 bis 59)

Page 61: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA60

Die Funktion DateSerial liefert Ihnen im ersten Schleifendurchlauf das Startdatum. DieseFunktion hat folgende Syntax:

DateSerial(year, month, day)

Im Argument year geben Sie einen gültigen Wert zwischen 100 und 9999 ein. Das Argumentmonth sollte einen gültigen Wert zwischen 1 und 12 enthalten. Im Argument day geben Sieeinen Wert zwischen 1 und 31 an.

Abb. 2.8 Tabellen anlegen und benennen

Kürzel Bedeutung

nn Minute mit zwei Ziffern (00 bis 59)

S Sekunde mit einer oder zwei Ziffern (0 bis 59)

SMS Sekunde mit zwei Ziffern (00 bis 59)

AM/PM Zwölf-Stunden-Format mit den Großbuchstaben AM oder PM

am/pm Zwölf-Stunden-Format mit den Kleinbuchstaben am oder pm

A/P Zwölf-Stunden-Format mit den Großbuchstaben A oder P

a/p Zwölf-Stunden-Format mit den Kleinbuchstaben a oder p

Page 62: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 61

Hintergrundfarben einstellen

Ein weiteres Beispiel für den Einsatz einer For...Next-Schleife sehen Sie im nächsten Bei-spiel. Dort werden die vorhandenen Standardfarben von Excel in eine Tabelle automatischeingefügt. Jede dieser 56 Farben hat eine eindeutige Farb-ID, die sie über die EigenschaftColorIndex ansprechen können.

Wenden Sie im ersten Schritt die Methode Add an, um ein neues, noch leeres Tabellenblatteinzufügen. Danach setzen Sie Ihre Schleife auf. Da es in Excel genau 56 Farben gibt, die Siefür die Formatierung des Hintergrunds Ihrer Zellen verwenden können, setzen Sie diesenWert als Endekriterium für Ihre Schleife ein.

Innerhalb der Schleife färben Sie die jeweilige Zelle mithilfe der Eigenschaft ColorIndex.In die Nebenzelle schreiben Sie den dafür verwendeten eindeutigen Farbindex. PositionierenSie den Zellenzeiger nach jedem Schleifendurchlauf um eine Zelle weiter nach unten, indemSie das erste Argument der Eigenschaft Offset auf den Wert 1 setzen. Mit der MethodeSelect führen Sie letztendlich diesen Schritt durch.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub FarbenAuslesen()Dim i As Integer

Sheets.AddFor i = 1 To 56 ActiveCell.Interior.ColorIndex = i ActiveCell.Offset(0, 1).Value = i ActiveCell.Offset(1, 0).SelectNext iEnd Sub

Listing 2.11: Zellenhintergrundfarben bestimmen

Page 63: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA62

Abb. 2.9 Hintergrundfarben für Zellen einfügen

Excel-Arbeitsmappen suchen und automatisch öffnen

Die Schleife For...Next lässt sich auch prima mit anderen Funktionen kombinieren. Sowird im folgenden Beispiel das Objekt FileSearch dazu verwendet, um die Anzahl vonbestimmten Dateien in einem vorgegebenen Verzeichnis zu ermitteln.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Page 64: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 63

Über das Objekt FileSearch können Sie bestimmte Dateitypen auf Ihrer Festplatte suchenund auswerten. Über die Methode NewSearch setzen Sie die Einstellungen aller Suchkrite-rien auf die Standardeinstellungen zurück. Mithilfe der Eigenschaft LookIn geben Sie dasVerzeichnis an, in dem gesucht werden soll. Die Eigenschaft SearchSubFolders setzen Sieauf den Wert False, wenn nur im angegebenen Verzeichnis gesucht werden soll. MöchtenSie auch hierarchisch darunter liegende Verzeichnisse durchsuchen, dann weisen Sie dieserEigenschaft den Wert True zu.

Über die Eigenschaft FileType können Sie den Dateityp über eine Konstante festlegen, nachdem gesucht werden soll. Eine kleine Auswahl der dabei möglichen Dateitypen sehen Sie inder folgenden Tabelle:

Die Methode Execute startet die Suche nach den angegebenen Dateien. Diese Methode gibteinen Long-Wert zurück (null (0), wenn keine Dateien gefunden werden, eine positive Zahl,wenn eine oder mehrere Dateien gefunden werden).

Für das Zusammensetzen der Schleife setzen Sie den Startwert für die Schleife auf den Wert1. Über die Eigenschaft Count können Sie ermitteln, wie viele Dateien durch die Suche überdas Objekt FileSearch gefunden wurden. Diese Anzahl bildet das Endekriterium für dieSchleife. Innherhalb der Schleife wenden Sie die Methode Open an und übergeben mithilfeder Eigenschaft FoundFiles den jeweiligen Dateinamen.

Sub DateienÖffnen()With Application.FileSearch .NewSearch .LookIn = "D:\Test\" .SearchSubFolders = False .FileType = msoFileTypeExcelWorkbooks .Execute

For i = 1 To .FoundFiles.Count Workbooks.Open .FoundFiles(i) Next iEnd WithEnd Sub

Listing 2.12: Excel-Dateien öffnen

Konstante Dateityp

msoFileTypeExcelWorkbooks Excel-Arbeitsmappen

msoFileTypeOfficeFiles Alle Office-Dateien

msoFileTypePowerPointPresentations PowerPoint-Präsentationen

msoFileTypeWordDocuments Word-Dokumente

msoFileTypeDatabases Access-Datenbanken

Page 65: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA64

Word-Dokumente suchen und automatisch öffnen

Im letzten Beispiel wurden alle Excel-Arbeitsmappen eines bestimmten Verzeichnisses auto-matisch geöffnet.

Um alle Word-Dokumente in einem bestimmten Verzeichnis zu öffnen, ändern Sie das letzteListing in einigen Positionen ab.

Geben Sie bei der Eigenschaft FileType die Konstante msoFileTypeWordDocuments anund ändern innherhalb der Schleife den Befehl für das Öffnen der Word-Dateien.

Anzahl von Tabellen ermitteln

Möchten Sie eine Aktion gleich auf mehreren Tabellen nacheinander durchführen, dann kön-nen Sie mithilfe der Eigenschaft Count ermitteln, wie viele Excel-Tabellen in Ihrer Arbeits-mappe vorhanden sind.

Im folgenden Beispiel wird das aktuelle Datum auf jeder Tabelle in Ihrer Arbeitsmappe inZelle C1 eingefügt. Der Code für diese Aufgabe lautet:

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.doc.

Sub WordDateienÖffnen()With Application.FileSearch .NewSearch .LookIn = "D:\Test\" .SearchSubFolders = False .FileType = msoFileTypeWordDocuments .Execute

For i = 1 To .FoundFiles.Count Documents.Open .FoundFiles(i) Next iEnd WithEnd Sub

Listing 2.13: Word-Dateien öffnen

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Page 66: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 65

2.5.3 Die Schleife For Each...Next

Die Schleife For Each...Next wiederholt eine Gruppe von Anweisungen für jedes Ele-ment in einem Datenfeld oder einer Auflistung.

Die Syntax dieser Schleife lautet:

For Each Element In Gruppe

[Anweisungen]

[Exit For]

[Anweisungen]

Next [Element]

Sub TabellenAnzahl()Dim i As Integer

For i = 1 To ActiveWorkbook.Worksheets.Count WorkSheets(i).Range("C1").Value = DateNext iEnd Sub

Listing 2.14: Tabellen füllen

Achtung:

Mithilfe der Eigenschaft ActiveWorkbook sprechen Sie die momentan im Vordergrundstehende Excel-Arbeitsmappe an. Haben Sie mehrere Excel-Arbeitsmappen geöffnet, istes reine Glückssache, welche Excel-Arbeitsmappe gerade im Vordergrund steht. In die-sem Fall sollten Sie die Eigenschaft ThisWorkbook verwenden, um sicherzustellen, dasstatsächlich die richtige Arbeitsmappe verwendet wird. Dabei wird die Arbeitsmappe her-angezogen, in der der Code gespeichert wurde.

Innerhalb der Schleife verweisen Sie mit dem Index i auf das jeweilige Tabellenblatt undgeben über das Objekt Range die genaue Zellenposition an, an der das aktuelle Datumüber die Funktion Date eingefügt werden soll.

Achtung:

Die Eigenschaft WorkSheets beinhaltet nur die Tabellenblätter einer Arbeitsmappe. Ver-wenden Sie die Eigenschaft Sheets, wenn auch Diagrammblätter und sonstige Excel-Blätter mit verzeichnet werden sollen.

Page 67: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA66

Das Argument Element stellt die Variable zum Durchlauf durch die Elemente der Auflistungoder des Datenfelds dar. Bei Auflistungen ist für Element nur eine Variable vom Typ Vari-ant, 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 Daten-felds.

Das letzte Argument Anweisungen ist optional und führt eine oder mehrere Anweisungendurch, die für jedes Element in Gruppe ausgeführt werden sollen.

Namen von Excel-Tabellen ausgeben

Die For each...Next-Schleife können Sie bsonders gut bei Auflistungsobjekten einset-zen. So werden im folgenden Beispiel die Namen aller Tabellen einer Arbeitsmappe ermitteltund in einer neuen Tabelle aufgelistet.

Fügen Sie im ersten Schritt eine neue Tabelle in Ihre Arbeitsmappe ein. Danach speichern Sieden Namen dieser neuen Tabelle in der Variablen s. Basteln Sie sich danach eine Schleife,die alle Blätter Ihrer Arbeitsmappe durchläuft. Verwenden Sie dazu das AuflistungsobjektSheets. Innerhalb der Schleife dokumentieren Sie den jeweiligen Tabellennamen auf demZielblatt.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub TabellenNamenDokumentieren()Sheets.Addi = 1s = ActiveSheet.NameFor Each Tabelle In ActiveWorkbook.Sheets Sheets(s).Cells(i, 1).Value = Tabelle.Name i = i + 1Next TabelleEnd Sub

Listing 2.15: Tabellennamen auflisten

Page 68: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 67

Abb. 2.10 Tabellen dokumentieren

Geöffnete Arbeitsmappen ermitteln

Ein weiteres Auflistungsobjekt können Sie einsetzen, um alle momentan geöffneten Excel-Arbeitsmappen auszugeben.

Im Auflistungsobjekt Workbooks sind alle momentan geöffneten Excel-Arbeitsmappen ver-zeichnet. Die Namen dieser Arbeitsmappen geben Sie in einer Schleife über die FunktionMsgBox sowie der Eigenschaft Name am Bildschirm aus.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub GeöffneteMappenErmitteln()For Each exceldat In Workbooks MsgBox exceldat.NameNext exceldatEnd Sub

Listing 2.16: Geöffnete Excel-Arbeitsmappen ermitteln

Page 69: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA68

In der Workbooks-Auflistung sind alle geöffneten Arbeitsmappen verzeichnet. Über dieEigenschaft Name können Sie die Namen dieser Mappen abfragen. Der Befehl Chr(13)bewirkt, dass ein Zeilenumbruch vorgenommen wird.

Abb. 2.11 Geöffnete Arbeitsmappen ausgeben

Geöffnete Word-Dokumente ermitteln

Um alle geöffneten Word-Dokumente zu ermitteln, setzen Sie das nächste Makro ein.

Tipp:

Möchten Sie die Namen aller geöffneten Excel-Arbeitsmappen in nur einem Meldungs-fenster zusammen ausgeben, dann starten Sie das Makro aus dem folgenden Listing.

Sub GeöffneteMappenErmitteln2 ()For Each exceldat In Workbooks s = s + exceldat.Name & Chr(13)Next exceldatMsgBox sEnd Sub

Listing 2.17: Geöffnete Excel-Arbeitsmappen ausgeben

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.doc.

Sub GeöffneteDokumenteErmitteln()For Each WordDat In Documents MsgBox WordDat.NameNext WordDatEnd Sub

Listing 2.18: Geöffnete Word-Dokumente ermitteln

Page 70: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 69

Im Auflistungsobjekt Documents sind alle momentan geöffneten Word-Dokumente ver-zeichnet. Die Namen dieser Dokumente geben Sie in einer Schleife über die FunktionMsgBox sowie der Eigenschaft Name am Bildschirm aus.

Markierte Wörter auslesen

Geben Sie einmal in ein neues Word-Dokument die Formel RAND(1,1) ein und bestätigen Siemit OK.

Abb. 2.12 Markierte Wörter auslesen

Dieses so genannte Easteregg erzeugt einen Beispieldatensatz, in dem jeder Buchstabe desAlphabets mindestens einmal vorhanden ist. Markieren Sie nun diesen Satz und startendanach das folgende Makro:

Sub MarkierteWorteAusgeben()Dim s as String

For Each wort In Selection.Words s = s + wort & Chr(13)Next wortMsgBox sEnd Sub

Listing 2.19: Markierte Wörter ermitteln und untereinander ausgeben

Page 71: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA70

Über die Eigenschaft Selection sprechen Sie den markierten Bereich in Ihrem Dokumentdirekt an. Das Auflistungsobjekt Words enthält alle Wörter dieses markierten Bereichs, wel-che Sie innerhalb der Schleife in der Variablen s speichern und am Ende am Bilschirm aus-geben.

Abb. 2.13 Markierte Wörter eines Dokuments in einer Meldung ausgeben

Datenbanken auswerten

Auflistungsobjekte finden Sie übrigens auch in Microsoft Access. Im nächsten Beispiel wer-den alle vorhandenen Tabellen einer Access-Datenbank ermittelt und am Bildschirm ausge-geben.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.mdb.

Sub TabellenNamenAusgeben()Dim obj As AccessObjectDim dbs As ObjectDim s As String

Set dbs = Application.CurrentData

For Each obj In dbs.AllTables s = s + obj.Name & Chr(13)Next objMsgBox "Verfügbare Tabellen:" & _ Chr(13) & Chr(13) & sEnd Sub

Listing 2.20: Alle Access-Tabellen einer Datenbank ermitteln

Page 72: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 71

Im Listing 2.20 wurde ein Unterstrich verwendet. Dieser Unterstrich bedeutet, dass derBefehl eigentlich noch nicht zu Ende ist und daher in der nächsten Zeile fortgesetzt werdensoll. Deklarieren Sie zu Beginn Ihres Makros die verwendeten Variablen. Setzen Sie danacheinen Objektverweis auf das Objekt CurrentData. Dieses Objekt verfügt über mehrere Auf-listungen, die bestimmte Objekte in der Access-Datenbank enthalten, unter anderem auch dasAuflistungsobjekt AllTables. Entnehmen Sie die weiteren möglichen Auflistungsobjekteder folgenden Tabelle:

Abb. 2.14 Vorhandene Access-Tabellen ermitteln

Auflistungen Objekttyp

AllTables Alle Tabellen

AllFunctions Alle Funktionen

AllQueries Alle Abfragen (die Anzahl der Abfragen in einem Microsoft-Access-Pro-jekt (ADP) ist Null)

AllViews Alle Sichten (die Anzahl der Sichten in einer Access-Datenbank (MDB) ist Null)

AllStoredProcedures Alle gespeicherten Prozeduren (die Anzahl der gespeicherten Prozeduren in einer Access-Datenbank (MDB) ist Null)

AllDatabaseDiagrams Alle Datenbankdiagramme (die Anzahl der Datenbankdiagramme in einer Access-Datenbank (MDB) ist Null)

Page 73: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA72

Möchten Sie alle Formulare einer Access-Datenbank ermitteln, dann setzen Sie das folgendeMakro ein.

Bei dem Befehl Forms handelt es sich um ein Auflistungsobjekt. In diesem Auflistungsobjektsind alle Formulare einer Access-Datenbank verzeichnet. Diese können Sie über die Eigen-schaft Name ermitteln und mit der Funktion MsgBox auf dem Bildschirm ausgeben.

Deklarieren Sie zu Beginn Ihres Makros die verwendeten Variablen. Setzen Sie danach einenObjektverweis auf das Objekt CurrentProject. Dieses Objekt verfügt über mehrere Auf-listungen, die bestimmte Objekte in der Access-Datenbank enthalten, unter anderem auch dasAuflistungsobjekt AllForms. Entnehmen Sie die weiteren möglichen Auflistungsobjekte derfolgenden Tabelle:

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.mdb.

Sub FormularNamenAusgeben()Dim obj As AccessObjectDim dbs As ObjectDim s As String

Set dbs = Application.CurrentProject

For Each obj In dbs.AllForms s = s + obj.Name & Chr(13) Next obj MsgBox "Verfügbare Formulare:" _ & Chr(13) & Chr(13) & sEnd Sub

Listing 2.21: Alle verfügbaren Access-Formulare ermitteln

Auflistung Objkettyp

AllForms Enthält alle Formulare

AllReports Enthält alle Berichte

AllMacros Enthält alle Makros

AllModules Enthält alle Module

AllDataAccessPages Enthält alle Datenzugriffsseiten

Page 74: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 73

Abb. 2.15 Verfügbare Access-Formulare ermitteln

Formularinhalte identifizieren

Gehen Sie nun einen Schritt weiter und ermitteln Sie mithilfe einer For each...Next-Schleife alle Steuerelemente eines bestimmten Formulars.

Abb. 2.16 Das Ausgangsformular

Page 75: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA74

Starten Sie nun das folgende Makro, um die Namen der verwendeten Steuerelemente im For-mular im Direktfenster auszugeben.

Definieren Sie im ersten Schritt eine Variable vom Typ Control. Dabei sprechen Sie ganzallgemein ein Steuerelement an, das sich z.B. auf einem Formular oder auf einem Berichtbefinden kann. Setzen Sie danach die For Each...Next-Schleife auf und durchstreifen IhrFormular. Über die Anweisung Debug.Print geben Sie die Namen der Steuerelemente aus,die sich in Ihrem Formular befinden.

Abb. 2.17 Die Namen der Steuerelemente des Formulars Artikel

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.mdb.

Sub FormularInhalteAusgeben()Dim obj As Control

For Each obj In Form_Artikel.Form Debug.Print obj.NameNext objEnd Sub

Listing 2.22: Alle Namen der Steuerelemente eines Formulars ausgeben

Page 76: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 75

2.5.4 Die Schleife Do Until

Die Do Until...Loop-Schleife wiederholt einen Block mit Anweisungen, solange eineBedingung 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. eineAbbruchbedingung festlegen, wenn ein bestimmter Wert erreicht ist.

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 ent-weder True oder False ergibt. Liefert die Bedingung den Wert 0, so wird die Bedingungals False interpretiert.

Hinter den Anweisungen verbergen sich eine oder mehrere Anweisungen, die wiederholtwerden, solange oder bis Bedingung durch True erfüllt ist.

Innerhalb einer Do Until...Loop-Anweisung kann eine beliebige Anzahl von Exit Do-Anweisungen an beliebiger Stelle als alternative Methode zum Verlassen einer Do...Loop-Anweisung verwendet werden. Exit Do wird oft in Zusammenhang mit der Auswertungeiner Bedingung (zum Beispiel If...Then) eingesetzt und hat zur Folge, dass die Ausfüh-rung mit der ersten Anweisung im Anschluss an Loop fortgesetzt wird.

Sehen Sie auf den nächsten Seiten ein paar typische Anwendungsbeispiele im Office-Umfeld.

Bedingtes Löschen von Zeilen

Das Löschen von bestimmten Zeilen in Excel mittels eines bestimmten Löschkennzeichenskönnen Sie mithilfe einer Schleife durchführen, die beginnend von einer Startzeile alle ver-wendeten Zeilen durchläuft und gegebenenfalls Zeilen löscht, sofern ein bestimmtes Lösch-kennzeichen gefunden wird. Sehen Sie sich jetzt die Ausgangstabelle an.

Page 77: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA76

Abb. 2.18 Die Ausgangstabelle mit den zu löschenden Zeilen

Über den Buchstaben x legen Sie fest, welche Zeilen Sie in der Tabelle löschen möchten.

Erfassen Sie danach folgendes Makro:

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub ZeilenLöschen()Sheets("Tabelle4").ActivateRange("A1").Select Do Until ActiveCell.Value = "" If ActiveCell.Value = "x" Then Selection.EntireRow.Delete Else ActiveCell.Offset(1, 0).Select End If LoopEnd Sub

Listing 2.23: Bedingtes Löschen von Zeilen

Page 78: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 77

Sorgen Sie zu Beginn des Makros dafür, dass das richtige Tabellenblatt sowie die korrekteStartadresse eingenommen wird. Verwenden Sie hierfür die Methoden Activate sowieSelect.

Die Schleifensteuerung setzen Sie so auf, dass die Schleife so lange durchlaufen wird, bis dieerste leere Zelle in Spalte A erreicht wird. Innerhalb der Schleife wenden Sie eine If-Abfragean und überprüfen, ob das Löschkennzeichen angegeben ist. Wenn ja, dann setzen Sie dieMethode Delete ein, die Sie auf die ganze Zeile (= EntireRow) anwenden. Das automati-sche Versetzen des Mauszeigers geschieht in diesem Fall automatisch. Wird in der jeweiligenZelle kein Löschkennzeichen, gefunden müssen Sie dafür Sorge tragen, dass der Zellenzeigerjeweils eine Zelle weiter nach unten versetzt wird. Für diese Aufgabe setzen Sie die Eigen-schaft Offset ein. Die Eigenschaft Offset hat genau zwei Argumente. Im ersten Argumentgeben Sie die Versetzung des Mauszeigers zeilenbezogen an. Da Sie den Mauszeiger jeweilseine Zeile weiter nach unten versetzen möchten, geben Sie hier den Wert 1 an. Das zweiteArgument repräsentiert die Verschiebung des Zellenzeigers spaltenbezogen. Da Sie in derersten Spalte verbleiben möchten, setzen Sie dieses Argument auf den Wert 0.

Abb. 2.19 Zeilen mit Löschkennzeichen wurden gelöscht

Page 79: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA78

Die aktuelle Spalte positionieren

Im folgenden Beispiel haben Sie in einer Excel-Tabelle eine Datumsleiste angelegt. Über einMakro soll der Zellenzeiger automatisch auf die Spalte positioniert werden, die das aktuelleTagesdatum aufweist.

Legen Sie sich nun eine Tabelle nach folgendem Vorbild an.

Abb. 2.20 Eine Tabelle mit Datumsleiste

Erfassen Sie jetzt das folgende Makro.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub DatumsSpalteMarkieren()Sheets("Tabelle5").ActivateRange("A3").Select

Do Until ActiveCell.Value = Date Or _ ActiveCell.Column > 31 ActiveCell.Offset(0, 1).SelectLoopActiveCell.EntireColumn.SelectEnd Sub

Listing 2.24: Vorauswahl der aktuellen Spalte treffen

Page 80: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 79

Sorgen Sie zu Beginn des Makros dafür, dass das gewünschte Tabellenblatt sowie die kor-rekte Startadresse ausgewählt sind. Danach setzen Sie eine Schleife auf, die jeweils die aktiveZelle mit dem aktuellen Datum vergleicht, welches Sie über die Funktion Date abfragenkönnen. Das zweite Abbruchkriterium der Schleife ist dann erfüllt, wenn das gesuchte Datumin mehr als 31 Spalten nicht gefunden werden kann. Innerhalb der Schleife versetzen Sie denZellenzeiger mithilfe der Eigenschaft Offset bei jedem Schleifendurchlauf eine Spalte wei-ter nach rechts. Da Sie in derselben Zeile verbleiben, geben Sie bei der Eigenschaft Offsetim ersten Argument den Wert 0 an, im zweiten Argument geben Sie den Wert 1 an, um denZellenzeiger jeweils eine Spalte weiter nach rechts zu positionieren.

Textfelder in Formularen auslesen

Im nächsten Beispiel wird mithilfe einer Do Until-Schleife der Inhalt eines Formulars aus-gelesen. Dabei sollen nur die Namen der Textfelder ermittelt werden. Orientieren Sie sichdabei an dem Formular LIEFERANTEN aus der Datenbank ELEMENTE.MDB.

Machen Sie im ersten Schritt das Formular, welches Sie auswerten möchten, über die Anwei-sung Set bekannt. Das Kürzel frm können Sie danach anstatt des kompletten Formularna-mens einsetzen, sofern Sie vorher die Anweisung With schreiben. Die Do until-Schleife

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.mdb.

Sub TextfelderInFormular()Dim obj As ControlDim i As IntegerDim frm As FormDim s As String

i = 1Set frm = Form_Lieferanten

With frm Do Until i = frm.Controls.Count If TypeName(frm.Controls(i)) = "Textbox" _ Then s = s + frm.Controls(i).Name & Chr(13) i = i + 1 Loop End With MsgBox sEnd Sub

Listing 2.25: Namen von Textfeldern aus Formularen ermitteln

Page 81: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA80

wird so lange durchlaufen, bis die Gesamtanzahl der im Formular eingefügten Steuerele-mente erreicht ist. Diese Anzahl ermitteln Sie mithilfe der Eigenschaft Count, mit der Sie dasAuflistungsobjekt Controls abfragen. Dieses Auflistungsobjekt enthält alle Steuerelementedes Formulars. Über die Funktion TypeName können Sie ermitteln, ob es sich bei dem jewei-ligen Steuerelement um ein Textfeld handelt. In diesem Fall muss diese Funktion die Zei-chenfolge Textbox zurückmelden. Sammeln Sie die Namen der einzelnen Textfelder in derVariablen s und geben diese nach Verlassen der Schleife am Bildschirm aus.

Abb. 2.21 Textfelder aus Formularen ansprechen

Datentabellen auslesen

Möchten Sie Tabellen in Access auslesen, müssen Sie vorher die ADO-Bibliothek einbinden.Dazu wechseln Sie in die Entwicklungsumgebung und wählen aus dem Menü EXTRAS denBefehl VERWEISE. Im Dialog Verweise wählen Sie aus dem Listenfeld VERFÜGBARE VER-WEISE die Bibliothek MICROSOFT ACTIVEX DATA OBJECTS 2.5 LIBRARY. Bestätigen Siediese Aktion mit OK. Es stehen Ihnen nun alle VBA-Befehle für die direkte Tabellenverar-beitung zur Verfügung.

Beim folgenden Beispiel gehen Sie von der Tabelle Personal aus der Datenbank ELE-MENTE.MDB aus.

Hinweis:

Lernen Sie in Kapitel 12 dieses Buchs mehr über den Einsatz von ADO.

Page 82: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 81

Abb. 2.22 Die Ausgangstabelle Personal

Ihre Aufgabe besteht nun darin, die einzelnen Inhalte dieser Tabelle in den Direktbereich zuübermitteln. Diese Aufgabe führen Sie durch, indem Sie das folgende Makro erfassen undstarten.

Definieren Sie zuerst eine Objektvariable vom Typ Recordset. Diese Variable soll alleDatensätze der Datenquelle aufnehmen. Öffnen Sie mit der Methode Open die Datentabelle,die den Artikelbestand enthält.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.mdb.

Sub TabellenInhalteAuslesen()Dim DBS As New ADODB.Recordset

On Error GoTo FMeldungDBS.Open "Personal", CurrentProject.ConnectionDo Until DBS.EOF Debug.Print DBS!Nachname Debug.Print DBS!Vorname Debug.Print DBS!Position Debug.Print DBS!Ort Debug.Print "****" DBS.MoveNextLoopDBS.CloseExit Sub

FMeldung:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 2.26: Access-Tabellen auslesen

Page 83: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA82

Setzen Sie danach eine Do until-Schleife auf, die alle Datensätze der Tabelle durchläuft,bis sie auf den letzten Satz stößt. Für diesen Zweck setzen Sie die Anweisung EOF (End OfFile) ein. Innerhalb der Schleife setzen Sie die Methode MoveNext ein, um zum jeweiligennächsten Datensatz in der Tabelle zu gelangen. Im Recordset-Objekt DBS steht der kompletteDatensatz. Sie können dann die einzelnen Datenfelder aus dem Recordset-Objekt auslesenund in den Direktbereich übertragen.

Abb. 2.23 Tabellendaten im Direktbereich ausgeben

2.5.5 Die Schleife Do While...Loop

Die Do While...Loop-Schleife wiederholt einen Block mit Anweisungen, solange eineBedingung den Wert True erhält. Die Prüfung der angegebenen Bedingung erfolgt immer zuBeginn der Schleife. Als Abbruchbedingung können Sie alles Mögliche abfragen; so könnenSie z.B. eine Abbruchbedingung festlegen, wenn ein bestimmter Wert erreicht ist oder eineZelle einen bestimmten Text aufweist.

Die Syntax dieser Schleife lautet:

Do [{While} Bedingung]

[Anweisungen]

[Exit Do]

Page 84: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 83

[Anweisungen]

Loop

Die Bedingung stellt einen numerischen Ausdruck oder Zeichenfolgenausdruck dar, der ent-weder True oder False ergibt. Liefert die Bedingung den Wert 0, so wird die Bedingung alsFalse interpretiert. Hinter den Anweisungen verbergen sich eine oder mehrere Anweisungen,die wiederholt werden, solange die Bedingung 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-Anwei-sung verwendet werden. Exit Do wird oft in Zusammenhang mit der Auswertung einerBedingung (zum Beispiel If...Then) eingesetzt und hat zur Folge, dass die Ausführung mitder ersten Anweisung im Anschluss an Loop fortgesetzt wird.

Dateien im Verzeichnis zählen und ausgeben

Die Do While-Schleife können Sie einsetzen, wenn Sie beispielsweise Dateien in einemvorher bestimmten Verzeichnis zählen und ausgeben möchten.

Zu Beginn des Makros legen Sie fest, in welchem Verzeichnis nach Dateien gesucht werdensoll. Danach setzen Sie die Funktion Dir ein. Diese Funktion gibt eine Zeichenfolge (String)zurück, die den Namen einer Datei, eines Verzeichnisses oder eines Ordners darstellt, der mit

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub DateienZählen()Dim Verzeichnis As StringDim i As IntegerDim s As String

Verzeichnis = "D:\Eigene Dateien\" s = Dir(Verzeichnis & "*.*") i = 1 While s <> "" s = Dir i = i + 1 Debug.Print s Wend MsgBox "Anzahl Dateien: " & i - 1End Sub

Listing 2.27: Dateien zählen und ausgeben

Page 85: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA84

einem bestimmten Suchmuster, einem Dateiattribut oder mit der angegebenen Datenträger-bzw. Laufwerksbezeichnung übereinstimmt. Geben Sie dieser Funktion noch als Informationmit, wo diese suchen und nach welchen Dateien sie Ausschau halten soll. Speichern Sie denersten gefundenen Wert in der Variable s. Setzen Sie danach die Do While...Loop-Schleifeauf, die so lange durchlaufen werden soll, bis keine weiteren Dateien mehr gefunden werden.Innerhalb der Schleife suchen Sie jeweils die nächste Datei im angegebenen Verzeichnis.Dabei müssen Sie nicht mehr die kompletten Suchkriterien der Funktion Dir mitgeben.

Abb. 2.24 Die Namen aller Dateien im Verzeichnis Eigene Dateien

Das Farbenspiel

Im folgenden Beispiel werden Sie die Schleife Do While...loop einsetzen, um einen Zeit-verzögerungseffekt zu erzielen. In einer Excel-Tabelle sollen nacheinander die 56 systemmä-ßig vorgegebenen Farben im Zellenbereich A1:D10 als Hintergrund eingeblendet werden.Jede Farbe soll eine bestimmte Dauer bleiben und dann von der nächsten Hintergrundfarbeabgelöst werden.

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Page 86: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 85

Der Code für diese Aufgabe lautet:

Im Makro Farbenspiel aktivieren Sie zu Beginn das gewünschte Tabellenblatt, in dem Siedie automatische Verfärbung anwenden möchten. Danach setzen Sie eine For Next-Schleifeauf, in der Sie einem Zellenbereich nacheinander die zur Verfügung stehenden Hintergrund-farben zuweisen. Da diese Schleife sehr schnell abgearbeitet wird, müssen Sie eine kleineVerzögerung einbauen. Rufen Sie daher aus diesem Makro das Makro Verzögerer auf undübergeben die gewünschte Verzögerung in der Einheit Sekunden.

Im Makro Verzögerer speichern Sie in der Variablen Zeit zuerst einmal die aktuelle Uhr-zeit mithilfe der Funktion Timer. Diese Funktion gibt einen Wert vom Typ Single zurück,der die Anzahl der seit Mitternacht vergangenen Sekunden angibt. In einer Do While-Schleife vergleichen Sie den jeweiligen Timer-Zustand mit der Zeitangabe, die Sie vorher inder Variablen Zeit gespeichert haben. Über die Funktion DoEvents übergeben Sie dieAblaufsteuerung an das Betriebssystem. Das Programm erhält erst dann die Steuerung wiederzurück, wenn das Betriebssystem alle wartenden Ereignisse verarbeitet hat.

Sub Farbenspiel()Dim i As Integer

Sheets("Tabelle6").Activate For i = 1 To 56 Range("A1:D10").Interior.ColorIndex = i Verzögerer 2 NextEnd Sub

Sub Verzögerer(i)Dim time As Single Zeit = Timer Do While Timer < Zeit + i DoEvents LoopEnd Sub

Listing 2.28: Das Farbenspiel mit Excel

Page 87: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA86

Abb. 2.25 Alle Farben nacheinander einblenden

Textdateien einlesen

Die Schleife Do While können Sie übrigens auch einsetzen, wenn Sie eine Textdatei bei-spielsweise zeilenweise in einem Word-Dokument einlesen möchten. Sehen Sie sich dazueinmal die Ausgangssituation an.

Abb. 2.26 Textdatei zeilenweise einlesen

Page 88: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 87

Transferieren Sie nun diese Textdatei in ein neues, noch leeres Dokument. Erfassen Sie zudiesem Zweck das nachfolgende Makro.

Mithilfe der Methode Open öffnen Sie die Textdatei. Danach setzen Sie eine Do While-Schleife ein, die die Textdatei zeilenweise bis zu Ihrem Ende (EOF) abarbeitet. Über dieAnweisung Line Input speichern Sie den Inhalt der Textdatei zeilenweise in der VariablenTextzeile. Danach fügen Sie über die Eigenschaft TypeText den Inhalt dieser Variablenim Dokument ein. Die Anweisung Selection.TypePararaph führt nach jeder eingefügtenZeile einen Zeilenwechsel durch.

Abb. 2.27 Das Ergebnis – die Textdatei wurde eingefügt

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.doc.

Sub TextdateiEinlesen()Dim textzeile As String

Open "D:\Eigene Dateien\Artikel.txt" _ For Input As #1 Do While Not EOF(1) Line Input #1, textzeile Selection.TypeText Text:=textzeile Selection.TypeParagraph Loop Close #1End Sub

Listing 2.29: Textdatei einlesen

Page 89: VBA-Programmierung fur Word, Excel und Access

Links

2 Die Sprachelemente von VBA88

Wörter zählen im Zielbereich

Möchten Sie Wörter in einem bestimmten Bereich zählen, so ist das in Word kein Problem,da Sie diese relativ einfach über die Eigenschaft Count, das Sie auf das Objekt Words abfra-gen können. In Excel hingegen sieht die Sache schon ein wenig aufwendiger aus. Im folgen-den Beispiel sollen alle Wörter im Zellenbereich A1:A4 gezählt werden. Starten Sie für die-sen Zweck das nächste Makro.

Im ersten Schritt definieren Sie über die Anweisung Set einen Zielbereich. Danach bauen Siesich eine Schleife auf, die alle Zellen inerhalb dieses Bereichs abarbeitet. Mithilfe der Funk-tion Trim entfernen Sie sowohl die führenden als auch die nachfolgenden Leerzeichen einerTextfolge.

Innerhalb dieser Schleife erzeugen Sie eine weitere Schleife. Diese Do While-Schleife wirdso lange durchlaufen, bis in der jeweiligen Zelle keine Leerzeichen, das Kennzeichen für dieWortunterscheidung, mehr vorhanden sind. Die Suche nach den Leerzeichen führen Sie überdie Funktion InStr durch. Diese Funktion meldet Ihnen einen Wert größer Null zurück,wenn Leerzeichen ermittelt werden konnten. Innerhalb dieser Schleife nützen sie die Funk-tion Trim, um wiederum die Leerzeichen aus der immer kleiner werdenden Textfolge zuextrahieren. Über die Funktion Right können Sie eine bestimte Anzahl von Zeichen begin-

Hinweis:

Dieses Listing finden Sie auf www.buch.cd in der Datei Elemente.xls.

Sub WorteZählen()Dim Zelle As RangeDim Bereich As RangeDim s As StringDim i As Integer

Sheets("Tabelle7").ActivateSet Bereich = Range("A1:A4")For Each Zelle In Bereich s = Trim(Zelle.Text) Do While InStr(s, " ") > 0 i = i + 1 s = Trim(Right(s, Len(s) - InStr(s, " "))) Loop i = i + 1NextMsgBox "Wörter im Zielbereich: " & iEnd Sub

Listing 2.30: Worte in Zellenbereich zählen und ausgeben

Page 90: VBA-Programmierung fur Word, Excel und Access

Rechts2.5 Schleifen 89

nend vom rechten Ende von s extrahieren. Über die Funktion Len können Sie die Länge derVariablen s ermitteln. Erhöhen Sie nach jeder Extraktion von Leerzeichen jeweils die Zähl-variable i um den Wert 1. Geben Sie am Ende des Makros die ermittelte Anzahl der Wörterauf dem Bildschirm aus.

Abb. 2.28 Das Ergebnis – Die Anzahl der ermittelten Wörter

Hinweis:

Die Trim-Funktionen geben einen Wert vom Typ Variant (String) zurück, der eine Kopieeiner bestimmten Zeichenfolge enthält, die keine führenden Leerzeichen (LTrim), keinenachgestellten Leerzeichen (RTrim) sowie keine Kombination aus führenden und nachge-stellten Leerzeichen (Trim) enthält.

Page 91: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 92: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang91

3 VBA-Standardfunktionen nutzen

In diesem Kapitel dreht sich alles um Standardfunktionen, die Sie in fast allen Office-Pro-grammen für Ihre Programmierung verwenden können. Mit zahlreichen Praxisbeispielenwerden diese Standardfunktionen beschrieben. Dabei werden diese Funktionen anhand derAnwendung Microsoft Excel demonstriert.

3.1 Textfunktionen einsetzen

Oftmals liegen die Daten nicht in der gewünschten Form für die Weiterverarbeitung vor. Fürdiese Fälle können Sie die Textfunktionen von VBA einsetzen, um die Daten in dasgewünschte Format zu bringen.

3.1.1 Textteile trennen

Im ersten Beispiel werden Sie einzelne Texte, die ursprünglich in einer einzigen Spalte unter-gebracht sind, auseinander nehmen und auf einzelne Spalten aufteilen. Dabei gehen Sie vonfolgender Ausgangssituation aus.

Hinweis:

Die folgenden Listings finden Sie auf www.buch.cd in der Datei Standardfunktionen.xls.

Page 93: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen92

Abb. 3.1 Die Ausgangssituation

Im Beispiel soll der Bindestrich dazu verwendet werden, um die Textteile voneinander zutrennen. Die Aufgabe besteht also darin, die Zahlen bzw. Buchstaben bis zum Bindestrich zuermitteln und in Spalte B zu übertragen. In Spalte C fügen Sie dann alle Zeichen ein, die nachdem Bindestrich folgen.

Sub TextTeileSeparierenUndAufteilen()Sheets("Tabelle1").ActivateRange("A2").Select

Do Until ActiveCell.Value = "" 'Spalte B füllen ActiveCell.Offset(0, 1).Value = _ Left(ActiveCell.Value, InStr(ActiveCell.Value, "-") - 1) 'Spalte C füllen ActiveCell.Offset(0, 2).Value = _ Mid(ActiveCell.Value, InStr(ActiveCell.Value, "-") + 1, 10)

Listing 3.1: Textteile extrahieren

Page 94: VBA-Programmierung fur Word, Excel und Access

Rechts3.1 Textfunktionen einsetzen 93

Im ersten Schritt aktivieren Sie die Tabelle, in der Sie die Aufgabe durchführen möchten, undselektieren danach die Startzelle, von der aus die Verarbeitung der Daten beginnen soll.

Setzen Sie danach eine Schleife auf, die so lange durchlaufen wird, bis die letzte Zeile verar-beitet wurde. Versetzen Sie nach jedem Schleifendurchlauf den Zellenzeiger genau eine Zelleweiter nach unten, indem Sie der Eigenschaft Offset im ersten Argument den Wert 1 zuwei-sen. Da Sie jeweils in der ersten Spalte verbleiben, setzen Sie das zweite Argument der Eigen-schaft Offset auf den Wert 0. Während der kompletten Verarbeitung der Daten bleiben Siejeweils in der Spalte A. Über die Eigenschaft Offset verweisen Sie dabei auf die Spalten Bund C, indem Sie das »Spalten-Offset« auf den Wert 1 bzw. den Wert 2 setzen.

Um die ersten Zeichen der jeweiligen Zelle bis zum Bindestrich zu übertragen, setzen Sie dieFunktion Left ein. Diese Funktion benötigt genau zwei Argumente. Im ersten Argumentgeben Sie an, von welchem Ausgangstext Sie Zeichen übertragen möchten. In unserem Bei-spiel steht dieser Text in einer Zelle, die Sie über die Anweisung ActiveCell.Value ange-ben. Das zweite Argument gibt an, wie viele Zeichen beginnend vom linken »Zellenrand«übertragen werden sollen. Da alle Zeichen bis zum Bindestrich übertragen werden müssen,setzen Sie die Funktion InStr ein. Diese Funktion gibt die genaue Position an, an der derBindestrich in der Zelle steht. Da dieses Zeichen letztendlich aber nicht übertragen werdensoll, subtrahieren Sie von der ermittelten Position den Wert 1.

Um die Zeichen nach dem Bindestrich zu ermitteln und zu übertragen, setzen Sie die Funk-tion Mid ein. Mithilfe dieser Funktion übertragen Sie aus einer Textfolge eine beliebigeAnzahl von Zeichen. Die Funktion Mid erwartet drei Argumente. Im ersten Argument gebenSie wieder an, won welchem Text bzw. hier Zelle, einzelne Zeichen übertragen werden sol-len. Im zweiten Argument geben Sie den Beginn der »Übertragung« an. Das letzte Argumentgibt die Anzahl der Zeichen an, die übertragen werden sollen. Setzen Sie auch hier wieder dieFunktion InStr ein, um die genaue Position des Bindestrichs zu ermitteln. Damit dieses Zei-chen aber nicht mit übertragen wird, addieren Sie dieser ermittelten Position den Wert 1. Imletzten Argument können Sie in diesem Fall die Konstante mit 10 Zeichen angeben, da zuvielübertragene Zeichen wieder verworfen werden.

ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 3.1: Textteile extrahieren

Page 95: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen94

Abb. 3.2 Die Textteile wurden aufgetrennt

3.1.2 Texte zusammenführen

Erweitern Sie die gerade gelöste Aufgabe, indem Sie die soeben separierten Textteile wiederin umgekehrter Reihenfolge zusammenbringen und in Spalte D einfügen. Entnehmen Sie dendafür notwendigen Quellcode dem folgenden Listing.

Setzen Sie den Mauszeiger zu Beginn der Verarbeitung auf die Startzelle B2. DurchlaufenSie danach eine Schleife, die alle Zellen in Spalte B nacheinander durchläuft. Setzen Sie das»Spalten-Offset« auf den Wert 2, um zwei Spalten weiter, also in Spalte D, die Ergebnisse zuschreiben. Verketten Sie die einzelnen Texte mithilfe des Zeichens &.

Sub TextTeileZusammenführen()Sheets("Tabelle1").ActivateRange("B2").Select

Do Until ActiveCell.Value = "" 'Spalte D füllen ActiveCell.Offset(0, 2).Value = _ ActiveCell.Offset(0, 1).Value & "-" & ActiveCell.Value ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 3.2: Textteile zusammensetzen

Page 96: VBA-Programmierung fur Word, Excel und Access

Rechts3.1 Textfunktionen einsetzen 95

Abb. 3.3 Textteile wieder zusammenführen

3.1.3 Datei- und Pfadnamen ermitteln

Im nächsten Beispiel werden Sie aus einem Dateinamen, bei dem der komplette Pfad mitangegeben ist, den Namen der Datei mithilfe der Funktionen Left, Mid und InstrRevermitteln. Sehen Sie sich vorher folgende Ausgangsvoraussetzung an.

Abb. 3.4 Pfad und Dateinamen separieren

Page 97: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen96

Ermitteln Sie zunächst den Namen des Pfades mithilfe des folgenden Listings.

Um den Dateinamen zu ermitteln, müssen Sie das Vorkommen des letzten »\« ermitteln. Indiesem Fall können Sie aber nicht die vorher vorgestellte Funktion InStr verwenden, dadiese Funktion bei der Suche vom linken Textrand beginnt. Verwenden Sie stattdessen dieFunktion InstrRev, die bei der Suche vom rechten Textrand beginnt.

Das Makro zum Ermitteln des Dateinamens aus einer Zelle lautet:

Mithilfe der Funktion Mid extrahieren Sie aus der komplett angegebenen Textfolge denNamen der Arbeitsmappe. Dabei orientieren Sie sich wiederum am letzten „\“-Zeichen undaddieren auf die so ermittelte Position den Wert 1, damit dieses Zeichen nicht mit übertragenwird.

Sub PfadNamenErmitteln()Sheets("Tabelle2").ActivateRange("A1").SelectActiveCell.Offset(2, 0).Value = _Left(ActiveCell.Value, InStrRev(ActiveCell.Value, "\"))End Sub

Listing 3.3: Den Pfadnamen ermitteln

Tipp:

Selbstverständlich können Sie den Pfad einer Arbeitsmappe auch direkt bestimmen,indem Sie die Anweisung MsgBox ThisWorkbook.Path verwenden.

Sub DateiNamenErmitteln()Sheets("Tabelle2").ActivateRange("A1").SelectActiveCell.Offset(3, 0).Value = _Mid(ActiveCell.Value, InStrRev(ActiveCell.Value, "\") + 1)End Sub

Listing 3.4: Den Dateinamen ermitteln

Tipp:

Möchten Sie den Namen der aktiven Arbeitsmappe bestimmen, können Sie die Anwei-sung MsgBox ThisWorkbook.Name einsetzen.

Page 98: VBA-Programmierung fur Word, Excel und Access

Rechts3.1 Textfunktionen einsetzen 97

Abb. 3.5 Den Namen des Pfades und der Datei extrahieren

3.1.4 PLZ von Stadt trennen

Sie haben bereits die Funktionen Left und Mid kennen gelernt. Was jetzt noch fehlt, ist dieFunktion Right, mit der Sie Zeichenfolgen vom rechten Zellenrand übertragen können. Imfolgenden Beispiel sollen die Namen der Städte von den Postleitzahlen, die in einer Spalteerfasst wurden, durch ein Makro getrennt werden. Sehen Sie sich zunächst einmal die nächsteAbbildung an.

Abb. 3.6 Stadt von der Postleitzahl trennen

Page 99: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen98

Erfassen Sie nun folgendes Makro, welches die Postleitzahlen der Städte in die Spalte Bschreibt.

Geben Sie im ersten Argument der Funktion Right an, aus welcher Zelle Sie die Zeichenübertragen möchten. Da die Postleitzahlen jeweils 5 Zeichen lang sind, können Sie das zweiteArgument der Funktion Right mit diesem Wert angeben.

Abb. 3.7 Die Postleitzahlen wurden separiert

3.1.5 Komplette Zeichenfolge zerlegen

In der nächsten Aufgabe werden Sie eine komplette Zeichenfolge in ihre Einzelteile zerlegen.Sehen Sie sich dazu einmal die folgende Abbildung an.

Sub PLZvonStadt()Sheets("Tabelle3").ActivateRange("A1").SelectDo Until ActiveCell.Value = "" 'Spalte B füllen ActiveCell.Offset(0, 1).Value = _ Right(ActiveCell.Value, 5) ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 3.5: Postleitzahlen extrahieren

Page 100: VBA-Programmierung fur Word, Excel und Access

Rechts3.1 Textfunktionen einsetzen 99

Abb. 3.8 Diese Zeichen sollen auf einzelne Spalten aufgeteilt werden

Die Textfolgen aus der Spalte A sollen nun auf die Spalten B bis K verteilt werden. Dabeidarf in jeder Spalte am Ende nur ein Buchstabe bzw. eine Zahl stehen. Das dafür notwendigeMakro können Sie im folgenden Listing sehen.

Aktivieren Sie im ersten Schritt das gewünschte Tabellenblatt und die Zelle, bei der die Ver-arbeitung der Daten beginnen soll. Danach durchlaufen Sie eine Schleife so lange, bis dieletzte verwendete Zeile erreicht wird. Innerhalb dieser Schleife setzen Sie eine weitereSchleife ein, die die einzelnen Zeichen der Zelle nacheinander abarbeitet. Über die Funktion

Sub EinzelteileZerlegen()Dim i As Integer

Sheets("Tabelle4").ActivateRange("A1").Selecte = 1Do Until ActiveCell.Value = "" For i = 1 To Len(ActiveCell.Value) Cells(e, i + 1) = Mid(ActiveCell.Value, i, 1) Next i e = e + 1 ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 3.6: Einzelne Zeichen in Spalten übertragen

Page 101: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen100

Len bekommen Sie heraus, wie viele Zeichen in der jeweilgen Zelle enthalten sind. Mithilfeder Eigenschaft Cells können Sie nun die einzelnen Zeichen auf die Spalten verteilen. Dabeierhöhen Sie die Variable e jeweils um den Wert 1, um zur nächsten Spalte zu gelangen. DieVariable i wird hier eingesetzt, um jeweils das nächste Zeichen in der Zelle anzusprechen.Mithilfe der Funktion Mid übertragen Sie dieses Zeichen jeweils in die entsprechende Spalte.

Abb. 3.9 Die einzelnen Zeichen wurden auf die Spalten verteilt

3.1.6 Texte spiegeln & verdrehen

Mehr theoretischer Natur ist das folgende Beispiel. Bei diesem Beispiel, bei dem Zeichenfol-gen verdreht werden. Sehen Sie sich vorher die folgende Abbildung an.

Abb. 3.10 Die Ausgangssituation

Page 102: VBA-Programmierung fur Word, Excel und Access

Rechts3.1 Textfunktionen einsetzen 101

In Spalte B sollen nun die Zeichenfolgen in umgekehrter Reihenfolge eingefügt werden. Umdiese Aufgabe zu lösen, erfassen Sie das folgende Makro:

Aktivieren Sie im ersten Schritt das gewünschte Tabellenblatt und die Zelle, bei der die Ver-arbeitung der Daten beginnen soll. Danach durchlaufen Sie eine Schleife so lange, bis dieletzte verwendete Zeile erreicht wird. Innerhalb dieser Schleife setzen Sie eine weitereSchleife ein, die die einzelnen Zeichen der Zelle nacheinander abarbeitet. Dabei zäumen Siedieses Mal das Pferd von hinten auf, d.h., Sie ermitteln zuerst die Gesamtzahl der Zeichen derjeweiligen Zelle und beginnen dann vom letzten Zeichen und arbeiten sich nach vorne durch.Dazu setzen Sie den Befehl Step ein, den Sie mit –1 durchlaufen lassen. Übertragen Sie soZeichen für Zeichen in die Spalte B, indem Sie die Funktion Mid einsetzen. Vergessen Siedabei nicht, nach der Abarbeitung einer Zelle die Variable s wieder zu initialisieren.

Abb. 3.11 Die Daten wurden »gespiegelt«

Sub TexteVerdrehen()Dim i As IntegerDim s As String

Sheets("Tabelle5").ActivateRange("A1").SelectDo Until ActiveCell.Value = "" For i = Len(ActiveCell.Value) To 1 Step -1 s = s & Mid(ActiveCell.Value, i, 1) Next ActiveCell.Offset(0, 1).Value = s s = "" ActiveCell.Offset(1, 0).Select LoopEnd Sub

Listing 3.7: Zeichenfolgen spiegeln

Page 103: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen102

3.1.7 Leerzeichen aus Zellen entfernen

Wenn Sie Daten aus Fremdanwendungen übernehmen, kann es vorkommen, dass sich füh-rende oder nachfolgende Leerzeichen mit einschleichen. Diese können Sie entfernen, indemSie die Funktion Trim einsetzen.

Abb. 3.12 Nachfolgende Leerzeichen sind gar nicht so leicht zu erkennen

Wie Sie sehen, sind die nachfolgenden Leerzeichen in der Tabelle gar nicht so leicht zuerkennen. Erst wenn Sie mit dem Mauszeiger direkt die jeweilige Zelle markieren und dieTaste (F2) drücken, sehen Sie, dass der Mauszeiger an die letzte Stelle der Zelle springt. Dieführenden Leerstellen sind in diesem Fall leichter zu sehen.

Markieren Sie auf der Tabelle alle Zellen, die Sie auf diese Art und Weise bereinigen möch-ten und starten danach das folgende Makro.

Sub LeerzeichenAusZellenEntfernen()Dim zelle As Range

For Each zelle In Selection zelle.Value = Application.Trim(zelle.Value) Next zelleEnd Sub

Listing 3.8: Führende und nachfolgende Leerzeichen entfernen

Page 104: VBA-Programmierung fur Word, Excel und Access

Rechts3.1 Textfunktionen einsetzen 103

Definieren Sie im ersten Schritt eine Range-Variable, um später eine einzelne Zelle anspre-chen zu können. In der nachfolgenden Schleife verwenden Sie ein so genanntes Auflistungs-objekt. Im Auflistungsobjekt Selection sind automatisch alle Zellen enthalten, die Sie vor-her markiert haben. Sie brauchen sich also um nichts weiteres mehr zu kümmern. DieSchleife durchläuft automatisch jede einzelne Zelle in der Markierung. Innerhalb der Schleifeüberschreiben Sie den momentanen Inhalt der Zelle, indem Sie die Funktion Trim einsetzen.Dabei werden führende und nachfolgende Leerzeichen aus der Zelle entfernt.

Abb. 3.13 Alle Leerzeichen am linken sowie rechten Zellenrand wurden entfernt

3.1.8 Aus klein mach GROSS

Neben den Standardtextfunktionen gibt es weitere Funktionen, um Texte zu wandeln. So kön-nen Sie beispielsweise bestimmte Texte in Großbuchstaben umwandeln lassen.

Hinweis:

Die Trim-Funktionen geben einen Wert vom Typ Variant (String) zurück, der eine Kopieeiner bestimmten Zeichenfolge enthält, die keine führenden Leerzeichen (LTrim), keinenachgestellten Leerzeichen (RTrim) sowie keine Kombination aus führenden und nachge-stellten Leerzeichen (Trim) enthält.

Page 105: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen104

Abb. 3.14 Texte konertieren

Wandeln Sie die Texte dieser Tabelle nun in Großbuchstaben um, indem Sie das folgendeMakro starten.

Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie die Umwandlung der Texte vorneh-men möchten. Über die Anweisung ActiveSheet.usedRange.Select markieren Sie denverwendeten Bereich der Tabelle. Setzen Sie anschließend eine Schleife auf, die über dasAuflistungsobjekt Selection alle vorher markierten Zellen verarbeitet. Innerhalb derSchleife prüfen Sie mithilfe der Funktion IsFormula, ob die jeweilige Zelle eine Formel

Sub TexteGroßMachen()Dim zelle As Range

Sheets("Tabelle7").ActivateActiveSheet.UsedRange.Select

For Each zelle In SelectionIf zelle.HasFormula = False Then zelle.Value = UCase(zelle.Value)End IfNextEnd Sub

Listing 3.9: Textkonvertierung von klein nach groß

Page 106: VBA-Programmierung fur Word, Excel und Access

Rechts3.1 Textfunktionen einsetzen 105

oder Funktion enthält. In diesem Fall muss die Konvertierung nicht durchgeführt werden. Imanderen Fall, wenn also Festwerte in den Zellen stehen, wenden Sie die Funktion Ucase an,um die Zelleninhalte in Großbuchstaben umzuwandeln.

Abb. 3.15 Text wurde in Großbuchstaben konvertiert

Analog zum vorherigen Beispiel können Sie Texte auch in Kleinbuchstaben überführen. Dasdazugehörige Makro lautet wie folgt:

Sub TexteKleinMachen()Dim zelle As Range

Sheets("Tabelle7").ActivateActiveSheet.UsedRange.Select

For Each zelle In SelectionIf zelle.HasFormula = False Then zelle.Value = LCase(zelle.Value)End IfNextEnd Sub

Listing 3.10: Textkonvertierung von groß nach klein

Page 107: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen106

Abb. 3.16 Texte wurden in Kleinbuchstaben gewandelt

In den beiden vorherigen Beispielen wurden alle verwendeten Zellen der Tabelle in Groß-buchstaben bzw. Kleinbuchstaben konvertiert. Oft ist es der Fall, dass Sie aber gerade nureinen Teil Ihrer Tabelle auf diese Art umformatieren möchten. In diesem Fall können Sieauch den Bereich definieren, in dem diese Umwandlung stattfinden soll. So wird im nächstenBeispiel der Bereich A1:A3 gewandelt. Der Code für diese Aufgabenstellung sieht wie folgtaus:

Über die Anweisung Set können Sie einen festen Bereich definieren, in dem diese Konver-tierung stattfinden soll. Durchlaufen Sie im Anschluss daran eine Schleife, in der jede Zelleinnerhalb dieses definierten Bereichs durchlaufen und konvertiert wird.

Sub DefiniertenBereichKonvertieren()Dim Bereich As RangeDim zelle As Range

Sheets("Tabelle8").ActivateSet Bereich = Range("A1:A3")For Each zelle In Bereich zelle.Value = UCase(zelle.Value)Next zelleEnd Sub

Listing 3.11: Textkonvertierung in definiertem Bereich vornehmen

Page 108: VBA-Programmierung fur Word, Excel und Access

Rechts3.1 Textfunktionen einsetzen 107

Abb. 3.17 Konvertierung wurde nur in definiertem Bereich vorgenommen

Tipp:

Möchten Sie die Konvertierung vollautomatisch vornehmen lassen, dann arbeiten Sie inExcel mit einem Ereignis. Danach wird die Konvertierung immer dann automatisch durch-geführt, wenn im definierten Zellenbereich eine Änderung vorgenommen wird. Um diesesEreignis einzustellen, verfahren Sie wie folgt:

1. Klicken Sie mit der rechten Maustaste auf die Registerlasche der Tabelle, auf der Sie die-sen Automatismus haben möchten und wählen aus dem Kontextmenü den Befehl CODE

ANZEIGEN.

2. In der Entwicklungsumgebung wählen Sie aus dem ersten Dropdown den EintragWorksheet.

3. Im zweiten Dropdown auf der rechten Seite wählen Sie das Ereignis CHANGE aus.

Page 109: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen108

Immer wenn Sie eine Änderung im Zellenbereich A1:A3 vornehmen, werden die eingegebe-nen Texte automatisch in Großbuchstaben konvertiert.

3.2 Mit Verzeichnissen und Laufwerken arbeiten

Wenn Sie Office-Dateien über ein Makro öffnen oder speichern möchten, sollten Sie vorhersicherstellen, dass das richtige Laufwerk bzw. das gewünschte Verzeichnis eingestellt ist.Dazu können Sie die Funktionen ChDrive und ChDir einsetzen. Mithilfe der Funktion

Abb. 3.18 Ein Tabellenereignis einstellen

4. Ergänzen Sie das noch leere Ereignis um folgende Zeilen:

Private Sub Worksheet_Change(ByVal Target As Range)Dim Bereich As RangeSet Bereich = Range("A1:A3")If Intersect(Target, Bereich) Is Nothing Then Exit Sub Target.Value = UCase(Target.Value)End Sub

Listing 3.12: Die Konvertierung wird automatisch bei einer Änderung im definierten Bereich-vorgenommen

Page 110: VBA-Programmierung fur Word, Excel und Access

Rechts3.2 Mit Verzeichnissen und Laufwerken arbeiten 109

ChDrive wechseln Sie auf das angegebene Laufwerk, mit der Funktion ChDir springen Siedirekt in das gewünschte Verzeichnis.

3.2.1 Dateien eines Verzeichnisses auflisten

In der folgenden Praxislösung werden Sie alle Dateien eines bestimmten Verzeichnisses auf-listen lassen. Dazu setzen Sie die Funktionen ChDrive und ChDir ein, um auf dasgewünschte Laufwerk bzw. das gewünschte Verzeichnis zu wechseln. Mit der Funktion Dirermitteln Sie dann die sich darin befindlichen Dateien.

Sub DateienErmitteln()Dim verz As StringDim s As String

verz = "C:\Eigene Dateien\"ChDrive verzChDir verz

Sheets("Tabelle9").ActivateRange("A1").Selects = Dir(verz)

Do While s <> "" ActiveCell.Value = s ActiveCell.Offset(1, 0).Select s = DirLoopEnd Sub

Listing 3.13: Alle Dateien eines Verzeichnisses rausschreiben

Tipp:

Möchten Sie beispielsweise nur Dateien eines bestimmten Dateityps anzeigen lassen,dann setzen Sie das folgende Listing ein, welches lediglich Excel-Dateien auflistet.

Sub ExcelDateienErmitteln()Dim verz As StringDim s As String

verz = "D:\Eigene Dateien\"ChDrive verz

Listing 3.14: Alle Excel-Dateien eines Verzeichnisses rausschreiben

Page 111: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen110

Abb. 3.19 Dateien eines Verzeichnisses ermitteln

ChDir verz

Sheets("Tabelle9").ActivateRange("A1").Selects = Dir(verz & "*.xls")

Do While s <> "" ActiveCell.Value = s ActiveCell.Offset(1, 0).Select s = DirLoopEnd Sub

Listing 3.14: Alle Excel-Dateien eines Verzeichnisses rausschreiben

Page 112: VBA-Programmierung fur Word, Excel und Access

Rechts3.2 Mit Verzeichnissen und Laufwerken arbeiten 111

3.2.2 Verzeichnisse erstellen

Um neue Verzeichnisse zu erstellen, können Sie den Befehl MkDir einsetzen. Im folgendenBeispiel legen Sie über ein Makro genau 12 Verzeichnisse an.

Wechseln Sie mithilfe der Funktion Chdir in das gewünschte Verzeichnis. Legen sie danachüber die Funktion MkDir neue Unterverzeichnisse an.

Abb. 3.20 Neue Verzeichnisse schnell anlegen

Sub VerzeichnisseAnlegen()Const Verz = "Monat_"Dim i As Integer

ChDir "D:\Eigene Dateien"

For i = 1 To 12 MkDir Verz & iNext iEnd Sub

Listing 3.15: Verzeichnisse anlegen

Page 113: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen112

3.2.3 Verzeichnisse löschen

Analog zum gerade vorgestellten Makro können Sie über fast dasselbe Makro die soebenerstellten Verzeichnisse wieder löschen. Zum Löschen eines Verzeichnisses setzen Sie dieFunktion RmDir ein.

3.3 Datums- und Zeitfunktionen einsetzen

In VBA stehen Ihnen einige Datums- und Zeitfunktionen zur Verfügung, mit denen Sie arbei-ten können.

3.3.1 Den Wochentag ermitteln

Wenn Sie ein Datum vor sich haben, wissen Sie nicht immer, um welchen Tag in der Wochees sich dabei handelt. Die Funktion Weekday meldet Ihnen einen Wert zwischen 1 und 7zurück, wenn Sie dieser Funktion einen gültigen Datumswert übergeben.

Sub VerzeichnisseLöschen()Const Verz = "Monat_"Dim i As Integer

ChDir "D:\Eigene Dateien"

For i = 1 To 12 RmDir Verz & iNext iEnd Sub

Listing 3.16: Verzeichnisse löschen

Sub ErmittelnWochentag()Dim s As StringDim WT As String

s = InputBox _("Geben Sie ein Datum *02.04.2002* ein!") If s = "" Then Exit Sub

Select Case Weekday(s) Case 1

Listing 3.17: Den Wochentag ermitteln – Variante 1

Page 114: VBA-Programmierung fur Word, Excel und Access

Rechts3.3 Datums- und Zeitfunktionen einsetzen 113

Abb. 3.21 Den Wochentag ermitteln und ausgeben

Wenn Sie das letzte Listing ansehen, fällt auf, dass die Funktion Weekday den Wert 1 für denSonntag meldet. Diese Besonderheit beruht höchstwahrscheinlich auf dem jüdischen Kalen-der, bei dem jede neue Woche mit dem Sonntag beginnt und daher den Index 1 bekommt.

WT = "Sonntag" Case 2 WT = "Montag" Case 3 WT = "Dienstag" Case 4 WT = "Mittwoch" Case 5 WT = "Donnerstag" Case 6 WT = "Freitag" Case 7 WT = "Samstag" End Select MsgBox "Das genannte Datum ist ein " & WT End Sub

Tipp:

Möchten Sie das letzte Makro noch kürzer haben, dann können Sie eine weitere Funktioneinsetzen, die zu dem Zahlenwert, den Ihnen die Funktion Weekday meldet, automatischden richtigen Wochentag zurückgibt. Die Funktion hierfür lautet WeekdayName.

Listing 3.17: Den Wochentag ermitteln – Variante 1

Page 115: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen114

Achten Sie darauf, dass Sie den Wert 1 vom Ergebnis subtrahieren, bevor Sie den Wert an dieFunktion WeekdayName übergeben, da es sonst zu einem fehlerhaften Ergebnis kommt.

3.3.2 Den Tag, Monat und das Jahr ermitteln

Um den Tag eines Datums zu erkennen, setzen Sie die Funktion Day ein. Diese Funktion mel-det Ihnen einen Wert zwischen 1 und 31.

Möchten Sie den Monat des aktuellen Datums ermitteln, ist das ja kein Problem. Diese Auf-gabe können Sie über das folgende Makro leicht lösen.

Über die Funktion Month können Sie den Monat ermitteln. Indem Sie dieser Funktion dasErgebnis einer weiteren Funktion (Date) übergeben, können Sie den Monat des aktuellenDatums ermitteln. Übrigens können Sie der Funktion Date ebenso einen Konstante mitgebenwie z.B. Date + 30 oder Date – 30, wenn Sie den folgenden Monat bzw. den vorhergegange-nen Monat ermitteln möchten.

Sub ErmittelnWT_Kurz()Dim s As String

s = InputBox _("Geben Sie ein Datum *02.04.2002* ein!")

If s = "" Then Exit Sub s = Weekday(s) - 1 s = WeekdayName(s) MsgBox "Der genannte Tag ist ein: " & sEnd Sub

Listing 3.18: Den Wochentag ermitteln – Variante 2

Sub AktTagErmitteln() MsgBox Day(Date)End Sub

Listing 3.19: Den aktuellen Tag ermitteln

Sub AktMonatErmitteln() MsgBox Month(Date)End Sub

Listing 3.20: Den aktuellen Monat ermitteln

Page 116: VBA-Programmierung fur Word, Excel und Access

Rechts3.3 Datums- und Zeitfunktionen einsetzen 115

Um das aktuelle Jahr einer Datumsangabe zu ermitteln, setzen Sie die Funktion Year ein.

Das folgende Makro gibt Ihnen sowohl den Wochentag als auch den Monatsnamen des aktu-ellen Datums zurück.

3.3.3 Teile aus Datumsangaben extrahieren

Möchten Sie ganz flexibel aus einem Datum einen bestimmten Teil, sei es nun das Jahr, denMonat oder den Tag, extrahieren, steht Ihnen für diese Aufgabenstellung eine weitere Funk-tion zur Verfügung. Diese Funktion heißt DatePart.

Wie Sie sehen, müssen Sie der Funktion DatePart ein Kürzel hinzufügen, das angibt, wel-che Information Sie genau möchten. Der folgenden Tabelle können Sie weitere Möglichkei-ten entnehmen, die Sie bei dieser Funktion haben.

Sub AktJahrErmitteln() MsgBox Year(Date)End Sub

Listing 3.21: Das aktuelle Jahr ermitteln

Sub ErmittelnWochenTagUndMonat()Dim s As StringDim s2 As String s = Month(Date) s2 = Weekday(Date) - 1 s2 = WeekdayName(s2) MsgBox "Das eingegeben Datum entspricht einem " _ & s2 & " im Monat " & MonthName(s)End Sub

Listing 3.22: Den aktuellen Wochentag und Monatsnamen ermitteln

Sub TeilVomDatum()Dim Datum1 As Date

Datum1 = DateMsgBox _ "Sie befinden sich im Quartal: " & DatePart("q", Datum1)End Sub

Listing 3.23: Das Quartal aus dem aktuellen Datum ermitteln

Page 117: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen116

3.3.4 Datumsberechnungen durchführen

Für Datumsberechnungen steht Ihnen die Funktion DatDiff zur Verfügung. Sehen Sie imfolgenden Listing, wie Sie beispielsweise die Differenz an Tagen vom aktuellen Tag zueinem in der Vergangenheit liegenden Tag ermitteln können.

Auch hier werden Kürzel verwendet, die den Kürzeln der Funktion DatePart entsprechen.

3.3.5 Ein Sprung in die Zukunft/Vergangenheit

Verwandt mit der gerade beschriebenen Funktion ist auch die Funktion DateAdd. Damit kön-nen Sie Termine in der Zukunft bzw. zurück in die Vergangenheit errechnen. Das folgendeBeispiel errechnet beginnend vom heutigen Termin einen Fälligkeitstermin, der in dreiMonaten fällig ist.

Kürzel Bedeutung

Yyyy Jahr

q Quartal

m Monat

y Tag des Jahres

d Tag

w Wochentag

ww Woche

h Stunde

n Minute

s Sekunde

Sub Datumsberechnung()Dim Datum1 As Date

Datum1 = InputBox _ ("Geben Sie das Datum aus der Vergangenheit ein") MsgBox "Vergangene Tage bis heute: " & _ DateDiff("d", Now, Datum1)End Sub

Listing 3.24: Wie viele Tage sind vergangen?

Sub FälligkeitBerechnen()Dim Datum1 As Date

Listing 3.25: Einen Zukunftswert errechnen

Page 118: VBA-Programmierung fur Word, Excel und Access

Rechts3.3 Datums- und Zeitfunktionen einsetzen 117

3.3.6 Die aktuelle Uhrzeit ermitteln

Mithilfe der Funktion Now können Sie die aktuelle Uhrzeit ermitteln. Dabei orientiert sichdiese Angabe an der in der Systemsteuerung von Windows vorgenommenen Einstellung derUhrzeit.

Möchten Sie lediglich die Stunden aus dieser Gesamtausgabe extrahieren, verwenden Sie dieFunktion Hour, der Sie das Ergebnis der Funktion Now übergeben. Die Funktion Hour liefertIhnen einen Wert zwischen 0 und 23 urück.

Übrigens können Sie auch folgende Syntaxen verwenden, um die Stundenangaben zuermitteln:

Direkt: MsgBox Hour("12:45")

In »Zeitzelle«: MsgBox Hour(Activecell.Value)

Dim s As StringDim Zahl As Integer

s = "m"Datum1 = DateZahl = 3MsgBox "Neues Datum: " & DateAdd(s, Zahl, Datum1)End Sub

Tipp:

Möchten Sie einen Termin aus der Vergangenheit bestimmen, dann setzen Sie einenMinuswert in der Variablen Zahl ein.

Sub UhrzeitErmitteln()MsgBox NowEnd Sub

Listing 3.26: Die aktuelle Uhrzeit ermitteln

Sub StundeErmitteln()MsgBox Hour(Now)End Sub

Listing 3.27: Die aktuelle Stunde ausgeben

Listing 3.25: Einen Zukunftswert errechnen

Page 119: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen118

Sind für Sie nur die Minuten einer Uhrzeit von Interesse, dann setzen Sie die FunktionMinute ein, um diese Information zu erhalten. Die Funktion Minute gibt Ihnen einen Wertzwischen 0 und 59 zurück.

Um die Sekunden einer Uhrzeit zu ermitteln, kommt die Funktion Second zum Einsatz.Diese Funktion meldet Ihnen einen Wert zwischen 0 und 59.

Nach diesen eher theoretischen kleineren Beispielen folgen nun einige praktische.

3.3.7 Pause einlegen

Verwenden Sie im nächsten Beispiel die gerade beschriebenen Funktionen. Dabei soll ineinem Makro eine 15-Sekunden-Pause programmiert werden. Das Makro für diese Aufga-benstellung lautet:

Sub MinuteErmitteln()MsgBox Minute(Now)End Sub

Listing 3.28: Die genaue Minutenangabe ausgeben

Sub SekundenErmitteln()MsgBox Second(Now)End Sub

Listing 3.29: Die genaue Sekundenangabe ausgeben

Sub PauseEinlegen()Const z = 15Dim WStunde As IntegerDim WMinute As IntegerDim WSekunde As IntegerDim Zeit as Date

MsgBox "Die Pause beginnt mit OK !" WStunde = Hour(Now) WMinute = Minute(Now) WSekunde = Second(Now) + z Zeit = TimeSerial(WStunde, WMinute, WSekunde) Application.Wait Zeit Beep MsgBox "Pause zu Ende!"End Sub

Listing 3.30: Makroverarbeitung 15 Sekunden lang pausieren

Page 120: VBA-Programmierung fur Word, Excel und Access

Rechts3.3 Datums- und Zeitfunktionen einsetzen 119

Speichern Sie zu Beginn des Makros die Angaben Stunden, Minuten und Sekunden in Varia-blen. Addieren Sie zu Sekunden-Variablen einen Wert. Dies soll dann der Pausenwert inSekunden sein.

Basteln Sie sich danach mithilfe der Funktion TimeSerial eine neue Zeitangabe zusammen.Dabei verlangt diese Funktion je einen Wert für die Stunde, Minute und Sekunde. SpeichernSie das Ergebnis daraus in einer Variablen vom Typ Date.

Setzen Sie jetzt die Methode Wait ein, um den Ablauf des Makros um die angegebene Zeitzu pausieren. Über die Anweisung Beep werden Sie akustisch informiert, wenn die Pause umist.

3.3.8 Bild ein- und ausblenden

Möchten Sie beispielsweise eine Grafik in eine Tabelle ein- und nach einer bestimmten Zeitwieder ausblenden, dann starten Sie das Makro aus folgendem Listing.

Definieren Sie zuerst einmal eine Variable vom Typ Picture sowie die benötigten Varia-blen für die Stunden-, Minuten- und Sekundenangaben. Fügen Sie danach ein Bild über dieMethode Insert ein. Achten Sie dabei darauf, dass die angegebene Bilddatei auch auf IhrerFestplatte vorhanden ist. Nach dem Einblenden des Bildes pausieren Sie in diesem Beispieldrei Sekunden, bevor Sie über die Methode Delete das Bild wieder aus der Tabelle ent-fernen.

Sub BildEinfügenUndWiederAusblenden()Dim Pic As PictureDim AStunde As IntegerDim aMinute As IntegerDim Asekunde As IntegerDim PauseZeit As Date

Set Pic = _ ActiveSheet.Pictures.Insert("D:\Windows\Kugeln.bmp") AStunde = Hour(Now) aMinute = Minute(Now) Asekunde = Second(Now) + 3 PauseZeit = TimeSerial(AStunde, aMinute, Asekunde) Application.Wait PauseZeit Pic.DeleteEnd Sub

Listing 3.31: Bild ein- und wieder ausblenden

Page 121: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen120

3.3.9 Arbeitsmappe nach bestimmter Zeit schließen

Einen recht interessanten Effekt können Sie erzielen, wenn Sie eine bereits geöffnete Excel-Arbeitsmappe nach einer bestimmter Zeit einfach wieder schließen und sogar die Anwen-dung beenden.

Um diesen Effekt einzustellen, verfahren Sie wie folgt:

• Drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwicklungsumgebung zugelangen.

• Führen Sie einen Doppelklick auf den Eintrag DIESEARBEITSMAPPE durch.

• Erfassen Sie das folgende Ereignis:

• Geben Sie danach das folgende Makro unter Modul1 ein.

• Speichern Sie die Arbeitsmappe, schließen Sie diese.

• Öffnen Sie die Arbeitsmappe erneut. Nun haben Sie genau 2 Minuten Zeit, bevor dieDatei wieder geschlossen wird.

Mithilfe der Methode Close schließen Sie die Arbeitsmappe. Im Argument SaveChangeskönnen Sie bestimmen, ob Änderungen an der Arbeitsmappe gesichert werden oder nicht.Über die Methode Quit beenden Sie die Anwendung.

3.3.10 Datumsangaben formatieren

Standardmäßig werden die Datums- und Zeitangaben so formatiert, wie Sie in der System-steuerung von Windows eingestellt sind. Sollten Sie eine andere Formatierung wünschen,können Sie die Funktion Format einsetzen. Über diese Funktion können Sie mittels Kürzel

Private Sub Workbook_Open()Dim zeit As Datezeit = Now + TimeSerial(0, 2, 0)Application.OnTime earliesttime:=zeit, procedure:="Ende"End Sub

Listing 3.32: Den Zeitpunkt des Schließens der Datei bereits beim Öffnen der Arbeits-mappe festlegen

Sub Ende()ThisWorkbook.Close Savechanges:=FalseApplication.QuitEnd Sub

Listing 3.33: Arbeitsmappe und Anwendung schließen

Page 122: VBA-Programmierung fur Word, Excel und Access

Rechts3.3 Datums- und Zeitfunktionen einsetzen 121

bestimmen, wie Ihr Datum formatiert werden soll. Die dafür vorgesehenen Kürzel entnehmenSie der folgenden Tabelle.

Das folgende Beispiel formatiert ein Datum auf verschiedene Art und Weise:

Kürzel Bedeutung

c vordefiniertes Standarddatum

d Monatstag mit einer oder zwei Ziffern (1 bis 31)

dd Monatstag mit zwei Ziffern (01 bis 31)

ddd die ersten drei Buchstaben des Wochentags (Son bis Sam)

dddd vollständiger Name des Wochentags (Sonntag bis Samstag)

w Wochentag (1 bis 7)

ww Kalenderwoche (1 bis 53)

m Monat des Jahres mit einer oder zwei Ziffern (1 bis 12)

mm Monat des Jahres mit zwei Ziffern (01 bis 12)

mmm die ersten drei Buchstaben des Monats (Jan bis Dez)

mmmm vollständiger Name des Monats (Januar bis Dezember)

q Datum als Quartal angezeigt (1 bis 4)

y Kalendertag (1 bis 366)

yy Die letzten zwei Ziffern der Jahreszahl (01 bis 99)

yyyy Vollständige Jahreszahl (0100 bis 9999)

h Stunde mit einer oder zwei Ziffern (0 bis 23)

hh Stunde mit zwei Ziffern (00 bis 23)

n Minute mit einer oder zwei Ziffern (0 bis 59)

nn Minute mit zwei Ziffern (00 bis 59)

S Sekunde mit einer oder zwei Ziffern (0 bis 59)

SMS Sekunde mit zwei Ziffern (00 bis 59)

AM/PM Zwölf-Stunden-Format mit den Großbuchstaben AM oder PM

am/pm Zwölf-Stunden-Format mit den Kleinbuchstaben am oder pm

A/P Zwölf-Stunden-Format mit den Großbuchstaben A oder P

a/p Zwölf-Stunden-Format mit den Kleinbuchstaben a oder p

Sub DatumsangabenFormatieren()Const Datum1 = "25.06.02"

MsgBox Format(Datum1, "DD.MM.YYYY") & Chr(13) & _ Format(Datum1, "DDDD "", den"" " & "DD.MM.YYYY") _ & Chr(13) & _ Format(Datum1, "DD. MMMM YYYY")End Sub

Listing 3.34: Datumsangaben formatieren

Page 123: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen122

Für ein mehrzeiliges Meldungsfenster verwenden Sie die Funktion Chr, der Sie den Zeichen-code 13 zuweisen. Damit führen Sie einen Zeilenwechsel durch.

Abb. 3.22 Datumsangaben verschiedenartig formatiert

3.3.11 Tabellen einfügen und formatieren

Ein weiteres Praxisbeispiel, welches viel Arbeitserleichterung für Sie bringt, ist das automa-tische Anlegen neuer Tabellen und deren Benennung. Im folgenden Beispiel sollen genau 30neue Tabellen in die Arbeitsmappe eingefügt und jeweils mit einem Tagesdatum, beginnendab dem 01.06.02, benannt werden. Das Makro für diese Aufgabe lautet:

Definieren Sie im ersten Schritt eine Zählvariable vom Typ Integer. Danach setzen Sie eineSchleife auf, die genau 30-mal durchlaufen wird. Innerhalb der Schleife setzen Sie dieMethode Add ein, um eine neue Tabelle einzufügen.

Benennen Sie diese jeweils neu eingefügte Tabelle, indem Sie die Eigenschaft Name verwen-den und dieser Eigenschaft über die Funktion DateSerial eine formatierte Datumsangabeals Namen übergeben. Die Funktion DateSerial ist verwandt mit der Funktion TimeSe-rial, die Sie bereits vorher kennen gelernt haben. So erwartet diese Funktion genau dreiArgumente. Das erste Argument entspricht der Jahresangabe. Dabei können Sie eine Zahlzwischen 100 und 9999 auswählen. Im zweiten Argument geben Sie den Monat an, der ineinem Wertebereich von 1 bis 12 liegen kann. Im letzten Argument geben Sie einen Tag imWertebereich zwischen 1 und 31 an.

Über die Funktion Format bringen Sie die Datumsangabe in das gewünschte Format.

Sub TabellenEinfügenUndNamenVergeben()Dim i As Integer

For i = 1 To 30 Worksheets.Add ActiveSheet.Name = Format(DateSerial _ (2002, 6, i), "DD.MM.YY") Next iEnd Sub

Listing 3.35: Tabellen einfügen und »formatiert« benennen

Page 124: VBA-Programmierung fur Word, Excel und Access

Rechts3.3 Datums- und Zeitfunktionen einsetzen 123

Abb. 3.23 Tabellenblätter einfügen und benennen

3.3.12 Datumsangaben erkennen

Es gibt in VBA eine Funktion, mit deren Hilfe Sie aus Textfolgen Datumsangaben ermittelnkönnen. So liefert das nächste Makro folgende Ergebnisse.

Sub DatumAusTextErkennen()Dim Datum1 As DateDim Datum2 As DateDim Datum3 As Date

Datum1 = DateValue("25. Juni 2002")Datum2 = DateValue("September 2001")Datum3 = DateValue("10-02-01")

MsgBox Chr(13) & _"25. Juni 2002 --> " & Datum1 & Chr(13) & _"September 2001 --> " & Datum2 & Chr(13) & _"10-02-01 --> " & Datum3End Sub

Listing 3.36: Textangaben in Datumsangaben wandeln

Page 125: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen124

Abb. 3.24 So werden Datumsangaben in Textfolgen erkannt

3.3.13 Datumsangaben in Kopf- und Fußzeile integrieren

Standardmäßig legen Sie Kopf- und Fußzeilen in Excel über so genannte Schalter an. ÜberVBA können Sie weitaus mehr anstellen. So können Sie beispielsweise bestimmte Datums-angaben wie das Erstellungsdatum der Arbeitsmappe, das letzte Änderungdatum, Zellenbe-züge, Dokumenteigenschaften sowie sonstige Informationen in die Kopf- oder Fußzeile inte-grieren.

Das nächste Makro integriert die folgenden Informationen in der Kopf- bzw. Fußzeile:

• Kopfzeile links: Zellenbezug auf A1

• Kopfzeile Mitte: der Name der Firma (aus den Dokumenteigenschaften)

• Kopfzeile rechts: aktuelles Datum (vierstellig)

• Fußzeile links: letztes Änderungsdatum (aus Dokumenteigenschaften)

• Fußzeile Mitte: Name des aktuellen Benutzers

• Fußzeile rechts: Datei- und Pfadname der Arbeitsmappe

Sub KopfUndFußzeileErstellen() With ActiveSheet.PageSetup .LeftHeader = Range("A1").Value .CenterHeader = _ ActiveSheet.Parent.BuiltinDocumentProperties("Company") .RightHeader = Format(Date, "dd.mm.yyyy") .LeftFooter = "letzte Änderung: " & _ ActiveSheet.Parent.BuiltinDocumentProperties(10) .CenterFooter = Application.Username .RightFooter = ThisWorkbook.FullName End With ActiveWindow.SelectedSheets.PrintPreviewEnd Sub

Listing 3.37: Kopf- und Fußzeile anlegen

Page 126: VBA-Programmierung fur Word, Excel und Access

Rechts3.3 Datums- und Zeitfunktionen einsetzen 125

Die Eigenschaft CenterHeader gibt den mittleren Teil der Kopfzeile zurück oder legt die-sen fest.

Abb. 3.25 Eine Bilddatei in die Kopfzeile einfügen

Tipp:Übrigens können Sie in der aktuellen Excel-Version 2002 zum ersten Mal standardmäßigBilddateien in der Kopf- oder Fußzeile ablegen. Der Quellcode für dieses neue Feature siehtwie folgt aus:

Sub BildInKopfzeileEinfügen()With ActiveSheet.PageSetup .CenterHeaderPicture.Filename = _ "D:\Eigene Dateien\Eigene Bilder\Eisberg.jpg" .CenterHeader = "&G"End WithActiveWindow.SelectedSheets.PrintPreviewEnd SubListing 3.38: Bilddatei in Kopfzeile integrieren

Page 127: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen126

Wie schon gesagt, können die Inhalte der Kopf- und Fußzeile auch über Formatcodes bekanntgegeben werden. Entnehmen Sie aus der folgenden Tabelle ein paar Beispiele hierfür.

3.4 Prüffunktionen

VBA beinhaltet einige Prüffunktionen, mithilfe derer Sie prüfen können, welcher Datentypvorliegt. Das ist gerade dann von Interesse, wenn Sie mit Daten weiterarbeiten möchten unddiese dazu im richtigen Format vorliegen müssen.

3.4.1 Die Funktion IsNumeric

Mithilfe der Funktion IsNumeric können Sie feststellen, ob der vorliegende Datentyp einnumerischer Wert ist. Diese Funktion gibt einen Wert vom Typ Boolean zurück, der angibt,ob ein Ausdruck als Zahl ausgewertet werden kann.

Formatcode Beschreibung

&L richtet nachfolgende Zeichen links aus

&C zentriert das nachfolgende Zeichen

&R richtet nachfolgende Zeichen rechts aus

&E schaltet Doppelt Unterstreichen 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 druckt das aktuelle Datum

&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

&P+Zahl druckt die Seitenzahl abzüglich der angegebenen Zahl

&& druckt ein einzelnes kaufmännisches Und-Zeichen

&"Schriftart" druckt die nachfolgenden Zeichen in der angegebenen Schriftart. Schriftart 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 Dokuments

Page 128: VBA-Programmierung fur Word, Excel und Access

Rechts3.4 Prüffunktionen 127

Im nächsten Beispiel sollen auf einer Tabelle alle Zellen eingefärbt werden, die Zahlen ent-halten. Sehen Sie sich dazu einmal folgende Beispieltabelle an.

Abb. 3.26 Die Ausgangstabelle

Alle Zellen mit Zahlenwerten sollen nun mit der Hintergrundfarbe Grün hinterlegt werden.Setzen Sie zu diesem Zweck das folgende Makro ein.

Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie die Prüfung durchführen möchten.Danach markieren Sie über die Anweisung ActiveSheet.Usedrange.Select alle ver-

Sub Prüfen()Dim Zelle As Range

Sheets("Tabelle10").ActivateActiveSheet.UsedRange.SelectFor Each Zelle In Selection If IsNumeric(Zelle.Value) Then Zelle.Interior.ColorIndex = 4 Else Zelle.Interior.ColorIndex = xlColorIndexNone End IfNext ZelleEnd Sub

Listing 3.39: Zellen mit Zahlenwerten werden eingefärbt

Page 129: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen128

wendeten Zellen auf der Tabelle. In einer anschließenden Schleife überprüfen Sie jeweils denDateityp der Zellen, indem Sie die Funktion IsNumeric einsetzen. Ist diese Überprüfungpositiv, färben Sie den Hintergrund der Zelle mithilfe der Eigenschaft ColorIndex, die Sieauf das Objekt Interior (= Hintergrund) anwenden. Jede Farbe in Excel hat einen eindeu-tigen Index. Der Index für die Farbe Grün entspricht dabei dem Wert 4. Sollte die Zelle kei-nen Zahlenwert enthalten, weisen Sie der Eigenschaft ColorIndex die Konstante xlColo-rIndexNone zu. Damit wird ein eventuell bestehender Hintergrund wieder gelöscht.

Abb. 3.27 Alle Zellen mit Zahlen wurden mit einem grünen Hintergrund belegt

Analog zu diesem Beispiel können Sie ebenso überprüfen, ob es sich um keinen Zahlenwerthandelt. In diesem Fall setzen Sie das Schlüsselwort Not vor die Funktion IsNumeric.

Sub Prüfen2()Dim Zelle As Range

Sheets("Tabelle10").ActivateActiveSheet.UsedRange.SelectFor Each Zelle In Selection If Not IsNumeric(Zelle.Value) Then Zelle.Interior.ColorIndex = 4 Else Zelle.Interior.ColorIndex = xlColorIndexNone

Listing 3.40: Nicht numerische Zellen werden eingefärbt

Page 130: VBA-Programmierung fur Word, Excel und Access

Rechts3.4 Prüffunktionen 129

Abb. 3.28 Alle nicht numerischen Zellen werden farblich hinterlegt

End IfNext ZelleEnd Sub

Tipp:

Wenn Sie wissen möchten, welcher Farbindex zu welcher Farbe in Excel gehört, dannstarten Sie das folgende Makro. Es listet Ihnen alle vefügbaren Farben in Excel mit dazu-gehörigem Index in einer Tabelle auf.

Sub FarbIndexeErmitteln()Sheets("Tabelle11").ActivateRange("A1").Select

For i = 1 To 56 ActiveCell.Interior.ColorIndex = i ActiveCell.Offset(0, 1).Value = i ActiveCell.Offset(1, 0).SelectNext iEnd Sub

Listing 3.41: Farbindexe ermitteln

Listing 3.40: Nicht numerische Zellen werden eingefärbt

Page 131: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen130

Abb. 3.29 Alle Farben in Excel einfügen und den Farbindex bestimmen

3.4.2 Die Funktion IsDate

Mithilfe der Funktion IsDate können Sie überprüfen, ob es sich bei einem Datentyp um einDatum handelt. Diese Funktion gibt den Wert True zurück, wenn der Ausdruck ein Datumist oder als ein gültiges Datum erkannt werden kann. Andernfalls wird False zurückgege-ben. In Microsoft Windows liegen gültige Datumswerte im Bereich vom 1. Januar 100 n.Chrbis 31. Dezember 9999 n.Chr.

Im nächsten Beispiel soll die Spalte A einer Tabelle untersucht werden. Wenn die jeweiligeZelle einen Datumswert enthält, soll in der Nebenspalte ebenso ein Datum eingefügt werden,das aber eine Woche zuvor datiert ist. Sehen Sie sich zuvor einmal folgende Ausgangssitua-tion an.

Page 132: VBA-Programmierung fur Word, Excel und Access

Rechts3.4 Prüffunktionen 131

Abb. 3.30 Die Ausgangsituation

Erfassen Sie nun das folgende Makro:

Sub DatumPrüfen()Dim i As Integer

Sheets("Tabelle12").ActivateRange("A1").ActivateFor i = 1 To ActiveSheet.UsedRange.Rows.Count If IsDate(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = ActiveCell.Value - 7 Else End If ActiveCell.Offset(1, 0).SelectNext iEnd Sub

Listing 3.42: Prüfung auf Datumswerte

Page 133: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen132

Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie die Prüfung durchführen möchten.Danach ermitteln Sie über die Anweisung ActiveSheet.UsedRange.Rows.Count dieAnzahl der gefüllten Zellen der Tabelle. Setzen Sie eine Schleife auf, die so lange durchlau-fen wird, bis die letzte gefüllte Zelle der Tabelle erreicht ist. Innerhalb der Schleife prüfen Siemit der Funktion IsDate, ob in der jeweiligen Zelle ein Datumswert steht. Wenn ja, verwen-den Sie die Eigenschaft Offset, deren »Spalten-Offset« Sie auf den Wert 1 setzen, um einenWert in die Nebenspalte zu schreiben. Subtrahieren Sie vom Datum den Wert 7 und schreibendas Ergebnis daraus in die Spalte B.

Abb. 3.31 Bei gültigem Datum wird in Nebenspalte das Datum von vor 7 Tagen eingefügt

3.4.3 Die Funktion IsEmpty

Über die Funktion IsEmpty können Sie prüfen, ob eine Variable initialisiert wurde. Als klei-nes Beispiel hierfür können Sie überprüfen, ob es in einer Arbeitsmappe Verknüpfungen zuanderen Arbeitsmappen gibt. Starten Sie zu diesem Zweck das folgende Makro:

Page 134: VBA-Programmierung fur Word, Excel und Access

Rechts3.4 Prüffunktionen 133

Deklarieren Sie im ersten Schritt eine Variable vom Datentyp Variant, welches in diesemBeispiel einem Array entspricht. In diesem Array speichern Sie über die AnweisungActiveworkbook.Linksources(xlExcelLinks) alle Verknüpfungen, die zu anderenArbeitsmappen bestehen. Sollte es keine Verknüpfungen in der Arbeitsmappe geben, wirddie Variable Verk auf den Wert Empty gesetzt. Und genau dieses »Leerbleiben« der Variablekönnen Sie über die Funktion IsEmpty überprüfen. Existieren eine oder mehrere Verknüp-fungen, dann arbeiten Sie alle Einträge im Datenfeld Verk ab, indem Sie eine Schleife auf-setzen, die so lange durchlaufen wird, bis alle Einträge im Datenfeld abgearbeitet wurden.Mit dem Wert 1 sprechen Sie das erste Element im Datenfeld, also die erste Verknüpfung zueiner anderen Arbeitsmappe, an. Mit der Funktion UBound ermitteln Sie das letzte verfügbareElement des Datenfelds. Über die Anweisung Debug.Print geben Sie die Verknüpfung imDirektfenster aus. Gibt es keine Verknüpfung zu einer anderen Arbeitsmappe, setzen SieFunktion MsgBox ein, um eine Meldung auf dem Bildschirm anzuzeigen.

Im folgenden Beispiel soll über eine Inputbox eine Zelle in einer Tabelle markiert undanschließend gelöscht werden. Die Löschung soll aber nur erfolgen, wenn ein Wert in diesermarkierten Zelle steht. Die Lösung für diese Aufgabenstellung lautet:

Sub VerknüpfungenErmitteln()Dim Verk As VariantDim i As Integer

Verk = ActiveWorkbook.LinkSources(xlExcelLinks)

If Not IsEmpty(Verk) Then For i = 1 To UBound(Verk) Debug.Print Verk(i) Next i Else MsgBox "In dieser Mappe gibt es keine Verknüpfungen!"End IfEnd Sub

Listing 3.43: Prüfung auf Verknüpfungen

Sub BereichMarkieren()Dim n As Range

Set n = Application.InputBox _("Wählen Sie eine Zelle aus die Sie löschen möchten", Type:=8)Range(n.Address).SelectIf IsEmpty(n.Value) ThenExit SubElse

Listing 3.44: Enthält die Auswahl einen Wert?

Page 135: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen134

Nur für den Fall, dass die markierte Zelle einen Wert aufweist, muss der Befehl Selec-tion.ClearContents angewendet werden. Ob in der ausgewählten Zelle ein Wert einge-tragen ist, prüfen Sie mithilfe der Funktion IsEmpty.

Abb. 3.32 Zelle zum Löschen markieren

3.4.4 Die Funktion IsArray

Mithilfe der Funktion IsArray prüfen Sie, ob es sich bei der angesprochenen Variablen umein Datenfeld (Array) handelt.

Testen Sie diese Funktion, indem Sie beispielsweise über eine Funktion ein Datenfeld erstel-len. Als Rückgabewert soll die Funktion ein gültiges Datenfeld liefern.

In der Zeile K_ARRY=ARRAYERZEUGEN(15) rufen Sie die Funktion ARRAYERZEUGEN aufund übergeben ihr den Wert 15. Damit legt die Funktion ARRAYERZEUGEN ein Datenfeld mit

Selection.ClearContentsEnd IfEnd Sub

Listing 3.44: Enthält die Auswahl einen Wert?

Page 136: VBA-Programmierung fur Word, Excel und Access

Rechts3.4 Prüffunktionen 135

genau 15 Datenfeldern, eigentlich ja 16, da die 0 mitgezählt wird, an. Nachdem die Funktionan die aufrufende Prozedur das angelegte Datenfeld zurückgemeldet hat, prüfen Sie über dieFunktion IsArray, ob die Rückgabe der Funktion auch den richtigen Datentyp, nämlich einDatenfeld liefert. Wenn ja, setzen Sie eine Schleife auf, in der das Datenfeld ausgelesen wird.Setzen Sie dazu den Index l zu Beginn der Schleife mithilfe der Funktion LBound auf denersten Eintrag des Datenfelds und arbeiten Sie sich dann bis zum letzten Feld des Datenfeldsvor, welches Sie über die Funktion UBound ermitteln. Geben Sie nach jedem Schleifendurch-lauf den Inhalt des jeweiligen Datenfelds im Direktbereich über die AnweisungDebug.Print aus.

Function ArrayErzeugen(Größe As Long) As VariantReDim K_Array(Größe)Dim l As Long

For l = LBound(K_Array, 1) To UBound(K_Array, 1) K_Array(l) = l Next l ArrayErzeugen = K_ArrayEnd Function

Sub ArrayBildenDynamisch()Dim K_Array As VariantDim l As Long

K_Array = ArrayErzeugen(15) If IsArray(K_Array) Then For l = LBound(K_Array, 1) To UBound(K_Array, 1) Debug.Print K_Array(l) Next l End IfEnd Sub

Listing 3.45: Wird ein gültiges Datenfeld zurückgegeben?

Page 137: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen136

Abb. 3.33 Die Felder des Datenfelds im Direktbereich ausgeben

3.5 Sonstige Funktionen

Zum Abschluss dieses Kapitels stelle ich Ihnen noch ein paar Funktionen vor, die Sie desöfteren gebrauchen können.

3.5.1 Fremde Programme aufrufen mit Shell

Mithilfe der Funktion Shell können Sie ausführbare Programme aufrufen. Im nachfolgen-den Beispiel rufen Sie den Rechner aus dem Windows-Zubehör auf.

Wie Sie sehen, müssen Sie bei Windows-Zubehör-Programmen nicht den kompletten Pfadzu dem ausführbaren Programm angeben. Es reicht hierbei der Name des ausführbaren Pro-gramms. Bei anderen Programmen müssen Sie immer den kompletten Pfad mit angeben.Nach dieser Angabe geben Sie über einen Index an, wie die Anwendung gestartet werdensoll. Dabei stehen Ihnen folgende Möglichkeiten zur Verfügung.

Sub Rechneraufrufen() Shell "calc.exe", 1End Sub

Listing 3.46: Den Rechner aufrufen

Page 138: VBA-Programmierung fur Word, Excel und Access

Rechts3.5 Sonstige Funktionen 137

Im nächsten Beispiel setzen Sie die Funktion Shell ein, um den Windows-Explorer aufzuru-fen. Dabei soll schon ein ganz bestimmtes Verzeichnis voreingestellt werden. Der Code fürdiese Aufgabe lautet wie folgt:

Abb. 3.34 Schneller Zugriff per VBA auf den Explorer

3.5.2 Texteile ersetzen mit Replace

Möchten Sie bestimmte Textteile durch andere Textteile ersetzen, wenden Sie die FunktionReplace an. Im folgenden Beispiel sollen auf einer Tabelle alle Punkte durch Bindestricheersetzt werden. Sehen Sie sich aber zuvor einmal die Ausgangssituation an.

Wert Beschreibung

0 Das Fenster ist ausgeblendet und das ausgeblendete Fenster erhält den Fokus.

1 Das Fenster hat den Fokus und die ursprüngliche Größe und Position wird wiederhergestellt.

2 Das Fenster wird als Symbol mit Fokus angezeigt.

3 Das Fenster wird maximiert mit Fokus angezeigt.

4 Die zuletzt verwendete Größe und Position des Fensters wird wiederhergestellt. Das momen-tan aktive Fenster bleibt aktiv.

6 Das Fenster wird als Symbol angezeigt. Das momentan aktive Fenster bleibt aktiv.

Sub ExplorerMitVerzAufrufen()Shell "Explorer.exe D:\Eigene Dateien\Eigene Bilder", 4End Sub

Listing 3.47: Den Explorer mit bestimmtem Verzeichnis aufrufen

Page 139: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen138

Abb. 3.35 Die Punkte sollen durch Bindestriche ersetzt werden

Erfassen Sie jetzt folgendes Makro, um die Aufgabenstellung zu lösen.

Aktivieren Sie im ersten Schritt die Tabelle, auf der Sie diese Ersetzung der Zeichenfolgedurchführen möchten. Markieren Sie über die Anweisung ActiveSheet.Use-dRange.Select den verwendeten Bereich der Tabelle. Danach wenden Sie die FunktionReplace an und geben im Argument what an, welche Zeichenfolge gesucht und ersetzt wer-den soll. Im Argument Replacement geben Sie die gewünschte Zeichenfolge an, die anstattder alten Zeichenfolge eingefügt werden soll. Das Argument LookAt gibt über die Konstan-ten xlPart und xlWhole an, ob der gesuchte Text alleine da stehen muss oder ob er Bestand-teil eines längeren Strings sein kann. Für dieses Beispiel könnten Sie dieses Argument auch

Sub TextTeileErsetzen()Sheets("Tabelle13").ActivateActiveSheet.UsedRange.SelectSelection.Replace What:=".", _Replacement:="-", LookAt:=xlPart, _SearchOrder:=xlByRows, MatchCase:=FalseEnd Sub

Listing 3.48: Textteile schnell austauschen

Page 140: VBA-Programmierung fur Word, Excel und Access

Rechts3.5 Sonstige Funktionen 139

weglassen. Soll ganz konkret nur nach dem kompletten Suchbegriff gesucht werden, setzenSie die Konstante (xlWhole) ein. Das Argument SearchOrder gibt die Suchreihenfolgean.

Abb. 3.36 Die Punkte wurden durch Bindestriche ersetzt

3.5.3 Farben erzeugen mit der Funktion RGB

Mithilfe der Funktion RGB (Rot-Grün-Blau) können Sie eigene Farben definieren, die Sie fürdie Formatierung von Objekten wie der Schriftfarbe oder der Farbe des Hintergrunds einerZelle einsetzen können.

Im folgenden Beispiel wird eine Tabelle abgearbeitet. Dabei fungiert die Spalte A als »Kenn-zeichenspalte«. Für jede Zeile, in der in dieser Spalte der Buchstabe X steht, soll die kom-plette Zeile mit der Farbe Hellgelb eingefärbt werden. Sehen Sie sich zuvor einmal die Aus-gangssituation an.

Page 141: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen140

Abb. 3.37 Die Artikel, die mit X gekennzeichnet sind, sollen farblich hervorgehoben werden

Erfassen Sie nun das folgende Makro, welches die »X-Zeilen« farblich kennzeichnen soll.

Sub ZeilenFärben()Sheets("Tabelle14").ActivateRange("B1").Select

Do Until ActiveCell.Value = "" If ActiveCell.Offset(0, -1).Value = "X" Then ActiveCell.EntireRow.Interior.Color = RGB(255, 255, 0) Else End IfActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 3.49: Zeilen einfärben mit RGB

Page 142: VBA-Programmierung fur Word, Excel und Access

Rechts3.5 Sonstige Funktionen 141

Aktivieren Sie im ersten Schritt die gewünschte Tabelle, auf der Sie die Formatierung einfü-gen möchten. Setzen Sie den Cursor auf die Zelle B1 und setzen Sie danach eine Schleife auf,die so lange durchlaufen wird, bis die erste leere Zelle in Spalte B auftritt. Innerhalb derSchleife prüfen Sie den Wert der Spalte A, indem Sie das »Spalten-Offset« auf den Wert –1setzen. Steht in der entsprechenden Zelle der Buchstabe X, färben Sie die ganze Zeile, indemSie die Funktion RGB auf die komplette Zeile anwenden. Die Funktion RGB erwartet genaudrei Argumente, die Sie in der nächsten Tabelle einsehen können.

Abb. 3.38 Die »X-Zeilen« wurden gefärbt

Farbe Rot-Komponente Grün-Komponente Blau-Komponente

Schwarz 0 0 0

Blau 0 0 255

Grün 0 255 0

Cyan 0 255 255

Rot 255 0 0

Magenta 255 0 255

Gelb 255 255 0

Weiß 255 255 255

Page 143: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen142

3.5.4 Leerzeichen einfügen mit der Funktion Space

Die Funktion Space liefert eine Zeichenfolge vom Typ Variant (String), die aus einer ange-gebenen Anzahl von Leerzeichen besteht.

Im folgenden Beispiel möchten Sie sicherstellen, dass jede Zelle mindestens 10 Zeichen auf-weist. Befinden sich in einer Zelle weniger Zeichen, sollen zusätzliche Leerzeichen eingefügtwerden. Das Makro für diese Aufgabenstellung lautet:

Aktivieren Sie zuerst einmal die Tabelle, auf der Sie diese Anpassung der Zellen vornehmenmöchten. Danach markieren Sie den benutzten Bereich der Tabelle und setzen eine Schleifeauf, die jede Zelle innerhalb der Markierung abarbeitet. Speichern Sie zunächst den Wert derjeweiligen Zelle in der Variablen s. Prüfen Sie nun über die Funktion Len, wie viele Zeichenbereits in der Variablen enthalten sind. Sind weniger als 10 Zeichen enthalten, fügen Sie wei-tere Leerzeichen ein, indem Sie die Funktion Space einsetzen. Die Gesamtlänge der Leerzei-chen halten Sie dynamisch, indem Sie von der zulässigen Mindestlänge die bereits ermittelteLänge der Zelle subtrahieren.

Sub MitLeerzeichenAuffüllen()Dim Zelle As RangeDim s As String

Sheets("Tabelle15").ActivateActiveSheet.UsedRange.Select For Each Zelle In Selection s = Zelle.Value If Len(s) < 10 Then Zelle.Value = s + Space (10 - Len(s)) End If Next ZelleEnd Sub

Listing 3.50: Leerzeichen auffüllen

Page 144: VBA-Programmierung fur Word, Excel und Access

Rechts3.5 Sonstige Funktionen 143

Abb. 3.39 Zusätzliche Leerzeichen wurden dynamisch eingefügt

3.5.5 Ganzzahlige Werte erstellen mit der Funktion Int

Die Funktion Int gibt den ganzzahligen Anteil einer Zahl zurück. Wandeln Sie auf dieseWeise in einer Tabelle Zahlenwerte mit Nachkommastellen in Ganzzahlenwerte um.

Abb. 3.40 Diese Zahlenwerte sollen in Ganzzahlen umgewandelt werden

Page 145: VBA-Programmierung fur Word, Excel und Access

Links

3 VBA-Standardfunktionen nutzen144

Um diese Aufgabe zu bewältigen, setzen Sie das nächste Makro ein.

Aktivieren Sie im ersten Schritt die gewünschte Tabelle, auf der Sie diese Umwandlungs-funktion durchführen möchten. Markieren Sie danach den verwendeten Bereich der Tabelleund setzen eine Schleife auf, die jede Zelle innerhalb der Markierung durchläuft. Sicherheits-halber fragen Sie in einer If-Anweisung ab, ob die entsprechende Zelle auch einen numeri-schen Wert enthält. Wenn ja, setzen Sie die Funktion Int ein, um aus dem numerischen Wertmit Nachkommastellen einen Ganzzahlwert zu ermitteln. Bedenken Sie dabei, dass die Wertenicht gerundet werden. Die Werte werden gnadenlos vor dem Komma abgeschnitten.

Abb. 3.41 Die ganzzahligen Werte wurden eingefügt

Sub InGanzzahlenWandeln()Dim zelle As Range

Sheets("Tabelle16").ActivateActiveSheet.UsedRange.SelectFor Each zelle In Selection If IsNumeric(zelle.Value) Then zelle.Value = Int(zelle.Value) Else End IfNext zelleEnd Sub

Listing 3.51: Aus Zahlen mit Nachkommastellen ganzzahlige Zahlen machen

Page 146: VBA-Programmierung fur Word, Excel und Access

Rechts3.5 Sonstige Funktionen 145

3.5.6 Werte runden mit Round

Nehmen Sie das gerade vorgestellte Beispiel noch einmal heran. Es sollen diese mehrstelli-gen Zahlenwerte jetzt gerundet werden. Für das Runden von Zahlenwerten steht Ihnen inVBA eine eigene Funktion zur Verfügung. Diese Funktion heißt Round. Im ersten Argumentdieser Funktion geben Sie die Zelle an, die die zu rundende Zahl enthält. Im zweiten Argu-ment geben Sie die Anzahl von Stellen hinter dem Komma an, nach denen gerundet werdensoll.

Abb. 3.42 Zahlenwerte auf zwei Stellen hinterm Komma runden

Sub Runden()Dim zelle As Range

Sheets("Tabelle17").ActivateActiveSheet.UsedRange.SelectFor Each zelle In Selection If IsNumeric(zelle.Value) Then zelle.Value = Application.Round(zelle.Value, 2) Else End IfNext zelleEnd Sub

Listing 3.52: Zahlenwerte runden

Page 147: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 148: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang147

4 Eigene Funktionen programmieren

Lernen Sie in diesem Kapitel, wie Sie zusätzliche Funktionen in Ihre Office-Anwendungenbringen können. Eigene Funktionen sind dann sinnvoll, wenn beispielsweise immer wiedergleiche Codeteile geschrieben werden müssen. Anstatt diese immer wieder neu zu schreiben,packen Sie diese Programmteile in eine einzige Funktion und rufen diese bei Bedarf aus IhrenModulen auf. Der Pflegeaufwand dieser Funktion ist dabei leichter, da eine Änderung immernur an einer Stelle, nämlich in der Funktion selbst, erfolgt. Sie ersparen sich die lästige Sucheund Anpassungen im gesamten Quellcode.

4.1 Farbige Zellen addieren

Im ersten Beispiel zu diesem Kapitel erstellen Sie eine Funktion, über die Sie die Inhalte far-biger Zellen in Excel-Tabellen summieren können.

Abb. 4.1 Alle hellgrauen Zellen sollen summiert werden

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Page 149: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren148

Erfassen Sie zunächst die Funktion, die die farbigen Zellen summieren soll.

Jede Funktion beginnt mit dem Schlüsselwort Function. Danach folgt der Name der Funk-tion, gefolgt von den erwarteten Argument(en), die der Funktion übergeben werden müssen.In unserem Beispiel wird ein Zellenbereich an die Funktion übergeben, in dem die Summie-rung stattfinden soll. Zusätzlich wird noch ein Farbindex erwartet, der die Farbe bekannt gibt.Alle Zellen, die sich in dem angegebenen Bereich befinden und als Hintergrundfarbe demübergebenen Farbindex entsprechen, werden somit summiert. Die Summierung wird inner-halb der Funktion durchgeführt.

Was nun noch fehlt, ist das Makro, welches die soeben erstellte Funktion aufruft.

Function FarbenSumme(Bereich As Range, CI As Integer) _ As DoubleDim zelle As Range

Application.Volatile For Each zelle In Bereich If zelle.Interior.ColorIndex = CI Then FarbenSumme = FarbenSumme + zelle.Value End If NextEnd Function

Listing 4.1: Farbige Zellen summieren

Sub ZahlenInGefärbtenZellenAddieren() MsgBox FarbenSumme(Range("A1:A10"), 35)End Sub

Listing 4.2: Die Funktion wird aufgerufen

Page 150: VBA-Programmierung fur Word, Excel und Access

Rechts4.2 Dateiprüfung 149

Abb. 4.2 Alle Zellwerte mit hellgrünem Hintergrund werden summiert

4.2 Dateiprüfung

Bevor Sie eine Datei per VBA öffnen, sollten Sie prüfen, ob diese auch vorhanden ist. Imnächsten Beispiel prüfen Sie, ob das Dokument Dok2.doc in einem bestimmten Verzeichnisexistiert. Wenn ja, öffnen Sie das Dokument.

Erfassen Sie zunächst die folgende Funktion:

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.doc finden.

Function DatExist(s As String) As Boolean DatExist = False If Len(s) > 0 Then DatExist = (Dir(s) <> "") Exit FunctionEnd Function

Listing 4.3: Die Funktion zur Überprüfung der Existenz einer Datei

Page 151: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren150

Die Funktion DatExist erwartet einen String, der sowohl den Namen der Datei als auch denPfad enthält. Wird dieser String nicht bzw. leer übergeben, meldet die Funktion Len den Wert0, was zum Abbruch der Funktion führt. Wird der Dateiname samt dem Pfad richtig an dieFunktion übergeben, wenden Sie die Funktion Dir an, die Sie wahrscheinlich noch aus altenDOS-Tagen her kennen. Meldet diese Funktionen einen Wert ungleich Leer zurück, wurdedie Datei gefunden.

Erfassen Sie nun das Makro, welches den Pfad- und Dateinamen der Funktion DatExistübergibt.

Im Makro DokDa wird das gewünschte Dokument, dessen Existenz geprüft werden soll, ineiner Konstanten gleich zu Beginn des Makros angegeben. Diese Konstante wird der Funk-tion DatExist übergeben. Die Funktion ihrerseits liefert einen Wahrheitswert an die aufru-fende Prozedur zurück, die Sie noch auswerten müssen. War die Suche nach dem Dokumenterfolglos, wird der Wert False zurückgeliefert. Im anderen Fall, wenn also das gesuchteDokument gefunden wird, wird der Wert True von der Funktion an die aufrufende Prozedurzurückgegeben. In diesem Fall wenden Sie die Methode Open an, um das Dokument zu öff-nen.

4.3 Daten bereinigen

Oft sind einfach einige Zeichen in Daten unerwünscht, die Sie gerne herausnehmen würden.Ob es nun die schrägen Striche zwischen einer Vorwahl und einer Rufnummer, Punkte, Bin-destriche oder Kommas sind, ist je nach Anwendungsfall unterschiedlich. Im folgendenMakro sollen in einer Excel-Tabelle in einem bestimmten Bereich alle Daten bereinigt wer-den. Die Ausgangstabelle sieht dabei wie folgt aus:

Sub DokDA()Const Datei = "D:\eigene Dateien\Dok1.doc"

s = DatExist(Datei)If s = "Wahr" ThenDocuments.Open DateiElseMsgBox "Die Datei ist nicht vorhanden!"End IfEnd Sub

Listing 4.4: Datei- und Pfadnamen werden an die Funktion DatExist übergeben

Page 152: VBA-Programmierung fur Word, Excel und Access

Rechts4.3 Daten bereinigen 151

Abb. 4.3 Die Ausgangstabelle

In der Tabelle sollen nun alle Bindestriche entfernt werden.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function BindestrRaus(s As String) As StringDim Puffer As StringDim i As Integer

Puffer = ""i = 1While InStr(i, s, "-") > 0 Puffer = Puffer & Mid(s, i, InStr(i, s, "-") - i) i = InStr(i, s, "-") + 1WendPuffer = Puffer & Mid(s, i)BindestrRaus = PufferEnd Function

Listing 4.5: Eine Funktion, die alle Bindstriche entfernt

Page 153: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren152

In der Funktion durchlaufen Sie eine Schleife, in der die Zeichen jeweils bis zum nächstenBindestrich in den String Puffer übertragen werden. Dabei wird der Bindestrich aber nichtübertragen. Ermitteln Sie danach die Position des nächsten Bindestrichs über die FunktionInStr.

Erfassen Sie nun noch die aufrufende Prozedur und übergeben der Funktion BindestrRausjeweils die gewünschte Zelle, aus der die Bindestriche entfernt werden sollen.

Abb. 4.4 In der Nebenspalte werden die bereinigten Werte eingefügt

Sub TabelleBereinigen()Sheets("Tabelle2").ActivateRange("A2").SelectDo Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = _ BindestrRaus(ActiveCell.Value) ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 4.6: Die Tabelle2 wird bereinigt

Page 154: VBA-Programmierung fur Word, Excel und Access

Rechts4.4 Aktive Zelle im Zielbereich? 153

4.4 Aktive Zelle im Zielbereich?

Im folgenden Beispiel definieren Sie einen festen Bereich z.B. A1:D10. Ihre Aufgabe bestehtnun darin zu überprüfen, ob die momentan aktive Zelle in diesem Bereich liegt.

Die Funktion BereichsP erwartet zwei Argumente. Im ersten Argument übergeben Sie dieAdresse der aktiven Zelle, im zweiten Argument übergeben Sie der Funktion den definiertenZielbereich.

Über die Methode Intersect prüfen Sie, ob zwei Bereiche sich überschneiden, also dieaktive Zelle im definierten Bereich liegt. Wenn ja, dann steht in der Variablen SM ein gültigerWert, den Sie auswerten können. Wenn nicht, dann trifft die Bedingung Nothing zu. Wasjetzt noch fehlt, ist die aufrufende Prozedur.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function BereichsP(Bereich1 As Range, Bereich2 As Range) _ As BooleanDim SM As Range

Set SM = Application.Intersect(Bereich1, Bereich2)BereichsP = Not SM Is NothingSet SM = NothingEnd Function

Listing 4.7: Liegt die aktive Zelle im Zielbereich?

Sub AktiveZelleWo()If BereichsP(ActiveCell, Range("A1:D10")) = True Then MsgBox "Die aktive Zelle " & ActiveCell.Address & _ " liegt im Zielbereich!"Else MsgBox "Die aktive Zelle " & ActiveCell.Address & _ " liegt nicht im Zielbereich!"End IfEnd Sub

Listing 4.8: Zielbereich und zu überprüfende Zelle werden übergeben

Page 155: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren154

Abb. 4.5 Die aktive Zelle liegt im definierten Bereich

4.5 Dokumentschutz aufheben und neu setzen

Haben Sie Ihre Word-Dokumente mit einem Kennwort geschützt und möchten Sie diesesdurch ein anderes Kennwort ändern, müssen Sie normalerweise alle Dokumente einzeln öff-nen, den Dokumentschutz im Menü EXTRAS aufheben und diesen dann neu setzen. Dabeimüssen Sie zuerst das alte Kennwort eingeben und danach das neue Kennwort festlegen undbestätigen. Diesen Aufwand können Sie dann minimieren, wenn Sie gewöhnlich dieselbenKennwörter benutzen. Schreiben Sie jetzt eine Funktion, das alle Dokumente, die unter denNamen Dok*.doc fallen und sich im Verzeichnis D:\EIGENE DATEIEN befinden, öffnet, dasalte Kennwort übergibt und ein neues Kennwort einstellt.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.doc finden.

Page 156: VBA-Programmierung fur Word, Excel und Access

Rechts4.5 Dokumentschutz aufheben und neu setzen 155

Die Funktion für diese Aufgabe entnehmen Sie dem folgenden Listing:

Wenden Sie das Objekt FileSearch an, um die Dokumente zu suchen. Dieses Objekt bietetIhnen einige Eigenschaften und Methoden an, die Sie einsetzen müssen, um Ihre Suche näherzu spezifizieren.

Über die Methode NewSearch setzen Sie die Einstellungen aller Suchkriterien sicherheits-halber auf die Standardeinstellungen zurück.

Über die Eigenschaft FileType legen Sie den Typ der Dateien fest, nach denen Sie suchenmöchten. Da Sie in diesem Beispiel nach Word-Dokumenten suchen, versorgen Sie dieseEigenschaft mit der Konstanten msoFileTypeWordDocuments.

Mithilfe der Eigenschaft FileName legen Sie den Namen der gesuchten Dokumente fest.Dabei können Sie auch so genannte »WildCards« verwenden, um die Suche breiter auszule-gen. So werden über den String "Dok*.doc" alle Dokumente gesucht, die mit den Buchstaben»Dok« beginnen und mit ».doc« enden.

Function PassWortTauschen(AltesPW As String, _NeuesPW As String) As BooleanDim DOK As Word.DocumentDim i As Integer

With Application.FileSearch .NewSearch .FileType = msoFileTypeWordDocuments .FileName = "Dok*.doc" .LookIn = "D:\Eigene Dateien" .SearchSubFolders = False .Execute For i = 1 To .FoundFiles.Count Set DOK = Documents.Open(.FoundFiles(i)) With DOK If .ProtectionType <> wdNoProtection Then .Unprotect AltesPW .Protect Type:=wdAllowOnlyRevisions, Password:=NeuesPW Else .Protect Type:=wdAllowOnlyRevisions, Password:=NeuesPW End If .Close wdSaveChanges End With NextEnd WithEnd Function

Listing 4.9: Dokumentschutz aufheben und neu setzen

Page 157: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren156

Über die Eigenschaft LookIn legen Sie den Startordner fest, in dem mit der Suche begonnenwerden soll.

Setzen Sie die Eigenschaft SearchSubFolders auf den Wert True, wenn auch in unterge-ordneten Verzeichnissen, die in unserem Beispiel also unterhalb des VerzeichnissesD:\Eigene Dateien liegen, gesucht werden soll.

Starten Sie letztendlich die Suche über die Methode Execute. Damit wird die Suche nachden angegebenen Dateien begonnen. Die Methode liefert einen Long-Wert zurück (null (0),wenn keine Dateien gefunden werden, eine positive Zahl, wenn eine oder mehrere Dateiengefunden werden).

Nach der Suche finden Sie die Ergebnisse im Objekt FoundFiles. Über die EigenschaftCount ermitteln Sie die genaue Anzahl der gefundenen Dokumente. Setzen Sie im Anschlussdaran eine Schleife auf, die ein Dokument nach dem anderen über die Methode Open öffnet,den alten Dokumentschutz bei Bedarf entfernt und durch den neuen Kennwortschutz ersetzt.Schließen Sie nach diesem Vorgang das Dokument, indem Sie die Methode Close einsetzen.Damit die Änderungen wirksam werden, geben Sie die Konstante wdSaveChanges an.

Was jetzt noch fehlt, ist die aufrufende Prozedur, welche Sie nun erfassen.

4.6 Römische Zahlen wandeln

Da es nicht einfach ist, römische Zahlen in arabische umzuwandeln, schreiben Sie eine Funk-tion, die Sie im nächsten Listing sehen können.

Sub DoksSchützen() b = PassWortTauschen("Test", "Test2")End Sub

Listing 4.10: Dokumente werden mit neuem Kennwort versehen

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function Arabisch(s As String) _As IntegerDim i As IntegerDim TeilW As Integer

Listing 4.11: Römische Zahlen umwandeln

Page 158: VBA-Programmierung fur Word, Excel und Access

Rechts4.6 Römische Zahlen wandeln 157

Testen Sie die Funktion anhand einer neuen Tabelle, in der Sie einmal ein paar römische Zah-len erfassen.

Dim TeilW2 As IntegerDim GesamtW As Integer

GesamtW = 0TeilW = 0TeilW2 = 0

For i = 1 To Len(s) Select Case Mid(s, i, 1) Case Is = "M" TeilW = 1000 Case Is = "D" TeilW = 500 Case Is = "C" TeilW = 100 Case Is = "L" TeilW = 50 Case Is = "X" TeilW = 10 Case Is = "V" TeilW = 5 Case Is = "I" TeilW = 1 Case Else TeilW = 0 End Select If TeilW2 < TeilW Then GesamtW = _ GesamtW - TeilW2 * 2 + TeilW Else GesamtW = GesamtW + TeilW End If TeilW2 = TeilW Next i

Arabisch = GesamtWEnd Function

Listing 4.11: Römische Zahlen umwandeln

Page 159: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren158

Schreiben Sie danach das Makro, welches die Funktion Arabisch aufruft.

Abb. 4.6 Die römischen Zahlen wurden in Spalte B umgewandelt

4.7 Eingefügte Objekte in PowerPoint-Folien ermitteln

Beim Einfügen von Objekten in eine PowerPoint-Präsentation haben Sie die Möglichkeit, dieVerknüpfung zur Quelldatei des Objekts beizubehalten. So werden Änderungen der Quellda-tei auch in der PowerPoint-Präsentation durchgeführt.

Sub RomNAchArab ()Sheets("Tabelle3").ActivateRange("A1").SelectDo Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = Arabisch(ActiveCell.Value) ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 4.12: In einer Tabelle werden römische Zahlen umgesetzt

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.ppt finden.

Page 160: VBA-Programmierung fur Word, Excel und Access

Rechts4.7 Eingefügte Objekte in PowerPoint-Folien ermitteln 159

4.7.1 Einzelne Verknüpfung gezielt aufspüren

Im folgenden Beispiel soll die Verknüpfungsadresse eines eingefügten Excel-Objekts in einerPowerPoint-Präsentation ermittelt werden. Kopieren Sie dazu einmal aus einer Excel-Arbeitsmappe einen Zellenbereich, starten PowerPoint und wählen aus dem Menü BEARBEI-TEN den Befehl INHALTE EINFÜGEN.

Abb. 4.7 Ein Excel-Objekt verknüpft einfügen

Aktivieren Sie die Optionsschaltfläche VERKNÜPFUNG EINFÜGEN und bestätigen Sie mit OK.

Erfassen Sie in der Entwicklungsumgebung von PowerPoint jetzt die Funktion, die die Ver-knüpfungsadresse des Objekts ermitteln soll.

Die Eigenschaft LinkFormat liefert Ihnen alle verknüpften OLE-Objekte. Mithilfe derEigenschaft SourceFullName können Sie den kompletten Namen samt Pfad des verknüpf-ten Objekts ermitteln.

Function Verknüpfung(obj As PowerPoint.Shape) As StringOn Error GoTo FehlerVerknüpfung = obj.LinkFormat.SourceFullNameExit Function

Fehler:Verknüpfung = ""End Function

Listing 4.13: Adresse des verknüpften Objekts ermitteln

Page 161: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren160

Schreiben Sie nun noch die Prozedur, die die Funktion Verknüpfung aufruft. Übergeben Siedabei die gewünschte Folie, auf der sich das verknüpfte Objekt befindet und die Nummer desObjekts.

Über die Anweisung ActivePresentation.Slides(1).Shapes(1) greifen Sie auf daserste eingefügte Ole-Objekt in der ersten Folie der aktiven Präsentation zu. Übergeben Siediese Information an die Funktion Verknüpfung.

Abb. 4.8 Die Verknüpfungsadresse des OLE-Objekts wurde ermittelt

Sub VerknüpfungAufspüren()Dim obj As PowerPoint.Shape

Set obj = ActivePresentation.Slides(1).Shapes(1)MsgBox Verknüpfung(obj)End Sub

Listing 4.14: Foliennummer und Objektnummer werden der Funktion übergeben

Page 162: VBA-Programmierung fur Word, Excel und Access

Rechts4.7 Eingefügte Objekte in PowerPoint-Folien ermitteln 161

4.7.2 Alle eingefügten Objekte aufspüren

Die gerade vorgestellte Funktion können Sie noch weiter ausbauen, indem Sie die Verknüp-fungen aller in der Präsentation enthaltenen Ole-Objekte ermitteln und anzeigen. Die Funk-tion für diese Aufgabe lautet:

Die Funktion AlleVerkn erwartet den Namen der Präsentation, von der Sie die Adressenaller verknüpften Ole-Objekte erhalten möchten. Als Ergebnis bekommen Sie diese in einerString-Variablen gemeldet. Innerhalb der Funktion selbst ermitteln Sie im ersten Schritt dieAnzahl der eingesetzten Folien der Präsentation mithilfe der Eigenschaft Count. DieseAnzahl bildet auch das Endekriterium für die erste Schleife in der Funktion. Es sollen somitalle Folien der Präsentation abgearbeitet werden. In der zweiten Schleife werden alle Objektein der jeweiligen Folie durchforstet. Ergibt die Prüfung über die Eigenschaft Type, dass essich um ein eingefügtes Ole-Objekt handelt, geben Sie über die Eigenschaft LinkFormat dieAdresse der Verknüpfung an eine String-Variable weiter. Setzen Sie die AnweisungChr(13) ein, um die einzelnen Adressen ordendlich untereinander zu schreiben. Geben Sieam Ende der Funktion den so gebildeten String, der jetzt die Verknüpfungsadressen aller ein-gefügten Ole-Objekte beinhaltet, an die Prozedur zurück.

Erfassen Sie jetzt die aufrufende Prozedur.

Function AlleVerkn(PräsName As String) As StringDim s As StringDim sh As ShapeDim i As Integer

For i = 1 To ActivePresentation.Slides.CountFor Each sh In ActivePresentation.Slides(i).Shapes If sh.Type = msoLinkedOLEObject Then With sh.LinkFormat s = s & Chr(13) & .SourceFullName End With End IfNextNext iAlleVerkn = sEnd Function

Listing 4.15: Alle Verknüpfungsadressen der Präsentation werden angezeigt

Sub AlleOLEermitteln() MsgBox AlleVerkn(ActivePresentation.Name)End Sub

Listing 4.16: Der Funktion AlleVerkn wird der Namen der aktiven Präsentation übergeben

Page 163: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren162

Abb. 4.9 Alle Verknüpfungsadressen werden ausgegeben

4.8 Läuft eine Anwendung bereits?

In den folgenden Beispielen werden Sie über Funktionen prüfen, ob eine bestimmte Anwen-dung bereits aktiv ist. Wenn ja, dann brauchen Sie diese nicht mehr über VBA zu starten.

4.8.1 Word-Anwendung bereits aktiv?

Im ersten Beispiel werden Sie ausgehend von Excel über eine Funktion prüfen, ob bereits eineWord-Sitzung geöffnet ist. Die Funktion für diesen Zweck lautet:

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function WordGestartet() As BooleanDim WordObj As Word.Application On Error GoTo Fehler:

Listing 4.17: Ist die Anwendung Word bereits aktiv?

Page 164: VBA-Programmierung fur Word, Excel und Access

Rechts4.8 Läuft eine Anwendung bereits? 163

Setzen Sie zu Beginn der Funktion den Rückgabewert auf den Wert False. Damit stellen Siesicher, dass die boolsche Variable richtig initialisiert ist. Danach setzen Sie die FunktionGetObject ein, um zu prüfen, ob eine bestimmte Anwendung, in unserem Beispiel Micro-soft Word, verfügbar ist. Über die Funktion Len prüfen Sie, ob in der Variablen WordObj eingültiger Wert steht. Wenn dem so ist, setzen Sie die Boolsche Variable auf den Wert True.Gibt es ein Problem beim Starten von Word, dann wird über die Anweisung On Error GoToFehler zum Fehlerparagraphen verzweigt. Dort wird die Funktion über die AnweisungExit Function beendet.

Abb. 4.10 Die noch fehlende Word-Bibliothek einbinden

WordGestartet = False Set WordObj = GetObject(, "Word.application") If Len(WordObj) = 0 Then Exit Function WordGestartet = True Exit Function Fehler: Exit FunctionEnd Function

Hinweis:

Sollten Sie eine Fehlermeldung erhalten, liegt es mit Sicherheit daran, dass Sie die Word-Bibliothek in Ihrer Entwicklungsumgebung noch nicht verfügbar gemacht haben. Wech-seln Sie hierzu in die Entwicklungsumgebung und wählen aus dem Menü EXTRAS denBefehl VERWEISE.

Listing 4.17: Ist die Anwendung Word bereits aktiv?

Page 165: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren164

Aktivieren Sie die Bibliothek MICROSOFT WORD 10.0 OBJECT LIBRARY und bestätigen mitOK.

Erfassen Sie nun die Prozedur, die die Funktion WordGestartet aufruft.

In beiden Fällen wird hier eine Bildschirmmeldung angezeigt. Erweitern Sie das obige Makronun, indem Sie dafür sorgen, dass im Falle, dass Word noch nicht gestartet ist, eine neueWord-Sitzung gestartet wird. Der Code für diese Aufgabe lautet:

Im Falle, dass Word noch nicht gestartet ist, setzen Sie die Funktion CreateObject ein, umeine neue Word-Sitzung zu starten. Setzen Sie die Eigenschaft Visible auf den Wert True,damit die Word-Sitzung auch angezeigt wird.

4.8.2 Access-Anwendung aktiv?

Im folgenden Beispiel prüfen Sie, ob Microsoft Access bereits geöffnet ist. Dabei gehen Siewiederum von Ihrer Excel-Anwendung aus und prüfen von da aus, ob Access bereits gestartetist. Wenn nicht, starten Sie die Anwendung und öffnen eine Datenbank. Die Funktion sowiedie Prozedur für diese Aufgabenstellung sehen Sie im folgenden Listing.

Sub WordAktiv()If WordGestartet = True ThenMsgBox "Word aktiv!"ElseMsgBox "Word inaktiv!"End IfEnd Sub

Listing 4.18: Aufruf der Funktion WordGestartet

Sub WordAktiv()Dim WordObj As Word.Application

If WordGestartet = True ThenMsgBox "Word aktiv!"ElseMsgBox "Word inaktiv!"Set WordObj = CreateObject("Word.application")WordObj.Visible = TrueEnd IfEnd Sub

Listing 4.19: Word-Sitzung starten

Page 166: VBA-Programmierung fur Word, Excel und Access

Rechts4.8 Läuft eine Anwendung bereits? 165

Im Falle, dass Access noch nicht gestartet ist, setzen Sie Funktion CreateObject ein, umeine neue Access-Sitzung zu starten. Setzen Sie die Eigenschaft Visible auf den Wert True,damit die Access-Sitzung auch angezeigt wird. Setzen Sie danach den Befehl OpenCur-rentDatabase ein, um eine bestimmte Datenbank zu öffnen.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Hinweis:

Vergessen Sie auch bei dieser Lösung nicht, dass Sie vorher noch die Microsoft Access-Bibliothek unter EXTRAS/VERWEISE einbinden müssen.

Function AccessGestartet() As BooleanDim AccObj As Access.Application On Error GoTo Fehler: AccessGestartet = False Set AccObj = GetObject(, "Access.application") If Len(AccObj) = 0 Then Exit Function AccessGestartet = True Exit Function Fehler: Exit FunctionEnd Function

Sub AccessAktiv()Dim AccObj As Access.Application

If AccessGestartet = True ThenMsgBox "Access aktiv!"ElseMsgBox "Access inaktiv!"Set AccObj = CreateObject("Access.application")AccObj.Visible = TrueAccObj.OpenCurrentDatabase ("D:\Eigene Dateien\Nordwind.mdb")End IfEnd Sub

Listing 4.20: Access starten und Datenbank öffnen

Page 167: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren166

4.8.3 PowerPoint-Anwendung aktiv?

Im nächsten Beispiel werden Sie überprüfen, ob eine PowerPoint-Sitzung bereits gestartet ist.Wenn nicht, starten Sie PowerPoint, öffnen eine ganz bestimmte Präsentation und lassen diePräsentation automatisch ablaufen. Die Lösung für diese Aufgabe können Sie im folgendenListing sehen.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Hinweis:

Vergessen Sie auch bei dieser Lösung nicht, dass Sie vorher noch die Microsoft-Power-Point-Bibliothek unter EXTRAS/VERWEISE einbinden müssen.

Function PPTGestartet() As BooleanDim PPTObj As Access.Application On Error GoTo Fehler:

PPTGestartet = False Set PPTObj = GetObject(, "PowerPoint.application") If Len(PPTObj) = 0 Then Exit Function PPTGestartet = True Exit Function Fehler: Exit FunctionEnd Function

Sub PPTAktiv()Dim PPTObj As PowerPoint.Application

If PPTGestartet = True ThenMsgBox "PowerPoint aktiv!"ElseMsgBox "PowerPoint inaktiv!"Set PPTObj = CreateObject("PowerPoint.application")PPTObj.Visible = TruePPTObj.Presentations.Open _ ("D:\Eigene Dateien\Präsentation1.ppt")

Listing 4.21: PowerPoint starten und Präsentation ablaufen lassen

Page 168: VBA-Programmierung fur Word, Excel und Access

Rechts4.9 Hyperlinks auf Shape-Objekten identifizieren 167

Im Falle, dass PowerPoint noch nicht gestartet ist, setzen Sie die Funktion CreateObjectein, um eine neue PowerPoint-Sitzung zu starten. Setzen Sie die Eigenschaft Visible aufden Wert True, damit die PowerPoint-Sitzung auch angezeigt wird. Setzen Sie danach denBefehl Open ein, um eine bestimmte Präsentation zu öffnen. Sprechen Sie daraufhin dasObjekt SlideShowSettings an, um auf die Bildschirmpräsentation zuzugreifen, und wen-den Sie die Methode Run an, um die Bildschirmpräsentation zu starten.

Abb. 4.11 Die Präsentation kur vor ihrem Start

4.9 Hyperlinks auf Shape-Objekten identifizieren

In nahezu allen Office-Anwendungen haben Sie die Möglichkeit, Grafikobjekte einzufügenund danach auf diesen Objekten Hyperlinks zu hinterlegen.

PPTObj.ActivePresentation.SlideShowSettings.RunEnd IfEnd Sub

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.doc finden.

Listing 4.21: PowerPoint starten und Präsentation ablaufen lassen

Page 169: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren168

In der folgenden Aufgabe fügen Sie einmal ein paar Grafikobjekte in Ihre Word-Anwendungein und fügen Hyperlinks hinter diesen Objekten ein. Dazu klicken Sie das jeweilige Objektmit der rechten Maustaste an und wählen aus dem Kontextmenü den Befehl HYPERLINK.Weisen Sie dann einen gewünschten Hyperlink diesem Objekt zu und bestätigen mit OK.Wenn Sie nun auf dieses Objekt klicken, wird die verknüpfte Internetadresse angesprungenund im Internet-Explorer geladen. Selbstverständlich können Sie Hyperlinks nicht nur zuWebseiten, sondern auch auf andere Office-Dokumente oder gar Grafik-Dateien verweisenlassen.

Abb. 4.12 Die Grafikobjekte mit den eingefügten Hyperlinks

Erfassen Sie nun in der Entwicklungsumgebung von Word folgende Lösung, um sowohl dieHyperlink-Adressen sowie auch die »Orte«, hinter denen diese Hyperlink-Adressen liegen,zu ermitteln.

Page 170: VBA-Programmierung fur Word, Excel und Access

Rechts4.9 Hyperlinks auf Shape-Objekten identifizieren 169

Deklarieren Sie im ersten Schritt eine Shape-Variable. Danach setzen Sie eine Schleife auf,die alle Shape-Objekte in Ihrem aktiven Dokument abarbeitet. Innerhalb dieser Schleife rufenSie die Funktion ExistHyper auf und übergeben ihr das gerade in Bearbeitung stehendeShape-Objekt. In der Funktion Existhyper prüfen Sie über die Anweisung Hyper-link.Name, ob hinter dem Shape ein Hyperlink eingefügt wurde. Wenn ja, steht in derVariablen s die LinkAdresse des Hyperlinks. Wenn nicht, können Sie davon ausgehen, dasskein Hyperlink hinter dem Shape-Objekt eingefügt wurde. Im Falle einer »Verlinkung«geben Sie über die Eigenschaft Address die Hyperlink-Adresse an und über die EigenschaftName den Namen des Shape-Objekts, hinter dem der Hyperlink eingefügt wurde.

Sub HyperlinksAusspähen()Dim sh As ShapeDim s As String For Each sh In ActiveDocument.Shapes If ExistHyper(sh) Then s = s + Chr(13) & sh.Hyperlink.Address & " in " & sh.Name Else End IfNext shMsgBox "Folgende Hyperlinks sind vorhanden" & Chr(13) & sEnd Sub

Function ExistHyper(sh As Shape) As BooleanOn Error GoTo fehlerDim s As String

s = sh.Hyperlink.Name If s <> "" Then ExistHyper = True Exit Function Else End If fehler: ExistHyper = FalseEnd Function

Listing 4.22: Hyperlinks hinter Grafikobjekten auslesen

Page 171: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren170

Abb. 4.13 Die Hyperlink-Adressen sowie die Grafikobjekte werden ausgegeben

4.10 Ist Dokument passwortgeschützt?

Bevor Sie ein Dokument öffnen, sollten Sie prüfen, ob dieses Dokument ein eingestelltesPasswort hat, welches beim Öffnen des Dokuments nachgefragt wird. Für diesen Fall schrei-ben Sie eine Funktion, die Sie im nächsten Listing sehen können.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.doc finden.

Page 172: VBA-Programmierung fur Word, Excel und Access

Rechts4.11 Ist Arbeitsmappe passwortgeschützt? 171

Der Trick, um ein Dokument abzufragen, ob ein Kennwortschutz eingestellt ist, besteht darin,das Dokument testhalber zu öffnen und ein bestimmt falsches Passwort mitzugeben. Im Fall,dass das Dokument ohne Schutz versehen ist, wird das mitübergebene Kennwort ignoriert.Im Falle, dass ein Kennwort vergeben wurde, wird es mit unserem »Dummy«-Passwortnatürlich nicht übereinstimmen und einen Fehler provozieren.

Für den Fall, dass kein Passwort für das Dokument vergeben wurde, wird das angegebeneDokument geöffnet. Im anderen Fall, also wenn die Funktion auf einen Fehler stößt, wird dasDokument selbstverständlich nicht geöffnet.

4.11 Ist Arbeitsmappe passwortgeschützt?

Das soeben erstellte Beispiel können Sie mit ein paar Änderungen auch für eine Excel-Arbeitsmappe verwenden. Dazu sind einige Vorbereitungen notwendig:

Legen Sie im ersten Schritt einmal eine Excel-Arbeitsmappe an und wählen aus dem MenüDATEI den Befehl SPEICHERN UNTER. Klicken Sie danach im Dialog SPEICHERN UNTER aufdas Symbol EXTRAS und wählen den Befehl ALLGEMEINE OPTIONEN.

Function Kennwort(DokName As String) As BooleanOn Error GoTo FehlerDocuments.Open FileName:=DokName, PasswordDocument:="Testpassword"

Kennwort = FalseExit Function

Fehler:Kennwort = TrueEnd Function

Sub DokuKennwort() If Kennwort("D:\Eigene Dateien\Dok1.doc") = True Then MsgBox "Dokument ist passwortgeschützt!" Else MsgBox "Dokument ist nicht passwortgeschützt!" End IfEnd Sub

Listing 4.23: Ist Dokument mit einem Kennwort versehen?

Page 173: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren172

Abb. 4.14 Ist Excel-Arbeitsmappe geschützt?

Geben Sie im Feld LESE-/SCHREIBKENNWORT ein beliebiges Passwort ein und bestätigen esnoch einmal. Beenden Sie den Dialog mit OK.

Erfassen Sie jetzt die folgende Lösung in einem Modul Ihrer Excel-Entwicklungsumgebung:

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function Kennwort(MapName As String) As BooleanOn Error GoTo FehlerWorkbooks.Open Filename:=MapName, Password:="Testpassword"

Kennwort = FalseExit Function

Fehler:Kennwort = TrueEnd Function

Listing 4.24: Ist Arbeitsmappe mit einem Kennwort versehen?

Page 174: VBA-Programmierung fur Word, Excel und Access

Rechts4.12 Wo bin ich? 173

Der Trick, um eine Arbeitsmappe abzufragen, ob ein Kennwortschutz eingestellt ist, bestehtdarin, die Arbeitsmappe testhalber zu öffnen und ein bestimmt falsches Passwort mitzugeben.Im Falle, dass die Arbeitsmappe ohne Schutz versehen ist, wird das mitübergebene Kennwortignoriert. Im Falle, dass ein Kennwort vergeben wurde, wird es mit unserem »Dummy«-Pass-wort natürlich nicht übereinstimmen und einen Fehler provozieren.

Für den Fall, dass kein Passwort für die Arbeitsmappe vergeben wurde, wird die angegebeneArbeitsmappe geöffnet. Im anderen Fall, also wenn die Funktion auf einen Fehler stößt, wirddie Arbeitsmappe selbstverständlich nicht geöffnet.

4.12 Wo bin ich?

Wenn Sie ein Word-Dokument starten, sind Sie immer am Beginn des Dokuments. Bei einerExcel-Arbeitsmappe dagegen ist der Mauszeiger immer dort anzutreffen, wo Sie ihn beimletzten Mal hingesetzt haben, sofern Sie die Arbeitsmappe gespeichert haben. Wenn Siedaher ein Makro starten, sollten Sie vorher überprüfen, wo der Mauszeiger gerade steht, daes sonst zu äußerst widrigen Vorgängen kommen kann. Stellen Sie sich vor, ein Makro läuftab und Sie befinden sich nicht auf der korrekten Excel-Tabelle.

4.12.1 Die aktuelle Word-Dokumentseite ermitteln

Möchten Sie wissen auf welcher Seite Sie sich gerade in Ihrem Word-Dokument befinden,können Sie eine Funktion programmieren, die wie folgt aussieht.

Sub MappenKennwort() If Kennwort("D:\Eigene Dateien\Mappe1.xls") = True Then MsgBox "Arbeitsmappe ist passwortgeschützt!" Else MsgBox "Arbeitsmappe ist nicht passwortgeschützt!" End IfEnd Sub

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.doc finden.

Listing 4.24: Ist Arbeitsmappe mit einem Kennwort versehen?

Page 175: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren174

Über die Eigenschaft Selection können Sie die aktuelle Markierung im Dokument fest-stellen. Die Eigenschaft Range stellt einen Teil des Dokuments dar. Mithilfe der Eigen-schaft Information können Sie über die Konstante wdActiveEndAdjustedPageNum-ber feststellen, wo Sie sich gerade im aktuellen Dokument befinden.

Abb. 4.15 Die aktuelle Seite im Dokument ermitteln und ausgeben

Function AktiveSeite() As Long AktiveSeite = _ Selection.Range.Information(wdActiveEndAdjustedPageNumber)End Function

Sub WoBinIch()MsgBox "Sie befinden sich auf der Seite " & AktiveSeiteEnd Sub

Listing 4.25: Die aktuelle Seite im Dokument ermitteln

Page 176: VBA-Programmierung fur Word, Excel und Access

Rechts4.12 Wo bin ich? 175

4.12.2 Die aktuelle Position in Excel bestimmen

Über folgende Funktion können Sie den Namen der Tabelle und die Adresse der Zelle(n)ermitteln, in der Ihr Mauszeiger gerade steht.

Die Eigenschaft ThisWorkbook stellt die Arbeitsmappe dar, in der das aktuelle Makro aus-geführt wird. Über die Eigenschaft ActiveSheet können Sie das momentan aktivierteTabellenblatt ermitteln. Die Eigenschaft Name gibt den Namen der aktuellen Tabelle wieder.

Abb. 4.16 Die aktuelle Mauszeigerposition ermitteln

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function AktTabelle() AktTabelle = ThisWorkbook.ActiveSheet.Name & " " & Selection.AddressEnd Function

Sub WoBinIch() MsgBox AktTabelleEnd Sub

Listing 4.26: Wo steht der Mauszeiger?

Page 177: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren176

4.13 Das älteste Dokument in einem Verzeichnis ermitteln

In der folgenden Aufgabe werden Sie das älteste Dokument in einem vorgegebenen Ver-zeichnis ermitteln. Dazu schreiben Sie eine Funktion und übergeben ihr den Verzeichnisna-men, in dem nach diesem Dokument geforscht werden soll.

Halten Sie im ersten Schritt die momentane genaue Uhrzeit in einer Variablen mithilfe derFunktion Now fest.

Wenden Sie das Objekt FileSearch an, um die Dokumente zu suchen. Dieses Objekt bietetIhnen einige Eigenschaften und Methoden an, die Sie einsetzen müssen, um Ihre Suche näherzu spezifizieren.

Über die Methode NewSearch setzen Sie die Einstellungen aller Suchkriterien sicherheits-halber auf die Standardeinstellungen zurück.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.doc finden.

Function AltDok(Pfad As String) As StringDim s As StringDim LetztDat As DateDim i As Integer

LetztDat = Now

With Application.FileSearch .NewSearch .LookIn = Pfad .FileType = msoFileTypeWordDocuments .SearchSubFolders = False .Execute For i = 1 To .FoundFiles.Count If FileDateTime(.FoundFiles(i)) < LetztDat Then LetztDat = FileDateTime(.FoundFiles(i)) s = .FoundFiles(i) End If Next iEnd WithAltDok = sEnd Function

Listing 4.27: Das älteste Dokument in einem Verzeichnis finden

Page 178: VBA-Programmierung fur Word, Excel und Access

Rechts4.13 Das älteste Dokument in einem Verzeichnis ermitteln 177

Über die Eigenschaft LookIn legen Sie den Startordner fest, in dem mit der Suche begonnenwerden soll.

Über die Eigenschaft FileTyp legen Sie den Typ der Dateien fest, nach denen Sie suchenmöchten. Da Sie in diesem Beispiel nach Word-Dokumneten suchen, versorgen Sie dieseEigenschaft mit der Konstanten msoFileTypeWordDocuments.

Setzen Sie die Eigenschaft SearchSubFolders auf den Wert False, damit die Suche nichtin untergeordneteren Verzeichnissen als dem angegebenen Verzeichnis stattfindet.

Starten Sie letztendlich die Suche über die Methode Execute. Damit wird die Suche nachden angegebenen Dateien begonnen. Die Methode liefert einen Long-Wert zurück (null (0),wenn keine Dateien gefunden werden, eine positive Zahl, wenn eine oder mehrere Dateiengefunden werden).

Nach der Suche finden Sie die Ergebnisse im Objekt FoundFiles. Über die EigenschaftCount ermitteln Sie die genaue Anzahl der gefundenen Dokumente. Fragen Sie nun über dieFunktion FileDatTime die letzte Änderung der jeweils gefundenen Datei ab und verglei-chen Sie diese mit dem vorher gespeicherten Datum der Variablen LetztDat. Wenn dabeidas Datum älter ist als Ihr vorher ermitteltes Datum, überschreiben Sie den Inhalt der Varia-blen LetztDat mit diesem neu ermittelten Datum und vergleichen die nächste Datei, diegefunden wurde. Speichern Sie im Anschluss daran den Namen der ermittelten Datei in derVariablen s und übergeben diesen Wert am Ende an die Prozedur.

Abb. 4.17 Die Kontrolle im Windows-Explorer

Sub WieHeißtDasÄltesteDokument()Dim s As String

s = AltDok("D:\Eigene Dateien")MsgBox sEnd Sub

Listing 4.28: Übergeben Sie der Funktion AltDok den Verzeichnisnamen

Page 179: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren178

4.14 Die Dokumenteigenschaften ermitteln

In jeder Office-Datei können Sie die Dokument-Eigenschaften füllen und ansehen, wenn Sieaus dem Menü DATEI den Befehl DATENBANKEIGENSCHAFTEN (Access) bzw. den BefehlEIGENSCHAFTEN (Word, Excel, PowerPoint) auswählen.

Abb. 4.18 Die Dokumenteigenschaften einsehen

Auf diese Dokumenteigenschaften können Sie auch über VBA zugreifen. Dabei greifen Sieauf das Objekt FileSystemObject zurück, in welchem die Dokumenteigenschaften hinter-legt sind.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.mdb finden.

Function DokuEig (Dateiname, NR As Integer)Dim fso As ObjectDim s As String

On Error Resume NextSet fso = CreateObject("Scripting.FileSystemObject")

Listing 4.29: Die Dokumenteigenschaften einer Datenbank auslesen

Page 180: VBA-Programmierung fur Word, Excel und Access

Rechts4.14 Die Dokumenteigenschaften ermitteln 179

Wie Sie im letzten Listing sehen, rufen Sie die Dokumenteigenschaften über Nummern auf.Entnehmen Sie der folgenen Tabelle die entsprechenden Nummern.

Erfassen Sie jetzt das Makro und rufen die Funktion DokuEig auf, indem Sie den Pfad, denDatenbanknamen und die gewünschte Nummer für die Dokumenteigenschaft übergeben.

With fso.GetFile(Dateiname)Select Case NR Case Is = 0: s = .Path Case Is = 1: s = Mid(.Path, 1, _ Len(.Path) - Len(.Name)) Case Is = 2: s = .Name Case Is = 3: s = .Type Case Is = 4: s = .Size Case Is = 5: s = CDate(.DateCreated) Case Is = 6: s = CDate(.DateLastModified) Case Is = 7: s = CDate(.DateLastAccessed) Case Else s = "keine gültige Eigenschaftsnummer"End SelectEnd WithDokuEig = sEnd Function

Nummer Beschreibung

0 Dateiname inkl. Pfad

1 nur Pfad

2 nur Dateiname

3 Dateityp

4 Dateigröße in Byte

5 erstellt am

6 letzte Änderung am

7 letzter Zugriff am

Listing 4.29: Die Dokumenteigenschaften einer Datenbank auslesen

Page 181: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren180

4.15 Wie viele Tage hat ein Monat?

In der nächsten Aufgabe werden Sie ermitteln, wie viele Tage ein bestimmter Monat hat.Dabei schreiben Sie in der Entwicklungsumgebung von Access folgende Funktion:

Die Funktion TageImMonat erwartet als Übergabewerte das Jahr (z.B. 2002) sowie denMonat (z.B. 6 (= Juni)). Innerhalb der Funktion wird die Standardfunktion Day eingesetzt, umspäter die genaue Anzahl von Tagen des Monats zu erhalten. Mithilfe der Funktion DateSe-rial wird das Datum des letzten Tags im Monat ermittelt.

Schreiben Sie danach das Makro, welches die Funktion TageImMonat aufruft.

Abb. 4.19 Der Monat Februar hat im Jahr 2002 genau 28 Tage

4.16 Initialen aus Namen bilden

Mithilfe einer Funktion können Sie auch Texte auf Ihre Wünsche hin zurechtstutzen. In derfolgenden Namensliste sollen aus Namen die dazugehörigen Initialen gebildet werden. SehenSie sich dazu einmal die folgende Abbildung an.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.mdb finden.

Function TageImMonat(Jahr As Integer, Monat As Integer) _ As Integer

TageImMonat = Day(DateSerial(Jahr, Monat + 1, 0))End Function

Listing 4.30: Die Anzahl der Tage eines Monats ermitteln

Sub AnzTage() MsgBox TageImMonat(2002, 2)End Sub

Listing 4.31: Der Monat Februar soll ausgewertet werden

Page 182: VBA-Programmierung fur Word, Excel und Access

Rechts4.16 Initialen aus Namen bilden 181

Abb. 4.20 Die Ausgangsnamensliste

Erfassen Sie jetzt folgende Funktion, um die Initialen aus den Namen zu bilden.

Die Funktion Abkürzen erwartet einen Textstring, den Sie aus unserem Beispiel aus derTABELLE5 und der Spalte A nehmen. Diese Namen werden also nacheinander an die Funktionübergeben und verarbeitet. Zu Beginn der Funktion entfernen Sie eventuell vorkommendeführende oder nachfolgende Leerstellen im Namen. Danach arbeiten Sie sich in einer SchleifeZeichen für Zeichen durch und übertragen immer dann jeweils ein Zeichen, sobald Sie auf

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function Abkürzen(s As String) As StringDim i As Integer

s = " " & Application.Trim(s)For i = 2 To Len(s) If Mid(s, i - 1, 1) = " " Then _ Abkürzen = Abkürzen & Mid(s, i, 1)Next iEnd Function

Listing 4.32: Jeweils zwei Buchstaben sollen aus jedem Namen übernommen werden

Page 183: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren182

ein Leerzeichen (beispielsweise zwischen Vorname und Nachname) stoßen. Diese Initialenfügen Sie dann in einen String ein und übergeben diesen am Ende der aufrufenden Prozedur,die Sie im nächsten Listing sehen können.

Abb. 4.21 Alle Namen wurden in Initialen umgesetzt

Sub InitialienBilden()Sheets("Tabelle5").ActivateRange("A2").Select

Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 1).Value = Abkürzen(ActiveCell.Value) ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 4.33: Alle Namen der Tabelle5 werden nacheinander an die Funktion Abkürzen über-geben

Page 184: VBA-Programmierung fur Word, Excel und Access

Rechts4.17 Automatisch E-Mail-Adressen generieren 183

4.17 Automatisch E-Mail-Adressen generieren

Bauen Sie das letzte Beispiel noch ein wenig aus. Jetzt sollen anhand der Namensliste auto-matisch E-Mail-Adressen gebildet werden. Dabei soll die Leerstelle zwischen vor- und Nach-namen durch einen Punkt ersetzt sowie die Endung @Firma.de hinter den Namen eingefügtwerden. Den Code für diese Aufgabe sehen Sie im folgenden Listing.

Entfernen Sie zur Sicherheit im ersten Schritt mit der Funktion Trim führende oder nachfol-gende Leerzeichen, die sich gerne einmal aus Versehen mit einschleichen können. ErsetzenSie danach über die Funktion Substitute die Leerzeichen durch Punkte und basteln denRest der E-Mail-Adresse zusammen. Bei der Funktion Substitute geben Sie im erstenArgument an, in welchem String etwas ersetzt werden soll. Im zweiten Argument geben Siean, nach welchem Zeichen bzw. welchen Zeichenfolgen gesucht werden soll. Im drittenArgument geben Sie das Zeichen bzw. die Zeichenfolge an, die stattdessen eingefügt werdensoll.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function Mails(s As String) As String

s = Application.Trim(s)s = Application.Substitute(s, " ", ".")s = s & "@Firma.de"Mails = sEnd Function

Sub MailAdressenBilden()Sheets("Tabelle5").ActivateRange("A2").Select

Do Until ActiveCell.Value = "" ActiveCell.Offset(0, 2).Value = Mails(ActiveCell.Value) ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 4.34: Aus einer Namensliste werden E-Mail-Adressen erzeugt

Page 185: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren184

Abb. 4.22 Aus den Namen der Personen wurden E-Mail-Adressen erzeugt

4.18 Ist Add-In bereits eingebunden

In Excel sowie auch in anderen Office-Komponenten können Sie zusätzliche Add-Ins einbin-den, um den Funktionsumfang Ihrer Anwendung noch zu erhöhen. Bevor Sie Befehle aus die-sen Add-Ins benutzen können, müssen Sie die Add-Ins zuerst einbinden. In Excel beispiels-weise wählen Sie aus dem Menü EXTRAS dem Befehl ADD-INS.

Abb. 4.23 Zusätzliche Add-Ins über den Add-In-Manager einbinden

Page 186: VBA-Programmierung fur Word, Excel und Access

Rechts4.19 Wo steckt der größte Wert? 185

Ihre Aufgabe besteht nun darin, über eine Funktion zu prüfen, ob das Add-In Solver bereitsin Ihrer Anwendung aktiviert ist. Die Lösung lautet dabei wie folgt:

In der Funktion AddInGeladen fragen Sie mithilfe der Funktion Installed ab, ob dasAdd-In bereits geladen ist. Wenn nicht, binden Sie es ein, indem Sie die EigenschaftInstalled für dieses Add-In auf den Wert True setzen.

4.19 Wo steckt der größte Wert?

In der nächsten Aufgabe legen Sie sich in einer Excel-Tabelle einen Bereich A1:F15 an, inden Sie Zahlen eingeben. Über die Standard-Funktion Max können Sie jetzt sehr leicht dengrößten Wert dieses Bereichs bestimmen. Was aber machen Sie, wenn Sie die Zellenadresse

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function AddInGeladen(s As String) As BooleanDim a As AddIn

Set a = AddIns(s)If a.Installed = True Then AddInGeladen = TrueElse AddInGeladen = FalseEnd IfEnd Function

Sub PrüfungAddIn()Dim a As AddIn

If AddInGeladen("Solver") = True ThenMsgBox "Das Add-In ist verfügbar!"ElseMsgBox "Das Add-In ist nicht verfügbar!" & _Chr(13) & "Es wird nun eingebunden"Set a = AddIns("Solver")a.Installed = TrueEnd IfEnd Sub

Listing 4.35: Ist das Solver-Add-In bereits aktiviert?

Page 187: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren186

dieser Zelle bestimmen möchten? Und was ist, wenn der maximale Wert gleich mehrfach imBereich vorkommt?

Sehen Sie sich als kleinen Einstieg einmal die folgende Tabelle an.

Abb. 4.24 Die Ausgangssituation: In einer Tabelle sind einige Zahlenwerte erfasst

Ermitteln Sie jetzt die Adresse(n) der höchste(n) Zelle(n) mithilfe der folgenden Lösung.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Function AdressMax(Bereich As Range)Dim Zelle As RangeDim Maximum As Double Maximum = WorksheetFunction.Max(Bereich)AdressMax = ""

Listing 4.36: wie heißen die Zelladressen der höchsten Werte?

Page 188: VBA-Programmierung fur Word, Excel und Access

Rechts4.19 Wo steckt der größte Wert? 187

Ermitteln Sie im ersten Schritt die größte Zahl im übergebenen Bereich. Verwenden Sie dazudie Funktion Max. Setzen Sie danach eine Schleife auf, die jede Zelle im übergebenen Bereichdurchläuft und das zuvor ermittelte Maximum mit den einzelnen Zellen vergleicht. Wird eineoder werden gar mehrere Übereinstimmungen gefunden, dann basteln Sie sich einen Stringzusammen, der die Adresse dieser Zellen enthält. Geben Sie diesen String an die aufrufendeProzedur zurück.

Abb. 4.25 Die größten Zellen wurden identifiziert

For Each Zelle In Bereich If Zelle.Value = Maximum Then AdressMax = AdressMax & Zelle.AddressLocal & "; " End IfNextEnd Function

Sub WoStecktDerGrößteWert() Sheets("Tabelle6").Activate MsgBox AdressMax(Range("A1:F15"))End Sub

Listing 4.36: wie heißen die Zelladressen der höchsten Werte?

Page 189: VBA-Programmierung fur Word, Excel und Access

Links

4 Eigene Funktionen programmieren188

4.20 Wird Name bereits verwendet?

In Excel haben Sie die Möglichkeit, Namen für einzelne Zellen oder gar ganze Bereiche zuvergeben. Dies kann eine Tabelle leichter verständlich machen.

Wenn Sie beispielsweise einen Namen per VBA vergeben möchten, dann sollten Sie vorherüberprüfen, ob dieser Name in der Arbeitsmappe nicht bereits verwendet wird. Alle verwen-deten Namen können Sie übrigens kontrollieren, wenn Sie aus dem Menü EINFÜGEN denBefehl NAMEN/DEFINIEREN auswählen.

Abb. 4.26 Alle verwendeten Namen anzeigen

Prüfen Sie nun über eine Funktion, ob der Name »Mai« bereits vergeben wurde.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap04 unter demNamen Funktionen.xls finden.

Page 190: VBA-Programmierung fur Word, Excel und Access

Rechts4.20 Wird Name bereits verwendet? 189

Übergeben Sie der Funktion NameVerg das Auflistungsobjekt Names, in dem alle verwende-ten Namen der Arbeitsmappe verzeichnet sind. Als zweites Argument übergeben Sie derFunktion den eigentlichen Namen, dessen Existenz Sie überprüfen möchten. Wird der Namein der Arbeitsmappe gefunden, steht in der Variablen Gname die Adresse (Tabelle und Zel-lenbezug) des Namens. Im anderen Fall kommt es zu einem Fehler. In diesem Fall wird dieBoolesche Variable auf den Wert False gesetzt und in der aufrufenden Prozedur ausge-wertet.

Function NameVerg(Obj As Object, s As String) _ As Boolean

Dim GName As Name

On Error GoTo Fehler Set GName = Obj(s) NameVerg = True Exit FunctionFehler: NameVerg = False End Function

Sub NamenÜberprüfen() If NameVerg(ThisWorkbook.Names, "Mai") Then MsgBox "Name da" Else MsgBox "Name nicht da" End IfEnd Sub

Listing 4.37: Ist der Name »Mai« in der Arbeitsmappe bereits vergeben?

Page 191: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 192: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang191

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren

Mithilfe von Meldungen können Sie Ihre Anwendungen verständlicher machen, indem Siebei falschen Eingaben oder sonstigen Fehlern reagieren können. Aber auch einfache Infor-mationen, die Sie dem Anwender bei Bedarf zur Verfügung stellen möchten, können Sie injeder Office-Anwendung programmieren.

Über einfache Eingabemasken können Sie vom Anwender Informationen abfragen und diesedann auswerten. Auch diese Funktionalität können Sie in allen Office-Anwendungen ein-setzen.

Dialoge helfen, Daten benutzerfreundlich zu erfassen. Dabei können Sie Dialoge so pro-grammieren, dass der Anwender möglichst wenig Eingaben machen muss, indem Sie ihmInformationen zur Verfügung stellen, die sich aus den teilweise eingegebenen Daten erge-ben. So könnten Sie sich beispielsweise vorstellen, dass nach Eingabe einer Kostenstelleautomatisch der dazugehörige Kostenstellentext mit im Dialog angezeigt wird. Die Dialogeheißen in Office seit der Version 97 eigentlich UserForms und sind Bestandteil der Entwick-lungsumgebung. UserForms kommen hauptsächlich in Excel und Word zum Einsatz. Accesshingegen bietet über seine Formulare und den Formular-Assistenten einen gleichwertigenErsatz an.

5.1 Meldungen programmieren

In den letzten Kapiteln wurde die Funktion Msgbox, über die Sie eine Meldung am Bild-schirm anzeigen können, schon öfter eingesetzt. Diese Funktion wird eingesetzt, um einenAnwender über ein Ergebnis eines Makros zu informieren oder auch um eine Warnmeldungauf dem Bildschirm anzuzeigen. Das Aussehen dieser Meldungen können Sie weitestgehendselbst bestimmen.

Die Syntax dieser Bildschirmmeldung lautet:

= MsgBox(prompt[, buttons] [, title] [, helpfile, context])

Page 193: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren192

Das erste Argument prompt muss angegeben werden. Es besteht aus einem Text, der alsMeldung im Dialogfeld erscheinen soll.

Das nächste Argument buttons bestimmt, welche Schaltflächen Sie in Ihrer Meldung mitanzeigen möchten. Diese Einstellung können Sie entweder durch eine Konstante oder eineneindeutigen Index vornehmen. Entnehmen Sie aus der nächsten Tabelle die dabei möglichenVarianten.

Die Anzahl und der Typ der im Dialogfeld angezeigten Schaltflächen wird in der letztenTabelle beschrieben. Des Weiteren wird die Symbolart sowie die Standardschaltfläche fest-gelegt.

Im nächsten Argument Title legen Sie einen Text fest, der im Fenstertitel angezeigt wer-den soll.

Die letzten beiden Argumente helpfile und context setzen Sie ein, wenn Sie auf einenHilfetext im Meldungsfenster verweisen möchten.

Konstante Wert Beschreibung

vbOKOnly 0 zeigt nur die Schaltfläche OK an

VbOKCancel 1 zeigt die Schaltflächen OK und Abbrechen an

VbAbortRetryIgnore 2 zeigt die Schaltflächen Abbruch, Wiederholen und Ignorieren an

VbYesNoCancel 2 zeigt die Schaltflächen Ja, Nein und Abbrechen an

VbYesNo 4 zeigt die Schaltflächen Ja und Nein an

VbRetryCancel 5 zeigt die Schaltflächen Wiederholen und Abbrechen an

VbCritical 16 zeigt Meldung mit Stop-Symbol an

VbQuestion 32 zeigt Meldung mit Fragezeichen-Symbol an

VbExclamation 48 zeigt Meldung mit Ausrufezeichen-Symbol an

VbInformation 64 zeigt Meldung mit Info-Symbol an

VbDefaultButton1 0 Erste Schaltfläche ist Standardschaltfläche

VbDefaultButton2 256 Zweite Schaltfläche ist Standardschaltfläche

VbDefaultButton3 512 Dritte Schaltfläche ist Standardschaltfläche

VbDefaultButton4 768 Vierte Schaltfläche ist Standardschaltfläche

VbApplicationModal 0 Der Anwender muss auf das Meldungsfeld zuerst reagieren, bevor er seine Arbeit mit der aktuellen Anwendung fortsetzen kann

VbSystemModal 4096 Alle Anwendungen werden unterbrochen, bis der Benutzer auf das Meldungsfeld reagiert

VbMsgBoxHelpButton 16384 fügt dem Meldungsfenster eine Hilfeschaltfläche hinzu

Info:

Die maximale Länge ist je nach Breite der verwendeten Zeichen auf ca. 1.024 Zeichenbeschränkt.

Page 194: VBA-Programmierung fur Word, Excel und Access

Rechts5.1 Meldungen programmieren 193

Nachdem Sie jetzt wissen, wie Sie das Aussehen der Bildschirmmeldung festlegen können,erfahren Sie jetzt, wie Sie ermitteln können, welche Schaltfläche der Anwender anklickt. Jenachdem, welche Schaltfläche der Anwender im Meldungsfenster klickt, sollen unter-schiedliche Aktionen folgen. Sie sehen in der nächsten Tabelle die möglichen Rückgabew-erte.

5.1.1 Abfrage vor Löschung von Texten

Als erste Aufgabe schreiben Sie in Word ein Makro, welches vor dem Löschen eines Textesim Dokument von Ihnen eine Rückfrage einholt.

Konstante Wert Beschreibung

vbOK 1 Die Schaltfläche OK wurde geklickt.

vbCancel 2 Die Schaltfläche Abbrechen wurde geklickt.

vbAbort 3 Die Schaltfläche Abbrechen wurde geklickt.

vbRetry 4 Die Schaltfläche Wiederholen wurde geklickt.

vbIgnore 5 Die Schaltfläche Ignorieren wurde geklickt.

vbYes 6 Die Schaltfläche Ja wurde geklickt.

vbNo 7 Die Schaltfläche Nein wurde geklickt.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap05 unter demNamen Msgbox.doc finden.

Sub LöschenTextInDokument()Dim i As Integer

i = MsgBox _("Wollen Sie den Text im Dokument wirklich löschen?", _ 1 + vbQuestion, "Löschabfrage")If i = 2 ThenExit SubElseWith Selection .WholeStory .Delete Unit:=wdCharacter, Count:=1End WithEnd IfEnd Sub

Listing 5.1: Löschrückfrage einholen

Page 195: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren194

Um zu ermitteln, welche Schaltfläche der Anwender klickt, fragen Sie die Variable i ab.Klickt der Anwender auf die Schaltfläche ABBRECHEN, so meldet die Variable den Wert 2,was ein sofortiges Beenden des Makros zur Folge hat. Im anderen Fall werden über dieMethode Delete alle Daten im Dokument gelöscht, die Sie zuvor über die AnweisungSelection.WholeStory markiert haben.

Abb. 5.1 Löschrückfrage einholen

5.2 Eingabemasken programmieren

Mithilfe der Methode Inputbox versetzen Sie den Anwender in die Lage, einzelne Eing-aben in einer Maske vorzunehmen und die Eingaben danach auszuwerten. Auch bei dieserFunktion können Sie Aussehen und Funktion des Dialogs selber bestimmen.

Die Syntax dieser Funktion sieht wie folgt aus:

= InputBox(prompt, title, default, Left, Top, helpFile, helpContext, type)

Page 196: VBA-Programmierung fur Word, Excel und Access

Rechts5.2 Eingabemasken programmieren 195

Das erste Argument prompt muss angegeben werden. Es besteht aus einem Text, der alsMeldung im Dialogfeld erscheinen soll.

Im nächsten Argument title legen Sie einen Text fest, der im Fenstertitel angezeigt wer-den soll.

Im Argument default können Sie eine Vorbelegung wählen, die im Textfeld angezeigtwird, wenn der Benutzer keine Eingabe vorgenommen hat. Wenn Sie das Argument weglas-sen, wird ein leeres Textfeld angezeigt.

Mit den nächsten beiden Argumenten left und top können Sie die Position auf dem Bild-schirm festlegen, wo die Inputbox angezeigt werden soll. So wird beim Argument left derhorizontale Abstand des linken Rands des Dialogfelds vom linken Rand des Bildschirmsfestgelegt. Beim Argument top wird der vertikale Abstand des oberen Rands des Dialog-felds vom oberen Rand des Bildschirms festgelegt.

Die beiden Argumente helpfile und context setzen Sie ein, wenn Sie auf einen Hilfetextim Meldungsfenster verweisen möchten.

Das letzte Argument type legt den Datentyp des Rückgabewerts fest. Ohne Angabe diesesArguments gibt das Dialogfeld den Datentyp Text zurück. Entnehmen Sie die zulässigenRückgabewerte der nächsten Tabelle.

5.2.1 Wort suchen über Inputbox

Im folgenden Beispiel werden Sie ein Wort in einem Word-Dokument suchen. Welches Wortdas ist, legen Sie über eine Inputbox fest.

Wert Beschreibung

0 Formel

1 Zahl

2 Text

4 logischer Wert (True oder False)

8 Zellenbezug

16 Fehlerwert

64 Wertematrix

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap05 unter demNamen Msgbox.doc finden.

Page 197: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren196

Fragen Sie den gewünschten Suchbegriff über eine Inputbox vom Anwender ab. Danachprüfen Sie, ob der Anwender überhaupt einen Suchbegriff eingegeben bzw. die SchaltflächeABBRECHEN geklickt hat. In beiden Fällen ist die String-Variable s leer. Ist dem nicht so,setzen Sie die Methode ClearFormatting ein, die Text- und Absatzformatierungen voneiner Markierung oder von der in einer Suchen- bzw. Ersetzen-Operation angegebenen For-matierung entfernt. Danach stellen Sie die Sucheigenschaften für die Suche zusammen.

Über die Eigenschaft Text geben Sie den Suchtext für die Suche an. Mithilfe der Eigen-schaft Forward legen Sie die Suchreihenfolge fest. Setzen Sie diese Eigenschaft auf denWert True, wenn das Dokument vorwärts (zum Dokumentende hin) durchsucht werden soll.Setzen Sie die Eigenschaft auf den Wert False, wenn das Dokument rückwärts (zum Doku-mentanfang hin) durchsucht werden soll.

Die Eigenschaft Wrap legt bei einer Suche, die nicht am Dokumentanfang begonnen wurde,die weitere Vorgehensweise nach Erreichen des Dokumentendes fest (oder umgekehrt, sof-ern Forward auf False gesetzt ist), bzw. wenn der Suchtext nicht in der angegebenenMarkierung oder in dem Bereich gefunden wird, oder gibt Informationen darüber zurück.

Setzen Sie die Eigenschaft Matchcase auf den Wert True, wenn Sie möchten, dass bei derSuche zwischen Groß- und Kleinschreibung unterschieden werden soll. Setzen Sie dieEigenschaft MatchWholeWord auf den Wert True, wenn die Suchoperation nur ganzeWörter finden soll und keinen Text, der Teil eines größeren Wortes ist.

Sub SuchenWort()Dim s As String

s = InputBox _("Geben Sie den Suchbegriff ein", "Suchen")If s = "" ThenExit SubElse Selection.Find.ClearFormatting With Selection.Find .Text = s .Forward = True .Wrap = wdFindContinue .MatchCase = False .MatchWholeWord = False End With Selection.Find.Execute End IfEnd Sub

Listing 5.2: Suchbegriff über Inputbox abfragen

Page 198: VBA-Programmierung fur Word, Excel und Access

Rechts5.3 Integrierte Dialoge verwenden 197

Haben Sie so die gewünschten Suchoptionen festgelegt, wenden Sie die Methode Executean, um die Suche zu starten.

Abb. 5.2 Suchbegriff eingeben und Wort finden

5.3 Integrierte Dialoge verwenden

Nicht jeder Dialog muss neu programmiert werden. Viele Dialoge sind schon standardmäßigin der Office-Anwendung integriert und warten darauf, eingesetzt zu werden.

5.3.1 Excel-Dialoge aufrufen

Wenn Sie sich informieren möchten, welche integrierten Dialoge es in Excel gibt, und vorallem, wie diese heißen, rufen Sie in der Entwicklungsumgebung den Objektkatalog auf undschauen unter der Rubrik XLBUILTINDIALOG nach. Im Objektkatalog finden Sie übri-gens den kompletten VBA-Befehlssatz.

Page 199: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren198

Abb. 5.3 Alle integrierten Dialoge im Überblick

Der Aufruf eines integrierten Dialogs am Beispiel des Dialogs SPEICHERN UNTER lautet wiefolgt:

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap05 unter demNamen Dialoge.xls finden.

Sub DialogSpeichernUnter() Application.Dialogs(xlDialogSaveAs).Show "Test.xls"End Sub

Listing 5.3: Aufruf des Dialogs Speichern unter

Page 200: VBA-Programmierung fur Word, Excel und Access

Rechts5.3 Integrierte Dialoge verwenden 199

Bei vielen integrierten Dialogen können Sie noch zusätzliche Argumente mitgeben. Leiderist diese Möglichkeit nicht dokumentiert und muss daher getestet werden. Bei diesemBeispiel wird beispielsweise im ersten Argument der vorgeblendete Dateiname festgelegt.

Abb. 5.4 Einen integrierten Dialog mit Argumenten aufrufen

Ein weiteres Beispiel, bei dem gleich mehrere Argumente übergeben werden können, ist derDialog DRUCKEN.

Im ersten Argument sprechen Sie das Gruppenfeld DRUCKBEREICH an. Da Sie dort daszweite Optionsfeld SEITEN aufrufen möchten, lautet das erste Argument 2. Danach gebenSie die Seiten von 1 bis 5 an, die Sie drucken möchten. Die Zahl 2 legt die Anzahl dergewünschten Kopien fest.

Sub DialogDrucken() Application.Dialogs(xlDialogPrint).Show 2, 1, 5, 2End Sub

Listing 5.4: Aufruf des Dialogs Drucken

Page 201: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren200

Abb. 5.5 Mehrere Argumente beim Drucken

5.3.2 Access-Dialoge aufrufen

Selbstverständlich haben Sie auch die Möglichkeit, nahezu alle anderen integrierten Dialog-felder von Excel für Ihre Arbeit zu nutzen. Dazu setzen Sie Methode RunCommand ein.Diese Methode führt einen eingebauten Menü- oder Symbolleistenbefehl aus, was so vielbedeutet, dass Sie somit in der Lage sind, fast jedes Dialogfeld von Access aufzurufen.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap05 unter demNamen Dialoge.mdb finden.

Sub Dialog()DoCmd.RunCommand acCmdViewModulesEnd Sub

Listing 5.5: Die verfügbaren Module werden angezeigt

Page 202: VBA-Programmierung fur Word, Excel und Access

Rechts5.3 Integrierte Dialoge verwenden 201

Abb. 5.6 Die möglichen Dialoge werden angezeigt

Im folgenden Beispiel wird die Registerkarte MODULE aktiviert.

Abb. 5.7 Die Registerkarte Module wird angezeigt

Page 203: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren202

5.3.3 Word-Dialoge einsetzen

Auch in Word können Sie auf integrierte Dialoge zugreifen. Diese finden Sie unter demObjekt Dialogs. Wechseln Sie einmal in die Entwicklungsumgebung, legen ein neuesModul an und geben das Wort Dialogs gefolgt von einem Leerzeichen ein. Daraufhinklappt ein Kontextmenü herunter, in dem alle verfügbaren integrierten Dialoge angezeigtwerden.

Abb. 5.8 Die integrierten Dialoge von Word

Über den folgenden Code rufen Sie beispielsweise den Dialog ÖFFNEN von Word auf.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap05 unter demNamen Dialoge.doc finden.

Sub DialogÖffnen()Dialogs(wdDialogFileOpen).ShowEnd Sub

Listing 5.6: Der Dialog Öffnen wird angezeigt

Page 204: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 203

Abb. 5.9 Der Dialog Öffnen von Word

5.4 UserForms programmieren

UserForms, die neue Bezeichnung für Dialoge, werden hauptsächlich in Excel eingesetzt.Aus diesem Grund wird nun ein Beispiel erstellt, bei dem die Möglichkeit gegeben wird,eine Mitarbeiterliste über eine UserForm in einer Tabelle anzulegen. Ebenso wird esmöglich sein, Mitarbeiter über eine UserForm zu suchen und im Dialog anzuzeigen.

Bevor Sie an das Entwerfen einer UserForm gehen, legen Sie eine Tabelle an, die die Daten,die Sie später über die UserForm eingeben, aufnehmen kann. Dazu orientieren Sie sich ander folgenden Abbildung.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap05 unter demNamen UserForm.xls finden.

Page 205: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren204

Abb. 5.10 Die noch leere Mitarbeitertabelle

Die Informationen Abteilung, Kostenstelle und Standort geben Sie in einem separaten Blattvor. Diese Informationen soll der Anwender dann über Dropdownfelder auswählen können.Fügen Sie dazu ein neues Blatt nach folgendem Vorbild ein.

Abb. 5.11 Die Vorgabe-Informationen

Nachdem Sie beide Tabellen angelegt haben, können Sie mit dem Entwurf der UserFormbeginnen.

Page 206: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 205

5.4.1 Die UserForm und ihre Steuerelemente

Um eine UserForm anzulegen, wechseln Sie in die Entwicklungsumgebung und wählen ausdem Menü EINFÜGEN den Befehl USERFORM.

Abb. 5.12 Eine UserForm einfügen

Wenn Sie die UserForm eingefügt haben, wird automatisch die Symbolleiste WERKZEUG-SAMMLUNG mit eingeblendet. Diese Werkzeugsammlung nutzen Sie, um den noch leerenDialog mit Elementen zu bestücken.

Unter anderem sind dies folgende Symbole (von links nach rechts und von oben nachunten):

• OBJEKTE AUSWÄHLEN: Markiert das entsprechende Element in der UserForm.

• BEZEICHNUNGSFELD: Über dieses Symbol können Sie Texte in Ihrer UserForm erfassen,meist im Zusammenspiel mit Textfeldern zu verwenden. Die Bezeichnungsfelder sind mitgrauem Hintergrund auf der UserForm hinterlegt.

• TEXTFELD: Mithilfe dieses Symbols können Sie Texte oder Zahlen in der UserForm ein-fügen.

Page 207: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren206

• KOMBINATIONSFELD: Über dieses Symbol fügen Sie ein Kombinationsfeld (Dropdown-feld) in die UserForm ein. Kombinationsfelder erkennen Sie daran, dass sich rechts nebendem Eingabefeld ein kleiner Pfeil nach unten befindet. Mit einem Klick darauf werdenIhnen weitere Auswahlmöglichkeiten angeboten. In einem Kombinationsfeld kann immernur ein Eintrag gewählt werden.

• LISTENFELD: Verwandt mit dem Kombinationsfeld ist auch das Listenfeld. Das Listenfeldbenötigt jedoch mehr Platz, weil mehrere Einträge gleichzeitig angezeigt werden. EinListenfeld kann so eingestellt werden, dass mehrere Einträge ausgewählt werden können.

• KONTROLLKÄSTCHEN: Mithilfe dieses Symbols können sie ein Kontrollkästchen in dieUserform einfügen. Kontrollkästchen können entweder aktiviert oder nicht aktiviert sein.Bei aktiviertem Zustand erscheint im Kästchen ein Häkchen. Wenn Sie Kontrollkästchenin einer Gruppe verwenden, können sowohl eines oder auch mehrere Kontrollkästchenaktiviert sein.

• OPTIONSFELD: Über dieses Symbol fügen Sie eine Optionsschaltfläche in die UserFormein. Optionsfelder können aktiviert oder nicht aktiviert sein. Bei aktiviertem Zustand istdas Optionsfeld mit einem schwarzen Punkt ausgefüllt. Wenn Sie mehrere Optionsfelderinnerhalb einer Gruppe verwenden, kann immer nur eine Option aktiviert sein.

• UMSCHALTFELD: Über das Umschaltfeld können Sie eine Schaltfläche einfügen, dieimmer zwei Zustände abdecken kann. Beim ersten Klick wird die Schaltfläche einge-drückt angezeigt, bei erneutem Klick wird diese Schaltfläche wieder entrastet.

• RAHMEN: Das Rahmen-Steuerelement können Sie einsetzen, um einzelne Elemente ineiner Gruppe zusammenzufassen. Wichtig bei der Erstellung eines Rahmens ist, dass die-ser vor den einzelnen Steuerelementen, die darin platziert werden sollen, eingefügt wird.

• BEFEHLSSCHALTFLÄCHE: Hinter Befehlsschaltflächen werden Makros hinterlegt, umbestimmte Aktionen durch einen Mausklick mit der UserForm auszuführen.

• REGISTER: Wenn Sie auf einer UserForm mehrere »Karteikarten« anbringen möchten,können Sie dieses Element verwenden.

• BILDLAUFLEISTE: Dieses Steuerelement kommt dann zum Einsatz, wenn Sie größereUserForms verwenden, um dabei horizontal oder auch vertikal zu scrollen, um bestimmteElemente anzeigen zu können.

• DREHFELD: Das Drehfeld wird eingesetzt, um einen Wert schrittweise hochzuzählen. Die-ses Steuerelement wird meist in Verbindung mit einem Textfeld verwendet.

• ANZEIGE: Mithilfe dieses Symbols können Sie ein Logo in Ihrer UserForm unterbringen.

• REFEDIT: Mit dem RefEdit-Element können Sie über ein Eingabefeld einen Bereich mar-kieren bzw. auch Texte eingeben.

Wenn Sie mit der rechten Maustaste auf die Werkzeugsammlung klicken, können Sie überden Befehl ZUSÄTZLICHE STEUERELEMENTE weitere Symbole einblenden und in Ihrer User-Form nutzen.

Page 208: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 207

5.4.2 Steuerelemente einfügen

Da die neu eingefügte UserForm in den meisten Fällen zu klein sein wird, vergrößern Sie dieUserForm, indem Sie mit der linken Maustaste ihre untere rechte Ecke anklicken und dieseschräg nach unten ziehen.

Fügen Sie danach die benötigten Steuerelemente ein.

• Setzen Sie einen Rahmen ein, um die persönlichen Daten wie Vor- und Nachnamen sowiedas Geburtsdatum optisch abzugrenzen.

• Bezeichnungs- und Texfeld für den Vor- und Nachnamen.

• Die Abteilung wird in einem Kombinationsfeld angezeigt.

• Die dazugehörige Kostenstelle wird in einem Textfeld daneben angezeigt.

• Der Standort soll in Optionsfelder ausgewählt werden.

• Bei den Feldern Zimmer-Nr. und Geburtsdatum werden Bezeichnungs- und Textfeldervorgesehen.

• Fügen Sie zunächst zwei Schaltflächen mit den Beschriftungen OK und Abbrechen ein.

Nachdem Sie diese Elemente in die UserForm eingefügt haben, müssten Sie in etwa folgen-des Bild vor sich haben.

Abb. 5.13 Die fertig gezeichnete UserForm

Page 209: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren208

5.4.3 Die UserForm aufrufen

Was jetzt noch fehlt, ist das automatische Befüllen der Kombinationsfelder ABTEILUNG undGEBÄUDE/ZIMMER-NR sowie der Beschriftungen der Optionsschaltflächen für den STAND-ORT, wobei diese Informationen aus der Tabelle VORGABE geholt werden. Diese Aufgabeerledigen Sie am besten direkt beim Aufrufen der UserForm.

Führen Sie dazu einen Doppelklick auf eine freie Stelle der UserForm durch. Wählen Siedanach im Code-Bereich aus dem rechten, oberen Kombinationsfeld den Eintrag INITIALIZE.Nach dem Auswählen dieses Eintrags wird ein leerer Ereignisrahmen eingefügt. Alle Befe-hle innerhalb dieses Rahmens werden beim Aufrufen der UserForm ausgeführt.

Hinweis:

Wenn Sie die Reihenfolge ändern möchten, mit der Sie über die Taste (Tab) von Elementzu Element in der UserForm springen, können Sie dies ohne weiteres einstellen. WählenSie dazu den Menübefehl ANSICHT/ AKTIVIERREIHENFOLGE. Ist dieser Menübefehl beiIhnen deaktiviert, markieren Sie vorher eines der Textfelder oder Schaltflächen auf derUserForm. Die Reihenfolge ändern Sie, indem Sie das entsprechende Element im Listen-feld AKTIVIERREIHENFOLGE markieren und auf die Schaltfläche NACH OBEN bzw. NACH

UNTEN klicken.

Private Sub UserForm_Initialize()Dim i As Integer

'Das Kombinationsfeld Abteilung füllen For i = 2 To 6 UserForm1.ComboBox1.AddItem _ Sheets("Vorgaben").Cells(i, 2).Value Next i'Den ersten Eintrag einstellenUserForm1.ComboBox1.ListIndex = 0

i = UserForm1.ComboBox1.ListIndex'Textfeld Kostenstelle füllenUserForm1.TextBox4.Value = _HoleKostenstelle(UserForm1.ComboBox1.List(i))

'Die Optionsbutton beschriftenUserForm1.OptionButton1.Caption = _ Sheets("Vorgaben").Cells(2, 3).Value

Listing 5.7: Das Ereignis Initialize einsetzen, um die UserForm vorzubelegen

Page 210: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 209

Im ersten Schritt füllen Sie das Kombinationsfeld ABTEILUNG. Dazu setzen Sie eine Schleifeauf und greifen auf die Tabelle Vorgaben zurück. Dort lesen Sie die einzelnen Zellen derSpalte B über die Methode AddItem in das Kombinationsfeld ein. Gleich danach sorgen Siedafür, dass der erste Eintrag im Kombinationsfeld angezeigt wird. Dazu verwenden Sie dieAnweisung UserForm1.ComboBox1.ListIndex = 0. Achten Sie dabei darauf, dass dererste Eintrag in einem Kombinationsfeld den Index 0 aufweist.

Da die Kostenstelle abhängig ist von der ausgewählten Abteilung, schreiben Sie eine Funk-tion, die die zur Abteilung zugehörige Kostenstelle automatisch aus der Tabelle VORGABEN

holt und in das Textfeld KOSTENSTELLE einfügt.

UserForm1.OptionButton2.Caption = _Sheets("Vorgaben").Cells(3, 3).ValueUserForm1.OptionButton3.Caption = _Sheets("Vorgaben").Cells(4, 3).Value

'Die erste Optionschaltfläche vorbelegenUserForm1.OptionButton1.Value = 1End Sub

Function HoleKostenstelle(Abt As String) As StringDim Kost As String

Application.ScreenUpdating = FalseSheets("Vorgaben").ActivateRange("B2").SelectDo Until ActiveCell.Value = "" Or Abt = ActiveCell.Value ActiveCell.Offset(1, 0).SelectLoopIf Abt <> "" Then Kost = ActiveCell.Offset(0, -1).ValueElse Kost = ""End If HoleKostenstelle = KostSheets("Mitarbeiter").ActivateApplication.ScreenUpdating = TrueEnd Function

Listing 5.8: Diese Funktion holt die zur Abteilung passende Kostenstelle

Listing 5.7: Das Ereignis Initialize einsetzen, um die UserForm vorzubelegen

Page 211: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren210

Die Funktion HoleKostenstelle erwartet als Übergabeargument die Abteilungsbezeich-nung, die Sie direkt aus dem Kombinationsfeld ABTEILUNG übernehmen und an die Funk-tion übergeben können.

In der Funktion selbst wird die Tabelle VORGABEN aktiviert und nach der entsprechendenAbteilung über eine Schleife gesucht. War die Suche erfolgreich, geben Sie die dazu pas-sende Kostenstelle an die aufrufende Prozedur zurück.

Immer wenn Sie einen anderen Eintrag aus dem Kombinationsfeld ABTEILUNG wählen, wirddieses Ereignis automatisch ausgeführt. Dabei speichern Sie über die Eigenschaft ListIn-dex die momentan ausgewählte Position im Kombinationsfeld. Mithilfe dieses Indexes kön-nen Sie in Zusammenarbeit mit der Eigenschaft List die entsprechende Abteilung an dieFunktion HoleKostenstelle übergeben.

Was jetzt noch fehlt, ist die dynamische Beschriftung der drei Optionsschaltflächen, die Sieebenfalls aus der Tabelle VORGABEN holen. Die Beschriftung eines Steuerelements führenSie über die Eigenschaft Caption durch. Dabei verweisen Sie direkt auf die Tabelle VOR-GABEN und setzen die Eigenschaft Cells ein, um die Zelle, welche die Beschriftung für dieOptionsschaltfläche enthält, anzusteuern. Die Eigenschaft Cells hat zwei Argumente: Im

Hinweis:

Zwischendurch können Sie die UserForm testen, indem Sie in der Entwicklungsumge-bung die Taste (F5) drücken.

Hinweis:

Diese Funktion benötigen Sie übrigens noch ein zweites Mal. Nachdem Sie die UserFormaufgerufen haben, stimmt momentan die Zuordung von Abteilung zur Kostenstelle. WennSie aber nun eine andere Abteilung aus dem Kombinationsfeld auswählen, müssen Siedafür sorgen, dass die Funktion HoleKostenstelle wieder angesprungen wird und dieentsprechende Kostenstelle in das Textfeld KOSTENSTELLE überträgt. Um diese Aufgabezu lösen, führen Sie einen Doppelklick auf das Kombinationsfeld ABTEILUNG durch underfassen das Ereignis Change.

Private Sub ComboBox1_Change()Dim i As Integer

i = UserForm1.ComboBox1.ListIndex UserForm1.TextBox4.Value = _ HoleKostenstelle(UserForm1.ComboBox1.List(i))End Sub

Listing 5.9: Änderung des Kombinationsfeldes abfangen

Page 212: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 211

ersten Argument geben Sie die Zeile, im zweiten Argument die Spalte an, in der sich derWert befindet.

Sorgen Sie jetzt noch dafür, dass nach dem Aufrufen der Userform die erste Optionsschalt-fläche standardmäßig vorbelegt ist. Setzen Sie dazu die Eigenschaft Value der erstenOptionsschaltfläche auf den Wert 1.

Schreiben Sie jetzt die eigentliche Prozedur, um die UserForm aufzurufen. Wählen Sie dazuaus dem Menü EINFÜGEN den Befehl MODUL und erfassen folgendes Makro:

Abb. 5.14 Die Informationen wurden dynamisch eingefügt

Sub DiaAnzeigen() UserForm1.ShowEnd Sub

Listing 5.10: Die UserForm aufrufen

Tipp:

Seit Excel 2000 ist es erstmalig möglich, Dialoge auch ungebunden aufzurufen, d. h.,ungebundene Dialoge müssen nicht beendet werden, um mit anderen Arbeiten in Excelfortzufahren. Wenn Sie eine ungebundene UserForm aufrufen möchten, verwenden Siedie Anweisung UserForm1.Show vbModeless.

Page 213: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren212

Abb. 5.15 Textfelder deaktivieren

5.4.4 Die UserForm ausprogrammieren

Im nächsten Schritt müssen Sie noch die Makros erstellen, die dafür sorgen sollen, dass dieEingaben in die Tabelle MITARBEITER zurückgeschrieben werden (= BefehlsschaltflächeOK), bzw. was passieren soll, wenn der Anwender die Schaltfläche ABBRECHEN klickt.

Beginnen Sie nun damit, den Code für den Abbruch zu erfassen. Führen Sie dazu einen Dop-pelklick auf die Schaltfläche ABBRECHEN durch und erfassen folgendes Makro:

Über die Anweisung Unload wird ein Objekt, hier eine UserForm, aus dem Speicherentfernt. Das bewirkt zusätzlich, dass die UserForm dazu geschlossen wird. Legen Sie jetztfolgendes Makro hinter die Schaltfläche OK.

Hinweis:

Wie Sie sehen, ist das Textfeld KOSTENSTELLE grau. Diesen Effekt können Sie übrigenserzielen, wenn Sie in der Entwicklungsumgebung das Textfeld markieren und im Eigen-schaften-Fenster unter der Rubrik Enabled den Wert False einstellen. Damit können indiesem Feld keine Eingaben vorgenommen werden.

Private Sub CommandButton2_Click() Unload UserForm1End Sub

Listing 5.11: Die UserForm schließen

Page 214: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 213

Aktivieren Sie im ersten Schritt die Tabelle MITARBEITER, die die eingegebenen Daten auf-nehmen soll. Danach markieren Sie über die Anweisung Range("A65536").End(xlUp).Offset(1, 0).Select die erste freie Zelle in Spalte A.

Damit Sie nicht bei jedem Befehl die volle Syntax angeben müssen, setzen Sie dieAnweisung With ein und geben den Namen der Userform an. Solange Sie diese Anweisungnicht mit End With beenden, können Sie statt dem Wort UserForm nun einen einfachenPunkt einsetzen.

Momentan steht der Mauszeiger in der ersten freien Zelle der Spalte A. Dort schreiben Siejetzt den Wert der TextBox1, also den Nachnamen des Mitarbeiters, in die Zelle. Danachsetzen Sie die Eigenschaft OffSet ein und versetzen den »Spalten-Offset« jeweils um denWert 1, um die weiteren Informationen aus der Userform in die entsprechenden Zellen derTabelle zu übertragen.

Um den aktuell ausgewählten Eintrag im Kombinationsfeld ABTEILUNG zu ermitteln, reichtes, diesen über die Eigenschaft Value abzugreifen.

Für die Ermittlung des Standorts müssen Sie die einzelnen Optionsschaltflächen abfragen.Wenn eine davon den Wert True meldet, ist diejenige die aktive. In diesem Fall übertragenSie über die Eigenschaft Caption die Beschriftung der Optionsschaltfläche.

Private Sub CommandButton1_Click()'Daten wegschreibenSheets("Mitarbeiter").ActivateRange("A65536").End(xlUp).Offset(1, 0).SelectWith UserForm1 ActiveCell.Value = .TextBox1.Value ActiveCell.Offset(0, 1).Value = .TextBox2.Value ActiveCell.Offset(0, 2).Value = .ComboBox1.Value ActiveCell.Offset(0, 3).Value = .TextBox4.Value If .OptionButton1.Value = True Then _ ActiveCell.Offset(0, 4).Value = .OptionButton1.Caption If .OptionButton2.Value = True Then _ ActiveCell.Offset(0, 4).Value = .OptionButton2.Caption If .OptionButton3.Value = True Then _ ActiveCell.Offset(0, 4).Value = .OptionButton3.Caption

ActiveCell.Offset(0, 6).Value = .TextBox3.Value ActiveCell.Offset(0, 5).Value = .TextBox5.ValueEnd WithEnd Sub

Listing 5.12: Die eingegebenen Daten in die Tabelle Mitarbeiter wegschreiben

Page 215: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren214

Erfassen Sie jetzt einmal ein paar Mitarbeiter.

Abb. 5.16 Die ersten Mitarbeiter werden erfasst

Was bereits nach der Eingabe der ersten paar Mitarbeiter auffällt, ist, dass die Daten in derUserForm nach dem Übertragen in die Tabelle MITARBEITER nicht gelöscht werden. Indiesem Fall fügen Sie der UserForm eine weitere Schaltfläche (Formular löschen) hinzu undlegen folgenden Code hinter diese Schaltfläche.

Private Sub CommandButton3_Click()'Formular zurücksetzenDim tb As Object

With UserForm1 For Each tb In .Controls

Listing 5.13: UserForm initialisieren

Page 216: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 215

Definieren Sie im ersten Schritt eine Variable vom Typ Object. Danach durchlaufen Sie ineiner Schleife alle Steuerelemente, die sich auf der UserForm befinden. Über die FunktionTypeName können Sie den Typ des jeweiligen Steuerelements bestimmen. Wird bei dieserAbfrage der Text TextBox gemeldet, handelt es sich um ein Textfeld. Dieses bereinigen Siedann, indem Sie die Eigenschaft Text mit einem Leerstring füllen.

Abb. 5.17 Die UserForm wurde initialisiert

If TypeName(tb) = "TextBox" Then tb.Text = "" Next tb.ComboBox1.ListIndex = 0.OptionButton1.Value = 1End WithEnd Sub

Hinweis:

Achten Sie bei der Schreibweise darauf, dass Sie »TextBox« und nicht »Textbox«angeben. Die Groß- und Kleinschreibung spielt bei der Funktion TypeName eine großeRolle.

Listing 5.13: UserForm initialisieren

Page 217: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren216

5.4.5 Ein Unterformular anlegen

Bis hierher funktioniert das Tool schon ganz gut. Was jetzt noch fehlt, ist die Erfassung derSkills, also der Fähigkeiten der einzelnen Mitarbeiter. Diese Skills sollen über ein Unterfor-mular von der UserForm1 aufgerufen werden. Das Unterformular selbst holt sich die zurVerfügung stehenden Skills von der Tabelle VORGABEN, die Sie wie folgt erweitern.

Abb. 5.18 Die Skills können beliebig ausgetauscht werden

Fügen Sie jetzt eine neue UserForm ein und bestücken Sie diese mit insgesamt 14 Kon-trollkästchen.

Page 218: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 217

Abb. 5.19 Die Userform für die Skills im Rohentwurf

Wie Sie sehen, sind die einzelnen Kontrollkästchen nicht sauber unter- sowie nebeneinanderangeordnet. Markieren Sie die einzelnen Kolumnen, sodass die Kontrollkästchen markiertsind. Wählen Sie danach aus dem Menü FORMAT den Befehl AUSRICHTEN/LINKS.

Sorgen Sie jetzt dafür, dass die Beschriftung für die Kontrollkästchen aus der Tabelle VOR-GABEN dynamisch erfolgt. Führen Sie dazu einen Doppelklick auf die freie Fläche derUSERFORM2 durch und wählen im Codebereich aus dem rechten, oberen Kombinationsfeldden Eintrag INITIALIZE.

Ergänzen Sie den noch leeren Ereignisrahmen um folgende Zeilen:

Private Sub UserForm_Initialize()With UserForm2 .CheckBox1.Caption = Sheets("Vorgaben").Cells(2, 4).Value .CheckBox2.Caption = Sheets("Vorgaben").Cells(3, 4).Value .CheckBox3.Caption = Sheets("Vorgaben").Cells(4, 4).Value .CheckBox4.Caption = Sheets("Vorgaben").Cells(5, 4).Value .CheckBox5.Caption = Sheets("Vorgaben").Cells(6, 4).Value .CheckBox6.Caption = Sheets("Vorgaben").Cells(7, 4).Value .CheckBox7.Caption = Sheets("Vorgaben").Cells(8, 4).Value .CheckBox8.Caption = Sheets("Vorgaben").Cells(9, 4).Value .CheckBox9.Caption = Sheets("Vorgaben").Cells(10, 4).Value .CheckBox10.Caption = Sheets("Vorgaben").Cells(11, 4).Value

Listing 5.14: Dynamisches Füllen der Beschriftungen von Kontrollkästchen

Page 219: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren218

Verwenden Sie die Eigenschaft Caption, um die Beschriftung der Kontrollkästchen festzu-legen. Den Beschriftungstext holen Sie aus der Tabelle VORGABEN in der Spalte D.

Abb. 5.20 Dynamische Beschriftung der Kontrollkästchen

Die nächste Anpassung ist jetzt wie folgt vorzunehmen. Da die Skills in die USERFORM1übernommen werden sollen, legen Sie dort ein mehrzeiliges Eingabefeld an, welches dieeinzelnen Skills jeweils getrennt durch ein Komma aufnehmen soll. Weisen Sie diesem Tex-tfeld im Eigenschaften-Fenster unter Rubrik MULTILINE den Wert TRUE zu.

Fügen Sie in der USERFORM1 noch eine weitere Schaltfläche ein, um die USERFORM2 aufzu-rufen und legen hinter diese Schaltfläche folgenden Code:

.CheckBox11.Caption = Sheets("Vorgaben").Cells(12, 4).Value .CheckBox12.Caption = Sheets("Vorgaben").Cells(13, 4).Value .CheckBox13.Caption = Sheets("Vorgaben").Cells(14, 4).Value .CheckBox14.Caption = Sheets("Vorgaben").Cells(15, 4).ValueEnd WithEnd Sub

Private Sub CommandButton4_Click() UserForm2.ShowEnd Sub

Listing 5.15: Das Unterformular UserForm2 aufrufen

Listing 5.14: Dynamisches Füllen der Beschriftungen von Kontrollkästchen

Page 220: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 219

Abb. 5.21 Die angepasste Userform1

Wechseln Sie nun auf Ihre USERFORM2 mit den Skills und führen einen Doppelklick auf dieSchaltfläche OK/ÜBERNEHMEN durch. Damit sollen die angekreuzten Skills in derUSERFORM2 in das mehrzellige Textfeld der USERFORM1 übertragen werden.

Private Sub CommandButton1_Click()'Skills in UserForm1 übertragenDim s As String

With UserForm2 If .CheckBox1.Value = True Then _ s = s & .CheckBox1.Caption & ", " If .CheckBox2.Value = True Then _ s = s & .CheckBox2.Caption & ", " If .CheckBox3.Value = True Then _

Listing 5.16: Die gewählten Skills von UserForm2 nach UserForm1 übernehmen

Page 221: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren220

Überprüfen Sie, welche Kontrollkästchen in USERFORM2 angekreuzt sind. Die angegreuztenKontrollkästchen melden bei Verwendung der Eigenschaft Value den Wert True. In diesemFall basteln Sie sich in der String-Variablen s den gesamten Skillumfang zusammen, indemSie nach jedem Skill jeweils ein Komma und ein Leerzeichen einfügen. Am Ende müssenSie das letzte Komma samt Leerzeichen mithilfe der Funktionen Left sowie Len wiederwegnehmen. Übergeben Sie dann den Inhalt der Variablen dem mehrzeiligen Textfeld inUSERFORM1.

s = s & .CheckBox3.Caption & ", " If .CheckBox4.Value = True Then _ s = s & .CheckBox4.Caption & ", " If .CheckBox5.Value = True Then _ s = s & .CheckBox5.Caption & ", " If .CheckBox6.Value = True Then _ s = s & .CheckBox6.Caption & ", " If .CheckBox7.Value = True Then _ s = s & .CheckBox7.Caption & ", " If .CheckBox8.Value = True Then _ s = s & .CheckBox8.Caption & ", " If .CheckBox9.Value = True Then _ s = s & .CheckBox9.Caption & ", " If .CheckBox10.Value = True Then _ s = s & .CheckBox10.Caption & ", " If .CheckBox11.Value = True Then _ s = s & .CheckBox11.Caption & ", " If .CheckBox12.Value = True Then _ s = s & .CheckBox12.Caption & ", " If .CheckBox13.Value = True Then _ s = s & .CheckBox13.Caption & ", " If .CheckBox14.Value = True Then _ s = s & .CheckBox14.Caption & ", "End With

s = Left(s, Len(s) - 2)UserForm1.TextBox6.Value = sUnload UserForm2End Sub

Listing 5.16: Die gewählten Skills von UserForm2 nach UserForm1 übernehmen

Page 222: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 221

Abb. 5.22 Die einzelnen Skills (in dem Fall alle) wurden übertragen

Tipp:

Ist Ihnen das einzelne Ankreuzen der Kontrollkästchen in USERFORM2 zu lästig, könnenSie über eine weitere Prozedur auch erstmal alle Kontrollkästchen ankreuzen und danachdie nicht benötigten Kontrollkästchen wieder deaktivieren. Fügen Sie zu diesem Zweckin der USERFORM2 ein Umschaltfeld ein. Dabei sollen beim ersten Klick auf dieses Feldalle Kontrollkästchen aktiviert weden. Bei erneutem Klick sollen alle Kontrollkästchenwieder deaktiviert werden. Hinterlegen Sie nun folgenden Code:

Private Sub ToggleButton1_Click()Dim CB As Object

If ToggleButton1.Value = True ThenWith UserForm2 For Each CB In .Controls If TypeName(CB) = "CheckBox" Then CB.Value = 1 Next CB

Listing 5.17: Ein Umschaltfeld programmieren

Page 223: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren222

Prüfen Sie im ersten Schritt den Zustand des Umschaltfelds. In Abhängigkeit davonaktivieren bzw. deaktivieren Sie dann alle Kontrollkästchen, die Sie mithilfe der FunktionTypeName identifizieren können. Ändern Sie ebenfals variabel die Beschriftung desUmschaltfelds, indem Sie der Eigenschaft Caption jeweils einen anderen Text zuweisen.

Abb. 5.23 Eine Umschaltfläche programmieren

Die letzte Anpassung, die Sie jetzt noch durchführen müssen, ist das Zurückschreiben derSkills in die Tabelle MITARBEITER. Dazu ergänzen Sie den bereits erfassten Code, der hinterder Schaltfläche OK der USERFORM1 liegt, um eine einzige Zeile am Ende des Makros:

.ToggleButton1.Caption = "Alles deaktivieren"End WithElseWith UserForm2 For Each CB In .Controls If TypeName(CB) = "CheckBox" Then CB.Value = 0 Next CB .ToggleButton1.Caption = "Alles aktivieren"End WithEnd IfEnd Sub

ActiveCell.Offset(0, 7).Value = .TextBox6.Value

Listing 5.17: Ein Umschaltfeld programmieren

Page 224: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 223

5.4.6 Mitarbeiter & Skills suchen

Im nächsten Schritt entwerfen Sie eine UserForm, mit deren Hilfe Sie nach Mitarbeitern undSkills suchen können. Diese UserForm sieht dabei wie folgt aus.

Abb. 5.24 Der Rohentwurf für den Suchen-Dialog

In diesem Beispiel setzen Sie ein mehrspaltiges Listenfeld ein. Geben Sie dabei an, wie vieleSpalten es dabei bekommen soll und wie breit diese im Einzelnen sein sollen. Setzen Siedazu wiederum das Ereignis Initialize ein, um diese Festlegungen zu treffen. Führen Siealso einen Doppelklick auf eine freie Fläche der USERFORM3 durch und erfassen folgendesEreignis:

Private Sub UserForm_Initialize()With UserForm3 .ListBox1.ColumnCount = 5 .ListBox1.ColumnWidths = "60;50;70;40;40"End WithEnd Sub

Listing 5.18: Spaltenzahl und Spaltenbreite eines Listenfelds bestimmen

Page 225: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren224

Legen Sie die Anzahl der Spalten des Listenfelds über die Eigenschaft ColumnCount fest.Die Breite der einzelnen Spalten bestimmen Sie über die Eigenschaft Columnwidths,wobei die Breite dieser Spalten jeweils durch die Maßeinheit Pixel festgelegt wird.

Im nächsten Schritt programmieren Sie die Suche nach Mitarbeitern. Dabei soll der Namebzw. ein Teil des Namens in das erste Textfeld der UserForm eingegeben werden. Mit einemKlick auf die rechts daneben stehende Schaltfläche SUCHEN wird der Suchvorgang gestartet.Alle gefundenen Mitarbeiter sollen danach im Listenfeld angezeigt werden. Führen Sie jetzteinen Doppelklick auf die Schaltfläche SUCHEN durch und erfassen folgendes Makro:

Löschen Sie zu Beginn des Makros das Listenfeld mithilfe der Methode Clear. Das ist sehrwichtig, gerade wenn Sie mehrere Suchvorgänge nacheinander ausführen möchten, da sonstdie Ergebnisse der vorherigen Suche noch immer im Listenfeld bleiben.

Im nächsten Schritt speichern Sie den Inhalt des Textfelds, in welches Sie den gesuchtenNamen eingegeben haben, in einer String-Variablen s. Aktivieren Sie danach die TabelleMITARBEITER und setzen den Mauszeiger auf die Startzelle A2. Durchlaufen Sie im

Private Sub CommandButton1_Click()'Suchen nach NamenDim s As StringDim i As Integer

With UserForm3.ListBox1.Clears = .TextBox1.ValueSheets("Mitarbeiter").ActivateRange("A2").Selecti = 0Do Until ActiveCell.Value = "" If InStr(ActiveCell.Value, s) > 0 Then .ListBox1.AddItem ActiveCell.Value .ListBox1.Column(1, i) = ActiveCell.Offset(0, 1).Value .ListBox1.Column(2, i) = ActiveCell.Offset(0, 2).Value .ListBox1.Column(3, i) = ActiveCell.Offset(0, 3).Value .ListBox1.Column(4, i) = ActiveCell.Offset(0, 4).Value i = i + 1 Else End If ActiveCell.Offset(1, 0).SelectLoopEnd WithEnd Sub

Listing 5.19: Die Suche nach dem Mitarbeiternamen

Page 226: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 225

Anschluss eine Schleife, die alle Einträge in der Tabelle MITARBEITER abarbeitet. Innerhalbder Schleife prüfen Sie, ob der eingegebene Suchbegriff in Teilen in der Tabelle vorkommt.Dazu verwenden Sie die Funktion Instr, die einen Wert größer Null zurückliefert, wenneine Übereinstimmung gefunden werden kann. In diesem Fall setzen Sie die MethodeAddItem ein, um den Namen des Mitarbeiters in die erste Spalte des Listenfelds zu über-tragen. Füllen Sie jetzt die restlichen Spalten, indem Sie der Eigenschaft Column jeweils diePosition im Listenfeld (spaltenbezogen) sowie die Zeile (Variable i) bekannt geben. Verges-sen Sie nicht, die Variable i jeweils um den Wert 1 zu erhöhen, damit Sie nicht die geradeeingefügte Zeile im Listenfeld mit dem nächsten gefundenen Satz überschreiben.

Abb. 5.25 Das Füllen eines mehrspaltigen Listenfelds

Im nächsten Schritt bauen Sie ein kleines Feature ein. Wenn Sie einen Eintrag im Listenfeldmarkieren, sollen die einzelnen Informationen aus den Spalten in die Textfelder direkt unter-halb des Textfelds übertragen werden. Dazu setzen Sie das Ereignis Change des Listenfeldsein, das immer dann automatisch ausgeführt wird, wenn Sie einen anderen Eintrag imListenfeld markieren. Um dieses Ereignis für das Listenfeld einzustellen, führen Sie einenDoppelklick auf das Listenfeld durch und wählen in der Entwicklungsumgebung aus demDropdown am rechten, oberen Rand den Befehl Change. Erfassen Sie dann folgendes Ereig-nis:

Page 227: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren226

Übertragen Sie die Inhalte der einzelnen Spalten des Listenfelds, indem Sie die EigenschaftColumn einsetzen und dabei die Nummer der Spalte angeben, in der die Information steht.Achten Sie dabei darauf, dass die erste Spalte den Index 0 hat.

Abb. 5.26 Die Spalteninformationen des Listenfelds wurden in die Textfelder übertragen

Private Sub ListBox1_Change()On Error GoTo fehler With UserForm3 .TextBox3.Value = .ListBox1.Column(0) .TextBox4.Value = .ListBox1.Column(1) .TextBox5.Value = .ListBox1.Column(2) .TextBox6.Value = .ListBox1.Column(3) End With Exit Subfehler:End Sub

Listing 5.20: Übertragen von Spalteninformationen in Textfelder

Page 228: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 227

Als nächste Aufgabe programmieren Sie die Suche nach den einzelnen Skills. Dabei sollenalle Mitarbeiter im Listenfeld angezeigt werden, die über ein bestimmtes Skill verfügen,welches Sie im zweiten Textfeld eingeben. Führen Sie einen Doppelklick auf die zweiteSchaltfläche Suchen durch und erfassen das folgende Makro:

Löschen Sie zu Beginn des Makros das Listenfeld mithilfe der Methode Clear. Das ist sehrwichtig, gerade wenn Sie mehrere Suchvorgänge nacheinander ausführen möchten, da sonstdie Ergebnisse der vorherigen Suche noch immer im Listenfeld bleiben.

Hinweis:

In diesem Beispiel wurden nicht alle Informationen aus der Tabelle Mitarbeiter in dasListenfeld bzw. die Textfelder der Userform3 übertragen. Die noch fehlenden Informa-tionen können Sie zur Übung selbst einfügen, indem Sie die Anzahl der Spalten des Lis-tenfelds anpassen und die noch fehlenden Textfelder unterhalb des Listenfelds einfügenund über die Eigenschaft Columns befüllen.

Private Sub CommandButton2_Click()'Suchen nach SkillsDim s As StringDim i As Integer

With UserForm3.ListBox1.Clears = .TextBox2.ValueSheets("Mitarbeiter").ActivateRange("H2").Selecti = 0Do Until ActiveCell.Value = "" If InStr(ActiveCell.Value, s) > 0 Then .ListBox1.AddItem ActiveCell.Offset(0, -7).Value .ListBox1.Column(1, i) = ActiveCell.Offset(0, -6).Value .ListBox1.Column(2, i) = ActiveCell.Offset(0, -5).Value .ListBox1.Column(3, i) = ActiveCell.Offset(0, -4).Value .ListBox1.Column(4, i) = ActiveCell.Offset(0, -3).Value i = i + 1 Else End If ActiveCell.Offset(1, 0).SelectLoopEnd WithEnd Sub

Listing 5.21: Die Suche nach dem Skill der Mitarbeiter

Page 229: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren228

Im nächsten Schritt speichern Sie den Inhalt des Textfelds, in welches Sie das gesuchte Skilleingegeben haben, in einer String-Variablen s. Aktivieren Sie danach die Tabelle Mitar-beiter und markieren die Startzelle H2. Durchlaufen Sie im Anschluss eine Schleife, diealle Einträge in der Tabelle Mitarbeiter abarbeitet. Innerhalb der Schleife prüfen Sie, obder eingegebene Suchbegriff in Teilen in der Tabelle vorkommt. Dazu verwenden Sie dieFunktion Instr, die einen Wert größer Null zurückliefert, wenn eine Übereinstimmunggefunden werden kann. In diesem Fall setzen Sie die Methode AddItem ein, um den Namendes Mitarbeiters in die erste Spalte des Listenfelds zu übertragen. Füllen Sie jetzt die restli-chen Spalten, indem Sie der Eigenschaft Column jeweils die Position im Listenfeld (spalten-bezogen) sowie die Zeile (Variable i) bekannt geben. Vergessen Sie nicht, die Variable ijeweils um den Wert 1 zu erhöhen, damit Sie nicht die gerade eingefügte Zeile im Listenfeldmit dem nächsten gefundenen Satz überschreiben.

Abb. 5.27 Die Mitarbeiter mit dem gesuchten Skill »Excel« werden aufgelistet

5.4.7 Steuerelemente farbig gestalten

Mithilfe der Funktion RGB können Sie einzelne Steuerelemente auch farbig ausgeben. Imfolgenden Beispiel fügen Sie eine leere UserForm ein und integrieren zunächst 8 Bezeich-nungsfelder.

Page 230: VBA-Programmierung fur Word, Excel und Access

Rechts5.4 UserForms programmieren 229

Abb. 5.28 Die Farben sollen ausgegeben werden

Führen Sie nun einen Doppelklick auf die Schaltfläche Farben anzeigen durch und fügenfolgendes Makro ein:

Private Sub CommandButton1_Click()With UserForm4 .Label1.BackColor = RGB(0, 0, 0) .Label1.Caption = "Schwarz" .Label1.ForeColor = RGB(255, 255, 255) .Label2.BackColor = RGB(0, 0, 255) .Label2.Caption = "Blau" .Label3.BackColor = RGB(0, 255, 0) .Label3.Caption = "Grün" .Label4.BackColor = RGB(0, 255, 255) .Label4.Caption = "Cyan" .Label5.BackColor = RGB(255, 0, 0) .Label5.Caption = "Rot" .Label6.BackColor = RGB(255, 0, 255) .Label6.Caption = "Magenta"

Listing 5.22: Farben für Steuerelemente einsetzen

Page 231: VBA-Programmierung fur Word, Excel und Access

Links

5 Meldungen, Eingabemasken, Dialoge und UserForms programmieren230

Über die Funktion RGB können Sie Ihren Steuerelementen eine Farbe zuweisen. Dazuwenden Sie diese Funktion auf die Eigenschaft BackColor an. Mithilfe der EigenschaftCaption schreiben Sie den Farbennamen direkt auf das Bezeichnungsfeld. Ändern Sie imersten Fall die Farbe der Schrift, indem Sie die Eigenschaft ForeColor mit dem Farbwertfür die Farbe Weiß füllen, da sonst die Schriftfarbe mit der Hintergrundfarbe gleich wäre.

Abb. 5.29 Alle verfügbaren Grundfarben werden angezeigt

.Label7.BackColor = RGB(255, 255, 0) .Label7.Caption = "Gelb" .Label8.BackColor = RGB(255, 255, 255) .Label8.Caption = "Weiß"End WithEnd Sub

Listing 5.22: Farben für Steuerelemente einsetzen

Page 232: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang231

6 Menü- und Symbolleisten programmieren

Die Programmierung von Menü- und Symbolleisten stellt ein weiteres Kapitel der Oberflä-chenbehandlung dar. Sie haben die Möglichkeit, per VBA Menüs anzupassen, bei Bedarf ein-und auszublenden sowie einzelne Menübefehle zu deaktivieren und vieles mehr.

6.1 Allgemeine Anmerkungen zu Leisten

Alle Leisten werden in Office durch das Objekt CommandBars beschrieben. Die einzelnenLeisten können Sie über die Eigenschaft Type unterscheiden; so liefert eine Symbolleiste denWert 0, eine Menüleiste den Index 1 und ein Kontextmenü den Index 2. Weiterhin könnenLeisten ganz gezielt über einen eindeutigen ID-Wert angesprochen werden.

Das folgende Makro schreibt Ihnen alle Leisten von Word mit deren eindeutigem ID-Wert,Namen und Typ in den Direktbereich.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap06 unter demNamen Leisten.doc finden.

Sub LeistenIdentifizieren()Dim i As IntegerDim s As String

For i = 1 To CommandBars.Count Select Case CommandBars(i).Type Case 0 s = "Symbolleiste" Case 1 s = "Menüleiste" Case 2 s = "Kontextmenü"

Listing 6.1: Alle verfügbaren Leisten von Word ermitteln

Page 233: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren232

Zählen Sie im ersten Schritt alle vorhandenen Leisten von Word, indem Sie diese mithilfe derEigenschaft Countermitteln. Über die Eigenschaft Type geben Sie die Art der Befehls-leiste zurück. Mit der Eigenschaft Name ermitteln Sie den Namen der Befehlsleiste. Den ein-deutigen Index haben Sie bereits über das Hochzählen der Variablen i herausgefunden. Überdie Anweisung Debug.Print geben Sie alle Informationen über die vorhandenen Befehls-leisten im Direktbereich von Word aus.

Abb. 6.1 Alle Leistentypen in den Direktbereich von Word schreiben

Entnehmen Sie die möglichen Konstanten bzw. Werte der folgenden Tabelle.

End Select Debug.Print i & " --> " & _ CommandBars(i).Name & " --> " & s Next iEnd Sub

Wert Konstante Befehlsleiste

0 msoBarTypeNormal Symbolleiste

1 msoBarTypeMenuBar Menüleiste

2 msoBarTypePopup Kontextmenü

Listing 6.1: Alle verfügbaren Leisten von Word ermitteln

Page 234: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 233

6.2 Menüleisten programmieren

Bei der Programmierung von Menüs gehen Sie von der Menüleiste aus, die standardmäßig inWord bereits eingeblendet ist. Anhand dieser Menüleiste können Sie bestehende Menüs ver-ändern, neue Menüpunkte hinzufügen und einzelne Befehle bei Bedarf ein- und ausblenden.Sie haben dabei über den Einsatz von VBA den vollen Zugriff auf die Menüleiste.

Seit dem Office-2000-Paket gibt es bezüglich der Menüleisten eine Änderung. Dort werdendie Menübefehle beim Anklicken eines Menüs nicht immer sofort angezeigt. Bei diesemneuen Feature handelt es sich um ein sich ständig selbst anpassendes System, nach demMenüleisten angeordnet werden. Die am häufigsten verwendeten Funktionen werden in denMenüs ganz oben angeordnet. Die weniger häufig angewendeten Office-Funktionen rutschenimmer weiter in den Menüs nach unten und werden erst nach längerem Verweilen mit derMaus im Menü dynamisch dazu eingeblendet. Dieses Feature können Sie aber auch abschal-ten. Das Ausschalten der adaptiven Menüs können Sie vornehmen, indem Sie mit der rechtenMaustaste auf eine beliebige Symbolleiste klicken und aus dem Kontextmenü den BefehlANPASSEN auswählen. Wechseln Sie danach auf die Registerkarte OPTIONEN und aktivierenSie das Kontrollkästchen MENÜS IMMER VOLLSTÄNDIG ANZEIGEN.

Abb. 6.2 Adaptive Menüs ausschalten

Per VBA-Makro können Sie dieses Feature wie folgt abschalten.

Sub MenüAdaptivAus() Application.CommandBars.AdaptiveMenus = FalseEnd Sub

Listing 6.2: Adaptive Menüs abschalten

Page 235: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren234

Setzen Sie die Eigenschaft AdaptiveMenus auf den Wert False, um die personalisiertenMenüs abzuschalten. Dadurch werden die Menüs wie gewohnt in Ihrer Office-Anwendungangezeigt.

6.2.1 Menüleiste ausblenden

Möchten Sie die Menüleiste von Word ausblenden, starten Sie das folgende Makro.

Setzen Sie die Eigenschaft Enabled der Menüleiste auf den Wert False, um diese auszu-blenden. Um die Menüleiste wieder einzublenden, setzen Sie die Eigenschaft Enabled wie-der auf den Wert True.

6.2.2 Ein neues Menü anlegen

Legen Sie nun ein neues Menü an, welches vor das eigentliche Hilfe-Menü (?) eingefügt wer-den soll. Dazu setzen Sie folgendes Makro ein.

Sub MenüleisteAusblenden() Application.CommandBars("Menu Bar").Enabled = FalseEnd Sub

Listing 6.3: Menüleiste in Word ausblenden

Sub MenüleisteEinblenden() Application.CommandBars("Menu Bar").Enabled = TrueEnd Sub

Listing 6.4: Menüleiste in Word wieder einblenden

Sub NeuesMenüEinfügen()Dim i As IntegerDim i_Help As IntegerDim NeuMenü As CommandBarControl

i = Application.CommandBars("Menu Bar").Controls.Count i_Help = Application.CommandBars("Menu Bar").Controls(i).Index Set NeuMenü = Application.CommandBars("Menu Bar"). _ Controls.Add(Type:=msoControlPopup, _ Before:=i_Help, Temporary:=True) NeuMenü.Caption = "&Zusatzmenü"End Sub

Listing 6.5: Neues Menü einfügen

Page 236: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 235

Definieren Sie im ersten Schritt zwei Integer-Variablen, die zum einen die Anzahl der Menüsermitteln, die momentan in der Menüleiste eingebunden sind, und zum anderen die Positiondes Hilfemenüs ermitteln. Eine weitere Objektvariable vom Typ CommandBarControl wirdgebraucht, um den neuen Menüpunkt einzufügen. Über die Methode Count zählen Sie dieAnzahl der Menüs in der Menüleiste und speichern sie in der Variablen i. Die Menüleistekönnen Sie über Application.CommandBars("Menu Bar") ansprechen. Über die Eigen-schaft Controls bekommen Sie alle Schaltflächen der angegebenen Menüleiste. Im näch-sten Schritt ermitteln Sie die Position des Hilfe-Menüs, welches standardmäßig ganz rechtsin der Menüleiste steht.

Mithilfe der Methode Add fügen Sie ein neues Menü ein. Die Methode Add hat dabei fol-gende Syntax:

Im Argument Type geben Sie an, um welche Art Steuerelement es sich dabei handeln soll.Zur Auswahl stehen die Konstanten aus der nächsten Tabelle.

Beim Argument ID können Sie entscheiden, ob Sie zusätzlich zum Menütext auch noch einSymbol anzeigen möchten. Dieses Argument funktioniert jedoch nur für einen Menübefehlinnerhalb eines Menüs. Mit dem Argument Before legen Sie die genaue Position des neuenMenüs fest. Übergeben Sie dem Argument die vorher ermittelte Position des Hilfe-Menüs.Setzen Sie das letzte Argument Temporary auf den Wert True, wenn das neue Steuerele-ment temporär sein soll. Temporäre Steuerelemente werden automatisch gelöscht, wenn dieAnwendung geschlossen wird.

Abb. 6.3 Das neue Menü (noch leer)

Add(Type, Id, Before, Temporary)

Konstante Beschreibung

msoControlButton fügt ein Schaltflächenelement ein

msoControlEdit fügt ein Eingabefeld ein

msoControlDropdown fügt ein Dropdown-Feld ein

msoControlComboBox fügt ebenso ein Dropdown-Feld ein

msoControlPopup fügt ein Dropdown-Menü ein

Page 237: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren236

Noch ist das neue Zusatzmenü leer. Dieses Menü werden Sie später füllen.

6.2.3 Menüs löschen

Für das Löschen der gerade erstellen Menüs setzen Sie die Mehtode Delete ein.

6.2.4 Menübefehle einfügen

Im soeben erstellten Menü ZUSATZMENÜ sind bis jetzt noch keine weiteren Menübefehle ein-gefügt worden. Fügen Sie jetzt die Menübefehle ein. Dabei sollen folgende Menübefehleintegriert werden:

• Anzeige des aktuellen Datums

• Ermittlung der Gesamtanzahl der Zeichen im aktiven Dokument

• Ermittlung der Gesamtanzahl der Worte im aktiven Dokument

• Ermittlung der Gesamtanzahl der Sätze im aktiven Dokument

Setzen Sie diese Informationen nun ins Menü ZUSATZMENÜ, indem Sie den folgenden Codeeinsetzen:

Sub MenüLöschen()On Error Resume Next With Application.CommandBars("Menu Bar") .Controls("&Zusatzmenü").Delete End WithEnd Sub

Listing 6.6: Ein bestimmtes Menü löschen

Sub NeuesMenüEinfügen()Dim i As IntegerDim i_Help As IntegerDim NeuMenü As CommandBarControlDim MB As CommandBarControl

i = Application.CommandBars("Menu Bar").Controls.Count i_Help = Application.CommandBars("Menu Bar").Controls(i).Index Set NeuMenü = Application.CommandBars("Menu Bar"). _ Controls.Add(Type:=msoControlPopup, _ Before:=i_Help, Temporary:=True) NeuMenü.Caption = "&Zusatzmenü"

Listing 6.7: Menü mit Menübefehlen bestücken

Page 238: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 237

Für die Menübefehle im Menü ZUSATZMENÜ benötigen Sie eine weitere Objektvariable vomTyp CommandBarControl. Wenden Sie die Methode Add auf das neu eingefügte Menü an,um nun die einzelnen Menübefehle hinzuzufügen. Mit der Anweisung With legen Sie über-sichtlich weitere Eigenschaften der neuen Menübefehle fest.

Mithilfe der Eigenschaft Caption legen Sie die Beschriftung der Menübefehle fest. Verwen-den Sie das kaufmännische Zeichen &, um den Shortcut für diesen Befehl festzulegen. Ist dasMenü einmal aktiviert, können Sie durch die Eingabe des unterstrichenen Buchstabens desMenübefehls die dahinter liegende Funktion bzw. das Makro starten.

Set MB = NeuMenü.Controls.Add _ (Type:=msoControlButton) With MB .Caption = "&Aktuelles Datum" .Style = msoButtonIconAndCaption .OnAction = "Datumsangabe" .FaceId = 126 End With Set MB = NeuMenü.Controls.Add _ (Type:=msoControlButton) With MB .Caption = "Zeichen im Dokument" .Style = msoButtonCaption .OnAction = "ZeichenZählen" .BeginGroup = True End With Set MB = NeuMenü.Controls.Add _ (Type:=msoControlButton) With MB .Caption = "Worte im Dokument" .Style = msoButtonCaption .OnAction = "WorteZählen" End With Set MB = NeuMenü.Controls.Add _ (Type:=msoControlButton) With MB .Caption = "Sätze im Dokument" .Style = msoButtonCaption .OnAction = "SätzeZählen" End WithEnd Sub

Listing 6.7: Menü mit Menübefehlen bestücken

Page 239: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren238

Über die Eigenschaft FaceId können Sie dem Menübefehl auch noch ein Symbol hinzufü-gen. Allerdings muss dabei dann die Eigenschaft Styles mit der Konstante msoButtonI-conAndCaption angegeben werden. Jedes Symbol kann über einen eindeutigen Index ange-sprochen werden. Welcher Index hinter welchem Symbol steckt, erfahren Sie weiter unten imKapitel.

Sie können die einzelnen Menübefehle optisch zusammenfassen, indem Sie eine Trennliniezwischen einzelnen Menübefehlen ziehen. Diesen Effekt erreichen Sie über die EigenschaftBeginGroup. Setzen Sie diese Eigenschaft auf den Wert True, wenn sich der angegebeneMenübefehl am Anfang einer Gruppe von Menübefehlen im Menü befindet.

Mithilfe der Eigenschaft OnAction geben Sie an, welches Makro hinter dem Menübefehlliegt. Dabei gibt diese Eigenschaft den Namen des Visual Basic-Makros zurück, das ausge-führt wird, wenn der Anwender den entsprechenden Menübefehl auswählt.

Abb. 6.4 Im Zusatzmenü sind einige Befehle untergebracht worden

Sehen Sie in den nächsten Listings, welche Funktionen den einzelnen Menübefehlen zuge-ordnet wurden.

Mithilfe der Funktion Date ermitteln Sie das aktuelle Systemdatum. Dabei orientiert sichVBA am Datum, welches Sie in der Systemsteuerung von Windows eingestellt haben.

Sub Datumsangabe()MsgBox "Heute ist der " & DateEnd Sub

Listing 6.8: Das aktuelle Datum ausgeben

Sub Zeichenzählen() MsgBox "Im aktuellen Dokument sind: " & _ ActiveDocument.Characters.Count & " Zeichen"End Sub

Listing 6.9: Die Zeichen im Dokument werden gezählt

Page 240: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 239

Mithilfe der Eigenschaft Characters können Sie die Zeichen feststellen, die im Dokumentbzw. auch in einer Auswahl enthalten sind. Über die Funktion Count werden diese Zeichengezählt. Gehen Sie jetzt einen Schritt weiter und zählen die Anzahl der Wörter, die im aktu-ellen Dokument verwendet werden.

Über die Eigenschaft Words können Sie die Anzahl der in einer Markierung, eines Bereichsoder im gesamten Dokument verwendeten Wörter ermitteln, indem Sie die Funktion Counteinsetzen.

Im nächsten Listing werden die Sätze gezählt, die im aktuellen Dokument eingesetzt werden.

Die Eigenschaft Sentences ermittelt im Zusammenspiel mit der Funktion Count die ineiner Markierung, eines Bereichs oder im gesamten Dokument verwendete Anzahl von Sät-zen.

6.2.5 Erstellung beim Öffnen des Dokuments

Die Erstellung der Menüleiste können Sie automatisieren, indem Sie die Menüleiste automa-tisch beim Öffnen des Dokuments erstellen. Dazu setzen Sie das Ereignis DOCUMENT_OPEN

ein und rufen das Makro NEUESMENÜEINFÜGEN auf. Sobald das Dokument geschlossenwird, können Sie die Menüleiste wieder entfernen. Dazu setzen Sie das EreignisDOCUMENT_CLOSE ein und rufen innerhalb der Ereignisprozedur das Makro MENÜLÖSCHEN

auf. Stellen Sie die beiden Ereignisse ein, indem Sie in den Entwicklungsbereich wechselnund im Projekt-Explorer den Eintrag THISDOCUMENT doppelt anklicken.

Sub WörterZählen() MsgBox "Im aktuellen Dokument sind: " & _ ActiveDocument.Words.Count & " Wörter"End Sub

Listing 6.10: Die Wörter im Dokument werden gezählt

Sub SätzeZählen() MsgBox "Im aktuellen Dokument sind: " & _ ActiveDocument.Sentences.Count & " Sätze"End Sub

Listing 6.11: Die Sätze im Dokument werden gezählt

Page 241: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren240

Abb. 6.5 Menü automatisch beim Öffnen des Dokuments erstellen

6.2.6 Menünamen feststellen

Möchten Sie einen einzigen Menübefehl in ein bestehendes Menü integrieren, müssen Siezuerst einmal ermitteln, wie Sie das gewünschte Menü ansprechen können. Das folgendeMakro listet Ihnen die Namen der einzelnen Menüs der Menüleiste von Word im Direktbe-reich auf.

Hinweis:

Diese so genannten Automakros gibt es übrigens auch in Excel. Um diese Auto-Makrosdort einzustellen, führen Sie in der Entwicklungsumgebung von Excel einen Doppelklickauf den Eintrag DIESEARBEITSMAPPE durch. Stellen Sie dann die beiden EreignisseWORKBOOK_OPEN und WORKBOOK_BEFORECLOSE ein.

Sub MenüNamenErmitteln()Dim Ctrl As CommandBarControlDim i As Integer

For Each Ctrl In Application.CommandBars("Menu Bar").Controls i = i + 1 Debug.Print "Menü " & i & " ---> " & Ctrl.CaptionNext CtrlEnd Sub

Listing 6.12: Die Namen der einzelnen Menüs werden ermittelt

Page 242: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 241

Definieren Sie zuerst eine Objektvariable vom Typ CommandBarControl, um die einzelnenMenüs danach über eine For Each-Schleife auszulesen. Über die Eigenschaft Controlsermitteln Sie alle Menüs der Menüleiste von Word. Die Eigenschaft Caption liefert Ihnendie Beschriftung der einzelnen Menüs, die Sie im Direktbereich über die AnweisungDebug.Print ausgeben.

Abb. 6.6 Die Menünamen im Direktbereich

6.2.7 Menübefehl in bestehendes Menü integrieren

Versuchen Sie jetzt einmal, den Menübefehl INFO im Menü Extras an die letzte Stelle desMenüs einzufügen. Der Quellcode für diese Aufgabenstellung lautet:

Sub MenüBefehlHinzufügen()Dim MB As CommandBarControl

With Application.CommandBars("Menu Bar").Controls(6) Set MB = .Controls.Add _ (Type:=msoControlButton) With MB .Caption = "INFO" .Style = msoButtonCaption .OnAction = "INFO" .BeginGroup = True End With End WithEnd Sub

Listing 6.13: Menübefehl in bereits bestehendes Menü integrieren

Page 243: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren242

Geben Sie zuerst an, in welches Menü der Menübefehl eingefügt werden soll. Danachwenden Sie die Methode Add an und spezifizieren die weiteren Informatioen wie bereitsbesprochen.

Abb. 6.7 Der neue Menübefehl wurde integriert

6.2.8 Menübefehl löschen

Möchten Sie den gerade eingefügten Menübefehl wieder löschen, dann erfassen Sie folgen-den Code:

Sub MenüBefehlLöschen()Dim MB As CommandBarControlDim obj As Object

With Application.CommandBars("Menu Bar").Controls(6) For Each obj In .Controls If obj.Caption = "INFO" Then obj.Delete Next obj End WithEnd Sub

Listing 6.14: Menübefehl suchen und löschen

Page 244: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 243

Geben Sie zunächst genau an, in welchem Menü der Befehl gesucht werden soll. Danachdurchlaufen Sie in einer Schleife alle Menübefehle des angegebenen Menüs und ermitteln diejeweilige Beschriftung. Entspricht die Beschriftung des Menübefehls dem Vergleichstext,wenden Sie die Methode Delete an, um den Menübefehl zu löschen.

6.2.9 Menü-IDs ermitteln

Über eine ID können Sie einen Menübefehl eindeutig identifizieren. Das folgende Makroschreibt Ihnen die ID für alle Menüs der Menüleiste von Word in den Direktbereich.

Um alle Menüs der Menüleiste zu ermitteln, setzen Sie die CommandBars-Eigenschaft mitdem Text »Menu Bar« fest. Danach zählen Sie die Anzahl der Menüs, die in der Arbeitsblatt-Menüleiste vorhanden sind, und wenden dazu die Methode Count an. Setzen Sie nun eineFor Next-Schleife auf, um die Menüs von links nach rechts in der Menüleiste zu durchlau-fen, und geben über die Anweisung Debug.Print sowohl die ID (Eigenschaft ID) als auchdie Beschriftung (Eigenschaft Caption) im Direktbereich aus.

Hinweis:

Sie haben jederzeit die Möglichkeit, Ihre Menüleiste auf den Stand direkt nach der Instal-lation zu bringen. Sie können also Ihre Menüleiste auf den Ursprungszustand zurückset-zen. Dieses gelingt Ihnen mit folgendem Makro.

Sub MenüReset() Application.CommandBars("Menu Bar").ResetEnd Sub

Listing 6.15: Menüleiste auf den Ausgangszustand zurücksetzen

Sub IDsErmitteln()Dim MenüLeiste As CommandBarDim i As Integer

Set MenüLeiste = CommandBars("Menu Bar") For i = 1 To MenüLeiste.Controls.Count Debug.Print MenüLeiste.Controls(i).ID & _ " ---> " & MenüLeiste.Controls(i).Caption NextEnd Sub

Listing 6.16: Menü-IDs ausgeben

Page 245: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren244

Abb. 6.8 Die Menü-IDs ausgeben

6.2.10 Menübefehl-ID ermitteln

Sowohl die Menüs wie auch einzelne Menübefehle haben eindeutige IDs, über die Sie dieseansprechen können. Im nächsten Beispiel schreiben Sie alle IDs der Befehle aus dem MenüDATEI in den Direktbereich von Word.

Definieren Sie im ersten Schritt, dass Sie die Menüleiste von Word ansprechen möchten.Danach referenzieren Sie auf das Menü DATEI und durchlaufen in einer Schleife jeden Men-übefehl darin. Über die Eigenschaft ID ermitteln Sie die eindeutige ID des Menübefehls, mitder Eigenschaft Caption geben Sie die Beschriftung des Menübefehls im Direktbereich aus.

Sub IDsMenüBefehleErmitteln()Dim MenüLeiste As CommandBarDim ctrl As CommandBarControlDim i As Integer

Set MenüLeiste = CommandBars("Menu Bar")i = 1For Each ctrl In MenüLeiste.Controls("Datei").Controls Debug.Print ctrl.ID & " ---> " & ctrl.Caption i = i + 1Next ctrlEnd Sub

Listing 6.17: Menübefehl-IDs ausgeben

Page 246: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 245

Abb. 6.9 Alle Menüleistenbefehle wurden identifiziert

6.2.11 Menübefehle deaktivieren

Aufsetzend auf der letzten Aufgabe, in der Sie die IDs der Befehle aus dem Menü DATEI

ermittelt haben, besteht Ihre Aufgabe nun darin, den Befehl SUCHEN zu deaktivieren.

Sub SuchenDeaktivieren()Dim Menü As CommandBarPopupDim ctrl As CommandBarControl

Set Menü = Application.CommandBars.FindControl _ (Type:=msoControlPopup, ID:=30002) For Each ctrl In Menü.Controls Debug.Print ctrl.Caption If ctrl.Caption = "Suc&hen..." Then _ ctrl.Enabled = False: Exit Sub Next ctrl Set Menü = NothingEnd Sub

Listing 6.18: Menübefehl deaktivieren

Page 247: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren246

Setzen Sie nun die Methode FindControl ein, um das Menü DATEI zu finden. Vorher habenSie im Direktbereich erkennen können, dass dieses Menü den ID-Wert 3002 hat. Setzen Siediesen Wert als Argument in der Methode FindControl ein.

Nachdem Sie das richtige Menü gefunden haben, ermitteln Sie in einer Schleife, die jedenMenübefehl des Menüs durchläuft, ob die Beschriftung stimmt. Wenn ja, dann setzen Sie dieEnabled-Eigenschaft auf den Wert False, um den Menübefehl zu deaktivieren, und been-den danach mit der Anweisung Exit Sub das Makro. Über die Anweisung Set Menü =Nothing wird der für diese Objektvariable reservierte Speicher wieder freigegeben.

Abb. 6.10 Menübefehl deaktivieren

Um den Befehl wieder zu aktivieren, starten Sie das folgende Makro:

Sub SuchenAktivieren()Dim Menü As CommandBarPopupDim ctrl As CommandBarControl

Set Menü = Application.CommandBars.FindControl _ (Type:=msoControlPopup, ID:=30002) For Each ctrl In Menü.Controls Debug.Print ctrl.Caption

Listing 6.19: Menübefehl aktivieren

Page 248: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 247

Setzen Sie die Eigenschaft Enabled auf den Wert True, um den Menübefehl wieder zu akti-vieren.

Die Methode FindControl können Sie aber auch direkt auf einen Menübefehl ansetzen. Sodeaktivieren Sie im Menü EXTRAS den Befehl OPTIONEN. Der Code für diese Aufgabe lautet:

6.2.12 Ganze Menüs deaktivieren

Möchten Sie gleich ein ganzes Menü deaktivieren, dann suchen Sie über die Methode Find-Control das gewünschte Menü und deaktivieren es komplett.

Sprechen Sie das Menü EXTRAS direkt über dessen eindeutige ID unter Verwendung derMethode FindControl an und deaktivieren Sie es, indem Sie die Eigenschaft Enabled aufden Wert False setzen.

If ctrl.Caption = "Suc&hen..." Then _ ctrl.Enabled = True: Exit Sub Next ctrl Set Menü = NothingEnd Sub

Sub OptionenVerhindern()Dim ctrl As CommandBarControl

Set ctrl = Application.CommandBars.FindControl(ID:=522) If ctrl Is Nothing Then Else ctrl.Enabled = FalseEnd Sub

Listing 6.20: Menübefehl aktivieren (direkte Methode)

Sub MenüExtrasDeaktivieren()Dim Menü As CommandBarPopup

Set Menü = Application.CommandBars.FindControl _(Type:=msoControlPopup, ID:=30007) Menü.Enabled = FalseSet Menü = NothingEnd Sub

Listing 6.21: Ganzes Menü deaktivieren

Listing 6.19: Menübefehl aktivieren

Page 249: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren248

Abb. 6.11 Das Menü Extras wurde deaktiviert

6.2.13 Kaskade erstellen

Ein wenig aufwendiger wird es, wenn Sie ein so genanntes Kaskadenmenü programmierenmöchten. Bei einem solchen Menü bietet ein Menübefehl weitere Untermenübefehle an. Mit-hilfe von Kaskadenmenüs kann man die Anzahl von Menübefehlen in einem Menü vermin-dern, was letztendlich auch zu einer besseren Übersichtlichkeit führt, sofern man die Kaska-dierung nicht übertreibt.

Greifen Sie nun das Beispiel mit dem Zählen von Zeichen, Wörtern und Sätzen wieder aufund integrieren Sie diese Funktionen im Menü BEARBEITEN. Der Code für diese Aufgaben-stellung lautet:

Hinweis:

Selbstverständlich können Sie das gewünschte Menü auch über die Beschriftung dessel-ben identifizieren, doch bietet die Identifikation über die eindeutige ID eine größereSicherheit, da diese ID für alle Sprachen gleich bleibt, während die Eigenschaft Captionje nach Sprache eine unterschiedlich Beschriftung liefert. Möglich wäre auch eine Identi-fikation des Menüs über dessen Position in der Menüleiste selbst. So wäre die Position desMenüs EXTRAS in der Menüleiste mit dem Index 6 festgemacht. Doch wer sagt Ihnen, dassein Anwender dieses Menü nicht irgendwoanders hin verschoben hat. In diesem Fall wür-den Sie das falsche Menü deaktivieren.

Sub KaskadeErstellen()Dim Kaskade As CommandBarPopupDim i As Integer

i = _CommandBars("Menu Bar").Controls("Bearbeiten").Controls.Count

Listing 6.22: Menü-Kaskade erstellen

Page 250: VBA-Programmierung fur Word, Excel und Access

Rechts6.2 Menüleisten programmieren 249

Im ersten Schritt definieren Sie eine Objektvariable vom Typ CommandBarPopup. Mit dieserObjektvariablen legen Sie fest, dass es ein weiteres Untermenü gibt. Da Sie das zusätzlicheKaskaden-Menü am Ende des Menüs BEARBEITEN einfügen möchten, zählen Sie über dieMethode Count die bisher vorhandenen Menübefehle und speichern die Anzahl in der Varia-blen i.

Definieren Sie nun das Kaskaden-Menü, welches Sie mithilfe der Methode Add einfügen.Dabei legen Sie mit dem Argument Type fest, dass es noch weitere Untermenüs geben soll.Mit dem Argument Before geben Sie bekannt, dass dieser neue Menüpunkt am Ende des

Set Kaskade = _CommandBars("Menu Bar").Controls("Bearbeiten").Controls.Add _ (Type:=msoControlPopup, Before:=i, Temporary:=True) With Kaskade .Caption = "Zählen" .BeginGroup = True End With With Kaskade.Controls.Add _ (Type:=msoControlButton, Temporary:=True) .Caption = "Zeichen" .OnAction = "ZeichenZählen" .FaceId = 48 .Style = msoButtonIconAndCaption .Enabled = True End With With Kaskade.Controls.Add _ (Type:=msoControlButton, Temporary:=True) .Caption = "Worte" .OnAction = "WörterZählen" .FaceId = 48 .Style = msoButtonIconAndCaption .Enabled = True End With With Kaskade.Controls.Add _ (Type:=msoControlButton, Temporary:=True) .Caption = "Sätze" .OnAction = "SätzeZählen" .FaceId = 48 .Style = msoButtonIconAndCaption .Enabled = True End WithEnd Sub

Listing 6.22: Menü-Kaskade erstellen

Page 251: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren250

Menüs BEARBEITEN eingefügt werden soll. Aus diesem Grund haben Sie bereits vorher dieAnzahl der Menübefehle in der Variablen i gespeichert, die Sie nun der Methode Add über-geben. Über die Eigenschaft Caption legen Sie die Beschriftung des Menübefehls fest.Möchten Sie den Menüpunkt auch über die Tastatur schnell ansteuern können, dann setzenSie das Zeichen & vor den Buchstaben der Beschriftung ein, der als Shortcut fungieren soll.Setzen Sie die Eigenschaft BeginGroup auf den Wert True, um einen horizontalen Trenn-strich im Menü zu ziehen.

Fügen Sie nun dem neuen Menübefehl einen weiteren hinzu. Verwenden Sie dazu wiederumdie Methode Add und geben Sie im Argument Type die Konstante msoControlButton an.Damit legen Sie fest, dass keine weiteren Untermenüs für diesen Menübefehl mehr folgen.Geben Sie dem Menübefehl über die Eigenschaft Caption eine Beschriftung und hinterlegenSie hinter der Eigenschaft OnAction das Makro, welches Sie ausführen möchten, wenn derMenübefehl ausgewählt wird. Mit der Eigenschaft Style legen Sie fest, wie der Menübefehlangezeigt werden soll. Entscheiden Sie sich für die Konstante msoButtonIconAndCap-tion, um sowohl ein Symbol als auch eine Beschriftung anzuzeigen. Verwenden Sie dieEigenschaft FaceId, um ein passendes Symbol dem Menübefehl hinzuzufügen. Über dieEigenschaft Enabled können Sie steuern, ob Sie den Menübefehl aktivieren bzw. deaktivie-ren möchten.

Abb. 6.12 Das Kaskadenmenü wurde im Menü Bearbeiten integriert

Page 252: VBA-Programmierung fur Word, Excel und Access

Rechts6.3 Symbolleisten programmieren 251

6.3 Symbolleisten programmieren

Auch bei der Programmierung von Symbolleisten wird auf das Objekt CommandBarszurückgegriffen. In Office spielt es daher keine Rolle mehr, ob es sich um Menü- oder Sym-bolleisten handelt. Alle Leisten werden gleich behandelt.

Bei der Programmierung von Symbolleisten müssen Sie zwei IDs unterscheiden:

• Die ID bestimmt die Funktion des Symbols.

• Die FaceId-Eigenschaft bestimmt das Aussehen des Symbols, jedoch nicht die Funktioneiner Befehlsleisten-Schaltfläche.

6.3.1 Symbol-IDs bestimmen

Wie gerade erfahren, besitzt jede Symbolschaltfläche eine eindeutige ID, die die Funktionfestlegt. Schreiben Sie im folgenden Listing alle IDs der Symbolleiste Standard in eine Word-Tabelle. Der Code für diese Aufgabe lautet:

Sub ErmittelnIDs()Dim symb As CommandBarDim Icon As CommandBarControlDim Tabelle As TableDim NeuDoku As Document

Set NeuDoku = Documents.AddOn Error Resume NextSet symb = Application.CommandBars("Standard")i = 1

Set Tabelle = NeuDoku.Tables.Add(Selection.Range, 20, 2)For Each Icon In symb.Controls With Tabelle .Cell(i, 1).Range.InsertAfter Icon.TooltipText .Cell(i, 2).Range.InsertAfter Icon.ID i = i + 1 End WithNext IconEnd Sub

Listing 6.23: Symbol-IDs auslesen

Page 253: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren252

Fügen Sie im ersten Schritt ein neues, noch leeres Dokument ein. Dazu verwenden Sie dieMethode Add. Danach geben Sie über die Anweisung Set bekannt, welche Symbolleiste Sieauslesen möchten. Fügen Sie dann eine neue Tabelle ein, die 20 Zeilen und 2 Spalten auf-weist. In einer anschließenden Schleife füllen Sie diese Tabelle in der ersten Spalte mit derBeschriftung des Symbols, die angezeigt wird, wenn Sie den Mauszeiger eine kleine Weileauf dem Symbol belassen (QuickInfo). In die zweite Spalte fügen Sie die eindeutige ID desSymbols ein. Im ersten Fall verwenden Sie die Eigenschaft ToolTipText und im zweitenFall die Eigenschaft ID.

Abb. 6.13 Identifikation der Symbol-IDs der Symbolleiste Standard

Page 254: VBA-Programmierung fur Word, Excel und Access

Rechts6.3 Symbolleisten programmieren 253

6.3.2 FaceIDs bestimmen

Im nächsten Schritt möchten Sie wissen, welches Symbolbild welcher FaceId zugeordnetist. Um diese Aufgabe zu lösen, starten Sie das Makro aus dem nächsten Listing. In diesemListing werden die Symbole der ersten 10 Symbolleisten von Word in ein neues Dokumentkopiert.

Fügen Sie im ersten Schritt ein neues, noch leeres Dokument ein. Danach setzen Sie eineSchleife auf, die die ersten 10 Leisten von Word abarbeitet. Innerhalb dieser Schleife erzeu-gen Sie eine weitere Schleife, in der Sie die einzelnen Symbole der jeweiligen Symbolleisteverarbeiten. Kopieren Sie mithilfe der Methode CopyFace das Symbolbild des Symbols indie Zwischenablage. Fügen Sie danach das Symbol über die Methode Paste in Ihr Doku-ment ein. Erfassen Sie danach die Beschriftung mithilfe der Eigenschaft Caption sowie dieBildnummer über die Eigenschaft FaceId.

Sub SymboleInTabelleKopieren()Dim i As IntegerDim z As Integer

Documents.Add On Error Resume Next For z = 1 To 10 For i = 1 To CommandBars(z).Controls.Count CommandBars(z).Controls(i).CopyFace Selection.Paste Selection.TypeText _ Text:=CommandBars(z).Controls(i).Caption & " " & _ CommandBars(z).Controls(i).FaceId Selection.TypeParagraph Next i Selection.TypeParagraph Selection.TypeText Text:="Das war die Symbolleiste: " _ & CommandBars(z).Name Selection.TypeParagraph Selection.TypeParagraph Next zEnd Sub

Listing 6.24: Symbol-FaceIDs auslesen

Page 255: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren254

Abb. 6.14 Alle Symbol-Face-IDs in ein neues Dokument kopieren

6.3.3 Neue Symbolleiste anlegen

Mithilfe der Informationen der IDs sowie der FaceIds können Sie jetzt an die Erstellung einerneuen Symbolleiste herangehen. Im folgenden Listing erstellen Sie eine neue Symbolleisteund fügen ein paar Standardfunktionen ein.

Sub SymbolleisteAnlegen()Dim SB As CommandBar

On Error Resume Next Set SB = CommandBars.Add("Eigene Symbolleiste") With SB .Visible = True .Top = 300 .Left = 80 End With

Listing 6.25: Eine neue Symbolleiste anlegen

Page 256: VBA-Programmierung fur Word, Excel und Access

Rechts6.3 Symbolleisten programmieren 255

Mithilfe der Methode Add fügen Sie eine neue Symbolleiste ein. Dabei bestimmen Sie überdie Eigenschaft Visible, dass die Symbolleiste auf dem Bildschirm angezeigt wird. Mit denEigenschaften Top und Left legen Sie die exakte Anzeigeposition der Symbolleiste (linkeobere Ecke) fest.

Zum Einfügen der Symbolschaltfläche geben Sie einen gültigen ID-Wert bei der MethodeAdd an.

Abb. 6.15 Die neue Symbolleiste

6.3.4 Symbolleiste löschen

Möchten Sie eine bereits angelegte Symbolleiste wieder löschen, dann setzen Sie dieMethode Delete ein.

Set symbol = SB.Controls symbol.Add Type:=msoControlButton, ID:=3 symbol.Add Type:=msoControlButton, ID:=2520 symbol.Add Type:=msoControlButton, ID:=21 symbol.Add Type:=msoControlButton, ID:=19 symbol.Add Type:=msoControlButton, ID:=22 symbol.Add Type:=msoControlButton, ID:=2521End Sub

Sub SymbolleisteLöschen() On Error Resume NextApplication.CommandBars("Eigene Symbolleiste").DeleteEnd Sub

Listing 6.26: Symbolleiste löschen

Listing 6.25: Eine neue Symbolleiste anlegen

Page 257: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren256

6.3.5 Symbolleiste zurücksetzen

Haben Sie in einer bereits standardmäßig zur Verfügung stehenden Symbolleiste eine Ände-rung vorgenommen, die Sie wieder zurücknehmen möchten, dann können Sie über dieMethode Reset den originalen Zustand der Symbolleiste herstellen. Im folgenden Quellcodewird die Symbolleiste STANDARD auf den Zustand direkt nach der Installation des Office-Pakets zurückgesetzt.

6.3.6 Symbolleiste ausblenden

Möchten Sie den Gebrauch einer bestimmten Symbolleiste verwehren, können Sie diese aus-blenden. Dabei können Sie je nach Einsatzfall entscheiden, ob Sie die Symbolleiste im Kon-textmenü weiterhin angeboten haben möchten oder nicht. Das einfache Ausblenden einerSymbolschaltfläche funktioniert wie folgt:

Setzen Sie die Eigenschaft Visible auf den Wert False, um die Symbolleiste auszublen-den.

Sub SymbolleisteZurücksetzen() On Error Resume NextApplication.CommandBars("Standard").ResetEnd Sub

Abb. 6.16 Listing 6.27: Symbolleiste zurücksetzen

Sub SymbolleisteVerstecken() On Error Resume NextApplication.CommandBars("Standard").Visible = FalseEnd Sub

Listing 6.28: Symbolleiste ausblenden

Page 258: VBA-Programmierung fur Word, Excel und Access

Rechts6.3 Symbolleisten programmieren 257

Abb. 6.17 Symbolleiste wurde ausgeblendet

Um die Symbolleiste wieder einzublenden, setzen Sie die Eigenschaft Visible auf den WertTrue zurück.

Gehen Sie nun noch einen Schritt weiter und blenden die Symbolleiste Standard in der Formaus, dass diese im Kontextmenü nicht mehr angeboten wird. Der Code für diese Aufgabesieht wie folgt aus:

Setzen Sie die Eigenschaft Enabled auf den Wert False, um die Symbolleiste zu deaktivie-ren. Um die Symbolleiste wieder einzublenden und zu aktivieren, setzen Sie die EigenschaftEnabled auf den Wert True zurück.

Sub SymbolleisteDeaktivieren() On Error Resume NextApplication.CommandBars("Standard").Enabled = FalseEnd Sub

Listing 6.29: Symbolleiste deaktivieren

Page 259: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren258

Abb. 6.18 Symbolleiste Standard ist nicht mehr verfügbar

6.3.7 Symbole deaktivieren

Wenn Sie nur ganz bestimmte Symbole einer Symbolleiste deaktivieren möchten, können Siediese mithilfe der Methode FindControl aufspüren und deaktivieren, indem Sie die Eigen-schaft Enabled auf den Wert False setzen.

Im nächsten Beispiel soll verhindert werden, dass ein Dokument über die Schaltfläche SPEI-CHERN der Symbolleiste STANDARD gespeichert werden kann. Der Code zur Lösung dieserAufgabenstellung lautet:

Wird das gesuchte Schaltflächensymbol gefunden, steht in der Variablen ctrl ein gültigerWert. In diesem Fall deaktivieren Sie das Symbol über die Eigenschaft Enabled, der Sie denWert False zuweisen. Um die Symbolschaltfäche wieder verfügbar zu machen, setzen Siedie Eigenschaft Enabled auf den Wert True.

Sub SpeichernVerhindern()Dim ctrl As CommandBarControl

Set ctrl = Application.CommandBars.FindControl(ID:=3) If ctrl Is Nothing Then Else ctrl.Enabled = FalseEnd Sub

Listing 6.30: Symbolschaltfläche deaktivieren

Page 260: VBA-Programmierung fur Word, Excel und Access

Rechts6.3 Symbolleisten programmieren 259

Abb. 6.19 Das Symbol Speichern wurde deaktiviert

6.3.8 Symbolleisten schützen

Sie können Symbolleisten verändern, d.h., Sie können neue Symbole in die Symbolleiste auf-nehmen oder Symbole aus den Leisten herausnehmen. Weiter können Sie die Position vonSymbolleisten auf dem Bildschirm frei bestimmen. Möchten Sie all dies verhindern, so habenSie die Möglichkeit, Ihre Symbolleisten zu schützen. Im nächsten Makro wird die Symbol-leiste STANDARD geschützt.

Die Eigenschaft Protection können Sie einsetzen, um Ihre Symbolleisten zu schützen. DieKonstante msoBarNoChangeVisible bewirkt, dass die Symbolleiste nicht im Kontextmenüerscheint, wenn Sie eine beliebige Symbolleiste mit der rechten Maustaste anklicken. DieKonstante msoBarNoCustomize verhindert ein Anpassen der Symbolleiste. Sie habendadurch keine Möglichkeit, neue Symbole hinzuzufügen bzw. Symbole aus der Symbolleisteherauszunehmen.

Sub SymbolleisteSchützen()Dim SymbolL As CommandBar

Set SymbolL = Application.CommandBars("Standard")With SymbolL .Protection = _ msoBarNoChangeVisible + msoBarNoCustomize .Visible = TrueEnd WithEnd Sub

Listing 6.31: Symbolleiste schützen

Page 261: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren260

Die weiteren Möglichkeiten des Schutzes von Symbolleisten können Sie in der folgendenTabelle sehen.

Heben Sie den Schutz der Symbolleiste STANDARD wieder auf, indem Sie folgendes Makrostarten.

6.4 Kontextmenüs programmieren

Kontextmenüs finden Sie in Office überall. Wenn Sie mit der rechten Maustaste auf einObjekt klicken, wird Ihnen in den meisten Fällen ein Kontextmenü angeboten. Dieses Kon-textmenü enthält dann die wichtigsten Befehle zu dem angeklickten Objekt.

Konstante Bedeutung

msoBarNoChangeDock Die Symbolleiste kann nicht aus ihrer Verankerung herausgelöst werden.

msoBarNoChangeVisible Die Symbolleiste können Sie weder im Kontextmenü der Symbol-leisten noch im Dialog Anpassen sehen.

msoBarNoCustomize Kein Hinzufügen bzw. Löschen von Symbolen aus der Symbollei-ste. Auch kein Verschieben der Symbole ist möglich.

msoBarNoHorizontalDock Die Symbolleiste kann weder am oberen noch am unteren Bild-schirm angedockt werden.

msoBarNoVerticalDock Die Symbolleiste kann weder rechts noch links am Bildschirm angedockt werden.

msoBarNoMove Die Symbolleiste kann nicht auf dem Bildschirm frei bewegt wer-den.

MsoBarNoResize Die Symbolleiste kann in Ihrer Form nicht verändert werden.

Sub SymbolleistEntschützen()Dim SymbolL As CommandBar

Set SymbolL = Application.CommandBars("Standard")With SymbolL .Protection = False .Visible = TrueEnd WithEnd Sub

Listing 6.32: Symbolleistenschutz aufheben

Page 262: VBA-Programmierung fur Word, Excel und Access

Rechts6.4 Kontextmenüs programmieren 261

6.4.1 Kontextmenüs ermitteln

Welche Kontextmenüs gerade in Word zur Verfügung stehen, können Sie herausfinden,indem Sie das nächste Makro starten.

Zählen Sie im ersten Schritt alle vorhandenen Leisten von Word, indem Sie diese mithilfe derEigenschaft Count ermitteln. Über die Eigenschaft Type geben Sie die Art der Befehlsleistezurück. Entspricht dieser Typ dem Wert 2, handelt es sich um ein Kontextmenü. Mit derEigenschaft Name ermitteln Sie den Namen der Befehlsleiste. Den eindeutigen Index habenSie bereits über das Hochzählen der Variablen i herausgefunden. Über die AnweisungDebug.Print geben Sie alle Informationen über die vorhandenen Befehlsleisten im Direkt-bereich von Word aus.

Abb. 6.20 Alle Kontextmenüs von Word werden aufgelistet

Sub KontextmenüsErmitteln()Dim i As Integer

For i = 1 To CommandBars.Count If CommandBars(i).Type = 2 Then Debug.Print i & " --> " & _ CommandBars(i).Name & "" Else End If Next iEnd Sub

Listing 6.33: Kontextmenüs abfragen

Page 263: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren262

6.4.2 Kontextmenüs deaktivieren

Um ein Kontextmenü zu dekativieren, müssen Sie wissen, wie Sie dieses ansprechen können.Diese Information können Sie in der letzten Abbildung ersehen. Damit ist es dann kein Pro-blem mehr die Kontextmenüs gezielt zu deaktivieren.

Im folgenden Beispiel wird das Kontextmenü TOOLBAR LIST deaktiviert. Damit wird Ihnendas Kontextmenü für die Symbolleisten nicht mehr angeboten, wenn Sie mit der rechtenMaustaste auf eine beliebige Symbolleiste klicken.

Ebenso deaktivieren Sie das Kontextmenü, welches Sie angezeigt bekommen, wenn Sie aufeinen beliebigen Text im Dokument mit der rechten Maustaste klicken.

Der Code für diese beiden Aufgabenstellungen lautet:

Setzen Sie die Eigenschaft Enabled auf den Wert False, um die Verfügbarkeit des angege-benen Kontextmenüs einzuschränken. Indem Sie die Eigenschaft Enabled wieder auf denWert True setzen, wird das angegebene Kontextmenü wieder verfügbar

6.4.3 Kontextmenü erweitern

Wenn Sie sich das Text-Kontextmenü einmal ansehen, erkennen Sie, dass die wichtigstenBefehle für die Textverarbeitung schon darin enthalten sind. Trotzdem können Sie weitereBefehle in das Kontextmenü einfügen.

Fügen Sie im nächsten Beispiel die »Zähl-Funktionen«, die Sie bereits im Verlauf des Kapi-tels programmiert haben, ein.

Sub KontextmenüsDeaktivieren()Application.CommandBars("Toolbar list").Enabled = FalseApplication.CommandBars("Text").Enabled = FalseEnd Sub

Listing 6.34: Kontextmenüs deaktivieren

Sub TextKontextmenüErgänzen()Dim MB As CommandBarControl

Set MB = Application.CommandBars("Text").Controls.Add With MB .Caption = "Zeichen zählen" .OnAction = "Zeichenzählen" .BeginGroup = True End With Set MB = Application.CommandBars("Text").Controls.Add

Listing 6.35: Kontextmenüs ergänzen

Page 264: VBA-Programmierung fur Word, Excel und Access

Rechts6.4 Kontextmenüs programmieren 263

Fügen Sie über die Methode Add dem Kontextmenü weitere Menübefehle hinzu. Mit derEigenschaft Caption geben Sie dem neuen Menübefehl eine Beschriftung. Durch die Eigen-schaft OnAction hinterlegen Sie, welches Makro bei der Auswahl des Menübefehls gestartetwerden soll. Ziehen Sie einen horizontalen Trennstreifen im Kontextmenü, indem Sie dieEigenschaft BeginGroup auf den Wert True setzen.

Abb. 6.21 Das Kontextmenü wurde erweitert

With MB .Caption = "Wörter zählen" .OnAction = "Wörterzählen" End With Set MB = Application.CommandBars("Text").Controls.Add With MB .Caption = "Sätze zählen" .OnAction = "SätzeZählen" End WithEnd Sub

Listing 6.35: Kontextmenüs ergänzen

Page 265: VBA-Programmierung fur Word, Excel und Access

Links

6 Menü- und Symbolleisten programmieren264

6.4.4 Kontextmenüs zurücksetzen

Möchten Sie Ihr Text-Kontextmenü wieder auf den ursprünglichen Zustand zurücksetzen,können Sie entweder die einzelnen Befehle aus dem Kontextmenü herauslöschen oder dasgesamte Kontextmenü auf den Zustand direkt nach der Installation zurücksetzen.

Das folgende Makro ermittelt die drei vorher eingefügten Befehle im Text-Kontextmenü inder Form, dass es nach einem Teil der Beschriftung (zählen) sucht und diejenigen Befehle ausdem Kontextmenü löscht, die diese Textfolge enthalten.

Geben Sie im ersten Schritt an, in welchem Kontextmenü nach den Befehlen gesucht werdensoll. Danach durchlaufen Sie alle Kontextmenübefehle und prüfen über die Funktion InStr,ob der Text zählen darin vorkommt. Wenn ja, dann wenden Sie die Methode Delete an,um den jeweiligen Befehl aus dem Kontextmenü zu löschen.

Eine weitere Möglichkeit besteht darin, das Kontextmenü zurückzusetzen. Das Makro fürdiese Aufgabe lautet:

Wenden Sie die Methode Reset an, um das Kontextmenü auf den ursprünglichen Zustandzurückzusetzen.

Sub KontextmenüBefehleLöschen()Dim MB As CommandBarControlDim obj As Object

With Application.CommandBars("Text") For Each obj In .Controls If InStr(obj.Caption, "zählen") > 0 Then obj.Delete Next obj End WithEnd Sub

Listing 6.36: Kontextmenübefehle aufspüren und löschen

Sub TextKontextmenüZurücksetzen() Application.CommandBars("Text").ResetEnd Sub

Listing 6.37: Kontextmenü zurücksetzen

Page 266: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang265

7 »Internette« Funktionen in Office programmieren

Seit der Version Office 97 können Sie Hyperlinks in Ihren Dateien verwenden. Damit könnenSie aus Ihren Dokumenten Sprünge zu Internetseiten durchführen. Sie haben aber auch dieMöglichkeit, die Office-Dateien untereinander sinnvoll zu verbinden. In diesem Kapitel stelleich Ihnen praxisnahe Lösungen vor, wie Sie Hyperlinks in VBA programmieren können.

Ein weiteres Thema dieses Kapitels werden die automatische Erstellung von Webabfragensowie Lösungen rund um das Mailing sein.

7.1 Inhaltsverzeichnis einer Arbeitsmappe erstellen

Im ersten Beispiel dieses Kapitels erstellen Sie ein Inhaltsverzeichnis in Excel. Dabei soll einMakro untersuchen, welche Tabellen in einer Arbeitsmappe enthalten sind. Diese sollen dannauf einer neuen Tabelle zu Beginn der Arbeitsmappe als Hyperlinks eingefügt werden. Miteinem Klick auf den gewünschten Hyperlink springen Sie dann direkt auf die entsprechendeTabelle.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap07 unter demNamen Hyper.xls finden.

Sub InhaltsverzeichnisErstellen()Dim i As Integer

ActiveWorkbook.Sheets.Add Before:=Worksheets(1)ActiveSheet.Name = "Inhalt"Range("A1").Value = "Inhaltsverzeichnis"Range("A2").SelectFor i = 2 To ActiveWorkbook.Sheets.Count ActiveCell.Value = Sheets(i).Name ActiveSheet.Hyperlinks.Add Anchor:=Selection, _ Address:="", SubAddress:= _ Sheets(i).Name & "!A1", _ ScreenTip:="Klicken Sie auf den Hyperlink", _

Listing 7.1: Tabellen verlinken

Page 267: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren266

Fügen Sie im ersten Schritt eine neue Tabelle gleich zu Beginn Ihrer Arbeitsmappe ein. Ver-wenden Sie für diese Aktion die Methode Add und geben beim Argument Before den Index1 an. Über die Eigenschaft Name geben Sie der Tabelle den Namen INHALT. Füllen Sie dieZelle A1 mit dem konstanten Wert INHALTSVERZEICHNIS und markieren danach die Start-zelle, von der ab die Hyperlinks eingefügt werden sollen. Setzen Sie jetzt eine Schleife auf,die alle Tabellen der Arbeitsmappe, abgesehen von der ersten Tabelle, abarbeitet. Die Hyper-links fügen Sie über die Methode Add ein, das Sie auf das Objekt Hyperlinks anwenden.Die Methode Add hat dabei folgende Syntax:

Im Argument Anchor geben Sie die Adresse der momentan aktiven Zelle an. Das ArgumentAddress beinhaltet die Adresse des Hyperlinks, das Argument SubAdress die Unteradressedes Hyperlinks, in der Sie den Namen der Tabelle sowie einen Zellenbezug angeben. ImArgument ScreenTip können Sie den Text für die QuickInfo bestimmen, der angezeigtwird, wenn Sie mit der Maus über den Hyperlink streichen. Den eigentlichen Text, der in derZelle steht, geben Sie über das Argument TextToDisplay an.

Abb. 7.1 Hyperlinks der Tabellen werden eingefügt

TextToDisplay:=Sheets(i).Name ActiveCell.Offset(1, 0).SelectNext iEnd Sub

Add(Anchor, Address, SubAddress, ScreenTip, TextToDisplay)

Listing 7.1: Tabellen verlinken

Page 268: VBA-Programmierung fur Word, Excel und Access

Rechts7.2 Inhaltsverzeichnis eines Verzeichnisses erstellen 267

7.2 Inhaltsverzeichnis eines Verzeichnisses erstellen

Im nächsten Beispiel fügen Sie alle Dateinamen von Word-Dokumenten in einer Excel-Tabelle ein. Im zweiten Schritt werden aus diesen Einträgen dann Hyperlinks erzeugt.

Um die Dokumente in einer Excel-Tabelle aufzulisten, starten Sie das folgende Makro:

Zu Beginn des Makros können Sie das zu durchsuchende Verzeichnis in einer Konstantenangeben. Wechseln Sie über die Anweisung ChDir dann direkt in dieses Verzeichnis.Danach starten Sie die Suche und verwenden dabei das Objekt FileSearch, um die einzel-nen Dateien im Verzeichnis zu ermitteln. Über dieses Objekt können Sie einige Eigenschaf-ten und Methoden abfragen: Die Methode NewSearch setzt die Einstellungen aller Suchkri-terien auf die Standardeinstellungen zurück. Mithilfe der Eigenschaft LookIn geben Siebekannt, in welchem Verzeichnis die Suche beginnen soll. Die Eigenschaft SearchSubFol-ders bestimmt, ob die Suche auch in Unterverzeichnissen fortgesetzt werden soll. In diesem

Sub DokumenteAuflisten()Dim i As LongConst verz = "D:\Eigene Dateien\"

On Error GoTo fehlerChDir verzActiveWorkbook.Sheets.Add Before:=Worksheets(1)ActiveSheet.Name = "Dateienverzeichnis"Range("A1").Value = "Inhaltsverzeichnis"Range("A2").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 iEnd WithExit Sub

fehler:MsgBox "Es gibt kein Verzeichnis mit dem Namen " & verzEnd Sub

Listing 7.2: Dokumente eines Verzeichnisses in Tabelle auflisten

Page 269: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren268

Fall müssen Sie diese Eigenschaft auf den Wert True setzen. Die Eigenschaft FileType gibtden Dateityp in einer Konstanten an, nach der gesucht werden soll. Möchten Sie beispiels-weise nicht nur Word-Dateien suchen lassen, sondern alle Dateitypen, dann geben Sie dieKontante msoFileTypeAllFiles an. Über die Eigenschaft FileFound geben Sie dann denNamen der gefundenen Datei an und schreiben diesen direkt in Ihre Excel-Tabelle.

Abb. 7.2 Alle Dokumente werden aufgelistet

Im nächsten Schritt sollen diese Einträge jetzt verlinkt werden, sodass nach dem Klickeneines solchen Links das angegebene Dokument geöffnet wird. Das Makro für diese Aufgabelautet:

Sub DokumenteInHyperlinksWandeln()Dim i As Integer

Sheets("Dateienverzeichnis").ActivateRange("A2").SelectFor i = 1 To ActiveSheet.UsedRange.Rows.Count ActiveCell.Hyperlinks.Add ActiveCell, ActiveCell.Value ActiveCell.Offset(1, 0).SelectNext iEnd Sub

Listing 7.3: Aus Zelleneinträgen Hyperlinks herstellen

Page 270: VBA-Programmierung fur Word, Excel und Access

Rechts7.3 E-Mail-Links einfügen 269

Setzen Sie zu Beginn des Makros den Mauszeiger auf die Zelle A2. Danach durchlaufen Siein einer Schleife alle Einträge der Tabelle. Innerhalb dieser Schleife werden alle Einträge inHyperlinks umgesetzt. Dazu setzen Sie die Methode Add ein. Die Sprung-Adresse geht dabeidirekt aus dem Zelleneintrag hervor.

Abb. 7.3 Die Dateinamen wurden in Hyperlinks umgesetzt

7.3 E-Mail-Links einfügen

Neben URLs, also Internet-Adressen, können auch E-Mail-Adressen in Hyperlinks umge-setzt werden. Nach dem Klicken eines solchen Links wird dann das E-Mail-Fenster IhresMail-Programms (z.B. Outlook) geöffnet.

Fügen Sie im nächsten Beispiel in eine Tabelle eine E-Mail-Adresse als Hyperlink ein.

Sub HyperlinkMitEmailEinfügen()Sheets("Tabelle1").Activate Range("A1").Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _ "mailto:[email protected]", _ ScreenTip:="Klicken Sie auf den Hyperlink", _ TextToDisplay:="Support"End Sub

Listing 7.4: E-Mail-Adresse als Hyperlink einfügen

Page 271: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren270

Beim Einfügen einer E-Mail-Adresse als Hyperlink müssen Sie darauf achten, dass Sie denTextzusatz MAILTO: hinzufügen.

Abb. 7.4 e-Mail-Hyperlink einfügen

Möchten Sie den Hyperlink wie durch Zauberhand durch ein VBA-Makro klicken, dann set-zen Sie folgenden Quellcode dafür ein:

Setzen Sie die Methode Follow ein, um den Hyperlink automatisch auszuführen. Das Argu-ment NewWindow setzen Sie auf den Wert False. Setzen Sie diesen Wert auf True, wenndie Zielanwendung in einem neuen Fenster angezeigt werden soll.

Abb. 7.5 Ein Klick auf den Hyperlink bringt das E-Mail-Fenster zum Vorschein

Sub HyperlinkAktivieren() Range("A1").Select Selection.Hyperlinks(1).Follow NewWindow:=FalseEnd Sub

Listing 7.5: Hyperlink automatisch ausführen

Page 272: VBA-Programmierung fur Word, Excel und Access

Rechts7.3 E-Mail-Links einfügen 271

7.3.1 E-Mail-Adressen blockweise umsetzen

Stellen Sie sich vor, Sie haben eine Excel-Tabelle vorliegen, in der viele E-Mail-Adressenenthalten sind. Da diese Tabelle aus einer Fremdanwendung übernommen wurde, erfolgtdabei nicht die automatische Umsetzung in E-Mail-Hyperlinks. Ihre Aufgabe besteht nundarin zu prüfen, ob eine gültige E-Mail-Adresse vorliegt und diese dann zu verlinken. SehenSie sich vorher die Ausgangssituation an.

Abb. 7.6 Eine Liste mit E-Mail-Adressen soll in Hyperlinks umgesetzt werden

Starten Sie nun folgendes Makro, um die E-Mail-Adressen umzusetzen:

Sub EMailLinksUmsetzen()Dim Zelle As Range

Sheets("Tabelle4").ActivateActiveSheet.UsedRange.Select

Listing 7.6: E-Mail-Adressen prüfen und in Hyperlinks umsetzen

Page 273: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren272

Alle Zellen innerhalb einer Markierung werden mithilfe der Schleife For Next durchlaufen.Mit der Funktion InStr können Sie prüfen, ob die Zelle eine E-Mail-Adresse enthält. Ist diesder Fall, kommt das Zeichen @ darin vor. Fügen Sie nun über die Methode Add einen Hyper-link ein. Als Zusatz müssen Sie noch den Text MAILTO: ergänzen. Damit weiß Excel, dass essich dabei um eine E-Mail-Adresse handelt. Mit einem Klick auf diese Zelle wird dann dasE-Mail-Fenster mit voreingestellter E-Mail-Adresse aufgerufen.

Abb. 7.7 Die E-Mail-Adressen wurden erfolgreich umgesetzt

For Each Zelle In Selection If InStr(Zelle, "@") > 0 Then Zelle.Hyperlinks.Add Zelle, _ "MailTo: " & Zelle.Value End If Next ZelleEnd Sub

Listing 7.6: E-Mail-Adressen prüfen und in Hyperlinks umsetzen

Page 274: VBA-Programmierung fur Word, Excel und Access

Rechts7.4 URL-Links einfügen 273

7.4 URL-Links einfügen

Um einen Hyperlink zu einer Webseite in eine Tabelle einzufügen, setzen Sie das folgendeMakro ein:

Geben Sie im Argument Address die volle Adresse der Webseite an, zu der Sie verlinkenmöchten.

Abb. 7.8 Hyperlink zu einer Webseite einrichten

Sub HyperlinkWebseite()Sheets("Tabelle2").ActivateActiveSheet.Hyperlinks.Add Anchor:=Range("A1"), Address:= _"http://held-office.de", ScreenTip:="Klicken Sie auf den Hyperlink", _ TextToDisplay:="Meine Homepage"End Sub

Listing 7.7: Hyperlink auf eine Webseite richten

Page 275: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren274

7.4.1 Hyperlinks bei Gültigkeit umsetzen

Im nächsten Beispiel liegt eine Tabelle vor, in der einige Zellen URLs beinhalten und manchenicht. Es sollen jetzt nur die Zellen in Hyperlinkzellen umgesetzt werden, die »gültige« Inter-net-Adressen beinhalten. Die Ausgangstabelle sieht dabei wie folgt aus:

Abb. 7.9 Die Ausgangssituation – eine Linkliste

Prüfen Sie jetzt, ob die einzelnen Zellen eine gültige Internet-Adresse aufweisen, und fügenSie dann die entsprechenden Hyperlinks ein. Das Makro für die Lösung dieser Aufgabenstel-lung lautet:

Sub LinksEinfügenBeiGültigkeit()Dim zelle As Range

Sheets("Tabelle3").ActivateActiveSheet.UsedRange.Select For Each zelle In Selection

Listing 7.8: Hyperlinks setzen

Page 276: VBA-Programmierung fur Word, Excel und Access

Rechts7.4 URL-Links einfügen 275

Markieren Sie im ersten Schritt den verwendeten Bereich der TABELLE3. Mithilfe einerSchleife durchlaufen Sie alle Zellen innerhalb Ihres markierten Bereichs. Prüfen Sie jede ein-zelne Zelle, ob dort eine gültige URL steht. Wenn ja, steht in der Zelle der TextauschnittHTTP://. Dieser Text besteht genau aus 7 Zeichen, die Sie mithilfe der Funktion Left über-prüfen können. Handelt es sich um eine gültige Internetseite, wenden Sie die Methode Addan, um einen Hyperlink einzufügen.

Abb. 7.10 Die gültigen Zellen wurden mit Hyperlinks bestückt

If Left(zelle, 7) = "http://" Then zelle.Hyperlinks.Add zelle, zelle.Value End If Next zelleEnd Sub

Listing 7.8: Hyperlinks setzen

Page 277: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren276

7.4.2 Hyperlinks entfernen

Standardmäßig werden Hyperlink-fähige Eingaben in Office-Dokumenten erkannt undgleich umgesetzt. Dadurch wird beispielsweise die Eingabe einer gültigen Internet-Adressemit einer blauen Unterstreichung der Eingabe quittiert.

Nicht immer sind Hyperlinks in Office-Dokumenten erwünscht. Das folgende Listing ent-fernt alle Hyperlinks aus einer Tabelle. Dabei werden die Zelleninhalte jedoch beibehalten.

In einer Schleife werden alle Zellen eines markierten Bereichs überprüft. Enthält die Zelleeinen Hyperlink, meldet die Eigenschaft Count einen Wert >0. In diesem Fall können Sie denHyperlink über die Methode Delete löschen. Der Hyperlink ist jetzt entfernt worden, dieblaue Schriftfarbe sowie die Unterstreichung sind aber nach wie vor in den Zellen enthalten.Bereinigen Sie dieses kleine Manko noch, indem Sie die Eigenschaft Underline mit demArgument xlUnderlineStyleNone ausstatten sowie die Eigenschaft ColorIndex mitdem Argument xlAutomatic versorgen. Damit entfernen Sie die Unterstreichung und dieblaue Schriftfarbe aus der Zelle. Der Zelleneintrag wird danach normal in schwarzer Schrift-farbe angezeigt.

7.5 Aktienkurse abfragen

Seit der Office-Version 97 haben Sie die Möglichkeit, Webabfragen durchzuführen. Alleswas Sie dazu brauchen, ist eine IQY-Datei, die Sie über einen Texteditor anlegen bzw. auchdirekt über VBA erstellen können. Im folgenden Beispiel führen Sie eine Webabfrage durch,

Sub HyperlinksEntfernen()Dim zelle As Range

Sheets("Tabelle3").ActivateActiveSheet.UsedRange.Select

For Each zelle In Selection With zelle If .Hyperlinks.Count > 0 Then .Hyperlinks.Delete With .Font .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomaticEnd WithEnd IfEnd WithNextEnd Sub

Listing 7.9: Hyperlinks entfernen

Page 278: VBA-Programmierung fur Word, Excel und Access

Rechts7.5 Aktienkurse abfragen 277

um aktuelle Aktienkurse aus dem Internet zu bekommen. Das Makro für diese Aufgabe siehtwie folgt aus:

Legen Sie im ersten Schritt eine Textdatei an und geben Sie die einzelnen konstanten Zeilenan. Dabei holen Sie die eigentliche Ticker-Symbol-Abfrage aus der Zelle A1. Starten Siedanach eine Abfrage, indem Sie die Methode Add einsetzen und dabei den Namen der Text-datei, die Verbindung selbst sowie die Zielzelle angeben.

Nach dem Starten des Makros werden Sie aufgefordert, einige Ticker-Symbole einzugeben.Über diese Ticker-Symbole können Sie die Internet-Datenbank abfragen. Eine Möglichkeit,herauszufinden, welcher Ticker hinter welchem Unternehmen steckt, finden Sie auf der Inter-netseite http://www.usa-aktienprofi.de/ticker.htm.

Abb. 7.11 Ticker-Symbole eingeben

Sub WebabfrageDurchführen()Dim iqyDat As StringDim Verbindung As String

Sheets("Kurse").ActivateiqyDat = "D:\Eigene Dateien\NeueAbfrage.iqy"Verbindung = "FINDER;" & iqyDatOpen iqyDat For Output As #1Print #1, "WEB"Print #1, "1"Print #1, "http://webservices.pcquote.com/cgi-bin/excel.exe"Print #1, Range("A1").ValueClose #1 Range("A3").Select With ActiveSheet.QueryTables.Add(Connection:=Verbindung, _ Destination:=ActiveCell.Offset(1, 0)) .RefreshStyle = xlOverwriteCells .Refresh BackgroundQuery:=False End WithEnd Sub

Listing 7.10: Eine Webabfrage durchführen

Page 279: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren278

Abb. 7.12 Die aktuellen Aktienkurse aus dem Internet

7.6 E-Mails per VBA verschicken

Standardmäßig können Sie aus Office-Anwendungen E-Mails direkt verschicken, ohne dassSie dafür Ihr Outlook öffnen müssen. Lernen Sie auf den nächsten Seiten ein paar typischeBeispiele kennen, wie Sie diese Funktionalität per VBA programmieren können.

7.6.1 Direktversand einer E-Mail

Möchten Sie eine Text-E-Mail versenden, können Sie für diese Aufgabestellung eine API-Funktion einsetzen.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap07 unter demNamen Mail.xls finden.

Private Declare Function ShellExecute Lib "Shell32.dll" _Alias "ShellExecuteA" (ByVal hWnd As Long, _ByVal lpOperation As String, ByVal lpFile As String, _ByVal lpParameters As String, ByVal lpDirectory As String, _

Listing 7.11: Direktes E-Mail über eine API-Funktion versenden

Page 280: VBA-Programmierung fur Word, Excel und Access

Rechts7.6 E-Mails per VBA verschicken 279

Übergeben Sie dem Makro Mail die E-Mail-Adresse des Adressaten, den Titel der E-Mailsowie den Text, der in der E-Mail erscheinen soll. Das Makro Mail ruft danach die API-Funktion ShellExecute auf und übergibt dieser Funktion die dafür benötigten Argumente.

Abb. 7.13 Eine Sofort-E-Mail wurde erzeugt

7.6.2 E-Mail mit Dateianhang versenden

Im nächsten Beispiel soll eine Arbeitsmappe mit einem bestimmten Titel und einem vorherdefinierten Text an einen bestimmten E-Mail-Empfänger versendet werden. Diese Arbeits-mappe wird dann als E-Mail-Anhang automatisch in die E-Mail per VBA eingebunden. DerCode für diese Aufgabenstellung sieht wie folgt aus:

ByVal nShowCmd As Long) As Long

Sub Mail(eMail As String, Optional Subject As String, _ Optional Body As String) Call ShellExecute(0&, "Open", "mailto:" + eMail + _ "?Subject=" + Subject + "&Body=" + Body, "", "", 1)End Sub

Sub MailVerschicken() Call Mail("[email protected]", "Feedback", "Schreiben Sie hier einen Text!")End Sub

Sub EMailVerschicken()Dim outl As Object

Listing 7.12: E-Mail mit Dateianhang versenden

Listing 7.11: Direktes E-Mail über eine API-Funktion versenden

Page 281: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren280

Wenden Sie zu Beginn des Makros die Methode CreateObject an, um ein Outlook-Objektanzulegen. Damit gewinnen Sie den Zugriff auf alle VBA-Objekte, Methoden und Eigen-schaften von Outlook, die Sie benötigen, um Ihre E-Mail zu erstellen, zu füllen und letztend-lich abzuschicken.

Mithilfe der Methode CreateItem erstellen Sie ein neues Outlook-Objekt. Was für ein Out-look-Objekt Sie brauchen, können Sie über eine Konstante festlegen. Dabei stehen Ihnen fol-gende Konstanten zur Verfügung:

• olAppointmentItem: Mithilfe dieser Konstante fügen Sie einen neuen Termin in denTerminkalender von Outlook ein.

• olContactItem: Über diese Konstante können Sie einen neuen Kontakt in Outlookerstellen.

• olDistributionListItem: Erstellt einen Eintrag in der Verteilerliste von Outlook.

• olJournalItem: Dabei erstellen Sie einen neuen Journaleintrag in Outlook.

• olMailItem: Hiermit können Sie eine neue E-Mailerstellen.

• olNoteItem: Über diese Konstante legen Sie eine neue Notiz an.

• olPostItem: Über diese Konstante können Sie eine E-Mail verschicken.

• olTaskItem: Über diese Konstante fügen Sie einen neuen Eintrag in der Aufgabenlistevon Outlook ein.

Dim Mail As Object

Set outl = CreateObject("Outlook.Application")Set Mail = outl.CreateItem(0)Mail.Subject = "Prüfdaten aktueller Monat"Mail.Body = "Sehr geehrte Damen und Herren" & Chr(13) & _ "anbei erhalten Sie die aktuellen Daten zur Prüfung " & _ Chr(13) & Chr(13) & Chr(13) & _ " Mit freundlichen Grüßen" & Chr(13) & _ " Fritz Nelkenheini "

Mail.To = "[email protected]" Mail.CC = "[email protected]" Mail.Attachments.Add "D:\Eigene Dateien\Prüfdaten.xls" Mail.Display Mail.Send Set outl = Nothing Set Mail = Nothing End Sub

Listing 7.12: E-Mail mit Dateianhang versenden

Page 282: VBA-Programmierung fur Word, Excel und Access

Rechts7.6 E-Mails per VBA verschicken 281

Mithilfe der Eigenschaft Subject legen Sie den Titel der E-Mail fest, der in der Zeile Betreffangezeigt werden soll. Diesen Titel müssen Sie innerhalb von Hochkommas im Code einge-ben.

Über die Eigenschaft Body geben Sie den Text an, der als Nachrichtentext der E-Mail beige-fügt werden soll. Diesen Text können Sie mehrzeilig im Quellcode anlegen, indem Sie füreine neue Zeile die Funktion Chr einsetzen, der Sie die Konstante 13 übergeben. Damit wirddirekt danach ein Zeilenwechsel durchgeführt.

Mithilfe der Eigenschaft To legen Sie fest, an welche Empfänger die E-Mail versendet wer-den soll. Sie haben dabei die Möglichkeit, mehrere E-Mail-Empfänger hintereinander einzu-geben. Dabei müssen Sie jeden einzelnen Empfänger durch ein Semikolon vom nächstenEmpfänger trennen. Die so angegebenen E-Mail-Empfänger werden im Feld AN des E-Mail-Fensters angezeigt. Wahlweise können Sie ebenso die Eigenschaft CC mit E-Mail-Adressenversorgen, wenn Sie wünschen, dass Ihre E-Mail auch an andere Empfänger als Kopie gesen-det werden soll. Ergänzend zu den beiden letzten genannten Eigenschaften existiert auchnoch die Eigenschaft BCC. Setzen Sie diese Eigenschaft ein, wenn Sie jemandem eine E-Mailals Kopie zustellen möchten, ohne dass der eigentliche Empfänger der E-Mail davon etwaserfährt.

Den Anhang der E-Mail, also die Arbeitsmappe PRÜFDATEN.XLS, können Sie der E-Mail hin-zufügen, indem Sie das Objekt Attachments verwenden. Mithilfe der Methode Add fügenSie danach die angegebene Arbeitsmappe ein. Achten Sie darauf, dass die angegebene Dateisowie der Pfad auch exisitieren.

Über die Methode Display zeigen Sie das E-Mail-Fenster auf dem Bildschirm an.

Vergessen Sie nicht, die vorher definierten Outlook-Objekte wieder aus dem Speicher zu ent-fernen. Dazu dienen die Anweisungen:

Bis zu dem Befehl Display ist das Makro vorgesehen. Jetzt können Sie nocheinmal kontrol-lieren, ob die richtigen E-Mail-Adressen angegeben wurden und ob der Text sowie der Datei-anhang stimmen.

Set outl = NothingSet Mail = Nothing

Page 283: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren282

Über den Befehl Mail.Send schicken Sie die E-Mail ab.

Abb. 7.14 Eine Excel-Arbeitsmappe im Anhang versenden

7.6.3 Aktive Tabelle per E-Mail versenden

Standardmäßig haben Sie in Excel die Möglichkeit, die aktuell geöffnete Arbeitsmappe perE-Mail zu verschicken. Da dies in den meisten Fällen jedoch gar nicht notwendig ist, reichtes oft aus, nur die aktive Tabelle per Mail zu verschicken. Der VBA-Code hierfür lautet:

Mithilfe der Methode Copy wird die aktive Tabelle zunächst in eine neue leere Arbeitsmappekopiert. Wenden Sie danach die Methode SendMail an. Dieser Methode können Sie genaudrei Argumente übergeben:

• Recipients: Gibt den Namen des Empfängers als Text an. Möchten Sie die E-Mailmehreren Empfängern zustellen, trennen Sie die einzelnen E-Mail-Adressen jeweilsdurch ein Semikolon. Es muss mindestens ein Empfänger angegeben werden.

• Subject: Dieses Argument steht für den Titel der E-Mail und sollte, muss aber nicht,angegeben werden.

Sub AktuelleTabelleMailen()ActiveWorkbook.ActiveSheet.CopyActiveWorkbook.SendMail _Recipients:="[email protected]", _ Subject:="Mail mit aktueller Tabelle"ActiveWorkbook.Close savechanges:=FalseEnd Sub

Listing 7.13: Aktive Tabelle per E-Mail versenden

Page 284: VBA-Programmierung fur Word, Excel und Access

Rechts7.6 E-Mails per VBA verschicken 283

• ReturnReceipt: Setzen Sie dieses Argument auf den Wert True, wenn Sie eine Emp-fangsbestätigung für Ihre E-Mail erhalten möchten. Setzen Sie dieses Argument auf denWert False bzw. lassen es komplett weg, wenn Sie auf eine Empfangsbestätigung ver-zichten möchten.

Die Methode Close sorgt dafür, dass die soeben erstellte Kopie der Tabelle wieder geschlos-sen wird. Indem Sie das Argument SaveChanges auf den Wert False setzen, verhindernSie, dass die etwas lästige Abfrage nach der Speicherung der Arbeitsmappe unterbleibt.

Bei dieser Lösung wird das E-Mail-Fenster nicht mehr angezeigt, sondern die E-Mail wid aufdirektem Wege versendet.

7.6.4 Tabelle ohne Verknüpfungen versenden

Sicher haben Sie auch schon einmal eine Arbeitsmappe bekommen, in der Verknüpfungen zuanderen Arbeitsmappen integriert waren. Beim Öffnen einer solchen Mappe werden Siegefragt, ob Sie diese Verknüpfungen aktualisieren möchten, was Sie aber nicht können, daIhnen der Sender der E-Mail nur diese Arbeitsmappe gemailt hat. Besser ist es, die Verknüp-fungen vor dem Versand der E-Mail zu entfernen. Wahlweise entfernen Sie auch gleich alleFormeln und Funktionen und ersetzen diese durch Festwerte.

Starten Sie das Makro aus dem nächsten Listing, um die Verknüpfungen und Formeln aus derTabelle zu entfernen.

Kopieren Sie im ersten Schritt die aktive Tabelle in eine neue Arbeitsmappe. Danach setzenSie die Methode SpecialCells ein und übergeben ihr das Argument xlCellTypeFormu-las. Damit markieren Sie alle Zellen der Tabelle, die eine Formel bzw. eine Verknüpfung zueiner anderen Arbeitsmappe enthalten. In einer darauf folgenden Schleife durchlaufen Sie

Sub AktuelleTabelleMailenOhneVerknüpfungen()Dim zelle As Range

Sheets("Tabelle1").Activate ActiveWorkbook.ActiveSheet.Copy Selection.SpecialCells(xlCellTypeFormulas).Select For Each zelle In Selection zelle.Value = zelle.Value Next zelle ActiveWorkbook.SendMail _ Recipients:="[email protected]", _ Subject:="Aktuelle Tabelle mailen" ActiveWorkbook.Close savechanges:=FalseEnd Sub

Listing 7.14: Aktive Tabelle ohne Verknüpfungen per E-Mail versenden

Page 285: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren284

genau diese Zellen und setzen die Formeln bzw. Verknüpfungen in Festwerte um, indem Siedie Anweisung

einsetzen. Wenden Sie danach die Methode SendMail an, um die E-Mail abzusenden.

7.6.5 Mehrere Dateianhänge versenden

Im nächsten Beispiel werden Sie alle Dateien eines bestimmten Verzeichnisses an einen E-Mail-Empfänger versenden.

Definieren Sie zu Beginn die benötigten Objekt-Variablen und erstellen über die MethodeCreateItem eine noch leere E-Mail. Geben Sie über die Eigenschaften Subject und Body

zelle.value=zelle.value

Sub EMailVerschickenMitAnhängen()Dim outl As ObjectDim Mail As Object Set outl = CreateObject("Outlook.Application")Set Mail = outl.CreateItem(0)With Mail .Subject = "Word-Dokumente im Anhang" .Body = "Anbei alle Dokumente aus einem Ordner" .To = "[email protected]"End WithWith Application.FileSearch .NewSearch .LookIn = "C:\Eigene Dateien" .SearchSubFolders = False .FileType = msoFileTypeWordDocuments .Execute For i = 1 To .FoundFiles.Count On Error Resume Next Mail.Attachments.Add .FoundFiles(i) Next iEnd With Mail.Display Set outl = Nothing Set Mail = NothingEnd Sub

Listing 7.15: Mehrere Dokumente per E-Mail versenden

Page 286: VBA-Programmierung fur Word, Excel und Access

Rechts7.6 E-Mails per VBA verschicken 285

an, welchen Titel und welchen Nachrichtentext die E-Mail erhalten soll. Über die EigenschaftTo bestimmen Sie den Adressaten der E-Mail.

Da Sie die einzelnen Word-Dokumente nicht einzeln von Hand in Ihre E-Mail schaufelnmöchten, nutzen Sie das Objekt FileSearch, das bereits schon erklärt wurde.

Im Objekt FoundFiles sind alle Namen der Dateien verzeichnet, die durch den Suchvor-gang gefunden werden konnten. Über die Eigenschaft Count können Sie die so ermitteltenDateien zählen. Durchlaufen Sie danach eine Schleife, in der Sie diese gefundenen Dateienüber die Methode Add als Dateianhang in Ihre E-Mail einfügen. Zeigen Sie am Ende desMakros das E-Mail-Fenster über die Eigenschaft Display an und geben danach den Speicherwieder frei, indem Sie die Objekte über die Anweisung Set outl = Nothing bzw. SetMail = Nothing entfernen.

Abb. 7.15 Mehrere Dateien in eine E-Mail packen

7.6.6 Einen Bereich versenden

Sie haben bereits erfahren, wie Sie Tabellen und Dateien per E-Mail versenden können.Möchten Sie beispielsweise aus einer Tabelle nur einen Teilbereich per E-Mail versenden,dann markieren Sie den gewünschten Bereich über eine Maske, speichern diesen Bereich alsseparate Arbeitsmappe ab und versenden die so erstellte Mappe. Das Makro, welches allediese Aufgaben für Sie erledigt, sehen Sie im nächsten Listing:

Sub VersendenBereichPerMail()Dim Empänger As StringDim Titel As StringDim n As Range

Listing 7.16: Einen Zellenbereich per E-Mail versenden

Page 287: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren286

Legen Sie den Empfänger sowie den Titel der E-Mail gleich zu Beginn des Makros über zweiKonstanten fest. Diese Lösung erleichtert es Ihnen, wenn Sie diese beiden Informationenöfters anpassen müssen. Sie müssen dann nicht im ganzen Quellcode suchen, sondern findendiese Informationen direkt zu Beginn des Makros.

Abb. 7.16 Bereich über Maske auswählen, der versendet werden soll

Empfänger = "[email protected]"Titel = "Teilbereich im Anhang"Sheets("Tabelle2").Activate Set n = Application.InputBox _ ("Wählen Sie den Bereich aus den versenden möchten", Type:=8) Range(n.Address).Select Selection.Copy Worksheets.Add ActiveSheet.Paste ActiveWorkbook.SaveAs "Bereich.xls" Application.Dialogs(xlDialogSendMail).Show Empfänger, TitelEnd Sub

Listing 7.16: Einen Zellenbereich per E-Mail versenden

Page 288: VBA-Programmierung fur Word, Excel und Access

Rechts7.6 E-Mails per VBA verschicken 287

Der Funktion InputBox müssen Sie als Argument den Typ (Type:=8) übergeben. Damitweiß Excel, dass es einen Zellenbezug im Eingabefenster anzeigen soll.

Kopieren Sie direkt im Anschluß den markierten Bereich, der im Eingabefenster angezeigtwurde. Fügen Sie dann eine neue, noch leere Arbeitsmappe über die Methode Add ein undwenden die Methode Paste an, um den kopierten Bereich dort einzufügen.

Speichern Sie sicherheitshalber die Arbeitsmappe, indem Sie die Methode SaveAs einset-zen.

Setzen Sie am Ende des Makros einen integrierten Excel-Dialog ein, dem Sie die Empfänger-E-Mail-Adresse sowie den Titel der E-Mail übergeben.

7.6.7 Auf Outlook-Funktionen zugreifen

Wenn Sie mit Outlook-Funktionen arbeiten möchten und dabei auf die Hilfe-Funktionzugreifen, um mehr über die einzelnen Befehl zu erfahren, dann sollten Sie die Outlook-VBA-Bibliothek einbinden. Um auf die Outlook-Funktion zugreifen zu können, gehen Siewie folgt vor:

• Wechseln Sie über die Tastenkombination (Alt) + (F11) in die Entwicklungsumgebungvon Excel.

• Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.

Abb. 7.17 Die Objektbibliothek für Outlook aktivieren

• Aktivieren Sie die Bibliothek MICROSOFT OUTLOOK 10.0 OBJECT LIBRARY.

• Bestätigen Sie Ihre Einstellung mit OK.

Page 289: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren288

7.6.8 Eine Sammel-E-Mail erstellen

Im folgenden Beispiel werden Sie eine Tabelle mit E-Mail-Adressen dazu verwenden, umeine Sammel-E-Mail zu versenden. Dabei soll eine Einladung per E-Mail versendet werden.Dazu legen Sie sich eine Textdatei namens EINLADUNG.TXT an, schreiben den Text für IhreEinladung und speichern sie im Verzeichnis C:\Eigene Dateien.

Abb. 7.18 Der Einladungstext

Nach der Erfassung des Textes für die Einladung legen Sie eine Tabelle nach folgendem Vor-bild an.

Abb. 7.19 Die Tabelle mit den Gästen

Page 290: VBA-Programmierung fur Word, Excel und Access

Rechts7.6 E-Mails per VBA verschicken 289

Nachdem Sie sowohl den Einladungstext (in der Textdatei) sowie die Adressen der Gäste (inder Tabelle) haben, können Sie jetzt das Makro programmieren, welches die Textdatei in eineE-Mail kopiert und an alle Gäste versendet. Der Code für diese Lösung lautet:

Aktivieren Sie im ersten Schritt die Tabelle, auf der die Adressen der Gäste erfasst wurden.Danach öffnen Sie die Textdatei EINLADUNG.TXT und lesen diese zeilenweise in den String sein. Diesen übertragen Sie danach in ein E-Mail-Fenster. Dieses Fenster erzeugen Sie überdie Methode CreateItem, der Sie das Argument 0 übergeben. Hängen Sie am Ende der E-Mail die Textdatei zusätzlich noch als Dateianhang an, indem Sie die Methode Add auf dasObjekt Attachments anwenden.

Sub EinladungVersenden()Sheets("Tabelle3").ActivateRange("A2").SelectDim outl, Mail As ObjectDim textzeile as stringDim s as String

Application.DisplayAlerts = FalseSet outl = CreateObject("Outlook.Application")

Sheets("Tabelle3").ActivateRange("A2").SelectOpen "C:\Eigene Dateien\Einladung.txt" For Input As #1Do Until ActiveCell.Value = ""Set Mail = outl.CreateItem(0)Mail.Subject = "Einladung"Do While Not EOF(1) Line Input #1, textzeile s = s & Chr(13) & textzeileLoop Mail.Body = "Liebe(r) " & ActiveCell.Offset(0, 1).Value _ & Chr(13) & s Mail.To = ActiveCell.Value Mail.Attachments.Add "d:\Eigene Dateien\Einladung.txt" Mail.Display 'Mail.Send Set Mail = NothingActiveCell.Offset(1, 0).SelectLoopClose #1Set outl = NothingEnd Sub

Listing 7.17: Eine Serien-E-Mail aus Excel versenden

Page 291: VBA-Programmierung fur Word, Excel und Access

Links

7 »Internette« Funktionen in Office programmieren290

Abb. 7.20 Diese Einladung wird an alle Gäste versendet

Page 292: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang291

8 VBE-Programmierung in Office

Unter der VBE-Programmierung versteht man den Zugriff auf die Entwicklungsumgebung inVBA. Damit können Sie beispielsweise ermitteln, welche Module in Ihren VBA-Projektenenthalten sind. Diese Module, UserForms oder sonstige VBE-Bestandteile können Sie desweiteren exportieren bzw. importieren. Ferner können Sie benötigte VBA-Bibliotheken ele-gant per Makro einbinden und vieles mehr. Dieses klassische Thema wird anhand einigerBeispiele in Word beschrieben.

8.1 Die Voraussetzung

Möchten Sie VBE-Programmieren, dann müssen Sie ab der XP-Office-Version eine sehrwichtige Einstellung vornehmen. Gehen Sie dazu wie folgt vor:

• Wählen Sie aus dem Menü EXTRAS den Befehl MAKRO/SICHERHEIT.

• Wechseln Sie auf die Registerkarte VERTRAUENSWÜRDIGE QUELLEN.

Abb. 8.1 Vertrauenswürdige Quellen aktivieren

Hinweis:

Die folgenden Makros können Sie auf www.buch.cd im Verzeichnis Kap08 unter demNamen VBE.doc finden.

Page 293: VBA-Programmierung fur Word, Excel und Access

Links

8 VBE-Programmierung in Office292

• Aktivieren Sie das Kontrollkästchen ZUGRIFF AUF VISUAL BASIC-PROJEKT VERTRAUEN.

• Bestätigen Sie mit OK.

Erst nach dieser Einstellung können Sie die Programmierung mit VBE beginnen.

8.2 Bibliotheken einbinden

Die VBE-Programmierung ist seit der Office-Version 97 möglich. Dazu benötigen Sie dieObjektbibliothek MICROSOFT VISUAL BASIC FOR APPLICATION EXTENSIBILITY 5.3. Diesebinden Sie ein, indem Sie in der Entwicklungsumgebung aus dem Menü EXTRAS den BefehlVERWEISE wählen.

Abb. 8.2 Zusätzliche Bibliotheken einbinden

Im Listenfeld VERWEISE – PROJECT aktivieren Sie im Listenfeld VERFÜGBARE VERWEISE dieBibliothek MICROSOFT VISUAL BASIC FOR APPLICATION EXTENSIBILITY 5.3 und bestätigenmit OK.

Verweise können Sie selbstverständlich auch über den Einsatz eines VBA-Makros setzenbzw. entfernen. Dazu brauchen Sie aber noch einige Informationen darüber.

Page 294: VBA-Programmierung fur Word, Excel und Access

Rechts8.2 Bibliotheken einbinden 293

8.2.1 Gesetzte Verweise ermitteln

Das folgende Makro schreibt diese Informationen in eine Tabelle eines neuen Word-Doku-ments.

Über die Eigenschaft Name können Sie den Namen des Verweises erfahren. Die EigenschaftGuid gibt einen Wert vom Typ String zurück, der die Klassen-ID eines Objekts enthält. Beider 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 Hauptversionsnummerder Klassenbibliothek, auf die verwiesen wird, enthält. Das Argument Minor gibt einen Wertvom Typ Long zurück, der die Nebenversionsnummer der Klassenbibliothek, auf die verwie-sen wird, anzeigt. Beide Nummern sind notwendig, um die Bibliothek richtig zu adressieren.Anhand dieser beiden Nummern kann in der Registrierung der hinzuzufügende Verweisermittelt werden.

Sub GesetzteVerweiseAbfragen()Dim ref As ReferenceDim Tabelle As TableDim NeuDoku As DocumentDim i As Integer

On Error Resume NextSet NeuDoku = Documents.AddSet Tabelle = NeuDoku.Tables.Add(Selection.Range, 20, 4)i = 1With Tabelle .Cell(i, 1).Range.InsertAfter "Verweis" .Cell(i, 2).Range.InsertAfter "GUID" .Cell(i, 3).Range.InsertAfter "Major" .Cell(i, 4).Range.InsertAfter "Minor"End WithFor Each ref In Application.VBE.ActiveVBProject.References With Tabelle .Cell(i + 1, 1).Range.InsertAfter ref.Name .Cell(i + 1, 2).Range.InsertAfter ref.GUID .Cell(i + 1, 3).Range.InsertAfter ref.Major .Cell(i + 1, 4).Range.InsertAfter ref.Minor i = i + 1 End WithNext refEnd Sub

Listing 8.1: Die gesetzten Verweise in eine Tabelle schreiben

Page 295: VBA-Programmierung fur Word, Excel und Access

Links

8 VBE-Programmierung in Office294

Abb. 8.3 Alle gesetzten Verweise ermitteln

8.2.2 Die VBE-Bibliothek einbinden

Möchten Sie die Bibliothek MICROSOFT VISUAL BASIC FOR APPLICATION EXTENSIBILITY 5.3per Makro einbinden, starten Sie foglendes Makro:

Sub AktivierenVBE()Dim VBEobj As Object

On Error Resume NextVBEobj = Application.VBE.ActiveVBProject.References. _AddFromGuid("{0002E157-0000-0000-C000-000000000046}", 5, 3)End Sub

Listing 8.2: Die VBE-Bibliothek einbinden

Page 296: VBA-Programmierung fur Word, Excel und Access

Rechts8.2 Bibliotheken einbinden 295

Die Methode AddFromGuid fügt der References-Auflistung einen Verweis hinzu, wobeider global eindeutige Bezeichner (GUID) des Verweises verwendet wird. Die komplette Syn-tax lautet:

8.2.3 Die VBE-Bibliothek entladen

Selbstverständlich können Sie einmal gesetzte Verweise auf Bibliotheken auch wiederzurücknehmen. Im folgenden Makro wird die Bibliothek MICROSOFT VISUAL BASIC FOR

APPLICATION EXTENSIBILITY 5.3 entladen:

Mithilfe der Methode Remove entfernen Sie den Verweis auf die eingebundene Bibliothekaus dem aktiven Dokument.

8.2.4 Bibliotheksinfos schreiben

Um zu sehen, welche Verweise auf Bibliotheken in Ihrem Dokument gesetzt sind, wie dieBibliotheken heißen und wo diese gespeichert sind, wenden Sie das folgende Makro an:

AddFromGuid(GUID, Major, Minor) As Reference

Sub DeaktivierenVBE()Dim VBEObj As Object

On Error Resume Next Set VBEObj = Application.VBE.ActiveVBProject.References VBEObj.Remove VBEObj("VBIDE")End Sub

Listing 8.3: Die VBE-Bibliothek entladen

Sub BibliothekenInfosSchreiben()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 _

Listing 8.4: Bibliotheksinformationen im Direktfenster ausgeben

Page 297: VBA-Programmierung fur Word, Excel und Access

Links

8 VBE-Programmierung in Office296

Neben dem Objektnamen jeder eingebundenen Bibliothek geben Sie zusätzlich auch noch diegenaue Bezeichnung sowie den Speicherort der Bibliothek im Direktfenster aus.

Abb. 8.4 Informationen über eingebundene Bibliotheken ausgeben

8.3 Die VBE-Komponenten

Um mehr über die einzelnen VBE-Komponenten zu erfahren, können Sie nach dem Einbin-den der Bibliothek MICROSOFT VISUAL BASIC FOR APPLICATION EXTENSIBILITY 5.3 mehrerfahren. Dazu rufen Sie in der Entwicklungsumgebung den Objektkatalog auf, indem Sie dieTaste (F2) drücken. Danach stellen Sie im ersten Dropdown den Eintrag VBIDE ein.

& Chr(13) & "Name: " & _ Verweis.Name & Chr(13) & Chr(13) Next VerweisEnd Sub

Listing 8.4: Bibliotheksinformationen im Direktfenster ausgeben

Page 298: VBA-Programmierung fur Word, Excel und Access

Rechts8.3 Die VBE-Komponenten 297

Abb. 8.5 Die VBE-Bibliothek ansehen

Das VBE-Objekt hat mehrere Auflistungsobjekte und Eigenschaften für den Zugriff auf dieeinzelnen Elemente. Unter anderem sind dies folgende:

• VBProjects: In diesem Auflistungsobjekt sind alle geöffneten Projekte in der Entwick-lungsumgebung verzeichnet.

• AddIns: Sie regelt den Zugriff auf die Auflistung der Add-Ins.

• Windows: Stellt Methoden und Eigenschaften für den Zugriff auf die Fenster, wie z.B.Projekt- und Eigenschaftenfenster, bereit.

• CodePanes: Ist für den Zugriff auf die geöffneten Code-Bereiche eines Projekts verant-wortlich.

• CommandBars: Kümmert sich um den Zugriff auf die Auflistung der Befehlsleisten.

• Events: Liefert alle Eigenschaften, die Add-Ins eine Verbindung zu allen Ereignissen inVisual Basic für Applikationen ermöglichen.

• Version: Gibt einen Wert vom Typ String zurück, der die Version von Visual Basic fürApplikationen enthält, die von der Anwendung verwendet wird.

Page 299: VBA-Programmierung fur Word, Excel und Access

Links

8 VBE-Programmierung in Office298

8.4 VBE-Komponenten auflisten

Möchten Sie wissen, welche VBE-Komponenten in Ihrem Dokument enthalten sind, dannkönnen Sie dies in Erfahrung bringen, indem Sie die Eigenschaft VBCompontents einsetzen.Diese Eigenschaft liefert Ihnen eine Auflistung der in einem Projekt enthaltenen Komponen-ten zurück. Diese Komponenten sollen jetzt in einem Listenfeld einer UserForm angezeigtwerden. Zeichnen Sie nun eine UserForm nach folgendem Vorbild:

Abb. 8.6 Die UserForm soll die Komponenten anzeigen

Führen Sie jetzt einen Doppelklick auf die Optionsschaltfläche MODULE durch und erfassendas nächste Makro:

Löschen Sie im ersten Schritt das Listenfeld mithilfe der Methode Clear. Durchlaufen Siedanach eine Schleife, in der Sie alle Komponenten der Entwicklungsumgebung abarbeiten.Prüfen Sie, ob es sich um ein Modul handelt. In diesem Fall meldet die Eigenschaft Type denWert 1. Fügen Sie dann den Namen der Komponenten im Listenfeld ein, indem Sie dieMethode AddItem einsetzen. Übergeben Sie dieser Methode die Eigenschaft Name, um denNamen der Komponente zu ermitteln.

Private Sub OptionButton1_Click()Dim VBkomp As VBComponent

UserForm1.ListBox1.Clear For Each VBkomp In ThisDocument.VBProject.VBComponents If VBkomp.Type = 1 Then _ UserForm1.ListBox1.AddItem VBkomp.Name Next VBkompEnd Sub

Listing 8.5: Module ermitteln

Page 300: VBA-Programmierung fur Word, Excel und Access

Rechts8.4 VBE-Komponenten auflisten 299

Sorgen Sie jetzt dafür, dass auch die UserForms im Listenfeld angezeigt werden. Führen Siedaher einen Doppelklick auf die Optionsschaltfläche USERFORM durch und erfassen folgen-des Makro:

Löschen Sie im ersten Schritt das Listenfeld mithilfe der Methode Clear. Durchlaufen Siedanach eine Schleife, in der Sie alle Komponenten der Entwicklungsumgebung abarbeiten.Prüfen Sie, ob es sich um eine UserForm handelt. In diesem Fall meldet die Eigenschaft Typeden Wert 3. Fügen Sie dann den Namen der Komponenten im Listenfeld ein, indem Sie dieMethode AddItem einsetzen.

Öffnen Sie nun die UserForm, indem Sie das folgende Makro starten.

Abb. 8.7 Alle Module werden im Listenfeld angezeigt

Private Sub OptionButton2_Click()Dim VBkomp As VBComponent

UserForm1.ListBox1.Clear For Each VBkomp In ThisDocument.VBProject.VBComponents If VBkomp.Type = 3 Then _ UserForm1.ListBox1.AddItem VBkomp.Name Next VBkompEnd Sub

Listing 8.6: UserForms ermitteln

Sub UserFormStarten() UserForm1.ShowEnd Sub

Listing 8.7: UserForm starten

Page 301: VBA-Programmierung fur Word, Excel und Access

Links

8 VBE-Programmierung in Office300

8.5 VBE-Komponenten entfernen

Die gerade erstellte UserForm können Sie einsetzen, um einzelne VBE-Komponenten zulöschen, ohne in die Entwicklungsumgebung wechseln zu müssen. Führen Sie einen Doppel-klick auf die Schaltfläche VBE-KOMPONENTE LÖSCHEN durch und erfassen folgendesMakro:

Mit der Methode Remove können Sie eine VBE-Komponente löschen. Die On Error-Anweisung verhindert einen Makroabsturz, wenn die VBE-Komponente nicht gefunden wer-den kann, weil es eventuell bereits gelöscht wurde. Nach dem Entfernen der VBE-Kompo-nenten aus der Entwicklungsumgebung müssen Sie den entsprechenden Eintrag auch ausdem Listenfeld entfernen. Dazu setzen Sie die Methode RemoveItem ein und übergeben die-ser Methode den gerade markierten Eintrag im Listenfeld.

8.6 VBE-Komponenten exportieren

Möchten Sie Ihren Quellcode sichern, indem Sie diesen in einer Textdatei speichern, dannkönnen Sie ebenfalls die vorher eingefügte UserForm einsetzen. Führen Sie einen Doppel-klick auf die Schaltfläche VBE-KOMPONENTE EXPORTIEREN durch und erfassen Sie das fol-gende Makro:

Private Sub CommandButton1_Click() On Error Resume Next With ThisWorkbook.VBProject .VBComponents.Remove .VBComponents(ListBox1.Value) End With MsgBox "Die VBE-Komponente wurde entfernt!" ListBox1.RemoveItem (ListBox1.ListIndex)End Sub

Listing 8.8: VBE-Komponente löschen

Private Sub CommandButton2_Click()Dim VBkomp As Object

On Error Resume NextChDir "C:\"Set VBkomp = ThisWorkbook.VBProject.VBComponents(ListBox1.Value)With VBkomp .Export ListBox1.Value & "_" & Date & ".txt"

Listing 8.9: VBE-Komponente exportieren

Page 302: VBA-Programmierung fur Word, Excel und Access

Rechts8.7 VBE-Komponenten importieren 301

Mit der Methode Export sichern Sie eine VBE-Komponente als Textdatei. Im Falle, dass Sieeine UserForm sichern, wird zusätzlich zur Textdatei eine Datei mit der Endung FRX gespei-chert, die Informationen über den Aufbau der UserForm enthält. Als Dateinamen für dieSicherung verwenden Sie den Namen der VBE-Komponenten und hängen das aktuelleDatum über die Funktion Date dran.

Abb. 8.8 Ein exportiertes Modul in einer Textdatei

8.7 VBE-Komponenten importieren

Nach dem Export von VBE-Komponenten haben Sie natürlich auch die Möglichkeit, einenQuellcode als neues Modul in Ihre Entwicklungsumgebung einzufügen. Sehen Sie sich jetzteinmal das folgende Makro an:

End With

MsgBox "Die VBE-Komponente wurde exportiert!"End Sub

Sub ModulAusTextdateiImportieren()Dim VBKomp As VBComponentDim CodeModul As CodeModuleDim i As IntegerConst ImportDat = "D:\Modul1_02.07.2002.txt"

Set VBKomp = _

Listing 8.10: VBE-Komponente importieren

Listing 8.9: VBE-Komponente exportieren

Page 303: VBA-Programmierung fur Word, Excel und Access

Links

8 VBE-Programmierung in Office302

Die Methode Add verwendet die Konstante vbext_ct_StdModule, welche ein normalesModul repräsentiert. Selbstverständlich können Sie ebenso Klassenmodule und UserFormsüber diese Methode in Ihr Projekt einfügen. Entnehmen Sie dazu die notwendigen Konstan-ten der folgenden Tabelle.

Die Methode AddFromFile setzen Sie ein, um den Quellcode aus der Textdatei in das neueingefügte Modul einzufügen. Dabei ist entscheidend, welcher Eintrag in der ersten Zeile derTextdatei steht. Dieser Eintrag wird bei der Umbenennung des Moduls NEUESMODUL heran-gezogen.

Eine weitere Möglichkeit. ein Makro in ein bestehendes Modul einzufügen ist, wenn Sie dieeinzelnen Zeilen des Makros eine nach der anderen einfügen. Bei der folgenden Lösung wirddas Makro WerBinIch Zeile für Zeile in ein bestehendes Modul eingefügt.

ThisDocument.VBProject.VBComponents.Add _ (vbext_ct_StdModule) VBKomp.Name = "NeuesModul" Application.Visible = True

Set CodeModul = _ ThisDocument.VBProject.VBComponents _ ("NeuesModul").CodeModuleWith CodeModul .AddFromFile ImportDat End WithEnd Sub

Konstante Erklärung

vbext_ct_ClassModule fügt der Auflistung ein Klassenmodul hinzuVbext_ct_MSForm fügt der Auflistung ein Formular hinzuVbext_ct_StdModule fügt der Auflistung ein Standardmodul hinzu

Sub MakroZeilenweiseHinzufügen()Dim CodeModul As CodeModuleDim i As Integer

Set CodeModul = _ ThisDocument.VBProject.VBComponents _

Listing 8.11: Makro zeilenweise einfügen

Listing 8.10: VBE-Komponente importieren

Page 304: VBA-Programmierung fur Word, Excel und Access

Rechts8.7 VBE-Komponenten importieren 303

Im Makro wird Zeile um Zeile übertragen. Die Eigenschaft CountOfLines ermittelt, wieviele 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. DieFunktion Chr(13) sorgt jeweils für den Zeilenvorschub. Die Eigenschaft UserName gibt denaktuellen Benutzer des Dokuments zurück.

Abb. 8.9 Ein Makro Zeile für Zeile einfügen

("Modul8").CodeModule With CodeModul i = .CountOfLines + 1 .InsertLines i, _ "Sub WerBinIch()" & Chr(13) & _ " Msgbox ""Ich bin der Anwender " & _ Application.UserName & "!"" " & Chr(13) & _ "End Sub" End WithEnd Sub

Listing 8.11: Makro zeilenweise einfügen

Page 305: VBA-Programmierung fur Word, Excel und Access

Links

8 VBE-Programmierung in Office304

8.8 Alle VBE-Komponenten aus Dokument entfernen

Wie Sie einzelne Module und UserForms aus dem Dokument entfernen, wissen Sie bereits.Wie aber gehen Sie vor, wenn Sie alle Makros und UserForms aus einem Dokument löschenmöchten. Um diese Aufgabe zu lösen, starten Sie das Makro aus dem folgenden Listing:

Im ersten Schritt prüfen Sie, ob Sie die Version Word 97 oder höher verwenden. Wenn diesder Fall ist, löschen Sie zuerst die Module und Klassenmodule sowie die UserForms. DieEigenschaft Type meldet in diesen Fällen die Rückgabewerte 1, 2 oder 3. Mithilfe der Eigen-schaft CountOfLines ermitteln Sie die Anzahl der Zeilen, die in einem Modul enthalten sind.Danach prüfen Sie, ob im untersuchten Modul überhaupt Code enthalten ist. Wenn ja, wirdein Wert größer Null gemeldet. In diesem Fall wenden Sie die Methode DeleteLines an,um die vorher ermittelte Anzahl der Zeilen zu entfernen.

Sub MakrosUndUserFormsAusDokumentEntfernen()Dim CodeObj As ObjectIf Val(Application.Version) >= 8 Then With ActiveDocument.VBProject For Each CodeObj In .VBComponents Select Case CodeObj.Type Case 1, 2, 3 .VBComponents.Remove CodeObj Case Else With CodeObj.CodeModule If .CountOfLines > 0 Then .DeleteLines 1, .CountOfLines End If End With End Select Next CodeObj End WithEnd IfEnd Sub

Listing 8.12: Makros und UserForms aus Dokument entfernen

Hinweis:

Nach dem Starten des gerade vorgestellten Makros ist sämtlicher Code im Dokument ver-schwunden. Sie haben keine Möglichkeit, diese Aktion rückgängig zu machen. Wenn Sieaber das Dokument ohne zu speichern verlassen und anschließend wieder öffnen, könnenSie diese Funktion ohne Gefahr testen.

Page 306: VBA-Programmierung fur Word, Excel und Access

Rechts8.9 VBE aufrufen 305

8.9 VBE aufrufen

Standardmäßig drücken Sie die Tastenkombination (Alt) + (F11), um in die Entwickungs-umgebung zu gelangen. Diesen Vorgang können Sie aber auch über ein Makro durchführen,welches Sie im nächsten Listing sehen können.

8.10 Codezeilen auflisten

Im letzten Beispiel in diesem Kapitel lernen Sie eine Lösung kennen, mit der Sie den Quell-text von Modulen in einem Listenfeld anzeigen lassen können. Entwerfen Sie dazu zuerst ein-mal eine UserForm nach folgendem Aufbau:

Abb. 8.10 Die Code-Browser-UserForm

Sub VBEAufrufen()With Application.VBE.MainWindow .SetFocus .Visible = TrueEnd WithEnd Sub

Listing 8.13: Entwicklungsumgebung aufrufen

Page 307: VBA-Programmierung fur Word, Excel und Access

Links

8 VBE-Programmierung in Office306

Führen Sie jetzt einen Doppelklick auf eine freie Fläche der UserForm durch und erfassen dasfolgende Ereignis-Makro, welches ausgeführt wird, sobald die UserForm geladen wird.

Durchlaufen Sie in einer Schleife alle VB-Komponenten und überprüfen Sie, ob es sich dabeium Module handelt. Wenn ja, fügen Sie diese über die Methode AddItem in das Listenfeldein.

Der dazugehörige Quellcode des Moduls, welches Sie im Listenfeld anklicken, soll im dar-unter liegenden Listenfeld angezeigt werden. Bei jeder Änderung im Listenfeld LISTBOX1muss die darunter liegende LISTBOX2 aktualisiert werden. Um diesen Automatismus einzu-stellen, führen Sie einen Doppelklick auf das Listenfeld LISTBOX1 durch und erfassen fol-gendes Makro:

Private Sub UserForm_Initialize()Dim VBKomp As VBComponent

UserForm2.ListBox1.Clear For Each VBKomp In ThisDocument.VBProject.VBComponents If VBKomp.Type = 1 Then _ UserForm2.ListBox1.AddItem VBKomp.Name Next VBKompEnd Sub

Listing 8.14: Das Listenfeld mit Modulnamen füllen

Private Sub ListBox1_Change()Dim s As StringDim i As Integer

UserForm2.ListBox2.Clear With Application.VBE.ActiveVBProject. _ VBComponents(ListBox1.Value).CodeModule For i = 1 To .CountOfLines s = .Lines(i, 1) If Len(s) > 0 Then ListBox2.AddItem s If s = "End Sub" Then ListBox2.AddItem s2 End If Next iEnd WithEnd Sub

Listing 8.15: Makroinhalte im Listenfeld anzeigen

Page 308: VBA-Programmierung fur Word, Excel und Access

Rechts8.10 Codezeilen auflisten 307

Mithilfe der Eigenschaft CodeModule gewinnen Sie Zugriff auf den eigentlichen Code. Überdie Eigenschaft CountOfLines zählen Sie die verwendeten Codezeilen und übertragen diesein das Listenfeld LISTBOX2, indem Sie die Methode AddItem einsetzen.

Abb. 8.11 Die Codezeilen werden angezeigt

Page 309: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 310: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang309

9 Excel-Programmierung

In diesem Kapitel wird auf die Programmierung in Excel näher eingegegangen. Angefangenvon der kleinsten Einheit in Excel, der Zelle, bis hin zur Programmierung von Arbeitsmappenlernen Sie anhand praktischer Beispiele den Umgang mit der Datenverarbeitung in Excel.

9.1 Zellen programmieren

In Excel haben Sie pro Zeile 256 Spalten zur Verfügung. Insgesamt kommen Sie bei Excel-Tabellen maximal auf 65.536 Zeilen. In den wenigsten Fällen werden Sie diese Kapazitäts-grenzen sprengen, meistens reichen schon ca. hundert Zeilen und 12 bis 15 Spalten.

9.1.1 Zellen ansprechen

Alle Zellen können in Excel durch die Eigenschaft Range angesprochen und gefüllt werden.Innerhalb dieser Eigenschaft geben Sie die Adresse der Zelle an, auf die Sie zugreifen möch-ten. So markieren Sie mithilfe der Anweisung Range("A1").Select die Zelle A1. Selbst-verständlich können Sie mithilfe der Eigenschaft Range auch einen ganzen Bereich markie-ren. In diesem Fall lautet die Anweisung dafür: Range("A1:D10").Select

In beiden Fällen erfolgt eine Markierung auf absoluter Basis, d.h.; Sie haben damit ganzbestimmte Zellen in Ihrer Tabelle angesprochen und markiert. Im folgenden Beispiel werdenSie ausgehend von der aktiven Zelle weitere Zellen markieren.

Hinweis:

Die folgenden Makros können Sie auf www.buch.cd im Verzeichnis Kap09 unter demNamen EXCELDEMOS.XLS finden.

Sub RealtiveMarkierungSetzen()Sheets("Tabelle1").ActivateRange("A1").SelectRange(ActiveCell, ActiveCell.Offset(2, 3)).SelectEnd Sub

Listing 9.1: Eine relative Markierung ausgehend von einer Zelle vornehmen

Page 311: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung310

Um die relative Markierung in der Tabelle vorzunehmen, setzen Sie die Eigenschaft Rangeein. Im ersten Argument geben Sie die aktive Zelle als Startmarkierung an. Im zweiten Argu-ment setzen Sie die Eigenschaft Offset ein. Die Eigenschaft Offset hat zwei Argumente.Das erste Argument gibt die Verschiebung der Markierung nach links bzw. nach rechts an.Hierdurch bewegen Sie sich also innerhalb einer Zeile. Das zweite Argument gibt die Ver-schiebung des Mauszeigers nach oben bzw. unten an. Hier navigieren Sie innerhalb einerSpalte. Da die momentane Markierung (Zelle A1) um zwei Zeilen weiter nach unten erweitertwerden soll, setzen Sie das erste Argument (Zeilenverschiebung) auf den Wert 2. Um dieMarkierung um 3 Spalten weiter nach rechts zu erweitern, setzen Sie das zweite Argumentauf den Wert 3.

Abb. 9.1 Eine relative Markierung vornehmen

Hinweis:

Sie können übrigens auch negative Werte angeben. So wird im folgenden Beispiel, ausge-hend von der Zelle D10 die Markierung C5:D10 eingestellt. Diese Markierung stellen Siedurch das folgende Makro ein:

Sub RealtiveMarkierungSetzen2()Sheets("Tabelle1").ActivateRange("D10").SelectRange(ActiveCell, ActiveCell.Offset(-5, -1)).SelectEnd Sub

Listing 9.2: Eine relative Markierung mit negativen Werten vornehmen

Page 312: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 311

Abb. 9.2 Negatives Zellen-Offset

Mehrere Bereiche schnell markieren

Möchten Sie mehrere Bereich einer Tabelle markieren, dann empfiehlt es sich, diese Teilbe-reiche zu definieren, zu einem Gesamtbereich zusammenzufassen und diesen dann in einemSchritt zu markieren. Im folgenden Beispiel werden die Teilbereiche A1:A5, C2:C6, E1:E5und F2:F6 markiert. Das dazugehörige Makro lautet:

Hinweis:

Achten Sie bei dieser Art von Programmierung darauf, dass Sie keinen negativen Werteingeben, der über die Tabellengrenzen hinausgeht. So können Sie beispielsweise keinennegativen Zellen-Offset einstellen, der auf eine Zeile <1 oder >65536 bzw. einen Spalten-Offset, der auf eine Spalte <1 oder >256 hinweist.

Sub MehrereBereicheMarkieren()Dim Bereich1 As RangeDim Bereich2 As RangeDim Bereich3 As RangeDim Bereich4 As RangeDim GB As Range

Listing 9.3: Mehrere Bereiche markieren

Page 313: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung312

Deklarieren Sie zu Beginn des Makros die verwendeten Variablen und geben mithilfe derAnweisung Set die gewünschten Koordinaten an. Danach vereinen Sie die einzelnen Berei-che mithilfe der Methode Union in einen Gesamtbereich mit dem Namen GB. DiesenGesamtbereich können Sie dann in einem Arbeitsgang mit der Methode Select markieren.

Abb. 9.3 Mehrere Bereiche definieren und zu einem Gesamtbereich zusammenführen

Ausgesuchte Zellen markieren

Um ganz schnell an eine bestimmte Stelle in der Tabelle zu springen, können Sie neben derMethode Select auch noch die Methode Activate verwenden. Dieser Methode geben Siedann noch an, welche Zelle Sie ansteuern möchten. Angefangen von der letzten Zelle einerSpalte über Zellen mit Kommentaren und Gültigkeitsregeln haben Sie dabei diverse Einsatz-

Sheets("Tabelle1").Activate Set Bereich1 = Range("A1:A5") Set Bereich2 = Range("C2:C6") Set Bereich3 = Range("E1:E5") Set Bereich4 = Range("F2:F6") Set GB = Union(Bereich1, Bereich2, Bereich3, Bereich4) GB.SelectEnd Sub

Listing 9.3: Mehrere Bereiche markieren

Page 314: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 313

möglichkeiten. Das folgende Makro markiert beispielsweise alle Zellen einer Tabelle, dieFormeln oder Verknüpfungen enthalten.

Über die Eigenschaft Cells wenden Sie die Suche nach Formeln auf alle Zellen in derTabelle an. Die Methode SpecialCells, der Sie die Konstante xlCellTypeformulasübergeben, ermitteln Sie alle Formelzellen in der Tabelle. Mit der Methode Activate mar-kieren Sie dann die gerade ermittelten Zellen.

Abb. 9.4 Alle Formelzellen wurden markiert

Der Methode SpecialCells können Sie aber noch weitere Konstanten mitgeben, umbestimmte Zellen anzusteuern. Entnehmen Sie diese Möglichkeiten der folgenden Tabelle.

Sub ZellenMitFormelnMarkieren()Sheets("Tabelle2").ActivateOn Error GoTo fehlerActiveSheet.Cells.SpecialCells(xlCellTypeFormulas).ActivateExit Subfehler:MsgBox "Es gibt keine Formeln in der Tabelle"End Sub

Listing 9.4: Alle »Formelzellen« einer Tabelle markieren

Page 315: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung314

9.1.2 Zellen benennen

In Excel haben Sie die Möglichkeit, Zellen bzw. ganze Zellbereiche zu benennen. Damitbrauchen Sie die Zellen nicht mehr über die Zellkoordinaten anzusprechen, sondern übereinen eindeutigen Namen. Bei der Wahl eines Namens müssen Sie sich an bestimmte Kon-ventionen halten. So muss zum Beispiel das erste Zeichen eines Namens immer ein Buch-stabe oder auch ein Unterstrich sein. Ebenso darf der von Ihnen gewählte Name keine Leer-zeichen enthalten. Die Länge des Namens darf nicht länger als 255 Zeichen sein.

Im folgenen Beispiel werden die Zellen B11 und D11 der TABELLE2 benannt. Die Lösungsehen Sie im folgenden Listing:

Definieren Sie zunächst einmal einen Zellbereich und speichern ihn in der VariablenBereich1 ab. Danach legen Sie den Namen für den Zellenbereich fest, indem Sie dieMethode Add einsetzen. Dabei hat diese Methode die folgenden Argumente. Im ArgumentName geben Sie den von Ihnen gewünschten Namen in Anführungsstrichen an. Im Argument

Konstante Beschreibung

xlCellTypeAllFormatConditions markiert alle formatierten Zellen

xlCellTypeAllValidation markiert alle Zellen mit Gültigkeitsregeln

xlCellTypeBlanks markiert alle leeren Zellen

xlCellTypeConstants markiert alle Zellen mit Festwerten (Konstanten)

xlCellTypeFormulas markiert alle Zellen, die Formeln oder Verknüpfungen enthalten

xlCellTypeLastCell markiert die letzte belegte Zelle im genutzten Bereich

xlCellTypeVisible markiert alle sichtbaren Zellen in einer Tabelle.

Sub ZellenBenennen()Dim Bereich1 As RangeDim Bereich2 As Range

Set Bereich1 = Sheets("Tabelle2").Range("B11") ActiveWorkbook.Names.Add _ Name:="BruttoSumme", _ RefersTo:=Bereich1, Visible:=True Set Bereich2 = Sheets("Tabelle2").Range("D11") ActiveWorkbook.Names.Add _ Name:="NettoSumme", _ RefersTo:=Bereich2, Visible:=True

Set Gesamtb = Union(Bereich1, Bereich2)Gesamtb.SelectEnd Sub

Listing 9.5: Bestimmte Zellen benennen

Page 316: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 315

RefersTo geben Sie an, für welchen Zellenbereich der Name gelten soll. Das ArgumentVisible bestimmt, ob der Name für den Anwender sichtbar sein soll, d.h., wenn Sie denBefehl NAME / DEFINIEREN aus dem Menü EINFÜGEN wählen, werden dort nur Namen ange-zeigt, bei denen dieses Argument auf den Wert True gesetzt wurde. Da es sich bei dieser Ein-stellung um einen Standardwert handelt, können Sie dieses Argument auch weglassen. In derPraxis wird mit versteckten Namen gearbeitet, wenn es darum geht, die Vorteile der Benen-nung von Zellbereichen für die Programmierung zu nützen, ohne dem Anwender die Mög-lichkeit zu geben, versehentlich diese Namen zu ändern bzw. zu löschen.

Abb. 9.5 Zellen benennen

Namen löschen

Möchten Sie alle verwendeten Namen einer Arbeitsmappe löschen, können Sie diesen Vor-gang am schnellsten über ein Makro durchführen. Das Makro für diese Aufgabe sehen Sie imfolgenden Listing:

Sub VerwendeteNamenLöschen()Dim VerwNamen As Object

For Each VerwNamen In _ ActiveWorkbook.Names VerwNamen.Delete NextEnd Sub

Listing 9.6: Alle Namen einer Arbeitsmappe löschen

Page 317: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung316

Definieren Sie im ersten Schritt eine Objektvariable. Danach wenden Sie die AuflistungNames an, in der alle Namen der Arbeitsmappe verzeichnet sind. Setzen Sie mithilfe dieserAuflistung eine Schleife auf. Innerhalb der Schleife löschen Sie mit der Methode Delete alleNamen.

9.1.3 Formeln einsetzen

Wenn Sie mit Excel arbeiten, haben Sie Zugriff auf die Tabellenfunktionen, die Sie elegantüber den Funktionsassistenten in Ihre Tabelle einfügen können. Alle diese Funktionen stehenIhnen auch in der VBA-Programmierung zur Verfügung.

Abb. 9.6 Zugriff auf die Tabellenfunktionen von Excel herstellen

Mithilfe der Eigenschaft WorksheetFunction können Sie auf alle in Excel verfügbarenTabellenfunktionen zugreifen. Allerdings sind diese angebotenen Funktionen in Englisch.Sie haben somit möglicherweise etwas Probleme mit der Identifikation dieser Funktionen.Abhilfe dagegen schafft eine Arbeitsmappe, die Sie im Office-Verzeichnis unter dem Unter-verzeichnis Office mit dem Namen VBALISTE.XLS finden. Dort ist eine Übersetzungstabelleenthalten, mit deren Hilfe Sie leichter programmieren können.

Page 318: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 317

Im nächsten Beispiel wird in einer Tabelle die Tabellenfunktion SUMME eingesetzt. DieseSumme soll aber dynamisch angewendet werden, d.h., im ersten Schritt soll geprüft werden,wie viele Einträge in einer bestimmten Spalte gemacht wurden. Die Summe soll dann überalle diese Zellen gezogen werden.

Definieren Sie im ersten Schritt zwei Variablen vom Typ String. In diesen Variablen spei-chern Sie die Adressen der ersten bzw. der letzten Zelle der Spalte A mithilfe der EigenschaftAddress. Mithilfe der Anweisung Range("A65536").End(xlUp).Address erhaltenSie die Adresse der letzten verwendeten Zelle in Spalte A. Bilden Sie danach einen Hilfs-string, dem Sie die beiden Adressen übergeben. Danach springen Sie über die AnweisungRange("A65536").End(xlUp).Offset(1, 0).Select in die erste freie Zelle derSpalte A. Fügen Sie nun das Ergebnis der Summierung, welches Sie über die EigenschaftWorkSheetFunction sowie der Funktion Sum ermitteln, in dieser Zelle ab.

Sub SummenFunktionEinsetzen()Dim s_Beginn As StringDim s_Ende As StringDim s as String

Sheets("Tabelle3").Activates_Beginn = Range("A1").Addresss_Ende = Range("A65536").End(xlUp).Address

s = s_Beginn & ":" & s_EndeRange("A65536").End(xlUp).Offset(1, 0).SelectActiveCell.Value = Application.WorksheetFunction.Sum(Range(s))End Sub

Listing 9.7: Den verwendeten Bereich ermitteln und summieren

Page 319: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung318

Abb. 9.7 Die Summe in einem dynamischen Bereich bilden

Wie Sie sehen, wurde in die Zelle A14 das Ergebnis der Funktion hineingeschrieben. Möch-ten Sie stattdessen die Funktion in diese Zelle schreiben, müssen Sie das folgende Makro ein-setzen:

Sub SummenFunktionEinsetzen2()Dim s_Beginn As StringDim s_Ende As String

Sheets("Tabelle3").Activates_Beginn = Range("A1").Addresss_Ende = Range("A65536").End(xlUp).Address

s = s_Beginn & ":" & s_Ende

Listing 9.8: Eine Funktion einfügen

Page 320: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 319

Über die Eigenschaft FormulaLocal können Sie die Tabellenfunktionen vom Namen her soeinsetzen, wie Sie es auch von Ihrer Standardumgebung her kennen. Möchten Sie konsequentaber in der englischen Sprache programmieren, funktioniert auch folgende Anweisung:

ActiveCell.Formula = "=SUM(" & s & ")"

Abb. 9.8 Formel in Zelle einfügen

Range("A65536").End(xlUp).Offset(1, 0).SelectActiveCell.FormulaLocal = "=SUMME(" & s & ")"End Sub

Listing 9.8: Eine Funktion einfügen

Page 321: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung320

Höchstwerte ermitteln

Im nächsten Beispiel sollen aus einem vorgegebenen Bereich die drei höchsten Werte ermit-telt und ausgegeben werden. Diese Aufgabe lösen Sie, indem Sie die Funktion Large einset-zen. Sehen Sie sich dazu das folgende Listing an:

Definieren Sie im ersten Schritt die drei Variablen, in die Sie später die drei höchsten Wertedes vorgegebenen Bereichs speichern. Geben Sie danach den Bereich an, in dem diese Aus-wertung vorgenommen werden soll. Ermitteln Sie jetzt die drei höchsten Werte, indem Siedie Funktion Large einsetzen und dabei jeweils das zweite Argument der Funktion hochset-zen. Der Index 1 ermittelt dabei den höchsten Wert im definierten Bereich. Geben Sie dieErgebnisse am Ende über eine mehrzeilige Meldungsbox am Bildschirm aus.

Sub DreiMaxWerteErmitteln()Dim Bereich As RangeDim wert1 As SingleDim wert2 As SingleDim wert3 As Single

Set Bereich = Sheets("Tabelle4").Range("C4:GF16")wert1 = Application.WorksheetFunction.Large(Bereich, 1)wert2 = Application.WorksheetFunction.Large(Bereich, 2)wert3 = Application.WorksheetFunction.Large(Bereich, 3)

MsgBox "1. Wert: " & wert1 & Chr(13) & _ "2. Wert: " & wert2 & Chr(13) & _ "3. Wert: " & wert3End Sub

Listing 9.9: Maximalwerte in einem Bereich ermitteln

Page 322: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 321

Abb. 9.9 Die drei höchsten Werte werden angezeigt

Die gerade vorgestellte Lösung kann verbessert werden, indem die Auswertung automatischwiederholt wird, wenn eine Änderung im vorgegebenen Bereich eintritt. Um diese Lösung zurealisieren, befolgen Sie die nächsten Arbeitsschritte:

• Klicken Sie mit der rechten Maustaste auf die Registerlasche TABELLE4.

• Wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN.

Hinweis:

Um die wertmäßig kleinsten Werte zu ermitteln, setzen Sie die Funktion Small ein.

Page 323: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung322

• Wählen Sie in der Entwicklungsumgebung aus dem linken Kombinationsfeld den EintragWORKSHEET.

• Im rechten Kombinationsfeld stellen Sie den Eintrag CHANGE ein.

• Ergänzen Sie das automatisch erstellte Ereignis wie folgt:

Definieren Sie im ersten Schritt den Zielbereich über die Anweisung Set. Danach wendenSie die Methode InterSect an, um zu prüfen, ob die gerade veränderte Zelle (Target) imZielbereich (Bereich) liegt. Wenn ja, ermitteln Sie über die Funktion Large die Max-Werte.

Private Sub Worksheet_Change(ByVal Target As Range)Dim Bereich As RangeDim wert1 As SingleDim wert2 As SingleDim wert3 As Single

Set Bereich = Sheets("Tabelle4").Range("C4:GF16")If Intersect(Target, Bereich) Is Nothing ThenExit SubElsewert1 = Application.WorksheetFunction.Large(Bereich, 1)wert2 = Application.WorksheetFunction.Large(Bereich, 2)wert3 = Application.WorksheetFunction.Large(Bereich, 3)

MsgBox "1. Wert: " & wert1 & Chr(13) & _ "2. Wert: " & wert2 & Chr(13) & _ "3. Wert: " & wert3End IfEnd Sub

Listing 9.10: Bei einer Änderung im Zielbereich wird neu ausgewertet

Page 324: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 323

Abb. 9.10 Eine Änderung im Zielbereich bedingt eine Neuberechnung

9.1.4 Zellen formatieren

Sie können mit ein paar Befehlen in VBA ganz schnell Ihre Daten formatieren. Ebenso kön-nen Sie auf bestimmte Eingaben in die Tabelle mit einer automatischen Formatierung reagie-ren. Dabei haben Sie eine große Auswahl, wie Sie Ihre Daten formatieren möchten. Angefan-gen von der Schriftart, Schriftfarbe und dem Schriftschnitt bis hin zum Erzeugen vonRahmen, Hintergründen und verschiedenen Zahlenformaten haben Sie dabei ein rechtansprechendes Sortiment.

Rund um die Schrift

Bei der Auswahl der richtigen Schrift haben Sie eine recht große Auswahl. Standardmäßigwird die Schriftart ARIAL für alle Tabellen zur Verfügung gestellt. Ändern Sie nun dieseSchriftart auf der TABELLE5 und setzen im verwendeten Bereich die Schriftart TAHOMA ein.Das Makro für diese Aufgabe lautet:

Page 325: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung324

Mithilfe der Anweisung ActiveSheet.UsedRange.Select markieren Sie den verwende-ten Bereich der Tabelle. Über die Eigenschaft Name weisen Sie eine gewünschte Schriftartzu, indem Sie diese Eigenschaft auf das Objekt Font anwenden.

Abb. 9.11 Die aktive Tabelle wird mit einer anderen Schriftart ausgestattet

Ergänzen Sie dieses Beispiel noch um folgende Features: Der Bereich B2:G6 soll überwachtwerden. Bei einer Änderung in diesem Bereich soll die geänderte Zelle mit dem SchriftschnittFETT formatiert werden.

Um diese Funktionalität herzustellen, befolgen Sie die nächsten Arbeitsschritte:

• Klicken Sie mit der rechten Maustaste auf die Registerlasche TABELLE5.

• Wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN.

• Wählen Sie in der Entwickungsumgebung aus dem linken Kombinationsfeld den EintragWORKSHEET.

• Im rechten Kombinationsfeld stellen Sie den Eintrag CHANGE ein.

Sub SchriftartEinstellen()Sheets("Tabelle5").ActivateActiveSheet.UsedRange.SelectSelection.Font.Name = "Tahoma"End Sub

Listing 9.11: Eine andere Schriftart einstellen

Page 326: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 325

• Ergänzen Sie das automatisch erstellte Ereignis wie folgt:

Überprüfen Sie über die Methode InterSect, ob die geänderte Zelle im Zielbereich liegt.Wenn ja, setzen Sie die Eigenschaft Bold auf den Wert True, um den Zelleninhalt mit demSchriftschnitt FETT zu formatieren.

Abb. 9.12 Alle geänderten Zellen werden mit dem Schriftschnitt Fett formatiert

Grenzwertwertermittlung

Bei der nächsten Aufgabe sollen die Zellen, die größer als ein bestimmter Wert sind, automa-tisch mit der Hintergrundfarbe ROT gefärbt werden. Dazu legen Sie sich zunächst eine neueTabelle (TABELLE6) an und markieren den Bereich A1:G19. Geben Sie dann die Formel=Ganzzahl(Zufallszahl()*1000) an und fügen diese Formel in alle markeirten Zellen ein,indem Sie die Tastenkombination (Strg) + (¢) drücken. Bei jedem Drücken der Taste (F9)

Private Sub Worksheet_Change(ByVal Target As Range)Dim Bereich As Range

Set Bereich = Sheets("Tabelle5").Range("B2:G6")If Intersect(Target, Bereich) Is Nothing ThenExit SubElseTarget.Font.Bold = TrueEnd IfEnd Sub

Listing 9.12: Den Schriftschnitt dynamisch verändern

Page 327: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung326

werden neue Zufallszahlen eingefügt. Somit haben Sie jetzt die Voraussetzung geschaffen,das automatische Formatieren der Daten zu testen. Befolgen Sie nun die nächsten Arbeits-schritte:

• Klicken Sie mit der rechten Maustaste auf die Registerlasche TABELLE5.

• Wählen Sie aus dem Kontextmenü den Befehl CODE ANZEIGEN.

• Wählen Sie in der Entwickungsumgebung aus dem linken Kombinationsfeld den EintragWORKSHEET.

• Im rechten Kombinationsfeld stellen Sie den Eintrag CALCULATE ein.

• Ergänzen Sie das automatisch erstellte Ereignis wie folgt:

Überprüfen Sie jede Zelle des verwendeten Bereichs einer Tabelle, ob der Zellenwert >5000ist. Wenn ja, setzen Sie die Eigenschaft ColorIndex auf den Wert 6, um die betroffene Zellemit der Hintergrundfarbe GELB zu formatieren. Im anderen Fall setzen Sie die EigenschaftColorIndex auf den konstanten Wert XlColorIndexNone, um die eventuell schon forma-tierte Zelle zu »entformatieren«.

Private Sub Worksheet_Calculate()Dim Zelle As RangeIf ActiveSheet.Name = "Tabelle6" Then For Each Zelle In ActiveSheet.UsedRange If Zelle.Value > 5000 Then Zelle.Interior.ColorIndex = 6 Else Zelle.Interior.ColorIndex = xlColorIndexNone End If Next Zelle End IfEnd Sub

Listing 9.13: Das Ereignis Calculate wird bei jeder Neuberechnung gestartet

Page 328: VBA-Programmierung fur Word, Excel und Access

Rechts9.1 Zellen programmieren 327

Abb. 9.13 Alle Zellen >5000 werden mit der Hintergrundfarbe Gelb hinterlegt

Sonstige Eigenschaften rund um die Formatierung

Sie haben bis jetzt schon ein paar Eigenschaften des Objekts Font kennen gelernt. Entneh-men Sie weitere Eigenschaften, die Sie auf dieses Objekt anwenden können, aus der folgen-den Tabelle:

Eigenschaft Erklärung

Bold Setzen Sie diese Eigenschaft auf den Wert True, wenn Sie einenText fett formatieren möchten.

Color Diese Eigenschaft gibt die Primärfarbe des Objekts wieder.Möglich sind hierbei folgende Konstanten: vbBlack, vbRed,vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan und vbW-hite.

ColorIndex Diese Eigenschaft gibt die Farbe des Rahmens, der Schriftartoder des Innenraums zurück. Es existieren in Excel genau 56Farben.

Page 329: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung328

9.2 Zeilen und Spalten programmieren

Nach der Programmierung mit den Zellen ist die nächst größere Einheit die Programmierungmit Zeilen und Spalten. Zu diesem Zweck stehen Ihnen die Eigenschaften Rows undColumns zur Verfügung.

9.2.1 Zeilen ein- und ausblenden

Oft werden bestimmte Zeilen in Tabellen nicht angezeigt und sind im Zustand ausgeblendet.Diese ausgeblendeten Zeilen können bei Bedarf jederzeit wieder eingeblendet werden. WieSie diesen Vorgang automatisch durchführen können, erfahren Sie im folgenden Beispiel.

Eigenschaft Erklärung

FontStyle Über diese Eigenschaft können Sie den Schriftschnitt bestim-men, der verwendet werden soll. Möglich sind u. a. Fett- undKursivdruck.

Italic Über diese Eigenschaft können Sie einen Text kursiv setzen,indem Sie diese Eigenschaft auf den Wert True setzen.

OutLineFont Diese Eigenschaft liefert den Wert True, wenn ein Text alsKonturschriftart formatiert wird.

Shadow Diese Eigenschaft liefert den Wert True, wenn ein Text alsschattierte Schriftart formatiert wird.

Strikethrough Diese Eigenschaft liefert den Wert True, wenn ein Text alshorizontal durchstrichen dargestellt wird.

Subscript Diese Eigenschaft liefert den Wert True, wenn ein Text tiefer-gestellt formatiert wird.

Superscript Diese Eigenschaft liefert den Wert True, wenn ein Text hoch-gestellt formatiert wird.

Underline Diese Eigenschaft liefert den Wert True, wenn ein Text unter-strichen formatiert wird. Dabei können Sie u. a. einen Text ein-fach oder doppelt unterstreichen.

Page 330: VBA-Programmierung fur Word, Excel und Access

Rechts9.2 Zeilen und Spalten programmieren 329

Abb. 9.14 Die komplette Tabelle

In der TABELLE7 sollen über ein Makro alle Zeilen ausgeblendet werden, die keine Summenenthalten. In der letzten Abbildung sind dies die Zellen 3-7, 9-13 und 15-17. Das Makro fürdiese Aufgabe lautet wie folgt:

Aktivieren Sie im ersten Schritt die gewünschte Tabelle über die Methode Activate. SetzenSie danach den Mauszeiger auf die Startzelle. Setzen Sie dann eine Schleife auf, die alle Zel-len der Spalte A nacheinander durchläuft. Innerhalb der Schleife prüfen Sie, ob die jeweiligeZelle mit dem Schriftschnitt FETT formatiert ist. Wenn nicht, blenden Sie die komplette Zeile

Sub ZeilenAusblenden()Sheets("Tabelle7").ActivateRange("A3").SelectDo Until ActiveCell.Value = "" If ActiveCell.Font.Bold = False Then ActiveCell.EntireRow.Hidden = True Else End If ActiveCell.Offset(1, 0).SelectLoopEnd Sub

Listing 9.14: Bestimmte Zeilen ausblenden

Page 331: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung330

aus, indem Sie über die Eigenschaft EntireRow die Zeile ansprechen und die EigenschaftHidden auf den Wert True setzen.

Abb. 9.15 Alle nicht fett formatierten Zeilen wurden ausgeblendet

Um die ausgeblendeten Zeilen wieder verfügbar zu machen, starten Sie das Makro aus demfolgenden Listing:

Durchlaufen Sie eine Schleife, in der alle verwendeten Zeilen der Tabelle abgearbeitet wer-den. Setzen Sie dabei die Eigenschaft Hidden der einzelnen Zeilen auf den Wert False, umdie ausgeblendeten Zeilen wieder einzublenden.

9.2.2 Spalten ein- und ausblenden

Ähnlich wie bei den Zeilen verhält es sich bei den Spalten. Im nächsten Beispiel sollen einigeSpalten aus einer Produktverkaufstabelle ausgeblendet werden.

Sub ZeilenEinblenden()Dim zeile As Range

Sheets("Tabelle7").ActivateFor Each zeile In ActiveSheet.UsedRange.Rows zeile.Hidden = FalseNext zeileEnd Sub

Listing 9.15: Alle ausgeblendeten Zeilen wieder einblenden

Page 332: VBA-Programmierung fur Word, Excel und Access

Rechts9.2 Zeilen und Spalten programmieren 331

Abb. 9.16 Die Ausgangstabelle – alle Regionen und Unterregionen werden angezeigt

Blenden Sie jetzt die Spalten C bis F und H bis K aus, indem Sie das nachfolgende Makrostarten.

Aktivieren Sie im ersten Schritt die gewünschte Tabelle über die Methode Activate. Mar-kieren Sie danach die Startzelle. Setzen Sie dann eine Schleife auf, die alle Zellen der Zeile3 nacheinander durchläuft. Innerhalb der Schleife prüfen Sie, ob die jeweilige Zelle mit dem

Sub SpaltenAusblenden()Sheets("Tabelle8").ActivateRange("B2").SelectDo Until ActiveCell.Value = "" If ActiveCell.Font.Italic = True Then ActiveCell.EntireColumn.Hidden = True Else End If ActiveCell.Offset(0, 1).SelectLoopEnd Sub

Listing 9.16: Bestimmte Spalten werden ausgeblendet

Page 333: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung332

Schriftschnitt KURSIV formatiert ist. Wenn ja, markieren Sie die Spalte über die EigenschaftEntireColumn und blenden die Spalte aus, indem Sie der Eigenschaft Hidden den WertTrue zuweisen.

Abb. 9.17 Alle Spalten mit Kursivformatierung wurden ausgeblendet

Blenden Sie jetzt die ausgeblendeten Spalten wieder ein, indem Sie das folgende Makroanwenden:

Sub SpaltenEinblenden()Dim Spalte As Range

Sheets("Tabelle8").ActivateFor Each Spalte In ActiveSheet.UsedRange.Columns Spalte.Hidden = FalseNext SpalteEnd Sub

Listing 9.17: Alle ausgeblendeten Spalten wieder einblenden

Page 334: VBA-Programmierung fur Word, Excel und Access

Rechts9.2 Zeilen und Spalten programmieren 333

Durchlaufen Sie eine Schleife, in der alle verwendeten Spalten der Tabelle abgearbeitet wer-den. Setzen Sie dabei die Eigenschaft Hidden der einzelnen Spalten auf den Wert False, umdie ausgeblendeten Spalten wieder einzublenden.

9.2.3 Zeilen löschen und einfügen

Um eine oder mehrere Zeilen in einer Tabelle zu löschen, setzen Sie die Methode Deleteein, die Sie auf die Eigenschaft EntireRow anwenden. Im folgenden Beispiel sollen auseiner Liste mit Artikelbewegungen alle Zeilen gelöscht werden, deren Datum älter als 14Tage ist. Legen Sie dazu eine neue Tabelle an und schreiben das Vergleichsdatum in ZelleA1. Sehen Sie sich vorab die nächste Abbildung an.

Abb. 9.18 Bestimmte Zeilen sollen gelöscht werden

Über das folgende Makro löschen Sie jetzt die Zeilen, die ein älteres Datum aufweisen, als inZelle A1 steht. Das Makro für diese Aufgabe lautet:

Page 335: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung334

Ermitteln Sie über die Anweisung ActiveSheet.UsedRange.Rows.Count die Anzahl derverwendeten Zeilen in der Tabelle. Diese Anzahl bildet das Endekriterium für Ihre Schleife.Innerhalb dieser Schleife vergleichen Sie den Inhalt der Zelle mit dem Datum, welches inZelle A1 steht. Fällt dieser Vergleich negativ aus, löschen Sie die komplette Zeile, indem Siedie Methode Delete auf diese Zeile anwenden.

Abb. 9.19 Die älteren Sätze wurden entfernt

Sub ZeilenLöschen()Dim i As Integer

Sheets("Tabelle9").ActivateRange("A4").SelectFor i = 1 To ActiveSheet.UsedRange.Rows.Count If (Range("A1").Value - ActiveCell.Value) > 14 Then ActiveCell.EntireRow.Delete Else ActiveCell.Offset(1, 0).Select End IfNext iEnd Sub

Listing 9.18: Bestimmte Zeilen löschen

Page 336: VBA-Programmierung fur Word, Excel und Access

Rechts9.2 Zeilen und Spalten programmieren 335

Im nachfolgenden Beispiel sollen in einer Tabelle zusätzliche Zeilen eingefügt werden. Esliegt eine Namensliste vor, die alphabetisch sortiert ist. Ihre Aufgabe besteht nun darin, nachjedem Buchstabenwechsel eine Leerzeile einzufügen. Sehen Sie sich vorab folgende Abbil-dung an.

Abb. 9.20 Die alphabetische Namensliste

Fügen Sie nun nach jedem neuen »Buchstaben« eine Leerzeile ein. Diese Aufgabe könnenSie mit folgendem Makro lösen:

Sub ZeilenEinfügen()Dim i As Integer

Sheets("Tabelle11").ActivateRange("A2").SelectFor i = 1 To ActiveSheet.UsedRange.Rows.Count If Left(ActiveCell.Value, 1) <> Left(ActiveCell.Offset(-1, 0).Value, 1) Then ActiveCell.EntireRow.Insert ActiveCell.Offset(2, 0).Select Else

Listing 9.19: Zeilen einfügen

Page 337: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung336

Ermitteln Sie über die Anweisung ActiveSheet.UsedRange.Rows.Count die Anzahl derverwendeten Zeilen in der Tabelle. Diese Anzahl bildet das Endekriterium für Ihre Schleife.Innerhalb dieser Schleife vergleichen Sie den Inhalt der Zelle mit dem Inhalt der vorherigenZeile. Dabei wird jeweils der erste Buchstaben des Namens verglichen. Ändert sich dabei derBuchstabe, fügen Sie eine Leerzeile ein, indem Sie die Methode Insert auf diese Zeileanwenden. Vergessen Sie danach nicht, der Eigenschaft Offset im »Zeilen-Offset« denWert 2 zu übergeben, damit die gerade eingefügte Zeile übersprungen wird und die Verarbei-tung fortgesetzt werden kann.

Abb. 9.21 Leerzeilen wurden eingefügt

ActiveCell.Offset(1, 0).Select End IfNext iEnd Sub

Listing 9.19: Zeilen einfügen

Page 338: VBA-Programmierung fur Word, Excel und Access

Rechts9.2 Zeilen und Spalten programmieren 337

9.2.4 Spalten löschen und einfügen

Analog zum Löschen und Einfügen von Zeilen verläuft es, wenn Sie Spalten entfernen odereinfügen möchten. Im folgenden Beispiel werden alle Spalten entfernt, die in der ersten Zeileals Löschkennzeichen den Buchstaben »X« stehen haben.

Abb. 9.22 Die Spalten mit dem Kennzeichen »X« sollen gelöscht werden

Erfassen Sie nun ein Makro, welches die X-Spalten entfernt.

Sub SpaltenLöschen()Dim i As Integer

Sheets("Tabelle12").ActivateRange("A1").SelectFor i = 1 To ActiveSheet.UsedRange.Columns.Count If ActiveCell.Value = "X" Then ActiveCell.EntireColumn.Delete Else ActiveCell.Offset(0, 1).Select End IfNext iEnd Sub

Listing 9.20: Spalten mit Inhalt »X« löschen

Page 339: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung338

Ermitteln Sie über die Anweisung ActiveSheet.UsedRange.Columns.Count dieAnzahl der verwendeten Spalten in der Tabelle. Diese Anzahl bildet das Endekriterium fürIhre Schleife. Innerhalb dieser Schleife prüfen Sie den Inhalt der jeweiligen Zelle. Trifft die-ser Vergleich zu, löschen Sie die komplette Spalte, indem Sie die Methode Delete auf dieseSpalte anwenden.

Abb. 9.23 Alle X-Spalten wurden entfernt

Um Spalten einzufügen, nutzen Sie die Methode Insert, die Sie auf die Eigenschaft Enti-reColumn anwenden. Dies wird im folgenden Beispiel umgesetzt. Dabei ist eine Zahlenreihegegeben. Ihre Aufgabe besteht nun darin, diese Zahlenreihe richtig zu stellen. Sehen Sie sichvorab einmal die nächste Abbildung an.

Page 340: VBA-Programmierung fur Word, Excel und Access

Rechts9.2 Zeilen und Spalten programmieren 339

Abb. 9.24 In dieser Zahlenreihe stimmt was nicht

Stellen Sie nun die Zahlenreihe richtig, indem Sie zusätzliche Spalten einfügen und mit dennoch fehlenden Zahlen füllen. Setzen Sie dazu das folgende Makro ein:

Ermitteln Sie über die Anweisung ActiveSheet.UsedRange.Columns.Count dieAnzahl der verwendeten Spalten in der Tabelle. Diese Anzahl bildet das Endekriterium fürIhre Schleife. Innerhalb dieser Schleife vergleichen Sie den Inhalt der Zelle mit dem Inhaltder Zelle in der nächsten Spalte. Dabei werden beide Werte voneinander subtrahiert. Kommt

Sub SpaltenEinfügen()Dim i As Integer

Sheets("Tabelle13").ActivateRange("A1").SelectFor i = 1 To ActiveSheet.UsedRange.Columns.Count If ActiveCell.Offset(0, 1).Value - ActiveCell.Value > 1 Then ActiveCell.Offset(0, 1).Select ActiveCell.EntireColumn.Insert ActiveCell.Value = ActiveCell.Offset(0, -1).Value + 1Else ActiveCell.Offset(0, 1).Select End IfNext iEnd Sub

Listing 9.21: Fehlende Spalten ergänzen

Page 341: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung340

dabei ein Wert größer 1 heraus, fügen Sie eine Leerspalte ein und füllen diese Zelle mit dernoch fehlenden Zahl, indem Sie die Methode Insert auf diese Spalte anwenden.

Abb. 9.25 Die Zahlenreihe wurde richtig ergänzt

9.2.5 Zeilenhöhe und Spaltenbreite einstellen

Beim Einstellen der gewünschten Spaltenbreite können Sie entweder die genaue Abmessungangeben oder die Methode AutoFit anwenden, die alle Spalten so weit vergrößert, dass alleDaten lesbar sind. Sehen Sie sich zunächst folgende Abbildung an.

Page 342: VBA-Programmierung fur Word, Excel und Access

Rechts9.2 Zeilen und Spalten programmieren 341

Abb. 9.26 Die Spalten sind zu klein

In Zeile 1 wurden Datumsangaben gemacht, die Excel nicht anzeigen kann, weil die Spalten-größe zu klein ist. Stellen Sie jetzt mit dem folgenden Makro die Spaltenbreite auf den Wert10.

Über die Eigenschaft ColumnWidth können Sie die Breite einer Spalte bestimmen. Die Spal-tenbreite wird bezogen auf die Schriftbreite. Spaltenbreite 10 bedeutet, dass durchschnittlich10 Zeichen einer Proportionalschrift in die Zelle passen.

Möchten Sie die Spaltenbreite automatisch einstellen lassen, setzen Sie die Methode AutoFitein, die Sie im nächsten Listing sehen können.

Sub SpaltenbreiteEinstellen() Sheets("Tabelle14").Activate Columns("A:G").ColumnWidth = 10End Sub

Listing 9.22: Die Spaltenbreite einstellen

Sub AutomatischeAnpassung() Sheets("Tabelle14").Activate Columns("A:G").AutoFitEnd Sub

Listing 9.23: Automatisches Einstellen der Spaltenbreite

Page 343: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung342

Mithilfe der Methode AutoFit können Sie die Spaltenbreite oder die Zeilenhöhe im angege-benen Bereich automatisch anpassen lassen, um eine optimale Anpassung zu erreichen.Dabei werden die Spalten und Zeilen so lange vergrößert, bis der komplette Inhalt angezeigtwerden kann.

Abb. 9.27 Das Ergebnis nach AutoFit

Die Zeilenhöhe einer Excel-Tabelle wird in typographischen Punkten angegeben. Ein typo-graphischer Punkt ist ungefähr 0,35 mm. 1 cm entspricht dann in etwa einer Zeilenhöhe von29. Stellen Sie im nächsten Beispiel die Zeilenhöhe für die Zeilen 1 bis 200 auf den Wert 29und die Spaltenbreite auf den Wert 6,5. Sie erhalten dann eine Tabelle, die Sie als Karopapierausdrucken und verwenden können.

Sub Karopapier()Dim Zelle As Range

Sheets("Tabelle15").Activate Columns("A:X").ColumnWidth = 5.5 Rows("1:200").RowHeight = 29 ActiveSheet.PageSetup.PrintGridlines = True Range("A1:X200").Select For Each Zelle In Selection Zelle.Value = " " Next ZelleEnd Sub

Listing 9.24: Zeilenhöhe und Spaltenbreite gleichmäßig einstellen

Page 344: VBA-Programmierung fur Word, Excel und Access

Rechts9.3 Tabellen programmieren 343

Mithilfe der Eigenschaft RowHeight können Sie die Höhe von Zellen einstellen. Indem Siedie Eigenschaft Gridlines auf den Wert True setzen, erreichen Sie, dass die Gitternetzli-nien beim Ausdruck gedruckt werden. Diese werden aber erst gedruck, wenn in den Zellenein Wert steht. Da Sie ein leeres Karoblatt ausgedruckt haben möchten, füllen Sie diese Zel-len mit einem Leerzeichen.

Abb. 9.28 Das eigene Karopaier herstellen

9.3 Tabellen programmieren

Nach den Zellen, Zeilen und Spalten kommen wir nun zur nächst größeren Einheit, demTabellenblatt. Ein Blatt in einer Tabelle wird durch die Eigenschaft Sheets angesprochen.Diese Eigenschaft gibt eine Sheets-Auflistung zurück, in der alle Blätter der aktivenArbeitsmappe enthalten sind. Darunter fallen Tabellen, Diagrammblätter und alte Excel-4.0-Makros sowie Excel-5.0-Dialogblätter. Möchten Sie nur die Tabellenblätter ansprechen,dann setzen Sie die Eigenschaft Worksheets ein.

Page 345: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung344

9.3.1 Tabellenblätter zählen und identifizieren

Im folgenden Beispiel sollen die momentan in der Arbeitsmappe enthaltenen Tabellengezählt und deren Namen in eine neue Tabelle geschrieben werden. Der Code für diese Auf-gabe lautet wie folgt:

Fügen Sie im ersten Schritt eine neue Tabelle am Ende der Arbeitsmappe ein. Dazu ermittelnSie über die Eigenschaft Count, wie viele Tabellen bereits in der Arbeitsmappe enthaltensind. Diese Anzahl geben Sie im Argument after der Methode Add an. Danach kommt eineSchleife, die so lange durchlaufen wird, wie es Tabellenblätter in der Arbeitsmappe gibt.Innerhalb dieser Schleife geben Sie über die Eigenschaft Cells an, wo die Angaben zur Posi-tion sowie der Name der Tabelle geschrieben werden sollen. Im ersten Argument der Eigen-schaft Cells geben Sie die Zeile an. Da dieses Argument variabel bleiben muss, geben Siedort den jeweiligen Inhalt der Variablen i an, den Sie nach jedem Schleifendurchlauf um denWert 1 erhöhen. Im zweiten Argument geben Sie die Spalte an. Der Wert 1 steht dabei für dieSpalte A, der Wert 2 repräsentiert die Spalte B.

Sub TabellenListen()Dim i As Integer

Sheets.Add after:=Worksheets(Worksheets.Count)Range("A1").SelectFor i = 1 To ActiveWorkbook.Worksheets.Count Cells(i, 1).Value = i Cells(i, 2).Value = Sheets(i).NameNext iEnd Sub

Listing 9.25: Tabellen auflisten und zählen

Page 346: VBA-Programmierung fur Word, Excel und Access

Rechts9.3 Tabellen programmieren 345

Abb. 9.29 Alle Tabellen der Arbeitsmappe werden aufgelistet

9.3.2 Neue Tabellen einfügen

Im vorherigen Beispiel haben Sie bereits eine neue Tabelle in die Arbeitsmappe eingefügt,indem Sie die Methode Add eingesetzt haben. Im folgenden Beispiel greifen Sie auf eineTabelle zurück, in der die Namen von Tabellen angegeben sind. Ihre Aufgabe besteht nundarin, anhand dieser Tabelle eine neue Arbeitsmappe anzulegen und Tabellen einzufügen, dieder Vorgabeliste entsprechen. Sehen Sie sich zunächst die Ausgangssituation an.

Page 347: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung346

Abb. 9.30 Die Vorgabetabelle

Legen Sie jetzt eine neue Arbeitsmappe an, fügen neue Tabellen ein und benennen diese nachden in der Liste aufgeführten Namen. Das Makro für diese Aufgabe lautet:

Sub TabellenAnlegenUndBenennen()Dim s_Tab As StringDim s_Mapp As StringDim i As IntegerDim i_Neu As IntegerDim e As Integer

Sheets("Tabelle17").Activatei = ActiveSheet.UsedRange.Rows.Counts_Tab = ActiveSheet.Names_Mapp = ThisWorkbook.Name

Workbooks.Adds_MappNeu = ActiveWorkbook.Namei_Neu = ActiveWorkbook.Sheets.Count

Listing 9.26: Neue Tabellen anlegen und benennen

Page 348: VBA-Programmierung fur Word, Excel und Access

Rechts9.3 Tabellen programmieren 347

Aktivieren Sie im ersten Schritt die Tabelle, die die gewünschten Tabellennamen für die neueArbeitsmappe enthält. Danach zählen Sie mithilfe der Eigenschaft Count die Anzahl dergefüllten Zeilen dieser Tabelle, die für die Anzahl der einzufügenden Tabellen steht. Spei-chern Sie den Namen dieser Vorgabetabelle über die Eigenschaft Name in der Variablens_Tab. Den Namen der Arbeitsmappe speichern Sie in der Variablen s_Mapp. Danach fügenSie mithilfe der Methode Add eine neue Arbeitsmappe ein. Kontrollieren Sie im Anschluss,wie viele Tabellen bereits in der neuen Arbeitsmappe vorhanden sind und fügen danach nochdie benötigte Anzahl von Tabellen in die neue Arbeitsmappe ein. Jetzt müssen Sie dieseneuen Tabellen noch benennen. Dazu durchlaufen Sie eine Schleife, in der Sie der Eigen-schaft Name den Inhalt der Vorgabeliste zuweisen.

Abb. 9.31 Die gewünschten Tabellen wurden angelegt

For e = 1 To i - i_Neu Worksheets.AddNext e

For e = 1 To ActiveWorkbook.Sheets.Count Sheets(e).Name = _ Workbooks(s_Mapp).Sheets(s_Tab).Cells(e, 1).ValueNext eEnd Sub

Listing 9.26: Neue Tabellen anlegen und benennen

Page 349: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung348

9.3.3 Tabellen ein- und ausblenden

Möchten Sie bestimmte Tabellen vor den Augen der Anwender verstecken, können Sie dieseaus- und bei Bedarf wieder einblenden. Der Anwender kann die ausgeblendeten Tabellenüber das Menü FORMAT und dem Befehl BLATT/EINBLENDEN wieder verfügbar machen.Aber selbst dieses Wiedereinblenden können Sie bei Bedarf verhindern, indem Sie die Tabel-len auf sichere Weise ausblenden. Beide Lösungen werden jetzt präsentiert.

Einfaches Ausblenden

Im nächsten Makro werden alle Tabellen der aktiven Arbeitsmappe auf die einfache Varianteausgeblendet, mit Ausnahme der TABELLE1.

Durchlaufen Sie in einer Schleife alle Tabellenblätter der Arbeitsmappe. Innerhalb derSchleife belegen Sie die Eigenschaft Visible mit der Konstanten xlSheetHidden. Damitwerden die Tabellen ausgeblendet, können aber vom Anwender wieder über die Standard-oberfläche Menü FORMAT, Befehl BLATT/EINBLENDEN verfügbar gemacht werden.

Sub TabellenAusblenden()Dim blatt As Worksheet

For Each blatt In ThisWorkbook.Worksheets If blatt.Name <> "Tabelle1" Then blatt.Visible = xlSheetHidden Else End IfNext blattEnd Sub

Listing 9.27: Tabellen ausblenden (Variante 1)

Page 350: VBA-Programmierung fur Word, Excel und Access

Rechts9.3 Tabellen programmieren 349

Abb. 9.32 Alle Tabellen bis auf eine wurden ausgeblendet

Um die Tabellen sicher auszublenden, starten Sie das folgende Makro:

Setzen Sie die Konstante xlSheetVeryHidden in der Eigenschaft Visible ein, um dieTabellen sicher auszublenden. Die so ausgeblendeten Tabellen können nicht mehr über dieStandardoberfläche Menü FORMAT, Befehl BLATT/EINBLENDEN verfügbar gemacht werden.

Sub TabellenAusblendenSicher()Dim blatt As Worksheet

For Each blatt In ThisWorkbook.Worksheets If blatt.Name <> "Tabelle1" Then blatt.Visible = xlSheetVeryHidden Else End IfNext blattEnd Sub

Listing 9.28: Tabellen ausblenden (Variante 2)

Page 351: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung350

Abb. 9.33 Die ausgeblendeten Tabellen können nicht mehr eingeblendet werden

Tabellen wieder einblenden

Um die Tabelle wieder einzublenden, egal auf welche Weise Sie diese ausgeblendet haben,können Sie den folgenden Quellcode einsetzen:

Durchlaufen Sie in einer Schleife alle Tabellenblätter der Arbeitsmappe. Innerhalb derSchleife belegen Sie die Eigenschaft Visible mit der Konstanten xlSheetVisible. Damitwerden die Tabellen wieder eingeblendet.

Sub TabellenEinblenden()Dim blatt As Worksheet

For Each blatt In ThisWorkbook.Worksheets If blatt.Name <> "Tabelle1" Then blatt.Visible = xlSheetVisible Else End IfNext blattEnd Sub

Listing 9.29: Tabellen einblenden

Page 352: VBA-Programmierung fur Word, Excel und Access

Rechts9.3 Tabellen programmieren 351

9.3.4 Tabellen schützen

Ab Excel 2002 haben Sie noch mehr Möglichkeiten, Ihre Tabellen zu schützen und trotzdembestimmte Aktionen noch zuzulassen. Alle diese Möglichkeiten können Sie vorab betrachten,wenn Sie aus dem Menü EXTRAS den Befehl SCHUTZ/BLATT SCHÜTZEN wählen.

Abb. 9.34 Die Optionen für den Blattschutz

Setzen Sie diese einzelnen Optionen im nächsten Listing gezielt ein. Dabei soll es in einemgeschützten Tabellenblatt möglich sein, einzelne Zellen zu formatieren, den AutoFilter zubenutzen sowie eine Sortierung der Daten zuzulassen. Das Makro lautet wie folgt:

Um eine Tabelle zu schützen, setzen Sie die Methode Protect ein und übergeben dengewünschten Argumenten den Wert True. Folgende Argumente können Sie bei dieserMethode im Einzelnen verwenden (ab Excel 2002).

• Password: Eine Zeichenfolge, die ein von Groß-/Kleinschreibung abhängiges Kennwortfür das Arbeitsblatt oder die Arbeitsmappe festlegt. Wenn Sie dieses Argument weglas-sen, kann der Schutz des Arbeitsblatts oder der Arbeitsmappe ohne Angabe eines Kenn-worts aufgehoben werden. Weisen Sie dagegen ein Kennwort zu, muss es angegeben wer-den, um den Schutz des Arbeitsblatts oder der Arbeitsmappe aufzuheben. Falls Sie das

Sub TabelleSchützen() ActiveSheet.Protect DrawingObjects:=True, _ Contents:=True, Scenarios:=True, _ AllowFormattingCells:=True, AllowSorting:=True, _ AllowFiltering:=True, Password:="Test"End Sub

Listing 9.30: Tabellen schützen

Page 353: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung352

Kennwort vergessen, können Sie den Schutz des Arbeitsblatts oder der Arbeitsmappenicht wieder aufheben.

• DrawingObjects: Setzen sie dieses Argument auf den wert True, wenn Formengeschützt werden sollen. Die Voreinstellung ist False.

• Contents: Setzen Sie dieses Argument auf den Wert True, wenn der Inhalt geschütztwerden soll. Bei einem Diagramm wird das gesamte Diagramm geschützt. Bei einemArbeitsblatt werden die gesperrten Zellen geschützt. Die Voreinstellung ist True.

• Scenarios: Setzen Sie dieses Argument auf den Wert True, um Szenarios zu schützen.Das Argument gilt nur für Arbeitsmappen. Die Voreinstellung ist True.

• UserInterfaceOnly: Ist dieses Argument auf True gesetzt, wird die Benutzeroberflä-che, jedoch keine Makros, geschützt. Ohne Angabe dieses Arguments gilt der Schutz fürMakros und die Benutzeroberfläche.

• AllowFormattingCells: Setzen Sie dieses Argument auf den Wert True, um demBenutzer zu ermöglichen, jede Zelle eines geschützten Arbeitsblatts zu formatieren. DerStandardwert ist False.

• AllowFormattingColumns: Wird dieses Argument auf den Wert True gesetzt, wird esdem Benutzer ermöglicht, jede Spalte eines geschützten Arbeitsblatts zu formatieren. DerStandardwert ist False.

• AllowFormattingRows: Wird dieses Argument auf den Wert True gesetzt, wird es demBenutzer ermöglicht, jede Zeile eines geschützten Arbeitsblatts zu formatieren. Der Stan-dardwert ist False.

• AllowInsertingColumns: Wird dieses Argument auf den Wert True gesetzt, wird esdem Benutzer ermöglicht, Spalten in ein geschütztes Arbeitsblatt einzufügen. Der Stan-dardwert ist False.

• AllowInsertingRows: Wird dieses Argument auf den Wert True gesetzt, wird es demBenutzer ermöglicht, Zeilen in ein geschütztes Arbeitsblatt einzufügen. Der Standardwertist False.

• AllowInsertingHyperlinks: Wird dieses Argument auf den Wert True gesetzt, wirdes dem Benutzer ermöglicht, Hyperlinks in ein geschütztes Arbeitsblatt einzufügen. DerStandardwert ist False.

• AllowDeletingColumns: Wird dieses Argument auf den Wert True gesetzt, wird esdem Benutzer ermöglicht, Spalten im geschützten Arbeitsblatt zu löschen, wobei keineZelle in der zu löschenden Spalte gesperrt ist. Der Standardwert ist False.

• AllowDeletingRows: Wird dieses Argument auf den Wert True gesetzt, wird es demBenutzer ermöglicht, Zeilen im geschützten Arbeitsblatt zu löschen, wobei keine Zelle inder zu löschenden Zeile gesperrt ist. Der Standardwert ist False.

• AllowSorting: Setzen Sie dieses Argument auf den Wert True, wenn Sie dem Benutzererlauben möchten, für das geschützte Arbeitsblatt eine Sortierung durchzuführen. Für

Page 354: VBA-Programmierung fur Word, Excel und Access

Rechts9.3 Tabellen programmieren 353

jede Zelle im Sortierbereich muss die Sperre oder der Schutz aufgehoben werden. DerStandardwert ist False.

• AllowFiltering: Setzen Sie dieses Argument auf den Wert True, wenn Sie demBenutzer erlauben möchten, Filter für das geschützte Arbeitsblatt festzulegen. Die Benut-zer können Filterkriterien ändern, jedoch keinen AutoFilter aktivieren oder deaktivieren.Die Benutzer können Filter für einen vorhandenen AutoFilter festlegen. Der Standardwertist False.

• AllowUsingPivotTables: Indem Sie dieses Argument auf den Wert True setzen,ermöglichen Sie es dem Benutzer, PivotTable-Berichte für das geschützte Arbeitsblatt zuverwenden. Der Standardwert ist False.

9.3.5 Tabellenschutz entfernen

Um einen Tabellenschutz wieder zu entfernen, setzen Sie die Methode UnProtect ein.Dabei brauchen Sie nur ein einziges Argument (Password) zu übergeben. Im folgendenListing wird der Tabellenschutz der aktiven Tabelle entfernt.

9.3.6 Registerlaschen einfärben

Seit der Excel-Version 2002 ist es erstmals möglich, die Registerlaschen (auch Tabellenreitergenannt) der Tabellen einzufärben. Zu diesem Zweck wurde das Objekt Tab eingeführt, wel-ches Sie mithilfe der Eigenschaft ColorIndex färben können.

Im folgenden Listing wird der Tabellenreiter der aktuellen Tabelle mit der Farbe ROT forma-tiert.

Sub TabelleEntSchützen()On Error GoTo fehler ActiveSheet.Unprotect Password:="Test" Exit Subfehler: MsgBox "Das Passwort stimmt nicht!"End Sub

Listing 9.31: Tabellenschutz entfernen

Sub RegisterkarteFärben() ActiveWorkbook.ActiveSheet.Tab.ColorIndex = 3End Sub

Listing 9.32: Tabellenreiter färben

Page 355: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung354

Abb. 9.35 Tabellenreiter mit Farben belegen

Für diese Funktion gibt es eine ganze Menge denkbarer Anwendungsbeispiele. So könntenSie beispielsweise eine Arbeitsmappe durchforsten und alle Tabellenreiter farblich hinterle-gen, die einen bestimmten Text enthalten. Sie könnten zum Beispiel die Tabellen, bei denender Text »Kosten« im Tabellennamen vorkommt, mit der Farbe ROT formatiert, die Tabellenmit Namen »Umsatz« hingegen mit der Farbe BLAU. Der Quellcode für diese Aufgabe lautetwie folgt:

Mithilfe der Funktion InStr prüfen Sie, ob eine bestimmte Textfolge im Namen der Tabellevorkommt. Wenn ja, dann wenden Sie die Eigenschaft ColorIndex auf das Objekt Tab an,um den Tabellenreiter einzufärben.

Sub TabellenUntersuchen()Dim Tabelle As Worksheet

For Each Tabelle In ThisWorkbook.Worksheets If InStr(Tabelle.Name, "Kosten") > 0 Then Tabelle.Tab.ColorIndex = 3 If InStr(Tabelle.Name, "Umsatz") > 0 Then Tabelle.Tab.ColorIndex = 5Next TabelleEnd Sub

Listing 9.33: Tabellenreiter färben (Praxisbeispiel)

Page 356: VBA-Programmierung fur Word, Excel und Access

Rechts9.4 Arbeitsmappen programmieren 355

9.4 Arbeitsmappen programmieren

Eine Arbeitsmappe sprechen Sie in Excel über das Objekt Workbook an. Über das Aufli-stungsobjekt Workbooks bekommen Sie alle momentan geöffneten Arbeitsmappen ange-zeigt. Indem Sie dieser Auflistung entweder einen Index bzw. den Namen der Arbeitsmappebekannt geben, können Sie die gewünschte Arbeitsmappe ansprechen.

9.4.1 Geöffnete Arbeitsmappen ermitteln

Im ersten Beispiel zur Programmierung von Arbeitsmappen ermitteln Sie, welche Arbeits-mappen momentan geöffnet sind und geben die Namen in einem Meldungsfenster aus.

In einer Schleife durchlaufen Sie alle aktuell geöffneten Arbeitsmappen, die im Auflistungs-objekt Worksbooks verzeichnet sind. Innerhalb der Schleife setzen Sie die Eigenschaft Nameein, um den Namen der einzelnen Arbeitsmappen zu ermitteln.

Abb. 9.36 Die Namen der aktuellen Mappen werden ausgegeben

Sub GeöffneteArbeitsmappenErmitteln()Dim Mappe As WorkbookDim s As String

For Each Mappe In Application.Workbooks s = s & Mappe.Name & Chr(13) Next MappeMsgBox sEnd Sub

Listing 9.34: Alle geöffneten Arbeitsmappen ermitteln

Hinweis:

Wenn Sie die letzte Abbildung betrachten, werden Sie feststellen, dass die Dateiendungbei der letzten Arbeitsmappe fehlt. Dies liegt daran, dass diese Arbeitsmappe neu angelegtund noch nicht gespeichert wurde.

Page 357: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung356

9.4.2 Arbeitsmappen anlegen

Um neue Arbeitsmappen einzufügen, setzen Sie die Methode Add ein, die Sie auf das Aufli-stungsobjekt Workbooks anwenden. Damit fügen Sie dem Auflistungsobjekt eine weitereArbeitsmappe hinzu.

Im folgenden Beispiel legen Sie eine neue Arbeitsmappe mit genau einem Tabellenblatt an.Der Code für diese Aufgabe lautet:

Sub NeueMappeEinfügen()Application.SheetsInNewWorkbook = 1Workbooks.AddEnd Sub

Listing 9.35: Neue Arbeitsmappe anlegen

Über die Eigenschaft SheetsInNewWorkbook können Sie die Anzahl der Tabellen einerArbeitsmappe bestimmen. Der maximale Wert dieser Eigenschaft liegt bei 255.

Abb. 9.37 Neue Arbeitsmappe mit einem Tabellenblatt wurde eingefügt

Gerade haben Sie erfahren, dass Sie mithilfe der Eigenschaft SheetsInNewWorkbook maxi-mal 255 Tabellen anlegen können. Über einen Trick können Sie aber weitaus mehr Tabellenin eine neuen Arbeitsmappe einfügen. Sehen Sie sich dazu das folgende Makro an.

Sub NeueMappeEinfügenMit365Tabellen()Dim i As Integer

Application.SheetsInNewWorkbook = 1Workbooks.AddFor i = 2 To 365 Sheets.Add after:=Worksheets(Worksheets.Count)

Listing 9.36: Tabellenblätter einfügen

Page 358: VBA-Programmierung fur Word, Excel und Access

Rechts9.4 Arbeitsmappen programmieren 357

Fügen Sie mithilfe einer Schleife so viele Tabellen ein, wie Sie möchten. Meine Versucheergaben, dass es bis zu einem Wert von 1000 Tabellen pro Arbeitsmappe keine Schwierig-keiten gab. Ob es jedoch sinnvoll ist, so viele Tabellen in eine Mappe zu packen, wage ich zubezweifeln.

Abb. 9.38 Mehr als 255 Tabellen in eine Arbeitsmappe einfügen

9.4.3 Arbeitsmappen speichern

Haben Sie eine Arbeitsmappe angelegt, ist der nächste Schritt, nämlich das Speichern derMappe, auch nicht weit. Diese Aufgabe führen Sie durch, indem Sie die Methode SaveAseinsetzen. Diese Methode hat einige Argumente, die jetzt beschrieben werden:

• Filename: Hinter diesem Argument verbirgt sich der Name der zu speichernden Datei.Sie können einen vollständigen Pfad angeben. Andernfalls speichert Microsoft Excel dieDatei im aktuellen Ordner.

• FileFormat: Das beim Speichern der Datei zu verwendende Dateiformat. Eine Liste dergültigen Formate finden Sie unter der FileFormat-Eigenschaft. Bei einer vorhandenenDatei ist das Standardformat das zuletzt angegebene Dateiformat; bei einer neuen Dateiwird standardmäßig das Format der eingesetzten Excel-Version verwendet.

• Password: Mithilfe dieses Arguments können Sie ein Schutzkennwort für die Mappeangeben. Dieses Kennwort wird beim Öffnen der Arbeitsmappe abgefragt.

• WriteResPassword: Hinter diesem Argument verbirgt sich das Schreibschutzkennwortder Datei. Wenn eine Datei mit einem Kennwort gespeichert und das Kennwort beim Öff-nen nicht angegeben wird, wird die Datei schreibgeschützt geöffnet.

Next iEnd Sub

Listing 9.36: Tabellenblätter einfügen

Page 359: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung358

• ReadOnlyRecommended: Setzen Sie dieses Argument auf den Wert True, um sicherzu-stellen, dass beim Öffnen der Datei in einer Meldung angezeigt wird, dass die Dateischreibgeschützt geöffnet wird.

• CreateBackup: Setzen Sie diesen Wert auf True, um eine Sicherungsdatei zu erstellen.

• AccessMode: Über eine Konstante wird der Zugriffsmodus festgelegt: xlExclusive(Exklusivmodus), xlNoChange Standard (Zugriffsmodus nicht ändern) oder xlShared(Freigabeliste). Falls dieses Argument nicht angegeben wird, bleibt der Zugriffsmodusunverändert. Wenn Sie ein gemeinsam genutztes Dokument speichern, ohne den Dateina-men zu ändern, wird dieses Argument ignoriert. Verwenden Sie die ExclusiveAccess-Methode, um den Zugriffsmodus zu ändern.

• ConflictResolution: Optionaler xlSaveConflictResolution-Wert. xlUserRe-solution (Anzeige des Dialogfelds „Konfliktlösung“), xlLocalSessionChanges(automatisches Akzeptieren der Änderungen des lokalen Benutzers), xlOtherSes-sionChanges (Änderungen anderer Benutzer haben Vorrang vor denen des lokalenBenutzers). Falls dieses Argument nicht angegeben wird, wird das Dialogfeld Konfliktlö-sung angezeigt.

• AddToMru: Setzen Sie dieses Argument auf den Wert True, um diese Arbeitsmappe derListe der zuletzt geöffneten Dateien hinzuzufügen. Der Standardwert ist False.

Im folgenden Beispiel wird eine Arbeitsmappe in einem bestimmten Verzeichnis gespeichert.

Über die Anweisung ChDir stellen Sie das gewünschte Verzeichnis ein, indem die aktuelleArbeitsmappe gespeichert werden soll. Danach wenden Sie die Methode SaveAs an, um dieMappe zu speichern. In diesem Beispiel wurde nur das Argument FileName eingesetzt.

Speichern Sie eine Mappe ein zweites Mal, reicht es, wenn Sie das folgende Makro starten.

Mithilfe der Methode Save können Sie Änderungen in der angegebenen Arbeitsmappe spei-chern.

Sub ArbeitsmappeSpeichern() ChDir "D:\Eigene Dateien\" ThisWorkbook.SaveAs Filename:="Backup.xls"End Sub

Listing 9.37: Arbeitsmappe erstmalig speichern

Sub ArbeitsmappeSpeichern2() ThisWorkbook.SaveEnd Sub

Listing 9.38: Arbeitsmappe speichern

Page 360: VBA-Programmierung fur Word, Excel und Access

Rechts9.4 Arbeitsmappen programmieren 359

Mehrere Arbeitsmappen speichern und schließen

Haben Sie mehrere Arbeitsmappen in Bearbeitung und möchten Sie diese am Ende IhrerArbeit komplett speichern, schreiben Sie ein Makro, das wie folgt aussieht:

Speichern Sie alle geöffneten Arbeitsmappen über die Methode Save. Schließen Sie diegespeicherten Arbeitsmappen, indem Sie die Methode Close einsetzen.

9.4.4 Arbeitsmappen drucken

Möchten Sie eine komplette Arbeitsmappe ausdrucken, können Sie die Methode PrintOutauf das Objekt Workbook anwenden, wie Sie im nächsten Makro sehen können.

Tabelle drucken

Weitaus häufiger werden Sie aber eine einzige Tabellen ausdrucken wollen. In diesem Fallwenden Sie die Methode PrintOut auf die Tabelle an, die Sie drucken möchten. Das Makrofür diese Aufgabe lautet:

Die Methode PrintOut können Sie mit einigen Argumenten füttern. So können Sie bei-spielsweise festlegen, ab welcher Seite bzw. bis zu welcher Seite gedruckt werden soll. Überdas Argument Copies legen Sie die Anzahl der gewünschten Kopien fest.

Sub AlleMappenSpeichern()Dim Mappe As Workbook

For Each Mappe In Application.Workbooks Mappe.Save Mappe.CloseNext MappeEnd Sub

Listing 9.39: Alle geöffneten Arbeitsmappen speichern

Sub ArbeitsmappeDrucken() ThisWorkbook.PrintOutEnd Sub

Listing 9.40: Die komplette Arbeitsmappe ausdrucken

Sub BestimmteTabelleDrucken() Sheets("Tabelle1").PrintOut From:=1, To:=2, Copies:=2End Sub

Listing 9.41: Eine bestimmte Tabelle ausdrucken

Page 361: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung360

Mehrere Tabellen drucken

Möchten Sie mehrere Tabellen nacheinander ausdrucken, können Sie das folgende Makroeinsetzen:

Über die Eigenschaft SelectedSheets ermitteln Sie die gerade gruppierten Tabellen, dieSie im Anschluss über die Methode PrintOut ausdrucken.

Abb. 9.39 Alle markierten Tabellen werden gedruckt

9.4.5 Verknüpfungen ersetzen

Immer wieder Probleme machen Verknüpfungen in Arbeitsmappen, insbesondere dann,wenn die verknüpften Arbeitsmappen nicht mehr verfügbar sind. Auch wenn Sie eineArbeitsmappe ohne Verknüpfungen per E-Mail verschicken möchten, sollten Sie vorher dieVerknüpfungen entfernen und durch Festwerte ersetzen.

Im folgenden Beispiel werden Verknüpfungen zu einer anderen Arbeitsmappe durch Fest-werte ausgetauscht. Sehen Sie sich zunächst aber die folgende Ausgangssituation an:

Sub AusgewähltenTabellenDrucken() ActiveWindow.SelectedSheets.PrintOutEnd Sub

Listing 9.42: Die ausgewählten Tabellen drucken

Page 362: VBA-Programmierung fur Word, Excel und Access

Rechts9.4 Arbeitsmappen programmieren 361

Abb. 9.40 Die Verknüpfungen zu einer anderen Arbeitsmappe sollen entfernt werden

Die verknüpften Zellen können Sie identifizieren, indem Sie entweder nach dem Zeichen »[«oder dem Zeichen »]« suchen. Diese verknüpften Zellen können dann ersetzt werden. DasMakro, welches diese Aufgabe für Sie erledigt, lautet wie folgt:

In einer Schleife arbeiten Sie den benutzten Bereich der TABELLE19 ab. Innerhalb derSchleife prüfen Sie mithilfe der Funktion InStr, ob das Sonderzeichen »[« in der Formelder jeweiligen Zelle auftaucht. Wenn ja, ersetzen Sie die Formel der Zelle, indem Sie diesemit der Eigenschaft Value überschreiben.

Sub VerknüpfungenErsetzen()Dim zelle As Range

Sheets("Tabelle19").Activate

For Each zelle In ActiveSheet.UsedRange If InStr(zelle.Formula, "[") > 0 Then zelle.Value = zelle.ValueNext zelleEnd Sub

Listing 9.43: Verknüpfungen aufspüren und ersetzen

Page 363: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung362

Abb. 9.41 Alle Verknüpfungen zu externen Arbeitsmappen wurden entfernt

Möchten Sie dieses Makro auf alle Tabellen der Arbeitsmappe erweitern, erfassen Sie folgen-des Makro:

Sub AlleVerknüpfungenEntfernen()Dim zelle As RangeDim Tabelle As Worksheet

For Each Tabelle In ThisWorkbook.Worksheets For Each zelle In Tabelle.UsedRange If InStr(zelle.Formula, "[") > 0 Then zelle.Value = zelle.ValueNext zelleNext TabelleEnd Sub

Listing 9.44: Alle externen Verknüpfungen durch Festwerte ersetzen

Page 364: VBA-Programmierung fur Word, Excel und Access

Rechts9.4 Arbeitsmappen programmieren 363

9.4.6 Verknüpfungen auskundschaften

Möchten Sie wissen, welche Arbeitsmappen mit Ihrer aktuellen Arbeitsmappe verknüpftsind, wählen Sie im Menü BEARBEITEN den Befehl VERKNÜPFUNGEN oder starten das fol-gende Makro:

Mithilfe der Methode LinkSources, der Sie die Konstante xlExcelLinks mitgeben, kön-nen Sie verknüpfte Arbeitsmappen ermitteln. Diese werden in eine Array-Variable zu Beginndes Makros eingelesen. Danach prüfen Sie über die Funktion IsEmpty, ob überhaupt Ver-knüpfungen zu anderen Arbeitsmappen vorliegen. Wenn ja, dann arbeiten Sie die einzelnenEinträge der Array-Variablen durch, indem Sie diese im Direktbereich ausgeben.

Abb. 9.42 Alle verknüpften Arbeitsmappen wurden im Direktbereich ausgegeben

Sub VerknüpfungenAuslesen()Dim Verkn As VariantDim i As Integer Verkn = ActiveWorkbook.LinkSources(xlExcelLinks)If Not IsEmpty(Verkn) Then For i = 1 To UBound(Verkn) Debug.Print "Verknüpfung " & i & " " & Verkn(i) Next iElseEnd IfEnd Sub

Listing 9.45: Alle verknüpften Arbeitsmappen ermitteln

Page 365: VBA-Programmierung fur Word, Excel und Access

Links

9 Excel-Programmierung364

9.4.7 Verknüpfungen tauschen

Möchten Sie eine alte Verknüpfung gegen eine andere austauschen, setzen Sie die MethodeChangeLink ein. Im folgenden Beispiel wird eine alte Verknüpfung gegen eine neuegetauscht. Sehen Sie sich dazu die Ausgangssituation an:

Abb. 9.43 Die Ausgangssituation

Tauschen Sie nun die verknüpfte Arbeitsmappe durch eine neue aus, indem Sie folgendesMakro starten:

Sub LinksAustauschen()Dim Verkn As VariantDim i As Integer

Verkn = ActiveWorkbook.LinkSources(xlExcelLinks)If Not IsEmpty(Verkn) ThenFor i = 1 To UBound(Verkn) If InStr(Verkn(i), "Standardfunktionen.xls") > 0 Then ActiveWorkbook.ChangeLink _"D:\Held\Franzis\VBA-Buch\Kap03\Standardfunktionen.xls", _"D:\Held\Franzis\VBA-Buch\Kap03\StandardfunktionenNeu.xls", _ xlExcelLinks Else

Listing 9.46: Verknüpfungen austauschen

Page 366: VBA-Programmierung fur Word, Excel und Access

Rechts9.4 Arbeitsmappen programmieren 365

Prüfen Sie die einzelnen Verknüpfungen, die in der Variablen Verkn stehen, anhand derFunktion InStr. Wird die gesuchte Verknüpfung gefunden, wenden Sie die Methode Chan-geLink an, um die alte Verknüpfung gegen eine neue auszutauschen.

Abb. 9.44 Die neue Arbeitsmappe StandardfunktionenNeu wurde verknüpft

End If Next iElseEnd IfEnd Sub

Listing 9.46: Verknüpfungen austauschen

Page 367: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 368: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang367

10 Die Programmierung mit Word

In den letzten Jahren hat die Programmierung in Word-VBA ständig zugenommen. Das ehe-malige »nur-Schreibprogramm« hat sich dabei zu einer interessanten Plattform für VBA-Ent-wickler gemausert. Lernen Sie in diesem Kapitel die wichtigsten Objekte für die Word-Pro-grammierung anhand zahlreicher Beispiele aus der Praxis kennen. Anfangen werden Siedabei mit der Mutter aller Word-Objekte dieser Anwendung, dem Objekt Application.

Ganz oben in der Hierarchie aller Objekte steht das Objekt Application. Dieses Objektrepräsentiert das Anwendungsprogramm Word selbst. Unterhalb dieses Objekts finden Sieweitere Objekte, Methoden und Eigenschaften die Sie in Word einsetzen können. WelcheObjekte das im Einzelnen sind, können Sie sehen, wenn Sie in der Online-Hilfe auf der Regi-sterkarte INHALT die Rubrik VISUAL BASIC-REFERENZ FÜR WORD aufschlagen und den Ein-trag MICROSOFT WORD-OBJEKTE doppelt anklicken.

Abb. 10.1 Das Objekt Application und seine »Unterobjekte«

Hinweis:

Den Quellcode der folgenden Makros können Sie auf www.buch.cd im Verzeichnis Kap10unter dem Namen WORDDEMOS.DOC finden.

Page 369: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word368

10.1 Dokument(e) identifizieren

Im ersten Schritt eines VBA-Makros müssen Sie wissen, wie Ihr aktives Dokument heißt undob eventuell weitere Dokumente geöffnet sind. Den Namen des aktuellen Dokuments könnenSie über die Eigenschaft Name ermitteln, welche Sie auf die Eigenschaft ActiveDocumentanwenden. Im nächsten Listing wird der Name des aktuellen Dokuments am Bildschirm aus-gegeben:

Haben Sie mehrere Dokumente geöffnet, dann sollten Sie beim Starten eines VBA-Makrossicherstellen, dass Sie auch das Dokument aktiviert haben, auf das Sie dieses Makro »anwen-den« möchten. Denken Sie beispielsweise daran, Sie müssten den Inhalt eines Dokumentslöschen und haben aus Versehen das falsche Dokument geöffnet.

Im folgenden Listing ermitteln Sie die Namen der momentan aktiven Dokumente und glei-chen diese Namen mit einem gesuchten Namen ab. Wird das gesuchte Dokument gefunden,dann speichern Sie dieses.

In einer Schleife arbeiten Sie alle geöffneten Dokumente ab. Über die Eigenschaft Nameermitteln Sie den Namen der Dokumente. Diese Namen geben Sie über die AnweisungDebug.Print im Direktbereich aus. Innerhalb der Schleife überprüfen Sie, ob der Name mitdem Vergleichsnamen übereinstimmt. Wenn ja, aktiveren Sie das Dokumnt über die MethodeActivate und ermitteln, ob das Dokument seit dem letzten Speichern nocheinmal geändertwurde. Ist dies der Fall, meldet die Eigenschaft Saved den Wert True. Andernfalls wird der

Sub AktuellesDokumentAusgeben() MsgBox "Das aktuelle Dokument heißt: " & _ Application.ActiveDocumentEnd Sub

Listing 10.1: Den Namen des Dokuments ausgeben

Sub GeöffneteDokumenteErmitteln()Dim Doku As Document

For Each Doku In Documents Debug.Print Doku.Name If Doku.Name = "WordDemos.doc" Then Doku.Activate If Doku.Saved = False Then Doku.Save Else End IfNext DokuEnd Sub

Listing 10.2: Alle geöffneten Dokumente ermitteln

Page 370: VBA-Programmierung fur Word, Excel und Access

Rechts10.2 Dokumentvorlage ermitteln 369

Wert False zurückgegeben. In diesem Fall wenden Sie die Methode Save an, um das Doku-ment zu speichern.

Abb. 10.2 Die Namen der geöffneten Dokumente im Direktbereich ausgeben

10.2 Dokumentvorlage ermitteln

In Word werden standardmäßig alle Dokumente zunächst auf Basis des zentralen Word-Vor-lagendokuments NORMAL.DOT angelegt. Sie haben aber jederzeit die Möglichkeit, neueDokumentvorlagen mit anderer Formatierung und Layout zu erstellen. Um zu ermitteln, aufwelcher Dokumentvorlage ein Dokument basiert, setzen Sie die Eigenschaft AttachedTem-plate ein.

Abb. 10.3 Die Dokumentvorlage ermitteln

Sub DokumentBasisErmitteln()MsgBox "Das Dokument basiert auf der Vorlage: " & _Application.ActiveDocument.AttachedTemplate.NameEnd Sub

Listing 10.3: Die zugrunde liegende Vorlage ermitteln

Page 371: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word370

Wie Sie sehen, wird der Namen der Dokumentvorlage angezeigt. Möchten Sie zusätzlichnoch wissen, wo diese Dokumentvorlage sich auf Ihrer Festplatte befindet, setzen Sie dieEigenschaft FullName ein, die den Namen samt des Pfades der Vorlage ermittelt.

Abb. 10.4 Pfad und Name der Dokumentvorlage ermitteln

10.3 Dokumentvorlage wechseln

Sie haben jederzeit die Möglichkeit, einem Word-Dokument eine andere Dokumentvorlagezuzuweisen. Bei einem oder auch ein paar Dokumenten können Sie diesen Vorgang auch gutnoch manuell durchführen. Sind es mal ein paar dutzend Dokumente, die mit einer neuenDokumentvorlage ausgestattet werden müssen, setzen Sie lieber ein Makro ein, das Sie imfolgenden Listing sehen:

Suchen Sie mithilfe der Funktion Dir alle Dokumente in einem vorgegebenen Verzeichnisheraus. Diese arbeiten Sie in einer Schleife nacheinander ab, indem Sie diese über dieMethode Open öffnen. Danach weisen Sie dem geöffneten Dokument eine neue Dokument-

Sub DokumentBasisErmitteln2()MsgBox "Das Dokument basiert auf der Vorlage: " & _Application.ActiveDocument.AttachedTemplate.FullNameEnd Sub

Listing 10.4: Den Pfadnamen der Dokumentvorlage ermitteln

Sub VorlageZuweisen()Dim Datei as String

Datei = Dir("D:\Eigene Dateien\*.doc")While Datei <> "" Documents.Open FileName:="D:\Eigene Dateien\" & Datei ActiveDocument.AttachedTemplate = "DokuVorNeu.dot" ActiveDocument.Close SaveChanges:=wdSaveChanges Datei = Dir() WendEnd Sub

Listing 10.5: Dokumentvorlage austauschen

Page 372: VBA-Programmierung fur Word, Excel und Access

Rechts10.4 Einstellungen am Dokument durchführen 371

vorlage über die Methode AttachTemplate zu und schließen das Dokument anschließendmithilfe der Methode Close wieder. Speichern Sie dabei die vorgenommene Änderung,indem Sie das Argument SaveChanges mit der Konstanten wdSaveChanges füllen.

10.4 Einstellungen am Dokument durchführen

Das Layout und die verwendeten Formatvorlagen können Sie über Dokumentvorlagen steu-ern. Möchten Sie, mal abgesehen von einer Formatvorlage, einem Dokument eine andereFormatierung zuweisen, dann können Sie den Haupttext eines Dokuments über die Eigen-schaft Content ansprechen.

Im folgenden Listing ändern Sie die Schriftart sowie die Schriftgröße des aktiven Doku-ments:

Definieren Sie über die Anweisung Set zuerst einmal den Bereich, den Sie anpassen möch-ten. Mithilfe des Objekts Font können Sie über die Eigenschaft Name die Schriftart ändern,indem Sie den Namen der gewünschten Schriftart angeben. Die Größe der Schriftart bestim-men Sie über die Eigenschaft Size, der Sie einen numerischen Wert zuweisen.

Sub SchriftÄndern()Dim Bereich As Range

Set Bereich = ActiveDocument.ContentWith Bereich.Font .Name = "Courier" .Size = 10End WithEnd Sub

Listing 10.6: Schriftart sowie Schriftgröße ändern

Page 373: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word372

Abb. 10.5 Die Schriftart wurde geändert

10.5 Schriftarten ermitteln

Im letzten Beispiel haben Sie die Schriftart des Haupttextes eines Dokuments abgeändert.Dazu müssen Sie den Namen der gewünschten Schriftart angeben. Welche Namen Ihnen fürdie installierten Schriftarten dabei zur Verfügung stehen, können Sie über ein Makro ermit-teln, das Sie im folgenden Listing sehen:

Sub SchriftartenAusgeben()Dim Schrift As VariantDim Tabelle As TableDim Zeile As Row

Set Tabelle = ActiveDocument.Tables.Add( _ Range:=Selection.Range, _ NumRows:=1, _ NumColumns:=2)

Listing 10.7: Schriftarten in eine Tabelle schreiben

Page 374: VBA-Programmierung fur Word, Excel und Access

Rechts10.5 Schriftarten ermitteln 373

Fügen Sie im ersten Schritt eine neue Tabelle in Ihr Word-Dokument ein. Dazu verwendenSie die Methode Add. Geben Sie dieser Methode an, wo die Tabelle eingefügt werden sollund wie viele Zeilen und Spalten diese erhalten soll. Da Sie die Zeilen später dynamisch ein-fügen werden, setzen Sie das Argument NumRows zunächst auf den Wert 1. Das ArgumentNumColumns setzen sie auf den Wert 2. In der ersten Spalte geben Sie die Schriftprobe, inder zweiten Spalte den Namen der Schriftart aus.

Fügen Sie im nächsten Schritt eine neue Zeile in die Tabelle ein, indem Sie die Methode Addauf die Eigenschaft Rows (Zeilen) anwenden. Beschriften Sie diese Zeile mit der Spalten-überschrift, die Sie mit dem Schriftschnitt UNTERSTRICHEN über die Eigenschaft Underlineformatieren.

Über die Eigenschaft Last, über die Sie die Auflistung Rows abfragen, ermitteln Sie dieletzte Zeile der Tabelle. In einer Schleife ermitteln Sie mithilfe der Eigenschaft FontNamesdie Namen aller installierten Schriftarten und schreiben den Namen der jeweiligen Schriftartsowie eine Schriftprobe in die Zeile. Fügen Sie danach eine neue Zeile in die Tabelle ein.

Set Zeile = Tabelle.Rows.AddTabelle.Rows(1).Cells(1).Range.Text = "Schriftprobe"Tabelle.Rows(1).Cells(2).Range.Text = "Schriftart"Tabelle.Rows(1).SelectSelection.Font.Underline = wdUnderlineSingle

Set Zeile = Tabelle.Rows.LastFor Each Schrift In FontNames With Tabelle.Rows.Last .Cells(1).Range.Text = Schrift .Cells(2).Range.Text = Schrift .Cells(1).Range.Font.Name = Schrift End With Set Zeile = Tabelle.Rows.AddNext SchriftEnd Sub

Listing 10.7: Schriftarten in eine Tabelle schreiben

Page 375: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word374

Abb. 10.6 Schriftarten und Schriftproben in Tabelle schreiben

10.6 Dokumenteigenschaften auslesen und setzen

Wenn Sie im Menü DATEI den Befehl EIGENSCHAFTEN wählen, können Sie die gespeichertenDokumenteigenschaften einsehen. Dokumenteigenschaften geben beispielsweise Informa-tion darüber, wer der Autor des Dokuments ist oder wie viele Zeichen im Dokument enthaltensind. Darüber hinaus können Sie das Datum der Erstellung bzw. der letzten Änderung einesDokuments über die Dokumenteigenschaften ermitteln.

Page 376: VBA-Programmierung fur Word, Excel und Access

Rechts10.6 Dokumenteigenschaften auslesen und setzen 375

10.6.1 Dokumenteigenschaften auflisten

Im folgenden Makro werden die Dokumenteigenschaften des aktiven Dokuments ausgegeben:

Definieren Sie im ersten Schritt einen Bereich über eine Range-Variable. Darin geben Sieüber die Eigenschaft Content den Haupttext des Dokuments an. Danach reduzieren Sie überdie Methode Collapse den Bereich auf Endposition, indem Sie der Methode die KonstantewdCollapseEnd übergeben. Nach der Reduzierung des Bereichs steht der Markierung zuBeginn des Bereichs.

In einer Schleife arbeiten Sie alle Dokumenteigenschaften des Dokuments ab. Über dieMethode InsertParagraph fügen Sie im Bereich eine Absatzmarke ein. Mithilfe derMethode InsertAfter fügen Sie die Nummerierung sowie den Namen und Inhalt derDokumenteigenschaft im Dokument ein.

Die Zählvariable i werden Sie übrigens im nächsten Beispiel gezielt einsetzen, um bestimmteDokumenteigenschaften anzusprechen.

Kann eine Dokumenteigenschaft nicht ermittelt werden, sorgen Sie über die Anweisung OnError Resume Next dafür, dass es zu keinem Absturz des Makros kommt.

Sub DokuEigenschaftenAusgeben()Dim Bereich As RangeDim DokuEig As DocumentPropertyDim i As Integer

Set Bereich = ActiveDocument.ContentBereich.Collapse Direction:=wdCollapseEndi = 1For Each DokuEig In ActiveDocument.BuiltInDocumentProperties With Bereich .InsertParagraphAfter .InsertAfter& i & " : " & DokuEig.Name & "= " On Error Resume Next .InsertAfter DokuEig.Value End With i = i + 1NextEnd Sub

Listing 10.8: Dokumenteigenschaften auflisten

Page 377: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word376

Abb. 10.7 Alle Dokumenteigenschaften ausgeben

10.6.2 Dokumenteigenschaften gezielt abfragen

In der letzten Abbildung haben Sie alle verfügbaren Dokumenteigenschaften des Dokumentsermittelt und ausgegeben. Über die Nummerierung der Dokumenteigenschaft können Sie ein-zelne Dokumenteigenschaften auch ganz gezielt abrufen.

Im folgenden Beispiel geben Sie die Dokumenteigenschaften Autor, Erstellungsdatum sowieletztes Änderungsdatum auf dem Bildschirm aus.

Sub DokumenteigenschaftenAbrufen()Dim s As String

Listing 10.9: Autor, Erstellungsdatum und Änderungsdatum ausgeben

Page 378: VBA-Programmierung fur Word, Excel und Access

Rechts10.6 Dokumenteigenschaften auslesen und setzen 377

Mithilfe der Eigenschaft BuiltInDocumentProperties können Sie das AuflistungsobjektDocumentProperties ansprechen und über eine eindeutige Nummer die gewünschteDokumenteigenschaft ermitteln.

Abb. 10.8 Dokumenteigenschaften abfragen

Im folgenden Beispiel sprechen Sie die Dokumenteigenschaften über eine eindeutige Kon-stante an. Dabei sollen die Datumsangaben Erstellungsdatum, Änderungsdatum und letztesDruckdatum ermittelt und ausgegeben werden.

Dim ErstelltDat As DateDim UpdateDat As Date

s = _ Application.ActiveDocument.BuiltInDocumentProperties(3) ErstelltDat = _ Application.ActiveDocument.BuiltInDocumentProperties(11) UpdateDat = _ Application.ActiveDocument.BuiltInDocumentProperties(12) MsgBox "Autor: " & s & Chr(13) & _ "Erstellungsdatum: " & ErstelltDat & Chr(13) & _ "Änderungsdatum: " & UpdateDatEnd Sub

Sub DatumsangabenErmitteln()Dim ErstelltDat As StringDim DruckDat As StringDim UpdateDat As String

ErstelltDat = (ActiveDocument.BuiltInDocumentProperties _ (wdPropertyTimeCreated))

UpdateDat = _(ActiveDocument.BuiltInDocumentProperties _ (wdPropertyTimeLastSaved))

Listing 10.10: Erstellungsdatum, Änderungsdatum und letztes Druckdatum ausgeben

Listing 10.9: Autor, Erstellungsdatum und Änderungsdatum ausgeben

Page 379: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word378

Wenn ein Dokument noch nicht gedruckt wurde, kommt es ohne die Fehlerbehandlung imParagraphen KeinDruck zu einem Absturz des Makros.

Abb. 10.9 Datumsangaben über Konstanten ermitteln

10.6.3 Dokumenteigenschaften setzen

Selbstverständlich können Sie bestimmte Dokumenteigenschaften auch setzen. So ändern Sieden momentan eingestellten Anwender, den Sie unter der Rubrik AUTHOR finden, mit folgen-dem Makro:

Kontrollieren Sie diese Anpassung, indem Sie im Menü DATEI den Befehl EIGENSCHAFTEN

wählen.

On Error GoTo KeinDruckDruckDat = _(ActiveDocument.BuiltInDocumentProperties _ (wdPropertyTimeLastPrinted))

KeinDruck:If DruckDat = "" Then DruckDat = "Noch nicht gedruckt" MsgBox "Erstellungsdatum: " & vbTab & _ ErstelltDat & Chr(13) & _ "Änderungsdatum: " & vbTab & UpdateDat & Chr(13) & _ "Druckdatum: " & vbTab & DruckDatEnd Sub

Sub DokumenteigenschaftSetzen() Application.ActiveDocument.BuiltInDocumentProperties _ ("Author") = "Müller"End Sub

Listing 10.11: Dokumenteigenschaft setzen

Listing 10.10: Erstellungsdatum, Änderungsdatum und letztes Druckdatum ausgeben

Page 380: VBA-Programmierung fur Word, Excel und Access

Rechts10.6 Dokumenteigenschaften auslesen und setzen 379

Abb. 10.10 Den Namen des Anwenders ändern

Ab und zu kommt es in der Praxis wohl vor, dass ein Firmenname sich ändert. Sie habendanach die Aufgabe alle Dokumenteigenschaften im Feld FIRMA anzupassen. Damit Sie nichtein Dokument nach dem anderen öffnen, ändern und speichern müssen, empfiehlt sich hierder Einsatz des folgenden Makros:

Suchen Sie mithilfe der Funktion Dir alle Dokumente in einem vorgegebenen Verzeichnisheraus. Diese arbeiten Sie in einer Schleife nacheinander ab, indem Sie diese über dieMethode Open öffnen. Danach weisen Sie der Dokumenteigenschaft Company den neuen

Sub FirmaAnpassen()Dim Datei As String

Datei = Dir("D:\Eigene Dateien\*.doc")While Datei <> "" Documents.Open FileName:="D:\Eigene Dateien\" & Datei Application.ActiveDocument.BuiltInDocumentProperties _ ("Company") = "Neuer Firmennamen" ActiveDocument.Close SaveChanges:=wdSaveChanges Datei = Dir() WendEnd Sub

Listing 10.12: Alle Dokumente anpassen

Page 381: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word380

Firmennamen zu und schließen das Dokument anschließend mithilfe der Methode Closewieder. Speichern Sie dabei die vorgenommene Änderung, indem Sie das ArgumentSaveChanges mit der Konstanten wdSaveChanges füllen.

Abb. 10.11 Dokumenteigenschaft Company für alle Dokumente eines Ordners ändern

10.7 Kommentare aufspüren und auslesen

Mithilfe von Kommentaren können Sie schwer verständliche Punkte in Ihren Dokumentenerläutern bzw. sich selbst auch eine Erinnerungshilfe setzen, um Anpassungen im Dokumentzu dokumentieren.

10.7.1 Kommentarinformationen auslesen

Im folgenden Makro wird das aktive Dokument nach Kommentaren durchsucht. Alle gefun-denen Kommentare werden dann im Direktbereich ausgegeben. Dabei interessieren folgendePunkte:

• Wann genau wurde der Kommentar erfasst?

• Von wem wurde die Kommentierung vorgenommen?

• Welcher Text wurde als Kommentar hinterlegt?

Page 382: VBA-Programmierung fur Word, Excel und Access

Rechts10.7 Kommentare aufspüren und auslesen 381

Des weiteren sollen die Kommetartexte im Schriftschnitt FETT umformatiert werden. DieLösung sehen Sie im nächsten Listing:

Definieren Sie im ersten Schritt eine Objektvariable vom Typ Comment. Danach arbeiten Siein einer Schleife alle im Dokument befindlichen Kommentare ab. Innerhalb der Schleifegeben Sie über die Eigenschaft Date das Datum der Erfassung des Kommentars aus, welchesSie über die Funktion Format noch in das gewünschte Format bringen. Mithilfe der Eigen-schaft Author ermitteln Sie den Erfasser des Kommentars. Über die Eigenschaft Text, wel-che Sie auf das Range-Objekt anwenden, erfahren Sie, welcher Kommentartext eingegebenwurde.

Abb. 10.12 Kommentarinformationen im Direktbereich ausgeben

10.7.2 Kommentare formatieren

Möchten Sie die Kommentare in einem anderen Format haben, können Sie das eingestellteFormat für Kommentare ändern, indem Sie das nächste Makro starten. Dabei soll die Schrift-art TAHOMA mit der Schriftgröße 12 und dem Schriftschnitt FETT eingesetzt werden.

Sub KommentareErmitteln()Dim Notiz As Comment

For Each Notiz In ActiveDocument.Comments Debug.Print Format(Notiz.Date, "DD.MM.YYYY hh:mm") _ & " von " & Notiz.Author & Chr(13) & _ Notiz.Range.Text & Chr(13)Next NotizEnd Sub

Listing 10.13: Notizen auslesen

Page 383: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word382

Arbeiten Sie in einer Schleife alle Kommentare des aktiven Dokuments ab. Dabei setzen Siedie Anweisung With ein, um Schreibarbeit zu sparen. Setzen Sie die Eigenschaft Bold aufden Wert True, um einen Fettdruck zu erzeugen. In der Eigenschaft Name geben Sie dengewünschten Namen der Schriftart an, den Sie auf das Font-Objekt anwenden. Die Größeder Schriftart stellen Sie über die Eigenschaft Size ein, welche Sie ebenfalls auf das Font-Objekt anwenden.

Färben Sie zum Schluss alle Kommentare mit der Schriftfarbe Blau, indem Sie der Eigen-schaft Color die Farbkonstante wdColorBlue übergeben. Die wichtigsten Farben, die Ihnensonst noch zur Verfügung stehen, entnehmen Sie der folgenden Tabelle:

Sub KommentareFormatieren()Dim Notiz As Comment

For Each Notiz In ActiveDocument.Comments With Notiz.Range .Bold = True .Font.Name = "Tahoma" .Font.Size = 12 .Font.Color = wdColorBlue End WithNext NotizEnd Sub

Listing 10.14: Kommentare formatieren

Farbe Konstante

Rot wdColorRed

Weiß wdColorWhite

Gelb wdColorYellow

Schwarz wdColorBlack

Gold wdColorGold

Orange wdColorOrange

Grün wdColorGreen

Violett wdColorViolet

Hinweis:

Weitere Farbkonstanten können Sie aus der Online-Hilfe entnehmen, indem Sie bei derEigenschaft COLOR den Hyperlink WDCOLOR klicken.

Page 384: VBA-Programmierung fur Word, Excel und Access

Rechts10.8 Texte/Formate suchen und ersetzen 383

Abb. 10.13 Kommentare formatieren

10.8 Texte/Formate suchen und ersetzen

Das Suchen von bestimmten Wörtern bzw. das Ersetzen derselben durch andere Wörter kannin Word durch den Einsatz von VBA weitestgehend automatisiert werden.

10.8.1 Text suchen und Schriftart formatieren

Im nächsten Beispiel soll ein Text nach einem bestimmten Wort durchsucht werden. Dergewünschte Suchbegriff wird vom Anwender über einen Dialog eingegeben. Alle gefunde-nen Wörter im Text werden mit der Schriftart TIMES NEW ROMAN, in der Schriftgröße 12 und

Page 385: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word384

dem Schriftschnitt FETT sowie der Schriftfarbe ROT formatiert. Das Listing für diese Auf-gabe lautet:

Rufen Sie mithilfe der Funktion InputBox einen Dialog auf und fragen das Suchwort vomAnwender ab. Dieses Suchwort speichern Sie in der Variablen s. Wurde im Dialog nichts ein-gegeben, bleibt die Variable s leer und Sie können das Makro direkt beenden, indem Sie dieAnweisung Exit Sub einsetzen. Wird ein Suchbegriff eingegeben, geht die Verarbeitungweiter.

Über die Methode HomeKey können Sie die Auswahl bis zum Anfang der aktuellen Doku-mentkomponente verschieben. Wenn sich die Auswahl in der Haupttextkomponente befin-det, wird die Auswahl zum Anfang des Dokuments verschoben. Diese Methode hat dieselbeFunktion, als wenn Sie die Taste (Pos 1) drücken. Starten Sie danach die Suche, indem Siedie Eigenschaft Find einsetzen. Diese Eigenschaft liefert Ihnen das Objekt Find zurück. DieSuchoptionen können durch die folgenden Eigenschaften bzw. Methoden konkreter einge-stellt werden:

Sub TexteSuchenUndKennzeichnen()Dim s As String

s = InputBox("Suchtext eingeben", "Suche")If s = "" Then Exit SubSelection.HomeKey Unit:=wdStoryWith Selection.Find .ClearFormatting .Text = s .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False End With Do While Selection.Find.Execute With Selection.Font .Name = "Times New Roman" .Size = 12 .Bold = True .Color = wdColorRed End With LoopEnd Sub

Listing 10.15: Texte suchen und formatieren

Page 386: VBA-Programmierung fur Word, Excel und Access

Rechts10.8 Texte/Formate suchen und ersetzen 385

• Setzen Sie die Methode ClearFormatting ein, um sicherzustellen, dass als Kriteriumin einer Suchen- oder Ersetzen-Operation keine Formatierungen berücksichtigt werden.

• Über die Eigenschaft Text übergeben Sie der Suchen-Funktion den Suchtext, der in derVariablen s zwischengespeichert wurde.

• Setzen Sie die Eigenschaft Forward auf den Wert True, wenn das Dokument vorwärts(zum Dokumentende hin) durchsucht werden soll. Setzen Sie diese Eigenschaft auf denWert False, wenn das Dokument rückwärts (zum Dokumentanfang hin) durchsucht wer-den soll.

• Über die Eigenschaft Wrap legen Sie bei einer Suche, die nicht am Dokumentanfangbegonnen wurde, die weitere Vorgehensweise nach Erreichen des Dokumentendes fest.Dabei können Sie der Eigenschaft folgende Konstanten zuweisen: Über die KonstantewdFindAsk wird eine Meldung mit der Frage angezeigt, ob der Rest des Dokumentsdurchsucht werden soll, nachdem die Markierung oder der Bereich durchsucht worden ist.Bei der Konstante wdFindContinue wird die Suche fortgesetzt, wenn der Anfang oderdas Ende des Suchbereichs erreicht ist. Durch den Einsatz von wdFindStop wird dieSuche beendet, wenn der Anfang oder das Ende des Suchbereichs erreicht ist.

• Setzen Sie die Eigenschaft Format auf den Wert False, wenn zum Suchtext keine For-matierungsinformationen gehören sollen.

• Über die Eigenschaft MatchCase legen Sie fest, ob Word bei der Suche zwischen Groß-und Kleinschreibung unterscheiden soll. Setzen Sie diese Eigenschaft auf den WertFalse, wenn Word keine Unterscheidung zwischen Groß- und Kleinschreibung treffensoll.

• Mithilfe der Eigenschaft MatchWholeWord können Sie bestimmen, ob bei der Sucheauch dann Suchergebnisse erzielt werden sollen, wenn der Suchbegriff in Teilen in dengefundenen Wörtern vorkommt. In diesem Fall setzen Sie die Eigenschaft auf den WertFalse. Sollen nur ganze Worte gefunden werden, setzen Sie die Eigenschaft auf denWert True.

Über die Methode Execute starten Sie die Suche. Dabei meldet diese Methode den WertTrue, solange die Suche erfolgreich ist. Diese Methode packen Sie demnach in eine Schleife,die so lange durchlaufen wird, bis keine Übereinstimmung mehr erzielt werden kann. Inner-halb der Schleife kümmern Sie sich um die Formatierung der Schrift, welche Sie über dasObjekt Font durchführen. Geben Sie in der Eigenschaft Name den Namen der gewünschtenSchriftart an. Die Eigenschaft Size setzen Sie ein, um die Größe der Schrift in der EinheitPunkte anzugeben. Setzen Sie die Eigenschaft Bold auf den Wert True, um den gefundenenSuchbegriff fett zu formatieren. Über die Eigenschaft Color können Sie die Farbe der Schriftüber eine Farbkonstante festlegen.

Page 387: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word386

Abb. 10.14 Texte suchen und kennzeichnen

10.8.2 Text suchen und Hervorhebung aktivieren

Gerade haben Sie die Formatierung der Schriftart für alle gefundenen Begriff durchgeführt.Eine alternative Möglichkeit ist, wenn Sie die gefundenen Begriffe wie mit einem Textmar-ker gelb markieren. Der Code dafür lautet:

Sub TexteSuchenUndKennzeichnen2()Dim s As String

s = InputBox("Suchtext eingeben", "Suche")If s = "" Then Exit SubSelection.HomeKey unit:=wdStoryWith Selection.Find .ClearFormatting .Text = s .Forward = True .Wrap = wdFindStop

Listing 10.16: Texthintergrund einfärben

Page 388: VBA-Programmierung fur Word, Excel und Access

Rechts10.8 Texte/Formate suchen und ersetzen 387

Mithilfe der Eigenschaft HighlightColorIndex können Sie die Hervorhebung für dengefundenen Text ansprechen. Es gelten hierbei weitestgehend dieselben Farbkonstanten, wiesie bereits vorher bei der Eigenschaft Color besprochen wurden.

Abb. 10.15 Gefundene Wörter einfärben

.Format = False .MatchCase = False .MatchWholeWord = False End With Do While Selection.Find.Execute Selection.Range.HighlightColorIndex = wdYellow LoopEnd Sub

Hinweis:

Wenn Sie diese Eigenschaft auf wdNoHighlight setzen, wird die Farbe für Hervorhe-bungen (falls vorhanden) vom angegebenen Bereich entfernt.

Listing 10.16: Texthintergrund einfärben

Page 389: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word388

Um alle Hervorhebungen in einem Dokument in einem Arbeitsgang zu entfernen, starten Siedas folgende Makro:

Über die Methode WholeStory können Sie den Text eines gesamten Dokuments markieren.Danach weisen Sie der Eigenschaft HighlightColorIndex die Konstante wdNoHigh-light zu, um alle Hervorhebungen zu entfernen.

10.8.3 Text suchen und Lesemarken setzen

Bei umfangreichen Dokumenten ist es nicht nach jedermanns Geschmack, wenn die gefun-denen Suchtexte farblich hervorgehoben bzw. die Schriftart angepasst wird. Etwas dezenterist es, wenn Sie an die Stellen der gefundenen Texte jeweils ein Lesezeichen einfügen. DieseLesezeichen können Sie dann über das Menü EXTRAS über den Befehl OPTIONEN auf derRegisterkarte ANSICHT ein- und ausblenden.

Im folgenden Makro wird der Text EIGENSCHAFT gesucht. Bei jedem Suchtreffer wird genauan dieser Stelle ein Lesezeichen eingefügt. Die Namen des jeweiligen Lesezeichens bildenSie aus dem Wort LESEZEICHEN und einer fortlaufenden Nummerierung. Das Makro für dieseLösung lautet:

Sub HervorhebungenEntfernen() Selection.WholeStory Selection.Range.HighlightColorIndex = wdNoHighlightEnd Sub

Listing 10.17: Hervorhebungen im ganzen Dokument entfernen

Sub SuchenUndLesezeichenSetzen()Dim i As Integer

Selection.HomeKey Unit:=wdStorySelection.Find.ClearFormattingWith Selection.Findi = 1 Do While .Execute(FindText:="Eigenschaft", _ Forward:=True, Wrap:=wdFindStop) = True ActiveDocument.Bookmarks.Add _ Name:="Lesezeichen" & i, Range:=Selection.Range i = i + 1 LoopEnd WithEnd Sub

Listing 10.18: Lesezeichen nach erfolgreicher Suche setzen

Page 390: VBA-Programmierung fur Word, Excel und Access

Rechts10.8 Texte/Formate suchen und ersetzen 389

Über die Methode HomeKey können Sie die Auswahl bis zum Anfang der aktuellen Doku-mentkomponente verschieben. Wenn sich die Auswahl in der Haupttextkomponente befin-det, wird die Auswahl zum Anfang des Dokuments verschoben. Setzen Sie die MethodeClearFormatting ein, um sicherzustellen, dass als Kriterium in einer Suchen- oder Erset-zen-Operation keine Formatierungen berücksichtigt werden.

Danach führen Sie die Suche in einer Schleife durch. Dabei geben Sie dieses Mal direkt beider Methode Execute den Suchtext und die näheren Spezifikationen zur Suche an. DerSuchvorgang wird so lange wiederholt, bis der Methode Execute der Wert False zurück-gegeben wird.

Ist die Suche erfolgreich, wenden Sie die Methode Add auf das Objekt Bookmark an, um einLesezeichen einzufügen. Diese Methode erwartet zwei Argumente: Im ersten ArgumentName geben Sie den Namen des Lesezeichens an. Das zweite Argument Range enthält denTextbereich, der durch die Textmarke markiert wird. Da bei der Suche jeweils das gefundeneWort markiert ist, können Sie diesem Argument den markierten Bereich (= gefundener Such-begriff) übergeben.

Abb. 10.16 Die Textmarken wurden an den Fundstellen eingefügt

Page 391: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word390

Sollten Sie die Textmarken im Dokument nicht sehen, wählen Sie aus dem Menü EXTRAS denBefehl OPTIONEN. Wechseln Sie danach auf die Registerkarte ANSICHT und aktivieren Siedas Kontrollkästchen TEXTMARKEN.

Möchten Sie nun eine bestimmte Textmarke anspringen, drücken Sie die Taste (F5). Wech-seln Sie danach auf die Registerkarte GEHE ZU und stellen im Listenfeld GEHE ZU ELEMENT

den Eintrag TEXTMARKE ein. Im rechts daneben liegenden Kombinationsfeld werden jetzt diezur Verfügung stehenden Textmarken angezeigt.

Abb. 10.17 Textmarken anspringen

Möchten Sie die Lesezeichen wieder aus Ihrem Dokument entfernen, starten Sie das folgendeMakro:

Sub LesemarkenLöschen()Dim Lesezeichen As Bookmark

For Each Lesezeichen In ActiveDocument.Bookmarks

Listing 10.19: Lesezeichen aus Dokument entfernen

Page 392: VBA-Programmierung fur Word, Excel und Access

Rechts10.8 Texte/Formate suchen und ersetzen 391

Definieren Sie im ersten Schritt eine Objekt-Variable vom Typ Bookmark. Danach setzen Sieeine Schleife auf und arbeiten alle Lesezeichen des aktiven Dokuments ab. Im Auflistungs-objekt Bookmarks sind dabei alle Lesezeichen des Dokuments verzeichnet. Wenden Sie dieMethode Delete an, um diese Lesezeichen zu entfernen.

10.8.4 Die Suchergebnisse in neues Dokument transferieren

Im folgenden Beispiel wird eine Suche nach einem bestimmten Text vorgenommen. Allegefundenen Texte sollen danach in ein neues Dokument übertragen werden. Das Makro fürdiese Aufgabe lautet:

Definieren Sie zu Beginn zwei Objektvariablen vom Typ Document. In der ersten Variablenspeichern Sie die Ausgangsmappe, in der zweiten das Zieldokument, welches Sie zunächst

Lesezeichen.DeleteNext LesezeichenEnd Sub

Sub SuchenUndInNeuesDokumentKopieren()Dim Original As DocumentDim NeuDok As Document

Set Original = ActiveDocument Set NeuDok = Documents.Add Original.Activate Selection.HomeKey unit:=wdStory With Selection.Find .ClearFormatting .Text = "Taxi" .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False End With Do While Selection.Find.Execute NeuDok.Range.InsertAfter Selection & vbCr LoopEnd Sub

Listing 10.20: Die gefundenen Wörter in neues Dokument übertragen

Listing 10.19: Lesezeichen aus Dokument entfernen

Page 393: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word392

über die Methode Add neu anlegen. Danach aktivieren Sie das Ausgangsdokument, welchesSie gerade eben in der Objektvariablen Original gespeichert haben. Setzen Sie die Markie-rung an die Startposition des Dokuments und führen die Suche durch. Ist die Suche erfolg-reich, fügen Sie die Auswahl (= gefundener Text) im neuen Dokument über die MethodeInsertAfter ein.

Abb. 10.18 Gefundene Texte wurden in neues Dokument übertragen

10.8.5 Texte suchen und ersetzen

Selbstverständlich können Sie über die Eigenschaft Find auch Texte in Dokumenten findenund durch andere Texte ersetzen lassen. Im folgenden Beispiel soll ein Dokument nach demWort BAYERN durchsucht und durch das Wort WÜRTTEMBERG ersetzt werden. Das Makro fürdiese Aufgabe lautet:

Sub TextErsetzen()

Listing 10.21: Texte suchen und ersetzen

Page 394: VBA-Programmierung fur Word, Excel und Access

Rechts10.8 Texte/Formate suchen und ersetzen 393

Über die Methode HomeKey können Sie die Auswahl bis zum Anfang der aktuellen Doku-mentkomponente verschieben. Wenn sich die Auswahl in der Haupttextkomponente befin-det, wird sie zum Anfang des Dokuments verschoben. Setzen Sie die Methode ClearFor-matting ein, um sicherzustellen, dass als Kriterium in der Ersetzen-Operation keineFormatierungen berücksichtigt werden.

Legen Sie danach die einzelnen Kriterien für den Ersetzen-Vorgang fest. Starten sie den Vor-gang, indem sie die Methode Execute einsetzen. Im Argument Replace geben Sie die Kon-stante wdReplaceAll an, damit alle Texte ersetzt werden. Weitere gültige Konstanten fürdieses Argument wären wdReplaceOne, um den Ersetzen-Vorgang nach einer Ersetzungabzubrechen, bzw. wdReplaceNone, um überhaupt keine Ersetzung vorzunehmen.

Abb. 10.19 Aus Bayern wurde Württemberg

Selection.HomeKey unit:=wdStory Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "Bayern" .Replacement.Text = "Württemberg" .Wrap = wdFindStop End With Selection.Find.Execute Replace:=wdReplaceAllEnd Sub

Listing 10.21: Texte suchen und ersetzen

Page 395: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word394

Im vorherigen Beispiel wurde ein Text durch einen anderen im Hauptbereich des Dokumentsersetzt. Dabei würde diese Methode Texte in Kopf- und Fußzeilen nicht austauschen. WennSie daher den Ersetzenvorgang auch auf andere Sektionen als den Hauptbereich eines Doku-ments ausweiten möchten, erfassen Sie folgendes Makro:

Die Eigenschaft StoryRanges gibt eine StoryRanges-Auflistung zurück, die alle Doku-mentkomponenten im Dokument darstellt. Diese Auflistung enthält sowohl den Haupttexteines Dokuments wie auch Fußnoten, Kopf- und Fußzeilen.

10.8.6 Formate suchen und entfernen

Das Umformatieren von Dokumenten kann schon ganz schön schweißtreibend sein, wenn Siedas manuell vornehmen. In diesem Fall eignet sich der Einsatz von Makros, um diese Auf-gabe sicher und schnell auszuführen.

Im nächsten Beispiel sollen alle Texte, die den Schriftschnitt FETT haben, angepackt werden.Dabei soll die Fett-Formatierung entfernt werden. Die Lösung für diese Aufgabenstellungfinden Sie im folgenden Listing:

Sub TextFindenUndErsetzenInAllenDokumentTeilen()Dim Bereich As Range

For Each Bereich In ActiveDocument.StoryRanges With Bereich.Find .Text = "Bayern" .Replacement.Text = "Württemberg" .Wrap = wdFindContinue .Execute Replace:=wdReplaceAll End WithNext BereichEnd Sub

Listing 10.22: Texte suchen und ersetzen (im gesamten Dokument)

Sub FormateEntfernen()With ActiveDocument.Content.Find .ClearFormatting .Font.Bold = True With .Replacement .ClearFormatting .Font.Bold = False End With .Execute FindText:="", ReplaceWith:="", _

Listing 10.23: Formatierungen aus dem Dokument entfernen

Page 396: VBA-Programmierung fur Word, Excel und Access

Rechts10.8 Texte/Formate suchen und ersetzen 395

Setzen Sie die Bold-Eigenschaft für das Find-Objekt auf den Wert True. Für das Repla-cement-Objekt setzen Sie die Eigenschaft Bold auf den Wert False. Starten Sie denSuchen- und Ersetzenvorgang, indem Sie die Methode Execute einsetzen und das ArgumentReplace auf den Wert wdReplaceAll setzen. Damit werden alle Fett-Formatierungen ausdem Dokument entfernt.

Abb. 10.20 Formatierungen wurden entfernt (vorher – nachher)

10.8.7 Formate suchen und ergänzen

Möchten Sie nach einer bestimmten Formatierung suchen und der Formatierung eine weitereFormatierung hinzufügen, können Sie dies ohne Probleme tun. Im folgenden Beispiel sollnach der Formatierung FETT gesucht und diese durch den Schriftschnitt KURSIV ergänzt wer-den.

Sehen Sie die Lösung dieser Aufgabenstellung im folgenden Listing:

Format:=True, Replace:=wdReplaceAllEnd WithEnd Sub

Listing 10.23: Formatierungen aus dem Dokument entfernen

Page 397: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word396

Setzen Sie die Bold-Eigenschaft für das Find-Objekt auf den Wert True, um die Textpas-sagen zu finden, die mit dem Schriftschnitt FETT formatiert wurden. Für das Replacement-Objekt setzen Sie die Eigenschaft Italic auf den Wert True. Damit weisen Sie der Forma-tierung einen weiteren Schriftschnitt, nämlich KURSIV zu. Starten Sie den Formatergänzungs-vorgang, indem Sie die Methode Execute einsetzen und das Argument Replace auf denWert wdReplaceAll setzen. Damit werden alle Fett-Formatierungen um den Kursivdruckerweitert.

Abb. 10.21 Ein weiterer Schriftschnitt wurde hinzugefügt

Sub FormateErgänzen()With ActiveDocument.Content.Find .ClearFormatting .Font.Bold = True With .Replacement .ClearFormatting .Font.Italic = True End With .Execute FindText:="", ReplaceWith:="", _ Format:=True, Replace:=wdReplaceAllEnd WithEnd Sub

Listing 10.24: Formatierungen ergänzen

Page 398: VBA-Programmierung fur Word, Excel und Access

Rechts10.9 Arbeiten mit Hyperlinks 397

10.9 Arbeiten mit Hyperlinks

Seit der Version Office 97 können Sie Hyperlinks in Ihren Dateien verwenden. Damit könnenSie aus Ihren Dokumenten Sprünge zu Internetseiten durchführen. Sie haben aber auch dieMöglichkeit, die Office-Dateien untereinander sinnvoll zu verbinden.

10.9.1 Hyperlinks in Dokumenten löschen

Standardmäßig werden E-Mail-Adressen und die Adressen von Internetseiten von Wordautomatisch erkannt und in Hyperlinks umgewandelt. Diese Funktonalität ist aber nichtimmer erwünscht.

Im folgenden Makro werden alle Hyperlinks in einem Dokument entfernt. Dabei bleiben die»Hyperlink-Texte« aber noch erhalten. Lediglich die Funktion sowie die Formatierung desHyperlinks sollen dabei entfernt werden.

In einer Schleife arbeiten Sie alle im Dokument enthaltenen Hyperlinks ab und löschen überdie Methode Delete einen nach dem anderen. Die Schleife wird in diesem Fall vom letztenHyperlink beginnend bis zum ersten Hyperlink im Dokument durchgeführt.

10.9.2 Hyperlink einfügen

Zum Einfügen eines Hyperlinks setzen Sie die Methode Add ein, die Sie auf das ObjektHyperlink anwenden. Im folgenden Listing fügen Sie an die aktuelle Position in IhremDokument einen Hyperlink ein, der auf ein anderes Dokument auf Ihrer Festplatte verweist.

Sub LöschenHyperlinks()Dim i As Long

For i = ActiveDocument.Hyperlinks.Count To 1 Step -1 ActiveDocument.Hyperlinks(i).DeleteNext iEnd Sub

Listing 10.25: Alle Hyperlinks aus einem Dokument entfernen

Sub HyperlinkEinfügen()ActiveDocument.Hyperlinks.Add _Anchor:=Selection.Range, _Address:="D:\Eigene Dateien\Artikel.doc", _TextToDisplay:="Hier klicken, um die Datei zu öffnen", _ScreenTip:="Keine Angst vor dem Klick!"End Sub

Listing 10.26: Einen Hyperlink einfügen

Page 399: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word398

Im Argument Anchor geben Sie die Adresse der momentan aktiven Stelle im Dokument an.Das Argument Address beinhaltet die Adresse des Hyperlinks, in dem Sie den Namen desverknüpften Dokuments angeben. Im Argument ScreenTip können Sie den Text für dieQuickInfo bestimmen, der angezeigt wird, wenn Sie mit der Maus über den Hyperlink strei-chen. Der eigentliche Text, mit dem der Hyperlink beschriftet wird, geben Sie über das Argu-ment TextToDisplay an.

Abb. 10.22 Der Hyperlink wurde eingefügt

10.9.3 Bilderhyperlinks einfügen

Eine interessante Variante für den Einsatz von Hyperlinks ist, Bilder aus einem bestimmtenVerzeichnis per Hyperlink in ein Dokument einzubinden. Die Bilder werden dadurch nichtdirekt im Dokument gespeichert, sondern eben nur verlinkt. Mit einem Klick auf dengewünschten Hyperlink wird das Bild geladen.

Im ersten Schritt lesen Sie die Bilddateien aus einem vorher angelegten Verzeichnis in einneues Dokument ein.

Sub BilderNamenEinlesen()Dim s As StringConst verz = "D:\Bilder\"

On Error GoTo fehlerChDrive verzChDir verz

Listing 10.27: Die Dateinamen der Bilder werden in ein neues Dokument eingelesen

Page 400: VBA-Programmierung fur Word, Excel und Access

Rechts10.9 Arbeiten mit Hyperlinks 399

Wechseln Sie über die Anweisung ChDrive auf das gewünschte Laufwerk, auf dem sich dasVerzeichnis Bilder befindet. Mit der Anweisung ChDir sorgen Sie dafür, dass Sie sich auchwirklich im angegebenen Verzeichnis befinden. Danach fügen Sie ein neues, noch leeresDokument über die Methode Add ein. Lesen Sie nun das Verzeichnis aus, indem Sie dieFunktion Dir einsetzen. In einer Schleife wiederholen Sie den Suchvorgang so lange, bis dieFunktion einen leeren Wert als Ergebnis zurückliefert. Schreiben Sie die Namen der gefun-denen Dateien über die Methode InsertAfter in das Dokument. Fügen Sie mithilfe derMethode InsertParagraphAfter eine Absatzmarke nach jedem gefundenen undgeschriebenen Dateinamen ein.

Abb. 10.23 Die Dateinamen der Bilder wurden eingefügt

Im nächsten Schritt wandeln Sie die Dateinamen in Hyperlinks um. Dabei fügen Sie die ein-zelnen Namen zunächst in eine Tabelle ein und erstellen direkt im Anschluss die Hyperlinks.

Documents.Adds = Dir(verz)Do While s <> "" Selection.InsertAfter s Selection.InsertParagraphAfter s = DirLoop Exit Subfehler:MsgBox "Es gibt kein Verzeichnis mit dem Namen " & verzEnd Sub

Listing 10.27: Die Dateinamen der Bilder werden in ein neues Dokument eingelesen

Page 401: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word400

Im ersten Schritt zählen Sie mithilfe der Anweisung ActiveDocument.Para-graphs.Count die Anzahl der verwendeten Zeilen im neuen Dokument. Danach markierenSie über die Anweisung ActiveDocument.Content.Select alle Zeilen im Dokument.

Wandeln Sie über die Methode ConvertToTable den Text innerhalb des Bereichs in eineTabelle um. Dabei müssen Sie einige Argumente angeben, damit Word weiß, wie es den Textin eine Tabelle bringen soll. Unter anderem geben Sie im Argument Separator das Zeichenan, nach dem Word den Text jeweils in eine neue Spalte der Tabelle trennen soll. Da es sichlediglich um Dateinamen handelt, die Zeile für Zeile eingelesen wurden, geben Sie hier dieKonstante wdSeparateByParagraphs an. Die Anzahl der Spalten im Argument Num-Columns können Sie mit dem Wert 1 füllen. Die Anzahl der Zeilen haben Sie vorher ermitteltund in der Variablen i zwischengespeichert. Weisen Sie nun diesen Inhalt dem Argument zu.

Nach der erfolgreichen Überführung des Textes in eine Tabelle kümmern Sie sich um dasFormat der Tabelle. Unter anderem können Sie über die Eigenschaft Style festlegen, dassSie ein Gitternetz haben möchten. Danach geben Sie im Einzelnen an, an welchen Teilen derTabelle dieses Gitternetz eingefügt werden soll. Diese Formatierung steuern Sie, indem Siedie einzelnen Eigenschaften der Tabellenkomponenten mit dem Wert True bzw. False aus-statten.

Sub HyperlinksHerstellen()Dim Bereich As RangeDim zelle As CellConst verz = "D:\Bilder\"

i = ActiveDocument.Paragraphs.CountActiveDocument.Content.SelectSelection.ConvertToTable Separator:=wdSeparateByParagraphs, _NumColumns:=1, NumRows:=i With Selection.Tables(1) .Style = "Tabellengitternetz" .ApplyStyleHeadingRows = True .ApplyStyleLastRow = False .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = False End With

For Each zelle In Selection.Tables(1).Columns(1).Cells Set Bereich = zelle.Range Bereich.SetRange Start:=Bereich.Start, End:=Bereich.End - 1 Selection.Hyperlinks.Add Anchor:=Bereich, Address:= _ verz & Bereich.Text, SubAddress:="" Selection.MoveDown Unit:=wdLine, Count:=1Next zelleEnd Sub

Listing 10.28: Dateinamen in Hyperlinks wandeln

Page 402: VBA-Programmierung fur Word, Excel und Access

Rechts10.10 Bilder in Dokumenten verarbeiten 401

In einer anschließenden Schleife arbeiten Sie alle Zellen der ersten Spalte, welche in diesemBeispiel auch die letzte Spalte ist, ab. Innerhalb der Schleife fügen Sie Hyperlinks ein, indemSie die Methode Add einsetzen.

Bewegen Sie nach dem Einfügen des Hyperlinks den Mauszeiger über die Methode Move-Down eine Zelle weiter nach unten, indem Sie die Einheit für die Verschiebung über die Kon-stante wdLine angeben. Die eigentliche Anzahl der zu verschiebenden Einheiten geben Sieim Argument Count an.

Abb. 10.24 Die einzelnen Dateinamen wurden in Hyperlinks umgesetzt

10.10 Bilder in Dokumenten verarbeiten

Dokumente enthalten in vielen Fällen Bilder, um den Text ein wenig aufzulockern und somitauch die Verständlichkeit zu erhöhen. Bilder können Sie entweder verknüpft oder unver-knüpft in ein Dokument einfügen.

10.10.1 Bild einfügen

Im nächsten Beispiel fügen Sie ein Bild in ein Dokument ein. Dabei wird das Bild nicht mit demDokument gespeichert, sondern es soll lediglich in das Dokument hineinverknüpft werden.

Sub BildEinfügen()Selection.InlineShapes.AddPicture FileName:= _ "D:\Eigene Dateien\Eigene Bilder\Eisberg.jpg", _

Listing 10.29: Ein Bild in ein Dokument einfügen

Page 403: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word402

Fügen Sie mithilfe der Methode AddPicture ein Bild Ihrem Dokument hinzu. Dabei gebenSie den Namen der Bilddatei im Argument FileName an. Setzen Sie den Wert der Eigen-schaft LinkToFile auf den Wert True, um das Bild mit der Datei zu verknüpfen, aus der eserstellt wurde. Weisen Sie der Eigenschaft dagegen den Wert False zu, um das Bild als sepa-rate Kopie der Datei zu erstellen. Im Argument SaveWithDocument können Sie bestimmen,ob Sie das Bild mit dem Dokument speichern möchten, was sich natürlich auf die Größe desDokuments auswirkt.

Abb. 10.25 Eine Bilddatei wurde eingefügt

10.10.2 Mehrere Bilder einfügen

Möchten Sie mehrere Bilder in ein Dokument einfügen und dabei auch noch die Größe derBilder manipulieren, starten Sie das folgende Makro:

LinkToFile:=True, SaveWithDocument:=FalseEnd Sub

Sub BilderInDokumentEinfügen()Dim s As StringConst verz = "D:\Bilder\"

Listing 10.30: Mehrere Bilder verkleinert in ein Dokument einfügen

Listing 10.29: Ein Bild in ein Dokument einfügen

Page 404: VBA-Programmierung fur Word, Excel und Access

Rechts10.10 Bilder in Dokumenten verarbeiten 403

Wechseln Sie über die Anweisung ChDrive auf das gewünschte Laufwerk, auf dem sich dasVerzeichnis Bilder befindet. Mit der Anweisung ChDir sorgen Sie dafür, dass Sie sich auchwirklich im angegebenen Verzeichnis befinden. Danach fügen Sie ein neues, noch leeresDokument über die Methode Add ein. Lesen Sie nun das Verzeichnis aus, indem Sie dieFunktion Dir einsetzen. In einer Schleife wiederholen Sie den Suchvorgang so lange, bis dieFunktion einen leeren Wert als Ergebnis zurückliefert.

Innerhalb der Schleife wenden Sie die Methode AddPicture an, um die einzelnen Bilder insDokument einzufügen. Den Namen sowie den Pfad der Bilddatei haben Sie bereits über dieKonstante Verz bzw. die Variable s ermittelt. Nach dem Einfügen eines Bildes passen Siedieses über die Eigenschaft Height in der Höhe sowie die Eigenschaft Width in der Breitean.

Fügen Sie mithilfe der Methode InsertParagraphAfter eine Absatzmarke nach jedemgefundenen und geschriebenen Dateinamen ein.

Dim bild As InlineShape

On Error GoTo fehlerChDrive verzChDir verz

Documents.Adds = Dir(verz)i = 1

Do While s <> "" Selection.InlineShapes.AddPicture FileName:= _ verz & s, LinkToFile:=True, _ SaveWithDocument:=False Set bild = ActiveDocument.InlineShapes(i) bild.Height = 100 bild.Width = 100 i = i + 1 Selection.InsertParagraphAfter s = DirLoop Exit Subfehler:MsgBox "Es gibt kein Verzeichnis mit dem Namen " & verzEnd Sub

Listing 10.30: Mehrere Bilder verkleinert in ein Dokument einfügen

Page 405: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word404

Abb. 10.26 Erinnert stark an die Miniaturansicht vom Windows-Explorer

10.10.3 Bilder dokumentieren

In der nächsten Aufgabe sollen alle Bilder eines Dokuments in einem separaten Dokumentdokumentiert werden. Dabei soll auf schnelle Art und Weise ermittelt werden, wo die ver-knüpften Bilder gespeichert sind.

Im folgenden Makro wird zunächst das Makro BilderInDokumentEinfügen aufgerufen,welches die Bilder aus einem bestimmten Verzeichnis verkleinert in ein neues Dokument ein-fügt. Danach wird wiederum ein neues Dokument eingefügt, in welchem die Verknüpfungs-informationen ausgegeben werden.

Sub BilderDokumentieren()Dim Original As DocumentDim NeuDok As DocumentDim Bild As InlineShape

BilderInDokumentEinfügen

Set Original = ActiveDocument Set NeuDok = Documents.Add

Listing 10.31: Eingefügte Bilder dokumentieren

Page 406: VBA-Programmierung fur Word, Excel und Access

Rechts10.10 Bilder in Dokumenten verarbeiten 405

Arbeiten Sie in einer Schleife alle eingefügten Bilder ab. Mithilfe der Eigenschaft LinkFor-mat gewinnen Sie Zugriff auf die Verknüpfungsinformationen. Über die EigenschaftSourceFullName ermitteln Sie den Speicherpfad der eingefügten Bilddateien.

Abb. 10.27 Die Verknüpfungsadressen der Bilder wurden ausgegeben

10.10.4 Verknüpfte Bilder im Dokument aktualisieren

Haben Sie eine ganze Reihe von Bildern in Ihr Dokument verknüpft eingefügt, müssen Sieden kompletten Inhalt des Dokuments markieren und die Taste (F9) drücken, um alle Ver-knüpfungen im Dokument zu aktualisieren.

Original.Activate For Each Bild In ActiveDocument.InlineShapes NeuDok.Range.InsertAfter Bild.LinkFormat.SourceFullName NeuDok.Range.InsertParagraphAfter Next BildEnd Sub

Listing 10.31: Eingefügte Bilder dokumentieren

Page 407: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word406

Diese Aufgabe können Sie aber auch über ein Makro lösen, das Sie im nächsten Listingsehen:

Über die Methode Update werden die Linkinformationen für die Bilderaktualisiert.

10.11 Arbeiten mit Tabellen

Beim Einfügen von Tabellen haben Sie eine ganze Reihe von Formatierungsmöglichkeiten.So können Sie den Typ des äußeren wie auch des inneren Rahmens einer Tabelle bestimmenoder einzelne Zellen mit Hintergrundfarben belegen und vieles mehr.

10.11.1 Tabelle einfügen, füllen und formatieren

Im ersten Beispiel zur Tabellenverarbeitung fügen Sie eine Tabelle mit 10 Zeilen und 2 Spal-ten ein. Danach schreiben Sie in jede Zelle einen Text und formatieren die Tabelle. Der Codefür diese Aufgabe lautet:

Sub VerknüpfteBilderaktualisieren()Dim Bild As InlineShape

For Each Bild In ActiveDocument.InlineShapes Bild.LinkFormat.UpdateNext BildEnd Sub

Listing 10.32: Eingefügte Bilder aktualisieren

Sub TabelleAnlegen()Dim DokuNeu As DocumentDim Tabelle As Table

Set NeuDoku = Documents.Add

Set Tabelle = NeuDoku.Tables.Add(Selection.Range, 10, 2)For i = 1 To 10 With Tabelle .Cell(i, 1).Range.InsertAfter "Eintrag" & i .Cell(i, 2).Range.InsertAfter "Erklärung" & i End WithNext i

Listing 10.33: Tabelle einfügen, füllen und formatieren (Variante 1)

Page 408: VBA-Programmierung fur Word, Excel und Access

Rechts10.11 Arbeiten mit Tabellen 407

Legen Sie im ersten Schritt ein neues Dokument über die Methode Add an. Damit fügen Sieder Auflistung Documents ein weiteres Dokument hinzu.

Danach fügen Sie ebenso mithilfe der Methode Add ein neue Tabelle in Ihr Dokument ein.Diese Methode wenden Sie in diesem Fall auf die Auflistung Tables an. Diese Methodebenötigt einige Argumente: Im Argument Range wird der Bereich angegeben, in dem dieTabelle angezeigt werden soll. Im zweiten Argument geben Sie die gewünschte Anzahl vonZeilen für Ihre neue Tabelle an. Das letzte Argument steht für die gewünschte Anzahl vonSpalten.

In einer Schleife füllen Sie mithilfe der Methode Cell bzw. der Methode InsertAfter dieeinzelnen Zellen der Tabelle. Dabei setzen Sie eine Zählvariable ein, die für die jeweiligeZeile stehen soll. Die Spaltenangabe setzen Sie mit dem Wert 1, um die Spalte 1 anzuspre-chen, usw.

Formatieren Sie danach die Umrandung der Tabelle bzw. der einzelnen Tabellenzellen mit-hilfe der Eigenschaft Border. Dabei sprechen Sie den äußeren Rahmen der Tabelle über dieEigenschaft OutsideLineStyle an. Den Zellrahmen können Sie über die EigenschaftInsideLineStyle ansprechen. Für beide Eigenschaften können Sie so genannte Style-Konstanten einsetzen. Welche Konstanten dabei zur Verfügung stehen, können Sie ganzschnell ermitteln, wenn Sie die Eigenschaft im Codebereich eingeben und danach das Gleich-heitszeichen einsetzen. Direkt im Anschluss klappt ein Kontextmenü herunter, welches alleStyle-Konstanten anzeigt.

Über die Eigenschaft OutsideLineWidth können Sie die Linienstärke des Außenrahmenseines Objekts festlegen.

With ActiveDocument.Tables(1).Borders.OutsideLineStyle = wdLineStyleDot.OutsideLineWidth = wdLineWidth300pt.InsideLineStyle = wdLineStyleSingleEnd WithEnd Sub

Listing 10.33: Tabelle einfügen, füllen und formatieren (Variante 1)

Page 409: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word408

Abb. 10.28 Die formatierte Tabelle in einem neuen Dokument

Im folgenden Beispiel fügen Sie für die Zellen der ersten Spalte die Hintergrundfarbe GOLD

ein. Das Listing sieht dabei wie folgt aus:

Sub TabelleAnlegen2()Dim DokuNeu As DocumentDim Tabelle As Table

Set NeuDoku = Documents.Add

Set Tabelle = NeuDoku.Tables.Add(Selection.Range, 10, 2)For i = 1 To 10 With Tabelle .Cell(i, 1).Range.InsertAfter "Eintrag" & i .Cell(i, 1).Shading.BackgroundPatternColor = wdColorGold .Cell(i, 2).Range.InsertAfter "Erklärung" & i End WithNext iWith ActiveDocument.Tables(1).Borders.OutsideLineStyle = wdLineStyleDouble.OutsideLineWidth = wdLineWidth150pt

Listing 10.34: Tabelle einfügen, füllen und formatieren (Variante 2)

Page 410: VBA-Programmierung fur Word, Excel und Access

Rechts10.11 Arbeiten mit Tabellen 409

Über die Eigenschaft Shading gewinnen Sie Zugriff auf das »Schattierungsobjekt«. Dabeikönnen Sie mithilfe der Eigenschaft BackgroundPatternColor den Hinergrund der ein-zelnen Zellen über Farbkonstanten bestimmen.

Welche Konstanten dabei zur Verfügung stehen, können Sie ganz schnell ermitteln, wenn Siedie Eigenschaft BackgroundPatternColor im Codebereich eingeben und danach dasGleichheitszeichen einsetzen. Direkt im Anschluss klappt ein Kontextmenü herunter, wel-ches alle Farb-konstanten anzeigt.

Abb. 10.29 Farblich hinterlegte Zellen

.InsideLineStyle = wdLineStyleSingleEnd WithEnd Sub

Listing 10.34: Tabelle einfügen, füllen und formatieren (Variante 2)

Page 411: VBA-Programmierung fur Word, Excel und Access

Links

10 Die Programmierung mit Word410

10.11.2 Tabelle löschen

Möchten Sie eine Tabelle aus Ihrem Dokument löschen, können Sie mit der Methode Deletearbeiten.

Sub TabelleLöschen() ActiveDocument.Tables(1).DeleteEnd Sub

Listing 10.35: Tabelle löschen

Page 412: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang411

11 Programmierung mit Access

Bei der Programmierung mit Access steht Ihnen kein Makrorekorder wie in Word oder Excelzur Verfügung. Der Einstieg ist daher nicht ganz so einfach. Trotzdem können Sie mithilfeder Online-Hilfe und des Objektkatalogs doch recht schnell zu Ergebnissen kommen. Bei derProgrammierung mit Access-Datenbanken werden Sie es hauptsächlich mit Tabellen undAbfragen zu tun haben. Die Erstellung von Formularen wird Ihnen in Access weitestgehendvom Formular-Assistenten abgenommen. Einzelne Formulare lassen sich durch VBA-Ereig-nisse aber darüber hinaus noch weiter automatisieren und verbessern.

11.1 Das Programmieren von Tabellen

Die Standardaufgaben in der Tabellenverarbeitung können Sie durch den Einsatz einesObjekts erreichen. Das Objekt heißt DoCmd. Die Aktionen, die Sie mithilfe dieses Objektsdurchführen können, reichen über das Öffnen von Tabellen über Filtern, Drucken und Kopie-ren bis hin zum Schließen bzw. Speichern einer Tabelle. Lernen Sie jetzt den Einsatz diesesObjekts anhand einiger typischer Aufgaben kennen.

11.1.1 Tabelle öffnen

In der ersten Aufgabe soll eine Tabelle geöffnet werden. Das dafür notwendige Makro kön-nen Sie im nächsten Listing sehen:

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap11 unter demNamen ACCESSDEMOS.MDB finden.

Sub ÖffnenTabelle()On Error GoTo fehlerM DoCmd.OpenTable "Kontaktpersonen", acViewNormalExit Sub

fehlerM:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.1: Eine Tabelle wird geöffnet

Page 413: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access412

Bevor Sie die Methode OpenTable anwenden, sollten Sie sicherstellen, dass es zu keinemMakrofehler kommt, wenn die angegebene Tabelle nicht gefunden werden kann. Dabei set-zen Sie die Anweisung On Error Goto FehlerM ein. Tritt ein Fehler auf, wird in den Para-graphen FehlerM verzweigt und eine Fehlermeldung am Bildschirm angezeigt.

Über den Einsatz der Methode OpenTable öffnen Sie eine Tabelle in Access. Diese Methodehat folgende Syntax:

OpenTable(Tabellenname, Ansicht, Datenmodus)

Im Argument Tabellename geben Sie den Namen der Tabelle an, die geöffnet werden soll.

Beim Argument Ansicht legen Sie fest, wie die Tabelle angezeigt werden soll. Dabei stehenIhnen mehrere Konstanten zur Verfügung:

• acViewDesign: Öffnet die Tabelle in der Entwurfsansicht.

• acViewNormal: Öffnet die Tabelle in der Datenblattansicht (Standardeinstellung).

• acViewPivotChart: Stellt die Tabelle für ein Pivot-Diagramm zur Verfügung.

• acViewPivotTable: Hiermit können Sie die Felder der Tabelle für eine Pivot-Tabelleverwenden.

• acViewPreview: Zeigt die Tabelle in der Seitenansicht an.

Beim letzten Argument Datenmodus bestimmen Sie, ob Änderungen an der Tabelle durch-geführt werden dürfen oder nicht. Dabei können Sie folgende Konstanten einsetzen:

• acAdd: Der Anwender darf neue Datensätze hinzufügen, jedoch keine bestehendenDatensätze ändern.

• acEdit: Der Anwender darf bestehende Datensätze ändern und neue Datensätze hinzu-fügen (Standardeinstellung).

• acReadOnly: Der Anwender darf die vorhandenen Datensätze nur ansehen.

Abb. 11.1 Die Tabelle Kontaktpersonen wurde geöffnet

Page 414: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 413

11.1.2 Tabelle öffnen und durchsuchen

Beim Öffnen einer Tabelle können Sie den Mauszeiger schon auf einen ganz bestimmten Satzsetzen. Beim folgenden Beispiel wird in der Tabelle Kontaktpersonen der Anwender Schmidtgesucht und der Mauszeiger auf diesen Satz positioniert.

Mithilfe der Methode FindRecord können Sie schon beim Aufruf der Tabelle einenbestimmten Datensatz suchen und markieren lassen. Die Methode FindRecord hat folgendeSyntax:

FindRecord(SuchenNach, Vergleichen, GroßKlein, Suchen, WieFormatiert,NurAktuellesFeld, AmAnfangBeginnen)

Im Argument SuchenNach geben Sie den Suchtext an, den Sie in der Tabelle suchen möch-ten.

Das Argument Vergleichen gibt an, in welchem Feld sich die Daten befinden. Sie könneneine Suche nach Daten in einem beliebigen Teil des Feldes (acAnywhere), Daten, die dasgesamte Feld ausfüllen (acEntire), oder Daten, die sich am Anfang des Feldes befinden(acStart), angeben. Als Standardeinstellung ist immer der gesamte Feldinhalt, also dieKonstante acEntire, vorgesehen.

Im Argument GroßKlein legen Sie fest, ob bei der Suche zwischen Groß- und Kleinschrei-bung unterschieden werden soll. Wenn ja, setzen Sie dieses Argument auf den Wert True.

Im Argument Suchen wird die Suchreihenfolge festgelegt. Sie können dabei die folgendenKonstanten einsetzen:

• acDown: Die Suche wird vom aktuellen Datensatz bis zum Ende der Tabelle durchge-führt.

• acUp: Die Suche wird vom aktuellen Datensatz bis zum Anfang der Tabelle durchgeführt.

• acSearchAll: Die Suche wird bis zum Ende der Datensätze und dann vom Anfang derDatensätze bis zum aktuellen Datensatz durchgeführt. Somit werden alle Datensätzedurchsucht.

Sub ÖffnenTabelleUndVoreinstellen()On Error GoTo fehlerM DoCmd.OpenTable "Kontaktpersonen", acViewNormal DoCmd.FindRecord "Schmidt", acEntire, _ True, acSearchAll, True, acAllExit Sub

fehlerM:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.2: Eine Tabelle wird geöffnet und durchsucht

Page 415: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access414

Über das Argument WieFormatiert können Sie festlegen, ob die Suche auch formatierteDaten umfassen soll. Setzen Sie dieses Argument auf den Wert True, um nach formatiertenDaten zu suchen.

Beim Argument NurAktuellesFeld können Sie bestimmen, ob Access seine Suche nur aufdie momentan aktive Spalte beziehen soll. In diesem Fall geben Sie die Konstante acCur-rent an. Möchten Sie den angegebenen Suchbegriff in allen Zellen der Tabelle suchen, set-zen Sie die Konstante acAll ein.

Das Argument AmAnfangBeginnen legt fest, ob die Suche beim ersten Satz oder beim aktu-ellen Datensatz beginnen soll. Geben Sie diesem Argument den Wert True, um die Suchebeim ersten Datensatz zu beginnen. Verwenden Sie den Wert False, um die Suche in demDatensatz zu beginnen, der auf den aktuellen Datensatz folgt.

Abb. 11.2 Der Anwender Schmidt wurde gefunden

11.1.3 Tabelle öffnen und positionieren

Eine weitere Möglichkeit, eine Tabelle zu öffnen und einen bestimmten Datensatz auszuwäh-len, bietet Ihnen die Methode GoToRecord.

Im folgenden Beispiel wird die Tabelle Kontaktpersonen geöffnet und der letzte Datensatzmarkiert.

Sub ÖffnenTabelleUndEinstellen()On Error GoTo fehlerM DoCmd.OpenTable "Kontaktpersonen", acViewNormal DoCmd.GoToRecord acDataTable, "Kontaktpersonen", acLast Exit Sub

Listing 11.3: Eine Tabelle wird geöffnet und auf einen bestimmten Datensatz eingestellt

Page 416: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 415

Die Methode GoToRecord hat folgende Syntax:

GoToRecord(Objekttyp, Objektname, Datensatz, Offset)

Im Argument Objekttyp müssen Sie angeben, um welchen Objekttyp es sich dabei handelt.Es stehen Ihnen hierfür folgende Konstanten zur Verfügung:

• acActiveDataObject: Bei dieser Konstanten handelt es sich um die Standardeinstel-lung, die vorgibt, dass das aktive Objekt verwendet wird. Im letzten Beispiel ist dieTabelle gemeint.

• acDataForm: Die Methode GoToRecord wird in einem Formular eingesetzt.

• acDataFunction: Die Methode GoToRecord wird in einer Funktion verwendet.

• acDataQuery: Hier kommt die Methode GoToRecord bei einer Abfrage zum Einsatz.

• acDataServerView: Der Einsatz der Methode GoToRecord wird in der Serversichtdurchgeführt.

• acDataStoredProcedure: Die Methode GoToRecord wird anhand einer gespeicher-ten Prozedur ausgeführt.

• acDataTable: Die Methode GoToRecord wird in einer Tabelle ausgeführt.

Beim Argument Objektname müssen Sie den Namen der Objekte angeben. Auf unser Bei-spiel bezogen ist das die Tabelle Kontaktpersonen.

Im Argument Datensatz bestimmen Sie über eine Konstante, welcher der aktuelle Daten-satz sein soll. Dabei stehen Ihnen folgende Konstanten zur Verfügung:

• acFirst: Der erste Datensatz wird zum aktuellen Datensatz gemacht.

• acGoTo: Mit dieser Konstante können Sie über einen numerischen Wert festlegen, aufwelchen Datensatz positioniert werden soll.

• acLast: Der letzte Datensatz in der Tabelle wird zum aktuell ausgewählten gemacht.

• acNewRec: Damit machen Sie den neu eingefügten Datensatz zum aktuellen Datensatz.

• acNext: Hierbei handelt es sich um die Standardeinstellung von Access, die vorgibt, dassder nächste Datensatz zum aktuellen Datensatz gemacht werden soll. Dabei müssen Siewie schon bei der Konstanten acGoTo einen numerischen Wert angeben, um die genauePosition zu bestimmen.

• acPrevious: Bei dieser Konstanten wird der vorherige Satz zum aktuellen Datensatzgemacht. Auch hier muss noch ein numerischer Wert angegeben werden.

fehlerM:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.3: Eine Tabelle wird geöffnet und auf einen bestimmten Datensatz eingestellt

Page 417: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access416

Beim letzten Argument Offset geben Sie einen numerischen Wert an. Dieser numerischeWert gibt die Anzahl der Datensätze an, um die vorwärts oder rückwärts geblättert werdensoll, wenn Sie für das Argument Datensatz acNext oder acPrevious angegeben haben,oder den Datensatz, zu dem Sie wechseln möchten, wenn Sie für das Argument DatensatzacGoTo angegeben haben.

Abb. 11.3 Der letzte Satz einer Tabelle wurde markiert

11.1.4 Tabelle öffnen und filtern

Eine weitere gängige Möglichkeit, eine bestimmte Vorauswahl an Datensätzen in einerTabelle nach dem Öffnen der Tabelle anzuzeigen, bietet der Einsatz eines Filters.

Im folgenden Beispiel werden alle Kontaktadressen aus Deutschland angezeigt.

Im Listing setzen Sie die Methode ApplyFilter ein, um einen Filter zu setzen. Dabei hatdiese Methode folgende Syntax:

Sub ÖffnenTabelleUndFiltern()On Error GoTo fehlerM DoCmd.OpenTable "Kontaktpersonen", acViewNormal DoCmd.ApplyFilter "Länderauswahl", _ "[Land/Region] = 'Deutschland'"Exit Sub

fehlerM:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.4: Eine Tabelle wird geöffnet und gefiltert

Page 418: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 417

ApplyFilter(Filtername, Bedingung)

Im Argument Filtername können Sie dem Filter einen Namen geben oder dieses Argumentleer lassen. Beim Argument Bedingung müssen Sie ein Filterkriterium eingeben. Achten Siedabei darauf, dass Sie den richtigen Feldnamen des Feldes verwenden, welches Sie filternmöchten. Um den Feldnamen zu erfahren, sehen Sie sich die Tabelle in der Entwurfsansichtan.

Abb. 11.4 Tabelle öffnen und filtern

Selbstverständlich können Sie dem Filter auch mehrere Filterkriterien mitgeben. So ermittelnSie im nächsten Beispiel alle Kontaktpersonen aus den Ländern Deutschland und Polen.

Abb. 11.5 Alle Personen aus Deutschland und Polen werden angezeigt

Sub ÖffnenTabelleUndFiltern02()On Error GoTo fehlerM DoCmd.OpenTable "Kontaktpersonen", acViewNormal DoCmd.ApplyFilter "Länderauswahl", _ "[Land/Region]='Deutschland' OR [Land/Region]='Polen'"Exit Sub

Listing 11.5: Eine Tabelle wird geöffnet und gefiltert

Page 419: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access418

Im folgenden Beispiel wird es schon etwas komplexer. Es sollen alle Kontaktpersonen ermit-telt werden, die in der Umgebung von STUTTGART bzw. in BADEN-WÜRTTEMBERG wohnen.Diese Information können Sie extrahieren, indem Sie die Postleitzahl auswerten. Dabei fra-gen Sie die ersten beiden Ziffern der Postleitzahl ab. Fängt die erste Ziffer mit 7 an, handeltes sich um eine Stadt in BADEN-WÜRTTEMBERG. Um sicherzustellen, dass auch wirklich nurStädte aus DEUTSCHLAND angezeigt werden, müssen Sie zusätzlich noch das Land filtern.Sehen Sie die Lösung dieser Aufgabenstellung im folgenden Listing:

Abb. 11.6 Die Postleitzahl und das Land als Filterkrierien

11.1.5 Tabelle öffnen und drucken

Beim Drucken der Tabelle können Sie entscheiden, ob Sie die komplette Tabelle, einen Teildavon bzw. die markierten Datensätze drucken möchten. Das Drucken von Tabellen führenSie mithilfe der Methode PrintOut durch.

Im folgenden Beispiel sollen die Seiten 1 und 2 der Tabelle Kontaktpersonen gedruckt wer-den. Zusätzlich sollen zwei Kopien gedruckt werden. Wie das funktioniert, sehen Sie im fol-genden Listing:

Sub ÖffnenTabelleUndFiltern03()On Error GoTo fehler DoCmd.OpenTable "Kontaktpersonen", acViewNormal DoCmd.ApplyFilter "Bereich Stuttgart", _ "Postleitzahl LIKE '7*' and [Land/Region]='Deutschland'"Exit Sub

fehler:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.6: Mehrere Filterkriterien einsetzen

Sub TabelleÖffnenUndDrucken()On Error GoTo fehler

Listing 11.7: Tabelle öffnen und drucken

Page 420: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 419

Nach dem Öffnen der Tabelle setzen Sie die Methode PrintOut ein, die folgende Syntaxhat:

PrintOut(Druckbereich, Von, Bis, Druckqualität, Exemplare, Exemplare-Sortieren)

Im Argument Druckbereich geben Sie über eine Konstante an, was Sie genau druckenmöchten. Setzen Sie die Konstante acPrintAll ein, um die komplette Tabelle auszudruk-ken. Wenn Sie die Konstante acPages einsetzen, können Sie in den beiden nachfolgendenArgumente Von und Bis angeben, welche Seiten Sie genau drucken möchten. Verwenden Siedie Konstante acSelection, um die markierten Datensätze der Tabelle auszudrucken.

Im Argument Von geben Sie einen numerischen Wert an, der eine gültige Seitenzahl des akti-ven Formulars oder Datenblatts angibt. Dieses Argument ist erforderlich, wenn Sie für dasArgument Druckbereich die Konstante acPages angeben.

Im Argument Bis geben Sie ebenfalls einen numerischen Ausdruck an, der eine gültige Sei-tenzahl des aktiven Formulars oder Datenblatts angibt. Dieses Argument ist erforderlich,wenn Sie für das Argument Druckbereich die Konstante acPages angeben.

Über das Argument Druckqualität können Sie über die Konstanten acDraft, acHigh(Standardeinstellung), acLow oder acMedium die Druckqualität bestimmen.

Mithilfe des Arguments Exemplare können Sie bestimmen, wie viele Kopien mit ausge-druckt werden sollen. Wird dieses Argument nicht angegeben, wird standardmäßig einExemplar gedruckt.

Im letzten Argument ExemplareSortieren setzen Sie den Wert True, um die Exemplarezu sortieren, und False, um die Exemplare nicht während des Druckvorgangs zu sortieren.Wenn Sie dieses Argument nicht angeben, wird der Standardwert (True) verwendet.

11.1.6 Tabelle kopieren

Möchten Sie eine Tabelle duplizieren, setzen Sie dafür die Methode CopyObject ein, die Sieauf das Objekt DoCmd anwenden.

DoCmd.OpenTable "Kontaktpersonen", acViewNormal DoCmd.PrintOut acPages, 1, 2, acHigh, 2, TrueExit Sub

fehler:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.7: Tabelle öffnen und drucken

Page 421: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access420

Im folgenden Beispiel kopieren Sie die Tabelle KONTAKTPERSONEN und geben der neuenTabelle den Namen KONTAKTE.

Die Methode CopyObject hat folgende Syntax:

CopyObject(Zieldatenbank, NeuerName, Quellobjekttyp, Quellobjektname)

Im Argument Zieldatenbank geben Sie den Pfad sowie den Namen der Datenbank an, inwelche Sie die Tabelle kopieren möchten. Lassen Sie dieses Argument leer, wenn Sie dieTabelle innerhalb der aktuellen Datenbank kopieren möchten.

Im Argument NeuerName geben Sie den Namen der neuen, kopierten Tabelle an.

Im Argument Quellobjekttyp geben Sie in einer Konstanten an, ob Sie eine Tabelle(acTable), eine Abfrage (acQuery), ein Modul (acModule) oder sonstige Objekte kopierenmöchten.

Im letzten Argument Quellobjektname geben Sie den Namen der Quelltabelle an, die Siekopieren möchten.

Abb. 11.7 Die Tabelle Kontaktpersonen wurde kopiert

Sub KopierenTabelle()On Error GoTo fehlermDoCmd.CopyObject , "Kontakte", _ acTable, "Kontaktpersonen" Exit Subfehlerm: MsgBox "Es trat ein Fehler beim Kopieren auf!"End Sub

Listing 11.8: Tabelle kopieren

Page 422: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 421

11.1.7 Tabelle umbenennen

Um einer Tabelle einen anderen Namen zu geben, setzen Sie die Methode Rename ein.

Im folgenden Beispiel wird der Tabelle KONTAKTE der Name KONTAKTADRESSEN gegeben.Das Listing für diese Aufgabe lautet:

Für das Umbenennen der Tabelle setzen Sie die Methode Rename ein, die folgende Syntaxhat:

Rename(NeuerName, ObjektTyp, AlterName)

Im Argument NeuerName geben Sie bekannt, wie die Tabelle nach der Umbenennung heißensoll.

Beim Argument ObjektTyp geben Sie an, ob Sie eine Tabelle (acTable), eine Abfrage(acQuery) oder ein sonstiges Objekt umbenennen möchten.

Das Argument AlterName beinhaltet den bisherigen Namen der Tabelle.

11.1.8 Tabelle löschen

Um eine Tabelle aus der Datenbank zu entfernen, wenden Sie die Methode DeleteObjectan.

Im folgenden Listing wird die Tabelle KONTAKTADRESSEN gelöscht:

Sub UmbenennenTabelle()On Error GoTo FehlerMDoCmd.Rename "Kontaktadressen", acTable, _ "Kontakte" Exit SubFehlerM: MsgBox "Es ist ein Fehler aufgetreten!"End Sub

Listing 11.9: Tabelle umbenennen

Sub LöschenTabelle()On Error GoTo fehlerMDoCmd.DeleteObject acTable, "Kontaktadressen"Exit SubfehlerM:MsgBox "Ein Fehler trat beim Löschen der Tabelle auf!"End Sub

Listing 11.10: Tabelle löschen

Page 423: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access422

Wenn Sie die Methode DeleteObject einsetzen, müssen Sie im ersten Argument angeben,um was für ein Objekt es sich dabei handelt. Es stehen Ihnen hierfür die Objekte acDataAc-cessPage, acDefault (Standard), acDiagram, acForm, acFunction, acMacro,acModule, acQuery, acReport, acServerView, acStoredProcedure und acTablezur Verfügung.

Im zweiten Argument geben Sie den Namen des Objekts an, das Sie aus der Datenbank ent-fernen möchten.

11.1.9 Tabelle speichern

Standardmäßig wird eine Tabelle beim Schließen derselben gesichert. Diesen Vorgang kön-nen Sie aber auch über die Methode Save zwischendurch durchführen.

Im folgenden Beispiel wird die Tabelle KONTAKTPERSONEN gespeichert.

Um eine Tabelle zu speichern, muss diese in geöffnetem Zustand sein. Nach dem Öffnen derTabelle wenden Sie die Methode Save an, um die Tabelle zu sichern. Dabei geben Sie wiebereits beschrieben in der Objektkonstanten an, dass es sich um eine Tabelle handelt. GebenSie danach den Namen der Tabelle an, die gesichert werden soll. Im Anschluss daran setzenSie die Methode Close ein, um die Tabelle zu schließen.

11.1.10 Tabellen auslesen

Bisher haben Sie recht einfache Datenzugriffe auf Tabellen vorgenommen. Dabei kamen Siemit dem Objekt DoCmd aus, auf das Sie die verschiedenen Methoden angewendet haben.Diese Vorgehensweise reicht oft schon aus, um Standardaufgaben in der Praxis zu erledigen.

Steigen Sie jetzt tiefer in die Materie ein, indem Sie komplexe Datenzugriffe auf Tabellenvornehmen. Diese Aufgaben können Sie mit der neuen Technologie ADO (ActiveX DataObject) bewerkstelligen. ADO zeichnet sich unter anderem dadurch aus, dass diese Datenzu-griffsmethode sehr schnell ist und dabei wenig Arbeitsspeicher bzw. Plattenplatz benötigt.

Sub TabelleSpeichern()On Error GoTo fehler DoCmd.OpenTable "Kontaktpersonen", acViewNormal DoCmd.Save acTable, "Kontaktpersonen" DoCmd.Close acTable, "Kontaktpersonen"Exit Sub

fehler:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.11: Tabelle speichern

Page 424: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 423

Um die Methoden und Eigenschaften von ADO einsetzen zu können, müssen Sie zunächsteine zusätzliche Biblitohek in Ihre Entwicklungsumgebung einbinden. Dabei verfahren Siewie folgt:

• Wechseln Sie in die Entwicklungsumgebung von Access.

• Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.

Abb. 11.8 Die ADO-Bibliothek einbinden

• Aktivieren Sie die Bibliothek MICROSOFT ACTIVEX DATA OBJECTS 2.7 LIBRARY.

• Bestätigen Sie Ihre Einstellung mit OK.

Es stehen Ihnen nun alle notwendigen Methoden und Eigenschaften zur Verfügung, umDatenzugriffe auf Ihre Tabellen durchzuführen.

11.1.11 Tabelleninhalte auslesen

Der erste Datenzugriff über ADO auf eine Tabelle hat zur Aufgabe, die Felder NACHNAME

und VORNAME aus der Tabelle KONTAKTPERSONEN in den Direktbereich Ihrer Entwicklungs-umgebung auszulesen. Der Code für diese Aufgabe lautet:

Sub TabelleAuslesen()Dim DBS As New ADODB.Recordset

On Error GoTo fehlerDBS.Open "Kontaktpersonen", CurrentProject.Connection

Listing 11.12: Tabelleninhalte auslesen

Page 425: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access424

Definieren Sie zuerst eine Objektvariable vom Typ Recordset. Dieses Objekt soll alleDatensätze der Datenquelle aufnehmen. Öffnen Sie mit der Methode Open die Datentabelle,die die Kontaktadressen enthält.

Setzen Sie danach eine Schleife auf, die alle Datensätze der Tabelle durchläuft, bis sie auf denletzten Satz stößt. Für diesen Zweck setzen Sie die Eigenschaft EOF (End Of File) ein. Inner-halb der Schleife setzen Sie die Methode MoveNext ein, um zum jeweiligen nächsten Daten-satz in der Tabelle zu gelangen. Im Recordset-Objekt DBS steht der komplette Datensatz. Siekönnen dann die einzelnen Datenfelder aus dem Recordset-Objekt auslesen und in denDirektbereich übertragen.

Abb. 11.9 Die Kontaktdaten wurden in den Direktbereich übertragen

Do Until DBS.EOF Debug.Print DBS!Vorname & " " & DBS!Nachname DBS.MoveNextLoopDBS.CloseExit Sub

fehler:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.12: Tabelleninhalte auslesen

Page 426: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 425

Im vorherigen Beispiel haben Sie einzelne Datenfelder aus einer Tabelle in den DirektbereichIhrer Entwicklungsumgebung transferiert. Selbstverständlich können Sie auch die kompletteTabelle in den Direktbereich übertragen. Der Code für diese Aufgabenstellung sieht dabeiwie folgt aus:

Über die Anweisung Select, die Sie mit dem Sternchen versehen, lesen Sie alle Datensätzein das RecordSet-Objekt. Mithilfe der Funktion GetString können Sie die Daten abrufenund im Direktbereich über die Anweisung Debug.Print ausgeben.

Abb. 11.10 Die Tabelle Kontaktpersonen wurde in den Direktbereich überführt

Sub GanzeTabelleAuslesen()Dim DBS As New ADODB.Recordset

Set DBS = New ADODB.RecordsetOn Error GoTo fehlerm DBS.Open "Select * from Kontaktpersonen", _ CurrentProject.Connection Debug.Print DBS.GetString DBS.Close Exit Sub

fehlerm:MsgBox "Die Tabelle konnte nicht gefunden werden!"End Sub

Listing 11.13: Tabelleinhalte auslesen (komplett)

Page 427: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access426

11.1.12 Tabellen abfragen

Möchten Sie Tabellen nach bestimmten Informationen abfragen, können Sie dies mithilfevon SQL-Anweisungen machen.

Im nächsten Beispiel wird die Tabelle KONTAKTPERSONEN nach einer bestimmten Personabgefragt. Als Ergebnis soll die Adresse der Kontaktperson im Direktbereich ausgegebenwerden. Der Code für diese Aufgabe lautet:

Sub KontaktSuchen()Dim CONN As ADODB.ConnectionDim DBS As ADODB.RecordsetDim s As String s = InputBox("Geben Sie gesuchten Nachnamen ein!") If s = "" Then Exit Sub s = "Nachname='" & s & "'" Set CONN = New ADODB.Connection With CONN .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\AccessDemos.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Kontaktpersonen", _ ActiveConnection:=CONN, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic .Find Criteria:=s, SearchDirection:=adSearchForward If Not .EOF Then Do While Not .EOF Debug.Print "Vorname:" & _ .Fields("Vorname").Value Debug.Print "Nachname :" & _ .Fields("Nachname").Value Debug.Print "Adresse: " & _ .Fields("Adresse").Value Debug.Print "PLZ: " & _ .Fields("Postleitzahl").Value Debug.Print "Ort: " & _ .Fields("Ort").Value

Listing 11.14: Tabelle durchsuchen und Daten zurückgeben

Page 428: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 427

Geben Sie zu Beginn des Makros in eine InputBox den Nachnamen der Kontaktperson ein,zu dem Sie die Adresse erfahren möchten. Öffnen Sie die Access-Datenbank mithilfe desObjekts Connection. Zum Öffnen einer Access-Datenbank brauchen Sie die Jet-Daten-bank-Engine. Geben Sie daher mit der Eigenschaft Provider die Engine MICROSOFT JET 4.0OLE DB-PROVIDER an.

Im Argument ConnectionString geben Sie den Namen der Datenbank an, die Sie öffnenmöchten.

Definieren Sie danach ein RecordSet-Objekt, das später den gesuchten Datensatz enthaltensoll. Jetzt können Sie mithilfe der Methode Open die Tabelle KONTAKTPERSONEN öffnen.

Die Methode Open hat folgende Syntax:

Recordset.Open Source, ActiveConnection, CursorType, LockType, Opti-ons

Im Argument Source geben Sie den Namen der Tabelle an, die Sie öffnen möchten. ImArgument ActiveConnection verweisen Sie auf das Connection-Objekt Conn, welchesSie vorher erzeugt haben.

Über das Argument CursorType bestimmen Sie die Art des Cursors. Unter anderem wirddadurch der Zugriff auf Ihre Daten festgelegt. Dabei stehen Ihnen folgende Konstanten zurVerfügung:

• adOpenForwardOnly: (Standardeinstellung) Öffnet einen Vorwärtscursor. Mithilfe die-ses Cursors können Sie nur nach vorne blättern.

• adOpenKeyset: Öffnet einen Cursor vom Typ »Schlüsselgruppen«. Dieser Cursor istvergleichbar mit dem dynamischen Cursor (s. u.). Jedoch werden bei diesem CursorÄnderungen in der Tabelle, die von anderen Anwendern durchgeführt werden, nicht ange-zeigt.

• adOpenDynamic: Öffnet einen dynamischen Cursor. Damit haben Sie die Möglichkeit,Tabelleneinträge anzuzeigen, zu ändern und zu löschen. Alle Änderungen werden regel-mäßig aktualisiert und angezeigt.

.Find Criteria:=s, SkipRecords:=1 Loop Else MsgBox "Datensatz nicht gefunden" End If .Close End With CONN.Close Set DBS = Nothing Set CONN = NothingEnd Sub

Listing 11.14: Tabelle durchsuchen und Daten zurückgeben

Page 429: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access428

• adOpenStatic: Öffnet einen statischen Cursor. Bei diesem Cursor können die Daten nurangezeigt, jedoch nicht geändert werden. Die Datenansicht ist als Momentaufnahme desZustands zu verstehen, der zum Zeitpunkt des Öffnens der Tabelle vorgelegen hat.

Über das Argument LockType bestimmen Sie, welches Sperrverfahren der Provider beimÖffnen der Tabelle einsetzen soll. Dabei stehen Ihnen folgende Konstanten zur Verfügung:

• adLockReadOnly: Bei dieser Standardeinstellung können Sie die Daten in der Tabellenicht ändern.

• adLockPessimistic: Der Datensatz wird vollständig gesperrt. Dabei wird das erfolg-reiche Bearbeiten der Datensätze sichergestellt, indem der Provider Datensätze in derDatenquelle sofort beim Bearbeiten sperrt.

• adLockOptimistic: Diese Einstellung sorgt dafür, dass die Tabelle teilweise gesperrtwird, d.h., ein Datensatz wird nur dann gesperrt, wenn Sie die Update-Methode aufrufen.

Im letzten Argument Options können Sie festlegen, wie der Provider die Daten auswertensoll.

Nach dem Öffnen der Tabelle setzen Sie die Methode Find ein. Diese Methode sucht in derTabelle nach dem Datensatz, der den angegebenen Kriterien entspricht. Ist das Kriteriumerfüllt, wird der gefundene Datensatz zum aktuellen Datensatz der Tabelle. Andernfalls wirdder Zeiger auf das Ende der Tabelle festgelegt.

Die Methode Find hat folgende Syntax:

Find (criteria, SkipRows, searchDirection, start)

Unter dem Argument criteria müssen Sie angeben, was Sie konkret in der Tabelle suchenmöchten. Diese Information haben Sie bereits vorher in der Variablen s gespeichert. Dabeiwurden der verwendende Spaltenname, der Vergleichsoperator sowie der Wert in der Varia-blen s zusammengebastelt.

Beim Argument SkipRows können Sie den Abstand vom aktuelle Datensatz oder vom Argu-ment start angeben.

Das Argument SearchDirection gibt an, wie in der Tabelle gesucht werden soll. Dazu ste-hen Ihnen folgende Varianten zur Verfügung:

• adSearchForward: Führt die Suche vorwärts durch. Die Suche hört am Ende derTabelle auf, sofern kein entsprechender Datensatz gefunden wurde.

• adSearchBackward: Führt die Suche rückwärts durch. Die Suche hört am Anfang derTabelle auf, sofern kein entsprechender Datensatz gefunden wurde.

Mithilfe des Arguments start können Sie einen numerischen Wert angeben, der angibt, beiwelchem Datensatz die Suche in der Tabelle beginnen soll.

In der ersten Verzweigung fragen Sie direkt nach, ob der gesuchte Satz gefunden wurde. Istdies nicht der Fall, wird die Bedingung EOF (End Of File) erreicht. Wurde der gesuchteDatensatz gefunden, stehen alle Informationen hierüber in der Objektvariablen DBS.

Page 430: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 429

Da es möglich ist, dass der gesuchte Nachname mehrfach in der Tabelle vorkommt, setzenSie eine Schleife auf, die so lange durchlaufen wird, bis das Ende der Tabelle erreicht ist.Darin können Sie die einzelnen Werte über das Auflistungsobjekt Fields abrufen. In diesemObjekt stehen alle Feldinhalte, die Sie mithilfe der Eigenschaft Value ausgeben können.Achten Sie bei der Ausgabe darauf, dass Sie den Feldnamen, den Sie im Entwurfsmodus derTabelle ansehen können, mit angeben.

Abb. 11.11 Die Adresse der gesuchten Kontaktperson wurde ermittelt

11.1.13 Tabellen ändern

Den Inhalt einer Tabelle bzw. den Inhalt einzelner Felder können Sie über die Methode Exe-cute ändern. Dieser Methode übergeben Sie einen Text-String, indem Sie den dazugehöri-gen SQL-Befehl angeben.

Textänderungen durchführen

Im folgenden Beispiel soll in der Tabelle Kontaktpersonen die Länderbezeichnung »Deutsch-land» durch das Kürzel »BRD» ersetzt werden. Der Code für diese Lösung sehen Sie im fol-genden Listing:

Sub DatenÄndern()Dim Conn As ADODB.ConnectionDim Zähler As LongDim s As String s = "UPDATE Kontaktpersonen SET [Land/Region] = 'BRD'" _ & "WHERE [Land/Region] = 'Deutschland'" Set Conn = New ADODB.Connection

Listing 11.15: Datensätze ändern (Texte)

Page 431: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access430

Formulieren Sie in der Variablen s Ihre SQL-Anweisung. Nach dem Öffnen der DatenbankACCESSDEMOS.MDB sowie der Tabelle KONTAKTPERSONEN übergeben Sie den Inhalt derVariablen s der Methode Execute. Der Rückgabeparameter RecordsAffected ermitteltdie Anzahl der geänderten Sätze und gibt diese Anzahl im Direktbereich aus.

Abb. 11.12 Die Länderbezeichnungen wurden geändert

With Conn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = _ "C:\Eigene Dateien\AccessDemos.mdb" .Open End With

Conn.Execute CommandText:=s, RecordsAffected:=Zähler Debug.Print "Ersetzte Datensätze: " & Zähler Conn.Close Set Conn = NothingEnd Sub

Listing 11.15: Datensätze ändern (Texte)

Page 432: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 431

Wertmäßige Änderungen durchführen

Im folgenden Beispiel wird auf eine Produkttabelle zugegriffen und die Preise dieser Tabellefür alle Produkte um 15 % erhöht. Diese Aufgabe lösen Sie, indem Sie das folgende Makrostarten:

Die Preiserhöhung führen Sie in einer Tabelle, die sich in der momentan geöffneten Daten-bank befindet, durch. Dabei multiplizieren Sie das Feld EINZELPREIS mit dem Faktor 1.15.Gleich danach wenden Sie die Methode Update an, um diese Änderung wirksam werden zulassen. Mit der Methode MovePrevious gehen Sie zum vorherigen Datensatz. Diese Vorge-hensweise führen Sie durch, bis Sie am letzten Satz der Tabelle angelangt sind. Dann tritt dieSchleifenbedingung EOF in Kraft und die Schleife wird verlassen. Vergessen Sie danachnicht, die Tabelle über die Methode Close zu schließen und die Objektverweise wieder auf-zuheben.

Sub ProduktPreisErhöhen()Dim Conn As New ADODB.ConnectionDim DBS As ADODB.Recordset

Set Conn = CurrentProject.Connection Set DBS = New ADODB.Recordset

DBS.Open "Produkte", Conn, adOpenKeyset, _ adLockOptimistic DBS.MoveLast

Do Until DBS.BOF DBS("Einzelpreis") = DBS("Einzelpreis") * 1.15 DBS.Update DBS.MovePrevious Loop

DBS.Close Set DBS = Nothing Set Conn = NothingEnd Sub

Listing 11.16: Datensätze ändern (Preise)

Page 433: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access432

Abb. 11.13 Die Preiserhöhung wurde durchgeführt

11.1.14 Datensätze aus einer Tabelle entfernen

Mithilfe der Methode Delete können Sie einzelne Sätze aus einer Tabelle entfernen.

Im folgenden Beispiel sollen in der Tabelle KONTAKTADRESSEN alle Kontaktdaten von Per-sonen entfernt werden, die aus Polen kommen. Das Makro für diese Aufgabe sehen Sie imnächsten Listing:

Sub DatensätzeLöschen()Dim Conn As New ADODB.ConnectionDim DBS As ADODB.Recordset

Set Conn = CurrentProject.Connection Set DBS = New ADODB.Recordset

DBS.Open _ "Select * FROM Kontaktadressen where ([Land/Region] = 'Polen')", _ Conn, adOpenKeyset, adLockOptimistic

Listing 11.17: Datensätze löschen

Page 434: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 433

Öffnen Sie die gewünschte Tabelle und arbeiten alle Sätze in einer Schleife ab. Innerhalb derSchleife löschen Sie die einzelnen Sätze mithilfe der Methode Delete. Beim Löschen vonDatensätzen aus einer Tabelle müssen Sie darauf achten, dass Sie mithilfe der MethodeMoveNext jeweils zum nächsten Datensatz springen, da Sie sonst eine Endloschleife produ-zieren.

Abb. 11.14 Die bereingte Tabelle

11.1.15 Datensätze hinzufügen

Selbstverständlich können Sie per VBA auch neue Datensätze in Ihre Tabelle einfügen. Dieserreichen Sie durch den Einsatz der Methode AddNew. Alles, was Sie dazu wissen müssen,sind die genauen Feldbezeichnungen, die Sie in der Entwurfsansicht der Tabelle einsehenkönnen. Sehen Sie sich dazu einmal die Tabelle KONTAKTPERSONEN in der Entwurfsansichtan.

Do Until DBS.EOF DBS.Delete DBS.MoveNext Loop

DBS.Close Set DBS = Nothing Set Conn = NothingEnd Sub

Listing 11.17: Datensätze löschen

Page 435: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access434

Abb. 11.15 Die Entwurfsansicht der Tabelle Kontaktpersonen

Mithilfe dieser Felddefinition können Sie nun beginnen, das Makro zum Einfügen einesneuen Kontakts zu schreiben.

Sub DatensatzAnlegen()Dim Conn As New ADODB.ConnectionDim DBS As ADODB.Recordset

Set Conn = CurrentProject.Connection Set DBS = New ADODB.Recordset

DBS.Open "Kontaktpersonen", Conn, adOpenKeyset, _ adLockOptimistic DBS.AddNew DBS!Nachname = "Meier" DBS!Vorname = "Horst" DBS!Adresse = "Seestr. 56" DBS!Ort = "Gerlingen" DBS!Postleitzahl = "70839"

Listing 11.18: Datensatz anlegen

Page 436: VBA-Programmierung fur Word, Excel und Access

Rechts11.1 Das Programmieren von Tabellen 435

Nach dem Öffnen der Tabelle wenden Sie die Methode AddNew an, um zunächst einen neuen,noch leeren Datensatz einzufügen. Weisen Sie den einzelnen Feldern danach die gewünsch-ten Werte zu. Das erste Feld der Tabelle, die KONTAKT-NR., brauchen Sie übrigens nicht zufüllen. Dieses Feld weist den Felddatentyp AUTOWERT auf, was bedeutet, dass Access selbsteinen gültigen Wert vergibt. Nachdem Sie die einzelnen Werte übertragen haben, setzen Siedie Methode Update ein, um diese Anlage wirksam werden zu lassen. Schließen Sie imAnschluss die Tabelle und heben die Objektverweise auf, um den Arbeitsspeicher wiederfreizugeben.

Abb. 11.16 Der neue Kontakt wurde angelegt

DBS![Land/Region] = "Deutschland" DBS!Firma = "Meier EDV" DBS![Kontaktart-Nr] = 1 DBS.Update DBS.Close

Set DBS = Nothing Set Conn = NothingEnd Sub

Listing 11.18: Datensatz anlegen

Page 437: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access436

11.2 Das Programmieren von Abfragen

Access bietet Ihnen eine ganze Reihe von verschiedenen Abfragetypen an, die Sie in der Pro-grammierung nützen können. So können Sie beispielsweise mithilfe einer AuswahlabfrageDaten aus einer oder mehreren Tabellen abrufen und die Ergebnisse in einem Datenblattanzeigen. Dort können Sie die Datensätze aktualisieren. Mit einer Auswahlabfrage könnenSie auch Datensätze gruppieren und Summen, Anzahl, Durchschnittswerte und andere Werteberechnen. Über den Einsatz von Aktionsabfragen können Sie Daten aus vorhandenen Tabel-len löschen, bestehende Tabellen aktualisieren, neue Daten in Tabellen einfügen oder kom-plett neue Tabellen erstellen.

11.2.1 Abfrage duchführen

Für die Duchführung einer Abfrage steht Ihnen die Methode OpenQuery zur Verfügung, mitder Sie eine Auswahl- oder Kreuztabellenabfrage in der Datenblattansicht, Entwurfsansichtoder Seitenansicht öffnen. Diese Abfrage muss in diesem Fall schon in der Datenbank ange-legt sein.

Die Methode OpenQuery hat folgende Syntax:

OpenQuery(Abfragename, Ansicht, Datenmodus)

Im Argument Abfragename geben Sie den Namen der Abfrage ein, die Sie durchführenmöchten.

Beim Argument Ansicht können Sie entscheiden, in welcher Form Sie Ihre Tabelle anzei-gen möchten. Es stehen Ihnen dabei folgende Konstanten zur Verfügung.

• acViewDesign: Öffnet die Abfrage in der Entwurfsansicht.

• acViewNormal: Öffnet die Abfrage in gewohnter Weise in der Tabellenansicht (Stan-dardeinstellung).

• acViewPivotChart: Stellt die Abfrage für ein Pivot-Diagramm zur Verfügung.

• acViewPivotTable: Hiermit können Sie die Felder der Abfrage für eine Pivot-Tabelleverwenden.

• acViewPreview: Zeigt die Abfrage in der Seitenansicht an.

Beim letzten Argument Datenmodus legen Sie fest, ob Änderungen an der Abfrage durch-geführt werden dürfen oder nicht. Dabei können Sie folgende Konstanten festlegen:

• acAdd: Der Anwender kann neue Datensätze hinzufügen, jedoch keine bestehenden bear-beiten.

• acEdit: Der Anwender kann bestehende Datensätze bearbeiten und neue hinzufügen(Standardeinstellung).

• acReadOnly: Der Anwender kann die Datensätze nur ansehen.

Page 438: VBA-Programmierung fur Word, Excel und Access

Rechts11.2 Das Programmieren von Abfragen 437

Kontakte eines Landes anzeigen

Im folgenden Beispiel wird die Abfrage KONTAKTPERSONDEUTSCHLAND ausgeführt.

Die Methode OpenQuery wird auf das Objekt DoCmd angewendet. Im Falle, dass die Abfragein der Datenbank nicht gefunden werden kann, fangen Sie dies mithilfe der Anweisung OnError Resume Next ab.

Abb. 11.17 Das Ergebnis der Abfrage KontaktpersonDeutschland

11.2.2 Aktualisierungsabfrage durchführen

Möchten Sie eine Aktualisierungsabfrage in Access duchführen, können Sie die MethodeRunSQL einsetzen. Die Syntax der Methode lautet:

RunSQL(SQLAnweisung, TransaktionVerwenden)

Im Argument SQLAnweisung erfassen Sie Ihre SQL-Anweisung. Speichern Sie diese SQL-Anweisung vorher am besten in einer String-Variablen und übergeben diese dann derMethode RunSQL.

Im Argument TransaktionVerwenden entscheiden Sie, ob Sie diese Abfrage in eineTransaktion aufnehmen möchten. Unter einer Transaktion versteht man eine Reihe vonÄnderungen, die an den Daten und am Schema einer Datenbank vorgenommen werden.Wenn Sie dies wünschen, setzen Sie dieses Argument auf den Wert True.

Sub AbfrageAufrufen()On Error GoTo FehlerMDoCmd.OpenQuery "KontaktpersonDeutschland", acViewNormal, _ acReadOnly Exit SubFehlerM: MsgBox "Die Abfrage konnte nicht gefunden werden!"End Sub

Listing 11.19: Abfrage ausführen

Page 439: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access438

Länderbezeichnungen ändern

Im nächsten Listing sollen die Länderbezeichnungen angepasst werden. Dabei sollen alleKontakte aus Deutschland geändert werden.

Mit der SQL-Anweisung UPDATE geben Sie bekannt, dass Sie die Tabelle KONTAKTPERSO-NEN ändern/aktualisieren möchten. Legen Sie mit dem Schlüsselwort SET fest, wie der neueName des Landes lauten soll. Über das SQL-Wort WHERE bestimmen Sie, auf welche Sätzein der Tabelle sich die Änderung auswirken soll. Diese Informationen setzen Sie in einerString-Variablen zusammen und übergeben diese an die Methode RunSQL.

Abb. 11.18 Änderungsmeldung bestätigen

11.2.3 Anfügeabfrage ausführen

Im folgenden Beispiel soll in eine bestehende Tabelle ein neuer Satz hinzugefügt werden.Dabei soll in der Tabelle KONTAKTPERSONEN ein neuer Kontakt hinzugefügt werden.

Das Listing für diese Aufgabe lautet:

Sub LänderÄndern()Dim sql As String

sql = "UPDATE Kontaktpersonen " & _ "SET Kontaktpersonen.[Land/Region] = 'BRD' " & _ "WHERE Kontaktpersonen.[Land/Region] = 'Deutschland'"DoCmd.RunSQL sqlEnd Sub

Listing 11.20: Aktualisierungsabfrage ausführen

Sub KontaktHinzufügen()Dim sql As String

sql = "INSERT INTO " & _"Kontaktpersonen(Vorname, Nachname, " & _

Listing 11.21: Anfügeabfrage durchführen

Page 440: VBA-Programmierung fur Word, Excel und Access

Rechts11.2 Das Programmieren von Abfragen 439

Über die SQL-Anweisung INSERT INTO legen Sie fest, dass Sie in die Tabelle KONTAKTPER-SONEN einen Satz anfügen möchten. Geben Sie danach die Datenfelder der Tabelle an, die Sieanfügen möchten. Achten Sie dabei darauf, dass die Feldnamen der Tabelle mit Ihren Anga-ben übereinstimmen. Erfassen Sie nach VALUES die tatsächlichen Werte in Textform. GebenSie jede Information in einfache Anführungszeichen voneinander ein und trennen Sie die Fel-der durch Kommas voneinander ab.

Abb. 11.19 Die Anfügemeldung bestätigen

Abb. 11.20 Der neue Kontakt wurde eingefügt

"Adresse, Ort, Postleitzahl, [Land/Region], Firma, [Kontaktart-Nr])" & _"VALUES " & _"('Katrin', 'Busch', 'Burgholzstr. 77', 'Stuttgart', '70469', " & _"'BRD', 'Busch&Co.','1')"

DoCmd.RunSQL sqlEnd Sub

Listing 11.21: Anfügeabfrage durchführen

Page 441: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access440

Anfügeabfrage mit externer Quelle durchführen

Befinden sich die Daten in einer anderen Datenbank, können Sie diese Aufgabe trotzdemüber das folgende Makro lösen:

Über die SQL-Anweisung INSRET INTO geben Sie an, dass Sie neue Sätze in die Tabelle KON-TAKTPERSONEN einfügen möchten. Nachdem Sie festgelegt haben, welche Felder Sie dabeiübertragen möchten, wählen Sie über die SQL-Anweisung SELECT diese Felder jetzt aus.Achten Sie darauf, dass die Anzahl der einzufügenden Felder auf beiden Seiten gleich großist, also vor und hinter der Anweisung SELECT. Vergessen Sie nicht, die Quelltabelle nachdem Schlüsselwort FROM anzugeben. Um auf eine andere Datenbank zuzugreifen, ergänzenSie die SQL-Anweisung IN und geben den Namen der Datenbank an.

11.2.4 Löschabfrage ausführen

Mithilfe einer Abfrage können Sie auch einzelne Sätze aus einer Tabelle entfernen. Im fol-genden Beispiel sollen aus der Tabelle KONTAKTPERSONEN die Kontakte entfernt werden, dieaus STUTTGART oder MÜNCHEN stammen.

Die Lösung dieser Aufgabenstellung sehen Sie im folgenden Listing:

Sub KontakteHinzufügenAusDB()Dim sql As StringDim s_Pfad As String

s_Pfad = Application.CurrentProject.PathChDir s_Pfadsql = "INSERT INTO " & _"Kontaktpersonen(Vorname, Nachname, " & _"Adresse, Ort, Postleitzahl, [Land/Region], Firma, [Kontaktart-Nr])" & _"IN Kontakte.mdb " & _"SELECT Vorname, Nachname, Adresse, Ort, " & _"Postleitzahl, [Land/Region], Firma, [Kontaktart-Nr] FROM [Kontaktpersonen]"

DoCmd.RunSQL sqlEnd Sub

Listing 11.22: Daten aus anderer Datenbank für die Anfügeabfrage abrufen

Sub LöschabfrageAusführen()Dim sql As String

Listing 11.23: Daten aus Tabelle löschen

Page 442: VBA-Programmierung fur Word, Excel und Access

Rechts11.2 Das Programmieren von Abfragen 441

Setzen Sie die SQL-Anweisung DELETE ein, um Datensätze aus einer Tabelle zu entfernen.Geben Sie dabei an, welche Felder Sie löschen möchten. Formulieren Sie mithilfe des SQL-Schlüsselwortes WHERE die Löschkriterien.

11.2.5 Tabellenerstellungsabfrage ausführen

Bei einer Tabellenerstellungsabfrage können Sie das Ergebnis einer Abfrage in einer neuenTabelle einfügen.

Im folgenden Beispiel sollen aus der Tabelle KONTAKTPERSONEN alle Kontakte aus POLEN

ermittelt und in einer neuen Tabelle gespeichert werden. Der Quellcode für diese Aufgabelautet:

Über die SQL-Anweisung SELECT wählen Sie die Felder aus, die Sie in der neuen Tabellespeichern möchten. Über INTO geben Sie den Namen der Tabelle an, die angelegt werden soll.Danach legen Sie mit der SQL-Anweisung FROM fest, woher die Daten stammen. Mit derAnweisung WHERE können Sie die zu übertragenden Datensätze einschränken.

sql = "DELETE " & _"Vorname, Nachname, " & _"Adresse, Ort, Postleitzahl, [Land/Region], Firma, [Kontaktart-Nr]" & _"FROM Kontaktadressen " & _"WHERE (Ort = 'Stuttgart' OR Ort = 'München')"

DoCmd.RunSQL sqlEnd Sub

Sub TabellenerstellungsabfrageAusführen()Dim sql As String

sql = "SELECT " & _"Vorname, Nachname, Adresse, " & _"Ort, Postleitzahl,[Land/Region], Firma, [Kontaktart-Nr]" & _"INTO [KontaktePolen] " & _"FROM Kontaktpersonen WHERE ([Land/Region] = 'Polen')"

DoCmd.RunSQL sqlEnd Sub

Listing 11.24: Ergebnisse in neuer Tabelle ablegen

Listing 11.23: Daten aus Tabelle löschen

Page 443: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access442

Abb. 11.21 Die Erstellungsmeldung bestätigen

Abb. 11.22 Das Ergebnis der Abfrage in neuer Tabelle

11.2.6 Definitionsabfragen ausführen

Mithilfe von Definitionsabfragen greifen Sie in die Struktur von Tabellen ein. Dabei könnenSie bestende Tabellen ändern, Indexe setzen, Tabellen entfernen sowie Indexe wiederlöschen.

Eine neue Tabelle anlegen

Im nächsten Beispiel legen Sie eine neue Tabelle an, die folgende Felder aufweist:

• Vorname (30 Zeichen)

• Nachname (30 Zeichen)

• Straße (30 Zeichen)

• PLZ (5 Zeichen)

• Ort (20 Zeichen)

• Land (20 Zeichen)

• Erfassen Sie jetzt das folgende Makro:

Page 444: VBA-Programmierung fur Word, Excel und Access

Rechts11.2 Das Programmieren von Abfragen 443

Legen Sie mithilfe der SQL-Anweisung CREATE TABLE den Namen der neuen Tabelle fest.Danach definieren Sie die einzelnen Felder, geben Access bekannt, um welchen Datentyp essich handelt, und legen die Größe des Datenfeldes fest. Führen Sie direkt im Anschluss darandie Methode RunSQL durch, um die neue Tabelle anzulegen.

Sehen Sie in der folgenden Tabelle, welche gängigen Datentypen Sie auch noch verwendenkönnen, um die Tabellenfelder zu erstellen.

Setzen Sie am Ende des Makros die Methode RefreshDataBaseWindow ein, um dieAnsicht zu aktualisieren.

Sub TabelleAnlegen()Dim sql As String

sql = "CREATE TABLE NeueKontakte " & _"(Vorname Text(30), Nachname Text(30), Straße Text(30), " & _"PLZ Text(5), Ort Text(20), Land Text (20))"

DoCmd.RunSQL sqlApplication.RefreshDatabaseWindowEnd Sub

Listing 11.25: Eine neue Tabelle erstellen

Datentyp Felddatentyp

BIT Ja/Nein

DATETIME Datum/Uhrzeit

DECIMAL Numerischer Datentyp

IMAGE OLE-Objekt

MONEY Währung

CHARACTER Text

TEXT Memo

SMALLINT Integerzahl (–32.768 bis 32.767)

TINYINT Integerzahl zwischen 0 und 255

INTEGER Integerzahl (–2.147.483.648 bis 2.147.483.647)

Page 445: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access444

Abb. 11.23 Die neue Tabelle wurde erstellt

Tabellenfelder ergänzen

Um eine bereits vorhandene Tabelle zu ändern, können Sie die SQL-Anweisung ALTERTABLE einsetzen. Dabei müssen Sie genau angeben, was Sie konkret mit der Tabelle anstel-len möchten. Dafür stehen Ihnen folgende SQL-Statements zur Verfügung:

• ADD COLUMN: Über diese Anweisung fügen Sie einer Tabelle ein neues Feld hinzu.

• ADD CONSTRAINT: Mithilfe dieser Anweisung fügen Sie Ihrer Tabelle einen Mehr-fachindex hinzu.

• DROP COLUMN: Durch den Einsatz dieser SQL-Anweisung entfernen Sie ein Feld ausIhrer Tabelle.

• DROP CONSTRAINT: Löscht einen Mehrfachindex aus Ihrer Tabelle.

Im folgenden Beispiel fügen Sie der gerade erstellen Tabelle ein weiteres Feld EMAIL hinzu.Der Code sieht dabei wie folgt aus:

Sub TabellenfeldEinfügen()Dim sql As String

sql = "ALTER TABLE NeueKontakte " & _"ADD COLUMN eMail Text(25)"

DoCmd.RunSQL sqlApplication.RefreshDatabaseWindowEnd Sub

Listing 11.26: Ein Tabellenfeld einfügen

Page 446: VBA-Programmierung fur Word, Excel und Access

Rechts11.2 Das Programmieren von Abfragen 445

Geben Sie nach der SQL-Anweisung ALTER TABLE den Namen der Tabelle an, die Sieändern möchten. Nach dem Befehl ADD COLUMN geben Sie das Feld inklusive Datentypan und führen danach die Methode RunSQL aus, um das Feld in der Tabelle einzufügen

Abb. 11.24 Das neue Feld wurde eingefügt

Tabellenfeld löschen

Möchten Sie ein bestehendes Feld aus einer Tabelle wieder entfernen, starten Sie das fol-gende Makro:

Beim Löschen eines Datenfeldes müssen Sie den Namen des Feldes angeben. Möchten Siemehrere Felder aus einer Tabelle entfernen, so geben Sie diese durch Kommata getrennt nachder Anweisung DROP COLUMN an.

Sub TabellenfeldLöschen()Dim sql As String

sql = "ALTER TABLE NeueKontakte " & _"DROP COLUMN eMail"

DoCmd.RunSQL sqlApplication.RefreshDatabaseWindowEnd Sub

Listing 11.27: Ein Tabellenfeld löschen

Page 447: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access446

Tabelle löschen

Um eine Tabelle zu löschen, müssen Sie sicherstellen, dass die Tabelle momentan nichtgeöffnet ist.

Über die SQL-Anweisung DROP TABLE können Sie die angegebene Tabelle aus der Daten-bank entfernen.

11.2.7 Abfrage erzeugen mit ADO

Bisher haben Sie Abfragen durchgeführt und lediglich die Ergebnisse der Abfragen in derDatenbank gespeichert. Möchten Sie die Abfrage ebenso behalten, müssen Sie diese erzeu-gen und in der Datenbank speichern. Um diese Aufgabe lösen zu können, benötigen Sie eineweitere Bibliothek in Access, die Sie noch einbinden müssen. Verfahren Sie dabei wie folgt:

• Wechseln Sie in die Entwicklungsumgebung von Access.

• Wählen Sie aus dem Menü EXTRAS den Befehl VERWEISE.

Abb. 11.25 Die Objektbibliothek ADO Ext. einbinden

• Aktivieren Sie die Bibliothek MICROSOFT ADO EXT. FÜR DDL AND SECURITY.

Sub TabelleLöschen()Dim sql As String

sql = "DROP TABLE NeueKontakte"

DoCmd.RunSQL sqlApplication.RefreshDatabaseWindowEnd Sub

Listing 11.28: Eine Tabelle löschen

Page 448: VBA-Programmierung fur Word, Excel und Access

Rechts11.2 Das Programmieren von Abfragen 447

• Bestätigen Sie Ihre Aktion mit OK.

Sie haben nun Zugrif auf alle notwendigen Objekte, Methoden und Eigenschaften, um eineneue Abfrage zu erstellen.

Daten übernehmen

In der folgenden Aufgabe erstellen Sie eine Abfrage, die im ersten Schritt alle Daten aus derTabelle KONTAKTPERSONEN übernehmen soll. Der Quellcode hierfür lautet:

Definieren Sie im ersten Schritt eine Objektvariable vom Typ ADOX. Zusätzlich dazu benöti-gen Sie noch ein ADODB-Objekt vom Typ Command. Darunter speichern Sie später mithilfeder Eigenschaft CommandText Ihre SQL-Anweisung. In der Eigenschaft ActiveConnec-tion geben Sie Ihre aktuelle Datenbank als Quelle an. Über das Objekt Procedures legenSie eine gespeicherte Prozedur an. Setzen Sie die Methode Append ein, um diesem Objektdie Abfrage hinzuzufügen. Als weiteres Argument benötigt die Methode noch die Informa-tion, was konkret die Abfrage machen soll. Diese Information haben Sie bereits als SQL-Anweisung in der Variablen SQLcmd bekannt gegeben.

Sub AbfrageErstellen()Dim Katalog As New ADOX.CatalogDim SQLcmd As ADODB.Command

Katalog.ActiveConnection = CurrentProject.Connection Set SQLcmd = New ADODB.Command

With SQLcmd .CommandText = "SELECT * FROM Kontaktpersonen" End With

Katalog.Procedures.Append "KontakteAktuell", SQLcmd Set SQLcmd = Nothing Set Katalog = Nothing Application.RefreshDatabaseWindowEnd Sub

Listing 11.29: Eine Abfrage erstellen

Page 449: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access448

Abb. 11.26 Die neue Abfrage KontakteAktuell wurde angelegt

Kontaktpersonen aus Deutschland

Im folgenden Beispiel soll eine etwas komplexere Abfrage angelegt werden. Dabei sollen alleKontaktpersonen aus Deutschland in einer neuen Abfrage ermittelt werden.

Sub AbfrageErstellenKomplex()Dim Katalog As New ADOX.CatalogDim SQLcmd As ADODB.Command

Katalog.ActiveConnection = _ CurrentProject.Connection Set SQLcmd = New ADODB.Command

With SQLcmd .CommandText = "SELECT Vorname, Nachname, " & _ "Adresse, Postleitzahl, Ort, [Land/Region] FROM " _ "Kontaktpersonen WHERE ([Land/REgion] = 'BRD')"End With

Katalog.Procedures.Append "KontakteDeutsch", SQLcmdApplication.RefreshDatabaseWindow

Set SQLcmd = Nothing Set Katalog = NothingEnd Sub

Listing 11.30: Eine komplexere Abfrage erstellen

Page 450: VBA-Programmierung fur Word, Excel und Access

Rechts11.2 Das Programmieren von Abfragen 449

Abb. 11.27 Alle Kontaktpersonen aus Deutschland

11.2.8 Paramterabfrage erstellen

Bei einer Parameterabfrage können Sie mit dem Anwender interaktiv kommunizieren. Ineinem Eingabefenster geben Sie hierzu die gewünschte Information ein. Access sucht Ihnendanach die dazugehörigen Daten heraus und gibt sie in einer Tabelle aus.

Im folgenden Beispiel soll der Anwender den Ortsnamen eingeben, zu dem er alle Kontakteangezeigt haben möchte. Das Makro für diese Aufgabe finden Sie im folgenden Listing:

Sub ParameterAbfrageErstellen()Dim Katalog As New ADOX.CatalogDim SQLcmd As ADODB.Command

Katalog.ActiveConnection = _ CurrentProject.Connection Set SQLcmd = New ADODB.Command

With SQLcmd .CommandText = "PARAMETERS [Stadt] Text; " & _ "SELECT * FROM Kontaktpersonen " & _ " WHERE Ort = [Stadt]" End With

Listing 11.31: Eine Parameterabfrage erstellen

Page 451: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access450

Geben Sie beim Schlüsselwort PARAMETERS an, dass es sich um eine Abfrage handeln soll,bei der der Anwender noch einen Wert eingeben muss. Setzen Sie einen Begriff in eckigeKlammern. Dieser Begriff wird dann später in der Meldung angezeigt, sobald Sie die Abfragedurch einen Doppelklick starten möchten. Gleich danach legen Sie fest, um welche ArtDateneingabe es sich dabei handeln soll. Da Sie einen Ort eingeben müssen, verwenden Siehierfür den Datentyp TEXT.

Nach der Erstellung der Abfrage starten Sie diese über einen Doppelklick.

Abb. 11.28 Den gewünschten Ortsnamen eingeben

Als Ergebnis wird eine Tabelle erzeugt, die alle Kontaktadressen aus Stuttgart beinhaltet.

11.3 Das Programmieren von Formularen

Bei der Erstellung von Formularen werden Sie von Access weitestgehend durch den Formu-lar-Assistenten unterstützt. Wenn Sie also ein Formular erstellen möchten, dann nutzen Siediesen Assistenten und integrieren danach weitere VBA-Ereignisprozeduren, um das Formu-lar noch besser zu machen.

Katalog.Procedures.Append "ParameterAbfrageStadt", SQLcmd Application.RefreshDatabaseWindow

Set SQLcmd = Nothing Set Katalog = NothingEnd Sub

Listing 11.31: Eine Parameterabfrage erstellen

Page 452: VBA-Programmierung fur Word, Excel und Access

Rechts11.3 Das Programmieren von Formularen 451

11.3.1 Formular aufrufen

Das Aufrufen eines Formulars können Sie mithilfe der Methode OpenForm erreichen, wel-ches Sie auf das Objekt DoCmd anwenden.

Im folgenden Beispiel rufen Sie das Formular Kontaktpersonen auf.

Für das Öffnen eines Formulars setzen Sie die Methode OpenForm ein. Dabei hat dieseMethode folgende Syntax:

OpenForm(Formularname, Ansicht, Filtername, Bedingung, Datenmodus,Fenstermodus, Öffnungsargumente)

Im Argument Formularname geben Sie den Namen des Formulars an, das Sie öffnen möch-ten.

Beim Argument Ansicht können Sie die Art der Ansicht Ihres Formulars festlegen. WählenSie dort die Konstante acDesign, um das Formular in der Entwurfsansicht aufzurufen. DieKonstante acNormal ruft das Formular wie gewohnt auf. Sie können diese Konstante aberauch weglassen.

In den Argumenten Filtername und Bedingung können Sie einen Filter einstellen, um nurbestimmte Datensätze im Formular anzuzeigen.

Mit dem Argument Datenmodus können Sie festlegen, welche Aufgaben der Anwender imFormular durchführen kann. Dabei stehen Ihnen folgende Konstanten zur Verfügung.

acFormAdd: Der Anwender kann neue Datensätze im Formular hinzufügen, jedoch keinebestehenden Datensätze bearbeiten.

acFormEdit: Der Anwender kann bestehende Datensätze im Formular bearbeiten und neueDatensätze hinzufügen.

acFormPropertySettings: Mit dieser Standardkonstante können Sie alle Aktionen imFormular durchführen.

acFormReadOnly: Der Anwender kann die Datensätze im Formular nur ansehen.

Mit dem Argument Fenstermodus legen Sie fest, wie das Formular angezeigt werden soll.

Sub ÖffnenFormular()On Error GoTo fehlerm DoCmd.OpenForm "Kontaktpersonen", acNormalExit Sub

fehlerm:MsgBox "Das Formular konnte nicht gefunden werden!"End Sub

Listing 11.32: Ein Formular aufrufen

Page 453: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access452

• Wählen Sie die Konstante acWindowNormal, um das Formular in der Standardansichtanzuzeigen.

• Verwenden Sie die Konstante acHidden, wenn das Formular ausgeblendet geöffnet wer-den soll.

• Setzen Sie die Konstante acIcon ein, um das Formular unten am Bildschirm in Formeines kleinen Symbols in der Titelleiste anzuzeigen.

• Die Konstante acDialog können Sie einsetzen, wenn Sie das Formular als Dialogfeldanzeigen möchten. Dabei können Sie mit einer anderen Aufgabe erst wieder weiterarbei-ten, wenn Sie das Formular wieder geschlossen haben.

Im Argument ÖffnenArgumente können Sie dem Formular bereits beim Öffnen bestimmteWerte bzw. Einstellungen mitgeben.

Abb. 11.29 Das Formular wurde aufgerufen

11.3.2 Formular öffnen mit eingestelltem Filter

Die Anzeige von Datensätzen in einem Formular können Sie von vornherein einschränken,indem Sie einen Filter setzen.

Im folgenden Beispiel werden im Formular KONTAKTPERSONEN nur Kontakte aus DEUTSCH-LAND angezeigt.

Sub ÖffnenFormularMitFilter()On Error GoTo fehlermDoCmd.OpenForm "Kontaktpersonen", acNormal, _

Listing 11.33: Ein gefiltertes Formular aufrufen

Page 454: VBA-Programmierung fur Word, Excel und Access

Rechts11.3 Das Programmieren von Formularen 453

11.3.3 Formular schließen

Möchten Sie ein Formular schließen, setzen Sie die Methode Close ein.

Im nächsten Beispiel setzen Sie die Methode Close ein, um das geöffnete Formular KON-TAKTPERSONEN zu schließen.

Sub SchließenFormular() DoCmd.Close acForm, "Kontaktpersonen", acSaveYesEnd Sub

Listing 11.34: Ein Formular schließen

Die Methode Close hat folgende Syntax:

Close(Objekttyp, Objektname, Speichern)

Beim Argument Objekttyp müssen Sie angeben, dass es sich hier um ein Formular handelnsoll. Geben Sie daher die Konstante acForm an.

Der Objektname enthält den Namen des Formulars.

Mithilfe des Arguments Speichern geben Sie bekannt, wie bzw. ob Änderungen vor demSchließen des Formulars gespeichert werden sollen. Dazu stehen folgende Konstanten zurVerfügung:

• acSaveNo: Bei dieser Konstante werden Änderungen nicht gespeichert.

• acSavePrompt: Hier wird nachgefragt, ob Änderungen am Formular gespeichert werdensollen. Dies ist die Standardeinstellung.

• acSaveYes: Bei dieser Konstante werden Änderungen beim Schließen des Formularsohne Rückfrage gespeichert.

11.3.4 Formulare weiter ausbauen

Nachdem Sie Formulare über den Formular-Assistent erstellt haben, können Sie sich überle-gen, wie Sie diese Formulare weiter automatisieren können. Dabei bedienen Sie sich der sogenannten Ereignisse, die alle Aktionen im Formular überwachen. Sie haben somit die Mög-

"Land", "[Land/Region] = 'BRD'", _ , acDialog Exit Subfehlerm: MsgBox "Das Formular konnte nicht gefunden werden!"End Sub

Listing 11.33: Ein gefiltertes Formular aufrufen

Page 455: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access454

lichkeit, auf diese Ereignisse zu reagieren und zusätzliche Aufgaben durchzuführen. So kön-nen Sie beispielsweise ein Textfeld automatisch einfärben, wenn ein bestimmter Wert über-oder unterschritten wird.

Formularfelder dynamisch einfärben

Im folgenden Beispiel soll im Formular KONTAKTPERSONEN das Feld LAND/REGION über-wacht werden. Immer wenn in diesem Feld ein Wert ungleich BRD auftaucht, dann soll dasTextfeld mit der Hintergrundfarbe GELB formatiert werden. Um diese Aufgabe umzusetzen,befolgen Sie die nächsten Arbeitsschritte:

• Öffnen Sie Ihr Formular in der Entwurfsansicht.

• Klicken Sie mit der rechten Maustaste auf eine freie Stelle im Formular und wählen Sieaus dem Kontextmenü den Befehl EIGENSCHAFTEN.

• Wählen Sie aus dem Dropdownfeld den Eintrag FORMULAR.

• Wechseln Sie zur Registerkarte EREIGNIS.

• Setzen Sie den Mauszeiger ins Feld BEIM ANZEIGEN und klicken Sie auf die Schaltflächeganz rechts im Feld.

Abb. 11.30 Das Ereignis einstellen

Page 456: VBA-Programmierung fur Word, Excel und Access

Rechts11.3 Das Programmieren von Formularen 455

• Wählen Sie im Dialog GENERATOR AUSWÄHLEN den Eintrag CODE-GENERATOR aus demListenfeld.

• Klicken Sie auf OK.

• Ergänzen Sie den vorgegebenen Code wie folgt:

Das Ereignis Form_Current wird immer dann automatisch durchgeführt, wenn Sie die Blät-ter-Symbole am unteren Formularrand betätigen, um den nächsten bzw. den vorherigenDatensatz anzuzeigen.

Im Ereignis selbst prüfen Sie, ob das Länderfeld einen anderen Eintrag als »BRD» hat. Wennja, dann formatieren Sie den Hintergrund des Textfeldes mithilfe der Eigenschaft BackCo-lor, der Sie über die Funktion RGB einen gültigen Farbwert zuweisen. Entnehmen Sie aus derfolgenden Tabelle die dabei gültigen Farbwerte.

Private Sub Form_Current()If [Land/Region].Value <> "BRD" Then[Land/Region].BackColor = RGB(255, 255, 0)Else[Land/Region].BackColor = RGB(255, 255, 255)End IfEnd Sub

Listing 11.35: Textfelder bei Bedingung färben

Farbe Rot-Wert Grün-Wert Blau-Wert

Schwarz 0 0 0

Blau 0 0 255

Grün 0 255 0

Cyan 0 255 255

Rot 255 0 0

Magenta 255 0 255

Gelb 255 255 0

Weiß 255 255 255

Page 457: VBA-Programmierung fur Word, Excel und Access

Links

11 Programmierung mit Access456

Abb. 11.31 Das Formularfeld wird bei Ausländern farblich formatiert

Textfelder markieren

Normalerweise wird der Text in Textfeldern bei Formularen immer komplett markiert, sobaldSie diese mit der Taste (Tab) anspringen. Diese komplette Markierung der Daten in einemTextfeld hat den Vorteil, dass Sie diese mit einem Klick löschen, kopieren bzw. ausschneidenkönnen. Es gibt jedoch Fälle, bei denen dieser Automatismus nicht erwünscht ist.

Im folgenden Beispiel soll die nicht komplette Markierung eines Textes im Textfeld NACH-NAME vorgenommen werden. Stattdessen wird der Mauszeiger hinter das letzte Textzeichendes markierten Abschnitts gesetzt, sobald Sie das Textfeld aktivieren.

Um diese Lösung umzusetzen, verfahren Sie wie folgt:

• Klicken Sie das betreffende Textfeld in der Entwurfsansicht des Formulars mit der rech-ten Maustaste an und wählen den Befehl EIGENSCHAFTEN aus dem Kontextmenü.

• Wechseln Sie zur Registerkarte EREIGNIS.

• Setzen Sie den Mauszeiger in das Feld BEIM HINGEHEN und klicken auf das Symbol ganzrechts in diesem Feld.

Erfassen Sie folgendes Ereignismakro.

Private Sub Nachname_Enter() Me!Nachname.SelStart = Me!Nachname.SelLengthEnd Sub

Listing 11.36: Cursor setzen

Page 458: VBA-Programmierung fur Word, Excel und Access

Rechts11.3 Das Programmieren von Formularen 457

Mithilfe der Eigenschaft SelStart können Sie die Startposition des markierten Textab-schnitts eines Textfeldes festlegen. Sollte noch kein Text eingefügt worden sein, legen Sieüber diese Eigenschaft die Einfügemarke der Markierung fest. Durch die Eigenschaft Sel-Length können Sie die Anzahl der markierten Zeichen in einem Textfeld ermitteln. Überge-ben Sie nun der Eigenschaft SelStart den Wert, den Sie über die Eigenschaft SelLengthermittelt haben.

Abb. 11.32 die Markierung blinkt hinter dem Feld Nachname

Page 459: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 460: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang459

12 Office im Zusammenspiel

Nachdem Sie in den letzten Kapiteln die drei wichtigsten Office-Anwendungen näher kennengelernt haben, erfahren Sie in diesem Kapitel, wie Sie die einzelnen Office-Komponenten imZusammenspiel einsetzen können. Dabei werden Daten zwischen den einzelnen Anwendun-gen hin- und hergeschoben.

12.1 Adressen nach Outlook transferieren

Im ersten Beispiel dieses Kapitels werden Sie Adressdaten aus Excel in den Kontakteordnervon Outlook verschieben. Die Adressen liegen dabei in folgender Excel-Tabelle vor:

Abb. 12.1 Die Ausgangstabelle in Excel

Page 461: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel460

Erfassen Sie nun das Makro, welches Ihnen die Adressen in den Kontaktordner von Outlooktransferiert. .

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap12 unter demNamen KONTAKTE.XLS finden.

Sub KontakteNachOutlook()Dim Out_App As Outlook.ApplicationDim Out_Obj As Outlook.ContactItemDim i As Long

Set Out_App = CreateObject("Outlook.Application") Sheets("Kontakte").Activate Range("A2").Select For i = 1 To ActiveSheet.UsedRange.Rows.Count - 1 Set Out_Obj = Out_App.CreateItem(olContactItem) With Out_Obj .FirstName = ActiveCell.Value .LastName = ActiveCell.Offset(0, 1).Value .BusinessAddress = ActiveCell.Offset(0, 2).Value _ & ", " & ActiveCell.Offset(0, 3).Value .BusinessAddressCountry = ActiveCell.Offset(0, 4).Value .BusinessAddressPostalCode = _ ActiveCell.Offset(0, 5).Value .BusinessAddressState = ActiveCell.Offset(0, 6).Value .Email1Address = ActiveCell.Offset(0, 7).Value .HomeTelephoneNumber = ActiveCell.Offset(0, 8).Value .CompanyName = ActiveCell.Offset(0, 9).Value .BusinessTelephoneNumber = ActiveCell.Offset(0, 10).Value .BusinessFaxNumber = ActiveCell.Offset(0, 11).Value .Birthday = ActiveCell.Offset(0, 12).Value .Save End With ActiveCell.Offset(1, 0).Select Next i MsgBox "Sie haben " & i & " Kontakte übertragen"

Listing 12.1: Adressdaten werden nach Outlook transferiert

Page 462: VBA-Programmierung fur Word, Excel und Access

Rechts12.1 Adressen nach Outlook transferieren 461

Deklarieren Sie im ersten Schritt zwei Objektvariablen. Die erste Variable stellt die Anwen-dung Outlook dar. Die zweite Variable stellt die Outlook-Komponente für einen Kontakt dar.

Aktivieren Sie die gewünschte Tabelle, die die Adressen enthält und positionieren Sie dieMarkierung auf die Startzelle, ab der die Übertragung der Daten beginnen soll.

Danach arbeiten Sie alle Einträge in der Tabelle über eine Schleife ab. Innerhalb der Schleifewenden Sie die Methode CreateItem an, um eine Kontakt-Komponente zu erstellen.

Neben der Komponente für Kontakte gibt es in Outlook weitere Komponenten:

• olContactItem: Über diese Konstante können Sie einen neuen Kontakt in Outlookerstellen.

• olDistributionListItem: Erstellt einen Eintrag in der Verteilerliste von Outlook.

• olJournalItem: Dabei erstellen Sie einen neuen Journaleintrag in Outlook.

• olMailItem: Hiermit können Sie eine neue E-Mail erstellen.

• olNoteItem: Über diese Konstante legen Sie eine neue Notiz an.

• olPostItem: Über diese Konstante können Sie ein E-Mail verschicken.

• olTaskItem: Über diese Konstante fügen Sie einen neuen Eintrag in der Aufgabenlistevon Outlook ein.

Übertragen Sie nun die Zelleninhalte der Excel-Tabelle in die zur Verfügung stehendenEigenschaften von Outlook.

Am Ende der Übertragung eines Datensatzes wenden Sie die Methode Save an, um den Kon-takt endgültig zu speichern.

Geben Sie nach dem Schleifenaustritt eine Meldung am Bildschirm aus, um die Anzahl derübertragenen Datensätze bekannt zu geben. Heben Sie danach die Objektverweise wiederauf, um den reservierten Speicher wieder freizugeben.

Set Out_Obj = Nothing Set Out_App = NothingEnd Sub

Hinweis:

Damit es beim Zugriff auf die VBA-Funktionen in Outlook zu keinen Problemen kommt,müssen Sie in der Entwicklungsumgebung von Excel die Bibliothek MIRCROSOFT OUT-LOOK 10.0 OBJECT LIBRARY im Menü EXTRAS über den Befehl VERWEISE einbinden.

Listing 12.1: Adressdaten werden nach Outlook transferiert

Page 463: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel462

Abb. 12.2 Alle Excel-Adressen sind nun im Outlook-Kontaktordner

12.2 E-Mail-Verkehr in Word protokollieren

Bei Bedarf können Sie Ihre E-Mails auch direkt aus Outlook in ein Word-Dokument transfe-rieren. Damit können Sie eine komplette Statistik Ihres E-Mail-Verkehrs erstellen.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap12 unter demNamen EMAILS.DOC finden.

Sub EMailsAuslesen()Dim Out As Outlook.MAPIFolderDim i_Ges As IntegerDim i As IntegerDim Tabelle As TableDim Zeile As Row

Set Tabelle = ActiveDocument.Tables.Add( _ Range:=Selection.Range, _ NumRows:=1, _

Listing 12.2: Den E-Mail-Verkehr in Word dokumentieren

Page 464: VBA-Programmierung fur Word, Excel und Access

Rechts12.2 E-Mail-Verkehr in Word protokollieren 463

Fügen Sie im ersten Schritt eine neue Tabelle in Ihr Word-Dokument ein. Dazu verwendenSie die Methode Add. Geben Sie dieser Methode an, wo die Tabelle eingefügt werden sollund wie viele Zeilen und Spalten diese erhalten soll. Da Sie die Zeilen später dynamisch ein-fügen werden, setzen Sie das Argument NumRows zunächst auf den Wert 1. Das ArgumentNumColumns setzen Sie auf den Wert 4. Geben Sie in der ersten Zeile der Tabelle die Spal-tenüberschriften ein.

Fügen Sie im nächsten Schritt eine neue Zeile in die Tabelle ein, indem Sie die Methode Addauf die Eigenschaft Rows (Zeile) anwenden. Beschriften Sie diese Zeile mit der Spaltenüber-schrift, die Sie mit dem Schriftschnitt Unterstrichen über die Eigenschaft Underline forma-tieren.

Mithilfe der Anweisung

NumColumns:=4)

Set Zeile = Tabelle.Rows.AddTabelle.Rows(1).Cells(1).Range.Text = "Titel"Tabelle.Rows(1).Cells(2).Range.Text = "Erhalten am"Tabelle.Rows(1).Cells(3).Range.Text = "Anhänge"Tabelle.Rows(1).Cells(4).Range.Text = "Gelesen"Tabelle.Rows(1).SelectSelection.Font.Underline = wdUnderlineSingle

Set Out = GetObject("", "Outlook.Application").GetNamespace _("MAPI").GetDefaultFolder(olFolderInbox)i_Ges = Out.Items.Counti = 0While i < i_Gesi = i + 1Set Zeile = Tabelle.Rows.LastWith Out.Items(i) Tabelle.Rows.Last.Cells(1).Range.Text = .Subject Tabelle.Rows.Last.Cells(2).Range.Text = _ Format(.ReceivedTime, "dd.mm.yyyy hh:mm") Tabelle.Rows.Last.Cells(3).Range.Text = .Attachments.Count Tabelle.Rows.Last.Cells(4).Range.Text = Not .UnReadEnd WithSet Zeile = Tabelle.Rows.AddWendSet Out = NothingEnd Sub

Set Out = GetObject("", "Outlook.Application").GetNamespace("MAPI"). GetDefaultFolder(olFolderInbox)

Listing 12.2: Den E-Mail-Verkehr in Word dokumentieren

Page 465: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel464

gewinnen Sie Zugriff auf den E-Mail-Eingangsordner von Outlook.

Über die Eigenschaft Last, welche Sie auf die Auflistung Rows zeigen lassen, ermitteln Siedie letzte Zeile der Tabelle. In einer Schleife ermitteln Sie mithilfe der Eigenschaft Subjectden Titel der jeweiligen E-Mails und schreiben den Titel sowie die anderen Mailinformatio-nen in die Zeile. Fügen Sie danach eine neue Zeile in die Tabelle ein.

12.3 Access-DB in Word verfügbar machen

Das Zusammenspiel zwischen Access und Word ist zum Beispiel dann sinnvoll, wenn Sieeinen gemeinsamen Datenbestand in einer Access-Tabelle verwalten und diesen bei Bedarfanzapfen möchten. Sie können sich einmal vorstellen, Sie würden eine Access-Tabelle mitAdressen auf einem zentralen Laufwerk verwalten und pflegen. Auf diese Datenbanktabellesollen alle Anwender zugreifen, um immer die aktuellen Adressen für ihre Briefe undAnschreiben zu verwenden. Dabei kann dieser Zugriff im Hintergrund erfolgen, ohne dassder Anwender davon etwas erfährt.

Im nächsten Beispiel soll eine zentrale Access-Tabelle mit Adressdaten in einem Word-Dokument verfügbar gemacht werden. Dabei soll in Word eine UserForm erstellt werden, diewie folgt aussieht:

Abb. 12.3 Die UserForm, in der die Adressen angezeigt werden sollen

Page 466: VBA-Programmierung fur Word, Excel und Access

Rechts12.3 Access-DB in Word verfügbar machen 465

In dieser UserForm soll im ersten Dropdownfeld ein Nachname ausgewählt werden. Mithilfedieses Nachnamens werden dann die dazu passenden Informationen aus der Access-Tabellegeholt und in der UserForm angezeigt.

Im ersten Schritt müssen Sie das Dropdownfeld mit den Nachnamen befüllen. Dabei greifenSie auf die Access-Tabelle zu und fügen die Nachnamen nacheinander in das Dropdownfeldein. Für diese Aufgabe nützen Sie das Ereignis Initialize, das automatisch dann eintritt,wenn die UserForm aufgerufen wird. Stellen Sie dieses Ereignis nun ein, indem Sie wie folgtvorgehen:

1. Wechseln Sie in die Entwicklungsumgebung von Word.

2. Klicken Sie Ihre UserForm an einer freien Stelle doppelt an.

Stellen Sie das Ereignis Initialize ein und ergänzen es wie folgt.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap12 unter demNamen ADRESSEN.DOC finden.

Hinweis:

Damit es beim Zugriff auf die VBA-Funktionen in Access zu keinen Problemen kommt,müssen Sie in der Entwicklungsumgebung von Excel die Bibliothek MICROSOFT ACTI-VEX DATA OBJECTS 2.7 LIBRARY im Menü EXTRAS über den Befehl VERWEISE ein-binden.

Private Sub UserForm_Initialize()Dim CONN As ADODB.ConnectionDim DBS As ADODB.Recordset

Set CONN = New ADODB.Connection With CONN .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\AccessDemos.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Kontaktpersonen", _ ActiveConnection:=CONN, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic

Listing 12.3: Das Dropdownfeld mit den Nachnamen füllen

Page 467: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel466

Geben Sie im ersten Schritt den Namen des Providers sowie der Datenbank an, die die Adres-sentabelle enthält. Danach füllen Sie über eine Schleife das Kombinationsfeld der UserForm,indem Sie mithilfe der Methode AddItem die einzelnen Nachnamen übertragen. VergessenSie dabei nicht, den jeweils nächsten Datensatz über die Methode MoveNext einzustellen.Sind alle Datensätze abgearbeitet, trifft das Endkriterium EOF zu und die Schleife wird been-det.

Abb. 12.4 Das Dropdownfeld ist gefüllt

Im nächsten Schritt müssen Sie dafür sorgen, dass die Textfelder der UserForm gefüllt wer-den. Diese Textfelder müssen immer dann aktualisiert werden, wenn ein anderer Nachnameaus dem Dropdownfeld ausgewählt wird. Für diese Aufgabe setzen Sie das Ereignis Changeein, das automatisch eintritt, wenn ein anderer Eintrag aus dem Dropdownfeld ausgewähltwird. Um dieses Ereignis einzustellen, verfahren Sie wie folgt:

Do While Not .EOF UserForm1.ComboBox1.AddItem .Fields("Nachname").Value .MoveNext Loop .Close End With CONN.Close Set DBS = NothingEnd Sub

Listing 12.3: Das Dropdownfeld mit den Nachnamen füllen

Page 468: VBA-Programmierung fur Word, Excel und Access

Rechts12.3 Access-DB in Word verfügbar machen 467

1. Wechseln Sie in die Entwicklungsumgebung von Word.

2. Führen Sie in Ihrer UserForm einen Doppelklick auf das Dropdownfeld aus.

3. Stellen Sie das Ereignis Change ein und ergänzen es wie folgt:

Private Sub ComboBox1_Change()Dim CONN As ADODB.ConnectionDim DBS As ADODB.RecordsetDim s As StringDim Vorname As StringDim Nachname As StringDim Straße As StringDim PLZ As StringDim Ort As StringDim Firma As String

s = "Nachname='" & UserForm1.ComboBox1.Value & "'"

Set CONN = New ADODB.Connection With CONN .Provider = "Microsoft.Jet.OLEDB.4.0" .Open "C:\Eigene Dateien\AccessDemos.mdb" End With Set DBS = New ADODB.Recordset With DBS .Open Source:="Kontaktpersonen", _ ActiveConnection:=CONN, _ CursorType:=adOpenKeyset, _ LockType:=adLockOptimistic .Find Criteria:=s, SearchDirection:=adSearchForward If Not .EOF Then Vorname = .Fields("Vorname").Value Nachname = .Fields("Nachname").Value Firma = .Fields("Firma").Value Straße = .Fields("Adresse").Value PLZ = .Fields("Postleitzahl").Value Ort = .Fields("Ort").Value Else MsgBox "Datensatz nicht gefunden" End If .Close End With CONN.Close

Listing 12.4: Den Zugriff auf die Access-Tabelle programmieren

Page 469: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel468

Definieren Sie im ersten Schritt die Variablen, die Sie für diese Aufgabe brauchen. Dazugehören unter anderem die String-Variablen, um die Ergebnisse aus der Access-Tabelle zwi-schenzuspeichern. Des Weiteren benötigen Sie Objekte, um die Anwendungen Access undWord zu steuern und eine Objektvariable vom Typ Recordset, um die Access-Tabelle zuverarbeiten.

Gleich im Anschluss stellen Sie den Suchtext zusammen, nach dem in der Access-Tabellegesucht werden soll. Dieser Suchstring muss denselben Namen enthalten wie derjenige, denSie in Ihrer Access-Tabelle definiert haben.

Öffnen Sie danach die beteiligte Datenbank sowie die Tabelle KONTAKTPESONEN. Setzen Siedanach die Methode Find ein und übergeben ihr den Suchstring, den Sie sich in der Varia-blen s zusammengebastelt haben. War die Suche über den Nachnamen erfolgreich, meldetdie Eigenschaft EOF den Wert False. Diese Eigenschaft würde übrigens den Wert True mel-den, wenn die Suche erfolglos gewesen wäre. Weisen Sie nun den Variablen die gefundenenWerte zu und schließen die Access-Tabelle gleich danach über die Methode Close. Im sel-ben Atemzug schließen Sie auch gleich die Datenbank.

Nun übertragen Sie den Inhalt der Variablen direkt in Ihre UserForm.

Set DBS = Nothing With UserForm1 .TextBox1 = Vorname .TextBox2 = Firma .TextBox3 = Straße .TextBox4 = PLZ .TextBox5 = OrtEnd WithEnd Sub

Listing 12.4: Den Zugriff auf die Access-Tabelle programmieren

Page 470: VBA-Programmierung fur Word, Excel und Access

Rechts12.3 Access-DB in Word verfügbar machen 469

Abb. 12.5 Alle Daten werden nun angezeigt

Was jetzt noch fehlt, ist die Aktion, die ausgeführt werden soll, wenn die Schaltfläche OKgeklickt wird. In diesem Fall sollen die Daten aus der UserForm in das aktuelle Dokumenthineingeschrieben werden. Klicken Sie dazu in der Entwicklungsumgebung in Ihrer User-Form die Schaltfläche OK doppelt an und erfassen folgendes Ereignismakro:

Übertragen Sie die Informationen aus der UserForm in das Dokument. Fügen Sie nach jederübertragenen Information einen neuen Absatz über die Methode TypeParagraph ein. Been-den Sie die UserForm, indem Sie die Anweisung Unload Me einsetzen.

Private Sub CommandButton1_Click()With UserForm1 Selection.TypeText Text:=.TextBox1.Value & _ " " & .ComboBox1.Value Selection.TypeParagraph Selection.TypeText Text:=.TextBox2.Value Selection.TypeParagraph Selection.TypeText Text:=.TextBox3.Value Selection.TypeParagraph Selection.TypeText Text:=.TextBox4.Value ActiveDocument.Save End WithUnload MeEnd Sub

Listing 12.5: Die Daten aus der UserForm werden in das Dokument eingefügt

Page 471: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel470

Abb. 12.6 Die Adressdaten wurden ins Dokument eingefügt

12.4 Objekte in Word-Dokumente integrieren

In Office-Dokumente können Sie andere Office-Komponenten verknüpfen. Dabei gibt esverschiedene Möglichkeiten. Sie können beispielsweise einen Bereich aus einem Office-Dokument oder das komplette Office-Dokument verknüpfen.

12.4.1 Arbeitsmappe als Symbol einfügen

Im nächsten Beispiel fügen Sie eine Excel-Arbeitsmappe als Symbol in ein Worddokumentein..

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap12 unter demNamen OBJEKTE.DOC finden.

Page 472: VBA-Programmierung fur Word, Excel und Access

Rechts12.4 Objekte in Word-Dokumente integrieren 471

Über die Methode AddOLEObject erstellen Sie ein OLE-Objekt. Dabei hat diese Methodefolgende Syntax:

Über das Argument ClassType geben Sie den Name der Anwendung bekannt, die zum Akti-vieren 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.

Setzen Sie das Argument LinkToFile auf den Wert True, um das OLE-Objekt mit der Dateizu verknüpfen, aus der es erstellt wurde. Weisen Sie dem Argument hingegen den WertFalse zu, um das OLE-Objekt als separate Kopie der Datei anzulegen. Der Standardwert istFalse.

Mit dem Argument DisplayAsIcon können Sie das OLE-Objekt als Symbol anzeigen. Set-zen Sie dieses Argument in diesem Fall auf True, um das Symbol anzuzeigen. Der Standard-wert ist False.

Unter dem Argument IconFileName müssen Sie die Datei angeben, die das anzuzeigendeSymbol enthält.

Im Argument IconIndex ist die Indexnummer des Symbols innerhalb von IconFileNameenthalten. Die Reihenfolge der Symbole in der angegebenen Datei entspricht der Reihen-folge, in der die Symbole im Dialogfeld ANDERES SYMBOL (Menü EINFÜGEN, DialogfeldOBJEKT) angezeigt werden, wenn das Kontrollkästchen ALS SYMBOL ANZEIGEN aktiviert ist.Das erste Symbol in der Datei hat die Indexnummer 0.

Sub DateiAlsObjektEinfügen() On Error GoTo fehler Selection.InlineShapes.AddOLEObject _ ClassType:="Excel.Sheet.8", _ FileName:="C:\Eigene Dateien\Kontaktpersonen.xls", _ LinkToFile:=True, DisplayAsIcon:=True, _ iconFileName:= _ "C:\Programme\Microsoft Office\Office10\excel.exe", _ IconIndex:=1, IconLabel:= _ "C:\Eigene Dateien\Kontaktpersonen.xls" Exit Subfehler: MsgBox "Die Datei konnte nicht gefunden werden!"End Sub

Listing 12.6: Eine Excel-Arbeitsmappe als Symbol einfügen

AddOLEObject(ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Range)

Page 473: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel472

Im Argument IconLabel geben Sie die Beschriftung an, die unter dem Symbol angezeigtwerden soll.

Im Argument Range können Sie den Bereich angeben, in dem das OLE-Objekt in den Texteingefügt wird.

Abb. 12.7 Die Arbeitsmape wurde als Symbol eingefügt

12.4.2 Mehrere Arbeitsmappen als Symbol einfügen

Erweitern Sie diese Aufgabenstellung nun in der Form, dass Sie alle Excel-Arbeitsmappeneines bestimmten Verzeichnisses in ein Word-Dokument als Symbol hineinverknüpfen. DieLösung dieser Aufgabenstellung sehen Sie im folgenden Listing:

Sub AlleExcelsEinbinden()Dim Datei As StringDim s As StringConst Pfad = "C:\Eigene Dateien\"

Datei = Dir("C:\Eigene Dateien\*.xls")ChDir PfadWhile Datei <> "" s = Pfad & Datei Selection.InlineShapes.AddOLEObject _ FileName:=s, _ LinkToFile:=True, DisplayAsIcon:=True, _ iconFileName:= _

Listing 12.7: Alle Excel-Arbeitsmappen als Symbole einfügen

Page 474: VBA-Programmierung fur Word, Excel und Access

Rechts12.5 Excel-Daten nach Word kopieren 473

Abb. 12.8 Alle Mappen wurden als Symbol eingefügt

12.5 Excel-Daten nach Word kopieren

Sehr häufig benötigen Sie Daten aus Excel in Word-Dokumenten. Im folgenden Beispiel sollein bestimmter Bereich einer Excel-Tabelle in ein neues Word-Dokument übertragen wer-den. Dabei haben Sie die Entscheidung zu treffen, ob Sie die Verknüpfung zu den Original-daten behalten möchten oder nicht. Sehen Sie sich zunächst einmal folgende Ausgangstabellean.

"C:\Programme\Microsoft Office\Office10\excel.exe", _ IconIndex:=1, IconLabel:=Datei Selection.TypeParagraph Datei = Dir() WendEnd Sub

Listing 12.7: Alle Excel-Arbeitsmappen als Symbole einfügen

Page 475: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel474

Abb. 12.9 Diese Tabelle soll nach Word überführt werden

12.5.1 Daten unverknüpft übertragen

Erfassen Sie nun in der Entwicklungsumgebung von Excel das folgende Makro:

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap12 unter demNamen BEREICHE.XLS finden.

Sub BereichNachWordTransferieren()Dim WordObj As ObjectDim WordDoc As ObjectDim Bereich As Range

On Error GoTo Öffnen Set WordObj = GetObject(, "Word.application.10") GoTo weiterÖffnen: Set WordObj = CreateObject("Word.application.10")weiter: WordObj.Visible = True Set WordDoc = WordObj.Documents.Add

Set Bereich = Sheets("Tabelle1").Range("A1:D10") Range(Bereich.Address).Copy

Listing 12.8: Eine Excel-Tabelle nach Word transportieren (ohne Verknüpfung)

Page 476: VBA-Programmierung fur Word, Excel und Access

Rechts12.5 Excel-Daten nach Word kopieren 475

Erstellen Sie zunächst zwei Objektvariablen. Die erste Variable wird die Anwendung Wordverwalten. In der zweiten Variable werden Sie ein neues, noch leeres Word-Dokument hal-ten. Prüfen Sie zunächst, ob die Anwendung Word bereits gestartet ist. Dazu setzen Sie dieFunktion GetObject ein und übergeben ihr die Textfolge word.application.10. Liefertdieser Vorgang einen Fehler, dann ist die Anwendung noch nicht verfügbar und muss überdie Funktion CreateObject erstellt werden.

Fügen Sie danach über die Methode Add, die Sie auf die Auflistung Documents anwenden,ein neues Dokument ein.

Definieren Sie über die Anweisung Set einen Bereich in Ihrer Excel-Arbeitsmappe, den Sieübertragen möchten. Kopieren Sie diesen Bereich im Anschluss und fügen ihn über dieMethode Paste in das Dokument ein.

Abb. 12.10 Die Tabelle wurde korrekt übertragen

WordObj.Selection.Paste Application.CutCopyMode = False Set WordObj = Nothing Set WordDoc = NothingEnd Sub

Listing 12.8: Eine Excel-Tabelle nach Word transportieren (ohne Verknüpfung)

Page 477: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel476

12.5.2 Daten verknüpft übertragen

Im folgenden Beispiel werden ebenfalls die Daten aus der Excel-Tabelle in ein neues Word-Dokument übertragen. Dabei bleibt aber die Verknüpfung zur Excel-Tabelle weiter enthal-ten:

Um die Excel-Daten im kopierten Bereich von Excel nach Word verknüpft zu übertragen,geben Sie bei der Methode PasteSpecial das Argument Link mit dem Wert True an.Damit wird der Bereich verknüpft.

Sub BereichNachWordVerknüpftÜbertragen()Dim WordObj As ObjectDim WordDoc As ObjectDim i As Integer

Sheets("Tabelle1").Activate i = ActiveSheet.UsedRange.Rows.Count Range("A1:D" & i).Copy On Error GoTo Öffnen Set WordObj = GetObject(, "Word.application.10") GoTo weiterÖffnen: Set WordObj = CreateObject("Word.application.10")weiter: WordObj.Visible = True Set WordDoc = WordObj.Documents.Add With WordObj.Selection .TypeText Text:="Daten aus : " & _ ActiveWorkbook.Name .TypeParagraph .TypeText Text:="vom " & Format(Now(), _ "dd-mmm-yyyy") .TypeParagraph End With WordObj.Selection.PasteSpecial link:=True Application.CutCopyMode = False Set WordObj = Nothing Set WordDoc = NothingEnd Sub

Listing 12.9: Eine Excel-Tabelle nach Word transportieren (Verknüpfung erhalten)

Page 478: VBA-Programmierung fur Word, Excel und Access

Rechts12.6 Der Datenaustausch zwischen Access und Excel 477

Abb. 12.11 Die Verknüpfungen zur Originaldatei bleiben erhalten

12.6 Der Datenaustausch zwischen Access und Excel

Der Datenaustausch zwischen Access und Excel gestaltet sich weitestgehend problemlos.Sowohl für den Import als auch für den Export gibt es Assistenten, über die Sie diese Aufgabemanuell recht schnell bewerkstelligen können. Selbstverständlich können Sie diese Aufgabeauch per Makro lösen.

12.6.1 Import einer Excel-Tabelle nach Access

Beim Import einer Excel-Tabelle nach Access können Sie die Tabelle quasi 1:1 übertragen.Im nächsten Beispiel wird eine Excel-Tabelle in eine Access-Datenbank überführt. Sehen Siesich zuvor einmal die Ausgangstabelle in Excel an.

Page 479: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel478

Abb. 12.12 Diese Tabelle soll nach Access überführt werden

Um die Daten zu übertragen, erfassen Sie in der Entwicklungsumgebung von Access folgen-des Makro:.

Übergeben Sie der Methode TransferSpreadsheet die Konstante acImport, um mitzu-teilen, dass Access einen Import vornehmen soll. Als zweite Konstante geben Sie die Excel-Version an, in welcher die Tabelle vorliegt. Dabei haben Sie folgende Möglichkeiten:

• acSpreadsheetTypeExcel3 (Excel 3.0)

• acSpreadsheetTypeExcel4 (Excel 4.0)

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap12 unter demNamen TRANSFER.MDB finden.

Sub TabelleVonExcelImportieren()DoCmd.TransferSpreadsheet acImport, _ acSpreadsheetTypeExcel9, _ "Kontakte", "C:\Eigene Dateien\Kontaktpersonen.xls", _ TrueEnd Sub

Listing 12.10: Eine Excel-Tabelle importieren

Page 480: VBA-Programmierung fur Word, Excel und Access

Rechts12.6 Der Datenaustausch zwischen Access und Excel 479

• acSpreadsheetTypeExcel5 (Excel 5.0)

• acSpreadsheetTypeExcel7 (Excel 95)

• acSpreadsheetTypeExcel8 (Excel 97)

• acSpreadsheetTypeExcel9 (Excel 2000)

• acSpreadsheetTypeExcel10 (Excel 2002)

Abb. 12.13 Die Excel-Tabelle wurde erfolgreich nach Access übertragen

12.6.2 Export einer Access-Tabelle nach Excel

Der Export einer Access-Tabelle in eine Excel-Arbeitsmappe funktioniert ebenso ohne Pro-bleme wie schon der Import.

Im folgenden Beispiel wird die Access-Tabelle KONTAKTE in eine Arbeitsmappe überführt.Dabei müssen Sie sich nicht um die Anlage der Excel-Arbeitsmappe kümmern. Access machtdies automatisch für Sie. Sehen Sie sich nun das nächste Listing an.

Sub AccessTabelleNachExcelExportieren()DoCmd.OutputTo acOutputTable, "Kontakte", _acFormatXLS, _"C:\Eigene Dateien\Kontaktadressen.xls", TrueEnd Sub

Listing 12.11: Eine Access-Tabelle exportieren

Page 481: VBA-Programmierung fur Word, Excel und Access

Links

12 Office im Zusammenspiel480

Um die Access-Tabelle zu exportieren, setzen Sie die Methode OutPutTo ein. DieseMethode hat folgende Syntax:

Im Argument ObjectType geben Sie den Objekttyp an, der ausgegeben werden soll. Dabeistehen Ihnen folgende Konstanten zur Verfügung.

• acOutputForm

• acOutputFunction

• acOutputModule

• acOutputQuery

• acOutputReport

• acOutputServerView

• acOutputStoredProcedure

• acOutputTable

Im Argument ObjectName geben Sie den Namen des Objekts an.

Durch das Argument OutputFormat geben Sie das Ausgabeformat, ausgedrückt als eineacFormat-Konstante, an. Dabei haben Sie unter anderem folgende gängige Konstanten zurAuswahl:

• acFormatHTML

• acFormatASP

• acFormatRTF

• acFormatTXT

• acFormatXLS

Im Argument OutputFile geben Sie den vollständigen Namen und Pfad der Datei an, in diedas Objekt ausgegeben werden soll.

Das Argumnt AutoStart bestimmt, ob die entsprechende auf Windows basierende Anwen-dung sofort gestartet werden soll. Wenn ja, setzen Sie in diesem Argument den Wert Trueein. Andernfalls lassen Sie dieses Argument einfach weg.

Mithilfe des Arguments TemplateFile können Sie den vollständigen Namen und Pfad derDatei angeben, die Sie als Vorlage für eine HTML-, HTX- oder ASP-Datei verwenden möch-ten.

OutputTo(ObjectType, ObjectName, OutputFormat, OutputFile, AutoStart, TemplateFile)

Page 482: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang481

13 Auf Fehlersuche in Office

Selbstverständlich wird es nicht ausbleiben, dass Sie während der Entwicklung von VBA-Lösungen auch auf Probleme stoßen werden. Dieses Kapitel zeigt auf, welche Fehlerquellenes bei der Programmierung gibt und wie Sie Fehler vermeiden bzw. wie Sie Fehler im Quell-code aufspüren und beseitigen können. Wichtig bei der Entwicklung von VBA-Lösungen istauch, dass Sie mögliche Fehlerquellen, die in einer falschen Bedienung des Makros durch denAnwender liegen, im Voraus erkennen und abfangen können.

13.1 Typische Fehlerquellen

In vielen Fällen zeigt der VBE-Editor Fehler bereits direkt nach dem Starten des Makros an.In diesen Fällen liegen grobe syntaktische Fehler vor. Office prüft nach jedem Makrostartvorab, ob die verwendeten Methoden und Eigenschaften für ein verwendetes Objekt über-haupt verfügbar sind. Wenn nicht, wird der Ablauf des Makros unterbrochen und eine Bild-schirmmeldung angezeigt.

13.1.1 Syntaxfehler

Im folgenden Beispiel wird ein Makro abgebrochen, weil ein Befehl von Word nicht erkanntwird.

Abb. 13.1 Syntaxfehler werden sofort erkannt

Page 483: VBA-Programmierung fur Word, Excel und Access

Links

13 Auf Fehlersuche in Office482

In diesem Fall wurde bei der Funktion MsgBox ein Buchstabe vergessen. Nach dem Startendes Makros wird der Syntaxfehler erkannt und gemeldet. Nach der Bestätigung der Meldungspringt der Mauszeiger direkt an die fehlerhafte Stelle im Code und markiert den fehlerhaftenBefehl.

Danach wählen Sie aus dem Menü AUSFÜHREN den Befehl ZURÜCKSETZEN, korrigieren denFehler und starten das Makro erneut.

13.1.2 Nicht verfügbare Befehle

Oft entstehen auch Fehler, wenn Methoden und Eigenschaften für bestimmte Objekte nichtverfügbar sind.

Im folgenden Beispiel wird versucht, den Namen des aktiven Druckers auszugeben.

Abb. 13.2 Der aktive Drucker soll ausgegeben werden

Hinweis:

Übrigens können Sie Fehler bereits während der Eingabe erkennen. Bei Objekten, Metho-den, Funktionen und Eigenschaften werden die einzelnen Anweisungen nach der Eingabeautomatisch teilweise in Großbuchstaben gewandelt. So wird auf jeden Fall der ersteBuchstabe groß konvertiert. Bei Anweisungen, die aus mehreren einzelnen Wörternzusammengesetzt sind, wie beispielsweise Activedocument. lautet die ScheibweiseActiveDocument. Geben Sie daher die Anweisungen immer in Kleinbuchstaben ein. Siehaben dann durch die folgende automatische Umsetzung der Befehle schon einmal eineSichtkontrolle, ob der Befehl zumindest richtig geschrieben wurde.

Page 484: VBA-Programmierung fur Word, Excel und Access

Rechts13.1 Typische Fehlerquellen 483

Logisch klingt der Befehl

ja schon. Aber leider ist er in diesem Fall nicht korrekt. Der richtige Befehl für diese Aufga-benstellung lautet

Diesen und ähnliche Fehler können Sie schnell beheben, wenn Sie den Mauszeiger auf dieEigenschaft ActivePrinter setzen und die Taste (F1) drücken, um die Online-Hilfe aufzu-rufen.

Abb. 13.3 Die Online-Hilfe einsetzen

Application.ActivePrinter.Name

Application.ActivePrinter.

Page 485: VBA-Programmierung fur Word, Excel und Access

Links

13 Auf Fehlersuche in Office484

13.1.3 Der Griff ins Ungewisse

Probleme bei der Programmierung gibt es auch, wenn Sie versuchen, auf Objekte zuzugrei-fen, die es gar nicht gibt.

Im folgenden Beispiel wird versucht, von einem aktiven Dokument auf ein anderes geöffne-tes Dokument zuzugreifen. Leider ist momentan aber nur ein Dokument geöffnet.

Abb. 13.4 Der Versuch schlägt fehl

Page 486: VBA-Programmierung fur Word, Excel und Access

Rechts13.1 Typische Fehlerquellen 485

13.1.4 Falscher Einsatz von Variablen

Wenn Sie Variablen in Ihrem Quellcode einsetzen, müssen Sie darauf achten, dass Sie dierichtigen Variablentypen verwenden.

Variable zu klein

Bei Schleifen, bei denen Sie im Vorfeld nicht genau wissen, wie viele Schleifendurchläufe esgeben wird, sollten Sie die Zählvariable vom Typ Long nehmen. Der Einsatz einer Integer-Variablen würde nach 32.766 Durchläufen einen Fehler produzieren.

Abb. 13.5 Ein Überlauf der Variable

Page 487: VBA-Programmierung fur Word, Excel und Access

Links

13 Auf Fehlersuche in Office486

Nicht geeignete Variable

Im nächsten Beispiel sollen einige Zahlen mit Nachkommastellen addiert und ausgegebenwerden. Wenn die Nachkommastellen mit ausgegeben werden sollen, dürfen Sie keine Vari-bale vom Typ Integer oder Long einsetzen, da diese Variablen mit Ganzzahlen arbeiten.Setzen Sie stattdessen eine Variable vom Typ Single, Double oder auch Currency ein, umzum richtigen Ergebins zu kommen.

Abb. 13.6 Den richtigen Datentyp einsetzen

Page 488: VBA-Programmierung fur Word, Excel und Access

Rechts13.1 Typische Fehlerquellen 487

Falsch geschriebene Variablen

Immer wieder ärgerlich und zeitraubend ist es, wenn Sie Variablen nicht deklariert haben undSie danach feststellen müssen, dass aufgrund eines kleinen Buchstabendrehers die Variablenicht gefüllt ist. Gerade bei mehrseitigen Listings ist die Fehlersuche in diesem Fall rechtanstrengend.

In solchen Fällen sollten Sie zur Sicherheit die Deklaration von Variablen erzwingen. Schrei-ben Sie daher in die erste Zeile Ihres Moduls die Anweisung

Nun wird ein Makro erst ausgeführt, wenn alle Variablen deklariert wurden.

Abb. 13.7 Nicht deklarierte Variablen werden angemahnt

Das Makro kann erst ausgeführt werden, wenn die noch fehlende Variable deklariert wurde.

Option explicit

Page 489: VBA-Programmierung fur Word, Excel und Access

Links

13 Auf Fehlersuche in Office488

13.1.5 Fehlerliste einsehen

Wenn es sich nicht gerade um Syntaxfehler handelt, hat jeder Fehler eine bestimmte Num-mer. Eine Liste mit diesen Nummern und deren Beschreibung können Sie in der Online-Hilfeeinsehen, wenn Sie auf der Registerkarte INDEX das Suchwort FEHLER eingeben und imListenfeld das Thema AUFFANGBARE FEHLER anklicken.

Abb. 13.8 Die Fehlerliste in Word

13.2 Die Fehlerbehandlung

Wie bereits erwähnt, sollten Sie in Ihren VBA-Lösungen Fehler abfangen. Dazu können Siedie Anweisung On Error einsetzen.

Im folgenden Beispiel wird ein Fehler provoziert, der einen Makroabsturz zur Folge hätte,wenn eine Fehlerbehandlung fehlen würde.

Page 490: VBA-Programmierung fur Word, Excel und Access

Rechts13.2 Die Fehlerbehandlung 489

Stellen Sie mithilfe der Anweisung On Error GoTo fehlerm sicher, dass im Fehlerfall inden Paragraphen fehlerm verzweigt wird. Tritt der Fehlerfall ein, der in diesem Fall durcheine nicht erlaubte Division durch den Wert Null herbeigeführt wird, geben Sie im Fehler-Paragraphen die Nummer des Fehlers über die Eigenschaft Number aus. Gleich im Anschlussdaran ermitteln Sie mithilfe der Eigenschaft Description die dazugehörige Fehlerbeschrei-bung. Im nächsten Schritt können Sie ganz gezielt die Fehlernummer abfragen und je nachBedarf weitere Aktionen einleiten.

Die Anweisung Resume setzt die Ausführung nach der Abhandlung des Fehler-Paragraphenweiter fort.

Über die Anweisung Exit Sub können Sie verhindern, dass der Fehler-Paragraph bei norma-lem Makroablauf auch abgearbeitet wird. Setzen Sie daher die Fehlerparagraphen immer andas Ende Ihrer Makros.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap13 unter demNamen FEHLER.DOC finden.

Sub DivisionDurchNull()Dim i1 As IntegerDim i2 As Integer

On Error GoTo fehlerm i1 = 1 / i2 Exit Subfehlerm: MsgBox Err.Number MsgBox Err.Description If Err.Number = 11 Then 'Aktion(en), die durchgeführt werden soll(en) i2=1 End If ResumeEnd Sub

Listing 13.1: Die Fehlerbehandlung aufsetzen

Hinweis:

In manchen Fällen benötigen Sie keine Fehlerparagraphen. Möchten Sie lediglich verhin-dern, dass ein Makro einen Absturz verursacht, und keine weiteren Schritte einleiten, dannsetzen Sie die Anweisung

On Error Resume Next

ein, die Sie vor den fehlerverursachenden Befehl setzen.

Page 491: VBA-Programmierung fur Word, Excel und Access

Links

13 Auf Fehlersuche in Office490

13.3 Allgemeine Punkte zur Programmierung

Zum Abschluss dieses Kapitels noch ein paar Tipps zur voraussehenden Programmierung mitOffice:

• Immer wieder kommt es vor, dass wertvoller Quellcode durch einen Absturz der Anwen-dung verloren geht, da Sie es versäumt haben, Ihre aktuellen Änderungen abzuspeichern.Aus diesem Grund empfiehlt es sich, in regelmäßigen Abständen kurz zwischenzuspei-chern.

• Führen Sie eine Entwicklung immer anhand einer Kopie der Originaldatei durch. Dadurchhaben Sie jederzeit die Möglichkeit, wieder neu aufzusetzen, wenn Ihre Entwicklung inden »Wald« geführt hat.

• Vorsicht bei Endlos-Schleifen! Wenn Sie aus Versehen eine Endlosschleife programmie-ren, ist oft nur noch ein Sprung aus dem Makro zu schaffen, indem Sie die Anwendungüber die Tastenkombination (Strg) + (Alt) + (Entf) hart abschließen. In diesem Fallkann Ihnen die Arbeit von Stunden verloren gehen. Um dies zu verhindern, können Sievor den Schleifeneintritt einen Haltepunkt setzen und den Code danach über denGebrauch der Taste (F8) schrittweise abarbeiten. Sie haben somit die Möglichkeit, auseiner eventuell aufgesetzten Endloschleife herauszukommen, indem Sie aus dem MenüAUSFÜHREN den Befehl ZURÜCKSETZEN wählen.

• Lassen Sie sich bei Fehlern nicht aus der Ruhe bringen. Sollten Sie nicht weiterkommenund eine Fehlerquelle nicht lokalisieren können, nutzen Sie die Hilfsquellen im Internet.In den Diskussionsforen von Microsoft oder Spotlight.de können Sie Ihre Fragen stellenund in den allermeisten Fällen auch eine sehr gute Antwort bekommen. Vermeiden abersollten Sie, Ihre Fragen in mehreren Foren parallel zu stellen. Dies wird als Crosspostingbezeichnet, nicht gern gesehen und teilweise dadurch quittiert, dass überhaupt keine Ant-wort gegeben wird bzw. dass Sie »angegriffen« werden, da Sie durch ein solches Cros-sPosting unter Umständen dutzende von Anwendern parallel einsetzen, um ein Problemzu lösen.

• Gehen Sie ab und zu auch mal an die frische Luft und drehen eine kleine Runde. Oft gehtdurch stundenlanges Arbeiten am PC einfach die Puste aus und man dreht sich gedanklichim Kreis. Überlegen Sie sich dabei, wie Sie das Problem umgehen bzw. anders lösenkönnen. Oft hilft es auch, ein Problem einen Tag liegen zu lassen und dann erneut aufzu-greifen.

Page 492: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang491

14 Tuning der VBA-Programme

In diesem Kapitel werden Sie erfahren, wie Sie Ihre VBA-Anwendungen noch schneller undbenutzerfreundlicher ablaufen lassen können.

14.1 Makros schneller ablaufen lassen

Nach der Programmierung von VBA-Tools lässt sich in Punkto Geschwindigkeit unterUmständen noch etwas verbessern. Nachfolgend werden einige Methoden aufgeführt, die denAblauf von Makros beschleunigen können.

14.1.1 Bildschirmaktualisierung abschalten

Haben Sie eine VBA-Anwendung programmiert, die zwischen einzelnen Fenstern hin- undherschaltet bzw. viele Zeilen, Spalten oder Ähnliches abarbeitet, so wird jeder Befehl gleicham Bildschirm umgesetzt. Dadurch entsteht duch die stetige Bildschirmaktualisierung einrechtes Gewusel auf dem Bildschirm, was selbstverständlich eine Menge Zeit braucht. Dasimmer wieder neue Aufbauen des Bildschirms kann aber während der Laufzeit eines Makroszu Beginn desselben abgeschaltet und am Ende des Makros wieder eingeschaltet werden.

Im folgenden Beispiel wird ein Dokument Satz für Satz abgearbeitet. Dabei wird der Text desjeweiligen Satzes in den Direktbereich geschrieben. Es werden dabei drei Varianten vorge-stellt, die alle dieselbe Aufgabe erfüllen, aber in unterschiedlicher Geschwindigkeit ablaufen.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap14 unter demNamen TUNING.DOC finden.

Sub SätzeDurchlaufen()Dim i As LongDim Startzeit As DateDim Endzeit As DateDim Dauer As Date

Listing 14.1: Sätze verarbeiten (Variante 1)

Page 493: VBA-Programmierung fur Word, Excel und Access

Links

14 Tuning der VBA-Programme492

Nehmen Sie zu Beginn des Makros die aktuelle Zeit und speichern diese in der VariablenStartzeit. Danach durchlaufen Sie in einer Schleife alle Sätze, indem Sie diese markierenund über die Anweisung Debug.Print im Direktbereich ausgeben. Nachdem alle Sätze imDokument verarbeitet wurden, wird die Schleife verlassen. Jetzt messen Sie die Endzeit undspeichern diesen Zeitpunkt in einer weiteren Variablen. Ermitteln Sie die Laufzeit desMakros, indem Sie die Endzeit von der Startzeit subtrahieren.

In diesem Beispiel wurde die Bildschirmaktualisierung nicht abgeschaltet. Als Ergebnisbenötigt das Makro für 800 Sätze bei einem Rechner mit 700 Mhz genau 19 Sekunden.

Schalten Sie jetzt die Bildschirmaktualisierung ab und messen dabei die Dauer.

Startzeit = TimeFor i = 1 To ActiveDocument.Sentences.Count ActiveDocument.Sentences(i).Select Debug.Print ActiveDocument.Sentences(i).TextNext i

Endzeit = TimeDauer = Endzeit - StartzeitMsgBox "Es wurden " & i & " Sätze in " & _Dauer & " durchlaufen!"End Sub

Sub SätzeDurchlaufenSchneller()Dim i As LongDim Startzeit As DateDim Endzeit As DateDim Dauer As Date

Application.ScreenUpdating = FalseStartzeit = TimeFor i = 1 To ActiveDocument.Sentences.Count ActiveDocument.Sentences(i).Select Debug.Print ActiveDocument.Sentences(i).TextNext i

Endzeit = TimeDauer = Endzeit - Startzeit

Listing 14.2: Sätze verarbeiten (Variante 2)

Listing 14.1: Sätze verarbeiten (Variante 1)

Page 494: VBA-Programmierung fur Word, Excel und Access

Rechts14.1 Makros schneller ablaufen lassen 493

Schalten Sie die Bildschirmaktualisierung ab, indem Sie die Eigenschaft ScreenUpdatingauf den Wert False setzen. Am Ende des Makros schalten Sie die Bildschirmaktualisierungwieder ein, indem Sie der Eigenschaft den Wert True zuweisen.

In diesem Beispiel wurde die Bildschirmaktualisierung abgeschaltet. Als Ergebnis benötigtdas Makro für 800 Sätze bei einem Rechner mit 700 Mhz genau 17 Sekunden. Dabei wurdendurch das Abschalten der Bildschirmaktualisierung zumindst 2 Sekunden eingespart.

14.1.2 Auflistungen einsetzen

Noch schneller können Sie das Makro ablaufen lassen, wenn Sie die einzelnen Sätze über dasAuflistungsobjekt Sentences ansprechen. In diesem Auflistungsobjekt können alle Sätzedes Dokuments abgerufen werden. Das Listing für diese Aufgabe lautet:

Application.ScreenUpdating = TrueMsgBox "Es wurden " & i & " Sätze in " &_ Dauer & " durchlaufen!"End Sub

Sub SätzeDurchlaufenNochSchneller()Dim Startzeit As DateDim Endzeit As DateDim Dauer As DateDim satz As ObjectDim i As Long

Application.ScreenUpdating = FalseStartzeit = TimeFor Each satz In ActiveDocument.Sentences Debug.Print satz.Text Satz.Select i = i + 1Next satz

Endzeit = TimeDauer = Endzeit - StartzeitApplication.ScreenUpdating = TrueMsgBox "Es wurden " & i & " Sätze in " & _ Dauer & " durchlaufen!"End Sub

Listing 14.3: Sätze verarbeiten (Variante 3)

Listing 14.2: Sätze verarbeiten (Variante 2)

Page 495: VBA-Programmierung fur Word, Excel und Access

Links

14 Tuning der VBA-Programme494

Indem Sie das Auflistungsobjekt Sentences einsetzen, können Sie eine weitere drastischeGeschwindigkeitsoptimierung erreichen.

In dieser Variante des Beispiels wurde die Bildschirmaktualisierung abgeschaltet und dasAuflistungsobjekt Sentences eingesetzt. Das Ergebnis kann sich sehen lassen. Das Makrobenötigt für 800 Sätze bei einem Rechner mit 700 Mhz genau 3 Sekunden.

14.1.3 Objekte nicht markieren

In der letzten Variante können Sie auf die Markierung der Sätze verzichten, was einen wei-teren Geschwindigkeitseffekt bringt:

In dieser Variante des Beispiels wurde die Bildschirmaktualisierung abgeschaltet, das Aufli-stungsobjekt Sentences eingesetzt und auf die Markierung der einzelnen Sätze verzichtet.Das Makro benötigt für 800 Sätze bei einem Rechner mit 700 Mhz genau 1 Sekunde.

Sub SätzeDurchlaufenNochVielSchneller()Dim Startzeit As DateDim Endzeit As DateDim Dauer As DateDim satz As ObjectDim i As Long

Application.ScreenUpdating = FalseStartzeit = TimeFor Each satz In ActiveDocument.Sentences Debug.Print satz.Text i = i + 1Next satz

Endzeit = TimeDauer = Endzeit - StartzeitApplication.ScreenUpdating = TrueMsgBox "Es wurden " & i & " Sätze in " & Dauer & " durchlaufen!"End Sub

Listing 14.4: Sätze verarbeiten (Variante 4)

Page 496: VBA-Programmierung fur Word, Excel und Access

Rechts14.1 Makros schneller ablaufen lassen 495

Abb. 14.1 Die schnellste Variante

14.1.4 Berechnung abschalten

In Excel machen große Tabellen mit unzähligen Formeln und Verknüpfungen häufig Pro-bleme, wenn Sie einzelne Zellen bearbeiten möchten. In diesem Fall berechnet Excel nachjeder Änderung an einer Zelle die komplette Tabelle neu durch. Diesen erheblichen Zeitauf-wand können Sie minimieren, indem Sie die automatische Kalkulation temporär zu Beginndes Makros ausschalten und am Ende wieder einschalten.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap14 unter demNamen TUNING.XLS finden.

Page 497: VBA-Programmierung fur Word, Excel und Access

Links

14 Tuning der VBA-Programme496

Bei der nächsten Aufgabe werden Ihnen ein paar Varianten mit unterschiedlichen Laufzeitender Makros vorgestellt. Dabei gehen Sie von einer Tabelle aus, in der drei Spalten mit 5.000Zellen gefüllt sind. In den Spalten D bis G werden die ersten drei Spalten ausgewertet. InSpalte D ziehen Sie die Summe, in Spalte E den Mittelwert, in Spalte F den größten Wert undin Spalte G den kleinsten Wert der ersten drei Spalten. Orientieren Sie sich dabei an folgenderAbbildung:

Abb. 14.2 Die Ausgangstabelle

In den folgenden Varianten werden alle Zellen der Spalte A mit dem Wert 1 multipliziert.Dadurch wird der Wert der jeweiligen Zelle nicht verändert und Sie haben für alle Variantendieselbe Ausgangssituation vorliegen. Eine Änderung der einzelnen Zellen bewirkt jeweilseine Neuberechnung der Tabelle, was sich negativ auf die Zeit auswirkt.

In der ersten Variante bleibt die automatische Berechnungsfunktion noch eingeschaltet.

Sub ÄnderungDurchführen()Dim Startzeit As DateDim Endzeit As DateDim Dauer As Date

Startzeit = Time

Listing 14.5: Zellen verarbeiten (Variante 1)

Page 498: VBA-Programmierung fur Word, Excel und Access

Rechts14.1 Makros schneller ablaufen lassen 497

Nehmen Sie zu Beginn des Makros die aktuelle Zeit und speichern diese in der VariablenStartzeit. Danach durchlaufen Sie in einer Schleife alle Zellen der Spalte A und multipli-zieren diese mit dem Wert 1. Nachdem alle Zeilen in der Tabelle verarbeitet wurden, wird dieSchleife verlassen. Jetzt messen Sie die Endzeit und speichern diesen Zeitpunkt in einer wei-teren Variablen. Ermitteln Sie die Laufzeit des Makros, indem Sie die Startzeit von der End-zeit subtrahieren.

In diesem Beispiel wurde die Bildschirmaktualisierung sowie die Berechnungsfunktion nichtabgeschaltet. Als Ergebnis benötigt das Makro für 5.000 Zellen bei einem Rechner mit 700Mhz genau 24 Sekunden.

Schalten Sie nun die automatische Berechnungsfunktion sowie die Bildschirmaktualisierungab.

Sheets("Tabelle1").ActivateRange("A2").SelectDo Until ActiveCell.Value = "" ActiveCell.Value = ActiveCell.Value * 1 ActiveCell.Offset(1, 0).SelectLoopEndzeit = TimeDauer = Endzeit - StartzeitMsgBox "Die Verarbeitung dauerte: " & DauerEnd Sub

Sub ÄnderungDurchführen02()Dim Startzeit As DateDim Endzeit As DateDim Dauer As Date

Application.Calculation = xlCalculationManualApplication.ScreenUpdating = FalseStartzeit = TimeSheets("Tabelle1").ActivateRange("A2").SelectDo Until ActiveCell.Value = "" ActiveCell.Value = ActiveCell.Value * 1 ActiveCell.Offset(1, 0).SelectLoopEndzeit = TimeDauer = Endzeit - Startzeit

Listing 14.6: Zellen verarbeiten (Variante 2)

Listing 14.5: Zellen verarbeiten (Variante 1)

Page 499: VBA-Programmierung fur Word, Excel und Access

Links

14 Tuning der VBA-Programme498

Schalten Sie die automatische Berechnungsfunktion zu Beginn des Makros ab, indem Sie dieEigenschaft Calculation mit der Konstanten xlCalculationManual ausstatten. Nachdem Abarbeiten aller Zeilen schalten Sie die Berechnung wieder ein, indem Sie der Eigen-schaft Calculation die Konstante xlCalculationAutomatic zuweisen.

In dieser Variante wurde die Bildschirmaktualisierung sowie die Bildschirmaktualisierungabgeschaltet. Als Ergebnis benötigt das Makro für 5.000 Zellen bei einem Rechner mit 700Mhz ca. 2 Sekunden.

14.1.5 Auf Sprünge verzichten

Die größte Geschwindigkeitsoptimierung erreichen Sie, wenn Sie die einzelnen Zellen nichtdirekt selektieren, sondern nur indirekt darauf zugreifen. Die Markierung ruht im nächstenBeispiel komplett.

Application.Calculation = xlCalculationAutomaticApplication.ScreenUpdating = TrueMsgBox "Die Verarbeitung dauerte: " & DauerEnd Sub

Sub ÄnderungDurchführen03()Dim Startzeit As DateDim Endzeit As DateDim Dauer As DateDim i As Long

Application.Calculation = xlCalculationManualApplication.ScreenUpdating = FalseStartzeit = TimeSheets("Tabelle1").Activatei = 2Do Until i = 5000 Cells(i, 1).Value = Cells(i, 1).Value * 1 i = i + 1LoopEndzeit = TimeDauer = Endzeit - StartzeitApplication.Calculation = xlCalculationAutomaticApplication.ScreenUpdating = TrueMsgBox "Die Verarbeitung dauerte: " & DauerEnd Sub

Listing 14.7: Zellen verarbeiten (Variante 3)

Listing 14.6: Zellen verarbeiten (Variante 2)

Page 500: VBA-Programmierung fur Word, Excel und Access

Rechts14.2 VBA-Abläufe sichtbar machen 499

Über die Eigenschaft Cells können Sie jede Zelle in einer Tabelle ansprechen, ohne diesevorher anzuspringen. Diese Eigenschaft erfordert zwei Argumente: Im ersten Argumentgeben Sie die jeweilige Zeile an, im zweiten wird die Spalte angegeben. Aus dem Schnitt-punkt der beiden Argumente erhalten Sie dann die jeweilige Zelle. Da in unserem Beispiellediglich die erste Spalte abgearbeitet wird, setzen Sie das Spaltenargument fix auf den Wert1. Das Zeilenargument zählen Sie bei jedem Schleifendurchlauf um den Wert 1 hoch, umjeweils die nächste Zeile anzusprechen.

In dieser Variante wurde die Bildschirmaktualisierung sowie die Bildschirmaktualisierungabgeschaltet und bewusst auf das Selektieren der Zellen verzichtet. Das Ergebnis ist umwer-fend: Das Makro benötigt für 5.000 Zellen bei meinem Rechner mit 700 Mhz weniger als eineSekunde.

14.2 VBA-Abläufe sichtbar machen

Wenn ein Makro länger läuft und Sie die Bildschirmaktualisierung dabei abgeschaltet haben,dann könnte ein Anwender denken, der Rechner hätte sich aufgehängt, weil er keinerleiAktionen auf dem Bildschirm sehen kann, der dann möglicherweise für mehrere Minutenblockiert ist. Schnell werden dann mal in Panik mehrere Tasten gedrückt oder gar der Rech-ner neu gestartet. Daher sollten Sie die Bildschirmaktualisierung hin- und wieder ein- undausschalten, damit die Geschwindigkeitsoptimierung zwar erhalten bleibt, der Anwenderaber dennoch erkennen kann, dass etwas passiert.

14.2.1 Statusleiste einsetzen

Eine beliebte Methode bei länger laufenden VBA-Anwendungen ist, die Statusleiste am unte-ren Fensterrand einzusetzen, um Makroschritte anzuzeigen.

Im folgenden Beispiel werden die Adressen von Zellen angezeigt, die gerade verarbeitet wer-den.

Sub StatuszeileEinsetzen()Dim Startzeit As DateDim Endzeit As DateDim Dauer As DateDim i As Long

Application.Calculation = xlCalculationManualApplication.ScreenUpdating = FalseApplication.DisplayStatusBar = True

Listing 14.8: Die Statuszeile verwenden

Page 501: VBA-Programmierung fur Word, Excel und Access

Links

14 Tuning der VBA-Programme500

Setzen Sie zu Beginn des Makros die Eigenschaft DisplayStatusBar auf den Wert True,um sicherzustellen, dass die Statusleiste eingeblendet ist. Innerhalb der Schleife sprechen Sieüber die Eigenschaft StatusBar die Statusleiste an und schreiben mithilfe der EigenschaftAddress die Zellenadresse der jeweils verarbeiteten Zelle. Weisen Sie am Ende des Makrosder Eigenschaft StatusBar den Wert False zu, um die Verwaltung der Statusleiste wiederin die Hände von Excel zu übergeben.

14.2.2 Einen Fortschrittsbalken einsetzen

Möchten Sie die Zeit während eines längeren Makrolaufs überbrücken, können Sie auch eineUserForm mit einem Fortschrittsbalken programmieren. Um diese Aufgabe zu bewältigen,gehen Sie wie folgt vor:

• Wechseln Sie in die Entwicklungsumgebung von Word.

• Fügen Sie eine neue noch leere UserForm ein.

• Klicken Sie die Symbolleiste WERKZEUGSAMMLUNG mit der rechten Maustaste an undwählen den Befehl ZUSÄTZLICHE STEUERELEMENTE.

Startzeit = TimeSheets("Tabelle1").Activatei = 2Do Until i = 5000 Cells(i, 1).Value = Cells(i, 1).Value * 1 Application.StatusBar = Cells(i, 1).Address i = i + 1LoopEndzeit = TimeDauer = Endzeit - StartzeitApplication.Calculation = xlCalculationAutomaticApplication.ScreenUpdating = TrueMsgBox "Die Verarbeitung dauerte: " & DauerApplication.StatusBar = falseEnd Sub

Listing 14.8: Die Statuszeile verwenden

Page 502: VBA-Programmierung fur Word, Excel und Access

Rechts14.2 VBA-Abläufe sichtbar machen 501

Abb. 14.3 Das Steuerelement ProgressBar einsetzen

• Aktivieren Sie im Dialog WEITERE STEUERELEMENTE das Steuerelement MICROSOFT

PROGRESSBAR CONTROL, VERSION 6.0.

• Bestätigen Sie Ihre Einstellung mit OK.

• Klicken Sie das neu eingefügte Steuerelement auf der Symbolleiste WERKZEUGSAMM-LUNG an und ziehen es in der gewünschten Größe in Ihrer UserForm auf.

Fügen Sie jetzt den Quellcode ein, um den Fortschrittbalken zu programmieren. Greifen Siedazu auf das vorher vorgestellte Makro zurück, in dem Sie die Sätze eines Dokuments abge-arbeitet haben. Damit der Fortschrittsbalken automatisch anläuft, setzen Sie das EreignisActivate ein, welches Sie im folgenden Listing sehen können:

Private Sub UserForm_Activate()Dim Startzeit As DateDim Endzeit As DateDim Dauer As DateDim satz As ObjectDim i As Long

Application.ScreenUpdating = False

Listing 14.9: Den Fortschrittsbalken programmieren

Page 503: VBA-Programmierung fur Word, Excel und Access

Links

14 Tuning der VBA-Programme502

Bei der Programmierung eines Fortschrittsbalkens müssen Sie sowohl den kleinsten als auchden größten Wert angeben, der in einem Fortschrittsbalken eingesetzt werden soll. Dazu set-zen Sie die Eigenschaft Min auf den Startwert 1 und der Eigenschaft Max weisen Sie dieAnzahl der abzuarbeitenden Sätze im Dokument zu.

Abb. 14.4 Den Fortschrittsbalken einsetzen

Startzeit = Time

With UserForm1 .ProgressBar1.Min = 0 .ProgressBar1.Max = ActiveDocument.Sentences.Count

For i = 1 To ActiveDocument.Sentences.Count .ProgressBar1.Value = i Debug.Print ActiveDocument.Sentences(i).TextNext i

Unload UserForm1End WithEndzeit = TimeDauer = Endzeit - StartzeitApplication.ScreenUpdating = TrueEnd Sub

Listing 14.9: Den Fortschrittsbalken programmieren

Page 504: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang503

15 Die Office-VBA-FAQ

Im letzten Kapitel präsentiere ich Ihnen einige interessante Lösungen auf VBA-Fragen, diemir in den letzten Jahren gestellt wurden.

Unter anderem werden in diesem Kapitel folgende Fragen beantwortet:

• Wie kann man Animationseffekte in ein Office-Programm integrieren?

• Wie kann ich Termine in den Outlook-Kalender übertragen?

• Wie kann ich Daten aus einer Excel-Tabelle nach PowerPoint übertragen?

• Wie kann ich einen »Baum« in einer UserForm anzeigen?

• Wie kann ich Diagramme in GIF-Grafiken umwandeln?

• Wie kann ich das Kalendersteuerelement in einer UserForm programmieren?

• Wie kann ich ein Foto in eine UserForm integrieren?

• Wie greife ich von PowerPoint auf Excel zu?

• Wie kann ich Microsoft Graph in PowerPoint programmieren?

15.1 Office-Animationen erstellen

Animationseffekte, beispielsweise in Excel, können Sie erstellen, indem Sie ein Objekt ein-fügen und dieses rotieren lassen. Ein weiteres Beispiel wäre das Blinken einer Zelle oder einLaufrahmen um einen Zellenbereich.

15.1.1 Objekte rotieren lassen

Im ersten Beispiel zu den animierten Effekten lassen Sie ein Rechteck rotieren. Fügen Siedazu ein Rechteck aus der Symbolleiste ZEICHNEN in eine Tabelle ein.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap15 unter demNamen ANIM.XLS finden.

Page 505: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ504

Abb. 15.1 Das Rechteck soll rotieren

Erfassen Sie jetzt das Makro, welches die Rotation des Rechtecks durchführt:

Definieren Sie im ersten Schritt eine Objektvariable vom Typ Shape. Danach geben Sie überdie Anweisung Set bekannt, wo sich dieses Objekt in der Arbeitsmappe befindet. In einerSchleife setzen Sie die Eigenschaft Rotation ein, um das Objekt um den angegebenen Wertder Variablen i zu drehen. Die Schrittweite der Rotation beträgt dabei 20. Damit das Rotierenlangsam verläuft, benötigen Sie noch einen kurzen Stopper, der nach jeder Teilrotation durch-geführt wird. Um diese Verzögerung einzusetzen, schreiben Sie eine Funktion, die wie folgtaussieht:

Die Funktion erwartet eine Zeitangabe, wie lange sie pausieren soll. Diese Information über-geben Sie im Argument Pzeit. Innerhalb der Funktion ermitteln Sie die aktuelle Uhrzeit

Sub ObjektRotieren()Dim obj As Shape

Set obj = Sheets("Tabelle2").Shapes(1)For i = 1 To 180 Step 20 obj.Rotation = i Pause (1)Next iEnd Sub

Listing 15.1: Ein Objekt rotieren lassen

Function Pause(PZeit) Application.Wait Now + TimeSerial(0, 0, PZeit)End Function

Listing 15.2: Die Funktion für die Verzögerung

Page 506: VBA-Programmierung fur Word, Excel und Access

Rechts15.1 Office-Animationen erstellen 505

über die Funktion Now und addieren die übergebene Zeitvariable durch die Funktion Time-Serial darauf. Erst danach wird die Verarbeitung fortgesetzt.

Abb. 15.2 Objekte rotieren lassen

15.1.2 Laufrahmen erstellen

Im nächsten Beispiel erstellen Sie per Makro einen dynamischen Laufrahmen. Das dafür not-wendige Makro lautet:

Sub Laufrahmen()Dim i As IntegerDim Bereich As Range Set Bereich = Sheets("Tabelle1").Range("B2:D10") For i = 1 To 10 With Bereich.Borders(xlEdgeLeft) .LineStyle = xlDash .Weight = xlMedium .ColorIndex = 3 End With With Bereich.Borders(xlEdgeTop) .LineStyle = xlDash .Weight = xlMedium .ColorIndex = 3 End With With Bereich.Borders(xlEdgeBottom) .LineStyle = xlDash .Weight = xlMedium

Listing 15.3: Einen Laufrahmen erstellen

Page 507: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ506

Definieren Sie zunächst den Bereich, dem Sie den Laufrahmen zuweisen möchten. Danachweisen Sie im Wechsel diesem Bereich unterschiedliche Rahmenarten zu, sodass ein Anima-tionseffekt ensteht. Setzen Sie für diesen Verzögerungseffekt wiederum die Funktion Pauseein.

.ColorIndex = 3 End With With Bereich.Borders(xlEdgeRight) .LineStyle = xlDash .Weight = xlMedium .ColorIndex = 3 End With Pause (1) With Bereich.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = 3 End With With Bereich.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = 3 End With With Bereich.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = 3 End With With Bereich.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = 3 End With Next i Bereich.Borders.LineStyle = xlNoneEnd Sub

Listing 15.3: Einen Laufrahmen erstellen

Page 508: VBA-Programmierung fur Word, Excel und Access

Rechts15.1 Office-Animationen erstellen 507

Abb. 15.3 Der Laufrahmen in Excel

15.1.3 Einen blinkenden Hintergrund programmieren

Möchten Sie eine Fläche in Excel blinken lassen, weisen Sie der Fläche im Wechsel zwei ver-schiedene Farben zu. Zwischen jedem Wechsel pausieren Sie eine Sekunde. Dadurch entstehtder Animationseffekt.

Sub HintergrundBlinken()Dim i As IntegerDim Bereich As Range

Set Bereich = Sheets("Tabelle1").Range("B2:D10") For i = 1 To 5 With Bereich.Interior .ColorIndex = 3 End With Pause (1) With Bereich.Interior .ColorIndex = xlNone End With Pause (1) Next iEnd Sub

Listing 15.4: Einen blinkenden Hintergrund erzeugen

Page 509: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ508

Abb. 15.4 Der Hintergrund blinkt

15.1.4 Eine blinkende Zelle programmieren

Gehen Sie nun einen Schritt weiter. Im folgenden Beispiel soll eine Zelle blinken. Dabei istder Text in der Zelle mit der Schriftfarbe SCHWARZ formatiert. Indem Sie dieser Zelle nundie Farbe WEIß zuweisen, können Sie den Text temporär verstecken. Weisen Sie dieser Zelleim Wechsel die Schriftfarbe SCHWARZ bzw. WEIß zu, um diesen Blinkeffekt zu simulieren.

Sub ZelleBlinken()Dim i As IntegerDim Bereich As Range

Set Bereich = Sheets("Tabelle1").Range("B10") For i = 1 To 5 With Bereich.Font .ColorIndex = 2 End With Pause (1) With Bereich.Font .ColorIndex = 1 End With Pause (1) Next iEnd Sub

Listing 15.5: Eine blinkende Zelle erzeugen

Page 510: VBA-Programmierung fur Word, Excel und Access

Rechts15.2 Termine in den Outlook-Kalender übertragen 509

15.2 Termine in den Outlook-Kalender übertragen

Möchten Sie aus einer Excel-Tabelle Termine in den Kalender von Outlook übertragen,schreiben Sie ein Makro, welches diese Aufgabe ausführt. Sehen Sie sich vorher die Aus-gangstabelle an.

Abb. 15.5 Die Ausgangstabelle mit den Terminen

Erfassen Sie jetzt folgendes Makro, um die Termine nach Outlook zu übertragen.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap15 unter demNamen TERMIN.XLS finden.

Sub TermineNachOutlookÜbernehmen()Dim objOutlook As Outlook.ApplicationDim apptOutlook As Outlook.AppointmentItemDim i As Long Application.ScreenUpdating = False Sheets("Tabelle1").Activate Set objOutlook = CreateObject("Outlook.Application") Range("A2").Select For i = 1 To ActiveSheet.UsedRange.Rows.Count Do Until ActiveCell.Value = "" Set apptOutlook = objOutlook.CreateItem(olAppointmentItem) With apptOutlook .Subject = ActiveCell.Value .Body = ActiveCell.Offset(0, 1).Value .Location = ActiveCell.Offset(0, 2).Value

Listing 15.6: Termine von Excel nach Outlook transferieren

Page 511: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ510

Vor dem Start müssen Sie in der Entwicklungsumgebung noch die Bibliothek MICROSOFT

OUTLOOK über das Menü EXTRAS und dem Befehl VERWEISE einbinden, damit die im Makroverwendeten Methoden und Eigenschaften auch verfügbar sind.

Abb. 15.6 Die Termine wurden nach Outlook übertragen

.Start = ActiveCell.Offset(0, 3).Value .Duration = ActiveCell.Offset(0, 4).Value .RequiredAttendees = ActiveCell.Offset(0, 5).Value .ReminderMinutesBeforeStart = 10 .ReminderPlaySound = True .ReminderSet = True .Save End With ActiveCell.Offset(1, 0).Select Loop Next i MsgBox "Termine nach Outlook übertragen!" Set apptOutlook = Nothing Set objOutlook = Nothing Application.ScreenUpdating = TrueEnd Sub

Listing 15.6: Termine von Excel nach Outlook transferieren

Page 512: VBA-Programmierung fur Word, Excel und Access

Rechts15.3 Excel-Auswertungen nach PowerPoint transportieren 511

15.3 Excel-Auswertungen nach PowerPoint transportieren

Im nächsten Beispiel soll eine Excel-Tabelle sowie ein Diagramm in eine PowerPoint-Prä-sentation übertragen werden. Dabei sieht die Ausgangstabelle wie folgt aus.

Abb. 15.7 Diese Daten sollen nach PowerPoint übertragen werden

Schreiben Sie jetzt das Makro, welches die Excel-Auswertung in eine PowerPoint-Präsenta-tion einfügt.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap15 unter demNamen UMSATZ.XLS finden.

Sub ExcelNachPowerPoint()Dim pptApp As PowerPoint.ApplicationDim pptPres As PowerPoint.PresentationDim pptSlide As PowerPoint.SlideDim Bereich As Range

Listing 15.7: Der Excel-PowerPoint-Transfer

Page 513: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ512

Vor dem Start müssen Sie in der Entwicklungsumgebung noch die Bibliothek MICROSOFT

POWERPOINT über das Menü EXTRAS und dem Befehl VERWEISE einbinden, damit die imMakro verwendeten Methoden und Eigenschaften auch verfügbar sind.

Abb. 15.8 Die Excel-Auswertung in einer PowerPoint-Präsentation

Set Bereich = Sheets("Tabelle1").Range("A1:H25")Bereich.CopyPicture Appearance:=xlScreen, Format:=xlPictureSet pptApp = CreateObject("PowerPoint.Application")Set pptPres = pptApp.Presentations.Add(WithWindow:=msoTrue)Set pptSlide = pptPres.Slides.Add(Index:=1, Layout:=ppLayoutBlank)pptApp.Visible = msoTruepptApp.ActiveWindow.View.PasteApplication.CutCopyMode = FalseEnd Sub

Listing 15.7: Der Excel-PowerPoint-Transfer

Page 514: VBA-Programmierung fur Word, Excel und Access

Rechts15.4 Das Steuerelement TreeControl 513

15.4 Das Steuerelement TreeControl

Möchten Sie in einer UserForm eine Baumstruktur anzeigen lassen, fügen Sie eine neue User-Form ein und klicken mit der rechten Maustaste auf die Symbolleiste WERKZEUGSAMMLUNG.Aus dem Kontextmenü wählen Sie den Befehl ZUSÄTZLICHE STEUERELEMENTE. Im DialogWEITERE STEUERELEMENTE wählen Sie das Steuerelement MICROSOFT TREEVIEW CON-TROL. Klicken Sie danach mit der linken Maustaste auf das neue eingefügte TREECONTROL-Symbol in der Symbolleiste WERKZEUGSAMMLUNG und ziehen das Steuerelement in dergewünschten Größe in Ihrer UserForm auf.

Jetzt können Sie das Steuerelement programmieren. Dabei sollen in dem Baum alle zurzeitgeöffneten Arbeitsmappen und deren Tabellennamen angezeigt werden. Damit diese Aufli-stung bereits direkt nach dem Aufruf der UserForm zur Verfügung steht, setzen Sie das Ereig-nis Initialize ein, welches Sie im folgenden Listing sehen können.

In der ersten Schleife fügen Sie die Namen aller geöffneten Arbeitsmappen in das TREECON-TROL-Element ein. In der zweiten Schleife geben Sie die Tabellennamen als untergeordnetesTreeelement an.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap15 unter demNamen BAUMELEMENT.XLS finden.

Private Sub UserForm_Initialize()Dim Mappe As WorkbookDim Blatt As WorksheetDim Eintrag As Node

For Each Mappe In Application.Workbooks Set Eintrag = TreeView1.Nodes.Add(, , , Mappe.Name) For Each Blatt In Mappe.Worksheets TreeView1.Nodes.Add Eintrag.Index, tvwChild, , Blatt.Name NextNextEnd Sub

Listing 15.8: Das Steuerelement Tree füllen

Page 515: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ514

Abb. 15.9 Arbeitsmappen und Tabellen in der Baumstruktur anzeigen

Dieses Beispiel können Sie auch insoweit ausbauen, dass Sie alle Dateien eines bestimmtenVerzeichnisses in der Baumstruktur anzeigen lassen.

Fügen Sie dazu eine neue Userform ein, fügen wiederum ein TreeControl-Element ein undlegen folgenden Code hinter die UserForm:

Abb. 15.10 Alle Dateien eines Verzeichnisses werden angezeigt

Private Sub UserForm_Initialize()Dim Eintrag As NodeDim s As StringDim l As Long s = Dir$(ActiveWorkbook.Path & "\*.xls")Do While Len(s) > 0 l = l + 1 Set Eintrag = TreeView1.Nodes.Add(, , , s) s = Dir$()LoopEnd Sub

Listing 15.9: Das Steuerelement TreeControl mit Dateinamen füllen

Page 516: VBA-Programmierung fur Word, Excel und Access

Rechts15.5 Diagramme als Grafiken speichern 515

15.5 Diagramme als Grafiken speichern

Möchten Sie Diagramme, die Sie in Office-Programmen erstellt haben, als separate Grafik-Dateien speichern, dann können Sie eine Exportfunktion einsetzen.

In der folgenden Aufgabe soll nachstehendes Diagramm als Gif-Datei gespeichert werden.

Abb. 15.11 Dieses Diagramm soll als Gif-Datei gesichert werden

Wandeln Sie das Diagramm jetzt in das GIF-Format um und speichern es im VerzeichnisC:\EIGENE DATEIEN.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap15 unter demNamen DIAGRAMM.XLS finden.

Sub ChartAlsGifSpeichern()Dim Diagramm As Chart Set Diagramm = Sheets("Tabelle1").ChartObjects(1).Chart Diagramm.Export FileName:= _ "c:\Eigene Dateien\Diagramm1.gif", FilterName:="GIF"End Sub

Listing 15.10: Ein Diagramm als Gif-Datei speichern

Page 517: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ516

Mithilfe der Methode Export können Sie ein Diagramm in ein gewünschtes Grafikformatkonvertieren.

Abb. 15.12 Das Diagramm im Gif-Format

15.6 Das Kalendersteuerelement einsetzen

In der folgenden Aufgabe setzen Sie das Kalendersteuerelement ein, um in einer UserFormeinen Kalender anzuzeigen, über den Sie dann Ihre Termine erfassen und in ein Word-Doku-ment schreiben.

Fügen Sie eine neue UserForm ein und klicken mit der rechten Maustaste auf die Symbollei-ste WERKZEUGSAMMLUNG. Aus dem Kontextmenü wählen Sie den Befehl ZUSÄTZLICHE

STEUERELEMENTE. Im Dialog WEITERE STEUERELEMENTE wählen Sie das SteuerelementKALENDER-STEUERELEMENT 9.0. Klicken Sie danach mit der linken Maustaste auf das neueeingefügte Kalender-Symbol in der Symbolleiste WERKZEUGSAMMLUNG und ziehen dasSteuerelement in der gewünschten Größe in Ihrer UserForm auf. Fügen Sie danach zweiTextfelder unterhalb des Kalenders ein. Im ersten Textfeld wird der Tag, den Sie im Kalenderanklicken, in das Textfeld übertragen. Dazu legen Sie den folgenden Code hinter das ersteTextfeld.

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap15 unter demNamen KALENDER.DOC finden.

Page 518: VBA-Programmierung fur Word, Excel und Access

Rechts15.6 Das Kalendersteuerelement einsetzen 517

Im zweiten Textfeld können Sie eine Bezeichnung für den Termin eintragen. Fügen Sie desWeiteren eine Schaltfläche ein, die die Termine in ein Dokument schreiben soll. Legen Siedann folgenden Code hinter die Schaltfläche.

Abb. 15.13 Der Terminplaner in Word

Private Sub Calendar1_Click()UserForm1.TextBox1.Value = Calendar1.ValueEnd Sub

Listing 15.11: Das Datum aus dem Kalender ins Textfeld übertragen

Private Sub CommandButton1_Click() Selection.TypeText Text:=TextBox1.Value & _ vbTab & TextBox2.Value Selection.TypeParagraphEnd Sub

Listing 15.12: Die erfassten Termine speichern

Page 519: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ518

15.7 Zugriff auf Microsoft Graph programmieren

Im kompletten Office-Paket ist auch das Diagrammerstellungstool Microsoft Graph enthal-ten. Die damit erstellten Diagramme binden Sie in Ihre Office-Anwendungen ein. MöchtenSie dieses Tool über VBA steuern, binden Sie die dazu benötigte VBA-Bibliothek MICRO-SOFT GRAPH im Menü EXTRAS unter dem Befehl VERWEISE ein.

Im folgenden Beispiel werden Sie in PowerPoint ein Diagramm erstellen. Um die ganzeSache noch etwas komplexer zu machen, holen Sie sich die Daten aus der folgenden Excel-Tabelle:

Abb. 15.14 Die Datentabelle aus Excel

Starten Sie nun PowerPoint, legen ein neues Modul an und erfassen folgendes Makro, wel-ches ein Diagramm in PowerPoint erzeugt und dabei die Daten aus der gerade abgebildetenTabelle entnimmt.

Hinweis:

Möchten Sie übrigens ein Bild oder Logo auf einer UserForm integrieren, dann klickenSie in der Symbolleiste WERKZEUGSAMMLUNG das Symbol ANZEIGE an und ziehen dasSymbol in der gewünschten Größe auf Ihrer UserForm auf. Markieren Sie nun die so ein-gefügte Fläche und klicken im Eigenschaften-Fenster in der Rubrik PICTURE ganz rechtsauf die drei Punkte. Wählen Sie aus dem nun angezeigten Dialog das gewünschte Bild/Logo und bestätigen mit ÖFFNEN. Das so eingefügte Bild wird jetzt in die UserForm ein-gefügt. Dabei bleibt keine Verknüpfung zu dem Bild bestehen, d.h., Sie können so erstellteLösungen weitergeben, ohne das Bild oder Logo mitzukopieren.

Page 520: VBA-Programmierung fur Word, Excel und Access

Rechts15.7 Zugriff auf Microsoft Graph programmieren 519

Hinweis:

Den folgenden Quellcode können Sie auf www.buch.cd im Verzeichnis Kap15 unter demNamen DIAGRAMM.PPT finden.

Sub DiagrammEinfügen()Dim Präs As ObjectDim Objekt As ObjectDim Diagramm As ObjectDim ExApp As Excel.ApplicationDim Mappe As Excel.Workbook

Set Präs = Presentations.Add.Slides.Add(1, ppLayoutBlank)Set Objekt = Präs.Shapes.AddOLEObject(Left:=LLeft, _ Top:=lTop, Width:=lwidth, Height:=lheight, _ ClassName:="MSGraph.Chart", Link:=0).OLEFormat.Object

Set ExApp = New Excel.ApplicationSet Mappe = ExApp.Workbooks.Open("c:\Eigene Dateien\KostenUndLeistung.xls")Set Diagramm = Präs.Shapes(1).OLEFormat.ObjectWith Diagramm.Application.datasheet .Range("01").Value = Mappe.Sheets(1).Range("A3").Value .Range("02").Value = Mappe.Sheets(1).Range("A4").Value .Range("03").Value = Mappe.Sheets(1).Range("A5").Value .Range("A0").Value = Mappe.Sheets(1).Range("B2").Value .Range("A1").Value = Mappe.Sheets(1).Range("B3").Value .Range("A2").Value = Mappe.Sheets(1).Range("B4").Value .Range("A3").Value = Mappe.Sheets(1).Range("B5").Value .Range("B0").Value = Mappe.Sheets(1).Range("C2").Value .Range("B1").Value = Mappe.Sheets(1).Range("C3").Value .Range("B2").Value = Mappe.Sheets(1).Range("C4").Value .Range("B3").Value = Mappe.Sheets(1).Range("C5").Value .Range("C0").Value = Mappe.Sheets(1).Range("D2").Value .Range("C1").Value = Mappe.Sheets(1).Range("D3").Value .Range("C2").Value = Mappe.Sheets(1).Range("D4").Value .Range("C3").Value = Mappe.Sheets(1).Range("D5").Value .Range("D0").Value = Mappe.Sheets(1).Range("E2").Value .Range("D1").Value = Mappe.Sheets(1).Range("E3").Value .Range("D2").Value = Mappe.Sheets(1).Range("E4").Value .Range("D3").Value = Mappe.Sheets(1).Range("E5").Value .Range("E0").Value = Mappe.Sheets(1).Range("F2").Value

Listing 15.13: Ein Diagramm in PowerPoint erzeugen

Page 521: VBA-Programmierung fur Word, Excel und Access

Links

15 Die Office-VBA-FAQ520

Achten Sie darauf, dass die erste Zelle bei Mircrosoft Graph mit A0 beginnt. Auch die Kate-gorienbeschriftungen 01, 02 und 03 für die Kosten, Leistungen und das Ergebnis sind einwenig gewöhnungsbedürftig.

Abb. 15.15 Das Diagramm in PowerPoint mit Microsoft Graph

.Range("E1").Value = Mappe.Sheets(1).Range("F3").Value .Range("E2").Value = Mappe.Sheets(1).Range("F4").Value .Range("E3").Value = Mappe.Sheets(1).Range("F5").Value .Range("F0").Value = Mappe.Sheets(1).Range("G2").Value .Range("F1").Value = Mappe.Sheets(1).Range("G3").Value .Range("F2").Value = Mappe.Sheets(1).Range("G4").Value .Range("F3").Value = Mappe.Sheets(1).Range("G5").ValueEnd With Mappe.Close False ExApp.Quit Set Mappe = Nothing Set ExApp = NothingEnd Sub

Listing 15.13: Ein Diagramm in PowerPoint erzeugen

Page 522: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang521

A Die Dateien zum Buch

Alle im Buch vorgestellten Lösungen sind auf der Website www.buch.cd enthalten. Sie brau-chen daher kein einziges Listing aus dem Buch abzutippen, sondern können diese Lösungendirekt in Ihre VBA-Projekte übernehmen.

In der folgenden Tabelle sehen Sie, in welchem Verzeichnis Sie die einzelnen Beispieldateienfinden können.

Ordner Dateien

Kap02 Elemente.doc, Elemente.xls, Elemente.mdb

Kap03 Standardfunktionen.xls

Kap04 Funktionen.doc, Funktionen.ppt, Funktionen.xls, Funktionen.mdb

Kap05 Msgbox.doc, Dialoge.xls, Dialoge.mdb, Dialoge.doc, ÛserForm.xls

Kap06 Leisten.doc

Kap07 Hyper.xls, Mail.xls

Kap08 VBE.doc

Kap09 ExcelDemos.xls

Kap10 WordDemos.doc

Kap11 AccessDemos.mdb

Kap12 Kontakte.xls, Emails.doc, Adressen.doc, Objekte.doc, Bereiche.xls, Transfer.mdb

Kap13 Fehler.doc

Kap14 Tuning.doc, Tuning.xls

Kap15 Anim.xls, Termin.xls, Umsatz.xls, Baumelement.xls, Diagramm.xls, Kalender.doc, Diagramm.ppt

Page 523: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 524: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang523

Anhang B

Um einen Überblick über die eingesetzten Makros im Buch zu bekommen, sehen Sie in derfolgenden Auflistung alle Listingsunterschriften nach Kapiteln gegliedert:

Kapitel 2:

Listing 2.1: Office-Version ermitteln

Listing 2.2: Rückfragedialog auswerten

Listing 2.3: Datei nach 14 Tagen löschen

Listing 2.4: Existenzprüfung von Dateien vornehmen

Listing 2.5: Windows-Status in Word abfragen

Listing 2.6: Fenster-Status in Excel erkennen

Listing 2.7: Steuerelemente identifizieren

Listing 2.8: Zahlenformate erkennen und ausgeben

Listing 2.9: Benutzereingaben erkennen und ausgeben

Listing 2.10: Tabellen anlegen und benennen

Listing 2.11: Zellenhintergrundfarben bestimmen

Listing 2.12: Excel-Dateien öffnen

Listing 2.13: Word-Dateien öffnen

Listing 2.14: Tabellen füllen

Listing 2.15: Tabellennamen auflisten

Listing 2.16: Geöffnete Excel-Arbeitsmappen ermitteln

Listing 2.17: Geöffnete Excel-Arbeitsmappen ausgeben

Listing 2.18: Geöffnete Word-Dokumente ermitteln

Listing 2.19: Markierte Wörter ermitteln und untereinander ausgeben

Listing 2.20: Alle Access-Tabellen einer Datenbank ermitteln

Listing 2.21: Alle verfügbaren Access-Formulare ermitteln

Listing 2.22: Alle Namen der Steuerelemente eines Formulars ausgeben

Listing 2.23: Bedingtes Löschen von Zeilen

Listing 2.24: Vorauswahl der aktuellen Spalte treffen

Listing 2.25: Namen von Textfeldern aus Formularen ermitteln

Listing 2.26: Access-Tabellen auslesen

Page 525: VBA-Programmierung fur Word, Excel und Access

Links

Anhang B524

Listing 2.27: Dateien zählen und ausgeben

Listing 2.28: Das Farbenspiel mit Excel

Listing 2.29: Textdatei einlesen

Listing 2.30: Worte in Zellenbereich zählen und ausgeben

Kapitel 3

Listing 3.01: Textteile extrahieren

Listing 3.02: Textteile zusammensetzen

Listing 3.03: Den Pfadnamen ermitteln

Listing 3.04: Den Dateinamen ermitteln

Listing 3.05: Postleitzahlen extrahieren

Listing 3.06: Einzelne Zeichen in Spalten übertragen

Listing 3.07: Zeichenfolgen spiegeln

Listing 3.08: Führende und nachfolgende Leerzeichen entfernen

Listing 3.09: Textkonvertierung von klein nach groß

Listing 3.10: Textkonvertierung von groß nach klein

Listing 3.11: Textkonvertierung in definiertem Bereich vornehmen

Listing 3.12: Die Konvertierung wird automatisch bei einer Änderung im definiertenBereich vorgenommen

Listing 3.13: Alle Dateien eines Verzeichnisses ermitteln

Listing 3.14: Alle Excel-Dateien eines Verzeichnisses ermitteln

Listing 3.15: Verzeichnisse anlegen

Listing 3.16: Verzeichnisse löschen

Listing 3.17: Den Wochentag ermitteln – Variante

Listing 3.18: Den Wochentag ermitteln – Variante

Listing 3.19: Den aktuellen Tag ermitteln

Listing 3.20: Den aktuellen Monat ermitteln

Listing 3.21: Das aktuelle Jahr ermitteln

Listing 3.22: Den aktuellen Wochentag und Monat ermitteln

Listing 3.23: Das Quartal aus dem aktuellen Datum ermitteln

Listing 3.24: Wie viele Tage sind vergangen?

Listing 3.25: Einen Zukunftswert errechnen

Listing 3.26: Die aktuelle Uhrzeit ermitteln

Listing 3.27: Die aktuelle Stunde ausgeben

Listing 3.28: Die genaue Minutenangabe ausgeben

Listing 3.29: Die genaue Sekundenangabe ausgeben

Page 526: VBA-Programmierung fur Word, Excel und Access

RechtsAnhang B 525

Listing 3.30: Makroverarbeitung 15 Sekunden lang pausieren

Listing 3.31: Bild ein- und wieder ausblenden

Listing 3.32: Den Zeitpunkt des Schließens der Datei bereits beim Öffnen der Arbeits-mappe festlegen

Listing 3.33: Arbeitsmappe und Anwendung schließen

Listing 3.34: Datumsangaben formatieren

Listing 3.35: Tabellen einfügen und »formatiert« benennen

Listing 3.36: Textangaben in Datumsangaben wandeln

Listing 3.37: Kopf- und Fußzeile anlegen

Listing 3.38: Bilddatei in Kopfzeile integrieren

Listing 3.39: Zellen mit Zahlenwerten werden eingefärbt

Listing 3.40: Nicht numerische Zellen werden eingefärbt

Listing 3.41: Farbindexe ermitteln

Listing 3.42: Prüfung auf Datumswerte

Listing 3.43: Prüfung auf Verknüpfungen

Listing 3.44: Enthält die Auswahl einen Wert?

Listing 3.45: Wird ein gültiges Datenfeld zurückgegeben?

Listing 3.46: Den Rechner aufrufen

Listing 3.47: Den Explorer mit bestimmtem Verzeichnis starten

Listing 3.48: Textteile schnell austauschen

Listing 3.49: Zeilen einfärben mit RGB

Listing 3.50: Leerzeichen auffüllen

Listing 3.51: Aus Zahlen mit Nachkommastellen ganzzahlige Zahlen machen

Listing 3.52: Zahlenwerte auf 2 Stellen hinterm Komma runden

Kapitel 4

Listing 4.01: Farbige Zellen summieren

Listing 4.02: Die Funktion wird aufgerufen

Listing 4.03: Die Funktion zur Überprüfung der Existenz einer Datei

Listing 4.04: Datei- und Pfadnamen werden an die Funktion DatExist übergeben

Listing 4.05: Eine Funktion, die alle Bindstriche entfernt

Listing 4.06: Die Tabelle2 wird bereinigt

Listing 4.07: Liegt die aktive Zelle im Zielbereich?

Listing 4.08: Zielbereich und zu überprüfende Zelle werden übergeben

Listing 4.09: Dokumentschutz aufheben und neu setzen

Listing 4.10: Dokumente werden mit neuem Kennwort versehen

Page 527: VBA-Programmierung fur Word, Excel und Access

Links

Anhang B526

Listing 4.11: Römische Zahlen umwandeln

Listing 4.12: In einer Tabelle werden römische Zahlen umgesetzt

Listing 4.13: Adresse des verknüpften Objekts ermitteln

Listing 4.14: Foliennummer und Objektnummer werden der Funktion übergeben

Listing 4.15: Alle Verknüpfungsadressen der Präsentation anzeigen

Listing 4.16: Der Funktion AlleVerkn wird der Namen der aktiven Präsentation übergeben

Listing 4.17: Ist die Anwendung Word bereits aktiv?

Listing 4.18: Aufruf der Funktion WordGestartet

Listing 4.19: Word-Sitzung starten

Listing 4.20: Access starten und Datenbank öffnen

Listing 4.21: PowerPoint starten und Präsentation ablaufen lassen

Listing 4.22: Hyperlinks hinter Grafikobjekten auslesen

Listing 4.23: Ist Dokument mit einem Kennwort versehen?

Listing 4.24: Ist Arbeitsmappe mit einem Kennwort versehen?

Listing 4.25: Die aktuelle Seite im Dokument ermitteln

Listing 4.26: Wo steht der Mauszeiger?

Listing 4.27: Das älteste Dokument in einem Verzeichnis finden

Listing 4.28: Übergeben Sie der Funktion AltDok den Verzeichnisnamen

Listing 4.29: Die Dokumenteigenschaften einer Datenbank auslesen

Listing 4.30: Die Anzahl der Tage eines Monats ermitteln

Listing 4.31: Der Monat Februar soll ausgewertet werden

Listing 4.32: Jeweils zwei Buchstaben sollen aus jedem Namen übernommen werden

Listing 4.33: Alle Namen der Tabelle5 werden nacheinander an die Funktion Abkürzenübergeben

Listing 4.34: Aus einer Namensliste werden E-Mail-Adressen erzeugt

Listing 4.35: Ist das Solver-Add-In bereits aktiv?

Listing 4.36: Wie heißen die Zelladressen der höchsten Werte?

Listing 4.37: Ist der Name »Mai« in der Arbeitsmappe bereits vergeben?

Kapitel 5

Listing 5.01: Löschrückfrage einholen

Listing 5.02: Suchbegriff über Inputbox abfragen

Listing 5.03: Aufruf des Dialoges Speichern unter

Listing 5.04: Aufruf des Dialoges Drucken

Listing 5.05: Die verfügbaren Module werden angezeigt

Page 528: VBA-Programmierung fur Word, Excel und Access

RechtsAnhang B 527

Listing 5.06: Der Dialog Öffnen wird angezeigt

Listing 5.07: Das Ereignis Initialize einsetzen, um die UserForm vorzubelegen

Listing 5.08: Diese Funktion holt die zur Abteilung passende Kostenstelle

Listing 5.09: Änderung des Kombinationsfeldes abfangen

Listing 5.10: Die UserForm aufrufen

Listing 5.11: Die UserForm schließen

Listing 5.12: Die eingegebenen Daten in die Tabelle Mitarbeiter wegschreiben

Listing 5.13: UserForm initialisieren

Listing 5.14: Dynamisches Füllen der Beschriftungen von Kontrollkästchen

Listing 5.15: Das Unterformular UserForm2 aufrufen

Listing 5.16: Die gewählten Skills von UserForm2 nach UserForm1 übernehmen

Listing 5.17: Ein Umschaltfeld programmieren

Listing 5.18: Spaltenzahl und Spaltenbreite eines Listenfeldes bestimmen

Listing 5.19: Die Suche nach dem Mitarbeiternamen

Listing 5.20: Übertragen von Spalteninformationen in Textfelder

Listing 5.21: Die Suche nach dem Skill der Mitarbeiter

Listing 5.22: Farben für Steuerelemente einsetzen

Kapitel 6

Listing 6.01: Alle verfügbaren Leisten von Word

Listing 6.02: Adaptive Menüs abschalten

Listing 6.03: Menüleiste in Word ausblenden

Listing 6.04: Menüleiste in Word wieder einblenden

Listing 6.05: Neues Menü einfügen

Listing 6.06: Ein bestimmtes Menü löschen

Listing 6.07: Menü mit Menübefehlen bestücken

Listing 6.08: Das aktuelle Datum ausgeben

Listing 6.09: Die Zeichen im Dokument werden gezählt

Listing 6.10: Die Wörter im Dokument werden gezählt

Listing 6.11: Die Sätze im Dokument werden gezählt

Listing 6.12: Die Namen der einzelnen Menüs werden ermittelt

Listing 6.13: Menübefehl in bereits bestehendes Menü intgerieren

Listing 6.14: Menübefehl suchen und löschen

Listing 6.15: Menüleiste auf den Ausgangszustand zurücksetzen

Listing 6.16: Menü-IDs ausgeben

Page 529: VBA-Programmierung fur Word, Excel und Access

Links

Anhang B528

Listing 6.17: Menübefehl-IDs ausgeben

Listing 6.18: Menübefehl deaktivieren

Listing 6.19: Menübefehl aktivieren

Listing 6.20: Menübefehl aktivieren (direkte Methode)

Listing 6.21: Ganzes Menü deaktivieren

Listing 6.22: Menü-Kaskade erstellen

Listing 6.23: Symbol-IDs auslesen

Listing 6.24: Symbol-FaceIDs auslesen

Listing 6.25: Eine neue Symbolleiste anlegen

Listing 6.26: Symbolleiste löschen

Listing 6.27: Symbolleiste zurücksetzen

Listing 6.28: Symbolleiste ausblenden

Listing 6.29: Symbolleiste deaktivieren

Listing 6.30: Symbolschaltfläche deaktivieren

Listing 6.31: Symbolleiste schützen

Listing 6.32: Symbolleistenschutz aufheben

Listing 6.33: Kontextmenüs abfragen

Listing 6.34: Kontextmenüs deaktivieren

Listing 6.35: Kontextmenüs ergänzen

Listing 6.36: Kontextmenübefehle aufspüren und löschen

Listing 6.37: Kontextmenü zurücksetzen

Kapitel 7

Listing 7.01: Tabellen verlinken

Listing 7.02: Dokumente eines Verzeichnisses in Tabelle auflisten

Listing 7.03: Aus Zelleneinträgen Hyperlinks herstellen

Listing 7.04: E-Mail-Adresse als Hyperlink einfügen

Listing 7.05: Hyperlink automatisch ausführen

Listing 7.06: E-Mail-Adressen prüfen und in Hyperlinks wandeln

Listing 7.07: Hyperlink auf eine Webseite richten

Listing 7.08: Hyperlinks setzen

Listing 7.09: Hyperlinks entfernen

Listing 7.10: Eine Webabfrage durchführen

Listing 7.11: Direktes E-Mail über eine API-Funktion versenden

Listing 7.12: E-Mail mit Dateianhang versenden

Page 530: VBA-Programmierung fur Word, Excel und Access

RechtsAnhang B 529

Listing 7.13: Aktive Tabelle per E-Mail versenden

Listing 7.14: Aktive Tabelle ohne Verknüpfungen per E-Mail versenden

Listing 7.15: Mehrere Dokumente per E-Mail versenden

Listing 7.16: Einen Zellenbereich per E-Mail versenden

Listing 7.17: Eine Serien-E-Mail aus Excel versenden

Kapitel 8

Listing 8.01: Die gesetzten Verweise in eine Tabelle schreiben

Listing 8.02: Die VBE-Bibliothek einbinden

Listing 8.03: Die VBE-Bibliothek entladen

Listing 8.04: Bibliotheksinformationen im Direktfenster ausgeben

Listing 8.05: Module ermitteln

Listing 8.06: UserForms ermitteln

Listing 8.07: UserForm starten

Listing 8.08: VBE-Komponente löschen

Listing 8.09: VBE-Komponente exportieren

Listing 8.10: VBE-Komponente importieren

Listing 8.11: Makro zeilenweise einfügen

Listing 8.12: Makros und UserForms aus Dokument entfernen

Listing 8.13: Entwicklungsumgebung aufrufen

Listing 8.14: Das Listenfeld mit Modulnamen füllen

Listing 8.15: Makroinhalte im Listenfeld anzeigen

Kapitel 9

Listing 9.01: Eine relative Markierung ausgehend von einer Zelle vornehmen

Listing 9.02: Eine relative Markierung mit negativen Werten vornehmen

Listing 9.03: Mehrere Bereiche markieren

Listing 9.04: Alle »Formelzellen« einer Tabelle markieren

Listing 9.05: Bestimmte Zellen benennen

Listing 9.06: Alle Namen einer Arbeitsmappe löschen

Listing 9.07: Den verwendeten Bereich ermitteln und summieren

Listing 9.08: Eine Funktion einfügen

Listing 9.09: Maximalwerte in einem Bereich ermitteln

Listing 9.10: Bei einer Änderung im Zielbereich wird neu ausgewertet

Listing 9.11: Eine andere Schriftart einstellen

Page 531: VBA-Programmierung fur Word, Excel und Access

Links

Anhang B530

Listing 9.12: Den Schriftschnitt dynamisch verändern

Listing 9.13: Das Ereignis Calculate wird bei jeder Neuberechnung gestartet

Listing 9.14: Bestimmte Zeilen ausblenden

Listing 9.15: Alle ausgeblendeten Zeilen wieder einblenden

Listing 9.16: Bestimmte Spalten werden ausgeblendet

Listing 9.17: Alle ausgeblendeten Spalten wieder eingeblendet

Listing 9.18: Bestimmte Zeilen löschen

Listing 9.19: Zeilen einfügen

Listing 9.20: Spalten mit Inhalt »X« löschen

Listing 9.21: Fehlende Spalten ergänzen

Listing 9.22: Die Spaltenbreite einstellen

Listing 9.23: Automatisches Einstellen der Spaltenbreite

Listing 9.24: Zeilenhöhe und Spaltenbreite gleichmäßig einstellen

Listing 9.25: Tabellen auflisten und zählen

Listing 9.26: Neue Tabellen anlegen und benennen

Listing 9.27: Tabellen ausblenden (Variante 1)

Listing 9.28: Tabellen ausblenden (Variante 2)

Listing 9.29: Tabellen einblenden

Listing 9.30: Tabellen schützen

Listing 9.31: Tabellenschutz entfernen

Listing 9.32: Tabellenreiter färben

Listing 9.33: Tabellenreiter färben (Praxisbeispiel)

Listing 9.34: Alle geöffneten Arbeitsmappen ermitteln

Listing 9.35: Neue Arbeitsmappe anlegen

Listing 9.36: Tabellenblätter einfügen

Listing 9.37: Arbeitsmappe erstmalig speichern

Listing 9.38: Arbeitsmappe speichern

Listing 9.39: Alle geöffneten Arbeitsmappen speichern

Listing 9.40: Die komplette Arbeitsmappe ausdrucken

Listing 9.41: Eine bestimmte Tabelle ausdrucken

Listing 9.42: Die ausgewählten Tabellen drucken

Listing 9.43: Verknüpfungen aufspüren und ersetzen

Listing 9.44: Alle externen Verknüpfungen durch Festwerte ersetzen

Listing 9.45: Alle verknüpften Arbeitsmappen ermitteln

Listing 9.46: Verknüpfungen austauschen

Page 532: VBA-Programmierung fur Word, Excel und Access

RechtsAnhang B 531

Kapitel 10

Listing 10.01: Den Namen des Dokuments ausgeben

Listing 10.02: Alle geöffneten Dokumente ermitteln

Listing 10.03: Die zugrunde liegende Vorlage ermitteln

Listing 10.04: Den Pfadnamen der Dokumentvorvorlage ermitteln

Listing 10.05: Dokumentvorlage austauschen

Listing 10.06: Schriftart sowie Schriftgröße ändern

Listing 10.07: Schriftarten in eine Tabelle schreiben

Listing 10.08: Dokunmenteigenschaften auflisten

Listing 10.09: Autor, Erstellungsdatum und Änderungsdatum ausgeben

Listing 10.10: Erstellungsdatum, Änderungsdatum und letztes Druckdatum ausgeben

Listing 10.11: Dokumenteigenschaft setzen

Listing 10.12: Alle Dokumente anpassen

Listing 10.13: Notizen auslesen

Listing 10.14: Kommentare formatieren

Listing 10.15: Texte suchen und formatieren

Listing 10.16: Texthintergrund einfärben

Listing 10.17: Hervorhebungen im ganzen Dokument entfernen

Listing 10.18: Lesezeichen nach erfolgreicher Suche setzen

Listing 10.19: Lesezeichen aus Dokument entfernen

Listing 10.20: Die gefundenen Wörter in neues Dokument übertragen

Listing 10.21: Texte suchen und ersetzen

Listing 10.22: Texte suchen und ersetzen (im gesamten Dokument)

Listing 10.23: Formatierungen aus dem Dokument entfernen

Listing 10.24: Formatierungen ergänzen

Listing 10.25: Alle Hyperlinks aus einem Dokument entfernen

Listing 10.26: Einen Hyperlink einfügen

Listing 10.27: Die Dateinamen der Bilder werden in ein neues Dokument eingelesen

Listing 10.28: Dateinamen in Hyperlinks wandeln

Listing 10.29: Ein Bild in ein Dokument einfügen

Listing 10.30: Mehrere Bilder verkleinert in ein Dokument einfügen

Listing 10.31: Eingefügte Bilder dokumentieren

Listing 10.32: Eingefügte Bilder aktualisieren

Listing 10.33: Tabelle einfügen, füllen und formatieren (Variante 1)

Listing 10.34: Tabelle einfügen, füllen und formatieren (Variante 2)

Listing 10.35: Tabelle löschen

Page 533: VBA-Programmierung fur Word, Excel und Access

Links

Anhang B532

Kapitel 11

Listing 11.01: Eine Tabelle wird geöffnet

Listing 11.02: Eine Tabelle wird geöffnet und durchsucht

Listing 11.03: Eine Tabelle wird geöffnet und auf einen bestimmten Datensatz eingestellt

Listing 11.04: Eine Tabelle wird geöffnet und gefiltert

Listing 11.05: Eine Tabelle wird geöffnet und gefiltert

Listing 11.06: Mehrere Filterkriterien einsetzen

Listing 11.07: Tabelle öffnen und drucken

Listing 11.08: Tabelle kopieren

Listing 11.09: Tabelle umbenennen

Listing 11.10: Tabelle löschen

Listing 11.11: Tabelle speichern

Listing 11.12: Tabelleninhalte auslesen

Listing 11.13: Tabelleninhalte auslesen (komplett)

Listing 11.14: Tabelle durchsuchen und Daten zurückgeben

Listing 11.15: Datensätze ändern (Texte)

Listing 11.16: Datensätze ändern (Preise)

Listing 11.17: Datensätze löschen

Listing 11.18: Datensatz anlegen

Listing 11.19: Abfrage ausführen

Listing 11.20: Aktualisierungsabfrage ausführen

Listing 11.21: Anfügeabfrage durchführen

Listing 11.22: Daten aus anderer Datenbank für die Anfügeabfrage abrufen

Listing 11.23: Daten aus Tabelle löschen

Listing 11.24: Ergebnisse in neuer Tabelle ablegen

Listing 11.25: Eine neue Tabelle erstellen

Listing 11.26: Ein Tabellenfeld einfügen

Listing 11.27: Ein Tabellenfeld löschen

Listing 11.28: Eine Tabelle löschen

Listing 11.29: Eine Abfrage erstellen

Listing 11.30: Eine komplexere Abfrage erstellen

Listing 11.31: Eine Parameterabfrage erstellen

Listing 11.32: Ein Formular aufrufen

Page 534: VBA-Programmierung fur Word, Excel und Access

RechtsAnhang B 533

Listing 11.33: Ein gefiltertes Formular aufrufen

Listing 11.34: Ein Formular schließen

Listing 11.35: Textfelder bei Bedingung färben

Listing 11.36: Cursor setzen

Kapitel 12

Listing 12.01: Adressdaten werden nach Outlook transferiert

Listing 12.02: Den E-Mail-Verkehr in Word dokumentieren

Listing 12.03: Das Dropdownfeld mit den Nachnamen füllen

Listing 12.04: Den Zugriff auf die Access-Tabelle programmieren

Listing 12.05: Die Daten aus der UserForm werden in das Dokument eingefügt

Listing 12.06: Eine Excel-Arbeitsmappe als Symbol einfügen

Listing 12.07: Alle Excel-Arbeitsmappen als Symbole einfügen

Listing 12.08: Eine Excel-Tabelle nach Word transportieren (ohne Verknüpfung)

Listing 12.09: Eine Excel-Tabelle nach Word transportieren (Verknüpfung erhalten)

Listing 12.10: Eine Excel-Tabelle importieren

Listing 12.11: Eine Access-Tabelle exportieren

Kapitel 13

Listing 13.01: Die Fehlerbehandlung aufsetzen

Kapitel 14

Listing 14.01: Sätze verarbeiten (Variante 1)

Listing 14.02: Sätze verarbeiten (Variante 2)

Listing 14.03: Sätze verarbeiten (Variante 3)

Listing 14.04: Sätze verarbeiten (Variante 4)

Listing 14.05: Zellen verarbeiten (Variante 1)

Listing 14.06: Zellen verarbeiten (Variante 2)

Listing 14.07: Zellen verarbeiten (Variante 3)

Listing 14.08: Die Statuszeile verwenden

Listing 14.09: Den Fortschrittsbalken programmieren

Page 535: VBA-Programmierung fur Word, Excel und Access

Links

Anhang B534

Kapitel 15

Listing 15.01: Ein Objekt rotieren lassen

Listing 15.02: Die Funktion für die Verzögerung

Listing 15.03: Einen Laufrahmen erstellen

Listing 15.04: Einen blinkenden Hintergrund erzeugen

Listing 15.05: Eine blinkende Zelle erzeugen

Listing 15.06: Termine von Excel nach Outlook transferieren

Listing 15.07: Der Excel-PowerPoint-Transfer

Listing 15.08: Das Steuerelement Tree füllen

Listing 15.09: Das Steuerelement Tree mit Dateinamen füllen

Listing 15.10: Ein Diagramm als Gif-Datei speichern

Listing 15.11: Das Datum aus dem Kalender ins Textfeld übertragen

Listing 15.12: Die erfassten Termine speichern

Listing 15.13: Ein Diagramm in PowerPoint erzeugen

Page 536: VBA-Programmierung fur Word, Excel und Access

Kap_Anfang535

AAbfrage

durchführen 436erstellen 446hinzufügen 447

Abfragenprogrammieren 436

Absatzformatierungenentfernen 196

Absatzmarkeeinfügen 375

Accessprogrammieren 411

AccessMode 358Access-Sitzung

starten 165Access-Tabelle

exportieren 480importieren 479

Accesstabelleabfragen 426aktualisieren 435ändern 429anlegen 442anpassen 429auslesen 422, 423drucken 418duplizieren 419durchsuchen 413einfügen 442entfernen 421, 446filtern 416kopieren 419löschen 421, 446öffnen 411, 424, 427schließen 422, 431sichern 422speichern 422umbenennen 421

Access-Tabellenermitteln 71

Accesstabellenprogrammieren 411

Activate 77, 312, 329, 368, 501ActiveCell 93ActiveConnection 447ActiveDocument 368, 400ActivePresentation 160ActiveSheet 175

ActiveWorkbook 65AdaptiveMenus 234Add 59, 61, 122, 235, 242, 249, 255,

263, 266, 277, 281, 302, 314, 344, 345, 356, 373, 397, 407, 463, 475

ADD COLUMN 444, 445ADD CONSTRAINT 444AddFromFile 302Add-In

prüfen 184Add-Ins

ansprechen 297AddIns 297AddItem 209, 225, 228, 298, 299, 306,

307, 466AddNew 433AddOLEObject 471AddPicture 402, 403Address 169, 266, 317AddToMru 358ADO

anwenden 422einsetzen 422

ADOX 447Adressen

verschieben 459Aktienkurse

abfragen 276AKTIVIERREIHENFOLGE

ändern 208Aktivierreihenfolge

ändern 208Aktualisierungsabfrage

durchführen 437AllDataAccessPages 72AllDatabaseDiagrams 71AllForms 72AllFunctions 71AllMacros 72AllModules 72AllowDeletingColumns 352AllowDeletingRows 352AllowFiltering 353AllowFormattingCells 352AllowFormattingColumns 352AllowFormattingRows 352AllowInsertingColumns 352AllowInsertingHyperlinks 352AllowInsertingRows 352AllowSorting 352

Stichwortverzeichnis

Page 537: VBA-Programmierung fur Word, Excel und Access

Links

Stichwortverzeichnis536

AllowUsingPivotTables 353AllQueries 71AllReports 72AllStoredProcedures 71AllTables 71AllViews 71ALTER TABLE 444, 445Änderungsdatum

ermitteln 376Anfügeabfrage

ausführen 438Ansicht

aktualisieren 443Anwendung

prüfen 162Anzeige

einfügen 206API-Funktion

einsetzen 279Append 447Application 47, 367ApplyFilter 416Arbeitsmappe

einfügen 347festlegen 65öffnen 62, 171schießen 359schließen 120schützen 171speichern 359suchen 62

Arbeitsmappenanlegen 356drucken 359einfügen 356ermitteln 67erstellen 356identifizieren 355programmieren 355sichern 357speichern 357

Arbeitsmappenamenermitteln 96

Arrayanlegen 133auslesen 133, 135erzeugen 134füllen 133

AttachedTemplate 369Attachments 289AttachTemplate 371Aufgabe

einfügen 280

Auflistungeneinsetzen 493verwenden 493

Aufruflisteanzeigen 34

Author 381AutoFit 340, 342Autor

ermitteln 376

BBackColor 230, 455BackgroundPatternColor 409Beep 119Befehlsschaltfläche

einfügen 206BeginGroup 238, 250, 263Benutzernamen

ermitteln 303Berechnung

ausschalten 495einschalten 495

Bereichbenennen 314definieren 106einfügen 287ermitteln 132festlegen 312, 371, 475kopieren 287markieren 287, 311prüfen 153reduzieren 375versenden 285

Bezeichnungsfeldeinfügen 205

Bibliothekeinbinden 80, 292, 423entladen 295

Bibliotheksinfosschreiben 295

Bildausblenden 119einblenden 119einfügen 401

Bildbreiteeinstellen 403

Bilddateieinfügen (Kopfzeile) 125

Bilderdokumentieren 404einfügen 402

Bilderhyperlinks

Page 538: VBA-Programmierung fur Word, Excel und Access

RechtsStichwortverzeichnis 537

einfügen 398Bildgröße

einstellen 403Bildhöhe

einstellen 403Bildlaufleiste

einfügen 206Bildschirmaktualisierung

abschalten 491einschalten 491

Bildschirmpräsentationstarten 167

Bindestricheentfernen 152

Blinkeffektsimulieren 508

Blockauskommentieren 29, 30

Body 281, 284Bold 18, 325, 327, 382, 396Bookmark 389, 391Boolean 42Border 407BuiltInDocumentProperties 377Byte 42

CCalculation 498Caption 210, 218, 222, 237, 241, 244CC 281Cell 407Cells 66, 100, 210, 313, 344CenterHeader 125Change 107, 210, 225, 322, 324, 466ChangeLink 364, 365Characters 239ChDir 109, 267, 358, 399ChDrive 109, 399Chr 122, 303Chr(13) 161Clear 224, 227, 298, 299ClearContents 134ClearFormatting 196, 385, 389Close 156, 283, 359, 371, 380, 422, 431,

453, 468Code-Bereich

ansprechen 297Code-Farben

einstellen 37Codefenster

anzeigen 24unterteilen 24

CodeModule 307CodePanes 297Codestücke

vergleichen 32Codezeilen

auflisten 305löschen 304zählen 303

Collapse 375Color 327, 382, 385ColorIndex 61, 128, 276, 326, 327, 353Column 225, 226ColumnCount 224Columns 328, 338ColumnWidth 341Columnwidths 224Command 447CommandBarControl 235, 237, 241CommandBars 231, 251, 297CommandText 447Comment 381ConflictResolution 358Connection 427ConnectionString 427Content 352, 371, 375Control 74Controls 80, 235, 241ConvertToTable 400Copies 359Copy 282CopyFace 253CopyObject 420Count 63, 64, 80, 88, 132, 156, 177, 232,

344CountOfLines 303, 304, 307CREATE TABLE 443CreateBackup 358CreateItem 280, 284, 289, 461CreateObject 165, 167, 280, 475Currency 42CurrentData 71CurrentProject 72

DDate 42, 65, 79, 238DateAdd 116Datei

löschen 49prüfen 149

Dateianhanghinzufügen 289

Dateianhänge

Page 539: VBA-Programmierung fur Word, Excel und Access

Links

Stichwortverzeichnis538

versenden 284Dateien

auflisten 50, 83, 109suchen 267zählen 63, 83, 268

Dateinamenfestlegen 155

Dateiprüfungvornehmen 50

Dateitypbestimmen 63, 268festlegen 155

Datenabrufen 425bereinigen 150formatieren 323löschen 194verknüpfen 476

Datenbankangeben 427

Datenfeldauslesen 135entfernen 444hinzufügen 444löschen 444

Datenfeldereinfügen 439

Datensatzaktivieren 424einstellen 414, 431positionieren 82, 414suchen 413, 428

Datensätzeeinlesen 425entfernen 432filtern 416hinzufügen 433lesen 424löschen 432

Datentabelleöffnen 81

Datentabellenauslesen 80

Daten-Tippsanzeigen 36

Datentypfestlegen 42

Datentypenverwenden 42

Datenzugriffsmethodeeinsetzen 422

Datenzugriffsseiteermitteln 72

DatePart 115DateSerial 60, 122, 180Datevalue 123Datum

einfügen 65ermitteln 49formatieren 49vergleichen 79

Datumsangabenerkennen 123extrahieren 115formatieren 120konvertieren 59

Datumsberechnungendurchführen 116

Day 114, 180Debug.Print 24, 74, 135, 232, 241, 425Debuggen 33Decimal 42Definitionsabfrage

durchführen 442Delete 77, 119, 194, 236, 243, 255, 264,

276, 316, 333, 391, 410, 441DeleteLines 304DeleteObject 421Description 489Diagramme

konvertieren 515Dialoge

aufrufen 197programmieren 191

Dialogs 202DieseArbeitsmappe 22Dim 42Dir 50, 83, 109, 150, 370, 379Direktfenster

aufrufen 24einblenden 24, 34füllen 24, 74

DirektversandE-Mail 278

Display 281, 285Do Until 79Do until 82Do Until...Loop 75Do While 86, 88Do While loop 84Do While...Loop 82, 84DoCmd 411, 437, 451Document 21Document_Close 21, 239Document_New 21Document_Open 21, 239

Page 540: VBA-Programmierung fur Word, Excel und Access

RechtsStichwortverzeichnis 539

DocumentProperties 377Documents 69, 407, 475DoEvents 85Dokument

aktivieren 368anlegen 463identifizieren 368layouten 371markieren 388öffnen 156, 371, 380schließen 156, 371, 380sichern 369speichern 369

Dokumentefinden 156

Dokumenteigenschaftenabfragen 178, 374, 376auslesen 374einsehen 374setzen 378

Dokumentschutzaufheben 154überprüfen 170

Dokumentseiteabfragen 173

Dokumentvorlageermitteln 369tauschen 370

Double 42DrawingObjects 352Drehfeld

einfügen 206DROP COLUMN 444, 445DROP CONSTRAINT 444DROP Table 446Durchstreichung

einstellen 328

EEditorformat

festlegen 36Eigenschaften

anzeigen 30festlegen 22

Eigenschaftsfensteraufrufen 22

Eingabemaskeaufrufen 191programmieren 194

Eingabenüberprüfen 56

Eintrag

einfügen (Combobox) 209Einzelschritt

durchführen 34Einzug

vergrößern 29, 36verkleinern 29

E-Mailabschicken 282erstellen 280verschicken 280versenden 279

E-Mail-Adressenangeben 281umsetzen 269verlinken 269zusammenstellen 183

E-Mail-Anhangeinfügen 279

E-Mail-Empfängerangeben 282bestimmen 281

E-Mail-Fensteranzeigen 281

E-Mailsdokumentieren 462verschicken 278

E-Mail-Textangeben 281

E-Mail-Titelangeben 281festlegen 282

Empfangsbestätigungeinholen 283

Enabled 212, 234, 246, 257End 213, 317End With 19Endzelle

markieren 314EntireColumn 332, 338EntireRow 77, 330, 333Entwicklungsumgebung

aufrufen 21Entwurfsmodus

aktivieren 34deaktivieren 34

EOF 82, 424, 428, 431, 466Ereignisse

ansprechen 297einstellen 107, 322einstellen (Word) 21

Erstellungsdatumabfragen 177ermitteln 49, 376

Page 541: VBA-Programmierung fur Word, Excel und Access

Links

Stichwortverzeichnis540

Events 297Excel-Daten

einfügen 473kopieren 473

Excel-Dialogeaufrufen 197

Excel-Tabelleimportieren 477

Execute 63, 156, 177, 197, 385, 429, 430Exit Sub 246, 489Export 301, 516

FFaceId 238, 250, 253FaceIDs

bestimmen 253Fälligkeitstermin

festlegen 116Farben

erkennen 141erzeugen 139

Farbenspielprogrammieren 84starten 84

Farb-IDauslesen 61

Farbindexauslesen 129

Farbkomponentenzusammensetzen 141

Farbkonstanteauswählen 382

Farbwertzuweisen 455

Fehlerabfangen 412aufspüren 481suchen 481

Fehlerbehandlungdurchführen 488

Fehlerbeschreibunganzeigen 489

Fehlerlisteeinsehen 488

Fehlerquellenlokalisieren 481

Fehlerverhalteneinstellen 38

Feldinhalteausgeben 429

Fensteransprechen 297

verankern 38Fenstereinstellungen

vornehmen 36Fensterstatus

ermitteln 51Festwerte

markieren 314Fettdruck

zuweisen 325Fields 429FileDateTime 49FileDatTime 177FileFormat 357FileFound 268FileName 155Filename 357FileSearch 62, 63, 155, 267, 285FileSystemObject 178FileTyp 155, 177FileType 63, 268Filter

anwenden 416, 452einfügen 416einstellen 452

Find 384, 428, 468FindControl 246, 247, 258FindRecord 413Fläche

animieren 507Folien

zählen 161Font 19, 324, 327, 371, 382FontNames 373FontStyle 328For .. Next 62For Each...Next 65, 74For Next 85, 243, 272For...Next 58Form_Current 455Format 49, 59, 120, 381, 385Formatcodes

anwenden 126Formate

entfernen 394ergänzen 395suchen 383, 394

Formatkürzelanwenden 59einsetzen 121

Formelneinsetzen 316entfernen 283markieren 314

Page 542: VBA-Programmierung fur Word, Excel und Access

RechtsStichwortverzeichnis 541

Forms 72FormulaLocal 319Formulare

aufrufen 451ausbauen 453ermitteln 72erweitern 453löschen 214programmieren 450schließen 453

Formularfeldereinfärben 454

Formular-Rastereinstellen 37

Fortschrittsbalkenprogrammieren 500

Forward 196, 385FoundFiles 63, 156, 177, 285FROM 440From 441FullName 370Function 148Funktionen

schreiben 148Fußzeile

bearbeiten 124

GGanzzahlenwerte

erzeugen 143Geschwindigkeitseffekt

nutzen 494GetObject 163, 475GetString 425Gitternetz

anzeigen 400Gitternetzlinien

anzeigen 343ausblenden 343

GoToRecord 414Graph

programmieren 518Gridlines 343Großbuchstaben

ausgeben 103Guid 293

HHaltepunkt

einsetzen 29

entfernen 34löschen 25, 29setzen 25, 34

Haupttextansprechen 371

Hauptversionsnummerermitteln 293

Height 403Hervorhebungen

entfernen 388Hidden 330, 332HighlightColorIndex 387, 388Hintergrund

einstellen 128löschen 128

Hintergrundfarbeeinstellen 61, 325

Höchstwerteermitteln 320

HomeKey 393Hour 117Hyperlink 169

adressieren 169einfügen 167, 266, 270, 397entfernen 276identifizieren 167löschen 276, 397

IID 243, 244, 252If 46, 77IN 440Information 174Inhaltsverzeichnis

erstellen 265Initialen

bilden 180Initialize 208, 217, 465InputBox 287, 384Inputbox 133, 194Insert 119, 336, 340INSERT INTO 439, 440InsertAfter 392, 399, 407InsertParagraph 375InsertParagraphAfter 399, 403InsideLineStyle 407Installed 185InStr 88, 93, 354, 361Instr 225, 228, 264InstrRev 96Int 143, 144Integer 42

Page 543: VBA-Programmierung fur Word, Excel und Access

Links

Stichwortverzeichnis542

InterSect 322, 325Intersect 153Into 441IsArray 134, 135IsDate 130, 132IsEmpty 132, 363IsFormula 104IsNumeric 126Italic 18, 328, 396

JJournaleintrag

erstellen 280

KKalendersteuerelement

einfügen 516Karopapier

drucken 342erstellen 342

Kaskadeerstellen 248

Klassen-IDermitteln 293

Kleinbuchstabenausgeben 105

Kombinationsfeldeinfügen 206füllen 209lesen 213

Kommentareaufspüren 380auslesen 380färben 382formatieren 380, 381hinterlegen 29suchen 380

Kompilierungseinstellungenfestlegen 37

Konstantenanzeigen 31deklarieren 43verwenden 41

Kontakteinfügen 280speichern 461

Kontaktordnerfüllen 460

Kontextmenüaktivieren 262

anpassen 262deaktivieren 262ermitteln 261erweitern 262löschen 264programmieren 260zurücksetzen 264

Kontrollkästchenauswerten 220beschriften 218einfügen 206

Konturschrifteinstellen 328

Kopfzeilebearbeiten 124

Kursivdruckeinstellen 328

LLarge 320, 322Last 373, 464Laufrahmen

erstellen 505Laufwerk

auswählen 399wechseln 109

LBound 135LCase 105Leerzeichen

einfügen 142entfernen 88, 102, 183

Left 93, 220, 255Leisten

identifizieren 231zählen 232

Leistentypbestimmen 231

Len 100, 142, 150, 163Lesemarken

setzen 388Lesezeichen

entfernen 33löschen 391setzen 32zurücksetzen 32

Like 47Line Input 87LinkFormat 159, 161, 405Linksources 133, 363LinkToFile 402List 210Listenfeld

Page 544: VBA-Programmierung fur Word, Excel und Access

RechtsStichwortverzeichnis 543

einfügen 206füllen 225, 298löschen 224, 298programmieren (mehrspaltig) 223

Listenfeldeintragentfernen 300löschen 300

ListIndex 209, 210Logo

einfügen 518Lokal-Fenster

einblenden 27, 34Long 42LookIn 63, 156, 177, 267Löschabfrage

ausführen 440LTrim 89

Mmailto 270Major 293Makro

abbrechen 25anlegen 13aufzeichnen 15beenden 246benennen 14einfügen 13ermitteln 72pausieren 119, 505speichern 17starten 15, 24tunen 491unterbrechen 34

Makroaufzeichnungbeenden 17

Makrorekordereinsetzen 15starten 15

Mappenprogrammieren 355

Markierungauslesen 69

MatchCase 385Matchcase 196MatchWholeWord 196, 385Mauszeiger

positionieren 173versetzen 77

Max 187Mehrfachindex

hinzufügen 444

löschen 444Meldung

anzeigen 48ausgeben 15programmieren 191

Meldungsfensteranzeigen 68

Menüaktivieren 247anlegen 234deaktivieren 247einfügen 235löschen 236

Menübefehlaktivieren 245, 250deaktivieren 245, 250einfügen 236, 241entfernen 242finden 246gruppieren 238integrieren 236, 241löschen 242suchen 246verknüpfen 238

Menübefehl-IDermitteln 244

Menübeschriftungfestlegen 237

Menü-IDsermitteln 243

Menüleisteausblenden 234einblenden 234erstellen (beim Start) 239programmieren 233zurücksetzen 243

Menünamenfeststellen 240

Menüpunkteinfügen 235

Menüsanpassen 231

Methodenanzeigen 30

Mid 93, 96, 100Minor 293Minute 118

ermitteln 118Mitarbeiter

suchen 223MkDir 111Module

entfernen 304

Page 545: VBA-Programmierung fur Word, Excel und Access

Links

Stichwortverzeichnis544

ermitteln 72löschen 304

Monatsnamenermitteln 115

Month 114MoveDown 401MoveNext 82, 424, 433, 466MovePrevious 431MsgBox 56Msgbox 15, 48, 191msoFileTypeDatabases 63msoFileTypeExcelWorkbooks 63msoFileTypeOfficeFiles 63msoFileTypePowerPointPresentations 63msoFileTypeWordDocuments 63MultiLine 218

NName 18, 59, 67, 96, 122, 169, 175, 261,

293, 324, 347, 355, 368, 371, 382Namen

auflisten 316entfernen 316ermitteln 189löschen 316prüfen 188

Names 189, 316Nebenversionsnummer

ermitteln 293NewMacros 20NewSearch 63, 155, 176, 267NewWindow 270Nothing 285Notiz

einfügen 280Now 49, 117, 176, 505Numberformat 56NumColumns 373NumRows 373

OObject 42, 215Objekte

animieren 503auswählen 205festlegen 504identifizieren 158rotieren 503

Objektverweis

entfernen 285Office-Dokument

verknüpfen 470Office-Version

ermitteln 47OffSet 213Offset 61, 77, 79, 93, 310olAppointmentItem 280olContactItem 280, 461olDistributionListItem 280, 461OLEObjects 54OLE-Objekte

auflisten 159Ole-Objekte

anzeigen 161ermitteln 161

olJournalItem 280, 461olMailItem 280, 461olNoteItem 280, 461olPostItem 280, 461olTaskItem 280, 461On Error 375, 489On Error Goto 412OnAction 238, 263Open 63, 81, 87, 156, 167, 370, 379,

424, 427OpenCurrentDatabase 165OpenForm 451OpenQuery 436, 437OpenTable 412Operatoren

arithmetisch 44einsetzen 44logisch 45vergleichend 45

Option explicit 487Optionsfeld

einfügen 206Optionsschaltfläche

abfragen 213aktivieren 211

OutLineFont 328Outlook

programmieren 460Outlook-Funktionen

einbinden 287Outlook-Objekt

erstellen 280OutPutTo 480OutsideLineStyle 407OutsideLineWidth 407

Page 546: VBA-Programmierung fur Word, Excel und Access

RechtsStichwortverzeichnis 545

PParagraphs 400Parameterabfrage

erstellen 449Parameters 450Password 351, 357Paste 253, 287, 475PasteSpecial 476Pause

einlegen 118Pfad

anzeigen 96Pfadnamen

ermitteln 370Picture 119PowerPoint

programmieren 511Präsentation

anzeigen 167aufrufen 511öffnen 167

Preiseerhöhen 431

PrintOut 359, 418Procedures 447Programm

aufrufen 136Projekte

auflisten 297Projekt-Explorer

anzeigen 20Projektfenster

einstellen 35Protect 351Protection 259Provider 427

festlegen 427Prozedur

abschließen 34auswählen 23

Prozedurschrittdurchführen 34

Prüffunktioneneinsetzen 126

PrüfungArray 134Datenfeld 134Datum 130leer 132numerisch 126

QQuickInfo

anzeigen 31, 32, 36, 37, 252

RRahmen

einfügen 206Range 56, 65, 174, 309Ratschläge

Programmierung 490ReadOnlyRecommended 358Rechner

aufrufen 136Recipients 282RecordsAffected 430Recordset 81, 424, 468RefEdit

einfügen 206RefreshDataBaseWindow 443Register

einfügen 206Registerlaschen

einfärben 353Remove 295, 300RemoveItem 300Rename 421Replace 137, 138, 395, 396Reset 243, 256, 264Resume 489Resume Next 375, 489ReturnReceipt 283RGB 139, 228Right 97RmDir 112Rotation 504Round 145RowHeight 343Rows 132, 328, 373, 464RTrim 89Rückfrage

einholen 48Rückgabewerte

auswerten 193Run 167RunSQL 437, 438, 443, 445

SSammel-E-Mail

erstellen 288Sätze

Page 547: VBA-Programmierung fur Word, Excel und Access

Links

Stichwortverzeichnis546

zählen 239Save 369, 422, 461SaveAs 357, 358SaveChanges 371Saved 368Scenarios 352Schaltfläche

abfragen 48auswerten 193definieren 192

Schaltflächensymbolfinden 258

Schattierungeinstellen 328

Schleifenprogrammieren 58

Schreibarbeitsparen 19

Schrifteinstellen 323

Schriftartermitteln 372festlegen 18, 371wählen 323

Schriftarttestdurchführen 16

Schriftgrößefestlegen 18, 371, 382

Schriftschnittbestimmen 328einstellen 18, 324

ScreenTip 266SearchSubFolders 63, 156, 177, 267Second 118Sekunden

ermitteln 118SELECT 440Select 61, 77, 309, 312, 425, 441Select Case 50, 57SelectedSheets 360Selection 18, 30, 56, 70, 103, 104, 174SelLength 457SelStart 457Send 282SendMail 282, 284Sentences 493Set 79, 106, 252, 312, 322, 371, 438,

475, 504Shading 409Shadow 328Shape 169, 504Shapes 160Sheets 65

SheetsInNewWorkbook 356Shell 136ShellExecute 279Show 211Sicherheitseinstellung

ändern 291Single 42, 85Size 18, 371, 382Skills

suchen 223Slides 160SlideShowSettings 167Small 321SourceFullName 405Space 142Spalten

ausblenden 330, 332einblenden 330einfügen 337, 340löschen 337markieren 78, 332, 338positionieren 78

Spaltenanzahlbestimmen 224

Spaltenbreitebestimmen 224einstellen 340

SpecialCells 283, 313Sprünge

umgehen 498SQL-Anweisung

einsetzen 426SrceenUpdating 491Startordner

festlegen 156Statusleiste

einsetzen 499Step 101Steuerelemente

ansprechen 74ausrichten 217beschriften 210einbinden 206einfärben 228einfügen 207ermitteln 74identifizieren 54, 215zählen 80

StoryRanges 394Strikethrough 328String 42Stunde

ermitteln 117

Page 548: VBA-Programmierung fur Word, Excel und Access

RechtsStichwortverzeichnis 547

Style 250, 400Styles 238Sub/Userform

ausführen 34SubAdress 266Subject 281, 282, 284Subscript 328Suchbereich

angeben 385Suche

starten 63, 156, 197, 385Suchkriterien

zusammenstellen 155Suchreihenfolge

festlegen 196Suchrichtung

festlegen 385Suchtext

angeben 196, 385Sum 317Superscript 328Symbol

einfügen 206, 470festlegen 250hinzufügen 238suchen 258

Symbolbildauswählen 253einfügen 253kopieren 253

Symboleaktivieren 258deaktivieren 258einfügen 472

Symbol-IDsbestimmen 251

Symbolleisteaktivieren 257andocken 260anlegen 254anpassen 260anzeigen 255ausblenden 256bewegen 260deaktivieren 257einblenden 256erstellen 254festlegen 252löschen 255positionieren 255setzen 252verankern 260verschieben 260

zurücksetzen 256Symbolleisten

programmieren 251schützen 259

Symbolstilfestlegen 238

Syntaxfehlerbeseitigen 481

Syntaxüberprüfungdurchführen 35

TTab 353, 354Tabellen

anlegen 345ausblenden 348benennen 58, 346drucken 359einblenden 348einfügen 58, 122, 266, 344, 345formatieren 122kopieren 282programmieren 343schützen 351versenden 282zählen 64, 344

Tabellenanzahlbestimmen 356

Tabellenblätterabfragen 175ansprechen 65auswählen 77einfügen 61identifizieren 344zählen 344

Tabellenendeermitteln 82

Tabellenerstellungsabfrageausführen 441

Tabellenfeldlöschen 445

Tabellenfeldereinfügen 444ergänzen 444

Tabellenformateinstellen 400

Tabellenfunktioneneinsetzen 316

Tabellennamenausgeben 66ermitteln 175prüfen 354

Page 549: VBA-Programmierung fur Word, Excel und Access

Links

Stichwortverzeichnis548

Tabellenrahmenfestlegen 407

Tabellenreitereinfärben 353

Tabellenschutzentfernen 353

Tables 407Tab-Schrittweite

einstellen 36Tage

zählen 180Tagesdatum

ermitteln 49Tastenkombination

zuweisen 17Termin

einfügen 280Termine

übertragen 509Terminkalender

füllen 509Text 196, 215, 381, 385

durchstreichen 328einfügen 392färben 387höherstellen 328kennzeichnen 387löschen 194suchen 388tieferstellen 328unterstreichen 328

Textänderungendurchführen 429

Textblöckeauskommentieren 30

Textdateieinlesen 87öffnen 87

Textdateieneinlesen 86

Texteersetzen 392konvertieren 103spiegeln 100suchen 383tauschen 392umwandeln 103verdrehen 100zusammenführen 94

Texteileersetzen 137

Textfeldauslesen 224

deaktivieren 212einfügen 205einfügen (mehrzeilig) 218färben 455löschen 215speichern 228

Textfelderauslesen 79identifizieren 79lesen 213markieren 456positionieren 456

Textfolgezerlegen 98

Textfunktioneneinsetzen 91

Textlängeermitteln 100, 142

Textmarkenanzeigen 390löschen 391

Textteiletrennen 91

TextToDisplay 266ThisDocument 20ThisWorkbook 65, 96, 175Timer 85TimeSerial 119, 122, 505Tipps

Programmierung 490Titel

festlegen 281To 57, 281, 285Ton

ausgeben 119ToolTipText 252Top 255TransferSpreadsheet 478TreeControl

einfügen 513Trennstreifen

einfügen 263Trim 88, 103, 183Type 161, 261, 298, 299, 304TypeName 54, 80, 215, 222TypeParagraph 469TypePararaph 87TypeText 87

UÜberwachungsfenster

einblenden 34

Page 550: VBA-Programmierung fur Word, Excel und Access

RechtsStichwortverzeichnis 549

UBound 133, 135Ucase 105Uhrzeit

ermitteln 85, 117Umschaltfeld

einfügen 206Umschaltfläche

programmieren 221Underline 18, 276, 328, 373UnderlineColor 18Unload 212Unload Me 469UnProtect 353Unterformular

anlegen 216Untermenübefehl

einfügen 248Unterstreichung

einstellen 328festlegen 18

Update 406, 431, 435, 438URL-Links

einfügen 273UsedRange 104, 132, 324, 334UserForm

aufrufen 208, 211aufrufen (Modeless) 211einfügen 205entladen 469erstellen 465füllen 466schließen 212starten 208testen 210vergrößern 207

UserFormsentfernen 304löschen 304programmieren 191, 203

UserInterfaceOnly 352Username 303

VValue 93, 211, 213, 361VALUES 439Variablen

benennen 41deklarieren 41einsetzen 41, 485global 42lokal 42Öffentlich 42

Private 42statisch 42

Variablencheckdurchführen 43

Variablendeklarationerzwingen 43, 487

Variablendklarationerzwingen 35

Variablentypenfestlegen 42

Variant 42VBCompontents 298VBE

aufrufen 305VBE-Bibliothek

einbinden 294entladen 295

VBE-Komponentenauflisten 298entfernen 300, 304exportieren 300importieren 301löschen 300

VBE-Programmierung 291VBProjects 297Vergleichsoperatoren

einsetzen 45Verknüpfungen

aktualisieren 405entfernen 283, 362ermitteln 133, 363ersetzen 360löschen 362tauschen 364

Verknüpfungsadresseermitteln 161

Version 47, 297ermitteln 297

Verteilerlisteerstellen 280

Verweisermitteln 293

Verzeichnisangeben 267auswählen 358, 399durchsuchen 63, 156einstellen 109erstellen 111löschen 112wechseln 109, 267

Verzweigungeneinsetzen 46

Visible 167, 255, 257, 348

Page 551: VBA-Programmierung fur Word, Excel und Access

Links

Stichwortverzeichnis550

WWait 119wdNoHighlight 387wdWindowStateMaximize 51wdWindowStateMinimize 51wdWindowStateNormal 51Webseite

ansteuern 273Weekday 112WeekdayName 113Werkzeugsammlung

verwenden 205Wert

anzeigen 34runden 145suchen 185

Where 441WholeStory 388wholestory 194Width 403Windows 297Windows-Explorer

aufrufen 137WindowState 51With 19, 79, 213, 237, 382Wochentag

ermitteln 112Word 70

programmieren 367Word-Dialoge

aufrufen 202Word-Dokumente

ermitteln 68öffnen 64suchen 64

Words 88, 239Wordtabelle

einfügen 373, 406, 463füllen 407löschen 410

Workbook 355Workbook_BeforeClose 240Workbook_Open 120, 240Workbooks 67, 355, 356WorksheetFunction 316WorkSheets 65Wörter

auslesen 69suchen 195zählen 88, 239

Wrap 196, 385WriteResPassword 357

XxlCalculationAutomatic 498xlCalculationManual 498xlCellTypeAllFormatConditions 314xlCellTypeAllValidation 314xlCellTypeBlanks 314xlCellTypeConstants 314xlCellTypeFormulas 283, 314xlCellTypeLastCell 314xlCellTypeVisible 314XlColorIndexNone 326xlColorIndexNone 128xlExcelLinks 363xlSheetHidden 348xlSheetVeryHidden 349

YYear 115

ZZahlen

konvertieren (Römisch) 156Zahlenformat

festlegen 56Zahlenformate

ermitteln 55Zahlenreihe

ergänzen 339Zeichen

markieren 457suchen 93suchen (von links) 96suchen (von rechts) 96übertragen (Teil) 93übertragen (von links) 93übertragen (von rechts) 97zählen 239, 457

Zeichencodeverwenden 122

Zeichenfolgeauswerten 54suchen 88, 361

Zeichenfolgenvergleichen 47

Zeileausblenden 329einfügen 336markieren 330

Zeilenausblenden 328

Page 552: VBA-Programmierung fur Word, Excel und Access

RechtsStichwortverzeichnis 551

einblenden 328einfügen 333löschen 75, 333markieren 334zählen 303, 400

Zeilenhöheeinstellen 340

Zeilenwechseldurchführen 87

Zeitstoppen 85

Zelleansprechen 56, 100blinken 508füllen 100löschen 134

markieren 56, 61, 309prüfen 104verschieben 310

Zellenaddieren 147ansprechen 309formatieren 323programmieren 309summieren 317

Zellenadresseermitteln 317

Zellenbereicheansprechen 56

Zieldokumentangeben 391

Page 553: VBA-Programmierung fur Word, Excel und Access

Vakatseite

Page 554: VBA-Programmierung fur Word, Excel und Access

Passen Sie Microsoft Office mit neuen Funktionen an Ihre Bedürfnisse an!Gewiss, Office bietet eine riesige Optionsvielfalt – aber ist auch wirklichalles dabei, was Sie brauchen? Wenn Ihnen immer wiederkehrende Arbeits-abläufe zu mühsam sind, brauchen Sie selbst programmierte Lösungen.Hier kommt Visual Basic für Applikationen ins Spiel. Denn mit VBA könnenSie einfache, aber auch komplexere Lösungen für Ihre Office-Aufgabenselbst entwickeln.

� Neue Office-Funktionen erstellenIn diesem Buch finden Sie eine detaillierte und praxisbezogene Anleitung

zur VBA-Programmierung in Excel, Word, Access, Outlook, PowerPoint und

anderen Office-Komponenten. Bernd Held zeigt Ihnen, worauf Sie bei der

Programmierung achten müssen, wie Sie Fehler finden und wie Sie VBA-

Programme tunen. Setzen Sie Steuerelemente geschickt ein, tauschen

Sie Daten zwischen den verschiedenen Office-Applikationen problemlos

aus und erzeugen Sie für Ihre Anwendungen die passenden Menü- und

Symbolleisten. Egal, ob Sie ambitionierter Anwender oder Programmierer

sind – der Autor vermittelt Ihnen das nötige Know-How, mit dem Sie Ihr

persönliches Office gestalten.

� Das Web in Office integrierenInternetfunktionen lassen sich sehr einfach per VBA in Office-Dokumente

einbinden. Verlinken Sie zum Beispiel die Tabellen einer Excel-Arbeitsmappe

durch Hyperlinks, fragen Sie automatisch Aktienkurse ab, versenden Sie

Excel-Bereiche per Mail oder richten Sie einen E-Mail-Direktversand ein.

� Hilfen für Anwender einbauenMachen Sie Office verständlicher! Mit Meldungen und Dialogen helfen

Sie Anwendern, bei falschen Eingaben oder sonstigen Fehlern richtig zu

reagieren. Durch einfache Eingabemasken fragen Sie Informationen von

den Anwendern ab und werten sie dann aus. Oder Sie unterstützen die

Benutzer, indem Sie ihnen bei Eingabedialogen Informationen zur

Verfügung stellen, die sich aus den bereits eingegebenen Daten ergeben.

Aus dem Inhalt:• Die Entwicklungsumgebung

für das Programmieren in Office

• Die wichtigsten Sprachelemente

• Fehlersuche und Fehlervermeidung

• Funktionen programmieren und

API-Funktionen einsetzen

• Integrierte Dialoge und Userforms

programmieren

• ActiveX-Steuerelemente erstellen

• Menü- und Symbolleisten programmieren

• Internetfunktionen in Office entwickeln

• VBE-Programmierung

• Programmieren in Excel, Word,

Access, Outlook, PowerPoint

• Daten austauschen zwischen

den einzelnen Office-Programmen

• Hilfesysteme erstellen

• Tuning der VBA-Programme

• Add-Ins für Office erstellen

• FAQ für VBA-Entwickler

Bernd Held

25,00 EUR [D]

ISBN 978-3-645-60070-5

Besuchen Sie unsere Website

www.franzis.de

Studienausgabe

VBA-Programmierungfür Word, Excel und Access

Über den Autor:Bernd Held ist langjähriger

Dozent, VBA- Entwickler und

Autor von über 90 Fach-

büchern und unzähligen

Computer-Fachartikeln. Er

entwickelt unter anderem

Tools und Add-Ins für Excel und Access. Er ist

einer der bekanntesten VBA-Spezialisten in

Deutschland und von Microsoft mit dem Titel

„Most Valuable Professional“ ausgezeichnet

worden. Bernd Held lebt in Vaihingen an der

Enz.

Auf www.buch.cd:• Sämtliche Programmbeispiele

• Testdateien

• Excel-Tools